tags page

howto block w00tw00t.isc.sans.dfind:) und andere scans mit iptables

In letzter Zeit sind mir in meinen webserverlogs vermehrt scans von scripten nach bestimmten Pfaden bzw. nicht geschlossene Verbindungen die von user agents stammten die den string “w00tw00t.isc.sans.Dfind:)” und Variationen davon beeinhalteten aufgefallen. Diese stammten teilweise von Dialup ipadressen aber auch von vermutlich geknackten webservern mit festen ipadressen. Um dem ganzen Einhalt zu gebieten habe ich ein shellscript geschrieben, das die webserverlogs nach bestimmten strings absucht und die dazugehoerigen IP-adressen sperrt. Das script setzt voraus, das keinerlei Installationen von z.B. phpmyadmin oder anderer Verwaltungssoftware in standardpfaden existiert. Diese sollte ein verantwortungsvoller Admin auf öffentlichen Produktionsservern sowieso nicht verwenden ;)

Eine zeitabhängige Variante ist noch in Arbeit, leider fehlt mir dafür momentan die Zeit. Ich empfehle doppeltes und dreifaches testen bevor das ganze mit einem cronjob automatisiert wird.

Wenn die Befehle unterhalb der

###debug###

Statements einkommentiert werden kann das ganze getestet werden. Zum testen sollten auch die “scharfen”

iptables Zeilen wie folgt auskommentiert werden:


#${IPTABLESPATH} -I INPUT -s "$ip" -j LOG --log-level 4 --log-prefix '** HACKERS **';
#${IPTABLESPATH} -I INPUT -s "$ip" -j DROP;
#${IPTABLESPATH} -I OUTPUT -s "$ip" -j DROP;

Am Anfang der root crontab sollten folgende Zeilen stehen damit iptables gefunden wird und eventuelle Fehler per email gesendet werden.


MAILTO='someaddress@somedomain.com'
PATH=/usr/sbin:/usr/bin:/sbin:/bin

