因为之前看到有人询问产品发现了ICMP隧道的告警如何定位到进程,后来我花时间查了一下资料,这一方面的资料确实不多,所以自己琢磨了一下,感谢坤哥与乐少对我的指导,没有两位师傅windows上排查会复杂很多
linux
因为ICMP本身是低层协议,在linux上的实现是使用的 SOCK_RAW
不论是netstat
还是高发行版本替代netstat
的 ss
都拥有查询原始套接字网络连接的功能,所以我们在Linux的主机上,可以通过特定的命令获取到Linux上发送ICMP
数据包的进程
关于ss
与netstat
的说明:https://blog.csdn.net/weixin_42816196/article/details/86580834
具体操作
可以根据对应的流量告警详情选择 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:~#
windows
写了一个小工具来辅助完成取证:https://github.com/w4iting4/FindIcmpP
具体操作
参考链接:
http://randomuserid.blogspot.com/2007/03/tracking-down-random-icmp-in-windows.html
https://randomuserid.blogspot.com/2015/06/windows-icmp-redux.html
使用windows自带的netsh
可以对数据包进行采集,随后解析数据包即可. 注意事项:trace
功能出现windows7之后的windows系统。
😂一开始没仔细查看netsh
的官方文档,后来在写程序的时候处理数据有点麻烦,仔细查了一下官方文档,其中提到可以使用Ethernet.Type=IPv4
来指定IP协议的版本.
其次可以针对特定协议进行抓包
Protocol=<protocol>
使指定筛选器与 IP 协议相匹配。
例如 Protocol=6
例如 Protocol=!(TCP,UDP)
例如 Protocol=(4-10)
我们需要抓取ICMP
协议,在IPV4
中协议类型的值为1
,所以我们指定 Protocol=1
即可只抓取ICMP
协议的内容
相关说明:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/jj129382(v=ws.11))
以下是操作
PS C:\Users\waiting4> netsh trace start capture=yes Protocol=1
跟踪配置:
-------------------------------------------------------------------
状态: 正在运行
跟踪文件: C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.etl
附加: 关闭
循环: 启用
最大大小: 512 MB
报告: 关闭
PS C:\Users\waiting4> netsh trace stop
正在合并跟踪 ... 完成
正在生成数据集合... 完成
跟踪文件和其他疑难解答信息已编译为“C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.cab”。
文件位置 = C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.etl
跟踪会话已成功停止。
PS C:\Users\waiting4>
随后将生成的etl文件导入到Microsoft Network Monitor 3.4
下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=4865
首先配置解析Tools -> options ->windows -> set as active
将etl文件导入工具中,至此完成了ICMP进程的定位
此时已经找到了进程ID。接受ICMP响应的进程ID为4,说明这是通过系统处理然后回复给ICMP进程的。
随后我们根据PID定位到运行的文件即可确认文件位置。
PS C:\Users\waiting4> wmic process get name,executablepath,processid |findstr 18648
C:\Users\waiting4\Desktop\ICMP\pingtunnel_windows_amd64\pingtunnel.exe
pingtunnel.exe 18648
如何找到父进程
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\waiting4> wmic process where ProcessId=3432 get ParentProcessId
ParentProcessId
9984
PS C:\Users\waiting4> wmic process where ProcessId=9984 get ParentProcessId
ParentProcessId
9180
PS C:\Users\waiting4> wmic process where ProcessId=9180 get ParentProcessId
ParentProcessId
6696
PS C:\Users\waiting4> wmic process where ProcessId=6696 get ParentProcessId
没有可用实例。