Skip to content

Latest commit

 

History

History
104 lines (95 loc) · 6.85 KB

README.md

File metadata and controls

104 lines (95 loc) · 6.85 KB

FindIcmpP

为什么有FindIcmpP

因为之前看到有人询问产品发现了ICMP隧道的告警如何定位到进程与文件,后来我花时间查了一下资料,这一方面的资料确实不多,所以尝试了一下.

工具的使用场景

当IDS设备出现ICMP隧道告警的时候,我们可以使用该工具在WINDOWS操作系统上进行进程与文件的定位,由于借助netsh工具,所以对WINDOWS操作系统有一定的要求,必须在win7以上,支持netsh trace功能.该工具的本质是抓包,随后解析数据.所以可能会出现抓包的时候进程存活,但是解析完数据之后进程结束了从而无法定位到进程的现象.这一个问题我暂时么的解决方案.

为什么不支持Linux

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

具体操作

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

演示案例

客户端
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),随后对文件进行转储,解析.由于使用Netshtrace功能需要管理员权限
所以请使用管理员权限的**dos(cmd)**或者**powershell**运行该程序!
所以请使用管理员权限的**dos(cmd)**或者**powershell**运行该程序!
所以请使用管理员权限的**dos(cmd)**或者**powershell**运行该程序!
详细流程:
image

使用方法

使用管理员权限启动控制台

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文件 image

Windows下的一些细节

由于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