【域渗透】获取域内机器共享
字数 986 2025-08-26 22:11:56
域渗透:利用NetShareEnum获取域内机器共享资源
0x00 前言
在域渗透过程中,当遇到瓶颈时,检查域内机器开放的共享资源往往能带来意外收获。本文将详细介绍如何使用NetShareEnum API函数枚举域内共享资源,并进一步利用这些共享进行渗透。
0x01 NetShareEnum函数详解
NetShareEnum函数用于检索服务器上每个共享资源的信息,相比WNetEnumResource函数,它能够枚举隐藏的共享资源。
函数原型
NET_API_STATUS NET_API_FUNCTION NetShareEnum(
LMSTR servername,
DWORD level,
LPSHARE_INFO_* bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
LPDWORD resume_handle
);
参数说明
-
servername:
- 指定要在其上执行该功能的远程服务器的DNS或NetBIOS名称
- 如果为NULL,则使用本地计算机
-
level: 指定数据的信息级别
- 0: 返回共享名称(
SHARE_INFO_0结构) - 1: 返回共享资源的基本信息(
SHARE_INFO_1结构) - 2: 返回更详细的共享信息(
SHARE_INFO_2结构) - 502: 返回扩展共享信息(
SHARE_INFO_502结构) - 503: 返回所有范围的共享(
SHARE_INFO_503结构)
- 0: 返回共享名称(
-
bufptr: 接收数据的缓冲区指针,格式取决于level参数
-
prefmaxlen: 指定返回数据的首选最大长度(字节)
- 使用
MAX_PREFERRED_LENGTH让函数自动分配所需内存
- 使用
-
entriesread: 接收实际枚举的元素数
-
totalentries: 接收可能已经枚举的条目总数
-
resume_handle: 用于继续现有共享搜索的恢复句柄
调用示例
string server = "rcoil.me";
int ret = NetShareEnum(server, 1, ref bufPtr, MAX_PREFERRED_LENGTH,
ref entriesread, ref totalentries, ref resume_handle);
关键实现代码
public static SHARE_INFO_1[] EnumNetShares(string Server)
{
List<SHARE_INFO_1> ShareInfos = new List<SHARE_INFO_1>();
int entriesread = 0;
int totalentries = 0;
int resume_handle = 0;
int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_1));
IntPtr bufPtr = IntPtr.Zero;
StringBuilder server = new StringBuilder(Server);
int ret = NetShareEnum(server, 1, ref bufPtr, MAX_PREFERRED_LENGTH,
ref entriesread, ref totalentries, ref resume_handle);
if (ret == NERR_Success)
{
IntPtr currentPtr = bufPtr;
for (int i = 0; i < entriesread; i++)
{
SHARE_INFO_1 shi1 = (SHARE_INFO_1)Marshal.PtrToStructure(currentPtr, typeof(SHARE_INFO_1));
ShareInfos.Add(shi1);
currentPtr += nStructSize;
}
NetApiBufferFree(bufPtr);
return ShareInfos.ToArray();
}
else
{
ShareInfos.Add(new SHARE_INFO_1("ERROR=" + ret.ToString(), 10, string.Empty));
return ShareInfos.ToArray();
}
}
0x02 共享资源利用
2.1 判断共享可读性
通过尝试访问共享路径来判断当前用户权限是否可读:
string path = String.Format("\\\\{0}\\{1}", computer, share.shi1_netname);
var files = System.IO.Directory.GetFiles(path);
2.2 遍历共享内容
递归遍历可访问共享中的所有文件和目录:
public static void ListFiles(FileSystemInfo info)
{
if (!info.Exists) return;
DirectoryInfo dir = info as DirectoryInfo;
// 不是目录
if (dir == null) return;
try
{
FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
// 是文件
if (file != null)
Console.WriteLine(file.FullName);
// 对于子目录,进行递归调用
else
ListFiles(files[i]);
}
}
catch { }
}
0x03 实际应用场景
- 发现敏感信息:查找共享中的配置文件、密码文件等敏感信息
- 横向移动:通过可写共享部署恶意软件
- 权限提升:利用共享配置不当获取更高权限
- 信息收集:了解网络拓扑和资源分布
0x04 防御建议
- 定期审计域内共享资源
- 限制共享权限,遵循最小权限原则
- 删除不必要的默认共享(如ADMIN\(, C\)等)
- 监控异常共享访问行为
- 对敏感共享启用访问审计
通过以上方法,渗透测试人员可以有效地枚举和利用域内共享资源,为后续渗透测试工作提供更多可能性。