Jak wykryć skrypt, przez który wysyłany jest spam

    Jeśli php działa na serwerze jako moduł Apache (starsza wersja Plesk), to w podstawowych ustawieniach serwera bez analizy plików jest praktycznie niemożliwe, aby dowiedzieć się, jaki sposób haker wgrał na serwer skrypt i użył go do rozsyłania spamu. Skrypty ze wszystkich stron internetowych są uruchamiane pod kontrolą użytkownika Apache. W logu serwera pocztowego możemy znaleźć dużą liczbę wpisów, z których wiemy, że spam pochodzi z serwera, ale informacji, z którego skryptu/witryny brakuje. 
UWAGA: poniższe działania mogą wpłynąć na obciążenie serwera, dlatego zalecamy wykonanie ich tylko wtedy, gdy chcesz wykryć spamera.... 

1. wersja php > 5.3 i php działający jako CGI/FastCGI 
w takich przypadkach dyrektywy php mogą być używane bezpośrednio do rejestrowania szczegółów dotyczących wiadomości e-mail wysłanych za pomocą funkcji mail(). 
  • mail.add_x_header (np: mail.add_x_header = On)
  • mail.log (np: mail.log = /var/log/php-mail.log)
powyższe dyrektywy są włączone w main  php.ini (w lokalizacji/etc/php.ini). Jak edytować php.ini. na przykład jest to w poście Administracja przez SSH. (lub Jak edytować php). Następnie wymagane jest ponowne uruchomienie Apache. 

* Następnie znajdziesz podobne linie w dzienniku: 
 mail() on [/var/www/vhosts/test.tld/httpdocs/mail.php:10]: To: admin@forpsi.com -- Headers: from:webmail@test.tld X-mailer:phpWebmail X-Priority:3

Wynika z nich, że z skryptu mail.php znajdujacym się w ścieżce bezwzględnej na serwerze /var/www/vhosts/test.tld/httpdocs/ wiadomość e-mail ze zdefiniowanymi przez użytkownika nagłówkami została wysłana na adres admin@forpsi.com  from: webmail@test.tld, X-mailer:phpWebmail, X-Priority:3.

* mail.add_x_header dodaje nagłówek do każdego e-maila wysłanego w ten sposób 
 X-PHP-Originating-Script: 10000:mail.php

gdzie liczba przed nazwą skryptu wskazuje UID właściciela tego skryptu (w tym przypadku UID to 1000). Z pliku /etc/passwd dowiemy się, który to użytkownik .:

 pokus:x:10000:505::/var/www/vhosts/test.tld:/bin/false

Trzecia pozycja to wymagane dane. Teraz wiemy, że miała miejsce próba „nadużycia” strony internetowej użytkownika. Jednak dodanie tego nagłówka do każdego e-maila nie zawsze jest pożądane ze względów bezpieczeństwa. Na przykład dane te nie ujawnią adresu IP, z którego wywołano skrypt. Jeśli php działa jako moduł Apache, nie wykryjesz użytkownika. Ale spróbuj innego sposobu na wykrycie spamera: 



 2. php < 5.3 a php jako modul apache

Stworzymy skrypt-wrapper, który zapisze wymagane dane przed wysłaniem wiadomości e-mail. PHP wysyła maile przez /var/qmail/bin/sendmail. Zmień nazwę oryginału na  /var/qmail/bin/sendmail-qmail. Następnie tworzymy skrypt o nazwie  /var/qmail/bin/sendmail-wrapper i stworzymy z niego dowiązanie symboliczne do  /var/qmail/bin/sendmail. Po małej modyfikacji php.ini zapewniającej wymagane zmienne (takie jak adres IP atakującego) jesteśmy gotowi do „złapania” spamera. 
  • zmień nazwę oryginalnego programu (nie usuwaj, będziemy go potrzebować do dostarczania wiadomości e-mail) 
           
     mv /var/qmail/bin/sendmail /var/qmail/bin/sendmail-qmail  
        
  • w popularnym edytorze tekstu (vim, nano, pico, mcedit...) tworzymy skrypt /var/qmail/bin/sendmail-wrapper o treści:
         
     #!/bin/sh
         logger -p mail.info sendmail-wrapper: site=${HTTP_HOST}, client_IP=${REMOTE_ADDR}, script=${SCRIPT_FILENAME}, uid=${UID}, user=$(whoami)
       
     
        
     /var/qmail/bin/sendmail-qmail "$@"   
       
    Polecenie logger -p mail.info sendmail-wrapper co zapewni logowanie w dzienniku systemowym  (/usr/local/psa/var/log/mailnames) a kazdy wpis będzie rozpoczynał sie od  "sendmail-wrapper: ".
          
  • Stworzymy dowiązanie symboliczne z nazwą  /var/qmail/bin/sendmail směřující na /var/qmail/bin/sendmail-wrapper
           
     ln -s /var/qmail/bin/sendmail-wrapper /var/qmail/bin/sendmail
  • w tym stanie wszystko byłoby wyświetlane w dzienniku. Na przykład strona internetowa, adres IP klienta nie. Należy to zorganizować w PHP, znajdując wartość zmiennej podczas uruchamiania każdego skryptu  HTTP_HOST, REMOTE_ADDR, SCRIPT_FILENAME. Stwórzmy plik  /tmp/php_set_envs.php z następującą treścią 
            
     <?php
        
     putenv("HTTP_HOST=".@$_SERVER["HTTP_HOST"]);
        
     putenv("SCRIPT_FILENAME=".@$_SERVER["SCRIPT_FILENAME"]);
        
     putenv("REMOTE_ADDR=".@$_SERVER["REMOTE_ADDR"]);
        
     ?>
       
    i upewnimy się, że jest wykonywany, gdy uruchamiany jest każdy skrypt php (w tym miejscu ponownie ostrzegam, że działania mogą wpłynąć na obciążenie serwera, więc ogranicz korzystanie z tego samouczka gdy jest to konieczne!!!). Odbywa się to poprzez dodanie linii.
            
     auto_prepend_file = /tmp/php_set_envs.php
       
        do konfiguracji PHP - /etc/php.ini.
Po wykonania zmian. Restartujemy apache, a po wysłaniu testowej poczty, podobna linia powinna pojawić się w logu serwera pocztowego;

Dec 13 13:58:44 TEST-VPS logger: sendmail-wrapper: site=www.test.tld, client_IP=XX.XX.XX.XX, script=/var/www/vhosts/test.tld/httpdocs/testik/mail.php, uid=48, user=apache

bezpośrednio pod tym zapisem nastąpi dostarczenie wiadomości e-mail przez serwer pocztowy. Te informacje powinny wystarczyć, aby dowiedzieć się, skąd wysyłany jest spam. W następnej kolejności (oprócz usunięcia skryptu spamującego) należy sprawdzić aplikację, aby zobaczyć, w jaki sposób szkodliwy skrypt został przesłany na serwer. Samo usunięcie skryptu nie rozwiąże rzeczywistego problemu (tj. luki w zabezpieczeniach aplikacji).