A Nightmare On Math Street

Autore: Lord Shiva Aggiornamento: 15.07.2023 Tempo di lettura: 08 min.
 

Appena avviata l'instanza della macchina HTB mi ha fornito l'IP e la porta del target.

Provando ad entrare tramite browser mi è comparsa la seguente schermata:

 

Mi sono collegato tramite console via telnet con il seguente comando:

$ telnet {ip} {porta}

E' subito evidente che dobbiamo costruire uno script che ci consenta di eseguire le 500 operazioni rapidamente.
Proprio per questo, ho creato il seguente script:

from pwn import *
import re

def aggiusta_operazioni(richiesta: str) -> str:
    """Organizzo le operazioni dando le priorità giuste"""
    aggiusta_operazione = []
    dpo = False
    for unit in richiesta.split():
        if unit == "*":
            if dpo:
                aggiusta_operazione[-1] = f"{aggiusta_operazione[-1]}) *"
                dpo = False
            else:
                aggiusta_operazione.append(unit)
            continue

        if unit == "+":
            # Controllo se il pressimo pezzo contiene "("
            if richiesta[richiesta.index(unit)+1].startswith("("):
                aggiusta_operazione.append(unit)
                continue
            if dpo:
                aggiusta_operazione[-1] = f"{aggiusta_operazione[-1]} +"
            else:
                aggiusta_operazione[-1] = f"({aggiusta_operazione[-1]} +"
                dpo = True
            continue

        aggiusta_operazione.append(unit)

    if dpo:
        aggiusta_operazione[-1] += ")"

    aggiusta_operazione_str = " ".join(aggiusta_operazione)
    print(f"{aggiusta_operazione_str=}")
    return aggiusta_operazione_str

def risolvi_quesito():
    """Risolvo l'operazione e la invio alla macchina"""
    richiesta_str = conn.recvuntil("?", timeout=1).decode()
    print(f"{richiesta_str=}")
    richiesta = re.findall(r"\[\d+\]:\s+(.*?)\s+\=", richiesta_str)[0]
    print(f"{richiesta=}")
    aggiusta_operazione = aggiusta_operazioni(richiesta)
    risposta = str(eval(aggiusta_operazione))
    print(f"{risposta=}")

    conn.sendline(risposta)
    print("\n---\n")
    if "[500]" in richiesta_str:
        print(conn.recvline_contains("HTB", timeout=1).decode())
        exit(0)

global conn
conn = remote('{IP TARGET}', {PORTA})

while 1:
    try:
        risolvi_quesito()
    except EOFError:
        print("EOFError...")
        break

 

Lo script, che puoi scaricare anche al seguente link, esegue tutte le operazioni per nostro conto fino ad arrivare alla flag.

HTB{tH0...........................llz}