Curl поможет управлять данными, размещенными в Web
В данной статье рассматривается бесплатный инструмент Curl, с помощью которого можно передавать и принимать Web-страницы из командной строки. Благодаря Curl легко автоматизировать многие операции информационной защиты и администрирования, например извлечь Web-страницу для анализа или загрузить исправление для системы безопасности из Web.
Установка Curl
Curl входит в состав многих дистрибутивов Unix. Имеются двоичные файлы и исходные тексты для большинства других операционных систем. Даже программисты, работающие с открытым PHP, могут использовать Curl для безопасного доступа к Web-контенту непосредственно из PHP-сценариев.
Для работы Curl с Web-узлами Secure Sockets Layer (SSL) необходим пакет OpenSSL. Существуют две версии Curl: одна с SSL, другая без SSL. Рекомендую первую, поскольку SSL надежно защищает данные.
Прежде чем использовать Curl с функциями SSL, необходимо загрузить из сети и отдельно установить пакет OpenSSL. Двоичные файлы OpenSSL for Windows можно загрузить с сайта проекта GnuWin32 SourceForge по адресу http://gnuwin32.sourceforge.net/packages/openssl.htm. На этом сайте имеется и много других полезных инструментов, портированных в Windows.
Следует загрузить и установить пакет OpenSSL, затем скопировать два DLL-файла в каталог system32:
copy "C:Program FilesGnuWin32 binlibeay32.dll" %windir%system32 copy "C:Program FilesGnuWin32 binlibssl32.dll" %windir%system32
После этого можно установить Curl. SSL-совместимые двоичные файлы Curl для Windows можно найти по адресу http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi. Новейшая версия, curl 7.15.0, находится в win32-ssl-sspi.zip, который содержит файл curl.exe и документацию.
После установки Curl следует убедиться в его работоспособности, введя команду
curl http://isc.sans.org/ infocon.txt
Если на экране появится слово, обозначающее цвет (например, green), значит, Curl работает. В этом простом примере Curl извлекает содержание Infocon из Web-узла Internet Storm Center института SANS. Green означает, что Internet функционирует нормально и серьезных угроз не обнаружено. Если же вместо green на экране появляются слова yellow, orange или red, то отложите эту статью и посетите сайт http://isc.sans.org, чтобы узнать о состояниях повышенной опасности в Internet. В случае ошибки необходимо проверить правильность установки Curl.
В сущности, Curl извлекает Web-страницу, а затем выдает исходный текст HTML страницы на консоль. Однако возможности утилиты шире. Curl располагает встроенной функцией проверки ошибок. Например, команда
curl http://noserverhere
выдает ошибку Curl: (6) Could not resolve host: noserverhere; Host not found. Коды ошибок можно использовать в сценариях, чтобы проверить доступность Web-страницы или реакцию Web-сервера. Например, если использовать Curl для ежедневного извлечения Web-страницы, в частности суточной статистики Web-узла, можно дополнить сценарий исходным текстом, отыскивающим коды ошибок. Если Curl выдает код ошибки Curl: (7) couldn?t connect to host, то можно немедленно передать предупреждение или отправить сообщение по электронной почте.
Извлечение шифрованных данных
Одно из важнейших достоинств Curl — совместимость с SSL. Запрошенные страницы HTTPS передаются через сеть в зашифрованном виде, а затем Curl выводит на экран восстановленный текст. Кроме того, Curl проверяет сертификаты — дату завершения действия сертификата, соответствие имени хост-компьютера хост-имени в сертификате и уровень доверия к корневому сертификату — и предупреждает, если сертификат некорректен. Параметр -cacert позволяет указать определенный файл сертификата. Проверка сертификатов отменяется с помощью параметра -k. Альтернативный подход — использовать параметр -insecure.
Не только для WWW
Возможности Curl шире простой пересылки файлов через Internet. С помощью Curl можно быстро получить список каталогов FTP-сайта:
curl ftp://myftpsite
Чтобы увидеть подкаталоги сайта, следует ввести команду
curl ftp://myftpsite/subdir/
Для загрузки файла из сети достаточно указать в URL имя файла. В следующем примере файл с именем readme.txt загружается прямо из командной строки и отображается на экране:
curl ftp://ftp.microsoft.com/ deskapps/games/readme.txt
Нередко проще подготовить сценарий с Curl для ввода FTP-файлов, чем использовать команду FTP интерактивно.
По умолчанию данные выводятся непосредственно на консоль, но их можно перенаправить в файл с помощью параметров -o и -O. Чтобы получить страницу и сохранить ее на диске, следует указать параметр -o. Параметр -O сохраняет полученную страницу в локальном файле, и Curl извлекает имя удаленного документа. Если в URL имя файла не указано, то эта операция закончится неудачей. Если использовать Curl для передачи на Web-узел запроса без имени файла, но нужно сохранить результат в файле, можно указать имя файла в командной строке, например:
curl -o whoisOutputFile http://www.arin.net/whois/
Аутентификация
Curl обеспечивает методы аутентификации Basic, Digest и интегрированный. На большинстве сайтов доступ к страницам с аутентификацией на базе форм можно получить с использованием функций отправки Curl, что будет продемонстрировано чуть ниже. Это значит, что можно передать данные формы, в частности имя пользователя и пароль, на удаленный Web-узел, на Web-странице которого выводится запрос на ввод информации. Для пересылки учетных данных можно использовать параметр -u или вставить их в URL, что традиционно делается в FTP, например:
curl ftp://username: password@myhtmlsite
С помощью Curl приемы, заимствованные из FTP, можно перенести в HTTP, как в следующем примере:
curl http://username:password @myhtmlsite/default.htm
Curl также обеспечивает доступ к Web-страницам через proxy-сервер. Поэтому Curl можно настроить на использование proxy-сервера для аутентификации в режимах Basic, Digest и NTLM.
Читайте документацию
В одной статье трудно охватить все многочисленные функции Curl, среди которых и загрузка файлов на сервер (-T), и просмотр только информации в заголовке HTTP (-I), и просмотр всех данных в детальном режиме (-V), и скрытый вывод (-s). Я рекомендую более подробно ознакомиться с функциями Curl в руководстве, опубликованном по адресу http://curl.haxx.se/docs.
Пример использования Curl
Ознакомившись с основами Curl, рассмотрим простой пример извлечения данных из Web-узла при заданных входных данных. Построим простой инструмент Whois, который демонстрирует простоту и удобство применения Curl и процедуру отправки данных на Web-узел с использованием параметра -d. В данном примере Curl посылает IP-адрес на Web-узел Arin Whois, а затем извлекает результаты из этого сайта. Whois отыскивает информацию о владельце IP-адреса.
Перед началом работы важно исследовать Web-узел, так как в исходном тексте каждого сайта есть свои особенности, и Curl не всегда одинаково работает с любыми сайтами. Предварительное посещение сайта позволяет собрать необходимую информацию для работы Curl. В данном примере я воспользовался браузером, чтобы посетить Web-узел http://www.arin.net/whois/, и обратил внимание, что на сайте имеется единственное поле ввода данных, в котором посетители указывают интересующий их IP-адрес. Необходимо получить детали этого поля, которое представляет собой часть Web-формы. В данном примере используется Perl-сценарий formfind.pl (http://cool.haxx.se/cvs.cgi/curl/perl/contrib/ formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup). Сценарий Formfind.pl преобразует данные формы в удобные выходные результаты и упрощает ручной поиск данных в HTML. Конечно, для запуска Formfind на компьютере должен быть развернут Perl. Хороший пакет Win32 Perl можно заказать на сайте ActiveState ActivePerl по адресу http://www.activestate.com.
Рассмотрим пример более подробно. Во-первых, обратимся к Web-узлу, содержащему форму, которая запрашивает информацию:
curl -o whoisOutputFile http://www.arin.net/whois/
Эта команда извлекает страницу Whois из http://www.arin.net и сохраняет ее в текстовом файле whoisOutputFile, который содержит исходный текст HTML, воспроизводимый браузером при посещении сайта.
Затем необходимо найти и выделить данные формы:
./formfind.pl < whoisOutputFile
Formfind выдает переменные формы и их возможные величины. В данном примере выходные результаты имеют довольно простой вид (см. экран 1).
Следует обратить внимание на данные формы Input с именем queryinput. Это текстовое поле, в которое Curl должен послать искомый IP-адрес. Конкретный IP-адрес не имеет значения — в данном примере использовался адрес Microsoft. С помощью параметра -d искомый IP-адрес пересылается в поле queryinput:
curl -d "queryinput= 207.46.133.140" http://ws.arin.net/cgibin/ whois.pl
Команда Curl с параметром -d отыскивает данные в форме, в данном случае queryinput, которые представляют собой искомый IP-адрес. При этом меняется целевой адрес; форма должна передавать данные на новый URL, который представляет сценарий whois.pl. Новый целевой адрес можно увидеть на выходе formfind на экране 1.
В данном примере также получен исходный текст HTML ответа Whois, но он скрыт группой тэгов HTML. По умолчанию сообщение о статусе Curl показывает размер документа, процент выполнения и скорость пересылки. Выходные данные можно немного расчистить и отфильтровать имя организации, которой принадлежит IP-адрес. Статус Curl можно блокировать с помощью параметра -s. Команду следует выполнять через grep, чтобы получить только OrgName:
curl -s -d "queryinput= 207.46.133.140" http://ws.arin.net/cgibin/ whois.pl | grep OrgName
В данном примере выходные результаты показывают, что OrgName — Microsoft Corp.
И наконец, не рекомендуется жестко задавать IP-адрес, поэтому запрос следует поместить внутрь простого сценария с именем arin.bat:
@echo off curl -k -s -d "queryinput= %1" http://ws.arin.net/cgibin/ whois.pl | grep OrgName
На экране 2 показаны выходные результаты, полученные при запуске сценария из командной строки.
Простота использования Curl
В данной статье показано, как Curl извлекает и анализирует данные с удаленного Web-узла, и позволяет просматривать Web-данные и управлять ими из командной строки.
Curl располагает богатым набором параметров командной строки. С помощью команды -help можно быстро получить справку по конкретным параметрам. Например, с помощью
curl -help | grep proxy
можно найти все параметры, относящиеся к работе с proxy-сервером.
Несмотря на простоту использования, инструмент Curl — не всегда оптимальный выбор. Например, чтобы исследовать Web-узел и извлечь несколько файлов, можно воспользоваться запускаемой из командной строки Internet-утилитой захвата файлов wget, которая поддерживает универсальные символы. Более подробно Wget будет рассмотрена в следующий раз.
Джеф Феллинг - Директор по информационной безопасности компании Quantive. Автор книги IT Administrator?s Top 10 Introductory Scripts for Windows (издательство Charles River Media). jeff@blackstatic.com