Posts

Emergency Inbound Calls With Android

Calls from my significant other can range from “Just wanted to tell that I love you” (ain’t she sweet) to “THE CAR DOSEN’T START WHAT DO I DO!?!“.

I’m worried about missing a phone call from her. It could be an emergency. I could be in a meeting. My phone could be on mute. I could not be in the vicinity of my phone.

We agreed on the following: “If you call me twice in a row, I will always pickup your second call.” However, this assumes that I even hear the first call, which might not be the case depending on the above.

Solution

The awesome Tasker app is widely regarded as the best tool to automate such scenarios on Android devices. I used it to create the following project:

  • You can select multiple “VIP numbers”. Those VIPs will be allowed to trigger the emergency ring.
  • If a VIP calls twice in a certain amount of time (60 seconds by default) after the first call is missed, the phone will ring a different sound at maximum volume regardless of its silent state.
  • If you miss the second call, the phone will continue ringing until you call back or dismiss the emergency.

Here is exactly what it does:

Requires a flowchart to understand what it does.

Installation

  1. Download emergency-ring.mp3 (or rename your own) and put it in your root directory. I like this one because of its screeching sound.
  2. Download VIP.prj.xml on your phone and import it in Tasker
  3. Change the variables to your liking:
    • %TIMEWINDOW: the amount of seconds to listen for a second call (I suggest 60 seconds)
    • %VIP: Phone numbers of the people that are allowed to trigger the emergency ring (separate with “/”)

Conclusion

This is what I love about Android. There’s always a way to tailor it and make it yours. 

Moreover, it’s on Github so fell free to fork this gist. This will hopefully be of use for some of you.

Comments and pull requests welcome.

Si vous tenez un concours sur le web sans rien valider…

Contexte: Je suis finaliste pour le semi-concours Musique Plus “Geek Recherché” où le public est invité à influencer les juges en votant pour leur geek préféré.

Projet: Automatiser des votes, parce que je me dis que ça serait amusant et que c’est une façon comme une autre de prouver le geekness.

Analyse

2013-10-22 09-54-23On commence par vérifier quels appels JavaScript sont faits au moment où on clique sur le bouton pour voter à l’aide des “Developpers Tools” de Google Chrome (F12). On identifie alors 3 URL:

  • Gigya, un tiers parti qui fait de l’intégration sociale et qui expose un API bien documenté
  • M+ Backend, qui nous indique par le nom de la méthode qu’on a affaire à Atex Web CMS. L’étude de cas qu’ils ont réalisée pour Astral est une bonne lecture.
  • M+ Vote qui est juste un .php*

En faisant la même requête une deuxième fois, on remarque que certains paramètres changent d’une session à l’autre. Cela pourrait poser problème puisqu’il faut idéalement être capable de recréer la requête au complet.

Dans notre cas, on parle des paramètres “callback” et “_” des appels vers M+. Parce qu’on est vraiment geek et qu’on sait ces choses-là, on peut tout de suite ignorer callback parce que c’est un appel de retour pour jQuery. “_”, quant à lui, est en fait l’heure Unix (ou le epoch time) actuelle.

*Quand on a codé le jeudi 17 octobre, il n’y avait que deux appels. Je me suis rendu compte qu’ils avaient ajouté un troisième appel vers vote.musiqueplus.com en écrivant ce billet.

Solution 1

blobbChristof Graf a été le premier à arriver à une solution. Il a créé un petit programme en C# qui automatise les appels aux URLs en faisant varier la durée entre chaque appel. Il dirige alors son trafic vers le réseau TOR, qui anonymise le trafic et change d’adresse IP toutes les 10 minutes.  Cela a pour effet que M+ voit que les votes générés viennent d’adresses IP différentes et peut plus difficilement éliminer ces votes.

Défense: Retirer les votes où les IPs correspondent avec des TOR exit node.

Solution 2

J’ai moi-même écrit quelque chose de semblable en Python. Ma méthode utilise une liste de proxy et vote une fois pour chaque proxy.

Défense: Retirer les votes où les IPs correspondent avec des serveurs proxy ou juste retirer tous les IPs ne venant pas du Canada (je ne suis pas si populaire que ça en Chine).

Solution 3

mctraffic_code2SynneR y est allé un peu plus méchant, en utilisant une plateforme de publicité en ligne qui permet d’y insérer son propre html, McTraffics. Mais même si seuls les tags <img> et <a> sont permis, on peut quand même faire des appels vers des ressources JavaScript si les paramètres ne changent pas.

La méthode de SynneR a l’avantage d’utiliser des vraies machines avec des vrais IPs venant du Québec (et non pas des IPs potentiellement listés comme louche parce qu’on y trouve des web proxy ou des TOR exit node, contrairement à Chris et moi).

Défense: Ajouter un jeton anti-CSRF aux requêtes.

Dans tous les cas, nous n’avons pas pris la peine de modifier le paramètre “_” pour changer l’heure de nos votes. Alors assumant que M+ enregistre tous les paramètres lors du vote, tous les votes qui ont 1382063817115 ou 1382063676307 comme date/heure (au millième de seconde près) ne sont pas légitimes.

Conclusion

Ça nous semblait une belle opportunité de montrer que nous sommes geek. Ça n’est pas méchant: j’en parle, je documente, le vote des autres n’a pas été trafiqué et nous n’avons pas causés d’attaques de déni de service. Juste un petit projet entre chums un jeudi soir: rien de bien grave, quoi.

On en profite pour sensibiliser les gens au sujet des risques associés à exécuter un tel évènement sur Internet. Les futurs concours organisés par Musique Plus n’en seront que plus représentatifs. Au cours des prochains jours, je travaillerai avec M+ pour mitiger ce type “d’attaque” à l’avenir. Le code source des trois méthodes sera éventuellement rendu disponible.

À suivre…

Mises à jour

Comment je me sens comparé à mes collègues qui font carrière en sécurité

Comment je me sens comparé à mes collègues qui font carrière en sécurité

2013-10-24 13:05
J’ai envoyé un courriel au service de l’auditoire de Musique Plus pour leur demander si ils étaient intéressés à jaser pour mitiger un peu ce qu’on a fait avant que je libère le code. Je mentionne la politique de Rain Forest Puppy.

2013-10-24 14:07
“Votre message a été transféré aux personnes concernées.”

2013-10-31 17:00
Le “mainteneur” chez M+ ne m’a toujours pas contacté. Le code source qui a rendu ce billet possible est maintenant disponible.

Transfer files from iCab Mobile to your PC with Powershell

I’m a big fan of iCab Mobile that I use everyday on my iPad as a Safari replacement. Among other awesome features, this browser has the best HTML5 video downloading I’ve seen.

Unfortunately, the device’s 16 GB fills up quickly and I have to transfer the files some place else quite often.

While I could use something like DownThemAll for Firefox to download the files to my PC, I’d much rather be able to automate the process with a script. This looked like a great opportunity to sharpen my Powershell skills.

[powershell]
<#
.SYNOPSIS
Downloads all the files from a iCab Mobile server
.DESCRIPTION
Connects to a iDevice with iCab Mobile running a Import/Export server and downloads all the files to the specified destination
.NOTES
If the file already exists, it will be skipped.
Files are not deleted on the device once downloaded
.LINK
http://spacebar.ca/?p=3153
.EXAMPLE
.Get-ICabMobileFiles.ps1 192.168.0.101
.EXAMPLE
.Get-ICabMobileFiles.ps1 192.168.0.101:8080 C:UserssimonDesktopicab
.PARAMETER server
The ip address and port of the iCab Mobile server. Default port is 8080
.PARAMETER destination
The local destination folder on your computer, without trailing slash. Will use current folder if none is specified
#>

param (
[Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
[string] $url=’10.42.13.104′,
[Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$false)]
[string] $destination=(Get-Location -PSProvider FileSystem).ProviderPath
)

Import-Module BitsTransfer
$web = New-Object System.Net.WebClient
if (-not ($url -contains ‘:’)) {
$url = ‘{0}:8080’ -f $url
}
$html = $web.DownloadString(‘http://{0}/Download.html’ -f $url)
$regex = [regex] ‘(?i)&lt;a href=”([^”]*)”&gt;([^&lt;]*)’
$matchdetails = $regex.Match($html)

while ($matchdetails.Success) {
$source = ‘http://{0}/{1}’ -f $url, $matchdetails.Groups[1].Value
$dest = ‘{0}{1}’ -f $destination, $matchdetails.Groups[2].Value
Write-Host (‘Downloading {0}… ‘ -f $matchdetails.Groups[1].Value) -NoNewline
if (-not(Test-Path $dest)) {
Start-BitsTransfer -Source $source -Destination $dest -Prio Foreground
Write-Host ‘Done’
} else {
Write-Host ‘Already downloaded’
}
$matchdetails = $matchdetails.NextMatch()
}[/powershell]

I’m aware that this probably isn’t the best way to do it (I’m looking at you, regex!) but I’m fairly new to Powershell so if you have any comments, please share 🙂