【域渗透】批量 Net User Uname /domain

域内批量执行 net user Uname /domain

0x00使用场景

在渗透测试中,需要查找域内某用户的机器所在,必须得确定目标人物所对应的域用户。
查找域用户对应的 Full Name 信息,从而确认目标任务对应的域用户。

0x01 代码

代码其实很简单,使用 C# 进行编写,可自行编译。

将所有域用户导入user.txt中(每个域用户一行),遍历文件中的用户,然后调用系统cmd命令执行net user Uname /domain,将运行结果进行输出,可根据自己需求进行二次修改(线程、正则、输出保存)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace domain
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Tools By RcoIl \r");
string currentDirectory = Environment.CurrentDirectory;
string text = currentDirectory + "\\user.txt"; // 文件绝对路径
if (!File.Exists(text))
{
Console.WriteLine("File not found " + text);
}
else
{
FileStream stream = new FileStream(text, FileMode.Open, FileAccess.Read); // 打开文本
try
{
StreamReader streamReader = new StreamReader(stream, Encoding.Default); // 实例化
try
{
while (!streamReader.EndOfStream) // 读取文本
{
string text2;
if ((text2 = streamReader.ReadLine()) != null && text2.Length != 0)
{
string id = text2;
Program.Check(id);
}
}
}
finally
{
if (streamReader != null)
{
((IDisposable)streamReader).Dispose();
}
}
}
finally
{
if (stream != null)
{
((IDisposable)stream).Dispose();
}
}
Console.WriteLine("============================================================");
Console.WriteLine("Finish!");
GC.Collect();
}
}

public static void Check(string id)
{
System.Diagnostics.ProcessStartInfo proccessStartInfo = new System.Diagnostics.ProcessStartInfo("net", "user " + id + " /domain");
proccessStartInfo.CreateNoWindow = true;
System.Diagnostics.Process proc = new System.Diagnostics.Process { StartInfo = proccessStartInfo };

proc.StartInfo.RedirectStandardOutput = true; // 由调用程序获取输出信息
proc.StartInfo.UseShellExecute = false; // 是否使用操作系统shell启动
proc.StartInfo.CreateNoWindow = true; // 不显示程序窗口
proc.Start(); // 启动程序

string outlist = proc.StandardOutput.ReadToEnd(); // 获取cmd窗口的输出信息

Regex reg = new Regex(".*ame.*");
MatchCollection result = reg.Matches(outlist);
Console.WriteLine("============================================================");
foreach (Match match in result)
{
Console.WriteLine(match);
}
proc.WaitForExit(); // 等待程序执行完退出进程
proc.Close();
}
}
}

运行效果图:

0x02 改进 (20190418)

由于上面的代码略蠢,所以我决定将它进行改进。

  • 使用 System.DirectoryServices.ActiveDirectory 列举用户;
  • 使用 msvcrt.dll 执行系统命令;

1) powershell 列举用户列表

这份代码在网上已经很成熟了,可自行查阅。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function DomainUserList
{

# 获取当前 Domain 值
$DomainObject =[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName

$UserSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$CurrentDomain)
$DirEntry = New-Object System.DirectoryServices.DirectoryEntry
$UserSearcher.SearchRoot = $DirEntry


$lockoutThreshold = [int]$DirEntry.lockoutThreshold.Value
Write-Host -ForegroundColor "yellow" "[*] 当前域的锁定阈值是 $($lockoutThreshold)."

$minPwdLength = [int]$DirEntry.minPwdLength.Value
Write-Host -ForegroundColor "yellow" "[*] 当前域的最小密码长度是 $($minPwdLength)."

# 删除已禁用的用户列表
if ($RemoveDisabled)
{
# 参考资料:http://jackstromberg.com/2013/01/useraccountcontrol-attributeflag-values/
Write-Host -ForegroundColor "yellow" "[*] 从列表中删除已禁用的用户."
$UserSearcher.filter = "(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=16)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
}
else
{
$UserSearcher.filter = "(&(objectCategory=person)(objectClass=user))"
}

# 在结果中抓取1000次
$UserSearcher.PageSize = 100
$AllUserObjects = $UserSearcher.FindAll()
Write-Host -foregroundcolor "yellow" ("[*] 从当前 AD 域中成功收集了 " + $AllUserObjects.count + " 个用户")
return $AllUserObjects.Properties.samaccountname
}
DomainUserList

将代码转换成C#代码,效果如下

3) 成品

其实还是有点麻瓜。

github: DomainUserList

0x03 总结

在域内使用dsquery查找的信息是有限的,所以需要相应的辅助工具,这个工具存在的意义就是人物与域用户之间的确认。

!坚持技术分享,您的支持将鼓励我继续创作!