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&Ccedil;&Atilde;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&ccedil;a de um \"Email Filter\"/Filtro de Email aparentemente injectado por terceiros na conta $pop ( que eventualmente permite aos mesmos receberem uma c&oacute;pia de todas as mensagens recebidas nessa conta). <br><br>";
                        $msg = $msg . "O filtro malicioso em quest&atilde;o ( com o nome \"".$filter."\" e  que encaminhava para $badguy ) foi j&aacute; removido.<br><br>";
                        $msg = $msg . "Este tipo de ac&ccedil;&atilde;o &eacute; conseguido atrav&eacute;s do acesso indevido ao cPanel ( ou &agrave; conta de email em quest&atilde;o ) por terceiros, usando as credenciais v&aacute;lidas do mesmo. Essas credenciais s&atilde;o obtidas na esmagadora maioria dos casos atrav&eacute;s de trojans/virus/keyloggers/etc instalados nos dispositivos onde as contas s&atilde;o acedidas. <br><br>";
                        $msg = $msg . "Uma outra forma poder&aacute; ser atrav&eacute;s do uso de redes WiFi n&atilde;o encriptadas ( normalmente p&uacute;blicas e sem password ) e com protocolos de mail sem TLS/SSL, facilitando o \"sniffing\" desses dados por terceiros.<br><br>";
                        $msg = $msg . "Dever&atilde;o alterar a password da conta de cPanel em quest&atilde;o com urg&ecirc;ncia.<br><br>";
                        $msg = $msg . "Ap&oacute;s essa ac&ccedil;&atilde;o tomada sugerimos que verifiquem os pontos de acesso &agrave; referida conta para a presen&ccedil;a de v&iacute;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&iacute;timo queira por favor contactar-nos pelo nosso servi&ccedil;o de Helpdesk ( indicando o identificador deste ticket ) para que a situa&ccedil;&atilde;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,);

}