Раздел: Документация
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
|