bash i wyszukianie powtarzających się ip ... polowanie ;]

0
#!/bin/bash
# autoban.sshd.sh

LOG=/var/log/syslog
OLDLOG=/tmp/syslog.old

if [ -f $OLDLOG ]; then

  ROZMIAR1=`cat $LOG | wc -l`
  ROZMIAR2=`cat $OLDLOG | wc -l`
  LAN=192.168.1

  echo $LAN             # debug code
  echo $ROZMIAR1        # debug code
  echo $ROZMIAR2        # debug code

  PLIK=
  if [ "$ROZMIAR1" < "$ROZMIAR2" ]; then
    echo "rozmiar 1 < rozmiar 2"     # debug code
    PLIK=/var/tmp/syslog.tmp         # syslog zaczal zapisywac w nowym pliku
    cat < $LOG.1 > $PLIK             # wiec trzeba obrobic 2 pliki
    cat < $LOG >> $PLIK              # dołaczamy nowy plik
  else
    echo "rozmiar 1 > rozmiar 2"     # debug code
    PLIK=/var/log/syslog
  fi

  echo $PLIK          # debug code

  cat < $PLIK | grep sshd > /tmp/log.grep.new
  cat < $OLDLOG | grep sshd > /tmp/log.grep.old

  diff -aB /tmp/log.grep.new /tmp/log.grep.old | grep "Failed" | grep -v "$LAN" > /tmp/autoban.tmp

  rm -f /tmp/log.grep.old
  rm -f /tmp/log.grep.new

  # Pętla
  # w ktorej zostaną wyszukane wszystkie powtarzające się w /tmp/aotoban.tmp min 3 razy ip
  # nie mam zastrzeżeń żadnych, z plikiem można robic wszystko, to tylko wynik jakichs tam wyliczeń

    # IP='TU BRAKUJE TEGO WŁAŚNIE CZEGOŚ :> Trzeba jakoś obrobić /tmp/autoban.tmp w pętli'
    #
    # iptables -A INPUT -s $IP -j DROP
    #
    # echo "iptables -A INPUT -s $IP -j DROP" >> /etc/rc.d/rc.local
    # ja nie uzywam save i restore dla iptables, ładuje do rc.local, moj prywatny wybor

  # altęP

  rm -f /tmp/autoban.tmp

  if [ "$ROZMIAR1" < "$ROZMIAR2" ]; then
    rm -f $PLIK
    echo "kasowanie $PLIK"          # debug code
  fi

  rm -f /tmp/syslog.old
  echo "kasowanie /tmp/syslog.old"           # debug code

fi

cp -f $LOG $OLDLOG
echo "kopiowanie $LOG -> $OLDLOG"        # debug code

O co chodzi... Ano doszedlem do tego, że znajduje linijki w ktorych sa ip, chce wyłuskać tylko te ip , ktore powtarzają się min 3 razy, w przeciągu 5 minut. Udalo mi sie wyciąc lana i tak dalej, ale dalej utknałem. To mójpierwszy własnoręcznie pisany skrypt i póki co uwazam, że nie jest najgorszy ;p , może byc lepszy i nie mam nic przeciw poprawkom ;]

z góry dzięki...

// tak wyglada przykładowa linijka w /tmp/autoban.tmp :

< Jan 26 0922 dragonfly sshd[2881]: Failed none for illegal user USERNAME from 66.66.66.66 port 666 ssh2

// jesli ktos napisze, zeby skonfigurowac sshd i zablokować roota, to z gory odpowiadam... zrobioen.. ale chce wyszukac wszystkie ip z ktorych gosć po sieci buraczy zanim zglosze sprawe do abuse.. poki co logi są juz pękate ;p, ale to pewnie jeszcze nie koniec ;] a nie chce mi sie recznie regulek pisac, wrzuci sie do crona i lu :D

0

Daj se spokoj z taka zabawa, za duzo automatow skanujacych port 22 jest wszedzie zapuszczonych i zglaszanie ich wszytkich nie ma wiekszego sensu - no chyba ze naprawde sie bardzo nudzisz .. Zmien port ssh - najprostszy i naskuteczniejszy sposob, pozwol wybrancom na laczenie sie - za pomoca wpisow w sshd_config, xinetda, badz zwyklego tcpwrappera - ze o iptables nie wspomne. I problem z glowy, o posiadaniu aktualnej wersji serwera nie bede tez wspominal.

