xiaowei-system/skills/devops/hermes-debug/references/winserver-recon.md

5.5 KiB
Raw Blame History

Windows Server 无凭据侦察流程

适用:当用户让你看一台 Windows 机器(典型 192.168.x.x),手头没凭据 / 还没问密码。
核心原则:先做无凭据侦察,能白嫖就白嫖;不能白嫖就精确地问用户要哪一项凭据,而不是乱猜。


1. 侦察四件套(顺序不可换)

# 1. 在线判断
ping -c 3 -W 2 <HOST>

# 2. 端口扫描OpenSSH/IIS/WinRM/RDP/Gitea 都常用)
for port in 22 80 443 445 139 3389 5985 5986 3000 8002 2222; do
  timeout 2 bash -c "echo > /dev/tcp/<HOST>/$port" 2>/dev/null \
    && echo "  ✓ $port OPEN" \
    || echo "  ✗ $port closed"
done

# 3. 已知服务拿 banner
echo "" | timeout 3 nc -nv <HOST> 22   # SSH-2.0-OpenSSH_for_Windows_9.5 = Win 自带 OpenSSH
echo "" | timeout 3 nc -nv <HOST> 80   # Microsoft-IIS/10.0 = Win Server
echo "" | timeout 3 nc -nv <HOST> 25   # 一般不开放

# 4. 公开 APIGitea、Prometheus、Notion 都常暴露 /api/v1/...
curl -s --max-time 5 http://<HOST>:3000/api/v1/version           # Gitea
curl -s --max-time 5 http://<HOST>:3000/api/v1/repos/search      # 仓库列表
curl -s --max-time 5 -I http://<HOST>:80                        # IIS NTLM

2. Windows Server 常见端口地图(备忘)

端口 服务 备注
22 OpenSSH_for_Windows 自 Windows 2019 起内置,与 Linux OpenSSH 行为一致
80 IIS 10 (Microsoft-HTTPAPI) 需要 NTLM / Negotiate 认证curl 拿不到)
443 IIS / 自建 HTTPS 常关
445 / 139 SMB 文件共享 用于匿名 IPC 探测
5985 WinRM HTTP 远程管理端口PowerShell 走这个
5986 WinRM HTTPS 几乎从不暴露
3389 RDP 经常被换到 8002 / 8443
8002 RD Gateway (HTTPS) 你之前 FreeRDP 过,说明 webportal 在
3000 Gitea / unrelated 看 banner 辨认是 Gitea/Forgejo 还是其他
2222 Gitea 内置 SSH 可能错配URL 显示 2222端口却没开 → 真的 SSH 在 22

3. SSH Permission denied 的 3 种含义区分

当你尝试 sshpass -p "$PWD" ssh user@host 拿到 Permission denied (publickey,password,keyboard-interactive)

触发场景 真正原因 怎么判断
A. 密码错 user 存在,但密码错 BatchMode=yes 一样 denied → 不能凭 denied 就说密码错
B. 用户不存在 SSH server 配置 DenyUsers / AllowUsers 列表里没有 试 root/Administrator 同样 denied
C. 服务端 authorized_keys 缺本机公钥 你已经在 agent 里有 key但服务端没接受 -o PreferredAuthentications=publickey 配合 ssh -vWill attempt key: ... 列表;如果服务端只允许 publickey 且没你的 key全 denied

最准确的诊断ssh -v 并 grep 这些关键词:

debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Will attempt key: ...   ← 本机有哪些 key
debug1: Offering public key: ... ← 试用哪个
debug1: read_passphrase: can't open /dev/tty ← BatchMode 拒绝密码(正常)

4. Gitea ssh_url ≠ 真实 SSH 端口(反模式)

Gitea 仓库 JSON 的 ssh_url 字段形如 ssh://administrator@192.168.123.11:2222/xiaoxue_admin/foo.git。这是 Gitea 启动时配置的端口,不是当前可达端口。

# 真实可达性测试
timeout 2 bash -c "echo > /dev/tcp/<HOST>/2222" 2>/dev/null
# → 如果 2222 closed但你在 Gitea 网页上能 push/pull那是 Gitea 走其他 SSH 实例22 最常见)

操作启示:用 Gitea HTTP 端 (http://HOST:3000/xiaoxue_admin/...) + 嵌入在 git remote url 里的 access token形如 xiaoxue_admin:9380e8e696662dfd93e1e0e60d64511e01bd0653@HOST:3000/...),比直接 SSH 更便携。


5. 信息回收:凭据线索藏在文件的几个位置

文件 可能藏什么
~/mc/<project>/sync_*.sh 硬编码 SSH user/pass典型 administrator@HOST + PWD 变量)
~/.config/freerdp/server/<HOST>:<port>_<port>.pem RD Gateway session 保存的临时证书,证明你之前连过这台机
~/.ssh/known_hosts 已记录的 hostkey用来验证是同一台机
*.git/config(跨项目) Gitea access token embeded in remote URL
~/.openclaw/openclaw.json channels.feishu 如果它管飞书,可能有目标机相关配置;无关则跳过

操作原则:先 grep -rli "winserver\|192.168.123.11" ~/Documents ~/Desktop ~/projects ~/mc 全量扫,再针对性看具体命中。


6. 报告格式(用户说"stop explaining"时只用这个)

问题:   一句话概括
已做:   哪几项侦察
状态:   机器在线/哪些端口通/Gitea 白嫖到的项目/还缺什么
需要:   凭据类型SSH 密码 / WinRM user-pass / RDP gateway / 或者"没法继续"

不超过 5 条。要点:永远列出已做的侦察步骤,让用户知道你没瞎敲。


7. 与已有诊断工作流的关系

  • 已 SSH 之后 → 用 references/windows-ssh-probe.md 解码 Windows UTF-16LE 输出
  • 侦察完成获得凭据 → 用 win-server-admin.md 那一支(未来 skill
  • Hermes 服务状态专项 → 已写进 hermes-debug SKILL.md 第 12 节

8. 历史快照

  • 2026-07-01:首次成型。背景:牧尘让我查 192.168.123.11 上的 Hermes刚上来没 ssh 凭据先扫端口、Gitea、banner再用 sync_from_server.sh 里硬编码密码连接成功,全过程收纳。