티스토리 뷰

728x90
반응형

문제 개요

CVE-2021-3129 

Ignition before 2.5.2, as used in Laravel and other products, allows unauthenticated remote attackers to execute arbitrary code because of insecure usage of file_get_contents() and file_put_contents(). This is exploitable on sites using debug mode with Laravel before 8.4.2. (출처 : cve.mitre.org)

문제 풀이

우선 문제 자체에서 사용자 계정 정보 1개를 제공해줍니다. 계정정보는 아래와 같습니다. 각각 ID와 PW인데요.

lxkid02:8rsNN9ohfLp69cVRFEgk4Qzs

 

해당 계정으로 접속해보면 아래와 같은 화면이 나옵니다. 문제 지문에 나온대로 다크넷의 마켓에서 개인정보를 비트코인을 주고 판매하는 사이트 같습니다.

 

그리고 products 메뉴에 들어가보면 아래와 같은 화면이 나옵니다.

보니깐 add new product 라고 해서 상품을 등록할 수 있는 것처럼 보입니다. 상품을 한번 등록해보겠습니다.

 

그런데 상품 등록 시에 이미지 파일을 반드시 업로드하라고 합니다. 테스트 용도로 확장자를 아예 제거하고 파일을 업로드 해보았습니다.

 

그리고 업로드한 파일의 경로에 접근해보니 파일 이름 자체는 hash 된 것 같고 확장자는 자동으로 txt 가 된 걸 확인할 수 있습니다. 실제 파일을 조회하려고 아래 URL에 접근을 해보았습니다.

/products/image/bREkreomPXAgFijHroOQuvnMKuNRBgmT8FgcwISI.txt

그랬더니 아래와 같이 laravel debug mode on 된 상태의 페이지를 확인할 수 있습니다.

 

위 페이지에서는 간단히 user 정보랑 laravel framework 의 버전 정도를 확인할 수 있었습니다.

한동안 디버깅 모드에 나온 App 단 소스코드에 혹여나 취약점이 존재할까 파보았지만, 별도로 취약점을 찾을 수 없었습니다. 그러다가 위 페이지를 아예 소스코드 보기로 확인해보았습니다.

 

그리고 소스코드 중 window.data 값에 저장되는 데이터 중에서 아래 항목이 보였습니다.

"shareEndpoint":"http:\/\/138.68.158.33:31949\/_ignition\/share-report"

해당 경로가 무슨 경로인지 직접 접속을 통해서 확인해보았습니다. 그랬더니 아래와 같이 GET 메소드는 지원하지 않으니 POST 요청으로 하라고 나옵니다.

해당 URL로 POST 요청을 하기 위해서는 어떤 파라미터가 필요한지 조사해보았습니다.

https://github.com/facade/ignition/tree/main/src/Http/Requests

 

GitHub - facade/ignition: A beautiful error page for Laravel apps

A beautiful error page for Laravel apps. Contribute to facade/ignition development by creating an account on GitHub.

github.com

해당 URL에 대한 소스코드는 위 github 레포지토리에서 확인할 수 있습니다. 파일 이름은 ShareReportRequest.php 입니다. json 형태로 report, tabs, lineSelector 파라미터를 받는다고 합니다. 그리고 해당 형태에 맞춰서 전송을 해봤더니 별다른 소득이 없었습니다.

 

그러다가 Requests 디렉토리에 ShareReportRequest.php 파일 말고도 다른 파일인 ExecuteSolutionRequest.php 파일이 있는 걸 볼 수 있습니다. 해당 경로 또한 파악했을 때 아래와 같았습니다.

http://138.68.158.33:31949/_ignition/execute-solution

그리고 위 URL로 요청했을 때 마찬가지로 GET 이 아닌 POST 요청이 필요하다고 합니다. 해당 경로에는 solution 과 parameters 라는 파라미터가 사용된다고 하는데, 정확한 사용법을 찾아보다가 마침 아래 내용을 알게 되었습니다.

https://www.ambionics.io/blog/laravel-debug-rce

 

Laravel <= v8.4.2 debug mode: Remote code execution

Ambionics Security team discovered an RCE in Laravel, when the framework is in debug mode.

www.ambionics.io

 

때마침 정확히 /_ignition/execute-solution 경로를 통해 공격할 수 있고 또 때마침 Laravel framework 가 debug mode 가 on 일 때 시도할 수 있는 공격이 존재한다고 합니다. 바로 위에 블로그에 설명되어 있는 대로 시도해보았습니다.

 

Exploit 에 사용되는 도구는 아래 github 레포지토리에서 다운받을 수 있습니다.

https://github.com/ambionics 

 

Ambionics Security

Offensive & Continuous Web Security Assessment. Ambionics Security has 7 repositories available. Follow their code on GitHub.

github.com

 

위에서 필요한 도구는 페이로드 작성에 필요한 phpggc 와 exploit 실행에 필요한 laravel exploit 도구가 필요합니다.

(혹시 만약에 phpggc 프로그램 실행 시 컴파일 오류가 난다면 아래 명령어를 실행해보세요.)

apt install --only-upgrade libpcre2-8-0

 

이제 두 도구가 준비되었다면 laravel exploit README.md 에 나온대로 명령어를 수행시켜줍니다.

그럼 위와 같이 RCE 가 성공적으로 이루어져 ls 명령어의 결과가 나오는 것을 확인할 수 있습니다.

 

Flag 는 시스템 어딘가에 있고, 해당 Flag 내용을 출력하면 아래와 같이 Flag 값이 잘 나오는 것을 확인할 수 있습니다.

 

 

마무리

해당 문제는 Web Challenge 에서 Medium 에 속하는 난이도의 문제였습니다. 소스코드는 별도로 제공되지 않는 문제여서 간만에 더욱 흥미로웠던 문제였는데요. 무엇보다 문제 제작자가 문제를 올바른 방향으로 풀 수 있게 힌트를 만들어두어서 비교적 쉽게 풀 수 있었던 것 같습니다. 문제 풀이 자체는 수월한데, 문제에서 나오는 취약점에 대한 이해는 별도로 다시 공부해야할 것 같습니다. 저는 이 취약점을 처음 접해봐서 이곳 저곳 쑤시다가 우연히 타겟을 발견하게 된 것 같아 다소 운이 작용했던 것 같습니다.

 

728x90
반응형
댓글