Windows内网知识大纲
前言
现在网上内网渗透、域渗透文章很多,大多数人只知道如何进行操作获取全新,不知使用该技术的原理和该技术操作影响Windows何种功能,Windows何种机制对内网渗透产生的影响。本文按照数个Windows系统的功能进行讲解,完善内网渗透知识结构。
目录
[TOC]
概念
SID
安全标识符(security identifier)用于唯一标识安全主体或安全组。安全主体可以表示任何可由操作系统进行安全身份验证的主体,例如用户账户、计算机账户或在用户或计算机账户的安全上下文中运行的线程或进程
wmic useraccount get name,sid
SPN
是什么
SPN(ServicePrincipal Names)服务主体名称,是服务实例(比如:HTTP、SMB、MySQL等服务)的唯一标识符。
如果在计算机的整个目录林上安装多个服务实例,那么每个实例都必须有自己的 SPN。 如果客户可以使用多个名称进行身份验证,则一个服务实例可以有多个 SPN。
Kerberos认证过程使用SPN将服务实例与服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户。在内网中,SPN扫描通过查询向域控服务器执行服务发现。这对于红队而言,可以帮助他们识别正在运行重要服务的主机,如终端,交换机等。SPN的识别是kerberoasting攻击的第一步。
例子
当某用户需要访问MySQL服务时,系统会以当前用户的身份向域控查询SPN为MySQL的记录。当找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC。KDC中的TGS服务对TGT进行解密。确认无误后,由TGS将一张允许访问该SPN所对应的服务的ST服务票据和该SPN所对应的服务的地址发送给用户,用户使用该票据即可访问MySQL服务。
类型
一种是注册在活动目录的机器帐户(Computers)下,当一个服务的权限为 Local System 或 Network Service,则SPN注册在机器帐户(Computers)下。域中的每个机器都会有注册两个2.SPN:HOST/主机名 和 HOST/主机名.xie.com
另一种是注册在活动目录的域用户帐户(Users)下,当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下。
格式
SPN格式:<service class>/<host>:<port>/<service name>
<service class>:标识服务类的字符串,可以理解为服务的名称,常见的有WWW、MySQL、SMTP、MSSQL等;必须元素
<host>:服务所在主机名,host有两种形式,FQDN(win7.xie.com)和NetBIOS(win7)名;必须元素
<port>:服务端口,如果服务运行在默认端口上,则端口号(port)可以省略;额外元素
<service name>:服务名称,可以省略;额外元素
一些服务的SPN示例:
#Exchange服务
exchangeMDB/ex01.xie.com
#RDP服务
TERMSERV/te01.xie.com
#WSMan/WinRM/PSRemoting服务
WSMAN/ws01.xie.com
SPN发现
windows系统自带的setspn可以查询域内的SPN。
查看当前域内所有的SPN:setspn -Q */*
查看指定域xie.com注册的SPN:setspn -T xie.com -Q */* 如果指定域不存在,则默认切换到查找本域的SPN
查找本域内重复的SPN:setspn -X
删除指定SPN:setspn -D MySQL/win7.xie.com:1433/MSSQL hack
查找指定用户/主机名注册的SPN:setspn -L username/hostname
PowerShell-AD-Recon:
该工具包提供了一些探测指定SPN的脚本,例如Exchange,Microsoft SQLServer,Terminal等
#Discover-PSMSSQLServers.ps1的使用,扫描MSSQL服务 Import-Module .\Discover-PSMSSQLServers.ps1;Discover-PSMSSQLServers #Discover-PSMSExchangeServers.ps1的使用,扫描Exchange服务 Import-Module .\Discover-PSMSExchangeServers.ps1;Discover-PSMSExchangeServers #扫描域中所有的SPN信息 Import-Module .\Discover-PSInterestingServices.ps1;Discover-PSInterestingServices
GetUserSPNs.ps1:
GetUserSPNs 是 Kerberoast 工具集中的一个 powershell 脚本,用来查询域内用户注册的 SPN。
Import-Module .\GetUserSPNs.ps1
GetUserSPNs.vbs:
GetUserSPNs 是 Kerberoast 工具集中的一个 vbs 脚本,用来查询域内用户注册的 SPN。
cscript .\GetUserSPNs.vbs
PowerView.ps1:
PowerView是 PowerSpolit 中 Recon目录下的一个powershell脚本,PowerView 相对于上面几种是根据不同用户的 objectsid 来返回,返回的信息更加详细。
Import-Module .\PowerView.ps1
Get-NetUser -SPN
PowerShellery:
PowerShellery下有各种各样针对服务SPN探测的脚本。其中一些需要PowerShell v2.0的环境,还有一些则需要PowerShell v3.0环境。
#Powershellery/Stable-ish/Get-SPN/ 下Get-SPN.psm1脚本的使用,需要powershell3.0及以上版本才能使用
Import-Module .\Get-SPN.psm1
Get-SPN -type service -search "*"
Get-SPN -type service -search "*" -List yes | Format-Table
#Powershellery/Stable-ish/ADS/ 下Get-DomainSpn.psm1脚本的使用
Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn
组
https://cloud.tencent.com/developer/article/1937695
用户
Active Directory 有两种形式的常见安全主体:用户帐户和计算机帐户。
域用户账户是在域内全局组 Domain Users 组中,本地用户账户在本地 User 组中。==当计算机加入域时,会把 Domain Users 组添加到本地的 User 组中==。因此域用户可以在域中的任何一台计算机上登录。
即机器账号、计算机账号,所有加入域的主机都会有一个机器用户,用户名为机器名加$
,如:WIN7$
、WINXP$
。在域环境中,==普通域用户最多可以创建 10 个计算机账户,但是本地账号不能创建计算机账户==。
本地用户 SYSTEM 就对应于域内的机器用户,在域内的用户名就是机器名加$
,比如 WIN7,他的机器名是 WIN7,那么他在域内登录的用户名就是WIN7$
。当我们拿下一台内网主机后,发现没有域内用户,这个时候我们将当前用户提升到 SYSTEM,就可以在域内充当机器用户了。
每个用户账户拥有唯一的安全标识符SID,用来记录用户的权限
用户ID
- Administrator的用户ID:500
- 普通用户的用户ID:1000开始
OU
OU,即组织单位(Organization Unit),将域中的对象组织成==逻辑组==,帮助网络管理员简化管理组。
组织单位包含下列类型的对象:用户,计算机,工作组,打印机,安全策略以及其他组织单位等。可以在组织单位基础上部署组策略,统一管理组织单位中的域对象。 在企业域环境里面,我们经常可以看到按照部门划分的一个个 OU
管理员可以将组策略应用于 OU,然后系统将其下推到 OU 中的所有计算机
组织单位跟组是两个完全不同的概念。OU 是管理对象的集合,而组是权限的集合。举个前面举过的例子,运维需要对公司的网络进行管理,需要一些特殊的管理权限,我们就可以设置个组,对这个组配置权限,然后再将运维拉进这个组里面,这样组里面的运维就拥有了该组的权限。又比如我们需要对财务部里面的用户进行统一管理,那我们便可以设置个 OU,然后把财务部的用户拉进这个 OU,这样就可以对财务部里面的用户进行集中管理,比如下发组策略等。
安全组
在域环境中,并不建议直接给某个用户赋予特定的权限,而是通过一个域用户组,对这个域用户组赋予一个组权限,然后再将该用户拉进这个域用户组中,这样该用户便有了这个域用户组的权限。
按照用途分类,域组分为通讯组和安全组。
对于通讯组,我们接触的比较多的就是邮件组,将若干个人划分到一个通讯组,给这个通讯组发件,那组内用户都能收到。
组类型 | 作用范围 | 可包含的成员 | 成员是否在全局编录复制 |
---|---|---|---|
域本地组 | 在同一个域内,本域内。 | 来自任何域或任何受信任域的帐户。 来自任何域或任何受信任域的全局组。 来自同一林中任何域的通用组。 来自同一域的其他域本地组。 | 否 |
通用组 | 所有域。 | 来自同一林中任何域的帐户。 来自同一林中任何域的全局组。 来自同一林中任何域的其他通用组。 | 是 |
全局组 | 所有域。 | 来自同一域的帐户。 来自同一域的其他全局组。 | 否 |
组的==作用域==是相对于域林的概念。每个安全组和通信组均有作用域,该作用域标识组在域树或树林中应用的范围。
安全组可以按照其作用范围划分为:
-
全局组(Global Group)
在单域中适用域本地组,在域林中适用通用组。而全局组则是一个介于二者中间一个组,它可以在域林中使用,但是只能包含本域内的账户。全局组的使用范围是本域以及受信任关系的其他域。全局组只能包含本域内的用户账户,因此来自一个域的账户不能嵌套在另一个域中的全局组中。但是可以将本域内某个全局组添加或嵌套到同一个域的另一个全局组中,或者添加到其他域的通用组和域本地组中。
常见全局组:
- Domain Admins,管理员组,该组的成员在所有加入域的服务器、域控制器和活动目录中均默认拥有完整的管理员权限。因为该组会被添加到自己所在域的 Administrators 组中,因此可以继承 Administrators 组的所有权限。同时,该组默认会被添加到每台域成员计算机的本地 Administrators 组中,这样,Domain Admins 组就获得了域中所有计算机的所有权。如果希望某用户成为域系统管理员,建议将该用户添加到 Domain Admins 组中,而不要直接将该用户添加到 Administrators 组中。
- Domain Users,域用户组,该组的成员中是所有的域用户。在默认情况下,任何由我们建立的更户账号都属于 Domain Users 组。因此,如果想让所有的账号都获得某种资源在取权限、可以将该权限指定给域用户组,或者让域用户组属于具有该权限的组。
- Domain Computers,域成员主机组,该组的成员是域内所有的域成员主机,任何由我们建立的计算机账号都属于 Domain Computers 组。
- Domain Controllers,域控制器组,该组成员包含了域内所有的域控制器。
- Domain Guests,域访客用户组,该组内的成员默认为域访客用户,域成员计算机会自动将此组加到本地的 Guests 组中。
- Group Policy Creator Owners:此组成员可以修改域的组策略。
- DnsUpdateProxy:此组成员允许替其他客户端(如DHCP服务器)执行动态更新的 DNS 客户端。
- Read-only Domain Controllers:此组中的成员是域中的只读域控制器
-
通用组(Universal Group)
通用组的成员可包括域林中任何域的用户账号、全局组和其他通用组,可以在该域林的任何域中指派权限,可以嵌套在其他组中,非常适合在域森林内的跨域访问中使用。
常见通用组:
-
==Enterprise Admins==:企业系统管理员组,改组是域森林根域中的一个组。Enterprise Admins 组在域森林中的每个域内都是 Administrators 组的成员,因此对所有域控制器都有完全访问控制权。
-
Schema Admins:架构管理员组,是域森林根域中的一个组,可以修改活动目录和域森林的模式。Schema Admins 组是为活动目录和域控制器提供完整权限的域用户组,因此,该组成员的资格是非常重要的。
通用组的成员保存在全局编录服务器(GC)中而不是保存在各自的域控制器中,任何变化都会导致全林复制。
全局编录通常用于存储一些不经常发生变化的信息。由于用户账号信息是经常变化的,建议不要直接将用户账号添加到通用组中,而要先将用户账号添加到全局组中,再把这些相对稳定的全局组添加到通用组中。
-
-
域本地组(Domain Local Group)
域本地组主要用于本域内资源的访问权限,不适用于林,但可以包含域林内任何一个域的账户、通用组和全局组,也可以包含相同域内的域本地组,但无法包含其他域内的域本地组。
系统常见的域本地组:
-
Administrators:管理员组,改该组的成员可以不受限制地存取计算机/域的资源。不仅是最具有权限的一个组,也是在活动目录和域控制器中默认具有管理员权限的组,是域森林中强大的服务管理组。
-
Remote Desktop Users:远程登录组,处于远程登录组中的用户才有权限使用远程登录服务。
-
Print Operators:打印机操作员组,位于该组内的成员可以管理网络中的打印机,包括建立、管理和删除网络打印机,并可以在本地登录和关闭域控制器。
-
==Account Operators:账号操作员组,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器,但是,不能更改属于 Administrators 或 Domain Admins 组的账户,也不能修改这些组。在默认情况下,该组中没有成员。对域内非域控的所有机器都具有GenericAll权限,可以利用基于资源的约束委派做本地提权,可以拿下域内除域控以外所有机器的system权限==
-
Server Operators:服务器操作员组,该组的成员可以管理域服务器,其权限包括建立/管理/删除任意服务器的共享目录、管理网络打印机、备份任何服务器的文件、格式化服务器硬盘、锁定服务器、变更服务器的系统时间、关闭域控制器等。在默认情况下,该组中没有成员。
-
BackupOperators,备份操作员组,改组的成员可以在域控制器中执行备份和还原操作,并可以在本地登录和关闭域控制器。在默认情况下,该组中没有成员。
-
组策略
组策略(Group Policy)是 Microsoft Windows 系统管理员为用户和计算机定义并控制程序、网络资源及操作系统行为的主要工具。通过使用组策略可以设置各种软件、计算机和用户策略。
使用组策略可以给同工作组的计算机或用户强加一套统一的标准,如用户的桌面环境,计算机启动,关机注销等所执行的脚本文件、软件分发、安全设置等。
组策略在部分意义上是控制用户可以或不能在计算机上做什么
生效顺序:
1、首先应用本地组策略。
2、如果有站点组策略,则应用之。
3、然后应用域组策略。
4、如果计算机或用户属于某个 OU, 则应用 OU 上的组策略。
5、如果计算机或用户属于某个 OU 的子 OU, 则应用子 OU 上的组策略一
6、如果同个容器下链接了多个组策略对象,则按照链接顺序逐个应用。
因为域控的本地组策略是 OU 策略,所以它会覆盖域策略的设定,最终生效的是 OU 上的策略。 (即如果我们在域控的本地组策略设置了密码复杂度要求,然后又在域组策略上禁止了密码复杂度要求。 那么最终起效果的将会是域控的本地策略。)
常见的域下,我们一般只有本地组策略和域组策略。因此当他们冲突时,就是域策略起效。
密码hash
Hash
Windows系统为了保证用户明文密码不会被泄漏,将明文密码转换为Hash值进行身份验证,被保存在SAM或ntds.dit中。
Hash背景
1.LM Hash(LAN Manager),在早期的Windows操作系统中将明文密码转换为LM Hash保存在SAM文件中,因为LM Hash使用DES加密,密钥为硬编码,算法又存在缺陷,所以被废弃,为了保证系统兼容性可以自行开启。
2.NTLM Hash(NT LAN Manager),在LM Hash算法被弃用时,NTLM Hash被用来进行Windows本地及远程身份验证的凭据,长度为32bit、由数字和字母组成。
Hash示例
冒号前半段为LM Hash,冒号后半段为NTLM Hash aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42 net-NTLM Hash:
admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030
Hash产生:
1.LM Hash:
admin1-ADMIN1(将密码转换为大写字母 )
ADMIN1-41444d494e31(16进制转换)
41444d494e31-41444d494e310000000000000000(密码未到7位,在末尾补0,填充为14个字符,补16个0)
41444d494e3100 00000000000000(分为两组,各转换为2进制)
1000001010001000100110101001001010011100011000100000000(长度不足56bit,左侧补0)
01000001010001000100110101001001010011100011000100000000(再分为7bit一组,后加0)
0100000 0
1010001 0
0001001 0
1010100 0
1001010 0
0111000 0
1100010 0
0000000 0
0100000010100010000100101010100010010100011100001100010000000000-40A212A89470C400(转换为16进制)
0000000000000000
将上面两组数字des加密
KGS!@#$%-4b47532140232425(KGS!@#$%为LM Hash加密时DES加密的硬编码,转换为16进制) 6C734076E7B827BFAAD3B435B51404EE(将两组des加密后的密文组合,得到LM Hash)
注:如果密码不超过7字节,后面的一半是固定的,都为0,安全性降低,所以被弃用。
2.NTLM Hash:
1.hex(16进制编码)
2.Unicode编码 3.md4加密
admin1-61646d696e31(将明文转换为16进制编码)
61646d696e31-610064006d0069006e003100(ASCII转Unicode)
610064006d0069006e003100-74561893ea1e32f1fab1691c56f6c7a5(md4加密得到NTLM Hash)
认证过程
NTLM验证是一种==Challenge/Response== 验证机制,由三种消息组成:通常称为type 1(协商),类型type 2(质询)和type 3(身份验证)。
它基本上是这样工作的:
- 用户登录客户端电脑
- (type 1)客户端向服务器发送type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表。
- (type 2)服务器用type 2消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的Challenge。
- (type 3)客户端用type 3消息(身份验证)回复质询。用户接收到步骤3中的challenge之后,==使用用户hash与challenge进行加密运算得到response==,将response,username,challeng发给服务器。消息中的response是最关键的部分,因为它们向服务器证明客户端用户已经知道帐户密码。
- 服务器拿到type 3之后,使用challenge和用户hash进行加密得到response2与type 3发来的response进行比较。如果用户hash是存储在域控里面的话,那么没有用户hash,也就没办法计算response2。也就没法验证。这个时候用户服务器就会通过netlogon协议联系域控,建立一个安全通道,然后将type 1,type 2,type3 全部发给域控(这个过程也叫作Pass Through Authentication认证流程)
- 域控使用challenge和用户hash进行加密得到response2,与type 3的response进行比较
hash传递攻击
hash传递攻击也叫pass the hash,简称PTH。
在type3计算response的时候,客户端是使用用户的hash进行计算的,而不是用户密码进行计算的。因此在模拟用户登录的时候。是不需要用户明文密码的,只需要用户hash。微软在2014年5月13日发布了针对Pass The Hash的更新补丁kb2871997,标题为"Update to fix the Pass-The-Hash Vulnerability"
,而在一周后却把标题改成了"Update to improve credentials protection and management"
。(事实上,这个补丁不仅能够缓解PTH,还能阻止mimikatz 抓取明文密码)。
- mimikatz
privilege::debug
sekurlsa::pth /user:win10 /domain:test.local /ntlm:6a6293bc0c56d7b9731e2d5506065e4a
- impacket
impacket底下执行远程命令执行的脚本有5个
psexec.py smbexec.py atexec.py wmiexec.py dcomexec.py
都支持使用hash进行远程命令执行,通过–hashes指定hash,以psexec.py为例
- cobalstrike
cabalstrike支持批量得进行pth,在==横向移动中撞密码hash中特别有效==
- Msf
msf的exploit/windows/smb/psexec_psh
模块是支持对一个网段进行pth的,在横向移动中撞密码hash中特别有效
获取Hash方法
1.使用卷影副本将SAM文件导出,配合SYSKEY利用mimikatz等工具获得NTLM Hash
2.使用mimikatz等工具读取lsass.exe进程,获取Hash
3.配合其他漏洞和手法获取net-NTLM Hash 4.net-NTLM Hash可以使用Responder或Inveigh等工具获取
破解Hash
- LM Hash 1.john –format=lm hash.txt 2.hashcat -m 3000 -a 3 hash.txt
- NTLM Hash 1.john –format=nt hash.txt 2.hashcat -m 1000 -a 3 hash.txt
- Net-NTLMv1 1.john –format=netntlm hash.txt 2.hashcat -m 5500 -a 3 hash.txt
- Net-NTLMv2 1.john –format=netntlmv2 hash.txt 2.hashcat -m 5600 -a 3 hash.txt
LSASS进程
lsass (Local Security Authority Subsystem Service)是一个 Windows 进程,负责处理操作系统的安全策略。例如,当您登录到 Windows 用户帐户或服务器时,lsass.exe 会验证登录名和密码。
SAM
SAM(安全账户管理器),SAM是用来==存储Windows操作系统密码==的数据库文件,为了避免明文密码泄漏,SAM文件中保存的是明文密码经过一系列算法处理过的Hash值,被保存的Hash分为LM Hash、NTLMHash。==在用户在本地或远程登陆系统时,会将Hash值与SAM文件中保存的Hash值进行对比==。在后期的Windows系统中,SAM文件中被保存的密码Hash都被密钥SYSKEY加密。
SAM文件在磁盘中的位置在C:\windows\system32\config\sam SAM文件在Windows系统启动后被系统锁定,无法进行移动和复制
SAM存放本地用户HASH。
- 提取SAM
mimikatz lsadump::sam
reg save HKLM\SYSTEM system.hiv
reg save HKLM\SAM sam.hiv
reg save HKLM\SECURITY security.hiv
NTDS.DIT
NTDS.DIT存放域内所有用户HASH。
- 提取NTDS.DIT
ntdsutil "ac i ntds" ifm "create full c:\\users\\tmp" q q
ntdsdumpex.exe -d "C:\Users\tmp\Active Directory\ntds.dit" -o hash.txt -s C:\Users\vagrant\Desktop\syste
NTLM
https://www.4hou.com/posts/RjgE
在Kerberos出现之前,NTLM被广泛应用于工作组和域环境,是更早的用于对用户进行身份验证的协议。
相比于Kerberos,NTLM的认证原理比较简单,主要通过对比客户端和服务端加密后的数据,判断其是否一致,以确定用户身份。
如果用做菜来比喻,那么被加密的数据就是“原材料”,加密密钥就是“秘方”,原理就是“用不同的秘方做出来的菜味道不一样”。当秘方只有客户端和服务端知道,服务端确定用户身份时,只需要用该秘方和客户端做同一盘菜,对比两盘菜的味道,如果一样,那就是真实的客户端。
NTLM 是一个过时的协议。与 Kerberos 相比,它的安全性和功能更少。
认证流程:
-
客户端向服务器发送HTTP请求,请求获得服务器资源,如访问邮件服务器资源
-
服务器由于开启了NTLM认证,所以返回401的错误码(未授权),提示需要NTLM认证
-
客户端发起NTLM认证,向服务器发送协商消息
-
服务器收到消息后,生成一个随机数Challenge,明文发送回客户端
-
客户端接收到Challenge后,使用密码hash对Challenge加密,生成Response并发送给服务器
-
服务器接收到Response后,会向DC(Domain Controller)发送针对客户端的验证请求,该请求主要包含以下三方面的内容:客户端用户名,客户端密码哈希值加密的Challenge和原始的Challenge
-
DC根据用户名获取该帐号的密码哈希值,对原始的Challenge进行加密。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。DC将验证结果发给服务器,并最终反馈给客户端
Kerberos
https://www.bilibili.com/video/BV1884y1H7aG
https://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html
https://juejin.cn/post/6844903955416219661
==Windows认证协议有两种NTLM(NT LAN Manager)和Kerberos==,前者主要应用于用于Windows NT 和 Windows 2000 Server(or Later) 工作组环境,而后者则主要应用于Windows 2000 Server(or Later) 域(Domain)环境。Kerberos较之NTLM更高效、更安全,同时认证过程也相对复杂。
Kerberos是一种网络认证协议,对个人通信以安全的手段进行身份认证。其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。 ==它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份==。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos实际上是一种==基于票据(Ticket)==的认证方式。客户端要访问服务器的资源,需要首先购买服务端认可的票据。也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场。在这之前,客户端需要先买票,但是这张票不能直接购买,需要一张认购权证。客户端在买票之前需要预先获得一张认购权证。这张认购权证和进入服务器的入场券均有KDC发售
协议内容
- AS:认证服务器
- KDC:密钥分发中心
- TGT:票据授权票据,票据的票据
- TGS:票据授权服务器
认证流程
https://daiker.gitbook.io/windows-protocol/kerberos Kerberos 篇
https://xz.aliyun.com/t/8187 内网渗透之kerberos协议分析
https://payloads.online/archivers/2018-11-30/1#0x02-kerberos%E5%9F%9F%E8%AE%A4%E8%AF%81 Kerberos域认证
认证流程包含三种角色:
1.Client(客户端)
2.Server(服务端)
3.KDC(也就是参与认证的域控制器)
4.AD(存储所有 client的白名单,只有存在于白名单的Client才能顺利申请到TGT)
5.AS(为Client生成TGT的服务)
6.TGS(为Client生成某个服务的 ticket)
7.Session Key(会话密钥,只有Client和TGS知道,在Kerberos认证中至关重要)
一、Client向KDC申请TGT
1.Client以明文方式将用户名、IP地址发送给AS请求TGT
2.KDC在ntds.dit中查找该账户
3.如果找到,KDC随机生成一个Session Key,此时AS向Client发送两条消息
(1)TGT(使用krbtgt NTLM Hash加密),内容包含:
User Name
Domain Name
组成员资格
TGS Name
时间戳
IP地址
TGT的生命周期
Session Key
(2)另一条消息(使用Client申请TGT时使用的用户名对应的NTLM Hash加密),内容包含:
TGS Name
时间戳
TGT的生命周期
Session Key
二.Client通过获得TGT向KDC申请用于访问Server的Ticket
1.Client向TGS发送三条消息
(1)Authenticator(使用Session Key加密),内容包含:
User Name
时间戳
需要访问的服务名称
(2)TGT
KDC使用Ktbtgt NTLM Hash对TGT解密,获取Client信息和Session Key 使用Session Key对Client发来对Authenticator信息解密,对比Client信息,相同则认证通过 TGS向Client发送两条消息
(1)TGS生成Client需要访问服务的Ticket发送给Client,Ticket使用目标服务帐户的NTLM Hash加密。
(2)使用Session Key加密的Server Session Key,内容包含:
Server Name
时间戳
Server Session Key
Client收到消息后,使用Session Key解密获得Server Session Key
三.Client最终向为了Server对自己的认证向其提交Ticket
1.使用Server Session Key加密向Server发送Authenticator信息和TGS颁发的Server Ticket,内容包含:
User Name 时间戳
2.Server使用密钥解密Ticket,获得Server Session Key,使用Server Session Key解密Authenticator信息,对比Authenticator信息中的Client信息和Ticket中的Client信息对比,将Authenticator信息的时间戳和Ticket的时间戳是否相同(误差2min)
3.Server使用Server Session Key加密Authenticator信息,内容包含:
ID 时间戳
4.Client使用缓存中的用Server Session Key解密Authenticator信息,得到访问该访问需要携带的ID和时间戳。
5.认证完成,只需要使用申请的Service Ticket就可以正常访问服务。
Kerberos的攻击有如下:
(哈希)票据传递攻击
https://www.freebuf.com/articles/245872.html
域用户名枚举
这里比较多文章可以参考:
https://cloud.tencent.com/developer/article/1180848 从暴力枚举用户到获取域所有信息
http://hackergu.com/kerberos-sec-list-brute-user/ 域安全-域用户的枚举与爆破
https://www.secpulse.com/archives/68628.html Kerberos域用户名枚举
密码喷洒攻击(Password Spraying)
这个可以看倾旋大佬的啦:https://payloads.online/archivers/2018-05-02/1 Windows域渗透 - 用户密码枚举
AS-REPRoasting
看harmj0y大佬的分析文章:https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
主要是因为域账号开启了下面这个选项:
它的验证方式变的不一样了,不再需要用户的hash去请求就能返回TGT票据和用户session部分的内容。
攻击方法参考:[https://blog.csdn.net/shuteer_x](
访问控制模型
Windows访问控制模型有两个基本组成部分:
- 访问令牌(Access Token):包含有关登录用户的信息
- 安全描述符(Security Descriptor):包含用于保护安全对象的安全信息
权限检查的过程
当某个线程尝试访问一个安全对象时,系统根据安全对象的ACE对照线程的访问令牌来判断该线程是否能够对该安全对象进行访问。通常,系统使用请求访问的线程的主访问令牌。但是,如果线程正在模拟其他用户,则系统会使用线程的模拟令牌
此时将在该安全对象的DACL中按顺序检查ACE,直到发生以下事件:
- 某一条拒绝类型的ACE显式拒绝令牌中某个受信者的所有访问权限
- 一条或多条允许类型的ACE允许令牌中列出的受信者的所有访问权限
- 检查完所有ACE但没有一个权限显式允许,那么系统会隐式拒绝该访问
Windows Access Token
简介
Windows Access Token(访问令牌),它是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,这个Token在==用户创建进程或者线程时会被使用==,不断的拷贝,这也就解释了A用户创建一个进程而该进程没有B用户的权限。当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除 Access Token分为两种(主令牌、模拟令牌)
当线程与安全对象进行交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户。使用windbg查看进程的token,其包含信息如下图所示:
组成
- 用户帐户的安全标识符(SID)
- 用户所属的组的SID
- 用于标识当前登录会话的登录SID
- 用户或用户组所拥有的权限列表
- 所有者SID
- 主要组的SID
- 访问控制列表
- 访问令牌的来源
- 令牌是主要令牌还是模拟令牌
- 限制SID的可选列表
- 目前的模拟等级
- 其他统计数据
SID
安全标识符是一个唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录。通常它还有一个SID固定列表,例如 Everyone这种已经内置的账户,默认拥有固定的SID。
SID表现形式:
域SID-用户ID 计算机SID-用户ID
Windows Access Token产生过程
每个进程创建时都会根据登录会话权限由LSA(Local Security Authority)分配一个Token(如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就用父进程Token的一份拷贝。
安全描述符(Security Descriptor)
安全描述符(Security Descriptor)包含与安全对象有关的安全信息,这些信息规定了哪些用户/组可以对这个对象执行哪些操作,安全描述符主要由以下部分构成:
- 所有者的SID
- 组SID
- ==自主访问控制列表(DACL)==,规定哪些用户/组可以对这个对象执行哪些操作
- 系统访问控制列表(SACL),规定哪些用户/组的哪些操作将被记录到安全审计日志中
在windbg中查看一个安全对象的安全描述符,可以清晰的看到安全描述符的组成:
域环境
Active Directory(活动目录)
简介
Active Directory,活动目录简称AD,是一个基于DNS并以树状的数据结构来组成==网络服务==存储了有关网络对象的信息,并以此作为基础对目录信息进行合乎逻辑的分层组织,让管理员和用户能够轻松地查找和使用这些信息。常网域都只有一个,在中型或大型的网络中,网域可能会有很多个,或是和其他公司或组织的AD相互链接。
活动目录是一个==分层数据库==( hierarchical database),在活动目录表中你可以查询到计算机网络中所有的用户帐户、计算机名称、证书、安全策略及其他信息。
活动目录功能
- 服务器及客户端计算机管理
- 用户服务
- 资源管理
- 桌面配置
- 应用系统支撑
存储方式
ntds.dit是AD中的数据库文件,它被保存在域控制器==c:\windows\system32\ntds\NTDS.DIT==位置。活动目录的数据库文件(ntds.dit)包含有关活动目录域中所有对象的所有信息,其中包含所有域用户和计算机帐户的密码哈希值。该文件在所有域控制器之间自动同步,它只能被域管理员访问和修改。
攻击活动目录
- 利用常规Web渗透进行横向渗透
- 常规Dump Hash后进行PTH,循环操作,直到获取Domain Admins
- 利用SYSVOL和组策略首选项(GPP)
- MS14-068
- 利用VSS卷影副本拷贝ntds.dit
- 利用Responder等工具进行ARP
- Netbios和LLMNR命名投毒
- kerberoast(破解Ticket)
- MS17-010
https://link.zhihu.com/?target=https%3A//blog.csdn.net/shuteer_xu/article/details/106066628)
LDAP
LDAP(Lightweight Directory Access Protocol)轻量目录访问协议
,Active Directory是LDAP协议open in new window在Windows上的实现。
LDAP攻击基础语法
(&(A)(B))
(|(A)(B))
(|(&(A)(B))(C))
(A=B)
(A~=B)
(!(A=B))
(A=*)
(A>B)
(A<=B)
IPC(进程间通信)
简介
指至少两个进程或线程间传送数据或信号的一些技术或方法。
作用
- 信息共享:Web服务器,通过网页浏览器使用进程间通信来共享web文件(网页等)和多媒体
- 加速:维基百科使用通过进程间通信进行交流的多服务器来满足用户的请求
- 模块化
- 私有权分离
功能
IPC$
简介
IPC$是共享“命名管道”的资源,为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问,从NT/2000开始使用。
IPC$在同一时间内,两个IP之间只允许建立一个连接。
NT/2000在提供了 ipc$ 功能的同时,在初次安装系统时还打开了默认共享,即所有的逻辑共享(c$,d$,e$……)和系统目录winnt或管理员目录(admin$)共享。
IPC$主要使用
IPC空连接
对于NT,在默认安全设置下,借助空连接可以列举目标主机上的用户和共享,访问everyone权限的共享,访问小部分注册表等;在WIndows Server 2000及以后作用更小,因为在Windows 2000 和以后版本中默认只有管理员有权从网络访问到注册表。
常用命令
建立IPC$空连接:net use \192.168.1.101\ipc$ “” /user:”domain\username”
建立IPC$非空连接:net use \192.168.1.101\ipc$ “password” /user:”domain\username”
删除IPC$连接:net use \192.168.1.101\ipc$ /del
已经建立IPC$连接并且有权限,将目标C盘映射到本地Z盘:net use z: \192.168.1.101\c$
删除映射:net use z: /del
关闭IPC默认共享:net use ipc$ /del
注:
1.现在绝大多数的Windows操作系统默认策略不允许来自远程网络验证的空密码,所以IPC空连接已经被废弃。
2.如果远程服务端未开启139、445端口,无法使用IPC$进行连接。
内网协议
SMB
https://www.cnblogs.com/yuzly/p/10480438.html
SMB(Server Message Block)被称为服务器消息块,又叫网络文件共享系统(CIFS)。在Windows2000中,SMB除了基于NBT实现,还可以直接通过445端口实现。
它运行在应用层,可以使用不同的传输层协议,如TCP(传输控制协议)或NetBIOS(网络基本输入/输出系统)来实际传输数据。
主要功能
使网络上的机器能够共享计算机文件、打印机、串行端口和通讯等资源。
局域网共享文件夹:https://blog.csdn.net/qq_20191467/article/details/113032642
原理
CIFS消息一般使用NetBIOS或TCP协议发送,分别使用不同的端口139或445,当前倾向于使用445端口。
- 直接运行在 TCP 上 port 445
- 通过使用 NetBIOS API
- 基于 UDP ports 137, 138 & TCP ports 137, 139
- 基于一些传统协议,例如 NBF
历史版本
1.SMB 1.0 没有数字签名功能
2.SMB 2.0
3.SMB 2.1
4.SMB 3.0
LLMNR
简介
- LLMNR是链路本地多播名称解析,当==局域网中的DNS服务器不可用时,可以使用LLMNR解析本地网段上机器名称==,只有Windows Vista和更高版本才支持LLMNR,支持IPV6
工作流程
- 通过UDP发送到组播地址224.0.0.252:5355,查询主机名对应的IP,使用的是DNS格式数据包,数据包会被限制在本地子网中。
- 本地子网中所有支持LLMNR的主机在受到查询请求时,会对比自己的主机名是否相同,不同就丢弃,相同就发送包含自己IP的单播信息给查询主机。
- 主机在内部名称缓存中查询名称
- 在主DNS查询名称
- 在备用DNS查询名称
- 使用LLMNR查询名称
LDAP
https://www.4hou.com/posts/j6ZP
LDAP是一种目录访问协议,它规定了以树状结构的方式来存储和访问数据。
然而协议是抽象的,要产生具体的功效,必须在应用中实现,比如AD域服务就实现了LDAP协议。
LDAP最明显的优势就是读取速度快,拥有极高的搜索效率。
可以用一个例子来体会这种速度:当我们进入一个迷宫,需要寻找出口。
普通数据库:一条路一条路地尝试,直到尝试出能走出去的路线,再将这条路线返回给我们。
LDAP:相当于拿了一张解密地图,上面清清楚楚写着哪条路能直接到达出口。
很明显,普通数据库也许要尝试十多次才能找到正确的路线,但是LDAP只要一次就能找到,搜索性能上孰优孰劣一目了然。
除此之外,LDAP允许灵活地添加数据,并且采取【客户端-服务端】的方式提供服务,即在服务端存储数据,在客户端操作数据,但相比于关系型数据库,它不支持事务、回滚等操作。
LDAP中将域名拆分开,形成树根,系统中的树根叫做DC,比如在test20.local域下,树根为DC=test20,DC=local。
树根有了,下一步,我们开始构建树枝。LDAP中,树的枝干通常是由组织单位(OU)来充当,主要是区分数据所属范围。比如有一个叫张三的用户在local下的信息部,那么张三所属枝干就是OU=信息部。
到最后,只要把所有的数据制作成树叶,挂到树枝上去就行了。
制作树叶有两个关键的地方,一个是树叶名字,另一个是树叶内容。
LDAP规定的名字结构由两部分组成,一部分是直接名称,即==CN==,一部分是相对名称,即==RDN==。
==CN==是唯一的,用来区分不同树叶。比如用户张三注册时,CN=张三。
而==RDN==是指从树根到树叶经过的所有枝干,用来标识树叶位置。如果Sam用户在市场运营部,他的RDN就是DC=test20,DC=local,OU=信息部。
==RDN加CN==就形成了数据名称,用==DN==来表示,张三的DN就是:DC=test20,DC=local,OU=信息部,CN=张三。
正是这样的名字结构提升了LDAP的读取效率,因为DN就是那张标识了出口路线的地图,只要我们顺着名称往下寻找,就能直接找到所需数据。
树叶内容主要是描述这片树叶的颜色、形状、气味等独特的信息,对应到系统中,就是资源的属性,比如用户的属性有性别,身份证号,电话等,计算机的属性有操作系统类型、账号密码等。一片树叶名称加上它的属性就形成完整的数据信息,在系统中被称为条目。
RPC
https://bbs.huaweicloud.com/blogs/337073
RPC(Remote Procedure Call)远程过程调用协议是一个用于建立适当框架的协议。从本质上讲,==它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程的==。
RPC 是==一种软件通信协议==,一个程序可以用来向位于网络上另一台计算机的程序请求服务,而不必了解网络的细节。RPC 被用来像本地系统一样调用远程系统上的其他进程。过程调用有时也被称为函数调用或子程序调用。
常见 RPC 实现
- Sun RPC (ONC RPC)
- DCE/RPC
- Java RMI
- XML-RPC
- gRPC
NETBIOS
简介
自从诞生,Netbois成为许多其他网络应用程序的基础。严格意义上,Netbios是接入网络服务的接口标准。
- NETBIOS(网络基本输入输出系统),严格讲不属于网络协议,NETBIOS是==应用程序接口==(API),早期使用NetBIOS Frames(NBF)协议进行运作,是一种非路由网络协议,==位于传输层==;后期NetBIOS over TCP/IP(缩写为NBT、NetBT)出现,使之可以连接到TCP/IP,是一种网络协议,位于==会话层==。基于NETBIOS协议广播获得计算机名称——解析为相应IP地址,WindowsNT以后的所有操作系统上均可用,不支持IPV6
类型
NETBIOS提供三种服务
- NetBIOS-NS(==名称服务==):为了启动会话和分发数据报,程序需要使用Name Server注册NETBIOS名称,可以告诉其他应用程序提供什么服务,默认监听UDP137端口,也可以使用==TCP 137==端口。
- Datagram distribution service(==数据报服务==):无连接,负责错误检测和恢复,默认在==UDP 138==端口。
- Session Server(==会话服务==):允许两台计算机建立连接,默认在==TCP 139==端口。
利用NETBIOS发现主机
1.nbtstat(Windows自带命令)
获取目标主机MAC地址
nbtstat -A 192.168.100.200
2.nbtscan
扫描指定网段的主机名和网络开放共享
nbtscan.exe 192.168.100.1/24
SHARING表示开放,DC 表示可能是域控
WMI
是一个服务。想象你有一把神奇的钥匙,可以打开你家中每个房间的门,查看房间内的状态并进行调整。WMI 就像是这把钥匙,让你可以从一处地方访问和管理整个Windows系统的各个方面。
WMI(Windows管理规范),由一系列对Windows Driver Model的扩展组成,它通过仪器组件提供信息和通知,提供了一个操作系统的接口。在渗透测试过程中,==攻击者往往使用脚本通过WMI接口完成对Windows操作系统的操作,远程WMI连接通过DCOM进行==。例如:WMIC、Invoke-WmiCommand、Invoke-WMIMethod等。另一种方法是使用Windows远程管理(WinRM)。
WinRm
Windows远程管理(WinRM)服务是Windows Server 2003 R2以上版本中一种新式的方便远程管理的服务。通过WinRM服务,便于在日常工作中远程管理服务器,或通过脚本同时管理多台服务器,来提高工作效率。
WinRM服务基于HTTP(HTTPS)协议,使用5985端口(HTTPS使用5986端口)。按照微软官方的介绍:Windows2008 R2以上版本的操作系统,默认开启WinRM服务,因此,在使用时只需将防火墙相应的5985(或5986)端口开放即可;
(1)如何确认WinRM服务是否开放?
以管理员身份在CMD中执行以下命令:
winrm e winrm/config/listener
若返回错误信息,表示WinRM未启动;
(2)如何开启WinRM服务?
若WinRM未启用,以管理员权限运行PowerShell,然后输入以下命令:
enable-psremoting
利用 WinRM 进行横向渗透:https://www.wangan.com/p/7fygfg3e497a3528
COM
com官方文档https://learn.microsoft.com/zh-cn/windows/win32/com/com-fundamentals
com是一种接口标准,windows下的软件开发可以遵从com标准,也可以不遵从,对于遵从com标准的软件,我们创建它的com对象后可以通过com接口规定的方法进行一些操作,而不遵从的就不能通过com进行操作。此外,例如word = win32com.client.Dispatch(“Word.Application”),这里面的Word.Application通过注册表进行注册
开发者使用编程语言(如 C++、C# 等)实现 COM 对象,定义接口并实现这些接口的方法。
使用工具(如
regsvr32
)或安装程序将 COM 对象的信息注册到 Windows 注册表中。注册信息包括:CLSID(类标识符),ProgID(程序标识符),接口ID,组件的文件路径等。
COM 的核心概念
- 接口(Interface):
- COM 组件通过接口暴露其功能。接口是一个方法的集合,不包含实现细节。
- 接口使用唯一标识符(IID)标识。
- 组件(Component):
- 一个实现了一个或多个接口的二进制对象。组件使用唯一标识符(CLSID)标识。
- 组件可以是 DLL、EXE 文件等。
- 接口引用计数(Reference Counting):
- COM 使用引用计数来管理组件的生命周期。当引用计数为零时,组件被释放。
- 接口查询(Query Interface):
- 通过接口查询机制(QueryInterface 方法),可以在运行时动态地获取组件支持的其他接口。
COM 的用途
- 操作系统服务:
- Windows 提供了大量通过 COM 接口访问的系统服务,如文件操作、网络通信等。
- 应用程序自动化:
- Microsoft Office 提供了丰富的 COM 接口,允许开发者控制 Word、Excel 等应用程序,实现自动化任务。
- 多媒体处理:
- Windows Media Player 提供了 COM 接口,允许开发者控制媒体播放、处理音视频文件。
- Web 浏览器集成:
- Internet Explorer 提供了 COM 接口,允许开发者操作浏览器和网页内容。
COM 就是计算机世界中的“标准接口”: 在计算机中,COM(组件对象模型)就是一种类似的“标准接口”。它允许不同的软件部件(或称为组件)之间进行通信和协作,而不需要了解对方的内部实现细节。这些组件可以用不同的编程语言编写,但只要它们遵循COM标准,它们就可以互相交流。
具体例子
例子1:Microsoft Office自动化
假设你想写一个程序自动打开Microsoft Word,并在文档中输入一些文字。Microsoft Word提供了一个COM接口,让你可以通过程序控制它。
用Python来实现:
import win32com.client
# 创建一个Word应用程序的COM对象
word = win32com.client.Dispatch("Word.Application")
# 使Word应用程序可见
word.Visible = True
# 创建一个新文档
doc = word.Documents.Add()
# 在文档中输入文字
doc.Content.Text = "Hello, COM world!"
在这个例子中,我们通过COM接口创建了一个Word对象,控制它打开了一个文档并输入了文字。
例子2:创建快捷方式
你可以使用COM接口创建Windows桌面的快捷方式。
用Python来实现:
import win32com.client
# 创建Shell对象
shell = win32com.client.Dispatch("WScript.Shell")
# 创建快捷方式对象
shortcut = shell.CreateShortcut("C:\\path\\to\\shortcut.lnk")
# 设置快捷方式目标路径
shortcut.TargetPath = "C:\\path\\to\\target.exe"
# 保存快捷方式
shortcut.save()
DCOM
COM就像是家中的家电,它们都通过标准插座获取电力。DCOM则是一个扩展,它允许你在不同的房间甚至不同的房子之间传递电力。
可以把它认为是一种应用协议,但它更准确地说是一套技术和规范的集合。在网络协议上它基于RPC,同时也包括大量其他技术。
利用DCOM横向渗透:https://www.freebuf.com/articles/network/261454.html
COM即组件对象模型(Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。COM是许多微软产品和技术,如Windows媒体播放器和Windows Server的基础。
DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一系列概念和程序接口,它==支持不同的两台机器上的组件间的通信==,不论它们是运行在局域网、广域网、还是Internet上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求。
DCOM是COM(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法。DCOM 使用远程过程调用(RPC)技术将组件对象模型(COM)的功能扩展到本地计算机之外,因此,在远程系统上托管COM服务器端的软件(通常在DLL或exe中)可以通过RPC向客户端公开其方法。
使用DCOM进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管COM服务器端的软件。这无疑能够增强隐蔽性,由于有大量程序都会向DCOM公开方法,因此防御者可能难以全面监测所有程序的执行。
Windows网络认证
工作组
简介
工作组是指数台计算机在同一个内网中,在逻辑上都属于工作组,但是在工作组中的机器之间相互没有信任关系,每台机器的账号密码只是保存在自己的SAM文件中。那就意味着如果需要共享资源只能新建一个账号并指定相关资源授予该账号权限才可以完成共享。早期利用SMB协议在内网中传输明文口令,后为了安全出现LM Challenge/Response 验证机制,再之后LM Challenge/Response 验证机制因为安全性问题,从Windows Vista / Server 2008开始LM就被弃用,改用Windows NT挑战/响应验证机制,常被人称为NTLM,现在被更新到NTLMv2
历史版本
NTLMv1:服务器通过发送一个8字节的随机数(挑战)来验证客户端,客户端返回两个24字节Hash进行计算并返回计算结果。 NTLMv2:它通过加强协议来抵御许多欺骗攻击,并增加服务器向客户端进行身份验证的能力,从而增强了NTLM的安全性。服务器通过发送一个16字节的HMAC – MD5随机数(挑战)来验证客户端。 ####工作流程 Client(客户端)、Server(服务端)
- [1] 协商 Clint向Server发送消息,确定协议版本
- [2] 质询 Client向Server发送用户名消息作为请求 Server收到请求,验证是否存在Client发来的用户名,如果存在,生成16位的随机数(Challenge)发送给Cilent,并使用SAM中查询用户名对应的NTLM Hash加密Chanllenge,生成Net-NTLM Hash存放在内存中。 Client使用发送的用户名对应的NTLM Hash加密Challenge,将结果(Response)发送给Server
- [3] 验证 Server收到Client发送的Response,将接收的Response与Net-NTLM Hash进行比较,如果相同,则认证通过。 注:每次生成的16字节的Challenge都不同,保证的安全性。
本地认证流程
- Windows Logon Process(即 winlogon.exe),Winlogon 是负责处理安全相关的用户交互界面的组件。Winlogon的工作包括加载其他用户身份安全组件、提供图形化的登录界面,以及创建用户会话。
- LSASS(本地安全认证子系统服务)用于微软Windows系统的安全机制。它负责Windows系统安全策略。它负责用户在本地验证或远程登陆时验证用户身份,管理用户密码变更,并产生访问日志。
用户注销、重启、锁屏后,操作系统会让winlogon显示图形化登录界面,也就是输入框,接收域名、用户名、密码后交给lsass进程,将明文密码加密成NTLM Hash,对SAM数据库比较认证,相同则认证成功。
内网渗透
内网渗透流程
Initial Access
- Webshell
- 个人机Beacon
- VPN
网络位置判断
- 网络区域
- 主机角色
- 连通性判断
信息收集
信息收集常分为工作组信息收集、域信息收集,管理员、非管理员。信息收集范围包括但不限于对权限信息,机器信息,进程端口,网络连接,共享、会话、敏感文件、密码文件、配置文件、浏览器记录、远程连接工具如xshell等工具记录等信息进行详细收集并加以合理运用,将已有信息最大程度利用,如某大佬所说,渗透的本质是信息收集。具体信息收集命令可以查阅参考链接,不再赘述。
内网穿透常见协议及利用
- TCP
- UDP
- Http
- Https
- SSH
- DNS
- Icmp
- FTP
- GRE
在内网渗透中常见方法:
1.将单一端口转发到公网VPS
2.反向sockets代理,可以将流量全局带入
常用文件类型:
exe/ps1/python
内网渗透常用端口
- 53 DNS服务,在使用中需要用到TCP/UDP 53端口,AD域的核心就是DNS服务器,AD通过DNS服务器定位资源
- 88 Kerberos服务,在使用中需要用到TCP/UDP 88端口,Kerberos密钥分发中心(KDC) 在该端口上侦听Ticket请求
- 135 135端口主要用于使用RPC协议并提供DCOM服务。
- 137 NetBIOS-NS(名称服务),在使用中需要用到TCP/UDP 137端口
- 139 Session Server(会话服务),在使用中需要用到TCP/UDP 139端口,允许两台计算机建立连接
- 389 LDAP服务(轻量级目录访问协议),在使用中需要用到TCP/UDP 389端口,如果需要使用SSL,需要使用636端口,
- 445 主要用于共享文件夹或共享打印,存在较多漏洞,如MS08-067、MS17-010
- 3268 Global Catalog(全局编录服务器),如果需要使用SSL,需要用到3269端口,主要用于用户登录时,负责验证用户身份的域控制器需要通过防火墙,来向“全局编录”查询用户所隶属的通用组
权限提升
1.EXP提权 利用已公开EXP进行溢出提权可参照windows-kernel-exploits,可以配合Windows-Exploit-Suggeste进行辅助提权。
2.利用AD特性提权 如MS14-068、GPP等
3.Windows非EXP提权 劫持类提权如DLL劫持、COM劫持、Unquoted Service Paths、利用第三方高权限服务提权
4.假冒令牌 当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清 除,只有在重启机器后才会清除。
5.Bypass UAC Windows系统中Administrators组非SID为500的用户必须Bypass Uac才可以获得特权令牌,具体方法可以使用Windows自带程序进行Bypass,可以参考UACME项目。
内网横向渗透方法
- ipc$+计划任务
- PTH
- Wmi
- WinRm
- 利用常规Web渗透横向
- sc
- ps1
在无法抓取用户明文密码的情况下可以使用Hash注入登陆系统或登陆服务
内网渗透持久化
1.利用活动目录
- Golden Ticket
- Silver Ticket
- DSRM
- SSP(Security Support Provider)
- Hook PasswordChangeNotify
- SID History
2.Windows常规持久化
- 常规Webshell
- 利用Windows注册表项
- Logon Scripts
- Dll劫持
- 计划任务 (1)at (2)schtasks
- wmi事件
- COM劫持
MITI
1.Responder responder.py –A 分析模式
2.Impacket Relay attacks Tools,该工具可以进行SMB Relay、NTLM Relay。
3.smb relay ntlmv2 使用Impacket中的ntlmrelayx.py和Responder中的MultiRelay.py配合使用。在SMB签名关闭的情况下将net-ntlm Hash中继进行攻击,SMB签名默认在非Windows Server系统中关闭。
日志清理
Windows EventLog、Application Log、Session、进程、物理存储中的二进制文件
内网渗透常用工具和方式
1.渗透框架
- Cobalt Strike
- Empire
- NiShang
- Metasploit
- Powersploit
2.信息收集
- Netsess.exe
- Powerview
- Bloodhound
- Nmap
3.权限提升
- Powerup
- UACME
- 假冒令牌: 1.Incognito 2.Powershell – Invoke-TokenManipulation.ps1 3.Cobalt Strike – steal_token
4.口令爆破
- Hydra
- John
- Hashcat
5.凭据窃取
- Mimikatz
- Procdump
- QuarksPwDump
- LaZagne.exe
windows:
mimikatz
wce
Invoke-WCMDump
mimiDbg
LaZagne
nirsoft_package
QuarksPwDump
fgdump
linux:
LaZagne
mimipenguin
6.横向渗透
- psexec
- wmi (1)wmic (2)wmiexec.vbs (3)Invoke-WMIMethod
- WinRM
- DCOM
- WCE
- 组策略种马
7.MIMT
- Responder
- Impacket
- Invoke-Inveigh.ps1
- Cain
7.Bypass AV
- Invoke-Obfuscation
- Veil
- shellcode loder
- reflect dll inject