Раздел: Документация
0 ... 58 59 60 61 62 63 64 ... 102 надпиваем соединение с удаленным узлом 191 l,fdef LINUX ,f ((scck=socket(AFjNEi.S0CK PACKEr.768))<0) return(-l): strcpy(f.ifr name. ncjiame):if (ioct"(sock.SIOCGIFFLAGS.&f)<0) return(-2): f.ifrjags = IFF PROMISC: if (ioctl(sock.S.OCSIFFLAGS.&f)<0) return(-3): lend if f,fdef FREEBSD cnar device[12]: int n=0: struct ЬрГ version bv: unsigned int size: do{ sprir.tf (device."%s%6".nit dcv.n++): sock =open(device.0 RD0NLY): } while(sock<0 && errno==EBUSV): if(ioctl(sock.BIOCVERSION.(char *)&bv)<0) return(-2): if((bv.bvjnajor!=BPF MAJOR VERSION) (bv.bv ninor<BPF MiN0R VERS10N))retum -3: strncpytf.ifr name.nic name.sizeof(f ifr name)): if(ioctl(sock.BIOCSETli.:char *)&f)<0) return-4: ioctUsock.3I0CPR0MISC.NLLL):if(ioct 1 (sock.BIOCGBLEN. (char *)&size)<0)return-5: ?endif hfdef IRIX struct sockaddr raw sr: struct snoop filter s*: int size=CHUNKSIZE.on=l: char interface: if((sock=socket(PF RAW.S0CK RAW. RAWP ROTO SNC0P) )<0) return -1: sr.sr family = AF RAW: sr.sr port = 0: if (!(interface=(char *)getenv("inte rface"))) neraset(sr.sr ifname.0.sizeof(sr.sr i f name)): else strncpy(sr.sr ifname.interface. sizeof(sr.sr ifname)): if(bind(sock.&sr.sizeof(sr))0) return(-2): nemset((char *)&sf.O.sizeof(sf)): if(ioct 1 (sock.S10CADJ1SN0OP.&s f)< 0) r <?t u rn (- 3 i: setsockopt (sock. S0L S(XXET. SO RCVBUF .(cha г *)&s i ze.si zeof(si ze)): if(ioctl(sock.SI0CSN0OPING.&on)<0) r«turn(-4i: tenth f *ifdef SOLARIS long buf[CHl)NKSIZE]: dl attach req t ar: dl j>romiscon req t pr: struct strioctl si: union Dt primiti-ves *dp: dl bind req t bind req: struct strbuf c: int flags: if ((sock=open(mt dev.2))<0) return (-1); ar.dl primitive=DL ATTACH REO: ar.dl ppa-0: c.maxlen=0: c.len=sizeof(dl attacn rcq t): c.buf=(char *)&ar: if (putmsg(sock.8c.NULL.0)<C) return (-2): c.maxlen=CHUNKSIZE: c.len=0: c.buf-(-void *:buf: strgetmsgtsock.&c.&flags."dlokack"): dp=(union DL primitives *)c.buf: if (dp->dl primitive != 0L 0K ACK) return(-3): pr.dl primUive=DL PR0MISCON RtO: pr dl Jeve"=DL PRCMISC PHYS: c.maxlen = 0: c.ien=sizeof(dl promiscon req t): c.buf=(char *)&pr: Продолжение i3> Листинг 5.5 (продолжение) if (putmsg(sock.&c.NULL.O)<0) return(-4): c.maxlen=CHUNKSIZE: c.len=0: c.buf=(void *)buf: strgetmsg(sock.&c.&flags."dlokack"): dp=(union DLpritnitives *)c.buf; if (dp->dl primitive !- D1. 0K ACK) return(-5): bind req.dl primi ti ve=DL BIND REQ: bind req.dl sap=0x800: bind req.dl max coni nd=0: bind req.dl service rriode=DL CLDLS: bind req.dl conn mgmt=0; bind req.dl xidtest flg=0: c.maxlen=0: c.1en=sizeof(dl bind req t): c.buf=(char *)&bind req: if (putmsg(seek.&c.NULL.ОКО) return(-6): c.maxlen=CHUNKSIZE: c.len=0: c.buf=(void *)buf: strgetmsg(sock.&c.&flags."dlbindack")-. dp=(union DL primitives *)c.buf: if (dp->dl primitive !- DL BIND ACK) return(-7): si.ic cmd=DLIOCRAW; si.ic timout--l: si.ic len=0; si.ic dp=NULL: if (ioctKsock. ISTR. &si)<0) retum(-B): if (ioctl(sock,l FLUSH.FLuSHR)<0) retum(-9): #endif return(sock): } Совсем иная ситуация складывается с Windows NT. Пакетных сокетов она не поддерживает, с сетевым драйвером напрямую работать не позволяет. Точнее, позволяет, но с очень большими предосторожностями и не без плясок с бубном (если нет бубна, на худой конец сойдет и обыкновенный оцинкованный таз, подробное изложение ритуала можно найти у Коберниченко в «Недокументированных возможностях Windows NT»). И хотя пакетных снифферов иод NT существует огромное количество (один из которых даже входит в DDK), все они требуют обязательной установки специального драйвера, так как корректная работа с транспортом в NT возможна только на уровне ядра. Может ли червь притащить с собой такой драйвер и динамически загрузить его в систему? Ну. в0° " ще-то может, только это будет крайне громоздкое и неэлегантное решение. В Windows 2000/ХР все гораздо проще. Там достаточно создать сырой сонет (в Windows 2000/ХР наконец-то появилась поддержка сырых сокетов!). "ове сить его на прослушиваемый интерфейс н, сделав сокету bind, перевести п°С/ дний в неразборчивый режим, сказав WSAIoctl (rawsocket. SIORCVALL, &optv sizeof (optval). 0.0.&N.0.0)), где optval - переменная типа DWORD с единицей вн> ри, а N — количество возращенных функцией байт. Впервые исходный текст такого сииффера был опубликован в шестом н°,мд журнала #29А, затем его передрал ZOmbie, переложивший ассемблерный на интернациональный программистский язык Си++ (странно, а почему "с и унаследовавший все ляпы оригинала. Ниже приведен его ключевой фраГМ с моими комментариями (листинг 5.6.), а полный исходный текст содер*1 в файле sniffer.c. Другой источник вдохновления — демонстрационный пр1Ь IPHDRINC, входящий в состав Platform SDK 2000. Рекомендую. ---NT- иваем соединение с удаленным узлом 193 устэнавл!!------- — —— г 5 6. ключевой фрагмент кода пакетного sniffera ЛИС™ П0Д windows 2000/ХР „созваенс-ро* сонет (((raw socket = socket(AFJNET. S0CK RAW. IPPROTOJP)) = -1) return -1: // вот тут некоторые руководства утверждают, то сырому сокету надо дать // атрибут IP HDRINCL. дать-то. конечно, можно, но ведь можно и не :авать! // флаг IP HDR1NCL сообщает системе, что аплеуха хочет сама формирсзать // IP заголовок отправляемых пакетов, а принятые пакеты ей отдаются с IP // заголовком в любом случае, подробности в PlatformSDK->TCP/IP Raw Sockets//if (setsockopt(raw socket. IPPROTOJP. IP HDRINCL. Soptval. sizeof(optval))== -D... ll перечисляем все интерфейсы (то есть адреса IP-адресов всех шлюзов, что // есть на компьютере, при ррр-подключении к интернету обычно имеется II всего один IP-адрес, назначенный DHCP сервером провайдера, однакс II в локальной сети это не так f ((zzz WSAIoctl(raw socket. SIO ADDRESSJ.IST QUERY. 0. 0. addrlist. sizeof(addrlist). m. 0. 0)) == SOCKFTJRROR) return -1: II теперь мы должны сделать Dind на все интерфейсы, выделив каждый е свой II поток (весь сокечы - блокируемые), однако в данном демонстрационен // примере слушается лишь IP первого попавшегося под руку интерфейса addr.smjamily - AFJNET: addr.sm addr = ((struct sockaddr in*) llist->Address[0].lpSockaddr)->sin addr: if (bind(raw socket. (struct sockaddr*) &addr. sizeof(addr))=SCXKF ERROR) return -1: tfdefine SIO RCVALL OxQBOOOOOI " сообщаем системе, что мы хотим получат все пакеты, проходящие мшо нее !f (zzz=WSAIoct":(raw socket.SI0 RCVALL.&ODtval.sizeof(optval).O.0.&\.0.0)) return -1: " "олучаек все пакет, приходящие на данный интерфейс whiled) { 1f ((len = recv(raw socket. buf. sizeof(bjf). 0)) < 1) return -1: компилировав sniffer.c, запустите его па атакуемом узле с правами админи-стратора и отправьте с узла атакующего несколько TCP/LDP-пакетов, которые пропускает брандмаузер. Смотрите, червь исправно вылавливает их! При-Чем никаких открытых портов па атакуемом компьютере не добавляется и факт ПеРехвата не фиксируется ни мониторами, ни локальными брандмауэрами. Ля Разоблачения пассивных слушателей были разработаныспециальиые мето-f1 (краткое описание которых можно найти, например, здесь: http://www.ro- rtgraham.com/pubs/snifting-faq.html), однако практической пользы от них ника- 7 3« 976 0 ... 58 59 60 61 62 63 64 ... 102
|