一、了解漏洞
1.redis是什麼?
redis是一個key-value存儲系統,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。
為了保證效率,資料都是緩存在記憶體中。redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。
redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很友善。
Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。存盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。同步對讀取操作的可擴充性和資料備援很有幫助。
2.redis未授權通路是什麼漏洞?
Redis 預設情況下,會綁定在 0.0.0.0:6379,,如果沒有進行采用相關的政策,比如添加防火牆規則避免其他非信任來源 ip 通路等,這樣将會将 Redis 服務暴露到公網上,如果在沒有設定密碼認證(一般為空)的情況下,會導緻任意使用者在可以通路目标伺服器的情況下未授權通路 Redis 以及讀取 Redis 的資料。攻擊者在未授權通路 Redis 的情況下,利用 Redis 自身的提供的config 指令,可以進行寫檔案操作,攻擊者可以成功将自己的ssh公鑰寫入目标伺服器的 /root/.ssh 檔案夾的authotrized_keys 檔案中,進而可以使用對應私鑰直接使用ssh服務登入目标伺服器。
二、分析漏洞原理
1.redis未授權通路漏洞産生的原因是什麼?
(1)預設情況下,redis會綁定在 0.0.0.0:6379,如果沒有進行采用相關的政策,比如添加防火牆規則避免其他非信任來源 ip 通路等,這樣将會将 Redis 服務暴露到公網上,攻擊者可遠端登入redis服務;
(2)如果在沒有設定密碼認證(一般為空)的情況下,會導緻任意使用者在可以通路目标伺服器的情況下,未授權通路 Redis 以及讀取 Redis 的資料。
2.一個系統存在這個漏洞會導緻什麼後果?
(1)攻擊者無需認證通路到内部資料,可能導緻敏感資訊洩露,黑客也可以惡意執行flushall來清空所有資料;
(2)攻擊者可通過EVAL執行lua代碼,或通過資料備份功能往磁盤寫入後門檔案;
(3)最嚴重的情況,如果Redis以root身份運作,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登入受害伺服器。
三、漏洞的重制和利用
(注意!實驗平台我采用的是Fedora26)
1.安裝并配置redis
使用源碼編譯安裝:
(1) 從官網下載下傳源碼的壓縮包:wget http://download.redis.io/releases/redis-3.2.11.tar.gz
(2) 使用tar xzf redis-3.2.11.tar.gz解壓壓縮包,
然後進入解壓後的目錄:cd redis-3.2.11
輸入make并回車;
(3) 進入src目錄,将redis-server和redis-cli拷貝到/usr/bin目錄下(這樣可以在終端直接輸入redis-server或者redis-cli啟動服務,不必每次都要進入安裝目錄):
(4) 進入目錄redis-3.2.11,将redis.conf拷貝到/etc/目錄下,
然後編輯etc中的redis.conf如下所示:
(5)輸入redis-server /etc/redis.conf &啟動redis服務;
2.安裝ssh服務:
fedora安裝有ssh服務但沒有啟動,需使用systemctl start sshd指令啟動ssh服務
3.利用重制:
首先打開兩個虛拟機,網絡都設定為橋接網卡,界面為環回擴充卡,混雜模式為全部允許
然後使用ifconfig指令檢視兩台虛拟機的ip:
發現ip一樣,使用ifconfig 網卡名 ip位址 up指令修改攻擊端(右側虛拟機)ip為192.168.0.147:
虛拟機A為被攻擊端(ip為192.168.0.146),B為攻擊端(ip為192.168.0.147)
在A中開啟redis-server:
在B中生成ssh公鑰和私鑰,這裡密碼設定為空:
進入.ssh目錄,将生成的公鑰儲存到1.txt:
将1.txt寫入redis(使用redis-cli -h ip指令,開始前先ping一下目标主機ip确定能通):
可以ping通,若是ping不通再運作一遍修改ip的指令ifconfig 網卡名 ip位址up
将1.txt寫入redis(redis-cli的路徑為B主機中redis的路徑):
redis-cli指令遠端登入A主機的redis服務,然後擷取redis備份的路徑:
更改redis備份路徑:
設定上傳公鑰的備份檔案名字為authorized_keys:
檢查是否更改成功,沒有問題就儲存然後退出:
開啟主機A和主機B的ssh服務(Fedor預設ssh服務關閉),指令為systemctl start sshd.serveice:
在主機B使用ssh免密登入主機A:
四、使用openvas對該存在漏洞的系統進行掃描
掃描結果發現redis服務空密碼漏洞
這個漏洞可能會造成遠端無密碼登陸
該漏洞使用了編号為1.3.6.1.4.1.25623.1.0.105291的nvt,找到檔案名:
找到該nvt的源碼
原理是獲得redis服務的端口号,直接空密碼連接配接一下,如果能登入redis服務,則說明redis為空密碼,有漏洞。