以前团队小伙伴在给某个客户做常规的应急取证,事件就是连接到恶意远控地址:wio2lo1n3.pw,这种事情很常规,处置起来应该问题不大:
但是在实际处置过程中却发现还是有些需要深入分析与处置的,一个表现是通过常规的netstat命令和使用busybox看到的结果不一致,初步分析使用busybox命令可以看到有java进程相关的连接,但是单纯使用netstat命令看不到:
但是使用busybox可以看到,怀疑被植入了Rootkit:
其实现的时候主要是劫持两个地方:
环境变量:$LD_PRELOAD配置文件:/etc/ld.so.preload
所以需要对这两处进行排查,但是都没有排查出来,所以排除了库文件劫持的可能性:
前面我们看到相关的告警如下,是一个DNS的告警,并且只有查询,无响应:
DNS的告警,我们的目的是想捕捉到相关的进程从而进行处置,但是DNS流量是基于UDP的,UDP非同于TCP,其是无状态、无连接的,这样的话是无法通过netstat来定位相关的PID的,相关UDP的连接信息如下:
针对这种场景,这里面有个比较不错的小思路:
受害机器一般在DNS解析成功以后都会使用TCP的方式进行连接其C2地址,这样我们就可以手工指定恶意域名的C2,然后再去捕捉TCP相关的连接就可以定位到相关的进程了
这种方法一直在使用,虽然小巧但是很实用,具体实现如下:
直接在受控主机的/etc/hosts文件中配置静态IP(这里面为团队小伙伴的VPS地址),这样就绕过了DNS的动态查询在本地写个循环来过滤相关的TCP连接:whiletrue;do netstat -anltp | grep x.x.x.x;done另外,如果为Windows系统,可以使用下面的命令来查找:for /l %a in (0,0,1) do netstat -anto | findstr x.x.x.x
具体实现后的效果如下所示:
这样就定位到了本地的进程PID和进程名,到这里面就好办了,直接使用下面命令来清除相关的进程:
kill -9 7294
前面我们看到相关的netstat命令和busybox netstat命令看到的不一致,前面排除了库文件劫持的可能,后面就两种可能性了:
命令替换Ring 0或Ring 3级别的Rootkit
如果是Rootkit那就非常麻烦,这种对抗目前还没有比较好的产品来检测,大多数是依赖于安全专家的能力来检测;如果是命令替换的话是非常好检测的,这里面有两个实现的方式:
使用MD5Sum来针对关键或可疑的文件进行校验,并将MD5放到沙箱中检测使用rpm -Va来检测,基本质上也是对比文件的MD5值
关于rpm -Va的检测,其本身是有个MD5的库,校验的时候会把取本地文件的MD5值,然后和库里面的值进行校验,如果有改变则判断为变化。相关输出参数的含义如下:
S 表示文件长度发生了变化M 表示文件的访问权限或文件类型发生了变化5 表示MD5校验和发生了变化D 表示设备节点的属性发生了变化L 表示文件的符号链接发生了变化U 表示文件/子目录/ 设备节点的owner 发生了变化G 表示文件/子目录/ 设备节点的group 发生了变化T 表示文件最后一次的修改时间是发生了变化
这里面为了方便,我们直接使用rpm -Va来检测,检测后的结果如下所示:
可以看到很多文件的MD5值已经发生了变化,为了定位到源文件,我们也把部分被替换的文件的MD5值取了下来,如下所示:
e05747461650ae6688fe0ed2b1104f0e /bin/psd22ab8c48feb03baccb460b7842140a4 /usr/bin/tope05747461650ae6688fe0ed2b1104f0e /usr/sbin/lsof7e78010c6505d3009bfc36e1009c31c3 /usr/sbin/ss7e78010c6505d3009bfc36e1009c31c3 /bin/netstat
这个就是我们前面看到的恶意文件,这个是把/usr/bin/netstat替换掉:
7e78010c6505d3009bfc36e1009c31c3
通过分析,发现其存在修改命令的行为:
发现有DNS解析,解析的域名为前面监测到的域名:
e05747461650ae6688fe0ed2b1104f0ed22ab8c48feb03baccb460b7842140a4e05747461650ae6688fe0ed2b1104f0e7e78010c6505d3009bfc36e1009c31c3