
MongoBleed शोषण के लिए डिटेक्शन स्क्रिप्ट
CVE-2025-14847 (MongoBleed) के लिए ऑफ़लाइन MongoDB विश्लेषण उपकरण
एक स्टैंडअलोन Linux कमांड-लाइन उपकरण जो कई डिटेक्शन मॉड्यूल का उपयोग करके CVE-2025-14847 के संभावित शोषण की पहचान करने के लिए MongoDB डेटा का विश्लेषण करता है।
MongoBleed (CVE-2025-14847) MongoDB के zlib डीकंप्रेसन में एक मेमोरी डिस्क्लोज़र भेद्यता है, जो हमलावरों को बिना प्रमाणीकरण के सर्वर मेमोरी से सीधे संवेदनशील डेटा—क्रेडेंशियल, सत्र टोकन, PII—निकालने की अनुमति देती है।
यह उपकरण घटना प्रतिक्रिया टीमों को कई साक्ष्य स्रोतों का उपयोग करके शोषण प्रयासों का पता लगाने में मदद करता है:
शोषण पैटर्न का पता लगाने के लिए MongoDB JSON लॉग का विश्लेषण करता है:
| इवेंट ID | प्रकार | विवरण |
|---|---|---|
| 22943 | कनेक्शन स्वीकृत | क्लाइंट के कनेक्ट होने पर लॉग किया जाता है |
| 51800 | क्लाइंट मेटाडेटा | जब क्लाइंट ड्राइवर/एप्लिकेशन जानकारी भेजता है तब लॉग किया जाता है |
| 22944 |
मुख्य अंतर्दृष्टि: वैध MongoDB ड्राइवर हमेशा क्लाइंट मेटाडेटा भेजते हैं। MongoBleed शोषण कनेक्ट करता है, मेमोरी निकालता है और डिस्कनेक्ट करता है—लेकिन मेटाडेटा कभी नहीं भेजता।
db.serverStatus().asserts के स्नैपशॉट का विश्लेषण करके asserts.user काउंटरों में असामान्य पैटर्न का पता लगाता है:
asserts.user की अन्य असर्ट प्रकारों से तुलना करके संदिग्ध पैटर्न का पता लगाता है। यदि यूज़र असर्ट असमान रूप से अधिक हों (अनुपात ≥250x) या अन्य सभी प्रकार शून्य हों, तो संदिग्ध के रूप में चिह्नित करता है (MEDIUM विश्वास)नोट: संचयी काउंटर गलत-सकारात्मक परिणाम उत्पन्न कर सकते हैं। सर्वोत्तम परिणामों के लिए FTDC (मॉड्यूल B2) के साथ संयोजन में उपयोग करें।
असर्ट काउंटरों में समय-स्थानीयकृत स्पाइक का पता लगाने के लिए MongoDB की Full-Time Diagnostic Data Capture (FTDC) फ़ाइलों का विश्लेषण करता है। FTDC समय-समय पर serverStatus का नमूना लेता है, जिससे संभावित हमलों का सटीक समय निर्धारण संभव होता है।
jq - JSON प्रोसेसरawk (gawk अनुशंसित)gzip - संपीड़ित लॉग समर्थन के लिएpymongo - FTDC फ़ाइल डिकोडिंग के लिएssh, scp कमांड)# Shell script dependencies
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Python dependencies (for FTDC decoding)
pip install -r requirements.txt
# Clone the repository
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# Make scripts executable
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Install Python dependencies (optional, for FTDC support)
pip install -r requirements.txt
MongoDB होस्ट से मैन्युअल रूप से एकत्र किए गए डेटा का विश्लेषण करें।
SSH के माध्यम से स्वचालित रूप से कई होस्ट से डेटा एकत्र करें, फिर स्थानीय रूप से विश्लेषण करें।
अपने MongoDB होस्ट से डेटा एकत्र करें और इसे इस संरचना में व्यवस्थित करें:
./collected-data/
├── logs/ # MongoDB JSON logs
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # serverStatus().asserts snapshots
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # FTDC diagnostic.data contents
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# Copy from remote host
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/)# Copy FTDC files (may require sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# Auto-discovery mode - analyzes all available data
./mongobleed-detector.sh --data-dir ./collected-data/
# With custom thresholds
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # 24-hour lookback
-c 50 \ # Lower connection threshold
--spike-threshold 50 # Lower spike threshold
पिछड़ी संगतता के लिए, आप अभी भी लॉग का सीधे विश्लेषण कर सकते हैं:
# Scan default paths
./mongobleed-detector.sh
# Scan specific log files
./mongobleed-detector.sh -p /path/to/logs/*.json
# Forensic mode (analyze multiple hosts)
./mongobleed-detector.sh --forensic-dir /evidence/
कई होस्ट से स्वचालित रूप से डेटा एकत्र करें और विश्लेषण करें:
# Create hosts file
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# Collect and analyze
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# Use specific SSH key
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# Parallel execution
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# Skip FTDC collection (faster)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# Collect only, analyze later
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# Pass SSH options (e.g., jump host)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# Use sudo for privileged file access (FTDC files are often restricted)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# Debug mode to troubleshoot connection issues
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
FTDC अनुमतियों पर नोट:
/var/lib/mongodb/diagnostic.data/में FTDC फ़ाइलें आमतौर परmongodbउपयोगकर्ता के स्वामित्व में होती हैं और सामान्य उपयोगकर्ताओं द्वारा पठनीय नहीं होती हैं। यदि आप "FTDC Permission Issues" चेतावनियां देखते हैं, तो--sudoफ्लैग का उपयोग करें। इसके लिए रिमोट उपयोगकर्ता के पास पासवर्ड-रहित sudo एक्सेस (sudoers में NOPASSWD) होना आवश्यक है।
| कोड | अर्थ |
|---|---|
| 0 | कोई HIGH या MEDIUM निष्कर्ष नहीं |
| 1 | HIGH या MEDIUM निष्कर्ष पाए गए |
| 2 | त्रुटि (लापता निर्भरताएं, कोई डेटा नहीं, आदि) |
यह उपकरण सभी उपलब्ध साक्ष्यों के आधार पर एक संयुक्त विश्वास निर्णय प्रदान करता है:
लॉग सहसंबंध (मॉड्यूल A) के लिए, व्यक्तिगत आईपी को वर्गीकृत किया जाता है:
| जोखिम | मानदंड |
|---|---|
| HIGH | कनेक्शन ≥ सीमा, मेटाडेटा दर < 10%, बर्स्ट दर ≥ 400/मिनट |
| MEDIUM | कनेक्शन ≥ सीमा, मेटाडेटा दर < 10%, बर्स्ट दर < 400/मिनट |
INFO: Auto-discovery mode: analyzing ./collected-data/
INFO: Module A: Analyzing 3 log file(s)...
INFO: Module B1: Analyzing assert-counts...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ MongoBleed (CVE-2025-14847) Detection Results ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Module Status:
[✓] Module A (Log Correlation): 3 log file(s) found
[✓] Module B1 (Assert Counts): 4 snapshot(s) found
[−] Module B2 (FTDC Spikes): No FTDC files or decoder unavailable
Analysis Parameters:
Time Window: 4320 minutes
Connection Thresh: 100
Burst Rate Thresh: 400/min
Metadata Rate: 0.10
Spike Threshold: 100
User Ratio Thresh: 250x
Module A - Log Correlation Findings:
Risk SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
HIGH 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
Module B1 - Assert Counts Analysis:
Analyzed 4 snapshots from 2025-01-01T10:00:00Z to 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (delta: 760)
SPIKE DETECTED: 2025-01-01T10:30:00Z to 2025-01-01T11:00:00Z
Delta: +740 user asserts (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Combined Verdict:
MEDIUM CONFIDENCE - Investigation recommended
- Suspicious connection patterns but FTDC data unavailable for correlation
⚠ IMPORTANT: If exploitation is confirmed, patching alone is insufficient.
- Rotate all credentials that may have been exposed
- Review accessed data for sensitive information disclosure
- Check for lateral movement from affected systems
- Preserve logs for forensic analysis
Caveats:
- Connection metadata absence is PoC-specific and can be evaded
- Assertion counters are cumulative - false positives possible without baseline
- FTDC provides timing but not perfect attribution
- Patch + rotate secrets remains mandatory regardless of detection results
रिपॉजिटरी में डिटेक्टर को मान्य करने के लिए एक परीक्षण सूट शामिल है।
example-data/ निर्देशिका में MongoDB 8.0.16 इंस्टेंस का वास्तविक डेटा शामिल है, जिस पर MongoBleed PoC का उपयोग करके हमला किया गया था:
example-data/
├── logs/ # Real MongoDB logs with attack patterns
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # Post-attack serverStatus().asserts snapshot
│ └── asserts-post-attack.json
└── ftdc-files/ # Real FTDC diagnostic data files
└── metrics.*
यह डेटा दिखाता है:
./test/generate-test-logs.sh
यह विभिन्न पैटर्न के साथ अतिरिक्त सिंथेटिक परीक्षण डेटा बनाता है:
./test/test-detector.sh
अपेक्षित आउटपुट:
╔════════════════════════════════════════════════════════╗
║ MongoBleed Detector Test Suite ║
╚════════════════════════════════════════════════════════╝
Module A Tests (Log Correlation):
✓ PASS: Exit code is 1 (findings detected)
✓ PASS: Detected source IP 137.137.137.137
...
Module B1 Tests (Assert Counts):
✓ PASS: Shows Module B1 status
✓ PASS: Detected assert spike
...
Auto-Discovery Mode Tests:
✓ PASS: Shows Module A status
✓ PASS: Shows combined verdict
...
Results:
Passed: 24
Failed: 0
All tests passed!
⚠️ महत्वपूर्ण सीमाएं
PoC-विशिष्ट डिटेक्शन: मेटाडेटा अनुपस्थिति का पता लगाना ज्ञात MongoBleed PoC व्यवहार पर आधारित है। एक परिष्कृत हमलावर शोषण को संशोधित करके नकली मेटाडेटा भेज सकता है, हालांकि इससे शोषण की गति कम हो जाएगी।
संचयी काउंटर: asserts.user mongod पुनरारंभ के बाद से संचयी है। बेसलाइन स्नैपशॉट के बिना, लंबे समय तक चलने वाले इंस्टेंस के लिए उच्च मान सामान्य हो सकते हैं। समय के साथ एकाधिक स्नैपशॉट सटीकता में काफी सुधार करते हैं।
FTDC समय: FTDC समय की जानकारी प्रदान करता है लेकिन पूर्ण आरोपण नहीं। सर्वोत्तम परिणामों के लिए लॉग सहसंबंध के साथ संयोजन में उपयोग करें।
लॉग प्रतिधारण: केवल मौजूदा लॉग का विश्लेषण किया जा सकता है। आक्रामक रोटेशन या हमलावर द्वारा लॉग साफ़ करने से साक्ष्य नष्ट हो जाएंगे।
JSON लॉगिंग आवश्यक: MongoDB 4.4+ डिफ़ॉल्ट रूप से JSON लॉग का उपयोग करता है। लीगेसी टेक्स्ट लॉग समर्थित नहीं हैं।
FTDC डिकोडर: FTDC डिकोडिंग के लिए pymongo के साथ Python 3 आवश्यक है। इसके बिना, मॉड्यूल B2 उपलब्ध नहीं है।
mongosh एक्सेस: असर्ट काउंट एकत्र करने के लिए उपयुक्त अनुमतियों के साथ mongosh आवश्यक है।
यदि HIGH या MEDIUM निष्कर्षों की पुष्टि हो जाए:
इस उपकरण की डिटेक्शन तर्क Eric Capuano और Tamir Zimerman के शोध पर आधारित है:
LICENSE फ़ाइल देखें।
योगदान स्वागत योग्य है! कृपया issues और pull requests सबमिट करें।
यदि आप इस उपकरण का परीक्षण प्रोडक्शन डेटा पर करते हैं, तो हम विशेष रूप से निम्न पर आपकी प्रतिक्रिया की सराहना करेंगे:
| कनेक्शन बंद |
| क्लाइंट के डिस्कनेक्ट होने पर लॉग किया जाता है |
| डेटा प्रकार | स्रोत | गंतव्य |
|---|
| लॉग | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| असर्ट काउंट | 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> | अतिरिक्त लॉग पथ/ग्लॉब (दोहराने योग्य) | - |
-t, --time <minutes> | मिनटों में लुकबैक विंडो | 4320 (3 दिन) |
-c, --conn-threshold | कनेक्शन गणना सीमा | 100 |
-b, --burst-threshold | प्रति मिनट बर्स्ट दर सीमा | 400 |
-m, --metadata-rate | मेटाडेटा दर सीमा (0.0-1.0) | 0.10 |
--spike-threshold | असर्ट स्पाइक सीमा | 100 |
--user-ratio-threshold | एकल स्नैपशॉट डिटेक्शन के लिए यूज़र/अन्य असर्ट अनुपात | 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 |
| विश्वास | मानदंड | व्याख्या |
|---|
| HIGH | समान समय विंडो में FTDC शिखर पाए गए तथा संदिग्ध लॉग | शोषण का मजबूत संकेतक |
| MEDIUM | FTDC शिखर या संदिग्ध लॉग (सहसंबद्ध नहीं) | जांच अनुशंसित |
| LOW | केवल स्पाइक-रहित संचयी असर्ट काउंट | विसंगति पाई गई, कमजोर साक्ष्य |
| INFO | कोई महत्वपूर्ण निष्कर्ष नहीं | सामान्य गतिविधि |
| LOW | कनेक्शन ≥ सीमा, मेटाडेटा दर ≥ 10% |
| INFO | कनेक्शन < सीमा |
| संस्करण | असुरक्षित | फिक्स संस्करण |
|---|
| 8.2.x | 8.2.0 - 8.2.2 | 8.2.3 |
| 8.0.x | 8.0.0 - 8.0.16 | 8.0.17 |
| 7.0.x | 7.0.0 - 7.0.27 | 7.0.28 |
| 6.0.x | 6.0.0 - 6.0.26 | 6.0.27 |
| 5.0.x | 5.0.0 - 5.0.31 | 5.0.32 |
| 4.4.x | 4.4.0 - 4.4.29 | 4.4.30 |
| 4.2.x | 4.2.0+ | कोई फिक्स नहीं |
| 4.0.x | 4.0.0+ | कोई फिक्स नहीं |
| 3.6.x | 3.6.0+ | कोई फिक्स नहीं |