hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md

92 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<details>
<summary><strong>零基础学习AWS黑客攻击到高级技巧</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
</details>
# **介绍**
**未经许可的打印**本身可能是一个安全风险或违反公司政策。在打印作业需要收费的环境中,内部攻击者有动机绕过计费系统。此外,能够‘打印’是针对网络打印机的大多数攻击的先决条件。
在打印作业计费方面有两种主要方法:要么**直接让打印机处理,要么使用打印服务器作为中介**。第一种方法是特定于供应商的,通常涉及某种特殊的‘打印机驱动程序’,在此不再讨论。另一种方法涉及使用单独的打印服务器 - 通常是像[CUPS](https://en.wikipedia.org/wiki/CUPS)或[LPRng](https://en.wikipedia.org/wiki/LPRng)这样的软件实现 - 来处理计费这在公司和机构中非常常见。打印服务器可能使用LPD、IPP或其他打印协议并将作业转发给实际的打印机。**重要的是要注意,必须限制对打印机的直接网络访问**,否则攻击者可以**轻松绕过打印服务器**及其计费机制。这意味着要过滤对典型和非典型端口LPD、IPP、raw、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的通道加密和像[Kerberos](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\))、[PGP](https://en.wikipedia.org/wiki/Pretty\_Good\_Privacy)签名打印作业或HTTP [基本](https://en.wikipedia.org/wiki/Basic\_access\_authentication)/[摘要](https://en.wikipedia.org/wiki/Digest\_access\_authentication)认证的安全认证方案。如果**配置得当**,并且攻击者无法直接访问打印机,她将**无法冒充其他用户**。然而,这些安全功能是**可选的,而且在现实世界的打印服务器中很少应用**。相反作为LPDLPRng或IPPCUPS参数给出的**用户名被记录和计费** - 这可以由客户端设置为任意值。这样做的原因是大多数机构的简单成本效益考虑:**Kerberos需要在每个客户端上进行特殊设置**,而**HTTP**认证**要求**用户在想要打印某些东西时输入**密码**,而少量未计费的打印输出的成本是可以承受的。
您可以尝试使用**自定义用户名**打印来**验证适当的认证**,如下所示:
```
lp -U nobody test.ps
```
# 页面计数器操纵
## 硬件页面计数器
为了正确的计费,**必须由打印系统确定打印的页面数量**,这不是一项简单的任务。**LPRng** 的作者们_假设打印机具有某种非易失性页面计数器机制该机制可靠且不受开/关电源周期的影响_。这种**硬件页面计数器**得到了大多数打印机的支持,并且在每次**打印**作业后通过LPRng **使用PJL读取**。**HP**甚至记录了一项通过将打印机置于服务模式来**写入**到**页面计数器**变量的功能。通过这种方式_HP LaserJet 1200、HP LaserJet 4200N_ 和 _HP LaserJet 4250N_ 的**页面计数器**可以在打印作业中被操纵。在要打印的文档的末尾,并通过[UEL](./#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
```
攻击者可能会设置打印页数为负数。请注意,将设备重置为[出厂默认设置](factory-defaults.md)也会**在某些测试设备上将页面计数器重置为零**。\
降低页面计数器也可以用来**以高于其价值的价格出售打印机**,这可以与购买二手车时的里程表相比较。然而,值得强调的是,**重置页面计数器并不一定是出于恶意目的**:出售价格过高的墨水给低成本的喷墨打印设备,并通过拒绝在打印一定数量的页面后使用第三方补充套件来封锁,是一个众所周知的商业模式——为了处理这种不道德的做法,重置页面计数器是完全合理的。
在较旧的HP激光打印机上可以使用[PRET](https://github.com/RUB-NDS/PRET)的`pagecount`命令来轻松设置硬件页面计数器:
```
./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 到 PostScript 过滤器Ghostscript 的 ps2write解析代码。
**如何测试这种攻击?**
**将**任意**多页 PostScript 文档**包裹在**上述代码**中并打印。然后访问 [`http://printserver:631/jobs?which_jobs=all`](http://printserver:631/jobs?which\_jobs=all) 并检查 CUPS 的页面计数器对于这个打印作业的记录。请注意,你必须建立一个 raw 队列。也就是说,一个不涉及过滤系统的队列,打印作业直接发送到打印机。对于 CUPS这是通过将内容类型设置为 `application/vnd.cups-raw` 来完成的。如果你的系统已经配置为使用要测试的打印服务器,只需使用:
```
lp -o raw test.ps
```
<details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details>