5.5 KiB
5.5 KiB
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. 公开 API(Gitea、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 -v 看 Will 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-debugSKILL.md 第 12 节
8. 历史快照
- 2026-07-01:首次成型。背景:牧尘让我查
192.168.123.11上的 Hermes,刚上来没 ssh 凭据;先扫端口、Gitea、banner,再用sync_from_server.sh里硬编码密码连接成功,全过程收纳。