前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内网渗透基础(一)

内网渗透基础(一)

作者头像
用户9691112
发布2023-05-18 13:55:29
4160
发布2023-05-18 13:55:29
举报

内网基础概念

内网的概念

究竟什么是内网呢?《内网渗透攻防》中如是说

内网也指局域网,是指在某一区域由多台计算机互连而成的计算机组。

工作组

在一个大型单位中,可能有成百上千台计算机,他们相互连接组成局域网,如果不进行分组,那么网络关系就会杂乱不堪,此时工作组的出现,成功解决了这个问题。它将局域网中不同的计算机按功能分别列入不同的工作组,使得网络更有序。

域是一个有安全边界的计算机集合(安全边界是指在两个域中,一个域中的用户无法访问另一个域中的资源),可以简单地把域理解为升级版的工作组。用户要想访问域内的资源,必须以合法的身份登录域,而用户对域内的资源拥有什么样的权限,还取决于用户在域内的身份。

域内涉及了多个概念,例如域控制器、单域、域树等,接下来依次介绍

域控制器

DC(Domain Controller),域控制器是域中一台类似管理服务器的主机,它拥有管理域内其他主机的计算机,它负责所有本域内的计算和用户的验证工作,它是整个域的通信枢纽,域内所有用来验证身份的账号和密码哈希都存在域控制器中。所以,内网渗透的最终目标常常就是为了攻下域控服务器,这样就等同于控制整个域内的计算机。

单域

单域,就是指只有一个域环境的网络,这里需要说明的是,一般在一个域中,至少会有两台域服务器,一台作为DC,另一台作为备份DC

父域和子域

当存在多个域时,第一个域称为父域,各分部的域称为该域的子域。例如,xx公司总部设在北京,而在杭州,上海等地设有分公司,他们进行信息交互这种就需要用到父域和子域,此时,北京的这个就是父域,而处于杭州、上海的域就是分域。这样有什么好处呢

减小了域之间信息交互的压力(域内信息交互不会压缩,域间信息交互可压缩)

不同的子域可以指定特定的安全策略

父子域中域名使用一个.表示一个层次,放在域名最后的子域称为最高级子域或一级子域,它前面的子域称为二级域 。

现在,比如父域是quan9i.top,那么abc.quan9i.top就是一级子域,cn.abc.quan9i.top就是二级域

域树

域树是多个域通过建立信任关系组成的集合。当两个域内需要相互访问时,就需要建立信任关系。建立信任关系后,可以将父子域连接成树状格式,此时就可以实现相互访问。

域森林

域森林是指多个域树通过建立信任关系组成的集合。例如,当前有域树abc.net和域树abc.com,两个本来是无法实现互相访问的,而当两个域树建立信任关系后,它们可以组成一个集合形式(域森林),实现相互访问。

域名服务器

域名服务器(Domain Name Server,简称DNS)是指用于实现域名和与之对应的IP地址转换的服务器。简单的说,就是实现域名到IP地址的转换 。同时,域的名字就是DNS的名字,之所以出现这个情况是因为域中计算机使用DNS来定位DC、服务器等计算机。

活动目录

**活动目录(Active Directory,简称AD)**是指域环境中提供目录服务的组件。

它用于存储有关网络对象(用户、组、计算机、共享资源等)的信息,目录服务是指帮助用户快速、准确地寻找其所需要的服务。活动目录实现了目录服务,为企业提供了网络环境的集中式管理机制。

活动目录的逻辑结构包括组织单元(OU)、域、域树、域森林,那什么是逻辑结构呢,它的定义是不考虑被管理对象的具体位置的组织框架

活动目录主要提供以下功能:

1、账号集中管理 : 所有账号均存储在服务器中,以便执行命令和重置密码等

2、软件集中管理:统一推送软件、安装打印机等。利用软件发布策略分布软件,可以让用户自由选择需要安装的软件

3、环境集中管理:统一客户端桌面、IE、TCP/IP协议等设置

4、增强安全性:统一部署杀毒软件和病毒扫描任务、集中管理用户的计算机权限、统一制定密码策略等。

5、更可靠、更短的宕机时间:例如,利用活动目录控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设置

域控与活动目录的区别

活动目录数据库,即拥有层次结构的数据库,简称为AD库。

