Uffff, mi-ai dat de citit, nu gluma :)

> Ciprian BADESCU wrote:
>> Chestia asta ce ai spus-o cu SYN-ul ma pune pe ganduri. E chiar asha
>> periculoasa ? Din man-ul de la ipfw am citit:
>>
>>   frag    Matches packets that are fragments and not the first fragment
>> of
>>              an IP datagram. Note that these packets will not have the
>> next
>>              protocol header (e.g. TCP, UDP) so options that look into
>> these
>>              headers cannot match.
>>
>
> Singura metoda concreta de a diferentia corect care este primul fragment
> dintr-o serie de fragmente ce compun un pachet IP, este ca acesta are
> headerul de frag_offset setat pe zero, lucru care nu poate fi evitat de
> catre un atacator. In mod normal, ar trebui sa aiba si MF setat, deci pe
> 1. Ultimul fragment va avea MF resetat, pe zero.
>
> Deci, determinarea primului fragment din fragmentarea unui pachet IP nu
> are nici o legatura cu flag-ul de SYN din TCP. SYN e un flag din TCP,
> iar TCP e un protocol incapsulat de IP. Fragmentarea este un procedeu
> asigurat de catre protocolul IP.
>
> De ce ipfw refuza fragmente mai mici de 4 bytes (32 de biti)? Pentru ca
> in primii 32 de biti, in a doua jumatate a lor, se gaseste un camp numit
> "total length", care trebuie protejat la suprascriere.
>
> Daca cineva este capabil sa suprascrie campul de total length cu pachete
> fragment ulterioare, are toate sansele sa creeze un "buffer overflow" pe
> stiva. Un procedeu similar merge impotriva unei masini Windows.
>
> Nu am analizat situatia in cazul IHL.
>
> Am sa redau diagrama IP:
>      0                   1                   2                   3
>      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |Version|  IHL  |Type of Service|          Total Length         |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |         Identification        |Flags|      Fragment Offset    |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |  Time to Live |    Protocol   |         Header Checksum       |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |                       Source Address                          |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |                    Destination Address                        |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>     |                    Options                    |    Padding    |
>     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> Dupa cum se vede, faptul ca flag-ul "frag" din ipfw nu vede si
> fragmentele cu offset 0 aparent pune probleme.
> In realitate aceasta nu
> inseamna decat ca pentru a porni o fragmentare, nu pot sa trimit de
> capul meu un pachet cu offset zero, ci trebuie sa determin host-ul
> destinatie sa cerseasca dupa fragmentare. Acest lucru il pot obtine
> trimitand pachete mai mari decat se asteapta el. De exemplu peste 576 de
> octeti.
>
> Exemplu: ma pot conecta la SMTP, dar nu la 22. Ma conectez la SMTP,
> moment in care in ACL se introduce un keep_state care imi da voie sa
> continui cu transmisul de pachete. Trimit pachete mari, astfel incat
> destinatia va cersi fragmentare. In momentul in care cerseste singur
> dupa fragmentare, in keep_state mi se permite sa-i raspund cu pachete.
>
> Pot trimite chiar si un pachet SYN mare.
>
> Pe de alta parte, daca ACL-ul nu este default to deny, asta inseamna ca
> nimic nu va opri un fragment cu offset 0.

Sa incerc sa pun problema practic:
Deci un fragment cu offset 0 nu e preluat de regula cu "frag". Si nefiind
un pachet TCP/UDP complet, nici de alte reguli tcp/upd.

Prin urmare ar putea trece de o regula:

$ipfw deny tcp from any to B dst port xxx.

si ar ajunge la

$ipfw allow ip from any to B

deci la destinatie.

Deci ar pune probleme unei politici gen: x servicii interzise, retul permis.
Este vre-o problema pentru politica : y servicii permise, restul interzis
(aduca default deny) ?

>
> Oricum, dupa cum se vede si din structura unui pachet IP, nici nu am
> nevoie sa suprascriu primii 32 de biti din pachet, si nici sa suprascriu
> incepand de la 0. Este suficient sa suprascriu header-ul in portiunea de
> fragment_offset si sa pun zero acolo. De aici mai departe, pot
> suprascrie orice valoare din header-ul protocolului incapsulat, de
> exemplu din TCP. Cel mai mic pachet SYN TCP are 20 de octeti.
>
> Acesta este si motivul pentru care pf din OpenBSD a preferat sa
> implementeze procedura de asamblare a pachetelor in mod independent de
> stiva. Prin scrub, pf are grija sa ia in considerare toate
> posibilitatile, si sa nu suprascrie fragmente.
>
> Revenind la oile noastre, ce impact are allow frag from any to any? Pai
> are impactul ca atunci cand se foloseste un firewall cu inspectie de
> stare, cu keep-state, permite unei persoane din exterior sa trimita
> fragmente si in afara tabelelor de stare din IPFW.
>
> Sunt unele stive care pot fi pacalite chiar si cu offset-uri negative
> (redhat < ~6, cu pachete ICMP fragmentate).
>
> In alta ordine de idei, nu stiu cum determina IPFW si nici stiva BSD
> care este primul fragment. S-ar putea sa ia in calcul doar campul de
> identificare, care este la discretia expeditorului.
>
> Nota: s-ar putea sa fi facut si afirmatii eronate. Momentan nu imi dau
> seama. Am sa verific in mod concret pe IPFW si FreeBSD. Trebuie citit
> codul sursa.

Am sapat un pic prin ipfw, si se pare ca foloseste valoarea din header (pe
un 4.10)

ip.h
        u_short ip_off;                 /* fragment offset field */


ip_fw2.c

        /*
         * offset       The offset of a fragment. offset != 0 means that
         *      we have a fragment at this offset of an IPv4 packet.
         *      offset == 0 means that (if this is an IPv4 packet)
         *      this is the first or only fragment.
         */

                offset = ip_off & IP_OFFMASK;



>
> In orice caz, de foarte multe ori o regula speciala pentru "frag" nu
> este necesara. Poate in cazul aplicatiilor realtime.
>
> Cu stima,
> --
> Alin-Adrian Anton
> Spintech Systems
> GPG keyID 0x1E2FFF2E (2963 0C11 1AF1 96F6 0030 6EE9 D323 639D 1E2F FF2E)
> gpg --keyserver pgp.mit.edu --recv-keys 1E2FFF2E
> __________________________________________________________
> Send 'unsubscribe rofug' to [EMAIL PROTECTED] to unsubscribe
>

__________________________________________________________
Send 'unsubscribe rofug' to [EMAIL PROTECTED] to unsubscribe

Raspunde prin e-mail lui