Предположим, у меня есть список хостов, которые я хочу просканировать. Для каждого хоста у меня есть список разрешенных портов.
192.168.1.2;80,443
192.168.1.3;3306
В приведенном выше списке говорится: "1-й IP-адрес может иметь открытые порты 80 и 443, а 2-й IP-адрес может иметь открытый порт 3306.".
Я хочу запустить это сканирование, чтобы определить хосты с открытыми портами Кроме те, что в разрешенном списке выше.
например предположим, что вдруг у 192.168.1.3 также открыт порт 80, тогда я хочу сгенерировать предупреждение, например:
Alert: Found forbidden open port(s) on 192.168.1.3: 80 (Expected: 3306)
Вопрос: Как этого добиться эффективно?
Дополнительный вопрос: есть ли слово / термин для того, что я прошу? Было сложно погуглить. Я думал о чем-то вроде «модульного тестирования брандмауэра» - например, компонентов модульного тестирования в исходном коде, но на этот раз для брандмауэров.
Вы можете добиться этого с помощью простого трепать сценарий и некоторые 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>
...
в вывод, который вы дали в вопросе.