0xBAADF00D

Follow the heap memory...

Surveillant Pénitentiaire, Quelle FreeBSD Peut Se Passer De Nous ?

Une des forces majeures de FreeBSD c’est la possibilité de compartimenter des processus et leurs enfants. Typiquement les jails BSD rappellent le chroot, mais elles offrent une plus grande sécurité et plus d’options.

Construire une prison

Le processus de création d’une jail est extrêmement simple, vous aurez juste besoin d’un bon magasine pour patienter durant la compilation !

1
2
3
root@bsd9> mkdir -p /usr/home/jails/my_freebsd9_jail
root@bsd9> cd /usr/src
root@bsd9> make world DESTDIR=/usr/home/jails/my_freebsd9_jail/

Make va mouliner pendant un petit moment. Il faut compter environ 10 à 20 minutes suivant la puissance de votre machine. Une fois terminé, passons à la deuxième étape.

1
2
root@bsd9> cd etc
root@bsd9> make distribution DESTDIR=/usr/home/jails/my_freebsd9_jail/

Mettre en route la prison

1
2
3
root@bsd9> mount -t devfs devfs /usr/home/jails/my_freebsd9_jail/dev/
root@bsd9> jail -n bsd -c path=/usr/home/jails/my_freebsd9_jail/ host.hostname=jail01 ip4.addr=10.1.1.1 persist
root@bsd9> jexec bsd tcsh

Votre prison au démarrage

Si vous souhaitez que votre prison démarre automatiquement, il va falloir faire un petit tour dans votre rc.conf préféré !

/etc/rc.conf
1
2
3
4
5
6
7
8
9
10
11
jail_enable="YES"
jail_interface="em0"
jail_list="bsd" 

jail_bsd_rootdir=/usr/home/jails/my_freebsd9_jail/  #No symlink path
jail_bsd_hostname="bsd9.0xbaadf00d.com"
jail_bsd_ip="10.1.1.1"
jail_bsd_interface="em0"
jail_bsd_devfs_enable="YES"
jail_bsd_flags="-n bsd"
#jail_bsd_mount_enable="YES"   # use /etc/fstab.bsd

Enregistrez puis utiliser la commande suivante pour démarrer la prison !

1
root@bsd9> /etc/rc.d/jail start bsd

PuTTY Et Les Caractères Spéciaux

On ne fait jamais attention à l’encodage des caractères en informatique. L’encodage peut n’avoir aucune incidence quand on utilise la langue de Shakespeare mais peut en avoir dès que l’on écrit dans une langue comportant des accents ou quand nous utilisons des caractères issus de la table étendue ASCII. Putty ne déroge pas à la règle, si l’encodage n’est pas correcte, vous vous retrouverez avec un affichage bâtard (voir 1 de l’image ci-dessous).

Pour éviter toutes surprises, vous pouvez configurer Putty pour qu’il affiche correctement tous les caractères. Pour cela, rendez-vous dans la partie “Configuration” puis dans la section “Window”. Dans “Translation”, cochez l’option “Treat CJK ambiguous characters as wide” et sélectionnez UTF-8 pour l’option “Remote character set”.

Et voilà !

My Traceroute

Suite à des soucis de DNS sur les serveurs du travail, j’ai découvert un outils super pratique: mtr (My Traceroute). Il s’agit d’un traceroute amélioré qui combine les fonctionnalités de traceroute et de ping. Il permet de savoir ou se trouve les pertes de paquets entre votre machine et la destination finale.

Problème De Streaming HTTPS Avec VLC Sous Fedora 17

Vous rencontrez des problèmes pour lire de la musique ou des vidéos via HTTPS sous VLC ? Les logs VLC vous disent que le fichier ca-certificates.crt est introuvable malgré que le package ca-certificates.rpm soit installé ?

1
2
3
4
[0x83916dc] gnutls tls client error: TLS session: access denied
[0x83916dc] gnutls tls client error: Certificate could not be verified
[0x83916dc] gnutls tls client error: Certificate's signer was not found
[0x83916dc] main tls client error: TLS client session handshake error

C’est juste un problème de nom de fichier: sous Fedora le fichier se nomme ca-bundle.crt, un simple lien symbolique résoudra tout.

1
root@starfish-prime> ln -s /etc/ssl/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt

SABnzbd : Newgroups Avec Interface Web

SABnzbd est un lecteur de newsgroup multiplateforme développé en Python. Il a l’avantage de proposer par défaut une interface web (webUI), ce qui permet d’installer facilement cette petite application directement sur votre serveur dédié. Ils gèrent le nzb et réparent et décompressent automatiquement les fichiers rar. Il est même possible d’être averti par email quand une tàche est terminée ou qu’il n’y a plus d’espace de stockage.

Si vous souhaitez tester SABnzbd, rendez-vous sur son site officiel: www.sabnzbd.org

Installer Spotify 0.8.4.103 Sur Fedora 17

Malgré que les paquets Fedora ne soit plus générés par Spotify, il est très facilement possible d’installer tout de même Spotify sur votre distribution Linux préférée. Pour commencer, il faut récupérer à les paquets Debian (.deb) sur le dépôt officiel qui se trouve à l’url :

1
http://repository.spotify.com/pool/non-free/s/spotify/

Les deux paquets en questions sont les suivants :

  • spotify-client-qt_0.8.4.103.g9cb177b.260-1_all.deb
  • spotify-client_0.8.4.103.g9cb177b.260-1_amd64.deb (ou i386 si vous êtes en 32bits)

Maintenant nous allons installer manuellement le contenu de ces deux .deb.

1
2
3
4
meyer_t@iron-sky> ar vx spotify-client-qt_0.8.4.103.g9cb177b.260-1_all.deb data.tar.gz
meyer_t@iron-sky> sudo tar -C / -xf data.tar.gz
meyer_t@iron-sky> ar vx spotify-client_0.8.4.103.g9cb177b.260-1_amd64.deb data.tar.gz
meyer_t@iron-sky> sudo tar -C / -xf data.tar.gz

Une fois les fichiers copiés. Il reste le soucis des dépendance que nous allons corriger à grand coup de liens symboliques.

1
root@iron-sky> yum install binutils qt-x11 openssl nss nss-util nspr qtwebkit libpng-compat
1
2
3
4
5
6
7
8
9
ln -s /usr/lib64/libsmime3.so /usr/lib64/libsmime3.so.1d
ln -s /usr/lib64/libplc4.so /usr/lib64/libplc4.so.0d
ln -s /usr/lib64/libnspr4.so /usr/lib64/libnspr4.so.0d
ln -s /usr/lib64/libnss3.so /usr/lib64/libnss3.so.1d
ln -s /usr/lib64/libnssutil3.so /usr/lib64/libnssutil3.so.1d
ln -s /usr/lib64/libnssmime3.so /usr/lib64/libnssmime3.so.1d
ln -s /usr/lib64/libsmime3.so /usr/lib64/libnssmime3.so.1d
ln -s /usr/lib64/libssl.so /usr/lib64/libssl.so.0.9.8
ln -s /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.0.9.8

Gérer Facilement Votre Cluster Cassandra

Après Redis, Cassandra à aussi droit à son “MyAdmin”. Grâce à cet outil, vous pourrez configurer et gérer le contenu de vos BdD Cassandra rapidement. Si vous avez une armée de Cassandra et que vous souhaitez administrer les nodes sans vous prendre la tête, CassandraMyAdmin est fait pour vous !

Cette petite merveille se trouve ici: https://github.com/sebgiroux/Cassandra-Cluster-Admin/

VM en Bridge Avec VMware ESX Chez OVH

Il est intéressant de vouloir affecter une IP publique à une de vos machines virtuelles tournantes sur votre VMware ESX flambant neuf. Puisqu’ ESX ne propose pas de NAT (allez savoir pourquoi chez VMware les produit payant ont moins de fonctionnalité que les gratuits), créer une “appliance” qui aura pour seul but de fournir de l’internet à toutes les autres n’est pas idiot. Voyons comment procéder pour que votre machine virtuelle puisse dialoguer avec le monde.

De base chez OVH, vous aurez droit à 3 IP de type “Fail-Over” gratuitement que vous pouvez utiliser. Il est également possible d’acheter des blocs d’IP RIPE, mais il faut passer en abonnement pro (15 euros/mois). Pour cette partie je vous laisse procéder comme vous le souhaitez.

Une fois que vous avez pris possession de vos IP, rendez-vous dans la section “MAC virtuelle pour VPS” qui se trouve dans la catégorie “Services”. Le but est de demander à OVH de vous générer des adresses MAC compatible VMware pour chacune de vos IP publiques que vous souhaitez attribuer à vos machines virtuelles. Si vous avez plusieurs MAC à générer, prenez votre mal en patience car OVH impose une attente de 5 minutes entre chaque génération.

A ce stade, vous avez donc XX couple(s) MAC virtuelle ? IP publique. Rendez-vous dans le client vSphere puis :

  1. Choisissez “Editer la configuration” sur la machine virtuelle qui va recevoir une IP Publique.
  2. Editez la carte réseau puis attribuez-lui l’adresse MAC virtuelle fournie par OVH.
  3. Lancez votre VM

Sous Linux, éditez le fichier /etc/network/interfaces pour modifier la configuration :

1
2
3
4
5
6
7
iface eth0 inet static
        address xxx.xxx.xxx.16
        netmask 255.255.255.0
        network xxx.xxx.xxx.0
        broadcast xxx.xxx.xxx.255
        gateway xxx.xxx.xxx.254
        dns-nameservers 213.186.33.99

Dans le cas des IP RIPE, OVH vous indiquera les informations à mettre à l’exception du serveur DNS, vous pouvez utiliser celui de Google (8.8.8.8).

Redémarrez votre service réseau et vous devriez avoir accès à internet et votre VM est maintenant accessible depuis l’extérieur !

Convertir Un Entier en Char* Avec Des Macros

Quoi de plus rageant que de se retrouver avec un entier quand on à besoin d’une chaine de caractères? Et c’est encore plus vrai quand il s’agit d’un define qui est utiliser pour des fichiers .log.

