Archive for the ‘Настройки’ Category

Массрутинг в локальной сети

Posted by admin On Сентябрь - 5 - 2009

Что делать, если хочется всего и сразу, да еще и не напрягаться при этом? Правильно, надо найти того, кто сделает все за тебя.Так и в хакпроме — не хочешь выполнять рутинную работу, используй средства автоматизации. Благо, есть MetaspLoit, голова на плечах и немного фантазии.

Как-то раз у меня возникла идея создать портативную версию метасплойта. Зачем? Ну, представь, что ты порутал какой-нибудь узел в локалке и захотелось тебе окинуть пристальным взглядом всю сеть изнутри. Явно нужна помощь в виде всевозможных x-tool’z, которые надо установить, настроить и т.д. Они начнут следить и всячески гадить в системе. В общем, форменное палево, хотя все зависит от конкретных обстоятельств. Гораздо круче иметь портативные версии, которые можно настроить заранее и тупо скопировать на тачку. Если все правильно сделать, нигде они тебя не выдадут, а по окончании злостных действий их нужно будет просто удалить.

МЕТАСПЛОЙТ —ХР— MS08_067 — DB_UT0PWN

В джентльменском наборе пентестера мета-сплойт занимает отнюдь не последнее место, позволяя быстро проверить машинки и, по возможности, их поломать. Конечно, не 0-day, но тем не менее. В общем-то, если не брать в расчет установку nmap и, соответственно, winpcap, проблем с созданием портативной сборки не было. Но тут я наткнулся на EasyHack otSKVOZ be за май 2009) - про реализацию массрутинга с помощью метасплойта. Тема меня дико заинтересовала, и я решил ее развить.
Честно сказать, с метасплойтом я до этого особенно и не работал. Так, баловался разными сплойтами, не дальше user guide. Но идея массрутинга реально зацепила. Более того, у меня было стойкое ощущение, что после эпидемии conficker найти тачки с юзабельной дыркой проблематично. Напомню, что SKVOZ предлагал использовать связку nmap и метасплойт как раз для массрутинга дыры MS08JD67. Ради интереса я повторил эксперимент в своей локалке и был приятно удивлен. Более четверти машин выбросили рутовые шеллы. Еще больше обрадовал тот факт, что сам эксплойт мог бы быть и другим. Только за 2009 год Microsoft уже опубликовала порядка 20 критических уязвимостей. Одна из них — ms09-001 — также связана с SMB. Эксплойта под нее пока нет, но, возможно, это только вопрос времени.

Однако не все так сладко. Нарисовалось несколько проблем, которые требовали решения. Допустим, у тебя есть шелл. Классика жанра требует создания нового пользователя и добавления его в локальную группу администраторов (или снятия хешей паролей, или просто замены пароля локального админа). В российских реалиях подавляющее большинство машин в локалке(я говорю о клиентских тачках под WinXP) работают под локализованной осью, а, значит, локальная группа носит название «Администраторы». Попробуй вбить в удаленной консоли «Администраторы» и тебя накроет глубочайшее чувство обиды. Да-да. извечная проблема с кодировками. Консоль работает под ср866, Windows — под ср1251, никсы и вовсе под KoiS-гили Unicode. Метасплойтже и нагрузки, типа meterpreter, в принципе не понимают русскую локаль. Отсюда на ровном месте мы получаем нехилую проблему. В сетке эта тема достаточно широко обсуждается. В конечном итоге все ссылаются на один и тот же патч (trac.metasploit.com/ticket/253]. Я накладывал патч, пробовал разные кодировки, но ни черта не получилось. Может, получится у тебя, но меня эта проблема окончательно добила, и я решил искать нормальное решение.

Итак, встала задача добавления пользователя в локальную группу администраторов посредством полученной консоли в условиях невозможности использовать символы кириллицы. План действий таков: пишем скрипт, реализующий необходимый функционал, каким-то образом заливаем его на подопытную тачку и исполняем. Скрипты я предпочитаю писать на AutolT, так что открываем SciTe из поставки AutolT и начинаем ваять. При этом хотелось бы сделать версию скрипта, независящую от локали, — то есть скрипт должен уметь автоматически определять название локальной группы администраторов. Известно, что системные группы в винде имеют предопределенные SID, в частности, SID группы администраторов имеет значение HneS-1-5-32-544. Для получения названия по SID предоставляется API-функция LookupAccountName, экспортируемая библиотекой AdvAPI32.dll. В автоит модуль Security. аиЗ предоставляет соответствующую функцию-обертку _5ecurity_LookupAccountName.
Этой функцией мы и воспользуемся (смотри файл user.au3 на DVD).

Вызов TraySetState с параметром 2 блокирует появление иконки AutolT в трее. Далее определяется имя группы администраторов, создается пользователь и добавляется в эту группу. Последний вызов модифицирует реестр, чтобы пользователь отсутствовал в списке интерактивного входа ХР.

Компилируем скрипт в ехе-файл и проверяем на виртуалке. Если все в порядке, двигаемся дальше. В качестве транспорта поначалу я думал использовать SMB. Мы находимся в той же сетке, что и жертва, — так почему бы не расшарить у себя папку и не подложить туда файлик user, ехе? Не видя никаких проблем, я так и поступил. Но монтирование папки с удаленной системы ни в какую не получалось — видимо, после эксплуатации сервис начинал работать неправильно. Нуда ладно, в винде по умолчанию встроен консольный клиент ftp. Я поднял натачке ftp-сервер (портативный FileZilla), настроил анонимный вход, а на удаленной тачке в папке %temp% строка за строкой прописал ftp-скрипт для подключения к моему серваку и получения файла. Далее в консоли появился вызов ftp.exe с ключом -s, и файл user.exe оказался на предназначенном ему месте. После запуска в системе появился пользователь с нужными правами.

Таким образом, принципиально проблема решается несложно. Впрочем, чем дальше, тем больше хочется. Вбивать каждый раз РТР’шный скрипт, качать и запускать файл — идеологически крайне далеко от поставленной задачи автосплойтинга. Кроме того, доступ из консоли в винде — совсем не так круто как в никсах, большинство утил просто не будут работать без графики. Так что, будем шаманить в попытке открыть доступ к рабочему столу. Вариантов, в принципе, всего два. Это — расшаривание стола (типа Radmin, VNC и т.д.] и использование терминальных служб. Первый для клиентских машин — совсем и не вариант, ибо очень палится. С RDP в ХР вообще тухло: при инициации удаленного подключения локальный пользователь будет выброшен из активной сессии. Но не надо отчаиваться, выход есть.

Чем думают ребята из Redmond’a, я не знаю, но порой их решения поражают воображение. Если в серверных ОС мы имеем человеческий доступ по RDP, то в клиентских — полная лажа. Удаленный доступ в ХР не уживается с локальным, и только один из пользователей может оставаться активным (в Home Edition, кстати, терминальной службы вообще нет). Зачем это сделано — большая загадка, потому что вряд ли кто-то будет только из-за этого покупать серверную ось. а неудобств доставляет немеренно, особенно в нашем случае. В одном из бета-релизов ХР такого ограничения не было, поэтому для его снятия достаточно подменить библиотеку termsrv.dll и перезагрузиться. На словах просто, на деле — нет. В сети различных патчеров, как грязи, но все они работают, прямо скажем, хреново, да и то — только если их запускать из интерактивной сессии и иметь доступ к рабочему столу. Дело в том, что системные dll охраняются системой Windows File Protection.

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

Первая часть тривиальна, а вот со второй сложнее. Надо отследить появление окна и эмулировать нажатия на нужные кнопки. Положим, код для этого мы написали, но, запустив его из консоли metasploit. мы дико обломаемся, так как, не имея доступа к рабочему столу, окно он, естественно, не поймает, и никакие сигналы послать не сможет. На выручку, как обычно, приходит планировщик задач, позволяющий запускать проги в интерактивном режиме. Идея в том, чтобы поставить задачу эмуляции пользовательских действий на выполнение в интерактивном режиме. Далее — дождаться ее запуска и уже потом подменять нужные файлы. Смотри на DVD полный код скрипта под названием final.au3, а я тем временем поясню, что к чему. Я весь функционал засунул в один файл, поэтому сначала проверяю, с какими аргументами запущен бинарник. Если присутствует ключ fsp, значит, будем ждать появления окна и щелкать по кнопкам. Определить идентификационные данные окна и кнопок можно с помощью Au3lnfo из сборки AutolT. После этого я отправляю машину в перезагрузку, дав юзеру 2 минуты на сохранение результатов работы. Если ключ fsp не задан, скрипт выполняет свою основную задачу.

Сначала инициализируются необходимые переменные и осуществляется работа по созданию нового администратора. Затем производятся телодвижения касательно реестра и нетшелла, цель которых — открытие доступа к RDP. Дальше проверяется версия ОС и, если она не ХР, работа скрипта прекращается. Если же на узле установлена ХР, с помощью sc поднимается сервис планировщика, и на выполнение ставится наш же скрипт, но с ключом fsp. Подождав, пока планировщик запустит задачу, скрипт реализует подмену библиотеки. Для этого переименовывается текущая dll (если запущена служба TermService, библиотека будет заблокирована, и удалить ее не получится), а новая dll копируется в %systemroot%\ system32\DLLCache (чтобы невозможно было восстановить исходную версию из кэша), и, наконец, подменяется сама библиотека в %systemroot%\system32. После сборки я упаковал собранный экзешник и библиотеку в самораспаковывающийся архив. Архив настроил на распаковку в %temp%, автоматическую перезапись всех файлов (кстати, не перезаписывает — доказано), и запуск %temp%\final.exe по окончании распаковки. Хочешь протестировать? Бери psexec и запусти архив на удаленной машине. Через примерно три минуты подключайся по RDP. У меня все получилось, так что двигаемся дальше.

При всей своей простоте и удобстве использования SMB — жутко глючная штука. Ктомуже, из всехтехнологий, реализованных Microsoft, это наверное, одна из самых корявых (не считая осла). Тот же метасплойт несет в себе 1А сплойтов для smb; не за горами и новые дырки. Ну а мы пока воспользуемся ms08_067, как наиболее свежей и, пока еще, достаточно пробивной. Проблема кроется в библиотеке netapi32.dll, а точнее, в функции wcscat (по крайней мере, та к ее использовал conficker). Для удаленного доступа используется RPC-Bbi3OBcUUIDAb32Afc8-1670-01d3-1278-5a47bf6ee188, то есть — обращение к интерфейсу srvsvc. Чтобы не мучить пользователей локалки, было решено создать тестовый стенд. Я накатил образ винды на VmWare с обновлениями, вышедшими до октября 2008 года (тогда появился патч), немного его подстроил и клонировал в трех вариантах. Итак, получена локальная минисеть, на которой можно оттачивать мастерство автосплойта. Моим удивлению и досаде не было предела, когда попытка применить метасплойтовский ms08_067 окончилась неудачей! Та же история постигла и милвормовский вариант, причем последний выплюнул ошибку«Маке SMB Connection error:53 (network path was not found)». Я подумал, что виноват файер, отключил его и попробовал заново. Ситуация немного изменилась, но была далека от идеала. Метасплойт неправильно определил сервис пак — «Fingerprint: Windows XP Service Pack 2+

— lang:Russian», хотя у меня был SP3. Чтобы понять, что это значит, я немного пошарил по исходникам.
Как итог, если в sp возвращается строка со знаком «+», значит, сервис пактупо неудалось определить. Что ж, выбираем в качестве цели конкретную версию (Windows XP SP3 Russian (NX)) и пробуем заново. Опять облом — «Exploit failed: The server responded with error: STATUS_ 0BJECT_NAME_NOT_FOUND (Command=162 WordCount=0)». Эта ошибка навевала мысль о невозможности подключения к пайпу. Я включил общий доступ к файлам и в случае автоопределения версии получал следующий результат — «Selected Target: Windows XP SP0/SP1 Universal — Exploit failed: The server responded with error: STATUS_OBJECT_NAME_ NOT_FOUND(Command=162WordCount=0)». Уже другое, но все равно не то. В случае явного указания цели эксплойттакже не работал. Однако если сменить пайп с BROWSER на SRVSVC. можно получить заветный шелл. Конечно, здорово, но для реализации нужно заранее знать версию операционной системы на удаленной машине, что для автосплойта совсем не катит. Но ведь я пробовал сплойт на локалке, и он работал! Оставалась последняя надежда — расшарить какую-нибудь папку. Это ничуть не изменило картину. Я готов уже был рвать на себе волосы и крушить-ломать все подряд. От бессилия я стал гуглить и наткнулся на какой-то баглист, в котором парень писал о жутких терках с фаером. Тогда так. Запускаем и сразу же останавливаем чудо-мегафаер мелкомягких… Эксплойт работает, как миленький! Причем на обоих пайпах одинаково хорошо определяет версии сервис пака и создает любезные глазу сессии. Итак, с тестовой настройкой я определился, расклонировал систему и получил стенд из трех уязвимых машин.

Для реализации автоматической системы эксплуатации необходимо обеспечить транспорт и запуск созданного бинарника на уязвимых системах. Окинув взглядом доступные нагрузки, я радостно потер руки и принялся окучивать нагрузку windows/upexec/ bind_tcp. Ее цель как раз и состоит в загрузке файла на хосте последующим исполнением. Увы, радость быстро улетучилась, когда я обнаружил, что ни хрена она не пашет. Позже я выяснил, что в никсовой версии метасплойта все работает на ура, однако я подразумеваю запуск метасплойта на поломанной виндовской машине, следовательно, нужно искать другие варианты. Выходом стало использование нагрузки windows/download_exec. Для этого необходим доступный Web-сервер, куда надо положить созданный бинарник. Сервак можно поднять на самой машине, например, используя ХАМРР. Я так и поступил. URL бинарника указываем в одноименном параметре нагрузки и запускаем эксплойт. На выходе получаем ошибку — «Exploit failed: No encoders encoded the buffer successfully». Все правильно: download_exec представляет собой цельную нагрузку, которая не умещается в буфер сплойта, поэтому нужно использовать stager, например, download_exec/bind_tcp. Проводим аналогичные настройки и получаем нужный результат. Через пару минут я мог коннектиться по RDP с админскими правами, не выбивая текущего юзера. Мое внимание привлек тот факт, что задание оставалось висеть, а сессия так и не создавалась. Для единичного воздействия это вполне нормально, но при автосплойте сети мы получим большие проблемы.

Во-первых, мoдyльdb_autopwn выполняется многопоточно и имеет ограничение на количество одновременно выполняемых заданий, которое по умолчанию равно 5. Это значит, что при успешной эксплуатации 5 узлов остальные будут бесконечно и бестолково болтаться в очереди. Во-вторых, после прогона db_autopwn неплохо было бы иметь список порутанных узлов, который удобно получать по команде «sessions -I». Конечно, эти ограничения не так уж и существенны, но хочется же все сделать красиво, — поэтому я решил немного подправить код download_exec с тем, чтобы он все-таки приводил к созданию сессии.

Код нагрузки находится по адресу %appdata%\msf32\ modules\payloads\singles\windows\download_exec. rb и предельно прост. Очевидно, что сессия не создается по причине того, что нагрузка просто не предназначена для создания шелла. Это легко поправить! Достаточно добавить параметр session со значением Msf::Sessions::CommandShetl. Исправленный исходник ждет тебя на диске.

Гид по использованию Secure Shell

Posted by admin On Сентябрь - 1 - 2009

Стой! He листай дальше. Если ты до сих пор воспринимаешь SSH исключительно как безопасную альтернативу устаревшему Telnet, не рискуй вызывать гнев богов, тьфу, разработчиков протокола. Ниже мы собрали самый полный мануал по правильному использованию Secure Shell на полную катушку.

Несмотря на большое разнообразие SSH-клиентов, особой проблемы с выбором не возникает. Общепризнанных всего два — PuTTY (www.chiark.greenend.org.uk) и SecureCRT (www.vandyke.com). и оба действительно хороши. Но если за «цитрамон» разработчики просят денежки, то PuTTY распространяется прямо в открытых исходниках. По этой причине выбор зачастую остается именно за ним. Более того, несмотря на то, что многие воспринимают путти как виндовый клиент, у него есть версии и для UNIX. Саму прогу ты видел в действии, когда смотрел ролики Visualhack++. С помощью него ты можешь коннектиться к своим сервакам через: Raw. Telnet, Rlogin. FTP (SFTP), SSH1, SSH2. В общем смысле. PuTTY — это комплект утилит, куда помимо непосредственно клиента (putty.exe) входят тулзы:

• puttygen — генератор rsa/dsa ключей, используемых для авторизации;
• pagent — агент аутентификации, который хранит ключи в памяти, благодаря чему ты освобождаешься от ввода паролей ручками;
• plink — интерфейс командной строки для
putty;
• pscp — утилита, обеспечивающая безопасное копирование файлов;
• psftp — безопасный ftp-клиент для копирования, просмотра, переименования файлов
и т.д.

С некоторыми из этих утилит мы еще познакомимся далее.
Невзирая на личную симпатию к PuTTY, долгое время я отдавал предпочтение SecureCRT. Почему? По большому счету — за одну маленькую, но очень полезную опцию, не реализованную в патти — поддержку табов для разных сессий. Если у тебя когда-нибудь было открыто пять, а то и больше окошек PuTTY для разных серверов, ты знаешь, насколько тяжело ориентироваться среди них. Разработчики не спешат добавлять поддержку табов в утилиту, но зато с этим справилась группа французских энтузиастов, выпустив замечательную тулзу PuTTY Connection Manager (puttycm.free. fr). Что важно, это не какая-то там переделка исходников оригинального PuTTY, которая могла повлечь за собой новые баги, в том числе и безопасности. Напротив, за SSH-сесии по-прежнему отвечает исходный бинарник (putty.exe), a PuTTY Connection Manager лишь объединяет открытые окна в удобный интерфейс с табами, а также предоставляет продвинутый интерфейс для настроек подключения. Поддержка табов — это не единственный конек написанной на С# надстройки над PuTTY. После недели использования с трудом можешь представить жизнь без полезных

• сворачивание в треи;
• автоматический логин без необходимости ввода пароля. Надо заметить, что стандарт не позволяет производить подобные действия, но в обход используется эмуляция ввода с клавиатуры пользователем;
• выполнение произвольных команд после успешной авторизации в системе;
• менеджер соединений, позволяющий задать для каждого из серверов отдельные параметры;
• шифрование файла с настройками с помощью AES; правда, для этого требуется установить дополнительную DLL-библиотеку.

Самый простой способ авторизироваться на удаленном сервере — использовать связку логин/пароль. Понятно, что если к серверу коннетишься раз в день, то набрать связку вручную не составит труда (при условии, что помнишь их). PuTTY для каждого подключения позволяет сохранить настройки. В PuTTY ты можешь создавать профили для различных SSH-серверов. так что не придется вбивать настройки для конкретного сервера, когда ты захочешь к нему очередной раз подсоединиться. В таком профиле, например, можно ввести логин, который будет использоваться для входа. Давай попробуем создать профиль для сервера. Для этого переходим в категорию Sessions. Здесь вводится IP-адрес или имя хоста, порт, а также протокол. Можно указать имя пользователя для подключения, под которым ты хочешь заходить в систему. Перейди в «Connection -> Data» и укажи в «Auto-login username» имя пользователя (например. UserAcc). Затем снова иди в категорию Sessions. Под надписью Saved Sessions (сохраненные сессии) введи имя профиля, например, session!, после чего кликай на Save. В следующий раз, когда будешь запускать PuTTY. просто выбери подходящий профиль из Saved Sessions, кликни Load и Open. Причем, имя пользователя введется автоматически. Стандарт на протокол SSH запрещает сохранять пароль, но позже мы научимся обходить это ограничение. Для авторизации на удаленной системе можно сгенерировать и использовать пару ключей (открытый/закрытый) для SSH-подключения к удаленной системе. В архив с программой входит дополнительная утилита PuTTYgen, которая поможет сгенерировать открытый и приватный ключ. Открытый ключ, как уже говорилось, необходимо передать на удаленный сервер. В случае виндового сервера — путь к нему достаточно указать в настройках аккаунта. Под никсами и OpenSSH необходимо вставить в файл /.ssh/ authorized_keys2 ключ в одну строку:

mkdir ~/.ssh chmod 700 -/.ssh vi  ~/.ssh/authorized_keys2 ssh-dss AAAAB3NzaClkc3MAAAE Huw2FekFNM7pMgEQi57k= dsa-key-20061205 chmod 600 -/.ssh/authorized_keys2

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

Что касается закрытого ключа, путь к нему требуется указать в настройках нужной сессии клиента (SSH -> Auth -> Private key file for authentification). Добавлю, что даже при использовании пары ключей приходится каждый раз вводиться секретную фразу. Это сильно раздражает при частых коннектах. От проблемы может избавить утилита Pageant, которая также входит в стандартный комплект PuTTY.
Помимо этого, можно воспользоваться так называемым sshproxy (sshproxy-project.org/ about!, написанным на Python. Тулза позволяет подключаться к удаленным хостам без необходимости ввода паролей или ключей. По сути, это маленький демон, который сидит в локалке или DMZ-зоне. Когда пользователь коннектится к нему с помощью SSH-клиента, то sshproxy авторизирует его и проверяет права для доступа к нужному сайту. Если клиенту это разрешено, прокси выполняет соединение на удаленный сайт, используя пароль или ключ, сохраненные в его базе данных.

Помимо доступа к удаленной командной строке, SSH предоставляет ряд других возможностей. Первая — это туннелирование. После того, как установлено SSH-соединение, можно безопасно роутить через туннель трафик одного или сразу нескольких приложений. Это не только позволяет обойти файрвол, но еще и гарантированно скроет данные от прослушивания. Туннелинг сейчас поддерживают любые клиенты и серверы. Объясню смысл на примере нашего любимого PuTTY. Для конфигурации туннеля с помощью PuTTY нужно:

• в окне конфигурации подключения в категории «Session» указать Host Name (твой_55Ь_сервер), Port (22), Protocol (SSH);
• в категории «Connection/SSH/Tunnels», в секции «Add new forwarded port», указать «Source port» (локальный_ порт, например, 666), Destination (адрес_прокси_или_ сервера:3306);
• выбрать пункт Local и нажать кнопку «Добавить». После установления соединения можно запускать браузер, указав в качестве прокси 127.0.0.1 и порт, указанный в качестве Source Port (например, 666).
В unix-системе достаточно набрать команду:

ssh -L666 : адрес_прокси__или_сервера: порт -п имяпользователя@адрес_зз1т_сервера

Аналогичным образом можно поднять туннель до MySQL-сервера, пробросить VNC-сессию до удаленного рабочего стола и т.д.

Что такое «поднял 2-хоповый ssh тунель (2-hop ssh tunnel)»? SSH часто используется как транспортный протокол для безопасной передачи данных между другими приложениями, например, небезопасного VNC [удаленный рабочий стол). Однако бывают ситуации, когда установить туннель невозможно: например, между двумя хостами нет возможности прямого подключения (банально из-за ограничений файрвола). Если ввести некоторый хост, с которым подключение может установить каждая из сторон, то его реально использовать как посредника, прибегнув к приему two hop tunneling (или. проще говоря, — туннель через дополнительный гейт). Достигается это так: сперва мы используем ssh, чтобы переадресовать трафик на порт той машины, с которой возможно установить соединение, и далее заставляем ее переадресовывать трафик на нужный нам хост (с которым для нее также возможен коннект). В следующем примере мы будем осуществлять подключения с машины «myhome.example.org», в качестве промежуточного хоста будет выступать «gateway.example.com», а в роли желанной машины будет недоступный напрямую SSH-демон на «serverexample.com».
Наша задача — создать двух-хоповый туннель. Для этого на машине «myhome.example.org» запускаем команду:

ssh -f -N -L 51526:server.example.com:22 -2 gateway.example.com

Вот и все! В результате. SSH-подключения на 51526 порт на машине myhome.example.org будут туннелироваться на нужный хост (serverexample.com). Другими словами, вместо невозможного напрямую соединения на server.example. com:22, мы просто подключаемся на локальный хост и порт 51526. а все заморочки возьмет на себя механизм SSH. Кстати, в качестве порта можно использовать и любой другой, но желательно из диапазона 49152-65535.

С никсами все просто. Чуть ли не стандартом де-факто является всем известный OpenSSH, да и практически в любом дистрибе он установлен по умолчанию. В условиях ограниченных ресурсов (на старых компьютерах, аппаратных роутерах, точках доступа и т.д.] зачастую устанавливают DropBear (matt.ucc.asn.au/ dropbear/dropbear.html). Под виндой, впрочем, поднять SSH-сервер — тоже не бог весть, какая проблема. Для тех же самых OpenSSH и DropBear есть полноценные порты, но их трогать не будем. Обходим стороной и продвинутый, но платный WinSSHD [www.bitvise.com/ winsshd). В сравнении с WinSSHD программа MobaSSH (mobassh.mobatek.net) чарует своей простой. Все, что требуется для запуска полноценного SSH-сервера с авторизацией, используя аккаунты пользователей в системе — это нажать одну кнопку «lnstall». В системе тут же появится новая служба. После соединения с MobaSSH и получения приветствия демона становится понятно, что это не что иное, как сильно переработанный порт OpenSSH, собранный с помощью компилятора Cygwin. Для навигации по системе используются никсовые команды [Is вместо dir для отображения содержимого текущего каталога и т.д.). Имей в виду некоторую специфику демона. Все локальные диски доступны через директорию /cygdrive. Достучаться до сетевых ресурсов можно, используя привычный адрес в UNC-формате: //< LA NJ/VO R KSTATIО N >, а вносить изменения в реестр — через директорию /registry. Помимо этого есть ряд полезных команд:

MobaHwInfо:  детальная информация об ОС и железе
MobaSwInfo:  список установлено в системе софта
MobaTaskList, MobaKillTask: список процессов и удаление нужного TCPCapture:  сетевой монитор scp,  sftp:  передача данных по криптованному ssh-соединению rsync,  wget: синхронизация локальных папок с сетевыми ресурсами MobaSSH на 100% совместим со всеми никсовыми и виндовыми клиентами. Полностью с нуля, а поэтому и без всяких юниксовых замашек написан бесплатный freeSSHd (www. freesshd.com). С установкой также не возникнет проблем; причем, как будет работать демон, в виде сервиса системы или обычного приложения, предоставляется на выбор пользователю. Точно так же можно выбрать и оболочку — по умолчанию выбирается стандартный cmd.exe. Вообще, настроек не то, чтобы много, но как раз достаточно, чтобы все настроить под себя, включая авторизацию пользователя, приветственный баннер, параметры туннелирования. SFT и т.д.

Все то же самое можно сделать и при помощи консольной утилиты Plink, которая входит в комплект с PuTTY. Любые параметры реально задать через командную строку с помощью различных ключей, а можно использовать настройки, сохраненные в конкретной сессии. Так и поступим:

plink my-ssh-session

По разным причинам соединение может иногда «падать». Будь уверен, упадет оно в самый неподходящий момент. Чтобы этого не произошло, отслеживай состояние подключения и вновь устанавливай его при необходимости. Когда-то подобные скрипты я писал вручную, но сейчас есть отличная утилита MyEnTunnel (nemesis2.qx.net/pages/ MyEnTunnell. Она незаметно сидит в трее и поддерживает активными все необходимые SSH-туннели. Принцип прост: тулза отслеживает процесс Plink. Если процесс умирает (соединение оборвано, сервер перегрузился или по какой-то еще причине удаленный хост стал недоступен), MyEnTunnel автоматически перезапустит Plink. Системные ресурсы при этом используются по минимуму. Юзер вправе сам указать, как часто нужно проверять наличие коннекта: в самом скромном режиме «Slow Polling» MyEnTunnel проверяет соединение раз в секунду. Несмотря на то. что тулза написана под винду. она отлично чувствует себя с Wine'oM и под никсами.

Когда мы говорим об SSH, не стоит забывать о безопасной передаче файлов (Secure file transfer), реализуемой на базе протокола SFTP (SSH File Transfer Protocol) и уже устаревшего протокола SCP (Secure СоРу). Подключившись к серверу по SSH, с помощью специального клиента можно выполнять все основные операции с файлами: загружать их на сервер, переименовывать файлы и папки, изменять свойства файлов, а также создавать символические ссылки и ярлыки. Одним из самых известных клиентов под винду является WinSCP (www.winscp. net). Помимо самых стандартных опций, тут есть и ряд бонусов. Для обновления некоторых сайтов я нередко использую функцию по синхронизации директорий, а автоматизировать часть рутинной работы на сервере, где у меня хранятся бэкапы, помогает возможность написания простых скриптов. Вдвойне приятно, что WinSCP интегрируется с Pageant и позволяет использовать уже сохраненные публичные ключи и сохраненные парольные фразы для подключения. Впрочем, зачем вообще заморачиваться с запуском каких-то программ? Файлы с удаленного сервера можно примонтировать прямо в систему, и. все равно, операции с ними буду осуществляться через SSH. ExpanDrive (www.expandrive.com), которая раньше называлась SFtpDrive, позволяет прозрачно примонтировать новый логический диск и работать с ним. как если бы это была, к примеру, флешка. Я использую эту прогу в достаточно странном ключе, а именно — для доступа к файлам некоторых никсовых систем из-под винды :).

Ситуация: дома у тебя есть настроенный клиент, с параметрами сессий, ключами для доступа, сохраненными логинами и паролями. Приятно воспользоваться всеми этими благами удаленно. В этом плане интересной разработкой стал бесплатный Telnet/SSH клиент Тега Term (http://www.ayera.com/teraterm]. Фишка в том, что тулза имеет встроенный веб-сервер, который включается через меню «Web — Accept HTTP Connections». После этого ты получаешь практически полноценный клиент через обычный браузер, просто набрав адрес машины и порт, на котором он принимает соединения. «А ведь наверняка же есть реализации SSH-клиента. полностью написанные для веб», — задумался я. В результате несложных поисков попалось сразу несколько реализаций, но самой качественной оказался WebShell (www-personaLumich.edu/-mressl/websheil). Единственная трабла — он написан на Python, а потому установить его на простой хостинг не получится. Но зато он полностью сделан на Ajax, а использовать его удобно не только с обычного компа, но и с телефона (кстати, ссылки на клиенты под различные мобильные платформы ты найдешь во врезке).

Поднять SSH-туннель и пустить через него VNC или RPD сессию проще простого. Однако для доступа к удаленным хостам по RPD-протоколу есть специальная утилита WiSSH (www.wissh.com). WiSSH позволяет осуществлять доступ через Gateway SSH-сервер к компьютерам со следующими системами: Windows 2000 Terminal Servers; Windows 2003 Terminal Servers; Windows NT Terminal Server Edition; Windows XP и Windows 2000/2003 с включенным Remote Desktop. Пользователи смогут работать на удаленной машине так же. как если бы находились непосредственно рядом с ней.

Об одном из видов автоматизации мы уже говорили. В случае использования PuTTY Connection Manager для любого соединения можно задать последовательность команд, которые будут выполняться после успешного входа на удаленной системе. Вот еще один способ упростить жизнь админу. в распоряжении которого имеются несколько серверов с одинаковой конфигурацией. С помощью утилиты ClusterSSH (clusterssh.sourceforge.net) можно администрировать сразу несколько удаленных хостов. Прога открывает несколько SSH-соединений с различным узлами, а также одну общую администраторскую консоль. Любая команда, набранная в этой консоли, реплицируется, т.е. передается по всем SSH-соединением. Это избавляет тебя от повторения монотонной работы. К сожалению, подобное решение есть только под никсы. ClusterSSH управляет несколькими окнами xterm через единый интерфейс, причем сам он частично написан Perl/TK.

Авторизация при помощи логина и пароля считается самой небезопасной. В большинстве случаев рекомендуется вообще отключать ее на сервере, а заодно деактивировать поддержку устаревшего протокола SSH1. Чтобы сделать это в OpenSSH — а он наиболее распространен — необходимо внести поправки в конфиг:

vi  /etc/ssh/sshd_config [...]
PasswordAuthentication no UseРАМ no [. . .]

Если отключать авторизацию не хочешь, то надо установить примитивную систему предотвращения вторжений. Например, Sshguard (sshQuard.sourceforge.net). Простой демон проверяет записи в журналах (syslog. syslog-ng, metalog, multilog, raw) и способен вычислять подозрительную активность вроде попыток подбора паролей. Для блокировки таких IP-адресов используется локальный фильтр пакетов (pf, ipfw, netfilter/iptables или файл hosts, allow). Поддерживаются сервисы sshd. dovecot, proftpd, риге-ftpd, FreeBSD ftpd. UWimap (imap, pop). Аналогично работают Fail2ban (www.fail2ban.org) и Sshdfilter [http://www.csc.liv.ac.uk/-gre sshdf ilter).

Азы написания GUI на языке Python

Posted by admin On Сентябрь - 1 - 2009

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

Практически любой серьезный язык программирования имеет средства для написания GUI. Python — не исключение. Но разработка GUI на нем имеет два преимущества. Во-первых, это высокая скорость разработки, что и следовало ожидать от такого языка как Python. Во-вторых, — огромное количество GUI-фреймворков. Существуют расширения для почти всех основных GUI-библиотек: Tkinter на основе Tcl/Tk, wxPython для wxWidgets, PyQt для Qt и многое другое (с полным списком можно познакомиться, пройдя по ссылке на боковом выносе). Tkinter поставляется вместе с Python, и работу с GUI можно начинать сразу после его установки В этой статье будет рассматриваться библиотека wxPython. Она является оберткой над популярной кроссплатформенной GUI-библиотекой wxWindows.

По ссылке на боковом выносе можно выбрать подходящий IDE, заточенный для работы с GUI. Выбор весьма богат, так что, скорее всего, ты не разочаруешься, «примеру, для работы именно с wxPython мне приглянулся BoaConstructor. Он удобен для визуального проектирования GUI: избавляет от рутины и, в целом, имеет интуитивно понятный интерфейс (что не отменяет чтения туториала]. Какой IDE выбрать — это дело вкуса, поэтому я больше не буду акцентировать на нем внимание. Дальнейшее чтение статьи должно быть понятным независимо от сделанного выбора. Так что устанавливай wxPython и приступим непосредственно к кодингу.

Немного перефразирую известную фразу: лучший способ изучить работу с GUI — это сразу начать писать GUI! Не откладывая дело в долгий ящик, сразу продемонстрирую программу «Hello. world!» на wxPython’e.

import wx
class HelloFrame(wx.Frame) :
def_init_(self) :
wx.Frame._init_(self, id=-l, parent=None,
pos=wx.Point(422, 270), size= wx.Size(300, 200), title=’Hello Frame’) self.panel = wx.Panel(self) self.helloButton = wx.Button(id=-l, label= ‘Push me. ‘ ,parent=self .panel,
pos=wx.Point(110, 75), size=wx.Size(80, 30)) self.panel.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.helloButton)
def OnButtonClick(self, event) print ‘Hello, world!’
class HelloApp(wx.App) def Onlnit(self): frame = HelloFrame() f rame.Show(True) return True
app = HelloApp () app.MainLoop()

При запуске программы создается окно с кнопкой, при нажатии на которую выводится строка «Hello, world!».

Теперь немного теории. Любая wx Python-программа должна содержать два объекта: прикладной объект и главное окно. Прикладной объект управляет главным циклом обработки событий, а окно содержит элементы интерфейса, посредством которых пользователь может управлять данными. Разберем жизненный цикл нашей программы:

1) app = wx.PySimpleApp() — создается прикладной объект, который должен быть объектом класса wx.App или производного от него. Пока он не создан, невозможно создать никакие другие графические объекты wxPython.

2) Вызов метода OnlnitO для созданного прикладного объекта. Обычно здесь выполняется начальная инициализация виджетов. Если он возвратит False, то приложение тут же завершится.

3) frame = HelloFrameO — создание объекта главного окна (должен быть объектом класса wx.Frame или производного от него). Причем, необязательно, чтобы создание этого объекта происходило в методе OnlnitO прикладного объекта — лишь бы главное окно создалось не раньше, чем прикладной объект! Приложение может содержать несколько окон верхнего уровня (не имеющих родителя), и только одно из них является главным. Главное окно можно объявить явно (вызвав метод SetTopWindowO) либо неявно (главным считается фрейм верхнего уровня, который создан первым).

4) app.MainLoop() — вызов главного цикла обработки событий. Этот цикл отвечает на события, посылая их соответствующим обработчикам (к событиям я подробнее вернусь чуть позже). Когда все окна верхнего уровня закрываются, то происходит возврат из метода MainLoopO и приложение завершает работу. Так же как метод OnlnitO вызывается сразу после создания прикладного объекта, метод OnExitO у этого объекта вызывается после закрытия последнего окна, но перед внутренней очисткой wxPython. Его можно использовать для очистки не-wxPython ресурсов. Если по каким-то причинам приложение должно жить даже после закрытия всех окон, можно изменить поведение прикладного объекта, вызвав у него метод SetExitOnFrameDelete(False). После этого приложение будет жить до тех пор, пока явно не вызовет глобальную функцию wx.Exitd. Ты получил общее представление о том, что происходит«за кулисами». Можно перейти к созданию виджетов, которым будет посвящена оставшаяся часть статьи.

Рассмотрим создание окна (фрейма):

wx.Frame(parent, id=-l, title=»»/
pos=wx.DefaultPosition, size=wx.DefaultSize,
style=wx.DEFAULT_FRAME_STYLE, name=»frame»)

Большинство параметров имеют разумные значения по умолчанию, поэтому их можно опускать. Их назначение понятно из названий. Я только обращу внимание на параметр id, который задает идентификатор виджета. Любой виджет должен иметь уникальный id. Этого можно достичь тремя способами:

1) Самому генерировать уникальное положительное число и передавать его в конструктор.
2) Использовать функцию wx.NewldO.
3) Передать в конструктор виджета константу wx.lD_ANY или -1 (что и сделано в примере).

Между вторым и третьим стилями нет никакого функционального различия. При создании фрейма, втом числе, происходит создание виджетов. которые он должен содержать. Хорошим ходом считается создание виджета \л/х. Рапе такого же размера, как рабочая область окна, и который, по существу, является простым контейнером для других объектов. Это позволяет отделить содержание окна от других элементов, типа панели инструментов и строки состояния. Затем в примере создается виджет кнопки. Список параметров аналогичен таковому у конструктора фрейма. Обрати внимание, что родителем является объект панели. Здесь нужно, чтобы размеры внутреннего виджета не вылезали за рамки виджета-родителя (параметры pos и size). После создания виджета доступ ко всем его параметрам осуществляется через Get/Set методы (такой подход не свойственен Питону, но тут просматривается влияние С++, так как wxPython — это оболочка над библиотекой wxWindows, которая написана как раз на С++).

Как уже упоминалось, главная задача прикладного объекта — обработка событий, которые происходят во время работы приложения. События (events) в wxPython’e — это очень обширная тема, поэтому я рассмотрю только азы. После того как у прикладного объекта вызван метод MainLoopO, программа большую часть времени по сути ничего не делает. Все события, которые происходят при работе программы, помещаются в очередь. Время отвремени программа проверяет эту очередь. Если в ней что-то появилось, она обрабатывает это событие, вызывая программный код. связанный с ним. Любое событие является потомком wx.Event и имеет свой тип. Например, событие wx.MouseEvent имеет U типов, таких KaKwx.EVT_RIGHT_DOWN.wx.EVT_LEFT_UPnT.n. В wxPython. большинство виджетов генерирует высокоуровневые события в ответ на события более низкого уровня. Например, щелчок мыши на кнопке wx.Button генерирует событие wx.CommandEventTnna EVT_BUTTON. Преимущество такого подхода — в том, что он позволяет сосредоточиться на самих событиях, вместо того, чтобы отслеживать каждый щелчок мыши.

Чтобы связать событие, виджет, который его вызвал, и обработчик события, используется так называемый биндер — объект класса wx.PyEventBinder. Для каждого типа события существует свой биндер. Объекты биндеров предопределены и глобальны, но есть возможность создать собственный биндер для собственного типа события. Любой виджет является потомком класса wx.EvtHandler, а значит, имеет метод Bind. Он-то как раз и создает биндеры событий, про которые только что шла речь. Этот метод имеет следующую сигнатуру: Bindlevent, handler, source=None. id=wx.lD_ANY, id2=wx.lD_ANY). Первые два параметра обязательны. Event — объект класса wx.PyEventBinder. и он описывает событие; handler — объект, поддерживающий вызов, обычно это метод или функция с единственным параметром — объектом событием. Параметр source задает виджет, который является источником события (его следует задавать, если этот виджет не тот, который используется как обработчик).
Рассмотрим, какэто все работает в нашей программе. В ней есть такая строчка:

self.panel.Bind(wx.EVT_BUTTON, self.OnButtonClick, self. helloButton). Щ j? -.

В этой строчке объект panel создает биндер. при помощи которого, при нажатии кнопки helloButton, произойдет вызов метода On Button Clicklself, event).

Хочу обратить внимание, что код. который вызывается в ответ на событие, обычно не определяется виджетом, вызвавшим это событие (так называемая распределенная архитектура). В нашем случае событие вызывается виджетом helloButton. но обработчик этого события является методом OnButtonClick!) объекта Frame, который и содержит виджет. Стоит упомянуть еще об одной возможности обработки событий: если в обработчике вызван метод SkipO, это позволяет продолжить поиск и выполнение других обработчиков того же самого события (иначе будет выполнен только тот обработчик, который был найден первым). Иногда такое поведение необходимо.

Возможно, тебе покажется, что для такой простой программки. как«Не11о, world!», тут слишком много теории. Может быть. Но зато теперь ты готов писать GUI практически любой сложности. Основной алгоритм написания большинства GUI:

1. Создание прикладного объекта и фрейма.
2. Создание и размещение виджетов в фрейме.
3. Размещение всей логики работы GUI в обработчиках событий. Следующим этапом у нас будет написание более серьезной программы — калькулятора (наподобие стандартного в Windows). Вместе с подробными комментариями весь код занял у меня около 270 строк. Естественно, что целиком в рамки статьи он не поместится. Поэтому я буду делать акцент только на самых интересных местах, а сам исходник можно найти на диске. Калькулятор будет представлять из себя окно, на котором размещены поле для ввода/вывода чисел, кнопки для набора цифр, знаков операций и вывода результата. Так как эта статья посвящена обзору GUI. то не буду подробно разбирать логику работы калькулятора. Рассмотрю только ту ее часть, которая имеет непосредственное отношение к GUI.

С ростом числа виджетов возрастает объем однотипного кода. Можно прибегнуть к некоторым ухищрениям, чтобы в нем легче было ориентироваться.

1. Рекомендуется давать объектам виджетов «говорящие» имена, чтобы по названию сразу можно было понять, для чего они предназначены (например, кнопку умножения есть смысл назвать buttonMul вместо button J 2).
2. То же самое касается именования обработчиков событий. Их название принято начинать с префикса «Оп». За ним идет название виджета, с которым этот обработчик связан, а затем — название события, которое обрабатывает обработчик (например, из названия обработчика On Button Erase Click ясно, что он обрабатывает событие, возникающее при «клике» на кнопку buttonErase). Возможно, это провоцирует появление длинных имен, но я рекомендую делать выбор в пользу понятности, пусть и в ущерб краткости.
3. Часто есть возможность уменьшить количество обработчиков путем назначения одного и того же обработчика на разные события. В нашем случае вместо того, чтобы на каждый «клик» на кнопке с цифрой назначать отдельный обработчик (который всего лишь должен эту цифру дописать
в окно вывода), можно обойтись одним единственным обработчиком. Правда, перед тем как дописать цифру, этому обработчику вначале придется найти ту кнопку, которая вызвала это событие, так как эта цифра расположена на label’е этой кнопки. Что делается следующим образом:

# Получаем список всех виджетов, которые содержат
# panel.
children = self.panel.GetChildren()
# Находим виджет, который вызвал событие, for child in children:
if child. Get Id () == event .Get Id() :
# Знак, который нужно вывести, содержится
# в label’е виждета.
self.textCtrllnfo.AppendText(child. GetLabelO)   у– -   ШШ !^|LM^

Тут быстродействие приносится в жертву ради большей «прозрачности» кода. Но именно такой подход и соответствует идеологии Python”a. поэтому настоятельно рекомендую придерживаться его и впредь. Кроме того, на нажатие кнопок арифметических операций и кнопки вывода результата («=») также можно назначить один и тот же обработчик (в примере это метод OnOperationClick). Правда, при разборе этого метода могут возникнуть некоторые трудности для тех, кто слабо разбирается в Python”e. Но это лишь из-за не совсем тривиальной логики, по которой должен работать калькулятор (например, если было введено 2+3, то ввод следующей операции подразумевает вычисление этого выражения 2+3=5 и применения новой операции к результату). Даже если ты не до конца разберешься с логикой, — ничего страшного, ведь наша главная задача это GUI.

Есть несколько нюансов, о которых начинающие разработчики часто забывают.
1. Важно помнить, что пользователю может прийти в голову мысль изменить размер твоего приложения (например, развернуть его на весь экран). Обычно после этого приложение приобретает неприглядный вид — все виджеты будут расположены в рамках старого размера, а оставшаяся часть останется пустой. Самый простой вариант избежать этой неприятности — запретить изменения размера окна
и его максимизацию. Это можно сделать при инициализации фрейма, инициализировав параметр style значением wx.DEFAULT_FRAME3TYLE&Mwx.MAXIMIZE_B0X wx.RESIZE_BORDER).
2. Поскольку наш калькулятор позволяет вводить цифры не только путем нажатия кнопок, но и с клавиатуры, то необходим контроль за пользовательским вводом. Пользователь должен вводить только целые и дробные числа. Проверку правильности ввода можно организовать следующим образом:

try:
number = float(self.textCtrllnfo.GetValueO) except (TypeError, ValueError): self.errorStatusBar.SetStatusText(ОШИБКА! Введите число правильно.)
return

Этот код пытается привести строку к типу float; если не удается, то бросается исключение, которое ловится, и в виджет errorStatusBar выводится сообщение об ошибке. Обрати внимание, что ловятся ошибки определенного типа (TypeError, ValueError). Все остальные ошибки ввода уже не будут выводиться в виджет errorStatusBar Это считается хорошим стилем — ловитьтолько те ошибки, которые ты готов обработать.
3. По умолчанию длина входной строки не ограничена, и при вводе большого числа оно не будет влезать в поле ввода. Чтобы этого избежать, можно указать максимальную длину вводимой строки при создании виджета: textCtrllnfo. SetMaxLength(30).

Надеюсь, теперь тебе не составит труда продолжить изучение wxPython самостоятельно. На примере двух простых программок был рассмотрен фундамент любого wxPython-приложения. А если есть фундамент, — возвести фасад куда легче. В процессе дальнейшего изучения wxPython я настоятельно рекомендую обратить внимание на wxPython Demo, который поставляется вместе с самой библиотекой. Это большая сборка различных примеров с исходным кодом. Если захочется изучить новый виджет — в первую очередь ищи там. Также есть замечательная книга «WxPython in action» отавторов Noel Rappin и Robin Dunn. Ссылку для скачивания можно найти на боковом выносе. Написана она на английском, но если погуглить, то можно найти русский перевод нескольких глав (я нашел главы 1,2,3,11,14). Для начального знакомства с wxPython вполне хватит первых трех. Я вскрыл только верхушку айсберга программирования GUI на Python’e, все остальное остается за тобой. Удачи!

Дистрибутивы Linux

Posted by admin On Август - 9 - 2009

Представляем вашему внимаю полный список дистрибутивов линукса, все ссылки кликабельны: