草庐IT

内网渗透之Windows认证(二)

Pan3a 2023-03-28 原文
  • 为什么有这篇文章呢,因为我们知道平常的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. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  6. ruby - token 认证 - 2

    简单代码require'net/http'url=URI.parse('getjson/otherdatahere[link]')req=Net::HTTP::Get.new(url.to_s)res=Net::HTTP.start(url.host,url.port){|http|http.request(req)}putsres.body只是想知道如何在phpcURL中放置身份验证token,我是这样做的    curl_setopt($ch,CURLOPT_HTTPHEADER,array('Authorization:Bearerxxx'));//Bearertokenfora

  7. ruby - HTTParty 摘要认证 - 2

    谁能提供一个使用HTTParty和digestauth的例子?我在网上找不到例子,希望有人能提供一些帮助。谢谢。 最佳答案 您可以在定义类时使用digest_auth方法设置用户名和密码classFooincludeHTTPartydigest_auth'username','password'end 关于ruby-HTTParty摘要认证,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questi

  8. ruby - 错误 : Failed to build gem native extension on Windows - 2

    我在安装“redcarpet”gem时遇到以下错误。它在我friend的机器上安装没有问题。(我想安装它来运行yard)ruby版本:1.9.3命令输出:D:\Learning\Common_POM_FW\SampleProjects>yard[error]:Missing'redcarpet'gemforMarkdownformatting.Installitwith`geminstallredcarpet`D:\Learning\Common_POM_FW\SampleProjects>geminstallredcarpetTemporarilyenhancingPATHtoinc

  9. python - 这些脚本语言中哪种更适合渗透测试? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion首先,我想避免一场关于语言的口水战。可供选择的语言有Perl、Python和Ruby。我想提一下,我对所有这些都很满意,但问题是我不能只专注于一个。例如,如果我看到一个很棒的Perl模块,我必须尝试一下。如果我看到一个不错的Python应用程序,我必须知道它是如何制作的。如果我看到RubyDSL或一些Ruby巫术,我就会迷上Ruby一段时间。目前我是一名Java开发人员,但计划在不久的将来

  10. ruby - 从 Ruby 连接到适用于 Windows Phone 8 的 Microsoft 推送通知服务 - 2

    我们正在开发一个需要推送通知的WP8应用程序。为了测试它,我们使用CURL命令行运行推送通知POST请求,确保它实际连接,使用客户端SSL证书进行身份验证并发送正确的数据。我们确实知道,当我们收到对设备的推送时,这项工作是有效的。这是我们一直用于测试目的的CURL命令:curl--certclient_cert.pem-v-H"Content-Type:text/xml"-H"X-WindowsPhone-Target:Toast"-H"X-NotificationClass:2"-XPOST-d"MytitleMysubtitle"https://db3.notify.live.ne

随机推荐