内网渗透课程/内网渗透思路-手把手教网络安全笔记
内网基础概念
本文多为概念性知识,旨在为内网渗透铺一层概念之路,希望能对刚开始了解内网的师傅有所帮助。
内网的概念
究竟什么是内网呢?
内网也指局域网,是指在某一区域由多台计算机互连而成的计算机组。
《内网渗透攻防》中如是说。
工作组
在一个大型单位中,可能有成百上千台计算机,他们相互连接组成局域网,如果不进行分组,那么网络关系就会杂乱不堪,此时 工作组的出现,成功解决了这个问题。它将局域网中不同的计算机按功能分别列入不同的工作组,使得网络更有序。
域
域是一个有安全边界的计算机集合(安全边界是指在两个域中,一个域中的用户无法访问另一个域中的资源),可以简单地把域理解为升级版的工作组。用户要想访问域内的资源,必须以合法的身份登录域,而用户对域内的资源拥有什么样的权限,还取决于用户在域内的身份。
域内涉及了多个概念,例如 域控制器、单域、域树 等,接下来依次介绍
域控制器
DC( ),域控制器是域中一台类似管理服务器的主机,它拥有管理域内其他主机的计算机,它负责所有本域内的计算和用户的验证工作,它是整个域的通信枢纽,域内所有用来验证身份的账号和密码哈希都存在域控制器中。所以,内网渗透的最终目标常常就是为了攻下域控服务器,这样就等同于控制整个域内的计算机。
单域
单域,就是指只有一个域环境的网络,这里需要说明的是,一般在一个域中,至少会有两台域服务器,一台作为DC,另一台作为备份DC
父域和子域
当存在多个域时,第一个域称为父域,各分部的域称为该域的子域。例如,xx公司总部设在北京,而在杭州,上海等地设有分公司,他们进行信息交互这种就需要用到父域和子域,此时,北京的这个就是父域,而处于杭州、上海的域就是分域。这样有什么好处呢
减小了域之间信息交互的压力(域内信息交互不会压缩,域间信息交互可压缩)
不同的子域可以指定特定的安全策略
父子域中域名使用一个.表示一个层次,放在域名最后的子域称为最高级子域或一级子域,它前面的子域称为二级域 。
现在,比如父域是 .top ,那么 abc..top 就是一级子域,cn.abc..top就是二级域
域树
域树是多个域通过建立信任关系组成的集合。当两个域内需要相互访问时,就需要建立信任关系。建立信任关系后,可以将父子域连接成树状格式,此时就可以实现相互访问。
域森林
域森林是指多个 域树通过建立信任关系组成的集合。例如,当前有域树abc.net和域树abc.com,两个本来是无法实现互相访问的,而当两个域树建立信任关系后,它们可以组成一个集合形式(域森林),实现相互访问。
域名服务器
域名服务器( Name ,简称DNS) 是指用于实现域名和与之对应的IP地址转换的服务器。简单的说,就是实现域名到IP地址的转换。同时,域的名字就是DNS的名字,之所以出现这个情况是因为域中计算机使用DNS来定位DC、服务器等计算机。
活动目录
**活动目录( ,简称AD)**是指域环境中提供目录服务的组件。
它用于 存储有关网络对象(用户、组、计算机、共享资源等)的信息,目录服务是指帮助用户快速、准确地寻找其所需要的服务。活动目录实现了目录服务,为企业提供了网络环境的集中式管理机制。
活动目录的逻辑结构包括 组织单元(OU)、域、域树、域森林 ,那什么是逻辑结构呢,它的定义是 不考虑被管理对象的具体位置的组织框架 。
活动目录主要提供以下功能:
1、账号集中管理 : 所有账号均存储在服务器中,以便执行命令和重置密码等
2、软件集中管理:统一推送软件、安装打印机等。利用软件发布策略分布软件,可以让用户自由选择需要安装的软件
3、环境集中管理:统一客户端桌面、IE、TCP/IP协议等设置
4、增强安全性:统一部署杀毒软件和病毒扫描任务、集中管理用户的计算机权限、统一制定密码策略等。
5、更可靠、更短的宕机时间:例如,利用活动目录控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设置
域控与活动目录的区别
活动目录数据库,即拥有层次结构的数据库,简称为 AD 库。
要实现域环境,其实就是要安装AD库。如果内网中的一台计算机上安装了AD,那它就变成了 DC(用于存储活动目录数据库的计算机,即域控)
安全域的划分
在一个用路由器连的内网中,可以将网络划分为三个区域: 内网(安全级别最高)、DMZ(安全级别中等)、外网(安全级别最低),接下来对三个区域分别进行简单介绍。
内网
内网:其拥有两个区:
1、核心区(存储企业最重要的数据、文档等信息资产,往往只有很少的主机能访问)
2、办公区(公司员工日常的工作区,一般能够访问DMZ,部分主机可访问核心区)
DMZ
DMZ( Zone,称为隔离区) ,其是一个非安全系统与安全系统之间的缓冲区,也就是说, DMZ一般位于内网和外部网络之间。这里主要用于对外提供服务,可以在此放置一些必须公开的服务器设施,例如 企业Web服务器、FTP服务器和论坛服务器等
外网
,安全级别最低。
三者关系
在配置一个拥有DMZ的网络时,通常需要定义如下访问控制策略,以实现其屏障功能。
1、内网可以访问外网:内网用户需要自由地访问外网
2、内网可以访问DMZ:此策略使内网用户可以使用或者管理DMZ中的服务器
3、外网不能访问内网:内网中存储的是公司内部数据,这些数据一般是不允许外网用户访问的(如果要访问,可以通过VPN方式进行)
4、外网可以访问DMZ:因为DMZ中的服务器需要为外界提供服务,所以外网必须可以访问DMZ
5、DMZ不能访问内网:如果不执行此策略,当攻击者攻陷DMZ时,内网将无法受到保护
6、DMZ不能访问外网:此策略也有例外。例如,在DMZ放置了邮件服务器,就要运行访问外网,否则邮件服务器无法正常工作
内网信息搜集网络信息
/all 查看网络配置信息
-ano 查询端口连接情况
route print 查询路由表
**arp -a **查看arp缓存
系统信息
查询系统信息以及补丁列表
**echo %RE%**查询系统体系结构
域相关
net view / 查找域
net group / 用于获取域用户组信息
net user / 用于获取所有域用户列表
net user xxx / 用于查询指定域用户详细信息
net 查看当前工作域
net group " " / 查询域控
wmic get /all 获取域内用户详细信息
user 查询存在的用户
其他
查询进程列表
netsh show 查看防火墙配置
/query /fo LIST /v 查询定时任务
信任协议
运行 2008 或 2008 R2 的域控使用以下两个协议之一对用户和应用程序进行身份验证 :** 版本 5 (V5)**协议或 NTLM(New ) 。
NTLM是 NT早期的信任协议,现在的、2003等服务器,都是默认采用的,只有在事务中任意台计算器不支持时,才会使用NTLM。
协议
是一种网络身份验证协议。它旨在使用密钥加密技术为客户端/服务端应用程序提供强身份验证。
这个协议主要涉及三个角色
1、访问服务的客户端(Client): Kerberos客户端代表需要访问资源的用户进行操作的应用程序,例如打开文件、查询数据库等。每个Kerberos客户端在访问资源前都会请求身份验证。
2、提供服务的服务端(Server): 域内提供服务的服务端,服务都有唯一的服务主体名称(SPN)
3、提供认证服务的密钥分发中心(KDC,Key Distribution Center):
KDC是一种网络服务,它向活动目录域内的用户和计算机提供会话票据和临时会话密钥,其服务账号为krbtgt(创建活动目录时系统自动生成的用户,其密码由系统随机生成,无法正常登录主机)。KDC运行在每个域控制器上。
他们的关系如下图所示
他们的关系即 要访问 ,则必须需要 票据 ,而 票据 则是由 KDC 提供
针对 KDC ,这里需要进行简单说明
KDC 一般安装在 域控中 , KDC 具体分为两部分
和
前者的作用是用于验证 的身份(类似我们刷脸验证,确认与身份证上的人一致),如果验证通过,就会颁发 TGT( )票据 给 。而后者的作用是通过 颁发的TGT票据 换取 服务端 的 票据(类似电影票二维码扫码取票操作)。
认证过程
首先,在开始之前对稍后需要用到的名词进行简单介绍
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用户:创建域控时由系统自动生成的用户。
过程一
通过As验证,获取TGT
当要访问时,需要AS来进行身份认证,输入账密,并向KDC发送一个(由使用了的NTLM- Hash加密的时间戳、信息以及信息等组成)。
As收到服务端发送的,首先向AD查询是否存在此用户,存在的话则用此用户的NTLM- Hash来进行解密,如果解密成功,且解密后得到的时间戳与当时的时间相差在5分钟内则认为其认证成功。
这里之所以限制5分钟,是为了保证的安全,在传输它的过程中,可能会被黑客截获,如果黑客想进行重放攻击,就需要花费一定时间,所以五分钟就起到了包含的作用
这里存在两个验证
1、Client对As的验证
2、As如何判断此Client为真
第一个,如何判断As为真,使用的NTLM-Hash进行加密,如果As为真则可以正常解密。
第二个,如何验证为真,如果为真,则As用的NTLM-Hash是可以正确解密出来的。
接下来AS会生成一个,由两部分组成
1、As生成的临时密钥Session-key,然后使用Client的NTLM-Hash加密,用于Client和KDC进行安全通信
2、TGT,内容由使用特定用户krbtgt的NTLM-Hash加密的Sessions-key、时间戳以及部分用户信息组成
过程二
与TGS认证,获取ST服务票据
当收到了As的时,会使用自己的NTLM-Hash,将被加密过的临时密钥- key进行解密,然后将其保存在本地,如果需要访问时就可以构成(包含- key、加密的时间戳以及服务端信息、用户NTLM-Hash加密的TGT等)提交给TGS,从而获取对应的ST
当TGS收到后,首先对用户NTLM-Hash加密的TGT进行解密,目的是得到- key、时间戳以及服务端信息等。与过程一类似,它有一个时间校验机制,如果时间戳和解密时间相差太久则终止验证,同时TGS会根据TGT里的信息和当前信息进行比对,判断是否为同一人,判断无误后会去判断此是否拥有访问的权限,若有则返回,它由两部分组成
1、TGS生成的新Session-key,然后再使用第一个过程中As生成的Session-key进行加密。
2、使用Server的NTLM-Hash加密的Sessions-key(由TGS生成的)、时间戳以及用户信息,此即ST服务票据
在此过程中存在一个验证
1、TGS如何判断Client为真
这里一开始解密的是-key(As生成的),而这个-key处了Dc就只有知道。
过程三
收到了,得到加密的-key,接下来操作同上,利用刚刚存储的- key(As生成的)对-key(TGS生成的)进行解密,得到未加密的-key(TGS生成的),然后存储在本地。
当需要访问时,会发生
由-key(TGS生成的)、时间戳、服务端信息等内容组成,然后再把ST服务票据一同发送给。
收到使用自己的NTLM-Hash对ST服务票据进行解密,拿到- key(TGS生成的)、时间戳、服务端信息等数据,而后根据ST内的时间戳与解密时时间作对比,如果时间未超过8小时则验证成功,反之失败。然后询问DC该用户是否有访问权限,如果有则允许访问
图示如下(摘自先知社区,不过好像是来源于csdn的,但未在csdn中找到)
NTLM协议
在学习 NTLM协议前,首先需要了解两个基本概念,SSPI和SSP
SSPI
**SSPI( ,安全服务提供接口)**是定义的一套接口,该接口定义了与安全有关的功能函数,包含但不限于:
身份验证机制
为其他协议提供的 Session Securtiy机制
但SSPI仅仅只是定义了一套接口函数,并未实现具体内容。
SSP
**SSP( ,安全服务提供者)**是SSPI的实现者。微软自己实现了很多SSP,用于提供安全功能,包含但不限于:
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协议。提供单点登录功能
关系图如下
LM Hash
LM hash 本质是DES加密,目前已将LM Hash禁用(从 Vista 和 2008开始,原因是容易被破解)。LM Hash明文密码被限定在14位以内,也就是说,若要停止使用LM Hash,将用户密码设置为14位以上即可。
LM Hash 的加密流程如下,这里以P@为例
1、将用户的明文口令转换为大写,并转换为十六进制字符串
p@ss1234 -> P@SS1234 -> 5040535331323334
2、如果转换后的十六进制字符串长度不足14Byte(长度28),则用0来补全
5040535331323334 -> 5040535331323334000000000000
3、 将14B分为两组,每组7B,然后转换为二进制数据,每组二进制数据长度为56bit
4、将每组二进制数据按7bit为一组,分为8组,每组末尾加0,再转换为十六进制,此时每组也就成了8B长度的十六进制数据了
5、将生成的两组8B的十六进制数据,分别作为DES加密秘钥对字符串"KGS!@#S%"进行加密。而后将密文进行拼接,即可得到最终的LM Hash值
NTLM Hash加密算法
NTLM Hash 算法是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法,它是基于MD4加密算法进行加密的。
其加密流程如下,这里仍以明文密码P@为例
1、将用户密码转换为十六进制格式
P@ss1234 -> 5040535331323334
2、将ASCII编码的十六进制格式的字符串转为Unicode编码
5040535331323334 -> 50004000730073003100320033003400
3、对Unicode编码的十六进制字符串进行标准MD4单向Hash加密
50004000730073003100320033003400 -> 74520a4ec2626e3638066146a0d5ceae
上述过程亦可用 实现,代码如下
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)
系统存储的NTLM Hash
在环境中,用户的密码经过NTLM Hash加密后存储在C:\\\\SAM文件中。它的认证过程如下所示:
在用户输入密码进行本地认证过程中,所有操作都是于本地进行的,系统将密码转换为NTLM Hash,而后与SAM文件中的NTLM Hash进行比较,相同则密码正确。
接下来说一点其他的,是如何抓取密码的呢。这里也牵扯到这个,具体如下:
当用户注销、重启、锁屏后,操作系统就会让.exe显示登录界面,也就是输入框。当.exe接收输入后,将密码交给lsass.exe进程,lsass.exe进程中会存一份明文密码,我们使用就是从这里(lsass.exe进程)抓取明文密码或者Hash密码。
NTLM协议认证
NTLM协议 是基于一种 质询/响应 的验证机制,其由三种类型消息组成
Type 1 (协商)
Type 2 (质询)
Type 3 (认证)
工作组环境的NTLM认证流程如下图所示
具体认证过程如下
1、当客户端需要访问服务器的某个服务时,就需要进行身份验证。此时客户端输入用户名和密码进行验证后,就会在本地缓存一份服务器密码的值,而后客户端向服务端发送一个请求(包含服务器用户名和其他一些需要协商的消息),此过程为Type 1 协商消息
2、服务端收到客户端消息后,读取服务端所支持的内容,取出部分信息传入(部分信息指的是自己能接受的服务内容、加密等级、安全服务等),得到Type 2质询消息,并将此发回给客户端(消息包含16位的随机质询值,服务端也会有缓存)
3、客户端收到Type 2消息后,读取服务端内容并取出,而后用过程1中本地缓存的对进行加密得到消息。最后将、用户名以及其他信息封装到消息中(Type3认证消息),发往服务端
4、服务端收到验证消息后,取出Net-NTLM Hash,而后用自己密码的对过程2中的值进行加密,得到自己的Net-,比较两者是否相等,如果相等,则说明密码正确,反之则错误,认证失败。
参考文献
《域渗透攻防指南》
《内网安全攻防:渗透测试实战指南》
网络安全学习路线图(思维导图)
网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。
1. 网络安全视频资料
2. 网络安全笔记/面试题
3. 网安电子书PDF资料
~