要实现域环境,其实就是要安装AD库。如果内网中的一台计算机上安装了AD,那它就变成了DC(用于存储活动目录数据库的计算机,即域控)

安全域的划分

在一个用路由器连的内网中,可以将网络划分为三个区域:**内网(安全级别最高)、DMZ(安全级别中等)、外网(安全级别最低)**,接下来对三个区域分别进行简单介绍。

内网

内网:其拥有两个区:

1、核心区(存储企业最重要的数据、文档等信息资产,往往只有很少的主机能访问)

2、办公区(公司员工日常的工作区,一般能够访问DMZ,部分主机可访问核心区)

DMZ

DMZ(Demilitarized Zone,称为隔离区),其是一个非安全系统与安全系统之间的缓冲区,也就是说,DMZ一般位于内网和外部网络之间。这里主要用于对外提供服务,可以在此放置一些必须公开的服务器设施,例如企业Web服务器、FTP服务器和论坛服务器等

外网

Internet,安全级别最低。

三者关系

在配置一个拥有DMZ的网络时,通常需要定义如下访问控制策略,以实现其屏障功能。

1、内网可以访问外网:内网用户需要自由地访问外网

2、内网可以访问DMZ:此策略使内网用户可以使用或者管理DMZ中的服务器

3、外网不能访问内网:内网中存储的是公司内部数据,这些数据一般是不允许外网用户访问的(如果要访问,可以通过VPN方式进行)

4、外网可以访问DMZ:因为DMZ中的服务器需要为外界提供服务,所以外网必须可以访问DMZ

5、DMZ不能访问内网:如果不执行此策略,当攻击者攻陷DMZ时,内网将无法受到保护

6、DMZ不能访问外网:此策略也有例外。例如,在DMZ放置了邮件服务器,就要运行访问外网,否则邮件服务器无法正常工作

内网信息搜集

网络信息

ipconfig /all查看网络配置信息

image-20230328163741254
image-20230328163741254

netstat -ano查询端口连接情况

image-20230328163937210
image-20230328163937210

route print查询路由表

image-20230328165140755
image-20230328165140755

**arp -a **查看arp缓存

image-20230328164026228
image-20230328164026228

系统信息

systeminfo查询系统信息以及补丁列表

image-20230328164213985
image-20230328164213985

**echo %PROCESSOR_ARCHITECTURE%**查询系统体系结构

image-20230328164755647
image-20230328164755647

域相关

net view /domain查找域

image-20230328150513510
image-20230328150513510

net group /domain用于获取域用户组信息

image-20230320001453884
image-20230320001453884

net user /domain用于获取所有域用户列表

image-20230320001417357
image-20230320001417357

net user xxx /domain用于查询指定域用户详细信息

image-20230328150911401
image-20230328150911401

net config workstation查看当前工作域

image-20230319165324330
image-20230319165324330

net group “domain controllers” /domain查询域控

image-20230319170352671
image-20230319170352671

wmic useraccount get /all获取域内用户详细信息

image-20230328094410745
image-20230328094410745

dsquery user查询存在的用户

其他

tasklist查询进程列表

image-20230328165504251
image-20230328165504251

netsh firewall show config查看防火墙配置

image-20230328165035266
image-20230328165035266

schtasks /query /fo LIST /v查询定时任务

image-20230328165337484
image-20230328165337484

信任协议

运行 Windows Server 2008 或 Windows Server 2008 R2 的域控使用以下两个协议之一对用户和应用程序进行身份验证Kerberos 版本 5 (V5) 协议或 NTLM(New Technology LAN Manager)

NTLM是Windows NT早期的信任协议,现在的Server2000、2003等服务器,都是默认采用的Kerberos V5,只有在事务中任意台计算器不支持Kerberos时,才会使用NTLM。

Kerberos协议

Kerberos是一种网络身份验证协议。它旨在使用密钥加密技术为客户端/服务端应用程序提供强身份验证。

这个协议主要涉及三个角色

代码语言:javascript
复制
1、访问服务的客户端(Client): Kerberos客户端代表需要访问资源的用户进行操作的应用程序,例如打开文件、查询数据库等。每个Kerberos客户端在访问资源前都会请求身份验证。
    
2、提供服务的服务端(Server): 域内提供服务的服务端,服务都有唯一的服务主体名称(SPN)
    
