一、什么是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、使用最新的安全系统:使用最新的安全系统更新来修复已知漏洞,并且可以检测和防止各种攻击。