Linux 应急响应

Linux 应急响应

在实际的安全和运维工作中,应该在网络和系统被攻击之前,做好充分的准备,深挖战壕广积粮,才能在 网络被攻击时能够从容的应对。针对Linux服务器而言,强烈建议严格按照【Linux基线加固】中的条目对服务器进行加固。

应急响应概述

​ 当你的Linux服务器被攻击了,就需要对服务器进行应急响应。在Linux 系统中,一切皆文件。黑客入侵的手段大部分都是利用系统对文件上传的控制不严格,上传WebShell。黑客要想在系统中启动一个进程,那么必须要有对应的进程启动文件。服务器中了病毒和木马,病毒和木马本身也都是一个文件。

​ 应急响应最核心的问题就是找到这些非法上传,或者是非法改动的文件,将这些文件全部删除或者进行替换,并且要将这些文件启动的进程全部杀掉。最后要找到黑客的入侵方式,彻底切断黑客的入侵途经,封堵漏洞。

服务器被攻击的症状

​ 当服务器被攻击了,一般都会或多或少表现出一定的症状,例如:CPU利用率升高,服务器网络流量增加,内存占用率增加,出现不明进程,服务器处理能力变慢,异常重启等等。如果服务器出现了这些症状,那就需要进行一次完整检查了。

应急响应流程

第一件事情应该是切断网络,但是有些环境不允许网络断开,就只能跳过这一步。

应急响应流程

查看历史命令

​ 发现Linux 服务器被攻击,要做应急响应,登录主机后的第一件事,就是查看主机的历史命令:

image-20200527172430859
# 检查Root用户的.bash_history 文件
cat /root/.bash_history
# 检查普通用户的.bash_history 文件
cat /home/[user]/.bash_history

​ 虽然大部分黑客在入侵后删除历史命令,但是不排除有些黑客忘记删除。如果没有删除历史命令,那么可以通过历史命令知道黑客做了哪些操作,这样后续的工作就非常简单了。

排查用户信息

# 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用户已离线
# 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文件进行锁定,避免被黑客删除。

# 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 —> 修改建议:禁用该用户或删除该用户
  • 是否多出了不明用户。
# 查看可登录用户:
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命令查看进程

image-20200527215100957
# 使用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掉。
#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)
# 查看进程的启动时间点
➜  ~ 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
# 使用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
--------------------------------------以下省略-----------------------------------------------------------

排查文件修改

​ 应急响应的核心就是找到黑客植入/修改的文件。

​ 可以按照以下三种方式查找修改的文件:

  • 按照名称
  • 依据文件大小
  • 按照时间查找
# 根据名称查找文件
➜  ~ find / -name a.Test
/root/a.Test
# 如果文件名记不全,可使用通配符*来补全
# 如果不区分大小写,可以将-name 替换为-iname
# 依据文件大小查找:
➜  ~ find / -size +1000M
/proc/kcore
# +1000M表示大于1000M的文件,-10M代表小于10M的文件
# 依据时间查找
# -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
#根据属主和属组查找:
-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的普通用户注释掉

查找攻击源

检查系统日志信息:
# tail -100 /var/log/messages
检查登录的账号和IP地址:
# tail -100 /var/log/secure
检查系统是否有异常,例如发包量过大等:
# dmesg
查找到攻击源,可以使用防火墙将此攻击源屏蔽。

原因分析

服务器被入侵原因通常有几个:系统漏洞、中间件漏洞(程序漏洞)、代码漏洞、安全设置不正确、网络层面 没有限制等。 如果是系统漏洞和中间件漏洞,需要使用没有发现漏洞的系统和中间件进行升级。 如果是程序/代码漏洞,需要修改程序代码进行修改,或者部署waf防火墙。 如果是安全设置不正确,需要进一步检查安全配置。 如果是网络层面没有限制,需要在防火墙和IPS上进行检查。 通过植入文件启动进程的入侵方式,一般户看到类似这种进程或者文件:aa.sh,.sdofafdjja,是通过系 统漏洞或者中间件漏洞入侵的;如果没有发现被植入的文件,但是系统就是有异常,这种一般是通过代码漏洞 来入侵的。

你可能感兴趣的:(Linux 应急响应)