hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md

7.9 KiB
Raw Blame History

零基础学习AWS黑客技术直至成为专家 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

您可以让用户向多个IP的9100端口发送HTTP POST请求尝试连接一个开放的原始打印端口。如果找到HTTP头要么以纯文本形式打印要么根据打印机的设置被丢弃。然而,POST数据可以包含任意打印任务,如PostScriptPJL命令以供解释

增强的跨站点打印

您可以使用XMLHttpRequest (XHR) JavaScript对象来执行对内部打印机的HTTP POST请求。到目前为止讨论的跨站点打印方法的一个限制是由于同源策略数据只能发送到设备不能接收。为了绕过同源策略的限制,您可以 服务器响应一个虚假但有效的HTTP响应允许CORS请求包括Access-Control-Allow-Origin=*)。下面给出了攻击的示意概览:

具有CORS欺骗的高级跨站点打印

在这种增强型的XSP中 结合CORS欺骗 网络攻击者可以完全访问HTTP响应这使他能够提取打印机设备中的任意信息如捕获的打印作业。下面展示了一个概念验证的JavaScript代码片段

job = "\x1B%-12345X\r\n"
+ "%!\r\n"
+ "(HTTP/1.0 200 OK\\n) print\r\n"
+ "(Server: PostScript HTTPD\\n) print\r\n"
+ "(Access-Control-Allow-Origin: *\\n) print\r\n"
+ "(Connection: close\\n) print\r\n"
+ "(Content-Length: ) print\r\n"
+ "product dup length dup string cvs print\r\n"
+ "(\\n\\n) print\r\n"
+ "print\r\n"
+ "(\\n) print flush\r\n"
+ "\x1B%-12345X\r\n";

var x = new XMLHttpRequest();
x.open("POST", "http://printer:9100");
x.send(job);
x.onreadystatechange = function() {
if (x.readyState == 4)
alert(x.responseText);
};

跨站打印的限制

请注意,作为页面描述语言的PCL 不适用于CORS欺骗,因为它只允许回显单个数字。不幸的是,PJL同样不能使用,因为它会在所有回显的字符串前添加@PJL ECHO这使得模拟有效的HTTP头部变得不可能。然而这并意味着增强型XSP攻击仅限于PostScript作业PostScript可以用来响应一个伪造的HTTP头部而且UEL可以进一步被调用来切换打印机语言。这样网络攻击者也可以获取PJL命令的结果。存在两个实现上的陷阱值得一提首先需要用PostScript确定要响应的数据的正确Content-Length。如果攻击者无法预测响应的总大小,而且分块编码也不是一个选项,她需要设置一个非常高的值并使用填充。其次,添加Connection: close头部字段很重要否则HTTP/1.1连接会保持活动状态,直到网络客户端或打印机设备触发超时,这意味着打印机将在一段时间内无法访问。

如果打印机设备支持纯文本打印XHR的HTTP请求头部将被打印出硬拷贝 - 包括包含调用恶意JavaScript的URL的Origin头部字段,这使得攻击者难以保持隐秘。这是不可避免的,因为我们无法控制打印机 - 并且在某些情况下可以禁用打印功能 - 直到HTTP正文被处理并且HTTP头部已经被打印机设备解释为纯文本。如果减少干扰是优先事项攻击者可以尝试首先使用专有的PJL命令禁用打印功能,如在PJL jobmedia中提出的使用其他潜在的XSP通道如IPP、LPD、FTP或打印机的嵌入式网络服务器。虽然所有协议都能成功地使用跨协议脚本的变体来部署打印作业但它们除了不提供使用伪造的CORS头部的反馈之外还有一些缺点

  • 各种网络浏览器阻止了对LPD和FTP端口的跨协议访问
  • 通过嵌入式网络服务器直接打印的参数是特定于模型的
  • IPP标准要求HTTP POST请求的Content-type设置为application/ipp这不能通过XHR对象完成 - 但是否真的关心错误类型取决于实现

下面给出了跨站打印通道的比较:

通道 端口 无反馈 未经请求的打印输出 标准化 被阻止的
Raw 9100 - -
Web 80 - - -
IPP 631 - -
LPD 515 - FF, Ch, Op
FTP 21 - FF, Ch, Op, IE

XSP的一个主要问题是找到打印机的正确地址或主机名。我们的方法是滥用WebRTC它在大多数现代浏览器中实现并具有枚举本地网络接口IP地址的功能。给定本地IP地址XHR对象进一步用于打开连接到端口9100/tcp对所有剩余的253个地址使用PostScript和CORS欺骗来检索打印机产品名称这在我们的测试中只需几秒钟。如果打印机与受害者主机在同一子网上其地址可以仅使用JavaScript检测到。WebRTC正在为Safari开发并得到了Firefox、Chrome和Microsoft Edge当前版本的支持。Internet Explorer不支持WebRTC但VBScript和Java同样可以用来泄露本地IP地址。如果无法检索到本地接口的地址我们采用智能暴力破解方法我们尝试使用XHR对象连接到受害者路由器的80端口。为此我们编制了一个包含115个来自各种互联网可访问资源的默认路由器地址的列表。如果可以访问路由器我们将按前述方法扫描子网中的打印机。

概念验证

一个概念验证实现表明,高级跨站打印攻击是实际可行的,并且对公司和机构构成了现实世界的威胁,可在hacking-printers.net/xsp/查看

从零到英雄学习AWS黑客攻击通过 htARTE (HackTricks AWS Red Team Expert)!

支持HackTricks的其他方式