横向移动
域内漏洞
| 漏洞 | 类型 |
|---|---|
| MS17-010 | 普通漏洞-横向移动 |
| MS14-068 | 域提权漏洞 |
| CVE-2020-1472 NetLogon 权限提升漏洞 | 域提权漏洞 |
| CVE-2021-1675 Windows Print Spooler 权限提升漏洞 | 域提权漏洞 |
MS17-010
MS14-068
漏洞介绍
KDC 无法正确检查 ST 中的 PAC 的有效签名,导致用户可以自己构造一张高权限的 PAC 并通过校验。
PAC 包含两个签名,上面有介绍,它们分别使用的是服务秘钥和 KDC 秘钥进行签名,由于这个签名允许使用所有的 checksum 算法,包括 MD5,而 MD5 是不需要使用 key 的,所以我们就可以去修改 PAC 的内容,再使用 MD5 去生成一个服务校验和和 KDC 校验和来通过 KDC 的校验。
漏洞利用
利用条件:
- 域控没有 KB3011780 补丁
- 有一个域内的账户名和密码
工具地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
1 | |
CVE-2020-1472
漏洞介绍
在 2020 年 8 月份微软公布的安全公告中,有一个十分紧急的漏洞——CVE-2020-1472 NetLogon 权限提升漏洞。
通过该漏洞,未经身份的验证者只需要能访问到域控的 135 端口即可通过使用 Netlogon 远程协议(MS-NRPC)连接域控制器并重置域控的机器账号的哈希,从而导致攻击者可以通过域控的机器账号导出域内所有用户哈希( 域控的机器账号具有 Dcsync 权限,使用 Dcsync 导出域内哈希,需要域控开启 445 端口),进而接管整个域。
所以这个漏洞完整的利用,需要域控开启 135 和 445 端口。
影响版本:
- Windows Server 2008 R2 for x64-based Systems Service Pack 1
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
- Windows Server 2012
- Windows Server 2012 (Server Core installation)
- Windows Server 2012 R2
- Windows Server 2012 R2 (Server Core installation)
- Windows Server 2016
- Windows Server 2016 (Server Core installation)
- Windows Server 2019
- Windows Server 2019 (Server Core installation)
- Windows Server, version 1903 (Server Core installation)
- Windows Server, version 1909 (Server Core installation)
- Windows Server, version 2004 (Server Core installation)
漏洞利用
利用流程:
- 检测漏洞
- 重置域控 Hash 为空
- impacket secretsdump.py 导出域内所有 Hash,使用这些 Hash 可以进行 PTH
- 从域控 SAM 中提取原始 Hash 去复原域控 Hash
漏洞检测:
https://github.com/SecuraBV/CVE-2020-1472
1 | |
重置域控 Hash:
https://github.com/blackarrowsec/redteam-research/tree/master/CVE-2020-1472
1 | |
impacket 导出域内所有 Hash:
1 | |
恢复域控 Hash:
在攻击成功后,一定要恢复域控的机器用户的原始哈希,不然可能会出现域控重启后无法开机、脱域等情况!
其原因在于我们是将 ntds.dit 中的域控机器密码置为空了,但是域控本地注册表和 lsass 进程中的密码并没有改变,这就导致了机器用户在 AD 中的密码与本地的注册表和 lsass 进程里面的密码不一致,所以可能会出现域控重启后无法开机、脱域等情况。
因为本地的并没有变化,所以就可以从 SAM 中提取原来域控的 Hash:
1 | |
还原 Hash:
https://github.com/risksense/zerologon
1 | |
CVE-2021-1675
漏洞介绍
Print Spooler 是 Windows 系统中用于管理打印相关事务的服务,在 Windows 系统中用于后台执行打印作业并处理与打印机的交互,该服务管理所有本地和网络打印队列及控制所有打印工作。
该服务对应的进程 spoolsv.exe 以 SYSTEM 权限执行。其设计中存在的一个严重缺陷,由于 SeLoadDriverPrivilege 中鉴权存在代码缺陷,参数可以被攻击者控制,普通用户可以通过 RPC 触发 RpcAddPrinterDrive 绕过安全检查并写入恶意驱动程序。
如果域控存在此漏洞,域中普通用户即可通过远程连接域控 Spooler 服务,向域控中添加恶意驱动,从而控制整个域环境。
影响版本:
- Windows 7
- Windows 8.1
- Windows Server 2008
- Windows Server 2012
- Windows Server 2016
- Windows Server 2019
- Windows 10
漏洞利用
impacket 检测 MS-RPRN 服务是否开启:
1 | |
产品漏洞
vcenter
待补充
服务漏洞
https://blog.csdn.net/weixin_42253265/article/details/122945413
服务漏洞这里主要就是利用 fscan、Landon 等工具扫到的弱口令,利用弱口令进行进一步的横向移动。
在拿到新密码后就可以再进行一次服务口令的扫描,比如翻到数据库配置文件、web 弱口令、抓密码等等。
| 端口 | |
|---|---|
| 22 | SSH |
| 1433 | MSSQL |
| 1521 | Oracle |
| 3306 | MySQL |
| 3389 | RDP |
| 5432 | PostgreSQL |
| 6379 | Redis |
1 | |
待整理….
PTH
横向移动比较常见的就是 PTH 攻击,也就是 Hash 传递,由于在 NTLM 和 Kerberos 认证过程中都是使用用户密码的 NTLM Hash 来进行加密,没有用到明文密码,所以可以直接利用 NTLM Hash 来进行认证。
在拿到对方的 NTLM Hash 或者明文密码后,就可以利用该凭证去碰撞域内其他机器,实现横向移动,一般在域环境下,相同密码是很多的。明文密码可以直接对其他服务进行碰撞比如数据库等也可以实现横向移动。
| 端口 | 工具 | 说明 |
|---|---|---|
| 135 | wmihacker, sharpwmi | wmi 注册表回显 |
| 135,445 | wmiexec, wmiexec.vbs | wmi smb 回显 |
| 139,445 | atexec, psexec, smbexec | smb |
| 5985,5986 | winrm | winrm |
基础知识
为了更好的报告本地管理员组中的用户,微软在网络上实现了 UAC 限制机制,当内置的 administrator 进行远程连接时会直接得到具有管理员凭证的令牌,而非 administrator 的本地管理员账户进行远程连接时,会得到一个删除了管理员凭证的令牌。
在横向移动时,关于 administrator 账号和普通管理员组中账号的一些区别,涉及到 LocalAccountTokenFilterPolicy 值。
在 Windows Vista 以后的操作系统中,默认没有 LocalAccountTokenFilterPolicy 注册表值,其引入了一种默认开启的remote UAC,计算机的任何非 SID 500 本地管理员帐户,用户在远程计算机上没有特权提升能力,并且用户无法执行管理任务。
这种情况下内置的管理员账户 administrator 进行远程连接时会直接得到具有管理员凭证的令牌,而非 administrator 的本地管理员账户进行远程连接时,会得到一个删除了管理员凭证的令牌。
而域用户不受此影响。也就是说,在工作组环境中,只有 administrator 账号才能建立具备管理员权限的远程连接,其他本地管理员账户建立需要管理员权限的远程连接时会提示权限不足。
而在域环境中,只要是域管理员都可以建立具备管理员权限的远程连接。所以,在域环境中,远程连接域控可以使用域管理员,远程连接普通域主机可以使用普通域成员。
而在工作组环境中,远程连接主机只能使用 administrator 账号,而不能使用其他管理员账号。
简单来说就是工作组环境下,我们拿到对方非 administrator 用户的账号密码,是无法进行 ps,smb,wmi 等进行横向移动的。
看了下绕过这种限制的方法,无一例外都是需要对方去操作从而给 LocalAccountTokenFilterPolicy 赋值,但是这就没有多大意义了,本身就是横向移动,都能执行命令了,还横向干嘛。
https://xz.aliyun.com/t/6888?time__1311=n4%2BxnD0Dg7nE3DsAYxCqrrDcDjow7A7aoD
PTH 的主要手法就是抓本台机器的密码,然后利用抓到的 Hash 或者明文密码去碰撞其他机器,成功后再重复该操作。直到可以横向到域控,或者拿下域管理员的 Hash。
135 端口
wmic 是 windows 管理仪表命令行( Windows Management Instrumentation Command-line )的简称,它是一款命令行管理工具,提供了从命令行接口到批量命令脚本执行系统管理的支持,可以说是 Windows 平台下最有用的命令行工具。
使用 wmic ,我们不但可以管理本地计算机,还可以管理统一局域网内的所有远程计算机(需要必要的权限),而被管理的计算机不必事先安装 wmic 。自
Windows98 开始,Windows 操作系统都支持 wmic,wmic 是一系列工具集组成的。
在用 wmic 执行命令过程中,操作系统默认不会将 wmic 的操作记录在日志中,因此在这个过程中不会产生日志,只会在登录的时候产生登录日志。所以越来越多的攻击者由 psexec、smbexec 转向 wmic 。
wmic 的使用需要对方开启 135 端口和 admin$ 共享,135 端口是 wmic 默认的管理端口。
impacket 下的 wmiexec.py 脚本,需要 135 端口和 445 端口同时开启并且需要 admin$ 共享。
135 端口用 RPC 来执行命令,445 端口用来读取回显。准确说、如果要把输出结果写⽂件的话,需要用 smb 回传。
如果写注册表的话,直接用 wmi 就能回来了,就不需要⾛ 445 了。
SharpWmi 和 WmiHacker 这两个项目就是利用注册表来读取执行结果,因此只需要 135 端口和 admin$ 共享即可,不需要 445 端口。优点是免杀性能,缺点就是需要明文密码而非 Hash。
不过好的是有前辈实现了该功能并且提交 crackMapExec 了 ,目前已经集成了这个功能了:
- https://cloud.tencent.com/developer/article/2329497
- https://github.com/byt3bl33d3r/CrackMapExec/pull/657
445 端口
SMB(Server Message Block,服务器消息块),又称 CIFS(Common Internet File System,网络文件共享系统),主要功能是使网络上的计算机能够共享计算机文件、打印机、串行端口和通信等资源。
SMB 消息一般使用 NetBIOS 协议或 TCP 发送,分别使用端口 139 或 445,目前倾向于使用 445 端口。
IPC$
IPC$ (Internet Process Connection) 是共享”命名管道”的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
IPC$是 NT2000 的一项新功能,它有一个特点,即在同一时间内,两个 IP 之间只允许建立一个连接。
NT2000 在提供了 IPC$共享功能的同时,在初次安装系统时还打开了默认共享,即所有的逻辑共享(C$、D$、E$……)和系统目录共享(admin$),但要注意,这些共享是隐藏的,只有管理员能够对他们进行远程操作。
所以非管理员用户建立连接后的权限很低,仅能执行查看时间的命令,也就是非管理员建立连接是无法进行横向移动的。
不过不管是连接或者是被连接,都相当于双方建立连接,所以是可以双向进行操作的。
1 | |
可以发现 IPC$ 是可以直接操作文件的,其横向移动的思路就是移动文件到目标机器,然后想办法触发该文件实现上线。
因为 windows 大部分命令的操作对象都可以是远程连接机器的资源,主要的利用方式有:
- 计划任务:移动文件到目标机器,然后远程创建一个计划任务去执行该文件
- 注册服务:移动文件到目标机器,然后远程创建并启动服务去执行该文件
简单贴下命令:
1 | |
感觉更多情况下可能是发现有别的机器连上了被控主机,那么就可以进行这些操作实现一个横向移动。
psexec
psexec 的基本原理是:通过管道上传一个二进制文件到目标机器的 C:\Windows 目录,并在远程目标机器上创建一个服务。然后,通过该服务运行二进制文件,运行结束后删除服务和二进制文件。
由于创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志反推攻击流程。
并且该工具在执行上传的二进制文件时,会被杀毒软件查杀。所以在实战中不建议使用!
利用条件:目标主机开启 445 端口和 admin$共享。因为 psexec 要往 C:\Windows 目录( admin$ ) 下写二进制文件。对于 impacket 下的 psexec.py,除了 admin$共享外,还可以使用 C$ 共享。( 其实都是写到 C:\Windows 目录下,所以 C$ 共享才可以 )
微软也提供有 Psexec 工具,该工具只依赖于 445 端口和 admin$共享,并且其上传的二进制文件名固定为 PSEXESVC.exe,创建的服务名固定为 PSEXESVC。
https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
1 | |
smbexec
smbexec 是一个类似 psexec 的使用 RemComSvc 技术的工具,该工具通过文件共享在远程系统中创建服务,将要运行的命令通过服务写在 bat 文件中来执行,然后将执行的结果写在文件中来读取执行命令的输出,最后将 bat 文件、输出文件和服务都删除。
虽然这种技术可能有助于躲避 AV ( 免杀,不会被杀毒软件查杀!),但是创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志
反推攻击流程。
该攻击依赖于 445 端口,可以使用除 ipc$ 共享外的其他所有共享。
总体来说,免杀很方便,简单测试了下,安了个火绒,wmiHacker、psexec 都噶了,smbexec 还可以。不过容易被溯源。
5985 端口
WinRM 是 Windows Remote Managementd( Windows 远程管理 )的简称。它基于 Web 服务管理(WebService-Management)标准,WinRM2.0 默认端口 5985(HTTP 端口)或 5986(HTTPS 端口)。
如果所有的机器都是在域环境下,则可以使用默认的 5985 端口,否则的话需要使用 HTTPS 传输(5986 端口)。
使用 WinRM 我们可以在对方有设置防火墙的情况下远程管理这台服务器,因为启动 WinRM 服务后,防火墙默认会放行 5985 端口。WinRM 服务在 Windows Server 2012 及以上服务器自动启动。
在 WindowsVista 上,服务必须手动启动。 WinRM 的好处在于,这种远程连接不容易被察觉到,也不会占用远程连接数!
这里需要注意的是,通过 WinRM 远程连接也是受到 LocalAccountTokenFilterPolicy 的值影响的。
命令执行主要使用的是 winrs( windows 远程 shell )是 WinRM 的””客户端”,可以用它很简单去执行命令。
1 | |
扫描的话 crackMapExec 就可以实现。
相关工具
1 | |
WmiHacker
项目地址:https://github.com/rootclay/WMIHACKER
1 | |
SharpWmi
项目地址:https://github.com/QAX-A-Team/sharpwmi
1 | |
impacket
项目地址:https://github.com/fortra/impacket
1 | |
[-] module ‘collections’ has no attribute ‘Callable’
https://blog.csdn.net/K_essi/article/details/126047493
smbexec 繁体中文:
1 | |
crackMapExec
https://github.com/Pennyw0rth/NetExec
安装文档:https://github.com/byt3bl33d3r/CrackMapExec/wiki/Installation
1 | |
CrackMapExec 可以说是一款批量 PTH 的工具,可以去批量探测,批量执行命令,很方便。在拿到凭证后后,如果机器多就可以直接使用 CrackMapExec 进行批量密码喷洒,很方便。
1 | |
1 | |
1 | |