Difference between revisions of "Talk: UNIX opgaver"
From Teknologisk videncenter
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