8.7 KiB
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品The PEASS Family
-
加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享你的黑客技巧。
您可以让用户向多个IP的端口9100发送HTTP POST请求,尝试连接到开放的原始打印端口。如果找到,根据打印机的设置,HTTP头要么以纯文本形式打印,要么被丢弃。然而,POST数据可以包含任意的打印作业,如PostScript或PJL命令进行解释。
增强的跨站点打印
您可以使用XMLHttpRequest (XHR) JavaScript对象来执行对内部打印机的HTTP POST请求。迄今为止讨论的跨站点打印方法的一个限制是,由于同源策略,数据只能发送到设备,无法接收。为了突破同源策略的限制,您可以使服务器响应一个虚假但有效的HTTP响应,允许CORS请求(包括Access-Control-Allow-Origin=*
)。攻击的示意图如下所示:
在这种增强的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 🎥
-
您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFT收藏品The PEASS Family
-
加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
-
通过向hacktricks repo和hacktricks-cloud repo提交PR来分享您的黑客技巧。