Capture et analyse distante avec Wireshark

Wireshark est un outil sympathique, quand vient le moment d'analyser ce qui passe sur un réseau, qui fait quoi, quel protocole prend toute votre bande passante, etc. Malheureusement, la machine sur la quelle on voudrait faire l'analyse n'est pas toujours celle sur la quelle vous pouvez lancer le logiciel.
Il est possible facilement de capturer les paquets voulus sur une machine, et de les analyser à postériori sur une autre. Par contre, effectuer une analyse en direct et à distance nécessite d'utiliser quelques astuces.
Avant d'aller plus loin dans les explications, voici quelques pré-requis :

  • Vous devez installer Wireshark sur votre machine (A)
  • Vous devez aussi pouvoir vous connecter en root via SSH sur la machine que vous voulez utiliser pour la capture (B)

Dans un premier temps, il s'agit de créer un socket UNIX via mkfifo. C'est ce socket que votre Wireshark va lire en local sur la machine A.

mkfifo capture.fifo

Dans un deuxième temps, il faut ouvrir une connexion SSH de A vers B, lancer tcpdump dans cette connexion, et rediriger la sortie standard dans votre tout nouveau socket.

ssh root@machineB tcpdump -s 0 -U -n -w - -i ath0 >  capture.fifo

Remplacez ath0 par le nom de l'interface réseau qui vous intéresse, et éventuellement, ajoutez aux options de tcpdump les filtres adéquats pour affiner votre analyse.
Attention, pour une connexion avec mot de passe, ssh ne vous demandera le fameux sésame qu'au moment où Wireshark ouvrira le socket. C'est à dire à l'étape suivante.

Dans un troisième et dernier temps, vous pouvez lancer Wireshark sur la machine A si ce n'est déjà fait, et le configurer pour lire votre socket capture.fifo. Pour cela, ouvrez les options de capture, et saisissez le chemin de votre socket dans le champ "interface" :

Enfin, cliquez sur "Start" pour lancer la capture, et si nécessaire, tapez votre mot de passe pour la machine B dans la fenêtre de terminal où votre connexion SSH est établie.

Related posts

Valve se moque des utilisateurs Mac

le scout, (c) valveJe me suis réjoui il y a quelques temps de l'arrivée sur la plate-forme Apple des jeux de Valve (Half Life 2, Team Fortress 2, Portal). Je n'aurai peut être pas du baisser la garde de mon scepticisme.
Les jeux sus-mentionnés ont bien été portés sur Mac, je ne peux pas le nier. Néanmoins, je pense (et je ne suis pas le seul), qu'ils ont été portés n'importe comment. Suivant votre configuration matérielle les jeux sont plus ou moins jouables, des problèmes de lenteur (voire de blocage) surviennent presque systématiquement pour de nombreux joueurs. Des problèmes de son ou de vidéo sont aussi constatés. On parle bien de jeux datants de 2004 à 2007, tournants tout à fait normalement sur des PC de la même époque (Pentium 4 et 512 Mo à 1 Go de RAM). Il est totalement inconcevable et inadmissible que ces jeux ne tournent pas de manière fantastique sur des bi-xeon dual core avec 4 Go de RAM, ou sur des Core 2 duo avec 8 Go de RAM (pour ne citer que deux des Mac sur les quels nous avons testé ces jeux).
Notamment, les temps de chargement sont astronomiques. Que vous passiez d'un niveau à l'autre dans Portal, que vous tentiez de rejoindre une partie de Team Fortress 2, ou qu'Half Life 2 fasse une sauvegarde automatique, vous serez immanquablement confronté à un pénible et très injustifiable temps de chargement. Certains ont encore moins de chance, car ils subissent des lenteurs ou des saccades au cœur même de l'action, des problèmes de son qui saute ou devient haché ou encore des temps de chargement avoisinant les 5 minutes.

Valve : vous vous êtes bien foutu de notre gueule.

Related posts

glTail sur Mac

Dans la droite ligne de logstalgia, voici un autre logiciel tout à fait inutile pour visualiser des fichiers de log de manière totalement illisible : glTail. Ce dernier est néanmoins plus complet, car il fonctionne à partir d'un fichier de configuration et qu'il gère comme un grand la lecture des logs distant en temps réel via une ou plusieurs connexions ssh. Par ailleurs il comprend plusieurs formats de log : Apache, Rails, IIS, Postfix, PureFTPd, MySQL…

L'installation sous Mac OS X 10.6 n'est pas très compliquée. L'important étant de se passer d'un gestionnaire de ports/package qui aurait tôt fait de réinstaller tout Ruby, et surement plus encore.
Voici sommairement les manipulations à effectuer :

  1. Récupérer les sources de glTail sur le dépôt git, via un navigateur web. Cela se passe à l'adresse http://github.com/Fudge/gltail , en cliquant simplement sur Download Source en haut à droite, et en choisissant le format souhaité.
  2. Décompresser l'archive obtenue, via un simple double-click.
  3. Lancer le terminal et installer quelques dépendances :
    sudo gem install ruby-opengl file-tail -r
  4. Il est facultatif d'installer la librairie Chipmunk, mais franchement, ça ne coûte rien et le résultat est plus sympathique avec :
    cd /chemin/de/Fudge-gltail-xxxx/vendor/Chipmunk-4.1.0/ruby 
    ruby extconf.rb
    make
    sudo make install

Voilà, il suffit pour finir d'éditer l'exemple de fichier de configuration fourni (config.yaml) pour lui fournir les informations intéressantes. L'engin se lance ensuite via le terminal, sous cette forme :

/chemin/de/gl_tail /chemin/du/fichier/config.yaml
Related posts

Logstalgia sur Mac

Il y a quelques jours j'ai découvert avec plaisir que le très inutile et de facto indispensable logstalgia compile et fonctionne sur Mac OS X. Cela faisait un bon moment que j'attendais ça, passivement, car je suis tout sauf développeur.

logstalgia est une sorte de "pong", qui se base sur vos logs de connexions Apache pour créer une jolie animation. C'est bien plus joli qu'un économiseur d'écran "Matrix" tout en se prenant beaucoup moins au sérieux :

logstalgia en fonctionnement sur Mac OS X

Le plus simple pour installer logstalgia sur Mac est probablement d'utiliser MacPorts pour installer les dépendances. Si vous avez déjà utilisé MacPorts, vous avez sans doutes quelques dépendances déjà installées. Sinon, vous êtes bons pour installer 66 dépendances et dépendances de dépendances (ad lib). De ce point de vue, MacPorts est une plaie. Il vous installera même sa version de Perl, tout incapable qu'il est de s'appuyer sur les librairies et logiciels fourni de base par Apple.
Heureusement, ça se fait en une ligne de commande :

sudo port install libsdl ftgl libsdl_image pcre

Après ça, les dépendances sont installées. Vous pouvez télécharger le code source de logstalgia, le décompresser, et le compiler :

curl -O http://logstalgia.googlecode.com/files/logstalgia-1.0.0.tar.gz
gunzip logstalgia-1.0.0.tar.gz 
tar -xvf logstalgia-1.0.0.tar 
cd logstalgia-1.0.0
./configure 
make
sudo make install

man logstalgia pour la doc.
Enjoy !

Related posts

Créer un proxy personnalisé avec launchd (2/2)

Cet article est la suite de la première partie : "Créer un proxy personnalisé avec launchd (1/2)"

Coder votre proxy personnalisé.

C'est théoriquement l'étape du travail la plus intéressante, puisque c'est ici que l'on peut exprimer toute sa créativité, et surtout apporter la réponse à un de ses problèmes. Comme le programme sera lancé à la demande par launchd, et que c'est ce dernier qui va gérer le socket de communication avec le client, la tâche est simplifiée. En contrepartie, le programme ne peut pas être trop lourd, car des lancements à répétition seraient alors pénalisants pour le reste du système.
Mac OS X est livré avec de nombreux langages de script et de programmation (C, Java, PHP, Python, Ruby, Perl, Shell…). Contrairement à mon habitude, j'ai choisi de coder mon proxy en PHP. De la sorte, je pouvais réutiliser mon code dans un autre contexte au cas où le fonctionnement en proxy ne donnait pas satisfaction.
Voici le squelette de mon script PHP, à titre d'exemple :

#!/usr/bin/php
<?php
// get request from http client
$request = explode(" ", trim(fgets(STDIN)));
$MyGET = $request[1];
// curl request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $MyGET);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
// cleanup
curl_close($ch);   

// callback
function fetch_author($matches) {
    ../..
    return $matches[1].$matches[2].$author[1]." ".$matches[3];
}

// html parsing
$apresreplace = preg_replace_callback('/.../',"fetch_author",$output);

// output
echo $apresreplace;
?>

J'ai volontairement simplifié et tronqué mon code. La seule chose qui compte est le squelette du programme. Première remarque, le script fonctionne en mode "ligne de commande". C'est du PHP, mais il ne sera pas interprété par Apache, donc les variables intéressantes de $_SERVER, de $_GET, ... n'existent pas. Je récupère la requête du client HTTP en lisant tout simplement la première ligne de STDIN.
Ensuite, j'utilise les fonctions de la librairie CURL pour aspirer le contenu distant qui correspond à l'URL transmise par le client. Puis je fais sur ce contenu un rechercher-remplacer via la fonction preg_replace_callback et via la fonction attachée que j'ai créée (dite fonction de callback).
Les détails ne sont pas importants, à ce stade ce qu'il faut bien comprendre, c'est que mon script de proxy a reçu l'URL demandée par le client. Il a téléchargé le contenu correspondant à cette URL, et il l'a enrichi selon mes besoins. La dernière ligne du script renvoie dans la sortie standard le contenu enrichi. Le client (mon lecteur de flux RSS) reçoit alors la réponse à sa requête.

Lancer le proxy à la demande

Launchd est l'outil idéal pour lancer le proxy dès qu'une connexion est initiée dans sa direction. Le fonctionnement est alors similaire à inetd (ou xinetd). La problématique est la même que dans le cas de la création d'un tunnel ssh à la demande, donc je passe sur les détails.
Voici le fichier plist de configuration qu'il faut charger dans launchd pour activer le proxy :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Debug</key>
        <false/>
        <key>Label</key>
        <string>tld.monsuper.proxy</string>
        <key>ProgramArguments</key>
        <array>
                <string>/chemin/du/programme/de/proxy</string>
        </array>
        <key>Sockets</key>
        <dict>
                <key>Listeners</key>
                <dict>
                        <key>SockNodeName</key>
                        <string>127.0.0.1</string>
                        <key>SockServiceName</key>
                        <string>8080</string>
                        <key>SockType</key>
                        <string>stream</string>
                </dict>
        </dict>
        <key>StandardErrorPath</key>
        <string>/tmp/proxy.err</string>
        <key>inetdCompatibility</key>
        <dict>
                <key>Wait</key>
                <false/>
        </dict>
</dict>
</plist>

Après avoir adapté le Label, le chemin du programme, le port de connexion, et éventuellement le fichier de stderr, il faut enregistrer ce fichier plist dans ~/Library/LaunchDaemons/ (pour vous seul) ou dans /Library/LaunchDaemon/ (pour tous les utilisateurs de la machine). Ensuite il faut le charger via launchctl load /chemin/du/fichier.plist.

C'est terminé. Toutes les briques du proxy personnalisé sont en place. Le client (si il honore bien les préférences systèmes) utilisera le proxy désigné dans le fichier .PAC. Launchd recevra la requête et la transmettra au programme du proxy. Ce dernier fera les traitements sur les données téléchargées, et renverra le résultat au client.

edit : style et coquilles
edit : ajout de l'IP 127.0.0.1 pour le bind, ça évite que le proxy puisse êtes utilisé par n'importe qui sur le réseau… :)

Related posts

Créer un proxy personnalisé avec launchd (1/2)

Pourquoi un proxy personnalisé ?

De temps en temps, on aimerait modifier pour son confort personnel des flux de données que l'on ne maîtrise pas. Ces derniers jours par exemple, j'ai été confronté à un flux RSS qui ne contient pas toutes les données dont j'ai besoin. J'ai donc créé un proxy HTTP personnalisé pour enrichir le flux RSS et obtenir un résultat complètement satisfaisant.
On peut bien sûr appliquer le même principe à tout un tas de choses. Le gros avantage de l'opération, c'est que l'on est libre de coder avec le langage de son choix, sans se compliquer la vie : launchd prend en charge la partie "réseau local" et les préférences système s'occupent de publier les réglages de proxy auprès des clients. Il ne reste finalement à s'occuper que de la partie intéressante du code : la transformation des données reçues (ou envoyées).

Schema de l'architecture logique du proxy personnalisé

Vue d'ici, la partition peut sembler complexe à jouer : il faut faire communiquer un client avec un serveur au travers d'un proxy lancé à la demande par launchd, le tout en s'appuyant sur les préférences système de proxy. Il y a donc quelques pré-requis de base. Il faut que la version de Mac OS X supporte la configuration automatique de proxy (testé sur 10.5 et 10.6). Et il faut aussi que le client supporte l'utilisation des proxy définis dans les préférences système.

Configurer les préférences de proxy de Mac OS X.

Il s'agit de ne pas de faire passer tout le trafic au travers de notre script maison, mais seulement des requêtes bien particulières. On utilise pour cela les préférences de configuration automatique de proxy. La configuration automatique de proxy s'appuie sur un fichier en javascript, qui fournit les règles de proxy que l'on souhaite utiliser. Normalement ce fichier est distribué automatiquement via DHCP, ou mis à disposition sur le réseau via une URL standardisée. Ici, nous allons procéder à la main.
La première étape consiste à créer un fichier PAC contenant les règles souhaitées. C'est un simple fichier texte. Voici le contenu du fichier "proxy.pac" que j'ai créé pour répondre à mes besoins :

function FindProxyForURL(url, host) {
      if (shExpMatch(url, "*cfsl.net/forum*/feed.php*"))    {
         return "PROXY localhost:8080";
      } 
      // All other requests go directly to the WWW:
      return "DIRECT";

Le fichier décrit les règles suivantes :
- si l'URL que je demande contient *cfsl.net/forum*/feed.php*, alors utilise le proxy à l'adresse localhost:8080.
- dans tous les autres cas, n'utilise pas de proxy.

Vous trouverez d'autres exemples de fichiers PAC sur wikipedia et ailleurs.

La seconde étape est l'activation de ces règles dans les préférences système. Il faut pour cela ouvrir les préférences réseau, et entrer dans les paramètres avancés de l'interface réseau active. Sous l'onglet "Proxy", on retrouve une case à cocher correspondant au mécanisme de configuration automatique de proxy. Il faut cocher cette case, et désigner le chemin du fichier PAC créé à la première étape :

Et voilà, maintenant il ne reste plus qu'à créer le programme de proxy et son plist de lancement.
Lire la suite !

Related posts

Headshot !

Je suis presque abasourdi. En vérité il m'en faut un peu plus, mais tout de même. On assiste maintenant à une annonce comme le monde Mac n'en n'a pas connu depuis dix ans. Valve porte sur Mac les jeux développés pour PC et Xbox :

Steam and Valve's library of games including Left 4 Dead 2, Team Fortress 2, Counter-Strike, Portal, and the Half-Life series will be available in April.

C'est une fantastique nouvelle pour tous les utilisateurs Mac (joueurs ou non). Personnellement j'attendais Half Life depuis sa sortie sur PC fin 1998… Ça met une bonne claque dans la tronche de Bungie (traitres), MacSoft (faineants), et autres Epic (gardez-le votre UT3).

Related posts

Cherche admin sys désespérément

On prend les même et on recommence : je recherche 2 administrateurs système 80% Mac OS X Server / 20% Linux, pour venir renforcer l'équipe dans la quelle je suis seul... Ça fait rire, présenté comme ça, mais il y a du boulot pour 3 ou 4, et je suis vraiment tout seul.

Profil : plutôt licence Pro ou autre bac+3. Pas de réseau ni de Windows, merci.
Poste : contractuel de la fonction publique, grade d'Ingénieur d'Étude.
À pourvoir : hier.

Si vous n'êtes pas Bac+3, mais que vous connaissez Mac OS X Server : POSTULEZ !
Si vous n'avez pas de compte sur Monster, envoyez CV et lettre de motivation au format PDF ou RTF à recrutement-sentier@univ-lyon2.fr.

Dans la foulée, on cherche aussi un développeur Web avec une forte sensibilité JAVA, capable d'administrer des serveurs d'applications (Tomcat et tout et tout).

Les détails sont sur Monster.fr.

Related posts