2009/08/04

SocksiPy - надеваем носки правильно

SocksiPy - небольшой модуль, призванный решить задачу подключения через SOCKS прокси, которая не реализована в стандартных библиотеках типа urllib и urllib2. Модуль позволяет работать с SOCKS четвертой и пятой версий, а также и с HTTP прокси, поддерживающими метод CONNECT. После установки коннекта поведение объекта не отличается от простого сокета. Пример кода:
import socks
s = socks.socksocket()
s.setproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")
s.connect(("www.example.com",80))
Также существует возможность перезаписи стандатного метода сокета так, чтобы все свежесозданные сокеты работали через прокси. Удобно, если в своей программе нужно пустить весь трафик через прокси:
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")
socket.socket = socks.socksocket
urllib.urlopen("http://ivinside.blogspot.com/")

2009/08/02

Руткиты -3 кольца

Вот здесь появились слайды (в количестве 85 штук) с презентации "Introducing Ring -3 Rootkits", которая проходила в рамках Black Hat USA 2009. До чего хитроумные хакеры дошли! Исполняют свои коды на чипсетах... Соотвественно, если к вам попадет такой руткит, то банальная переустановка ОС уже не поможет. На чипсеты Q35 от Intel руткит загружается через Intel Active Management Technology (AMT). На этих чипсетах установлен процессор типа ARC4 с RISC архитектурой, под который потребуется соотвествующий компилятор. Для последних чипсетов типа Q45 память под AMT дополнительно защищена, так что данные руткиты уже неработоспособны. Читайте подробности в презентации и повышайте квалификацию!

И да, собственно материалы из Лас-Вегаса доступны тут. Очень много интересного.

2009/07/31

Samurai WTF

Вышла следующая девелоп версия Samurai WTF - платформы для аудита веб-приложений.
Ченджлог:
Installed Cewl from dijininja.org -- Kevin Johnson
Updated Ubunutu patches as of July 23, 2009 -- Frank DiMaggio
Updated w3af from SVN as of July 25, 2009 -- Kevin Johnson
Fixed sqlninja.sh -- Frank DiMaggio
Fixed sqlmap.sh to include the -h -- Kevin Johnson for Tim Medin
Updated sqlmap to 0.7 -- Frank DiMaggio and Kevin Johnson
Updated Firefox add-on Hackbar -- Kevin Johnson
Updated Firefox add-on XSS Me -- Kevin Johnson
Updated Firefox add-on Header Spy -- Kevin Johnson
Updated Firefox add-on User Agent Switcher -- Kevin Johnson
Updated jBroFuzz to 1.4 -- Kevin Johnson
Upgrade nmap to 5.0 -- Kevin Johnson
Installed Durzosploit from SVN as of July 18, 2009 -- Kevin Johnson
Installed BrowserRider from SVN as of July 18, 2009 -- Frank DiMaggio
Added Jason Wood's username generator scripts -- Kevin Johnson
Updated MaltegoCE to 2.02 -- Frank DiMaggio
Added Laudanum Files -- Kevin Johnson
Added GPScan.rb from dijininja.org -- Kevin Johnson
Added HowTo videos from Pauldotcom -- Kevin Johnson
Картинка:

2009/07/24

re - регулярные выражения в python

Осознание регулярных выражений далось мне не сразу, но если поэкспериментировать, то всё будет ок. Не буду затрагивать аспекты, которые даются в книгах, а расскажу лишь про сложности, которые возникли у меня.

Про квантификацию: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:
<a href='www.site.com'>GSOM</a> <b>пум-пу-рум</b>
Если применить к этому фрагменту выражение <a href='(.+)'> с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак ">" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "<a href='(.+?)'>", то получим то, что надо: www.site.com

Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
import urllib2, re

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)

for url in re.findall(r'<class="r"><href="(.+?)">')
Итак регулярное выражение '<class="r"><href="(.+?)">' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на <h3 class=r<>a href="http://site.com" target=_blank class=l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.

2009/07/21

urllib2 - начало

urllib2 - библиотечка, с помощью которой удобно обрабатывать веб-странички, заполнять веб формы, обрабатывать куки, соединяться через прокси и прочее.

Простейший пример:
import urllib2
response = urllib2.urlopen('http://ivinside.blogspot.com/')
print response.read()
Эта программа показывает на экран html-кодесы данного блога. Но не всегда можно получить содержимое странички, например, результаты поиска в Google таким образом не посмотришь, ибо он фильтрует по строке User-Agent всякие нежелательные приложения, в питоне по умолчанию она что-то типа "Python-urllib/2.5".

С помощью следующего кода выводим на экран результат поиска в гугле по запросу "ivinside.blogspot.com", прикидываясь Internet Explorer под Vista:
import urllib2

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)
print response.read()
Ну, и напоследок сегодня, как заполнять веб-формы. Возьму для примера веб-сервис whois. Как посмотреть какие параметры при этом передаются в запросе POST? Я смотрю плагином Live HTTP headers для Firefox и считаю его приемлемым. Итак, заполняем первую форму вручную, нажимаем кнопочку и смотрим в окно плагина. Там, среди всего прочего, будут интересующие нас параметры:
Host=whois.ripn.net&Whois=test.ru
Добавим их как параметры функции, предварительно закодировав, как того требует спецификация:
import urllib
import urllib2

headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
values = {'Host' : 'whois.ripn.net', 'Whois' : 'test.ru'}
data = urllib.urlencode(values)
req = urllib2.Request('http://www.ripn.net:8082/nic/whois/whois.cgi', data, headers)
response = urllib2.urlopen(req)
print response.read()
Ок, получили страничку, где содержится информация про домен test.ru
В следующей заметке, наверно, расскажу про регулярные выражения, чтобы из полученных страничек можно было извлекать нужные данные.

2009/07/11

Python для чайников и профи

Всем тем, кто не в теме змеиного языка и не знает, стоит ли его вообще изучать могу порекомендовать ознакомиться с соотвествующей статьей в Абсурдопедии. Если вам она показалось забавной, то не всё потеряно и можно даже попробовать ознакомиться со статьей из Википедии.

Первая книга, по которой я начал изучать python, - Язык программирования Python. В авторах значится и сам создатель языка, что дает некую надежду на адекватность книги. Действительно, прочитав первые 100 страниц, я отложил все эти чтения, взялся за практику и открывал книгу уже по мере необходимости.

Далее, можно взять на заметку лекции г-на Сузи, в которых кратко изложена суть и минимум мути. В качестве справочника использую pydoc.org, поиск по классам и методам обычно дает результаты.

Вот недавно заказал многообещающую книжку Изучаем Python, 3-е издание, с нетерпением жду доставки. Очень хотелось бы ознакомиться с Gray Hat Python: Python Programming for Hackers and Reverse Engineers, но с амазоном я, к сожалению, не дружу.

2009/07/07

И, да!..

Идея вести тематический блог у меня зародилась давно, ибо блог в стиле ЖЖ изжил себя. Это уже и так потятно, что отмотав записи на пару лет назад, можно понять какое было безобразие.

Итак, пришло время для новых концепций. Этот блог будет исключительно технической направленности, с основными тэгами "python", "security" и прочими смежными. По поводу первого буду конспектировать свои достижения (чтобы не забыть), а по поводу второго – в силу своей специфики, так сказать.

К слову, название блога взято из дзена Питона, а вот над оформлением придется ещё поработать. В любом случае
>>> print 'hello world & welcome!'