title: 内网渗透之Windows认证(二)

categories:

  • 内网渗透

    id: 6

    key: 域渗透基础

    description: Windows认证协议

    abbrlink: d6b7

    date: 2022-06-26 14:01:22

  • 为什么有这篇文章呢,因为我们知道平常的Web系统有注册、登录是依赖数据库和后端的加密解密算法。那么Windows系统登录的时候是如何进行身份验证的呢,是否也有一个类似数据库的东西,或者就是一个单纯的文本呢?
  • 参考--Windows内网协议学习NTLM篇之NTLM基础介绍
  • Windows也有一个类似于数据的东西,存放在%SystemRoot%\system32\config\sam,里面存放着用户的凭证信息,当然这肯定不是明文,不然Windows这么写也太不安全了。这里的加密算法不同于常见的MD5,加密后的数据有两种分别为LM HashNTLM Hash

LM Hash

  • LM Hash全称LAN Manager Hash,由IBM设计一般用于Windows XPWindows 2000Windows 2003 这一类系统中。加密算法如下。
  • 密码长度不能超过14个字符。
  • 密码转换为大写,再转换成16进制的字符串,没有28位长度的,在右边加0。
  • 再将十六进制的字符串分为两组14位的字符串。
  • 再将这两组14位的字符串进行十六进制转二进制,转换完成后不满足56位的在左边加0。
  • 两部分分别划分为每组七位,在其末尾加0,再分别转换为十六进制。
  • 最后将这两组数据作为DES加密所需的Key,KGS!@#$%作为需加密的字符,将DES加密后的数据依次拼接。
  • 这里借用zjun的脚本。
import binascii
import codecs
from pyDes import * def DesEncrypt(str, Key):
k = des(Key, ECB, pad=None)
EncryptStr = k.encrypt(str)
return binascii.b2a_hex(EncryptStr) def ZeroPadding(str):
b = []
l = len(str)
num = 0
for n in range(l):
if (num < 8) and n % 7 == 0:
b.append(str[n:n + 7] + '0')
num = num + 1
return ''.join(b) if __name__ == "__main__":
passwd = sys.argv[1]
print('你的输入是:', passwd)
print('转化为大写:', passwd.upper()) # 用户的密码转换为大写,并转换为 16 进制字符串
passwd = codecs.encode(passwd.upper().encode(), 'hex_codec')
print('转为 hex:', passwd.decode()) # 密码不足 28 位,用 0 在右边补全
passwd_len = len(passwd)
if passwd_len < 28:
passwd = passwd.decode().ljust(28, '0')
print('补齐 28 位:', passwd) # 28 位的密码被分成两个 14 位部分
PartOne = passwd[0:14]
PartTwo = passwd[14:]
print('两组 14 位的部分:', PartOne, PartTwo) # 每部分分别转换成比特流,并且长度为 56 位,长度不足用 0 在左边补齐长度
PartOne = bin(int(PartOne, 16)).lstrip('0b').rjust(56, '0')
PartTwo = bin(int(PartTwo, 16)).lstrip('0b').rjust(56, '0')
print('两组 56 位比特流:', PartOne, PartTwo) # 两组分别再分为 7 位一组末尾加 0,再分别组合成新的字符
PartOne = ZeroPadding(PartOne)
PartTwo = ZeroPadding(PartTwo)
print('两组再 7 位一组末尾加 0:', PartOne, PartTwo) # 两组数据转 hex
PartOne = hex(int(PartOne, 2))[2:]
PartTwo = hex(int(PartTwo, 2))[2:]
if '0' == PartTwo:
PartTwo = "0000000000000000"
print('两组转为 hex:', PartOne, PartTwo) # 16 位的二组数据,分别作为 DES key 为"KGS!@#$%"进行加密。
LMOne = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartOne)).decode()
LMTwo = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartTwo)).decode()
print('两组 DES 加密结果:', LMOne, LMTwo) # 将二组 DES 加密后的编码拼接,得到 LM HASH 值。
LM = LMOne + LMTwo
print('LM hash:', LM)

  • 可以看出密码长度小于7时,后面加密的数据是固定的,均为aad3b435b51404ee,因此其加密是不安全的。

NTML Hash

  • NTML Hash全称NT LAN Manager , 目前 Windows 基本都使用 NTLM hash ,一个32位长度的字符串。支持Net NTLM认证协议及本地认证过程中的关键凭据。加密算法如下:
  • 密码转换为十六进制
  • Unicode编码
  • MD4加密
  • Python脚本如下:
import hashlib
import binascii
import sys print(binascii.hexlify(hashlib.new("md4", sys.argv[1].encode("utf-16le")).digest()).decode())

  • 123456经过加密后则为32ed87bdb5fdc5e9cba88547376818d4

Windows本地认证

  • winlogon.exe -> 接收用户密码 -> lsass.exe -> 比对sam表。
  • winlogon就是登陆界面,接受用户密码之后会发送明文到lsass.exelsass.exe会存储一份明文,然后加密明文和sam表的hash做比对,判断是否可以登陆。
  • Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。
  • 这里注意如果打了补丁KB2871997,或者机器是win2012之后,则不会保存明文密码了。

NTLM认证协议

  • 什么是NTLM认证协议呢?和NTLM Hash又有什么区别呢?NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。NTLM 网络认证协议是以 NTLM Hash 作为根本凭证进行认证的协议。
  • 在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式, 没有信托机构。
  • 假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。
  • 早期SMB协议在网络上传输明文口令。后来出现LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解,现在又有了NTLM以及Kerberos
  • 认证流程分为三部分,分别是:协商质询身份验证

协商

  • 客户端向服务器发送协商请求,包含用户名、密码、认证协议版本等信息。

质询

  • 服务器接收到客户端发送到协商信息,这时服务器会生成一个随机数,叫做challenge,这里的不同的协议随机数长度不同,NTLM V1是8位,NTLM V2是16位。
  • 服务器将登陆的用户对应的NTLM Hash加密challenge,得到Net NTLM Hash,和生成的challenge一起发送给客户端。

验证

  • 客户端收到challenge后,将用户的hash与challenge进行加密运算得到resposne,将username、response、challenge发送给服务器,最后服务器进行校验返回认证结果。

WireShark

  • 知道了基本原理自己实战试试

内网渗透之Windows认证(二)的更多相关文章

  1. 7.内网渗透之windows认证机制

    文章参考自三好学生域渗透系列文章 看了内网渗透第五篇文章,发现如果想要真正了解PTT,PTH攻击流程,还需要了解windows的认证机制,包括域内的kerberos协议. windows认证机制 在域 ...

  2. 内网渗透 - 提权 - Windows

    MS提权 MS16- MS16- 提权框架 Sherlock 信息收集 ifconfig -a cat /etc/hosts arp -a route -n cat /proc/net/* ping扫 ...

  3. 内网渗透测试思路-FREEBUF

    (在拿到webshell的时候,想办法获取系统信息拿到系统权限) 一.通过常规web渗透,已经拿到webshell.那么接下来作重要的就是探测系统信息,提权,针对windows想办法开启远程桌面连接, ...

  4. 5.内网渗透之PTH&PTT&PTK

    ---------------------------------------------- 本文参考自三好学生-域渗透系列文章 内网渗透之PTH&PTT&PTK PTH(pass-t ...

  5. 3.内网渗透之reGeorg+Proxifier

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxIAAAE2CAIAAAB6BDOVAAAgAElEQVR4Aey9Z5Aex3X327MRGVzkRH ...

  6. cmseasy&内网渗透 Writeup

    某CTF内网渗透 题目:www.whalwl.site:8021 目录 cmseasy 内网横向渗透 cmseasy 简单看一下网站架构 Apache/2.4.7 (Ubuntu) PHP/5.5.9 ...

  7. Linux内网渗透

    Linux虽然没有域环境,但是当我们拿到一台Linux 系统权限,难道只进行一下提权,捕获一下敏感信息就结束了吗?显然不只是这样的.本片文章将从拿到一个Linux shell开始,介绍Linux内网渗 ...

  8. [原创]K8 Cscan 3.6大型内网渗透自定义扫描器

    前言:无论内网还是外网渗透信息收集都是非常关键,信息收集越多越准确渗透的成功率就越高但成功率还受到漏洞影响,漏洞受时效性影响,对于大型内网扫描速度直接影响着成功率漏洞时效性1-2天,扫描内网或外网需1 ...

  9. [源码]Python简易http服务器(内网渗透大文件传输含下载命令)

    Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...

随机推荐

  1. html5 tts(文字朗读)

    在 chrome 下使用比较好的中文语音包. 注意 speechSynthesis.getVoices() 有时候可能会返回空数组,需要做验证 var zhCnLangs = speechSynthe ...

  2. SQL中常用的字符串LEFT函数和RIGHT函数详解!

    今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...

  3. 使用 oh-my-posh 美化 windows terminal,让其接近oh-my-zsh

    本文旨在快速让你进行美化,少踩一些坑,原文出自我的博客:prettier-windows-terminal-with-oh-my-posh 为了同 iterm2 下的 oh-my-zsh 保持基本一致 ...

  4. IDEA初始化基础配置

    0.前言 这篇博客是给认识的那帮新手搞的,刚进入IT行业的崽们 这个东西配置好了,也可以选择弄成在线文档,下一次安装IDEA时,有一个import导入配置,然后就可以自己配置好了( 虽然方便,但不建议 ...

  5. 服务器安装mysql遇到的坑

    服务器安装mysql遇到的坑 一.CentOS7安装MySQL 1.下载:MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mys ...

  6. MathType7安装使用及please restart word to load mathtype addin properly的问题

    MathType7安装使用及please restart word to load mathtype addin properly的问题.最近在自己的电脑上安装Mathtype7,把遇到的问题和解决办 ...

  7. CF908D New Year and Arbitrary Arrangement 题解

    \(0.\) 前言 有一天 \(Au\) 爷讲期望都见到了此题,通过写题解来加深理解. \(1.\) 题意 将初始为空的序列的末尾给定概率添加 \(a\) 或 \(b\),当至少有 \(k\) 对 \ ...

  8. 技术分享 | Appium 用例录制

    原文链接 下载及安装 下载地址: https://github.com/appium/appium-desktop/releases 下载对应系统的 Appium 版本,安装完成之后,点击 " ...

  9. zabbix主动式和被动式

    推荐: zabbix我们使用主动式,主动式的话,可以把压力都分散到agent上,压力小. 1: zabbix主动式和被动式是相对于agent来说的. zabbix server去获取zabbix ag ...

  10. Java递归实现评论多级回复

    最近工作需要做一个评论功能,除了展示评论之外,还需要展示评论回复,评论的回复的回复,这里就用到了递归实现评论的多级回复. 评论实体 数据库存储字段: id 评论id.parent_id 回复评论id. ...