Software instalado y corriendo en modo daemon, a parte del Apache ¿Qué versiones usas?
La mayoría de infecciones se producen por alguna vulnerabilidad en el código php, inyectando código. ¿Qué CMS usas o usas alguna protección con PHP? Mira de instalar el suhosin u otra extensión similar.
Intenta restaurar alguna copia de seguridad antes del ataque, para que los ficheros html del public_root del apache al menos estén limpios.
Se requieren conocimientos muy avanzados para detectar una intrusión o si han metido un rootkit que no detectan las herramientas más usuales.
4) Configuración avanzada PHP + Seguridad en PHP
Editaremos el Archivo php.ini
expose_php = Off
Para evitar mostrar la versión del PHP en las cabeceras X-Powered-By: PHP, etc.
; Resource Limits ;
max_execution_time = 30 --> máximo tiempo de ejecución de un script php. Si en 30 segunos no obtiene respuesta el script se para y sale un "timeout" como errror.
memory_limit = 8M --> tamaño maximo que puede consumir un script php.
; File Uploads ;
Si queremos enviar ficheros al servidor, aqui lo podemos permitir:
file_uploads = On --> si queremos o no queremos
upload_tmp_dir = F:webspublic --> el directorio donde se copiarán los archivos que nos suban.
upload_max_filesize = 1M --> el tamaño máximo que queremos que nos envien.
Una caracteristica muy importante, especialmente para hostings, es la posibilidad de no permitir algunas de las funciones de PHP. La razon es muy sencilla: algunas funciones de PHP como system, proc, etc hacen y permiten ejecutar comandos del sistema, lo que puede provocar problemas de seguridad. Por ejemplo, un usuario quizas quiera ejecutar un comando "no peligroso" como uptime, pero otro usuario mal intencionado puede utilizar otros comandos del sistema para extraer informacion comprometida de la maquina: como id, who, cat, etc.
Hosting gratuitos como Lycos, iespana tienen capadas estas funciones por lo comentado arriba, es potencialmente peligroso.
Para no permitir la ejecucion concreta de algunas funciones en PHP (no confundir con comandos) es con:
disable_functions =exec,system,shell_exec,readfile
Aunque las funciones en PHP son exec(), debemos ponerlo sin ().
Por ejemplo en Mi Arroba:
Warning: fsockopen, pfsockpen, show_source, php_uname, ini_alter, ini_restore, ini_set, getrusage, get_current_user, set_time_limit, getmyuid, getmypid, dl, leak, listen, chown, chmod, chgrp, realpath, tmpfile, link() has been disabled for security reasons.
Más restrictivo:
Funciones a deshabilitar:
exec, system, shell_exec, readfile, passthru, escapeshellcmd, proc_open, posix_uname, posix_getuid, posix_geteuid, posix_getgid, getcwd
disable_functions = system, exec, shell_exec, passthru, pcntl_exec, putenv, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, set_time_limit, ini_alter, virtual, openlog, escapeshellcmd, escapeshellarg, dl, curl_exec, parse_ini_file, show_source
Otra lista más completa:
disable_functions=
popen,pclose,posix_getpwuid,posix_getgrgid,posix_k ill,parse_perms,phpinfo,system,dl,passthru,exec,
shell_exec,popen,proc_close,proc_get_status,proc_n ice,proc_open,escapeshellcmd,escapeshellarg,show_s ource,posix_mkfifo, set_time_limit,mysql_list_dbs,get_current_user,get myuid,pconnect,link,symlink,pcntl_exec,ini_alter,p arse_ini_file,pfsockopen, leak,apache_child_terminate,posix_kill,posix_setpg id,posix_setsid,posix_setuid,proc_terminate,syslog ,fpassthru,stream_select, socket_select,socket_create,socket_create_listen, socket_create_pair,socket_listen,socket_accept,sock et_bind,socket_strerror, pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexits tatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifs topped,pcntl_wstopsig,pcntl_wtermsig,openlog,apach e_get_modules,apache_get_version,apache_getenv, apache_note,apache_setenv,virtual
Recomendable instalar suhosin (una manera muy sencilla y segura de asegurar PHP)
suhosin.executor.func.blacklist = "system, exec, shell_exec, passthru, pcntl_exec, putenv, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, popen, pclose, set_time_limit, ini_alter, virtual, openlog, escapeshellcmd, escapeshellarg, dl, parse_ini_file, show_source, imap_open, ftp_connect, posix_uname, posix_getuid, posix_geteuid, posix_getgid, getcwd, php_uname, phpinfo apache_setenv, define_syslog_variables, eval, exec, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode, exec, pipe, set_time_limit, popen, proc_open, parse_ini_file, show_source, mail, dl, ini_set, ini_alter, virtual, openlog, apc_add, apc_bin_dump, apc_bin_dumpfile, apc_bin_loadfile, apc_cache_info, apc_cas, apc_clear_cache, apc_compile_file, apc_dec, apc_define_constants, apc_delete_file, apc_delete, apc_exists, apc_fetch, apc_inc, apc_load_constants, apc_store, symlink, eval"
Otra manera es hacer funcionar el php en safe_mode. Esto se indica en el php.ini y se activa con la opción:
Safe_mode = ON
o sea modo seguro. Muchos hostings gratuitos lo tienen activado por defecto. De esta manera varias funciones están desactivadas y muchas otras comprueban los permisos a la hora de leer ficheros, etc.
http://www.zend.com/manual/features.safe-mode.functions.phpallow_url_fopen off --> para no dejar que se abran archivos remotos
register_globals off --> desactivar las variables globales para que no se pueda permitir la inyección a variables que no están supuestos a modificar (muy importante).
Otra manera intersante de progeter el php es con el magic_quotes_gpc:
Copy/paste de
http://vulnfact.com/papers/VF-php_secure.txt - Buscamos la directiva magic_quotes_gpc, que quizá este en Off, pues la activamos con
On. Esto hace la adición automática del caracter de escape "" en variables tomadas
de GET, POST y Cookies.
magic_quotes_gpc = On ; magic quotes for incoming GET/POST/Cookie data
- Para evitar que en lugar de enviar cadenas mal intencionadas, sean almacenadas en
bases de datos o archivos de texto. Debemos activar magic_quotes_runtime.
magic_quotes_runtime = Off ; magic quotes for runtime-generated data.
Para mayor seguridad, podemos hacer que un vhost (virtual host) del apache no tenga php:
#bastaría con añadir esta linea dentro del vhost del apache
php_admin_flag engine ON
O bien podemos deshabilitar el safe_mode en un vhost (dominio)
php_admin_flag safe_mode Off
Más info:
http://es2.php.net/manual/en/configuration.changes.phpopen_basedir = none
En el vhost del Apache:
php_admin_value open_basedir /home/user/public_html
De esta manera sólo dejamos abrir los ficheros que estén en ese directorio (para evitar problemas).
De la misma manera deberíamos logear los errores del php pero no mostrarlos (evitaremos path disclosures, etc).
Añadimos varias instrucciones en el vhost del apache:
php_flag display_errors Off
php_flag log_errors On
php_value error_log "/home/uesr/logs/errorsphp"
Por si todo esto falla y consiguen una shell:
#le damos permisos sólo al root para este fichero
chmod 700 /usr/bin/wget
# modo invariable
chattr +i /usr/bin/wget
Lo mismo para los comandos:
wget, curl, lynx, w3m, framebuffer, links2 (navegadores) y gcc, cc y demás compiladores o binarios que nos parezcan potencialmente peligrosos.
Se podría decir que hasta ahí tenemos mas o menos asegurado PHP.