本文最后更新于:几秒前
Linux 应急响应
在实际的安全和运维工作中,应该在网络和系统被攻击之前,做好充分的准备,深挖战壕广积粮,才能在 网络被攻击时能够从容的应对。针对Linux服务器而言,强烈建议严格按照【Linux基线加固】中的条目对服务器进行加固。
应急响应概述
当你的Linux服务器被攻击了,就需要对服务器进行应急响应。在Linux 系统中,一切皆文件。黑客入侵的手段大部分都是利用系统对文件上传的控制不严格,上传WebShell。黑客要想在系统中启动一个进程,那么必须要有对应的进程启动文件。服务器中了病毒和木马,病毒和木马本身也都是一个文件。
应急响应最核心的问题就是找到这些非法上传,或者是非法改动的文件,将这些文件全部删除或者进行替换,并且要将这些文件启动的进程全部杀掉。最后要找到黑客的入侵方式,彻底切断黑客的入侵途经,封堵漏洞。
服务器被攻击的症状
当服务器被攻击了,一般都会或多或少表现出一定的症状,例如:CPU利用率升高,服务器网络流量增加,内存占用率增加,出现不明进程,服务器处理能力变慢,异常重启等等。如果服务器出现了这些症状,那就需要进行一次完整检查了。
应急响应流程
第一件事情应该是切断网络,但是有些环境不允许网络断开,就只能跳过这一步。
查看历史命令
发现Linux 服务器被攻击,要做应急响应,登录主机后的第一件事,就是查看主机的历史命令:
1 2 3 4
| # 检查Root用户的.bash_history 文件 cat /root/.bash_history # 检查普通用户的.bash_history 文件 cat /home/[user]/.bash_history
|
虽然大部分黑客在入侵后删除历史命令,但是不排除有些黑客忘记删除。如果没有删除历史命令,那么可以通过历史命令知道黑客做了哪些操作,这样后续的工作就非常简单了。
排查用户信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| # Linux 服务器中招之后 # whoami 查看当前用户 ➜ ~ whoami root
# 通过who命令查看当前登录系统的所有用户 ➜ ~ who root pts/0 2020-05-27 17:23 (192.168.5.2) # 有可能发现服务器异常时,黑客还在登录,那么用who命令就可以检查出来。
# w命令显示已经登录系统的所用用户,以及正在执行的指令 ➜ ~ w 17:53:32 up 30 min, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT b pts/0 192.168.5.2 17:53 4.00s 0.01s 0.00s sleep 1000 root pts/1 192.168.5.2 17:51 4.00s 0.26s 0.00s w
# 发现有个用户b 正在执行sleep 1000 这个命令,根据这个信息将b用户的该进程杀掉 # 通过 ps -ef | grep sleep 找到该进程ID,然后使用kill -9 id 杀掉该进程 ➜ ~ ps -ef | grep sleep b 7654 7633 0 17:53 pts/0 00:00:00 sleep 1000 root 7676 7502 0 17:54 pts/1 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep
➜ ~ kill -9 7654 ➜ ~ ps -ef | grep sleep root 7724 7502 0 17:56 pts/1 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep
# 发现该进程被杀掉了 # 接下来锁定该用户,并将其强制下线 ➜ ~ w 17:58:11 up 34 min, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.5.2 17:51 3.00s 0.97s 0.00s w # b用户已离线
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # last命令查看最近登录成功的用户及信息 ➜ ~ last b pts/0 192.168.5.2 Wed May 27 17:53 - 17:58 (00:04) root pts/0 192.168.5.2 Wed May 27 17:52 - 17:53 (00:00) root pts/1 192.168.5.2 Wed May 27 17:51 still logged in root pts/0 192.168.5.2 Wed May 27 17:23 - 17:52 (00:28) reboot system boot 3.10.0-957.el7.x Wed May 27 17:23 - 21:20 (03:57) root pts/0 192.168.5.2 Mon May 18 22:25 - 00:21 (01:56)
# 显示logged in表示用户还在登录 # pts表示从SSH远程登录 # tty表示从控制台登录,就是在服务器旁边登录
# lastb命令查看最近登录失败的用户及信息 [root@srv01 ~]# lastb root tty1 Tue Jan 7 01:16 - 01:16 (00:00) root tty1 Tue Jan 7 01:16 - 01:16 (00:00) a ssh:notty 192.168.225.1 Mon Jan 6 22:07 - 22:07 (00:00) a ssh:notty 192.168.225.1 Mon Jan 6 22:07 - 22:07 (00:00) a ssh:notty 192.168.225.1 Mon Jan 6 22:07 - 22:07 (00:00) a ssh:notty 192.168.225.1 Mon Jan 6 22:07 - 22:07 (00:00) a ssh:notty 192.168.225.1 Mon Jan 6 22:07 - 22:07 (00:00) root tty1 Thu May 9 19:06 - 19:06 (00:00) # ssh表示从SSH远程登录 # tty表示从控制台登录
|
如果你在排查服务器的时候,黑客没有在线,可以使用last命令排查黑客什么时间登录的有的黑客登录时,会将/var/log/wtmp文件删除或者清空,这样我们就无法使用last命令获得有用的信息了。在黑客入侵之前,必须使用chattr +a对/var/log/wtmp文件进行锁定,避免被黑客删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # lastlog命令显示所有用户最近一次登录信息 ➜ ~ lastlog Username Port From Latest root pts/0 192.168.5.2 Wed May 27 17:52:45 +0800 2020 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** halt **Never logged in** mail **Never logged in** operator **Never logged in** games **Never logged in** ftp **Never logged in** nobody **Never logged in** systemd-network **Never logged in** dbus **Never logged in** polkitd **Never logged in** sshd **Never logged in** postfix **Never logged in** abc pts/0 gateway Tue Feb 4 20:35:34 +0800 2020 a **Never logged in** b pts/0 192.168.5.2 Wed May 27 17:53:22 +0800 2020 # 在黑客入侵之前,必须使用chattr +a对/var/log/lastlog文件进行锁定,避免被黑客删除或者清空。
|
排查passwd 文件,重点排查如下内容:
- 哪些用户不能登录,shell却为/bin/bash —> 修改建议:将shell修改为/sbin/nologin
- 哪些普通用户的UID=0 —> 修改建议:禁用该用户或删除该用户
- 是否多出了不明用户。
1 2 3 4 5 6
| # 查看可登录用户: cat /etc/passwd | grep /bin/bash # 查看UID=0的用户 awk -F: '$3==0{print $1}' /etc/passwd # 查看sudo权限的用户 more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
|
排查端口进程
使用top
命令查看进程
1 2 3 4 5
| # 使用ls -l命令查看某个进程的可执行文件的完整路径 例如:查看 PID=842的SSH进程的可执行文件 # ls -l /proc/842/exe lrwxrwxrwx 1 root root 0 Jan 7 19:06 /proc/842/exe -> /usr/sbin/sshd # 如果找不到任何可疑文件,文件可能被删除,这个可疑的进程已经保存到内存中,是个内存进程。这时需要查找PID 然后kill掉。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #lsof 命令查看进程打开的文件 ➜ ~ lsof -p 7502 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zsh 7502 root cwd DIR 253,0 4096 33574977 /root zsh 7502 root rtd DIR 253,0 224 64 / zsh 7502 root txt REG 253,0 740496 50878051 /usr/bin/zsh zsh 7502 root mem REG 253,0 11488 43685 /usr/lib64/zsh/5.0.2/zsh/regex.sozsh 7502 root mem REG 253,0 70280 279590 /usr/lib64/zsh/5.0.2/zsh/computil.so # 或者通过服务名查看该进程打开的文件 lsof -c sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 6590 root cwd DIR 253,0 224 64 / sshd 6590 root rtd DIR 253,0 224 64 / sshd 6590 root txt REG 253,0 853040 551331 /usr/sbin/sshd
# 通过端口号查看进程 ➜ ~ lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 6590 root 3u IPv4 35947 0t0 TCP *:ssh (LISTEN) sshd 7500 root 3u IPv4 37659 0t0 TCP localhost.localdomain:ssh->192.168.5.2:cspmulti (ESTABLISHED)
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 查看进程的启动时间点 ➜ ~ ps -p 6590 -o lstart STARTED Wed May 27 17:23:44 2020 # 可以通过时间点来判断该进程是否是可疑进程
# 使用netstat -pantu | grep [PID] 通过进程id来查看端口的连接情况 ➜ ~ netstat -pantu | grep 6590 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6590/sshd
# 使用fuser -n [tcp/udp] [端口号] 来查看端口对应的进程 ➜ ~ fuser -n tcp 22 22/tcp: 6590 7500
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # 使用ps命令查看进程 ➜ ~ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 17:23 ? 00:00:01 /usr/lib/systemd/systemd --switched-rooroot 2 0 0 17:23 ? 00:00:00 [kthreadd] root 3 2 0 17:23 ? 00:00:00 [ksoftirqd/0] root 5 2 0 17:23 ? 00:00:00 [kworker/0:0H] root 7 2 0 17:23 ? 00:00:00 [migration/0] root 8 2 0 17:23 ? 00:00:00 [rcu_bh] --------------------------------------以下省略----------------------------------------------------------- # 使用[]括起来的进程一般是正常的系统进程,黑客的进程通常是.sshd,aa.sh,.sdofafdjja等。这些文件通常是隐藏文件,都是以【.】开头,要查找到这些文件,需要在ls命令后面加-a参数。
# 按照CPU使用率从高到低排序 ➜ ~ ps -ef --sort -pcpu UID PID PPID C STIME TTY TIME CMD root 1 0 0 17:23 ? 00:00:01 /usr/lib/systemd/systemd --switched-rooroot 2 0 0 17:23 ? 00:00:00 [kthreadd] root 3 2 0 17:23 ? 00:00:00 [ksoftirqd/0] root 5 2 0 17:23 ? 00:00:00 [kworker/0:0H] root 7 2 0 17:23 ? 00:00:00 [migration/0] root 8 2 0 17:23 ? 00:00:00 [rcu_bh] --------------------------------------以下省略-----------------------------------------------------------
# 按照内存使用率从高到低排序 ➜ ~ ps -ef --sort -pmem UID PID PPID C STIME TTY TIME CMD root 7502 7500 0 17:51 pts/1 00:00:06 -zsh root 6046 1 0 17:23 ? 00:00:15 /usr/bin/vmtoolsd root 6045 1 0 17:23 ? 00:00:00 /usr/bin/VGAuthService -s root 7500 6590 0 17:51 ? 00:00:00 sshd: root@pts/1 --------------------------------------以下省略-----------------------------------------------------------
|
排查文件修改
应急响应的核心就是找到黑客植入/修改的文件。
可以按照以下三种方式查找修改的文件:
1 2 3 4 5
| # 根据名称查找文件 ➜ ~ find / -name a.Test /root/a.Test # 如果文件名记不全,可使用通配符*来补全 # 如果不区分大小写,可以将-name 替换为-iname
|
1 2 3 4
| # 依据文件大小查找: ➜ ~ find / -size +1000M /proc/kcore # +1000M表示大于1000M的文件,-10M代表小于10M的文件
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| # 依据时间查找 # -atime 文件的访问时间 # -mtime 文件内容修改时间 # -ctime 文件状态修改时间(文件权限,所有者/组,文件大小等,当然文件内容发生改变,ctime也会随着改变) # 要注意:系统进程/脚本访问文件,atime/mtime/ctime也会跟着修改,不一定是人为的修改才会被记录 ➜ ~ stat a.Test File: ‘a.Test’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 33590721 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-05-27 22:12:20.681192600 +0800 Modify: 2020-05-27 22:12:20.681192600 +0800 Change: 2020-05-27 22:12:20.681192600 +0800 Birth: - # 修改文件内容: ➜ ~ echo "1230"> a.Test ➜ ~ stat a.Test File: ‘a.Test’ Size: 5 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33590721 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-05-27 22:12:20.681192600 +0800 Modify: 2020-05-27 22:17:58.334176870 +0800 Change: 2020-05-27 22:17:58.334176870 +0800 Birth: - # mtime和ctime发生了变化
# 查找最近一天以内修改的文件: ➜ ~ find / -mtime -1 -ls | more 1026 0 drwxr-xr-x 19 root root 3100 May 27 17:23 /dev 34061 0 crw------- 1 root root 10, 57 May 27 17:23 /dev/vsock 33151 0 crw-rw---- 1 root tty 7, 134 May 27 17:23 /dev/vcsa6 33148 0 crw-rw---- 1 root tty 7, 6 May 27 17:23 /dev/vcs6 33147 0 crw-rw---- 1 root tty 7, 133 May 27 17:23 /dev/vcsa5 # 查找50天前修改的文件: ➜ ~ find ./ -mtime +50 -ls 33880333 4 -rw-r--r-- 1 root root 18 Dec 29 2013 ./.bash_logout 33880334 4 -rw-r--r-- 1 root root 176 Dec 29 2013 ./.bash_profile 33880335 4 -rw-r--r-- 1 root root 176 Dec 29 2013 ./.bashrc 33880336 4 -rw-r--r-- 1 root root 100 Dec 29 2013 ./.cshrc 33880337 4 -rw-r--r-- 1 root root 129 Dec 29 2013 ./.tcshrc 33574978 4 -rw------- 1 root root 1232 Jan 20 11:20 ./anaconda-ks.cfg 35289 0 drwx------ 3 root root 18 Jan 20 11:55 ./.config
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #根据属主和属组查找: -user 根据属主查找 -group 根据属组查找 -nouser 查找没有属主的文件 -nogroup 查找没有属组的文件
# 查看属主是root的文件 ➜ ~ find ./ -user root -type f ./.bash_logout ./.bash_profile ./.bashrc ./.cshrc ./.tcshrc # -type f表示查找文件,-type d表示查找目录 # 注意:系统中没有属主或者没有属组的文件或目录,也容易造成安全隐患,建议删除。
|
清理后门
在找到并处理植入/修改的文件之后,还需要清理后门,因为黑客为了下次访问方便,必然会在服务器上留有 后门。常见留后门的方法有如下几种:
- 将公钥写入到服务器的authorized_keys文件中
- 创建UID=0的普通用户
解决方法:
- 清除authorized_keys文件中黑客上传的key
cat /etc/passwd
将UID为0的普通用户注释掉
查找攻击源
1 2 3 4 5 6 7
| 检查系统日志信息: # tail -100 /var/log/messages 检查登录的账号和IP地址: # tail -100 /var/log/secure 检查系统是否有异常,例如发包量过大等: # dmesg 查找到攻击源,可以使用防火墙将此攻击源屏蔽。
|
原因分析
服务器被入侵原因通常有几个:系统漏洞、中间件漏洞(程序漏洞)、代码漏洞、安全设置不正确、网络层面 没有限制等。 如果是系统漏洞和中间件漏洞,需要使用没有发现漏洞的系统和中间件进行升级。 如果是程序/代码漏洞,需要修改程序代码进行修改,或者部署waf防火墙。 如果是安全设置不正确,需要进一步检查安全配置。 如果是网络层面没有限制,需要在防火墙和IPS上进行检查。 通过植入文件启动进程的入侵方式,一般户看到类似这种进程或者文件:aa.sh,.sdofafdjja,是通过系 统漏洞或者中间件漏洞入侵的;如果没有发现被植入的文件,但是系统就是有异常,这种一般是通过代码漏洞 来入侵的。