Oct 122013
 

Les hash des mots de passe sont stockés dans la table wp_users sous cette forme :

user_login user_password
admin $P$BXox1.zpleKOuW4jFS6/Fmg4iaiK.B/

Décomposition du hash: $P$BXox1.zpleKOuW4jFS6/Fmg4iaiK.B/

  • $P : algorithme
  • $B : nombre d’ itération
  • Xox1.zpl : sel aléatoire – longueur huit caractères
  • eKOuW4jFS6/Fmg4iaiK.B/ hash composé de 22 caractères

remarque : il n’ y a pas de séparateur entre le sel et le hash wordpress. Les longueurs sont fixes.
Le nom de l’ utilisateur n’ est pas utilisé dans le calcul du hash wordpress

Type de hash et itérations

B: détermine le nombre d’itération

Pour connaître le nombre d’ itération , on cherche dans un premier temps, la position du caractère dans la chaine suivante.

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Dans notre exemple, il s’ agit de B. B est en 13ieme position dans la chaine (l’index commence à 0).
la position de B défini l’ exposant.
2^13 = 8192

Algorithme de génération du hash

1ere phase : initialisation de la variable « hash »

hash = md5(salt | password)

concaténation du sel et du password puis hashage en md5

2eme phase : Réalisation de 8192 itérations (methode pour lutter contre le brute force)

Pour i de 0 à 8191
hash = md5(hash | password)
Fin Pour

Le nombre d’ itérations s’élève à 8192 . A chaque itération le hash est le hash de la précédente itération.

3eme phase: traitement pour rendre lisible le hash wordpress. Application d’ une fonction de type "base64"

Je vais m’ étendre sur cette 3ieme phase

encode64(hash)

Principe :

Le base64 est un codage de l’information utilisant 64 caractères.
On procède de gauche à droite, en concaténant 3 octets pour créer un seul groupement de 24 bits (8 bits par octet). Ils sont alors séparés en 4 nombres de seulement 6 bits (qui en binaire ne permettent que 64 combinaisons). Chacune des 4 valeurs est enfin représentée (codée) par un caractère simple et prédéfini de l’alphabet retenu. (Table ci-dessous.)

          1         2         3         4         5         6
0123456789012345678901234567890123456789012345678901234567890123
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Les deux premières lignes : indice de 0 à 63
la ligne suivante : les caractères

Le hash wordpress sera donc composé exclusivement de minuscules , de majuscules , de chiffre , du point et du slash.

Principe de codage :

Un hash md5 à une longueur de 16 octets. On découpe par groupe de 3 octets, ce qui nous fait 5 groupes. il reste 1 octets. nous verrons que ce dernier octet est traité un peu différemment.

traitement des groupes:

1er octet en bit : AAaa bbbb
2ieme octet en bit : cccc dddd
3ième octet en bit : eeee FFff

On concatène les 3 octets :

AAaa bbbb cccc dddd eeee FFff

Découpage par groupe de 6 bits selon le schémas suivant :

AAaa bbbb cccc dddd eeee FFff

1er groupe : aabbbb
2ieme groupe : ddddAA
3ieme groupe : ffcccc
4ieme groupe : eeeeFF

On traite les 4 autres groupes de 3 octets de la même manière.

Cas particulier : le dernier octet

Dernier octet : GGgg hhhh

Découpage par groupe de 6 bits selon le schémas suivant :
On concatène 4 bits à 0000 à GGgghhhh (0000GGgghhhh) de façon à avoir 2 x 6 bits.

0000GGgghhhh

1er groupe : gghhhh
2ieme groupe 0000GG

Le dernier octet est donc découpé en 2 caractères

Démonstration :

Éléments nécessaires pour la démonstration :

  • hash en string hexa obtenu apres les 8192 itérations
    aaa5e9a2f1461e1244326bb8a66b014d

  • hash wordpress
    eKOuW4jFS6/Fmg4iaiK.B/

Découpage des 3 premiers octets :

a   a    a   5    e   9
10101010 10100101 11101001 

AAaa bbbb cccc dddd eeee FFff


1 aabbbb = 101010 = 42d = "e"»
2 ddddAA = 010110 = 22d = "K"
3 ffcccc = 011010 = 26d = "O"
4 eeeeFF = 111010 = 58d = "u"

Les 4 premiers caractères sont : eKOU ce qui correspond au 4 premiers caractère du hash wordpress de notre exemple. (eKOuW4jFS6/Fmg4iaiK.B/

Pour le dernier caractère :

Découpage

4   d
01001101

On ajoute 4 bits à 0 devant

000001 001101

0000GG gghhhh


1 gghhhh = 001101 = 13d = "B"
2 0000GG = 000001 = 1d = "/"

les 2 derniers caractères sont : B/, ce qui correspond bien au 2 derniers caractère du hash wordpress de notre exemple. (eKOuW4jFS6/Fmg4iaiK.B/)

Brute force

Le programme hashcat peut être utilisé pour brute forcer les hash wordpress.

Dans hashcat, le commutateur -m permet de définir l’ algo à utilisé.

Définir -m400. Ce qui correspond selon la documentation à l’ algo utilisé par WordPress.

Programme python

Pour finir un programme en python qui calcule le hash wordpress.
Vous devez fournir le salt et le password. Lignes 47 et 48 .

# -*- coding: utf-8 -*-
 
import hashlib
import binascii
 
#
# fonctions
#
 
def _hash_encode64(hash, itoa64):
   output=""
   i=0
   while True:
       value = ord(hash[i]);
       i+=1
       output = output + str(itoa64[value & 63])
 
       if (i<16):
          value = value | ord(hash[i]) << 8
 
       output = output + str(itoa64[(value >> 6) & 63])
 
       i+=1
       if (i >= 16):
          print i
          break
 
       if (i < 16):
          value = value | (ord(hash[i]) << 16)
 
       output = output + str(itoa64[(value >> 12) & 63])
 
       i+=1
       if (i >= 16):
          break;
       output = output + str(itoa64[(value >> 18) & 63])
 
   return output
 
#                   1         2         3         4         5         6
#         0123456789012345678901234567890123456789012345678901234567890123
itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 
#arg01 : salt
#arg02 : pass
 
salt = "Xox1.zpl"
password = "password"
#resultat : $P$BXox1.zpleKOuW4jFS6/Fmg4iaiK.B/
hash = hashlib.md5(salt + password).hexdigest()
print hash
hash = hashlib.md5(salt + password).digest()
 
for i in range(0,8192) :
   hash = hashlib.md5(hash + password).digest()
 
print binascii.hexlify(hash)
 
P= _hash_encode64(hash, itoa64)
print "$P$B" + salt +  P +  "\n"    
 Publié par à 21 h 44 min
Oct 062013
 

Tutorial rtorrent Debian wheezy

Pourquoi ce tutoriel :

La plupart des tutoriels commencent par compiler les sources. Des opérations un peu longues et fastidieuses.

Sur une debian wheezy, l’ installation est très simple puisque l’on dispose de tous les packages nécessaires dans les repository.

Dans ce tutoriel, j’ anticipe également l’ installation de rutorrent.Rutorrent est un outil complémentaire qui permet de gérer très facilement rtorrent à partir d’ une interface web dont ‘ aspect ressemble à µtorrent. Je paramètre donc rtorrent pour être en adéquation avec rutorrent.

installation de rtorrent :

Sous root, télécharger le package rtorrent, actuellement il s’ agit de la version 0.9.2-1 :

apt-get install rtorrent

Contenu du package. on voit que le binaire rtorrent se trouve dans /usr/bin et que l’ on dispose d’une page de man

dpkg -L rtorrent
  • /usr/bin/rtorrent
  • /usr/share/doc/rtorrent/examples/fixSession080.py.gz
  • /usr/share/doc/rtorrent/changelog.Debian.gz
  • /usr/share/doc/rtorrent/copyright
  • /usr/share/doc/rtorrent/NEWS.Debian.gz
  • /usr/share/man/man1/rtorrent.1.gz

Liste des librairies

ldd /usr/bin/rtorrent
  • (extrait…)
  • libxmlrpc_server.so.3 => /usr/lib/libxmlrpc_server.so.3 (0xb75a7000)
  • libxmlrpc.so.3 => /usr/lib/libxmlrpc.so.3 (0xb7594000)
  • libxmlrpc_util.so.3 => /usr/lib/libxmlrpc_util.so.3 (0xb758f000)
  • libxmlrpc_xmlparse.so.3 => /usr/lib/libxmlrpc_xmlparse.so.3 (0xb7581000)
  • libxmlrpc_xmltok.so.3 => /usr/lib/libxmlrpc_xmltok.so.3 (0xb7567000)

La commande permet de mettre en évidence que le binaire a été compilé avec la librairie xmlrpc
L’ intégration de cette librairie est obligatoire pour permettre l’ échange de commande entre rutorrent et rtorrent.
Création d’ un utilisateur que je nomme ‘rtorrent’.Le binaire /usr/bin/rtorrent sera lancé avec ce compte.

useradd -m rtorrent

Création de deux répertoires ‘torrent’ et ‘session’.

mkdir /home/rtorrent/torrent
mkdir /home/rtorrent/session

Créer un groupe www-data (on anticipe l’ installation d’ apache).

groupadd www-data

Paramétrage des droits sur les dossiers torrent et session.

chown rtorrent.www-data /home/rtorrent/torrent
chmod 770 /home/rtorrent/torrent
chown rtorrent.www-data /home/rtorrent/session
chmod 770 /home/rtorrent/session

Télécharger l’archive master.zip qui contient le fichier de configuration de rtorrent : .rtorrent.rc

wget http://github.com/rakshasa/rtorrent/archive/master.zip

Dézipper master.zip. le fichier rtorrent.rc se trouve dans le sous-répertoire doc.
Renommer rtorrent.rc en .rtorrent.rc (attention au point).

mv rtorrent.rc /home/rtorrent/.rtorrent.rc

Penser à faire une copie de sauvegarde , toujours utile

cp /home/rtorrent/.rtorrent.rc /home/rtorrent/.rtorrent.rc.ori

modifier les droits du répertoire /home/rtorrent

chown rtorrent.www-data /home/rtorrent

Editer le fichier .rtorrent.rc

vi /home/rtorrent/.rtorrent.rc

rechercher les variables bind , directory , session et port_range pour paramétrer leur contenu.

#bind = 127.0.0.1
#bind = rakshasa.no
bind = <adresse ip en écoute>

#directory = ./
directory = /home/rtorrent/torrent

#session = ./session
session = /home/rtorrent/session

#port_range = 6890-6999
port_range = 6890-6890

Ajouter après la dernière ligne de .rtorrent.rc, ceci.

scgi_port = localhost:5000

Vérification du bon fonctionnement de rtorrent.

premier cas : vous êtes sur un serveur en local

vous êtes root
Passer sous l’ utilisateur rtorrent (important : ne pas utiliser cette commande si vous gérez à distance votre serveur avec putty)

su -l rtorrent

deuxième cas : vous gérer votre serveur à distance avec putty

ouvrir une session putty avec comme login : rtorrent.
si vous utilisez un autre utilisateur (même root),vous obtiendrez un erreur lors de l’utilisation de la commande screen.

la commande pour lancer rtorrent est tout simplement.

rtorrent

pour quitter rtorrent , taper :

ctrl q (simultanément)

cette commande arrête rtorrent.

dtach

Un autre moyen de lancer rtorrent est d’utiliser l’utilitaire dtach.
Cela permet de retourner dans le shell sans arréter rtorrent

Création d’une session dtach dans laquelle est lancée rtorrent (si dtach n’ est pas installé, apt-get install dtach)

vous pouvez rester sur votre session root car j’utilise la commande « su »

su -l rtorrent -c "dtach -n /tmp/rtorrent rtorrent"
  • -n : création d’une session

Pour accéder à la session dtach contenant rtorrent

su -l rtorrent -c "dtach -A /tmp/rtorrent rtorrent"
  • -A : rattachement à la session dtach rtorrent (A majuscule)

rtorrent -console

Tous ces messages sont normaux.
Les messages disparaissent après quelques secondes.

rtorrent -console2

ctrl+ ‘ (simple quote) pour quitter la session rtorrent.
rtorrent continue à s’ exécuter.

de retour dans le shell, vérifier que le port 5000 est bien en écoute

netstat –an –A inet | grep 5000

Pour quitter rtorrent

se rattacher à la session rtorrent

su -l rtorrent -c "dtach -A /tmp/rtorrent rtorrent"

ctrl+ q : pour quitter rtorrent et la session dtach se termine également.

screen :

Pour ceux qui préfèrent utiliser screen à la place de dtach , voici la procédure.

L’utilitaire screen permet de retourner dans le shell sans arrêter rtorrent.

Lancer rtorrent dans une session screen ( si screen n’ est pas installé , apt-get install screen)

screen -fn -dmS rtd nice -19 rtorrent

Rappel :
si vous utilisez putty, vous devez vous connecter avec l’ utilisateur rtorrent pour qu’ ensuite l’éxecution de screen soit sans erreur.
Si vous êtes connecté en root et que vous exécutez screen, vous obtiendrez le message d’ erreur suivant :
Cannot open your terminal ‘/dev/pts/1’ – please check.

pour accéder à la session rtorrent

screen -r

Tous ces messages sont normaux.
Les messages disparaissent après quelques seconde.

‘ctrl+a’ (simultané) suivi de ‘d’ pour quitter la session rtorrent.Rtorrent continue à s’ exécuter. (‘d’ comme detach)

de retour dans le shell, vérifier que le port 5000 est bien en écoute

netstat –an –A inet | grep 5000

Pour arréter la session rtorrent

screen -r

‘ctrl+a’ (simultané) suivi de ‘k’ pour quitter la session screen rtorrent. Rtorrent s’ arrête. (‘k’ comme kill)

Création d’ un script init

/etc/init.d/rtorrent

#!/bin/bash
 
### BEGIN INIT INFO
# Provides: Custom Rtorrent
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: rtorrent initscript
# Description: Custom rtorrent
### END INIT INFO
 
# commande pour ajouter les liens rcX.d
# update-rc.d rtorrent defaults
#
# commande pour supprimer les liens rcX.d
# update-rc.d -f rtorrent remove
 
. /lib/lsb/init-functions
 
NAME=rtorrent
SCRIPTNAME=/etc/init.d/$NAME
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# path du fichier temporaire
TMP=/tmp/rtorrent.dtach
# user qui lance le torrent
USER=rtorrent
# chemin vers fichier conf
CONF=/home/$USER/.rtorrent.rc
 
start() {
        echo -n "Starting $NAME: "
        su -l $USER -c "dtach -n $TMP rtorrent"
        echo "started"
}
 
stop() {
        echo -n "Stopping $NAME: "
        killall -r -u rtorrent "rtorrent"
        echo "stopped"
}
 
restart() {
 
        if [ "(ps aux | grep -e 'rtorrent' -c)" != 0  ]; then
        {
                stop
                sleep 5
        }
        fi
        start
}
 
case $1 in
        start)
               start
        ;;
        stop)
                stop
        ;;
        restart)
                restart
        ;;
        *)
                echo "Usage:  {start|stop|restart}" >&2
                exit 2
        ;;
esac

Lancer la commande pour que le script se lance automatiquement au prochain démarrage.

update-rc.d rtorrent defaults

Lancer rtorrent

/etc/init.d/rtorrent start

ps aux

Vous devez obtenir la session dtach et l’ exécutable rtorrent dans la liste des processus.

si vous utilisez le script , le mot de passe défini pour rtorrent devient inutile. Dans /etc/shadow, remplacé le hash par !!.

Voila rtorrent est installé et fonctionnel et prêt également à accueillir rutorrent. Je vous invite à lire le man ou bien à trouver des tutoriaux pour pouvoir utiliser rtorrent.

 Publié par à 21 h 47 min