怎样通过netbios获得远程主机机器名和以及工作组名称,以及操作系统等情况!(200分)

  • 主题发起人 主题发起人 duducat
  • 开始时间 开始时间
http://www.songshan.com.cn/xuetang/computer/net/new_page_4.htm
 
to zw84611
上不去!5555555555555555555
 
这个问题我自己解决一半啦!可以通过netbios获得工作组和计算机名称
可是怎么获得对方的操作系统类型啦!!!!????????
还可以啊
 
http://211.101.4.25/delphibbs/dispq.asp?lid=596039
里有源码,不知是否正确,我没试
 
to svw0506
哪个由Netbios获得计算机组和方法我已经解决了,
我现在是需要由IP获得对方操作系统的名称!!!:)
哎,都大半年了,高手都不肯赐教呀,我好可怜!!
只好自己动手了!!!!!!!!!
 
目标主机操作系统识别技术

作者: Refdom,
EmaiL: Refdom@263.net
Home Page: www.opengram.com
2002/1/27

普遍的入侵行为需要进行端口扫描,这是多数“黑客”的熟练技巧。大多数的端口扫描就是让我们能够达到
这样的目的:
1、让我们能够大致判断目标是什么操作系统
2、目标到底在运行些什么服务
当然,要扫描得到这些东西还是最后为了让我们能够知道哪些可能拿来利用,可能存在的漏洞,对目标主机的操作
系统类型识别,更能够方便地让我们去利用操作系统对应的漏洞实施攻击。很多工具提供的扫描也可能就直接得到什么
操作系统了,或者相对应的端口使用的是什么程序,程序是什么版本的等等。不过,这些都是由那些工具自己做了,
不讨论这个,我们应该去想想这些工具到底是怎么去实现的。

对目标主机操作系统识别的目的,正如Fyodor(nmap的作者)在他的
《Remote OS detection via TCP/IP Stack FingerPrinting》中讲解那样,进行主机识别有两个主要作用,第一,很
多系统漏洞是同OS密切相关的,还有就是社会学(social engineering)问题,你能够在非常了解对方的系统之后,冒
充软件提供商给目标发送“补丁”。

按照我们上面提到的高级扫描方式,直接进行的端口扫描,能够赋予我们绕过防火墙的能力,而且可以尽可能地隐藏
自己等等,但是,我们能够得到的信息也是有限的,也许对是否开放一个端口并不是那么直接地感兴趣,比如一个21
端口,我们真正感兴趣的是这个端口被用来作什么了,运行地什么版本的程序,而不是仅仅打开一个21端口就满意了。
也就是说,我们对下面得到地这个东西更感兴趣(关系到IP的地方,我都用X代替了):

C:/>ftp XXX.XXX.XXX.XXX
Connected to XXX.XXX.XXX.XXX.
220 XXXXX X2 WS_FTP Server 1.0.5 (1327846197)
User (XXX.XXX.XXX.XXX:(none)):

其实,这就是一种最简单和最直接的判别方式,获得程序版本变相地也让我们能够估计到目标的操作系统类
别。我们可以对每个打开的端口进行相应的连接,通常这些服务程序就会非常高兴地显示自己的“banner”,也就让
我们能够直接得到他是什么版本了。甚至,我们能够得到更好的东西:

C:/>telnet XXX.XXX.XXX.XXX
Red Hat Linux release 7.1 (Seawolf)
Kernel 2.4.2-2 on an i686
login:

这让我们对操作系统版本一览无余了。正象这些只对80端口感兴趣的“黑客”一样,通过对80端口的连接,
我们也能得到足够多的信息。

C:/>telnet XXX.XXX.XXX.XXX 80
HEAD / HTTP/1.1

HTTP/1.1 200 OK
Via: 1.1 ADSL2000
Content-Length: 97
Date: Thu, 24 Jan 2002 13:46:56 GMT
Content-Type: text/html
Server: Apache/1.3.20 (Unix) PHP/4.0.6
Last-Modified: Wed, 26 Dec 2001 09:22:54 GMT
ETag: "8715f-61-3c2996ee"
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100

