1. 内网信息收集与资产测绘

任务目标

在获得内网初步立足点后,需要快速摸清网段内资产分布。本案例通过主动扫描(ARP/ICMP探测、端口扫描)与被动监听(流量嗅探),收集目标内网的存活IP、主机名、开放端口与服务版本,最终汇总为结构化资产清单。

环境与依赖

  • 攻击机:Kali Linux(已获取内网普通用户权限,可执行命令)
  • 工具:nmap、arp-scan、tcpdump、nbtscan(可选,用于NetBIOS主机名)
  • 目标网段:192.168.10.0/24(示例,实际以授权范围为准)

关键实现

以下脚本将主动扫描与被动监听结合,输出统一格式的资产清单。主动部分使用ARP扫描发现存活主机,再对存活IP进行TCP端口探测与服务识别;被动部分通过tcpdump监听80秒,解析ARP/DNS/NetBIOS流量补充主机名信息。

#!/bin/bash
# 内网资产测绘脚本 - 主动扫描 + 被动监听
# 用法: ./asset_discovery.sh <网段> [输出文件]
NETWORK="${1:-192.168.10.0/24}"
OUTFILE="${2:-assets_$(date +%Y%m%d_%H%M%S).txt}"
PCAP_FILE="/tmp/passive_capture.pcap"

echo "[*] 开始资产测绘,目标网段: $NETWORK"
echo "[*] 输出文件: $OUTFILE"

# ---------- 1. 主动扫描:ARP发现存活主机 ----------
echo "[*] 阶段1: ARP存活探测"
arp-scan --interface eth0 "$NETWORK" 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $1}' > /tmp/alive_ips.txt
# 补充:若ARP不可用(跨网段),改用nmap ping扫描
if [ ! -s /tmp/alive_ips.txt ]; then
    echo "[!] ARP扫描无结果,尝试ICMP探测"
    nmap -sn "$NETWORK" | grep "Nmap scan report" | awk '{print $NF}' > /tmp/alive_ips.txt
fi
ALIVE_COUNT=$(wc -l < /tmp/alive_ips.txt)
echo "[+] 存活主机数: $ALIVE_COUNT"

# ---------- 2. 主动扫描:端口与服务识别 ----------
echo "[*] 阶段2: 端口扫描与服务识别"
> "$OUTFILE"  # 清空输出文件
while read -r ip; do
    [ -z "$ip" ] && continue
    echo "[*] 扫描 $ip ..."
    # 常见端口快速扫描 + 服务版本探测
    nmap -sS -sV -T4 --top-ports 100 --open "$ip" -oG - 2>/dev/null | \
    awk -v ip="$ip" '/Ports:/{
        split($0, a, "Ports: ");
        split(a[2], ports, ", ");
        for (i in ports) {
            split(ports[i], p, "/");
            if (p[2] == "open") {
                printf "%s|%s|%s\n", ip, p[1], p[5] ? p[5] : "unknown"
            }
        }
    }' >> "$OUTFILE"
done < /tmp/alive_ips.txt

# ---------- 3. 被动监听:补充主机名与流量信息 ----------
echo "[*] 阶段3: 被动监听80秒 (后台)"
timeout 80 tcpdump -i eth0 -n -c 5000 -w "$PCAP_FILE" 2>/dev/null &
TCPDUMP_PID=$!

# 等待监听完成
wait $TCPDUMP_PID 2>/dev/null

echo "[*] 解析被动流量中的主机名..."
# 从pcap提取DNS查询/应答中的主机名
tcpdump -r "$PCAP_FILE" -n 'port 53' 2>/dev/null | grep -oE '[a-zA-Z0-9._-]+\.[a-zA-Z]{2,}' | sort -u >> /tmp/dns_names.txt
# 从NetBIOS流量提取主机名(端口137/138)
tcpdump -r "$PCAP_FILE" -n 'udp port 137 or 138' 2>/dev/null | grep -oE '([a-zA-Z0-9_-]{1,15})' | sort -u >> /tmp/netbios_names.txt

# ---------- 4. 汇总资产清单 ----------
echo "[*] 生成最终资产清单..."
echo "=== 内网资产清单 ===" > "$OUTFILE.tmp"
echo "生成时间: $(date)" >> "$OUTFILE.tmp"
echo "网段: $NETWORK" >> "$OUTFILE.tmp"
echo "存活主机数: $ALIVE_COUNT" >> "$OUTFILE.tmp"
echo "" >> "$OUTFILE.tmp"
echo "--- 主机端口服务明细 ---" >> "$OUTFILE.tmp"
cat "$OUTFILE" >> "$OUTFILE.tmp"
echo "" >> "$OUTFILE.tmp"
echo "--- 被动发现的主机名 ---" >> "$OUTFILE.tmp"
cat /tmp/dns_names.txt /tmp/netbios_names.txt 2>/dev/null | sort -u >> "$OUTFILE.tmp"

mv "$OUTFILE.tmp" "$OUTFILE"
echo "[+] 完成!资产清单已保存至: $OUTFILE"
echo "[*] 快速查看:"
cat "$OUTFILE"

运行与验证

  1. 执行:将脚本保存为asset_discovery.sh,赋予执行权限后运行:chmod +x asset_discovery.sh && ./asset_discovery.sh 192.168.10.0/24
  2. 观察输出:脚本依次显示存活主机数量、每台主机的开放端口与服务版本,最终生成包含主机名补充信息的资产清单文件。
  3. 判定通过条件:
    • 输出文件中包含至少3个存活IP(若网段内确实存在多台主机);
    • 每台存活主机至少识别出1个开放端口及其服务版本(如22|ssh|OpenSSH 8.2);
    • 若网络中存在DNS或NetBIOS流量,主机名列表非空。

常见问题

  • ARP扫描无结果:确认处于同一二层网络;若跨网段,脚本自动回退到ICMP探测。
  • 端口扫描慢:可调整--top-ports数量或改用-T4激进时序。
  • 无被动流量:监听时间可延长至300秒,或确认网卡混杂模式已开启(ip link set eth0 promisc on)。