基本信息
Lab地址:https://www.hackthebox.eu/home/machines/profile/197
端口扫描
首先nmap全端口扫描:
1 | nmap -p- 10.10.10.110 |
这一步会比较耗时,耐心等待结果:
服务信息
接下来针对这几个端口进一步扫描服务信息:
1 | nmap -p 22,443,6022 -sV -sC 10.10.10.110 |
得到结果:
1 | PORT STATE SERVICE VERSION |
其中443端口的ssl证书信息显示域名为craft.htb
,可以先把它添加到hosts里:
1 | 10.10.10.110 craft.htb |
直接访问443端口的web会有个警告信息,直接信任就可以
子域名
craft.htb的Web界面信息显示可以通过REST API访问,直接点击API会出错,因为这是一个子域名,api.craft.htb/api/


API右边的Logo是子域名 gogs.craft.htb,直接点击访问同样失败,看起来是用了Virtual Hosting,我们修改hosts,将这几个域名都加进去:
1 | 10.10.10.110 craft.htb api.craft.htb gogs.craft.htb |
然后我们再次访问这两个子域名,在信任证书后可以正常显示:
- Craft API

- Craft Gogs

API
API打开是swagger-ui,给出了一些API接口格式信息,看起来有用的是check, login, 和brew这几个
1 | GET /auth/check |
尝试auth login :

看起来是401基础认证,尝试简单用户名密码失败,响应如下:

响应头中有一个www-authenticate,看起来如果认证成功会得到一个token,另外检查/auth/check和/brew也可以根据相应信息确定,需要提供有效token:

Gogs
因为Gogs看起来是Git服务器,我们尝试进行目录爆破:
1 | python3 dirmap.py -i https://gogs.craft.htb/ -lcf |
得到如下结果:
1 | [200][text/html; charset=UTF-8][7.04kb] https://gogs.craft.htb/Administrator |
尝试访问/administrator:

在explore中可以发现一个craft-api的repo:

并且能够看到4个用户,administrator之外其他三个用户名是美剧《硅谷》中的角色:

代码信息
接下来翻一下repo中的代码
dbtest.py是一个测试数据库连接的脚本,并且有一个测试sql query:

test.py中是对API的测试,可以看到认证成功后得到token,之后使用X-Craft-API-Token请求头使用其他API:

auth.py是认证需要的一些信息和认证处理流程:


命令注入漏洞
继续翻其他文件,brew.py里这段代码很有趣,使用了eval,可能的命令注入:

在issue中有一个相关问题:

点进去可以发现eval是这次commit加进去的:

修复一个bug产生一个新漏洞,但利用这个eval的前提是要有有效认证信息
commit log 泄漏信息
转去看commit历史

可以看到第四次提交add test script,第五次是Cleanup test,这里泄漏了认证信息:


1 | dinesh:4aUh0A8PbVJxgd |
有效认证
然后,我们就可以使用dinesh的用户名和密码登录Gogs:

也可以使用同样的用户名密码使用API认证得到有效token:

也可以添加X-Craft-Api-Token请求头检查token,确认token有效:

利用命令注入
我们现在有有效token,就可以尝试利用/api/brew,在前面的脚本中我们也已经知道了相关请求格式,那么就可以进行测试:


正常的输入处理逻辑如上,但前面也注意到了,这里处理直接使用的eval,可能命令注入:
1 | # make sure the ABV value is sane. |
我们可以打开Python简单测试下:

可以看到这样的代码本地是可以进行命令注入的,接下来就进行下实际验证:


反弹shell
可以成功执行命令,接下来尝试反弹shell:

可以成功getshell,root权限
因为这是一个哑shell,想把它变成一个交互shell,但常规方式失败:

检查之后发现现在是在一个docker容器里:

那就扫描下docker这个网段:
1 | for ip in $(seq 1 254); do (ping -c 1 172.20.0.$ip | grep "bytes from" | cut -d ":" -f1 | cut -d " " -f4 &); done |
配置文件
但好像没什么有用信息,那就还从app本身文件入手:



可以看到这里有一个settings.py文件,前面的Gogs中没有这个文件
在settings.py中,我们可以得到CRAFT_API_SECRET和数据库相关信息:

dump db
另外dbtest.py直接使用相关信息测试查询数据库,我们可以尝试修改其中的sql query获取信息,不过因为是哑shell,所以需要本地修改好之后传过去,另外没有curl,但可以使用wget:

在modules.py中可以得到数据库结构信息:

修改sql获取所有user信息:

1 | [{'id': 1, 'username': 'dinesh', 'password': '4aUh0A8PbVJxgd'}, |
有效账号
尝试使用这些信息SSH连接22和 6022端口,均失败
尝试登录Gogs,gilfoyle的信息可用

SSH
可以看到一个craft-infra的repo:

并且在 .ssh
目录可以得到ssh密钥:

然后就可以用这个私钥以gilfoyle的身份登录SSH,可能会要求输入密码,就是gilfoyle用户的密码:

user.txt
现在可以得到user flag:

vault
查看下文件,发现有个.vault-token文件:

简单搜了下,这应该是Hashicorp的Vault ,一种用于在现代应用程序体系结构中安全地管理机密信息的流行工具。
- https://www.jianshu.com/p/019a9eb51ae6
- https://github.com/hashicorp/vault
- https://www.vaultproject.io/docs/commands/
并且前面的craft-infra中也有vault的相关文件:


可以看到vault secrets enable ssh
根据文档查看下token相关信息:

显示capabilities是root,并且前面看到enable ssh,那么尝试ssh:

password就是他给的session,成功获得root shell
root.txt
得到root flag:

并且确认6022端口是前面的docker
以上