unix4fun

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 23 décembre 2012

OS/X et BPF

rhalalal je perds parfois du temps en conneries, la j'en ai vraiment perdu beaucoup sur une bêtise...
Je ne pigeais pas pourquoi un read(bpf_fd, buffer, size) me retournait un EINVAL a chaque fois...

et j'ai juste relu religieusement bpf(4) et voila ce qu'on y trouve d'intéressant en étant un tout petit peu "attentif":

[...]
Reads from these files return the next group of packets that have matched the filter.  To improve per-
formance, the buffer passed to read __MUST BE THE SAME SIZE AS THE BUFFERS USED INTERNALLY BY BPF__.  This
size is returned by the BIOCGBLEN ioctl (see below), and can be set with BIOCSBLEN.  Note that an indi-
vidual packet larger than this size is necessarily truncated.
[...]

Et voila... c'est aussi bête que ça et ça marche... grmlbmlmb

mardi 20 mars 2012

Dtrace et les gens du voyage...

Ok j'ai dû chercher, alors si je peux faire gagner un peu de temps à d'autres âmes perdues comme la mienne! J'avais envie de pouvoir sniffer les i/o sur n'importe quel process avec des filtres genre sur les file descriptors (ou FD), sur le type de FD ou sur le nom du process, etc.. histoire de voir dans les protocoles de communication locaux (genre via socket unix de pute de merde $@#!$!@#) comment un daemon communique avec son environnement ou comment (exemple d'OS/X) un programme peut communiquer avec le kernel, oui oui sous OS/X ça "peut" se passer via une socket() et pas via un /dev/bla, ioctl() etc.. ca existe aussi mais dans mon cas c'était dans mon cul... bref...

Donc j'ai commencé par ecrire un LD_PRELOAD, mais ce n'est pas le sujet, je me suis amusé avec dtrace(1) pour voir; pas mal d'outils sous OS/X utilisent dtrace(1), comme "dtruss(1m)" (fourni par default sous OS/X), je vous laisse chercher pour tous les trouver, mais voila un premier pas:

J'en reviens a mon process, je sais pas ce qu'il fait, j'aimerais voir ses read()/write(), je passe un coup d'"lsof" (aka LiSt Open Files) pour voir les FDs (File Descriptors, je me répète et j'en vois plein... alors je me dis merde, j'aimerais bien voir où il écrit, juste voir ce qui se passe sur ce FD, etc... je cherche un peu et je tombe sur:

Content, je m'en vais essayer, mais deception...:

# rwsnoop -p 377
  UID    PID CMD          D   BYTES FILE
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx
  501    377 iTerm        R      42 ptmx

Beuh il me print pas le contenu du read()/write(), genre un bel hexdump aurait été bien agréable, ensuite je ne peux pas filtrer par file descriptor (genre je veux voir juste le #6, je sais ce que c'est $#@!$@#!) et j'aimerais aussi pouvoir voir (quand ça n'est pas un fichier) le type de socket (vu que le type n'est pas fourni par la variable interne dtrace "fds"), histoire de savoir ce qui se passe vraiment et pas croire que c'est une vnode alors qu'en fait c'est une socket à la noix... bref...

Donc la première étape, c'est de dumper le contenu du read()/write() et le return code, c'est parti... je vais expliquer rapidement:

syscall::read:entry
/<predicate>/
{
    self->fd = arg0;
    self->rarg1 = arg1;
    self->rarg2 = arg2;
[...]
}

En gros à l'entrée de read() je sauve les arguments, oui je veux afficher mon code de retour et le read() n'a pas encore été exécuté donc le buffer est toujours vide... du coup :

syscall::read:return
/<predicate>/
{
    buffer = copyin(self->rarg1, arg0);
    tracemem(buffer, $opt_dumpsz);
    printf(\"\n\");
}

donc la à la fin de l'exec, je prends le code de retour (arg0), je copie tout ca dans un buffer local (oui oui on est dans l'addressage du noyau là...) et j'affiche le contenu de la mémoire avec tracemem() tout joli en fonction du type, mais si comme moi vous préférez TOUJOURS avoir un hexdump, magie, simplicité, élasticité... on rajoute ça au debut de son script:

#pragma D option rawbytes

voilà là on voit le contenu avec ce format:

             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 03 4f 42 7e 3b 39 35 3b 63 a8 11 16 01 00 00 00  .OB~;95;c.......
        10: 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  ................
        20: 36 00 18 00 00 00 00 00 f0 f0 52 00 01 00 00 00  6.........R.....
        30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

autre galère, retrouver le type de FD, apres avoir parcouru, diverses choses, je conseille donc aux gens qui se cassent la tête, de farfouiller dans ces liens:

je finis par aller voir si dans les struct du noyau je peux accéder à la struct proc (oui elle contient les FDs du process!!), je resume vite fait et simplement il faut passer par la struct task puis récupérer la struct proc (via bsd_info de la structure task), struct filedesc, blablabla jusqu'à la struct fileglob et on finit par voir que la struct proc est accessible via curproc dans dtrace(1), apres du déréferencement à la main on arrive à ça:

curproc->p_fd->fd_ofiles[<FD_num_as_index_of_this_array>]->f_fglob->fg_type

c'est un int avec pour valeurs possibles:

/* file types */
 145#define DTYPE_VNODE     1       /* file */
 146#define DTYPE_SOCKET    2       /* communications endpoint */
 147#define DTYPE_PSXSHM    3       /* POSIX Shared memory */
 148#define DTYPE_PSXSEM    4       /* POSIX Semaphores */
 149#define DTYPE_KQUEUE    5       /* kqueue */
 150#define DTYPE_PIPE      6       /* pipe */
 151#define DTYPE_FSEVENTS  7       /* fsevents */
 152

And voilà....!! maintenant vous reste plus qu'à faire l'amas de ces informations et hop vous avez vos filtres dans votre gentil script dtrace(1)! :)

Maintenant répétez les operations pour avoir filename, socket endpoint, en fonction du type, etc... vous aurez tout ce que vous voulez.

Bon je suis fatigué d'écrire ce truc... j'espère que ça servira à quelqu'un, je retourne lire mes trucs de glands...

lundi 6 juin 2011

La resolution de puzzle...

Le puzzle, oui, je parle bien de ce truc, ou on reconstitue une peinture de cheval dans un pre ou un voilier sur un soleil couchant.

Je ne sais pas pourquoi, quand je pense puzzle, j'associe les mots bibelot, kitsch et j'ai l'image testosterone d'un type (sans visage) portant ces t-shirts tres "male" d'un aigle attaquant un serpent au dessus d'un volcan flamboyant, l'image ultime de la determination masculine et motorise... bref...

Quand on est un déchet de l'informatique moderne comme moi, que la crypto c'est un peu comme apprendre le thaïlandais avec victor le matin sur france3 et que malgré tout ces "signes", on s'acharne a vouloir mal prononcer "bonjour" en thai, on en arrive a se retrouver face a des puzzles.. effectivement c'est étrange.. mais il y a parfois des liens marrants a lire sur ces petits "challenges" qui réclament un cerveau et de la curiosité...

Hope you enjoy: http://www.thephoenixsociety.org/puzzles/puzzlesolving.htm

jeudi 17 février 2011

Des hooks sympa de fonctions avec gcc

Yo yo yo.

J'avais une base de code, avec pas mal de fonctions déjà implémentées, et puis je me suis dit "ooooomm, faudrait que je trace le temps d'exécution de chacune de ces fonctions, pour savoir où concentrer mes efforts, en faisant telle et telle stat'". Bon alors je vous entends déjà barir au loin "hey mais pauvre naze, y'a plein d'outils de profiling", et c'est vrai. Seulement je voulais faire un truc à ma sauce d'une part (histoire de voir un peu comment ça fonctionne), et surtout pouvoir ajouter les stats qui m'intéressent, faire des trucs aux p'tits oignons quoi. Et puis c'est pas comme si ça prenait des jours à coder.

Alors après avoir cherché un peu, je tombe sur la doc GCC (même le man en parle, à vrai dire) :


void __cyg_profile_func_enter(void *func, void *callsite); 
void __cyg_profile_func_exit(void *func, void *callsite);


Ces fonctions sont appelées respectivement à l'entrée et la sortie de chacune des fonctions de votre programme. Il y a une linuxerie ensuite pour obtenir le nom de l'appelant, ie. passer par dladdr() ou __build_return_address(0). Ensuite vous stockez les infos comme vous voulez, perso j'utilise une hashtable dont les clefs sont les symboles (aka noms de fonctions), avec chaque cellule contenant des stats, sur le nombre d'appel, le temps d'exécution moyen, etc.

J'ai utilisé ça pour un code sur lequel je passe un peu de temps en ce moment, et la sortie ressemble à (le > correspond à l'entrée dans la fonction, le < à la sortie, faudrait rendre le truc plus joli avec un système de pile pour avoir la profondeur d'appel de chacune en fonction d'un décalage horizontal, mais bon, ça viendra après) :


[...]
1297941768.719531 > dfs_mkdir@0x40f534
1297941768.719607 > dfs_mkdir_timeout@0x41398f
1297941769.416415 < dfs_mkdir_timeout@0x41398f -- 696ms
1297941769.416445 < dfs_mkdir@0x40f534 -- 696ms
1297941769.416469 > dfs_getattr@0x40c16c
1297941769.416684 > dfs_namei_timeout@0x413ef7
1297941769.534098 < dfs_namei_timeout@0x413ef7 -- 117ms
1297941769.534161 > dfs_getattr_timeout@0x413690
1297941770.104592 < dfs_getattr_timeout@0x413690 -- 570ms
1297941770.104874 < dfs_getattr@0x40c16c -- 570ms

                                -- report --
symbol dfs_getattr_timeout: #calls: 46, average call duration: 266ms
symbol dfs_opendir_timeout: #calls: 1, average call duration: 780ms
symbol dfs_namei_timeout: #calls: 47, average call duration: 299ms
symbol dfs_chdir_timeout: #calls: 1, average call duration: 0ms
symbol dfs_mkdir: #calls: 1, average call duration: 696ms
symbol dfs_getattr: #calls: 48, average call duration: 275ms
symbol dfs_mkdir_timeout: #calls: 1, average call duration: 696ms


Le code (crados, pas encore nettoyé) est visible ici. Comme je disais, le truc vraiment sympa c'est juste d'avoir à appeler profile_init() et profile_fini() dans mon code. Et encore, on peut faire mieux en générant un .so qu'on charge avec LD_PRELOAD, histoire d'avoir vraiment 0 code impacté. Faut juste compiler les objets avec -fPIC et -finstrument-functions. That's all folks.

OK c'est un profiler du pauvre, mais ici à unix4fun, on est prolos. Et on vous emmerde !

mardi 9 novembre 2010

Mon compilo est un beau salaud!

Je lis du code généré en ce moment... en particulier du code généré par Visual C++ avec des options "star-wars-security" blablabla mais c'est pas le sujet du jour...

Le sujet du jour c'est ma relative incompétence face a des choses comme:

[...]
.text:0069979F mov     eax, 66666667h          
.text:006997A4 imul    ecx
.text:006997A6 sar     edx, 1                          
.text:006997A8 mov    eax, edx                     
.text:006997AA shr     eax, 1Fh                       
.text:006997AD add     eax, edx
[...]

alors dans ecx, j'ai la valeur 0x20000, après des tentatives rapides de compréhension, je me suis bon les "magic values", j'en vois de temps en temps, ca pue la "magic value" des trucs de compilo-salaud pour tenter d'avoir de la précisions en continuant a travailler avec des entiers et en base2, bref..

En cherchant un peu je suis tombe la dessus:

Et j'ai enfin compris ce que ce petit snippet de code faisait, alors d’après vous il se passe quoi ? et quel est l’algèbre applique a la valeur dans ecx!? :) (je mettrais a jour avec une explication si le lien n'est vraiment pas clair...)

peace!

lundi 16 août 2010

si toi aussi tu aimes le poulet routi!

Je suis une grosse feignasse et je lis pas énormément de code, en ce moment je lis des trucs fait sur de l'ARM. En bonne grosse tanche, je n'avais jamais vu ces CMP suivi d'un CMPNE et d'un BXX ou un MOVXX etc.. (c'est en mode ARM only) ailleurs:

CMP      R1,#1 
CMPNE    R2,#2 
BEQ      bleh 

Heureusement qu'il y a l'internet poilu pour éclairer et donner des belles recettes.

J'ai trouve des gens qui parlent de comment on fait un poulet roti et comment voir si il est bien cuit!

Apparemment tu peux chainer des conditions tranquillement avec un petit "suffix" dans l'instruction (il y a des bits réservés dans l'instruction pour ces options ARM-only)

voila ca m'a rendu service aujourd'hui enjoy!

jeudi 31 décembre 2009

Vas-y, montre moi tes doigts ?!

Tu aimes Netfilter mais voilà, tu voudrais bien aussi faire... de l'OS fingerprinting ? C'est possible depuis la version 2.6.31, grâce au module xt_osf qui a été inclu officiellement. Donc voilà comment ça marche, un petit exemple :

  1. insmod ./xt_osf.ko
  2. ./nfnl_osf -f ./pf.os
  3. iptables -I INPUT -j ACCEPT -p tcp -m osf log 0 ttl 2

