什么是Windows挑战和响应认证流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Windows挑战和响应认证流程相关的知识,希望对你有一定的参考价值。

WindowsNT挑战/响应验证机制,又称之为NTLM,是windows早期安全协议,因向后兼容性而保留下来。NTLM是NT LAN Manager的缩写,即NT LAN管理器。
工作流程:
从Win2000开始默认协议为Kerboros,下列情况会调用NTLM:

遗留客户端或服务器需要登录到网络或本地时。

UNIX客户端需要与NT服务器通话时。

有正在使用验证NTLM的服务器信息块(SMB)后台程序的UNIX客户端时。

也即认证方或被认证方有仅支持NTLM情况时。

它以挑战/响应(Challenge/Response)顺序为基础。

1.客户端发送用户名和域名到服务器。

2.服务器转发到域控制器DC。

3.DC用客户端密码随机产生一个8字节得挑战(Challenge),发送给服务器。

4.服务器将挑战转发给客户端。

5.客户端用密码经过hash及DES加密算法等操作得到一个加密结果响应(Response)发送给服务器。

6.服务器将响应转发给DC。

7.DC做同样操作验证客户端响应。

8.验证结束,返回结果通知服务器。
参考技术A 请分别对在Windows 2003 和 2008两个系统分别进行简述。
其实从应用层面上,Win2000的Telnet服务并没有什么可说的,绝大部分内容你都可以从HELP文件中得到,我在此只是把它稍微整理一下而已。

1 基本配置

Win2000为我们提供了Telnet客户机和服务器程序:Telnet.exe是客户机程序(Client),tlntsvr.exe是服务器程序(server),同时它还为我们提供了Telnet服务器管理程序tlntadmn.exe。

Windows 2000 默认安装了 Telnet 服务,但是并没有默认启动。下面给出HELP文件中 Telnet 服务的一部分默认设置:

AllowTrustedDomain:是否允许域用户访问。默认值是1,允许信任域用户访问。可以改为0: 不允许域用户访问(只允许本地用户)。

DefaultDomain:可以对与该计算机具有信任关系的任何域设置。默认值是"."。

DefaultShell:显示 shell 安装的路径位置。默认值是: %systemroot%\System32\Cmd.exe /q /k MaxFailedLogins:在连接终止之前显示尝试登录失败的最大次数。默认是3。

LoginScript:显示 Telnet 服务器登录脚本的路径位置。默认的位置就是“%systemroot%\System32\login.cmd”,你可以更改脚本内容,这样登录进Telnet的欢迎屏幕就不一样了。

NTLM:NTLM身份验证选项。默认是2。可以有下面这些值:

0: 不使用 NTLM 身份验证。

1: 先尝试 NTLM 身份验证,如果失败,再使用用户名和密码。

2: 只使用 NTLM 身份验证。

TelnetPort:显示 telnet 服务器侦听 telnet 请求的端口。默认是:23。你也可以更改为其他端口。

以上各项设置你可以使用tlntadmn.exe(Telnet服务器管理程序)来进行非常方便的配置,配置后需要重新启动Telnet服务。如图1

2 NTLM

提到了telnet就不能不提NTLM,我想这也是让入侵者最为头痛的一件事,哪怕你获得了管理员帐号和密码,想简单通过NTLM也并非易事,况且win2000中的telnet默认仅以NTLM方式验证身份,这就让我们不得不关注NTLM这个东东,那么什么是NTLM呢?

早期的SMB协议在网络上明文传输口令,后来出现了"LAN Manager Challenge/Response"验证机制,简称LM,它十分简单以至很容易被破解,微软随后提出了WindowsNT挑战/响应验证机制,即NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM工作流程是这样的:

1、客户端首先在本地加密当前用户的密码成为密码散列

2、客户端向服务器发送自己的帐号,这个帐号是没有经过加密的,明文直接传输

3、服务器产生一个16位的随机数字发送给客户端,作为一个 challenge(挑战)

4、客户端再用加密后的密码散列来加密这个 challenge ,然后把这个返回给服务器。作为 response(响应)

5、服务器把用户名、给客户端的challenge 、客户端返回的 response 这三个东西,发送域控制器

6、域控制器用这个用户名在 SAM密码管理库中找到这个用户的密码散列,然后使用这个密码散列来加密 challenge。

7、域控制器比较两次加密的 challenge ,如果一样,那么认证成功。

从上面的过程我们可以看出,NTLM是以当前用户的身份向Telnet服务器发送登录请求的,而不是用你扫到的对方管理员的帐户和密码登录,显然,你的登录将会失败。举个例子来说,你家的机器名为A(本地机器),你入侵的机器名为B(远地机器),你在A上的帐户是xinxin,密码是1234,你扫到B的管理员帐号是Administrator,密码是5678,当你想Telnet到B时,NTLM将自动以当前用户的帐号和密码作为登录的凭据来进行上面的7项操作,即用xinxin和1234,而并非用你扫到的Administrator和5678,且这些都是自动完成的,根本不给你插手的机会,因此你的登录操作将失败。

由于Telnet服务器对NTLM的使用有3个选项,所以当你Telnet远地机器时,会显示下面情况中的一种:

1)身份验证选项=0时

=====================================

Microsoft (R) Windows (TM) Version 5.00 (Build 2195)

Welcome to Microsoft Telnet Service

Telnet Server Build 5.00.99201.1

login:

password:

\\为0时不使用NTML身份验证,直接输入用户名和密码,比如你可以输入扫到的Administrator和5678

2)身份验证选项=1时

=====================================

NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password

Microsoft (R) Windows (TM) Version 5.00 (Build 2195)

Welcome to Microsoft Telnet Service

Telnet Server Build 5.00.99201.1

login:

password:

\\先尝试 NTLM 身份验证,如果失败,再使用用户名和密码,其实这种方式对于我们来说,与上一种方式没什么区别

3)身份验证选项=2时

=====================================

NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password

Server allows NTLM authentication only

Server has closed connection

遗失对主机的连接。

C:\>

\\仔细看看上面的显示,根本没有给你输入用户名和密码的机会,直接断开连接,扫到了密码也是白扫

所以对于入侵者来说,NTLM是横在我们面前的一座大山,必须要除掉它,一般我们有如下几种方法:

1通过修改远程注册表更改telnet服务器配置,将验证方式从2改为1或0;

2使用NTLM.exe,上传后直接运行,可将telnet服务器验证方式从2改为1;

3在本地建立扫描到的用户,以此用户身份开启telnet客户机并进行远程登录;

4使用软件,比如opentelnet.exe(需要管理员权限且开启IPC管道)

5使用脚本,如RTCS,(需要管理员权限但不依赖IPC管道)

基本上是以上的5种,其中后两种是我们比较常用的开telnet的手法,而且使用方法十分简单,命令如下:

OpenTelnet.exe \\server username password NTLMAuthor telnetport

OpenTelnet.exe \\服务器地址 管理员用户名 密码 验证方式(填0或1) telnet端口

cscript RTCS.vbe targetIP username password NTLMAuthor telnetport

cscript RTCS.vbe <目标IP> <管理员用户名> <密码> <验证方式

ATSHA204加密芯片介绍

1、认证流程:
(1)主机(Host)生成256位摘要(挑战),发送给ATSHA204芯片(Client),进行挑战;
(2)ATSHA204芯片使用HASH算法将摘要信息和自己的密钥进行计算,得到响应1;
(3)同时,主机使用HASH算法将该摘要信息和自己的密钥进行计算,得到响应2;
(4)主机将响应1和响应2进行比较,如果匹配,则认证成功。

2、RAM:存储输入命令和输出结果; EEPROM:包括数据区、配置区和OTP(一次性编程)区域。

3、(1)数据(data)区:数据区的总大小是512 Kb,包含16个通用的容量为32字节的数据槽,这些数据槽可用来存储秘钥、校准数据以及型号信息。
    (2)配置(config)区:配置区的大小为88字节,配置区包含芯片的序列号、ID信息以及每个数据槽的访问权限信息,写入数据槽中的数据将参与后续的MAC运算。
    (3)一次性编程(OTP)区:大小为64字节,在锁定OTP区域之前,可以通过写命令对OTP区域进行写入操作,OTP中存放的密钥也将作为SHA-256输入。

4、(1)序列号(serial number)用于区分其他芯片;
    (2)内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥;
    (3)SHA算法(本文使用SHA256)最主要的特点就是,任意长度的输入能生成固定长度的输出,并且从输出的结果中不能还原输入的内容,而且要找到不同两个输入导致相同输出的情况在计算上不能实现;
    (4)在单线上并没有传送秘钥,而是传送根据秘钥和一些列的值计算出来的digest,因此在单线上截获秘钥不可实现;
    (5)在自己的MCU上也存了秘钥,别人获取了16进制文件后是否有可能得到秘钥,我只能说,的确存了,但是对于一个庞大的程序hex文件中寻找一个32字节的秘钥,岂不是大海捞针?
    (6)CheckMAC命令也是带有验证功能的,简单来讲,就是让你计算好digest,发给ATSHA204A,然后ATSHA204A告诉你这个digest算的对不对,返回bool值;
    (7)当我们原有的秘钥泄露的时候,可以使用DeriveKey命令来产生新的秘钥继续使用。

5、重要命令:
DerriveKey:更新一个slot区中的秘钥命令; 
Nonce:使用随机数来更新TempKey中的值; 
CheckMAC:验证一个摘要是否计算正确,返回的是Bool值类型(0是正确,1是错误); 
MAC:使用SHA-256计算并返回一个摘要;
Read:读取芯片区域中的数据;
Write:写入芯片区域中的数据(这个命令一般用在配置时)。

6、防程序拷贝:
首先我们在ATSHA204A芯片的slot0中写入一个32字节的秘钥,设置为不可读。这个秘钥只有几个人知道,并且不外泄,主控MCU与芯片相连,在启动时候,首先我们要获取芯片序列号,为后面计算MAC。然后我们发送一个nonce命令给ATSHA204A,让其更新内部的TempKey中的值,MCU内部也根据nonce的模式计算一下Tempkey的值,我们称之为host_tempkey,如果一切正常,那么Tempkey和host_tempkey中的值是一致的,接下来MCU自己就可以根据host_tempkey、序列号、以及秘钥计算,出一个摘要digest,我们称之为digest1,接下来给ATSHA204A发送MAC命令,ATSHA204A根据存储在slot区域中的秘钥来计算digest2并返回给MCU,MCU判断digest1和digest2是否匹配,不匹配将程序挂起即可。 

以上是关于什么是Windows挑战和响应认证流程的主要内容,如果未能解决你的问题,请参考以下文章

windows消息响应机制到底是啥,谁发出消息,啥是消息?谁来响应消息?怎样响应?

Windows掌机何以挑战Switch?

具有质询-响应的认证系统

Windows桌面双因素认证流程是啥?

windows + flutter +android+ vscode 安装配置运行流程(详细版本)

关于Windows系统密码抓取