Heureusement, les macros peuvent vous éviter une conversion lourde. Dans notre cas, il s’agit du préprocesseur __LINE__ qui indique le numéro de la ligne actuelle dans le fichier source, bref, exactement le type de valeur utile dans un fichier .log en cas de crash. Malheureusement, celle-ci est sous forme d’entier… Mais pas pour longtemps :

1
2
3
4
#define CONVSTR(x) #x
#define STRING(x)  CONVSTR(x)

#define WHERE_I_AM   __FILE__":"STRING(__LINE__)

Et voilà! Fini le méchant petit entier…

Cacher Des Processus Sous Windows

L’un de derniers projets réalisé l’année dernière concerne un élément important de la sécurité informatique : les Root-Kit ! Durant ce projet, nous avons vu comment mettre en place un root-kit sous Windows affin que celui-ci masque la présence de processus dans l’arborescence des processus lancés (tasklist) en utilisant la méthode DKOM (Direct Kernel Object Manipulation).

Pour ce faire, la première chose à réaliser est de télécharger les outils nécessaires WinDDK (http://msdn.microsoft.com/fr-fr/windows/hardware/gg487428/) et un bon éditeur de texte pour coder. Maintenant que vous avez les outils adéquats, place à la théorie !

Squelette du driver

Au final notre root-kit sera un magnifique driver (fichier .sys) avec lequel on dialoguera via IOCTL. Pourquoi un driver? Tout simplement car le driver n’est pas assujetti aux règles de sécurité une fois qu’il est exécuté : il pourra allez et venir comme il le souhaite dans des processus qui ne sont pas à lui. Bien, le template d’un tel projet et relativement simple, il est composé d’un fichier SOURCES (équivalent du Makefile Linux) et d’au moins 1 fichier .c.

Voici un exemple de fichier SOURCES utilisé par le projet :

SOURCES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TARGETNAME=DEADLANDS
TARGETPATH=OBJ
TARGETTYPE=DRIVER
SOURCES=deadlands_driver.c \
          deadlands_dkom.c

!if ($(_NT_TARGET_VERSION) == $(_NT_TARGET_VERSION_WINXP))
C_DEFINES=$(C_DEFINES) -D_NT_TARGET_VERSION_WINXP=1
!            message BUILDMSG: CHECK: _NT_TARGET_VERSION=$(_NT_TARGET_VERSION) -> XP
!else if ($(_NT_TARGET_VERSION) == $(_NT_TARGET_VERSION_VISTA))
C_DEFINES=$(C_DEFINES) -D_NT_TARGET_VERSION_VISTA=1
!            message BUILDMSG: CHECK: _NT_TARGET_VERSION=$(_NT_TARGET_VERSION) -> VISTA
!else if ($(_NT_TARGET_VERSION) == $(_NT_TARGET_VERSION_LONGHORN))
C_DEFINES=$(C_DEFINES) -D_NT_TARGET_VERSION_VISTA=1
!            message BUILDMSG: CHECK: _NT_TARGET_VERSION=$(_NT_TARGET_VERSION) -> LONGHORN
!else if ($(_NT_TARGET_VERSION) == $(_NT_TARGET_VERSION_WIN7))
C_DEFINES=$(C_DEFINES) -D_NT_TARGET_VERSION_SEVEN=1
!            message BUILDMSG: CHECK: _NT_TARGET_VERSION=$(_NT_TARGET_VERSION) -> SEVEN
!endif

Et maintenant, voilà à quoi ressemble le fichier driver.c de base :

driver.c
1
2
3
4
5
6
#include "ntddk.h"

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
  return (STATUS_SUCCESS);
}

Voilà, maintenant, il reste plus qu’à définir quelques fonction de votre driver histoire qu’il soit “compliant” avec l’OS (si le driver n’implémente pas un minimum de fonctions (Major Function), il risque de crasher/freezer votre machine à son chargement). Parmi ces fonctions obligatoires, on trouve Read/Write/Open et Close.

Structures des processus dans la mémoire

En Kernel Land, il est possible d’obtenir la liste des processus lancés depuis n’importe qu’elle application (Ben oui, on a tous les droits xD). Donc autant le faire simple, on va demander son propre processus avec la fonction :

1
PEPROCESS IoGetCurrentProcess(void);

Comme le montre ce diagramme, EPROCESS contient un élément nommé LIST_ENTRY qui donne accès à une liste doublement chainées qui permet de se promener de processus en processus et donc de pouvoir rechercher le processus que l’on souhaite masquer. Pour effectuer se masquage, il suffit de le retirer de la liste doublement chainée.

Attention : Vous vous apercevrez très rapidement que suivant l’OS sur lequel vous êtes, les offsets pour passer de l’EPROCESS à la LIST_ENTRY changent. Vous pourrez les retrouver en utilisant WinDBG.

Pour finir

Par manque de temps, je n’ai pas encore implémenté le spinlock pour éviter des petits soucis quand mon driver modifie cette liste de processus.

Si vous souhaitez tester ce projet, rendez-vous sur la page GitHub suivante : http://0xbaadf00d.github.com/deadlands-windows-dkom/