Nmap: извлекать нежелательные порты для отправки почты с помощью Batch и Blat - PullRequest
0 голосов
/ 08 февраля 2012

Контекст

Я использую FINDSTR /C:"portid=" "scanports.xml" для извлечения строк из файла:

<port protocol="tcp" portid="21"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ftp" method="table" conf="3"/></port>
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ssh" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="http" method="table" conf="3"/></port>
<port protocol="tcp" portid="443"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="https" method="table" conf="3"/></port>
<port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ms-term-serv" method="table" conf="3"/></port>

Вопросы

  • Как извлечь 21, 22, 80, 443 и 3389 из этой строки?
  • Тот же вопрос для случайного числа в [0-9], за исключением 21, 22, 80, 443 и 3389?

Я хочу отправить по электронной почте все открытые порты, как правило, не открытые.

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Вы можете использовать второй FINDSTR для фильтрации «нормально открытых» портов. Решение, которое я показываю, использует внешний файл для вывода списка исключаемых портов (обычно открытых). В качестве альтернативы список может быть указан в командной строке как несколько /C параметров.

ignore.txt (при необходимости измените)

portid="21"
portid="22"
portid="80"
portid="443"
portid="3389"

findstr /c:"portid=" test.txt | findstr /r /v /g:"ignore.txt"

В FINDSTR есть ошибка, из-за которой может не получиться найти совпадение, если есть несколько строк поиска литералов различной длины. Именно поэтому я решил использовать опцию регулярного выражения /R.

Если формат файла XML согласован, то вы можете использовать FOR / F с DELIMS, установленным на символ кавычки, чтобы извлечь 4-й токен. Синтаксис для указания параметров FOR / F с кавычками в качестве разделителя нечетен: обычно вы делаете что-то вроде "tokens=4 delims=,". Но чтобы включить кавычку в качестве разделителя, вы должны выполнить несколько экранировок: tokens^=4^ delims^=^".

Собрав все вместе, вы получите

@echo off
for /f tokens^=4^ delims^=^" %%P in (
  'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
  echo unusual open port = %%P
)
exit /b

Если формат (порядок атрибутов) XML может отличаться, решение будет более сложным. Сначала вы используете внешний FOR / F, чтобы прочитать всю строку в переменную. Вы используете поиск SET * и замену op, чтобы найти местоположение порта в строке, а затем второй FOR / F, чтобы разобрать фактический порт.

setlocal enableDelayedExpansion
for /f "delims=" %%L in (
  'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
  set "ln=%%L"
  for /f delims^=^=^" %%A in ("!ln:*portid=!") do set port=%%A
  echo unusual open port = !port!
)

После того, как у вас есть идентификаторы портов, вы можете создать свое почтовое сообщение. Я рекомендую использовать Blat для Windows для отправки электронной почты.

1 голос
/ 10 февраля 2012

Это немного обманывает, но ваш пакетный файл может вызвать скрипт VBScript:

c:\windows\system32\cscript.exe //nologo scanports.vbs

Где scanports.vbs - это следующий скрипт:

Option Explicit
Dim xml, port
Set xml = CreateObject("Microsoft.XMLDOM")
xml.load "scanports.xml"
For Each port in xml.documentElement.selectNodes("//port")
  WScript.Echo port.getAttribute("portid")
Next
1 голос
/ 08 февраля 2012

Вы можете использовать FOR / F для разбора строк.

FINDSTR /C:"portid=" "scanports.xml" > tmpFile.tmp

FOR /F "tokens=3 delims=>=" %%1 in (tmpFile.tmp) DO (
  echo %%~1
)
0 голосов
/ 08 февраля 2012

Я заканчиваю свой сценарий с ответом Джеба и этой ссылкой .

Код:

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION

REM Blat options:
SET blat="C:\Program Files (x86)\blat276\full\blat.exe"
SET server=127.0.0.1
SET port=25
SET from=x@x.com
SET to=y@y.com

FOR %%i IN (1,1,9) DO (  
  "C:\Program Files (x86)\Nmap\nmap.exe" server%%i.com -oX scanports%%i.xml

  FINDSTR /C:"portid=" scanports%%i.xml >> scanports%%itemp.txt

  FOR /F "tokens=*" %%a IN (scanports%%itemp.txt) DO (
    SET x=%%a
    SET x=!x:"=/!
    FOR /f "tokens=4,12 delims=/" %%a IN ("!x!") DO (
      IF NOT %%a==21 IF NOT %%a==22 IF NOT %%a==80 IF NOT %%a==443 IF NOT %%a==3389 (
        %blat% -server %server% -port %port% -f %from% -to %to% -html -s "Port ouvert sur server%%i" -body "Port %%a : %%b"
      )
    )
  )

  DEL scanports%%i.xml
  DEL scanports%%itemp.txt
)
...