Automne's Shadow.

BSidesSF CTF 2017 FlagStore WriteUp

2019/03/05 Share

Android

使用JEB分析flagstore.apk
MainActivity

1534953920322

注册了广播接收器,用于处理action为"com.flagstore.ctf.INCOMING_INTENT"的广播,但是这个广播设置了权限,接着到manifest清单文件里查看这个权限,可见是Signature权限,普通应用无权发送该广播(但是root权限可以)。

1534953920322

然后跟到Send_to_Activity这个BroadcastReceiver里,虽然清单文件注册了这个activity(未导出),但是使用root权限发送:

am start -n com.flagstore.ctf.flagstore/.Send_to_Activity

应用会崩溃。
看看这个类里的代码,典型的广播接收器,msg extra数据为OpenSesame时会打开CTFReceiver

1534953920322

跟到CTFReceiver的代码

1534953920322

定义了一个Button,点击之后会发送一个action为"com.flagstore.ctf.OUTGOING_INTENT"的广播,并且携带的extra数据使用getPhase()从Native层获取数据。
既然extra附带数据,那么就可以在应用里注册一个广播接收器用于接收数据。

现在我们开始构造攻击链。
1.安装并打开应用

2.在root的Nexus 6P上发送指定广播(使用su获取root权限):

am broadcast -a "com.flagstore.ctf.INCOMING_INTENT" --es msg "OpenSesame"

此时将会进入CTFReceiver的界面

1534953920322

3.然后在Android Studio里编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter v0 = new IntentFilter();
v0.addAction("com.flagstore.ctf.OUTGOING_INTENT");
this.registerReceiver(new leonReceiver(), v0);
}

public class leonReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
String ret = intent.getStringExtra("msg");
Log.i("Leon",ret);
}
}
}

安装该应用

4.然后到flagstore.apk里点击Button

此时日志将会打印出flag,第一次打印出来的有部分乱码,多点几次Button即可

1534953920322

CATALOG