Дав­но прош­ли вре­мена тра­вояд­ного интерне­та, ког­да машина, све­тящая неп­рикры­тым сетевым сте­ком на белом адре­се, име­ла хорошие шан­сы жить годами, а сло­во CVE зна­ла лишь куч­ка спе­циалис­тов. Ста­тис­тика говорит, что до момен­та, пока ано­ним­ный разум нащупа­ет неос­торож­но откры­тый порт Telnet, прой­дет око­ло двух минут, Redis — шесть минут, веб на 8080 — две­над­цать, а Android Debug Bridge — двад­цать.

И пар­ни с той сто­роны, конеч­но, не прос­то собира­ют дан­ные для дис­серта­ции. Что­бы в этом убе­дить­ся, дос­таточ­но открыть SSH и пос­мотреть, как в течение получа­са в твой порт набь­ется целая коман­да спе­циалис­тов по чужой безопас­ности, генери­рующих записи вро­де таких:

sshd[198760]: Failed password for www-data from 82.154.230.131 port 65229 ssh2

sshd[198760]: Received disconnect from 82.154.230.131 port 65229:11: Bye Bye [preauth]

sshd[198760]: Disconnected from authenticating user www-data 82.154.230.131 port 65229 [preauth]

sshd[198766]: Invalid user bkp from 103.152.18.138 port 51314

sshd[198766]: pam_unix(sshd:auth): check pass; user unknown

sshd[198766]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.152.18.138

sshd[198766]: Failed password for invalid user bkp from 103.152.18.138 port 51314 ssh2

Не надо быть сот­рудни­ком ИБ‑отде­ла, что­бы догадать­ся, какие имен­но иссле­дова­ния про­водят эти граж­дане. И изба­вить­ся от их назой­ливого вни­мания дос­таточ­но слож­но. Уж если вце­пились, то к про­цес­су будут под­клю­чать­ся всё новые и новые адре­са, и вот уже кажет­ся, что весь интернет сидит и под­бира­ет пароли к тво­ей машине.

Ес­ли говорить язы­ком цифр, то за час любой адрес IPv4 (даже не отве­чающий вооб­ще ни на что) опра­шива­ется более 300 раз с полуто­ра сотен источни­ков. За месяц будут опро­шены все пор­ты до одно­го, за две недели — 65 000, а за неделю — 63 000. В общем, «неболь­шой», но мно­гочис­ленный брат еще как сле­дит.

Учи­тывая, что, даже если инфраструк­туру тво­ей ком­пании обслу­жива­ет коман­да опыт­ных спе­циалис­тов, которые быс­тро и решитель­но накаты­вают све­жие обновле­ния, не запус­кают «на пять минут» какую‑нибудь служ­бу (которая потом висит годами) и не вык­ладыва­ют по‑быс­тро­му фай­лики для суб­подряд­чиков (ну кто там его най­дет на нашем сек­ретном пор­те, хе‑хе), все рав­но оста­ется неус­тра­нимое «окно уяз­вимос­ти».

Экс­пло­ит уже в работе, а раз­работ­чики еще тес­тиру­ют патч, а потом поль­зовате­ли его рас­катыва­ют — пока все это про­вер­нется, ата­кующая сто­рона, имея пред­варитель­но соб­ранную базу отпе­чат­ков, быс­тро и точ­но по ним отра­бота­ет. А то и прос­то вос­поль­зует­ся поис­ковика­ми интерне­та вещей, которые раз­дают дос­туп к такой информа­ции через API за весь­ма скром­ное воз­награж­дение. Да и прос­тое ска­ниро­вание при помощи какого‑нибудь ZMap поз­воля­ет, не при­ходя в соз­нание, сос­тавить гру­бый спи­сок целей, по которым сле­дом летит наг­рузка. Кто не спря­тал­ся — его проб­лемы.

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

 

Постановка задачи

Ра­боты по защите перимет­ра от ска­ниро­вания мож­но раз­бить на две час­ти. Пер­вая — это фор­мирова­ние стоп‑лис­та с адре­сами, намере­ния которых вызыва­ют воп­росы (или, наобо­рот, никаких воп­росов уже нет); вто­рая — рас­пре­деле­ние и при­мене­ние это­го спис­ка по машинам.

Ни одна, ни дру­гая задача не пред­став­ляют слож­ности в пла­не реали­зации, но для ком­плексно­го решения пот­ребу­ется допол­нитель­ная логика и какой‑то фор­мат, в котором будет удоб­но хра­нить и ана­лизи­ровать дан­ные.

Де­лать такой ком­байн толь­ко для себя не очень целесо­образно, поэто­му, ког­да ста­ло ясно, что парой скрип­тов и unit-фай­лом дело не обой­дет­ся, я решил соз­дать более‑менее уни­вер­саль­ный про­ект, при­год­ный для исполь­зования все­ми, кому тема инте­рес­на.

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

 

Угрозы и нейтрализация

Ес­ли кому‑то кажет­ся, что ска­ниро­вание — это вещь прос­тая и вари­антов тут нет, то он оши­бает­ся. За вре­мя наб­людения я выявил три раз­ных типа.

Ска­нер. Тут все понят­но: заряди­ли перебор пор­тов, не осо­бо скры­ваясь, и сидим ждем. Ска­ниро­вать могут на пос­тоян­ной осно­ве или одно­разо­во, но всег­да с одно­го адре­са. Это лег­ко выявить и заб­локиро­вать. Если нам прис­лали три пакета и ни один не попал в откры­тый порт, то доб­ро пожало­вать в блок. На момент написа­ния статьи пер­вая десят­ка самых активных источни­ков это­го клас­са за месяц выг­лядела так.

Ван­шотеры. Это менее замет­ные пер­сонажи. Их дей­ствия выг­лядят так: со слу­чай­ного адре­са при­лета­ет зап­рос на какой‑то кон­крет­ный порт, и толь­ко на него. Бло­киро­вать такое ска­ниро­вание по счет­чику бес­полез­но, в сле­дующий раз ван­шотер появит­ся не ско­ро и точ­но так же опро­сит один порт. При этом пер­вое обра­щение все рав­но прой­дет (если у тебя есть соот­ветс­тву­ющая служ­ба). Таких зап­росов во вхо­дящем тра­фике абсо­лют­ное боль­шинс­тво, без малого 80%. Вот как это выг­лядит на про­тяже­нии месяца.

A/B/C — это мар­кер аген­та, куда зап­рос при­шел. Здесь бло­киро­вать мож­но толь­ко пре­вен­тивно. Этим занима­ется модуль greyport, который пов­торя­ет идею серых спис­ков для поч­ты. По умол­чанию все пор­ты зак­рыты, и, что­бы получить дос­туп, надо пов­торить зап­рос задан­ное чис­ло раз (чис­ло пов­торов, задер­жку отсче­та и кон­троль­ный интервал мож­но задать в нас­трой­ках модуля).

В общем слу­чае это не дос­тавля­ет неудобств, кро­ме замед­ленно­го пер­вого соеди­нения. Дос­туп для адре­са по умол­чанию откры­вает­ся на сут­ки, потом про­цеду­ра пов­торит­ся. Эффектив­ность не стоп­роцен­тная, но, задав чис­ло пов­торов рав­ное одно­му, мож­но отбить те самые 80% про­ходим­цев, два отва­дят 90%, три — от 95%. Но три — это уже сов­сем пре­дел. Сетевой стек на сто­роне кли­ента боль­ше пяти зап­росов, как пра­вило, не отправ­ляет, и отле­тать нач­нут уже нор­маль­ные кли­енты.

На качес­тво работы greyport вли­яет в том чис­ле номер пор­та. Выше я при­вел парамет­ры эффектив­ности для пор­тов 80 и 22, а для Elasticsearch (9200) задер­жка толь­ко одно­го пер­вого пакета отби­вает 99 зап­росов из 100.

Так­же на при­мере ска­неров это­го клас­са мож­но оце­нить ско­рость работы «пар­тне­ров» по про­изводс­твен­ному про­цес­су. Из таб­лицы вид­но, что задер­жка меж­ду пакета­ми варь­иру­ется от секунд (для сосед­них адре­сов) до часов, если сег­менты раз­ные. Одна­ко тут есть сущес­твен­ный эле­мент слу­чай­нос­ти. Нап­ример, во вре­мя под­готов­ки выбор­ки я нашел при­мер, ког­да адре­са из раз­ных (силь­но раз­ных) сетей были опро­шены с раз­ницей в две секун­ды, зато сосед­ние — с раз­ницей в две минуты.

Тре­тий тип ска­неров самый спо­кой­ный. Эти пери­оди­чес­ки пос­тукива­ют то тут, то там. Выг­лядит это сле­дующим обра­зом.

По­иско­вики по интерне­ту вещей — это третья катего­рия. От них зап­росы при­ходят бес­систем­но, адре­са опра­шива­ют враз­нобой. Быва­ет, опра­шива­ют нес­коль­ко раз с раз­ных адре­сов. У них целые сетевые сег­менты и «одоб­рямс» от про­вай­дера, так что мож­но раз­мазывать зап­росы по источни­кам и вооб­ще никуда не спе­шить.

Для работы с подоб­ными кли­ента­ми пред­назна­чен модуль lazyscan, который про­веря­ет, сколь­ко событий с адре­са было зарегис­три­рова­но за доволь­но дли­тель­ный пери­од (по умол­чанию неделя, а иног­да и это­го мало). И если выяс­няет­ся, что источник занима­ется сво­им делом сис­темати­чес­ки, модуль так же нес­пешно (пока наберет­ся ста­тис­тика), но надол­го перево­дит его в спи­сок заб­локиро­ван­ных.

Та­ких субъ­ектов за три месяца наб­людений наб­ралось более 5000, тем­пы попол­нения упа­ли, но по 50–60 новых адре­сов в сут­ки про­дол­жает добав­лять­ся.

Вла­дель­цы «легаль­ных» ска­неров пред­лага­ют писать им пись­ма в слу­чае, если их активность кому‑то не нра­вит­ся. Теоре­тичес­ки, пос­ле того как ты докажешь, что явля­ешь­ся вла­дель­цем диапа­зона, который хочешь исклю­чить из опро­сов, они боль­ше не пот­ревожат. Но такие дей­ствия боль­ше напоми­нают замазы­вание кус­ков спут­никовых карт — луч­шего спо­соба прив­лечь вни­мание не при­думать.

Да и осо­бого смыс­ла слать пись­ма нет, так как на одно­го доб­ропоря­доч­ного при­ходит­ся пять менее отзывчи­вых, жаловать­ся на которых мож­но раз­ве что в спор­тло­то. Поэто­му опти­маль­ной так­тикой выг­лядит мол­чаливый блок, что еще и эко­номит силы.

 

Горшок с нарисованным медом

Да­вай гля­нем на уро­вень выше и пос­мотрим, чем наши любите­ли ска­ниро­вать инте­ресу­ются в пла­не прик­ладных про­токо­лов, в час­тнос­ти HTTP. Столь любимые все­ми веб‑админки, REST и про­чие чудеса — это удобс­тво не толь­ко для вла­дель­ца сер­виса, но и для обла­дате­ля тай­ного зна­ния. Отпра­вив хит­рый зап­рос, он попол­нит ряды адми­нис­тра­торов устрой­ства без вся­ких там ROP, heap spraying и дру­гих страш­ных слов. Для кон­тро­ля за подоб­ной активностью есть модуль, раз­бира­ющий зап­росы к Nginx и посиль­но их клас­сифици­рующий.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    5 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии