| Current File : //proc/3/root/usr/local/scripts/killfilter.pl |
#!/usr/local/cpanel/3rdparty/bin/perl
use Email::Valid;
use lib '/usr/local/share/perl5';
use Cpanel::SafetyBits ();
use Cpanel::AcctUtils ();
use Cpanel::PublicAPI ();
use Cpanel::LiveAPI ();
use MIME::Lite;
use JSON;
use Data::Dumper;
$DEBUG=0;
$filetolocate = '/root/.accesshash';
if (!(-f $filetolocate)) {
$cmd = "/usr/local/cpanel/bin/realmkaccesshash";
system($cmd);
$cmd = "chmod 660 /root/.accesshash";
system($cmd);
}
$server = `hostname`;
chomp($server);
$loop=0;
@users = `ls -last /var/cpanel/users |awk {\'print \$10\'}`;
open(FD,"</usr/local/scripts/forwarders")||die("Cannot open file");
@badguys = <FD>;
close(FD);
foreach $user ( @users) {
chomp($user);
next if $user eq "";
next if $user eq ".";
next if $user eq "..";
next if $user eq "system";
print "Processing $user ...\n" if $DEBUG;
@pops = `uapi --user=$user Email list_pops \|grep email`;
foreach $popa ( @pops ){
$forward = "";
chomp($popa);
(undef,$pop) = split(/\:/,$popa);
print "Processing account $pop \n" if $DEBUG;
$cnt=0;
($mail,$domain) = split(/\@/,$pop);
$mail =~ s/ //g;
$conta = $mail."%40".$domain;
$cenas = `uapi --user=$user Email list_filters account=$conta --output=jsonpretty`;
#print Dumper($cenas);
$content = decode_json($cenas);
while ($cnt < 5 ){
$fwd1 = "";
$filtro = "";
$forward = "";
$filtro = $content->{result}->{data}[$cnt]->{filtername};
#startloop
$fwd1 = $content->{result}->{data}[$cnt]->{actions}[0]->{dest};
#print "CNT:$cnt - fwd0 = $fwd1\n" if ($fwd1 ne "");
#print "CNT:$cnt - fwd0 = $fwd1\n" ;
if (Email::Valid->address($fwd1)) {
$forward = $fwd1;
}
if ( Email::Valid->address($forward) ){
print "\tForwarder found: $forward ( Filter: $filtro )\n" if $DEBUG;
@matches = grep { /$forward/ } @badguys;
if (scalar(@matches) >= 1 ){
#if (scalar(@matches) >= 1 and ( $filtro eq "." or $filtro eq ",")){
foreach $match (@matches){
$pop =~ s/ //g;
print "\tINJECTED: $user - $pop - $filtro - $forward \n" if $DEBUG;
mandamail($server,$user,$pop,$forward,$filtro);
($localpart,$domain ) = split(/\@/, $pop);
chop($localpart);
$cmd="uapi --user=$user Email delete_filter account=$pop filtername=\"$filtro\"";
system($cmd);
$forward="";
$filtro="";
}
}
} #end mail&remove
#endloop
#startloop
$fwd1 = $content->{result}->{data}[$cnt]->{actions}[1]->{dest};
#print "CNT:$cnt - fwd1 = $fwd1\n" if ($fwd1 ne "");
#print "CNT:$cnt - fwd1 = $fwd1\n" ;
if (Email::Valid->address($fwd1)) {
$forward = $fwd1;
}
if ( Email::Valid->address($forward) ){
print "\tForwarder found: $forward ( Filter: $filtro )\n" if $DEBUG;
@matches = grep { /$forward/ } @badguys;
if (scalar(@matches) >= 1 ){
#if (scalar(@matches) >= 1 and ( $filtro eq "." or $filtro eq ",")){
foreach $match (@matches){
$pop =~ s/ //g;
print "\tINJECTED: $user - $pop - $filtro - $forward \n" if $DEBUG;
mandamail($server,$user,$pop,$forward,$filtro);
($localpart,$domain ) = split(/\@/, $pop);
chop($localpart);
$cmd="uapi --user=$user Email delete_filter account=$pop filtername=\"$filtro\"";
system($cmd);
$forward="";
$filtro="";
}
}
} #end mail&remove
#endloop
#startloop
$fwd1 = $content->{result}->{data}[$cnt]->{actions}[2]->{dest};
#print "CNT:$cnt - fwd2 = $fwd1\n" if ($fwd1 ne "");
#print "CNT:$cnt - fwd2 = $fwd1\n" ;
if (Email::Valid->address($fwd1)) {
$forward = $fwd1;
}
#if ($forward eq ""){
# next;
#}
#if ($filtro eq ""){
# next;
#}
if ( Email::Valid->address($forward) ){
print "\tForwarder found: $forward ( Filter: $filtro )\n" if $DEBUG;
@matches = grep { /$forward/ } @badguys;
if (scalar(@matches) >= 1 ){
#if (scalar(@matches) >= 1 and ( $filtro eq "." or $filtro eq ",")){
foreach $match (@matches){
$pop =~ s/ //g;
print "\tINJECTED: $user - $pop - $filtro - $forward \n" if $DEBUG;
mandamail($server,$user,$pop,$forward,$filtro);
($localpart,$domain ) = split(/\@/, $pop);
chop($localpart);
$cmd="uapi --user=$user Email delete_filter account=$pop filtername=\"$filtro\"";
system($cmd);
$forward="";
$filtro="";
}
}
} #end mail&remove
#endloop
$cnt++;
} #end cnt
}
}
sub mandamail {
($server, $user, $pop, $badguy, $filter) = @_;
($localpart,$domain ) = split(/\@/, $pop);
my $owner = Cpanel::AcctUtils::getdomainowner( $domain, { 'default' => '' } );
if ( !$owner ) {
die "Cannot find the owner of $domain, try rebuilding /etc/userdomains first with /usr/local/cpanel/scripts/updateuserdomains";
}
my $pubapi = Cpanel::PublicAPI->new( 'usessl' => '0');
my $res = $pubapi->whm_api('domainuserdata', "domain=$domain");
my $owner = $res->{'data'}->{'userdata'}->{'owner'};
my $fuser = $res->{'data'}->{'userdata'}->{'user'};
my $contacto = $res->{'data'}->{'userdata'}->{'serveradmin'};
my $homedir = $res->{'data'}->{'userdata'}->{'homedir'};
if ( !$homedir ) {
die "Cannot find the owner of $domain";
}
if (($owner ne "root") and ($owner ne "ptispapi")) {
$msg = "Servidor $server - ATENÇÃO !!! - ENVIAR PARA CONTA DE REVENDA - <strong> $owner </strong> ( hint: $contacto ) !!!! <BR><BR>";
} else {
$msg = "Servidor $server - Conta nao parece pertencer a revenda. Cliente: $fuser endereco indicado na conta: $contacto <br><br>";
}
$msg = $msg . "Estimado(a) Cliente,<br><br>Vimos por este meio notificar que foi detectada a presença de um \"Email Filter\"/Filtro de Email aparentemente injectado por terceiros na conta $pop ( que eventualmente permite aos mesmos receberem uma cópia de todas as mensagens recebidas nessa conta). <br><br>";
$msg = $msg . "O filtro malicioso em questão ( com o nome \"".$filter."\" e que encaminhava para $badguy ) foi já removido.<br><br>";
$msg = $msg . "Este tipo de acção é conseguido através do acesso indevido ao cPanel ( ou à conta de email em questão ) por terceiros, usando as credenciais válidas do mesmo. 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 . "Uma 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 . "Deverão alterar a password da conta de cPanel em questão com urgência.<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 . "<B>IMPORTANTE:</B> caso este forwarder seja legítimo queira por favor contactar-nos pelo nosso serviço de Helpdesk ( indicando o identificador deste ticket ) para que a situação seja devidamente corrigida.<br><br>";
$to = "abusecc\@ptisp.pt";
$mesg = MIME::Lite->new(
From =>'Malware/intrusion detector <message@ptisp.pt>',
To =>$to,
Subject =>"Conta $pop - Dominio $domain - Filtro de email suspeito detectado ",
Data =>$msg,
Type =>'text/html'
);
$usr = "message\@ptisp.systems";
$pass = "geicu7ohy4utaiceiN6eGe";
$mesg->send('smtp', 'mta.ptisp.systems', AuthUser=>$usr, AuthPass=>$pass, Timeout=>60,);
}