您的位置:

NTLM认证

一、什么是NTLM认证?

NTLM(Windows NT LAN Manager)认证是一种Windows协议,它用于客户端对Windows基于NTLM Windows服务器进行认证和授权。

当客户端访问NTLM保护的资源时,客户端将会向服务器发送一个NTLM凭证,在验证成功后,服务器将返回一个票据以供客户端访问更多资源。

NTLM是Windows中使用的默认身份认证协议,通过使用Windows集成身份认证进行请求访问。

二、NTLM认证的优缺点

NTLM认证有以下几个优点:

1、易于使用:NTLM认证的使用与Windows System集成,因此操作体验和使用方式非常直接且易于使用。

2、本地控制:NTLM认证为本地控制提供了便利,普通用户可以通过简单的方法访问到域资源。

3、身份验证:该协议可验证域用户帐户,以保证安全性并减少攻击成功的机会。

但同时,NTLM认证也存在以下几个缺点:

1、容易进行中间人攻击:ACTS漏洞和SMBhash漏洞使得NTLM认证很容易被攻击者利用进行中间人攻击。

2、基于口令:使用NTLM认证时,仍然需要使用口令进行身份验证,如果口令易受破解或黑客攻击,则会存在安全风险。

3、跨多个平台的支持有限:该协议只能在Windows平台上使用,若要在多个平台上使用,则无法满足此需求。

三、NTLM认证的实现

首先,使用NTLM认证需要设置正确的Http请求头。Http请求头中应该包含以下信息:

HttpClient httpClient = new DefaultHttpClient();

NTCredentials ntCred = new NTCredentials("username", "password", "workstation", "domain");

httpClient.getAuthSchemes()
    .register(AuthPolicy.NTLM, new NTLMSchemeFactory());

httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, ntCred);

NTCredentials: NTLM凭证,由用户名密码组成。

workstation: 机器名称,指定用于身份验证的计算机。

domain: 设定所在的域名。

其次,为了完成NTLM认证所需的交互,应该尝试多次GET请求:

HttpResponse httpResponse = null;
try {
    httpResponse = httpClient.execute(httpGet);
    EntityUtils.consume(httpResponse.getEntity());

    //第2次请求,服务器返回401
    httpResponse = httpClient.execute(httpGet);
    EntityUtils.consume(httpResponse.getEntity());

    //第3次请求,服务器返回200
    httpResponse = httpClient.execute(httpGet);
} catch (IOException e) {

}

if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    //这说明NTLM认证通过了
}

在这种情况下,第一次请求将返回200 OK的响应,这不是进行NTLM身份验证所需的响应。

在第二个GET请求中,服务器将响应状态行代码401 Unauthorized,这表示服务器要求身份验证。

在第三个GET请求之后,服务器将对身份验证进行认证,并回复200 OK。

四、如何防止NTLM漏洞

要防止NTLM漏洞,你可以采取以下措施:

1、禁用NTLM:可以选择使用Kerberos等具有更高安全性和功能性的身份验证策略,来替代NTLM认证。

2、加强用户训练:提供员工网络安全培训,加强员工的安全意识,避免用户重用密码来降低帐户被黑客攻击的风险。

3、使用最新的安全系统:使用最新的安全系统更新来修复已知漏洞,并且可以检测和防止各种攻击。