WEB安全--内网渗透--LMNTLM基础
一、前言
LM Hash和NTLM Hash是Windows系统中的两种加密算法,不过LM Hash加密算法存在缺陷,在Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。所以我们会着重分析NTLM Hash。
在我们内网渗透的过程中,有通过抓取Windows服务器内部的hash值登录到域环境中的其他服务器进行横向渗透这一方式。
Windows(登录)的认证方式有两种:
1.1、本地认证
本地认证指操作系统运行winlogon进程显示登录界面,接收用户的输入,然后将输入的密码交给lsass进程,这个进程执行两个操作:①使用动态秘钥对称加密(mimikatz可以解密)的方式在内存中缓存一份“明文密码” ②将密码转换成NTLM Hash,然后会将NTLM Hash与本地的SAM数据库中存储的密码进行比对,如果一致则通过验证。
补充:
windows内部是不保存明文密码的,只保存密码的hash。其中本机用户的密码hash是放在 本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件 里面。
1.2、网络认证
内网中的网络环境可以分为工作组环境和域环境,它们使用的加密协议:
工作组环境:NTLM Hash(默认) || LM Hash(被淘汰)
域环境:Kerberos(默认) || NTLM Hash(不满足Kerberos条件)
所以在某些情况下,域环境中的服务器也可以使用NTLM Hash加密算法。
用户在内网中服务器之间的登录操作是基于这些协议加密算法来建立安全的连接的,具体的实现请看下面的解析。
二、SSPI&SSP
在学习NTLM协议之前,我们需先了解两个概念:SSPI&SSP
2.1、SSPI
SSPI是Windows定义的一套接口,该接口定义了与安全有关的功能函数,如:
1、身份验证机制
2、为其他协议提供的Session Security机制(会话安全机制),为通讯提供数据完整性校验以及数据的加、解密功能
该接口只是定义了一套接口函数,但是并没有实现具体的内容。
2.2、SSP
SSP是SSPI的具体实现,微软自己实现了如下的SSP,用于提供安全功能,如:
1、NTLM SSP:为Windows 2000之前的客户端-服务器域和非身份域验证(SMB/CIFS)提供NTLM质询/响应身份验证
2、Kerberos SSP:Windows2000及更高版本中首选的客户端-服务器域相互身份验证
3、Digest SSP
4、Negotiate SSP
5、Cred SSP
6、Schannel SSP
......
三、NTLM身份认证
NTLM协议是一种网络协议认证,采用一种质询/应答(Challenge/Response)的信息交换模式。
认证流程:
1、协商:确定双方协议版本、加密等级
2、质询:质询/应答(Challenge/Response)信息交换的过程
3、认证:验证结果
3.1、质询过程

在工作组环境下:
①:用户通过密码登录客户端电脑
②:(type 1)客户端向服务器发送type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表,如设备信息、密码信息等
③:接收请求,生成Challenge。加密Challenge,生成Net-NTLM Hash
④:(type 2)服务器用type 2消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的Challenge
⑤:接收到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response
⑥:(type 3)客户端用type 3消息(身份验证)回复质询。将response,username,challenge发给服务器。消息中的response是最关键的部分,因为它们向服务器证明客户端用户已经知道帐户密码
⑦:比对Server生成的Net-NTLM Hash与Response是否相等
⑧:验证成功
3.2、数据包信息
NTLM只是底层的认证协议,其必须镶嵌在上层应用协议里面,消息的传输依赖于使用NTLM的上层协议,如SMB、HTTP等。
数据包的关键信息如下:
协商(type1):

Negotiate Flags具体内容如下:

质询(type2):

其中最主要的信息是challenge,如下:

认证(type3):

这里的Challenge不同于type2 的Challenge,这里的Challenge是一个随机的客户端nonce。
数据包内容如下:

可以看到type3 Response响应消息数据包中的是NTLMv2响应。那NTLMv2响应是怎样构建出type3 Response的呢?
请看下面介绍:
3.3、NTLMv2响应
在type3中的响应,有六种类型的响应:
-
LM(LAN Manager)响应 - 由大多数较早的客户端发送,这是“原始”响应类型。
-
NTLMv1响应 - 这是由基于NT的客户端发送的,包括Windows 2000和XP。
-
NTLMv2响应 - 在Windows NT Service Pack 4中引入的一种较新的响应类型。它替换启用了 NTLM版本2的系统上的NTLM响应。
-
LMv2响应 - 替代NTLM版本2系统上的LM响应。
-
NTLM2会话响应 - 用于在没有NTLMv2身份验证的情况下协商NTLM2会话安全性时,此方案会更改LM NTLM响应的语义。
-
匿名响应 - 当匿名上下文正在建立时使用; 没有提供实际的证书,也没有真正的身份验证。“存 根”字段显示在类型3消息中。
NTLMv2加密算法
Net-ntlm hash v2的格式为:
username::domain:challenge:HMAC-MD5:blob
type3中Response的构成方式:
①将Unicode后的大写用户名与Unicode后的身份验证目标(在Type 3消息的"TargetName"字段中指定的域或服务器名称)拼在一起;
②构建一个blob信息;
③使用16字节NTLMv2哈希作为密钥,将HMAC-MD5消息认证代码算法加密一个值(来自type 2的Challenge与Blob拼接在一起),得到一个16字节的NTProofStr;
NTLMv2 Hash = HMAC-MD5(unicode(hex((upper(UserName)+DomainName))),NTLM Hash)
NTProofStr = HMAC-MD5(challenge+blob,NTLMv2 Hash)
④将NTProofStr与Blob拼接起来形成得到response。
3.4、MIC
MIC是校验和,设计MIC主要是为了防止这个包中途被修改。
计算公式:
MIC = HMAC_MD5(exportedSessionKey,NEGOTIATE_MESSAGE+CHALLENGE_MESSAGE+AUTHENTICATE_MESSAGE)
关于exportedSessionKey,请看下面
3.5、签名
keyExchangeKey是使用用户password和severChallenge经过一定运算得到
SessionKey是由keyExchangeKey和exportedSessionKey经过一定运算得到
SessionKey是在要求进行签名的时候用的,用来进行协商加密密钥。
首先,客户端会生成一个随机数exportedSessionKey,后续都是使用这个exportedSessionKey来加解密流量。由于exportedSessionKey是客户端生成的,服务端并不知道,那么是通过什么手段进行协商的呢?
客户端使用keyExchangeKey做为Key,RC4加密算法加密exportedSessionKey,得到我们流量中看到的SessionKey。服务端拿到流量后,使用用户密码和质询值Challenge经过运算生成keyExchangeKey,然后使用SessionKey跟keyExchangeKey一起运算(解密)得到exportedSessionKey,然后使用exportedSessionKey进行加解密流量。对于攻击者来说,由于没有用户的密码,无法生成keyExchangeKey。因此,攻击者即使在拿到流量后,也无法计算出exportedSessionKey,自然也就无法解密流量了。
相关文章:
WEB安全--内网渗透--LMNTLM基础
一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法,不过LM Hash加密算法存在缺陷,在Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…...
查询条件与查询数据的ajax拼装
下面我将介绍如何使用 AJAX 动态拼装查询条件和获取查询数据,包括前端和后端的完整实现方案。 一、前端实现方案 1. 基础 HTML 结构 html 复制 <div class"query-container"><!-- 查询条件表单 --><form id"queryForm">…...
8.用户管理专栏主页面开发
用户管理专栏主页面开发 写在前面用户权限控制用户列表接口设计主页面开发前端account/Index.vuelangs/zh.jsstore.js 后端Paginator概述基本用法代码示例属性与方法 urls.pyviews.py 运行效果 总结 欢迎加入Gerapy二次开发教程专栏! 本专栏专为新手开发者精心策划了…...
室内指路机器人是否支持与第三方软件对接?
嘿,你知道吗?叁仟室内指路机器人可有个超厉害的技能,那就是能和第三方软件 “手牵手” 哦,接下来就带你一探究竟! 从技术魔法角度看哈:好多室内指路机器人都像拥有超能力的小魔法师,采用开放式…...
Apache BookKeeper Ledger 的底层存储机制解析
Apache BookKeeper 的 ledger(账本)是其核心数据存储单元,底层存储机制结合了日志追加(append-only)、分布式存储和容错设计。Ledger 的数据存储在 Bookie 节点的磁盘上,具体实现涉及 Journal(日…...
从代码上深入学习GraphRag
网上关于该算法的解析都停留在大概流程上,但是具体解析细节未知,由于代码是PipeLine形式因此阅读起来比较麻烦,本文希望通过阅读项目代码来解析其算法的具体实现细节,特别是如何利用大模型来完成图谱生成和检索增强的实现细节。 …...
通俗地讲述DDD的设计
通俗地讲述DDD的设计 前言为什么要使用DDDDDD架构分层重构实践关键问题解决方案通过领域事件机制解耦服务依赖:防止逻辑下沉 领域划分电商场景下的领域划分 结语完结撒花,如有需要收藏的看官,顺便也用发财的小手点点赞哈,…...
【Redis】通用命令
使用者通过redis-cli客户端和redis服务器交互,涉及到很多的redis命令,redis的命令非常多,我们需要多练习常用的命令,以及学会使用redis的文档。 一、get和set命令(最核心的命令) Redis中最核心的两个命令&…...
网络安全技术文档
网络安全技术文档 1. 概述 网络安全是指通过技术手段和管理措施,保护网络系统的硬件、软件及其数据不受偶然或恶意破坏、更改、泄露,确保系统连续可靠运行,网络服务不中断。 2. 常见网络威胁 2.1 攻击类型 DDoS攻击:分布式拒…...
微前端随笔
✨ single-spa: js-entry 通过es-module 或 umd 动态插入 js 脚本 ,在主应用中发送请求,来获取子应用的包, 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…...
【36期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股当天逐笔大单交易数据及接口API说明文档
在量化分析领域,实时且准确的数据接口是成功的基石。经过多次实际测试,我将已确认可用的数据接口分享给正在从事量化分析的朋友们,希望能够对你们的研究和工作有所帮助,接下来我会用Python、JavaScript(Node.js&…...
C++中的浅拷贝和深拷贝
浅拷贝只是将变量的值赋予给另外一个变量,在遇到指针类型时,浅拷贝只会把当前指针的值,也就是该指针指向的地址赋予给另外一个指针,二者指向相同的地址; 深拷贝在遇到指针类型时,会先将当前指针指向地址包…...
二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度…...
GitHub 趋势日报 (2025年04月01日)
GitHub 趋势日报 (2025年04月01日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1punkpeye/awesome-mcp-serversA collection of MCP servers.⭐ 3280未指定2th-ch/youtube-musicYouTu…...
Java的SeleniumChromeDriver的常用方法
启动和关闭浏览器: driver.get(url):打开指定的URL。driver.quit():关闭浏览器并结束ChromeDriver会话。 元素定位: driver.findElement(By.id("elementId")):通过元素的ID定位。driver.findElement(By.cl…...
字符串、列表、元组、字典
字符串 双引号或者单引号中的数据,就是字符串 字符串输入 之前在学习input的时候,通过它能够完成从键盘获取数据,然后保存到指定的变量中; 注意:input获取的数据,都以字符串的方式进行保存,即…...
【GEE学习笔记】报错解决:“Image.select: Band pattern ‘QA60‘ did not match any bands”
【GEE学习笔记】报错解决:“Image.select: Band pattern ‘QA60’ did not match any bands” 【GEE学习笔记】报错解决:“Image.select: Band pattern ‘QA60’ did not match any bands” 文章目录 【GEE学习笔记】报错解决:“Image.selec…...
AI可以赋能的三农产品、机械与服务
三农赛道涵盖农业、农村和农民相关的产品与服务,涉及农资、农业机械、智能设备、农产品加工及数字化服务等多个领域。随着人工智能(AI)技术的飞速发展,AI正在通过赋能农业的生产、管理、销售等各个环节,推动传统农业向…...
ngx_timezone_update
定义在 src\os\unix\ngx_time.c void ngx_timezone_update(void) { #if (NGX_FREEBSD)if (getenv("TZ")) {return;}putenv("TZUTC");tzset();unsetenv("TZ");tzset();#elif (NGX_LINUX)time_t s;struct tm *t;char buf[4];s tim…...
车载诊断架构 --- 整车重启先后顺序带来的思考
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
GESP C++三级 知识点讲解
C编程三级标准 (一)知识点详述 (1)了解二进制数据编码:原码、反码、补码。 (2)掌握数据的进制转换:二进制、八进制、十进制、十六进制。 (3)掌握位运算:与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)的基本使用方法及原理。 (4)了解算法的概念与描述&…...
前端 vs 后端:技术分工详解——从用户界面到系统逻辑的全解析
前端(Frontend) 和 后端(Backend) 是软件开发中两个核心概念,分别对应用户直接交互的部分和系统背后的逻辑处理部分。它们共同构成完整的应用程序,但分工不同。 目录 一、前端(Frontend…...
Redis 除了数据类型外的核心功能 的详细说明,包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结
以下是 Redis 除了数据类型外的核心功能 的详细说明,包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结: 1. Redis 事务(Transactions) 功能描述 事务通过 MULTI 和 EXEC 命令将一组命令打包执行,保证…...
JavaScript智能对话机器人——企业知识库自动化
引言 内部知识管理常面临信息分散、查找困难的问题。本文将使用Node.js和虎跃办公的智能对话API,构建企业级知识问答机器人,支持自然语言查询和自动学习。 核心技术 自然语言处理(NLP)意图识别机器学习模型微调REST API集成 代…...
JS实现AES和DES
目录 目标 概述 DES AES 实战 JS实现DES JS实现AES 目标 了解AES和DES的特点并用JS实现。 概述 DES 翻译过来叫数据加密标准。它有5种加密模式(CTR、OFB、CFB、CBC、ECB),在JS中,不同加密模式语法结构几乎一致,…...
【C++11(下)】—— 我与C++的不解之缘(三十二)
前言 随着 C11 的引入,现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式(Lambda Expression),它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用,可以…...
Windows 10/11系统优化工具
家庭或工作电脑使用时间久了,会出现各种各样问题,今天给大家推荐一款专为Windows 10/11系统设计的全能优化工具,该软件集成了超过40项专业级实用程序,可针对系统性能进行深度优化、精准调校、全面清理、加速响应及故障修复。通过系…...
浅谈在HTTP中GET与POST的区别
从 HTTP 报文来看: GET请求方式将请求信息放在 URL 后面,请求信息和 URL 之间以 ?隔开,请求信息的格式为键值对,这种请求方式将请求信息直接暴露在 URL 中,安全性比较低。另外从报文结构上来看,…...
LightRAG实战:轻松构建知识图谱,破解传统RAG多跳推理难题
作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 2025防失业预警:不会用DeepSeek-RAG建知识库的人正在被淘汰_deepseek-embedding-CSDN博客 从PDF到精准答案:Coze…...
C++多线程编码二
1.lock和try_lock lock是一个函数模板,可以支持多个锁对象同时锁定同一个,如果其中一个锁对象没有锁住,lock函数会把已经锁定的对象解锁并进入阻塞,直到多个锁锁定一个对象。 try_lock也是一个函数模板,尝试对多个锁…...
