Linux应急响应

本文最后更新于:几秒前

Linux 应急响应

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

应急响应概述

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

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

服务器被攻击的症状

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

应急响应流程

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

应急响应流程

查看历史命令

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

image-20200527172430859

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命令查看进程

image-20200527215100957

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,是通过系 统漏洞或者中间件漏洞入侵的;如果没有发现被植入的文件,但是系统就是有异常,这种一般是通过代码漏洞 来入侵的。


Linux应急响应
https://blog.icansudo.top/2020/05/27/Linux应急响应/
作者
odin
发布于
2020年5月27日
许可协议