8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 57 58 59 60 61 62 63 ... 102

рекомендую). Если же на атакованном компьютере этой библиотеки нет (а ЧСрВь не может позволить себе роскошь тащить ее за собой), мы будем ЛейгтВоцать так: открываем сокет в сыром режиме, связываем его с прослушиваемым Нц терфейсом, переводим последний в «неразборчивый» (promiscuous) режим, в ко. тором сокет будет получать все проходящие мимо него пакеты, и... собственно читаем их в свое удовольствие.

В различных операционных системах этот механизм реализуется по-разному В LINUX, начиная с версии 2.2, появились поддержка пакетных сокетов, пред назначенных для взаимодействия с сетью на уровне драйверов и создаваемых вызовом socket (PFPACKET. int type, int protocol), где type может принимать значения SOCK RAW («сырой» сокет) или SOCK DGRAM («сухой» сокет с удаленными служебными заголовками). Вызов if г. if r f lags = IFFPROMISC; ioctl (s, SIOCGIFFLAGS, ifr) активирует неразборчивый режим, где ifr — интерфейс, к которому сокет был привязан сразу после его создания (подробнее об этом можно прочитать в статье «Анализатор сетевого трафика», опубликованной в октябрьском номере журнала «Системный Администратор» за 2002 год).

Под BSD можно открыть устройство "/dev/bpf" и после его перевода в неразборчивый режим — ioctl (fd. BIOCPROMISC. 0) - слушать пролетающий мимо узла трафик. В Solarise все осуществляется аналогично, только IOCTL-коды немного другие и устройство называется не bpf, a hme. Аналогичным образом ведет себя и SUNOS, где для достижения желаемого результата приходится отрывать устройство nit.

Короче говоря, эта тема выжата досуха и никому уже не интересна. Замечательное руководство но программированию снифферов (правда, на французском языке) можно найти на http://www.security-labs.org/index.php3?page=135, а на http:// packetstormsecurity.org/sniffers/ выложено множество разнообразных «грабителей» трафика в исходных текстах. Наконец, по адресам http://athena.wsu.ru/infonets/ Docs/sniffer.txt и http://cvalka.net/read.php?file=32&dir=programming вас ждет пара толковых статей о снифферах на русском языке. Словом, на недостаток информации жаловаться не приходится. Правда, остается неясным — как примирить весь этот зоопарк и удержать в голове специфические особенности каждой из операционных систем?

Подавляющее большинство статей, с которыми мне приходилось встречаться-описывали лишь одну, ну максимум две операционные системы, совершенно игнорируя существование остальных. Приходилось открывать несколько ста тей и попеременно мотаться между ними на предмет выяснения: а иод LINU это как? А под BSD? А под Solaris? От этого в голове образовывался такой № вардак, что от прочитанного материала не оставалась и следа, а компилируй мый код содержал огромное количество фатальных ошибок, даже и не ныта ко м пи л и ро ваться.

Чтобы не мучить читателя сводными таблицами (от которых больше вреда, пользы), ниже приводится вполне работоспособная функция абстракции,1 готавливающая сокет (дескриптор устройства) к работе и поддерживаю большое количество различных операционных систем, как-то: SUN OS, LIN


опиваем соединение с удаленным узлом 189

yaHatw------ .

BSD, IRIX и Solaris (листинг 5.5). Полный исходный текст сниффера мож-

FfeL тт отсюда: httjDV/packetstormserarity.org

цо сТ<

«г 5 5. Создание сырого сокета (дескриптора) и перевод его в неразборчивый режим Листи»"

heriiet Packet Sniffer GreedyDog Version 1.30

Shadow Penguin Security (http://shadowpenguin.backsection.net) Th\ten by UNYUN (unewn4th@jsa.net)

#ifdef SUN0S4 /*.......-< SUN 0S4 >-----------*/

jtefine NIT DEV"/dev/nit" */

Idefine DEFAULT NIC"leO"*/

Idefine CHUNKS I2E4096*/

#endif

#,fdef LINUX /*--------< LINUX >------........*/

fttefme NIT DEV

fdefine DEFAULT NIC"ethO"*/

#define CHUNKS 12E32000*/

lendi f

lifdef FREEBSD /*--------< FreeBSD >----------*/

fdefine NITJDEV"/dev/bpf" */

♦define DEFAUITNIC"edO"*/

fdefme CHUNKS1ZE32000*/

fendif

#ifdef IRIX /*-----------< IRIX >--------------*/

#define NIT DEV fttefine DEFAULTJIIC

tffefine CHUNKSIZE60000*/

define ETHERHDRPADRAW HDRPADtsizeof(struct ether header))

lendif

*ifdef SOLARIS /*--------< Solaris >---.......*/

Wine NIT DEV"/dev/hme" */

**fine DEFAULT NIC wefin fendif #def #def

**fine CHUNKSIZE32768

if

*defl"e SJ3EBUG*/

14*/

*7 */

fcfine size of ethhdr

С" L0GFILE/snif.log

s e tmplog d:r»/tmp/»

uct conn list{

COm-lisl *next p:

sourceIP[16].destIP[163: j. Signed longsourcePort.destPort:

StrUct

*ifn ConnJist *cl: struct conn list *org cl: *f SOLARIS

nt strgetmsgifd. ctlp. flagsp. caller) Rt fd:

tru« strbuf *ctlp;

Продолжение


Листинг 5.5 (продолжение)

int *flagsp: char *caller: {

int rc:

static char errmsg[80]:

*flagsp = 0:

if ((rc=getmsg(fd.ctip.NULL.flagsp))<0) return(-2): if (alarm(0)<0) return(-3):

if ((rc&(M0RECTLM0REDATA))==(M0RLCrLM0REDATA)) retLirn(-4);

if (rc&MORECTL) return(-5):

if (rc&MOREDATA) return(-6):

if (ctlp->len<sizeof(long)) return(-7):

return(O):

}

#endif

i nt setn i c promi sc(n i t dev.ni c name) char *nit dev: char *nic jiame: {

int sock: struct ifreq f:

#ifdef SUN0S4

struct strioctl si: struct timeval timeout:

ujnt chunksize = CHUNKSIZE: u long if flags - NI PROMISC:

if ((sock = openCnitdev. 0 RD0NLY)) < 0)return(-l):

if (ioctKsock. I SRD0PT. (char *)RMSGD) <0) return(-2): si.ic timout = INFTIM:

if (ioctKsock. I PUSH. "nbuf") < 0!return(-3):

timeout.tv sec = 1: timeout.tv usec = 0: si.ic cmd = NlOCSIME: si.icjen = sizeof(timeout): si.ic dp = (char *)&timeout; if (ioctKsock. I STR. (char *;&s:) < 0) return(-4):

si.ic cmd = NIOCSCHUNIK: si.icjen - sizeof(chunksize): sT.1c dp = (char *)&chunksize:

if (ioctKsock. I SfR. (char *)&si) < 0)return(-5):

strncpy(f.ifrname. nicjiame. sizeoftf ifr name)):

f.ifr name[sizeof(f.ifrjiame) - 1] = \0: si.ic cmd = N10CBIND:

si.icjen = sizeof(f): si.ic dp = (char *)&f:

if (ioctKsock. I STR. (char *)&si) < 0)return(-6):

si.ic cmd = NICCSFLAGS: si.icjen = sizeoftif Jlags): si.ic dp - (char *)&if flags:

if (ioctKsock. ISTR. (char *)&si) < 0) return(-Z):

if (ioctKsock. I FLUSH. (char *)FLUSHR) < 0) return(-8);



0 ... 57 58 59 60 61 62 63 ... 102