
CVE-2020-28328에 대한 분석: SuiteCRM 로그 파일 원격 코드 실행 및 보너스 크로스 사이트 스크립팅
최근 저는 SuiteCRM에서 두 가지 취약점을 발견했습니다. 이 취약점들은 낮은 권한의 사용자가 기본 운영 체제에서 코드 실행을 달성할 수 있는 공격 체인을 제공합니다. 공격 체인은 크로스 사이트 스크립팅(XSS)으로, 이를 이용해 크로스 사이트 요청 위조(CSRF)를 수행할 수 있으며, 애플리케이션 구성을 변조하고 로그 파일을 포이즈닝하여 원격 코드 실행(RCE)으로 이어집니다. 이 모든 것은 악성 JavaScript가 포함된 파일 업로드를 통해 이루어지며, 낮은 권한의 사용자가 관리 권한이 있는 사용자를 속여 실행하도록 만들 수 있습니다. 제가 첨부한 Proof-Of-Concept 파일과 비디오는 낮은 권한의 사용자가 이 공격을 수행하고 SuiteCRM을 호스팅하는 시스템에서 리버스 셸을 획득하는 모습을 보여줍니다. 이 문제는 SuiteCRM 버전 7.11.17에서 패치되었습니다.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
이 악용에는 관리자 액세스가 필요하므로 PR:L이 PR:H로 변경되어 최종 점수가 8.8에서 7.2로 조정되어야 한다고 생각하기 때문에 이 평가에 완전히 동의하지는 않습니다.
제 평가는 다음과 같습니다: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
참조: https://nvd.nist.gov/vuln/detail/CVE-2020-28328
SuiteCRM 버전 7.11.15
저장형 크로스 사이트 스크립팅은 '문서 만들기(Create Documents)' 파일 업로드에 존재합니다. 낮은 권한의 사용자는 임의의 내용을 가진 파일을 업로드할 수 있습니다. 그런 다음 사용자는 이 문서를 다운로드하기 위해 제공된 링크를 검사하고 id 매개변수를 찾아 파일 시스템에서 파일의 위치를 확인할 수 있습니다. 이 길고 임의적인 값은 /uploads/ 디렉토리 안에 있는 파일의 이름입니다. 사용자는 이 파일에 임의의 JavaScript를 넣은 다음 다른 사용자에게 링크를 보낼 수 있습니다. 이를 통해 다른 사용자의 세션을 가로채거나 해당 사용자를 대신하여 작업을 수행할 수 있으며, 이는 PoC 비디오에서 확인할 수 있습니다.
크로스 사이트 스크립팅을 통한 세션 하이재킹으로 관리자가 될 수 있다는 것을 발견한 후, '관리자 → 시스템 설정(Admin → System Settings)'에서 시스템 속성, 특히 로그 파일 속성을 제어할 수 있다는 것을 발견했습니다. 로그 파일 확장자는 상당히 잘 차단되어 있었지만, BurpSuite를 사용하여 '로그 파일 이름(Log File Name)' 값을 .php 확장자를 포함한 임의의 값으로 업데이트할 수 있었습니다. 저는 아무것도 변경하지 않고 요청을 제출하고 실제로 값을 업데이트하는 POST 요청을 캡처하여 이 작업을 수행했습니다. logger_file_name 매개변수를 통해 파일 이름을 shell.php로 변경하고 '확장자(Extension)' 필드를 공백으로 만들었습니다. 그 결과 웹 루트에서 브라우저로 접근할 수 있는 php 파일이 생성되었지만, 실행할 php 코드가 파일 안에 필요했습니다.
다음으로 파일의 출력을 검토한 결과, 로깅이 info로 설정되어 있으면(기본값이었다고 생각합니다...) 사용자 속성(예: 사용자의 이름 또는 성)을 업데이트할 때 해당 속성을 통해 파일에 입력을 제어할 수 있다는 것을 알게 되었습니다. 그래서 burp에서 요청을 캡처하고 last_name 폼 필드에 php 코드 <?php $id =`id`; echo $id; ?>를 삽입했습니다. 그 결과 Linux에서 웹 서버 사용자 www-data의 컨텍스트로 id 명령의 출력이 생성되었습니다. 로그 파일을 기준으로 이스케이프되는 유일한 문자는 작은따옴표, 큰따옴표, 백슬래시뿐임을 확인할 수 있었습니다. 백엔드에서 sql 로그 파일을 tail 명령으로 확인하면 이를 검증할 수 있습니다.
저는 세션 쿠키를 획득할 수 있었기 때문에 관리자 사용자로 이 모든 작업을 수행할 수 있었지만, 실제 동작하는 체인을 만들려면 관리자 사용자의 컨텍스트에서 JavaScript를 통해 이 작업을 실행해야 했습니다. 저는 몇 개의 fetch 요청을 사용하여 각각의 POST 요청을 수행하도록 스크립트를 작성했습니다. 첫 번째는 시스템 속성을 업데이트하고, 두 번째는 관리자 사용자의 '성(Last Name)' 필드를 업데이트했으며, 마지막은 악성 php 코드가 포함된 새로 생성된 로그 파일에 대해 GET 요청을 수행했습니다. 악성 php 코드는 제 머신에 대해 curl 요청을 수행하고, bash 리버스 셸을 내려받은 다음, 해당 curl 요청의 출력을 bash로 직접 파이프하여 코드를 실행합니다. 그런 다음 XSS 섹션에서 설명한 것과 동일한 방법을 사용하여 이 파일을 업로드하고 관리자 사용자로 새 링크를 다시 방문했습니다. bash 파일을 호스팅하는 웹 서버와 실행 중인 netcat 리스너를 통해 리버스 셸을 얻을 수 있었습니다.
Apache에서 AllowOveride All이 설정되어 있는지 확인하십시오. nginx에는 이 설정이 없으며 저는 nginx에서 테스트하지 않았습니다.
SuiteCRM의 최신 릴리스 또는 최소한 버전 7.11.17로 업데이트하십시오. 이것이 해당 수정 사항입니다. 커밋 1618af16eaa494c4551bac961e5ac8fc3d87ab8c
SuiteCRM은 보고 과정 내내 매우 협조적이었습니다. 그들은 패치된 RCE를 인정했습니다. XSS는 웹 서버 구성의 결과였기 때문에 취약점으로 인정하지 않았습니다. 그러나 그들은 이와 관련하여 문서를 업데이트할 것이라고 언급했습니다.
2020년 8월 6일 -> 두 이슈 모두 [email protected]에 보고됨
2020년 8월 7일 <- SuiteCRM이 보고서 수신을 확인하고 내부 보안 팀에 이슈를 전달함
2020년 8월 21일 -> 후속 조치를 위해 [email protected]에 연락함
2020년 8월 25일 <- SuiteCRM이 웹 서버 구성/XSS에 대해 회신함
2020년 8월 26일 -> AllowOveride All 제안이 XSS를 완화한다고 회신함
2020년 9월 16일 -> 후속 조치를 위해 [email protected]에 연락함
2020년 9월 17일 <- SuiteCRM이 해당 이슈를 부분적인 이슈로 확인하고 회신함
2020년 10월 29일 업데이트 릴리스
2020년 11월 3일 -> 공개 전에 추가로 필요한 것이 없는지 확인하기 위해 [email protected]에 연락함
2020년 11월 5일 <- SuiteCRM이 회신함
이제 우리는 이 이슈에 대한 패치를 공개했고 그것이 공개 도메인에 있으므로, 우리 관점에서는 블로그 게시물을 작성하는 데 문제가 없습니다.
2020년 11월 5일 -> 본인이 CVE 요청
2020년 11월 6일 <- CVE-2020-28328 발급됨
https://www.exploit-db.com/exploits/49001

그들은 협력하기 매우 쉬웠고, 저는 이 소프트웨어에서 취약점을 계속 찾고 보고할 계획입니다!