Categories
Network Programming

Un export Gephi pour IP-Link

IP-Link_Gephi

Et voilà, un petit export Gephi pour IP-Link.

Je trouve Gephi vraiment super, il est capable de faire de nombreux filtres sur les graphes, de trouver le plus court chemin et de générer des timelines (ça va être utile pour IP-Link).

Categories
Network

Haka

Haka est un langage permettant d’analyser les paquets réseau (donc couche 3 du modèle OSI) basé sur Lua. Il est possible de l’utiliser pour ce que vous faisiez déjà avec Scapy.

Pour faire bref, voici un exemple assez simple provenant du site de Haka:

------------------------------------
-- Loading dissectors
------------------------------------
 
-- Load the ipv4 dissector to filter on IPV4 fields
local ipv4 = require('protocol/ipv4')
 
------------------------------------
-- Detects packets originating from 192.168.10.10
--   * Log an alert
--   * Drop the packet
------------------------------------
haka.rule{
  -- This rule is applied on each IP incoming packet
  hooks = { 'ipv4-up' },
  eval = function (self, pkt)
    -- Parse the IP address and assign it to a variable
    local bad_ip = ipv4.addr('192.168.10.10')
    if pkt.src == bad_ip then
      -- Log an alert
      haka.alert{
        description = string.format("Filtering IP %s", bad_ip),
        severity = 'low'
      }
      -- and drop the packet
      pkt:drop()
    end
    -- All other packets will be accepted
  end
}

Le principe est simple. Dans notre exemple nous avons une règle définie par:

  • un événement. Un hook, ici l’événement «paquet IP entrant»;
  • une fonction appelée lorsque l’événement est réalisé.

Ici lorsque la source du paquet est “192.168.10.10” le paquet est rejeté (pkt:drop()) et un message est envoyé dans les logs.

Il est possible de faire des choses bien plus intéressantes, comme modifier les paquets entrants et/ou sortants, modifier les headers HTTP, etc.

Encore un outil sympa et puissant pour analyser les paquets réseau. Finalement, je préfère même ça à iptables ou nftables.

Categories
Network Programming Python

pyClique

pyClique

Comme si j’avais trop de temps libre. Voici un nouveau projet: pyClique. Un peu proof of concept.

L’objectif sera de générer des graphes très simples et faire quelques opérations dessus (pas uniquement de trouver des cliques 😉 ). La structure de données se base sur cet essai. Des opérations très basiques sont déjà possibles: afficher un graphe en liste d’adjacence, en matrice, XML et charger un graphe à partir d’un fichier XML. Également quelques opérations pour trouver un chemin avec le poids le plus faible. Cerise sur le gâteau: affichage 3D du graphe.

Mais là n’est pas la finalité. Le but va être d’utiliser cette structure (basée sur les dictionnaires) afin d’instancier des agents SPADE (les noeuds que l’on peut voir sur la vue 3D ci-dessus) qui pourront communiquer sur un réseau d’hôtes en sélectionnant la meilleure route avec l’algorithme de Dijkstra (pour commencer).
Deux noeuds seront connectés de manière directe (de préférence) ou indirecte (via proxy, serveur intermédiaire, etc.). Le poids associé à une arête pourra représenter la qualité de la connexion (type de connection, charge actuel de l’hôte, majoration du coût du à la présence d’intermédiares, etc.). Dans l’exemple ci-dessus si les noeuds sont les agents, pour communiquer avec G le message de F passera donc par A, C et B.

Voici donc l’idée générale (c’est-à-dire avant que d’autres idées viennent tout chambouler) du projet. Cela ne devrait pas prendre beaucoup de temps à implémenter avec la base existante. Il s’agira essentiellement d’écrire une classe noeud implémentant un agent SPADE avec quelques caractéristiques pour fixer le poids entre deux agents.

Un petit projet sympa qui pourra devenir intéressant avec de la chance.

Categories
Network

Récupérer facilement les données d’une capture réseau

Suite à une discussion sur le forum de l’AFPY j’ai voulu écrire un petit script dont le but est de reconstruire les données d’une capture réseau. J’ai premièrement pensé à utiliser IP-Link. Cependant avec cette fonction d’IP-Link (par exemple) il faudrait réassembler les datagrammes dans l’ordre, extraire les données (uniquement la partie data du dictionnaire) et enfin les concaténer pour obtenir le fichier.

Bref, ça peut faire perdre du temps un dimanche matin. Surtout que y a piscine.

J’ai donc utilisé tcpflow ainsi q’un script vraiment bête. Voilà:

# On lance une capture réseau sur un shell
$ sudo tcpdump -i eth0 -s 0 -w dump.cap port 80

# Sur un autre on télécharge un PDF
$ wget www.python.org/doc/essays/ppt/lwnyc2002/intro22.pdf

$ tcpflow -r dump.cap

$ ls -l *192*
-rw-rw-r-- 1 cedric cedric 1667904 2012-01-08 09:53 082.094.164.162.00080-192.168.001.013.36033
-rw-rw-r-- 1 cedric cedric     148 2012-01-08 09:53 192.168.001.013.36033-082.094.164.162.00080 

Le super script (reconstruct-data.py) qui va simplement regarder le type du fichier et garder le contenu du fichier téléchargé:

with open("082.094.164.162.00080-192.168.001.013.36033" , "rb") as flow:
    data = flow.readlines()

i = 0
for line in data:
    i += 1
    if "Content-Type" in line:
        file_type = line.split("/")[1]

        with open("result."+file_type, "w") as result:
            result.write("".join(data[i+1:]))
            exit()

C’est moche.

$ reconstruct-data.py

$ sha1sum result.pdf intro22.pdf 
20547681871702179773a4291d94960bdcfdb040  result.pdf
20547681871702179773a4291d94960bdcfdb040  intro22.pdf 

Mais ça fonctionne!

Categories
Network Security

IP-Link en action

Que fait donc la majeure partie des personnes en conférence? Ils écoutent attentivement? Vérifient leur compte? Partagent sur Facebook? Jabber? (captures prises sur quelques minutes dans une salle avec pas tant de monde).

J’aime bien ce graphe mais il faut un (très) grand écran pour bien le voir.

Categories
Network Python Technology

GPS, Android & Python

Au lieu de récupérer les données GPS d’Android en temps réel via bluetooth en utilisant un freeware du market pourquoi ne pas directement demander au téléphone? Et cela avec Python.

import android, time
droid = android.Android()

droid.startLocating()
time.sleep(10)

while True:
    l = droid.readLocation().result

    # provider = network or GPS
    latitude = l['network']['latitude']
    longitude = l['network']['longitude']

    print latitude, longitude

    time.sleep(10)

Ce script est totalement fonctionnel. On pourrait afficher encore pleins d’autres informations, comme l’altitude ou la vitesse. On voit qu’il faut d’abord vérifier le provider, c’est-à-dire si les informations proviennent du GPS ou du réseau. Pour certaines applications demandant moins de précision, pour aller plus vite on peut utiliser la méthode android.getlastknownlocation(), par exemple pour récupérer la météo à partir des coordonnées avec le module weather.

Cela me donne une idée de mini projet. J’écrirai bien quelques mini serveurs (en C, Perl et Python) ainsi qu’un petit client comme celui-ci en Python. Le serveur avec une clé publique, le client une clé privée. Et vous me voyez venir. En plus ça fonctionnerai très bien avec mon hébergement actuel ;-). Et plus besoin de Google Latitude.

Categories
Network Security

Une monnaie pour les dons

Peut-être ne connaissez vous pas encore Bitcoin. Ce n’est pas une monnaie pour les dons, mais je vais utiliser Bitcoin pour cela (en plus des dons que je fais avec de l’argent “classique”). Il s’agit d’une monnaie décentralisée créée en 2009 par Satoshi Nakamoto. Il n’y a donc pas d’autorité centrale (c’est du Peer-to-peer) comme avec le système bancaire classique.

Le client Bitcoin est vraiment très simple à utiliser. Sous GNU/Linux il suffit de télécharger une archive, de la décompresser et de lancer un exécutable. Vous vous verrez automatiquement attribuer une adresse qui servira à recevoir des coins. Ni besoin de s’inscrire, ni besoin de donner votre nom (vous n’avez nul besoin de le fournir).

C’est aussi un système sécurisé utilisant la cryptographie asymétrique (Elliptic curve cryptography). Lorsque vous envoyez un coin à votre ami Cédric, le coin est signé avec votre clé privée après y avoir ajouté sa clé publique. Ainsi toutes les transactions sont publiques, anonymes et validées par le nœuds du réseau.
Vous avez aussi la possibilité de rester anonyme en créant une nouvelle adresse de réception pour chaque transfert. Vous pouvez aussi donner une adresse de réception différente à chaque personnes pour savoir de qui viennent les coins.
Vous trouverez plus d’informations techniques intéressantes sur le Wiki de Bitcoin. C’est très intéressant.

Mon adresse est sur cette page. Ce n’est pas un appel à dons. J’en ai déjà un petit peu. Toutefois si vous êtes d’humeur généreuse 😉