Fu5r0dah's Blog

找到发出异常ICMP流量的进程

字数统计: 1.3k阅读时长: 5 min
2024/02/21

0x01 前言

放假那天和学弟闲聊,偶然聊到了某次应急。场景如下:

态感设备侦测到内网中某终端出现异常 ICMP 流量,怀疑该终端已沦陷。该终端使用Windows系统,承载了关键业务系统,无法进行断网操作,需要尽快定位进程。

image-e2837711-8f54-433a-931a-e23c5f14e5e6

本文不涉及对 ICMP 流量的分析,对流量分析有意向的师傅可移步到 RJ45mp 师傅的文章。

1
2
内网代理和穿透工具的分析记录-RJ45mp
https://rj45mp.github.io/%E5%86%85%E7%BD%91%E4%BB%A3%E7%90%86%E5%92%8C%E7%A9%BF%E9%80%8F%E5%B7%A5%E5%85%B7%E7%9A%84%E5%88%86%E6%9E%90%E8%AE%B0%E5%BD%95/

0x02 Windows - Microsoft Message Analyzer

介绍

Microsoft Message Analyzer(MMA)是微软推出的一款用于捕获、显示和分析网络协议数据的软件。说白了,功能上和 WireShark 差不多,甚至不如 WireShark,所以微软很识相的在2016年之后,再也没给 MMA 更新过了……

image-6a59d222-e6a0-46bf-bfd3-5da77f3de26f

下载

由于微软已经在官网上下架了该款软件,所以我们只能在网上别的地方下载 MMA ,所幸的是 Github 上有人建立了存档,链接放在下面,自行下载就好。

1
https://github.com/riverar/messageanalyzer-archive

实验环境

  • 攻击机 - CentOS7 - 192.168.0.9
  • 受害机 - WinSer2012r2 - 192.168.0.8
  • 工具:icmpsh、MMA

过程

1.攻击机关闭 ICMP 应答,开始监听

1
2
3
4
sysctl -w net.ipv4.icmp_echo_ignore_all=1

###还原设置
sysctl -w net.ipv4.icmp_echo_ignore_all=0

caa9aa46-b96e-45f7-b8f4-6d58121dc439

cd71a3ed-ba4a-4b64-bdb7-0a56059413eb

2.受害机启动 MMA 并监听本地网络接口

c83b4cca-8b4e-458b-82af-f5158b3a983a

3.受害机 MMA 添加进程列,设置过滤规则

32ecd4b1-18c4-4ee5-afa8-a721b5c95cba

ffba850b-320a-4cb9-b95b-66e32b3d5bd8

097b8115-6553-497d-926f-d361c0ffcf4f

这里为了快速查找数据包,笔者还添加了“ReqData”列

345963a0-5c3d-453b-bef4-ffeb9b4039b0

4.受害机成功回弹shell

401a0d96-9241-4628-b112-c595a87f06d9

726186d5-cc52-4c9e-9604-0ac8b8296685

5.MMA 查看消息

a7329573-39a9-4daf-91ea-949643041bad

可以看到,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 的依赖。

7737639c-210d-4054-b43b-582bc348ea1f

实验环境

  • 攻击机 - CentOS7 - 192.168.0.9
  • 受害机 - WinSer2012r2 - 192.168.0.8
  • 工具:icmpsh、ALPCLogger、WireShark、Process Monitor

过程

1.在 icmpsh 执行命令前,先打开 ALPCLogger、WireShark 以及 Process Monitor。

6c7cb317-5fab-4729-8a3e-f025bff9e017

2.在 WireShark 抓取流量并选取其中一个数据包,这里笔者选取 No.23661 数据包

7e8ddc49-c23e-49b9-8496-d1f356e5fa09

3.查看数据包详情,并记录下包时间(红框处)

a21ab87a-ade9-43b7-89af-89d820ef62fe

4.回到 ALPCLogger 匹配对应的时间点附近,找到给“svchost”发消息的进程,确认该进程 ID 为 3032。

1d4d23c6-3652-480f-aac3-7ca2566fe65e

5.使用 Process Monitor 过滤出进程号为 3032 的进程。

73757e3b-5c3b-421f-bb55-918778970f2c

6.跟踪其行为可发现,该进程调用了 nsi 以及 iphlpapi.dll 的 IcmpCreateFile 函数

a46ac105-52f0-4ab7-ac80-2b3b11d6bcb6.png

至于 IcmpCreateFile 函数是用来干嘛的,微软已经说的很明白了。

0bda4c08-220f-4479-8014-91623c53f64b

0x04 Linux - Systemtap

介绍

继续引用绿盟投稿的《如何找到发送异常ICMP流量的进程?》一文。

由于Linux下不存在Windows那种托管机制,ICMP流量由本进程驱动发送,所以捕获起来更加容易且可信度高。
在Linux下实时捕获ICMP流量我们要用到基于Kprobe的内核调用调试机制。

下载

1
2
3
4
5
6
7
8
9
wget http://debuginfo.centos.org/$(cat /etc/redhat-release|cut -c 22)/$(uname -p)/kernel-debuginfo-common-$(uname -p)-$(uname -r).rpm
wget http://debuginfo.centos.org/$(cat /etc/redhat-release|cut -c 22)/$(uname -p)/kernel-debuginfo-$(uname -r).rpm


rpm -ivh kernel-debuginfo-common-$(uname -p)-$(uname -r).rpm
rpm -ivh kernel-debuginfo-$(uname -r).rpm

yum install "kernel-devel-$(uname -r)"
yum install -y systemtap systemtap-runtime

实验环境

  • 攻击机 - CentOS7 - 192.168.0.9
  • 受害机 - CentOS7 - 2 - 192.168.0.10
  • 工具:icmpsh、systemtap

过程

  1. 写入脚本内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /usr/bin/env stap
    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)
    }
  2. 执行脚本查看效果

    1
    2
    stap -i ./icmp.sh 
    run
    38669be4-05b2-4b90-a23e-68e32d05ec19
CATALOG
  1. 1. 0x01 前言
  2. 2. 0x02 Windows - Microsoft Message Analyzer
    1. 2.1. 介绍
    2. 2.2. 下载
    3. 2.3. 实验环境
    4. 2.4. 过程
  3. 3. 0x03 Windows - ALPCLogger
    1. 3.1. 介绍
    2. 3.2. 下载
    3. 3.3. 实验环境
    4. 3.4. 过程
  4. 4. 0x04 Linux - Systemtap
    1. 4.1. 介绍
    2. 4.2. 下载
    3. 4.3. 实验环境
    4. 4.4. 过程