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.
# Nmap 7.80 scan initiated Fri Jan 15 19:35:16 2021 as: nmap -p- --min-rate 1000 -o scanPorts battery.thmNmap 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.thmNmap 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.
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.
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.
/*main*/undefined8main(void){intiVar1;intlocal_8c;charlocal_88[32];charlocal_68[32];undefinedlocal_48[32];undefinedlocal_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");}return0;}/*update*/voidupdate(char*pcParm1){intiVar1;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*/voidusers(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;}
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
<formmethod="POST"style="text-align:center"><inputtype="text"name="uname"placeholder="Username"maxlength="12"><br><br><br><inputtype="text"name="bank"placeholder="Bank name (ABC or DEF)"><br><br><br><inputtype="password"name="password"placeholder="password"><br><br><br><inputtype="submit"value="Register me!"name="btn"><br><br><ahref="admin.php">Login</a></form>
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.
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.
<html><title>Login</title><bodystyle="background-color:black"><br><br><br><h3style="color:red;text-align:center">Bank Of Abc Def User Login</h3><br><style>form{border:2pxsolidblack;outline:#4CAF50solid3px;margin:auto;width:180px;padding:20px;text-align:center;}</style><formmethod="POST"style="text-align:center"name="myForm"><inputtype="text"name="uname"placeholder="Username"maxlength="14"><br><br><br><inputtype="password"name="password"placeholder="password"><br><br><br><inputtype="submit"value="Submit"name="btn"><br><br><br><ahref="register.php">New user?register here.</a></form></body></html><?phperror_reporting(0);session_start();if(isset($_POST['btn'])){$id=$_POST['uname'];$pass=$_POST['password'];try{$dbh=newPDO('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($resultas$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>";}}?>
<html><style>[...REDACTED...]</style><head><scripttype="text/javascript"src="scripts/jquery.min.js"></script><scripttype="text/javascript">functionXMLFunction(){varxml=''+'<?xmlversion="1.0"encoding="UTF-8"?>'+'<root>'+'<name>'+$('#name').val()+'</name>'+'<search>'+$('#search').val()+'</search>'+'</root>';varxmlhttp=newXMLHttpRequest();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><ahref="dashboard.php">Dashboard</a></li><li><ahref="with.php">Withdraw Money</a></li><li><ahref="depo.php">Deposit Money</a></li><li><ahref="tra.php">Transfer Money</a></li><li><ahref="acc.php">My Account</a></li><li><ahref="forms.php">command</a></li><li><ahref="logout.php">Logout</a></li><listyle="float:right"><ahref="contact.php">Contact Us</a></li></ul><br><br><br><br><fieldset><p><labelfor="name">Account Number</label><inputid="name"name="name"type="text"value=""/></p><p><labelfor="search">Remark</label><inputid="search"name="search"type="text"value=""/></p><p><buttonname="snd"id="Login"onclick="XMLFunction()">Send Message</button></p></fieldset></body></html><?phpsession_start();if(isset($_SESSION['favcolor'])and$_SESSION['favcolor']==="admin@bank.a"){libxml_disable_entity_loader(false);$xmlfile=file_get_contents('php://input');$dom=newDOMDocument();$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.
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.
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#