可以注意到:Server: Apache/1.3.20 (Unix) PHP/4.0.6,这里很明白地“贡献”出WEB服务器的软件版本。

这样直接的连接探测方式,对于这些banner开放的,简直是太容易了,当然,负责的管理员也会屏蔽或者修
改掉这些BANNER。

还有一种粗劣而且简单的判别主机操作系统类型的办法就是通过Ping,然后分析得到的TTL值,当然,稍微准
确点可以同时在配合Tracert来确定主机原始的TTL值,不过,这种办法很容易被欺骗,比如,在WINDOWS系统中,对注
册表的修改:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
Key: DefaultTTL
通过对DefaultTTL的修改,比如:修改成为255,伪装成为一台UNIX主机,就能够造成探测者的错误判断。

对主机使用端口的分析,同样也能够进行操作系统识别,一些操作系统使用特殊的端口,比如:WINDOWS的
137、139,WIN2K的445,而且一些网络设备比如入侵检测系统、防火墙等等也都有厂商自己的端口开放。

上面的这些识别方式也是那些负责管理员能够简单应付的方式,这里,我们可以看看高级的主机识别技术,
这些技术主要分为两类:主动协议识别和被动协议识别,都是利用各种操作系统在网络协议通讯中使用不同的协议内
容(各个厂商有自己的规定),然后对这些不同之处进行分析进行的识别。

Nmap这个强大的扫描工具在远程主机判断上也使用了很多技术,来实现更高级的主机系统检测。这主要是通过主动的
TCP/IP协议辨识来实现的,每种操作系统在TCP交流中总是使用一些具有特性的标志,这些标志在TCP IP数据包的头中
表现出来。比如window、ACK序号、TTL等等的不同反应,通过大量的数据分析,然后精确地判断主机系统。这些系统
的协议特性包括(这只是一小部分):
FIN识别:发送一个只有FIN标志位的TCP数据包给一个打开的端口并等待回应。正确的RFC793行为是不响应,但有些系
统,例如 MS Windows, BSDI, CISCO, HP/UX,MVS,和IRIX 发回一个RESET。

DF位识别:许多操作系统在送出的一些包中设置IP的DF(不分片)位。

WINDOW大小:检查返回包的窗口大小。特定操作系统反应的窗口大小基本是常数,例如,AIX 是唯一用0x3F25的),
Microsoft 以及OpenBSD 与FreeBSD用的是0x402E。

ACK 序号识别:不同实现中ACK的值是不同的。例如,如果你送了一个FIN|PSH|URG 到一个关闭的TCP 端口。大多数实
现会设置ACK 为你的初始序列数,而Windows 和一些傻打印机会送给你序列数加1。

在之后,Fyodor 和Ofir又分析和收集利用ICMP协议的操作系统特性来进行的主机系统判别,这种主动的识别方式都经
过了大量的分析,原理和上面的TCP/IP协议识别相同,比如:用ICMP的地址掩码请求来探测SUN操作系统,对于ICMP地
址掩码请求,只有少数操作系统会产生相应的应答,这些系统包括ULTRIX OpenVMS, Windows 95/98/98 SE/ME,
NT below SP 4, 和 SUN Solaris机器。但SUN对分片ICMP地址掩码请求的应答同其他操作系统不相同,这样就可以来
识别SUN主机操作系统。

和主动的协议识别原理相同,Lance Spitzner在《Passive Fingerprinting》中提出了被动的协议识别,同样用来判
别主机系统。这种办法主要集中考虑:
1、TTL的设置
2、WINDOW SIZE:操作系统设置的窗口大小
3、DF:操作系统是否设置分片位
4、TOS:操作系统设置的服务类型

对于TTL,对于一个操作系统来说一般是固定的,比如LINUX Kernel 2.2.x & 2.4.x的 TTL 字段值为 64,
FreeBSD 4.1, 4.0, 3.4; Sun Solaris 2.5.1, 2.6, 2.7, 2.8;的 TTL为 255 Windows NT,Windows 2000 的为 128
等,同时将配合其他需验证的内容,比如:LINUX的窗口值是0x7D78,Solaris2.6-2.7的窗口值有几种0x2328,0x2238等
等。我们以WIN2000为例,它的TTL为“128”,窗口大小在“17000-18000”这个范围内,并且设置分片位,即DF为1,
而操作系统设置的服务类型TOS为“0”,如果我们对接收的原始数据分析得到这样的结果,那么我们可以判断这是一个
WIN2000的操作系统。

当然被动协议识别操作系统也需要分析各个操作系统的不同反馈属性,然后根据得到的信息同收集的属性相比较。
比如多数系统使用DF位设置,但是有些系统如SCO和OPENBSD不使用这个DF标志,这样就可以用来识别一些没有设置DF位
的操作系统。被动协议识别也可以用来判断远程代理防火墙,因为代理防火墙重建对客户的连接,它有它自身的特征代
码,也可以用这样的办法来分析。

主动协议识别和被动协议识别需要进行大量的统计分析,虽然比最开始介绍的那些简单识别方法准确些,但是也并不能
保证一定能够识别得到准确的操作系统类型。同时这两种方法主要区别就在于一个是主动,而一个是被动的,主动识别
方式需要主动发送数据包,因此相对于那些安全设备来说,也比较容易识别这些数据包,同被动识别比较起来,隐蔽性
稍微差些。

Reference:
1、《X - Remote ICMP Based OS Fingerprinting Techniques》
2、Phrack #57《ICMP based remote OS TCP/IP stack fingerprinting techniques》
3、Fyodor《Remote OS detection via TCP/IP Stack FingerPrinting》
4、Lance Spitzner《Passive Fingerprinting》

 
to 房客
好的,谢谢!
不过要有具体编程资料就好了!!:)自己动手,丰衣足食?:)
 
自己动手,丰衣足食!!!!
 
参考一下这个:是nowcan的作品:

#include <windows.h>
#include <stdio.h>
#include <lm.h>


void ShowError(DWORD Code)
{
printf("/nError: %ld----",Code);
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
Code,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
//MessageBox( NULL, (LPCTSTR)lpMsgBuf, L"Error", MB_OK | MB_ICONINFORMATION );
printf("%S/n",(LPCTSTR)lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
}

void EnumGroup(TCHAR *pszServerName)
{
NET_API_STATUS nStatus,mRet;
DWORD dwLevel = 1;
PLOCALGROUP_INFO_1 pBuf=NULL,p;
DWORD Read=0,Entry=0,Resume=0;
PLOCALGROUP_MEMBERS_INFO_2 mBuf=NULL,m;
DWORD mRead=0,mEntry=0,mResume=0;

printf("-------------GROUP INFORMATION-------------/n");

nStatus=NetLocalGroupEnum(pszServerName,dwLevel,(LPBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&Read, &Entry, &Resume);
if(nStatus == NERR_Success)
{
p=pBuf;
for(DWORD i=0;i<Read;i++)
{
printf("Group: %-30S",p->lgrpi1_name);
printf("Comment: %-30S/n",p->lgrpi1_comment);
mRet = NetLocalGroupGetMembers(pszServerName,p->lgrpi1_name, 2, (LPBYTE *)&mBuf, MAX_PREFERRED_LENGTH, &mRead, &mEntry, &mResume);
if(mRet==NERR_Success)
{
m=mBuf;
printf("-----Members-----/n");
for(DWORD j=0;j<mRead;j++)
{
printf("%S/n",m->lgrmi2_domainandname);
m++;
}
printf("/n");
}
else
{
ShowError(mRet);
}
NetApiBufferFree(mBuf);
p++;
}
}
else
{
ShowError(nStatus);
}

NetApiBufferFree (pBuf);
printf("/n/n");

}


int DispServer(TCHAR *pszServerName)
{
DWORD dwLevel = 101;
LPSERVER_INFO_101 pBuf = NULL;
NET_API_STATUS nStatus;

//
// Call the NetServerGetInfo function, specifying level 101.
//
nStatus = NetServerGetInfo(pszServerName,
dwLevel,
(LPBYTE *)&pBuf);
//
// If the call succeeds,
//
if (nStatus == NERR_Success)
{
//
// Check for the type of server.
//
if ((pBuf->sv101_type & SV_TYPE_DOMAIN_CTRL) ||
(pBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL) ||
(pBuf->sv101_type & SV_TYPE_SERVER_NT))
printf("Type: Server/n");
else
printf("Type: Workstation/n");
printf("Name: %S/n",pBuf->sv101_name);
printf("OS: ");
switch(pBuf->sv101_platform_id) //注意这儿
{
case PLATFORM_ID_DOS:
printf("DOS/n");
break;
case PLATFORM_ID_OS2:
printf("OS2/n");
break;
case PLATFORM_ID_NT:
printf("NT/n");
break;
case PLATFORM_ID_OSF:
printf("OSF/n");
break;
case PLATFORM_ID_VMS:
printf("VMS/n");
break;
default:
printf("Unknown/n");
break;
}
printf("Version: %d.%d/n",pBuf->sv101_version_major,pBuf->sv101_version_minor);
printf("Comment: %S/n",pBuf->sv101_comment);
}
//
// Otherwise, print the system error.
//
//else
// printf("A system error has occurred: %d/n", nStatus);
//
// Free the allocated memory.
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
printf("/n/n");
return 0;
}
void EnumShare(TCHAR *lpszServer)
{
PSHARE_INFO_1 BufPtr,p;
NET_API_STATUS res;
DWORD er=0,tr=0,resume=0, i;
//
// Print a report header.
//
printf("Share Share Type: /n");
printf("--------------------------------------------------/n");
//
// Call the NetShareEnum function; specify level 1.
//
do // begin do
{
res = NetShareEnum (lpszServer, 1, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
//
// If the call succeeds,
//
if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
{
p=BufPtr;
//
// Loop through the entries;
// print retrieved data.
//
for(i=1;i<=er;i++)
{
printf("%-20S",p->shi1_netname);
switch(p->shi1_type)
{
case STYPE_DISKTREE:
printf("%-30s/n","Disk driver");
break;
case STYPE_PRINTQ:
printf("%-30s/n","Printe queue");
break;
case STYPE_DEVICE:
printf("%-30s/n","Communication device");
break;
case STYPE_IPC:
printf("%-30s/n","Interprocess communication (IPC)");
break;
case STYPE_SPECIAL:
printf("%-30s/n","Special share");
break;
default:
printf("%-30s/n","Unknown share");
break;
}

p++;
}
//
// Free the allocated buffer.
//
NetApiBufferFree(BufPtr);
}
else
{
ShowError(res);
}
// Continue to call NetShareEnum while
// there are more entries.
//
}while (res==ERROR_MORE_DATA); // end do
return;
}

void DisplayStruct(LPNETRESOURCE lpnr)
{
switch(lpnr->dwDisplayType)
{
case RESOURCEDISPLAYTYPE_DOMAIN:
printf("--------Domain--%S--------/n",lpnr->lpRemoteName);
break;
case RESOURCEDISPLAYTYPE_SERVER:
{
TCHAR IPC[MAX_PATH];
NETRESOURCE netr;
printf("--------Server--%S--------/n",lpnr->lpRemoteName);
wsprintf(IPC,L"%s//IPC$",lpnr->lpRemoteName);
netr.dwScope = RESOURCE_GLOBALNET;
netr.dwType = RESOURCETYPE_ANY;
netr.lpLocalName = L"";
netr.lpRemoteName = IPC;
netr.lpProvider = NULL;
WNetAddConnection2(&netr,L"",L"",NULL);
DispServer(lpnr->lpRemoteName);
EnumShare(lpnr->lpRemoteName);
WNetCancelConnection2(IPC,CONNECT_UPDATE_PROFILE,TRUE);
printf("/n/n");
}
break;
// case RESOURCEDISPLAYTYPE_SHARE:
// printf("Share:%S/n",lpnr->lpRemoteName);
// break;
default:
// printf("Unknown:%S/n",lpnr->lpRemoteName);
break;
}
}

BOOL WINAPI EnumerateFunc(LPNETRESOURCE lpnr)
{
DWORD dwResult, dwResultEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384; // 16K is a good size
DWORD cEntries = -1; // enumerate all possible entries
LPNETRESOURCE lpnrLocal; // pointer to enumerated structures
DWORD i;
//
// Call the WNetOpenEnum function to begin the enumeration.
//
dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, // all network resources
RESOURCETYPE_ANY, // all resources
0, // enumerate all resources
lpnr, // NULL first time the function is called
&hEnum); // handle to the resource

if (dwResult != NO_ERROR)
{
return FALSE;
}
//
// Call the GlobalAlloc function to allocate resources.
//
lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);

do
{
//
// Initialize the buffer.
//
ZeroMemory(lpnrLocal, cbBuffer);
//
// Call the WNetEnumResource function to continue
// the enumeration.
//
dwResultEnum = WNetEnumResource(hEnum, // resource handle
&cEntries, // defined locally as -1
lpnrLocal, // LPNETRESOURCE
&cbBuffer); // buffer size
//
// If the call succeeds, loop through the structures.
//
if (dwResultEnum == NO_ERROR)
{
for(i = 0; i < cEntries; i++)
{
// Call an application-defined function to
// display the contents of the NETRESOURCE structures.
//
DisplayStruct(&lpnrLocal);

// If the NETRESOURCE structure represents a container resource,
// call the EnumerateFunc function recursively.

if(RESOURCEUSAGE_CONTAINER == (lpnrLocal.dwUsage & RESOURCEUSAGE_CONTAINER))
EnumerateFunc(&lpnrLocal);
}
}
// Process errors.
//
else if (dwResultEnum != ERROR_NO_MORE_ITEMS)
{
break;
}
}while(dwResultEnum != ERROR_NO_MORE_ITEMS);
//
// Call the GlobalFree function to free the memory.
//
GlobalFree((HGLOBAL)lpnrLocal);
//
// Call WNetCloseEnum to end the enumeration.
//
dwResult = WNetCloseEnum(hEnum);

if(dwResult != NO_ERROR)
{
return FALSE;
}

return TRUE;
}

int wmain(int argc,TCHAR **argv)
{
if(argc==2)
{
TCHAR IPC[MAX_PATH];
NETRESOURCE netr;
wsprintf(IPC,L"%s//IPC$",argv[1]);
netr.dwScope = RESOURCE_GLOBALNET;
netr.dwType = RESOURCETYPE_ANY;
netr.lpLocalName = L"";
netr.lpRemoteName = IPC;
netr.lpProvider = NULL;
WNetAddConnection2(&netr,L"",L"",NULL);
DispServer(argv[1]);
EnumGroup(argv[1]);
EnumShare(argv[1]);
WNetCancelConnection2(IPC,CONNECT_UPDATE_PROFILE,TRUE);
printf("/n/n");

}
else
{
EnumerateFunc(NULL);
}

}
------------------------------------------------------------
用的是NetServerGetInfo()
另外还可以看一下
function NetWkstaGetInfo(servername: LPWSTR; level: DWORD;
bufptr: Pointer): NET_API_STATUS; stdcall;
这两个函数的pascal声明在LM.pas中,可到http://delphi.mychangshu.com/dispdoc.asp?id=267下载。
 
抱歉,上面的代码似乎不能识别linux或unix
 
to zw84611
十分感谢啦!!!!!!!!!
我自己会慢慢研究的,调试好了以后马上给你加分哟。
unix和linux还是我自己先慢慢研究吧!
 
我曾经想过NetWkstaGetInfo,但是总是不成功
 
to NowCan
我也在编程,不过没有机子调试:((
 
这个问题我要300分才回答,技术含量高
 
呵呵,分数不是问题:)虽然我没有很多分!!现在帐面上还有700多,如果你能给满意
答案我可以给加另加300!
马上看中国队踢球去了,爽快一点哟!高手!
 
To duducat
我有源码
留下你的Qq和mail
 
后退
顶部