ich empfehle SEHR das whitelisting von anderen servern oder der momentan verwendeten ip
-> waehrend des testens habe ich auch aus Versehen meine eigene zu dem Zeitpunkt aktuelle dynamische ipadresse gesperrt :(

Und wie immer gilt: Benutzung auf eigene Gefahr + Erst DENKEN/verstehen und dann implementieren.

Hier nun das script:


#! /bin/bash
############################################################################################################################
# badstrings ban script
# version 0.3beta
# by arnd@netzturbine.de (https://identi.ca/netzturbine) and THEOTHERGUYOFNETZTURBINE
# parses the apache logs for banstrings and greps latest attacker ips from accesslogs and errorlogs
# loads list w/o doubles into iptables
# a time releveant component needs to be implemented
# !!!Handle w/ care whitelisting of ip’s is very necessary (i.e another server to keep access if locked out from own ip)!!!
############################################################################################################################

#devel path
#cd ~/Documents/devel/ip_blocker/;

#use on live systems directory must exist and contain this script
cd /root/bin/ip_block/;

###debug####
#pwd;

#set system type
#could be suse or non-suse
#if suse use SuSEfirewall2 scripts on top of this
system="suse"

#check if iptables is installed and found otherwise exit
IPTABLESPATH=$(which iptables);
if [ $? == "1" ]
then
echo "iptables not found";
exit;
fi

#set logformat
# if it is vhost 2nd ip ist to block if it is common 1st ip is to block
# check log_format.conf for possible values
# check somevhost.conf for used format
LOGFORMAT="vhost";

#set logpath
LOGPATH="/var/log/apache2/";

#Declare accesslogs array
#if multiple accesslogs are used put them with blanks like
# ACCESSLOGS=( ${LOGPATH}access_log ${LOGPATH}other_access_log);
ACCESSLOGS=( ${LOGPATH}access_log;

#Declare errorlogs array
#if multiple errorlogs are used put them with blanks
ERRORLOGS=( ${LOGPATH}error_log );

#declare banstringsarray
#be careful all requests containing these strings !!!case insensitive!!! AND throwing error 404 in access logs or showing up in error log are blocked except whitelisted ip's
BANSTRINGS=( 'w00t' 'phpmy' 'mysql' 'script' 'attacker' );

#resetting logs
# no better way to keep bans low until timestamps are implemented
# bears risk of being scanned by same host again
# comment in if users are mostly on dialup hosts
# logrotate should be on daily basis
#rm ./ban*;

# get number of elements in arrays

ACCESSLOGSNUMBER=${#ACCESSLOGS[@]}
###debug####
#echo "ACCESSLOGSNUMBER: ${ACCESSLOGSNUMBER}";
ERRORLOGSNUMBER=${#ERRORLOGS[@]}
###debug####
#echo "ERRORLOGSNUMBER: ${ERRORLOGSNUMBER}";
BANSTRINGSNUMBER=${#BANSTRINGS[@]}
###debug####
#echo "BANSTRINGSNUMBER: ${BANSTRINGSNUMBER}";

#parsing access logs looking for 404 errors and ${BANSTRINGS} to keep correct requests

i=0;
# outer loop through logs
while [ ${i} -lt ${ACCESSLOGSNUMBER} ]
do
###debug####
#echo "parsing log: "${ACCESSLOGS[${i}]};
#inner loop through banstrings
j=0;
while [ ${j} -lt ${BANSTRINGSNUMBER} ]
do
###debug####
#echo "No ${j} string to ban: ${BANSTRINGS[${j}]}";
#if logformat is vhost 2nd ip is attacker
if [ "${LOGFORMAT}" == "vhost" ]
then
#creating list - printing 2nd column - logformmat vhost - sorting w/ uniqueness
less ${ACCESSLOGS[${i}]} | grep 404 | grep -i ${BANSTRINGS[${j}]}.* | awk '{ print $2 '} | sort -u >> ./ban_latest_list;
else
#creating list - printing 1st column - Log format common - sorting w/ uniqueness
less ${ACCESSLOGS[${i}]} | grep 404 | grep -i ${BANSTRINGS[${j}]}.* | awk '{ print $1 '} | sort -u >> ./ban_latest_list;
fi
j=$[${j}+1];
done
#increment
i=$[${i}+1];
done

#parsing error logs
#creating list from error logs
i=0;
# outer loop through logs
while [ ${i} -lt ${ERRORLOGSNUMBER} ]
do
###debug####
#echo "parsing log: "${ERRORLOGS[${i}]};
#inner loop through banstrings
j=0;
while [ ${j} -lt ${BANSTRINGSNUMBER} ]
do
less ${ERRORLOGS[${i}]} | grep -i ${BANSTRINGS[${j}]}.* | awk '{ print $8 '} | sort -u | sed 's/]//g' >> ./ban_latest_list;
j=$[${j}+1];
done
#increment
i=$[${i}+1];
done

#merge lists
less ./ban_latest_list > ./ban_tmp_list;
less ./ban_list >> ./ban_tmp_list;
#create final list keep ip's unique
less ./ban_tmp_list | sort -u > ./ban_list_unique;
#remove empty lines
sed '/^$/d' ./ban_list_unique > ./ban_list;

#flushing firewall
if [ "${system}" == "suse" ]
then
###debug####
#echo "suse";
/sbin/SuSEfirewall2 stop 2>&1 > /dev/null;
/sbin/SuSEfirewall2 start 2>&1 > /dev/null;
else
###debug####
#echo "non-suse";
${IPTABLESPATH} -F;
${IPTABLESPATH} -X;
${IPTABLESPATH} -t nat -F;
${IPTABLESPATH} -t nat -X;
${IPTABLESPATH} -t mangle -F;
${IPTABLESPATH} -t mangle -X;
${IPTABLESPATH} -P INPUT ACCEPT;
${IPTABLESPATH} -P FORWARD ACCEPT;
${IPTABLESPATH} -P OUTPUT ACCEPT;
fi

#load list of blocked ip's
for ip in $(< ./ban_list);
do
#keep whitelisted hosts even if they give a false error + filter some strings falsely returned like "-" OR "PHP"
#ip’s put in if statement are NOT blocked whatever happens
if [ "${ip}" == "" ] || [ "${ip}" == "" ] || [ "${ip}" == "" ] \
|| [ "${ip}" == "-" ] || [ "${ip}" == "PHP" ] || [ "${ip}" == "file" ]
then
###debug####
#echo "${ip} whitelisted - do nothing";
continue;
else
###debug####
#echo "need to block attacker ${ip}";
${IPTABLESPATH} -I INPUT -s "$ip" -j LOG --log-level 4 --log-prefix '** HACKERS **';
${IPTABLESPATH} -I INPUT -s "$ip" -j DROP;
${IPTABLESPATH} -I OUTPUT -s "$ip" -j DROP;
fi
done

###debug####
#less ./ban_list;

Das ganze ersetzt natürlich keine apache modsecurity application firewall sondern ist ein eher krudes shellscript.

so long
Arnd

Posted: 29 September 2010 by Arnd

Browserkunde dritter Teil – Profile im firefox anlegen und managen

Mehrere Profile im firefox zu haben kann eine Menge Zeit sparen und zusaetzliche Sicherheit beim Surfen ermoeglichen. Ich habe bei mir immer mehrere Profile in Benutzung. Das hat den Grund, das ich ich viel teste mir dabei aber mein Standardprofil mit allen bookmarks, bewaehrten plugins und Multimediacodecs nicht dabei zerlegen moechte. Beim Onlinebanking oder Webmailen oder anderen vertraulichen Aktionen wiederum moechte ich nicht immer vorm Aufrufen der Seiten aus Sicherheitsgruenden alles deaktivieren. Ausserdem kann das Multitalent Browser in Verbindung mit Webservices eine komplette Officesoftware samt Groupware ersetzen. Read the rest of this entry »

Posted: 12 April 2008 by Arnd

wordpress sicherheitsaspekte – warum fremde themes und plugins riskant sind

Darum sollten nur plugins und themes aus sicherer Quelle installiert werden. Nach dieser Geschichte bin ich sensibler geworden, was Content Klau und das Interesse an meinem kleinen Blog angeht. Selbst ein kleines Blog scheint ja einiges zum “Blackhat” optimieren von webseiten zu bieten, und sei es der gescrapte Content. Der Trick mit dem “vergifteten” WP Theme das dann von allein anfaengt “nach Hause” zu telefonieren oder die suchmaschinen zu spammen ist dann der feuchte Traum des “blackhat” SEO.

Da die von mir verwendeten Themes selbst erstellt sind kann hier so etwas nicht passieren. Allerdings verwenden viele Blogger Themes aus fremder Quelle. Es gibt ja viele schicke Themes da drausssen, und ist ja nett eine neue “Tapete” fuers Blog per Mausclick zu aktivieren. Viele werden nicht wissen, was welche funktion in der mitkopierten functions.php des Themes den lieben langen Tag so macht. Das scheitert auch an den verstaendlicherweise schmalen PHP Kenntnissen vieler Blogger. Wer will schon PHP Wizard werden, nur weil er ein Blog betreibt. Jedenfalls schuetzt das erstellen des eigenen Themes am besten vor unliebsamen Ueberraschungen.

Leider kann man sich nicht jedes Plugin auch selbst schreiben und obwohl ich mir schon einige Plugins angesehen und auch umgeschrieben habe schaue ich mir auch nicht jedes Plugin bis in den kleinsten Code Fitzel an. Da vertraue ich dem wordpress plugin Verzeichnis installiere nur wirklich notwendiges und halte das installierte auf dem aktuellsten Stand. “update early + update often” ist der beste Schutz vor unangenehmen Ueberraschungen. Das wird allzuoft und auch von Grossen Seiten wie zdnet vernachlaessigt. Es kann jeden erwischen und momentan ist “Alphablogger” Nico Lumma mal wieder Kommentar spam verseucht. Ich gehe jedenfalls stark davon aus, das er nicht mit den ersten beiden und dem fuenften Kommentar in der “recent comments” Liste einverstanden ist (Stand: 9.4.2008-15:16).

Es spielt den Spammern in die Karten, das zillionen von aufgegeben Blogs auf alten Softwarestaenden noch “aktiv” sind. Ein “blackhat” SEO hat heutzutage vermutlich ein kleines Portfolio Blog Zombies mit denen er Backlinks erzeugen kann.

Eine gute Lektuere zu dem Thema sind Textos 9 Quick Tips zur Absicherung eines WP Blogs.

Happy Blogging und immer alles schoen updaten

Posted: 9 April 2008 by Arnd

should be invisible