Difference between revisions of "Talk: UNIX opgaver"

From Teknologisk videncenter
Jump to: navigation, search
m
m (Besvarelse fra Tomas: new section)
Line 29: Line 29:
 
echo "Anvendte brugernavne ved invalide logins:
 
echo "Anvendte brugernavne ved invalide logins:
 
$NAVNE" | less
 
$NAVNE" | less
 +
</source>
 +
 +
== Besvarelse fra Tomas ==
 +
 +
<source lang=bash>
 +
#!/usr/bin/bash
 +
 +
## Scriptet læser antal fejlede logins
 +
## De fejlede er: Hacking forsøg (reverse mapping)
 +
## "        (Did not recieve ident)
 +
##                Forkert bruger (Invalid user)
 +
##   Forkert password men rigtig bruger (Failed keybord)
 +
##   Anden fejl (error: PAM)
 +
 +
##### INITIAL VÆRDIER #####
 +
LOGFIL=/tmp/auth.log
 +
DD=`date`
 +
 +
##### FUNKTIONER #####
 +
 +
 +
function overskrift {
 +
## Header
 +
# Udskriv en header
 +
# input: $1 = dagsdato
 +
# input: $2 = logstart
 +
# input: $3 = logslut
 +
 +
cat << HEADER
 +
Fejlede SSH logins på mars.tekkom.dk
 +
====================================
 +
 +
Rapporten genereret: $1
 +
 +
------------------------------------------------------------------------------------
 +
Data opsamlet er fra perioden den $2 til den $3
 +
------------------------------------------------------------------------------------
 +
HEADER
 +
}
 +
 +
function startdato {
 +
  ## Find start dato i logfil
 +
  #  input: $1 = filnavn
 +
  #  output: dato som tekst
 +
 +
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3
 +
}
 +
 +
function slutdato {
 +
  ## Find slut dato i logfil
 +
  #  input: $1 = filnavn
 +
  #  output: dato som tekst
 +
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3
 +
}
 +
 +
function loginfejl {
 +
  ## Find alle linier, hvor en given tekst findes.
 +
  # input: $1 = filnavn
 +
  # input: $2 = søgetekst
 +
  # output: antal fundet
 +
 +
  ## Forklaring:
 +
  # grep "$2" $1    : Find linier med en given tekst
 +
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk
 +
  # sed 's/^ *//'  : Fjern eventuelle  indledende mellemrum
 +
  # wc -l          : Tæl linier
 +
  # sed 's/^ *//'  : Fjern indledende mellemrum
 +
  grep "$2" $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'
 +
}
 +
 +
function dage {
 +
  ## Find dage i logfilen
 +
  # input : $1 = filnavn
 +
  # output: liste over dage i filen
 +
  #        listen er newline sepereret. Hver linie indeholder en blanktegnsepereret
 +
  #        dato: "mnd dato"
 +
  cut -b1-6 $1 | sort | uniq
 +
}
 +
 +
function invalidusr {
 +
## Find de ip adresser, der laver mere end 10 invalid user
 +
# input: $1 = filnavn
 +
# output: liste med antal og adresser
 +
 +
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \
 +
                                                                if [ $c -gt 10 ] ; then
 +
  echo "$c $i"
 +
fi
 +
      done
 +
}
 +
 +
function reversemap {
 +
## Find de ip adresser, der laver mere end 10 reverse mapping checking
 +
# input: $1 = filnavn
 +
# output: liste med antal og adresser
 +
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \
 +
  uniq -c | while read c i ; do
 +
    if [ $c -gt 10 ] ; then
 +
      echo "$c $i"
 +
    fi
 +
  done
 +
}
 +
 +
#######################
 +
######## MAIN #########
 +
#######################
 +
 +
 +
overskrift "$DD" "`startdato $LOGFIL`" "`slutdato $LOGFIL`"
 +
 +
echo -e "\nROED OPGAVE ==========\n"
 +
## Find loginfejl: Did not receive identification string from xxx
 +
DIDNOT=`loginfejl $LOGFIL "Did not"`
 +
echo "Antal: Did not receive identification string from xxxx    : $DIDNOT"
 +
## Find loginfejl: Failed keyboard-interactive/pam for invalid user
 +
FAILKEYB=`loginfejl $LOGFIL "Failed keyboard-interactive"`
 +
echo "Antal: Failed keyboard-interactive/pam for invalid user  : $FAILKEYB"
 +
## Find loginfejl: Invalid user xxx from yyyy
 +
INVALUSR=`loginfejl $LOGFIL "Invalid user"`
 +
echo "Antal: Invalid user                                      : $INVALUSR"
 +
## Find loginfejl: error: PAM: authentication error for xxx from yyyy
 +
ERRPAM=`loginfejl $LOGFIL "error: PAM:"`
 +
echo "Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM"
 +
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!
 +
REVMAP=`loginfejl $LOGFIL "reverse mapping"`
 +
echo "Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP"
 +
 +
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`
 +
echo "Ialt fejlede dette antal loginforsøg                      : $IALT"
 +
 +
echo -e "\nGUL OPGAVE ========\n"
 +
echo "Fejlede logins fordeler sig således over dage:"
 +
# mnd = måned
 +
# dag = dag
 +
dage $LOGFIL| while read mnd dag ; do
 +
 
 +
  cnt=`grep "$mnd *$dag" $LOGFIL | \
 +
  grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \
 +
  wc -l | sed 's/^ *//'`
 +
 +
  printf "D. %2s. %3s er der afvist %s ssh login\n" $dag $mnd $cnt
 +
done
 +
 +
echo -e "\nGROEN OPGAVE =========\n"
 +
echo "Følgende sikkerhedsproblemer er fundet:"
 +
## Her er lidt quick and dirty programmering.
 +
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.
 +
#  Det kan også være at vedkommende ikke har en A-record i dns'en.
 +
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er
 +
#  det en slåfejl (fejl 40).
 +
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos
 +
#  bruger.
 +
#
 +
## Jeg sætter følgende grænser:
 +
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.
 +
## Aktion:
 +
#  Der sendes en mail med advarsel og løsningsforslag.
 +
 +
invalidusr $LOGFIL | while read cnt ip ; do
 +
cat << BREV
 +
to: ttt@infected.com
 +
from: warning@infected.com
 +
==========================
 +
#    WARNING HACKED???  #
 +
==========================
 +
 +
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.
 +
- Enten luk for $ip i firewallen
 +
- Eller indsæt $ip i /etc/host.deny
 +
BREV
 +
echo -e "\n"
 +
done
 +
reversemap $LOGFIL | while read cnt ip ; do
 +
cat << ANDETBREV
 +
to: ttt@infected.com
 +
from: warning@infected.com
 +
==========================
 +
#    WARNING HACKED???  #
 +
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har
 +
en A-Record i DNSen.
 +
- Enten luk for $ip i firewallen
 +
- Eller indsæt $ip i /etc/host.deny
 +
ANDETBREV
 +
echo -e "\n"
 +
done
 
</source>
 
</source>

Revision as of 10:07, 2 September 2009

fra kbso

#!/usr/bin/bash

## Roed opgave
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er

# Log fil
LOG="/tmp/auth.log"

# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s "\t" ' '`
echo "Der var$LINJER invalide login forsoeg i alt.
"


## Gul opgave
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten

PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`
echo "Invalide login forsoeg per dag:
$PERDAG"


## Groen opgave

NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`
echo "Anvendte brugernavne ved invalide logins:
$NAVNE" | less

Besvarelse fra Tomas

#!/usr/bin/bash

## Scriptet læser antal fejlede logins
## De fejlede er: Hacking forsøg (reverse mapping)
##			"        (Did not recieve ident)
##                Forkert bruger (Invalid user)
##		  Forkert password men rigtig bruger (Failed keybord)
##		  Anden fejl (error: PAM)

##### INITIAL VÆRDIER #####
LOGFIL=/tmp/auth.log
DD=`date`

##### FUNKTIONER #####


function overskrift {
## Header
# Udskriv en header
# input: $1 = dagsdato
# input: $2 = logstart
# input: $3 = logslut

cat << HEADER
Fejlede SSH logins på mars.tekkom.dk
====================================

Rapporten genereret: $1

 ------------------------------------------------------------------------------------
 Data opsamlet er fra perioden den $2 til den $3
 ------------------------------------------------------------------------------------
HEADER
}

function startdato {
  ## Find start dato i logfil
  #  input: $1 = filnavn
  #  output: dato som tekst

  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 
}

function slutdato {
  ## Find slut dato i logfil
  #  input: $1 = filnavn
  #  output: dato som tekst
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3
}

function loginfejl {
  ## Find alle linier, hvor en given tekst findes. 
  # input: $1 = filnavn
  # input: $2 = søgetekst
  # output: antal fundet

  ## Forklaring:
  # grep "$2" $1    : Find linier med en given tekst
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum
  # wc -l           : Tæl linier
  # sed 's/^ *//'   : Fjern indledende mellemrum
  grep "$2" $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'
}

function dage {
  ## Find dage i logfilen
  # input : $1 = filnavn
  # output: liste over dage i filen
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret
  #         dato: "mnd dato"
  cut -b1-6 $1 | sort | uniq
}

function invalidusr {
## Find de ip adresser, der laver mere end 10 invalid user
# input: $1 = filnavn
# output: liste med antal og adresser

grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \
                                                                 if [ $c -gt 10 ] ; then
								   echo "$c $i"
								 fi
							       done
}

function reversemap {
## Find de ip adresser, der laver mere end 10 reverse mapping checking 
# input: $1 = filnavn
# output: liste med antal og adresser
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \
  uniq -c | while read c i ; do
    if [ $c -gt 10 ] ; then
      echo "$c $i"
    fi
  done
}

#######################
######## MAIN #########
#######################


overskrift "$DD" "`startdato $LOGFIL`" "`slutdato $LOGFIL`"

echo -e "\nROED OPGAVE ==========\n"
## Find loginfejl: Did not receive identification string from xxx
DIDNOT=`loginfejl $LOGFIL "Did not"`
echo "Antal: Did not receive identification string from xxxx    : $DIDNOT"
## Find loginfejl: Failed keyboard-interactive/pam for invalid user
FAILKEYB=`loginfejl $LOGFIL "Failed keyboard-interactive"`
echo "Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB"
## Find loginfejl: Invalid user xxx from yyyy
INVALUSR=`loginfejl $LOGFIL "Invalid user"`
echo "Antal: Invalid user                                       : $INVALUSR"
## Find loginfejl: error: PAM: authentication error for xxx from yyyy
ERRPAM=`loginfejl $LOGFIL "error: PAM:"`
echo "Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM"
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!
REVMAP=`loginfejl $LOGFIL "reverse mapping"`
echo "Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP"

IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`
echo "Ialt fejlede dette antal loginforsøg                      : $IALT"

echo -e "\nGUL OPGAVE ========\n"
echo "Fejlede logins fordeler sig således over dage:"
# mnd = måned
# dag = dag
dage $LOGFIL| while read mnd dag ; do
   
   cnt=`grep "$mnd *$dag" $LOGFIL | \
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \
   wc -l | sed 's/^ *//'`

   printf "D. %2s. %3s er der afvist %s ssh login\n" $dag $mnd $cnt
done

echo -e "\nGROEN OPGAVE =========\n"
echo "Følgende sikkerhedsproblemer er fundet:"
## Her er lidt quick and dirty programmering.
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.
#  Det kan også være at vedkommende ikke har en A-record i dns'en.
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er
#  det en slåfejl (fejl 40).
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos 
#  bruger.
#
## Jeg sætter følgende grænser:
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.
## Aktion:
#  Der sendes en mail med advarsel og løsningsforslag.

invalidusr $LOGFIL | while read cnt ip ; do
cat << BREV
to: ttt@infected.com
from: warning@infected.com
==========================
#     WARNING HACKED???  #
==========================

$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.
- Enten luk for $ip i firewallen
- Eller indsæt $ip i /etc/host.deny
BREV
echo -e "\n"
done
reversemap $LOGFIL | while read cnt ip ; do
cat << ANDETBREV
to: ttt@infected.com
from: warning@infected.com
==========================
#     WARNING HACKED???  #
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har
en A-Record i DNSen.
- Enten luk for $ip i firewallen
- Eller indsæt $ip i /etc/host.deny
ANDETBREV
echo -e "\n"
done