| Current File : //proc/2/root/usr/local/scripts/rt.pl |
#!/usr/local/cpanel/3rdparty/bin/perl
#BEGIN { unshift @INC, '/usr/local/cpanel'; }
use lib '/usr/local/share/perl5';
use DBI;
#use Cpanel::SafetyBits ();
#use Cpanel::AcctUtils ();
#use Cpanel::PublicAPI ();
#use Cpanel::LiveAPI ();
use MIME::Lite;
$server = `hostname`;
chomp($server);
###################
my $driver = "SQLite";
open(FD,"</usr/local/scripts/replyto");
@bad = <FD>;
close(FD);
open(FD,"</etc/trueuserdomains");
@all = <FD>;
close(FD);
foreach $event ( @all) {
chomp($event);
($domain,$user) = split(/:/,$event);
$domain =~ s/ +//;
$user =~ s/ +//;
@rc = `ls /home/$user/etc/$domain/*.rcube.db`;
foreach $line ( @rc ) {
$p = 0;
chomp($line);
#$a = $line;
#$a =~ s/\/home\/$user\/etc\/$domain\///g;
#$a =~ s/.rcube.db//g;
(undef,undef,undef,undef,undef,$a) = split(/\//, $line);
$a =~ s/.rcube.db//g;
$out = `sqlite3 $line 'select "reply-to" from identities;'`;
chomp($out);
#$out =~ s/ +//;
#$out =~ s/\n//;
#$out =~ s/\r//;
$out =~ s/[\n\r]+/,/g;
$out =~ s/[\s]+//g;
@replyto = split /,/,$out;
$msg = "";
$sub = "";
$subject = "";
foreach $rto (@replyto) {
(undef,$dom) = split(/\@/,$rto );
if ((scalar @replyto > 0) and ((length($rto) > 5) and ($dom ne $domain)) and ($p eq 0) and (index($rto, "@") != -1) and ( grep( /^$rto/, @bad))) {
$subject = "Conta: $a\@$domain - Possível anomalia com reply-to \n" if ((scalar @replyto > 0) and ((length($rto) > 5) and ($dom ne $domain)) );
$p=1;
$own = `whmapi1 accountsummary user=$user |grep owner`;
chomp($own);
(undef,$owner) = split(/:/,$own);
$owner =~ s/ +//;
if (($owner ne "root") and ($owner ne "ptispapi")) {
$msg = "ATENÇÃO !!! - ENVIAR PARA CONTA DE REVENDA - <strong> $owner </strong> - servidor $server !!!! <BR><BR>";
} else {
$msg = "Conta \"$user\" não pertence a revenda. - Servidor $server <br><br><hr><br><br>";
}
$msg = $msg . "Estimado(a) Cliente,<br><br>Vimos por este meio notificá-lo que foi detectada a presença de endereços \"Reply-to\" configurados no webmail Roundcube da conta $a\@$domain e que pedimos que verifique dado que os mesmos nos parecem suspeitos. <br><br>";
$msg = $msg . "Segue abaixo a lista dos endereço(s) encontrado(s), a sua data de criação e nome da \"Identity\" configurada no Roundcube: <br><br>";
}
if (index($rto, "<") != -1) {
(undef,$right) = split(/\</,$rto);
($rto1,undef) = split(/\>/,$right );
} else {
$rto1 = $rto;
}
$cnt = $rto1 =~ tr/\@//;
if ($cnt >1 ) {
@replyto1 = split /\;/,$rto;
foreach $rto1 (@replyto1) {
if ( grep( /^$rto1/, @bad)) {
(undef,$dom) = split(/\@/,$rto1 );
$driver = "SQLite";
$database = "$line";
$dsn = "DBI:$driver:dbname=$database";
$userid = "";
$password = "";
$dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) or die $DBI::errstr;
$stmt = qq(SELECT changed,name from identities where \"reply-to\" = \"$rto1\";);
$sth = $dbh->prepare( $stmt );
$rv = $sth->execute() or die $DBI::errstr;
while(my @row = $sth->fetchrow_array()) {
$dados = "( Identity name: $row[1] - criada em: $row[0] )";
}
$sub = $sub . "Reply-to: $rto1 : $dados <br>" if ((length($rto1) > 5) and ($dom ne $domain) and (index($rto, "@") != -1) );
}
}
} else {
if ( grep( /^$rto/, @bad)) {
(undef,$dom) = split(/\@/,$rto );
$driver = "SQLite";
$database = "$line";
$dsn = "DBI:$driver:dbname=$database";
$userid = "";
$password = "";
$dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) or die $DBI::errstr;
$stmt = qq(SELECT changed,name from identities where \"reply-to\" = \"$rto\";);
$sth = $dbh->prepare( $stmt );
$rv = $sth->execute() or die $DBI::errstr;
while(my @row = $sth->fetchrow_array()) {
$dados = "( Identity name: $row[1] - criada em: $row[0] )";
}
$sub = $sub . "Reply-to: $rto : $dados <br>" if ((length($rto) > 5) and ($dom ne $domain) and (index($rto, "@") != -1) );
#print "\tReply-to: $rto : $dados \n" if ((length($rto1) > 5) and ($dom ne $domain) and (index($rto, "@") != -1) );
}
}
}
if ($subject ne "") {
$msg = $msg . $sub;
$msg = $msg . "<br><br>Se estes endereços \"Reply-to\" não foram criados por vós deverão ser removidos com urgência.<br><br> Caso a password da conta de email em questão não tenha sido mudada desde a data de criação do \"Reply-to\" mais recente deverão alterar a mesma porque poderá estar ainda comprometida.<br><br>";
$msg = $msg . "Após essa acção tomada sugerimos que verifiquem os pontos de acesso à referida conta para a presença de vírus, trojans, keyloggers, etc, que possam estar a facilitar as credenciais a terceiros.<br><br>";
$msg = $msg . "Lembramos que este tipo de acção é conseguido através do acesso indevido a contas de email por terceiros, usando as credenciais válidas das mesmas. Essas credenciais são obtidas na esmagadora maioria dos casos através de trojans/virus/keyloggers/etc instalados nos dispositivos onde as contas são acedidas. <br><br>";
$msg = $msg . "Outra forma poderá ser através do uso de redes WiFi não encriptadas ( normalmente públicas e sem password ) e com protocolos de mail sem TLS/SSL, facilitando o \"sniffing\" desses dados por terceiros.<br><br>";
$msg = $msg . "IMPORTANTE: caso estes \"Reply-to\" sejam válidos queiram por favor informar-nos em resposta a este ticket para que os possamos remover da lista de endereços suspeitos.<br><br>";
$to = "pazevedo\@ptisp.pt";
$msg = MIME::Lite->new(
From =>'Malware/intrusion detector <message@ptisp.pt>',
To =>$to,
Subject =>$subject,
Data =>$msg,
Type =>'text/html'
);
$user = "message\@ptisp.systems";
$pass = "geicu7ohy4utaiceiN6eGe";
$msg->send('smtp', 'mta.ptisp.systems', AuthUser=>$user, AuthPass=>$pass, Timeout=>60,);
}
}
}