3、提供认证服务的密钥分发中心(KDC,Key Distribution Center):
KDC是一种网络服务,它向活动目录域内的用户和计算机提供会话票据和临时会话密钥,其服务账号为krbtgt(创建活动目录时系统自动生成的用户,其密码由系统随机生成,无法正常登录主机)。KDC运行在每个域控制器上。

他们的关系如下图所示

image-20230320005122287
image-20230320005122287

他们的关系即Client要访问Server,则必须需要票据,而票据则是由KDC提供

针对KDC,这里需要进行简单说明

KDC一般安装在域控中KDC具体分为两部分

Authentication ServerTicket Granting Server

image-20230320005957527
image-20230320005957527

前者的作用是用于验证Client的身份(类似我们刷脸验证,确认与身份证上的人一致),如果验证通过,就会颁发TGT(Ticket Granting Ticket)票据Client。而后者的作用是通过Authentication Server颁发的TGT票据换取Server服务端Service Ticket票据(类似电影票二维码扫码取票操作)。

kerberos认证过程

首先,在开始之前对稍后需要用到的名词进行简单介绍

代码语言:javascript
复制
DC(Domain Controller):域控制器。

KDC(Key Distribution Center):秘钥分发中心,默认安装在域控里,包括AS和TGS。

AS(Authentication Service):身份验证服务,用于KDC对Client认证。

TGS(Ticket Grantng Service):票据授予服务,用于KDC向Client和Server分发Session Key(临时秘钥)。

TGT(Ticket Granting Ticket):认证票据,用于验证Client的身份。

ST(Server Ticket):服务票据。

AD(Active Directory):活动目录,用于存储用户、用户组、域相关的信息。

Client:客户端,也可以理解为用户。

Server:服务端,可以是某台计算机,也可以是某个域内服务。

krbtgt用户:创建域控时由系统自动生成的用户。

过程一

Client通过As验证,获取TGT

Client要访问Server时,需要AS来进行身份认证,Client输入账密,并向KDC发送一个AS_REQ(由使用了ClientNTLM-Hash加密的时间戳、Client信息以及Server信息等组成)。

As收到服务端发送的AS_REQ,首先向AD查询是否存在此用户,存在的话则用此用户的NTLM-Hash来进行解密,如果解密成功,且解密后得到的时间戳与当时的时间相差在5分钟内则认为其认证成功。

这里之所以限制5分钟,是为了保证AS_REQ的安全,在传输它的过程中,可能会被黑客截获,如果黑客想进行重放攻击,就需要花费一定时间,所以五分钟就起到了包含AS_REQ的作用

这里存在两个验证

代码语言:javascript
复制
1、Client对As的验证
2、As如何判断此Client为真

第一个,如何判断As为真,使用ClientNTLM-Hash进行加密,如果As为真则可以正常解密AS_REQ

第二个,如何验证Client为真,如果Client为真,则AsClientNTLM-Hash是可以正确解密出来的。

接下来AS会生成一个AS_REPAS_REP由两部分组成

代码语言:javascript
复制
1、As生成的临时密钥Session-key,然后使用Client的NTLM-Hash加密,用于Client和KDC进行安全通信
2、TGT,内容由使用特定用户krbtgt的NTLM-Hash加密的Sessions-key、时间戳以及部分用户信息组成

过程二

Client与TGS认证,获取ST服务票据

Client收到了AsAS_REQ时,会使用自己的NTLM-Hash,将被加密过的临时密钥Session-key进行解密,然后将其保存在本地,如果需要访问Server时就可以构成TGS_REQ(包含Session-key、加密的时间戳以及服务端信息、krbtgt用户NTLM-Hash加密的TGT等)提交给TGS,从而获取对应的ST

当TGS收到TGS_REQ后,首先对Krbtgt用户NTLM-Hash加密的TGT进行解密,目的是得到Sessions-key、时间戳以及服务端信息等。与过程一类似,它有一个时间校验机制,如果时间戳和解密时间相差太久则终止验证,同时TGS会根据TGT里的Client信息和当前信息进行比对,判断是否为同一人,判断无误后会去判断此Client是否拥有访问Server的权限,若有则返回TGS_REP,它由两部分组成

