如何分析单个文件中模式的多个文本块(多行)?

How can I analyze multiple blobs (multi-lines) of text for patterns in a single file?

我使用 --script ssl-enum-ciphers -p443 192.168.0.0/24 选项对多个 IP 地址进行了 运行 扫描 nmap。我还有 运行 使用 --script ssh2-enum-algos -p22 选项进行的极其相似的扫描,它以相同的格式生成输出。

我想快速分析此数据并归零特定密码或算法的特定匹配项。总体目标是 运行 在不使用 Nessus 或 Rapid7 InsightVM 等高级工具的情况下进行临时内部漏洞评估。

虽然 nmap 支持 -oX 选项输出到 XML,但我发现 Microsoft Word、Excel 或网络浏览器都不知道如何打开文件。 Microsoft 产品不断产生 xml 格式不正确的错误。

然后我尝试了 nmap-parse-output code on Github。虽然它可以很容易地按端口对 IP 地址进行分组,但它似乎无法更进一步并为我分析密码或算法。

所以现在我想找出一种方法来手动解析这些数据块。 典型的结果可能包含以下格式的多个 IP 地址的数据(为简洁起见,对以下示例标准输出进行了编辑):

Nmap scan report for 192.168.1.1
Host is up (0.00064s latency).

PORT    STATE SERVICE  VERSION
443/tcp open  ssl/http lighttpd
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|     compressors: 
|       NULL
|     cipher preference: server
|_  least strength: A

Nmap scan report for 192.168.1.2
Host is up (0.00048s latency).

PORT    STATE SERVICE  VERSION
443/tcp open  ssl/http nginx (reverse proxy)
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|     compressors: 
|       NULL
|     cipher preference: server
|_  least strength: A

Nmap scan report for 192.168.1.3
....

Nmap scan report for 192.168.1.4
....

如何使用 bash 可用的标准应用程序编写脚本来遍历每个文本块? 我们不知道每个块的长度,所以我需要匹配字符串“Nmap scan report”或类似的东西,并提取每个匹配项之间的数据。

像这样的事情会让我开始,但它并不完整,实际上并没有单独分开每个 blob:

for i in $(cat scan-results | grep "Nmap scan report for"); do more data analysis here; done 

例如,我可能想在端口 443 上搜索任何支持 RC4 密码的 IP 地址,因此在“做更多数据分析”中,我想 运行:grep -i rc4

或者在 ssh 算法的情况下,我想确保禁用所有 cbc 算法,所以我可以 运行:grep -i cbc

最终目标是列出任何匹配的内容,以便我可以快速将匹配项归因于特定的 IP 地址。我不关心结果看起来如何,我只关心快速找到结果。

如有任何帮助,我们将不胜感激!

没有更多的示例数据,只关注有限的示例,并记住输出格式并不重要...

注意:我的示例数据文件 - nmap.dat - 是 OP 提供的示例 nmap 数据的 cut-n-paste 副本。

我认为 multi-pattern grep 可能就足够了,例如:

# search for any IP address that support RC4 ciphers on port 443

$ grep -i "Nmap scan report for|443|RC4" nmap.dat
Nmap scan report for 192.168.1.1
443/tcp open  ssl/http lighttpd
Nmap scan report for 192.168.1.2
443/tcp open  ssl/http nginx (reverse proxy)
Nmap scan report for 192.168.1.3
Nmap scan report for 192.168.1.4

# want to ensure all cbc algorithms are disabled

$ egrep -i "Nmap scan report for|cbc" nmap.dat
Nmap scan report for 192.168.1.1
Nmap scan report for 192.168.1.2
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
Nmap scan report for 192.168.1.3
Nmap scan report for 192.168.1.4