Jak zjistit skript, přes který se spamuje

Pokud je na serveru php spouštěno jako modul apache (starší verze Plesku), je v základním nastavení serveru prakticky nemožné bez analýzy souborů zjistit, jaký skript hacker na server nahrál a použil ho k rozeslání spamů. Skripty ze všech webů jsou totiž spouštěné pod uživatelem apache. V logu mailserveru pak najdeme velké množství záznamů ze kterých sice poznáme že je ze serveru spamováno, ale chybí informace z jakého skriptu/webu.
POZOR: následující akce mohou ovlivnit zatížení serveru, a tak je doporučujeme provádět až v případě, že potřebujete zjistit spamera....

1. php verze > 5.3 a php spouštěné jako CGI/FastCGI
pro tyto případy lze použít přímo direktivy php pro logování podrobností o emailech odeslaných přes funkci mail().
  • mail.add_x_header (například mail.add_x_header = On)
  • mail.log (například mail.log = /var/log/php-mail.log)

tyto direktivy se zapínají v hlavním php.ini (umístěn v /etc/php.ini). Postup úpravy php.ini. je například v příspěvku Správa přes SSH. (nebo Jak upravit php). Poté je vyžadován restart apache.

* V logu pak najdete podobné řádky:

 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

Z nich vyplývá, že ze skriptu mail.php v absolutní cestě na serveru /var/www/vhosts/test.tld/httpdocs/ byl na admin@forpsi.com odeslán mail s uživatelsky definovanými hlavičkami from: webmail@test.tld, X-mailer:phpWebmail, X-Priority:3.


* mail.add_x_header přidává do  každého takto odeslaného emailu hlavičku

 X-PHP-Originating-Script: 10000:mail.php

kde číslo před názvem skriptu označuje UID vlastníka tohoto skriptu (v tomto případě má UID 1000). Z /etc/passwd zjistíme, o jakého uživatele se jedná

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

Třetí položka je požadovaný údaj. Teď už víme, že byl "zneužit" web uživatele pokus. Přidávat tuto hlavičku do každého emailu ale nemusí být kvůli bezpečnosti vždy žádoucí . Tyto údaje například neodhalí IP adresu, ze které byl skript zavolán. Je-li php spouštěné jako modul apache, nezjistíte uživatele. Stačí ale zkusit další cestu ke zjištění spammera:



2. php < 5.3 a php jako modul apache


Vytvoříme skript-wrapper, který před odesláním emailu zajistí uložení požadovaných údajů. PHP odesílá maily přes /var/qmail/bin/sendmail. Originál přejmenujeme na /var/qmail/bin/sendmail-qmail. Pak vytvoříme skript s názvem /var/qmail/bin/sendmail-wrapper a z něj vytvoříme symlink na /var/qmail/bin/sendmail. Po drobné úpravě php.ini zajišťující požadované proměnné (jako například IP adresa útočníka) jsme připraveni na "odchycení" spammera.
  • přejmenujeme původní program (nemazat, budeme ho potřebovat k doručování emailu)

     mv /var/qmail/bin/sendmail /var/qmail/bin/sendmail-qmail

  • v oblíbeném textovém editoru (vim, nano, pico, mcedit...) vytvoříme skript /var/qmail/bin/sendmail-wrapper s obsahem:

     #!/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 "$@"

    řádek logger -p mail.info sendmail-wrapper zajistí logování do systémového logu (/usr/local/psa/var/log/mailnames) s tím, že na začátku každého logu bude řádek "sendmail-wrapper: ".

  • Vytvoříme symlink s názvem /var/qmail/bin/sendmail směřující na /var/qmail/bin/sendmail-wrapper

     ln -s /var/qmail/bin/sendmail-wrapper /var/qmail/bin/sendmail
  • v tomto stavu by se v logu zobrazilo vše. Třeba web, IP adresa klienta ne. To je třeba zařídit v PHP a to tak, že při spuštění každého skriptu zjistíme hodnotu proměnné HTTP_HOST, REMOTE_ADDR, SCRIPT_FILENAME. Vytvoříme soubor /tmp/php_set_envs.php s následujícím obsahem

     <?php
     putenv("HTTP_HOST=".@$_SERVER["HTTP_HOST"]);
     putenv("SCRIPT_FILENAME=".@$_SERVER["SCRIPT_FILENAME"]);
     putenv("REMOTE_ADDR=".@$_SERVER["REMOTE_ADDR"]);
     ?>

    a zajistíme, aby se vykonal při spuštění každého php skriptu (v této chvíli opět upozorňuji na to, že akce mohou mít vliv na zatížení serveru, a proto omezte používání tohoto návodu na dobu nezbytně nutnou!!!). To se provede přidáním řádku

     auto_prepend_file = /tmp/php_set_envs.php

    do konfigurace PHP - /etc/php.ini.
A je hotovo. Restartujeme apache, a po poslání testovacího mailu by se měl v logu mailserveru objevit podobný řádek

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

hned pod tímto záznamem bude doručování emailu mailserverem. Tyto informace by měly stačit ke zjištění, odkud se spamy odesílají. Jako další v pořadí (kromě smazání spamujícího skriptu) by mělo být prověření aplikace, jak se povedlo závadný skript na server nahrát. Pouhé smazání skriptu skutečný problém (tzn. bezpečnostní chyba v aplikaci) neodstraní.