监听 · 扫描 · 指纹 · OSINT
黄玮
2026-秋
攻击者动手前,第一件事永远是「看清你」——你开了哪些口、跑了什么服务、用了什么版本、谁是可以骗的人。
-sV / -O)深度理论(ARP 报文结构、TCP 状态机、端口状态全集)见
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x04.md/https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x05.md。本课件只讲「做 M2 所需」。
监听是被动的:只看,不发。因此极难被远端检测——这也是它危险的原因。
报文级细节(GARP、gratuitous ARP、检测脚本)见
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x04.md「主动监听」「检测 ARP 缓存投毒者」。
# 列出可捕获网卡
sudo tshark -D
# 只抓指定主机的流量,存盘
sudo tshark -i eth0 -f "host 127.0.0.1" -w m2.pcapng
-f,BPF
语法,抓前过滤):host X、tcp port 80、net 10.0.0.0/24http、tcp.port==5000、ip.addr==127.0.0.1 && http.request.method==POSTM2 提示:跑起你的 Flask 靶场后,用 Wireshark 抓一次登录/查询,能直接看到 明文凭证、SQL 语句——这是「监听能暴露什么」的最直观证据。
| 监听(被动) | 扫描(主动) | |
|---|---|---|
| 动作 | 只收,不发 | 主动发包,看回应 |
| 目标 | 还原链路上已有流量 | 探测「谁在、开了什么口」 |
| 隐蔽性 | 高(被动) | 低(留日志、易被 IDS 发现) |
| 代表工具 | Wireshark / tcpdump | nmap |
-sS)
SYN → 收 SYN/ACK =
开放;收 RST = 关闭;无回应 = 被过滤-sT)
-sU)
port unreachable = 关闭;无回应 =
open|filtered(不确定)-sn):判断主机存活(注意防火墙常禁
ICMP)TCP/UDP/ICMP 协议复习与端口状态全集见
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x05.md「网络扫描原理」。
open|filtered → 结果噪音大-sU --max-retries 1 + 耐心,或只扫已知
UDP 服务(53 DNS / 161 SNMP)# 主机发现(谁活着)——对单机/本机也可
nmap -sn 127.0.0.1
# TCP SYN 扫描 + 指定端口范围(需 root)
sudo nmap -sS -p- 127.0.0.1 # -p- = 全部 65535 端口
# 服务/版本探测 + 默认脚本 + OS 指纹 = "-A" 综合体检
sudo nmap -A 127.0.0.1
# 等价于分项:
sudo nmap -sV -sC -O 127.0.0.1 # -sV 版本 -sC 默认脚本 -O OS指纹
# 输出结构化结果,供脚本消费
sudo nmap -sS -sV -p- 127.0.0.1 -oX m2-scan.xml # XML
nmap -sV -p 1-1000 127.0.0.1 -oG m2-scan.grep # grep 友好
-sS(SYN)/ -sT(Connect)/
-sU(UDP)/ -sn(只 Ping)-p-(全端口)/ -p 22,80,5000(指定)/
--top-ports 100-sV(版本)/ -O(OS)/
-A(综合)/ -sC(脚本)-oX / -oG / -oN /
-oA(全格式):脚本化的关键-sV):根据 Banner /
协议探针识别服务与版本
5000/tcp open http → -sV →
5000/tcp open http Werkzeug httpd 3.0.x (Flask)-O):根据 TCP/IP
协议栈实现差异(窗口大小、选项顺序…)猜操作系统http-title、http-server-header、响应头
Server/X-Powered-By、favicon
hash、页面特征M2 提示:对你的 Flask 靶场做
-sV,会暴露Werkzeug/Python版本——这正是攻击者后续(U3)选漏洞利用攻击载荷的依据。
Server/X-Powered-By
改名/去版本;统一错误页(去掉 Werkzeug 调试栈)Server 头,隐藏后端真实栈nmap 一次 =
一份报告;每次部署变更都要重测#!/usr/bin/env bash
# recon.sh —— 对自己的靶场做一次自侦察,产出暴露面清单
# ⚠️ 仅对 127.0.0.1 / 你自己授权的靶场使用
set -euo pipefail
TARGET="${1:-127.0.0.1}"
OUT="recon-$(date +%Y%m%d-%H%M).txt"
echo "=== 主机发现 ===" | tee "$OUT"
nmap -sn "$TARGET" | tee -a "$OUT"
echo "=== 全端口 SYN + 版本探测 ===" | tee -a "$OUT"
sudo nmap -sS -sV -p- "$TARGET" -oA "recon-${TARGET}" | tee -a "$OUT"
echo "=== 暴露面清单已写入 $OUT ==="
# parse_nmap.py —— 把 nmap -oX 的结果解析为结构化暴露面清单
import xml.etree.ElementTree as ET
import sys, json
def parse(path):
tree = ET.parse(path); root = tree.getroot()
surfaces = []
for host in root.findall("host"):
addr = host.find("address").get("addr")
for port in host.findall(".//port"):
sid = port.find("portid").text
st = port.find("state").get("state")
svc = port.find("service")
surfaces.append(_row(addr, sid, st, svc))
return surfaces
def _row(addr, sid, st, svc):
return {
"host": addr, "port": sid, "state": st,
"service": svc.get("name") if svc is not None else "",
"product": svc.get("product") if svc is not None else "",
"version": svc.get("version") if svc is not None else "",
}
if __name__ == "__main__":
print(json.dumps(parse(sys.argv[1]), ensure_ascii=False, indent=2))
亦可
pip install python-nmap用封装库。L3 的关键不是用哪种语言,而是产出「可被下次工程消费」的结构化数据。
花几天攻破防火墙,不如打一个电话让员工自己把密码交出来。——经典社工直觉
仅取
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x13.md「社会工程学与网络钓鱼」一节;社交网络谣言/营销/电信诈骗不在本单元范围。
robots.txt/敏感接口下线)本页为可选,不作为 M2 必交项;感兴趣见
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/llm-security.md。
recon.sh 接进
CI,每次部署后自动跑 → 暴露面可追溯、可治理| 级 | 能力描述 | 自评勾选 |
|---|---|---|
| L1 | 能解释监听/扫描原理与指纹识别 | ☐ 题库达标 |
| L2 | 用 Wireshark/nmap 完成测绘并出报告 | ☐ M2 测绘完成 |
| L3 | 编写可复用侦察脚本 + 暴露面清单治理 | ☐ M2 脚本+清单交付 |