Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Новый метод атаки через reverse-ip (https://forum.antichat.xyz/showthread.php?t=72298)

Dr.Z3r0 01.06.2008 21:29

Новый метод атаки через reverse-ip
 
Новый метод атаки через reverse-ip


0. INTRO
Вобщем не буду делать большое вступление. Недавно имело место хекать сайт. Шел был успешно залит на соседний, но вот беда на сервере грамотно выставленны права. Пришлось включать голову и думать. И в результате этих дум у меня появился новый способ о чем я ниже и напишу.

Этот способ подходит для следующих ситуаций:
  • Грамотно выставленны права и порутать сервер не удалось
  • На сервере включенны open_basedir и safe_mode без возможности обхода оных
  • Не знание пути к целевому сайту
  • Какие то другие ситуации, я еще не придумал ^_^

Для реализации подобной атаки требуется:
  • На целевом сайте требуется хранение важной информации в сессиях
  • Само собой необходим шелл на соседнем сайте
  • Необходимы права на запись в папку где хранятся файлы сессий


1. ОПИСАНИЕ/ИСПОЛЬЗОВАНИЕ
Может быть вы уже догадались этот способ основан на созданиях файлов с сессиями где можно вписать произвольные данные. В данный момент не могу привести в пример цмсок/форумов с храненией инфы сессиях бо просто не помню, мб кто нить ниже отпишет ^_^.


Случай №1

Вот представим какую нить ебучую цмс. Эта цмс допустим располагается на хосте lamo.com, на этом же сервере есть другой сайт xack.com на который вы без труда смогли залить веб шелл. Но к сожалению вы не можете пролезть к lamo.com за отсутствием прав, либо еще чего то там. Но в той цмс что там стоит есть вот такой файл admin.php
Код:

<?php
if($_SESSION['admin']===true){
        //тут типа выполнение каких нить администраторских действий
        ...
}else die('Fuck off!');
?>

Теперь опишу как хранятся данные в файлах сессии:
Код:

[имя_переменной]|[тип_переменной]:[длина]:[значение_переменной];[имя_переменной2]|... и тд

где тип переменной задается так:
s- строковая переменная (string)
i- числовая переменная (integer)
b- булевая переменная (boolean)
a- массив переменных (array)

(!)Для строковой переменной [значение_переменной] задается в кавычках "".
Для булевых переменных значения хранятся следующим образом 1-true, 0-false
Для перменных типа булевых и числовых отсутствует параметр [длина] разумеется один разделитель ":" так же нужно будет убрать.

Описание хранение массива я тут приводить не буду, кому нужно будет - разберется. Что ж прояснив ситуацию со стандартом хранения сессий в файлах, начнем создавать файл сессии для описанного выше случая, он будет выглядеть так:
Код:

admin|b:1;
Как говорится все гениальное просто. Теперь сохраняем этот файл как sess_13cacf9c6032d82cf2f0a19bb479bd26 и загружаем его на сервер в папку где хранятся все файлы сессий (по дефолту /tmp но узнать точно можно сделав вывод phpinfo() и посмотрев параметр session.save_path).

Залил? Молодец! Обязательно поставь chmod 0777 на только что загруженный файл.

Теперь твоя задача создать в браузере куку с именем PHPSESSID (имя глядеть в phpinfo() параметр session.name, PHPSESSID - это по дефолту обычно никто не меняет) со значением 13cacf9c6032d82cf2f0a19bb479bd26 (надеюсь вы уловите взаимосвязь между именем файла сессии и значением куки). Открываем http://lamo.com/admin.php и нас пускают внутрь!


Случай №2

Опять же представим эту цмс, только файлик admin.php будет выглядеть вот так:
Код:

<?php
...
if(!empty($_SESSION['pass'])){
        $result=@mysql_query("SELECT * FROM admin WHERE pass='".$_SESSION['pass']."'");
        if(mysql_num_rows($result)!= 0){
                //тут типа выполнение каких нить администраторских действий
                ...
        }else die('Fuck off!');
}else die('Fuck off!');
?>

То есть в сессии содержится пароль администратора. Только не надо опять думать что это безвыходная ситуация. Создаем по аналогии с предыдщим пунктом файл сессии:
Код:

pass|s:11:"1' OR 1=1/*";
Для тех кто не понял, в большинстве случаев программисты доверяют данным из сессий и почти, да что почти, можно сказать никогда не ставят проверки на них, а в данном случае мы используем это для реализации sql inject, и благодаря чему становимся администратором.


Случай №3

А теперь такая ситуация на серве включены register_globals и magic_qoutes. А файлик admin.php выглядит так:
Код:

<?php
...
if(!empty($pass)){
        $result=@mysql_query("SELECT * FROM admin WHERE pass='".$pass."'");
        if(mysql_num_rows($result)!= 0){
                //тут типа выполнение каких нить администраторских действий
                ...
        }else die('Fuck off!');
}else die('Fuck off!');
?>

Вроде бы все равно хочешь не хочешь $pass будет слешироваться. Но это не так magic_qoutes слеширует только(!) GET, POST, COOKIE а SESSION остается таким как и был. А вот register_globals превратит все из SESSION в глобальные переменные. Для эксплуатации используем содержание файла сессий как и в предыдущем пункте.

Случай №4

Что делать если не прокатили предыдущие способы? Можно тупо почитать все сессии что хранятся в папке с файлами сессий, в поисках паролей/логинов к целевому сайту. Но к сожалению не всегда выставленные права дают прочитать эти файлы и все же...

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

Этот случай есть чисто теория, я не уверен что этот способ будет кто то применять, но думаю написать стоит.

2. OUTRO
Да я согласен это не очень часто встречаемый случай, но именно этот способ позволил мне получить веб шелл на целевом веб сайте, может быть и вам он поможет также.
Отдельный привет я хочу выразить тестерам halkfild и Grey.


(c) Dr.Z3r0
01.06.08

GreenBear 01.06.2008 21:51

защита: не делать критических переменных в виде булевых значений, а также инт 1, 0, которые могут узнать все, не хранить в сессиях пароли и другие важные данные. иногда можно читать и файлы сессий всем ... всякое бывает.
поставить проверку из 3 строк:
PHP код:

if(sizeof($_SESSION)){
            foreach(
$_SESSION as $key => $value){
                
$_SESSION[$key] = $this->secure->mres($this->secure->remove_html($value));
            }
        } 


DIAgen 01.06.2008 22:08

Цитата:

Сообщение от GreenBear
защита: поставить проверку из 3 строк:
PHP код:

if(sizeof($_SESSION)){
            foreach(
$_SESSION as $key => $value){
                
$_SESSION[$key] = $this->secure->mres($this->secure->remove_html($value));
            }
        } 


А зачем "remove_html" удалять то html код если он есть в куках :) иль у тебя там особая функция...

GreenBear 01.06.2008 22:13

ну иногда значение сессии на страницу выводится =)

Helios 02.06.2008 00:06

Либо я чего-то упустил, либо где тут reverce-ip? Он тут если и есть, то где-то в уголке тихо курит.

Способ не новый, его даже в видео в Хакере показывали, но за статью +

Talisman 02.06.2008 00:57

Цитата:

Сообщение от Helios
либо где тут reverce-ip?

найти более поддающиеся сайты на этом же сервере.

вывод напрашивается один: защищать сессии и не хранить в них ничего важного :)

Helios 02.06.2008 01:08

Цитата:

найти более поддающиеся сайты на этом же сервере.
Ну так тогда большую половину инклудов reverse-ip назвать можно.

Еще один метод защиты - использовать свои handler'ы для работы с сессиями - хранить в мускуле, кпримеру (благо есть таблицы типа Memory).

Xszz 02.06.2008 14:47

Метод не нов , но статья написана понятно . Думаю , у новичков вопросов не появится .
+

devton 02.06.2008 18:37

за статью не просто плюсик, а здоровенный крест во всю спину :)
все гениальное действительно просто

satana8920 02.06.2008 19:55

спасибо за статью
у тебя прямо шедевры получается писать


Время: 16:26