Tout d'abord un commentaire sur pf.os, c'est le fichier utilisé par packet filter, donc le fichier de définition de p0f, le tool de mister Zalewski. Ensuite on fait un test de connexion, et on voit dans les logs :

Windows 2000:SP4 : 192.168.028.131:2007 -> 192.168.028.124:22 hops=0

L'archive pour le programme userland (nfnl_osf) et les infos sont sur le bleurg de l'auteur du patch initial : http://ioremap.net/projects/osf

mercredi 22 avril 2009

SXCE tun/tap et quelques champignons s'il vous plait!

J'ai besoin d'openvpn et le tun(7M) c'est pas vraiment ce que je pensais etre un device tun... Alors apres avoir joue avec tun(7M) pour constater que j'avais pas ce que je voulais, j'ai un peu cherche et voila vite fait un ptit resume...

D'abord un "tutorial" etape par etape pour l'installation d'OpenVPN avec OpenSolaris... bon ok faut un driver tuntap "externe", mais bon...

Ensuite on rencontre des tites merdes genre :

# make install
ld -64 -r -o tun tun.o
ld -64 -r -o tap tap.o
/usr/bin/ginstall -c -m 644 -o root -g root if_tun.h /usr/include/net 
/usr/bin/ginstall -c -m 644 -o root -g root tun /usr/kernel/drv/amd64
/usr/bin/ginstall -c -m 644 -o root -g root tap /usr/kernel/drv/amd64
/usr/bin/ginstall -c -m 644 -o root -g root tun.conf /usr/kernel/drv
/usr/bin/ginstall -c -m 644 -o root -g root tap.conf /usr/kernel/drv
/usr/sbin/rem_drv tun >/dev/null 2>&1
/usr/sbin/rem_drv tap >/dev/null 2>&1
/usr/sbin/add_drv tun   
devfsadm: driver failed to attach: tun
Warning: Driver (tun) successfully added to system but failed to attach
/usr/sbin/add_drv tap
devfsadm: driver failed to attach: tap
Warning: Driver (tap) successfully added to system but failed to attach

et GnaGNAGnagnagnaGnaAGnA!!

Apr 22 00:16:45 deep genunix: [ID 370954 kern.notice] symbol tun_ppa: 
Apr 22 00:16:45 deep genunix: [ID 780480 kern.notice] value 0xffffffffc0347950 does not fit
Apr 22 00:16:45 deep genunix: [ID 286029 kern.notice] relocation error: R_AMD64_32: 
Apr 22 00:16:45 deep genunix: [ID 720415 kern.notice] file /usr/kernel/drv/amd64/tap: 
Apr 22 00:16:45 deep genunix: [ID 370954 kern.notice] symbol tun_ppa: 
Apr 22 00:16:45 deep genunix: [ID 780480 kern.notice] value 0xffffffffc0347950 does not fit
Apr 22 00:16:45 deep genunix: [ID 286029 kern.notice] relocation error: R_AMD64_32: 
Apr 22 00:16:45 deep genunix: [ID 720415 kern.notice] file /usr/kernel/drv/amd64/tap: 
Apr 22 00:16:45 deep genunix: [ID 370954 kern.notice] symbol tun_ppa: 
Apr 22 00:16:45 deep genunix: [ID 780480 kern.notice] value 0xffffffffc0347950 does not fit
Apr 22 00:16:45 deep genunix: [ID 399259 kern.notice] do_relocations: /usr/kernel/drv/amd64/tap do_relocate failed
Apr 22 00:16:45 deep genunix: [ID 603676 kern.notice] tap error doing relocations
Apr 22 00:20:52 deep genunix: [ID 286029 kern.notice] relocation error: R_AMD64_32: 
Apr 22 00:20:52 deep genunix: [ID 720415 kern.notice] file /platform/i86pc/kernel/drv/amd64/tun: 
Apr 22 00:20:52 deep genunix: [ID 370954 kern.notice] symbol : 
Apr 22 00:20:52 deep genunix: [ID 780480 kern.notice] value 0xfffffffff82ee590 does not fit
Apr 22 00:20:52 deep genunix: [ID 286029 kern.notice] relocation error: R_AMD64_32: 
Apr 22 00:20:52 deep genunix: [ID 720415 kern.notice] file /platform/i86pc/kernel/drv/amd64/tun: 
Apr 22 00:20:52 deep genunix: [ID 370954 kern.notice] symbol tun_ppa: 

Bon hop hop on prends son cerveau, on tente de l'allumer (il est a peu pres minuit...).. apres etre passe par la, puis la...

j'ai finalement abouti ICI et la houra!

J'ai modifie qqes details dans le Makefile du driver Tun/Tap "externe" vite fait... Makefile:

[...]
CC = cc
LD = ld

DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 04/22/2009\"
CFLAGS = $(DEFS) -O2 -D_KERNEL -I. -m64 -xmodel=kernel

ADD_DRV = /usr/sbin/add_drv
REM_DRV = /usr/sbin/rem_drv
DRV_DIR = /usr/kernel/drv/amd64
DRV_CONF_DIR = /usr/kernel/drv
[...]

et on dit merci a -xmodel=kernel..

au passage je suis tombe sur ces deux choses aussi..

Et c'est apres m'etre pris la tete 20 minutes ( alors que je suis une grosse feignasse...) que je vois que qqun avait aussi resolu le 'blem ici

au final on finit par avoir:

Apr 22 00:37:52 deep tun: [ID 654686 kern.notice] Universal TUN/TAP device driver ver 1.1 04/22/2009 (C) 1999-2000 Maxim Krasnyansky
Apr 22 00:37:52 deep pcplusmp: [ID 805372 kern.info] pcplusmp: ide (ata) instance 1 irq 0xf vector 0x44 ioapic 0x8 intin 0xf is bound to cpu 1
Apr 22 00:37:52 deep pseudo: [ID 129642 kern.info] pseudo-device: tun0
Apr 22 00:37:52 deep genunix: [ID 936769 kern.info] tun0 is /pseudo/tun@0
Apr 22 00:37:53 deep tap: [ID 654686 kern.notice] Universal TUN/TAP device driver ver 1.1 04/22/2009 (C) 1999-2000 Maxim Krasnyansky
Apr 22 00:37:53 deep pcplusmp: [ID 805372 kern.info] pcplusmp: ide (ata) instance 1 irq 0xf vector 0x44 ioapic 0x8 intin 0xf is bound to cpu 0
Apr 22 00:37:53 deep pseudo: [ID 129642 kern.info] pseudo-device: tap0
Apr 22 00:37:53 deep genunix: [ID 936769 kern.info] tap0 is /pseudo/tap@0

youpi.

NB: j'utilise le compilo sun.

lundi 9 mars 2009

Un peu d'auto-promo.

J'ai écrit vite fait une petite documentation relative aux tests unitaires en C. Feedbacks bienvenus.

C'est par ici

mardi 6 janvier 2009

screen tips!

Bonne annee! Souplesse! Flexibilite! Etancheite!

De petites choses sympathiques a propos de screen que j'ai decouvert par hasard en lisant cette page.

dimanche 28 décembre 2008

super mentor! jubilator! albator! toreador! vimperator!

l'ami poz, coach officiel de l'emission "super coder" sur M6 (*blague-pour-les-credules*), mon benjamin castaldi du coding, se laisse influencer par son travail de "coach", il m'a fait decouvrir vimperator et j'avoue que ce "relooking" a change ma vie!!

C'est pourquoi je recommande l'utilisation d'un coach, me reste juste a peaufiner mon laptop pour le casting de "la nouvelle coding star"..

