
MongoBleed 악용 탐지 스크립트
CVE-2025-14847 (MongoBleed)에 대한 오프라인 MongoDB 분석 도구
여러 탐지 모듈을 사용하여 CVE-2025-14847의 악용 가능성을 식별하는 독립형 Linux 명령줄 도구입니다.
MongoBleed(CVE-2025-14847)는 MongoDB의 zlib 압축 해제 과정에서 발생하는 메모리 노출 취약점으로, 공격자가 인증 없이 서버 메모리에서 자격 증명, 세션 토큰, 개인 식별 정보(PII) 등 민감한 데이터를 직접 추출할 수 있습니다.
이 도구는 사고 대응자가 여러 증거 소스를 사용하여 악용 시도를 탐지할 수 있도록 지원합니다:
MongoDB JSON 로그를 분석하여 악용 패턴을 탐지합니다:
| 이벤트 ID | 유형 | 설명 |
|---|---|---|
| 22943 | 연결 수락 | 클라이언트가 연결될 때 기록됨 |
| 51800 | 클라이언트 메타데이터 | 클라이언트가 드라이버/애플리케이션 정보를 보낼 때 기록됨 |
| 22944 | 연결 종료 | 클라이언트가 연결을 끊을 때 기록됨 |
핵심 통찰: 합법적인 MongoDB 드라이버는 항상 클라이언트 메타데이터를 보냅니다. MongoBleed 악용 코드는 연결하고 메모리를 추출한 후 연결을 끊지만 메타데이터는 절대 보내지 않습니다.
db.serverStatus().asserts의 스냅샷을 분석하여 asserts.user 카운터에서 비정상적인 패턴을 탐지합니다:
asserts.user를 다른 assertion 유형과 비교하여 의심스러운 패턴을 탐지합니다. 사용자 assert가 다른 유형에 비해 불균형적으로 높거나(비율 ≥250배) 다른 모든 유형이 0인 경우 MEDIUM 신뢰도로 의심스러운 것으로 플래그 지정참고: 누적 카운터는 거짓 양성을 유발할 수 있습니다. 최상의 결과를 위해 FTDC(모듈 B2)와 함께 사용하십시오.
MongoDB의 FTDC(Full-Time Diagnostic Data Capture) 파일을 분석하여 assertion 카운터에서 시간 국소화된 스파이크를 탐지합니다. FTDC는 serverStatus를 주기적으로 샘플링하므로 잠재적 공격의 정확한 타이밍을 파악할 수 있습니다.
jq - JSON 프로세서awk (gawk 권장)gzip - 압축 로그 지원용pymongo - FTDC 파일 디코딩용ssh, scp 명령어)# 셸 스크립트 종속성
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Python 종속성 (FTDC 디코딩용)
pip install -r requirements.txt
# 저장소 클론
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# 스크립트 실행 권한 부여
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Python 종속성 설치 (선택 사항, FTDC 지원용)
pip install -r requirements.txt
MongoDB 호스트에서 수동으로 수집한 데이터를 분석합니다.
SSH를 통해 여러 호스트에서 자동으로 데이터를 수집한 후 로컬에서 분석합니다.
MongoDB 호스트에서 데이터를 수집하여 다음 구조로 정리합니다:
./collected-data/
├── logs/ # MongoDB JSON 로그
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # serverStatus().asserts 스냅샷
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # FTDC diagnostic.data 내용
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# 원격 호스트에서 복사
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
MongoDB 호스트에서 다음 명령을 실행합니다(mongosh 접근 필요):
mongosh --quiet --eval 'JSON.stringify({
timestamp: new Date().toISOString(),
hostname: db.hostInfo().system.hostname,
asserts: db.serverStatus().asserts,
uptime: db.serverStatus().uptime
})' > asserts-$(date +%Y%m%d-%H%M%S).json
결과 JSON 파일을 ./collected-data/assert-counts/에 복사합니다.
팁: 기준선을 설정하고 스파이크를 탐지하려면 이 명령을 여러 번(예: 매시간) 실행하십시오.
FTDC 파일은 다음 위치에 있습니다:
<storage.dbPath>/diagnostic.data/ (일반적으로 /var/lib/mongodb/diagnostic.data/)systemLog.path에서 파생됨 (예: /var/log/mongodb/mongos.diagnostic.data/)# FTDC 파일 복사 (sudo가 필요할 수 있음)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# 자동 검색 모드 - 사용 가능한 모든 데이터 분석
./mongobleed-detector.sh --data-dir ./collected-data/
# 사용자 지정 임계값 사용
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # 24시간 조회 기간
-c 50 \ # 더 낮은 연결 임계값
--spike-threshold 50 # 더 낮은 스파이크 임계값
이전 버전과의 호환성을 위해 로그를 직접 분석할 수도 있습니다:
# 기본 경로 스캔
./mongobleed-detector.sh
# 특정 로그 파일 스캔
./mongobleed-detector.sh -p /path/to/logs/*.json
# 포렌식 모드 (여러 호스트 분석)
./mongobleed-detector.sh --forensic-dir /evidence/
여러 호스트에서 자동으로 데이터를 수집하고 분석합니다:
# 호스트 파일 생성
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# 수집 및 분석
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# 특정 SSH 키 사용
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# 병렬 실행
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# FTDC 수집 건너뛰기 (더 빠름)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# 수집만 하고 나중에 분석
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# SSH 옵션 전달 (예: 점프 호스트)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# 권한이 필요한 파일 접근에 sudo 사용 (FTDC 파일은 종종 제한됨)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# 연결 문제 해결을 위한 디버그 모드
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
FTDC 권한 참고:
/var/lib/mongodb/diagnostic.data/의 FTDC 파일은 일반적으로mongodb사용자가 소유하며 일반 사용자가 읽을 수 없습니다. "FTDC 권한 문제" 경고가 표시되면--sudo플래그를 사용하십시오. 이를 위해서는 원격 사용자에게 암호 없는 sudo 액세스(sudoers에 NOPASSWD)가 필요합니다.
| 데이터 유형 | 소스 | 대상 |
|---|---|---|
| 로그 | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| Assert 카운트 | mongosh 명령어 | <output-dir>/<hostname>/assert-counts/ |
| FTDC 파일 | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| 옵션 | 설명 | 기본값 |
|---|---|---|
-d, --data-dir <path> | 수집된 데이터가 있는 디렉터리 (자동 검색 모드) | - |
-p, --path <glob> | 추가 로그 경로/glob (반복 가능) | - |
-t, --time <minutes> | 조회 기간(분) | 4320 (3일) |
-c, --conn-threshold | 연결 수 임계값 | 100 |
-b, --burst-threshold | 분당 버스트율 임계값 | 400 |
-m, --metadata-rate | 메타데이터율 임계값 (0.0-1.0) | 0.10 |
--spike-threshold | Assert 스파이크 임계값 | 100 |
--user-ratio-threshold | 단일 스냅샷 탐지를 위한 사용자/기타 assert 비율 | 250 |
--no-default-paths | 기본 로그 경로 건너뛰기 | false |
--forensic-dir <path> | 하위 디렉터리를 별도 호스트로 분석 | - |
| 옵션 | 설명 | 기본값 |
|---|---|---|
-H, --host <hostname> | 스캔할 원격 호스트 (반복 가능) | - |
-f, --hosts-file <file> | 호스트명이 포함된 파일 (한 줄에 하나) | - |
-u, --user <user> | SSH 사용자 이름 | 현재 사용자 |
-k, --key <file> | SSH 개인 키 파일 | ssh-agent |
-P, --port <port> | SSH 포트 | 22 |
-o, --ssh-options <opt> | 추가 SSH 옵션 (반복 가능) | - |
--sudo | 권한이 필요한 파일 접근(FTDC)에 sudo 사용 | false |
-O, --output-dir <path> | 수집된 데이터를 저장할 디렉터리 | ./collected-data |
--log-path <path> | 수집할 원격 로그 경로 (반복 가능) | 표준 경로 |
--ftdc-path <path> | 원격 FTDC 디렉터리 경로 (반복 가능) | 표준 경로 |
--skip-logs | 로그 수집 건너뛰기 | false |
--skip-asserts | serverStatus().asserts 수집 건너뛰기 | false |
--skip-ftdc | FTDC 파일 수집 건너뛰기 | false |
--collect-only | 데이터만 수집하고 분석 실행 안 함 | false |
-j, --parallel <n> | 병렬 연결 수 | 5 |
--timeout <seconds> | SSH 명령 타임아웃 | 300 |
-d, --debug | 디버그 출력 활성화 (SSH 명령 표시) | false |
-q, --quiet | 진행 메시지 숨기기 | false |