防火墙:如何根据每个目标主机允许端口的白名单来识别禁止端口?

防火墙:如何根据每个目标主机允许端口的白名单来识别禁止端口?

假设我有一个要扫描的主机列表。对于每个主机,我都有一个允许端口列表。

192.168.1.2;80,443 
192.168.1.3;3306

上面的列表显示“允许第一个 IP 打开端口 80 和 443,允许第二个 IP 打开端口 3306“。

我想运行此扫描来识别开放端口的主机除了上面允许列表中的那些。

例如假设 192.168.1.3 突然也打开了端口 80,那么我想要生成如下警报:

Alert: Found forbidden open port(s) on 192.168.1.3: 80 (Expected: 3306)

问:如何才能有效实现这一目标?

附加问题:有没有一个词/术语可以描述我所要求的内容?谷歌搜索起来很费劲。我当时想的是“防火墙单元测试”之类的东西 - 就像源代码中的单元测试组件,但这次是针对防火墙的。

答案1

你可以用一个简单的方法来实现狂欢脚本和一些XSLT处理nmap的输出。

假设您将允许的端口列表按照 中所示的格式列出/usr/local/etc/check-ports.conf

您可以创建一个 bash 脚本 ( /usr/local/bin/check-ports),它将调用nmap <host> --excluded-ports <port_list>列表中的每一行:

#!/bin/bash
STYLESHEET=/usr/local/share/check-ports/nmap.xslt
cat /usr/local/etc/check-ports.conf |
  while IFS=";" read -a line; do
    options="-oX -"
    if [ "${line[1]}" != "" ]; then
      options="$options --exclude-ports ${line[1]}"
    fi
    /usr/bin/nmap $options ${line[0]} |
      /usr/bin/xsltproc --stringparam expected "${line[1]}" $STYLESHEET -
  done

你把一个简单的XSLT样式表位于/usr/local/share/check-ports/nmap.xslt

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="expected"/>
  <xsl:output method="text" />
  <xsl:template match="/"><xsl:apply-templates select="//host" /></xsl:template>
  <xsl:template match="host">
    <xsl:apply-templates select="//port">
      <xsl:with-param name="host" select="address/@addr" />
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="port[state/@state = 'open']">
    <xsl:param name="host" />Alert: Found forbidden open port(s) on <xsl:value-of select="$host" />: <xsl:value-of select="@portid"/> (expected: <xsl:value-of select="$expected" />)
</xsl:template>
</xsl:stylesheet>

转变nmap的 XML 输出:

<nmaprun ...
  <host starttime="1580679113" endtime="1580679113">
    <address addr="127.0.0.1" addrtype="ipv4"/>
    <ports>
      <port protocol="tcp" portid="22">
        <state state="open" reason="syn-ack" reason_ttl="0"/>
        <service name="ssh" method="table" conf="3"/>
      </port>
...

进入您在问题中给出的输出。

相关内容