пятница, 10 июня 2016 г.

Splunk. Подключаем списки серверов Proxy и Tor. Часть 1.

Приветствую, читатель!


Читая в очередной раз про проблемы анонимности в сети, меня посетила мысль, что было бы круто в процессе мониторинга иметь возможность выявлять конкретные активности, идущие с прокси-серверов (допустим публичных) и с выходных нод TOR-сети. И дополнительно посчитать, какой процент атак от общего числа происходит с использованием прокси или TOR. Результат моих измышлений ниже.





Итак, для выявления использования прокси или TOR (т.е. подключение таких данных в запрос), необходимо решить следующие задачи:
  • получить список публичных прокси-серверов и TOR-серверов;
  • в удобном формате хранить списки серверов и их периодически актуализировать;
  • научить Splunk использовать эти списки в запросах.


Сегодня мы решим первую задачу, а именно, получим список публичных прокси-серверов и TOR-серверов. Использовать будем PowerShell.

Начнем с прокси-серверов. Вбив запрос "Список публичных прокси", я достаточно быстро нашел следующие сайты со списками:

http://www.hotvpn.com/proxies/
http://www.prime-speed.ru/proxy/free-proxy-list/all-working-proxies.php

Увидев красивую табличку с адресами на сайте hotvpn.com, я крайне обрадовался, и думал собрать список в пару строк кода….


но потом, я заглянул в код страницы.....


Судя по всему, с целью максимального усложнения парсинга страницы, администраторы придумали всё что могли, и над содержимой ячейки <td> просто поиздевались :)
Но желание получить заветный список оказалось сильнее лени думать как распарсить содержимое.

На prime-speed.ru ситуация оказалась проще, но сервер настойчиво отдавал ответ в кодировке win1251, а командлет Invoke-WebRequest такую кодировку не понимает. Пришлось найти другой способ :)

Собственно, финальный скрипт, который получает адреса прокси с обоих сайтов, убирает дубли, и складывает результат в Temp.


#PROXY

$ipcollection=@()
$data = (get-date) .toString("yyyy-MM-dd HH:mm")

#http://www.hotvpn.com/proxies/

$body = Invoke-WebRequest -Method get -uri http://www.hotvpn.com/proxies/
$pages = $body.ParsedHtml.getElementsByTagName("li")
[int]$pmax = 0

foreach($p in ($pages | select innerHTML | Select-String -pattern "proxies\/\d{1,3}")) {
    $match = [regex]::Matches($p.Line.ToString() ,'(?<flud>.{1,30}\/proxies\/)(?<page>\d+)(?<end>\/.{1,40})')
    $max = [int]$match. Groups[2].Value
        if ($max -gt $pmax)
            { $pmax = $max}
   }

foreach ($s in (1..$pmax )) {
 $url = "http://www.hotvpn.com/proxies/" + $s + "/"
 Write-Host "#####################################"
 $url
 $proxy = Invoke-WebRequest -Method get -uri $url
 $table = $proxy.ParsedHtml.getElementsByTagName("td") | select outerHTML

    foreach($t in $table) {
        $new = $t. outerHTML -replace '\<div\sstyle\=\"display\:\snone\"\>\d{1,4}\<\/div\>' ,"" -replace '\<span\sstyle\=\"display\:\snone\"\>\d{1,4}\<\/span\>' ,"" -replace "`n" ,"" -replace "`r" ,""   -replace "<TD>" ,"" -replace "</TD>" ,""
            if ([regex]::isMatch($new,"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}" )) {
               $obj_ip = New-Object psobject
               $obj_ip | Add-Member -type noteproperty -name Type -Value "Proxy"
               $obj_ip | Add-Member -type noteproperty -name ip -Value $new
               $obj_ip | Add-Member -type noteproperty -name date -Value $data
               $ipcollection += $obj_ip
             }
    }
}

#http://www.prime-speed.ru/proxy/free-proxy-list/all-working-proxies.php   win1251

$client = New-Object System.Net.WebClient
$url = "http://www.prime-speed.ru/proxy/free-proxy-list/all-working-proxies.php"
$results = [System.Text.Encoding]::GetEncoding('windows-1251').GetString([Byte[]]$client .DownloadData($url))
$match_ip = [regex]::Matches($results,'(?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')

foreach($ip_proxy in $match_ip) {
    $obj_ip = New-Object psobject
    $obj_ip | Add-Member -type noteproperty -name Type -Value "Proxy"
    $obj_ip | Add-Member -type noteproperty -name ip -Value $ip_proxy.Value
    $obj_ip | Add-Member -type noteproperty -name date -Value $data
    $ipcollection += $obj_ip
}

$ipcollection | Select-Object Type,ip,date -Unique | Sort-Object | Export-Csv -Append -Path "C:\Temp\IPs.log" -encoding "UTF8" -NoTypeInformation


С нодами TOR ситуация оказалась проще. Быстро найдя сайт - http://torstatus.blutmagie.de/index.php 



Был написан простенький скрипт, также складывающий результат в Temp.

# TOR

$torcollection=@()
$data = (get-date).toString( "yyyy-MM-dd HH:mm")

$body_tor = Invoke-WebRequest -Method get -uri http://torstatus.blutmagie.de/index.php -UseBasicParsing
$match_tor = [regex]::Matches($body_tor. Content,'(?<ip>ip\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' )
foreach($ip_tor in $match_tor) {
    $obj_ip = New-Object psobject
    $obj_ip | Add-Member -type noteproperty -name Type -Value "TOR"
    $obj_ip | Add-Member -type noteproperty -name ip -Value ($ip_tor.Groups[1].value -replace "ip=","")
    $obj_ip | Add-Member -type noteproperty -name date -Value $data
    $torcollection += $obj_ip
}

$torcollection | Select-Object Type,ip,date -Unique | Sort-Object | Export-Csv -Append -Path "C:\Temp\IPs.log" -encoding "UTF8" -NoTypeInformation


Результирующий файл выглядит вот так:



Также, есть сайт - https://www.dan.me.uk/torlist/, на котором можно получить список нод TOR. Однако, есть ограничение - 1 запрос в 30 минут.


Собственно, первый этап на этом завершен, следующая задача - организовать хранение полученных данных. Оптимальным вариантом будет хранение в СУБД, а для использования в Splunk настроим Splunk DB Connect.


2 комментария:

  1. Есть отличное решение: https://github.com/stamparm/maltrail - небольшая, но уникальная в своём роде NIDS. Там и Tor и публичные прокси и много еще чего. Вам остается только отправить в splunk её текстовый лог.

    ОтветитьУдалить