giovedì 27 ottobre 2011

Abraxas 2011 - writeup level1

Finalmente posso dire, che con diversi aiuti sul python e qualche dritta su come arrivare alla soluzione(mai troppo dettagliate come dritte), sono finalmente arrivato a finire il livello 1 dell'Abraxas 2011 presentato all'HES2011 a Parigi. Direi che i CTF creati dal gruppo overthewire sono impossibili, oppure richiedono già una buona dose di conoscenza in fatto di crittografia... Perchè io fino a qualche giorno fa(quando ho pubblicato pure il writeup della sezione crypto di non ricordo quale CTF) non sapevo nemmeno cosa fossero XOR, cifrari di Cesare e via dicendo...

Per risolvere il primo livello di questo CTF non occorrono poi alla fine ottime conoscenze in linguaggi di programmazione, ma solo un po' di pazienza... Infatti su google si trovano sempre esempi molto utili, soprattutto per i linguaggi di programmazione nuovi, che consentono di capirne il significato anche ai meno preparati...

Io ho scelto di usare python, che non conosco, ma che si rivela sempre molto semplice... Infatti conoscendo un po' d'inglese si comprendono i linguaggi vari, ed avendolo pure usato per altre comunicazioni di rete, e per un BOF, mi sembrava il caso di usare lo stesso linguaggio...

Prima di procedere ad elencare la soluzione(che ovviamente poteva essere risolta in C,C#,C++,perl,ruby ecc) bisogna scaricare l'immagine dal sito della overthewire e seguire le istruzioni riportate nel box... Quindi leggere il blog del finto agente che ci fornisce delle informazioni necessarie per proseguire... Il sito dell'agente per il livello 1 ci propone le seguenti informazioni:

It seems the communications software Mazur wrote for the DFS space station uses very weak encryption. And be very weak I mean it really sucks. From his design documents, I've been able to gather that he uses XOR for performance reasons and a rolling key of only 4 ASCII characters!

Lucky for me, the space station is connected to the internet through a satellite communications provider. The hostname they use for the space station, which is called abraxas by the way, is abraxas.dildosfromspace.com. The communications module can be acivated through "secure" connection to port 4373.

The communications module displays a banner with lots of spaces and '#' signs in it, which should make the decryption easier.

Ci comunica che il cifrario utilizzato è XOR e la chiave d'accesso è composta di soli 4 caratteri... In più ci si deve collegare alla porta 4373 della macchina virtuale per avviare la connessione sicura... La prima parte, cioè la ricerca della chiave si risolve semplicemente con netcat e uno strumento chiamato xortool... netcat deve contenere l'opzione -o per seguire i comandi qui sotto, perchè ho notato che la versione BSD non presenta questa opzione... Io uso una lubuntu modificata per queste cose, quindi tramite synaptic si può scegliere di mantenere la versione netcat-tradizional... Comunque queste sono le istruzioni per avere i tool come li ho io...

#!/bin/bash

#Installa xortool
mkdir /pentest/crypto/
cd /pentest/crypto/
wget https://github.com/hellman/xortool/zipball/master -O xortool.zip
unzip xortool.zip
rm xortool.zip
cd ~

#Installa netcat
apt-get install -y netcat-traditional

E' un semplice codice bash, che avviato installerà xortool e netcat...

Allora per il primo passo digitiamo sulla shell:


nc -o log 192.168.66.66 4373
cat log | cut -d" " -f3-18 > key
cd /pentest/crypto/hellman-xortool-80cedef/
./xortool.py -x /home/user/key -c20

Questo ci consente di trovare la chiave usata nel cifrario... Infatti XOR è un metodo di cifratura molto debole... Le opzioni usate non sto a spiegarle... Sono molto semplici... Ho usato -c20 per indicare che il carattere più comune in hex fosse lo spazio...

Con questa chiave dfs! l'ho usata per decifrare le comunicazioni con la porta 4373... Questo il codice python da me utilizzato:


#!/usr/bin/env python

from socket import *
from Crypto.Cipher import XOR  

key='dfs!'
encryptor=XOR.new(key)
decryptor=XOR.new(key)

s = socket(AF_INET, SOCK_STREAM)
s.connect(('192.168.66.66', 4373))

testo = ''.join(s.recv(1024) for _ in range(4))
decifrato = encryptor.encrypt(testo)
print decifrato

data='1\r'
datac=decryptor.decrypt(data)
s.send(datac)

testo2 = ''.join(s.recv(1024) for _ in range(2))
decidata2=encryptor.encrypt(testo2)
print decidata2

s.close()

Adesso forse non sarà il codice meglio impostato o più veloce, ma io non studio informatica, e non conosco affatto python... Ci arrivo con l'intuito, ma tutto qui... Come dicevo, python poi è molto semplice, basta poco per leggerlo un po'...

Adesso proverò a risolvere il livello 2... Non si preannuncia facile...

ps:un grazie a Steven per avermi dato dei suggerimenti... Ed un grazie a Bakuriu del forum python-it per avermi indicato la soluzione per memorizzare stringhe dentro un unico file...

Nessun commento: