因为之前看到有人询问产品发现了ICMP隧道的告警如何定位到进程与文件,后来我花时间查了一下资料,这一方面的资料确实不多,所以尝试了一下.
当IDS设备出现ICMP隧道告警的时候,我们可以使用该工具在WINDOWS操作系统上进行进程与文件的定位,由于借助netsh工具,所以对WINDOWS操作系统有一定的要求,必须在win7以上,支持netsh trace
功能.该工具的本质是抓包,随后解析数据.所以可能会出现抓包的时候进程存活,但是解析完数据之后进程结束了从而无法定位到进程的现象.这一个问题我暂时么的解决方案.
因为ICMP本身是低层协议,在linux上的实现是使用的 SOCK_RAW
不论是netstat
还是高发行版本替代netstat
的 ss
都拥有查询原始套接字网络连接的功能,所以我们在Linux的主机上,可以通过特定的命令获取到Linux上发送ICMP
数据包的进程.
可以根据对应的流量告警详情选择 IP
协议的版本,一下演示使用 IPV4
环境netstat -alpw4
或ss -alpw4
将进程PID提取,并追踪查找父进程即可
客户端
pingtunnel.exe -type client -l 172.16.xx.xx:4455 -s 82.xx.xxx.xxx -t 82.xx.xxx.xxx:4455 -tcp 1
服务端
sudo ./pingtunnel -type server
服务端定位pingtunnel -- 如果出现进程迁移,或者注入内存,可以通过pstree 跟踪父进程
root@VM-0-5-ubuntu:~# netstat -alpw4 //
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
raw 0 0 0.0.0.0:icmp 0.0.0.0:* 7 4053491/./pingtunne
root@VM-0-5-ubuntu:~# pstree -spna 4053491
systemd,1
└─sshd,696
└─sshd,4045273
└─sshd,4045382
└─bash,4045383
└─sudo,4045478 -i
└─bash,4045479
└─sudo,4053490 ./pingtunnel -type server
└─pingtunnel,4053491 -type server
├─{pingtunnel},4053492
├─{pingtunnel},4053493
└─{pingtunnel},4053494
客户端定位与服务端一致
root@VM-24-8-ubuntu:~# clear
root@VM-24-8-ubuntu:~# netstat -alpw4
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
raw 0 0 0.0.0.0:icmp 0.0.0.0:* 7 3104052/./pingtunne
root@VM-24-8-ubuntu:~# pstree -snpa 3104052
systemd,1
└─sshd,1106
└─sshd,3102054
└─sshd,3102167
└─bash,3102168
└─sudo,3102306 -i
└─bash,3102307
└─pingtunnel,3104052 -type client -l 10.xx.xx.xx:4455 -s 82.xx.xx.xxx -t 82.1xx.xx.xx:4455 -tcp 1
├─{pingtunnel},3104053
├─{pingtunnel},3104054
├─{pingtunnel},3104055
└─{pingtunnel},3104056
root@VM-24-8-ubuntu:~#
通过Netsh
抓取主机发送的ICMP
数据包(目前只支持IPV4),随后对文件进行转储,解析.由于使用Netsh
的trace
功能需要管理员权限
所以请使用管理员权限的**dos(cmd)**
或者**powershell**
运行该程序!
所以请使用管理员权限的**dos(cmd)**
或者**powershell**
运行该程序!
所以请使用管理员权限的**dos(cmd)**
或者**powershell**
运行该程序!
详细流程:
使用管理员权限启动控制台
PS C:\Users\coder\GolandProjects\FindIcmpP> .\FindIcmpP.exe -h
Usage of C:\Users\coder\GolandProjects\FindIcmpP\FindIcmpP.exe:
-c 默认模式下不会追踪启动进程的文件,如果不选择该参数,则不会有输出文件
-f string
选择-po的情况下,需要通过该参数来指定ETL文件路径
-po
如果选择该参数,则不会进行抓包,只会解析本地etl文件
-t uint
在主机抓包时长,默认10s,建议不超过30s (default 10)
使用FindIcmpP.exe -t 3 -c
即可在主机抓取ICMPV4
通信的进程
首先需要自己进行抓包.以管理员身份运行netsh trace start capture=yes Protocol=1
,一段时间后关闭netsh trace stop
随后FindIcmpP.exe -po -f etlFilePath -c
即可解析本地的ETL文件,从而通过ETL文件获取到通信进程
在启用-C
追踪文件的情况下才会有输出,会在etl
的文件路径下生成一个时间戳+result.csv
文件
由于Icmp没有端口号,所用的响应都是操作系统来找寻线程的,所以一般你能在输出的CSV中看到很多来自父进程的或者系统进程的信息,建议关注SRCIP为受害机器的请求,那样你能很快定位到进程与文件
感谢坤少🦸♂️与乐少🦸♂️对我的指导,没有两位师傅windows上排查会复杂很多
参考: http://randomuserid.blogspot.com/2007/03/tracking-down-random-icmp-in-windows.html https://randomuserid.blogspot.com/2015/06/windows-icmp-redux.html