vimperator, j'adOOoore!

NB: ils en ont fait un autre bien drole.

dimanche 24 août 2008

NetBSD, openvpn et les 42 passphrases...

J'ai un blem j'utilise assez souvent openvpn et en fonction de l'endroit ou je vais j'ai besoin de tel ou tel access VPN sur telles ou telles resources plus ou moins en meme temps etc.. bref j'ai besoin de plusieurs "profils" utilisateur.

Depuis des mois, je me tape l'edition du /etc/rc.conf et apres je tape la passphrase 2 ou 3 fois vu que j ai 2 ou 3 necessaires... enfin bref, j'en ai eu marre alors j 'ai fait un "hack" tout bete et tout simple en qqes etapes.

le plan:

  • un fichier encrypted avec ma clef pub qui contient la passphrase.
  • un script qui mets a la disposition d'openvpn cette passphrase
  • qqes hack dans les scripts de demarrage et les fichiers de conf.

1 . le fichier: key.asc
il contient la clef utilise pour unlocker le cert utilise pour l'auth, il doit donc rester prive!

2. le script de demarrage /usr/pkg/etc/rc.d/openvpn:

la ligne suivante a ete modifie:

openvpn_start()
{
    : ${openvpn_cfg="*.conf"}
[...]
  for f in $openvpn_cfg; do
      doit="$command --askpass `/bin/cat /home/user/.openvpn` 
$command_args --config $f"
      if ! eval $doit; then
[...]
}

3. le fichier /etc/rc.conf, legerement modifie:

[...]
openvpn=YES
. /etc/openvpn_current
[...]

4. le script moisi, ovpn.sh

ce script va choisir/preparer mon "profil" et demarrer les instances openvpn en utilisant la cle temporairement accessible.

#!/bin/sh
#
#
# I sick of typing my password for all VPN instances 
# all the time... $#@!$#@!$#@! :(
#
# there is probably some potential races
#

export TMPDIR=/home/user

MKTEMPCMD=/usr/bin/mktemp
GPGCMD=/usr/pkg/bin/gpg
VPNCMD=/usr/pkg/etc/rc.d/openvpn
RMCMD=/bin/rm
TOUCHCMD=/usr/bin/touch
CHMODCMD=/bin/chmod
CHOWNCMD=/usr/sbin/chown


TMPPREFIX=".openvpn"
VPNCIPHR=/home/user/.local/key.asc
VPNPLAIN=/home/user/.openvpn

VPNCMD_STOP=stop
VPNCMD_RESTART=restart

# OPENVPN PRECONFIG
CURR_CFG=/etc/openvpn_current
HOME_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf\""
LABS_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf\""
OUTR_CFG="openvpn_cfg=\"client_vpn1.conf client_vpn2.conf client_vpn3.conf client_vpn4.conf client_vpn5.conf\""


TMPFILE=`${MKTEMPCMD} -t ${TMPPREFIX}`
#echo "[+] using ${TMPFILE}"

ovpn_start()
{
        ${TOUCHCMD} ${VPNPLAIN}
        ${CHOWNCMD} root:wheel ${VPNPLAIN}
        ${CHMODCMD} 600 ${VPNPLAIN}
        echo "$TMPFILE" > ${VPNPLAIN}
        ${GPGCMD} -d ${VPNCIPHR} > ${TMPFILE}
        ${VPNCMD} start
        ${RMCMD} -fP ${VPNPLAIN}
        ${RMCMD} -fP ${TMPFILE}
}

ovpn_stop()
{
        ${VPNCMD} stop
}

CMD=$1
CNF=$2

case ${CMD} in
        start)
                case ${CNF} in
                        home)
                                echo ${HOME_CFG} > ${CURR_CFG}
                        ;;
                        lab)
                                echo ${LABS_CFG} > ${CURR_CFG}
                        ;;
                        out)
                                echo ${OUTR_CFG} > ${CURR_CFG}
                        ;;
                esac
                ovpn_start
        ;;
        stop)
                ovpn_stop
        ;;
        restart)
                $0 stop
                $0 start ${CNF}
        ;;
        *)
                echo "$0 <start|stop|restart> [<home|lab|out>]"
                echo "home: home configuration"
                echo "lab : lab configuration"
                echo "out : untrusted out configuration"
        ;;

