Обходим глюки Microsoft FTP Service

Изменено: . Разместил: FadeDemon | Меню
Количество просмотров2`616 / FD1727-6-0

Бывает и такое. Вот приспичило мне зайти на FTP нашего института, понимаете-ли, и всего-лишь навсего скачать задание для лабораторной. Зайти — зашел. Даже папку с заданиями нашел. А зайти в неё — не могу. Ну не пускает эта скотина меня, пишет 550-ю ошибку, да ещё и матом в непонятной кодировке ругается. А в папочку рядом нормально заходиться, без проблем. Думал, дело в моей опере. Когда FileZilla показала до иероглифа то-же самое, так думать перестал. Но задания по лабам были очень, очень нужны. И решил я, подумав немного, вспомнить былые времена…


FTP не пускает
Рис. №879. Вот как это выглядело

Надо сказать что специалистом по укрощению FTP серверов назвать я себя не могу, но попытаться всё-же стоило. Ошибка 550, судя, по крайней мере по Википедии, должна была означать, что файла (вернее в нашем случае директории) не существует. Но как его может не быть, когда он есть? Странно однако… Я не видел другого выхода, кроме как вспоминать основы FTP протокола. Благо в моей системе завалялась православная утилиточка NetCat, до которой всё-таки не добрался ни один злюка-антивирус.


Вспоминаем FTP протокол
Рис. №880. Вспоминаем FTP протокол

Все мы помним, что FTP естественным образом поддерживает анонимный логин, для чего в качестве юзернейма надо отправить anonymous, а в качестве пароля — своё мыло какую-нибудь@белиберду.ком, после чего мы собственно получим анонимный доступ. Зайти куда надо с помощью команды CWD проблем тоже не вызывает. А как посмотреть содержимое текущей директории? А вот тут, как оказывается, уже надо слегка напрягать мозги…


FTP же у нас такой сложный протокол, что использует целых два TCP соединения, одно, которое можно видеть выше, предназначено для управления, а второе появляется когда нам надо что-то отправить/передать, например файл, или содержимое текущей директории в нашем случае. И по хорошему, надо на своём компе иметь открытый порт, на который сервер будет при установке этого соединения цепляться. Не слишком-ли нагло, а? Впрочем у FTP есть ещё пассивный режим. Когда не сервер коннектится к нам, а мы коннектимся к серверу. И именно его мы и попытаемся использовать.


Берём мы в общем, и без лишних рассуждений пишем в терминал команду PASV. И без лишних задержек получаем на неё ответ:


Код: DOS
227 Entering Passive Mode (195,149,206,243,150,202)

Чтобы расшифровать эту белиберду, придётся вспоминать спецификацию, меня память не подвела. Первые 4 числа быстро обретают свой смысл, когда мы видим, что IP-адрес препарируемого сервера ВНЕЗАПНО 195.149.206.243. Дальше-сложнее. Сразу скажу, что они обозначают номер порта, на котором сервер ждёт второе соединение, но значение это слегка не очевидное. Эти 2 числа можно представить как значения двух байт одного числа типа word, и поэтому, чтобы получить из них собственно номер порта, первое число надо умножить на 256 (или подвинуть в нём все биты на 8 влево), и прибавить к нему второе. Калькулятор мне сказал, что получиться 38602. Ну, я ему поверил. И, кстати, не зря:


Передаём данные через FTP ручками
Рис. №881. Передаём данные через FTP ручками

Каким-бы мудрёным протокол FTP не был, мы его кажется укротили. Нужно было только после установки соединения во второй консоли, отправить в главную консоль команду MLSD LIST -a, как собственно делает FileZilla, на православную команду MLSD наш серверочек брезгливо ответил:


Код: DOS
500 'MLSD': command not understood

Кстати как можно было заметить, что такое UTF-8, нашему серверу тоже не было известно. Как-же однако всё запущено… Ну да не важно. Зашли мы значит в нужную папку, и даже ухитрились посмотреть содержимое директории. Что же мы получили? В целом, даже после того как кодировку консоли CP866 с помощью Notepad++ переделали в более понятную CP1251, ничего нового:


Код: DOS
02-09-00  09:40AM                 1498 CSORT.CPP
02-09-00  08:59AM                 1941 CSORT.PAS
04-20-12  08:30AM       <DIR>          CURS_WORK
01-28-07  09:34PM                 1659 VOPROS_EKZ.TXT
04-06-06  10:09PM                 1509 VOPROS_ZACH.doc
04-06-06  10:10PM                 1507 VOPROS_ZACH.TXT
04-07-10  11:55AM       <DIR>          Задания на лабы СиАОД
02-03-06  12:33PM               963584 Методичка_кодирование.doc
04-07-10  11:55AM       <DIR>          Образцы отчетов по курсовой СиАОД
06-30-06  10:51AM              2054144 Пособие_СиАОД.doc
03-26-06  09:51PM               328489 СиАОД-book.rar

Думаем дальше. На этом месте FileZilla и опера делали CWD Задания на лабы СиАОД, и получали фигу с маслом. Попробуем это проделать и мы, для этого просто возьмём и скопируем название папки в кракозябрах из консоли без изменения, допишем перед ним CWD, и в таком неприглядном виде отправим. Этого, наверное, уже следовало ожидать, но получили мы всё ту-же 550-ю ошибку, в таком-же неприглядном виде. Вот только на этот раз в конкретной кодировке CP866, которая тут же была преобразована в человеко-читаемую, и…


Код: DOS
550 Задани на лабы СиАОД: Не удаетсяя найти указанный файл.

Ну просто Капитан Очевидность, мать твою! На этом месте я слегка залип. Мысли мои дальнейшие были вялы и унылы, совсем небыло идей что можно сделать ещё. Хотя парочка ещё оставалась: я вспомнил про короткие записи путей в Windows. Да, это те самые пути вида DOCUME~1 вместо полного Documents and Settiongs. Правда ничего это не дало нам, как я с предполагаемым коротким именем не эксперементировал, всё также получал 550. Причём, не только с этой папкой. Идею пришлось отбросить…


Microsoft такой Microsoft
Рис. №882. Another way

После того, как я проделал все пляски с бубном в консоли только ради получения нормального, девственного текста ошибки, увидеть то-же самое на блюдечке с голубой каёмочкой в проводнике было, мягко говоря, обидно. Идей уже совсем небыло… Так, постойте, какого лешего в обоих текстах ошибок у нас делает слово “Задани”? Папка ведь начинается со слова Задания, какая сука жрёт букву «я»?!


Так, соберём мысли в кучу. В консоли мы название папки отправляем напрямую. Проводник отправляет название тоже напрямую, ну, скорее всего. Опера и ФайлЗилла вроде тоже за поеданием буквы «я» замечены небыли. Значит её жрет ихний сервер, верно? По крайней мере у меня других предположений небыло. Можно допустить, например, что сокет у сервера открывается в текстовом режиме, и при попытке вычитать оттуда букву «я», которая в CP1251 по совместительству является символом с кодом 0xFF  (который по совместительству ВНЕЗАПНО является спецсимволом отвечающим конец файла) завершается фейлом, и вычитанной строчке байтик этот уже не присутствует. Можно и что-нибудь другое допустить. Но как это обойти? Тут, очень к месту, подключилась интуиция, которая подметила, что в слове «удаетсяя», содержащемся в тексте ошибки, буквы «я» почему-то аж целых две.


Я взял строчку CWD Заданияя на лабы СиАОД (обратите внимания, две буквы «я»!), переделал её в кодировку CP866 и отправил в ту нашу консоль. И какие же большие у меня сделались глаза, когда в ответ увидел:


Код: DOS
250 CWD command successful.

Охренеть… Других слов тогда подобрать не получилось. Через 3 секунды было установлено, что дополнительная «я» избавляет от ошибки и FileZillу, и оперу, и проводник… В общем подобрав челюсть, я вернулся к первоначальной задаче, и таки за пару движений скачал желаемые лабораторные…


Вот такая вот история, кидающая очередную какашку в сторону нашего любимого Мелкософта. После этого я стал ещё больше верить что вендекапец приближается. А мораль всей этой истории такова:

Товарищ! Если вдруг, некоторый FTP сервер отказывается пускать тебя в папку, или открывать файл с буквой «я» в заголовке, не паникуй! Просто бери, и делай как я:

1. Копируй FTP-ссылку из адресной строки твоего клиента в буфер обмена (в качестве клиента с успехом может выступать браузер, Опера например)
2. Ищи в ссылке все буквы «я», и добавляй в след за ними по ещё одному экземпляру оных, то-есть заменяй «я» на «яя»
3. Если вдруг ссылка URL-закодирована, то-есть представляет из себя набор из множества «%» и двух символов, не беда! Просто найти все вхождения %FF, и замени их на %FF%FF
4. Вставляй ссылку обратно в свой клиент
5. Нажимай Enter.
6. .....??!!
7. PROFIT!!!


И напоследок: не используйте для организации FTP сервера Microsoft FTP Service. Используйте что-нибудь другое. Думаю, что от этого вы несомненно получите выигрыш. Впрочем, как и ваши пользователи, которые после этого как минимум не будут ненавидеть букву «я» в названии файлов.

Ключевые слова Ломать – не строить, эксперимент, FTP, FileZilla, 550, NetCat, пассивный режим, CP866, CP1251, я, Microsoft
QR-код
Интересное
Как обычно, был семинар по векторной алгебре. Почему-то он показался мне смертельно скучным, может потому что тема плоскостей и прямых в пространстве мне уже была относительна знакома, а может потому что я забыл дома задачник… Впрочем скука продолжалась недолго

Читать »»
Случайные фото