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

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

Ку­да более инте­рес­ный воп­рос — как мы можем помешать зло­умыш­ленни­кам изу­чать наши ресур­сы в интерне­те, сбить их с тол­ку или — еще луч­ше — испортить этот про­цесс и даже встреч­но ата­ковать зло­умыш­ленни­ков? И это будут не советы по защите, а, ско­рее, рекомен­дации по тому, как стать мак­сималь­но неудоб­ным для хакера.

В этой статье мы раз­ложим с десяток граб­лей, на которые неп­ремен­но нас­тупит хакер, — и ста­нем мак­сималь­но неудоб­ными для ата­кующе­го!

 

Замедляем сканирование портов

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

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

info

Эта статья осно­вана на фраг­менте кни­ги «Ха­кер­ская само­обо­рона. При­емы обна­руже­ния и пре­дот­вра­щения хакер­ских атак», которая сей­час готовит­ся к пуб­ликации.

Од­ной из самых прос­тых рекомен­даций по зат­рудне­нию ска­ниро­вания пор­тов может быть зап­рет отправ­ки пакетов TCP-RST. Такую воз­можность мож­но акти­виро­вать бук­валь­но в одну коман­ду:

iptables -A OUTPUT -o eth0 -p tcp --tcp-flags RST RST -j DROP

Суть в том, что, ког­да порт зак­рыт, мы не говорим об этом хакеру, сра­зу отправ­ляя ему пакет TCP-RST. Тем самым мы вынуж­даем его тра­тить некото­рое вре­мя на ожи­дание воз­можно­го ACK-пакета, который отправ­ляет­ся уже в слу­чае откры­того пор­та.

Да­вай срав­ним вре­мя ска­ниро­вания топ-1000 TCP-пор­тов с отправ­кой RST-пакетов и с зап­ретом.

Быстрое сканирование портов узла, отправляющего ответы TCP-RST
Быс­трое ска­ниро­вание пор­тов узла, отправ­ляюще­го отве­ты TCP-RST

А теперь акти­виру­ем пра­вило, зап­реща­ющее пакеты TCP-RST. Вновь запус­тим ска­ниро­вание топ-1000 пор­тов.

Медленное сканирование портов узла, не отправляющего ответы TCP-RST
Мед­ленное ска­ниро­вание пор­тов узла, не отправ­ляюще­го отве­ты TCP-RST

Вид­но, что эта прос­тая рекомен­дация в десят­ки тысяч раз замед­ляет клас­сичес­кое ска­ниро­вание TCP-пор­тов. А умно­жив его на количес­тво IP-адре­сов нашего перимет­ра, получа­ем не очень при­ятное для хакера зна­чение.

 

Делаем все порты открытыми

Учи­тывая, что количес­тво воз­можных пор­тов рав­но 65 535 для TCP и столь­ко же для UDP, а типич­ный сетевой периметр неред­ко сос­тоит из сотен IP-адре­сов, для хакера может ока­зать­ся дос­таточ­но нак­ладным пол­ное ска­ниро­вание пор­тов. В таком слу­чае хакеры могут доволь­ство­вать­ся лишь самыми рас­простра­нен­ными пор­тами (топ-1000) или самыми пер­спек­тивны­ми для про­ник­новения (low hanged fruits). И отсю­да вытека­ет самая рас­простра­нен­ная защит­ная прак­тика — переве­шивать служ­бы на нес­тандар­тные пор­ты. Но целе­устрем­ленный хакер все же не испу­гает­ся пол­ного ска­ниро­вания пор­тов и неп­ремен­но най­дет спря­тан­ный сер­вис, на каком бы пор­те он ни висел.

Хакер находит SSH, работающий на самом последнем TCP-порте
Ха­кер находит SSH, работа­ющий на самом пос­леднем TCP-пор­те

Но куда более дей­ствен­ной тех­никой про­тив ска­ниро­вания пор­тов явля­ется ими­тация всех неис­поль­зуемых пор­тов как откры­тых. Это­го лег­ко мож­но дос­тигнуть с помощью фай­рво­ла, нап­ример iptables на Linux-сер­вере, и любого пус­того лис­тенера.

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-ports 22
iptables -t nat -A PREROUTING -i eth0 -p tcp -m conntrack --ctstate NEW -j REDIRECT --to-ports 1234
while sleep 1; do nc -nv -lp 1234; done

Пос­ле чего хакер уви­дит уже сов­сем иную, удру­чающую кар­тину.

Ложные результаты сканирования — все порты открыты (и так еще 65 510 строк)
Лож­ные резуль­таты ска­ниро­вания — все пор­ты откры­ты (и так еще 65 510 строк)

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

Лож­но откры­тые пор­ты — отно­ситель­но час­тая защит­ная мера ком­мерчес­ких сетевых экра­нов. Но ее мож­но обой­ти, ведь за пакетом SYN-ACK с это­го пор­та обыч­но ничего не при­ходит. Ины­ми сло­вами, эти пор­ты не содер­жат никакой служ­бы и хакеру вид­ны как tcpwrapped или как пор­ты с пус­той вер­сией.

Определение реального сервиса среди ложно открытых портов
Оп­ределе­ние реаль­ного сер­виса сре­ди лож­но откры­тых пор­тов

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

 

Имитируем случайные сервисы

Раз хакер глав­ным обра­зом полага­ется все же не на сами откры­тые пор­ты, а на служ­бы, которые он иден­тифици­рует на этих пор­тах, то уда­рим ему по самому боль­ному — сымити­руем слу­чай­ные служ­бы! И на помощь нам вновь при­дет база фин­гер­прин­тов от Nmap.

Мы уже писали прос­той TCP/UDP-лис­тенер для наб­людения за зап­росами хакеров. Теперь мы напишем лис­тенер, который, вмес­то того что­бы мол­ча при­нимать дан­ные, ста­нет слать хакеру осо­бые бай­ты, что будут казать­ся его ска­неру каким‑либо сер­висом. А эти бай­ты мы возь­мем из того же самого фай­ла с фин­гер­прин­тами, исполь­зуемо­го хакером.

В этот раз нам вновь пред­сто­ит рас­парсить базу фин­гер­прин­тов Nmap, толь­ко теперь нас будут инте­ресо­вать уже не зап­росы, а отве­ты:

defence/services.py
#!/usr/bin/python3
import socket
import rstr #pip3 install rstr
import random
def get_random_match():
return random.choice(matches)
matches = []
with open("/usr/share/nmap/nmap-service-probes") as f:
for line in f.readlines():
line = line.strip()
if line.startswith("match "):
matchtext = line[len("match "):]
index = matchtext.index(" m")
m = matchtext[index + 2]
name = matchtext[:index]
matchtext = matchtext[len(name):].strip()
regx_start = 2
regx_end = matchtext.index(m, regx_start)
regx = matchtext[regx_start:regx_end]
try:
matches.append( rstr.xeger(regx) )
except Exception as e:
pass
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("0.0.0.0", int(port)))
s.listen(10)
while True:
c,info = s.accept()
try:
c.send(get_random_match().encode())
except:
pass
c.close()

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

Се­тевой ска­нер Nmap пар­сит отве­ты от служб, опи­раясь на базу фин­гер­прин­тов, и дела­ет это не по чет­кому сов­падению, а по регуляр­ному выраже­нию. Поэто­му мы, отправ­ляя ответ, дол­жны прев­ратить слу­чай­но выб­ранную стро­ку с регуляр­ным выраже­нием, содер­жащую в себе диапа­зон допус­тимых зна­чений, во что‑то кон­крет­ное — в этом нам помога­ет биб­лиоте­ка rstr.

Мы запус­каем наш «ответчик» на про­изволь­ном пор­те и ждем некото­рое вре­мя, пока он рас­парсит Nmap-базу.

Запуск листенера, имитирующего случайные сервисы на порте
За­пуск лис­тенера, ими­тиру­юще­го слу­чай­ные сер­висы на пор­те

Ха­кер же при попыт­ке прос­каниро­вать этот порт и опре­делить служ­бу уви­дит совер­шенно слу­чай­ный бан­нер.

Имитация фейковой службы на порте
Ими­тация фей­ковой служ­бы на пор­те

Выг­лядит впол­не прав­доподоб­но. А что хакер уви­дит, ког­да мы сов­местим с этим трюк из пре­дыду­щего раз­дела? Сде­лаем все пор­ты откры­тыми и нап­равим их в этот лис­тенер:

iptables -t nat -A PRETOUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-ports 22
iptables -t nat -A PREROUTING -i eth0 -p tcp -m conntrack --ctstate NEW -j REDIRECT --to-ports 1234

Те­перь, ког­да хакер поп­робу­ет прос­каниро­вать боль­шее количес­тво пор­тов, он уви­дит что‑то вро­де такого.

Имитация фейковых служб на всех возможных портах
Ими­тация фей­ковых служб на всех воз­можных пор­тах

Пол­ная мешани­на. На мес­те хакера я бы рас­терял­ся на какое‑то вре­мя. Такого боль­шого количес­тва раз­нооб­разных служб на одном компь­юте­ре быть не может. Но как сре­ди это­го най­ти нас­тоящие сер­висы?

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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

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

    Подписаться

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