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 ...

  10. MSF 内网渗透笔记

    进入meterpreter模式 在meterpreter中输入shell即可进入CMD窗口接着即可执行CMD命令,例如打开RDP服务REG ADD HKLM\SYSTEM\CurrentControl ...

随机推荐

  1. C++:对象数组

    对象数组 对象数组:每一个数组元素都是对象的数组,也就是说,若一个类有若干个对象,我们把这 一系列的对象用一个数组来存放.对应数组元素是对象,不仅具有的数据成员,而且还有函数 成员. @定义一个一维数 ...

  2. Java 泛型数组

    Java 不支持泛型数组.也就是说, List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 List<String ...

  3. Java ArrayList、Vector和LinkedList等的差别与用法(转)

    Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...

  4. 【图文】如何在centos上安装tomcat

    先到tomcat官网下载安装包(随便下载你想要的版本) 假设你现在使用的是windows系统 那么就把你下载来的压缩包解压,放到一个目录中 在你本地的windows系统中安装个xshell和xftp ...

  5. 记录一次MyEclipse打开jsp文件出现Error的解决办法

    今天正在忙着写项目,在打开一个项目内的jsp文件时发现我亲爱的代码消失了. 最后从网上找到了解决办法,希望可以帮到有需要的人,也作为个人记录 第一步:找到安装路径MyEclipse\configura ...

  6. Luogu P4768 [NOI2018]归程

    题目链接 \(Click\) \(Here\) \(Kruskal\)重构树的好题.想到的话就很好写,想不到乱搞的难度反而相当高. 按照点的水位,建出来满足小根队性质的\(Kruskal\)重构树,这 ...

  7. 20155219付颖卓《网络对抗》逆向及Bof基础

    实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...

  8. ZOJ2412 Farm Irrigation(农田灌溉) 搜索

    Farm Irrigation Time Limit: 2 Seconds      Memory Limit: 65536 KB Benny has a spacious farm land to ...

  9. vue注册全局属性

    例:统一引用getSpiderToken方法 main.js中相关代码 import { getSpiderToken } from '../static/js/storage' Vue.protot ...

  10. linux中通过awk进行文本的对齐格式化处理?awk printf左对齐?

    需求描述: 今天在对一个从excel文件中粘出来的内容进行整理的时候,发现格式很乱,就想用awk工具格式化一下,在此记录一下. 操作过程: 1.从excel中复制出来的内容 job_name    j ...