0

Ja dziennie dostaje 20 raportów na email ze ktos mi na 22 sie chce wbic :)
Wycinam cale klasy /32 (i tak sa spoza Polski) :)

Co do listy wybrancow :) mozna tez to zrobic na pdst /etc/hosts_allow

0

neee ;] co do abuse to sie zastanowie, choc to caly czas ten sam gosc... Nie wierze, zeby w sieci wszyscy uzywali tego samego programu, poza tym wszystkie wpisy są z polskich serwerów ;] A jak już się znudze, to wykonam jeden telefon i bede mial nowe ip ;p Ale tematem wątku nie są dywagacje na temat abuse, tylko stworzenie automatycznego skryptu, ktory może byc wykorzystany przez każdego...

Skrypt, skrypt panowie, skupcie się, bo z pionową obróbką pliku sobie poradziłem, teraz potrzebny ten kawałek, który przeleci linie w poziomie ;>

// nie chce mi sie pisać tego w c, choc to byłby banał, wole pomęczyć shella

0

Co do listy wybrancow :) mozna tez to zrobic na pdst /etc/hosts_allow

hosts.allow, denny to wlasnie skladniki tcp wrapper'a.

0

teraz potrzebny ten kawałek, który przeleci linie w poziomie ;>

AWK

GOOGLE

0

AWK
W Wikipedii nie ma jeszcze artykułu pod taką nazwą. [green]

A odezwałem się, bo usłyszalem AWK :> Linuxa ani basha nie znam (to drugie to nawet nie wiem co to :P) ale jak coś w AWK się da to ja to zrobię :d

0

Nie wiem czy ja dobrze zrozumialem ale z:

< Jan 26 09:54:22 dragonfly sshd[2881]: Failed none for illegal user USERNAME from 66.66.66.66 port 666 ssh2

chcesz wyciagnac ip? Moze byc cut? :>
echo "Jan 26 0922 dragonfly sshd[2881]: Failed none for illegal user USERNAME from 66.66.66.66 port 666 ssh2" | cut -d ' ' -f 13
bo chyba nagle nie przybywa tam jakis kolumn i 13 jest stala? :) Cos mi sie za proste wydaje ale napisalem czasami najtrudniej wpasc na najlatwiejsze rzeczy :>

0

Dzieki Lofix, dzieki pedros, Socket i Beerman ;p.
cut - do konca nie wiedziałem, poradziłem sobie inaczej ;]

Do wykorzystania:

#!/bin/bash
# autoban.sshd.sh
# wiritten for and tested on slackware 10 and syslogd 1.4.1
# <c> 2005 flabra

TMPDIR=/tmp                # katalog, w ktorym trzyma sie rozne smieci temp
LOG=/var/log/syslog        # sciezka do sysloga
OLDLOG=$TMPDIR/syslog.old  # gdzie zachowac kopie sysloga
RCLOCAL=/etc/rc.d/rc.local # nasz local
BANLIST=/root/banlist      # w tym pliku trzymamy zbanowane adresy, może
                           # być wpisane $RCLOCAL, wtedy wsjo bedzie w jednym pliku
MAXCOUNT=3                 # maxymalna ilosc nieudanych logowan
MAXTIME=000100             # zapis miedzyczasu w formacie hhmmss
                           # wpisywac maxy, czyli np. 100 zamiast 60, bo nie zadziala
                           # mało ważne, czy bedą zera z przodu
LAN=192.168.1              # nasza siec lokalna/komputer osobisty roota/localhost
                           # w kadym razie to czego z gory nie zamierzamy banowac
BANPREFIX="#banned: "      # wpisac "", w BANLIST /etc/host.deny i mozna wywalic 
                           # iptables ze skryptu

if [ ! -f $BANLIST ] ; then
  touch $BANLIST
fi

if [ -f $OLDLOG ]; then

  ROZMIAR1=`cat $LOG | wc -l`
  ROZMIAR2=`cat $OLDLOG | wc -l`

  PLIK=

  if [ $ROZMIAR1 -lt $ROZMIAR2 ]; then
    PLIK=$TMPDIR/syslog.tmp
    cat $LOG.1 > $PLIK
    cat $LOG >> $PLIK  # dołaczamy nowy plik
  else
    PLIK=$LOG
  fi

  cat $PLIK | grep "sshd" > $TMPDIR/log.grep.new
  cat $OLDLOG | grep "sshd" > $TMPDIR/log.grep.old

  diff -aB $TMPDIR/log.grep.new $TMPDIR/log.grep.old | grep "Failed" | grep -v "$LAN" > $TMPDIR/autoban.tmp

  rm -f $TMPDIR/log.grep.old
  rm -f $TMPDIR/log.grep.new

  I=1
  L=`cat $TMPDIR/autoban.tmp | wc -l`

  TIME=999999
  IP=127.0.0.1

  while [ $I -le $L ] ; do
    TIMET=1
    COUNT=1
    CHGIP=$[L+1]
    FIP=0
    DTIME=999999
    FIRST=1
    while [ $I -le $L ] ; do
      LINIA=`cat $TMPDIR/autoban.tmp | head -n $I | tail -n 1`
      IPT=`echo $LINIA | awk -F ' ' '{ print $(NF-3) }'` # zawsze 3 od konca, roznie od poczatku
      TMP=`echo $LINIA | awk -F ' ' '{ print $4 }' | awk -F ':' '{ print $1$2$3 }'`
      TIMET=`expr $TMP + 0`
      if [ $FIRST == 1 ] ; then
        TIME=$TIMET
        IP=$IPT
        FIRST=0
      else
        if [ $IP == $IPT ] ; then
          COUNT=$[COUNT+1]
          if [ $FIP == 0 ] ; then
            FIP=$I
          fi
          if [ $COUNT == $[MAXCOUNT+1] ] ; then
            DTIME=`expr $TIMET - $TIME`
          fi
        else
          if [ $CHGIP == $[L+1] ] ; then
            CHGIP=$I
          fi
        fi
      fi
      I=$[I+1]
    done
    I=$CHGIP
    if [ `expr $MAXTIME - $DTIME` -ge 0 ] ; then
      if [ $COUNT -gt $MAXCOUNT ] ; then
        if ! grep -q "$BANPREFIX $IP" $BANLIST ; then
          echo "$BANPREFIX $IP" >> $BANLIST
          echo "iptables -A INPUT -s $IP -j DROP"  >> $RCLOCAL
          iptables -A INPUT -s $IP -j DROP
        fi
      fi
    else
      if [ $FIP -gt 0 ] ; then
        if [ $COUNT -gt $[MAXCOUNT+1] ] ; then
          I=$FIP
        fi
      fi
    fi
  done

  rm -f $TMPDIR/autoban.tmp
  rm -f $OLDLOG

  if [ $ROZMIAR1 -lt $ROZMIAR2 ]; then
    rm -f $PLIK
  fi
fi

cp -f $LOG $OLDLOG    # zapamietujemy aktualnego loga

// pry okazji... możeby sie pokusić o użycie whois i wycinanie całych sieci ? ;>

// do postu poniżej poprawiłem i wywaliłem wszystko co może być zmienione na samą górę, ale bez przesady. Scieżki do rm/cat/grep/awk/... To chyba raczej obowiązek roota, a nie piszącego skrypt, aby ująć te programy w $PATH, zwłaszcza 4 podstawowe: /bin;/sbin;/usr/bin;/usr/sbin

0

mala dygresja,,na poczatku skryptu zdefiniuj sciezki do uzytych programow, zeby nikt nie musial ew. zmieniac w samym skrypcie

0

Dygresja odnosnie iptables, otoz ten skrypt spowoduje ze lancuch INPUT delikatnie ci sie rozrosnie, a tym samym kazda paczka bedzie sprawdzana przez wszytkie twoje regulki dropujace - juz to czytajac widac ze nie jest to efektywne :)
Poprawne i wydajne rozwaizanie to oddzielny lancuch do ktorego bedziesz dodawal regulki dropujace kolejne IPki, a w INPUT znajdzie sie tylko jedna regulka przerzucajaca paczki z dport 22 do tego wlasnie dodatkowego lancucha.

//ok przyjąłem... man iptables :) z tym, że idea jest taka, żeby na podstawie logów z sshd ucinac całkowicie dostep, sshd to jedyny serwis odpalony na nacie, jak coś będę więcej stawiał, to oczywiście wezmę to pod uwagę [mf]

1 użytkowników online, w tym zalogowanych: 0, gości: 1