应急响应——Windows / Linux 排查笔记
一、基本思路流程
- 收集信息:收集客户信息和中毒主机信息,包括样本
- 判断类型:判断是否是安全事件,何种安全事件,勒索、挖矿、断网、DoS 等等
- 抑制范围:隔离使受害⾯不继续扩⼤
- 深入分析:日志分析、进程分析、启动项分析、样本分析方便后期溯源
- 清理处置:杀掉进程,删除文件,打补丁,删除异常系统服务,清除后门账号防止事件扩大,处理完毕后恢复生产
- 产出报告:整理并输出完整的安全事件报告
二、Windows入侵排查思路:
三、Linux入侵排查思路:
1、账户排查
cat /etc/passwd #查看是否有异常的系统用户
/etc/passwd 文件每一行的字段分别是:
用户名:密码:用户id:组id:用户信息:主目录:shell
cat /etc/shadow #存储 Linux 系统中用户的密码信息,又称为 “影子文件”
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留域
哈希密码可以使用 john 进行破解(kali自带)。
常用命令
grep "0" /etc/passwd 查看是否产生了新用户,UID和GID为0的用户
ls -l /etc/passwd 查看passwd的修改时间,判断是否在不知的情况下添加用户
awk -F: '$3==0 {print $1}' /etc/passwd 查看是否存在特权用户(只输出用户名)
grep x:0 /etc/passwd 查看是否存在特权用户(查看完整的行内容)
awk -F: 'length($2)==0 {print $1}' /etc/shadow 查看是否存在空口令帐户
more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)" 除root帐号外,其他帐号是否存在sudo权限
who 查看当前登录用户,以及其登录ip。pts代表远程登录,tty代表本地登陆。
w 查看目前登入系统的用户,以及他们正在执行的程序。
stat /etc/passwd 查看密码文件上一次修改的时间,如果最近被修改过,那就可能存在问题。
cat /etc/passwd |grep -v nologin 看除了不可登录以外的用户都有哪些,有没有新增的
cat /etc/passwd | grep /bin/bash 查看能用bash shell登录的用户
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user 删除user用户
userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除
2、历史命令排查
linux系统默认会记录用户输入的命令,保存到一个.bash_history
隐藏文件中(有些系统是.zsh_history
),ls -al 命令可以查看隐藏文件
history命令可以查看当前用户的历史命令
history
history 命令会默认保存当前会话中执行的最近 500 条命令。
history n 显示最近 n 条命令历史
history -c 清空命令历史记录
history -w 将当前会话的命令历史写入到历史文件中
history !n 重新执行历史记录中的第 n 条命令
history !! 重新执行上一条命令
注意 wget(有可能是下载木马文件),ssh(可能是异常连接内网主机),tar zip(数据打包),系统配置命令可能是修改系统相关配置。
在 /home 各账户目录下,cat /用户/.bash_history
(.zsh_history)也可以查看其他用户的历史命令。
例如,查看用户 john 的历史记录:
cat /home/john/.bash_history
or
cat /home/john/.zsh_history
保存历史命令
cat .bash_history >>history.txt
3、异常端口排查
使用 netstat 网络连接命令,分析可疑端口、IP、PID,是否有建立可疑网络连接等。
netstat -atunlp
-a:显示所有连接和监听的端口。
-t:仅显示 TCP 连接。
-u:仅显示 UDP 连接。
-n:以数字形式显示地址和端口号,而不进行域名解析。
-l:仅显示监听状态的服务。
-p:显示使用该连接或监听端口的程序及其 PID。
加上 -a 参数:会显示所有的连接,包括已建立的连接和监听的端口。
不加 -a 参数:只会显示监听的端口(如果加上 -l 参数)或已建立的连接(如果没有加 -l 参数)。
ls -l /proc/PID/exe 查看pid所对应的进程文件路径
使用 Telnet 测试 tcp 端口连通性
在查到端口占用的进程后,如果你要杀掉对应的进程可以使用 kill 命令
kill -9 PID #kill -9 是必杀令,强制删除
kill -9 26993
4、进程排查
使用 ps 命令结合 aux,grep 选项查看 linux 系统下的进程信息,还可以使用 top 命令查看是否有挖矿,木马病毒占用大量的系统资源。
ps aux | grep pid 分析进程
ps aux – sort=pcpu | head -10 进程动态监控,默认根据cpu的占用情况进行排序的,按b可根据内存使用情况排序。
查看cpu占用率前十的进程
lsof -p pid 查看进程打开的文件
top 查看资源占用
top -p pid 监控指定程序
5、计划任务排查
一般 linux 任务计划文件以 cron 开头,可以使用 crontab 命令进行计划任务的设置。
默认编写的 crontab 文件会保存在 (/var/spool/cron/用户名,例如:/var/spool/cron/root)
Debian 系统中,crontab 文件的保存位置在:/var/spool/cron/crontabs/用户名
系统级的 crontab 配置文件通常位于 /etc/crontab。这个文件可以由系统管理员编辑,用于设置系统范围内的定时任务。
命令 | 说明 |
---|---|
cat /etc/crontab | 查看计划任务内容 |
crontab -l | 列出某个用户cron服务的详细内容 |
crontab -u root -l | 查看指定用户定时任务 |
crontab -r | 删除每个用户cront任务(谨慎:删除所有的计划任务) |
crontab -e | 使用编辑器编辑当前的crontab文件 |
ls /etc/cron.* | 列出以cron.开头的文件或目录 |
more /etc/cron.daily/* | 查看目录下所有文件 |
6、异常文件排查
异常文件检查是排查黑客是否有修改服务器上的敏感目录或文件。
重点关注以下目录中是否存在恶意脚本:
/var/spool/cron/* 存储每个用户的定时任务文件,由 crontab 命令创建和管理。
/etc/crontab 系统范围的定时任务文件,支持指定任务所属的用户。
/etc/cron.d/* 存储额外的系统范围定时任务文件,通常由软件包安装创建。
/etc/cron.daily/* 存储每日运行的脚本,通常在凌晨执行。
/etc/cron.hourly/* 存储每小时运行的脚本。
/etc/cron.monthly/* 存储每月运行的脚本。
/etc/cron.weekly/ 存储每周运行的脚本。
/etc/anacrontab 管理 anacron 的配置,保证错过的任务会被补充执行。
/var/spool/anacron/* 存储 anacron 的任务时间戳,用于跟踪任务执行情况。
查看目录下所有文件:
ls -la /etc/cron.daily/*
查看敏感目录,如 /tmp 目录下的文件,同时注意隐藏文件夹,以“..”
为名的文件夹具有隐藏属性
如发现webshell、远控木马的创建时间,如何找出同一时间范围内创建的文件?
find /opt -iname "*" -atime 1 -type f #找出 /opt 下一天前访问过的文件
find /opt -iname ".." -atime 1 -type f #
-iname "*"
:查找所有文件名的文件,-iname 忽略大小写,* 是通配符,匹配所有文件名。- -atime 1:查找在过去一天(24小时)内访问过的文件。1 表示访问时间在一天前到两天前之间(即:1 < x ≤ 2 天)。-atime 使用的单位是天。
- -type f:只查找普通文件,不包括目录或其他类型的文件。
如果要查找过去 24 小时内访问过的文件,可以使用:
find /opt -iname "*" -atime 0 -type f
stat /bin/netstat
查看 /bin/netstat 文件命名修改时间,防止被替换
输出实例:
File: /bin/netstat
Size: 123456 Blocks: 256 IO Block: 4096 regular file
Device: 802h/2050d Inode: 123456 Links: 1
Access: 2025-01-08 10:00:00.000000000 +0000
Modify: 2025-01-07 15:00:00.000000000 +0000
Change: 2025-01-07 15:00:00.000000000 +0000
Birth: -
Access 最近一次访问文件的时间。
Modify 最近一次修改文件内容的时间。
Change 最近一次更改文件元数据(如权限、所有权等)的时间。
Birth 文件的创建时间(部分文件系统支持,如 ext4)。
7、webshell 排查
河马webshell查杀:http://www.shellpub.com
深信服Webshell网站后门检测工具:http://edr.sangfor.com.cn/backdoor_detection.html
8、检查系统日志
登录日志:
/var/log/btmp //lastb 登录失败记录
/var/log/lastlog 或者 //lastlog 最后一次登录
/var/log/wtmp //last 登录成功记录
/var/log/secure 登录日志记录
/var/run/utmp //w、who、users 目前登录用户信息
grep “Accepted” /var/log/secure |awk ‘{print $1,$2,$3,$9,$11}’ 查看成功登录的日期、用户名、IP:
检查系统错误登陆日志,统计IP重试次数(last命令是查看系统登陆日志,比如系统被reboot或登陆情况)
查看所有用户的登录和注销记录:
last #等同于 last -f /var/log/wtmp
这个命令会显示系统中所有用户的登录和注销记录,包括用户名、登录时间、登录持续时间和登录的 IP 地址。
root pts/2 10.254.200.252 Sat Apr 14 15:26 still logged in
root pts/4 10.4.3.76 Fri Apr 13 16:59 - 18:06 (01:07)
root pts/2 10.254.200.252 Fri Apr 13 16:54 - 18:05 (01:11)
root pts/6 10.254.200.252 Fri Apr 13 11:48 - 11:58 (00:09)
root pts/8 10.4.3.76 Fri Apr 13 09:47 - 12:05 (02:17)
root pts/7 10.4.3.47 Fri Apr 13 09:32 - 12:18 (02:46)
root pts/5 10.4.3.238 Fri Apr 13 09:22 - 20:12 (10:50)
root pts/3 10.4.3.226 Fri Apr 13 08:57 - 18:24 (09:27)
最上面的一条still logged in表示当前登录还没有退出,还在继续使用。
查看所有失败的登录尝试:
lastb #等同于 lastb -f /var/log/btmp
root tty1 Fri Jul 14 14:35 - 14:35 (00:00)
root tty1 Fri Jul 14 14:34 - 14:34 (00:00)
root tty1 Fri Jul 14 14:33 - 14:33 (00:00)
root tty1 Fri Jul 14 14:32 - 14:32 (00:00)
root tty1 Fri Jul 14 14:31 - 14:31 (00:00)
reboot system boot 4.19.0-32-amd64 Fri Jul 14 14:30 - 14:35 (00:05)
root tty1 Fri Jul 14 14:29 - 14:29 (00:00)
root tty1 Fri Jul 14 14:28 - 14:28 (00:00)
root tty1 Fri Jul 14 14:27 - 14:27 (00:00)
root tty1 Fri Jul 14 14:26 - 14:26 (00:00)
有多次 root 用户通过 tty1 终端进行登录尝试,但都失败了。
系统在 Fri Jul 14 14:30 进行了重启,持续时间为 5 分钟。
查看所有用户的最近一次登录信息:
lastlog #/var/log/lastlog
记录中会有很多未登录过的用户,可以通过 grep -v 命令进行过滤,不显示没有登陆过的用户
lastlog |grep -v "Never logged in"
中间件日志:
Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行的安全分析,不仅可以帮助我们定位攻击者,还可以帮助我们还原攻击路径,找到网站存在的安全漏洞并进行修复。
我们来看一条Apache的访问日志:
127.0.0.1 - - [11/Jun/2018:12:47:22 +0800] “GET /login.html HTTP/1.1” 200 786 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36”
通过这条Web访问日志,我们可以清楚的得知用户在什么IP、什么时间、用什么操作系统、什么浏览器的情况下访问了 你网站的哪个页面,是否访问成功。
系统日志:
/var/log/cron 记录了系统定时任务相关的日志
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/utmp "记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询"
/var/log/secure "记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换
组合命令:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 定位有多少IP在爆破主机的root帐号:
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 "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr 爆破用户名字典是什么?
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 登录成功的IP有哪些
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 登录成功的日期、用户名、IP:
8、启动项排查
因为中毒会随系统的启动而启动的,所以一般会开机启动,检查一下启动的服务或者文件是否有异常。
systemctl list-unit-files | grep enabled 查看开机启动项
crontab -l 查看定时任务
crontab -u root -l 查看指定用户定时任务
more /etc/rc.local /etc/rc.d/rc[0~6].d 启动项文件
ls -l /etc/rc.d/rc3.d/ 启动项文件
9、Hosts文件排查
查看host 文件是否被篡改
cat /etc/hosts
四、常见场景:
SSH暴力破解排查
在 Linux 主机上排查是否遭遇 SSH 暴力破解攻击,可以通过以下几种方法检查系统日志和配置:
1、检查 SSH 登录日志
SSH 登录尝试的日志一般保存在 /var/log/auth.log (Ubuntu/Debian) 或 /var/log/secure (CentOS/RHEL) 文件中。
使用以下命令检查日志中是否有大量失败的 SSH 登录尝试:
# Ubuntu/Debian
grep "Failed password" /var/log/auth.log
# CentOS/RHEL
grep "Failed password" /var/log/secure
查找成功的 SSH 登录记录,确认是否有未知用户或 IP 登录成功:
# Ubuntu/Debian
grep "Accepted password" /var/log/auth.log
# CentOS/RHEL
grep "Accepted password" /var/log/secure
2、检查特定 IP 的失败尝试次数
可以用以下命令统计某个 IP 的 SSH 失败登录尝试次数:
grep "Failed password" /var/log/auth.log | grep "IP地址" | wc -l
把 IP地址 替换为具体 IP 地址。如果某个 IP 的失败尝试次数特别多,可能是在进行暴力破解。
3、统计尝试登录 IP 及次数
# Ubuntu/Debian
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
# CentOS/RHEL
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
命令解释:
grep "Failed password":提取日志中所有包含“Failed password”的行,表示失败的 SSH 登录尝试。
awk '{print $(NF-3)}':提取每行中倒数第三个字段(一般是 IP 地址)。
sort:对所有 IP 地址排序。
uniq -c:统计每个唯一 IP 地址的出现次数。
sort -nr:按照出现次数从高到低排序,方便快速查看尝试次数最多的 IP。
输出示例
150 192.168.1.100
75 203.0.113.45
20 198.51.100.20
输出的第一个数字是该 IP 的尝试次数,第二列是对应的 IP 地址。
Nginx access.log 文件分析
检测 Nginx 的 access.log 中是否存在攻击记录可能需要一些手动的分析,因为具体的攻击形式和攻击者的行为可以各种各样。以下是一些常见的检查方法:
1、HTTP 4xx 和 5xx 响应代码:
查找 access.log 文件中的 HTTP 响应代码,尤其是 4xx(客户端错误)和 5xx(服务器错误)的代码。攻击者可能尝试发起恶意请求,导致服务器返回错误响应。例如:
cat /path/to/nginx/access.log | grep ' 4[0-9][0-9] '
cat /path/to/nginx/access.log | grep ' 5[0-9][0-9] '
这将显示所有包含 HTTP 4xx 或 5xx 响应代码的日志记录。
2、请求频率:
检查来自同一 IP 地址的请求频率。如果某个 IP 地址在短时间内发送大量请求,可能是恶意行为的迹象。例如:
awk '{print $1}' /path/to/nginx/access.log | sort | uniq -c | sort -n
这将按照 IP 地址对请求进行计数,并按请求频率进行排序。
3、特殊字符或URL:
查找包含特殊字符或异常 URL 的请求。攻击者可能尝试使用 URL 编码、路径遍历、SQL 注入等攻击技术。例如:
cat /path/to/nginx/access.log | grep '%20' # 查找 URL 编码的空格
cat /path/to/nginx/access.log | grep '../' # 查找路径遍历
这将显示包含 URL 编码的空格或路径遍历的请求。
4、异常的 User-Agent:
查找使用异常 User-Agent 字符串的请求。一些攻击可能使用自定义的 User-Agent 字符串。例如:
cat /path/to/nginx/access.log | awk -F\" '{print $6}' | sort | uniq -c | sort -n
这将显示不同的 User-Agent 字符串及其出现的频率。
5、扫描行为:
检查访问模式,尤其是快速扫描或暴力破解的迹象。例如:
cat /path/to/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -n
这将显示不同的请求路径及其出现的频率。