域渗透05-协议(NTLM)

news2024/11/7 20:39:01

前言:

首先在域内环境中主要有如下6种身份认证协议,最常用的还是Kerberos,NTLM和LDAP三种:

  1. Kerberos:Kerberos是一种网络身份验证协议,用于验证用户和服务之间的身份。它通过使用票据和密钥来实现认证,并使用单点登录(SSO)机制。

  2. LDAP:LDAP(Lightweight Directory Access Protocol)是一种用于访问和维护分布式目录服务的协议。它常用于用户身份验证和访问控制,以及存储和检索用户信息。

  3. NTLM:NTLM(NT LAN Manager)是一种Windows操作系统中使用的身份验证协议。它用于在Windows域中进行用户身份验证和会话安全。

  4. Active Directory身份验证:Active Directory是微软Windows操作系统中的目录服务,它提供了集中管理和身份验证的功能。在域内环境中,Active Directory通常用于用户身份验证和授权。

  5. SAML:SAML(Security Assertion Markup Language)是一种基于XML的开放标准,用于在不同安全域之间进行身份验证和授权。它常用于实现单点登录和跨域身份验证。

  6. OAuth:OAuth(Open Authorization)是一种用于授权的开放标准协议。它允许用户授权第三方应用程序访问其受保护的资源,而无需共享其凭据。

        NTLM(NT LAN Manager)是一种用于身份验证和会话安全性的协议。它最初由Microsoft开发,并在早期的Windows操作系统中使用。NTLM协议提供了一种用于验证用户身份并保护通信数据的机制。

NTLM协议的主要目的是在客户端和服务器之间建立安全的会话。它涉及以下几个方面:

  1. 身份验证:NTLM协议用于验证用户的身份。在身份验证过程中,客户端向服务器发送身份验证请求,并提供用户名和密码。服务器使用存储在本地或在域控制器中的用户凭据进行验证。验证成功后,服务器将与客户端建立安全的会话。

  2. 挑战-响应机制:NTLM协议使用挑战-响应机制进行身份验证。服务器向客户端发送一个随机的挑战(challenge),客户端必须使用用户密码的哈希值和挑战生成一个响应(response)。服务器根据存储的用户密码的哈希值验证客户端的响应。

  3. 会话安全性:NTLM协议还提供了会话级别的安全性。它使用会话密钥对通信进行加密,并确保数据的完整性。这样可以防止中间人攻击和数据篡改。

NTLM协议在早期的Windows操作系统中广泛使用,但随着时间的推移,它逐渐被更安全和先进的身份验证协议如Kerberos所取代。但是NTLM还是被广泛使用。

HASH:

windows密码都不是明文保存的,都是以hash的形式放在了本地sam内,域内的密码hash则保存在了域控的ntds.dit内。
正常我们查看到的hash密码格式如下:

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:CCEF208C6485269C20DB2CAD21734FE7:::
LMhash: AAD3B435B51404EEAAD3B435B51404EE
NTLMhash: CCEF208C6485269C20DB2CAD21734FE7

但是目前LMhash只能再xp,2003和2000下使用,后续系统已经不在使用存在安全问题的LMhash,而采用NTLMhash,所以这里只对NTLMhash进行讲解:

NTLMhash:

NTLMhash生成算法:

  1. 将明文口令转换成十六进制的格式
  2. 转换成Unicode格式,即在每个字节之后添加0x00
  3. 对Unicode字符串作MD4加密,生成32位的十六进制数字串

python3 -c 'import hashlib,binascii; print(binascii.hexlify(hashlib.new("md4", "Admin12345".encode("utf-16le")).digest()))'

NTLM认证机制:

NTLM本地认证:

windows用户的密码保存在SAM文件中“%SystemRoot%\system32\config\SAM”。计算机启动时,操作系统会让winlogon.exe 程序显示登录界面(输入框),当你输入用户密码进行登录时,lsass.exe会将你输入的明文密码加密成NLTM哈希,再sam文件中的哈希进行对比,一致则登陆成功,

通过下列命令,使用mimikatz可以对本地密码进行抓取:

mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" "exit"

这里可看到密码为null,是因为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,所以可以手动通过注册表开启,但是需要重启才可以生效:

reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f  
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f  恢复

当获取了NTHash可以使用hashcat进行爆破:

hashcat -m 1000 -a 0 --force 328727b81ca05805a68ef26acb252039 test123 -o out

NTLM网络认证:

NTLM网络认证,即可用于工作组的认证,也可用于域环境。NTLM 有 NTLMv1 、NTLMv2 、NTLMsession v2 三个版本,目前使用最多的是NTLMv2版本。比如当我们访问同一局域网的一台主机上的SMB共享时需提供凭证后才能成功进行访问。

NTMLV1:

NTMLV1具体的认证流程如下:

  1. 客户端向服务器发送身份验证请求。
  2. 服务器将生成一个称为挑战(challenge)的随机数,并将其发送回客户端。
  3. 客户端收到挑战后,使用用户密码进行以下操作:
    • 将用户密码转换为Unicode编码。
    • 使用MD4哈希算法对Unicode编码的用户密码进行哈希处理,生成一个16字节的密码哈希。
    • 使用挑战和密码哈希值,进行NTLMv1的计算过程来生成响应。
    • 响应数据包括密码哈希值、挑战和一些其他信息,如客户端的随机数。
  4. 客户端将生成的响应发送回服务器。
  5. 服务器收到响应后,使用存储在本地或域控制器中的用户密码的哈希值进行以下操作:
    • 使用相同的NTLMv1计算过程,使用存储的密码哈希值和挑战来生成一个期望的响应。
    • 将服务器生成的期望响应与客户端发送的响应进行比较。
    • 如果两个响应匹配,则认为客户端身份验证成功。
  6. 如果身份验证成功,服务器将与客户端建立安全的会话,并允许客户端访问所请求的资源。

下面我编写了个脚本来进行测试:

from impacket.dcerpc.v5 import nrpc, epm
from Crypto.Hash import MD4
from impacket.dcerpc.v5.dtypes import NULL
from impacket.dcerpc.v5 import transport
from impacket import crypto
import impacket

import hmac, hashlib, struct, sys, socket, time
from binascii import hexlify, unhexlify
from subprocess import check_call
from Cryptodome.Cipher import DES, AES, ARC4
from struct import pack, unpack

negotiateFlags = 0x212fffff
dc_ip = "192.168.3.43"
primaryName = "\\\\***\x00"
computerName = "***\x00"
accountName = "***$\x00"
clientChallenge = b'\x00' * 8

def ntmlv1():
    print('Performing authentication attempts...')
    binding = epm.hept_map(dc_ip, nrpc.MSRPC_UUID_NRPC, protocol='ncacn_ip_tcp')
    rpc_con = transport.DCERPCTransportFactory(binding).get_dce_rpc()
    rpc_con.connect()
    rpc_con.bind(nrpc.MSRPC_UUID_NRPC)

    #hNetrServerReqChallenge(dce, primaryName, computerName, clientChallenge)
    serverChallengeResp = nrpc.hNetrServerReqChallenge(rpc_con, primaryName, computerName, clientChallenge)
    serverChallenge = serverChallengeResp['ServerChallenge']
    print("clientChallenge is:", clientChallenge.hex())
    print("serverChallenge is:", serverChallenge.hex())

    SessionKey = getSessionKey(clientChallenge, serverChallenge)
    print("SessionKey is:", SessionKey.hex())

    iv = b'\x00' * 16
    cipher = AES.new(SessionKey, AES.MODE_CFB, iv, segment_size=8)
    clientCredential = cipher.encrypt(clientChallenge)
    print("clientCredential is:", clientCredential.hex())

    #hNetrServerAuthenticate3(dce, primaryName, accountName, secureChannelType, computerName, clientCredential, negotiateFlags)
    ServerCredentialResp = nrpc.hNetrServerAuthenticate3(rpc_con,
                                                primaryName,
                                                accountName,
                                                nrpc.NETLOGON_SECURE_CHANNEL_TYPE.ServerSecureChannel,
                                                computerName,
                                                clientCredential,
                                                negotiateFlags
                                                )
    ServerCredential = ServerCredentialResp['ServerCredential']
    print("ServerCredential is:", ServerCredential.hex())


def getSessionKey(ClientChallenge, ServerChallenge):
    NTLMhash = ""
    hstring = ClientChallenge + ServerChallenge
    if len(NTLMhash) <= 0:
        secret = "123456"
        NTLMhash = binascii.hexlify(hashlib.new("md4", secret.encode("utf-16le")).digest())
    print("NTLMhash is:", NTLMhash)
    SessionKey = hmac.new(NTLMhash, hstring, hashlib.sha256).digest()[:16]
    return SessionKey

if __name__ == '__main__':
    ntmlv1()

执行后可以看到验证成功:

对流量分析下,首先和服务器进行协商确定认证方式,然后调用hNetrServerReqChallenge交换Challenge,根据serverChallenge和clientChallenge生成SessionKey,然后使用SessionKey对clientChallenge采用aes_cfb8加密生成生成clientCredential,然后调用方法hNetrServerAuthenticate3将结果发送到服务器,服务器用相同的算法计算clientCredential,然后和客户端发送的clientCredential对比,如果相同则生成ServerCredential并返回给服务器,完成认证

