Encontre o script php que está enviando e-mails


9

Existe alguma maneira de eu encontrar o script php que está enviando e-mails.

Eu tenho o apache + php (sem mod_suphp nem suexec) em uma instalação "padrão" e quero descobrir que o script php está enviando e-mails. Quando verifico os logs, vejo o uid do usuário que está enviando os e-mails (em meu caso apache), mas eu quero descobrir o script que originou o email.

É possível ou devo instalar suexec ou mod_suphp para manter o rastreio disso?

Obrigado pela ajuda.

Respostas:


9

O php 5.3 foi introduzido no slot para obter um melhor rastreamento de e-mail, mas não tenho certeza se isso aconteceu. (edit: yes O php 5.3 possui registro incorporado agora - o php.ini possui a variável de configuração mail.log, que registrará o uso do correio a partir do código php.)

Resolvemos o problema transformando o sendmail em um script de shell wrapper.

No php.ini, defina um novo mailer. Por exemplo:

sendmail_path = /usr/local/bin/sendmail-php -t -i

O script sendmail-php simplesmente usa o logger para obter informações e depois chama o sendmail do sistema:

#!/bin/bash

logger -p mail.info -t sendmail-php "site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)"

/usr/sbin/sendmail -t -i $*

Isso registrará o que seu mail.info estiver definido no arquivo syslog.conf.

Outra sugestão é instalar a extensão suhosin php para reforçar brechas no PHP, a menos que você esteja executando o Debian ou Ubuntu, onde este já é o padrão.


php 4.x aqui (tem alguns aplicativos antigos que não portar viável para 5.x php)
adam

Não tem problema, este invólucro fará o truque. É externo ao php. Eu mencionei o php 5.3 apenas porque essa falta de um recurso de registro estava programada para ser corrigida até então. O wrapper funciona muito bem e conseguimos identificar um script defeituoso por um usuário que permitia spam.
Labradort

acho que vou adotar a sua abordagem. obrigado
adam

1
Olá, agora não sei por que, mas o "script = $ {SCRIPT_NAME}, filename = $ {SCRIPT_FILENAME}" não está retornando nada, consulte: 7 20:24:08 logger de gateway: sendmail-php: client =, filename =, pwd = / var / www / html / mail, uid = 48, user = apache
adam

Tem certeza de que foi configurado corretamente? Se era desconhecido como uma variável predefinida em seu ambiente PHP, você também deveria ver: "script =," na saída registrada. Verifique o que você configurou novamente com muito cuidado. Você pode tentar: $ _SERVER ['SCRIPT_FILENAME'] Você pode procurar mais variáveis ​​para fazer logon na documentação do PHP sobre variáveis ​​predefinidas: php.net/manual/en/reserved.variables.server.php
labradort

4

A solução para isso realmente requer algumas etapas. A solução do labradort acima não funciona, pois o script logger é um script bash, não php, e o script bash não tem acesso às variáveis ​​do php; portanto, os logs ficam em branco. Basicamente, o que você deseja registrar precisa ser salvo nas variáveis ​​de ambiente em php antes de enviar o email para que o criador de logs tenha acesso aos dados. Como você está tentando detectar os scripts de outros usuários, não necessariamente os seus, você não tem controle sobre o código php; portanto, você precisa usar o recurso auto_prepend_file do PHP para garantir que todo o php executado execute seu código de inicialização antes de tudo. Anexei o código a seguir via php.ini para garantir que tenho os dados necessários no criador de logs:

<?php
/**
 * This passes all SERVER variables to environment variables, 
 * so they can be used by called bash scripts later
 */
foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
?>

Eu montei um tutorial completo sobre como fazer isso funcionar aqui: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/


O script wrapper funcionou na implementação dos padrões de php do Redhat e Debian Linux quando era php 5.2 e anterior. Estou simplesmente usando mail.log = /var/log/apache-mail.log hoje em dia e faz o que eu preciso.
Labradort

1
É exatamente assim que o bug do shellshock é explorado. Eu seriamente não recomendo fazer as coisas dessa maneira.
Ben Hitchcock

Você tem um ponto. Você certamente poderia executar as variáveis ​​através de uma função sanitize para remover qualquer coisa prejudicial, como "() {:;};". Na verdade, provavelmente é uma boa idéia prefixar os nomes das variáveis ​​também, com algo como "PHP_", caso haja um conflito de nome de variável de ambiente.
Tom McQuarrie

2

Existe um patch para PHP que mostra qual script está gerando os emails adicionando um cabeçalho ao email que está sendo enviado. Eu não o testei desde que não estou interessado em corrigir o núcleo do PHP, mas ouvi coisas boas.


1
Isso soa como um excelente caminho a percorrer. +1. No entanto, se você estiver gerenciando um host compartilhado com vários clientes, convém informar esses clientes sobre o cabeçalho ou redirecionar a saída para um arquivo de log.
Pekka

Sim, talvez seja o caminho a percorrer, mas em um certo ponto pode ser um problema de segurança, agora todo mundo vai saber qual o script que está enviando e-mails, os scripts mal elaborados estão apenas convidando para serem invadidos. Redirecionamento para um registro talvez seja melhor
adam

Os scripts mal elaborados não devem estar no servidor em primeiro lugar, as pessoas os encontrarão se estiverem lá (principalmente se fizerem parte de um sistema cms popular). Mas entendo que talvez haja um caso contra essa solução.
precisa saber é o seguinte

0

Você precisará grep os logs de acesso para algo que se ajuste ao prazo de quando as mensagens foram adicionadas ao spool.


Para a reprodução, o problema é que é uma hospedagem compartilhada e, para cada domínio, há um log de acesso dedicado.
11008 adam

Sim, infelizmente você terá que passar por todos eles.
Richard Sais

0

Pode ser apenas pesquisar nos arquivos de origem a substring "mail ("?


Às vezes, vale a pena examinar e, em particular, analisar o código-fonte ao seu redor para detectar vulnerabilidades nos spammers. Mas com muitos scripts php complicados de propriedade de muitas pessoas em um host compartilhado, não é a solução para esse problema.
precisa saber é o seguinte

Em um ambiente de hospedagem compartilhada isso pode não pin-point o roteiro exato ou pode resultar em vários falsos positivos
Eric Kigathi

0

Simplesmente habilite-os no seu php.ini

mail.add_x_header = On
mail.log = /var/log/phpmail.log

em seguida, crie esse arquivo e dê a permissão de gravação. Dê uma olhada nisso depois disso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.