我们在渗透测试中时常会用到公网MSF反弹一个shell或meterpreter,记得有几次在朋友的阿里云主机上用hta_server、web_delivery这两个模块进行监听时怎么都获取不到会话,但是用EXE的攻击载荷又可以,当时还以为是MSF版本问题,也没有去研究监听失败的原因,大家可能都有遇到过这个问题吧!

0x01 公网/内网IP的区别

阿里/腾讯云主机在开通后会给我们分配一个公网IP和一个内网IP,公网IP用于域名解析、远程连接SSH/RDP服务等,内网IP主要用于跟当前帐号下的其他同集群机器通信。阿里云分配的公网和内网IP都可以向公网上任意机器发送请求连接,但我们不能直接向阿里云的内网IP发送请求连接。
Image 1.png

0x02 云主机监听失败原因

阿里云主机上用MSF生成EXE攻击载荷必须填写公网IP,但监听时可以使用内网IP,因为我们是可以与目标机器进行通信的。但为什么在hta_server、web_delivery这两个模块监听时用内网IP就不行了呢?这里笔者以web_delivery为例来进行简单分析演示,生成一个Powershell Payload。
Image 5.png

将Powershell Payload的Base64编码提取出来用certutil命令解码看一下就知道其原因了,使用这种无落地文件远程执行Payload时,因为监听IP为内网IP,生成的远程Payload地址也为内网IP,所以在目标主机上执行时会因为访问不到我们阿里云的内网IP而执行失败,导致无法获取会话。

  1. certutil -decode encode.txt decode.txt

Image 7.png

这里我也尝试了将SRVHOST修改为公网IP,SRVPORT修改为其他端口,但是在执行exploit时还是会出现[-] Exploit failed [bad-config]: Rex::BindFailed The address is already in use or unavailable: (39.96.9.238:8888).报错。
Image 8.png

朋友@小西补充:
hta_server、web_delivery这两个模块是主动连接MSF在阿里云服务器上运行的服务,所以必须设置公网IP,虽然MSF提示了绑定公网失败,但实际上服务已经是开放在公网了。

0x03 云主机监听解决方案

解决方案其实也很简单,在使用hta_server、web_delivery这两个模块时只需要将监听IP设置为公网IP即可,虽然在执行exploit时也会出现[-] Handler failed to bind to 39...238:443:- -报错,但不会影响我们获取Meterpreter会话。
Image 9.png


public.png