Scripts et Programmes

Page pas du tout complète pour l'instant ! Je la remplis petit à petit…
Se référer au menu de droite pour avoir un aperçu de ce qui se trouve sur cette page.

Voir également la page concernant mes contributions et bugfixes sur divers projets.

Programmes en C

SpamEtPan! : SpamAssassin sur compte IMAP distant

Disponible sur mon SVN (2007-2008)
C'est un programme en C qui utilise la librairie libEtPan! permettant de faire de l'IMAP.
SpamEtPan! adapte l'utilisation de SpamAssassin pour qu'elle soit possible sur un compte IMAP distant, contrairement à l'utilisation habituelle de SpamAssassin où celui-ci s'exécute sur la machine qui reçoit les mails. SpamEtPan! doit être lancé régulièrement par cron, il se connecte alors au compte distant configuré, et :

  • Il parcourt chaque message présent dans la boîte de réception, et les soumets à SpamAssassin…
    • …les messages reconnus comme étant clairement du spam sont déplacés dans le répertoire “spam-sure” du serveur
    • …les messages reconnus comme étant probablement du spam sont déplacés dans le répertoire “spam-maybe” du serveur
    • …les autres messages (non-spam) sont déplacés dans le répertoire “clean” du serveur
  • Ensuite, il inspecte le contenu du répertoire “learn-spam” du serveur, et passe chacun de ses messages au programme d'apprentissage du filtre bayésien de SpamAssassin : sa-learn, en lui indiquant que ce message est du spam, puis il déplace le message dans le répertoire “spam-sure” du serveur
  • Enfin, de la même façon il inspecte le contenu “learn-clean” du serveur, pour les messages non-spam, et les déplace dans le répertoire “clean” une fois passés à sa-learn

Le nom des répertoires et les seuils de score pour la classification du spam sont configurables.

USB Resetter

Permet de réinitialiser un port USB sans avoir besoin de décharger les modules USB, ce qui n'est de toutes façons plus possible avec les distributions qui compilent les drivers USB directement dans le noyau au lieu de les proposer en modules séparés.

TODO

PutFTP

Disponible sur mon SVN. Permet de pouvoir uploader sur un serveur FTP des données en même temps qu'elle sont générées (via un pipe). Exemple d'utilisation :

tar c /var/www | gzip | aespipe -P ~/.mypass | ./putftp -v /dev/stdin ftpbackup.example.com /home/me/backups wwwdata.tar.gz.aes

TODO

Scripts en sh/bash/Perl/Python

Détecteur d'opcodes avancés (MMX, SSE, ...) dans un binaire ELF

Disponible sur mon SVN. Il se présente sous la forme d'un script Perl, qui prend un nom de programme en argument. Dans son répertoire se trouvent des fichiers qui listent les opcodes spécifiques à un jeu d'instruction particulier. Pour l'instant, seule les opcodes des fichiers ELF 32 bits sont reconnus, pour les jeux d'instruction suivants :

  • 808x, 8018x, 8028x, 8038x, 80486
  • Pentium, Pentium Pro
  • 3DNow!, 3DNow! Plus
  • AMD K6
  • MMX, EMMX
  • SSE, SSE2, SSE3, SSSE3, SSE4-1, SSE4a, SSE4b
  • Intel VT, AMD-V

Pour chaque jeu d'instruction ci-dessus, le script affichera le nombre d'opcodes différents présents dans le programme ELF qui correspondent à ce jeu d'instruction. Exemple :

$ ./asm.pl /bin/bash
 48 opcodes from a_808x
  1 opcodes from b_8018x
 15 opcodes from d_8038x
 11 opcodes from h_PentiumPro

Rien de bien extraordinaire, mais bon, en même temps, c'est juste bash précompilé sur ma distribution ! Et avec un émulateur NeoGeo compilé à la main ?

$ ./asm.pl /usr/local/bin/gngeo
119 opcodes from a_808x
  7 opcodes from b_8018x
  1 opcodes from c_8028x
 14 opcodes from d_8038x
  1 opcodes from e_80486
  1 opcodes from f_Pentium
 20 opcodes from g_MMX
  2 opcodes from h_PentiumPro
  6 opcodes from j_SSE
  1 opcodes from k_SSE2
  1 opcodes from l_SSE3

Unknown opcodes: CS, ADDR16, FS, DS, DATA16, ES, ICEBP, SS

Voilà qui est déjà plus intéressant.

Plus tard, il serait bon de supporter toutes les architectures, et les opcodes associés, peut-être en parsant automatiquement les tables d'opcodes que l'on peut trouver ici, par exemple les opcodes i386 sont . Cela devrait permettre de ne plus du tout avoir d'opcodes inconnus du script. Un jour où je serai motivé peut-être… :)

