Эксперимент по удаленному запуску кода на принтере
Якоб Бейнс (Jacob Baines), участвующий в разработке сетевого сканера безопасности Nessus, опубликовал статью, в которой показал печальное состояние с защитой сетевых принтеров. После покупки новых офисных принтеров HP OfficeJet Pro 8210, Якоб обнаружил, что они укомплектованы устаревшей прошивкой, в которой производителем отмечена уязвимость CVE-2017-2741, а автоматическая установка обновлений отключена в настройках.
Производитель приводит только общие сведения об уязвимости CVE-2017-2741, не раскрывая детали. Исследователя насторожило, что проблеме присвоен критический уровень опасности (9.8 из 10) и он решить самостоятельно выяснить в чем суть уязвимости. В итоге, было выявлено, что на сетевом порту 9100 принтер без ограничения принимает команды на языке PJL (Printer Job Language). Доступ к файловой системе ограничен каталогами tmp/ и csr_misc/, но данное ограничение тривиально обходится через передачу символов "../" в составе пути, например, для доступа к файлу с паролями можно выполнить команду "@PJL FSUPLOAD NAME="../../etc/passwd".
Более того, некоторые системные директорию оказались доступны на запись, что например позволило разместить собственный скрипт инициализации в директории "/rw/var/etc/profile.d/", который был запущен во время перезапуска принтера. Например, удалось успешно загрузить и запустить бэкдор для удаленного входа на принтер с правами root:
$ 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.