Linux 应急响应排查思路

一、前言

应急响应 Linux 篇幅,由于我们平常使用 Windows 系统较为熟练,对于 Linux 平台通常或会仅限于普通服务搭建使用,不会深入的了解其。日常工作会遇到 Linux 服务器的应急响应工作,于是记录下以便后续的工作能顺利的开展。

二、应急流程

接到应急事件,应急人员应先充分了解事件详情,具体应急事件的类型是恶意攻击、蠕虫攻击、上级通报还是疑似攻击等。充分了解事件过程对应急排查起关键作用,免得做无用功事。

应急前期

开始排查前,应询问是否有安全设备,若有,可通过安全平台针对应急事件类型查看日志获取有用信息,若已捕获相关样本请求提供开展分析。

1、排查是否有异常的系统用户

1
2
3
4
# 查看用户
cat /etc/passwd
格式:用户名:密码:用户ID:组ID:用户说明:家(home)目录:登陆之后shell
无密码只允许本机登陆,远程不允许ssh登陆

image-20230215124511958

1
2
3
# 查看加密密码
cat /etc/shadow
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留字段

image-20230215124605002

2、排查账号信息(按照实际情况查询)

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
# 查询特权账户 & 组
cat /etc/passwd | awk -F: '$3==0{print $1}'

# 可以远程登录的账号
awk '/\$1|\$6/{print $1}' /etc/shadow

# 查看哪些用户使用shell
cat /etc/passwd | grep /bin/bash

# 查看哪些用户为root权限
cat /etc/passwd | grep x:0

# 查看除了不可登录以外的用户都有哪些,有没有新增的
cat /etc/passwd | grep -v nologin

# 查询系统中所有账户
cat /etc/passwd | awk -F: '{print $1}'

# 查看当前登录用户(tty 本地登陆 pts 远程登录)
who

# 查看系统信息,想知道某一时刻用户的行为
w

# 查看登陆多久、多少用户,负载
uptime

# 查看密码文件上一次修改的时间
stat /etc/passwd

# 查询 sudo 权限账户
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
1
2
# 查询特权账户 & 组
cat /etc/passwd | awk -F: '$3==0{print $1}'

image-20230215124650630

1
2
# 可以远程登录的账号
awk '/\$1|\$6/{print $1}' /etc/shadow

image-20230215124731218

1
2
# 查看哪些用户使用shell
cat /etc/passwd | grep /bin/bash

image-20230215124750562

1
2
# 查看哪些用户为root权限
cat /etc/passwd | grep x:0

image-20230215124811746

1
2
# 查看除了不可登录以外的用户都有哪些,有没有新增的
cat /etc/passwd | grep -v nologin

image-20230215124837096

1
2
# 查询系统中所有账户
cat /etc/passwd | awk -F: '{print $1}'

image-20230215124859476

1
2
# 查看当前登录用户(tty 本地登陆  pts 远程登录)
who

image-20230215124918880

1
2
# 查看系统信息,想知道某一时刻用户的行为
w

image-20230215124933161

1
2
# 查看登陆多久、多少用户,负载
uptime

image-20230215124949699

1
2
# 查看密码文件上一次修改的时间
stat /etc/passwd

image-20230215125006235

1
2
# 查询 sudo 权限账户
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

image-20230215125030322

3、排查可疑进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看全部进程
ps -aux

# 查看关联进程
ps -aux | grep pid

# 查看cpu占用情况(动态)
top -c -o %CPU

# 查看CPU占用前十的进程
ps -eo user,pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head -n 10

# 按CPU 使用率从高到底排序
ps -ef --sort -pcpu

# 按内存从高到低
ps -ef --sort -pmem

image-20230215125108596

image-20230215125313535

image-20230215125332381

image-20230215125404019

image-20230215125434353

image-20230215125511429

4、定位可疑程序路径

1
2
3
4
5
6
# 定位可疑进程的程序是什么
ps -ef | grep pid号

# 定位可疑进程文件位置
lsof -p PID
ls -al /proc/9109/exe

