【问题标题】:Filtering nmap outputs using grep, awk, or sed使用 grep、awk 或 sed 过滤 nmap 输出
【发布时间】:2013-12-11 20:01:19
【问题描述】:

我使用 NMAP,在大型网络上运行扫描以查看打开的端口。输出文件为 2MB,但我想过滤掉所有关闭端口的所有 IP 地址。

 Nmap scan report for 10.x.x.x
 Host is up (0.048s latency).
 Not shown: 998 closed ports
 PORT   STATE SERVICE
 22/tcp open  ssh
 23/tcp open  telnet

 Nmap scan report for 10.x.x.x
 Host is up (0.046s latency).
 All 1000 scanned ports on 10.x.x.x are closed

 Nmap scan report for 10.x.x.x
 Host is up (0.045s latency).
 All 1000 scanned ports on 10.x.x.x are closed

应该输出到只输出到:

 Nmap scan report for 10.x.x.x
 Host is up (0.048s latency).
 Not shown: 998 closed ports
 PORT   STATE SERVICE
 22/tcp open  ssh
 23/tcp open  telnet

编辑

结果是这样的

 Nmap scan report for 10.x.x.x
 Host is up (0.048s latency).
 Not shown: 998 closed ports
 PORT   STATE SERVICE
 22/tcp open  ssh
 23/tcp open  telnet
 Nmap scan report for 10.x.x.x
 Host is up (0.046s latency).
 All 1000 scanned ports on 10.x.x.x are closed
 Nmap scan report for 10.x.x.x
 Host is up (0.045s latency).
 All 1000 scanned ports on 10.x.x.x are closed

有些换行符没有正确复制

编辑 感谢大家。我看到 awk 非常棒,而且很容易做到。

【问题讨论】:

  • 我只知道简单的 grep。比如“cat nmap,out | grep open”。但它只列出了打开的端口,而不列出其他详细信息,例如 ip 地址
  • 请提供您正在使用的 nmap 命令行,以便我们复制您的输出以测试解决方案。
  • 好的。除了前面评论中提到的简单 grep 之外,您还尝试过什么?
  • 这是唯一的事情。我不知道如何让 grep 抓取其他需要的行,例如具有开放端口的主机的主机 IP 地址,同时过滤掉具有所有关闭端口的主机的 IP 地址和信息。

标签: sed awk filtering nmap


【解决方案1】:

在我看来,您正在尝试对您的 nmap 输出应用一些智能过滤,而不仅仅是简单的“grep”。

由于您的 nmap 命令(根据您的 cmets 而不是您的问题)指向子网而不是单个主机,因此您需要单独解释输出的每个部分。但是这种解释对于正则表达式来说太复杂了。 (使用 PREG 可能可行,但编写起来非常困难,而且几乎无法阅读。)像 awk 这样的工具是完成这项任务的更好选择。

例如:

nmap 10.10.0.0/16 | awk '
  /^Nmap scan report for/ {
    if (open) {
      print output;
    }
    output="";
    open=0;
  }

  {
    output=output $0 "\n";
  }

  $2 == "open" {
    open=1;
  }

  END {
    if (open) {
      print output;
    }
  }
'

Awk 很容易阅读,但您应该知道,它通过将每一行输入与看起来像 condition { action } 的表达式进行匹配来运行。如果条件评估为真,则执行操作。因此,第一个条件是一个正则表达式,用于查找主机部分的开头,并且这些操作包含在花括号中。缺少第二个条件,因此假定所有行都为“真”。在处理完所有输入行后,最后一个条件匹配,并且在最后扫描的主机包括开放端口的情况下是必需的。

这种东西可以表达得更密集,但我写得很长,以便您更容易看到逻辑是如何工作的。更严格的代码会随着练习而来。

请注意,您可以将 awk 脚本放入一个单独的文件中,您可以使用 awk 的 -f 选项引用该文件。阅读the man page了解详情。

如果您不想将 awk 部分保留在自己的文件中,也可以将整个内容放入自己的 shell 脚本中。你应该能够很容易地找到看起来像什么的例子——无论如何,它超出了这个问题的范围。

【讨论】:

  • 如果问题是“复杂文本处理”,答案几乎总是awk(除非是perl...)。很好的答案。
【解决方案2】:

你可以试试

awk -f filter.awk input.txt

其中input.txtnmap 的输出,filter.awk 是:

/^Nmap/ {
    if (block)
        if (!match(block,/are closed/))
            print block
    block=$0
    next
}

{
    if (block)
        block=block RS $0
    else
        block=$0
}

【讨论】:

  • 太棒了!谢谢。尽管我对其进行了一些修改以摆脱其他一些东西,但它仍然有效。 >if (!match(block,/are closed/) && !match(block, /are filtered/))
  • @user3037023 太好了:)
【解决方案3】:

虽然您似乎有答案,但我将从 Nmap 方面解决这个问题。 Nmap有很多不同的output options,所以事先仔细规划可以让这类问题变得简单处理。

首先,如果您只想要开放端口的主机,您可以使用--open 运行扫描,这将隐藏所有关闭和过滤的端口以及没有开放端口的主机。这意味着您的输出将正是您想要的,无需过滤。缺点是你会丢失一些信息;有时了解存在哪些主机很重要,即使它们没有服务。

接下来,Nmap 有几种输出格式。正常输出 (-oN) 主要是您在屏幕上看到的内容。滚动浏览很好,但正如您所见,使用 grep、sed、awk 等进行文本处理或过滤非常糟糕。我发现最有用的输出选项是 -oA,它可以保存 3 个不同的文件:一个普通的 @ 987654327@ 文件,一个“greppable”.gnmap 文件,以及所有格式之母,.xml 文件。

Greppable format 非常适合快速查询,例如“哪些 IP 开放了端口 22?”每个主机有一行,有严格的分隔符。缺点是它已被弃用:Nmap 的任何新功能都不会集成到 greppable 格式中。这是-oG 中缺少的一些内容的列表:NSE 脚本输出、traceroute 信息、多个主机名、端口状态原因、ttls。您的问题可以使用 greppable 格式回答如下:

grep '[0-9]/open' myscan.gnmap

XML output 是最完整的格式,包括甚至不适合正常输出的信息。由于是 XML,它还能够在命令行上进行处理。这是一个使用 xmlstarlet 的示例查询(尽管有很多其他工具可以完成这项工作):

xmlstarlet sel -t -m "//host[ports/port/state/@state='open']" -v "address[@addrtype='ipv4']/@addr" -n myscan.xml

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多