• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Определение веб-антивирусов

malayazemlya

HDD-drive
Пользователь
Регистрация
04.06.2013
Сообщения
26
Реакции
1
Я тут заинтересовался темой веб антивирусов - то есть сервисов, которые сканируют URL и определяют, живет ли там зараза. Самые известные такие сканеры - это Virustotal и Google Safe Browsing (он же mawler, кажется), а вообще тьма их. (Неплохой список в этой теме.)

Теоретически, ятоб не дать малваре шанса спрятаться, сканеры должны работать скрытно, в идеале - абсолютно неотличимо от нормальных пользователей, зашедших с нормальных браузеров.

Практически, почему-то большинстов аверов на скрытность забивает. Чтоб разобраться, я поднял сайт с небольшим набором проверок, напустил на него всех собак, и почитал логи. Поделюсь, стало быть, наблюдениями, может кому пригодится B)
Сканеры можно разбить на три класса:
1. со статическим анализом, совсем простые. Обычно просто чекают, что на сайте нет ссылок из черного списка. Ну ингода еще ищут подозрительные скрытые iframe итп. Пример: Sucuri SiteCheck

2. Автоматизированные браузеры. То есть на виртуальной машине бежит реальный IE,FF,Chrome итп, через него прогоняют сайт, и проверяют, не появился ли, например, левый процесс или запись в реестре. Понятно, что это трудный случай. По идее, только так вообще и нужно сканировать. Примеры: упомянутый Google Safe Browsing, vURL Online, часть ав из вирустотала (я пока не определил, кто чему соответствует)

3. Эвристические сканеры - промежуточный вариант. Какую-то часть джаваскрипта запускают(в v8 или rhino, скажем) что-то по сигнатурам узнают. Пример: Wepawet, JSUnpack

Понятно, что на сайт заползают еще поисковики, приватные сканеры, определители прокси, тулзы для массового взлома и другая живность. Я только вскользь этим занимался, на эту тему и так много написано (гуглить по словам honeypot, cloaking, IDS).

Еще наблюдение: если сканер говорит, проверка пройдена, это еще не значит, что сайт отпустили с миром. За ним следят еще несколько часов, а то и дней. Гугль так не прекращает следить никогда. Зачастую в первой фазе проводятся только самые элементарные проверки, а тяжелая артиллерия подтягивается через час или два. А потом еще через часик. И еще. А еще аверы ссылками обмениваются. Или просто так заходят. Пролетарскую бдительность терять нельзя!

Это вводная часть была, теперь о демаскирующих факторах. Их много.

ip - самый простой. Тут надо вести черный список IP и подсеток, известных сканеров, подсеток, с которых нормальные люди редко приходят (Amazon EC), c Tor-а. Выручают блеклисты на основе DNS. Сервера Tor-а можно узнать по TorDNSEL, подсетку и ее владельца - по whois или сервису от Team Cymru (имейте ввиду, что хозяева сервиса непосредственно связаны с ФБР. Напрямую туда стучаться может и не стоит). Еще полезный список: SURBL.
Лучше имхо всего вести свою базу и обновлять по мере поступления логов.

заголовки запроса

user-agent - очень важно, потому что тут царит полная анархия. Некоторые сканеры даже сами представляются (Sucuri), некоторые дают совсем левые какие-то значения ("Browserlet" - это кто-то с вирустола) , некоторые косят под гугльбота (а ip при том не гугловский), некоторые и бингом тоже, а многие притворяются такими старинными версиями браузеров, что уже в природе почти не осталось. Были замечены Chrome 4 или FF2 . Смысл таких значений как бы в том, чтоб поймать побольше сплоитов на разные наживки, но все хорошо в меру. Антиквариат банить или хотя б кинуть мессагу, чтоб обновили софт, елы палы.
Тут большая база user-agent ов

Другая фишка - несколько user-agent-ов c одного IP в короткое время. Иногда авторы скупятся на железо и запусткают несколько сканов на одной машине. Но может быть и другая причина - трафик с прокси или из-за NAT. Здесь инфа об IP пригодится.

Referer тоже о многом говорит. Трафик с IFRAME, а Referer пустой? Подозрительно (очень часто случается с ботами). Referer со страницы, которую клиент еще не запрашивал - тоже плохо. Один ав с вирустотала любит рекурсию и ставит Referer = запрашиваемый URL . :huh1:

Cookie - должны сохранятся. Если нет,то имеем дело с неполноценной имитацией браузера (или посторонним ботом).

Etag и If-None-Match - малоизвестный аналог куков. Про них могли забыть. Читайте Википедию.

Accept, Accept-Encoding: должны соответствовать типу запрашиваемого ресурса и типу браузера. Подлинный Хром текущей версии при запросе HTML ресурса говорит:
Код:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8] Accept-Encoding: gzip,deflate,sdch
и никак иначе.
А поддельные Хромы чего только не пишут. Особенно часто ставят * или пропускают. Почти все псевдохромы забывают sdcn в Accept-Encoding (об этом будет ниже) . У других браузеров - свои привычки, их на отдельную статью хватит, но надеюсь идея понятна
(Полезный ресурс: browsershots.org, там несколько десятков видов браузеров в виртуалках можно запускать и собирать логи для анализа)

Accept-Language - если выставлен американский английский язык то это "en-us" (Сафари), "en-US" (IE) "en-US,en;q=0.8" (Хром) или "en-US,en;q=0.5" (Firefox) ?

Запрашиваемые ресурсы

Должны запрашиваться в точности те ресурсы, которые требуются кодом страницы. Включая редиректы, ajax, сss, динамически создаваемые элементы и фишки вроде favicon.ico

Чтоб не было заморочек с кешированием, хорошо генерировать уникальные URLы (style18812.css, favicon1238384.ico)

Просят ресурс, на который не ведут ссылки - подозрительно. (часто так ищут админку или чекают страницу 404).

Просят странный URL ("//" - тоже кто-то из вирустоталов) - либо бот либо хакеры лезут.

Поисковики должны по идее с самого начала попросить robots.txt ,а потом уж входить. Сканеры так не поступают.

С другой стороны, нормальные браузеры просят файл иконки, который хорошо б ставить явно
Код:
<link href="..." rel="shortcut icon" type="image/vnd.microsoft.icon" />
FF без этого иконки не всегда берет.
У айфонов-айпадов чуть по другому:
Код:
<link rel="apple-touch-icon-precomposed" href="file.png"/>);

А боты почти все про favicon забывают. Очень характерная черта.

У Chrome еще одна примочка. Если с HTML страницей отдать заголовок
Код:
Get-Dictionary: somefile.dct
то он должен запросить и этот somefile.dct. Файл можно и не создавать или выдать пустым. Если запрос есть, то хром наверняка настоящий. (Это мы используем специальный вид сжатия который называется sdch. В реале его только гугль и знает)
(Прим: в начале убедитесь, что sdch присуствует в Accept-Encoding. Его некоторые хостеры фильтруют.)

Если браузер прошел все испытания, то 99.99% это реальный браузер. но, возможно, автоматизированный или под отладчиком. Теперь требуется тонкая работа.

Проверки на автопилот

Поскольку на этом этапе часть кода уже видна сканеру, то есть шанс спалиться. Наверное можно попытаться прикинуться веб аналитикой какой-нибудь. Там инфа тянется практически та же самая:

Свойства окна: во-первых, координаты на десктопе (window.screenX, window.screenY или screenLeft,window.screenTop) - у ботов там иногда 0 или двже отрицательные значения. во-вторых, размеры внутренней и внешней границы окна. (innerWidth, innerHeight,outerWidth,outerHeight) У ботов они обычно фиксированые, а у пользователей - как придется. (Большая разница по размерам может кстати говорить об открытом дебаггере.)

Разрешение экрана: screen.availWidth, screen.availHeight, screen.colorDepth - у сканеров они иногда нестандартные.

Список плагинов с версиями итп тоже разумеется полезен: У автоматов плагинов обычно мало и все старье. Некоторые комбинации я только у ботов и видел.

Если есть флэш - то можно вытащить список шрифтов (пример) и тоже подсчитать. У реальных пользователей шрифты как-то быстро накапливаются. У ботов - нет.

Прочекать точную структуру DOM. Чистые эмуляторы джаваскрипта наоборот про DOM не знают .
Автоматизированные браузеры могут тоже накосячить (с вложенными айфреймов в частности. Если трафик с iframe, то top.location не должен быть равен window.location).
Приходящие события (onload, onclick итп) тоже проверить полезно - некоторые сканеры вызывают _все_ обработчики, которые только есть. Даже если у нормальных пользователей они никогда не срабатывают (как-то onscroll или onkeypress внутри айфрейма).

И сами события чуть по разному устроены: когда скажем в вебките срабатывает натуральный window.onunload, то event.target == document , а если посылать событие искусственно при помощи dispatchEvent, то event.target == window . А если функцию обработки вызвать напрямую, то arguments.caller выйдет ненулевой, чего случаться не должно.

Есть еще антидебаггерные приемы, но это отдельная тема.

Для сканеров, которые я проверял, вышеописанных приемов вроде достаточно. Там все довольно тупо - пока. Если кто еще что по теме знает, накидайте, было б интересно :thumbsup:
 
Позновательная статья, наводит на мысли о примитивности автоматизированной хрени для чека урлов... Хорошую работу проделали!
 
Еще инфа:

Сетки с которых сканирует VirusTotal

ASN16276, 37.59.0.0/16 OVH OVH Systems
ASN8001 173.255.224.0/20 NET-ACCESS-CORP - Net Access Corporation
ASN5381, 195.159.0.0/16 POWTECH-AS PowerTech Information Systems AS
ASN5617, 178.42.0.0/15 TPNET Telekomunikacja Polska S.A.
ASN5617, 83.24.0.0/13 TPNET Telekomunikacja Polska S.A.
ASN14618, 23.20.0.0/15 AMAZON-AES - Amazon.com, Inc.
ASN14618, 174.129.0.0/16 AMAZON-AES - Amazon.com, Inc.
ASN37560, 194.132.32.0/24 CYBERDYNE
ASN8402, 95.24.0.0/13 CORBINA-AS OJSC _Vimpelcom_
ASN8334, 188.244.32.0/20 CO-2COM-AS 2COM Co ltd.
ASN852, 207.102.0.0/16, TELUS Communications Inc.
ASN35838 199.66.200.0/21 CCANET CCANet Limited
ASN46475 64.31.0.0/18 LIMESTONENETWORKS - Limestone Networks, Inc.
ASN15169 8.35.200.0/21 GOOGLE - Google Inc.(также AdminusLabs и ESET)
ASN6539 209.139.192.0/19 GT-BELL - Bell Canada
ASN12338 62.99.0.0/17 EUSKALTEL Euskaltel S.A.
ASN577 204.101.0.0/16 BACOM - Bell Canada

Некоторые выявленые сканеры:
1
UA=Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) AppEngine-Google; (+http://code.google.com/appengine; appid: s~virustotalcloud)

Ходит с Google AppSpot ASN15169 (GOOGLE - Google Inc.) 8.35.200.0/21
Статический анализ HTML-страницы - не смотрит ни на какие под-ресурсы (iframe,img,script). Кажется ESET или ADMINUSLabs

2
UA=Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

Ходит с Amazon AWS (ASN14618)
Скачивает под-ресурсы, статический анализ
Не проставляет куки и реферов

3
UA=Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Ходит с Tor (обычные люди ходят с torbrowser который представляется firefoxом)
Referer проставляет в адрес сканируемой страницы
Шлет заголовок Accept-Encoding: identity

4
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Ходит с ASN8402 CORBINA-AS OJSC "Vimpelcom"
Accept-Language=*/* (необычно)
Реферер пуст

5
UA=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 - это старинный хром версии 4 :blink:
Ходит с ASN6539 (GT-BELL - Bell Canada, кабельный пул)
рефера нет

5-1
UA=Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12
Музейный экспонат :crazy:
с тех же ип что и Д . Если видите ип со старинными хромами и сафари одновременно - это наш пациент
В рефер иногда ставит / (даже если / никто не посещал)

6
Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)
с ASN12338 (EUSKALTEL Euskaltel S.A.)
статический анализ

7
UA=Browserlet
с ASN852 (TELUS Communications Inc.)
Accept-Encoding=gzip,deflate
Referer сначала пустой потом http://www.google.com (а надо https://!) и с http://www.bing.com

также пробует прикинуться хромом
UA=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
но Accept-Encoding неверный, должен быть gzip,deflate,sdch

8

UA=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
куки, реферы работают как надо, но favicon не просит

9
Рефером иногда http://http://www.ask.com/web?q=puppies
или http://www.google.com
UA=Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
(старинный ФФ, но настоящий)
ходит с ASN5381 (POWTECH-AS PowerTech Information Systems AS)

10
двумя браузерами ходит
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2)
и
Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0
оба кажется настоящие

11
Скачивает все url на странице но не выполняет скрипты
ходит с ASN35838 (CCANET CCANet Limited)
UA=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)

12
UA=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.1.4322)
Настоящий IE вроде, все исполняется как обычно
язык de-at
сетка ASN46475 (LIMESTONENETWORKS - Limestone Networks, Inc.)

B)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх