Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [OPGELOST] bind query .NS/IN aanvallen  (gelezen 2482 keer)

johnno40

  • Gast
[OPGELOST] bind query .NS/IN aanvallen
« Gepost op: 2009/01/20, 20:46:37 »
Sinds een paar weken is het weer heftig met aanvallen op mijn BIND server.

Uit het syslog:
Jan 20 17:03:01 localhost named[23614]: client 66.230.128.15#63621: view external: query (cache) './NS/IN' denied
Jan 20 17:03:02 localhost named[23614]: client 66.230.160.1#64291: view external: query (cache) './NS/IN' denied
Jan 20 17:03:02 localhost named[23614]: client 66.230.160.1#21489: view external: query (cache) './NS/IN' denied
Jan 20 17:03:03 localhost named[23614]: client 66.230.128.15#25661: view external: query (cache) './NS/IN' denied
Jan 20 17:03:05 localhost named[23614]: client 66.230.128.15#63621: view external: query (cache) './NS/IN' denied
Jan 20 17:03:06 localhost named[23614]: client 66.230.160.1#52594: view external: query (cache) './NS/IN' denied
Jan 20 17:03:07 localhost named[23614]: client 66.230.160.1#12735: view external: query (cache) './NS/IN' denied
Jan 20 17:03:07 localhost named[23614]: client 66.230.128.15#53223: view external: query (cache) './NS/IN' denied

en dit gaat nog wel een tijdje door.

Nu heb ik een "handmatige" oplossing

In bind9 heb je de optie blackhole (zie hieronder), door handmatig het IP adres (ik neem gelijk de hele range) in te voeren en dan /etc/init.d/bind9 reload te geven is de attack gelijk over.
Ik heb geprobeerd te patchen, maar wordt gehinderd door de router, waardoor ik te weinig variatie in de poorten heb.

        dnssec-enable yes;
        blackhole {
        209.249.141.0/24;
        204.11.51.0/24;
        208.37.177.0/24;
        168.75.65.0/24;
        143.215.129.25;
        64.74.15.250;
        205.166.76.0/24;
        192.195.204.0/24;
        38.96.134.230;
        216.201.83.0/24;
        216.201.82.0/24;
        69.50.137.0/24;
        91.199.112.0/24;
        74.86.34.0/24;
        63.217.28.0/24;
        216.240.131.0/24;
        69.50.142.0/24;
        76.9.16.0/24;
        76.9.31.0/24;
        66.230.160.0/24;
        66.230.128.0/24;
        };


Mijn vraag:

Kan ik een perl script maken die mijn query-log "leest" en zodra eenzelfde IP vijf keer binnen een minuut langskomt deze automatisch toevoegd aan de blackhole lijst en vervolgens bind reload?

Het zou mijn leven aangenamer maken  :D :D


Zijn er andere alternatieven?

Thanx.

Johnno.
« Laatst bewerkt op: 2009/01/30, 23:17:05 door johnno40 »

Offline Dennisgroot

  • Lid
  • Steunpunt: Nee
Re: bind query .NS/IN aanvallen
« Reactie #1 Gepost op: 2009/01/20, 22:42:56 »
Fail2ban kan logs lezen. niet voor BIND dacht.
Maar je kan zelf een criterium toevoegen.

Wacht anders eerst maar op andere (misschien makkelijkere) alternatieve
ander kost het toch wel wat gepruts ben ik bang

(misschien zit BIND er wel gewoon in)

edit:
hij kan inderdaad BIND controleren
het is helaas wel wat moeilijker dan ssh/ftp porten te beveiligen :rolleyes:
# These jails block attacks against named (bind9). By default, logging is off
# with bind9 installation. You will need something like this:
#
# logging {
#     channel security_file {
#         file "/var/log/named/security.log" versions 3 size 30m;
#         severity dynamic;
#         print-time yes;
#     };
#     category security {
#         security_file;
#     };
# }
#
# in your named.conf to provide proper logging
Je zal jezelf dus even moeten inlezen op hun site
« Laatst bewerkt op: 2009/01/20, 22:50:11 door Dennisgroot »

johnno40

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #2 Gepost op: 2009/01/20, 22:50:43 »
Hoi Dennis,

Ik heb in mijn named.conf ook een aparte query log aangemaakt (ik gebruik bindgraph om het grafisch te bekijken)

Zie:
------knip ------

logging {
   channel querylog {
      file "/var/log/query.log"; print-time yes;
      };
   category queries { querylog;    };
   };

-------knip ---------

Het liefst had ik gewoon bind gepatched, maar daar werkt helaas de router niet aan mee.

Bedankt zover!

Offline Dennisgroot

  • Lid
  • Steunpunt: Nee
Re: bind query .NS/IN aanvallen
« Reactie #3 Gepost op: 2009/01/20, 22:53:44 »
Zie mijn bovenstaande reactie die is aangepast.

Ik ben zelf niet zo netwerken gespecialiseerd ben gewoon een doe-het-zelf'er
En aangezien ik dat van jou nooit geprobeerd heb , kan ik je niet zo ff mijn conf geven.

Maar ik denk dat je het toch moet zoeken in de trant van fail2ban.

Na een paar foute inlog pogingen blockt hij het ip.
Of na andere vreemde dingen  :P
« Laatst bewerkt op: 2009/01/20, 23:13:52 door Dennisgroot »

no-sense

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #4 Gepost op: 2009/01/29, 12:11:28 »
Ik heb zelf iets gemaakt tegen dit. Het scriptje checkt je query log voor queries naar ". NS IN +" en voegt de IP adressen dan toe aan de blackhole lijst van named. Na verloop van tijd als de query log gerotate wordt (wel in je logrotate zetten dus!) verdwijnen ze vanzelf weer. Dit is wat ik heb gedaan:

==== /etc/named.conf ====

include "/etc/named.blacklist";

options {
    directory "blabla";

    [....]

    // hide your bind version number for exploiters
    version "not of your business";

    [....]

    blackhole { "blacklist"; };
};

logging {
        channel query_log {
                file "/var/log/named.query";
                print-time yes;
        };

        category queries { query_log; };
};

[.....]
===========================================


========== /usr/local/sbin/checkqueries ===========
#!/bin/bash
# parses named.query logfile and creates blacklist

FILE=/etc/named.blacklist

MD5SUM=0
if [ -r $FILE ]; then
        MD5SUM=`/usr/bin/md5sum $FILE | /bin/awk '{ print $1 }'`
fi

cat /var/log/named.query.1 /var/log/named.query | /bin/awk '
{
        ip = substr($4,1,index($4,"#") - 1);


        if (ip != "127.0.0.1" && $6 == "." && $7 == "IN" && $8 == "NS")
        {
                queries[ip]++;
        }
}
END {
        printf("// named blacklist.\n// Created dynamically periodically by '$0'.\n\nacl \"blacklist\" { ");

        for (ip in queries)
        {
                if (queries[ip] > 1000)
                        printf("%s; ",ip);
        }

        printf("};\n\n");
}' > $FILE

chown root:named $FILE
chmod 640 $FILE

NEWMD5SUM=0
if [ -r $FILE ]; then
        NEWMD5SUM=`/usr/bin/md5sum $FILE | /bin/awk '{ print $1 }'`
fi

if [ $MD5SUM != $NEWMD5SUM ]; then
        /sbin/service named reload  2> /dev/null > /dev/null
fi
============================================

Dit laatste script heb ik in /usr/local/sbin staan en laat ik 3x per dag uitvoeren door cron. In dit script worden IP nummers geblockt die in de laatste 2 logfiles meer dan 1000x een attack query hebben gedaan. Je kan er zelf nog aan tweaken uiteraard. Dit script draait op Fedora, ik weet niet of Ubuntu het "service" script kent om je named daemon te herstarten.

zo ziet op dit moment bij mij m'n blacklist eruit:
===== voorbeeld /etc/named.blacklist ==============
// named blacklist.
// Created dynamically periodically by /usr/local/sbin/checkqueries.

acl "blacklist" { 70.86.80.98; 64.57.246.123; 72.249.127.168; };

===========================================


johnno40

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #5 Gepost op: 2009/01/29, 18:18:57 »
Ziet er keurig uit, alleen filtert dit pas NADAT de aanval geweest is.
Eigenlijk zoek ik meer iets wat direct, na een stuk of 10 probeersels gelijk blokt (via een poller functie oid).
Ik heb het geprobeerd met fail2ban, maar op de e.e.a. manier werkt dat niet.

Fail2ban rule verdwijnt iedere keer uit mijn iptables.

Ik ga nog even verder op zoek, maar for the time beiing lijkt me dit een mooie optie.

Thanx!

Offline Dennisgroot

  • Lid
  • Steunpunt: Nee
Re: bind query .NS/IN aanvallen
« Reactie #6 Gepost op: 2009/01/29, 19:45:36 »
Dat klopt dat hij verdwijnt na een tijdje eigenlijk niet echt een probleem.
Hackers proberen het 1 keer en daarna niet meer (of je hebt veel toeval)

In /etc/fail2ban/jail.conf kan je de tijd dat iemand geblockd wordt ingeven.

Je zou ook bovenstaande kunnen proberen en deze gewoon elke minuut laten lopen.
Zo werkt fail2ban eigenlijk ook  ;)

johnno40

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #7 Gepost op: 2009/01/29, 19:53:43 »
Hmmm, vandaag weer, en met weer een hoop andere IP-adressen.
Ik ben bang dat ik redelijk onder attack lig, of dat het "toevallig" een reflect is van een DDOS aanval (via google).

Ik heb nu een hele rits, ik denk allemaal botnets, maar de aanvallen blijven komen.
http://www.droppert.net/cgi-bin/bindgraph.cgi

Ik ga bovenstaand scriptje dan ook uitproberen, iets is beter als niets.


johnno40

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #8 Gepost op: 2009/01/29, 20:42:02 »
Ik heb geprobeerd hem aan te passen voor mijn situatie (ubuntu 7.10), alleen als ik hem handmatig uitvoer blijft de named.blacklist leeg?!?
Nu heb ik express het aantal keren dat een IP moet voorkomen al teruggezet naar 20, maar zelfs dan noppes.
Kijk ik ergens overheen?

----------------------------------
#========== /usr/local/sbin/checkqueries ===========
#!/bin/bash
# parses named.query logfile and creates blacklist

FILE=/etc/named.blacklist

MD5SUM=0
if [ -r $FILE ]; then
        MD5SUM=`/usr/bin/md5sum $FILE | /usr/bin/gawk '{ print $1 }'`
fi

cat /var/log/query.log.1 /var/log/query.log | /usr/bin/gawk '
{
        ip = substr($4,1,index($4,"#") - 1);


        if (ip != "127.0.0.1" && $6 == "." && $7 == "IN" && $8 == "NS")
        {
                queries[ip]++;
        }
}
END {
        printf("// named blacklist.\n// Created dynamically periodically by '$0'.\n\nacl \"blacklist\" { ");

        for (ip in queries)
        {
                if (queries[ip] > 20)
                        printf("%s; ",ip);
        }

        printf("};\n\n");
}' > $FILE

chown bind:bind $FILE
chmod 640 $FILE

NEWMD5SUM=0
if [ -r $FILE ]; then
        NEWMD5SUM=`/usr/bin/md5sum $FILE | /usr/bin/gawk '{ print $1 }'`
fi

if [ $MD5SUM != $NEWMD5SUM ]; then
        /etc/init.d/bind9 reload  2> /dev/null > /dev/null
fi
#============================================
-----------------------------------------------------------------

Bedankt alvast.

John.

no-sense

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #9 Gepost op: 2009/01/30, 06:56:13 »
Even voor de duidelijkheid, jullie liggen niet onder attack. Degene die onder attack ligt is het IP wat in je query log verschijnt. Als je dit soort zooi in je log files ziet loop je zelf dus geen enkel gevaar.

Het is een simpele attack, de aanvaller stuurt jou een request (van zo'n 17 bytes geloof ik) met een spoofed IP adres. Als jouw server antwoord op de query wordt er rond de 50k aan antwoord teruggestuurd aan de machine die aangevallen wordt. Zelfs als jouw server niet antwoord (Jan 20 17:03:01 localhost named[23614]: client 66.230.128.15#63621: view external: query (cache) './NS/IN' denied)
wordt er toch nog een klein "mag niet!" antwoord teruggestuurd. In bind's blackhole lijst wordt er dus niets teruggestuurd en daarmee help je 't slachtoffer van de DDoS (een klein beetje). In bovenstaand voorbeeld is 66.230.128.15 dus de aangevallen computer, niet de aanvaller!

Dat is dus de reden van bovenstaand scriptje, niet om onschuldige mensen te blacklisten, maar om de DDOS een beetje minder te maken.
« Laatst bewerkt op: 2009/01/30, 07:09:23 door no-sense »

no-sense

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #10 Gepost op: 2009/01/30, 07:07:33 »
Ik heb geprobeerd hem aan te passen voor mijn situatie (ubuntu 7.10), alleen als ik hem handmatig uitvoer blijft de named.blacklist leeg?!?
Nu heb ik express het aantal keren dat een IP moet voorkomen al teruggezet naar 20, maar zelfs dan noppes.
Kijk ik ergens overheen?


Ik gok dat jouw log regels niet matchen met wat het script verwacht. Zo zien mijn regels eruit:
29-Jan-2009 17:10:10.997 client 72.20.3.82#62748: query: . IN NS +

De regels waar het om gaan is deze:
ip = substr($4,1,index($4,"#") - 1);
if (ip != "127.0.0.1" && $6 == "." && $7 == "IN" && $8 == "NS")

ip is het IP adres wat in veld 4 staat (velden genummerd vanaf 1, door spaties gescheiden) met 't # en alles daarachter afgehaald.
Vervolgens kijkt hij of 't ip adres niet 127.0.0.1 is (je wilt jezelf niet blocken, niewaar?) en dat veld 6, 7 en 8 resp. ". IN NS" bevatten.

Succes ermee

johnno40

  • Gast
Re: bind query .NS/IN aanvallen
« Reactie #11 Gepost op: 2009/01/30, 23:02:34 »
Okay, de regel uit mijn log is:
30-Jan-2009 12:23:52.429 client 76.9.20.244#342: view external: query: . IN NS +

Dus heb ik aangepast naar:

ip = substr($4,1,index($4,"#") - 1);
if (ip != "127.0.0.1" && $8 == "." && $9 == "IN" && $10 == "NS")

Inderdaad goed opletten op de spaties.

Vandaag al een goede "oogst"  ;)

acl "blacklist" { 69.64.87.156; 72.20.3.82; 76.9.20.244; 72.249.127.168; 78.140.132.25; };

Ontzettend bedankt, nu alleen nog even een goede crontijd zien te vinden!