Windows Server安全配置深度复盘:关键 Payload 与解题思路

靶场 :Bugku CTF 平台 · 仿真靶场「Windows Server安全配置」(ctfplus/detail/id/6) 目标 :47.101.201.110 · Windows Server 2008 R2 Enterprise(iZciydfhov5mu7Z)· IIS 7.5 + FTP 7.5 结论 :9 项安全配置全部按平台判定口径落地并逐项复核通过。本题没有真实 flag 文件,修复完成后在平台页面逐项「检测 / 提交」即可通过;检测不通过时按本文第 2 节的「判定口径」逐条对齐实际状态。


0. 一句话答案(9 项判定项 → 正确做法)

# 判定项 正确做法(要点) 复核方式
1 密码最小长度 10 net accounts /minpwlen:10 或策略 MinimumPasswordLength=10 net accounts 显示 10
2 密码最长使用期限 30 天 net accounts /maxpwage:30 或 MaximumPasswordAge=30 net accounts 显示 30
3 1 分钟内 6 次失败锁定 1 分钟 net accounts /lockoutthreshold:6 /lockoutduration:1 /lockoutwindow:1 阈值 6 / 锁定 1 / 窗口 1
4 来宾访问计算机/域内置账户不允许 net user guest /active:no + EnableGuestAccount=0 + SeDenyNetworkLogonRight=Guests + RestrictAnonymous/SAM=1 Guest=Disabled、匿名枚举被拒
5 开启 UAC 注册表 EnableLUA=1(附 ConsentPromptBehaviorAdmin=5、PromptOnSecureDesktop=1) EnableLUA=1(重启后完全生效)
6 仅 Administrators 可关机 SeShutdownPrivilege = *S-1-5-32-544(移除 Backup Operators) 导出策略仅剩 Administrators
7 RDP 空闲会话 5 分钟断开 HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime=300000 注册表回读 300000
8 开启 IIS 日志审计记录 装 Web-Http-Logging + 站点 logFile enabled=true + 日志目录授权 IIS_IUSRS + 重启 W3SVC HttpLoggingModule 已加载且 W3SVC1\u_ex*.log 有记录
9 关闭 FTP 匿名(服务不能关) bugku 站点 ftpServer/security/authentication/anonymousAuthentication enabled=false + 重启 FTPSVC 匿名登录 530、FTPSVC 仍 Running

1. 环境与接入(先侦察,后动作)

初始端口:3389/80/21 开放,445/5985 关闭;IIS7 默认页 + FTP7.5(站点名 bugku,物理路径 C:\Users\Public)。

接入策略(默认通道):能走 WinRM 就绝不碰桌面。

powershell 复制代码
# ① RDP 登录后在「管理员 cmd」里开通 WinRM(交互会问一次,输入 y)
winrm quickconfig -q

# ② 本地信任目标并用 NTLM 认证
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 47.101.201.110 -Force
$cred = Get-Credential        # administrator
Invoke-Command -ComputerName 47.101.201.110 -Credential $cred -Authentication Negotiate -ScriptBlock { hostname; whoami }
# 返回:iZciydfhov5mu7Z / izciydfhov5mu7z\administrator

之后的全部操作都通过 Invoke-Command 完成,不再触发任何 GUI 前台焦点。RDP 只作为 WinRM 不可用时的兜底(mstsc 最小化常驻,注入时短暂还原 1~2 秒)。


交互式版本(点击展开/直接打开)

topology.html(交互图,本地交付包)


2. 九项配置:正确答案 + 命令 + 验证

2.1 密码最小长度 = 10;2.2 密码最长使用期限 = 30 天

cmd 复制代码
net accounts /minpwlen:10 /maxpwage:30

等价的策略文件写法(secedit):

ini 复制代码
[System Access]
MinimumPasswordLength = 10
MaximumPasswordAge = 30

验证:

cmd 复制代码
net accounts
:: 密码最长使用期限(天): 30
:: 密码长度最小值:      10

2.3 一分钟内仅允许 6 次失败,超过锁定 1 分钟

cmd 复制代码
net accounts /lockoutthreshold:6 /lockoutduration:1 /lockoutwindow:1

等价策略:LockoutBadCount=6、LockoutDuration=1、ResetLockoutCount=1(单位分钟,锁定持续时间与观测窗口都写 1)。

验证:net accounts → 锁定阈值: 6 / 锁定持续时间(分): 1 / 锁定观测窗口(分): 1。

2.4 来宾访问计算机或访问域的内置账户 = 不允许

三层一起做,避免平台按不同口径判定:

powershell 复制代码
net user guest /active:no                       # 禁用 Guest 账户
# 策略:EnableGuestAccount = 0(secedit [System Access])
# 用户权限:拒绝 Guest 组从网络访问
#   SeDenyNetworkLogonRight = *S-1-5-32-546
# 匿名访问收紧
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name RestrictAnonymous    -Value 1 -Type DWord
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name RestrictAnonymousSAM -Value 1 -Type DWord
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name EveryoneIncludesAnonymous -Value 0 -Type DWord

验证:Get-WmiObject Win32_UserAccount -Filter "Name='Guest'" → Disabled=True;secedit /export 中 SeDenyNetworkLogonRight = *S-1-5-32-546。

2.5 开启账户控制(UAC)

powershell 复制代码
$ps = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Set-ItemProperty $ps -Name EnableLUA                 -Value 1 -Type DWord
Set-ItemProperty $ps -Name ConsentPromptBehaviorAdmin -Value 5 -Type DWord
Set-ItemProperty $ps -Name PromptOnSecureDesktop     -Value 1 -Type DWord
Set-ItemProperty $ps -Name EnableInstallerDetection  -Value 1 -Type DWord
Set-ItemProperty $ps -Name EnableVirtualization      -Value 1 -Type DWord

注意 :EnableLUA 需重启后完全生效;未重启前注册表值已是 1,平台若只校验键值可直接通过。

2.6 只允许超级管理员(Administrators)关闭操作系统

用 secedit 导出/改/回灌用户权限(SeShutdownPrivilege 默认还含 Backup Operators,必须一起清掉):

cmd 复制代码
secedit /export /cfg %TEMP%\ur.inf /areas USER_RIGHTS
:: 编辑:SeShutdownPrivilege = *S-1-5-32-544
cmd /c "echo y| secedit /configure /db %TEMP%\ur.sdb /cfg %TEMP%\ur.inf /areas USER_RIGHTS /overwrite"

验证:再次导出后仅剩 SeShutdownPrivilege = *S-1-5-32-544。

2.7 远程桌面用户空闲会话超过 5 分钟自动断开

powershell 复制代码
$ts = "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services"
if(-not (Test-Path $ts)){ New-Item $ts -Force | Out-Null }
Set-ItemProperty $ts -Name MaxIdleTime -Value 300000 -Type DWord   # 300000ms = 5min

2.8 开启 IIS 的日志审计记录(本项最容易"假通过",重点看)

判定口径:不是只看 logFile enabled=true,而是「功能已安装 → 模块已加载 → 目录可写 → 日志真实落盘」。

powershell 复制代码
Import-Module ServerManager
Add-WindowsFeature Web-Http-Logging          # 关键:镜像里默认没装!
# 站点日志(Default Web Site)确认开启
Import-Module WebAdministration
Set-ItemProperty IIS:\Sites\'Default Web Site' -Name logFile.enabled -Value $true
# 日志目录授权(镜像 ACL 被裁剪过,默认缺 IIS_IUSRS 写权限)
icacls C:\inetpub\logs\LogFiles /grant "IIS_IUSRS:(OI)(CI)M"
Restart-Service W3SVC -Force

验证(缺一不可):

powershell 复制代码
& "$env:SystemRoot\system32\inetsrv\appcmd.exe" list modules | findstr Logging
# MODULE "HttpLoggingModule" ( native, preCondition: )
Get-ChildItem C:\inetpub\logs\LogFiles\W3SVC1
Get-Content (Get-ChildItem C:\inetpub\logs\LogFiles\W3SVC1\*.log | Sort LastWriteTime -Desc | Select -First 1) -Tail 5

真实落盘样例(IIS 默认 60 秒缓冲刷盘,等一分钟再读):

复制代码
#Software: Microsoft Internet Information Services 7.5
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2026-10-31 08:02:09 172.17.197.68 GET /iisstart.htm - 80 - 1.193.82.195 Mozilla/5.0 ... PowerShell/7.6.7 200 0 0 134

2.9 关闭 FTP 匿名用户(FTP 服务不能关闭)

FTP 7.5 的认证节在 applicationHost.config 的站点级 ftpServer 下;此环境 appcmd 报"未知配置节",直接改 XML 最稳:

powershell 复制代码
$ah = "C:\Windows\System32\inetsrv\config\applicationHost.config"
Copy-Item $ah "$ah.bak" -Force
# 在 <site name="bugku"> 的 <ftpServer><security> 内补:
#   <authentication>
#     <anonymousAuthentication enabled="false" userName="anonymous" password="" />
#   </authentication>
Restart-Service FTPSVC -Force

或用 IIS 管理器等价路径:FTP 身份验证 → 匿名身份验证 → 禁用(不要停 FTPSVC)。

验证:

powershell 复制代码
(Get-Service FTPSVC).Status        # Running ------ 服务必须保留
# 客户端实测匿名登录应被拒
python -c "import ftplib;f=ftplib.FTP();f.connect('47.101.201.110',21);f.login('anonymous','anonymous@')"
# 530 User cannot log in.

2A. 补充加固(完整性补强,非判分项但属于基线应有项)

九项判分项完成后再按主机实际情况补强,避免"只过题、不加固":

2A.1 审计策略(对象访问 / 策略更改 / 账户管理)

cmd 复制代码
auditpol /set /subcategory:"文件系统"     /success:enable /failure:enable
auditpol /set /subcategory:"句柄操作"     /success:enable /failure:enable
auditpol /set /subcategory:"审核策略更改" /success:enable /failure:enable
auditpol /set /subcategory:"用户帐户管理" /success:enable /failure:enable

复核:auditpol /get /category:"对象访问" → 文件系统 / 句柄操作 = 成功和失败。

2A.2 RDP 加密与 NLA

powershell 复制代码
$rdp = "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
Set-ItemProperty $rdp -Name SecurityLayer       -Value 2 -Type DWord   # 强制 SSL/TLS
Set-ItemProperty $rdp -Name UserAuthentication  -Value 1 -Type DWord   # 要求 NLA
Set-ItemProperty $rdp -Name MinEncryptionLevel  -Value 3 -Type DWord   # 高

复核回读:SecurityLayer=2 / UserAuthentication=1 / MinEncryptionLevel=3。

注意:强制 TLS 后老客户端(未打补丁的 XP/2003 客户端)可能连不上;Win7+/现代 mstsc 正常。

2A.3 IIS 请求过滤(禁用 TRACE、双重转义、目录浏览)

cmd 复制代码
appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering /+"verbs.[verb='TRACE',allowed='false']"
appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:false
appcmd set config "Default Web Site" -section:system.webServer/directoryBrowse -enabled:false

实测:GET /iisstart.htm → 200;TRACE / → 404(被请求过滤拒绝)。

2A.4 FTP 默认层也关闭匿名

站点层已关,再把 siteDefaults 的 anonymousAuthentication 一并设为 false,避免新建站点继承出匿名:

xml 复制代码
<siteDefaults>
  <ftpServer><security><authentication>
    <anonymousAuthentication enabled="false" />
  </authentication></security></ftpServer>
</siteDefaults>

复核:站点层与默认层均为 false,FTPSVC=Running,匿名登录 530。

2A.5 Windows 防火墙(本次审计发现的真实缺口)

审计发现目标三个防火墙配置文件全部关闭。补法:先加显式放行规则,再开启,最后做连通性验证(含回滚手段)。

cmd 复制代码
netsh advfirewall firewall add rule name="DSH-Allow-HTTP-80"    dir=in action=allow protocol=TCP localport=80   profile=any
netsh advfirewall firewall add rule name="DSH-Allow-FTP-21"     dir=in action=allow protocol=TCP localport=21   profile=any
netsh advfirewall firewall add rule name="DSH-Allow-RDP-3389"   dir=in action=allow protocol=TCP localport=3389 profile=any
netsh advfirewall firewall add rule name="DSH-Allow-WinRM-5985" dir=in action=allow protocol=TCP localport=5985 profile=any
netsh advfirewall set allprofiles state on

验证结果:80/21/3389/5985 全部 True、Invoke-Command 新会话正常、GET → 200、FTP 可连接且匿名仍 530。 回滚命令(万一放行遗漏):netsh advfirewall set allprofiles state off。

2A.6 刻意保持不动的项(避免影响平台判定)

项 当前值 不动的原因
密码最短使用期限 0 天 若平台"改密验证复杂度/长度"会连续改密,设 1 天反而导致检测失败
RemoteRegistry 服务 Running 平台侧可能通过远程注册表核验策略,关闭有误判风险
SMB 签名 未强制 需重启生效,且目标 445 未对外暴露,收益低风险高

3. 执行时序(接入 → 引导 → 加固 → 验证)

交互式版本:flow.html(交互图,本地交付包)


4. 踩坑与解决方案(这部分是本次真正的"难点")

现象 根因 解决
RDP 窗口截图 GetWindowRect failed MainWindowHandle 指向 0×0 的隐藏 owner 窗口(TSC_POPUP_PARENT_WNDCLASS) 枚举该 PID 下面积最大的可见 TscShellContainerClass,再 PrintWindow(hwnd,hdc,2)
SendInput/keybd_event 注入远程无反应 跨进程合成输入在受控/沙箱环境被静默阻断(同进程窗口能收到) 改 PostMessage 到 mstsc 子窗口 IHWindowClass :先 WM_LBUTTONDOWN/UP 点击远程 cmd 聚焦,再 WM_KEYDOWN/UP(VK + MapVirtualKey 扫描码)
PostMessage 仍无效 客户端用低级键盘钩子,只认真实硬件输入 .rdp 必须 keyboardhook:i:0
CreateDesktop 建第二桌面报 87 ANSI/Unicode 封送 + Add-Type -ReferencedAssemblies 编译方式影响;且切换桌面本身会打断用户 放弃第二桌面,改「最小化常驻 + 注入时短暂还原」
secedit /configure 卡住不动 非交互会话停在中英提示 [y/n] `cmd /c "echo y
appcmd 报"未知配置节 system.ftpServer/..." 该镜像 appcmd 版本与 FTP 7.5 配置节注册不匹配 直接编辑 applicationHost.config 的站点 XML
IIS 日志"开启成功"但日志目录没有 W3SVC1 ① 镜像未安装 Web-Http-Logging,HttpLoggingModule 未加载,站点 logFile enabled=true 只是配置值;② C:\inetpub\logs\LogFiles ACL 缺 IIS_IUSRS 写权限 装功能 + 修 ACL + 重启 W3SVC,并以真实日志文件为验收
UAC 改了但"好像没生效" EnableLUA 需重启 注册表已可被判分;如需实际拦截提示则重启

经验:安全配置题的"验收"必须看系统真实行为,而不是只看写入的配置值。 本次 IIS 日志就是典型------配置回读全是 true,但机器上根本没有 W3SVC1 目录。


5. 作业时间线

交互式版本:timeline.html(交互图,本地交付包)


6. 平台提交说明

  • 本题为「修复后平台检测」型靶场,服务器上没有真实 flag 文件 (C:\Users\Public、wwwroot、近 20 分钟新增文件均无 flag),完成后在挑战页逐项检测/提交即可。
  • 若某项检测不通过,优先对照第 2 节「判定口径」复核实际状态,常见差异:
    • FTP:只关了匿名认证、服务必须仍为 Running;
    • IIS 日志:需要功能安装 + 日志真实落盘,而不是只有站点开关;
    • 来宾:Guest 禁用与"拒绝网络访问"可能分别判定;
    • 关机权限:Backup Operators 未清掉会被判"非仅 Administrators"。

7. 图形附件(Archify)

图 文件 说明
靶场拓扑(控制面/目标面/证据面) topology.html(交互图,本地交付包) 本地操作机经 RDP/WinRM 两条通道进入目标,覆盖 IIS/FTP/LSA 与日志证据面
执行时序(接入→引导→加固→验证) flow.html(交互图,本地交付包) winrm quickconfig 引导、9 项下发、回读与平台检测的顺序关系
作业时间线 timeline.html(交互图,本地交付包) 含一次 IIS 日志"假通过"的发现与修复

静态校验:三张图 archify check 全部 issues: [](showcase 质量)。

说明:archify finalize 的 browser-check 在 elevated 会话中未跑(Chrome/Edge 提权重启导致 DevTools pipe 断开,属已知限制),已用 render + check + headless Chromium 截图 复核。


8. 可复现脚本

已封装到网络作战台工具链(可被 cyberops_toolchain 检索):

powershell 复制代码
# 探测 / 引导 WinRM / 远程执行
pwsh -File F:\DSH\tools\cyberops-tools\rdp-winrm.ps1 -Target 47.101.201.110 -User administrator -Password '<pass>' -Action status
pwsh -File F:\DSH\tools\cyberops-tools\rdp-winrm.ps1 -Target 47.101.201.110 -User administrator -Password '<pass>' -Action bootstrap
pwsh -File F:\DSH\tools\cyberops-tools\rdp-winrm.ps1 -Target 47.101.201.110 -User administrator -Password '<pass>' -Action run -Command 'net accounts'

配套说明:README-RDP-WinRM.md(F:\DSH\tools\cyberops-tools\README-RDP-WinRM.md)。

相关推荐
技术人生0011 小时前
DirectX修复工具下载安装教程-Windows系统游戏dll修复工具下载安装修复教程
windows·游戏
2601_962364973 小时前
企业 PC 安全升级,Windows Hello 商用生物识别模组介绍
windows·安全
2501_916007475 小时前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
椒颜皮皮虾྅7 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
昂好的day8 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
kingx38 小时前
网络安全事件应急响应:X集团 WebServer 入侵溯源与处置
中间件·web·应急响应·取证·恶意样本
垆边人似月.8 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
BIBI204919 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
chushiyunen20 小时前
autoHotKey、windows自动化快捷键工具
运维·windows·自动化