Seis archivos que también son un PHP válido

Y un GIF que también es un Python

La historia comienza cuando trato de hacer un GIF que también sea un Haskell válido, todo eso para un desafío de CTF . Aunque fue un dolor en el culo para matar este desafío, la idea de tener un archivo que tiene dos formatos fue realmente interesante y algo útil para eludir las restricciones de carga y ejecutar el tipo inesperado de su archivo con alguna LFI.

El archivo GIF / Haskell, hecho por Manoel (@reefbr)

GIF + PHP

Estaba leyendo el PoC || GTFO Journal y les encanta la idea de un archivo políglota , uno de sus problemas es un PDF / Zip y una ROM NES , así que comencé con el formato de archivo más simple, y probablemente el único útil. : PHP. ¿Por qué es el más simple? Porque puede indicar dónde comienza el código con <? y donde termina con?>, con eso puedo poner el código PHP en cualquier parte del archivo.

Ya sabía algo sobre GIF, así que comencemos con eso. Teniendo en cuenta que el contenido del GIF no tiene valor para nosotros, el GIF más pequeño posible es un gran lugar para comenzar:

 HEX: 47 49 46 38 39 61 01 00 01 00 00 FF 00 2C 00 00 00 00 01 00 01 00 00 02 00 3B 
 ASCII: GIF89a???ÿ?, ????????; 

Como se explicó en la publicación del blog, eso hace un gif negro de 1×1 y debería romperse porque no tiene la tabla global de colores , pero funciona porque los lectores no siguen las especificaciones en riesgo. Ahora quiero poner mi cadena de PHP en algún lugar allí. Leer la especificación GIF89a He encontrado la extensión de comentario que nos permite poner un comentario en el GIF al final del archivo. Algo como eso :

 7 6 5 4 3 2 1 0 Nombre del nombre del campo 
+ --------------- +
0 | 0x21 | Extensión Introductor Byte
+ --------------- +
1 | 0xFE | Comentario Label Byte
+ --------------- +

+ =============== +
| <? |
N | phpinfo (); | Sub-bloques de datos de datos de comentarios
| |
+ =============== +

+ --------------- +
0 | ; | Block Terminator Byte
+ --------------- +

Entonces ahora podemos agregar nuestro código PHP como un comentario en el GIF:

 HEX: 47 49 46 38 39 61 01 00 01 00 00 FF 00 2C 00 00 00 00 01 00 01 00 00 02 00 21 FE 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 
ASCII: GIF89a???ÿ?, ????????! Þ <phpinfo ();

Tenga en cuenta que! Þ = 0x21 0xFE, y PHP no requiere el?> Al final. También GIF nos facilita el tener el EOF como un punto y coma.

PHP + PDF

Siguiendo los pasos de PoC || GTFO juguemos con PDF. El plan sigue siendo el mismo, obtenga el PDF más simple posible e intente agregar un comentario.

Tuve un problema con la primera parte del plan, utilizo OS X y su lector de PDF es restringido, casi todos los PDF simples que he encontrado en Internet tienen algún error para el lector del OS X. El único que está todo en ASCII y funcionó para mí fue este: https://stackoverflow.com/a/32142316

 %PDF-1.2 
9 0 obj
<<
>>
stream
BT/ 9 Tf(Test)' ET
endstream
endobj
4 0 obj
<<
/Type /Page
/Parent 5 0 R
/Contents 9 0 R
>>
endobj
5 0 obj
<<
/Kids [4 0 R ]
/Count 1
/Type /Pages
/MediaBox [ 0 0 99 9 ]
>>
endobj
3 0 obj
<<
/Pages 5 0 R
/Type /Catalog
>>
endobj
trailer
<<
/Root 3 0 R
>>
%%EOF

Tiene muchas partes que no se requieren para otros lectores, como el lector de Chrome, y debería ser realmente más pequeño, pero no importa. PDF es mucho más simple, como cualquier lenguaje de programa, tiene un código para comentarios que es%, así que simplemente ponlo después de cada línea y anexa el código PHP.

 % PDF-1.2% <? Phpinfo ()?> 
...

Enfoque más simple

Navegando en la WEB Encontré algo realmente hermoso , un repositorio con una gran lista con el "Archivo más pequeño […] posible", así que comencé a intentar agregar PHP a algunos de esos archivos.

Como resultado, la mayoría de los archivos tiene un EOF de algún tipo para indicar que el archivo ha finalizado, y la mayoría de los lectores simplemente ignora todo lo que se coloca después de ese EOF . Aquí hay cuatro ejemplos:

ELF + PHP

 HEX: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 19 40 CD 80 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 40 CD 80 00 40 CD 80 4C 00 00 00 4C 00 00 00 05 00 00 00 00 10 00 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E 
ASCII: ELF?????????????? @ Í €, ???????????4? ????????? @ Í € ? @ Í € L???L??? ?????? <? Phpinfo ();?>

MP3 + PHP

 HEX: FF E3 18 C4 00 00 00 03 48 00 00 00 00 4C 41 4D 45 33 2E 39 38 2E 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E 
ASCII: ÿã Ä???HAME????98.2??????????????????????????????????? ?????????????? <? Phpinfo ();?>

JPG + PHP

 HEX: FF D8 FF DB 00 43 00 03 02 02 02 02 02 03 02 02 02 03 03 03 04 06 04 04 04 04 04 08 06 06 05 06 09 08 0A 0A 09 08 09 09 0A 0C 0F 0C 0A 0B 0E 0B 09 09 0D 11 0D 0E 0F 10 10 11 10 0A 0C 12 13 12 10 13 0F 10 10 10 FF C9 00 0B 08 00 01 00 01 01 01 11 00 FF CC 00 06 00 10 10 05 FF DA 00 08 01 01 00 00 3F 00 D2 CF 20 FF D9 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E 
ASCII: ÿØÿÛ?C?





ÿÉ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Agregar PHP a JPEG es muy antiguo, pero todos simplemente ponen el EXIF , y lo considero una trampa.

BMP + PHP

 HEX: 42 4D 1E 00 00 00 00 00 00 00 1A 00 00 00 0C 00 00 00 01 00 01 00 01 00 18 00 00 00 FF 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E 
ASCI: BM ??????? ??? ??????? <? Phpinfo ();?>

Ronda de bonificación:

Después de ese hallazgo comencé a jugar con algo más hardcore. Un GIF que también es un Python válido. Ninguna de las " técnicas " anteriores funciona porque no se puede simplemente decir a Python Interpreter dónde comenzar a ejecutar el código como PHP. Echemos otro vistazo a otro GIF:

 HEX: 47 49 46 38 39 61 01 00 01 00 80 01 00 FF FF FF 00 00 00 21 F9 04 01 0A 00 01 00 2C 00 00 00 00 01 00 01 00 00 02 02 4C 01 00 3B 
ASCII: GIF89a?? € ?ÿÿÿ???!
??, ???????L?;

Probemos un análisis basado en errores, ¿cuál es el error que da este archivo cuando se ejecuta como .py?

 $ python tinytrans.gif 
Archivo "tinytrans.gif", línea 1
GIF89a
^
Error de sintaxis: sintaxis invalida

Lanza un error de sintaxis en el byte 0x01, que se espera. El Número Mágico GIF especifica que es un GIF y que su versión es "89a", resulta que cada lector solo requiere que la versión sea 89 o 87 ignorando la parte "a", por lo que podemos reemplazar la "a" por una "=" Y declara que "GIF89" es una variable, que debería ser un buen comienzo. Vámonos nuevamente.

 $ python tinytrans.gif 
Archivo "tinytrans.gif", línea 1
GIF89 =
^
Error de sintaxis: sintaxis invalida

De nuevo, como se esperaba. La primera idea que tuve fue simplemente comentar la parte sin sentido del GIF y poner un comentario, al igual que en el PHP + GIF, que es un pitón válido y que iba a estar bien. Pero en el medio del galimatías tiene un byte 0x0a, que también es una nueva línea, que molesta todos mis intentos. Estaba tratando de hacer algo como esto:

 GIF89 =  
#GIBBERISH $ @! _ K $! @ $! (@ # @! _ #)! @! @! Þ
__import __ ('os'). system ('ls');

Es decir, una declaración de variables multilínea usando '' y en medio de ella solo comentando el Non-ASCII, luego de agregar el '! Þ' para comenzar un comentario GIF, saltando a otra línea y poniendo el código real , seguido por el punto y coma de EOF, que también es válido en Python.

Pero intentar hacer un comentario en una declaración de variable de varias líneas era simplemente imposible, pero hacerlo entre paréntesis era válido: https://stackoverflow.com/a/22914853 . Nuevo intento:

HEX:

 47 49 46 38 39 3D 28 0A 00 00 80 01 00 FF FF FF 00 00 00 21 F9 04 01 00 00 01 00 2C 00 00 00 00 01 00 01 00 00 02 02 4C 01 00 21 FE 0A 5F 5F 69 6D 70 6F 72 74 5F 5F 28 27 6F 73 27 29 2E 73 79 73 74 65 6D 28 27 6C 73 27 29 29 3B 

ASCII:

 GIF89 = ( 
?? € ?ÿÿÿ???! Ù ???, ???????L?! Þ
__import __ ('os'). system ('ls'));

Tenga en cuenta que el intérprete simplemente ignorará la línea que comienza con un carácter no ASCII, que es impar, por lo que no necesitamos el #. Y corriendo :

 $ python python.gif 
bash.gif handtinyblack.gif php.elf php.mp3 tinytrans.gif
bmp.bmp php-logo-virus.jpg php.gif php.pdf tinytrans.gpy
dude.gif php.bmp php.jpg python.gif tinytrans.py

Hurra !

Hacker Noon es cómo los hackers comienzan sus tardes. Somos parte de la familia @AMI . Ahora estamos aceptando presentaciones y estamos felices de conversar sobre oportunidades de publicidad y patrocinio .

Si disfrutaste esta historia, te recomendamos que leas nuestras últimas historias tecnológicas e historias tecnológicas de tendencia . Hasta la próxima, ¡no des por sentado las realidades del mundo!