Severity: Critical (CVSS v3.1 = 9.8) (Full database Permission)
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Finder: M. Enes Aydın https://www.cve.org/CVERecord?id=CVE-2026-92555
TCP/3055 Key → Cipher → Packet Format → Login State Machine
Bu araştırmaya başlarken elimde doğrudan bir credential disclosure bulgusu yoktu. Öncewerp.exe ile kontrolpanel.exe arasındaki TCP/3055 trafiğini anlamaya çalıştım. Paketlerin nasıl kodlandığını, login isteğinin hangi alanlardan oluştuğunu ve sunucunun authentication kararını nerede verdiğini çıkardıkça asıl hata görünür hale geldi.
Sorun, Kontrol Panel’in kullanıcı doğrulamasını hiç yapmaması değildi. Tam tersine geçersiz kullanıcı adı ve parola doğru şekilde reddediliyordu.
Hata, ret kararından sonra başlıyordu.
Geçersiz login için SERVER_ERROR hazırlanmasına rağmen akış durmuyor, ortak response builder’a devam ediyor ve sunucunun kendi veritabanı bağlantısında kullandığı SERVER_USERNAME ile SERVER_PASSWORD aynı yanıta ekleniyordu.
Yani istemci bir taraftan:
Test edilen bileşenler
Yerel analiz ortamında:kontrolpanel.exe SHA-256:
26.02.25 binary’si ve s26.02.19 bildiren kurulum hakkında konuşuyorum. Aradaki veya daha eski sürümlerin tamamını etkilendi diye genellemiyorum.
1. Önce hangi binary kiminle konuşuyor onu sabitledim
TCP/3055’i dinleyen taraf:SERVER_USERNAME ve SERVER_PASSWORD alanlarının ERP hesabına mı, database hesabına mı ait olduğunu ayrıca kanıtlamam gerekecekti.
İlk hedefim şu hattı çıkarmaktı:
2. Protokol anahtarını nasıl buldum?
PoC’de kullanılan şu değer Firebird parolası veya database key’i değil:werp.exe ile kontrolpanel.exe arasındaki TCP/3055 mesajlarını dönüştüren sabit Blowfish protokol anahtarı.
Her iki binary üzerinde ASCII ve UTF-16LE string taraması yaptım. Özellikle iki tarafta ortak bulunan GUID biçimli sabitleri ayırdım.
Aynı değer şu konumlarda bulundu:
Anahtar byte dizisi:
Aynı GUID’nin iki binary’de bulunması, tek başına bunun crypto key olduğunu kanıtlamaz.Bu aşamada yalnızca güçlü bir aday vardı.
3. ECB sonucuna nasıl gittim?
TCP/3055 wire verisi Base64 görünümlü tek satırlardan oluşuyordu:cp1254 ile açtım.
Ortaya rastgele byte’lar yerine doğrudan protokol alanları çıktı:
- Aynı GUID hem
werp.exehemkontrolpanel.exeiçinde bulunuyordu. - Blowfish ECB + PKCS#7 ile çözünce anlamlı protokol alanları çıkıyordu.
- Aynı yöntemle yeniden şifrelediğim paket Kontrol Panel tarafından kabul ediliyordu.
4. Paket formatı
Gönderim sırası:5. Neden cp1254?
Burada encoding’i de tahmin ederek bırakmadım.
Server’ın Türkçe authentication error mesajı iyi bir doğrulama noktasıydı:
cp1254 ile doğru çözülüyordu.
ASCII zaten Türkçe karakterleri temsil edemiyordu. UTF-8 ile aynı byte dizisi düzgün çıkmıyordu.
Ayrıca cp1254 kullanarak yeniden ürettiğim paket Kontrol Panel tarafından kabul edildi.
Bu nedenle wire plaintext encoding’i için cp1254 sonucuna gittim.
6. Basit protocol sanity check
Zararsız birPING. mesajıyla codec’i ayrıca test ettim.
Amaç vulnerability tetiklemek değil, sadece şu hattı doğrulamaktı:
7. ERP login paketini yeniden oluşturmak
ERP login sırasında kullanılan alanları çıkardım:8. Login state machine’i çıkarmak
TCP handler yaklaşık:USERNAME alanı tamamen yoksa credential yolu çalışmıyor.
Kontrol:
USERNAME bulunmazsa:
USERNAME gerekiyor; ancak bunun geçerli kullanıcı olması gerekmiyor.
9. PERSONEL lookup ve failure branch
Login credential yolu:10. Breakpoint ile aynı request içinde doğrulama
Static path’i canlıda görmek için şu üç nokta yeterliydi:11. SERVER_USERNAME ve SERVER_PASSWORD nereden geliyor?
Ortak response builder içinde global configuration object:
12. [eax+0x3C] değerinin gerçekten DB parolası olduğunu nasıl doğruladım?
Burada string yakınlığına güvenmedim.
Şu tek başına yeterli olmazdı:
SERVER_USERNAME olarak geliyor.
Yanındaki:
SERVER_PASSWORD olarak geliyor.
Daha sonra bu ikili gerçek database authentication’ında başarılı oldu.
Bu noktadan sonra [eax+0x38] / [eax+0x3C] çiftinin yalnızca isim benzerliğinden değil, producer → response → consumer davranışından database credential olduğunu söyleyebildim.
13. Yerel Firebird doğrulaması
Yerel ortamda response:
SERVER_PASSWORD alanındaki değer gerçekten aktif database credential mı?
Cevap evetti.
14. İkinci ortam: SQL Server
Ayrı bir yetkili VDS ortamında aynı akışı tekrar test ettim. Server response:15. Vulnerability’nin gerçek state transition’ı
Özet tablo:
Olması gereken:
Authentication failure state’i, response serialization sırasında hassas database configuration alanlarının eklenmesini engellemiyor.
16. Sabit Blowfish key neden tek başına vulnerability değil?
Static protocol key kötü bir tasarım. Ancak bu bulgunun root cause’u o değil. Server hiçbir durumda başarısız login response’una database administrator password koymamalı. Transport kusursuz TLS ile korunsaydı bile uygulama logic’i yine yanlış olurdu. Sabit key burada yalnızca bağımsız bir client’ın:17. Key’in bir byte’ını değiştirirsem ne olur?
Bu da protokolü anlamak için kullandığım sanity check’lerden biriydi. Key’in bir byte’ı yanlışsa Base64 katmanı hâlâ tamamen geçerli görünebilir. Fakat server aynı key ile decrypt etmediği için plaintext bozulur. İlk güvenilir üst seviye belirti çoğu durumda:USERNAME aramasının başarısız olmasıdır.
Padding de bozulduysa işlem daha erken kesilebilir.
Protokolde MAC/authentication tag olmadığı için yanlış key için tek ve garantili bir “burada hata verir” noktası yok.
18. Düşük riskli patch ile root cause’u nasıl izole ederdim?
Binary seviyesinde hızlı bir doğrulama yapmak gerekseydi en küçük değişikliklerden biri password value’yu serialization noktasında boşaltmak olurdu. Örneğin:SERVER_PASSWORD= değerini boş bırakır.
Bu bir production fix önerisi değil; yalnız binary seviyesinde:
19. Etki
Doğrudan doğruladığım şey:I:H ve A:H seçimleri test sırasında veri silindiği anlamına gelmiyor. Bunlar başarılı şekilde doğrulanan SYSDBA ve sysadmin otoritelerinin yetki kapsamına dayanıyor.
20. Remediation
En doğru çözüm, database administrator credential’ını TCP/3055 client response’undan tamamen çıkarmak. Başarısız login:saveSYSDBAyerine least-privilege service account kullanılmalı,- açığa çıkmış olabilecek DB password’leri rotate edilmeli,
- TCP/3055 yalnız gerekli client/network segmentlerine sınırlandırılmalı,
- TCP/3050 ve TCP/1433 güvenilmeyen ağlara açılmamalı,
- custom static-key transport yerine authenticated modern transport kullanılmalı,
- invalid username ve wrong-password response’ları regression test’e eklenmeli.