因为之前看到有人询问产品发现了ICMP隧道的告警如何定位到进程,后来我花时间查了一下资料,这一方面的资料确实不多,所以自己琢磨了一下,感谢坤哥与乐少对我的指导,没有两位师傅windows上排查会复杂很多

linux

因为ICMP本身是低层协议,在linux上的实现是使用的 SOCK_RAW
不论是netstat 还是高发行版本替代netstatss 都拥有查询原始套接字网络连接的功能,所以我们在Linux的主机上,可以通过特定的命令获取到Linux上发送ICMP数据包的进程
关于ssnetstat的说明:https://blog.csdn.net/weixin_42816196/article/details/86580834

具体操作

可以根据对应的流量告警详情选择 IP 协议的版本,一下演示使用 IPV4 环境
netstat -alpw4ss -alpw4
image.png
将进程PID提取,并追踪查找父进程即可
image.png

演示案例

  1. 客户端
  2. pingtunnel.exe -type client -l 172.16.xx.xx:4455 -s 82.xx.xxx.xxx -t 82.xx.xxx.xxx:4455 -tcp 1
  3. 服务端
  4. sudo ./pingtunnel -type server
  5. 服务端定位pingtunnel -- 如果出现进程迁移,或者注入内存,可以通过pstree 跟踪父进程
  6. root@VM-0-5-ubuntu:~# netstat -alpw4 //
  7. Active Internet connections (servers and established)
  8. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  9. raw 0 0 0.0.0.0:icmp 0.0.0.0:* 7 4053491/./pingtunne
  10. root@VM-0-5-ubuntu:~# pstree -spna 4053491
  11. systemd,1
  12. └─sshd,696
  13. └─sshd,4045273
  14. └─sshd,4045382
  15. └─bash,4045383
  16. └─sudo,4045478 -i
  17. └─bash,4045479
  18. └─sudo,4053490 ./pingtunnel -type server
  19. └─pingtunnel,4053491 -type server
  20. ├─{pingtunnel},4053492
  21. ├─{pingtunnel},4053493
  22. └─{pingtunnel},4053494
  23. 客户端定位与服务端一致
  24. root@VM-24-8-ubuntu:~# clear
  25. root@VM-24-8-ubuntu:~# netstat -alpw4
  26. Active Internet connections (servers and established)
  27. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  28. raw 0 0 0.0.0.0:icmp 0.0.0.0:* 7 3104052/./pingtunne
  29. root@VM-24-8-ubuntu:~# pstree -snpa 3104052
  30. systemd,1
  31. └─sshd,1106
  32. └─sshd,3102054
  33. └─sshd,3102167
  34. └─bash,3102168
  35. └─sudo,3102306 -i
  36. └─bash,3102307
  37. └─pingtunnel,3104052 -type client -l 10.xx.xx.xx:4455 -s 82.xx.xx.xxx -t 82.1xx.xx.xx:4455 -tcp 1
  38. ├─{pingtunnel},3104053
  39. ├─{pingtunnel},3104054
  40. ├─{pingtunnel},3104055
  41. └─{pingtunnel},3104056
  42. 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协议的版本.
其次可以针对特定协议进行抓包

  1. Protocol=<protocol>
  2. 使指定筛选器与 IP 协议相匹配。
  3. 例如 Protocol=6
  4. 例如 Protocol=!(TCP,UDP)
  5. 例如 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))
以下是操作

  1. PS C:\Users\waiting4> netsh trace start capture=yes Protocol=1
  2. 跟踪配置:
  3. -------------------------------------------------------------------
  4. 状态: 正在运行
  5. 跟踪文件: C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.etl
  6. 附加: 关闭
  7. 循环: 启用
  8. 最大大小: 512 MB
  9. 报告: 关闭
  10. PS C:\Users\waiting4> netsh trace stop
  11. 正在合并跟踪 ... 完成
  12. 正在生成数据集合... 完成
  13. 跟踪文件和其他疑难解答信息已编译为“C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.cab”。
  14. 文件位置 = C:\Users\waiting4\AppData\Local\Temp\NetTraces\NetTrace.etl
  15. 跟踪会话已成功停止。
  16. 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
image.png
将etl文件导入工具中,至此完成了ICMP进程的定位
image.png
此时已经找到了进程ID。接受ICMP响应的进程ID为4,说明这是通过系统处理然后回复给ICMP进程的。
随后我们根据PID定位到运行的文件即可确认文件位置。

  1. PS C:\Users\waiting4> wmic process get name,executablepath,processid |findstr 18648
  2. C:\Users\waiting4\Desktop\ICMP\pingtunnel_windows_amd64\pingtunnel.exe
  3. pingtunnel.exe 18648

如何找到父进程

  1. Windows PowerShell
  2. 版权所有 (C) Microsoft Corporation。保留所有权利。
  3. 尝试新的跨平台 PowerShell https://aka.ms/pscore6
  4. PS C:\Users\waiting4> wmic process where ProcessId=3432 get ParentProcessId
  5. ParentProcessId
  6. 9984
  7. PS C:\Users\waiting4> wmic process where ProcessId=9984 get ParentProcessId
  8. ParentProcessId
  9. 9180
  10. PS C:\Users\waiting4> wmic process where ProcessId=9180 get ParentProcessId
  11. ParentProcessId
  12. 6696
  13. PS C:\Users\waiting4> wmic process where ProcessId=6696 get ParentProcessId
  14. 没有可用实例。