Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: planet-libre

Niveau :      
Résumé : tcpdump ssl ; ptrace ; ltrace

Vous attendez la suite de mon article sur ce qui passe par les oreilles d'un android ? Hé bien vous allez attendre encore un peu ...

Lorsque vous récupérez via tcpdump un flux SSL (au hasard du https), il est chiffré et c'est justement l'intérêt du SSL de vous empêcher de lire ce flux.

Mais si si vous maitrisez une des deux extrémités, il devrait être normal que vous puissiez lire ce flux. C'est pourquoi nous allons le faire.

Côté serveur

Dans le cas où vous maitrisez le côté serveur, il suffit d'ouvrir la trace tcpdump (sauvegardée avec l'option -s0 -w file) sous wireshark et de le configurer pour qu'il utilise la clé serveur pour déchiffrer le flux :comme ici et de choisir de suivre le flux ssl au lieu du flux TCP.

C'est simple et efficace.

Côté client

Maintenant si vous êtes côté client sans certificat client, vous êtes coincés. Et c'est là que j'ai une solution à vous proposer.

Il existe plusieurs moyen pour espionner vos processus, tout d'abord vous pouvez créer un wrapper autour de la lib SSL et utiliser LD_PRELOAD pour la charger avant le processus. C'est bien mais difficile à mettre en œuvre, surtout si le processus tourne déjà, je vous laisse explorer cette voie de votre côté.

La deuxième solution est d'utiliser ptrace pour espionner le processus. Techniquement complexe, cette méthode nous est grandement facilitée par l'outil ltrace.

Pour la suite je vais supposer que les services à espionner passent par openssl, mais rien ne vous empêche de faire la même chose avec gnutls.

Espionner un processus

C'est simple :

# vous le lancez directement : 
$  ltrace ma commande
# ou vous espionnez un processus qui tourne déjà 
$ ltrace -p pid

Ça vous montre le fonctionnement, mais c'est aussi illisible qu'un strace.

Espionner le SSL

Ajoutons quelques options pour trier ce fouillis :

$ ltrace -l /usr/lib/libssl.so.0.9.8 -s 20000 -e SSL_read,SSL_write

Et voilà, la liste des appels ! Mais ce n'est pas suffisant.

Ajoutons les lignes suivantes dans /etc/ltrace.conf (ou dans ~/.ltrace.conf) :

int SSL_read(addr,string[retval],int);
int SSL_write(addr,string[arg3],int);

On relance la commande et maintenant nous avons le contenu de la communication en clair.

Mais il y a un petit bug dans ltrace, string[retval] devrait couper les chaines de SSL_read en fonction de la valeur de retour, mails ne le fait pas.

Corrigeons cela avec un petit script de formatage et cette fois nous avons toute la communication en clair !

$ ltrace -l /usr/lib/libssl.so.0.9.8 -s 20000 -e SSL_read,SSL_write -p pid 2> /tmp/trace
$ perl -pe 's/(SSL_read.*?, ")(.*)(".*? )(\d+)$/$1.substr($2,0,$4).$3.$4/e' /tmp/trace | less

Niveau :      
Résumé : tcpdump, wireshark

Espionnage

Tout le monde le sait, les téléphones nous espionnent. Mais que communiquent-ils ? A qui communiquent-ils ? Que peut-on y faire ?

Aujourd'hui nous somme armés d'une vraie distribution GNU. Nous pouvons donc utiliser des vrais outils.

# on se connecte sur le téléphone
$ ./adb shell
# mettez votre debian dans ce $ROOT
$ chroot $ROOT
$ apt-get install tcpdump
$ nohup tcpdump -i any -s 0 -w /tmp/dump.`date +"%Y-%d-%m"` &

maintenant déconnectez-vous et laissez tourner toute la journée dans son coin après avoir vérifié qu'il reste de la place sur le disque.

Quelque temps plus tard; :

# sur le téléphone
$ chroot debian
$ pkill tcpdump
# sur le pc
$ ./adb get $ROOT/tmp/dump.*

Analyse

Maintenant revenons à notre poste et regardons ce qui s'est passé. Pour cela on utilise wireshark.

On ouvre le fichier dump et c'est parti :

  • on trie par protocole -> LARQ, DNS, ipv6, http, https, ...
  • on trie par adresse -> on a la liste de qui communique avec notre machine
  • on liste des requêtes dns -> on a les noms des précédents

Ce que j'ai découvert pour l'instant

LARQ (limited automatic repeat request) : protocole utilisé pour la retransmission rapide de frame en cas de perte sur la couche de liaison. Très pratique pour améliorer la qualité des transmissions. On ne trouve quasiment pas d'infos sur le net à ce sujet, à part un brevet.

IPv6 : il est activé par défaut chez moi, ouf

DNS : il semble qu'android utilise le resolver public de google (pratique pour ne pas être embêté par les limitations de l'opérateur et les problèmes de configuration).

Niveau :      
Résumé : debootstrap --foreign ; debian.apk

Android is Not GNU

Maintenant qu'on est root, on peut faire tout ce qu'on veut sur notre android. Mais il faut bien avouer que busybox est assez limitée pour les habitués des systèmes GNU que nous sommes.

C'est pourquoi nous allons mettre un système GNU complet sur notre android. Et de préférence sans influer sur la bonne marche du téléphone.

Pour cela, il faut laisser tourner l'android tel quel, et surtout garder son noyau. Mettre un 2e système sur un noyau qui tourne, on sait faire, dans sa version la plus simple ça s'appelle un chroot, c'est disponible de base et c'est exactement ce dont on a besoin.

Notez que les commandes indiquées ici se basent sur un shell et les commandes fournies par busybox telles qu'installée dans l'article précédent. Vous pouvez vous en passer, mais quelques adaptations seront nécessaires (par exemple -o bind à la place de --bind).

Comment qu'on fait ?

Comment créer un chroot sans se presser ?

Choisissons (au hasard) la distribution debian. Elle nous propose ... wait for it ... un créateur de chroot. Il s'appelle debootstrap.

Seul problème nous ne pouvons pas le lancer directement sur le téléphone. Il faut donc le lancer sur une autre machine. Et à moins d'avoir une machine arm sous le coude, nous ne serons pas sur la bonne architecture.

Heureusement debian est bien structuré et debootstrap a tout prévu. Nous allons le lancer 2 fois. La première fois sur notre machine habituelle :

$  debootstrap --foreign --arch armel wheezy mydebian 

Pour ceux qui n'ont pas debian, sachez qu'il est possible de télécharger et d'exécuter debootstrap sur n'importe quel autre linux.

Et pour ceux qui voudraient essayer une autre méthode, suivez ce lien : http://wiki.debian.org/EmDebian/Cro...


continue reading...

Niveau :      
Résumé : mv ; rm ; top

Maintenant que vous êtes passé root vous êtes impatient d'optimiser votre téléphone.

Plusieurs choses sont importantes à savoir :

  • une application ce n'est qu'un fichier .apk, ce qui veut dire que supprimer le fichier suffit pour supprimer l'application (mais pas ses données)
  • le firmware n'est rien d'autre qu'un système de fichier standard, donc rien ne vous empêche de le modifier
  • android distingue une carte sd "interne" du reste du système. Sur mob téléphone, il s'agit en pratique de la même mémoire flash découpée en partitions mais formatée avec différents systèmes de fichier

Lister et supprimer les application inutiles

Tout d'abord je vous conseille juiceplotter pour regarder quand et combien consomme votre téléphone.

Ensuite, puisque vous avez un shell, ne vous privez pas et utilisez la commande top lorsque la consommation vous parait importante ou que la machine rame (attention aux bizareries du top d'android, comme la charge)

Enfin je vous recommande de supprimer les applications du système qui ne vous servent pas mais qui semblent se réveiller fréquemment.

Voici comment faire (en root sur le téléphone) :

$ mkdir /sdcard/app-backup
$ mount -o remount,rw  /system # si vous n'utilisez pas busybpox, vous devrez passer tous les paramètres a mount
$ mv /system/app/<applicaiton>.apk /sdcard/app-backup
$ mount -o remount,ro  /system

Ainsi vous gardez l'application sous le coude si vous voulez revenir en arrière.

Sur mon optimus 2x

J'ai supprimé :

  • l'antivirus F-Secure (il consomme pas mal et je n'ai toujours pas vu de virus)
  • PCSync jamais besoin et il est actif le bougre
  • LGOnScreenPhone même chose
  • LGLauncher le home du téléphone, ne pas supprimer si vous n'en installez pas une autre avant
  • LGEmail je n'utilise pas, trop limité (K9-mail est très bien)
  • SNS : se connecte automatiquement a tous vos réseaux sociaux, mais aucun moyen de l'en empecher

Au passage j'ai installé ADW, très bonne home qui remplace celle par défaut, qui permet les thèmes, qui permet de faire des raccourcis vers des activités et qui permet de faire des groupes d'applications pour y accéder plus rapidement. Notez qu'il est possible d'avoir 2 home en même temps mais j'ai tout de même supprimé l'original. Petite touche finale, elle est sous licence libre ...

Et pour vous montrer ce que j'ai gagné, lorsque j'ai eu mon téléphone, il consommait entre 10 et 15% de batterie par nuit. Maintenant après ces suppressions (et après avoir désactivé la 3G) il consomme entre 3% et 4% par nuit !

Niveau :      
Résumé : /etc/inittab ; /etc/gdm.conf ; /etc/sshd.conf

Pour ceux qui voudraient essayer le parachutisme, je vous le conseille, c'est très fort ! Par contre ça vous empêche d'écrire des articles ...

Vous venez de faire un chroot et vous voulez pouvoir vous connecter dessus comme s'il s'agissait de votre machine locale ?
Pas de panique, c'est tout simple.

Pour cela nous allons regarder 3 méthodes différentes de connexion à votre chroot : le terminal local, ssh et l'environnement graphique. Mais avant tout préparons le chroot à ressembler à une distribution normale.

$ mount --bind /dev $CHROOT_BASE/dev
$ mount --bind /proc $CHROOT_BASE/proc
$ mount --bind /sys $CHROOT_BASE/sys

Terminal local

Pour se connecter en local à votre machine, vous utilisez les consoles disponibles (alt-Fx ou ctrl-alt-Fx si vous êtes en mode graphique). Vous en avez 6 à disposition.

Pour faire simple, nous allons juste faire en sorte que les consoles 4 à 6 redirigent dans le chroot tandis que les 1 à 3 resteront dédiées à la machine principale.

Il suffit de modifier /etc/inittab :

# /etc/inittab
1:2345:respawn:/sbin/getty tty1
2:2345:respawn:/sbin/getty tty2
3:2345:respawn:/sbin/getty tty3
4:2345:respawn:chroot <chroot_base> /sbin/getty tty4
5:2345:respawn:chroot </chroot_base><chroot_base> /sbin/getty tty5
6:2345:respawn:chroot </chroot_base><chroot_base> /sbin/getty tty6

Et là, soit vous redémarrez (bof on n'est pas sous windows) soit vous forcez init à relire sa configuration :


continue reading...

Niveau :      
Résumé : ditaa

Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir : ditaa.

Qu'est-ce que ça fait ?

C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs artist-mode mais de les transformer en un vrai png propre et beau.

Exemple : Je dessine ceci (par exemple avec asciio)

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |cRED {d}|   |cBLU   |    |cRED   |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

Cela devient automatiquement ceci :

Intégration

C'est tellement magique que je n'ai pas hésité et je l'ai intégré à mon site directement. En effet avant à chaque fois que je devais faire un diagramme il fallait que je sorte inkscape, que fasse attention à caler correctement les cases et les flèches et que je pense à sauvegarder l'image et l'uploader sur le serveur.

Maintenant j'intègre tout simplement le code dans le texte de mon article et ca marche !

Je n'ai pas trouvé de code qui faisait cela, je l'ai donc fait moi-même. Un peu rapidement il est vrai, il n'y a pas de gestion des différents cas d'erreur. Mais je vous laisse le code au cas où vous voudriez faire de même chez vous.

    function __macroDITAA($s)
    {
        $base=$_SERVER['DOCUMENT_ROOT']."/public/ditaa";
        $tmp="/tmp/ditaa";

        # first line of code is for ditaa parameters
        $p = strpos($s, "\n");
        $args = substr($s, 0, $p-2);
        $data = substr($s, $p+1 );

        # md5sum to generate a unique id
        $id = md5($data);

        # file test
        if(!file_exists("$base/$id.png")) {
            # create tmp
            $f = fopen("$tmp", "w");
            fwrite($f, $data);
            fclose($f);

            # call ditaa (beware of safe mode)
            system("ditaa $args $tmp > /dev/null");

            # move file
            rename("$tmp.png", "$base/$id.png");
        }

        return "<img src='/public/ditaa/$id.png'>";
    }

Puisque ditaa est malgré tout un peu lourd, on crée un identifiant d'image avec le md5 de la ligne de commande et le contenu. Et on ne fait l'appel qu'une fois (attention je n'ai pas de safe_mode ici), lorsque le fichier n'existe pas encore. Ensuite le serveur web l'utilise le fichier directement comme n'importe quel autre.

Sur mon site, j'ai une syntaxe dotclear2, j'ai donc dû enregistrer un nouveau mot clé pour la syntaxe ditaaa "///ditaa" :

# dans class.wiki2xhtml.php / class wiki2xhtml / function __construct()
$this->registerFunction('macro:ditaa','__macroDITAA');

A vous de faire de même pour la syntaxe wordpress !

Cloonix

Jan 18

Niveau :      
Résumé : ./start_cloonix_net ; ./graph

De temps en temps je vous fais un article sur le réseau, et je teste quasiment tous mes articles dans la vraie vie. Et là vous vous dites, mais c'est énorme ! Mais comment que fait-il ? A-t-il l'infrastructure ?

En fait non, enfin si mais non. Pour tester le réseau, j'utilise tout simplement cloonix.

Cloonix n'est pas une distribution, mais un outil permettant de gérer des machines virtuelles et de les mettre en réseau. Pratique, tout se fait graphiquement ou presque.

Installation

La version ubuntu ne marche pas sur ma debian, j'ai donc du utiliser les sources. Ça compile bien, il suffit d'appeler doitall dans le répertoire sources. Par contre faites attention, la version source ne contient pas de vm de démo.

Donc après compilation récupérez le répertoire virtual_platform_configs ainsi que le répertoire bulk du package ubuntu et déposez-les dans le répertoire de cloonix.

Le répertoire bulk contient les images disque de base des distribution à virtualiser.

Le répertoire virtual_platform_configs contient la définition des vm, les personnalisation spécifiques à chaque machine, ainsi que la façon dont les machines sont reliées.

Utilisation

./start_cloonix_net
./graph

Vous pouvez alors cliquer sur le bouton droit et charger une topologie. C'est à dire une infrastructure telle que stockée dans un des répertoires de virtual_platform_configs. Un fois que toutes les vm sont chargées vous obtenez ceci : Cloonix_IHM

Et c'est parti, vous avez plusieurs machines virtuelles préconfigurées directement utilisables. Pour ouvrir un shell sur une des machine, double cliquez dessus. Vous pouvez aussi en ajouter dynamiquement, relier deux cartes réseau ...

Lorsque vous avez fini tuez cloonix et ses vm :

./ctrl -kill

Détails

Très pratique, quasiment rien à faire, cloonix sait utiliser UML ou KVM au besoin.

Pour les tests réseau vous pouvez faire ce que vous voulez, pensez à enregistre votre topologie pour les tests fréquents.

Pensez aussi à modifier la distribution de base dans bulk pour ne plus avoir de modifications a porteriori à faire car tout le contenu d'une vm est perdu dès qu'elle s'éteint.

Enfin pour ceux qui font des tests avec les couches basses du réseau, il est nécessaire d'autoriser le passage des interface en mode promiscuous depuis cloonix avec une commande de la forme :

# le nom de la vm, ne nom de l'interface, 1 pour activer
./ctrl -promisc ROUTER3 eth0 1

La documentation est minimaliste, mais suffit pour s'en sortir.

PS : Si vous avez des idées d'article à me suggérer n'hésitez pas à utiliser la boite à idées.