esac

5. L'explication,
le fichier rc.conf inclus un fichier qui est genere dynamiquement (/etc/openvpn_current) a chaque demande d'un nouveau "profil" celui ci donne a openvpn les fichier de conf a utiliser pour demarrer les differents VPN.

Le script de demarrage du package openvpn lance openvpn avec un nouveau parametre supplementaire " --askpass file " qui donnera la passphrase pour unlocker le certificat d'authentification.

Le script utilisateur ovpn.sh lui s'occupe simplement de cree le /etc/openvpn_current, il gpg -d le fichier de clef key.asc le rajoute dans un fichier temporaire, demarre openvpn et efface ce fichier immediatement apres.

La derniere mouture qui tourne chez moi est tres legerement different en cela que je ne stocke pas la passphrase de mon cert dans un fichier encrypted en gpg, je "read" directement du tty et je feed immediatement le fichier temporaire.

Voila c'etait tout con mais maintenant pour demarrer mes 4-5 vpns en tapant juste ma passphrase gpg, je fais en sudo :

# ovpn.sh start home
You need a passphrase to unlock the secret key for
user: "..."
1024-bit ELG-E key, ID XXXXXXXX, created 2004-05-27 
(main key ID XXXXXXXX)

Enter passphrase:

Et voila! En esperant que ca en inspire d'autres, commentaires are welcome! :)

mercredi 25 juin 2008

TCP on steroids et encore d'autres trucs

Si toi aussi tu fais du code reseau en ce moment et que tu cherches toute sortes d'idees, tips et ce genre de choses Il n'y a pas longtemps la grande, la celebre USENIX conference a eu lieu avec son lots d'idees a reflechir-o-pompaz.

Peut etre que tu trouvera ce trucs interessant:

http://www.usenix.org/events/usenix08/tech/full_papers/menon/menon_html/index.html

Sinon y a ca qui traine aussi...

enjoy!

samedi 29 mars 2008

Unix Toolbox

Bon, ce lien a déjà probablement fait plein de fois le tour du Web Intéractif Multimédia Convivial 2.LOL, mais je le poste quand même :

 * UnixToolbox

Au menu : ben c'est simple, c'est un peu le couteau suisse de l'espace, il y a en gros TOUT ce qu'on a l'habitude d'oublier, pour diagnostiquer les problèmes qui apparaissent sur nos systèmes (Linux, *BSD, Solaris, ...), avoir des informations, etc.

A noter la racine de ce site, offrant un mini shell intéractif, avec des commandes à la con, genre "matrix", etc. Rigololesque.

Bref, à bookmarker/del.icio.us-iser, bleh.

mardi 4 septembre 2007

hmm du Web, mhMmmm berk comme les épinards berk...ca m'saoulllleee

Une petite compilation de quelques docs sympathiques :

http://net-square.com/papers/one_way/one_way.html http://unixwiz.net/techtips/sql-injection.html http://www.reversing.org/node/view/13

Voilà des webtrucs bidules, pas nouveau, juste utile ou marrant pour le curieux.

vendredi 31 août 2007

le ps est en déroute

Alors là je suis fier de mon jeu de mot. Vraiment, hein..

Bon bah juste une petite news de rien : on remarque souvent qu'avec ps on a des résultats un peu chelous, voire parfois carrément aberrants, en terme d'utilisation de la mémoire. Y'a plusieurs raisons à ça. On regarde l'occupation mémoire d'un process via ps puis pmap :

$ ps -FC Thunar
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
poz       5426  5414  0  3409  4720   0 Aug26 ?        00:00:00 Thunar --sm-client-id 117f000101000118510838300000138390002 --daemon

Soit en gros 4M de RAM utilisée

$ pmap -d `pidof Thunar`
Address   Kbytes Mode  Offset           Device    Mapping
08048000     480 r-x-- 0000000000000000 008:00002 Thunar
080c0000       8 rw--- 0000000000077000 008:00002 Thunar
080c2000     260 rw--- 00000000080c2000 000:00000   [ anon ]
b727d000      64 r---- 0000000000000000 008:00002 Thunar.mo
b728d000      28 r---- 0000000000000000 008:00002 libexo-0.3.mo
[...]
b7eed000     100 r-x-- 0000000000000000 008:00001 ld-2.5.so
b7f06000       8 rw--- 0000000000019000 008:00001 ld-2.5.so
bff52000      84 rw--- 00000000bff52000 000:00000   [ stack ]
ffffe000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 13640K    writeable/private: 792K    shared: 84K
$

On remarque que des segments de code sont comptés plusieurs fois (un segment pour la lecture, un pour l'exec, avec recouvrement). Bref, ça confirme juste ce qu'on sait déjà : ps se contente paresseusement d'afficher la quantité théorique maximale de mémoire utilisée (avec certains bouts de code en double, qui plus est), alors que les libs partagées sont pas exclusivement réservées à ce process... Bref, la "vraie" mémoire est indiquée en bas de l'output, "writeable/private: 792K".

$ cat > ~/bin/mem.sh
#!/bin/bash

function usage()
{
        echo "Usage: $(basename $0) PROCESS..."
        echo "display the (real) memory usage of processes"
}

if [ "$#" = "0" ]
then    usage
        exit 0
fi

OUT=
echo "memory usage:"

for i in $*
do
        OUT=$(pidof $i | cut -d' ' -f1)
        if [ "$OUT" = "" ]
        then    echo "[-] process '$i' does not exist"
        else    OUT2=$(pmap -d $OUT | grep private | awk '{print $4}')
                echo "[+] ${i} (pid ${OUT}): $OUT2"
        fi
done
^D
$ chmod +x ~/bin/mem.sh
$ shebang.sh ~/bin/mem.sh
$ mem.sh X firefox-bin ssh prout
memory usage:
[+] X (pid 4965): 415736K
[+] firefox-bin (pid 5582): 295068K
[+] ssh (pid 5580): 796K
[-] process 'prout' does not exist
$

Pour shebang.sh, cf. un commentaire ailleurs :)

Je sais pas trop sur les *BSD si pmap est dispo... feedback ? Pfff, 3:05 du mat', je vais être frais au taff, encore.

mardi 28 août 2007

Chiffrer sa box entièrement et proprement

Bon mes disques ont partiellement crashé. Du coup j'ai dû backuper ce que je pouvais, je me suis mis à tout refaire après avoir changé le disque qui se chiait dessus et pour le plaisir je me suis dit que j'allais être un peu parano.

Hein, vu que je cache les sources de ls(1) et objdump(1) fallait bien encrypter tout ça au cas ou l'OpenSouce (c)(tm)(r) devienne une propagande illégale en Europe, un danger pour l'informatique propriétaire et ses nobles destriers (et leurs piscines en argent massif, bon ok c'est de la provoc' a 2frc, mais c'est relou j'ai pas encore de piscine :/)

Alors j'ai lu ça :

http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS

Et now je boot sur une jolie clef USB avec une random key encrypted. C'est bien convi, je prépare la même chose sur mon laptop Linux, à voir si c'est possible avec une clef USB et un NetBSD, ce qui serait bien classieux, huhuhu :)

Bref je foutrai des updates si j'ai le temps de faire/tester une version NetBSD, sinon c'est que j'ai été trop fainéant alors voilà...

dimanche 26 août 2007

netcat c'est pas mal, socat c'est le top !

J'ai passé des années (et vous aussi je parie) à utiliser netcat pour faire un tas de trucs, recevoir et envoyer des datas, par tous les trous, dans tous les sens etc...

Pourtant ça fait un moment que je ne l'utilise plus non plus, je suis passé a socat, hyper convivial et tellement plus souple, dans le genre le tool dont on ne peut plus rien faire sans, bah voilà socat ! Rhalala le mec qui a codé ça, j'aimerais tellement remercier ses parents pour l'avoir mis au monde.

C'est ici :

http://www.dest-unreach.org/socat/

Hopla un p'tit exemple à la con, tu veux faire pareil que ton stunnel mais en une ligne pour avoir ton IMAP SSL accessible localement par ton client pas SSL du tout :

# socat tcp4-listen:143,reuseaddr,bind=127.0.0.1,fork \
> openssl:ssl-host:993,verify=0

And voilà, maintenant tu te connectes gentiment en IMAP sur localhost. hth.

(NB: au passage le code aussi est marrant à voir)