Archive | Clic

RESTful API for the dummies

An Application Program Interface aka API is code that allows two software programs to communicate with each another. The API spells out the proper way for a developer to write some code requesting services from an operating system or other applications. In a web context, APIs allow communication between two webapps (or a web app and a client that is not always a brose) without any browser.

A RESTful API, also referred to as a RESTful web service, is an Application Program Interface that uses HTTP requests to GET, PUT, POST and DELETE data.

A RESTful API  is based on REpresentational State Transfer (REST) technology, an architectural style and approach to communications often used in web services development.

REST technology is generally preferred to the more robust Simple Object Access Protocol (SOAP) technology because REST leverages less bandwidth, making it more suitable for internet usage.

The REST used by browsers can be thought of as the language of the internet. With cloud use on the rise, APIs are emerging to expose web services. REST is a logical choice for building APIs that allow users to connect and interact with cloud services. RESTful APIs are used by such sites as Amazon, Google, LinkedIn and Twitter.

 

 

A la base, j’aimais bien cet article pour une partie de son contenu mais pas pour le plan de construction et comme j’avais besoin d’expliquer pourquoi certaines API ne respectaient pas les concepts REST, j’ai eu besoin de ré-écrire cette introduction.

Posted in Boulot, Clic, Trop sérieuxCommentaires fermés sur RESTful API for the dummies

Cyber Range

Ecoute attentive ce jour du dernier podcast hebdomadaire de « No Limit Secu » consacré au(x) Cyber Range(s)

Parmi les invités on retrouve :

Diateam

Diateam

Sysdream

Sysdream

Cyber Test System

Cyber Test System

Ces trois spécialistes sont interrogés par les animateurs habituels Hervé Schauer, Nicolas Ruff et Johan Uloa.

Définition officielle du cyber range ?

3′ : Juste une infrastructure ?

GP : c’est pas nouveau … Très variable selon les moyens que l’on veut y mettre : copie d’un système réel dans lequel on vient s’entraîner. Champ de tir numérique ?

Histoire : 2008, idée de faire tests d’un système complet (National Cyber Range de la DARPA) au delà du simple tests « unitaires » d’équipements.

7′ : HS : les Arc-en-Ciel Team ?

AK : Au départ seulement attaque-défense entre 2 équipes (Red vs Blue) puis d’autres acteurs ont rejoint l’environnement.

Read Team : équipe d’attaquants. Soit ils ont leurs propres outils soient ils activent des générations automatiques d’attaques et de trafic.

Greeen Team : simulation de trafic légitime pour faire fonctionner le système

Yellow Team : l’équipe qui participe involontairement au scénario de l’attaquant. Ils prennent part à une activité malicieuse sans forcément s’en rendre compte.

Blue Team : elle assure la supervision, ce n’est pas seulement la défense (SOC, NOC, Réponse à incident). Elle assure le bon fonctionnement de la Blue Team => les experts ne sont pas forcément exactement en phase sur le sujet.

White Team : ils ont le contrôle de l’exercice global

Purple Team : relais d’info, legal, communication.

OF : bonne analogie entre cyber range et simulateur de vol.

17′ : Formation avant entraînement ?

OF : Le cyber range est un prolongement de la formation. La formation ce sont de petits exercices courts avant de passer en environnement complexe qui ressemble à son environnement réel.

NR : s’inquiète de la possibilité de reproduire, ne serait-ce qu’en termes de licences (ou dongles) dans l’environnement réel

GP : la formation c’est du video training +  slide + labo exercice sur sa VM. Petit rappel de Confucius et du constructivisme par GP : Tout ce qu’on voit on oublie, tout ce qu’on fait, on retient ! Puis GP nous fait une petite analogie avec les Centre d’Entrainement en Zone UrBaine (CENZUB – Centre de l’armée de terre à Sissone). A ne pas confondre avec l’eunuque (SansZob) (Note du rédacteur pour vérifier si tout le mode suit). Entraînement en environnement urbain des forces.

Un cyber range c’est un environnement qui permet d’opposer des défenseurs et des opposants. Il faut qu’il y ait de la vie dans le système. Les partenaires technologiques de BlueCyForce permettent l’

NR : Concernant toujours la représentativité du système, comment fait-on pour simuler Virus Total ?

GP propose un faux Virus Total, Twitter (basé sur Mastodont), AFP … et on regénère la plateforme à chaque séquence. Malgré tout, on grille ses touches et ses backdoors à chaque jeu.

NR : Pas possible de faire du passive DNS sur 3 ans ou rapports publiques et indicateurs de compromission => on travaille en vase clos.

AK : mise en place d’un système de QuarksLab et applications de vie spécifiques

25′ NR : Quid de la qualité de scenario, qui les écrit ? (le client qui ne connaît pas ses risques ou le fournisseur qui ne connaît pas le métier)?

GP nous perd un peu… mais ajoute que c’est un peu des deux et qu’il existe à la fois une Blue Team Teachnique et une Blue Team management. Exemple : 22 pages de timeline et 32 pages de plateforme reçreçues du client. Cela dépend du niveau d’exigence du client.

NR : est-ce que vous simulez des consultants ?

GP : si c’est demandé (quand cela permet de rajouter des éléments de contexte), on le fait. Un exercice de gestion de crise, c’est une utilisation du Cyber Range. Exemple du cameraman qui intervient au milieu de la nuit …