Détecteur d'utilisation de FORTIFY_SOURCE dans les objets ELF

Disponible sur mon SVN. FORTIFY_SOURCE est une fonctionnalité qui a été rajoutée par Red Hat à gcc depuis la version 4.0, et permet d'éviter des cas de dépassement de buffers facilement détectables par le compilateur soit à la compilation, soit pendant l'exécution. Dans ce dernier cas, certaines fonctions potentiellement dangereuses si elles sont mal utilisées sont remplacées par des versions qui font des vérifications supplémentaires, par exemple strcpy devient __strcpy_chk, voir http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html pour plus d'infos sur FORTIFY_SOURCE.

Ce script permet de détecter dans des objets ELF (binaires ou librairies) la présence de références à ces versions spéciales des fonctions classiques de la libc. C'est utile pour savoir quels packages de votre système font (ou ne font pas !) usage de cette fonctionnalité, qui est désactivée dans gcc par défaut (il faut utiliser -D_FORTIFY_SOURCE=1 ou -D_FORTIFY_SOURCE=2). C'est aussi supporté avec g++ (depuis 4.1 je crois).

C'est un script Perl assez simple qui utilise readelf pour obtenir la liste des symboles de l'objet ELF. Quelques exemples d'exécution :

$ ./check_fortify_source.pl /bin/ls
/bin/ls: VULNERABLE
$ VERBOSE=1 ./check_fortify_source.pl /bin/ls
/bin/ls: VULNERABLE (strcpy vfprintf mempcpy strncpy memcpy readlink memmove printf memset sprintf fprintf)
$ ./check_fortify_source.pl /bin/cp
/bin/cp: protected

Et sur différentes distributions auxquelles j'ai accès au moment où j'écris ces lignes :

$ # Ubuntu Karmic (on a server)
$ ./check_fortify_source.pl /bin/* /usr/bin/* /usr/sbin/* /usr/sbin/* | awk '{print $2}' | sort | uniq -c
    236 no-protection-needed
    792 not-elf
   1069 protected
    131 VULNERABLE
$ # Debian Lenny (on a server)
$ ./check_fortify_source.pl /{usr/,}{s,}bin/* | awk '{print $2}' | sort | uniq -c
     85 no-protection-needed
    531 not-elf
     42 protected
   1082 VULNERABLE
$ # RHEL 4 Update 5 (on a server)
$ ./check_fortify_source.pl /{usr/,}{s,}bin/* | awk '{print $2}' | sort | uniq -c
    192 no-protection-needed
    534 not-elf
   1884 VULNERABLE
$ # Fedora 12 (on a desktop, lots of stuff installed)
$ find /{usr/,}{s,}bin/ -type f -print0 | xargs -r0 sudo ./check_fortify_source.pl | awk '{print $2}' | sort | uniq -c
    764 no-protection-needed
   1151 not-elf
   2335 protected
    439 VULNERABLE

Rsnapshot companion

Disponible sur mon SVN. Script shell permettant d'utiliser rsnapshot pour faire des backups d'une machine qui n'est pas forcément allumée en permanence.

L'intérêt par rapport à une configuration rsnapshot classique, est que si vous avez configuré rsnapshot pour se lancer tous les jours à 3h du matin, et que parfois la machine distante n'est pas disponible (éteinte, plus sur le réseau…), rsnapshot ne retentera jamais avant la prochaine échéance programmée (24h plus tard en général).

Avec ce script, à partir du moment où un type de backup est en retard, il réessaiera toutes les 15 minutes (suivant votre configuration en crontab) de faire le backup, jusqu'à ce que celui-ci réussisse. Très pratique pour effectuer des backups automatiques d'ordinateurs portables par exemple, qui ne sont pas toujours connectés sur le réseau local.

Il faut paramétrer la crontab pour lancer ce script régulièrement (par exemple toutes les 15 minutes). S'il n'y a rien à faire, il se terminera dans la seconde. A chaque lancement :

  • Le script vérifiera si l'un des type de backups doit être effectué, par rapport à la dernière fois (backups hourly, daily, weekly, monthly, tels que définis dans votre configuration de rsnapshot)
  • Si oui, il vérifiera que la machine à sauvegarder est présente sur le réseau
  • Si oui, il lancera rsnapshot en lui demandant d'effectuer les types de backups qui manquent
  • Pour chaque type de backup demandé, une fois que rsnapshot s'est terminé correctement, le script marque le backup comme s'étant terminé avec succès

Disponible sur mon SVN, CGI écrit en Python, l'application vit ici.

TODO

 
scripts_et_programmes.txt · Last modified: 21/05/2010 20:06 (external edit) · []
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki