【域渗透】获取域内机器共享
字数 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
);

参数说明

  1. servername:

    • 指定要在其上执行该功能的远程服务器的DNS或NetBIOS名称
    • 如果为NULL,则使用本地计算机
  2. level: 指定数据的信息级别

    • 0: 返回共享名称(SHARE_INFO_0结构)
    • 1: 返回共享资源的基本信息(SHARE_INFO_1结构)
    • 2: 返回更详细的共享信息(SHARE_INFO_2结构)
    • 502: 返回扩展共享信息(SHARE_INFO_502结构)
    • 503: 返回所有范围的共享(SHARE_INFO_503结构)
  3. bufptr: 接收数据的缓冲区指针,格式取决于level参数

  4. prefmaxlen: 指定返回数据的首选最大长度(字节)

    • 使用MAX_PREFERRED_LENGTH让函数自动分配所需内存
  5. entriesread: 接收实际枚举的元素数

  6. totalentries: 接收可能已经枚举的条目总数

  7. 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 实际应用场景

  1. 发现敏感信息:查找共享中的配置文件、密码文件等敏感信息
  2. 横向移动:通过可写共享部署恶意软件
  3. 权限提升:利用共享配置不当获取更高权限
  4. 信息收集:了解网络拓扑和资源分布

0x04 防御建议

  1. 定期审计域内共享资源
  2. 限制共享权限,遵循最小权限原则
  3. 删除不必要的默认共享(如ADMIN\(, C\)等)
  4. 监控异常共享访问行为
  5. 对敏感共享启用访问审计

通过以上方法,渗透测试人员可以有效地枚举和利用域内共享资源,为后续渗透测试工作提供更多可能性。

域渗透:利用NetShareEnum获取域内机器共享资源 0x00 前言 在域渗透过程中,当遇到瓶颈时,检查域内机器开放的共享资源往往能带来意外收获。本文将详细介绍如何使用 NetShareEnum API函数枚举域内共享资源,并进一步利用这些共享进行渗透。 0x01 NetShareEnum函数详解 NetShareEnum 函数用于检索服务器上每个共享资源的信息,相比 WNetEnumResource 函数,它能够枚举隐藏的共享资源。 函数原型 参数说明 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 结构) bufptr : 接收数据的缓冲区指针,格式取决于level参数 prefmaxlen : 指定返回数据的首选最大长度(字节) 使用 MAX_PREFERRED_LENGTH 让函数自动分配所需内存 entriesread : 接收实际枚举的元素数 totalentries : 接收可能已经枚举的条目总数 resume_ handle : 用于继续现有共享搜索的恢复句柄 调用示例 关键实现代码 0x02 共享资源利用 2.1 判断共享可读性 通过尝试访问共享路径来判断当前用户权限是否可读: 2.2 遍历共享内容 递归遍历可访问共享中的所有文件和目录: 0x03 实际应用场景 发现敏感信息 :查找共享中的配置文件、密码文件等敏感信息 横向移动 :通过可写共享部署恶意软件 权限提升 :利用共享配置不当获取更高权限 信息收集 :了解网络拓扑和资源分布 0x04 防御建议 定期审计域内共享资源 限制共享权限,遵循最小权限原则 删除不必要的默认共享(如ADMIN$, C$等) 监控异常共享访问行为 对敏感共享启用访问审计 通过以上方法,渗透测试人员可以有效地枚举和利用域内共享资源,为后续渗透测试工作提供更多可能性。