(outre le fait de savoir à quel moment ils allaient parler de l’ENSIBS … je voulais connaître le point de vue de chacun sur le sujet et cela faisait écho à la présentation d’Eric Weber de Thales Communication and Security sur le sujet à C&ESAR 2017 : Problématique de formation des opérateurs face aux menaces Cyber : utilisation des Cyber Range )

31′ : NR : qui fait quoi avec des Cyber Range ? Quel est l’état du marché ? Formation au pentest ?

GP : Prestation d’entraînement et de formation, vente de cyber range avec +/- de prestation.

OF : on cherche à suivre les performances des joueurs. Etablir un ranking / score gobal. L’idée est que chaque année cela s’améliore

AK : ….

HS : Le Cyber Range n’est-il pas plus utile pour la défense que dans l’attaque que NR transforme en une question sur le glissement des plateformes de cyber range avec un bout d’ANSIBLE et trois clics dans le Cloud ?

GP : Au contraire les gens veulent avoir leur plateforme … même si BluecyForce a annoncé au FIC du cyber range as a service (30% des usages). Un hyperviseur avec des VMs ne font pas un CyberRange. Compliqué d’aller mettre dans le Cloud, ton routeur chiffreur de l’OTAN. Le cyber range c’est : Mon infra, mes vulns, mon chemin ! Comme au CENZUB c’est un environnement le plus réaliste possilbe pour s’entraîner à répondre aux cyber-attaques

OF : le cyber range permet de faire de la formation, de la gestion de crise mais aussi du challenge qui permet de se former en s’amusant (Coucou Malice ???)

AK : les directives telles NIS obligent à suivre des entraînement continus. Déjà le cas en zone Asie-Pacifique les entreprises critiques sont obligés d’envoyer ses salariés suivre des entraînements à l’extérieur

HS : Si on s’entraine pas régulièrement, en trois ans on a tout oublié de la formation

GP n’est pas nostalgique mais nous raconte l’évolution de son cyber range depuis SSTIC 2005 : Simulation hybride de la sécurité des systèmes d’information : « vers un environnement virtuel de formation ».  SPLUNK (pseudo SIEM… so right !), QRadar, Prelude Keenaï : on ne fera pas d’entraînement pertinent à des gens s’ils n’y croient pas, s’il n’est pas représentatif. L’important c’est d’y croire. Eh Guillaume, y’a plus de carburateurs depuis longtemps 🙂

JU : Comment simule-t-on la pression psychologique de la crise ?

GP nous met en garde sur la multiplicité des Teams mais le besoin d’avoir une équipe d’acteurs crédibles

NR : simuler une équipe de l’ANSSI qui débarque c’est possible ?

Mot de la fin :

49′ HS : l’entrainement c’est ce qui fait le succès de ce qu’on a enseigné au départ. La formation c’est bien, l’entrainement c’est mieux. Teddy Riner s’entraine tous les jours

(outre le fait de savoir à quel moment ils allaient parler de l’ENSIBS … je voulais connaître le point de vue de chacun sur le sujet et cela faisait écho à la présentation d’Eric Weber de Thales Communication and Security sur le sujet à C&ESAR 2017 : Problématique de formation des opérateurs face aux menaces Cyber : utilisation des Cyber Range)

en goody : Un bon doc d’Airbus DS sur le sujet.

 

Offre Cyber Range (merci Airbus DS)

Offre Cyber Range (merci Airbus DS)

Posted in Boulot, ClicCommentaires fermés sur Cyber Range

OVH VPS Testing Platform…

Victime de son succès mon hackMeIfYouCan a tenu une bonne dizaine de mois. On va essayer de faire mieux 🙂

Tomcat 9.0.4 : http://vps305886.ovh.net:8080/

Apache2 over Debian : http://vps305886.ovh.net/

Posted in Boulot, ClicCommentaires fermés sur OVH VPS Testing Platform…

MySQL on Debian (Cheat sheet for my students)

Install MySQL Server

sudo apt-get install mysql-server

During the installation process, you will be prompted to set a password for the MySQL root user as shown below. Choose a strong password and keep it in a safe place for future reference (Why not usin KeePass ?).

mysql-rootpw-debian

mysql-rootpw-debian

MySQL will bind to localhost (127.0.0.1) by default. Then you can connect locally on to your databases.

Allowing unrestricted access to MySQL on a public IP is not advised, but you may change the address it listens on by modifying the bind-address parameter in /etc/my.cnf. If you decide to bind MySQL to your public IP, you should implement firewall rules that only allow connections from specific IP addresses and then you’ll be able to connect using SSH from another computer.

Harden MySQL Server

It’s also a good thing to harden you database server. Fo taht, run the mysql_secure_installation script to address several security concerns in a default MySQL installation.

sudo mysql_secure_installation

You will be given the choice to :

  1. change the MySQL root password;
  2. remove anonymous user accounts;
  3. disable root logins outside of localhost,
  4. and remove test databases.

It is recommended that you answer yes to these options.

You can read more about the script in the MySQL Reference Manual.

Using MySQL

The standard tool for interacting with MySQL is the mysql client which installs with the mysql-server package. The MySQL client is used through a terminal. In a very firts time, it’s definitely bad thing to use web GUI to discover mysql functionalities.