image-20230215125557765

image-20230215125626387

image-20230215125646608

5、排查外联情况

lsof

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示已建立连接信息
lsof -i -sTCP:ESTABLISHED

# 显示正在监听的端
lsof -i -sTCP:LISTEN

# 查看端口绑定的应用
lsof -i :22

# 显示指定主机连接的信息
lsof -i@1.1.1.1

# 显示基于主机与端口连接的信息
lsof -i@1.1.1.1:3333

image-20230215125723942

image-20230215125742962

image-20230215125809753

image-20230215125830517

netstat

1
2
3
4
5
6
7
8
9
# 查看端口开放和连接情况
netstat -pantu
netstat -anulpt

# 指定tcp进程
netstat -tnap

# 指定udp进程
netstat -unap

image-20230215125851015

image-20230215125909675

6、监控指定IP的通讯进程

1
while true; do netstat -antp | grep 10.10.10.1; done

image-20230215125955194

7、排查自启项

1
2
3
4
5
6
7
8
9
10
11
# 查看所有的服务项目
systemctl list-unit-files

# 过滤出所有的开机启动的项目
systemctl list-unit-files |grep enabled

# 查看开机启动项目
chkconfig

# 查看服务自启状态
chkconfig --list

image-20230215130021004

image-20230215130044082

8、排查计划任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看计划任务
crontab -l

# 查看指定用户计划任务
crontab -u 用户名 -l

