Приветствую, читатель!
Читая в
очередной раз про проблемы анонимности в сети, меня посетила мысль, что было бы
круто в процессе мониторинга иметь возможность выявлять конкретные активности,
идущие с прокси-серверов (допустим публичных) и с выходных нод 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.
Есть отличное решение: https://github.com/stamparm/maltrail - небольшая, но уникальная в своём роде NIDS. Там и Tor и публичные прокси и много еще чего. Вам остается только отправить в splunk её текстовый лог.
ОтветитьУдалитьБлагодарю за информацию!
Удалить