Logging as root

  1. To log in to MySQL as the root user:
    mysql -u root -p
    
  2. When prompted, enter the root password.You’ll then be presented with a welcome header and the MySQL prompt as shown below:
    mysql>
    
  3. To generate a list of commands for the MySQL prompt, enter \h. You’ll then see:
    List of all MySQL commands:
    Note that all text commands must be first on line and end with ';'
    ?         (\?) Synonym for `help'.
    clear     (\c) Clear command.
    connect   (\r) Reconnect to the server. Optional arguments are db and host.
    delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.
    edit      (\e) Edit command with $EDITOR.
    ego       (\G) Send command to mysql server, display result vertically.
    exit      (\q) Exit mysql. Same as quit.
    go        (\g) Send command to mysql server.
    help      (\h) Display this help.
    nopager   (\n) Disable pager, print to stdout.
    notee     (\t) Don't write into outfile.
    pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
    print     (\p) Print current command.
    prompt    (\R) Change your mysql prompt.
    quit      (\q) Quit mysql.
    rehash    (\#) Rebuild completion hash.
    source    (\.) Execute an SQL script file. Takes a file name as an argument.
    status    (\s) Get status information from the server.
    system    (\!) Execute a system shell command.
    tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
    use       (\u) Use another database. Takes database name as argument.
    charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
    warnings  (\W) Show warnings after every statement.
    nowarning (\w) Don't show warnings after every statement.
    
    For server side help, type 'help contents'
    
    mysql>
    

 

Create a New MySQL User and Database

  1. In the example below, testdb is the name of the database, testuser is the user, and password is the user’s password.
    create database testdb;
    create user 'testuser'@'localhost' identified by 'password';
    grant all on testdb.* to 'testuser';
    

    You can shorten this process by creating the user while assigning database permissions:

    create database testdb;
    grant all on testdb.* to 'testuser' identified by 'password';
    
  2. Then exit MySQL.
    exit
    

Create a Sample Table

  1. Log back in as testuser.
    mysql -u testuser -p
    
  2. Create a sample table called customers. This creates a table with a customer ID field of the type INT for integer (auto-incremented for new records, used as the primary key), as well as two fields for storing the customer’s name.
    use testdb;
    create table customers (customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name TEXT, last_name TEXT);
    
  3. Then exit MySQL.
    exit
    

Reset the MySQL Root Password

If you forget your root MySQL password, it can be reset.

  1. Stop the current MySQL server instance.
    sudo systemctl stop mysql.serivce
    
  2. Use dpkg to re-run the configuration process MySQL goes through on first installation. You will again be asked to set a root password.
    sudo dpkg-reconfigure mysql-server-5.5
    

dpkg will restart MySQL automatically and you’ll now be able to log in again using mysql -u root -p.

Tune MySQL

MySQL Tuner is a Perl script that connects to a running instance of MySQL and provides configuration recommendations based on workload. Ideally, the MySQL instance should have been operating for at least 24 hours before running the tuner. The longer the instance has been running, the better advice MySQL Tuner will give.

  1. Install MySQL Tuner from Ubuntu’s repositories.
    sudo apt-get install mysqltuner
    
  2. To run it:
    mysqltuner
    

    You will be asked for the MySQL root user’s name and password. The output will show two areas of interest: General recommendations and Variables to adjust.

MySQL Tuner is an excellent starting point to optimize a MySQL server but it would be prudent to perform additional research for configurations tailored to the application(s) utilizing MySQL on your Linode.

More Information

You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

Posted in ClicCommentaires fermés sur MySQL on Debian (Cheat sheet for my students)

Playing around with Google n-gram

exemple de recherche

exemple de recherche

Ngram Viewer est une application linguistique proposée par Google, permettant d’observer l’évolution de la fréquence d’un ou de plusieurs mots ou groupe de mots à travers le temps dans les sources imprimées (numérisées par Google).

L’outil est entré en service en 2010 et n’a malheureusement plus été mis à jour depuis 2013.

Le terme Ngram désigne dans ce contexte une suite de « n » mots1, ce qui n’est lié que faiblement à la notion de n-gramme.

L’outil Ngram de Google repose sur la base de données textuelles de Google Livres. Les textes issus de Google Livres sont classés en fréquence de séquences de mots (appelées ngrams) par année d’édition, chaque séquence de mots est alors affectée d’un « poids ».

Lorsque l’utilisateur demande une comparaison de plusieurs séquences de mots, l’outil trace alors des courbes permettant de comparer leur fréquence d’usage au cours du temps.

Un exemple de recherche via ce lien et pour les amoureux du Google Search, le détail d’une requête constitutive :

https://www.google.fr/search?

q=%22european+union%22&

tbm=bks&

tbs=cdr:1,cd_min:2000,cd_max:2000&

lr=lang_en

&gws_rd=cr

&dcr=0

&ei=QtpNWrHdB8zUkwWtoKGIBg

 

Posted in ClicCommentaires fermés sur Playing around with Google n-gram

A lire / à écouter / à regarder

14/12/2017

France Culture : L’Invité des Matins (2ème partie) par Guillaume Erner  (24min)
Neutralité du net, hégémonie des GAFA : la démocratie prise dans la toile (2ème partie)

Avec Benjamin Bayart et Sébastien Soriano

https://www.franceculture.fr/emissions/linvite-des-matins-2eme-partie/neutralite-du-net-hegemonie-des-gafa-la-democratie-prise-dans-la-toile-2eme-partie

Podcast France Culture

Podcast France Culture

Posted in Boulot, ClicCommentaires fermés sur A lire / à écouter / à regarder

Vous reprendrez bien un peu de cyber ?

Petit aide-mémoire « vocabulaire » pour les gens que j’ai pris l’habitude de rencontrer au mois de mai.

Glossaire ANSSI

Glossaire ANSSI

Cyber à toutes les sauces, mais que met-on vraiment dedans ?

  • Cyberespace

« Le cyberespace est un espace de communication constitué par l’interconnexion mondiale d’équipements de traitement automatisé de données numériques. » (cf Charles Préaux dans DSI Hors série n°32 de novembre 2013).
Particularités du cyberespaces :
– espace déterritorialisé,
– principe d’ubiquité,
– quasi instantanéité des actions,
– substitution des acteurs,
– virtualité de la matière.
La définition du cyberespace proposée par le Centre Interarmée de Concepts, de Doctrines et d’Expérimentations (CICDE) est la suivante : « un domaine global constitué du réseau maillé des infrastructures des technologies de l’information, des réseaux de télécommunication, des systèmes informatiques, des processeurs et des mécanismes de contrôle intégré ». Définition autrefois disponible dans un doc DIA Non Protégé qui n’est aujourd’hui plus accessible sur le site du CICDE.

  • Cyberdéfense

Pour le Secrétariat Général de la Défense et de la Sécurité Nationale (SGDSN) la cyberdéfense est constituée de « l’ensemble des mesures techniques et non techniques permettant à un état de défendre dans le cyberespace les systèmes d’information jugés essentiels ».
Pour le Ministère de la Défense, la cyberdéfense recouvre « l’ensemble des activités qu’il conduit afin d’intervenir militairement ou non dans le cyberespace pour garantir l’efficacité de l’action des forces armées, la réalisation des missions confiées et le bon fonctionnement du ministère ».

  • Cybersécurité

La cybersécurité est l’état recherché pour un système d’information lui permettant de résister à des évènements issus du cyberespace susceptibles de compromettre la disponibilité, l’intégrité ou la confidentialité des données stockées, traitées ou transmises et des services connexes que ces systèmes offrent ou qu’ils rendent accessibles.
Pour Wikipedia, « Le mot cybersécurité est un néologisme désignant l’ensemble des lois, politiques, outils, dispositifs, concepts et mécanismes de sécurité, méthodes de gestion des risques, actions, formations, bonnes pratiques et technologies qui peuvent être utilisés pour protéger les personnes et les actifs informatiques matériels et immatériels (connectés directement ou indirectement à un réseau) des états et des organisations (avec un objectif de disponibilité, intégrité & authenticité, confidentialité, preuve & non-répudiation) »

  • Cybercriminalité

La cybercriminalité désigne les actes contrevenant aux traités internationaux ou lois nationales, utilisant les réseaux ou les systèmes d’information comme moyen de réalisation d’un délit ou d’un crime ou les ayant pour cibles.

  • Cybernétique

Ce dernier terme apparu fin XXème siècle à l’époque de la mode des mots en « …tique » concerne l’étude des processus de contrôle et de communication chez l’être vivant et la machine.

 

Bref, c’est plus clair ? On compare avec la plus traditionnelle Sécurité des Systèmes d’Information ?

Selon la Bible Wikipedia, « la sécurité des systèmes d’information (SSI) est l’ensemble des moyens techniques, organisationnels, juridiques et humains nécessaires et mis en place pour conserver, rétablir, et garantir la sécurité du système d’information. Assurer la sécurité du système d’information est une activité du management du système d’information.

Aujourd’hui, la sécurité est un enjeu majeur pour les entreprises ainsi que pour l’ensemble des acteurs qui l’entourent. Elle n’est plus confinée uniquement au rôle de l’informaticien. Sa finalité sur le long terme est de maintenir la confiance des utilisateurs et des clients. La finalité sur le moyen terme est la cohérence de l’ensemble du système d’information. Sur le court terme, l’objectif est que chacun ait accès aux informations dont il a besoin. La norme traitant des SMSI est l’ISO/CEI 27001 qui insiste sur Confidentiality – Integrity – Availability, soit en français Disponibilité – Intégrité – Confidentialité. »

So … buzzwords et bullshitteries, subtilité ou nuance fondamentale ? On pourrait donc envisager la cybersécurité comme un ensemble englobant la SSI et s’appliquant à un cadre plus large de systèmes (au delà du système d’information).

Un indice, depuis une douzaine de mois, à l’ANSSI des voix de premier rang n’évoquent plus que la SecNum / Sécurité du numérique. Au delà des éléments de langage et des guéguerres de « spécialistes », le grand chantier de la sécurisation de nos infrastructures/systèmes/applications reste un Vaste programme ! Et vous ne couperez pas à la lecture de ce classique : « Stratégie Nationale pour la Sécurite du Numerique« .

Stratégie Nationale la sécurite du numérique

Stratégie Nationale pour la sécurité du numérique

Ce qui se conçoit bien s’énonce clairement – Et les mots pour le dire arrivent aisément.
L’Art poétique (1674) – Nicolas Boileau-Despréaux

Posted in Boulot, Clic, Trop sérieuxCommentaires fermés sur Vous reprendrez bien un peu de cyber ?

P… de Wiko Rainbow

F*** wiko Rainbow

F*** wiko Rainbow


Ce jour où ton magnifique tracker personnel ne veut plus démarrer :
1 – tu te dis que tu n’es pas trop manche en qu’avec un bon coup de reset factory, il sera comme neuf. Malheureusement, il ne lance pas la réinitialisation du système
2 – bon allez, tu essaies de te connecter en USB / ADB depuis tous les OS de la terre mais rien à faire, la bête ne veut pas communiquer.
Help, needed ...

Help, needed …


3 – tu vas chez ton réparateur préféré qui te dit « ah bein non, WIKO y’a que leur SAV qui traite … »
4 – tu sollicites le SAV WIKO via web et tu te rends compte qu’il va falloir leur envoyer le mobile avec le détail du problème ET la facture d’achat que malheureusement tu n’as pas vu que c’est un téléphone volé cadeau !
5 – tu dégaines une première fois l’arme Twitter
6 – finalement à titre exceptionnel (zéro vaque dans la twittosphere) le SAV accepte que tu lui transmettes le mobile par La Poste (et bim recommandé + A/R à 10 € ?)
Twitter, nouvelle arme de négociation massive

Twitter, nouvelle arme de négociation massive


7 – Wiko SAV t’avertit de la bonne réception et t’annonce que tu devrais t’en tirer pour 80 € pour remplacer l’écran et réinstaller le système. Sinon, c’est 18 € pour te renvoyer le bidule ou alors tu peux aussi le léguer à Wiko
8 – Tu expliques gentiment que tu veux JUSTE la réinstallation du système
9 – Wiko te répond que ça ne fait pas partie de la garantie
10 – tu ré-expliques un peu moins gentiment que tu veux JUSTE la réinstallation du système
11 – Wiko t’informe que ce n’est pas possible, c’est tout ou rien !
12 – tu dégaines une seconde fois l’arme Twitter
13 – Wiko te répond qu’à titre très exceptionnel, ils vont répondre à ta demande si tu envoies 18 €
Wiko, c'est trop

Wiko, c’est trop


14 – un petit coup de CB plus tard …
15 – 2 jours plus tard ton Wiko est en dépôt chez DocPC à Theix comme neuf

… 15 jours plus tard, tu achètes un WIKO encore plus bas de gamme (Wiko Sunny à 49 € chez Carrouf ) en te disant qu’au moindre problème tu le jèteras à la poubelle

… 2 mois plus tard, tu n’as toujours pas trouvé ce que pouvait t’apporter de plus ton Samsung Galaxy S5 mini (corporate Alliacom) par rapport à ce nouveau jouet 🙁

Posted in Clic, N'importe quoiCommentaires fermés sur P… de Wiko Rainbow

tcpdump advanced filtering (pour mémoire)

tcpdump advanced filters
========================

Merci à Sebastien Wains
http://www.wains.be

$Id: tcpdump_advanced_filters.txt 36 2013-06-16 13:05:04Z sw $

Notes :
J’ai l’habitude de spécifier l’interface sur laquelle écouter. C’est l’option -i que l’on retrouve dans tous les exemples suivants.
Chacune des règles suivantes a été testée depuis mon laptop connecté à un réseau wifi au travers de eth1.
N’hésitez pas à m’envoyer vos commentaires et suggestions ou pour corriger des erreurs.
Je sais que je suis vraiment affreux pour expliquer les choses, alors n’hésitez pas à me solliciter si tout n’est pas clair.

J’essaierai de mettre à jour ce document avec de nouvelles règles utiles.

Avant de commencer avec les filtres avancés, revoyons la syntaxe basique de tcpdump

Syntaxe basique :

Filtrage sur hosts :
—————–

– filtre tout trafic relatif à 192.168.1.1 en destination ou source
# tcpdump -i eth1 host 192.168.1.1

– As soure only
# tcpdump -i eth1 src host 192.168.1.1

– As destination only
# tcpdump -i eth1 dst host 192.168.1.1

Filtering ports :
—————–

– Match any traffic involving port 25 as source or destination
# tcpdump -i eth1 port 25

– Source
# tcpdump -i eth1 src port 25

– Destination
# tcpdump -i eth1 dst port 25

Network filtering :
——————-

# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168

Protocol filtering :
——————–

# tcpdump -i eth1 arp
# tcpdump -i eth1 ip

# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp

Let’s combine expressions :
—————————

Negation : ! or « not » (without the quotes)
Concatanate : && or « and »
Alternate : || or « or »

– This rule will match any TCP traffic on port 80 (web) with 192.168.1.254 or 192.168.1.200 as destination host
# tcpdump -i eth1 ‘((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))’

– Will match any ICMP traffic involving the destination with physical/MAC address 00:01:02:03:04:05
# tcpdump -i eth1 ‘((icmp) and ((ether dst host 00:01:02:03:04:05)))’

– Will match any traffic for the destination network 192.168 except destination host 192.168.1.200
# tcpdump -i eth1 ‘((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))’

Advanced header filtering :
===========================

Before we continue, we need to know how to filter out info from headers

proto[x:y] : will start filtering from byte x for y bytes. ip[2:2] would filter bytes 3 and 4 (first byte begins by 0)
proto[x:y] & z = 0 : will match bits set to 0 when applying mask z to proto[x:y]
proto[x:y] & z !=0 : some bits are set when applying mask z to proto[x:y]
proto[x:y] & z = z : every bits are set to z when applying mask z to proto[x:y]
proto[x:y] = z : p[x:y] has exactly the bits set to z

Operators : >, <, >=, <=, =, != This may not be clear in the first place but you'll find examples below involving these. Of course, it is important to know what the protocol headers look like before diving into more advanced filters. IP header --------- 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | <-- optional +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | DATA ... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ I'll consider we are only working with the IPv4 protocol suite for these examples. In an ideal world, every field would fit inside one byte. This is not the case, of course. Are IP options set ? -------------------- Let's say we want to know if the IP header has options set. We can't just try to filter out the 21st byte because if no options are set, data start at the 21st byte. We know a "normal" header is usually 20 bytes (160 bits) long. With options set, the header is longer than that. The IP header has the header length field which we will filter here to know if the header is longer than 20 bytes. +-+-+-+-+-+-+-+-+ |Version| IHL | +-+-+-+-+-+-+-+-+ Usually the first byte has a value of 01000101 in binary. Anyhow, we need to divide the first byte in half... 0100 = 4 in decimal. This is the IP version. 0101 = 5 in decimal. This is the number of blocks of 32 bits in the headers. 5 x 32 bits = 160 bits or 20 bytes. The second half of the first byte would be bigger than 5 if the header had IP options set. We have two ways of dealing with that kind of filters. 1. Either try to match a value bigger than 01000101. This would trigger matches for IPv4 traffic with IP options set, but ALSO any IPv6 traffic ! In decimal 01000101 equals 69. Let's recap how to calculate in decimal. 0 : 0 \ 1 : 2^6 = 64 \ First field (IP version) 0 : 0 / 0 : 0 / - 0 : 0 \ 1 : 2^2 = 4 \ Second field (Header length) 0 : 0 / 1 : 2^0 = 1 / 64 + 4 + 1 = 69 The first field in the IP header would usually have a decimal value of 69. If we had IP options set, we would probably have 01000110 (IPv4 = 4 + header = 6), which in decimal equals 70. This rule should do the job : # tcpdump -i eth1 'ip[0] > 69′

Somehow, the proper way is to mask the first half/field of the first byte, because as mentionned earlier,
this filter would match any IPv6 traffic.

2. The proper/right way : « masking » the first half of the byte

0100 0101 : 1st byte originally
0000 1111 : mask (0xf in hex or 15 in decimal). 0 will mask the values while 1 will keep the values intact.
=========
0000 0101 : final result

You should see the mask as a power switch. 1 means on/enabled, 0 means off/disabled.

The correct filter :

In binary
# tcpdump -i eth1 ‘ip[0] & 15 > 5’

or

In hexadecimal
# tcpdump -i eth1 ‘ip[0] & 0xf > 5’

I use hex masks.

Recap.. That’s rather simple, if you want to :
– keep the last 4 bits intact, use 0xf (binary 00001111)
– keep the first 4 bits intact, use 0xf0 (binary 11110000)

DF bit (don’t fragment) set ?
—————————–

Let’s now trying to know if we have fragmentation occuring, which is not desirable. Fragmentation occurs
when a the MTU of the sender is bigger than the path MTU on the path to destination.

Fragmentation info can be found in the 7th and 8th byte of the IP header.

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don’t Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.

The fragment offset field is only used when fragmentation occurs.

If we want to match the DF bit (don’t fragment bit, to avoid IP fragmentation) :

The 7th byte would have a value of :
01000000 or 64 in decimal

# tcpdump -i eth1 ‘ip[6] = 64’

Matching fragmentation ?
————————

– Matching MF (more fragment set) ? This would match the fragmented datagrams but wouldn’t match the last
fragment (which has the 2nd bit set to 0).
# tcpdump -i eth1 ‘ip[6] = 32’

The last fragment have the first 3 bits set to 0… but has data in the fragment offset field.

– Matching the fragments and the last fragments
# tcpdump -i eth1 ‘((ip[6:2] > 0) and (not ip[6] = 64))’

A bit of explanations :
« ip[6:2] > 0 » would return anything with a value of at least 1
We don’t want datagrams with the DF bit set though.. the reason of the « not ip[6] = 64 »

If you want to test fragmentation use something like :
ping -M want -s 3000 192.168.1.1

Matching datagrams with low TTL
——————————-

The TTL field is located in the 9th byte and fits perfectly into 1 byte.
The maximum decimal value of the TTL field is thus 255 (11111111 in binary).

This can be verified :
$ ping -M want -s 3000 -t 256 192.168.1.200
ping: ttl 256 out of range

+-+-+-+-+-+-+-+-+
| Time to Live |
+-+-+-+-+-+-+-+-+

We can try to find if someone on our network is using traceroute by using something like this on the gateway :
# tcpdump -i eth1 ‘ip[8] < 5' Matching packets longer than X bytes ------------------------------------ Where X is 600 bytes # tcpdump -i eth1 'ip[2:2] > 600′

More IP filtering
—————–

We could imagine filtering source and destination addresses directly in decimal addressing.
We could also match the protocol by filtering the 10th byte.

It would be pointless anyhow, because tcpdump makes it already easy to filter out that kind of info.

TCP header
———-

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Res. |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

– Matching any TCP traffic with a source port > 1024
# tcpdump -i eth1 ‘tcp[0:2] > 1024’

– Matching TCP traffic with particular flag combinations

The flags are defined in the 14th byte of the TCP header.

+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+

In the TCP 3-way handshakes, the exchange between hosts goes like this :

1. Source sends SYN
2. Destination answers with SYN, ACK
3. Source sends ACK

– If we want to match packets with only the SYN flag set, the 14th byte would have a binary
value of 00000010 which equals 2 in decimal.
# tcpdump -i eth1 ‘tcp[13] = 2’

– Matching SYN, ACK (00010010 or 18 in decimal)
# tcpdump -i eth1 ‘tcp[13] = 18’

– Matching either SYN only or SYN-ACK datagrams
# tcpdump -i eth1 ‘tcp[13] & 2 = 2’

We used a mask here. It will returns anything with the ACK bit set (thus the SYN-ACK combination as well)

Let’s assume the following examples (SYN-ACK)

00010010 : SYN-ACK packet
00000010 : mask (2 in decimal)
——–
00000010 : result (2 in decimal)

Every bits of the mask match !

– Matching PSH-ACK packets
# tcpdump -i eth1 ‘tcp[13] = 24’

– Matching any combination containing FIN (FIN usually always comes with an ACK so we either
need to use a mask or match the combination ACK-FIN)
# tcpdump -i eth1 ‘tcp[13] & 1 = 1’

– Matching RST flag
# tcpdump -i eth1 ‘tcp[13] & 4 = 4’

Actually, there’s an easier way to filter flags :
# tcpdump -i eth1 ‘tcp[tcpflags] == tcp-ack’

– Matching all packages with TCP-SYN or TCP-FIN set :
# tcpdump ‘tcp[tcpflags] & (tcp-syn|tcp-fin) != 0

By looking at the TCP state machine diagram (http://www.wains.be/pub/networking/tcp_state_machine.jpg)
we can find the different flag combinations we may want to analyze.

Ideally, a socket in ACK_WAIT mode should not have to send a RST. It means the 3 way handshake has not completed.
We may want to analyze that kind of traffic.

Matching SMTP data :
——————–

I will make a filter that will match any packet containing the « MAIL » command from SMTP exchanges.

I use something like http://www.easycalculation.com/ascii-hex.php to convert values from ASCII to hexadecimal.

« MAIL » in hex is 0x4d41494c

The rule would be :

# tcpdump -i eth1 ‘((port 25) and (tcp[20:4] = 0x4d41494c))’

It will check the bytes 21 to 24. « MAIL » is 4 bytes/32 bits long..

This rule would not match packets with IP options set.

This is an example of packet (a spam, of course) :

# tshark -V -i eth0 ‘((port 25) and (tcp[20:4] = 0x4d41494c))’
Capturing on eth0
Frame 1 (92 bytes on wire, 92 bytes captured)
Arrival Time: Sep 25, 2007 00:06:10.875424000
[Time delta from previous packet: 0.000000000 seconds]
[Time since reference or first frame: 0.000000000 seconds]
Frame Number: 1
Packet Length: 92 bytes
Capture Length: 92 bytes
[Frame is marked: False]
[Protocols in frame: eth:ip:tcp:smtp]
Ethernet II, Src: Cisco_X (00:11:5c:X), Dst: 3Com_X (00:04:75:X)
Destination: 3Com_X (00:04:75:X)
Address: 3Com_X (00:04:75:X)
…. …0 …. …. …. …. = IG bit: Individual address (unicast)
…. ..0. …. …. …. …. = LG bit: Globally unique address (factory default)
Source: Cisco_X (00:11:5c:X)
Address: Cisco_X (00:11:5c:X)
…. …0 …. …. …. …. = IG bit: Individual address (unicast)
…. ..0. …. …. …. …. = LG bit: Globally unique address (factory default)
Type: IP (0x0800)
Internet Protocol, Src: 62.163.X (62.163.X), Dst: 192.168.X (192.168.X)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
…. ..0. = ECN-Capable Transport (ECT): 0
…. …0 = ECN-CE: 0
Total Length: 78
Identification: 0x4078 (16504)
Flags: 0x04 (Don’t Fragment)
0… = Reserved bit: Not set
.1.. = Don’t fragment: Set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 118
Protocol: TCP (0x06)
Header checksum: 0x08cb [correct]
[Good: True]
[Bad : False]
Source: 62.163.X (62.163.X)
Destination: 192.168.X (192.168.XX)
Transmission Control Protocol, Src Port: 4760 (4760), Dst Port: smtp (25), Seq: 0, Ack: 0, Len: 38
Source port: 4760 (4760)
Destination port: smtp (25)
Sequence number: 0 (relative sequence number)
[Next sequence number: 38 (relative sequence number)]
Acknowledgement number: 0 (relative ack number)
Header length: 20 bytes
Flags: 0x18 (PSH, ACK)
0… …. = Congestion Window Reduced (CWR): Not set
.0.. …. = ECN-Echo: Not set
..0. …. = Urgent: Not set
…1 …. = Acknowledgment: Set
…. 1… = Push: Set
…. .0.. = Reset: Not set
…. ..0. = Syn: Not set
…. …0 = Fin: Not set
Window size: 17375
Checksum: 0x6320 [correct]
[Good Checksum: True]
[Bad Checksum: False]
Simple Mail Transfer Protocol
Command: MAIL FROM:\r\n
Command: MAIL
Request parameter: FROM:

Matching HTTP data :
——————–

Let’s make a filter that will find any packets containing GET requests
The HTTP request will begin by :

GET / HTTP/1.1\r\n (16 bytes counting the carriage return but not the backslashes !)

If no IP options are set.. the GET command will use the byte 20, 21 and 22
Usually, options will take 12 bytes (12nd byte indicates the header length, which should report 32 bytes).
So we should match bytes 32, 33 and 34 (1st byte = byte 0).

Tcpdump is only able to match data size of either 1, 2 or 4 bytes, we will take the following ASCII
character following the GET command (a space)

« GET  » in hex : 47455420

# tcpdump -i eth1 ‘tcp[32:4] = 0x47455420’

Matching HTTP data (exemple taken from tcpdump man page) :

# tcpdump -i eth1 ‘tcp port 80 and (((ip[2:2] – ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)’

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ip[2:2] = | Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

+-+-+-+-+-+-+-+-+
ip[0] = |Version| IHL |
+-+-+-+-+-+-+-+-+

+-+-+-+-+-+-+-+-+
ip[0]&0xf = |# # # #| IHL | <-- that's right, we masked the version bits with 0xf or 00001111 in binary +-+-+-+-+-+-+-+-+ +-+-+-+-+ | Data | tcp[12] = | Offset| | | +-+-+-+-+ So what we are doing here is "(IP total length - IP header length - TCP header length) != 0" We are matching any packet that contains data. We are taking the IHL (total IP lenght Matching other interesting TCP things : --------------------------------------- SSH connection (on any port) : We will be looking for the reply given by the SSH server. OpenSSH usually replies with something like "SSH-2.0-OpenSSH_3.6.1p2". The first 4 bytes (SSH-) have an hex value of 0x5353482D. # tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D’

If we want to find any connection made to older version of OpenSSH (version 1, which are insecure and subject to MITM attacks) :
The reply from the server would be something like « SSH-1.99.. »

# tcpdump -i eth1 ‘(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)’

Explanation of >>2 can be found below in the reference section.

UDP header
———-

0 7 8 15 16 23 24 31
+——–+——–+——–+——–+
| Source | Destination |
| Port | Port |
+——–+——–+——–+——–+
| | |
| Length | Checksum |
+——–+——–+——–+——–+
| |
| DATA … |
+———————————–+

Nothing really interesting here.

If we want to filter ports we would use something like :
# tcpdump -i eth1 udp dst port 53

ICMP header
———–

See different ICMP messages :
http://img292.imageshack.us/my.php?image=icmpmm6.gif

We will usually filter the type (1 byte) and code (1 byte) of the ICMP messages.

Here are common ICMP types :

0 Echo Reply [RFC792]
3 Destination Unreachable [RFC792]
4 Source Quench [RFC792]
5 Redirect [RFC792]
8 Echo [RFC792]
11 Time Exceeded [RFC792]

We may want to filter ICMP messages type 4, these kind of messages are sent in case of congestion of the network.
# tcpdump -i eth1 ‘icmp[0] = 4’

If we want to find the ICMP echo replies only, having an ID of 500. By looking at the image with all the ICMP packet description
we see the ICMP echo reply have the ID spread across the 5th and 6th byte. For some reason, we have to filter out with the value in hex.

# tcpdump -i eth0 ‘(icmp[0] = 0) and (icmp[4:2] = 0x1f4)’

References
———-

tcpdump man page : http://www.tcpdump.org/tcpdump_man.html
Conversions : http://easycalculation.com/hex-converter.php
Filtering HTTP requests : http://www.wireshark.org/tools/string-cf.html
Filtering data regardless of TCP options : http://www.wireshark.org/lists/wireshark-users/201003/msg00024.html

Just in case the post disappears, here’s a copy of the last URL :

From: Sake Blok
Date: Wed, 3 Mar 2010 22:42:29 +0100
Or if your capturing device is capable of interpreting tcpdump style filters (or more accurately, BPF style filters), you could use:

tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2] = 0x2030

Which in English would be:
– take the upper 4 bits of the 12th octet in the tcp header ( tcp[12:1] & 0xf0 )
– multiply it by four ( (tcp[12:1] & 0xf0)>>2 ) which should give the tcp header length
– add 8 ( ((tcp[12:1] & 0xf0) >> 2) + 8 ) gives the offset into the tcp header of the space before the first octet of the response code
– now take two octets from the tcp stream, starting at that offset ( tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2] )
– and verify that they are  » 0″ ( = 0x2030 )

Of course this can give you false positives, so you might want to add a test for « HTTP » and the start of the tcp payload with:

tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450

resulting in the filter:

tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 and tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2] = 0x2030

A bit cryptic, but it works, even when TCP options are present (which would mess up a fixed offset into the tcp data).

Cheers,
Sake

The end ?
———

Please send more useful recipes !

Posted in Boulot, ClicCommentaires fermés sur tcpdump advanced filtering (pour mémoire)

Débug ton HTTPS avec Wireshark

Vous aussi vous avez eu besoin d’aller déchiffrer un flux HTTPs pour un coup de débug ?
Ca n’a jamais été aussi facile.
Même plus besoin d’aller « emprunter » une clef privée sur un serveur ou de se mettre dans la peau de « l’homme du milieu » (souvenirs de galères avec sslstrip or mitmproxy).

1 – Tu définis ta variable d’environnement SSLKEYLOGFILE pointant sur un fichier local que Firefox/Chrome détectera au redémarrage et qui va servir à stocker les pre-master keys

2 – Tu renseignes le chemin vers ce fichier de stockage des pre-master keys dans les préférences SSL de Wireshark

3 – Tu ajoutes ton filtre Wireshark de capture entre ton poste et le serveur cible

ip host 87.98.170.232 and ip host 192.168.1.102

4 – Feu patate !

Toi aussi rigole avec Wireshark

Toi aussi rigole avec Wireshark


Merci qui ? Merci Jim !

Ah oui, il faudra quand même que je regarde les cas où cela ne fonctionne pas … et que je détaille dans ce cas les vieilles alternatives.

Posted in Boulot, Clic, Crypto, HackCommentaires fermés sur Débug ton HTTPS avec Wireshark