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).