# 查看计划任务
cat /var/spool/cron/* # centos
cat /var/spool/cron/crontabs/* # ubuntu的
cat /etc/crontab
cat /etc/cron.d/*
cat /etc/cron.daily/*
cat /etc/cron.hourly/*
cat /etc/cron.monthly/*
cat /etc/cron.weekly/
cat /etc/anacrontab # 异步定时
cat /var/spool/anacron/*


cat crontab -l # 查看定时任务
cat crontab –e # 编辑定时任务
ls /var/spool/cron/ #查看每个用户自己的执行计划
sed '/gcc.sh/d' /etc/crontab && chmod 0000 /etc/crontab && chattr +i /etc/crontab #删除计划任务且控制计划任务不能写东西,慎用。

image-20230215130509214

image-20230215130538066

image-20230215130627186

image-20230215130643200

image-20230215130731090

9、排查环境变量

1
env

image-20230215130754649

10、查看host文件是否被篡改

1
cat /etc/hosts

image-20230215130816251

11、可疑文件排查

1
2
3
4
5
6
7
8
9
10
11
# 查找指定目录下的指定时间下生产的文件
find /指定路径 -name "*.jsp" -newermt "2023-10-01 00:00:00" ! -newermt "2024-01-01 00:00:00" -exec ls -l {} \; > /保存路径/result.txt

# 全局搜索指定文件名后缀
find / -name "*.log"

# 指定时间段内搜索具有 ".log" 扩展名的文件
find / -name "*.log" -exec grep -E "^(YYYY-MM-DD HH:MM:SS|YYYY-MM-DD HH:MM:SS)" {} \;

# 全局搜索指定时间段生成的文件
find / -type f -newermt "2022-01-01 00:00:00" ! -newermt "2023-12-31 23:59:59" -exec ls -l --time-style=long-iso {} \; >> search_results.log 2>&1

12、排查日志

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
44
45
46
# 终端输出指定日志指定时间的日志
cat /var/log/syslog | grep "YYYY-MM-DD HH:MM:SS"

# 终端输出日志中指定 ip 的日志
cat /var/log/syslog | grep "外部IP地址"

# 统计爆破主机root账号的失败次数及ip
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

# 定位哪些IP在爆破
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

# 查看成功登录的日期、用户名、IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

# 爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

# 日志默认存放位置
/var/log

# 查看日志配置情况
more /etc/rsyslog.conf

# 登录日志记录
/var/log/secure

# 登录失败记录
/var/log/btmp

# 登录成功记录
/var/log/wtmp

# 最后一次登录
/var/log/lastlog

# 历史命令
history

# 文件内容中的恶意函数
PHP:eval(、system(、assert(
JSP:getRunTime(、 FileOutputStream(
ASP:eval(、execute(、 ExecuteGlobal(

# 保存历史命令
cat .bash_history >>history.txt

image-20230215130902211

13、webshell 查杀

1
2
3
# 河马 https://www.shellpub.com,扫描完成之后结果会保存为result.csv文件,使用记事本或者excel打开查看
./hm scan 你的web目录
./hm deepscan 你的web目录(扫描时开启深度解码 )

14、内存马查杀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 河马内存马专杀,自动扫描java进程,自动模式下仅支持扫描 tomcat/weblogic/jboss 应用进程
sudo ./hmj javascan

# 指定进程扫描模式,程序仅扫描 -p 指定的进程
sudo ./hmj javascan -p 3361

# 也可以一次指定多个进程 id 进行扫描
sudo ./hmj javascan -p 3361,3356

# 默认情况下在当前执行目录下生成 result.csv 和 data.db 文件,未联网情况下还会生成 result.zip 文件
- result.csv: 恶意内容的列表,包括恶意类型和路径
- data.db: 检测结果的详细信息,sqlite 文件
- result.zip: 检测到的恶意内容
- output 指定输出扫描结果的目录

15、清除可疑进程与文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 清除进程:
ps -aux
ps -elf | grep 66579
kill -9 66579

# 清除文件:
ps -aux
ls -al /proc/67730/exe
rm -f /home/c2test

# 使用 ps 查看启动 时间并 杀掉危险进
ps -p 7224(进程PID) -o lstart
kill -9 7224(进程PID)

三、特定场景

挖矿事件

通过模拟挖矿事件开展应急响应,首先我们知道通常挖矿一个明显特征就是资源占用,内存飙升。通过者一特征很容易判断是否为挖矿事件,当然具体案例得具体分析。

基本流程

1、查看占用情况。

1
2
3
4
5
6
7
8
9
10
11
# 查看cpu占用情况(动态)
top -c -o %CPU

# 查看CPU占用前十的进程
ps -eo user,pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head -n 10

# 按CPU 使用率从高到底排序
ps -ef --sort -pcpu

# 按内存从高到低
ps -ef --sort -pmem

2、定位恶意程序

1
2
3
4
5
6
7
# 定位可疑进程的程序是什么
ps -aux
ps -ef | grep pid号

# 定位可疑进程文件位置
lsof -p PID
ls -al /proc/9109/exe

3、清除进程

1
2
3
4
5
6
7
8
9
10
11
12
13
# 杀掉进程 
kill -9 66579

# 查看是否存在子进程
ps ajfx
systemctl status

# 杀掉进程组
kill -9 -pid

# 使用 ps 查看启动时间并杀掉危险进
ps -p 7224(进程PID) -o lstart
kill -9 7224(进程PID)

4、病毒分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 微步
https://s.threatbook.com/

# PCHunter
https://scan.anxinsec.com/

# virustotal
https://www.virustotal.com/gui/home/upload

# 360
https://ata.360.net/

# 哈勃
https://habo.qq.com/

勒索病毒

对于专业的勒索病毒,想要通过解密恢复数据的几率比较渺茫,剩下的就是妥协与不妥协。

基本流程

一旦发现疑似中病毒,无论是否为勒索病毒首先还是得先隔离主机,物理隔离或者资源隔离均可以,把损害降到最低。有备份清除病毒后重新拉取就系,没有备份那就……

解密平台

1
2
# 360
https://lesuobingdu.360.cn/

六、参考

1
2
3
4
5
https://github.com/wpsec/Emergency-response-notes/blob/main/Linux-%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94.md
https://blog.csdn.net/qq_44874645/article/details/118459837
https://mp.weixin.qq.com/s/iQSEvvLtpW_39UoymliYPA
https://mp.weixin.qq.com/s/eGaQDLVo9yn3fIPFN2bH6w
https://mp.weixin.qq.com/s/x6XKzXsnaY6bg_kZn_O3oA