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

Железные цепи победы

Николай "GorluM" Андреев

Хакер, номер #070, стр. 070-122-2


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

На этом шаге нам надо сообщить сокс-серверу, с кем ему соединяться и как. Для этого клиенту нужно послать пакет со следующим содержанием:

1 байт – опять номер версии;

1 байт – команда;

1 байт – еще не придумали, зачем;

1 байт – тип адреса, который будет идти следом;

N байт – адрес;

2 байта – порт;

Байт «команда» может принимать значения: 0x01 – если мы желаем просто соединиться, 0x02 – команда BIND, 0x03 – UDP ASSOCIATE (ведь 5 версия протокола умеет работать по UDP). Следующий байт резервирован до лучших времен и должен быть всегда равен нулю. Типом адреса мы должны будем сообщить соксу, в каком виде мы даем ему адрес пункта назначения, байт может принимать значения: 0x01 - ip v4 адрес, заданный четырьмя байтами; 0x03 – нерезолвленное имя хоста, т.е. просто строка (соксы не всегда умеют резолвить домены, учитывай это); 0x04 – ip v6 адрес, редкий случай.

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

Если же все прошло нормально и соединение успешно создано, то socks-прокси переходит в прозрачный режим и начинает передавать ВСЕ данные по адресу, указанному в запросе.

Данные по цепочке

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

Получив ответ сервера, что с проксей мы соединились успешно и что сервер начал передавать ВСЕ данные, мы посылаем очередное приветствие и проходим аутентификацию уже со следующим socks-сервером. Затем наступает пора послать адрес, и мы можем снова подсунуть адрес какого-нибудь сокса! И так пока не надоест или пока какой-нибудь сервер нас не пошлет. В конце цепочки мы укажем, куда все-таки должны идти наши данные, и закруглимся в плане составления цепи проксей.

Цепочка вживую

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

Назад на стр. 070-122-1  Содержание  Вперед на стр. 070-122-3