This page looks best with JavaScript enabled

TryHackMe - Battery

 •  ✍️ sckull

Battery es una maquina de TryHackMe, encontramos correos dentro de un fichero y mediante SQL Truncation Attack obtuvimos acceso a un panel de administracion en donde explotamos una vulnerabilidad XXE por la cual obtuvimos credenciales de acceso. La mala configuracion de permisos en un script de python nos permitio escalar privilegios.

Room

Titulo battery box_img_maker
Descripción CTF designed by CTF lover for CTF lovers
Puntos 240
Dificultad Media
Maker

Th3lazykid


golith3r00t

NMAP

Escaneo de puertos tcp, nmap nos muestra el puerto ssh (22) y el puerto http (80) abiertos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Nmap 7.80 scan initiated Fri Jan 15 19:35:16 2021 as: nmap -p- --min-rate 1000 -o scanPorts battery.thm
Nmap scan report for battery.thm (10.10.172.112)
Host is up (0.34s latency).
Not shown: 65380 closed ports, 153 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

# Nmap done at Fri Jan 15 19:37:22 2021 -- 1 IP address (1 host up) scanned in 125.83 seconds

# Nmap 7.80 scan initiated Fri Jan 15 19:37:43 2021 as: nmap -sV -sC -p 22,80 -o servPort battery.thm
Nmap scan report for battery.thm (10.10.172.112)
Host is up (0.33s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 14:6b:67:4c:1e:89:eb:cd:47:a2:40:6f:5f:5c:8c:c2 (DSA)
|   2048 66:42:f7:91:e4:7b:c6:7e:47:17:c6:27:a7:bc:6e:73 (RSA)
|   256 a8:6a:92:ca:12:af:85:42:e4:9c:2b:0e:b5:fb:a8:8b (ECDSA)
|_  256 62:e4:a3:f6:c6:19:ad:30:0a:30:a1:eb:4a:d3:12:d3 (ED25519)
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Jan 15 19:38:01 2021 -- 1 IP address (1 host up) scanned in 18.13 seconds

HTTP

Encontramos una pagina web en el puerto 80.

RUSTBUSTER

Utilizamos rustbuster para busqueda de directorios y archivos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
kali@kali:~/thm/battery$ /opt/rustbuster/rustbuster dir -u http://battery.thm/ -w /usr/share/wordlists/dirb/common.txt -e php,html,txt -t 30
~ rustbuster v3.0.3 ~ by phra & ps1dr3x ~

         _     _                 _         _           _        _                 _         _           _           _     
        /\ \  /\_\              / /\      /\ \        / /\     /\_\              / /\      /\ \        /\ \        /\ \   
       /  \ \/ / /         _   / /  \     \_\ \      / /  \   / / /         _   / /  \     \_\ \      /  \ \      /  \ \  
      / /\ \ \ \ \__      /\_\/ / /\ \__  /\__ \    / / /\ \  \ \ \__      /\_\/ / /\ \__  /\__ \    / /\ \ \    / /\ \ \ 
     / / /\ \_\ \___\    / / / / /\ \___\/ /_ \ \  / / /\ \ \  \ \___\    / / / / /\ \___\/ /_ \ \  / / /\ \_\  / / /\ \_\
    / / /_/ / /\__  /   / / /\ \ \ \/___/ / /\ \ \/ / /\ \_\ \  \__  /   / / /\ \ \ \/___/ / /\ \ \/ /_/_ \/_/ / / /_/ / /
   / / /__\/ / / / /   / / /  \ \ \    / / /  \/_/ / /\ \ \___\ / / /   / / /  \ \ \    / / /  \/_/ /____/\   / / /__\/ / 
  / / /_____/ / / /   / / _    \ \ \  / / /     / / /  \ \ \__// / /   / / _    \ \ \  / / /     / /\____\/  / / /_____/  
 / / /\ \ \  / / /___/ / /_/\__/ / / / / /     / / /____\_\ \ / / /___/ / /_/\__/ / / / / /     / / /______ / / /\ \ \    
/ / /  \ \ \/ / /____\/ /\ \/___/ / /_/ /     / / /__________/ / /____\/ /\ \/___/ / /_/ /     / / /_______/ / /  \ \ \   
\/_/    \_\/\/_________/  \_____\/  \_\/      \/_____________\/_________/  \_____\/  \_\/      \/__________\/_/    \_\/   


[?] Started at	: 2021-01-18 22:14:21

GET	200 OK				http://battery.thm/
GET     200 OK                          http://battery.thm/acc.php
GET     200 OK                          http://battery.thm/admin.php
GET     200 OK                          http://battery.thm/admin.php
GET     302 Found                       http://battery.thm/dashboard.php
						=> admin.php
GET     200 OK                          http://battery.thm/forms.php
GET     200 OK                          http://battery.thm/index.html
GET     200 OK                          http://battery.thm/index.html
GET     302 Found                       http://battery.thm/logout.php
						=> admin.php
GET     200 OK                          http://battery.thm/register.php
GET     200 OK                          http://battery.thm/report
GET     301 Moved Permanently           http://battery.thm/scripts
						=> http://battery.thm/scripts/
GET     403 Forbidden                   http://battery.thm/server-status
GET     302 Found                       http://battery.thm/with.php
						=> admin.php
  [00:03:04] ########################################   18444/18444   ETA: 00:00:00 req/s: 100

[?] Ended at: 2021-01-18 22:17:26

Encontramos un panel donde es posible ingresar y registrar un usuario, al registrar un usuario e ingresar vemos diferentes paginas las cuales tienen funcionalidades de retiar, depositar y transferir dinero para un usuario registrado, tambien en la pagina de inicio muestra el nombre de usuario, numero de cuenta, saldo actual y nombre del banco.

Tambien existen dos paginas en las cuales no es posible ingresar ya que es necesario privilegios de administracion, pero aun asi es posible leer “parte” del codigo fuente de una de estas paginas, al analizar vemos que realiza una “busqueda” mediante un formulario, mismo que ingresa los datos en un “template” de XML y lo envia a la misma pagina, cuando obtiene el resultado lo inserta dentro de un elemento de HTML con id errorMessage, con esto podriamos tomar la idea de un ataque XXE.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script type="text/javascript">
function XMLFunction(){
    var xml = '' +
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<root>' +
        '<name>' + $('#name').val() + '</name>' +
        '<search>' + $('#search').val() + '</search>' +
        '</root>';
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState == 4){
            console.log(xmlhttp.readyState);
            console.log(xmlhttp.responseText);
            document.getElementById('errorMessage').innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","forms.php",true);
    xmlhttp.send(xml);
};
</script>

[... REDACTED ...]

<fieldset>
    <p>
    <label for="name">Account Number</label>
    <input id="name" name="name" type="text" value="" />
    </p>

    <p>
    <label for="search">Remark</label>
    <input id="search" name="search" type="text" value="" />
    </p>

    <p>
    <button name="snd" id="Login" onclick="XMLFunction()">Send Message</button>
    </p>
</fieldset>

XSS

Con el usuario registrado encontramos un posible vulnerabilidad de XSS en el campo de Account Number de la pagina Transfer Money.

1
<b onmouseover=alert('Batman-no-existe!')>Dame clic!</b>

REPORT

Dentro de los directorios de la pagina encontramos un archivo ejecutable, al ejecutarlo pregunta por un usuario y contraseña. Ejecutamos strings sobre este archivo y encontramos algunos “correos” de usuarios, asi mismo utilizamos Ghidra para poder analizar el archivo, donde pudimos encontrar que es un archivo que solo contiene un menu y que no realiza ninguna de las acciones mostradas en las opciones disponibles. Tambien encontramos que el unico usuario que puede acceder a dichas opciones es guest:guest. Con esto solo pudimos obtener alguna lista de usuarios.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
kali@kali:~/thm/battery$ strings report |more
[... REDACTED ...]
__gmon_start__
_ITM_registerTMCloneTable
u/UH
[]A\A]A^A_
admin@bank.a
Password Updated Successfully!
Sorry you can't update the password
Welcome Guest
===================Available Options==============
1. Check users
2. Add user
3. Delete user
4. change password
5. Exit
clear
===============List of active users================
support@bank.a
contact@bank.a
cyber@bank.a
admins@bank.a
sam@bank.a
admin0@bank.a
super_user@bank.a
control_admin@bank.a
it_admin@bank.a
Welcome To ABC DEF Bank Managemet System!
UserName : 
Password : 
guest
Your Choice : 
email : 
not available for guest account
Wrong option
Wrong username or password
;*3$"
GCC: (Debian 9.3.0-15) 9.3.0
crtstuff.c
[... REDACTED ...]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*main*/
    undefined8 main(void)

    {
      int iVar1;
      int local_8c;
      char local_88 [32];
      char local_68 [32];
      undefined local_48 [32];
      undefined local_28 [32];
      
      local_8c = 0;
      puts("\n\n\n");
      puts("Welcome To ABC DEF Bank Managemet System!\n\n");
      printf("UserName : ");
      __isoc99_scanf(&DAT_001021f0,local_68);
      puts("\n");
      printf("Password : ");
      __isoc99_scanf(&DAT_001021f0,local_88);
      iVar1 = strcmp(local_68,"guest");
      if ((iVar1 == 0) && (iVar1 = strcmp(local_88,"guest"), iVar1 == 0)) {
        options();
        while (local_8c != 5) {
          printf("Your Choice : ");
          __isoc99_scanf(&DAT_00102216,&local_8c);
          if (local_8c == 1) {
            users();
          }
          else {
            if (local_8c == 4) {
              printf("email : ");
              __isoc99_scanf(&DAT_001021f0,local_28);
              puts("\n");
              printf("Password : ");
              __isoc99_scanf(&DAT_001021f0,local_48);
              update(local_28,local_48,local_48);
            }
            else {
              if ((local_8c == 3) || (local_8c == 2)) {
                puts("not available for guest account\n");
                system("clear");
                options();
              }
              else {
                puts("Wrong option\n");
                system("clear");
                options();
              }
            }
          }
        }
      }
      else {
        printf("Wrong username or password");
      }
      return 0;
    }


    /*update*/

    void update(char *pcParm1)

    {
      int iVar1;
      
      iVar1 = strcmp(pcParm1,"admin@bank.a");
      if (iVar1 == 0) {
        puts("Password Updated Successfully!\n");
        options();
      }
      else {
        puts("Sorry you can\'t update the password\n");
        options();
      }
      return;
    }

    /*users*/

    void users(void)

    {
      system("clear");
      puts("\n===============List of active users================");
      puts("support@bank.a");
      puts("contact@bank.a");
      puts("cyber@bank.a");
      puts("admins@bank.a");
      puts("sam@bank.a");
      puts("admin0@bank.a");
      puts("super_user@bank.a");
      puts("admin@bank.a");
      puts("control_admin@bank.a");
      puts("it_admin@bank.a\n\n");
      options();
      return;
    }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
kali@kali:~/thm/battery$ ./report 

Welcome To ABC DEF Bank Managemet System!

UserName : guest

Password : guest

Welcome Guest

===================Available Options==============

1. Check users
2. Add user
3. Delete user
4. change password
5. Exit
Your Choice : 1

===============List of active users================
support@bank.a
contact@bank.a
cyber@bank.a
admins@bank.a
sam@bank.a
admin0@bank.a
super_user@bank.a
admin@bank.a
control_admin@bank.a
it_admin@bank.a


Welcome Guest

===================Available Options==============

1. Check users
2. Add user
3. Delete user
4. change password
5. Exit
Your Choice :

Intentamos realizar inyeccion de SQL en todos los campos disponibles dentro de la pagina pero no logramos obtener ningun error o informacion. Aunque todavía teniamos una lista de posibles “usuarios” y “correos” los cuales podriamos registrar, obtener información o como ultimo recurso realizar un ataque de fuerza bruta al panel o al servicio SSH con hydra. Intentamos registrar solo los usuarios pero al ingresar en cada uno de ellos no logramos acceder a las paginas “administrativas”, tambien registrar los “correos” pero encontramos un problema, un “limite” el formulario de registro, especificamente el campo Username que esta limitado a un maximo de 12 caracteres, y los unicos usuarios que encontramos con ese numero de caracteres son cyber@bank.a, admin@bank.a.

1
2
3
4
5
6
7
<form method="POST" style="text-align:center">
<input type="text" name="uname" placeholder="Username" maxlength="12"><br><br><br>
<input type="text" name="bank" placeholder="Bank name (ABC or DEF)"><br><br><br>
<input type="password" name="password" placeholder="password"><br><br><br>
<input type="submit" value="Register me!" name="btn"><br><br>
<a href="admin.php">Login</a>
</form>
1
2
3
4
kali@kali:~/thm/battery$ grep -E "^.{11,12}$" users.txt 
cyber@bank.a
admin@bank.a
kali@kali:~/thm/battery$  

SQL Truncation Attack

En el caso de cyber@bank.a logramos registrarlo pero no obtener acceso, con admin@bank.a encontramos que el usuario ya estaba registrado, sabiendo esto buscamos alguna vulnerabilidad con la cual pudieramos cambiar de alguna forma la contraseña de este usuario, logramos encontrar un tipo de ataque con el cual es posible “registar” y con esto cambiar la contraseña de un usuario, ya que la aplicacion utiliza MySQL con su configuracion por default: SQL Truncation Attack

Registramos el usuario admin@bank.a y le agregamos espacios y una palabra o caracter cualquiera al final, con los campos solicitados, lo que nos permitio registrar el usuario y cambiar su contraseña.

Ingresamos con usuario y contraseña registrada y pudimos obtener acceso a las paginas “administrativas”.

XXE

Como bien se menciono anteriormente que posiblemente existia una vulnerabilidad XXE en la pagina command ya que esta envia los parametros number account (<name></name>) y remark (<search></search>) dentro de una estructura o template XML. Realizamos una “busqueda” y la respuesta de esta fue insertada en la pagina, pero la respuesta pertenece a remark por lo que seguramente podriamos intentar realizar una lectura de un archivo e “insertarlo” en la etiqueta/elemento remark (<search></search>) para que se muestre en la pagina.

1
<?xml version="1.0" encoding="UTF-8"?><root><name>22</name><search>Batman</search></root>

Utilizamos la estructura XML existente junto con el payload de lectura para le archivo /etc/passwd, el cual se mostró en la pagina. Dentro de la respuesta de este archivo pudimos observar que existen dos usuarios: cyber y yash.

Luego de esto intenamos realizar una enumeracion utilizando el mismo payload para leer archivos dentro de la maquina, lo cual fue imposible para algunos archivos por lo que utilizamos un Wrapper dentro de nuestra estrucutra para poder obtener en base64 el archivo solicitado. Dentro del codigo fuente de las paginas encontramos credenciales comentadas para el usuario cyber y para la base de datos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  <!DOCTYPE html>
  <html>
  <head>
  <style>
  [... REDACTED ...]
  </style>
  </head>
  <body>

  <ul>
    <li><a href="dashboard.php">Dashboard</a></li>
    <li><a href="with.php">Withdraw Money</a></li>
    <li><a href="depo.php">Deposit Money</a></li>
    <li><a href="tra.php">Transfer Money</a></li>
    <li><a href="acc.php">My Account</a></li>
    <li><a href="forms.php">command</a></li>
    <li><a href="logout.php">Logout</a></li>
    <li style="float:right"><a href="contact.php">Contact Us</a></li>
  </ul><br><br><br><br>

  </body>
  </html>

  <?php

  session_start();
  if(isset($_SESSION['favcolor']) and $_SESSION['favcolor']==="admin@bank.a")
  {

  echo "<h3 style='text-align:center;'>Weclome to Account control panel</h3>";
  echo "<form method='POST'>";
  echo "<input type='text' placeholder='Account number' name='acno'>";
  echo "<br><br><br>";
  echo "<input type='text' placeholder='Message' name='msg'>";
  echo "<input type='submit' value='Send' name='btn'>";
  echo "</form>";
  //MY CREDS :- cyber:[... REDACTED ...]
  if(isset($_POST['btn']))
  {
  $ms=$_POST['msg'];
  echo "ms:".$ms;
  if($ms==="id")
  {
  system($ms);
  }
  else if($ms==="whoami")
  {
  system($ms);
  }
  else
  {
  echo "<script>alert('RCE Detected!')</script>";
  session_destroy();
  unset($_SESSION['favcolor']);
  header("Refresh: 0.1; url=index.html");
  }
  }
  }
  else
  {
  echo "<script>alert('Only Admins can access this page!')</script>";
  session_destroy();
  unset($_SESSION['favcolor']);
  header("Refresh: 0.1; url=index.html");
  }
  ?>
  ```
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<html>
<title>Login</title>
<body style="background-color:black">
<br><br><br>
<h3 style="color:red;text-align:center">Bank Of Abc Def User Login</h3>
<br>
<style>
form{
    border: 2px solid black;
    outline: #4CAF50 solid 3px;
    margin: auto;
    width:180px;
    padding: 20px;
    text-align: center;
}
</style>
<form method="POST" style="text-align:center" name="myForm">
<input type="text" name="uname" placeholder="Username" maxlength="14"><br><br><br>
<input type="password" name="password" placeholder="password"><br><br><br>
<input type="submit" value="Submit" name="btn"><br><br><br>
<a href="register.php">New user?register here.</a>
</form>
</body>
</html>

<?php
error_reporting(0);
session_start();

if(isset($_POST['btn']))
{
$id=$_POST['uname'];
$pass=$_POST['password'];
try
{
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=details', 'root', 'idkpass');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $ex){
    echo 'Execute Failed: '.$ex->getMessage();
}
$q = "SELECT username,password,cno,bank_name,amount FROM users WHERE username = :id and password= :pass";
$sth = $dbh->prepare($q);
$sth->bindParam(':id', $id);
$sth->bindParam(':pass',$pass);
$sth->execute();
$result = $sth->fetchAll();
if($result)
{
foreach($result as $row)
        {
    if ($row['username']!=='')
                        {
                                if ($row['password']!=='')
                                {
                                        $_SESSION['favcolor'] = $row['username'];
                                        $_SESSION['cnum'] = $row['cno'];
            $_SESSION['bkname'] = $row['bank_name'];
            $_SESSION['amont'] = $row['amount'];
                                        header("Location: dashboard.php");
                                }
                        }

        }
}
else
{
//A note from Admin of Bank Of CC : I have saved my credentials in a file , let's see if you can find it ;)
echo "<script>alert('umm...something bad happened')</script>";
}
}


?>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<html>

<style>
[... REDACTED ...]
</style>

<head>
<script type="text/javascript" src="scripts/jquery.min.js"> </script>
<script type="text/javascript">
function XMLFunction(){
    var xml = '' +
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<root>' +
        '<name>' + $('#name').val() + '</name>' +
        '<search>' + $('#search').val() + '</search>' +
        '</root>';
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState == 4){
            console.log(xmlhttp.readyState);
            console.log(xmlhttp.responseText);
            document.getElementById('errorMessage').innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","forms.php",true);
    xmlhttp.send(xml);
};
</script>

</head>



<body>


<ul>
    <li><a href="dashboard.php">Dashboard</a></li>
    <li><a href="with.php">Withdraw Money</a></li>
    <li><a href="depo.php">Deposit Money</a></li>
    <li><a href="tra.php">Transfer Money</a></li>
    <li><a href="acc.php">My Account</a></li>
    <li><a href="forms.php">command</a></li>
    <li><a href="logout.php">Logout</a></li>
    <li style="float:right"><a href="contact.php">Contact Us</a></li>
</ul><br><br><br><br>

    <fieldset>
                <p>
                <label for="name">Account Number</label>
                <input id="name" name="name" type="text" value="" />
                </p>

                <p>
                <label for="search">Remark</label>
                <input id="search" name="search" type="text" value="" />
                </p>

                <p>
                <button name="snd" id="Login" onclick="XMLFunction()">Send Message</button>
                </p>
    </fieldset>




</body>


</html>

<?php

session_start();
if(isset($_SESSION['favcolor']) and $_SESSION['favcolor']==="admin@bank.a")
{
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$info = simplexml_import_dom($dom);
$name = $info->name;
$search = $info->search;
echo "Sorry, account number $search is not active!";
}
else
{
echo "<script>alert('Only Admins can access this page!')</script>";
session_destroy();
unset($_SESSION['favcolor']);
header("Refresh: 0.1; url=index.html");
}
?>

CYBER - USER

Utilizamos las credenciales que encontramos en el servicio SSH y logramos obtener una shell y nuestra primera flag flag1.txt.

PRIVILEGE ESCALATION

Realizamos una enumeracion con este usuario y encontramos que puede ejecutar un script de python con sudo.

A simple vista vemos un “efecto” de escritura, al investigar sobre este efecto encontramos que es posible realizarlo con las librerias sys y time, para comprobar esto y obtener informacion paramos el script utilizando CTRL + C. Y logramos ver que dicho script esta utilizando la libreria time.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cyber@ubuntu:~$ sudo /usr/bin/python3 /home/cyber/run.py 
Hey Cyb^CTraceback (most recent call last):
  File "/home/cyber/run.py", line 17, in <module>
    main();
  File "/home/cyber/run.py", line 12, in main
    delay_print("Hey Cyber I have tested all the main components of our web server but something unusal happened from my end!");
  File "/home/cyber/run.py", line 8, in delay_print
    time.sleep(0.08)
KeyboardInterrupt
cyber@ubuntu:~$

Tambien realizamos una enumeracion utilizando pspy para ver si ejecutaba algun otro programa, y logramos ver que reinicia el servicio de apache cada vez que es ejecutado el script.

El problema es que no tenemos permisos de escritura o lectura sobre el archivo, pero como el archivo está dentro de la carpeta cyber podemos cambiar de nombre y eliminar dicho archivo, creamos uno nuevo con una shell inversa y lo ejecutamos con sudo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cyber@ubuntu:~$ ls -lah
total 1.2M
drwx------ 3 cyber cyber 4.0K Jan 20 06:14 .
drwxr-xr-x 4 root  root  4.0K Nov 16 15:28 ..
-rw------- 1 cyber cyber    0 Nov 17 19:47 .bash_history
-rw-r--r-- 1 cyber cyber  220 Nov  9 21:06 .bash_logout
-rw-r--r-- 1 cyber cyber 3.6K Nov  9 21:06 .bashrc
drwx------ 2 cyber cyber 4.0K Nov  9 21:52 .cache
-rw--w---- 1 cyber cyber   85 Nov 15 16:45 flag1.txt
-rw-r--r-- 1 cyber cyber  675 Nov  9 21:06 .profile
-rwx------ 1 root  root   349 Nov 15 18:33 run.py
cyber@ubuntu:~$ ls -ld .
drwx------ 3 cyber cyber 4096 Jan 20 06:14 .
cyber@ubuntu:~$

Logramos obtener una shell con usuario root y nuestra flag root.txt y tambien flag2.txt.

ANEXO

CYBER ENUM

Dentro del archivo auth.log encontramos algunos comandos ejecutados y un script en la carpeta del usuario yash, tambien informacion de un servicio FTP el cual no existe.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[... REDACTED ...]
Nov 16 16:59:47 ubuntu sudo:    cyber : command not allowed ; TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py flag1.txt run.py
Nov 16 17:00:43 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/var/www/html ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py
Nov 16 17:03:18 ubuntu sudo:     yash : 3 incorrect password attempts ; TTY=pts/1 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 16 17:18:59 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 16 17:19:11 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 16 17:20:35 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 16 17:20:47 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 16 21:51:30 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=list
Nov 16 21:51:55 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py
Nov 16 21:56:13 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/var/www/html ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py
Nov 16 22:07:55 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 16 22:10:47 ubuntu sudo:     yash : TTY=pts/1 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 16 22:13:39 ubuntu sudo:     yash : TTY=pts/1 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 10:37:06 ubuntu sudo:     root : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/bin/chmod u+rwx emergency.py
Nov 17 10:42:27 ubuntu sudo:     root : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 17 10:42:36 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 17 10:42:50 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 10:43:48 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 10:45:47 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=list
Nov 17 10:45:56 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py
Nov 17 10:49:54 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 17 10:50:03 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 10:50:26 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 12:21:11 ubuntu sudo:     yash : command not allowed ; TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/apt-get install python-pip
Nov 17 13:09:46 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=list
Nov 17 13:09:56 ubuntu sudo:     yash : TTY=pts/0 ; PWD=/home/yash ; USER=root ; COMMAND=/usr/bin/python3 /home/yash/emergency.py
Nov 17 17:03:00 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=list
Nov 17 17:03:51 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py
Nov 17 20:22:35 ubuntu sudo:     root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/touch /var/log/aws114_ssm_agent_installation.log
Jan 20 05:29:10 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=list
Jan 20 05:29:37 ubuntu sudo:    cyber : TTY=pts/0 ; PWD=/home/cyber ; USER=root ; COMMAND=/usr/bin/python3 /home/cyber/run.py

Dentro de la base de datos logramos encontrar una contraseña del usuario admin@bank.a pero no logramos conseguir nada con esta contraseña.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cyber@ubuntu:/var$ mysql -u root -p 
Enter password: 
[... REDACTED ...]

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| details            |
| menagerie          |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

mysql> use details;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_details |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

mysql> select * from users;
+--------------+--------------------+-----+--------+-----------+
| username     | password           | cno | amount | bank_name |
+--------------+--------------------+-----+--------+-----------+
| cyber        | cyber              |  14 |      0 | ABC       |
| admin@bank.a | I_know_my_password |  15 |      0 | ABC       |
| admin        | pass               |  17 |      0 | ABC       |
| check        | check              |  19 |      0 | ABC       |
| admin@bank.a | batman             |  20 |      0 | ABC       |
+--------------+--------------------+-----+--------+-----------+
5 rows in set (0.00 sec)

mysql> use menagerie;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> exit
Bye

ROOT ENUM

Logramos confirmar que el script run.py utiliza las librerias sys,time asi mismo que reinicia el servicio apache.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@ubuntu:~# cat run,py
cat run,py
cat: run,py: No such file or directory
root@ubuntu:~# cat /home/cyber/run.py.bak
cat /home/cyber/run.py.bak
import os,sys,time


def delay_print(s):
  for c in s:
    sys.stdout.write(c)
    sys.stdout.flush()
    time.sleep(0.08)

def main():
  os.setuid(0);
  delay_print("Hey Cyber I have tested all the main components of our web server but something unusal happened from my end!");
  print("\n")
  os.system('service apache2 restart > /dev/null 2>&1');


main();

Tambien encontramos que el script (/home/yash/emergency.py) que aparece en el archivo de log auth.log existe y realiza la lectura del archivo /opt/binside.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
root@ubuntu:/home/yash# cat emergency.py
cat emergency.py
import os,time,sys


def delay_print(s):
  for c in s:
    sys.stdout.write(c)
    sys.stdout.flush()
    time.sleep(0.04)

def BinaryToDecimal(binary): 
  string = int(binary, 2) 
  return string 

str_data=""
print("01110010 01100101 01100001 01100100 01101001 01101110 01100111 00100000 00101111 01101111 01110000 01110100 00101111 01100010 01101001 01101110 01110011 01101001 01100100 01100101 00100000 01100110 01101001 01101100 01100101")
try:
  with open('/opt/binside','r') as f:
    for p in f:
      for m in p.split():
        inn=int(m,2)
        ass=chr(inn)
        str_data+=ass
      f=open('/opt/binside','a')
      delay_print("checking if you are a human...................Test Failed [✘]\n\n")
      f.write(str(os.system(str_data)))
      f.write("\n")
except Exception as e:
  time.sleep(4)
  delay_print("checking if you are a human.....................Test Passed [✔]\n\n")
root@ubuntu:/home/yash#
Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe