跳转到帖子

授权内网测试中如何确认域控异常登录并给出留痕与修复建议

精选回复

发布于

背景

最近做一次授权内网渗透测试时,客户的核心问题不是“怎么打进去”,而是:发现域控上有几条异常登录记录,想确认是否和测试动作有关、是否存在真实风险,以及后续应该怎么修。这个问题比较适合放在问答中心讨论,因为它涉及测试边界、日志排查、权限确认和修复建议,不是单纯工具使用。

场景如下:

  • 环境:Windows Server 2016 域控,域名 corp.local
  • 测试范围:已授权内网段 10.10.20.0/24,不包含生产数据库服务器
  • 已知测试账号:corp\pentest01,普通域用户权限
  • 客户告警:域控出现来自 10.10.20.58 的异常登录,涉及账号 admin_backup
  • 目标:确认登录来源、登录类型、是否成功、是否有横向移动痕迹,并给出修复建议
前提说明:以下操作默认在授权范围内进行,重点是验证和排查,不涉及绕过、提权或未授权访问。

问题定位

域控上的登录问题,第一步不要急着下结论。建议先回答四个问题:

  • 登录是否成功:看 4624 成功登录,还是 4625 登录失败
  • 登录类型是什么:LogonType 能判断是交互登录、网络登录、远程桌面还是服务登录
  • 源地址是谁:重点看 IpAddress、WorkstationName
  • 是否有后续动作:如新增用户、加入组、创建计划任务、服务安装、远程命令执行等

常见事件 ID 可以先关注这些:

事件 ID含义排查价值
4624登录成功确认账号、来源、登录类型
4625登录失败确认是否存在爆破或密码喷洒
4672特殊权限登录判断是否使用高权限账号
4720创建用户排查是否新增后门账号
4728 / 4732用户加入高权限组排查权限提升痕迹
7045服务安装排查远程服务执行痕迹
4698创建计划任务排查持久化或远程执行痕迹

技术分析

客户给出的异常点是 admin_backup 在域控上出现登录记录。这里不要只看账号名,要结合 LogonType 判断登录方式。

  • LogonType 2:本地交互登录,通常是控制台登录
  • LogonType 3:网络登录,常见于访问 SMB、远程服务、远程管理
  • LogonType 7:解锁工作站
  • LogonType 10:远程交互登录,常见于 RDP
  • LogonType 11:缓存交互登录

在内网渗透测试里,域控上出现 LogonType 3 不一定代表有人远程桌面登录了域控,可能只是远程访问了管理共享、查询域信息、SMB 探测或某些管理工具触发了网络登录。但如果同时出现 4672,说明该账号具备特殊权限,需要重点关注。

如果源地址 10.10.20.58 是测试机,需要核对测试人员是否使用过该账号。如果测试记录中没有使用 admin_backup,那就要考虑账号泄露、历史服务账号残留、脚本硬编码密码、弱口令尝试等情况。

操作步骤

建议按时间线排查,不要只查单条日志。可以先以客户告警时间为中心,向前后各扩展 30 分钟。

  • 第一步:确认域控安全日志中该账号的登录成功与失败记录
  • 第二步:确认源主机 10.10.20.58 的主机名、当前登录用户和进程痕迹
  • 第三步:检查该账号是否属于高权限组
  • 第四步:检查是否存在新增用户、加组、服务安装、计划任务等后续行为
  • 第五步:将测试人员操作记录、工具执行时间和日志时间线对齐

命令示例

以下命令可以在域控上用管理员权限 PowerShell 执行,用来快速筛选账号登录行为。注意根据实际时间调整 $start 和 $end。

$start = Get-Date "2024-06-01 10:00:00"
$end   = Get-Date "2024-06-01 11:00:00"
$user  = "admin_backup"

Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    Id        = 4624,4625,4672
    StartTime = $start
    EndTime   = $end
} | Where-Object {
    $_.Properties.Value -contains $user
} | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $data = @{}
    foreach ($d in $xml.Event.EventData.Data) {
        $data[$d.Name] = $d.'#text'
    }

    [PSCustomObject]@{
        TimeCreated     = $_.TimeCreated
        EventId         = $_.Id
        TargetUserName  = $data['TargetUserName']
        TargetDomain    = $data['TargetDomainName']
        LogonType       = $data['LogonType']
        IpAddress       = $data['IpAddress']
        WorkstationName = $data['WorkstationName']
        ProcessName     = $data['ProcessName']
        Status          = $data['Status']
        SubStatus       = $data['SubStatus']
    }
} | Sort-Object TimeCreated | Format-Table -AutoSize

如果需要确认是否有新增用户、加组、计划任务和服务安装,可以继续查这些事件:

Get-WinEvent -FilterHashtable @{
    LogName   = 'Security'
    Id        = 4720,4728,4732,4698
    StartTime = $start
    EndTime   = $end
} | Select-Object TimeCreated, Id, ProviderName, Message

Get-WinEvent -FilterHashtable @{
    LogName   = 'System'
    Id        = 7045
    StartTime = $start
    EndTime   = $end
} | Select-Object TimeCreated, Id, ProviderName, Message

确认账号组成员关系可以用:

net user admin_backup /domain
net group "Domain Admins" /domain
net group "Enterprise Admins" /domain
net group "Administrators" /domain

如果源主机 10.10.20.58 在授权范围内,也应在该主机上查本地日志。重点看是否有人从这台机器发起了远程管理行为:

Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624,4625,4648
    StartTime=$start
    EndTime=$end
} | Select-Object TimeCreated, Id, Message

Get-WinEvent -FilterHashtable @{
    LogName='Microsoft-Windows-PowerShell/Operational'
    Id=4103,4104
    StartTime=$start
    EndTime=$end
} | Select-Object TimeCreated, Id, Message

关键判断点

排查时我通常会看这几个细节:

  • 如果 4624 的 LogonType 为 3,且没有后续 7045、4698、加组事件,更多可能是网络访问或管理查询。
  • 如果出现 4648,说明有人显式使用了另一组凭据,常见于 runas、远程管理工具或脚本中传入账号密码。
  • 如果 admin_backup 同时触发 4672,说明它具备管理员级别权限,应按高危处理。
  • 如果短时间大量 4625,且失败原因是 0xC000006A,通常是密码错误;如果是多个账号同源失败,要考虑密码喷洒。
  • 如果域控上出现 7045 服务安装,尤其服务路径指向临时目录或管理共享,需要重点核查。

风险与修复建议

如果确认 admin_backup 不是测试账号,也没有业务系统明确使用,应优先按凭据泄露或弱口令账号处理。

  • 立即重置 admin_backup 密码,并检查该账号最近登录时间、密码最后修改时间、是否设置了密码永不过期。
  • 如果不是必要账号,建议禁用而不是只改密码。
  • 检查该账号是否在 Domain Admins、Enterprise Admins、本地管理员组或关键服务器管理员组中。
  • 收敛远程登录权限,域控不应允许普通运维账号直接 RDP 登录。
  • 限制域控上的本地登录、远程桌面登录和通过网络访问权限,可通过 GPO 配置。
  • 开启并集中采集安全日志,重点保留 4624、4625、4672、4720、4728、4732、4698、7045。
  • 对测试机 10.10.20.58 做基线检查,确认是否存在保存凭据、脚本硬编码密码、浏览器或工具缓存凭据。

GPO 上可以重点检查这些位置:

Computer Configuration
  Windows Settings
    Security Settings
      Local Policies
        User Rights Assignment
          Allow log on locally
          Allow log on through Remote Desktop Services
          Deny log on locally
          Deny log on through Remote Desktop Services
          Access this computer from the network
          Deny access to this computer from the network

对于域控,建议最少做到:

  • 只允许明确的域管组进行必要管理。
  • 普通运维账号不直接登录域控,采用跳板机和审批流程。
  • 服务账号单独管理,启用长随机密码,禁止交互式登录。
  • 测试账号独立创建、独立审计、测试结束后禁用或删除。

总结

这类问题的重点不是单看“域控有登录”就判断被入侵,而是结合 账号 + 来源 IP + 登录类型 + 后续事件 + 测试时间线 来还原事实。授权渗透测试中,建议测试方保留清晰的操作时间线和使用账号清单;防守方则要保证域控日志完整、事件可检索、权限边界清楚。

如果最后发现只是测试工具触发的 LogonType 3 网络登录,也应该把结论写清楚:触发原因、涉及账号、源主机、时间范围、未发现的风险项,以及建议的加固动作。这样客户后续复盘时才有依据。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
可以按“确认事实 → 固化证据 → 判断影响面 → 修复加固”这条线走,避免只看一条登录日志就下结论。 **1. 先确认域控上的异常登录来源** 重点看域控安全日志,优先筛这几类事件: - `4624`:成功登录 - `4625`:失败登录 - `4768/4769`:Kerberos 认证/TGS 请求 - `4776`:NTLM 认证 - `4672`:特权登录 - `4720/4726/4732/4738`:用户创建、删除、加组、属性变更 可以在域控上用 PowerShell 快速拉取最近 24 小时的可疑登录:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624
    StartTime=(Get-Date).AddDays(-1)
} | Where-Object {
    $_.Properties[8].Value -in 2,3,10
} | Select-Object TimeCreated, Id,
@{n='User';e={$_.Properties[5].Value}},
@{n='Domain';e={$_.Properties[6].Value}},
@{n='LogonType';e={$_.Properties[8].Value}},
@{n='Workstation';e={$_.Properties[11].Value}},
@{n='SourceIP';e={$_.Properties[18].Value}} |
Format-Table -AutoSize
登录类型可以重点关注: - `2`:本地交互式登录 - `3`:网络登录,常见于 SMB、远程服务访问 - `10`:RDP 登录 - `9`:NewCredentials,横向移动时也比较常见 如果发现域控上有普通业务账号 `LogonType=10` 或来源 IP 不属于管理网段,就比较值得继续追。 **2. 结合 Kerberos/NTLM 判断是不是横向移动** 域控异常登录很多时候不一定是直接 RDP,也可能是认证请求异常。可以筛选 `4769` 看是否存在大量服务票据请求,尤其是访问 `cifs/域控名`、`ldap/域控名`、`host/域控名`:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4769
    StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated,
@{n='User';e={$_.Properties[0].Value}},
@{n='ServiceName';e={$_.Properties[2].Value}},
@{n='ClientIP';e={$_.Properties[6].Value}},
@{n='TicketEncryption';e={$_.Properties[5].Value}} |
Where-Object {
    $_.ServiceName -match 'cifs|ldap|host'
} | Format-Table -AutoSize
如果同一客户端 IP 在短时间内对多个服务大量请求,或者使用了不常见账号访问域控服务,需要记录下来。 NTLM 可以看 `4776`,确认是否有来自异常主机的域账号认证:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4776
    StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated,
@{n='Account';e={$_.Properties[1].Value}},
@{n='Workstation';e={$_.Properties[2].Value}},
@{n='Status';e={$_.Properties[3].Value}} |
Format-Table -AutoSize
`Status=0x0` 是成功,失败码过多则可能是爆破或密码喷洒。 **3. 固化留痕,建议不要只截图** 授权测试中建议把原始日志导出,截图只能作为辅助。 导出安全日志:
wevtutil epl Security C:\Temp\DC-Security.evtx
导出系统日志、PowerShell 日志:
wevtutil epl System C:\Temp\DC-System.evtx
wevtutil epl "Windows PowerShell" C:\Temp\DC-WindowsPowerShell.evtx
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:\Temp\DC-PowerShellOperational.evtx
生成哈希,保证证据完整性:
Get-FileHash C:\Temp\DC-Security.evtx -Algorithm SHA256
Get-FileHash C:\Temp\DC-System.evtx -Algorithm SHA256
Get-FileHash C:\Temp\DC-PowerShellOperational.evtx -Algorithm SHA256
报告里建议记录: - 域控主机名、IP - 异常账号 - 源 IP / 源主机名 - 登录时间段 - 事件 ID - LogonType - 是否使用特权账号 - 是否产生加组、创建账号、GPO 修改等后续行为 **4. 检查是否有明显持久化或权限变更** 域控上尤其要看这些组有没有异常成员:
net group "Domain Admins" /domain
net group "Enterprise Admins" /domain
net group "Administrators" /domain
net group "Account Operators" /domain
net group "Backup Operators" /domain
如果装了 AD 模块,可以更清楚:
Get-ADGroupMember "Domain Admins" -Recursive | Select Name,SamAccountName,ObjectClass
Get-ADGroupMember "Enterprise Admins" -Recursive | Select Name,SamAccountName,ObjectClass
查最近变更过的账号:
Get-ADUser -Filter * -Properties whenChanged,LastLogonDate,PasswordLastSet |
Where-Object {
    $_.whenChanged -gt (Get-Date).AddDays(-7)
} | Select Name,SamAccountName,Enabled,whenChanged,LastLogonDate,PasswordLastSet |
Sort-Object whenChanged -Descending
也建议看是否有 GPO 被改:
Get-GPO -All | Select DisplayName,Owner,CreationTime,ModificationTime |
Sort-Object ModificationTime -Descending
**5. 修复建议要区分“立即处置”和“长期加固”** 立即处置建议: - 禁用或重置异常账号密码 - 对涉及的管理员账号强制改密 - 检查并清理异常组成员 - 排查异常来源主机,必要时隔离 - 确认域控上是否存在新增计划任务、服务、启动项 - 复核最近 GPO、登录脚本、管理员组变更 计划任务可以这样看:
schtasks /query /fo LIST /v
服务变更可以结合 `7045` 事件:
Get-WinEvent -FilterHashtable @{
    LogName='System'
    Id=7045
    StartTime=(Get-Date).AddDays(-7)
} | Select TimeCreated,
@{n='ServiceName';e={$_.Properties[0].Value}},
@{n='ImagePath';e={$_.Properties[1].Value}} |
Format-Table -AutoSize
长期加固建议: - 域控禁止普通账号 RDP 登录,只允许堡垒机或管理网段访问 - 管理员账号和普通办公账号分离 - 关闭不必要的 NTLM,至少启用 NTLM 审计 - 开启 PowerShell Script Block Logging 和 Module Logging - 域控日志集中到 SIEM 或日志服务器,避免本机日志被清 - 对域管账号启用 MFA 或使用 PAM/JIT 管理 - 配置“受保护用户组 Protected Users”,降低凭据被复用风险 如果这次是授权内网测试,报告里最好不要只写“发现异常登录”,而是把事件链写清楚:**哪个账号、从哪台机器、以什么登录类型、访问了域控什么服务、之后是否发生权限或配置变更**。这样甲方安全团队后续才好按证据闭环。
补充一点:域控“异常登录”最好别只盯 4624,本地登录域控这件事本身就应该很少发生,建议重点把 **登录类型、源地址、认证包、账号类型** 串起来看。 可以先按下面几个方向确认: ### 1. 区分是真登录域控,还是域控在做认证 很多人看到域控上有 4624 就判断“有人登录了 DC”,这个不一定准确。重点看: - `LogonType=2`:交互式,本地控制台登录,域控上非常敏感 - `LogonType=10`:RDP 登录,基本需要重点确认 - `LogonType=3`:网络登录,可能是 SMB、LDAP、管理共享、远程服务调用 - `AuthenticationPackageName=NTLM`:要结合 4776 看来源 - `LogonProcessName=User32` / `Advapi` / `NtLmSsp`:能辅助判断方式 建议把 4624 的关键字段拉全一点:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4624
    StartTime=(Get-Date).AddDays(-1)
} | ForEach-Object {
    [pscustomobject]@{
        Time        = $_.TimeCreated
        TargetUser  = $_.Properties[5].Value
        TargetDomain= $_.Properties[6].Value
        LogonId     = $_.Properties[7].Value
        LogonType   = $_.Properties[8].Value
        LogonProcess= $_.Properties[9].Value
        AuthPackage = $_.Properties[10].Value
        Workstation = $_.Properties[11].Value
        SourceIP    = $_.Properties[18].Value
        SourcePort  = $_.Properties[19].Value
    }
} | Where-Object {
    $_.TargetUser -notmatch '\$$' -and
    $_.TargetUser -notin @('ANONYMOUS LOGON','SYSTEM','LOCAL SERVICE','NETWORK SERVICE')
} | Sort-Object Time | Format-Table -AutoSize
这里特别看 `LogonType=2/10`,如果不是堡垒机、跳板机、运维机来源,基本就要升级处理。 ### 2. 用 LogonId 关联 4672 和进程行为 如果 4624 后紧跟 `4672`,说明该登录拿到了管理员级别特权。可以用同一个 `LogonId` 去查后续行为,尤其是: - `4672`:Special privileges assigned - `4688`:进程创建,前提是开启了进程审计 - `7045`:服务安装 - `4697`:服务安装,部分系统有 - `5140/5145`:共享访问、文件访问 - `1102`:安全日志被清除 例如查最近的特权登录:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4672
    StartTime=(Get-Date).AddDays(-1)
} | ForEach-Object {
    [pscustomobject]@{
        Time      = $_.TimeCreated
        User      = $_.Properties[1].Value
        Domain    = $_.Properties[2].Value
        LogonId   = $_.Properties[3].Value
        Privileges= $_.Properties[4].Value
    }
} | Sort-Object Time | Format-Table -AutoSize
如果环境开了 4688,建议直接查域控上是否有高风险命令:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4688
    StartTime=(Get-Date).AddDays(-1)
} | Where-Object {
    $_.Properties[5].Value -match 'powershell|cmd.exe|wscript|cscript|rundll32|regsvr32|psexesvc|ntdsutil|vssadmin|wmic|net.exe|nltest|dsquery|csvde|ldifde'
} | Select-Object TimeCreated,
@{n='Account';e={$_.Properties[1].Value}},
@{n='Process';e={$_.Properties[5].Value}},
@{n='CommandLine';e={$_.Properties[8].Value}} |
Format-List
如果域控没开命令行审计,这次测试后建议补上,否则后面很难还原动作。 ### 3. Kerberos 侧重点看异常 TGS 请求 `4769` 很适合辅助判断横向和服务访问。可以关注: - 普通用户大量请求不同 SPN - 请求 `cifs/DC$`、`ldap/DC$`、`HOST/DC$` - 加密类型异常,比如大量 `0x17` RC4 - 来源 IP 与账号日常使用机器不一致 示例:
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4769
    StartTime=(Get-Date).AddDays(-1)
} | ForEach-Object {
    [pscustomobject]@{
        Time        = $_.TimeCreated
        User        = $_.Properties[0].Value
        ServiceName = $_.Properties[2].Value
        ClientIP    = $_.Properties[6].Value
        TicketEnc   = $_.Properties[8].Value
        Status      = $_.Properties[9].Value
    }
} | Where-Object {
    $_.ServiceName -match 'cifs|ldap|host|rpcss|termsrv' -or $_.TicketEnc -eq '0x17'
} | Sort-Object Time | Format-Table -AutoSize
如果发现某个普通用户短时间请求大量 SPN,后续要评估是否存在 Kerberoasting 或横向访问行为。 ### 4. 留痕建议:保留原始 evtx,不只导 CSV 测试报告里最好保留可复核证据:
wevtutil epl Security C:\Temp\DC-Security.evtx
wevtutil epl System C:\Temp\DC-System.evtx
wevtutil epl "Windows PowerShell" C:\Temp\DC-PowerShell.evtx
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:\Temp\DC-PSOperational.evtx
wevtutil epl "Microsoft-Windows-TaskScheduler/Operational" C:\Temp\DC-TaskScheduler.evtx
同时记录: - 域控主机名、IP、时区 - 日志导出时间 - 可疑账号、源 IP、时间范围 - 对应事件 ID 和 Record ID - 是否存在日志清理事件 `1102` - 是否有计划任务、服务、启动项新增 查服务安装和计划任务可以这样:
Get-WinEvent -FilterHashtable @{
    LogName='System'
    Id=7045
    StartTime=(Get-Date).AddDays(-7)
} | Select-Object TimeCreated,
@{n='ServiceName';e={$_.Properties[0].Value}},
@{n='ImagePath';e={$_.Properties[1].Value}},
@{n='Account';e={$_.Properties[4].Value}} |
Format-Table -AutoSize

Get-WinEvent -FilterHashtable @{
    LogName='Microsoft-Windows-TaskScheduler/Operational'
    Id=106,140,141,200,201
    StartTime=(Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Id, ProviderName, Message |
Format-List
### 5. 修复加固建议要分“立即处置”和“长期加固” 如果确认不是授权操作,建议立即做: - 禁用或重置可疑账号密码 - 优先重置域管、服务账号、近期登录过域控的账号 - 清理异常会话、服务、计划任务、启动项 - 检查 Domain Admins、Enterprise Admins、Administrators、Account Operators 等组成员 - 检查是否存在新建账号、隐藏管理员、异常委派配置 - 回收不必要的 RDP 登录权限,限制域控只允许指定运维源访问 组成员变化可以重点看:
Get-ADGroupMember "Domain Admins" -Recursive | Select-Object Name,SamAccountName,ObjectClass
Get-ADGroupMember "Enterprise Admins" -Recursive | Select-Object Name,SamAccountName,ObjectClass
Get-ADGroupMember "Administrators" -Recursive | Select-Object Name,SamAccountName,ObjectClass
长期建议: - 域控禁止普通运维直连,只允许堡垒机或 PAW 管理机 - 开启 4688 进程创建审计和命令行记录 - 开启 PowerShell Script Block Logging、Module Logging - 禁用或限制 NTLM,至少先做审计 - 域管账号只用于域控和管理面,不登录普通服务器和办公终端 - 部署 Windows Event Forwarding,把 DC 日志实时转发,避免本机日志被清理后无证据 一句话判断标准: **域控上的 4624 只是入口,真正要闭环的是“哪个账号、从哪台机器、以什么方式、拿到什么权限、之后做了什么”。** 这几个点串起来,报告里的异常登录结论才站得住。

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

最近浏览 0

  • 没有会员查看此页面。