目录
介绍:
域渗透一般因为没有一个好的环境,而且网上的教程比较碎片化,看的人比较难懂,这里打算做一个系列教程,将整个域渗透的渗透方式进行讲解,怎么说,自己能力也毕竟有限,文章中如果出现纰漏还是希望能指出。
一般我对域渗透的一个流程如下:
- 拿到一台主机后首先判断是否存在域环境
- 当存在域环境以后获取一些基本信息,如域用户,域主机名和域控等信息
- 判断自己所处的域组,判断自己当前的权限和内网所处的位置
- 查看自己当前获取主机的权限,如果权限低就要尝试越权,拿到当前主机的最高权限,然后使用工具抓取本机密码
- 使用得到的信息内网hash碰撞看能拿到几台主机,碰运气,哈哈
- 同时测试域控是否存在网上公开的漏洞,如果存在那就恭喜你,差不多成功一半了。
- 如果不存在漏洞,呵呵,那就比较尴尬了,只能尝试一点一点拿到域控管理员的hash,这中间就涉及到很多,比如黄金票据,白银票据等等攻击方式,总之就是一句话就是为了得到域控权限
差不多就上述的一个流程,如果域控存在漏洞,那很快就可以搞定,但是如果防御比较好,周期就比较长了,而且中间要涉及木马免杀,代理,流量加密和病毒隐秘等等,总之内网渗透比web渗透难度高很多,但是更有意思,下面我会依此进行介绍。
域基础:
首先我们要对域中的一些基础概念有所熟悉,域中的加密方式,身份验证的哪个
什么是域:
首先说下什么是工作组,工作组就是局域网中对不同用户进行分类,我们可以右击我的电脑的属性,发现可以直接看到所处的工作组。工作组的凭证都是放在本地的,每个主机只能使用自己的账号进行登录,而且工作组电脑计算机数量大概20台左右
域(Domain)是一个有安全边界的集合,是一个逻辑概念域模式,域就是针对大型的网络管理需求设计的,就是共享用户账号,计算机账号和安全策略的计算机集合,我们在域环境中如果权限允许,我们可以访问任何一台主机,身份验证是采用Kerberos协议在域控制器上进行的,登陆到此计算机则是通过SAM来进行NTLM验证的,域分为域,域树,林和组织单元。
DC和AD是什么:
域控制器(Domain Controller,DC),为一台或多台管理服务器的计算机,域控制器中包含了由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。当电脑联入网络时,域控制器首先要鉴别这台电脑是否是属于这个域的,用户使用的登录账号是否存在、密码是否正确。如果以上信息有一样不正确,那么域控制器就会拒绝这个用户从这台电脑登录
活动目录(Active Directory,AD),它基于DNS,以树状结构存储了一个域内有关网络对象,其中包含所有域用户和计算机帐户的密码哈希值。它提供基础网络服务(DNS/DHCP等)、计算机管理、用户服务、资源管理、桌面配置、应用系统支撑等功能。
域可以理解为连接到域控制器(Domain Controller,DC)管理的主机这个范围就是一个域环境,而DC可以简单的理解为安装了活动目录(Active Directory,AD)的主机,安装了活动目录的计算机就称为域控制器,一个域环境可以有多台DC,一般公司环境中多为主副DC。
hash密码管理:
Hash主要用于信息安全领域中加密算法,渗透测试中获取目标系统的明文或Hash往往是整个渗透测试过程中重要的一环。 在Windows系统中本机用户的密码Hash是放在本地的SAM文件里面,域内用户的密码Hash是存在域控的NTDS.DIT文件里面
SAM:%SystemRoot%\System32\config\SAM
ntds.dit:c:\windows\system32\ntds\ntds.dit
Windows操作系统通常使用两种方法对用户的密码进行哈希处理,即 LAN Manager(LM)哈希和 NT LAN Manager(NTLM)哈希 。其中,NTLM-HASH比LM-HASH的安全性要更高,自Windows Vista和Windows Server 2008开始,Windows取消LM hash。当系统为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码。
hash密码格式
用户名称:RID:LM-HASH值:NT-HASH值
例如:
Administrator:500:42a1942e00104580284d9e72274ea28a:05e120f8683aed55b5fade25aa9af6cb:::
用户名称为:Administrator
RID为:500
LM-HASH值为:42a1942e00104580284d9e72274ea28a
NT-HASH值为:05e120f8683aed55b5fade25aa9af6cb
Kerberos协议:
Kerberos协议是一种网络认证协议,其存在主要是为了证明我是谁这个问题,首先我们需要了解在一次认证中,下面三个是必须存在的:
- 客户端(client):发送请求的一方
- 服务端(Server):接收请求的一方
- 密钥分发中心(Key Distribution Center,KDC),而密钥分发中心一般又分为两部分,分别是:
- AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据)
- TGS(Ticket Granting Ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(Ticket)
Authentication Service:AS的作用就是验证Client端的身份,验证通过之后,AS就会将TGT票据(Ticket Granting Ticket)给Client. Ticket-granting ticket(TGT):TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT. Ticket-granting cookie(TGC):存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此Cookie值对应的用户信息. Ticket Granting Service(TGS):TGS的作用是通过AS发送给Client的TGT换取访问Server端的ST(Server Ticket)给Client. SEerver Ticket(ST):ST服务票据,由TGS服务发布.
Kerberos协议认证流程简单描述如下,图是借用网上的,画的很容易理解:
(1)Client向KDC的AS认证服务请求TGT票据=>AS_REQ (2)Client通过认证后,KDC将会发放TGT票据=>AS_REP (3)Client带上TGT票据,向TGS认证服务请求ST服务票据=>TGS_REQ (4)Client通过了TGS认证服务后,TGS将会发放ST服务票据=>TGS_REP (5)Client使用ST服务票据向服务端请求服务=>AP_REQ (6)Server拿到PAC询问KDC,Client是否有权限 (7)KDC将Client的权限信息发给Server (8)Server根据KDC返回的权限信息对比,判断Client是否有权限访问该服务,并把结果返回给Client=>AP_REP
IPC通信:
域渗透中经常会用到IPC通信,它是为了让进程间通信而开放的命名管道,通过验证账号和密码,连接双方可以建立安全的通道并以此通道进行加密数据的交换。IPC$
连接可以实现远程登陆及对默认共享的访问,而139
端口的开启表示netbios
协议的应用。我们可以通过139
和445
端口来实现对共享文件/打印机的访问。
Windows
系统中的net use ipc$
整个通信过程,先445->137->139
验证,当你开启防火墙禁用445
,发现系统命令就无法连接IPC
了,因为根本没机会走到139
,所以使用系统自带命令连接的ipc$
需要同时开启这些端口
常用命令:
建立正常连接
net use \\192.168.1.1\ipc$ "123456" /user:"administrator"
查看本机连接共享情况
net use
远程C盘映射到本地z盘:
net use z: \\192.168.1.1\c$ "123456" /user:"administrator"
查看已建立连接目标主机的共享资源
net view \\192.168.1.1
查看目标主机时间
net time \\192.168.1.1
删除本机与指定ip建立的连接
net use \\192.168.1.1\ipc$ /del /y
删除本机所有已建立的连接
net use * /del /y
另外可以使用PSEXEC或Impacket执行命令。
域内信息收集:
常用命令:
域命令:
查看是否存在域 net config workstation
判断主域 net time /domain
查看是否存在多台域 net group "domain controllers" /domain
查询域工作组 net group /domain
查询域管理员列表 net group "domain admins" /domain
查看域信任 nltest /domain_trusts
查看域用户 net user /domain
查看域主机 net group "domain computers" /domain
windows命令:
查看开发端口 netstat -ano
查看SMB共享 net share
路由表 route print
路由跟踪 tracert IP
本地ARP arp -a
查看进程(显示用户) tasklist /V
查看进程 tasklist /svc
关闭进程 taskkill /T /F /PID 13140
查看所有盘符 fsutil fsinfo drives
查看启动项 wmic startup
查看后缀名文件有password关键字的文件 findstr /si password *.xml *.ini *.txt
查看存到注册表中的密码 REG query HKCU /v "pwd" /s
获取wifi密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan showprofiles') do @echo%j | findstr -i -v echo | netsh wlan show profiles %jkey=clear
查看是否支持powershell
if defined PSModulePath (echo support powershell) else (echo not support powershell)
域信息收集(实操):
为了更真实,我这里采用cs+kali来进行测试,测试环境如下:
域winserver 12:192.168.1.3
域内主机win 10:192.168.1.6
kali:192.168.1.5
确定域控信息:
net config workstation
可以看到存在域 galaxy.org
确定主域:
net time /domain (这里拿到的是主域,当域环境较大时,会有多台域控服务器)
确定域控IP:
ping -4 -n 1 WIN-Q7LOKMBEHNU.galaxy.org (注意,有些时候直接ping得到的是IPV6地址,需要使用-4 拿ipv4地址)
这里我们知道存在域,且域控信息如下:
WIN-Q7LOKMBEHNU.galaxy.org 192.168.1.3
确定是否存在多台域控:
net group "domain controllers" /domain
确定是否存在域森林:
nltest /domain_trusts
针对域控的信息收集可以知道,这是一个小型的内网环境,仅有一台域控服务器为WIN-Q7LOKMBEHNU.galaxy.org且ip为192.168.1.3,只是一个简单的域环境,没有域森林。
收集域内信息:
下面我们就要对域内环境进行一个收集,包括域主机,域用户等进行收集,然后处理
首先收集域工作组:
net group /domain
看以看到我之前新建的三个组:
Finance Deparment,Sales Deparment,Product Deparment
查看域管理员:
可以知道该域管理员为Administrator
获取域用户:
net user /domain
这里我们最好制作一个user本,方便后续的破解等操作
awk '{print $1,$2,$3}' user.txt | tr " " "\n" | awk '{if(length !=0) print $0}' >> user_ok.txt
sed "s/$/&@galaxy.org/g" user_ok.txt >> user_galaxy.tx
同样收集域主机列表:
这里我的环境比较简单,只有一台域用户主机,但是麻雀虽小五脏俱全,还是走一遍
awk '{print $1,$2,$3}' computer.txt | tr ' ' '\n' | awk '{if(length !=0) print $0}' >> computer_ok.txt
sed "s/\\$/.galaxy.org/g" computer_ok.txt >> computer_galaxy.txt
总结:
通过几条命令的收集我们可以知道如下信息:
- 确定了是否存在域,并得到了域控主机名,域控主机地址和域控下的管理员用户;
- 收集得到域用户本和域机器本,可用于后期的破解和嗅探;
- 根据获取到的信息大概可以估计出整个域的大小和自己所处的位置,然后进行第二步工作;
BloodHound使用:
当域比较大的时候,我们可以选择使用BloodHound来获取整个域的信息,使用起来方式也很简单,首先下载BloodHound程序,下载地址:
https://github.com/BloodHoundAD/BloodHound/releases/download/2.0.4/BloodHound-win32-x64.zip
使用方法百度上有很多,可以搜索安装运行下。说白了就是先启动neo4j数据库,然后使用BloodHound去连接数据库,在页面访问输入账号密码后,用一个收集器在域主机上执行后其会去收集域的信息,然后进行整理后生成zip文件,然后导入,就可以看到分析的结果,具体的使用方法后续会讲解。