科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道探测远程Windows主机的NetBIOS信息

探测远程Windows主机的NetBIOS信息

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在我们和远程Windows2000/XP主机建立了空会话之后,我们就有权枚举系统里的各项NetBIOS信息了。当然在某些选项中需要较高的权利,不过我们只执行那些匿名用户可以获得的绝大多数系统信息.

作者:中国IT实验室 2007年8月24日

关键字: 远程探测 传输协议 NetBIOS 空会话

  • 评论
  • 分享微博
  • 分享邮件

  注:

  本文相关程序 T-SMB 可探测远程主机的NetBIOS信息,包括操作系统指纹,共享目录,用户与组,传输列表及其他信息。您可以在中华安全网(SafeChina)下载此软件。  

  下载链接:< [URL=http://www.safechina.net/download/click.php?type=本站原创&id=1040000080]http://www.safechina.net/download/click.php?type=本站原创&id=1040000080[/URL] >   

  大家一提到Windows2000/XP系统的安全性,很快就会想到NULL Session(空会话)。这可以算是微软安置的一个后门,很多简单而容易的攻击都是基于空会话而实现的。在此,我们不讨论如何攻陷一台Windows2000/XP系统,而是要谈谈在建立空会话之后,我们可以得到远程主机的哪些NetBIOS信息。(由于本文是针对Windows2000/XP系统,所以使用了UNICODE编码)。  

  一)NetBIOS信息 

  在我们和远程Windows2000/XP主机建立了空会话之后,我们就有权枚举系统里的各项NetBIOS信息了。当然在某些选项中需要较高的权利,不过我们只执行那些匿名用户可以获得的绝大多数系统信息。  

  时间:探测远程主机的当前日期和时间信息。它会返回一个数据结构,包括年,月,日,星期,时,分,秒等等。不过得到的是GMT标准时间,当然对于我们来说就应该换算为GMT+8:00了。由此可以判断出主机所在的时区信息。  

  操作系统指纹:探测远程主机的操作系统指纹信息。一共有三种级别的探测(100,101,102),我们使用的是101级,它会返回一个数据结构,可以获取远程主机的平台标识,服务器名称,操作系统的主次版本(Windows2000为5.0,WindowsXP为5.1,而最新操作系统Longhorn的版本为6.0),服务器类型(每台主机可能同时包含多种类型信息)和注释。  

  共享列表:探测远程主机的共享列表。我们可以获得一个数据结构指针,枚举远程主机的所有共享信息(隐藏的共享列表在内)。其中包括共享名称,类型与备注。类型可分为:磁盘驱动器,打印队列,通讯设备,进程间通讯与特殊设备。  

  用户列表: 探测远程主机的用户列表,返回一个数据结构指针,枚举所有用户信息。可获取用户名,全名,用户标识符,说明与标识信息。标识信息可以探测用户的访问权限。  

  本地组列表: 探测远程主机的本地组列表信息。枚举所有本地组信息,包含本地组名称和注释信息。  

  组列表: 探测远程主机的组列表信息。枚举所有的组信息,包括组名称,注释,组标识符与属性。在此基础上,我们可以枚举组内的所有用户信息。  

  组用户列表: 探测特定组内的用户信息。我们可以获得组内所有用户的名称。当我门获得了所有的用户列表,下一步就应该很清楚了,那就是挂一个字典进行破解了。  

  传输协议列表: 探测远程主机的传输协议信息,枚举所有的传输列表。可以获得每个传输协议的名称,地址,网络地址和当前与本传输协议连接的用户数目。  

  会话列表: 探测远程主机的当前会话列表。枚举每个会话的相关信息,包括客户端主机的名称,当前用户的名称,活动时间和空闲时间。这可以帮助我们了解远程主机用户的喜好等等。  

  二)主要函数与相关数据结构分析

    1. 建立空会话

    WNetAddConnection2(&nr,username,password,0);

    //nr为NETRESOURCE数据结构的对象;

    //username为建立空会话的用户名,在此将用户名设置为NULL;

    //password为登陆密码,在此将密码设置为NULL;  

    2. 撤消空会话

    WNetCancelConnection2(ipc,0,TRUE);

    //ipc为TCHAR的指针,我们可以这样获得:

    //swprintf(ipc,_T("\\\\%s\\ipc$"),argv[1]),argv[1]为主机名或地址;  

    3. 探测主机时间

    nStatus=NetRemoteTOD(server,(PBYTE*)&pBuf);

    //参数server为主机的名称或地址;

    //pBuf为TIME_OF_DAY_INFO数据结构的指针;

    //nStatus为NET_API_STATUS成员;  

    4. 探测操作系统指纹

    NetServerGetInfo(server,dwLevel,(PBYTE *)&pBuf);

    //dwLevel为等级数,我们选择的是101级;

    //pBuf是SERVER_INFO_101数据结构的指针;  

    5. 探测共享列表

    NetShareEnum(server,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume);

    //dwLevel的等级数为1级;

    //pBuf是SHARE_INFO_1数据结构的指针;

    //MAX_PREFERRED_LENGTH指定返回数据的长度;

    //er指明返回的实际可以枚举的成员数目;

    //tr返回所有的成员数目;

    //resume用于继续进行共享搜索;  

    6. 探测用户列表

    NetQueryDisplayInformation(server,dwLevel,i,100,0xFFFFFFFF,&dwRec,(PVOID *)&pBuf);

    //dwLevel的等级数为1级;

    //i为枚举的索引;

    //dwRec返回获取的信息数目;

    //pBuf为NET_DISPLAY_USER数据结构的指针;  

    7. 探测本地组列表

    NetLocalGroupEnum(server,dwLevel,(PBYTE *)&pBuf,-1,&er,&tr,&resume);

    //dwLevel的等级是1;

    //pBuf返回LOCALGROUP_INFO_1数据结构的指针;  

    8. 探测组列表

    NetQueryDisplayInformation(server,dwLevel,i,100,0xFFFFFFFF,&dwRec,(PVOID*)&pGBuf);

    //dwLevel的等级为3;

    //pGBuf返回NET_DISPLAY_GROUP的数据结构指针;  

    9. 探测组内的用户

    NetGroupGetUsers(server,pGBuffer->grpi3_name,0,(PBYTE *)&pUBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume);

    //pGBuffer->grpi3_name为组的名称;

    //pUBuf返回GROUP_USERS_INFO_0数据结构的指针;  

    10.探测传输协议列表

    NetServerTransportEnum(server,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume);

    //dwLevel的等级为0级;

    //pBuf返回SERVER_TRANSPORT_INFO_0数据结构的指针;  

    11.探测会话列表

    NetSessionEnum(server,pszClient,pszUser,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume);

    //pszClient指定客户的地址;

    //pszUser指定用户名;

    //dwLevel的等级是10级;

    //pBuf返回SESSION_INFO_10数据结构的指针;  

    12.释放内存

     NetApiBufferFree(pBuf);

     //释放由系统分配的内存空间。  

  三) 如何防止NetBIOS信息的泄露

  我们可以安装防火墙来禁止空会话的建立,或者我们可以在网络连接属性里禁用TCP/IP上的NetBIOS,当然也可以在IP安全策略里禁用445/tcp端口来实现。只要空会话不能成功建立,那就很难获得上面提到的各项信息了。  

  四) 源代码

  #define UNICODE

  #define _UNICODE  

  #include

  #include

  #include

  #include

  

  #pragma comment (lib,"mpr")

  #pragma comment (lib,"netapi32")

  

  void start();

  void usage();

  int datetime(PTSTR server);

  int fingerprint(PTSTR server);

  int netbios(PTSTR server);

  int users(PTSTR server);

  int localgroup(PTSTR server);

  int globalgroup(PTSTR server);

  int transport(PTSTR server);

  int session(PTSTR server);

  

  int wmain(int argc,TCHAR *argv[])

  {

    NETRESOURCE nr;

    DWORD    ret;

    TCHAR    username[100]=_T("");

    TCHAR    password[100]=_T("");

    TCHAR    ipc[100]=_T("");

  

    system("cls.exe");

    start();

    if(argc!=2)

    {

      usage();

      return -1;

    }

    swprintf(ipc,_T("\\\\%s\\ipc$"),argv[1]);

    nr.lpLocalName=NULL;

    nr.lpProvider=NULL;

    nr.dwType=RESOURCETYPE_ANY;

    nr.lpRemoteName=ipc;

    ret=WNetAddConnection2(&nr,username,password,0);

    if(ret!=ERROR_SUCCESS)

    {

      _tprintf(_T("\nIPC$ Connect Failed.\n"));

      return -1;

    }

  

      datetime(argv[1]);

       fingerprint(argv[1]);

      netbios(argv[1]);

      users(argv[1]);

      localgroup(argv[1]);

      globalgroup(argv[1]);

      transport(argv[1]);

      session(argv[1]);

  

    ret=WNetCancelConnection2(ipc,0,TRUE);  

    if(ret!=ERROR_SUCCESS)

    {

      _tprintf(_T("IPC$ Disconnect Failed.\n"));

      return -1;

    }

    return 0;

  }

  

  void start()

  {

    _tprintf(_T("=====[ T-SMB Scan, by TOo2y    ]=====\n"));

    _tprintf(_T("=====[ E-mail: TOo2y@safechina.net ]=====\n"));

    _tprintf(_T("=====[ HomePage: www.safechina.net ]=====\n"));

  

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章