-Видео

Гоним
Смотрели: 39 (0)

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в _Hacking_

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 11.05.2006
Записей:
Комментариев:
Написано: 4992


Используем служебный интернет по максимуму

+ в цитатник

Cообщение скрыто для удобства комментирования.
Прочитать сообщение


_Hacking_   обратиться по имени Пятница, 12 Мая 2006 г. 01:56 (ссылка)
В любимом институте (в школе, на работе, в больничной палате) наконец наладили iNet. Появился полноценный и широкий канал. Казалось бы, вот он, рулез! Юзай и наслаждайся! Но не тут-то было: оказывается, что все попытки доступа к mp3, avi и mpg злостным образом пресекаются и логируются. Оно и понятно: большие суровые дяди (а также не менее большие и суровые тети), вложившие свои деньги в столь желанный канал, совсем не хотят, чтобы он был использован для скачивания гигов музона и фильмов. Поэтому и получается, что хоть этот Инет широк и халявен, а использовать его в свое удовольствие никак нельзя.

Знакомая ситуация, да?

Давай думать: если не получается скачать mp3-шку, значит в какой-то момент фильтрующая система приходит к выводу, что это именно mp3, а не html или, скажем, jpg. Обрати внимание: мне не интересно, как именно это происходит. Может быть анализируется только расширение файла (чаще всего) или наличествует попытка опознать его тип по заголовку, а может быть имя сервака, на котором лежит желанный музон, попало в черный список. Изощренность и количество подобных проверок определяются лишь квалификацией админа и его нелюбовью к своим подопечным. Важно знать лишь то, что, изменив расширение файла и хорошенько переворошив его внутренности, можно успешно преодолеть все эти фильтры и даже пройти самую злую и строгую проверку - проверку непосредственно админом (хотя подобную честь надо еще заслужить). Но я начну с самого простого способа.

FTP => FTP

Как я уже сказал, это - самый простой метод решения насущной проблемы (в том плане, что не нужно писать никаких скриптов), но, к сожалению, его применимость сильно ограничена. Он состоит в следующем. Очень часто всем пользователям (в школе, институте, в общем, в рассматриваемой организации) предоставляют ftp-доступ извне, чтобы они могли работать со своим файлами, например, из дома. Если это так и, кроме того, если нужный файл (желанный музон или видео) лежит на каком-либо ftp-сервере, то можно попробовать передать файл от исходного ftp-сервера своему. Если получится - проблема будет решена, т.к. фильтры, упоминавшиеся выше, как правило, анализируют только HTTP-траффик. Однако, чтобы осуществить такой трансферт, необходимо разобраться с протоколом FTP (постарайся вникнуть - это понадобится в дальнейшем). Итак, FTP. Этот протокол предназначен для передачи файлов (что, в общем, неудивительно, т.к. FTP - File Transfer Protocol) и является протоколом прикладного уровня. Разумеется, первое, что нужно сделать, - это приконнектиться на 21 порт (порт ftp по умолчанию) соответствующего сервера. Установленное при этом соединение предназначено для передачи команд на сервер и принятия отклика на них. Чтобы передать данные, следует открыть еще одно соединение. Тут возникает вопрос: кто к кому будет коннектиться? Как ни странно, возможны только два варианта: либо клиент к серверу (пассивный режим сервера), либо наоборот (активный режим). В первом случае, после того как клиент сообщит серверу о своем желании открыть соединение данных, сервер указывает клиенту адрес и порт, куда клиенту следует коннектиться (очень часто указываемый адрес является адресом сервера). Во втором случае клиент указывает серверу адрес и порт, куда тот должен коннектиться. После этого устанавливается соединение данных и можно отдавать серверу команды работы с файлами. Обрати внимание: способ установки соединения данных (кто к кому коннектится) и направление передачи файла через него (т.е. от сервера или наоборот) никак не связаны. Соединение данных может устанавливаться и разрываться несколько раз за одну сессию; например, когда ты юзаешь CuteFTP, FAR или другую программу-клиент, то каждый раз при переходе из одного каталога в другой они запрашивают список файлов в текущей директории, при этом устанавливается соединение данных, отправляется на сервер соответствующая команда, ее результат (список файлов) принимается через соединение данных и затем оно разрывается. Вернемся теперь к двум ftp-серверам, между которыми нужно передать файл. Если один из них перевести в пассивный режим (он сообщит адрес и порт), а другой - в активный (указав только что полученные от первого сервера адрес и порт), то между ними установится соединение и можно будет передать файл. Ничего не понял? ОК, поехали подробно. Прежде всего следует приконнектиться к обоим серверам (используя любой telnet) и залогиниться, используя команды USER и PASS, например:
USER ivanov
PASS qwerty
Скорее всего, на сервер, содержащий нужный файл, тебе придется коннектиться анонимно, т.е. используя в качестве имени пользователя "anonymous", а в качестве пароля - любое мыло. Затем следует командой "TYPE I" указать, что ты собираешься передавать файл как бинарные данные. Далее надо ввести команды PASV или PORT, которые переведут сервер в пассивный или активный режим соответственно. Переведем один из серверов в пассивный режим:
PASV
227 Entering passive mode (213,180,190,56,222,116)
(Первая строка - это введенная команда, вторая - ответ сервера.)
А другой - в активный, используя полученные только что адрес и порт (213.180.190.56:56948, где номер порта есть 222 * 256 + 116):
PORT 213,180,190,56,222,116
200 PORT command OK
Режим, адрес и порт, устанавливаемые этими командами, не меняются до тех пор, пока одна из них не будет вызвана снова. Далее, команда "CWD <путь к файлу>" изменит текущую директорию (при этом, чтобы не заблудится, можно использовать команду PWD, которая возвращает текущий каталог). Однако дело осложняется тем, что команда, возвращающая список файлов в текущей директории (команда "LIST") передает результат в соединение данных, и увидеть его не так просто. Поэтому надо сначала каким-либо способом выяснить точный путь к файлу, который нужно скачать, например, "/pub/R/Robert_Miles/mp3/fable.mp3", и тогда останется выполнить на сервере только одну команду: "CWD /pub/R/Robert_Miles/mp3". Наконец команды отправки и приема файла: "RETR <имя файла>" и "STOR <имя файла>". И корректный выход: "QUIT". Как я уже говорил, этот способ является самым простым, но имеет существенные недостатки. Так, во-первых, в рассматриваемой организации ftp-доступа извне может не быть вообще. Во-вторых, нужный файл может не лежать ни на одном ftp-сервере, и в третьих, многие ftp-сервера могут работать только в пассивном режиме (либо могут не позволить перевести себя в активный режим с адресом, отличным от адреса клиента).

Есть способ лучше

В самом начале статьи я говорил о том, что, изменив имя, расширение и содержимое файла, его можно выдать за другой файл и пройти все фильтры. Это означает, что где-нибудь в Инете на каком-нибудь серваке нужно получить определенным образом измененную копию файла, причем такую, которая не вызовет подозрения у фильтрующей системы, когда ты будешь ее качать. Предлагаю делать это так: купить 2-3 метра у хостинг-провайдера (единственное требование: perl + исходящие сокеты), зарегистрировать любое доменное имя (его тоже нужно выбирать с умом) и разместить там скрипт, который скачает нужный файл и сохранит в измененном виде. Далее будет скачиваться этот файл, что и решит проблему. Разумеется, покупать место вовсе необязательно, достаточно чтобы были удовлетворены эти условия. Так что если решишь использовать какой-либо халявный хостинг, уточни возможность размещения собственных pelr-скриптов, создающих исходящие сокеты. Однако в крайнем случае все это можно и купить (насколько мне известно, сейчас можно за 3$ в месяц купить 2 метра, к которым будет прилагаться бесплатное доменное имя в зоне spb.ru или msk.ru + perl + сокеты). Имя хоста, как я уже говорил, надо выбирать с умом. Никакие "31337.spb.ru" или "www.admin_pridurok.narod.ru" не годятся, ибо будут вызывать подозрение, а значит велика вероятность того, что в один прекрасный момент это имя будет внесено в черный список и большая часть трудов пойдет коту под хвост. Самый лучший вариант - это выдавать скачиваемый файл за что-либо, относящееся к учебе/работе, поэтому имя сервака тоже должно иметь к этому какое-либо отношение. Здесь, надеюсь, проблем возникнуть не должно, так что перейдем к самому ответственному - написанию скрипта, который скачает нужный файл, переворошит его содержимое и сохранит под другим именем.
HTTP => http
Итак, самое важное - perl-скрипт. Чтобы понять написанное ниже, тебе потребуется как минимум знать основы Perl. Этот язык довольно распространен, поэтому найти соответствующую информацию труда не составит. Однако ближе к телу. Все скрипты, использующие сокеты, должны содержать в начале следующую строку:
use Socket;
которая указывает на то, что для работы скрипта необходимо подключение соответствующего модуля. Кроме этой команды, никаких других специальных директив для работы не потребуется.
Первое, что нужно научится делать, - это коннектиться к произвольному серваку на произвольный порт. Делается это таким образом:
$sin=sockaddr_in($xport, inet_aton($xhost));
socket(HTTPCMD, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
if (!connect(HTTPCMD, $sin)) {<сообщаем, что коннект не удался>exit;}
В переменных $xport и $xhost должны находиться номер порта и имя хоста или его ip-адрес. Функция connect пытается сделать нечто соответствующее ее названию, и если это не удается, она возвращает 0. Если же все хорошо, то HTTPCMD будет дескриптором созданного соединения. Разрыв соединения будет выглядеть подобно закрытию файла: close(HTTPCMD); Посылать данные по установленному соединению будем так:
send HTTPCMD, "$mydata", 0;
А принимать данные будем, читая из соединения как из файла:
$newline = ;
Теперь попробуй самостоятельно написать скрипт, который коннектится на какой-нибудь сервер, читает/пишет оттуда/туда что-нибудь, а затем закрывает соединение, чтобы этот процесс стал для тебя совсем прозрачным. Если ты попробовал это сделать, то, вероятно, уже успел ощутить всю мощь, которую предоставляют скрипты, создающие соединения. Кайф заключается в том, что все эти соединения осуществляются от имени сервака хостинг-прова, на котором они запускаются, а этот сервак, в отличие от домашнего компа, имеет совершенно немереный канал, не говоря уже про то, что работает постоянно. Поэтому все проги, требующие большой канал или много on-line времени (например, брутфорсеры), во многих случаях выгоднее создавать на перле с сокетами. Однако поспешу тебя предупредить: злоупотребляя использованием исходящих сокетов, ты рискуешь навлечь на себя праведный гнев прова. Вернемся к нашей проблеме. План действия таков: коннектимся на нужный http-сервер, закачиваем оттуда файл, сохраняем его под другим именем (тему маскировки и шифровки содержимого файла рассмотрим позже) и радуемся жизни. Написать кусок кода, который осуществит установку коннекта, я думаю, ты уже сможешь (если нет - вернись на два абзаца назад). Далее нужно немного пообщаться с веб-сервером, поэтому замолвлю пару слов о HTTP (Hypertext Transfer Protocol). Посмотри как выглядит стандартный запрос клиента веб-серверу:

GET /xxx.jpg HTTP/1.0
User-Agent: Mozilla
Accept: */*
Host: www.super-site.bjg.sg.jtr.ck
Range: bytes=110-3548790

В рассматриваемом случае особую важность имеют первая и последняя строки, потому что именно они определяют то, что будет возвращено сервером. Назначение первой строки в запросе, надеюсь, очевидно. Последняя строка определяет, какой именно кусок файла нужен. Если требуется закачать весь файл целиком, то ее указывать не надо. В приведенном примере клиент просит сервер вернуть ему кусок файла xxx.jpg со 110-го по 3548790-й байты включительно. Кстати говоря, далеко не все сервера поддерживают частичную закачку файла. Тебе приходилось сталкиваться с серваками, не поддерживающими т.н. "докачку"? Так вот, это они и есть. Чтобы не осложнять ситуацию, я буду рассматривать только хорошие сервера, которые ее поддерживают (благо в сети их большинство). В нашем случае частичная закачка файла может быть использована, если требуется скачать файл, превышающий купленное (взятое напрокат) место у хостинг-прова. Кроме того, она может оказаться полезной в том случае, если ты собираешься нести скачанный файл домой на дискетах. Если вдруг одна из пятидесяти дискет дома не прочитается, то можно будет тут же из дома скачать недостающие полтора метра. Если же есть возможность нарезать болванку на месте, то подобного геморроя удастся избежать, хотя мне, признаюсь, в свое время пришлось им изрядно пострадать (я имею в виду возню с дискетами). Таким образом, скрипт должен сформировать и отправить на сервер запрос, подобный тому, что я привел в качестве примера. Обращаю твое внимание на то, что в данном случае символом перевода строки служит комбинация "\r\n", а не стандартный юниховский "\n". Запрос обязательно должен заканчиваться пустой строкой (т.е. в конце последней строки будет идти "\r\n\r\n"). Если этого не сделать, сервер не поймет, что запрос закончен, и будет ждать столько, сколько позволяет таймаут. После отправки запроса следует начать принимать данные, для передачи которых, в отличие от ftp, не требуется создание нового соединения (т.е. передача будет происходить в уже установленном соединении). Данные будут состоять из заголовка, представляющего собой несколько строк, разделенных "\r\n", после которого будет идти пустая строка и затем - требуемые данные. В заголовке указывается размер передаваемых данных, код ответа сервера и еще много дополнительной информации. Все это примерно в таком духе:
HTTP/1.1 200 OK
Date: Tue, 29 Jan 2002 16:10:59 GMT
Server: Apache/1.3.6 (Win32)
Last-Modified: Sun, 07 Oct 2001 00:23:46 GMT
ETag: "0-8e7b0c-3bbda092"
Accept-Ranges: bytes
Content-Length: 9358092
Connection: close
Content-Type: audio/mpeg
<Сами данные>

Первая строка содержит краткий ответ сервера на команду, поэтому полезно его анализировать. Например, если будет не "200 OK", а "404 Not Found", то, видимо, данные будут не очень содержательны.
Perl-код, опускающий заголовок и сохраняющий данные в файл, выглядит так:

while ( ) {
if ($_ eq "\r\n") {last;}
}
while ( ) {
print NF;
}

Где HTTPCMD - дескриптор текущего соединения, а NF - дескриптор файла, в который будут сохранены данные. Таким образом, файл получен и сохранен на используемом сервере под любым удобным именем, т.е. можно качать, бить в тамтамы и кричать "Ура!". Теперь пара слов о том, как использовать этот метод в свое удовольствие и при этом не навлечь на себя гнев админа. Хорошо зарекомендовала себя следующая схема работы: выбирается размер скачиваемого куска, лежащий в разумных пределах. Если предполагается использовать упомянутую выше схему возни с дискетами под названием "геморрой", то это значение будет равно 1400000 (чуть меньше размера дискеты, т.к. последняя может быть слегка битой). Если схема "геморрой" использоваться не будет, то размер куска следует выбрать чуть больше, однако указанное значение (1400000) на практике зарекомендовало себя неплохо. Далее, скрипту через URL передается номер куска, который требуется скачать, он, путем нехитрых математических операций, получает диапазон требующихся байт, создает и отправляет соответствующий запрос серверу, сохраняет переданные им данные (желательно не в cgi-bin, а туда, где лежат html-ки), затем вот таким кодом:

print "Content-type: */*\r\n";
print "Location: $newfilelocation\r\n";
print "\r\n";

перенаправляет запрос на только что скачанный файл. Т.е. тебе нужно будет ввести в адресной строке осла или оперы что-то вроде:
http://www.mycoolsite.ru/cgi-bin/script.cgi?n=4. Этот скрипт скачает 4-й кусок и сохранит его, например, в "/tmp/xe-xe-xe.004", а затем перенаправит браузер на скачанный файл, т.е. на htpp://www.mycoolsite.ru/tmp/xe-xe-xe.004. Бродилка кинется его качать, и в итоге ты получишь то, что требовалось. "Зачем же такой гемор с кусками. Может быть стоит залить файло целиком?" - спросишь ты. "Не стоит" - отвечу я. Потому что если файл большой (> 3-5 mb), то вероятность того, что админ обнаружит и заинтересуется его содержимым, велика и возрастает с ростом его размера. Если же файл будет разбит на небольшие куски, то он не будет сильно выделяться в админских логах. Поэтому его и следует качать по кускам. Рассмотренный только что способ относился к случаю, когда исходный файл лежал на каком-либо http-сервере. Если файл лежит на ftp-сервере, то, немного переделав скрипт, можно решить и эту проблему.
FTP => http
Идея остается той же, нужно лишь переписать куски кода, отвечающие за работу с сервером. Действуем так: вначале коннектимся к нужному серваку, затем отправляем ему следующие команды:

USER anonymous
PASS my@e-mail.address.ru
TYPE I
CWD /pub/mp3/Robert_Miles
REST 1400001
PASV RETR fable.mp3

Команда REST указывает: с какого байта (здесь правильнее говорить - "октета" = 8 бит) следует передавать файло. Обращаю твое внимание на то, что, в отличие от http, верхнюю границу требуемого куска нигде указать нельзя, поэтому придется самостоятельно контролировать скачанный объем и в нужный момент разрывать соединение. Работа остальных команд уже была рассмотрена выше. Как и в http, здесь символом перевода строки служит последовательность "\r\n", однако пустую строку в конце запроса передавать не надо (в http формировался запрос, завершающийся пустой строкой, а в ftp запросов нет как таковых, на каждую команду сервер отвечает сразу). Чтобы не усложнять и без того непростой скрипт, я здесь не предусматриваю проверку ответа сервера на каждую команду, хотя это, вообще говоря, делать следует, т.к. практически на каждую из них сервер может ответить отрицательно, и тогда дальнейшие действия становятся бессмысленными. В большинстве случаев все должно работать, но, перед тем как запускать скрипт, я рекомендую вручную (т.е. юзая telnet) попробовать приконнектиться к серверу и ввести эти команды. Либо сделай так, чтобы скрипт логировал все команды и ответы на них. После отправки указанных выше команд нужно из всех ответов сервера на них вычленить ответ на команду PASV, т.к. она переводит сервер в пассивный режим, и в ответе на нее сервер указывает адрес и порт, куда нужно будет коннектиться для установки соединения данных. Это труда не составит, если знать, что ответ сервера на PASV в случае успеха начинается с числа 227:

227 Entering passive mode (213,180,190,56,222,116)
Из этой строки легко извлекаются IP-адресс и порт:
$ans=~/(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/;
$dhost="$1.$2.$3.$4";
$dport=$5*256+$6;

Т.е. в данном случае будет 213.180.190.56:56948. Коннектимся туда и сразу начинаем читать из сокета данные, не забывая сохранять их в файл. Тут, как я уже говорил, придется следить за тем, сколько инфы уже принято, чтобы вовремя разорвать соединение данных. (Хинт: функция sysread(FTPDATA, $buf, $n) пытается переместить в буфер $buf из сокета FTPDATA $n байтов и возвращает количество реально записанных байтов.)
Маскировка и шифровка данных
Для отвода глаз называй все файлы с умом. Например, если в данный момент изучается WinAPI, то файл, на который скрипт перенаправит бродилку, можно назвать, например, winapihelp.001. Также полезно добавлять в урлу вызываемого скрипта параметры, которые в самом скрипте использоваться не будут, но урл украсят, т.е. что-то вроде:
http://www.allforstudents.box.sk/cgi-bin/getfile.cgi?
n=4&fname=winapihelp&vers=last&user=&requeststring=win+api&a=0
(имеет смысл только "n=4", все остальное - флуд) и
http://www.allforstudents.box.sk/files/win/help/splited/winapihelp.001

Естественно выглядит, да?


Я лично на месте админа поленился бы проверять подобные урлы. Раздумывая над проблемой маскировки данных, я придумал как можно выдавать любые скачиваемые данные за архив: с помощью любого архиватора создаешь самораспаковывающийся архив, в который помещаешь небольшой файл (< 1kb) с кратким описание того, за что ты собираешься выдавать скачанные файлы, или с чем-нибудь еще. Он будет весить где-то 50кб. Далее, его следует залить на сервер, где лежит скрипт, а сам скрипт переделать так, чтобы он в начало каждого передаваемого куска ставил этот архив (расширение надо оставить exe). Тогда даже если кто-нибудь очень любопытный запустит такой файлик, он найдет только то, что ты запаковал, а тебе, зная точный размер экзешной добавки, не составит труда отделить нужные данные. Если же тебя припрут к стенке и спросят: что это такое, то стоит ответить, что, мол, качал архив, а он оказался битым. Кстати говоря, в качестве этого exe-шника не обязательно использовать self-ex архив, можно самостоятельно накодить что-нибудь подходящее. Теперь, как и обещал, несколько слов о том, как изменять содержимое файла. Делать это, вообще говоря, не обязательно, но желательно, т.к. маскировка, описанная выше, просто делает файл незаметным (для админа) в общем потоке, и если она не сработает и то, что ты качаешь, начнут изучать, то шифровка передаваемых данных скорее всего спасет любимую мозоль от скорой админской расправы. Первое и самое элементарное - это просто проксорить весь файл одним числом (т.е. произвести операцию xor над каждым элементом). Как известно, если этот алгоритм применить повторно к уже обработанным данным, то на выходе получим исходные. Кстати говоря, на перле это осуществить не так просто из-за того, что в нем нет типов и прочитанный байт интерпретируется как символ, а не как число. Но не мне учить тебя Perl-у, поэтому просто привожу код, который файл 1.dat ксорит числом 5 и результат сохраняет в 2.dat:
open(F1, "1.dat");
open(F2, ">2.dat");
binmode F1;
binmode F2;
$t = 0;
$nofp = sysread(F1, $t, 1);
while ($nofp) {
print F2 chr(ord($t) ^ 5);
$nofp = sysread(F1, $t, 1);
}
close(F1);
close(F2);
Хотя лучше ксорить не одним числом, а последовательностью из нескольких чисел. Отмечу, что в рассматриваемом контексте эти операции следует производить "на лету" безо всяких промежуточных сохранений (экономя место и время). Т.е. получил n байт из соединения, проксорил их и записал в файл. Для самых экстремальных товарищей предлагаю следующий перченый способ: ксорить нетривиальной последовательностью, размер которой равен размеру файла. Поскольку последовательность такого размера хранить нереально (а требуется она в двух местах: на твоем сервере для шифровки и дома - для расшифровки), ее предстоит сгенерить, взяв в качестве производящей функции, например, синус (эта функция от последовательности целых чисел дает последовательность неповторяющихся чисел). Т.е. надо всего лишь взять синус от номера текущего байта в файле, вытянуть из этого вещественного числа, допустим, 2-ю цифру после запятой и проксорить текущий байт с ней. Расшифровка будет происходит точно так же. Хоть этот метод и кажется очень мудреным, он тем не менее обладает очень высокой криптостойкостью.

Финал

Описанные выше способы обхода были проверены на практике, поэтому, если, конечно, не делать глупостей, их можно использовать безопасным для себя образом. Но помни: всегда и во всем нужно знать меру. Если пользование такими вещами станет для тебя правилом, а не исключением, то рано или поздно тебя все равно засекут, улыбнутся и скажут "Нагибайся!". Удачи тебе!

ВНИМАНИЕ: Автор статьи не несет никакой ответственности за последствия, которые могут возникнуть у тебя в результате использования изложенного материала!
Ответить С цитатой В цитатник
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку