QQ登录

只需一步,快速开始

扫一扫,访问微社区

登录 | 注冊 | 找回密码

163 加中网–加拿大曼尼托巴中文门户网站 | 温尼伯华人论坛

 找回密码
 注冊

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 252|回复: 2
打印 上一主题 下一主题

[闲聊] 获取远端Windows 2000服务器系统信息

[复制链接]
跳转到指定楼层
1#
匿名  发表于 2002-11-12 19:14:11 回帖奖励 |倒序浏览 |阅读模式
细细想想,Windows 2000 提供的功能实在是太强大了,这大大方便了Admin们的管理工作,不过利弊向来都是并存的,正是因为Windows 2000 提供的强大功能,让您稍微不留神,系统就被黑客们光顾了,系统信息被暴露,是非常可怕的事情,这意味着黑客已经掌握了你的服务器一半的情况,一旦发现了系统的漏洞,就意味着下一步入侵的开始。举个简单的例子:如果你的服务器无意中开了一个共享文件夹,黑客想办法获取了你的服务器信息,发现这个共享文件夹允许访问,呵呵,很可能,就被他做个Pub什么的用用…… </P><P>说了半天,到底远程能够获取什么样的系统信息呢?很多很多,不完全的说一下比较关键的一些信息吧: </P><P>Server Name:服务器的名字 </P><P>Server Comment::相关的说明信息,很多管理员喜欢在这里写上些敏感信息的:) </P><P>Server Type:服务器类型,通过这个,黑客们可以判断出目标服务器是处于什么环境之下,比如可以判断出:A LAN Manager workstation,A LAN Manager server,Windows NT/Windows 2000 workstation or server,Windows NT/Windows 2000 server that is not a domain controller,Server running a browser service as backup,Server running the master browser service </P><P>Major_version:,inor_version:这两个分别是服务器大版本号和小版本号,黑客通过这个得到了操作系统的版本信息,比如,大版本号为5,小版本号为0,择说明是一台windows 2000的服务器,而下一步就是查找windows 2000的安全漏洞了 </P><P>current date,current time is:服务器的日前和时间,通过这个,可以判断出服务器所在的时区,良好掌握渗透的时间 </P><P>Session:得到当前服务器的会话连接IP地址,这个作用就比较广泛了,可以根据实际情况,灵活的运用 </P><P>Share Enum:这是个很重要的信息,他展示出了服务器上所有的共享文件夹,包括隐含的共享,一旦发现可利用的共享信息,黑客只需简单的在浏览器中输入\\ip\share,就可以访问到目标主机的共享信息,就是这么危险! </P><P>UserEnum:这个东西更可怕了,连服务器的帐号信息都取来了,其中包括用户登陆成功次数,失败次数,帐号使用时间,登陆脚本路径,口令生效时间……这些连系统管理员都看不到哦!此外还有一些信息会被暴露出来,比如:用户名,用户权限,用户说明信息,是否帐号禁用……这很可能造成弱口令的用户名被轻易破解,簇新的系统管理员如果留个user:test,password:123之类的帐号在里面,估计服务器就保不住了。 </P><P>LocalGroupEnum:枚举本地组,呵呵~~ </P><P>此外还有UseEnum,FileEnum,ScheduleJobEnum……实在太多了~ </P><P>下面,来说说最重要的部分——到底这些信息怎么样才能获取呢? </P><P>打开你的winnt/system32这个文件夹,找找看,是不是有一个叫做netapi32.dll的文件?从文件名,我们就可以知道,这是个和网络函数相关的动态连接库,这个就是我们需要找的东西哦!上面取得的信息,其实全部是通过这个DLL文件来实现的。对应于这个DLL文件,Windows 2000提供了一组相关的API函数调用,装上Platform SDK这个开发工具包,然后请打开你的MSDN,输入要查找的关键字“Network Management”,然后选择Network Management Reference->Network Management Functions你会看到一组以Net开头的API函数,正确运用这组函数,就可以获取远端服务器的信息了,函数用法是有点复杂,下面举个简单的例子吧: </P><P>假如存在一台windows 2000的目标主机,其IP地址为:192.168.10.111,我们现在准备获取他的帐号信息,首先我们建立一个IPC$空会话连接: </P><P>建立空会话和断开会话主要用到了两个函数: <BR>DWORD WNetAddConnection2( LPNETRESOURCE lpNetResource, LPCTSTR lpPassword, LPCTSTR lpUsername, DWORD dwFlags); <BR>上面的函数是建立一个会话连接,其中LPCTSTR lpPassword, LPCTSTR lpUsername分别是用户口令和用户名,要想建立空会话,则一定要把这两项置成空。 <BR>DWORD WNetCancelConnection2(LPCTSTR lpName, DWORD dwFlags, BOOL fForce); <BR>WNetCancelConnection2的作用则和WNetAddConnection2是相反的,在获取用户信息后,为了确保安全,黑客会用他迅速的断开与服务器之间的会话。 </P><P>我已经把它写成了一个类,这个是类其中的一部分函数: </P><P>BOOL CAhFunc::CreateLine (char * str){ </P><P>NETRESOURCE netr; </P><P>TCHAR netBuf[MAX_PATH] ={0}; </P><P>memset (&netr, 0, sizeof (NETRESOURCE)); </P><P>//上面的,都是一些初始化的信息 </P><P>wsprintf (netBuf, "\\\\%s\\ipc$", str); </P><P>//前面一行,生成了一行字符串“\\xxx.xxx.xxx.xxx\ipc$” </P><P>netr.dwScope = RESOURCE_GLOBALNET; </P><P>netr.dwType = RESOURCETYPE_ANY; </P><P>netr.lpLocalName = ""; </P><P>netr.lpRemoteName = netBuf; </P><P>netr.lpProvider = NULL; </P><P>if (WNetAddConnection2 (&netr, "", "", NULL) == NO_ERROR) </P><P>//ok!到此为止,简单的用上面一条函数建立了一个IPC$连接,其实他是模拟了windows NT/2000下的这样一条命令:net use \\xxx.xxx.xxx.xxx\ipc$ “” /user: “”,具体的net use用法,大家看看help吧。 </P><P>return TRUE; </P><P>return FALSE; </P><P>} </P><P>下面是断开会话的方法 </P><P>BOOL CAhFunc:estoryLine (LPTSTR str){ </P><P>TCHAR netNB[MAX_PATH] = {0}; </P><P>wsprintf (netNB, "\\\\%s", str); </P><P>if (WNetCancelConnection2 (netNB, CONNECT_UPDATE_PROFILE, TRUE) == NO_ERROR) </P><P>return TRUE; </P><P>return FALSE; </P><P>} </P><P>同样的,也是模拟了这条命令net use \\xxx.xxx.xxx.xxx /DEL </P><P>刚刚说了,我们要取的是远端服务器上的帐号信息,打开MSDN,输入关键字:NetUserEnum,看到了吧?你可以找到这条函数NET_API_STATUS NetUserEnum( LPCWSTR servername, DWORD level, DWORD filter, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle ); <BR>一大串参数,看起来挺可怕的是吧?:)不要紧,我们一个一个来过: <BR>LPCWSTR servername:注意这个啊,它可是要求LPCWSTR类型的数据,也就是说,要求用Unicode字符了,如果你直接为它赋值,是肯定不行的,要绕点弯了,有这样一个函数MultiByteToWideChar (UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar); <BR>这个函数的作用就是用来把单字节转换为双字节 <BR>DWORD level:用来指定操作级别,不同的用户访问权限,这个级别是不同的。根据不同的级别,可以获取不同等级的系统信息,根据MSDN上的描述,有以下的级别可供选择: </P><P>0 <BR>在这个级别里,可以获取用户帐号名,它使用USER_INFO_0 这个结构存储,在ipc空连接的时候是可用的 </P><P>1 <BR>Return detailed information about user accounts. The bufptr parameter points to an array of USER_INFO_1 structures. </P><P>2 <BR>Return level one information and additional attributes about user accounts. The bufptr parameter points to an array of USER_INFO_2 structures. </P><P>3 <BR>Return level two information and additional attributes about user accounts. This level is valid only on Windows NT/Windows 2000 servers. The bufptr parameter points to an array of USER_INFO_3 structures. Note that on Whistler and later, it is recommended that you use USER_INFO_4 instead. </P><P>4 <BR>Whistler: Return level two information and additional attributes about user accounts. This level is valid only on Windows NT/Windows 2000 servers. The bufptr parameter points to an array of USER_INFO_4 structures. </P><P>10 <BR>Return user and account names and comments. The bufptr parameter points to an array of USER_INFO_10 structures. </P><P>11 <BR>Return detailed information about user accounts. The bufptr parameter points to an array of USER_INFO_11 structures. </P><P>20 <BR>Return the user's name and identifier and various account attributes. The bufptr parameter points to an array of USER_INFO_20 structures. Note that on Whistler and later, it is recommended that you use USER_INFO_23 instead. </P><P>23 <BR>Whistler: Return the user's name and identifier and various account attributes. The bufptr parameter points to an array of USER_INFO_23 structures. </P><P><BR>与主机建立空会话,已经可以使用除了4和23以外的所有级别了,4和23被保留了,目前在windows 2000下还不支持这两个级别,他是为了后面的Windows XP版本留的。好了,我们有了上面的信息,就开始写程序了: </P><P>为了免去诈骗稿费之嫌,我们就举例最简单的level 0 级别操作,在这个级别,你只能取到系统的帐号名,不过这个对于黑客来说,已经足够了J! </P><P>char netNB[MAX_PATH] = {0}; </P><P>sprintf (netNB, "\\\\%s", str); </P><P>char lpwStr[MAX_PATH] = {0}; </P><P>MultiByteToWideChar (CP_ACP, 0, netNB, -1, (unsigned short *)lpwStr, MAX_PATH); </P><P>//呵呵,看上面一行,转换了单字节到双字节 </P><P>LPUSER_INFO_0 pBuf_0 = NULL; </P><P>LPUSER_INFO_0 pTmpBuf_0; </P><P>DWORD dwPrefMaxLen = -1; </P><P>DWORD dwEntriesRead = 0; </P><P>DWORD dwTotalEntries = 0; </P><P>DWORD dwResumeHandle = 0; </P><P>DWORD i; </P><P>DWORD dwTotalCount = 0; </P><P>NET_API_STATUS nStatus; </P><P>LPTSTR pszServerName = NULL; </P><P>nStatus = NetUserEnum((unsigned short *)lpwStr, </P><P>dwLevel, </P><P>FILTER_NORMAL_ACCOUNT, // global users </P><P>(LPBYTE*)&pBuf_0, </P><P>dwPrefMaxLen, </P><P>&dwEntriesRead, </P><P>&dwTotalEntries, </P><P>&dwResumeHandle); </P><P>// If the call succeeds, </P><P>if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) </P><P>{ </P><P>if ((pTmpBuf_0 = pBuf_0) != NULL) </P><P>{ </P><P>// Loop through the entries. </P><P>for (i = 0; (i < dwEntriesRead); i++) </P><P>{ </P><P>if (pTmpBuf_0 == NULL) </P><P>{ </P><P>fprintf(stderr, "An access violation has occurred\n"); </P><P>break; </P><P>} </P><P>// Print the name of the user account. </P><P>wprintf(L"username:%s\n", pTmpBuf_0->usri0_name); </P><P>//注意看看这里,是宽字节输出,当然你也可以用printf("username:%S\n", pTmpBuf_0->usri0_name);的方法输出,%S表示宽字节,%s是单字节的,输出的信息,是远程主机上的用户帐号 </P><P><BR>pTmpBuf_0++; </P><P>dwTotalCount++; </P><P>} </P><P>} </P><P>} </P><P>else </P><P>printf("A system error has occurred\n"); </P><P>}while (nStatus == ERROR_MORE_DATA); // end do </P><P>如果你愿意,还可以设计一下弱口令的探测规则,比如如果存在用户名为test,则可以尝试口令为“”,“test”,“test123”,“t”,“123”……这个规则越复杂成功率越高哦!大家熟悉的X-Scan 就是用这种方法获取远程主机信息的,口令探测也是这种方法实现的。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享
回复

使用道具

该用户从未签到

2#
发表于 2024-6-28 21:24:48 | 只看该作者
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2024-6-28 21:25:58 | 只看该作者
回复 支持 反对

使用道具 举报

发表回复
您需要登录后才可以回帖 登录 | 注冊

本版积分规则

    联系我们
  • 咨询电话:1.204.294.8528
  • 邮箱:163adv@gmail.com
  • QQ:179091654
    移动客户端:即将开放
    关注我们:
  • 扫描二维码加关注

快速回复 返回顶部 返回列表