PDA

Bekijk de volledige versie : Dropbear: bad password attempt



rj.2001
22-07-2008, 09:03
Hallo allerseits,

seit einiger Zeit sehe ich immer wieder im Syslog folgendes:


Jul 22 09:19:29 dropbear[13777]: bad password attempt for 'root' from ::ffff:200.165.160.99:48790
Jul 22 09:19:29 dropbear[13777]: exit before auth (user 'root', 1 fails): Disconnect received
Jul 22 09:19:29 dropbear[13778]: Child connection from ::ffff:200.165.160.99:48930


oder



Jul 22 09:54:21 dropbear[14692]: Child connection from ::ffff:200.165.160.99:46278
Jul 22 09:54:23 dropbear[14692]: login attempt for nonexistent user from ::ffff:200.165.160.99:46278
Jul 22 09:54:24 dropbear[14692]: exit before auth: Disconnect received


Nun mache ich mir natürlich meine Gedanken was da los ist, da diese Meldungen im Sekunden-Takt auftreten und das schon über mehrere Tage hinweg...
Da versucht doch irgend jemand über SSH an meinen WL500gp ran zu kommen...
Gibt es in irgend einer weise eine Möglichkeit solche IP's automatisch in eine Art Blacklist aufzunehmen?
Z.B. wird 5x versucht sich anzumelden, mit falschen Passwort, oder nicht existierenden User, dann soll die IP kennerell bis zum Router-Neustart verboten werden!

Hat da jemand eine Idee. Vielleicht mit einem Script, was im Hintergrund läuft und die IPTABLES dementsprechend ändert?

Danke für Eure Hilfe.

Ciao

wengi
22-07-2008, 09:19
Hi,

ja, da versucht jemand Dein ssh zu knacken :D
Und ja, das ist leider absolut normal... :(

Ich möchte jetzt ganz bewusst nicht wieder eine security-Diskussion anfangen.
Such einfach mal nach "ssh sicher machen" in google.

Die beiden sichersten Methoden:

1) Ein sehr gutes Passwort
2) oder nur über Zertifikate

Um den Müll im Log loszuwerden und die Anzahl der Angriffe zu verringern kannst Du noch den ssh Port ändern.

wengi

EDIT: Hier im Forum gab es glaube ich mal einen recht guten, englischen Beitrag. Ich finde ihn im Moment aber nicht...
EDIT2: Gefunden! Ich verlinke sogar in meinem Howto darauf (Kapitel 14b) : http://wl500g.info/showpost.php?p=98784&postcount=268

rj.2001
22-07-2008, 21:48
Hab mich heute mal mit dem Thema befasst...
Und das ist dabei rausgekommen:

1. Lösungsweg:
Der Ansatz kam von http://wiki.x-wrt.org/index.php/HowTo-Stop_hackers_attacking_dropbear, anschließend noch Fehler rausgemacht und ASUS tauglich umgeschrieben...

in der /usr/local/sbin/post-firewall folgendes einfügen:

#Stop Dropbear Hacking
iptables -N STOPDROPBEARHACKRULE
iptables -A INPUT -s 192.0.2.0/24 -j STOPDROPBEARHACKRULE
iptables -A FORWARD -s 192.0.2.0/24 -j STOPDROPBEARHACKRULE
iptables -A STOPDROPBEARHACKRULE -m limit --limit 2/second -j LOG --log-level info --log-prefix "BRUTE FORCE HACK -- DENIED"
iptables -A STOPDROPBEARHACKRULE -j DROP

Via Cron wird dann noch aller einer Minute folgendes Script ausgeführt:

#!/bin/sh
################################################## ####
# Inhalt von /opt/etc/cron.1mins/StopDropbearhack.sh #
################################################## ####

MAX_ATTEMPTS="5"
CHAINNAME="STOPDROPBEARHACKRULE"
WHITELIST="192.168.1.2 192.168.1.3 192.168.1.100 192.168.1.200 192.168.1.101 192.168.1.201 192.168.1.110 192.168.1.210 192.168.1.120 192.168.1.220"

cat /tmp/syslog.log|grep -e "bad password attempt" -e "login attempt for nonexistent user"|awk '{print $FN}'|awk '{n=split($0,fn,":"); print fn[7]}'|sort|uniq -c|sort -n|sed "s/[ [:space:]]*//"|while read i

do

IP=`echo $i | cut -d" " -f 2`

MEMBERFOUND="false"

for MEMBER in $WHITELIST
do
if [ "$MEMBER" = "$IP" ]; then
MEMBERFOUND="true"
fi
done

if [ "$MEMBERFOUND" != "true" ]; then
iptables -n -L INPUT|grep -e "^$CHAINNAME[^[:alnum:]_]"|grep -q "$IP"
EXITCODE=$?

if [ "$EXITCODE" -eq '1' ]; then

COUNT=`echo $i | cut -d" " -f1`

if [ "$COUNT" -ge "$MAX_ATTEMPTS" ]; then
iptables -I INPUT -s $IP -j $CHAINNAME
iptables -I FORWARD -s $IP -j $CHAINNAME

logger "BRUTE FORCE ALERT -- $IP was blocked"
fi
fi
fi
done

Nach einem SSH-Brute Force steht dann im SysLog dies hier drin:

Jul 22 21:58:45 dropbear[1018]: login attempt for nonexistent user from ::ffff:201.116.1.18:48862
Jul 22 21:58:46 dropbear[1018]: exit before auth: Disconnect received
Jul 22 21:58:46 dropbear[1019]: Child connection from ::ffff:201.116.1.18:49003
Jul 22 21:58:48 dropbear[1019]: login attempt for nonexistent user from ::ffff:201.116.1.18:49003
Jul 22 21:58:49 dropbear[1019]: exit before auth: Disconnect received
Jul 22 21:58:50 dropbear[1020]: Child connection from ::ffff:201.116.1.18:49150
Jul 22 21:58:52 dropbear[1020]: login attempt for nonexistent user from ::ffff:201.116.1.18:49150
Jul 22 21:58:53 dropbear[1020]: exit before auth: Disconnect received
Jul 22 21:58:53 dropbear[1021]: Child connection from ::ffff:201.116.1.18:49291
Jul 22 21:58:55 dropbear[1021]: bad password attempt for 'root' from ::ffff:201.116.1.18:49291
Jul 22 21:58:56 dropbear[1021]: exit before auth (user 'root', 1 fails): Disconnect received
Jul 22 21:58:56 dropbear[1022]: Child connection from ::ffff:201.116.1.18:49428
Jul 22 21:58:59 dropbear[1022]: bad password attempt for 'root' from ::ffff:201.116.1.18:49428
Jul 22 21:59:00 dropbear[1022]: exit before auth (user 'root', 1 fails): Disconnect received
Jul 22 21:59:01 dropbear[1023]: Child connection from ::ffff:201.116.1.18:49608
Jul 22 21:59:01 /opt/sbin/cron[1025]: (root) CMD (run-parts /opt/etc/cron.1mins # aller einer Minute)
Jul 22 21:59:03 root: BRUTE FORCE ALERT -- 201.116.1.18 was blocked

Laut "iptables --list" wurde diese IP dann auch tatsächlich gesperrt.

Einen Nachteil hat dieses Script jedoch... Der Angreifer hat genau eine Minute Zeit sein unwesen zu treiben.

2. Lösungsweg:
/usr/local/sbin/post-firewall:

#!/bin/sh
#SSH
iptables -D INPUT -j DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -t nat -A PREROUTING -i vlan1 -p tcp --dport 22 -j DNAT --to-destination $4:22
iptables -A INPUT -j DROP


iptables -D INPUT -j DROP
iptables -A INPUT -p tcp --dport 81 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:81
# This we know...
WANIF=$1
LANIP=$4

# insert necessary modules
insmod ipt_recent
insmod ipt_psd

# Drop previous offenders
iptables -N BANDITDROP
iptables -A INPUT -m recent --rcheck --name BANDIT -j BANDITDROP
iptables -A FORWARD -m recent --rcheck --name BANDIT -j BANDITDROP
iptables -A BANDITDROP -m recent --update --seconds 3600 --rttl --name BANDIT \
-j LOG --log-prefix "Bandit DROP " --log-tcp-sequence --log-tcp-options --log-ip-options
iptables -A BANDITDROP -j REJECT --reject-with icmp-net-unreachable

# Detect port scan
iptables -N PORTSCANDROP
iptables -A INPUT -i ${WANIF} -m psd -j PORTSCANDROP
iptables -A PORTSCANDROP -m recent --set --name BANDIT
iptables -A PORTSCANDROP -m recent --update --seconds 3600 --rttl --name BANDIT \
-j LOG --log-prefix "Port_Scan DROP " --log-tcp-sequence --log-tcp-options --log-ip-options
iptables -A PORTSCANDROP -j REJECT --reject-with icmp-net-unreachable

# SSH server with brute force prevention
iptables -N SSHFORCEDROP
iptables -N SSHACCEPT
iptables -A INPUT -m tcp -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 2 -j SSHACCEPT
iptables -A INPUT -m tcp -p tcp --dport 22 -j SSHFORCEDROP
iptables -A SSHFORCEDROP -m recent --set --name BANDIT
iptables -A SSHFORCEDROP -m recent --update --seconds 3600 --rttl --name BANDIT \
-j LOG --log-prefix "SSH_Brute_Force DROP " --log-tcp-sequence --log-tcp-options --log-ip-options
iptables -A SSHFORCEDROP -j REJECT --reject-with icmp-proto-unreachable
iptables -A SSHACCEPT -j LOG --log-prefix "SSH ACCEPT " --log-tcp-sequence \
--log-tcp-options --log-ip-options
iptables -A SSHACCEPT -j ACCEPT
iptables -t nat -A PREROUTING -i ${WANIF} -p tcp --dport 22 -j DNAT --to-destination ${LANIP}:22
iptables -A INPUT -j DROP
Hat den Vorteil, dass der Router nicht immer aller einer Minute das SysLog durchgehen muss.

Dumm ist nur, dass ich den 2. Lösungsweg erst nach der Fertigstellung des 1. auf http://www.macsat.com/forum/index.php?topic=206.0 entdeckt habe...
Werde trotzdem den 2. Lösungsweg wählen :)