代码语言:javascript
复制
1、TGS生成的新Session-key,然后再使用第一个过程中As生成的Session-key进行加密。
2、使用Server的NTLM-Hash加密的Sessions-key(由TGS生成的)、时间戳以及用户信息,此即ST服务票据

在此过程中存在一个验证

代码语言:javascript
复制
1、TGS如何判断Client为真

这里一开始解密的是Session-key(As生成的),而这个Session-key处了Dc就只有Client知道。

过程三

Cleint收到了TGS_REP,得到加密的Sessions-key,接下来操作同上,利用刚刚存储的Sessions-key(As生成的)对Sessions-key(TGS生成的)进行解密,得到未加密的Session-key(TGS生成的),然后存储在本地。

Client需要访问Server时,Client会发生AP_REQ

AP_REQSessions-key(TGS生成的)、时间戳、服务端信息等内容组成,然后再把ST服务票据一同发送给Server

Server收到AP_REQ使用自己的NTLM-HashST服务票据进行解密,拿到Sessions-key(TGS生成的)、时间戳、服务端信息等数据,而后根据ST内的时间戳与解密时时间作对比,如果时间未超过8小时则验证成功,反之失败。然后Server询问DC该用户是否有访问权限,如果有则允许Client访问Server

图示如下(摘自先知社区,不过好像是来源于csdn的,但未在csdn中找到)

image-20230328152331311
image-20230328152331311

NTLM协议

在学习 NTLM协议前,首先需要了解两个基本概念,SSPISSP

SSPI

**SSPI(Security Service Provider Interface,安全服务提供接口)**是Windows定义的一套接口,该接口定义了与安全有关的功能函数,包含但不限于:

代码语言:javascript
复制
身份验证机制
为其他协议提供的 Session Securtiy机制

SSPI仅仅只是定义了一套接口函数,并未实现具体内容。

SSP

**SSP(Security Serivice Provider,安全服务提供者)**是SSPI的实现者。微软自己实现了很多SSP,用于提供安全功能,包含但不限于:

代码语言:javascript
复制
NTLM SSP:Windows NT 3.51中引入(msv1_0.dll),为Windows 2000之前的客户端-服务器域和非域身份验证提供NTLM质询/响应身份验证
Kerberos SSP:WIndows 2000 中引入, Windows Vista 中更新为支持AES,为Windows 2000 及更高版本中首选的客户端-服务器域提供相互身份验证
Digest SSP: 在Windows和非Windows系统间提供HTTP和SASL身份验证的质询/响应
Negotiate SSP: 默认选择Kerberos,如果不可选则选择NTLM协议。提供单点登录功能

关系图如下

image-20230324013925279
image-20230324013925279

LM Hash

LM hash本质是DES加密,目前Windows已将LM Hash禁用(从 Windows Vista 和 Windows Server 2008开始,原因是容易被破解)。LM Hash明文密码被限定在14位以内,也就是说,若要停止使用LM Hash,将用户密码设置为14位以上即可。

LM Hash的加密流程如下,这里以P@ss1234为例

代码语言:javascript
复制
1、将用户的明文口令转换为大写,并转换为十六进制字符串
p@ss1234 -> P@SS1234 -> 5040535331323334
2、如果转换后的十六进制字符串长度不足14Byte(长度28),则用0来补全
5040535331323334 -> 5040535331323334000000000000
3、 将14B分为两组,每组7B,然后转换为二进制数据,每组二进制数据长度为56bit
image-20230324014637870
image-20230324014637870
代码语言:javascript
复制
4、将每组二进制数据按7bit为一组,分为8组,每组末尾加0,再转换为十六进制,此时每组也就成了8B长度的十六进制数据了
image-20230324014749143
image-20230324014749143
代码语言:javascript
复制
5、将生成的两组8B的十六进制数据,分别作为DES加密秘钥对字符串"KGS!@#S%"进行加密。而后将密文进行拼接,即可得到最终的LM Hash值
image-20230324014850292
image-20230324014850292

NTLM Hash加密算法

NTLM Hash算法是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法,它是基于MD4加密算法进行加密的。

其加密流程如下,这里仍以明文密码P@ss1234为例

代码语言:javascript
复制
1、将用户密码转换为十六进制格式
    P@ss1234 -> 5040535331323334
2、将ASCII编码的十六进制格式的字符串转为Unicode编码
    5040535331323334 -> 50004000730073003100320033003400
3、对Unicode编码的十六进制字符串进行标准MD4单向Hash加密
    50004000730073003100320033003400 -> 74520a4ec2626e3638066146a0d5ceae

上述过程亦可用Python实现,代码如下

代码语言:javascript
复制
import hashlib,binascii;

key = "P@ss1234"

NTLM_Hash = binascii.hexlify(hashlib.new("md4",key.encode("utf-16le")).digest()).decode("utf-8")

#binascii.hexlify():返回二进制数据的十六进制表示。 每个字节被转换成相应的 2位十六进制表示形式。
#hashlib.new()是一个通用构造函数,它将所需算法的字符串 name 作为其第一个参数。 它还允许访问上面列出的哈希值以及您的 OpenSSL 库可能提供的任何其他算法。
#digest():返回摘要,作为二进制数据字符串值

print(NTLM_Hash)
image-20230327202006885
image-20230327202006885

Windows系统存储的NTLM Hash

Windows环境中,用户的密码经过NTLM Hash加密后存储在C:\Windows\system32\config\SAM文件中。它的认证过程如下所示:

在用户输入密码进行本地认证过程中,所有操作都是于本地进行的,系统将密码转换为NTLM Hash,而后与SAM文件中的NTLM Hash进行比较,相同则密码正确。

接下来说一点其他的,mimikatz是如何抓取密码的呢。这里也牵扯到这个,具体如下:

当用户注销、重启、锁屏后,操作系统就会让winlogon.exe显示登录界面,也就是输入框。当winlogon.exe接收输入后,将密码交给lsass.exe进程,lsass.exe进程中会存一份明文密码,我们使用mimikatz就是从这里(lsass.exe进程)抓取明文密码或者Hash密码。

image-20230319163144742
image-20230319163144742

NTLM协议认证

NTLM协议是基于一种质询/响应的验证机制,其由三种类型消息组成

代码语言:javascript
复制
Type 1 (协商)
Type 2 (质询)
Type 3 (认证)
image-20230327203803672
image-20230327203803672

工作组环境的NTLM认证流程如下图所示

image-20230327203839745
image-20230327203839745

具体认证过程如下

1、当客户端需要访问服务器的某个服务时,就需要进行身份验证。此时客户端输入用户名和密码进行验证后,就会在本地缓存一份服务器密码的NTLM Hash值,而后客户端向服务端发送一个请求(包含服务器用户名和其他一些需要协商的消息),此过程为Type 1 协商消息

2、服务端收到客户端消息后,读取服务端所支持的内容,取出部分信息传入NTLM SSP(部分信息指的是自己能接受的服务内容、加密等级、安全服务等),得到Type 2 质询消息,并将此发回给客户端(消息包含16位的随机Challenge质询值,服务端也会有缓存)

3、客户端收到Type 2消息后,读取服务端内容并取出Challenge,而后用过程1中本地缓存的NTLM Hash对Challenge进行加密得到Response消息。最后将Response、用户名以及其他信息封装到NTLMSSP_AUTH消息中(Type 3认证消息),发往服务端

4、服务端收到验证消息后,取出Net-NTLM Hash,而后用自己密码的NTLM Hash对过程2中的Challenge值进行加密,得到自己的Net-NTLM Hash,比较两者是否相等,如果相等,则说明密码正确,反之则错误,认证失败。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内网基础概念
    • 内网的概念
      • 工作组
          • 域控制器
          • 单域
          • 父域和子域
          • 域树
          • 域森林
          • 域名服务器
        • 活动目录
          • 域控与活动目录的区别
            • 安全域的划分
              • 内网
              • DMZ
              • 外网
              • 三者关系
          • 内网信息搜集
            • 网络信息
              • 系统信息
                • 域相关
                  • 其他
                  • 信任协议
                    • Kerberos协议
                      • kerberos认证过程
                      • 过程一
                      • 过程二
                      • 过程三
                    • NTLM协议
                      • SSPI
                      • SSP
                      • LM Hash
                      • NTLM Hash加密算法
                      • Windows系统存储的NTLM Hash
                      • NTLM协议认证
                  相关产品与服务
                  多因子身份认证
                  多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档