
CVE-2018-15133을 위한 Python 익스플로잇으로, 알려진 APP_KEY를 사용하여 암호화된 세션의 안전하지 않은 역직렬화를 통해 취약한 Laravel 애플리케이션에서 원격 코드 실행을 달성합니다.
이 Python 스크립트는 CVE-2018-15133 취약점을 기반으로, 안전하지 않은 역직렬화를 통해 취약한 Laravel 애플리케이션에 대해 원격 코드 실행(RCE) 익스플로잇을 구현합니다.
이 익스플로잇은 Laravel(버전 5.5.40 이하, 5.6.0~5.6.29)에서 암호화된 세션이 적절한 검증 없이 자동으로 역직렬화되는 취약점을 이용합니다. 공격자는 Laravel의 APP_KEY에 접근할 수 있으면 악성 페이로드를 암호화하여 서버에서 역직렬화 및 실행되도록 할 수 있습니다.
Laravel은 세션에 대해 세 가지 구성 요소를 가진 대칭 암호화 메커니즘을 사용합니다:
IV (Initialization Vector): 각 세션에 대해 생성된 무작위 초기화 벡터
Value: AES-128-CBC 또는 AES-256-CBC를 사용하여 암호화된 값
MAC: IV + value + APP_KEY에 대해 계산된 메시지 인증 코드(HMAC-SHA256)
세 가지 입력 매개변수를 받습니다: base64로 인코딩된 Laravel APP_KEY, 실행할 명령어, 대상 도메인
PHPGGC 도구를 gadget chain Laravel/RCE5와 함께 호출하여 악성 PHP 객체 체인을 생성합니다
피해자 서버에서 실행될 운영 체제 명령어를 구성합니다 (예: system('whoami');)
연결된 gadget이 포함된 직렬화된 PHP 페이로드를 생성합니다
base64 페이로드를 바이너리 형식으로 디코딩합니다
APP_KEY에서 "base64:" 접두사가 있으면 제거합니다
키가 유효한 base64가 되도록 필요한 패딩을 추가합니다
키를 base64에서 바이트로 디코딩합니다
16바이트 무작위 초기화 벡터(IV)를 생성합니다
AES CBC 모드로 키와 IV를 사용하여 페이로드를 암호화합니다
암호화 전에 페이로드에 PKCS7 패딩을 적용합니다
IV를 base64로 인코딩합니다
암호문(암호화된 페이로드)을 base64로 인코딩합니다
HMAC용 메시지로 IV와 value(base64)를 연결합니다
연결된 메시지를 키를 비밀로 사용하여 HMAC-SHA256으로 MAC을 계산합니다
iv, value, mac 세 필드를 가진 JSON 객체를 구성합니다
전체 JSON을 base64로 인코딩합니다
curl을 사용하여 laravel_session 쿠키에 페이로드를 담은 HTTP 요청을 구성합니다
대상 도메인으로 요청을 전송합니다
Laravel 서버는 쿠키를 받아 base64를 디코딩합니다
Laravel은 수신된 IV와 value에 대해 MAC 무결성을 검증합니다
Laravel은 자체 APP_KEY를 사용하여 AES-CBC로 내용을 복호화합니다
Laravel은 복호화된 내용을 자동으로 역직렬화합니다
PHP는 역직렬화된 객체의 __destruct() 또는 __wakeup() 매직 메서드를 호출합니다
call_user_func() 또는 eval()로 이어지는 gadget 체인이 트리거됩니다
서버에서 운영 체제 명령어가 실행됩니다
이 익스플로잇은 PHP 매직 메서드 호출을 연결하는 gadget 체인을 사용합니다:
역직렬화 중에 PHP는 자동으로 __destruct() 또는 __wakeup()을 호출하여, eval()에서 임의 코드를 실행하는 체인을 시작합니다.
전제 조건 익스플로잇이 작동하려면 공격자에게 다음이 필요합니다:
Laravel APP_KEY (환경 변수 유출, 노출된 S3 버킷, 소스 코드 등을 통해 획득)
기본적으로 역직렬화가 활성화된 취약한 Laravel 버전
./phpggc/ 디렉토리에 설치된 PHPGGC https://github.com/ambionics/phpggc
사용 예시
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
이 명령어는 Laravel이 세션을 역직렬화할 때 whoami를 실행하는 직렬화된 페이로드를 생성합니다.