Ciao

thejew
01-08-2008, 10:50
Der 2 lösungsweg sieht sehr interesannt aus.... leider funktioniert er bei mir nicht ganz.
hab das LANIP=$4 mal in br0 geändert da ich mir bei meinem wl500gp nicht sicher bin wo die einzelnen interfaces liegen.
ich hab dan mal versucht von einem remoteserver mich einzuloggen und es war ihm leider zimlich egal wie oft/schnell ich das password falsch eingetippt habe. Werde wohl sonst mal den ersten lösungsweg versuchen weil diese permanenten login verscuhe nerven doch schon recht gut :)

akbor
01-08-2008, 20:55
@thejew
Warum hast du die Variable durch den echten IF-Namen ersetzt? Post-firewall trägt doch ganz automatisch die Interfaces ein. Die Interfaces kannst du übrigens mit 'ifconfig' anzeigen lassen.

@rj.2001
Super Ansatz, man könnte ihn doch glatt auf FTP (Port 20,21) ausweiten. Ihr solltet echt mein Log sehen, da geht die Post ab. Die meisten Deppen versuchen sich als 'Administrator' anzumenlden. Zu dumm, dass ich keinen FTP-User mit dem Namen 'Administrator' vergeben habe :D

Gruß

Robert

thejew
02-08-2008, 13:32
@thejew
Warum hast du die Variable durch den echten IF-Namen ersetzt? Post-firewall trägt doch ganz automatisch die Interfaces ein. Die Interfaces kannst du übrigens mit 'ifconfig' anzeigen lassen.


Hmmm das ich mit ifconfig die interfaces seh wuste ich schon aber ich seh immernoch nicht wie das mit den iptabels zusammenhängt? Warum ist $1 das WAN, und $4 das LAN? wenn das überhaupt richtig ist. Um diesen konflikt aus dem weg zu gehen hab ich einfach die variable in dem script geändert. Müsste eigentlich gehen weil ich anderen iptables code gehsehen hab wo andere das ähnlich gemacht haben.

Ich hab jetzt meine firewall wieder abgestellt da mein asterisk server irgendwie meinen anderen teilnehmer geschluckt hat. Eigenartg den ich hatte extra port 5060 freigegeben.

ich finde die ganze iptables konfiguration zimlich anstrengend und es gibt wenig gute beispiele oder tutorials. Häufig haben leute auch unterschiedlichen code obwohl sie das gleiche bewirken.

schade eigentlich den ich hab mich wenigstens ein bischen sicherer gefühlt :)

akbor
02-08-2008, 14:05
'$1' ist in der 'post-firewall' definitiv das WAN-Interface (bei meinem Router 'vlan1'). Das weiss ich ganz genau, seitdem ich mit wshaper experimentiert habe. Ob '$4' denn tatsächlich das LAN-Interface (bzw. 'br0') ist, kann ich dir nicht mit 100%er SIcherheit sagen. Vielleicht weiss das jemand von den Experten? Oder vielleicht findest du was im englichsprachigen Forum. Wenn nicht, kannst du auch versuchen, Oleg direkt zu fragen.

Gruß

Robert

ghooky
30-09-2008, 08:34
Hallo und danke für den Lösungsvorschlag #2 :D

Nachdem sich auch bei mir die Brute Force Attacken häufen, habe ich selbigen mal ausprobiert, aber einige Fehlermeldungen beim Ausführen der entsprechend angepassten post-firewall erhalten:

Warning: wierd character in interface `-p' (No aliases, :, ! or *).
Bad argument `tcp'
Try `iptables -h' or 'iptables --help' for more information.
Warning: wierd character in interface `-m' (No aliases, :, ! or *).
Bad argument `psd'
Try `iptables -h' or 'iptables --help' for more information.
Warning: wierd character in interface `-p' (No aliases, :, ! or *).
Bad argument `tcp'
Try `iptables -h' or 'iptables --help' for more information.
Hattet ihr ähnliche Fehler? Was stimmt denn hier noch nicht?

Zu funktionieren scheint's aber, heute morgen wurde eine der üblichen Angriffe nach drei Versuchen abgeschmettert ;)

thE_29
30-09-2008, 09:28
Oho ;)
Na da werde ich doch glatt meinen vsftpd_banner auf einen syslog banner umbauen!

Werde es aber für mehere Programme machen, deswegen brauchts ein bißchen, da ich jetzt noch eine config Datei brauche!