# Internet Printing Protocol {{#include ../banners/hacktricks-training.md}} **Internet Printing Protocol (IPP)**, **RFC 2910** ve **RFC 2911**'de belirtildiği gibi, ağ yazdırma için de-facto standarttır. **HTTP/1.1** (şifreli veya TLS) üzerinde çalışır ve yazdırma işleri oluşturma, yazıcı yeteneklerini sorgulama ve kuyrukları yönetme için zengin bir API sunar. **IPP Everywhere** gibi modern uzantılar, sürücü gerektirmeyen yazdırmayı mobil ve bulut ortamlarından mümkün kılarken, aynı paket formatı 3-D yazıcılar için de yeniden kullanılmıştır. Ne yazık ki, **631/tcp (ve yazıcı keşfi için 631/udp)** portunu açmak genellikle ciddi güvenlik sorunlarına yol açar - hem geleneksel ofis yazıcılarında hem de **CUPS** çalıştıran herhangi bir Linux/Unix ana bilgisayarında. --- ## Quick PoC – crafting raw IPP with Python ```python import struct, requests # Minimal IPP Get-Printer-Attributes request (operation-id 0x000B) ipp = struct.pack( ">IHHIHH", # version 2.0, operation-id, request-id 0x0200, # 2.0 0x000B, # Get-Printer-Attributes 0x00000001, # request-id 0x01, 0x47, # operation-attributes-tag, charset attr (skipped) ) + b"\x03" # end-of-attributes r = requests.post("http://printer:631/ipp/print", headers={"Content-Type":"application/ipp"}, data=ipp) print(r.status_code, r.content[:40]) ``` --- ## Enumeration & Recon ### 1. Nmap NSE ```bash # run all CUPS/IPP scripts nmap -sV -p631 --script=cups* # or only basic info nmap -p631 --script=cups-info,cups-queue-info ``` `cups-info` betiği model, durum ve kuyruk istatistiklerini çıkarırken `cups-queue-info` bekleyen işleri sıralar. ### 2. CUPS'tan IPP yardımcı programları * `ippfind` – çoklu yayın/UDP keşfi (cups-browsed'e karşı çalışır): ```bash ippfind --timeout 3 --txt -v "@local and port=631" # yazıcıları listele ``` * `ipptool` – bir *.test* dosyasında tanımlanan rastgele istekler: ```bash ipptool -tv ipp:///ipp/print get-printer-attributes.test ``` Paketlenmiş *get-printer-attributes.test* dosyası, yazılım sürümünü, desteklenen belge formatlarını vb. sorgular. ### 3. Shodan / Censys dorks ```bash shodan search 'product:"CUPS (IPP)" port:631' ``` **70 000**'den fazla ana bilgisayar, Nisan 2025'te CUPS'ı kamuya açık bir şekilde sergiliyordu. --- ## Son Güvenlik Açıkları (2023-2025) | Yıl | CVE ID'leri | Etkilenen bileşen | Etki | |------|-----------|--------------------|--------| | 2025 | CVE-2023-50739 | Lexmark firmware (IPP parser) | Heap-overflow → RCE üzerinden Wi-Fi/LAN | | 2024 | CVE-2024-47076, 47175, 47176, 47177 | cups-browsed, libcupsfilters, libppd, cups-filters | CUPS taraması etkin olan herhangi bir Linux masaüstü/sunucusunda tam kimlik doğrulamasız RCE zinciri | | 2024 | CVE-2024-35235 | cupsd 2.4.8- | Symlink hilesi → keyfi **chmod 666** → ayrıcalık yükseltme | | 2023 | CVE-2023-0856 (Canon) + Pwn2Own | `sides` niteliğinde stack-overflow → uzaktan kod yürütme | ### cups-browsed RCE zinciri (Eylül 2024) 1. `cups-browsed`, yazıcı reklamları için **UDP/631** üzerinde dinler. 2. Bir saldırgan, kötü niyetli bir IPP URL'sine işaret eden tek bir sahte paket gönderir (CVE-2024-47176). 3. `libcupsfilters`, uzaktaki **PPD**'yi doğrulama olmadan otomatik olarak alır (CVE-2024-47076 & 47175). 4. Özel olarak hazırlanmış bir PPD, herhangi bir şey yazdırıldığında keyfi shell komutlarını yürütmek için **foomatic-rip** filtresini kötüye kullanır (CVE-2024-47177). Kanıt konsepti kodu araştırmacının blogunda kamuya açıktır ve istismarlar **kimlik doğrulaması gerektirmez**; UDP/631'e ağ erişimi yeterlidir. #### Geçici hafifletmeler ``` sudo systemctl stop cups-browsed sudo systemctl disable cups-browsed sudo ufw deny 631/udp # or equivalent firewall rule ``` Yamanlar, Ekim 2024'te büyük dağıtımlar tarafından yayınlandı - **cups-filters ≥ 2.0.0** olduğundan emin olun. ### cupsd symlink `Listen` yanlış yapılandırması (CVE-2024-35235) *cupsd.conf* dosyasındaki `Listen` direktifine bir sembolik bağlantı yerleştirmek, **cupds (root)**'un bir saldırgan tarafından seçilen bir yolu `chmod 666` yapmasına neden olur, bu da yazılabilir sistem dosyalarına yol açar ve Ubuntu'da, `FoomaticRIPCommandLine` ile kötü niyetli bir PPD aracılığıyla kod yürütülmesine neden olur. --- ## Saldırgan Teknikler * **Kimlik doğrulaması yapılmamış ham yazdırma işi** – birçok yazıcı `POST /ipp/print` isteğini kimlik doğrulaması olmadan kabul eder. Kötü niyetli bir **PostScript** yükü, yüksek kaliteli cihazlarda shell komutlarını (`system("/bin/nc ...")`) çağırabilir. * **İş Ele Geçirme** – `Cancel-Job` ardından `Send-Document` ile bir saldırgan, birinin belgesini fiziksel olarak yazdırılmadan önce değiştirebilir. * **SNMP → IPP kombinasyonu** – varsayılan topluluk `public`, IPP URL'sinde gerekli olan iç kuyruk adını sıklıkla sızdırır. --- ## Savunma En İyi Uygulamaları 1. CUPS ve yazıcı firmware'lerini zamanında yamalayın; satıcı PSIRT beslemelerine abone olun. 2. Zeroconf yazdırma gerekmiyorsa `cups-browsed` ve UDP/631'i devre dışı bırakın. 3. TCP/631'i güvenilir alt ağlara/VPN'ye kısıtlayın ve **TLS (ipps://)**'yi zorlayın. 4. Anonim yazdırma yerine **Kerberos/Negotiate** veya sertifika kimlik doğrulaması gerektirin. 5. Günlükleri izleyin: `/var/log/cups/error_log` ile `LogLevel debug2`, sağlam olmayan PPD indirmelerini veya şüpheli filtre çağrılarını gösterecektir. 6. Yüksek güvenlikli ağlarda, yazdırmayı yalnızca USB aracılığıyla cihazlara iş gönderen, sertleştirilmiş, izole bir yazıcı sunucusuna taşıyın. ## Referanslar - Akamai – “CUPS'ta Kritik Linux RCE Açığı — Bildiklerimiz ve Nasıl Hazırlanmalıyız”, Nisan 2025. - Debian Güvenlik Takipçisi – CVE-2024-35235 detayları. {{#include ../banners/hacktricks-training.md}}