OVHack

À l’occasion de la Nuit du Hack 2k13, OVH a organisé un petit CTF pour gagner des places ! (maintenant terminé) Direction http://www.ovhack.com/ !

ovhack_1

Voyons en quoi consistait ce CTF.

Follow the white rabbit

Le scénario est simple :

1
2
3
This website has been compromised. Heard that
some obfuscated content was hidden somewhere
around here... Just follow the white rabbit.

Il y a 3 pages sur ce site évenementiel, reste à trouver un lapin.

ovhack_3

Seconde page, trouvé ! Et une image ovhacked.png. Intéressant.
Sur la première page, on trouve le même logo d’OVH, mais avec une url différente : ovh_small.png.

1
2
3
  $ du --bytes ovhacked.png ovh_small.png
  11031 ovhacked.png
  10506 ovh_small.png

525 octets en plus à la fin ?

1
2
3
4
5
6
  $ dd ibs=1 skip=10506 if=ovhacked.png of=diff.bin
  525+0 records in
  1+1 records out
  525 bytes (525 B) copied, 0.0317635 s, 16.5 kB/s
  $ file diff.bin
  diff.bin: gzip compressed data, from Unix, last modified: Mon Jun 17 18:28:45 2013

Un fichier gzip !
C’est du texte compressé :

1
2
3
4
5
6
7
8
9
10
11
12
13
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgICAgICAgICAgIHggICAgIHh4eHh4eHh4ICAgICAgIHggICAgICAgICAg
    eCAgeCAgICAgICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICAgICAgICAgICAgeCAgICAgeCAgICAgIHh4eHggICAgeCAgICAgICAgIHh4ICB4ICAgICAg
    ICB4ICAgICAgICAgICB4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
    ICAgICB4ICAgIHh4ICAgICAgICAgeCAgICB4ICAgICAgICB4eCAgIHggICAgICAgIHggICAgICAg
    ICAgICAgICAgIHh4eHh4eHh4eHh4eHggICAgICB4eCAgICAgICAgICAgICAgIHh4ICAgIHggICAg
    eCAgICAgICAgICB4eCAgIHh4ICAgICAgeHggICAgeCAgICAgICAgeCAgICAgICAgICAgICAgICAg
    ...

Qu’en dit google ? Du base64 visiblement.

Qui donne… du texte ? De l’ascii art ?

ovhack_4

En jouant avec la taille du terminal, on tombe bien sur de l’ascii art.
ovhack_5

De l’imprimante 3D au datacentre

ovhack_6

Le lien envoie sur un article sur les imprimantes 3D. On y trouve un second lapin.

ovhack_7

En fouillant la page, on fini par trouver une piste : des

1
<span ndhid="2k13#1">

avec des # dans le désordre.

ovhack_8

Concaténés dans l’ordre, on trouve la suite : “httpdouble_dotslashslashovhdottoslashgfexdsai”.
Une autre page du blog, encore des span ndhid. Puis une autre. Et encore une autre. Au bout d’une dizaine (je n’ai pas vraiment compté, mon script a fait tout le travail), on arrive sur une page hubiC, le service de stockage en ligne d’OVH.

ovhack_9

man zpool, man lolcat

Le README donne le ton :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ md5sum nntp-dwn-03.img.bin.xz
    e00a9c53306edd165534f4fa4a761737  nntp-dwn-03.img.bin.xz

==

We found this illegitimate server hidden in the servers room
of our company. It seems it was here for some time, as suggests
the dust that covers it ! Hell, was some competitor spying on
us from the inside ?

The strange thing is that, the server was actually crashed when
we found it, and we couldn't get it to even boot. The hardware
was pretty shitty, so it had to be expected somehow.

Bob plugged the disk in another machine and captured it, can you
have a look ? I fear there might be frigthening stuff on it...

305Mo et un unxz plus tard, nous voilà avec un dump de disque.
Un disque à analyser ? fdisk !

1
2
  # fdisk -l nntp-dwn-03.img.bin
  WARNING: GPT (GUID Partition Table) detected on 'nntp-dwn-03.img.bin'! The util fdisk doesn't support GPT. Use GNU Parted.

bon… Parted !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# parted nntp-dwn-03.img.bin
GNU Parted 3.1
Using /home/dduponchel/ovhack/nntp-dwn-03.img.bin
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit B
(parted) print
Model:  (file)
Disk /home/dduponchel/ovhack/nntp-dwn-03.img.bin: 1073741824B
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start       End          Size        File system  Name  Flags
 1      1048576B    137363455B   136314880B
 2      137363456B  273678335B   136314880B
 3      273678336B  277872639B   4194304B                       bios_grub
 4      277872640B  896532479B   618659840B  ext2               boot
 5      896532480B  1072693247B  176160768B

(parted)

Commençons par préparer les différentes partitions :

1
2
3
4
5
6
7
8
# losetup /dev/loop0 nntp-dwn-03.img.bin -o 1048576
# losetup /dev/loop1 nntp-dwn-03.img.bin -o 137363456
# losetup /dev/loop2 nntp-dwn-03.img.bin -o 273678336
# losetup /dev/loop3 nntp-dwn-03.img.bin -o 277872640
# losetup /dev/loop4 nntp-dwn-03.img.bin -o 896532480

# mount /dev/loop0 /mnt
mount: unknown filesystem type 'zfs_member'

Du ZFS ! LE système de fichier ! Qui n’est pas directement dans le kernel linux pour une bête histoire de licence.
Installons tout ça et…

1
2
3
4
5
6
7
 *   CONFIG_ZLIB_DEFLATE:     is not set when it should be.
 * Please check to make sure these options are set correctly.
 * Failure to do so may cause unexpected problems.
 * Once you have satisfied these options, please try merging
 * this package again.
 * ERROR: sys-kernel/spl-0.6.1-r2 failed (setup phase):
 *   Incorrect kernel configuration options

Inspectons les autres partitions pendant que le kernel recompile !

La partition avec le flag root est effectivement le / d’un système linux. Un debian wheezy d’après le /etc/os-release.
Pas grand chose d’intéressant. Pas de conf particulière, pas de programme particulier, juste un /etc/passwd qui promet plein d’utilisateurs. Le home est côté zfs ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# zpool import
   pool: home
     id: 9557236098197187793
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

    home        ONLINE
      mirror-0  ONLINE
        loop0   ONLINE
        loop1   ONLINE

# zpool import home
# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
home  51.0M  42.0M  47.7M  legacy
# mount -t zfs home /mnt/ovhack/home

Dans le /home, on trouve plein de choses :

  • des lolcats, plein de lolcats
  • une image ovh.jpg corrompue
  • des fichiers .par2, plein de fichiers .par2
  • des scripts perl et python
  • des sources : stepmania-svn et crunch-3.4
  • linuxmint-201109-xfce-dvd-64bit.iso.torrent
  • des bash_history pointant vers /dev/null
  • des bashrc classiques
  • les clefs ssh (privé et publique) de l’utilisateur kevin
    • ovhack_10

      Les choses intéressantes sont l’image ovh corrompue et la clef ssh.

      ovh_corrupted
      Commençons par l’image. Il y a peut-être des snapshot zfs avec une version non corrompue ou d’autres infos ?

      1
      2
      3
      4
      # zfs list -t snapshot
      NAME          USED  AVAIL  REFER  MOUNTPOINT
      home@backup  3.08M      -  48.7M  -
      # mount -t zfs home@backup /mnt/ovhack/home@backup

      Avec plein de lolcats et de .par2 de lolcats. Ainsi que :
      ovh.par2
      ovh.vol00+32.par2
      ovh.vol32+28.par2

      Restoration du fichier ovh avec par2 r *.par2 !

      ovh_repaired

      1
      2
      3
      welcome to the final step.
      xor is so l4m3 !
      XgQ5CghZRBU8DRgEIlVCNwY3fylAIH8AVQ==

      L’étape d’après fut douloureuse à trouver. Le fichier torrent n’a rien de spécial, pareil pour le code source. Me rappelant le Stripe CTF où il n’y avait pas de fausses pistes (ou les jeux vidéos où les items sont généralement là pour une bonne raison), j’ai pas mal trituré le binaire derrière XgQ5CghZRBU8DRgEIlVCNwY3fylAIH8AVQ== et la clef ssh.

      En fait, tout est dans le message. C’est XgQ5CghZRBU8DRgEIlVCNwY3fylAIH8AVQ== avec un XOR bien l4m3.

      Pour casser la clef utilisée dans le xor, il suffit ici d’avoir une idée sur le début de la chaine secrète. Par exemple, http://ovh.to

      ovhack_11

      Dans ce fichier, on trouve le message à envoyer à OVH pour leur signaler notre succès.

      Conclusion

      Un CTF bien sympa, mais trop court !
      Et puis, le xor c’est bien l4m3 quand même :)

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire