Brida: Advanced Mobile Application Penetration Testing with Frida

Watch on YouTUbe

NIN: 讲座是意大利文, 基本上是读 PPT,无 Demo, 可忽略.

Slide: PDF (Mirror)

分析 traffic时的各种难度系数:

  • Level 1:
    • 完全没加密. 此时连 certificate 也不用安装
  • Level 2:
    • HTTPs. 安装 Burp certificate
  • Level 3:
    • SSL + Certitifcate Pinning. 此时需要 SSL KillSwitch 2等的帮助
  • Level 4:
    • SSL + Certitifcate Pinning + POST data被AES加密. 此时需要知道加密的 Key
  • Level 5:
    • SSL + Certitifcate Pinning + POST data被AES加密 + AES Key 被 RSA 加密. 此时需要知道 RSA 加密时用的 public_key
  • Level 6:
    • SSL + Certitifcate Pinning + POST data被AES加密 + AES Key 被 RSA 加密 + RSA加密的 Key 每一个 request 都不一样. 此时就悲剧了.

没有frida 之前, 需要做一系列的 RE 工作. 但是现在有了 Frida, 我们可以直接调用 App 的方法, 让它帮我们加密解密, 期间我们根本不需要理会它是用什么加密, key 是怎么构造.

Example - Signal

下载Brida_01.jar

The core of Brida, the application that creates the bridge to communicate with Frida and offers Brida service

  • Burp - Extender - Extensions - Add - Brida_01.jar

写 Plugin

对的, 你需要自己写一个 burp plugin, 可以使用 Java 或者 Python, 相较而言 Python 更简单. 可参考作者的 example.

  • Burp - Extender - Extensions - Add - BurpBridaSignalTestApp.py

Frida.js

Brida, AppPlugin都准备好了, 但是还不够. 我们还需要自行写一个 frida.js.可参考作者的 example

	if "destinationRegistrationId" in bodyString:
    jsonBody = json.loads(bodyString)

    uri = 'PYRO:BridaServicePyro@localhost:9999'
    pp = Pyro4.Proxy(uri)
    args = []
    args.append("pwned")
    newMessage = pp.callexportfunction('changemessage',args)
    pp._pyroRelease()

    m = re.search(".*content = \"(.*?)\".*", newMessage)
    if m:
        newMessage = m.group(1)
        jsonBody["messages"][0]["content"] = newMessage
        newBodyString = json.dumps(jsonBody)
        newBodyString = newBodyString.replace("/", "\\/")

        newRequest = self.helpers.buildHttpMessage(headers, self.helpers.stringToBytes(newBodyString))

        messageInfo.setRequest(newRequest)
	

留意第七行 - args.append("pwned"). 就是在这一行传入我们要的 Payload.

第八行 - newMessage = pp.callexportfunction('changemessage',args), 就会 call frida.js 中的changemessage function, 对其加密后,再返回给 Burp.

changemessage 则被定义在 frida.js 中, 借助 frida 的 rpc object expose 出来.

rpc.exports = {
	
	// Function that generate a new Signal encrypted message.
	// Input: message -> the message to encrypt
	// Output: the encrypted message
	changemessage: function(message) {
	
		var env = ObjC.classes.Environment.getCurrent();
		
		var messageSender = env.messageSender();
		var signalRecipient = ObjC.classes.SignalRecipient.alloc().initWithTextSecureIdentifier_relay_(destNum,null);
		var contactThread = ObjC.classes.TSContactThread.alloc().initWithContactId_(destNum);
	
		var mex = ObjC.classes.TSOutgoingMessage.alloc().initWithTimestamp_inThread_messageBody_(Math.round(+new Date()/1000),null,message);
		
		var retVal = messageSender.deviceMessages_forRecipient_inThread_(mex,signalRecipient,contactThread);				
	
		var retValMessage = retVal.objectAtIndex_(0);

		return retValMessage.toString();

	}

Ref

Brida: Advanced Mobile Application Penetration Testing with Frida | @Mediaservice.net Technical Blog

Show Comments