hacktricks/network-services-pentesting/pentesting-printers/cross-site-printing.md
2023-08-03 19:12:22 +00:00

8.7 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

您可以让用户向多个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连接将保持活动状态直到Web客户端或打印机设备触发超时这意味着打印机在一段时间内将无法访问。

如果打印机设备支持纯文本打印则XHR的HTTP请求头将被打印为硬拷贝包括包含调用恶意JavaScript的URL的Origin头字段因此对于攻击者来说很难保持沉默。这是不可避免的因为我们无法控制打印机并且在处理HTTP正文并且打印机设备已经将HTTP头部解释为纯文本之前无法禁用打印功能。如果减少噪音是优先考虑的攻击者可以尝试使用专有的PJL命令首先禁用打印功能PJL jobmedia中提到的使用其他潜在的XSP通道如IPP、LPD、FTP或打印机的嵌入式Web服务器。虽然所有协议都可以成功地测试使用跨协议脚本部署打印作业但它们除了不使用伪造的CORS头部提供反馈之外还存在一些缺点

  • 各种Web浏览器阻止对LPD和FTP端口的跨协议访问
  • 直接通过嵌入式Web服务器进行打印的参数是特定于型号的
  • 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对象打开到剩余253个地址的9100/tcp端口的连接使用PostScript和CORS欺骗来检索打印机产品名称这在我们的测试中只需要几秒钟。如果打印机与受害者主机位于同一子网上可以仅使用JavaScript检测到其地址。WebRTC正在为Safari开发并且受到当前版本的Firefox、Chrome和Microsoft Edge的支持。Internet Explorer不支持WebRTC但是VBScript和Java同样可以用于泄漏本地IP地址。如果无法检索到本地接口的地址我们将采用智能暴力破解方法我们尝试使用XHR对象连接到受害者路由器的80端口。为此从各种可访问互联网资源中编译了一个包含115个默认路由器地址的列表。如果可以访问路由器我们将按前面描述的方式扫描子网以查找打印机。

概念验证

可在hacking-printers.net/xsp/找到一个概念验证实现,证明了高级跨站打印攻击是实际可行的,对公司和机构构成了真实威胁。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