前言
继上一篇“Linux应急响应思路和技巧(二):文件分析篇”了解了如何从文件入手进行主机侧应急排查的基础上,本篇我们将介绍Linux主机侧应急排查的网络分析部分。通过对系统网络监听、网络连接、甚至流量进行分析,可以帮助定位入侵入口和入侵手法,可以发现恶意软件与C2间纵向的连接、受害服务器和下一个目标服务器之间横向的连接,建立攻击事件的整个感染链路,以更全方位的视角对发生的安全事件有一个全局的了解,也为切断攻击、隔离感染系统提供依据。
下图为Linux主机应急排查思维导图,本篇从网络方面进行介绍。
图1 Linux应急排查思维导图
一、排查工具
网络分析常用排查工具包括lsof、ss、netstat、iptables、tcpdump等,还可添加audit规则审计网络连接相关系统调用,如connect、socket等。注意区分有rootkit和无rootkit情况下的工具使用,有rootkit情况下可采用busybox提供的命令集。
二、可疑网络连接定位
1. 定位纵向连接(恶意软件与恶意IP)
1)可疑进程异常外连
可利用已定位出的可疑进程,使用lsof -n -p [pid]查看可疑进程打开文件,查看其中的socket连接信息。若出现连接至可疑IP/域名(如境外IP、命中威胁情报恶意IP/域名、非业务和运维需要IP、洋葱网络域名),则可进一步确认为木马病毒或远控软件外连至黑IP或C2的行为。
图2 可疑进程异常外连示例
常用排查命令:
[root@localhost ~]#lsof -n -p [pid] #查看指定进程打开文件
2)外连可疑IP/域名
利用netstat或ss工具、或直接查看/proc/[pid]/net/[tcp*|udp*]排查网络连接情况,关注建连的网络连接(即状态为ESTABLISHED或st为01的)。若出现连接至可疑IP/域名(如境外IP、命中威胁情报恶意IP/域名、非业务和运维需要IP、洋葱网络域名),则可进一步确认存在外连至黑IP或C2的行为,且恶意网络连接对应的进程为木马病毒或远控软件。
若攻击者采用了一定的隐藏手法使得网络连接已不可见,可利用tcpdump监控网络连接,或利用audit审计监控connect系统调用,再提取出其中的外连ip/域名进行进一步分析。
图3 可疑外连示例
常用排查命令:
[root@localhost ~]#netstat –neatup | egrep "ESTAB|udp" | grep -v "UNCONN" #netstat查看tcp+udp网络连接
[root@localhost ~]#ss -neatup | egrep "ESTAB|udp" | grep -v "UNCONN" #ss查看tcp+udp网络连接
[root@localhost ~]#cat /proc/[pid]/net/[tcp*] | awk '{if($4=="01")print$0}' #查看指定进程的tcp连接
[root@localhost ~]#cat /proc/[pid]/net/[udp*] | awk '{if($4!="07")print$0}' #查看指定进程的udp连接
[root@localhost ~]#tcpdump -i [network_interface,如eth0] 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0' -n -v #tcpdump监控网络连接
[root@localhost ~]#auditctl -a always,exit -F arch=b64 -S connect -k network_connect #audit审计监控connect系统调用,saddr记录了目标IP和端口
3)dns解析可疑域名
可查看dns服务器日志(默认/var/log/messages),或利用tcpdump监控dns流量,或利用audit审计监控libnss和libresolv库或sendto和recvfrom系统调用来获取服务器解析过的dns域名。若出现解析可疑域名行为(如命中威胁情报恶意域名、非业务和运维需要域名、洋葱网络域名),则服务器可能被入侵,特别是通过audit审计可关联dns解析至具体进程,可通过分析关联进程进一步确认是否被入侵。
图4 解析可疑域名示例
常用排查命令:
[root@localhost ~]#cat [dns_log_path,默认/var/log/messages] | grep dnsmasq #查看dns服务器日志
[root@localhost ~]#tcpdump -i [network_interface,如eth0] -n port domain #tcpdump监控dns流量
[root@localhost ~]#auditctl -w /lib64/libresolv-2.17.so -p rx -k dns_query; auditctl -w /lib64/libnss_files-2.17.so -p rx -k dns_query; auditctl -w /lib64/libnss_dns-2.17.so -p rx -k dns_query #audit审计监控libnss和libresolv库
[root@localhost ~]#auditctl -a always,exit -F arch=b64 -S sendto -S recvfrom -k dns_query #audit审计监控sendto和recvfrom系统调用
4)iptables规则配置可疑IP
查看iptables配置规则,观察是否有ACCEPT策略的规则包含可疑IP(如命中威胁情报恶意IP、非业务和运维需要配置的IP)。若存在可疑IP则服务器可能被入侵,攻击者可能通过修改iptables防火墙规则来放行黑IP或C2。不过目前,大部分情况下攻击者会直接将iptables规则清空。
常用排查命令:
[root@localhost ~]#service iptables status #查看iptables规则
[root@localhost ~]#iptables -t [table,如filter] -nvL #查看iptables规则
5)不同程序共用相同套接字
lsof/ss/netstat查看服务器是否存在不同程序共用相同套接字(即绑定IP:端口、协议、远程IP:端口都相同)的情况,排除掉一些正常业务或运维程序、调试工具和代理软件后,若存在,则该进程可能是恶意软件尝试劫持合法程序的套接字,达到窃取数据或注入恶意数据的目的。同时该进程本身或该进程的守护进程或与该进程存在交互的进程,很可能存在连接黑IP或C2的行为,进行窃取数据的外发或C2命令的接收。
2. 定位横向扫描(被入侵服务器与下一目标服务器)
1)异常SYN_SENT数据包
lsof/ss/netstat查看服务器上是否存在异常SYN_SENT数据包,例如在单位时间内发现大量面向相同网段、同IP不同端口的SYN_SENT状态的网络连接。若出现大量网络连接信息(特别是握手包相关的),且存在大量同网段IP,或针对部分端口,则很可能为恶意扫描工具或DoS工具尝试进行横向移动或横向攻击。
图5 异常SYN_SENT数据包示例
常用排查命令:
[root@localhost ~]#lsof -i -n | grep “SYN_SENT” #lsof查看SYN_SENT状态socket
[root@localhost ~]#ss -naetp state syn-sent #查看SYN_SENT状态网络连接
[root@localhost ~]#netstat -naetp | grep "SYN_SENT" #查看SYN_SENT状态网络连接
2)异常远程服务/组件默认端口连接
lsof/ss/netstat查看服务器上是否存在异常远程服务或组件默认端口连接,例如在单位时间内发现大量的远程服务(SSH、VNC、RDP等)或脆弱性组件(redis、mysql、postgresql等)端口的网络连接,则大概率为恶意扫描工具尝试爆破或执行漏洞利用进行横向移动。
图6 异常SSH远程服务连接示例
常用排查命令:
[root@localhost ~]#lsof -i -n | grep ESTABLISHED | egrep "\->.*:[port,如22]" #lsof查看指定远程服务端口的socket
[root@localhost ~]#ss -naetp state established | awk '{if($4~/:[port,如22]$/)print$0}' #查看指定远程服务端口的网络连接
[root@localhost ~]#netstat -naetp | grep ESTABLISHED | awk '{if($5~/:[port,如22]$/)print$0}' #查看指定远程服务端口的网络连接
3)异常rawsocket发包进程
lsof/ss/netstat查看服务器上是否存在异常rawsocket发包进程,例如存在rpm校验未通过、非业务或运维需要等可疑的进程发送tcp/udp协议的rawsocket包,则可能为DoS工具尝试进行横向攻击,也可能为扫描工具或木马后门程序。
图7 异常rawsocket发包进程示例
常用排查命令:
[root@localhost ~]#lsof -n | grep raw #lsof查看raw socket
[root@localhost ~]#ss -naewp #查看rawsocket网络连接
[root@localhost ~]# netstat -naewp #查看rawsocket网络连接
4)会话连接数异常
观察服务器上所有ESTABLISHED状态的网络连接,同时注意排除连接本地环回地址、业务和运维组件产生的连接,若出现会话连接数异常(如单位时间内连接的IP过多),则认为服务器可能在进行恶意横向扫描。
三、溯源
1. 查看组件监听端口
利用ss/netstat查看进程监听端口开放情况,关注可疑的监听端口开放(如非业务或运维需要、非常用端口),关注远程服务和常曝出漏洞的组件监听端口开放情况(如ssh、java、redis、docker,特别是监听端口为服务默认端口的)。一般来说系统对外开放组件的攻击面大,结合配置口令复杂度、组件历史漏洞和版本等信息,特别是查看系统对外开放组件是否存在rce、未授权访问、反序列化、弱口令等明显安全问题,再通过寻找日志入侵痕迹或漏洞复现,进行进一步的验证。
例如在一次服务器中挖矿病毒事件应急排查当中,服务器管理员开启redis服务,使用默认6379端口并设置了弱口令,因此定位到攻击者通过猜测redis弱口令入侵;例如在一次集群中挖矿病毒事件应急排查当中,服务器管理员想部署一个单机的tikv docker集群,使用了开源docker配置文件启动,未注意容器启动了spark服务,且spark master api使用默认配置(使用默认端口7077并未加访问控制),因此定位到攻击者利用spark master api未授权访问漏洞入侵,向master节点提交恶意程序,同时感染worker节点。
常用排查命令:
[root@localhost ~]#ss –neltup | more #查看监听端口开放情况
[root@localhost ~]# netstat -neltup | more #查看监听端口开放情况
2. 利用已知样本特征
查找连接信息中的可疑IP/域名/URL是否命中某病毒家族的IOC特征,可互联网搜索该病毒家族的分析报告,根据报告提到的历史入侵方式(如爆破、漏洞利用、凭据窃取等),结合服务器当前配置、启动组件等,定位入侵入口。
3. 查看iptables规则配置
一方面,查看现有iptables规则是否存在某组件开放端口未做访问控制的情况,重点排查该组件包含的历史漏洞和不安全配置,验证是否通过上述原因导致被黑,不过黑客入侵后可能会清理iptables,因此可能需要与运维确认被清理前iptables规则配置情况。
另一方面,黑客入侵后为避免其他竞品再次入侵服务器,可能会修改iptables,使得脆弱性组件端口不再能被外部访问,因此我们能结合组件开放端口和iptables可疑端口限制规则来进一步确认入侵点。
图8 恶意样本修改iptables规则示例
4. 利用audit审计
添加audit规则auditctl -a always,exit -F arch=b64 -S connect [-F success=1 -F path=xxx] -k xxx,监控connect()系统调用,可查看日志判断是否有可疑程序发起可疑连接,关注连接至可疑IP、端口的记录,关注同一程序非业务或运维需要却大批量外发或者内发连接请求的记录。若有锁定这样的可疑程序,可设置-F path=xxx重点审计该进程的网络连接,或进一步添加audit规则auditctl -w xxx -p rx -k xxx追踪与之关联的进程,从而确认守护进程或父级进程,提取出完整样本,方便确认入侵入口。audit审计在样本使用大部分隐藏技术时(隐藏进程、隐藏端口、隐藏文件等非绕过auditd的技术)仍能发挥效用。
图9 audit追踪kdumpd网络连接日志示例
常用排查命令:
[root@localhost ~]# auditctl -a always,exit -F arch=b64 -S connect [-F success=1 -F path=可疑程序路径] -k network_connect #audit审计监控connect系统调用,可指定可疑程序路径和调用结果
[root@localhost ~]# auditctl -w 可疑程序路径 -p rx -k sus_pro #audit审计监控可疑程序路径的打开和执行,为追踪其关联可疑进程
5. tcpdump抓包分析
如果上述溯源方式无法定位到入侵点,可尝试tcpdump抓包分析入栈流量,因为自动化的攻击可能会多次触发,如果能够再次捕获到恶意的流量,则有可能会分析出具体入侵手法,对于往往只触发一次的定向攻击场景,抓包溯源的可能性小。可tcpdump抓包持续观察可疑连接,设置抓包规则时可与管理员沟通了解正常业务或运维需要的网络连接情况辅助确认抓包筛选规则。
对于抓到的数据包,可进一步进行网络流量分析,对数据包字段和内容进行多层次的检查,以识别潜在的恶意行为,定位出具体入侵手法以及利用的漏洞,如对协议(如ICMP可能被用于网络探测和DoS攻击)、数据包大小、User-Agent头(如识别常见的自动化工具、爬虫或伪装成合法用户的恶意客户端)、其他HTTP头字段(如检查Referer、Cookie、Content-Type,识别异常或可疑的值)进行检查,对数据包负载进行内容特征匹配、识别异常编码或压缩方式等。同时,有许多开源工具和项目提供了丰富的网络流量分析规则集,可加以利用帮助有效提高网络流量分析的效率和准确性,如Suricata、Snort、Zeek。
常用排查命令:
[root@localhost ~]# tcpdump -i [network_interface,如eth0] -n [src host 源IP|src port 源端口|dst host 目的IP|dst port 目的端口|proto 协议] -w record.pcap #tcpdump抓包至指定文件,过滤数据包源IP&端口、目的IP&端口、协议等信息
小结
通过上述对系统网络监听、网络连接(纵向和横向)、甚至网络流量进行分析,结合相关联服务器上恶意进程启动、恶意文件落盘、日志记录的入侵痕迹情况,我们可以构建出攻击事件的感染链路。这个感染的服务器全局拓扑结构包括第一批被黑服务器以及初始入侵入口,横向移动被感染的所有服务器以及横向入侵入口,横向移动的层级以及服务器被感染的顺序,被入侵服务器上远控软件与C2的连接以及木马后门程序与黑IP的连接。
有了这样一个安全事件的全局视角,为安全人员后续的系统恢复和加固工作也提供了依据,如关闭非必要对外开放的服务端口、开放服务使用非默认端口、检测网络连接IOC特征并告警或切断、防火墙和组件配置做好访问控制、组件配置复杂口令并配置做好鉴权。
以下总结了Linux应急排查网络分析过程中的一些排查命令。
图10 Linux应急排查网络分析思维导图
下一篇我们将介绍Linux应急排查的日志分析部分。
系统和组件的日志文件中记录了大量的历史操作信息,可以帮助追踪攻击者的活动路径和行为模式,在攻击者未清理日志的情况下可能会查找到明确的入侵痕迹,帮助梳理出攻击活动时间线,记录的操作特征也可能揭示系统或组件中存在的安全漏洞。在日志没有记录明确入侵痕迹的情况下,或恶意程序使用了一定的隐藏技术的情况下,可尝试针对可疑进程、文件等制定新的日志记录规则,或开启更详细级别的日志记录进行进一步排查。相信在下一篇,通过对日志分析的介绍,能够对整个攻击活动和时间脉络有一个全局的了解。