NTMLV2:

ntmlv2和ntmlv1相比大致流程是相同的,但是内部细节有很多变化,比如为了提高安全性,NTLMv2引入了更强的加密算法和安全机制。它使用更复杂的挑战-响应(challenge-response)过程,并使用更强的哈希算法,如HMAC-MD5或HMAC-SHA256,来保护用户密码的传输和存储。NTLMv2还引入了时间戳和随机数等额外的安全性措施,以防止重放攻击。

下面可以分析下NTMLV2的协议,前面是协商部分,协商完成后会交换challenge:

验证数据包,其中包括了用户信息,HMAC-MD5和加密数据到服务器,服务器进行验证是否正确

Net-NTLM hash v2的格式如下:

username::domain:challenge:HMAC-MD5:response 

我们可以使用hashcat进行爆破密码,其中HMAC-MD5内容为ntproofstr,response为剔除ntproofstr值

hashcat -m 5600  username::domain-name:93c509d428345d50:87e76939403e4fa4b9d2410226366df0:010100000000000062971b903c03da01677a463757316c3200000000020018005000520045004d00490055004d00490054002d0043004e0001001200500054004900570048002d00360035003400040020007000720065006d00690075006d00690074002d0063006e002e0063006f006d0003003400500054004900570048002d003110350034002e007000720065006d00690075006d00690074002d0063006e002e0063006f006d00050020007000720065006d00690075006d00690074002d0063006e002e0063006f006d000700080062971b903c03da0109001c0063006900660073002f00500054004900570048002d003600350034000000000000000000 test123 -o out

爆破完成可以获取密码:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 指令学习

Linux 指令学习 以此为记录&#xff0c;也方便自己日后查看回顾&#xff01; Linux命令基础格式 无论是什么命令&#xff0c;用于什么用途&#xff0c;在Linux中&#xff0c;命令有其通用的格式&#xff1a; command&#xff1a; 命令本身 options&#xff1a;[可选&#xf…

AD9371 官方例程

文章目录 前言一、HDL方面1. ZYNQ 核根据ZCU106平台修改&#xff08;**参考UG1244 ZCU106 Evaluation Board**&#xff09;&#xff0c;尤其注意**DDR**的配置&#xff08;**参考美光 MTA4ATF51264HZ**&#xff09;2.dacfifo 深度 要修改 &#xff0c;地址位宽 小于等于16&…

Windows 11 2023 Moment 4 更新内容详解

Windows 11 2023 Moment 4 更新内容详解 编辑&#xff1a;简简单单 Online zuozuo 地址&#xff1a;https://blog.csdn.net/qq_15071263 前言 主要的更新内容清单 Copilot内置应用资源管理器照片应用截图工具画图与视频剪辑Windows 备份系统界面开始菜单快速设置系统托盘任务…

【python】进程和线程

进程和线程 今天我们使用的计算机早已进入多CPU或多核时代&#xff0c;而我们使用的操作系统都是支持“多任务”的操作系统&#xff0c;这使得我们可以同时运行多个程序&#xff0c;也可以将一个程序分解为若干个相对独立的子任务&#xff0c;让多个子任务并发的执行&#xff…

优测云测试平台 | 有效的单元测试

一、前言 本文作者提出了一种评价单元测试用例的质量的思路&#xff0c;即判断用例是否达到测试的“四大目标”。掌握识别好的用例的能力&#xff0c;可以帮助我们高效地写出高质量的测试用例。 评判冰箱的好坏&#xff0c;并不需要有制造一台冰箱的能力。在开始写测试用例之…

TikTok Shop印尼站关停,跨境卖家该如何自救

10.4日&#xff0c;TikTok Shop宣布关停印尼站&#xff0c;无疑是一个巨大的炸弹投在整个跨境圈&#xff0c;让许多跨境卖家以及当地本土的卖家、品牌措手不及。 这对TikTok的东南亚市场而言&#xff0c;无疑是一次沉重的打击。 TikTok在东南亚的商业布局&#xff0c;印尼是其…

小A对我说,他现在快想钱想疯了…

昨天晚上11点&#xff0c;小A给我打电话 小A问&#xff1a;橙哥&#xff0c;有没有赚钱的事做&#xff1f; 他说&#xff0c;实在不想上班了&#xff0c;每天起早贪黑挤地铁 辛辛苦苦干一个月&#xff0c;到手工资三四千块钱&#xff0c;房租一交&#xff0c;日常开支一花&a…

Jmeter安装(快速入门)

大家好我是苏麟今天简单聊一下Jmeter . Jmeter Jmeter官网 : Apache JMeter - Download Apache JMeter 安装Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 下载 : 官网下载 : 网盘自取 : 链接&#xff1a;…

【LeetCode】57. 插入区间

1 问题 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;interval…

国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板

本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。 Thingsboard网关是一个开源的软件网关&#xff0c;采用python作为开发语言&#xff0c;可以部署在任何支持 python 运行环境的主机上&#xff0c;灵…

前端将二维数组转换成树形格式数组

原始数据&#xff1a; 最终得到的数据&#xff1a; 具体实现代码&#xff1a;倒推&#xff08;最后一个数据&#xff09;的思路得到数组 function childData(list,i){const arr []//最后一个数组if(i<list.length){list[i].forEach(item>{const obj {name:,prop:,chil…

美摄视频特效SDK,视频特效技术解决方案

视频内容已经成为企业传播信息、提升品牌形象的重要手段。然而&#xff0c;普通的视频内容往往难以吸引观众的注意力&#xff0c;而富有创意的视频特效则能够大大提升视频的观赏性和吸引力。为了帮助企业轻松实现视频特效的添加&#xff0c;我们推出了美摄视频特效SDK&#xff…

风口下的低代码,怎么样了?

目录 一、前言 二、为什么低代码平台会受到资本的重视&#xff1f; 三、低代码的应用场景 1.基于表单/引擎驱动的模式 2.基于aPaaS平台的模式 四、低代码能解决什么问题&#xff1f; &#xff08;1&#xff09;运维工作流方向 &#xff08;2&#xff09;运维开发方向 五、低代码…

ArcGIS笔记10_如何创建渔网?

本文目录 前言Step 1 确定渔网的精度单位Step 2 有底图时创建渔网的操作 前言 ArcGIS中的渔网是一个很好用的工具&#xff0c;它可以创建出规规整整的小格子&#xff0c;每个小格子都对应一个标注点&#xff0c;可以将原本散乱的数据规整化&#xff0c;如下图&#xff1a; Ste…

Springboot-案例 增删改查二

准备 前端程序、后端工程&#xff08;web/mybatis/mysql/lombok&#xff09;、数据库 开发规范 GET&#xff1a;查询 POST&#xff1a;新增 PUT&#xff1a;修改 DELETE&#xff1a;删除 Result.java Data NoArgsConstructor AllArgsConstructor public class Result {pri…

如何正确地使用ChatGPT(角色扮演+提示工程)

如何正确地使用ChatGPT 一、ChatGPT介绍二、准备工作2.1 获取ChatGPT环境2.2 确定使用ChatGPT的目标和需求 三、重要因素3.1 角色赋予3.2 提示工程 四、正确案例 一、ChatGPT介绍 可以查阅ChatGPT快速入门 二、准备工作 2.1 获取ChatGPT环境 国外的有OpenAI和微软NewBing等…

如何快速绘制一张业务流程图?

产品经理在日常工作中经常需要和业务流程图打交道&#xff0c;它能很好地帮助我们梳理业务&#xff0c;高效表达需求&#xff0c;避免做无用功。 对于刚入门的PM来说&#xff0c;对业务流程图完全摸不着头脑的大有人在&#xff0c;今天从业务流程图的基本介绍、分类、业务流程…

超结MOS/低压MOS在微型逆变器上的应用-REASUNOS瑞森半导体

一、前言 微型逆变器&#xff0c;一般指的是光伏发电系统中的功率小于等于1000瓦、具组件级MPPT的逆变器&#xff0c;全称是微型光伏并网逆变器。“微型”是相对于传统的集中式逆变器而言的。传统的光伏逆变方式是将所有的光伏电池在阳光照射下生成的直流电全部串并联在一起&…

接物游戏demo

接物游戏demo&#xff1a; 接物元素设置了不同分值 指定时间内&#xff0c;接到元素则加分&#xff0c;接到炸弹则减分&#xff0c;计时结束&#xff0c;游戏停止 demo代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"…

文心一言帮忙写代码之微信小程序图片移动顺序

先上效果图&#xff0c;图片顺序可移动&#xff0c;左移右移调准顺序。 代码是文心一言帮忙写的&#xff0c;自己稍微改造就可以用了。 首先是往左移&#xff0c;也就是从下标1移到下标0 &#xff0c;下标2移到下标1 var imglist [‘aa’, ‘bb’, ‘cc’, ‘dd’]; function…