介绍
安全工具可能产生很长的输出,夹杂笔记、重复观察记录和诊断信息。有用的结果应是一组数量较少、与任务相关且来源清楚的发现。
本实验中,你会先使用提供的文本文件进行练习,再学习运行扫描工具。你将读取内容,过滤开放服务记录并去重、计数,还会将错误与有用输出分开保存。
读取预置输出文件
本步骤中,你将在提取发现之前,通过多种方式查看预置文本文件。这是样本数据,并非要求你运行扫描后得到的输出。
打开准备好的 Kali shell:
kali
使用绝对路径选择共享工作目录:
cd /home/labex/project
observations.txt 文件包含以 NOTE、OPEN 或 CLOSED 开头的短行。这里的 OPEN 表示样本观察记录将某项服务列为开放,并不能证明存在漏洞。打印整个小文件:
cat observations.txt
你会看到重复的开放服务记录,以及笔记和关闭服务记录。先读取源文件,有助于选择能保留所需信息的过滤条件。
对于长文件,less 可以逐页显示内容,而不修改文件:
less observations.txt
如有需要,使用方向键移动,然后按 q 退出并返回 shell。样本很小,一屏就能显示;同一个分页器也适用于更长的工具输出。
head 读取文件开头;tail 读取文件末尾。-n 选项设置显示的行数。查看前三行:
head -n 3 observations.txt
预期输出:
NOTE supplied training observations
OPEN training-web:8080 http
CLOSED training-db:5432 postgresql
接着查看最后两行:
tail -n 2 observations.txt
最后一行是 NOTE end of sample。使用第一个实验介绍的 > 运算符保存三行预览:
head -n 3 observations.txt > preview.txt
cat preview.txt
预览应包含上面展示的相同三行。你保留了源文件,并保存了一份有用的内容视图。
过滤、排序并删除重复发现
本步骤中,你将构建管道,保留开放服务记录并去重。
留在 Kali 中,返回共享工作区:
cd /home/labex/project
grep 打印匹配的行。下面的模式用单引号括起,让 shell 将其作为字面内容传递。^ 锚点表示行首,OPEN 后的空格用于分隔记录类型与数据:
grep '^OPEN ' observations.txt
输出包含所有开放服务观察记录,包括重复行。笔记和 CLOSED 行不会出现。
管道符 | 将一个命令的标准输出连接到下一个命令的标准输入。sort 对行排序,使相同行相邻:
grep '^OPEN ' observations.txt | sort
重复行现在已聚在一起。uniq 删除相邻的相同行,因此当重复行可能分散时,应将它放在排序之后:
grep '^OPEN ' observations.txt | sort | uniq
预期输出:
OPEN training-dns:5353 dns
OPEN training-ssh:2222 ssh
OPEN training-web:8080 http
每个命令只承担一项工作:选择记录、排序,然后合并重复项。将最终输出流保存到独立的输出文件:
grep '^OPEN ' observations.txt | sort | uniq > open-services.txt
cat open-services.txt
你应该看到相同的三条唯一记录。重定向作用于管道的最终输出,原始观察记录不会被编辑。
统计结果并分离错误输出
本步骤中,你将统计选出的发现,并区分正常输出与错误消息。
从共享工作区开始:
cd /home/labex/project
wc 用于统计文本。其 -l 选项统计以换行符结尾的行。由于保存的文件每行包含一项发现,行数就是不同开放服务记录的数量:
wc -l open-services.txt
输出会显示 3 和文件名;间距可能不同。管道直接提供文本,无需文件名参数,便于只保存计数:
cat open-services.txt | wc -l > finding-count.txt
cat finding-count.txt
值为 3,前面可能有空格。
程序通常将有用数据发送到标准输出,将诊断信息发送到标准错误。shell 的 > 重定向标准输出;2> 则重定向标准错误。为了观察区别,请尝试读取一个故意不存在的文件,并保存诊断信息。下一条命令预期会失败,因为 missing-observations.txt 不存在;这是有意安排的演示,请在执行后继续:
cat missing-observations.txt 2> read-error.txt
屏幕上应没有任何显示,因为错误消息写入了 read-error.txt。查看这份独立的诊断信息:
cat read-error.txt
消息会指出 missing-observations.txt,并说明该文件不存在,因此无法读取。真正的发现仍单独保存:
cat open-services.txt
三条有效记录保持不变。将诊断信息分开保存,可避免把错误消息误当作工具发现。
总结
你使用 cat、less、head 和 tail 读取文本,使用 grep 选择行,用 sort 和 uniq 组合管道,通过 wc 统计记录,并使用了输出重定向和错误重定向。这些技能有助于将冗长的工具输出转化为简短、可检查的结果。



