hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md
2023-08-03 19:12:22 +00:00

9.1 KiB
Raw Blame History

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

介绍

未经许可打印本身可能会带来安全风险或违反公司政策。在需要为打印作业付费的环境中,内部攻击者有动机绕过计费系统。此外,能够“打印”是针对网络打印机的大多数攻击的先决条件。

在打印作业计费方面有两种主要方法:要么让打印机直接处理,要么使用打印服务器。第一种方法是特定于供应商的,通常涉及某种特殊的“打印机驱动程序”,这里不再讨论。另一种方法涉及一个单独的打印服务器 - 通常是像CUPSLPRng这样的软件实现 - 来处理计费并且在公司和机构中非常常见。打印服务器可以使用LPD、IPP或其他打印协议进行通信并将作业转发给实际的打印机。重要的是要注意,必须限制对打印机的直接网络访问否则攻击者可以轻松绕过打印服务器及其计费机制。这意味着过滤对典型和非典型端口LPD、IPP、原始、HTTP、SMB、FTP、SNMP的访问。

基本上有两种方法可以绕过打印作业计费系统:要么冒充其他用户,要么操纵打印页数计数器。下面将讨论LPRngv3.8.B和CUPSv2.1.4)安装的这两种选项,它们是在学术和企业环境中使用的流行开源打印系统。下面给出了两个系统安全功能的比较。

打印系统 协议 加密 认证 页数计数器
LPRng LPD SSL/TLS Kerberos, PGP 硬件
CUPS IPP SSL/TLS Kerberos, HTTP 软件

认证绕过

LPRng和CUPS都提供基于SSL的通道加密和安全认证方案KerberosPGP签名的打印作业或HTTP 基本/摘要认证。如果正确配置,并且攻击者无法直接访问打印机,她将无法冒充其他用户。然而,这些安全功能在实际的打印服务器中很少应用,因为它们是可选的。相反,作为LPDLPRng或IPPCUPS参数给出的用户名被记录和计费 - 客户端可以将其设置为任意值。这样做的原因是大多数机构都进行了简单的成本效益考虑Kerberos需要在每个客户端上进行特殊设置而HTTP认证要求用户在打印时输入密码而少数未计费的打印输出的成本是可以承受的。

您可以通过尝试使用自定义用户名打印来验证正确的认证,如下所示:

lp -U nobody test.ps

页面计数器操纵

硬件页面计数器

为了正确计算打印页数,必须由打印系统确定,这并不是一项简单的任务。LPRng的作者们_假设打印机具有某种可靠且不受开关机循环影响的非易失性页面计数器机制_。大多数打印机都支持这种硬件页面计数器并且在每次打印作业后LPRng会使用PJL来读取它们。HP甚至记录了一种功能,可以通过将打印机设置为服务模式来写入页面计数器变量。这样,可以在打印作业中操纵_HP LaserJet 1200HP LaserJet 4200N_和_HP LaserJet 4250N_的页面计数器。在要打印的文档末尾,并在UEL之后,只需将计数器重置为其原始值(例如,2342

\x1b%-12345X@PJL JOB
This page was printed for free
\x1b%-12345X@PJL EOJ
\x1b%-12345X@PJL JOB
@PJL SET SERVICEMODE=HPBOISEID
@PJL SET PAGES=2342
\x1b%-12345X@PJL EOJ

攻击者可以设置负数的打印页数。请注意,将设备恢复为出厂默认设置也会在某些测试设备上将页面计数器重置为零。
降低页面计数器也可以用于以高于其价格出售打印机,就像购买二手车时可以与里程表进行比较一样。然而,值得强调的是,重置页面计数器并不一定是出于恶意目的:以高价销售低成本喷墨打印机的墨水是一种众所周知的商业模式,并通过在一定数量的页面后拒绝打印来阻止第三方加墨套件 - 为了应对这种不道德的做法,重置页面计数器是完全合理的。

在旧版HP激光打印机上可以使用PRETpagecount命令轻松设置硬件页面计数器:

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> pagecount 10
Old pagecounter: 53214
New pagecounter: 10

软件页面计数器

CUPS 使用了已经为所有主要页面描述语言实现的软件页面计数器。对于PostScript绕过计费的一种简单方法是在实际打印文档之前检查PageCount系统参数是否存在 - 当在CUPS / Ghostscript中解释时将返回false如下所示。

currentsystemparams (PageCount) known {
<@\textit{[...] code which is only executed on a printer device [...]}@>
} if

这种情况下CUPS使用的会计软件呈现的文档与打印机不同。CUPS只记录了一页 - 这似乎是一个硬编码的最小值 - 而实际的打印作业可能包含数百页。请注意使用IPP的“raw”队列/选项是强制性的否则CUPS会在到达页面计数器之前使用PostScript-to-PostScript过滤器Ghostscript的ps2write解析代码。

如何测试此攻击?

将任意的多页PostScript文档包装在上述代码中并进行打印。然后转到http://printserver:631/jobs?which_jobs=all并检查CUPS的页面计数器以获取此打印作业的信息。请注意您必须建立一个原始队列。也就是说一个不涉及过滤系统的队列打印作业直接发送到打印机。对于CUPS可以通过将内容类型设置为application/vnd.cups-raw来实现。如果您的系统已经配置为使用要测试的打印服务器,只需使用以下命令:

lp -o raw test.ps
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