跳转到帖子

授权渗透中发现疑似内网横向移动痕迹,如何定位与收敛权限边界?

精选回复

发布于

背景

最近在一次授权内网渗透复测中,客户提出一个典型问题:域内某台运维跳板机曾出现异常登录,EDR 没有明确告警,但 Windows 安全日志里能看到多次 4624 登录成功事件,目标账号具备较高权限。客户想确认这是否属于横向移动痕迹,以及后续如何限制影响面。

这类问题放在问答中心更合适,因为它不是单点漏洞利用,也不是单纯工具使用,而是需要结合授权范围、日志证据、权限边界和修复建议一起判断。下面按实际排查思路整理一份可执行流程。

问题定位

场景假设如下:

  • 环境:Windows 域环境,存在域控、文件服务器、运维跳板机、若干业务服务器。
  • 异常主机:运维跳板机 10.10.20.15。
  • 异常账号:corp\ops-admin。
  • 客户已授权检查日志、账号权限、主机登录记录,但不允许进行破坏性测试。
  • 目标:确认是否存在横向登录、凭据滥用、权限过宽,并给出可落地修复建议。

排查重点不是直接判定“被入侵”,而是先回答三个问题:

  • 这个账号从哪里登录过来?
  • 登录方式是什么?交互式、远程桌面、网络登录还是服务登录?
  • 该账号是否具备不必要的本地管理员或域级权限?

技术分析

Windows 安全日志中,常用事件 ID 有以下几个:

事件 ID含义关注点
4624登录成功Logon Type、来源 IP、目标账号
4625登录失败是否存在爆破、口令喷洒
4672分配特殊权限是否使用高权限账号登录
4688进程创建是否执行远程管理命令,需要开启审计
7045创建服务常见于远程服务执行链路
5140访问共享是否访问 ADMIN$、C$、IPC$

其中 Logon Type 很关键:

  • 2:本地交互式登录。
  • 3:网络登录,常见于 SMB、远程服务、访问共享。
  • 7:解锁登录。
  • 10:远程桌面 RDP。
  • 11:缓存域凭据登录。

如果在业务服务器上看到 corp\ops-admin 的 4624 且 Logon Type=3,同时伴随 ADMIN$ 访问、7045 创建服务,就要重点怀疑存在远程执行或运维工具误用。如果是 Logon Type=10,则更偏向 RDP 登录链路。

操作步骤

建议按以下顺序排查,避免一上来就跑大量工具导致日志噪声过大。

  • 第一步:确认异常账号最近登录过哪些主机。
  • 第二步:在目标主机上查看 4624、4672、7045、5140 等事件。
  • 第三步:核对该账号是否属于 Domain Admins、Enterprise Admins、Administrators 等高权限组。
  • 第四步:检查跳板机是否保存过凭据,例如 Windows 凭据管理器、计划任务、服务账号配置。
  • 第五步:输出影响范围,按账号、主机、时间线整理证据。

代码/命令示例

下面命令适用于授权排查场景。建议在管理员 PowerShell 中执行,并保存输出作为复盘材料。

# 1. 查询近 3 天指定账号的成功登录事件 4624
$User = "ops-admin"
$StartTime = (Get-Date).AddDays(-3)

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4624
    StartTime = $StartTime
} | Where-Object {
    $_.Properties[5].Value -like "*$User*"
} | Select-Object TimeCreated,
    @{Name='TargetUser';Expression={$_.Properties[5].Value}},
    @{Name='TargetDomain';Expression={$_.Properties[6].Value}},
    @{Name='LogonType';Expression={$_.Properties[8].Value}},
    @{Name='SourceIP';Expression={$_.Properties[18].Value}} |
    Sort-Object TimeCreated

# 2. 查询是否存在特殊权限登录 4672
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4672
    StartTime = $StartTime
} | Where-Object {
    $_.Properties[1].Value -like "*$User*"
} | Select-Object TimeCreated,
    @{Name='Account';Expression={$_.Properties[1].Value}},
    @{Name='Privileges';Expression={$_.Properties[2].Value}}

# 3. 查询系统日志中的服务创建事件 7045
Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Id = 7045
    StartTime = $StartTime
} | Select-Object TimeCreated,
    @{Name='ServiceName';Expression={$_.Properties[0].Value}},
    @{Name='ServiceFileName';Expression={$_.Properties[1].Value}},
    @{Name='ServiceAccount';Expression={$_.Properties[4].Value}}

# 4. 查看当前主机本地管理员组成员
net localgroup administrators

# 5. 查看域账号所属组,需要域环境和相应权限
net user ops-admin /domain

如果环境中部署了 Windows 事件转发或 SIEM,可以把同样逻辑转为查询语句。例如重点筛选:

EventID IN (4624, 4672, 7045, 5140)
AND AccountName = "ops-admin"
AND TimeGenerated > now() - 3d

关键判断点

实际分析时,我一般会用下面几个条件判断风险等级:

  • 同一账号短时间内登录多台服务器,且来源 IP 不符合运维习惯,风险较高。
  • 4624 的 Logon Type=3 后紧跟 7045 创建服务,需重点核查远程执行行为。
  • 出现 ADMIN$、C$ 访问记录,并且访问源是非跳板机,说明权限边界可能已经被绕过。
  • 4672 与 4624 同时出现,说明登录账号被授予特殊权限,不应使用普通业务账号承担此角色。
  • 如果账号属于 Domain Admins,但实际只承担某几台服务器运维任务,属于典型权限过宽。

风险与修复建议

修复不能只改密码。只改密码往往会遗漏横向路径和权限边界问题。

  • 收敛高权限账号:将日常运维账号和域管理账号分离,域管账号只允许在域控或专用管理终端使用。
  • 限制登录范围:通过 GPO 配置 Deny log on locally、Deny log on through Remote Desktop Services,禁止高权限账号登录普通业务服务器。
  • 清理本地管理员组:避免将域用户组大范围加入本地 Administrators,可改用最小权限的分组授权。
  • 启用详细审计:开启进程创建审计 4688,并记录命令行参数,便于还原操作链路。
  • 关闭不必要的管理共享暴露:重点监控 ADMIN$、C$、IPC$ 的异常访问,不建议简单粗暴禁用全部管理能力,应结合运维需求配置访问控制。
  • 检查凭据残留:清理跳板机上的保存凭据、计划任务、服务配置中的明文或弱保护凭据。
  • 强制轮换敏感账号密码:确认影响范围后,对相关高权限账号进行密码轮换,并检查是否存在长期有效的服务票据或会话。

开启进程命令行审计可以使用组策略,也可以在单机上检查注册表配置:

# 开启命令行参数记录,需结合“审核进程创建”策略
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f

# 查看当前审计策略
auditpol /get /subcategory:"Process Creation"

# 开启进程创建审计
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enable

总结

授权渗透或应急复核里,判断横向移动不能只看单个告警,要把账号、来源 IP、登录类型、共享访问、服务创建和权限组关系串起来看。问答中心里类似问题很多,建议提问时至少提供:事件 ID、时间范围、账号名、来源 IP、Logon Type、目标主机角色,以及当前授权边界。信息越完整,越容易给出准确判断。

注意:以上流程仅适用于授权测试、日志排查和防护加固。不要在未授权环境中进行扫描、登录尝试或远程执行验证。
服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
先别急着“清干净”,建议先把横向移动的证据链固化下来,再做权限收敛。否则后面很难判断是授权测试行为、误报,还是已有凭据被复用。 可以按这几个方向定位: ### 1. 先确认横向入口:谁在用什么凭据访问内网主机 如果是 Windows 域环境,重点看 DC 和被访问主机的日志: - DC:4624 / 4627 / 4768 / 4769 / 4776 - 目标主机:4624 / 4672 / 4688 / 7045 / 4697 - RDP:1149、4624 LogonType 10 - SMB/远程服务:4624 LogonType 3 - WinRM:4688 里出现 `wsmprovhost.exe`,以及 PowerShell 日志 4103/4104 在目标机器上可以先快速筛登录源:
Get-WinEvent -FilterHashtable @{
  LogName='Security';
  Id=4624;
  StartTime=(Get-Date).AddDays(-3)
} | Where-Object {
  $_.Properties[8].Value -in 3,10
} | Select-Object TimeCreated,
  @{n='User';e={$_.Properties[5].Value}},
  @{n='Domain';e={$_.Properties[6].Value}},
  @{n='LogonType';e={$_.Properties[8].Value}},
  @{n='SourceIP';e={$_.Properties[18].Value}} |
  Sort-Object TimeCreated
再看是否出现新服务、计划任务、远程命令执行痕迹:
Get-WinEvent -FilterHashtable @{
  LogName='System';
  Id=7045;
  StartTime=(Get-Date).AddDays(-3)
} | Select TimeCreated, ProviderName, Message

Get-ScheduledTask | Where-Object {
  $_.TaskPath -notlike '\Microsoft*'
} | Select TaskName, TaskPath, State
如果有 Sysmon,优先查这些行为: - `psexesvc.exe` - `wmic.exe` - `wmiprvse.exe` 拉起异常进程 - `powershell.exe -enc` - `rundll32/regsvr32/mshta/certutil` - 对 `ADMIN$ / C$ / IPC$` 的访问 ### 2. 查横向移动常见工具痕迹 在被访问主机和跳板机上都查一次:
dir \\127.0.0.1\c$\Windows\Temp
dir C:\Windows\Temp
dir C:\Users\Public
dir C:\ProgramData

sc query type= service state= all | findstr /i "psexec remote smb wmiexec"
SMB 会话和打开文件也可以看:
net session
net use
openfiles /query
如果你们有 EDR/SIEM,把查询条件收窄到: - 同一账号短时间登录多台主机 - 普通用户突然出现 4672 特权登录 - 非管理服务器主动连接大量 445/135/3389/5985 - 账号从非常规来源 IP 登录 - 工作站访问 DC、数据库、文件服务器的管理端口 ### 3. 定位权限边界:不是只看账号权限,还要看可达性 横向移动能发生通常是两类问题叠加: 1. 凭据可用 2. 网络可达 所以建议做一张矩阵: | 账号 | 来源主机 | 目标主机 | 登录方式 | 权限级别 | 是否业务必要 | |---|---|---|---|---|---| 尤其要核查: - 普通域用户是否能 RDP 到服务器 - 本地管理员密码是否复用 - 运维账号是否在过多主机上有本地管理员权限 - 服务账号是否允许交互式登录 - 域管是否曾登录普通终端 - 是否存在过宽的 GPO 本地管理员组下发 域环境可以先看本地管理员组成员:
Get-LocalGroupMember Administrators
批量的话可从管理机跑:
$servers = Get-Content .\servers.txt
foreach ($s in $servers) {
  try {
    Invoke-Command -ComputerName $s -ScriptBlock {
      hostname
      Get-LocalGroupMember Administrators
    } -ErrorAction Stop
  } catch {
    Write-Host "$s failed: $_"
  }
}
### 4. 权限收敛建议,按优先级来 不要一次性全封,容易影响业务。建议按风险高低分阶段: **第一阶段:立即控制扩散面** - 禁止域管登录普通终端 - 临时禁用或改密疑似被用过的账号 - 对高危账号强制 Kerberos 票据失效
klist purge
域控侧可重置账号密码,必要时清理 TGT 生命周期。 **第二阶段:限制登录范围** 对服务账号设置: - Deny log on locally - Deny log on through Remote Desktop Services - 只允许作为服务登录 - 限制可登录主机 GPO 路径:
Computer Configuration
 -> Windows Settings
 -> Security Settings
 -> Local Policies
 -> User Rights Assignment
重点配置: - Deny log on locally - Deny log on through Remote Desktop Services - Deny access to this computer from the network **第三阶段:本地管理员治理** - 部署 LAPS / Windows LAPS,避免本地管理员密码复用 - 运维账号分级:普通运维、服务器运维、域管分离 - Domain Admins 只用于 DC 和极少数管理场景 - 清理 GPO 里不必要的 Administrators 组成员 **第四阶段:网络层收敛** 至少把这些管理端口做访问源限制: - 445 SMB - 135/139 RPC/NetBIOS - 3389 RDP - 5985/5986 WinRM - 1433/3306/6379/9200 等数据服务端口 Windows 防火墙可以按管理网段限制,例如 WinRM:
New-NetFirewallRule `
  -DisplayName "Allow WinRM from Admin Subnet Only" `
  -Direction Inbound `
  -Protocol TCP `
  -LocalPort 5985 `
  -RemoteAddress 10.10.10.0/24 `
  -Action Allow
然后加默认拒绝策略,避免“允许规则”之外仍可访问。 ### 5. 判断是否已经形成持久化 横向移动痕迹如果伴随持久化,要额外检查:
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run
reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run

schtasks /query /fo LIST /v

wmic service get name,displayname,pathname,startmode | findstr /i "temp public programdata powershell cmd wscript mshta"
还要看是否有新增本地用户或异常组成员:
net user
net localgroup administrators
net localgroup "Remote Desktop Users"
### 6. 最后做一个结论闭环 建议输出时不要只写“发现横向移动”,而是拆成: - 首次出现时间 - 初始来源主机 - 使用账号 - 访问目标列表 - 登录类型 - 执行命令或投递文件 - 是否获取管理员权限 - 是否存在持久化 - 当前已收敛措施 - 剩余风险 这样后面无论是给甲方、内部安全团队还是授权测试复盘,都比较清楚。 如果你现在只有“疑似痕迹”,优先从 DC 4624/4769 和目标主机 7045/4688 下手,基本能把账号、来源、目标和执行方式串起来。

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。