Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье мы рассмотрим простые, но эффективные приемы компьютерной самообороны, которые помогут тебе выявить хакеров, уже успевших проникнуть в локальную сеть. Мы научимся находить признаки проникновения и ловить злоумышленников при помощи специальных хитрых скриптов. Начнем с самого первого уровня: уровня сети.
Когда хакер пытается проникнуть к тебе откуда‑то издалека, атакуя твои сервисы на внешнем периметре, когда его и тебя разделяют десятки хопов, Tor, Proxy, VPN — хакер поистине неуловим. Он с легкостью может сменить IP-адрес, прыгнуть на любой континент или, напротив, подобрать выходную точку поближе к цели. И нам ничего не остается, кроме как терпеть его атаки снова и снова. Однако если на твоем периметре все окей, то бояться нечего.
Но что, если хакер уже где‑то рядом с тобой? Каким‑то неведомым образом он смог проникнуть в твою внутреннюю сеть. Можно ли его как‑то заметить теперь? Ведь в этом случае он представляет уже реальную угрозу.
Тут в игру вступает SOC, также известный как Blue Team. Но далеко не в каждой компании имеется «киберпатруль». Во многих компаниях мероприятия по обеспечению безопасности сильно тормозятся бюрократической машиной либо они просто мешают бизнесу: ведь то, что безопасно, редко бывает удобно. Поэтому внедрить тяжелые и дорогие средства защиты порой оказывается не так‑то просто. Ну а если в компании нет «киберполиции», крайне важно знать простые приемы киберсамообороны.
Общаясь с безопасниками, я замечал, что далеко не все они знают относительно простые технические приемы, которые помогают отследить злоумышленников в процессе атаки. Мне, как пентестеру с достаточно большим опытом, хорошо видны различные места, где они могут попасться, если знать, что проверять.
В этом цикле статей речь пойдет про простые, но эффективные приемы компьютерной самообороны, которые помогут тебе выявить хакеров, что уже успели проникнуть в твою локальную сеть. Или только еще собираются, прогуливаясь вдоль периметра и изучая твои Wi-Fi-сети.
Мы научимся обращать внимание не только на шумные места, но и на вещи, которые многие хакеры считают достаточно тихими, но которые все же имеют свои характерные черты. Ловить хакеров мы будем тоже по‑хакерски — запуская особые хитрые скрипты. Наше defence-кунг‑фу будет направлено против наиболее общих, а значит, наиболее вероятных атак.
И раз это самооборона, то применять ее сможет любой пользователь — все предложенные мною защитные приемы не потребуют никаких исключительных прав. Их можно будет проводить с рядовой рабочей станции, не имея расширенного доступа к логам серверов или к сетевому оборудованию — ничего такого, чего нет у обычного пользователя. А значит, обнаружить злоумышленника сможет любой сотрудник — защитить свою компанию под силу каждому!
Увидеть невидимое будет нашей целью. Уровень сети — это начальный этап продвижения хакера по внутренней инфраструктуре. Его первые шаги — те действия, которые злоумышленник будет совершать на ранней стадии своего проникновения, то есть когда у него еще нет учетной записи в Active Directory и он ничего не знает о твоей сети. И на этом этапе его действия могут быть достаточно спонтанными и шумными.
Это первый раунд нашего противостояния с хакером. Крайне желательно успеть обнаружить злоумышленника на этом этапе, причем как можно раньше, пока он может еще не так много и пока его действия оставляют следы. Ведь чем дальше хакер продвинется, тем сильнее он будет ускользать от нас, а когда он найдет свою первую доменную учетку, этот раунд завершится. Поэтому defence-приемы представлены в порядке роста возможностей хакера по мере его проникновения в инфраструктуру.
Наличие в сети сниффера не считается сетевой атакой, зато может быть хорошей предпосылкой для выявления нарушителей. Порядочный пользователь сниффер запускать не станет, только если это не админ… Или хакер.
Очень часто на ранних стадиях атаки, когда злоумышленник только получил доступ в сеть, он запускает сниффер. Это дает ему хоть какую‑то информацию о твоей сети. По дефолту некоторые снифферы вместо IP-адреса пытаются показать имя хоста. Это означает, что они резолвят каждый новый IP-адрес услышанного пакета. Например, неаккуратно запущенный популярный сниффер tcpdump будет вести себя подобным образом.
Хакер запускает сниффер
И на этой особенности можно поймать любознательного хакера, ведь его компьютер будет отправлять предсказуемые DNS-запросы. Но как нам узнать, что DNS-запрос был отправлен? Ведь логи DNS-сервера читать может далеко не каждый. Все просто: используем нерекурсивный DNS-запрос или запрос к его кешу.
В корпоративной сети DNS-серверы, как правило, свои и общие для всех хостов. И если мы отправим DNS-запрос на получение какого‑либо имени и выставим флаг norecurse
, DNS-сервер будет обязан выдать нам имя только на основании своего кеша. Если этот IP-адрес никто, кроме нас, не резолвил, то мы всегда будем получать пустой ответ.
Запрос к кешу DNS-сервера несуществующей записи
Но если этот адрес кто‑либо в сети резолвил за последнее время, мы увидим следующую картину.
Пример неявного DNS-резолва
Повторный DNS-запрос к кешу даст это понять, и мы увидим иную картину.
Запрос к кешу DNS-сервера существующей записи
Подобное можно выполнить и для преобразования IP-адреса в DNS-имя. Выходит, если между DNS-запросами на всю подсеть широковещательно или таргетированно отправлять пакет в другие подсети от имени некоторого непопулярного IP-адреса, обладающего DNS-именем, то запущенный у кого‑то сниффер выдаст себя DNS-запросом, результат которого потом осядет в кеше корпоративного DNS-сервера.
Хакерский сниффер выдает себя
В рассмотренном примере узел 10.0.1.137
(хакер) сразу после принятия пакета с адресом 176.34.0.3
(любой внешний IP с существующим DNS-именем) выполняет разрешение его IP в DNS-имя. И происходит это при получении единственного сетевого пакета. Этот ICMP-пакет не предназначен какому‑либо приложению, он обрабатывается на уровне ОС, и при нормальных обстоятельствах на такой пакет просто нечему реагировать DNS-запросом. Поэтому с высокой долей вероятности можно сделать заключение, что на этом узле запущен сетевой сниффер.
Вот пример небольшой автоматизации описанной выше проверки:
defence/sniffer.py#!/usr/bin/python3from scapy.all import *from netaddr import IPNetworkfrom time import sleepfrom sys import argvfrom os import systemIPS_WITH_PTR = IPNetwork("176.34.0.0/24")targets = []dns_servers = []conf.verb = 0alerts = []def alert(ip): if ip in alerts: return print("[!] sniffer detected %s" % ip) system("zenity --warning --title='sniffer detected' --text='sniffer detected: %s' &" % ip) #system("echo 'sniffer detected' | festival --tts --language english") alerts.append(ip)n = 1def get_source(): global n while True: ip = str(IPS_WITH_PTR[n]) if not dns_no_recurse(ip): return ip n += 1def dns_no_recurse(ip): def rev(ip): ip = ip.split(".") ip.reverse() return ".".join(ip) for dns_server in dns_servers: try: answer = sr1(IP(dst=dns_server)/UDP(dport=53)/DNS(rd=0, qd=DNSQR(qname=rev(ip)+".in-addr.arpa", qtype='PTR'))) if answer[DNS].ancount > 0: return True except: print(f"[-] {dns_server} has no answer")def probe(src, dst): send(IP(src=src, dst=dst)/ICMP())with open(argv[1]) as f: for line in f: targets.append( line.split("n")[0] )with open(argv[2]) as f: for line in f: dns_servers.append( line.split("n")[0] )src = get_source()while True: for dst in targets: probe(src, dst) sleep(1) if dns_no_recurse(src): alert(dst) src = get_source() sleep(60)
С этим скриптом мы можем проверять снифферы на любых IP-адресах, даже из других подсетей, методично засылая им пакет и проверяя, не срезолвил ли какой‑либо хост этот адрес.
Детект сниффера
Кто‑то еще, кроме нас, запрашивал это имя, и узнать его мог только сниффер.
Пробив сетевой периметр, хакер начнет смотреть по сторонам, сканируя сетевые порты. Это позволит ему понять, есть ли хосты рядом с ним, чтобы потом их атаковать, продвинуться дальше и еще более надежно закрепиться в сети.
Сканирование сетевых портов — первый и, пожалуй, обязательный этап любой сетевой атаки. Поэтому было бы хорошо обнаружить хакера уже на этом раннем этапе.
Как правило, сканируют порты с помощью Nmap
, и мало кто настраивает этот инструмент в плане производительности, особенно в меньшую сторону. По дефолту Nmap
достаточно сильно шумит и отправляет ровно 100 пакетов TCP SYN в секунду для одной цели, проверяя около 1000 сетевых портов. При нормальных условиях ни одна из легитимных программ такой сетевой активности не создает. Также можно учесть характерную особенность Nmap
: он стучится в каждый порт ровно два раза. Это дефолтное поведение.
Другой случай использования Nmap
— сканирование малого количества портов на широком диапазоне хостов. Такой вариант сканирования может использоваться для предварительного определения «живых» хостов в сети или поиска так называемых низко висящих фруктов (легкодоступных целей).
Но неважно, какой программой хакер сканирует твои ресурсы — Nmap
, Masscan
или чем‑то иным. Даже другие более узкоспециализированные инструменты (NBTscan
, CrackMapExec
, BloodHound
) будут создавать исходящие подключения, которые можно засечь.
Если хакер выполняет сканирование, то, скорее всего, и твой компьютер окажется просканирован. Поэтому все, что нам нужно, — это мониторить входящие подключения:
defence/tcp.py#!/usr/bin/python3import logginglogging.getLogger("scapy.runtime").setLevel(logging.ERROR)from scapy.all import *from os import systemfrom sys import argvMAX_PORTS_ALLOWED = 2clients = {}alerts = []def alert(src_ip): if src_ip in alerts: return print("[!] port scanning %s" % src_ip) system("zenity --warning --title='port scanning detected' --text='port scanning detected' &") #system("echo 'port scanning detected' | festival --tts --language english") alerts.append(src_ip)def parse(p): if IP in p and TCP in p: src_ip = p[IP].src src_port = p[TCP].sport dst_port = p[TCP].dport print("[+] %s:%d -> %s:%d" % (src_ip, src_port, ip, dst_port)) if not src_ip in clients: clients[src_ip] = set() clients[src_ip].add(dst_port) if len(clients[src_ip]) > MAX_PORTS_ALLOWED: alert(src_ip)conf.iface = argv[1]ip = conf.iface.ipsniff(iface=conf.iface, prn=parse, filter='tcp[tcpflags] == tcp-syn and dst host %s'%ip)
Даже если хакер будет тише, чем MAX_PORTS_ALLOWED
, в логе скрипта мы все равно увидим попытку входящего подключения.
Детект сканирования портов
А в этом случае хакер превысил MAX_PORTS_ALLOWED
и попался на сканировании всего трех портов.
Хакер сканировал сетевые порты
При нормальных обстоятельствах клиентские ОС не будут подключаться к друг другу, по крайней мере более чем на один‑два порта. Так что, если ты запустишь этот скрипт на обычной рабочей станции, он с большой долей вероятности сможет задетектить злоумышленника.
Описанная проверка, пожалуй, одна из наиболее действенных.
Атаки перехвата трафика можно детектировать двумя методами:
Пытаться выявить атаки на тот же ARP можно разными способами и тут же придумать способ обхода. Поэтому надежнее второй способ, ведь всё так или иначе ведет к нему.
Есть один простой, но верный прием, который позволяет понять, что твой трафик перехватывается. Как известно, каждый узел, через который проходит трафик, уменьшает IP.ttl
на единицу. При этом его начальное значение фиксированное — 255, 128, 64, 32
. Это позволяет как минимум видеть длину сетевого маршрута до определенного узла.
Атаки перехвата трафика часто реализуются в пределах сетевого сегмента, когда атакующий становится между нами и шлюзом. Шлюз — это ближайшее к нам сетевое устройство, пересылающее наш трафик дальше. Следовательно, мы можем проверять перехват своего трафика, просто пингуя шлюз.
IP.ttl шлюза не меняется
У сетевых устройств Cisco начальный IP.ttl
часто равен 255
, и мы видим, что он не меняется, — значит, между нами и шлюзом никого нет. Но если в этот момент хакер, находящийся где‑то рядом с нами, начал шалить, картина изменится.
Хакер перехватывает трафик всей подсети
Мы тут же увидим это по уменьшению IP.ttl
.
Изменение расстояния до шлюза жертв атаки перехвата трафика
А выполнив трассировку, мы увидим расположение наглеца, вставшего перед шлюзом.
Появляется дополнительный хоп
И вспомнив, что у Windows ttl = 128, а у Linux — 64, по тому же пингу мы понимаем, что среди офисных компов на Windows появился кто‑то на Linux, возможно даже Kali.
IP.ttl выдает операционную систему хакера
Целое расследование было проведено лишь при помощи банального ping
.
Подобным образом мы можем выявлять атаки перехвата трафика даже в других подсетях. Ведь мы в состоянии засылать ping
на любой узел и мониторить, как изменяется его IP.ttl
.
Выявление атаки перехвата трафика в дальнем сетевом сегменте
А еще мы можем определить путь следования.
Выявление хакерского компьютера, вмешавшегося в сетевой трафик в другом сегменте
Источник: xakep.ru