0x01 前言
放假那天和学弟闲聊,偶然聊到了某次应急。场景如下:
态感设备侦测到内网中某终端出现异常 ICMP 流量,怀疑该终端已沦陷。该终端使用Windows系统,承载了关键业务系统,无法进行断网操作,需要尽快定位进程。

本文不涉及对 ICMP 流量的分析,对流量分析有意向的师傅可移步到 RJ45mp 师傅的文章。
1 | 内网代理和穿透工具的分析记录-RJ45mp |
0x02 Windows - Microsoft Message Analyzer
介绍
Microsoft Message Analyzer(MMA)是微软推出的一款用于捕获、显示和分析网络协议数据的软件。说白了,功能上和 WireShark 差不多,甚至不如 WireShark,所以微软很识相的在2016年之后,再也没给 MMA 更新过了……

下载
由于微软已经在官网上下架了该款软件,所以我们只能在网上别的地方下载 MMA ,所幸的是 Github 上有人建立了存档,链接放在下面,自行下载就好。
1 | https://github.com/riverar/messageanalyzer-archive |
实验环境
- 攻击机 - CentOS7 - 192.168.0.9
- 受害机 - WinSer2012r2 - 192.168.0.8
- 工具:icmpsh、MMA
过程
1.攻击机关闭 ICMP 应答,开始监听
1 | sysctl -w net.ipv4.icmp_echo_ignore_all=1 |
2.受害机启动 MMA 并监听本地网络接口
3.受害机 MMA 添加进程列,设置过滤规则
这里为了快速查找数据包,笔者还添加了“ReqData”列
4.受害机成功回弹shell
5.MMA 查看消息
可以看到,MMA 可以快速定位发出异常 ICMP 流量的进程,查看发送出的数据。更重要的是,MMA 还可以通过远程登录到别的计算机上进行远程抓取,非常方便。
0x03 Windows - ALPCLogger
介绍
在查找相关资料的过程中,找到了绿盟投稿的《如何找到发送异常ICMP流量的进程?》,文中提到在 Windows 下 ICMP 请求都是托管给系统进程 svchost 的。以下引用原文
既然是进程托管,就一定会涉及到进程间通信,而Windows下进程通信又以本地调用机制为主。我们可以利用调用捕获工具,配合wireshark等抓包工具,得到ICMP流量与进程的对应关系。
Windows本地调用(LPC,Local Procedure Call)简单介绍,通常也被称为轻量过程调用或者本地进程间通信,是一种由Windows NT内核提供的内部进程间通信方式。通过这一方式,同一计算机上的进程可以进行轻量的通信。在Windows Vista中及以后,ALPC(Advanced Local Procedure Call,高级本地进程通信)替代了LPC。ALPC十分复杂,还被非常多的应用所使用,如RPC、WMI、COM组件、打印机等。即使最简单的windows程序都会有ALPC连接。可以用ProcessExplorer查看每个进程的ALPC Port的名字。
那我们就可以使用本地调用监控工具 ALPCLogger 对本地调用进行监控。
下载
1 | https://github.com/zodiacon/ALPCLogger |
当然,这个软件上来就给我了我一个下马威……笔者极其讨厌安装 dotNet 的依赖。
实验环境
- 攻击机 - CentOS7 - 192.168.0.9
- 受害机 - WinSer2012r2 - 192.168.0.8
- 工具:icmpsh、ALPCLogger、WireShark、Process Monitor
过程
1.在 icmpsh 执行命令前,先打开 ALPCLogger、WireShark 以及 Process Monitor。
2.在 WireShark 抓取流量并选取其中一个数据包,这里笔者选取 No.23661 数据包
3.查看数据包详情,并记录下包时间(红框处)
4.回到 ALPCLogger 匹配对应的时间点附近,找到给“svchost”发消息的进程,确认该进程 ID 为 3032。
5.使用 Process Monitor 过滤出进程号为 3032 的进程。
6.跟踪其行为可发现,该进程调用了 nsi 以及 iphlpapi.dll 的 IcmpCreateFile 函数
至于 IcmpCreateFile 函数是用来干嘛的,微软已经说的很明白了。
0x04 Linux - Systemtap
介绍
继续引用绿盟投稿的《如何找到发送异常ICMP流量的进程?》一文。
由于Linux下不存在Windows那种托管机制,ICMP流量由本进程驱动发送,所以捕获起来更加容易且可信度高。
在Linux下实时捕获ICMP流量我们要用到基于Kprobe的内核调用调试机制。
下载
1 | wget http://debuginfo.centos.org/$(cat /etc/redhat-release|cut -c 22)/$(uname -p)/kernel-debuginfo-common-$(uname -p)-$(uname -r).rpm |
实验环境
- 攻击机 - CentOS7 - 192.168.0.9
- 受害机 - CentOS7 - 2 - 192.168.0.10
- 工具:icmpsh、systemtap
过程
写入脚本内容
1
2
3
4
5
6
7
8
9
probe netfilter.ip.local_out {
if (0 == dport)
printf("%s[PID:%d,TID:%d] sent %d to %s:%d\n", execname(), pid(), tid(),length, daddr, dport)
}
probe netfilter.ip.local_in {
if (0 == sport)
printf("%s recv %d from %s:%d\n", execname(),length, saddr, sport)
}执行脚本查看效果
1
2stap -i ./icmp.sh
run