Гостевая статья Seagate Central Storage RCE 0day

В этой статье я расскажу о нескольких критических уязвимостях продукта Seagate Central Storage NAS.

Общая информация
Возможность удаленного использования: да
Требуется аутентификация: НЕТ
URL поставщика: Дата обнаружения: 19 декабря 2019 г.

Технические детали
После получения последней версии прошивки устройства со я начал анализировать ZIP-файл прошивки. Внутри ZIP-файла был еще один сжатый двоичный файл с именем Seagate-HS-update-201509160008F.img, просто изменив расширение файла на «tar.gz» я смог извлечь файловую систему которая содержала исходный код приложения управления, сценарии запуска и двоичные файлы busy-box для устройства NAS на базе ARM.
screenshot_5.png

Содержимое обновления прошивки ZIP файл
С помощью sudo unsquashfs -f -d /media/seagate /tmp/file.squashfs команды я смонтировал файловую систему и начал анализировать содержимое. После краткой разведки я нашел исходный код PHP для интерфейса управления устройством и сразу же приступил к этапу анализа исходного кода. Во время анализа я заметил, что приложение было разработано с использованием платформы CodeIgniter. Учитывая размер управляющего приложения, я сразу начал отслеживать наиболее уязвимые функции PHP. Я использовал find . -name "*.php" | xargs grep "<function-name>" команду для последующего списка функций и получил несколько интересных входных векторов.
  • exec
  • shell_exec
  • system
  • passthru
  • pcntl_exec
  • popen
  • proc_open
  • eval
  • preg_replace (with /e modifier)
  • create_function
  • file_get_contents
  • file_put_contents
  • readfile
  • include
  • require
  • require_once
  • include_once
Один из результатов grep для «proc_open» показал вызов с несколькими динамическими переменными, используемыми в качестве параметра внутри ./cirrus/application/helpers/mv_backend_helper.php файла.

screenshot.png

Функция субъекта вызывается внутри функции mv_backend_launch, которая также находится внутри ./cirrus/application/helpers/mv_backend_helper.php файла.
Код:
function mv_backend_launch($cmd, $noLog = false)
{
    $desc = array(
            0 => array("pipe","r"),
            1 => array("pipe","w"),
            2 => array("pipe","w")
            );
    $cwd = './';
    $process = proc_open($cmd,$desc,$pipes,$cwd);
    if(is_resource($process))
    {
        fclose($pipes[0]);
        $data =stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        $errors=stream_get_contents($pipes[2]);
        if(strlen(trim($errors))>0)
            mv_log_errors($cmd,$errors);
        fclose($pipes[2]);
        proc_close($process);
        
        if ( ! $noLog ) {
            syslog(LOG_INFO, "CMD: '$cmd', RESPONSE: '$data'");
        }
        return $data;
    }
}
После отслеживания ссылок на функции я смог обнаружить функцию check_device_name, которая передавала необработанный пользовательский ввод в функцию mv_backend_launch с $name параметром.
Код:
    public function check_device_name()
    {
        $info = $this->get_start_info();
        $isStart = $info && array_key_exists('state', $info) && $info['state'] == 'start';
        
        if ( ! $isStart ) {
            mv_is_admin();
        }
        
        $name = $this->input->post("name");       
        $result = mv_backend_launch("check_netbios_name.sh $name");
        
        echo header('Content-type: text/xml');
        echo $result;
    }
В данном случае мы имеем функцию с уязвимостью удаленного выполнения кода. Но проблема заключалась в том, что эта функция работает только в том случае, если для состояния устройства установлено значение “start” или требуется доступ админа к приложению на уровне администратора. Поэтому нам нужно либо найти способ изменить состояние устройства без аутентификации, либо обойти аутентификацию и повысить привилегии. Из-за этой проблемы я вернулся к анализу исходного кода и нашел еще лучший вектор атаки. Анализируя механику состояния устройства, я заметил, что когда устройство находится в состоянии «пуск», оно позволяет регистрировать новых пользователей, чтобы выполнить первоначальную настройку устройства. Наблюдая, как выполняется операция изменения состояния, я нашел set_start_info функцию внутри application/core/MV_BaseController.php файл. Эта функция устанавливает состояние устройства с помощью пост-запроса JSON и угадайте, что? нет никакого контроля 🙂
Код:
    public function reset_start_info()
    {
        self::save_object_to_file(null, self::START_FILE);
        $uri = $_SERVER['REQUEST_URI'];
        $idx = strpos($uri, 'index.php');
        if ( $idx !== false ) {
            $uri = substr($uri, 0, $idx);
        }
        $uri .= 'index.php/SCSS';
        header('Content-type: text/plain');
        header("Location: ".$uri, TRUE, 302);
        exit();
Таким образом, просто изменив состояние устройства на “start” , мы можем добавить нового пользователя-администратора на устройство. Пользователи внутри устройства создаются как системные пользователи Linux, поэтому все они имеют SSH-доступ к устройству.

Модуль Metasploit

До этого момента мы определили несколько уязвимостей. Для кода эксплойта я предпочитаю использовать второй способ, добавив нового администратора для установки SSH-соединения. Потому, что запуск подключений оболочки «reverse/bind» с помощью двоичных файлов busybox является сложным с точки зрения совместимости полезной нагрузки Metasploit. Также по умолчанию порты устройств закрыты, за исключением общих служб, таких как HTTP, HTTPS, SSH, FTP… Поскольку SSH включен по умолчанию и его невозможно отключить с помощью интерфейса администратора, написание эксплойта вторым способом является очевидным выбором.

screenshot_1.png

После сообщения об этой уязвимости в Seagate мы были очень разочарованы ответом. Сначала они утверждали, что «этот продукт был разработан и предназначен для личного домашнего использования в личной сети», таким образом, не имеет реальной поверхности атаки. Но затем мы доказали иное, предоставив число эксплуатируемых устройств, открытых для Интернета, с использованием таких служб, как и . Но, похоже, им просто все равно ¯ \ _ (ツ) _ / ¯

Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!