
Эксплойт для кабельного модема Sagemcom F@ST 3890, реализующий уязвимость Cable Haunt для достижения удалённого выполнения кода через переполнение буфера на основе WebSocket и ROP-цепочку.
Этот эксплойт использует уязвимость Cable Haunt для получения шелла на кабельном модеме Sagemcom F@ST 3890 (50.10.19*) при доступе из локальной сети. Версия прошивки 50.10.21 или новее должна быть защищена от Cable Haunt. Эта proof-of-concept специально разработана для работы только локально, чтобы ограничить возможность злонамеренного использования. Другой PoC для Technicolor TC7230, создающий reverse shell для внешнего подключения, доступен здесь.
Список известных уязвимых модемов можно найти на https://cablehaunt.com/#faq-am-i-affected.
exploit.py обслуживает веб-сайт, который при посещении отправляет вредоносный WebSocket-запрос на кабельный модем.
Этот запрос переполняет обратный адрес и сопутствующие регистры в спектроанализаторе кабельного модема и использует ROP-цепочку для начала прослушивания TCP-соединения на порту 1337.
ROP-цепочка создана и закомментирована в static/exploitSagemcom.js.
Затем сервер exploit.py отправляет файл exploit.raw через это TCP-соединение, и модем исполняет его.
Файл exploit.raw — это reverseshell.c, скомпилированный под архитектуру MIPS (см. ниже, как это сделать).
reverseshell.c — это шелл, написанный специально для этого модема. Шелл прослушивает команды для выполнения в шелле eCos на кабельном модеме и перенаправляет STDOUT в TCP-соединение.
Видео с объяснением этого эксплойта можно найти здесь: https://www.youtube.com/watch?v=5FM9mS5ck3Y
Примечание: Windows 10 в настоящее время не поддерживается, вы должны использовать ОС на базе Linux
Установите pwntools и flask для python3 и запустите python exploit.py.
Затем перейдите в браузере на http://127.0.0.1:8080, чтобы эксплуатировать модем.
Firefox не будет работать, так как используемая версия WebSocket несовместима.
После этого в вашем терминале, где запущен python-скрипт, должен появиться интерактивный шелл. Если вы выйдете из шелла, модем нужно будет перезагрузить, чтобы запустить новый шелл.
Если вы хотите скомпилировать собственный payload, вы можете скачать тулчейн из aeolus и выполнить следующую команду:
/<toolchain Path>/gnutools/mipsisa32-elf/bin/mipsisa32-elf-gcc -O3 -c ./reverseshell.c -o ./reverseshell.o && /<toolchain Path>/toolchains/gnutools/mipsisa32-elf/bin/mipsisa32-elf-objcopy -O binary reverseshell.o exploit.raw
Вы можете создать и эксплуатировать любой модем, уязвимый к Cable Haunt, используя эту технику. Мы рекомендуем прочитать технический отчёт, прежде чем пытаться написать собственную ROP-цепочку. Перейдите на Cable Haunt для получения списка известных уязвимых кабельных модемов.
Сначала вам понадобится прошивка кабельного модема, который вы собираетесь эксплуатировать. Затем проведите реверс-инжиниринг прошивки, чтобы найти адреса соответствующих функций для построения эксплойта, таких как socket(), bind(), accept(), listen(), recv() и connect() для шелла. Затем Ropper можно использовать для поиска гаджетов с помощью следующей команды:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
Не все гаджеты доступны, поскольку гаджеты — это просто адреса, отправляемые в виде сырых байтов, и не все байты можно отправить в WebSocket-запросе с текстовыми фреймами.
Например, адрес 0x8080a864 нельзя напрямую вставить в текстовый фрейм WebSocket, так как это не допустимый символ UTF-8. Однако адрес 0xf28080a864 вставить можно, поскольку 0xf2 означает начало нового символа UTF-8 с 0x8080a864 в качестве завершающих байтов.
Следующие байты не могут присутствовать ни в одном используемом адресе из-за спецификации UTF-8: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c. Существуют и другие ограничения, которые вскоре будут подробнее объяснены в нашем отчёте.
А пока вы можете прочитать и использовать utf8TestScript.py, чтобы проверить, достижим ли адрес.
Вы можете использовать описанный выше процесс, чтобы скомпилировать собственный payload для нового кабельного модема, но помните: payload не должен возвращаться! Если он вернётся, процесс будет искать обратный адрес на повреждённом стеке и упадёт.
Для большинства модемов вам понадобится способ получить доступ к шеллу eCos для извлечения прошивки или извлечь её напрямую из чипа флеш-памяти. Эти прошивки обычно упакованы в формат под названием ProgramStore Если последовательная консоль не работает, попробуйте выполнить: (может работать только если коаксиальный кабель отключён или не активирован)
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 0
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
После этого шелл должен стать доступным, и bcm2-utils может упростить извлечение прошивки через этот шелл. При реверсе извлечённой прошивки адрес загрузки/базовый адрес (насколько мы видели) всегда равен 0x80004000.