Translated ['src/network-services-pentesting/pentesting-631-internet-pri

This commit is contained in:
Translator 2025-08-14 06:34:00 +00:00
parent 94eff9bdb6
commit 0935cb5876

View File

@ -1,23 +1,103 @@
# Internet Printing Protocol
{{#include ../banners/hacktricks-training.md}}
# Інтернет-протокол друку \(IPP\)
**Протокол Інтернет-друку (IPP)**, як зазначено в **RFC 2910** та **RFC 2911**, є де-факто стандартом для мережевого друку. Він працює поверх **HTTP/1.1** (як у відкритому тексті, так і через TLS) і надає багатий API для створення друкованих завдань, запиту можливостей принтера та управління чергами. Сучасні розширення, такі як **IPP Everywhere**, навіть дозволяють друк без драйверів з мобільних та хмарних середовищ, тоді як той же формат пакета був повторно використаний для 3-D принтерів.
**Інтернет-протокол друку (IPP)**, як зазначено в **RFC2910** та **RFC2911**, слугує основою для друку через інтернет. Його можливість розширення демонструється такими розробками, як **IPP Everywhere**, яка має на меті стандартизувати мобільний та хмарний друк, а також введення розширень для **3D-друку**.
На жаль, відкриття порту **631/tcp (і 631/udp для виявлення принтерів)** часто призводить до серйозних проблем з безпекою як на традиційних офісних принтерах, так і на будь-якому хосту Linux/Unix, що працює з **CUPS**.
Використовуючи протокол **HTTP**, IPP отримує вигоду від встановлених практик безпеки, включаючи **базову/дослідницьку аутентифікацію** та **SSL/TLS шифрування**. Дії, такі як подання завдання на друк або запит статусу принтера, виконуються через **HTTP POST запити**, спрямовані на IPP сервер, який працює на **порті 631/tcp**.
Відомою реалізацією IPP є **CUPS**, система друку з відкритим кодом, що поширена в різних дистрибутивах Linux та OS X. Незважаючи на свою корисність, IPP, подібно до LPD, може бути використаний для передачі шкідливого контенту через **PostScript** або **PJL файли**, що підкреслює потенційний ризик безпеки.
---
## Quick PoC crafting raw IPP with Python
```python
# Example of sending an IPP request using Python
import requests
import struct, requests
url = "http://printer.example.com:631/ipp/print"
headers = {"Content-Type": "application/ipp"}
data = b"..." # IPP request data goes here
# 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
response = requests.post(url, headers=headers, data=data, verify=True)
print(response.status_code)
r = requests.post("http://printer:631/ipp/print", headers={"Content-Type":"application/ipp"}, data=ipp)
print(r.status_code, r.content[:40])
```
Якщо ви хочете дізнатися більше про [**зламування принтерів, прочитайте цю сторінку**](http://hacking-printers.net/wiki/index.php/Main_Page).
---
## Перерахунок та Розвідка
### 1. Nmap NSE
```bash
# run all CUPS/IPP scripts
nmap -sV -p631 --script=cups* <target>
# or only basic info
nmap -p631 --script=cups-info,cups-queue-info <target>
```
Скрипт `cups-info` витягує модель, стан та статистику черги, тоді як `cups-queue-info` перераховує очікуючі завдання.
### 2. Утиліти IPP з CUPS
* `ippfind` мультикаст/UDP виявлення (працює з cups-browsed):
```bash
ippfind --timeout 3 --txt -v "@local and port=631" # список принтерів
```
* `ipptool` довільні запити, визначені у файлі *.test*:
```bash
ipptool -tv ipp://<IP>/ipp/print get-printer-attributes.test
```
Упакований файл *get-printer-attributes.test* запитує версію прошивки, підтримувані формати документів тощо.
### 3. Dork'и Shodan / Censys
```bash
shodan search 'product:"CUPS (IPP)" port:631'
```
Більше ніж **70 000** хостів публічно експонували CUPS у квітні 2025 року.
---
## Останні вразливості (2023-2025)
| Рік | CVE ID(s) | Вразливий компонент | Вплив |
|------|-----------|--------------------|--------|
| 2025 | CVE-2023-50739 | Прошивка Lexmark (IPP парсер) | Heap-overflow → RCE через Wi-Fi/LAN |
| 2024 | CVE-2024-47076, 47175, 47176, 47177 | cups-browsed, libcupsfilters, libppd, cups-filters | Повний неавтентифікований RCE ланцюг на будь-якому Linux десктопі/сервері з увімкненим CUPS переглядом |
| 2024 | CVE-2024-35235 | cupsd 2.4.8- | Symlink трюк → довільний **chmod 666** → підвищення привілеїв |
| 2023 | CVE-2023-0856 (Canon) + Pwn2Own | Stack-overflow в атрибуті `sides` → віддалене виконання коду |
### cups-browsed RCE ланцюг (вересень 2024)
1. `cups-browsed` слухає на **UDP/631** для реклами принтерів.
2. Зловмисник надсилає один підроблений пакет, що вказує на шкідливу IPP URL (CVE-2024-47176).
3. `libcupsfilters` автоматично отримує віддалений **PPD** без валідації (CVE-2024-47076 & 47175).
4. Створений PPD зловживає фільтром **foomatic-rip** для виконання довільних shell команд щоразу, коли щось друкується (CVE-2024-47177).
Код доказу концепції є публічним на блозі дослідника, і експлойти не вимагають **жодної автентифікації**; доступ до мережі на UDP/631 є достатнім.
#### Тимчасові заходи пом'якшення
```
sudo systemctl stop cups-browsed
sudo systemctl disable cups-browsed
sudo ufw deny 631/udp # or equivalent firewall rule
```
Патчі були випущені основними дистрибутивами в жовтні 2024 року переконайтеся, що **cups-filters ≥ 2.0.0**.
### Неправильна конфігурація символічного посилання `Listen` у cupsd (CVE-2024-35235)
Розміщення символічного посилання в директиві `Listen` *cupsd.conf* призводить до того, що **cupds (root)** виконує `chmod 666` на вибраному зловмисником шляху, що призводить до записуваних системних файлів і, на Ubuntu, до виконання коду через шкідливий PPD з `FoomaticRIPCommandLine`.
---
## Офensive Techniques
* **Unauthenticated raw print job** багато принтерів приймають `POST /ipp/print` без автентифікації. Шкідливий **PostScript** вантаж може викликати команди оболонки (`system("/bin/nc ...")`) на висококласних пристроях.
* **Job Hijacking** `Cancel-Job`, за яким слідує `Send-Document`, дозволяє зловмиснику замінити документ когось іншого перед його фізичним друком.
* **SNMP → IPP combo** за замовчуванням спільнота `public` часто витікає внутрішнє ім'я черги, необхідне в IPP URL.
---
## Defensive Best Practices
1. Швидко патчити CUPS та прошивку принтера; підписатися на канали PSIRT постачальника.
2. Вимкнути `cups-browsed` та UDP/631, якщо не потрібен друк без конфігурації.
3. Обмежити TCP/631 для довірених підмереж/VPN та забезпечити **TLS (ipps://)**.
4. Вимагати **Kerberos/Negotiate** або автентифікацію за сертифікатом замість анонімного друку.
5. Моніторити журнали: `/var/log/cups/error_log` з `LogLevel debug2` покаже ненадійні завантаження PPD або підозрілі виклики фільтрів.
6. У мережах з високою безпекою перенести друк на захищений, ізольований сервер друку, який проксірує завдання до пристроїв лише через USB.
## References
- Akamai “Critical Linux RCE Vulnerability in CUPS — What We Know and How to Prepare”, April 2025.
- Debian Security Tracker деталі CVE-2024-35235.
{{#include ../banners/hacktricks-training.md}}