几周前我对某个手机银行使用进行测验。这个app用了一个结构,这个结构能够混杂、加密app与服务器进行的TLS衔接。我用Frida截获了加密环节之前的明文恳求/呼应。我期望能够修正截获的API调用,然后看看长途服务器是怎么呼应的,但这样的话我每次都得修正Frida脚本。
Burp是用来进行web测验的东西,而关于移动使用的测验应该也大致相同。我想要让burp跟frida合作起来,截获/修正burp中的API调用。虽然我没做Burp的插件,可是用一个小脚本咱们就能够截获API调用了,这省去了修正脚本中API参数的很多时刻。
截获API恳求并不费事:
1. 树立Burp监听端口(如26080端口)将流量转发到回显服务器(如27080端口)
2. 回显服务器在27080端口监听
3. 用Frida同步发送HTTP恳求到Burp监听端口
Burp就会接纳到Frida发送的API恳求。咱们就能够修正Burp中收到的调用,然后把数据转发到回显服务器。回显服务器会将修正恳求后收到的呼应发还给Frida。
设置Burp监听端口
咱们先开端设置Burp的监听端口。我已经在藏匿署理形式中启用了26080作为监听端口:
Python tracer代码
我挑选对已有的frida-trace代码进行修正和拓宽,让其具有trace东西那样的灵活性。
以下的这段Python代码能够让frida-trace代码与你转发API调用的服务器合作。它能够将HTTP恳求发送到咱们本地的Burp监听端口。你也能够在HTTP头部参加API调用的米数据,或许参加URL途径加以区别。
现在的代码或许依靠版别号,我不知道未来的版别会不会有改变,至少现在它能兼容Frida 8.2.2。
from frida import tracer
import requests
BURP_HOST = "localhost"
BURP_PORT = 26080
def frida_process_message(self, message, data, ui):
handled = False
if message['type'] == 'input':
handled = True
elif message['type'] == 'send':
stanza = message['payload']
if stanza['from'] == '/http':
req = requests.request('FRIDA', 'http://%s:%d/' % (BURP_HOST, BURP_PORT), headers={'content-type':'text/plain'}, data=stanza['payload'])
self._script.post({ 'type': 'input', 'payload': req.content })
handled = True
if not handled:
self.__process_message(message, data, ui)
tracer.Tracer.__process_message = tracer.Tracer._process_message
tracer.Tracer._process_message = frida_process_message
if __name__ == '__main__':
print("[x] To intercept in Burp, set up an invisible proxy listening on port %d, forwarding to the echo server." % BURP_PORT)
tracer.main()
Trace handler脚本
下面的脚本能够用来截获onLeave 函数中的read()调用。你能够依据自己需求修正。咱们只需要转发/截取你想要修正的那些参数。
我经过Frida的send() API完成了功用。这个调用被Python脚本接纳,然后发送到handler脚本,然后当咱们在BurpSuite中修正恳求时,脚本会等候呼应,然后履行回调函数。
{
onEnter: function (log, args, state) {
log("read(" + "fd=" + args[0]+ ", buf=" + args[1]+ ", count=" + args[2] + ")");
state.buf = args[1]
},
onLeave: function (log, retval, state) {
send({from: '/http', payload: Memory.readUtf8String(state.buf)})
var op = recv('input', function(value) { // callback function
log("Forwarding mitm'ed content: " + value.payload)
Memory.writeUtf8String(state.buf, value.payload)
});
op.wait();
}
}
回显服务器
以下脚本完成的功用是对Frida宣布的恳求做出呼应,会先request payload。你也能够依据自己的需求进行修正。
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from optparse import OptionParser
ECHO_PORT = 27080
class RequestHandler(BaseHTTPRequestHandler):
def do_FRIDA(self):
request_path = self.path
request_headers = self.headers
content_length = request_headers.getheaders('content-length')
length = int(content_length[0]) if content_length else 0
self.send_response(200)
[1] [2] 黑客接单网