靶场 :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)。