<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; WMI: Блокировка IP флудера]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11339&amp;type=atom" />
	<updated>2016-05-11T06:45:00Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11339</id>
		<entry>
			<title type="html"><![CDATA[Re: WMI: Блокировка IP флудера]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=103635#p103635" />
			<content type="html"><![CDATA[<p><strong>Ganzales</strong><br />Немного некропостинга, плюс слегка оффтоп(с учётом запроса решения на WMI), но возможно вам пригодится мой вариант. У меня похожая ситуация - Windows Server 2003 Web Edition на хостинге(не особо загружен работой), соответственно пришлось озаботиться защитой RDP.<br />Для автоматизации использовал LogParser(для анализа логов безопасности на предмет брутфорса), и netsh для добавления правил блокировки. В Local Security Policy заранее было создан список правил(BruteForce) с запретом доступа(по всем протоколам/портам). Кстати, LogParser умеет работать и с текстовыми логами, так что может быть вы сможете его задействовать для работы с логом апача. В таком случае вам требуется только переписать функцию GetIPsFromLog под апач, поправить белый список, и создать список блокирующих правил в политике.<br />Скрипт проверяет лог безопасности(с начала текущих суток), если кол-во неудачных попыток авторизации больше 5 и IP не в белом списке, то он(IP) добавляется в запрещающее правило(если он ещё не там).<br /></p><div class="codebox"><pre><code>Option Explicit
&#039; константы для работы с текстовыми файлами
Const ForReading = 1 :  Const ForWriting = 2 :  Const ForAppending = 8
Const TristateUseDefault = -2 :  Const TristateTrue = -1 :  Const TristateFalse = 0

&#039; в NETSH регистр имён правил, списков и политик имеет значение!
Const FilterListName = &quot;BruteForce&quot; &#039; имя списка фильтров для добавления туда IP

&#039; белый список - эти IP блочить нельзя!
Dim dWLIP : Set dWLIP = CreateObject(&quot;Scripting.Dictionary&quot;)
&#039;dWLIP.Add &quot;IP&quot;, &quot;Description&quot;
dWLIP.Add &quot;1.2.3.6&quot;, &quot;MyOffice Gate#1&quot;
dWLIP.Add &quot;1.2.3.9&quot;, &quot;MyOffice Gate#1&quot;

&#039; LOG-файл
Dim WshShell, fso, BasePath
Set WshShell = WScript.Createobject(&quot;WScript.Shell&quot;)
Set fso = WScript.Createobject(&quot;Scripting.FileSystemObject&quot;)
BasePath = WshShell.CurrentDirectory
Dim logfile, LogTS
logfile = &quot;auto_ban.log&quot;
logfile = fso.BuildPath(BasePath,logfile)
If Not fso.FileExists(logfile) Then
  fso.CreateTextFile logfile, False,False
End If
Set LogTS = fso.GetFile(logfile).OpenAsTextStream(ForAppending, TristateFalse)
LogEcho String(80,&quot;#&quot;), True, True
LogEcho NOW &amp; &quot;|Session started; FilterList is: &quot; &amp; FilterListName, True, True

&#039; подгружаем список ранее заблокированных адресов
Dim dBLIP : Set dBLIP = GetBlackList(FilterListName, dWLIP)
LogEcho NOW &amp; &quot;|Curent BL Loaded; &quot; &amp; dBLIP.Count &amp; &quot; entries.&quot;, True, True

Dim i &#039; десятилетия на рынке счётчиков для циклов

&#039; получаем список нарушителей из журнала(Log Parser)
Dim dIntruders : Set dIntruders = GetIPsFromLog(dWLIP)

LogEcho NOW &amp; &quot;|Curent Intruders Loaded; &quot; &amp; dIntruders.Count &amp; &quot; entries.&quot;, True, True
&#039; Проходим по списку и что-нибудь делаем
Dim BadGuys : BadGuys = dIntruders.Keys
Dim BadGuy
For i = LBound(BadGuys) To UBound(BadGuys)
  &#039; пробиваем по BL
  BadGuy = CStr(BadGuys(i))
  If dBLIP.Exists(BadGuy) Then
      LogEcho NOW &amp; &quot;|&quot; &amp; BadGuy &amp; &quot; is already in BL&quot;, True, True
    Elseif dWLIP.Exists(BadGuy) Then
      LogEcho NOW &amp; &quot;|&quot; &amp; BadGuy &amp; &quot; in WL!!! Ahtung!!!&quot;, True, True
    ElseIf GetCount(dIntruders(BadGuy)) &gt; 5 Then  
      &#039;блокируемс
      LogEcho NOW &amp; &quot;|&quot; &amp; BadGuy &amp; &quot;: Adding to the filterlist.&quot;, False, True
      If Not AddIPtoBL(BadGuy, dIntruders(BadGuy), FilterListName) Then
          LogEcho NOW &amp; &quot;|&quot; &amp; BadGuy &amp; &quot;: Error while adding to the filterlist.&quot;, True, True
          wscript.quit
        Else
          LogEcho NOW &amp; &quot;|&quot; &amp; BadGuy &amp; &quot;: Successfully added to the filterlist.&quot;, True, True
      End If
    Else
      wscript.echo &quot;Count too small&quot;
  End If
Next  

&#039;###############################################################################
&#039;######################### FUNCTIONS AND SUBROUTINES ###########################
&#039;###############################################################################
&#039; получение списка внёсённых в BL IP
Function GetBlackList(FLName, WIP) &#039;return Dictionary
  Dim WshShell : Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)
  Dim oExec : Set oExec = WshShell.Exec(&quot;netsh ipsec static show filterlist name=&quot; &amp; FLName &amp; _
                                        &quot; level=verbose format=table&quot;)
  Dim StdIn : Set StdIn = oExec.StdOut
  
  Dim NetshString : NetshString = StdIn.ReadAll 
  
  &#039; Выцепляем из выхлопа netsh адреса(кроме масок и IP сервера)
  Dim f_regEx : Set f_regEx = New RegExp
  Dim f_Match, f_Matches
  f_regEx.Ignorecase = True
  f_regEx.Global = True

  f_regEx.Pattern = &quot;[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}&quot;
  Set f_Matches = f_regEx.Execute(NetshString)
  
  Set GetBlackList = CreateObject(&quot;Scripting.Dictionary&quot;)
  &#039;Проверка на валидность IP тут не требуется - во-первых, эти IP уже проверены;
  &#039;во-вторых, в дальнейшем они используются только для проверки на наличие в BL добавляемых IP
  For Each f_Match In f_Matches
    f_Match = CStr(f_Match)
    If StrComp(f_Match, &quot;255.255.255.255&quot;, 1) &lt;&gt; 0 And StrComp(f_Match, &quot;0.0.0.0&quot;, 1) _ 
      And (Not GetBlackList.Exists(f_Match)) And (Not WIP.Exists(f_Match)) Then 
        GetBlackList.Add f_Match, f_Match
    End If
  Next
End Function


&#039; список IP, замеченных в брутфорсе
Function GetIPsFromLog(WIP)
  Dim oLogQuery, oEventLogInput
  Set oLogQuery = CreateObject(&quot;MSUtil.LogQuery&quot;)
  Set oEventLogInput = CreateObject(&quot;MSUtil.LogQuery.EventLogInputFormat&quot;)
  
  Dim sQRY
  sQRY = &quot;SELECT EXTRACT_TOKEN(strings, 11, &#039;|&#039;) AS IP, COUNT(IP) AS Cntr, &quot; &amp; _
            &quot;MIN(TimeWritten) AS FirstDate, MAX(TimeWritten) AS LastDate &quot; &amp; _
            &quot;FROM security WHERE EventID = 529 &quot; &amp; _
            &quot;AND TimeWritten &gt;= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP(&#039;01-02&#039;, &#039;MM-dd&#039;))) &quot; &amp; _
            &quot;GROUP BY IP &quot; &amp; _
            &quot;ORDER BY LastDate DESC&quot;
  
  Dim oRecordSet, oRecord, IP, Descr
  Set oRecordSet = oLogQuery.Execute (sQRY, oEventLogInput)
  Set GetIPsFromLog = CreateObject(&quot;Scripting.Dictionary&quot;)  
  Do While Not oRecordSet.atEnd
  	Set oRecord = oRecordSet.getRecord
    IP = CStr(oRecord.getValue(0))
    wscript.echo &quot;do: &quot; &amp; IP
    If StrComp(IP, &quot;255.255.255.255&quot;, 1) &lt;&gt; 0 And StrComp(IP, &quot;0.0.0.0&quot;, 1) _ 
      And (Not WIP.Exists(IP)) Then
        Descr = &quot; Count: &quot; &amp; CStr(oRecord.getValue(1)) &amp; _
                &quot;; First Event: &quot; &amp; CStr(oRecord.getValue(2)) &amp; _
                &quot;; Last Event: &quot;  &amp; CStr(oRecord.getValue(3)) 
        GetIPsFromLog.Add IP, Descr
        WScript.Echo &quot;Client IP Address: &quot; &amp; oRecord.getValue(0) &amp; Descr
        
    End If
  	oRecordSet.moveNext
  Loop

End Function

&#039; Add IP to IP Security Policy Filter List
Function AddIPtoBL(IP, Descr, FLName)
  Dim WshShell : Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)          
  Dim ExecString : ExecString = &quot;netsh ipsec static add filter filterlist=&quot; &amp; FLName &amp; _
                                        &quot; srcaddr=Me dstaddr=&quot; &amp; IP &amp; _
                                        &quot; description=&quot;&quot;&quot; &amp; Descr &amp; &quot;&quot;&quot;&quot;
  LogEcho ExecString, True, True
  Dim oExec : Set oExec = WshShell.Exec(ExecString)
  Dim StdIn : Set StdIn = oExec.StdOut
  Dim NetshString : NetshString = StdIn.ReadAll 
  If InStr(NetshString, &quot;ERR&quot;) = 0 And oExec.ExitCode = 0 Then
      wscript.echo &quot;IP added to BL.&quot;
      AddIPtoBL = True
    Else
      wscript.echo &quot;Something wrong..&quot;
      AddIPtoBL = False
  End If
End Function
&#039;###############################################################################
Function GetCount(SString)
  Dim f_regEx : Set f_regEx = New RegExp
  Dim f_Match, f_Matches
  f_regEx.IgnoreCase = True
  f_regEx.Global = True
  f_regEx.Pattern = &quot;Count: ([\d]+);&quot;
  Set f_Matches = f_regEx.Execute(SString)
  GetCount = CInt(f_Matches(0).SubMatches(0))
End Function       
                                        
Sub LogEcho(s_Text, s_Log, s_Echo) &#039; эхо + запись в лог
 If s_Log Then LogTS.WriteLine s_Text
 If s_Echo Then wscript.echo s_Text
End Sub</code></pre></div><p>P.S. Изначально мне было интересно, сколько правил осилит политика... Код работает с декабря 2013, текущее кол-во блоков - 7049. Пока проблем не наблюдается. Если кому-то интересен список(сразу добавить в блокировку), в прилагаемом файле список текущих правил. Последний рекордсмен за 5 минут(частота запуска скрипта) успел 420 попыток предпринять <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[BeS Yara]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25643</uri>
			</author>
			<updated>2016-05-11T06:45:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=103635#p103635</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[WMI: Блокировка IP флудера]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=101257#p101257" />
			<content type="html"><![CDATA[<p>Всем привет! Давно не приходилось браться за vbscript, но сразу вспомнил домен данного форума, которым раньше активно пользовался. Комрады, прошу Вашей помощи!</p><p>Есть Win Serv 2008 R2, в силу некоторых обстоятельств, с установленным на нем вебсервером хостящий сайт. Сайт не особо важный и посещаемый, но нашелся ^%&amp;#@^, который кладет его когда захочет.</p><p>Кладет его гет запросами, апач похоже захлебывается, пытаясь дать на каждый запрос ошибку 403. Вот что в логах:</p><div class="codebox"><pre><code>94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283
94.180.132.30 - - [19/Feb/2016:16:20:00 +0300] &quot;GET / HTTP/1.1&quot; 403 283</code></pre></div><p>Почитав про работу апача на win serv, не нашел ничего, что решило бы проблему. Все мнения сводятся примерно к одному, что веб сервер на винде обречен страдать от такой фигни, тк все это из-за особенностей стека вин сервера.</p><p>В таком случае, решил реализовать такой алгоритм при помощи vbs.</p><p>Скрипт будет мониторить лог файл апача, и например держать в памяти 50-500 последних строк лог файла. Далее, он анализирует этот массив, и если фиксируется присутствие флуда, создает либо локальную политику сервера, которая будет блокировать IP флудера, ну или еще что-то.</p><p>Как считаете, может такая мера сработать?</p>]]></content>
			<author>
				<name><![CDATA[Ganzales]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3401</uri>
			</author>
			<updated>2016-02-20T07:36:45Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=101257#p101257</id>
		</entry>
</feed>
