Mais um blog inútil.

Dezembro 26, 2011

Como não ganhar um iPad 2

Filed under: Coding,Cracking,Drama,Fail,Useless — falso @ 3:09

Boas noites,

Venho hoje aqui blogar a minha tristeza ao saber que a password do concurso para ganhar um iPad 2 no Pplware é alta string manhosa.

Vou começar então a falar da minha jornada para tentar ganhar isto...

Comecei por andar a procurar qual era o software que usava a extensão "xcon", um amigo meu descobriu entretanto que era o Conceal, um software todo manhoso em .NET.
Experimentei umas passwords básicas no programa só para ver se advinhava antes de fazer alguma coisa mais complexa, mas o programa era tão manhoso que se usasse uma password invalida ele crashava, então desisti dessa aproximação.

Falei com um amigo meu todo cromo da criptografia e ele automagicamente disse-me que aquilo eram blocos de TripleDES CBC.

Caso os senhores do Pplware não saibam, bruteforcar TripleDes não é assim pêra doce, citando a Wikipedia (está sempre correcta :-P):

"Deep Crack was designed by Cryptography Research, Inc., Advanced Wireless Technologies and the EFF. ...  Advanced Wireless Technologies built 1856 custom ASICDES chips housed on 29 circuit boards of 64 chips each. The boards were then fitted in six cabinets and mounted in a Sun-4/470 chassis. ... The entire machine was capable of testing over 90 billion keys per second. It would take about 9 days to test every possible key at that rate. On average, the correct key would be found in half that time."

Entretanto, eu sem sabendo que era alta string manhosa, e pensando que a password poderia ser o titulo de algum dos produtos entre 50 e 100€, fiz um scriptzinho que ia la parsar o site do OfficeLan e sacar de la os títulos todos (faz uso do phpQuery):

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<?php

require('phpQuery.php');

// batota, tem o total hardcoded
for($start = 0; $start <= 120; $start = $start + 20) {
	$url = 'http://shop.officelan.pt/pesquisa.html?start='.$start;
	$fields = array(
		'yagendoo_price_min'=>urlencode('50'),
		'yagendoo_price_max'=>urlencode('100'),
		'option'=>urlencode('com_yagendoo_vmsearch'),
	);
	$fields_string = "";
	foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
	rtrim($fields_string,'&');

	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$result = curl_exec($ch);

	curl_close($ch);

	$doc = phpQuery::newDocument($result);
	phpQuery::selectDocument($doc);

	foreach(pq('span.yagendoo_searchresult_title a') as $product) {
			echo $product->nodeValue;
			echo '<br/>';
	}
}

E com o resultado fui experimentar o seguinte:

<?php

$produtos = array(
  'MikroTik RouterBOARD 411U (Level 4) - RB411U - RB/411U',
  'MikroTik RouterBOARD 411AR (Level 4) - RB411AR - RB/411AR',
  ...
  'ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz Mimo',
  'ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz',
  'Presente', 'Presente_Natal', 'Presente_Natal.zip',
  'OfficeLan', 'pplware', 'natal',
);

$string = file_get_contents('nome_produto_offiLan.xcon');
foreach($produtos as $key) {
	$output = mcrypt_decrypt( MCRYPT_3DES , $key , $string , 'cbc');
	echo '<h4>'.$key.'</h4>';
	echo '<pre>'.$output.'</pre>';
}

Mas sem grandes resultados... Então foi que me disseram que o TripleDES CBC alem de uma key na cifra usa também outra variável, que é o IV (Initialization vector), que pelo que entendi, são dados usados para "inicializar" a cifra.
Então o tal programa tinha de usar algum algoritmo para "gerar" um IV a partir da nossa password ou então usava algum valor fixo, decidi tentar descobrir.

Andei a procura de técnicas sobre reversing a cenas .NET e achei alta programinha hacker, .NET Reflector.
Neste belo software, abre-se um executável .NET e ele escreve mais ou menos o codigo desse executável em belíssimo código C#, só os nomes de algumas funções e variáveis é que se perdem...

Então abri o executável do Conceal, e andei la a vasculhar, e no Form2 achei lá uma função chamada tdes_decrypt() e vi que era a função desejada, mas que a key e o IV eram calculados noutro lado, então com outra feature bonita deste programa, fiz Analyze nessa função e vi que era chamada pela func2(), e BINGO nessa achei o algoritmo que era usado para a key e o IV.

Decidi então criar um novo projecto C# no Visual Studio, onde iria utilizar o código do programa gerado pelo Reflector, mas podia-lhe alimentar um array gigante de passwords (a lista de produtos anterior). E com poucas dificuldades consegui mete-lo a funcionar, mas rapidamente vi que nenhuma das passwords que estava tentar usar era a correcta.
Sem saber mais o que tentar, rapidamente desisti...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace unconceal
{
    class Program
    {
        public static void tdes_decrypt(String inputfile, String outputfile, byte[] key, byte[] IV)
        {
            long bytecount = 0L;
            long fread_len = 0L;
            int numbytes = 0;
            byte[] mybuffer = new byte[0xf4241]; 
            TripleDESCryptoServiceProvider tdesProvider;
            CryptoStream cryptStream;

            FileStream freader = new FileStream(inputfile, FileMode.Open, FileAccess.ReadWrite);
            FileStream fwriter = new FileStream(outputfile, FileMode.OpenOrCreate, FileAccess.Write);

            fread_len = freader.Length;

            tdesProvider = new TripleDESCryptoServiceProvider();
            tdesProvider.Key = key;
            tdesProvider.IV = IV;
            tdesProvider.Padding = PaddingMode.Zeros;

            cryptStream = new CryptoStream(fwriter, tdesProvider.CreateDecryptor(), CryptoStreamMode.Write);
            int num = 0;
            num = inputfile.Length - 1;

            while (bytecount < fread_len)
            {
                numbytes = freader.Read(mybuffer, 0, 0xf4240);
                cryptStream.Write(mybuffer, 0, numbytes);
                bytecount += numbytes;
            }

            while (bytecount % 8 != 0)
            {
                cryptStream.WriteByte(0);
                bytecount++;
            }

            freader.Close();
            cryptStream.Close();
        }

        static void Main(string[] args)
        {
            List<string> passwords = new List<string>(new string[]
	        {
                "MikroTik RouterBOARD 411U (Level 4) - RB411U - RB/411U",
                "MikroTik RouterBOARD 411AR (Level 4) - RB411AR - RB/411AR",
                ...
                "ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz Mimo",
                "ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz",
                "Presente",
                "Presente_Natal",
                "Presente_Natal.zip",
                "OfficeLan",
                "pplware",
                "natal",
                "Natal",
                "iPad2",
                "Natal 2011",
                "PPLWARE.COM",
                "EBA428ECA16691133FA946FED56AF824E8527BB6",
                "_F2Liz12!" // password correct, mas só agora :(
        	});

            int x = 0;
            foreach (String for_keyf1 in passwords)
            {
                String password = for_keyf1.ToString();

                byte[] bytes = new byte[0x2710];
                int charIndex = 0;
                int length = for_keyf1.Length;
                byte[] buffer2 = new byte[length + 1];
                int index = 0;
                int num4 = 0;
                int num7 = length - 1;
                for (index = 0; index <= num7; index++)
                {
                    num4 += 3;
                    buffer2[index] = (byte)(Convert.ToInt64(for_keyf1[index]) + (index + num4));
                    num4--;
                }
                new ASCIIEncoding().GetBytes(Encoding.ASCII.GetString(buffer2), charIndex, Encoding.ASCII.GetString(buffer2).Length, bytes, charIndex);
                byte[] buffer3 = new SHA1CryptoServiceProvider().ComputeHash(bytes);

                byte[] key = new byte[24];
                key[0] = buffer3[2];
                key[1] = buffer3[6];
                key[2] = buffer3[0x12];
                key[3] = buffer3[0x10];
                key[4] = buffer3[0x13];
                key[5] = buffer3[1];
                key[6] = buffer3[9];
                key[7] = buffer3[7];
                key[8] = buffer3[14];
                key[9] = buffer3[3];
                key[10] = buffer3[8];
                key[11] = buffer3[0x11];
                key[12] = buffer3[10];
                key[13] = buffer3[15];
                key[14] = buffer3[0];
                key[15] = buffer3[11];
                key[0x10] = buffer3[9];
                key[0x11] = buffer3[4];
                key[0x12] = buffer3[0x12];
                key[0x13] = buffer3[5];
                key[20] = buffer3[11];
                key[0x15] = buffer3[2];
                key[0x16] = buffer3[0x13];
                key[0x17] = buffer3[0];

                byte[] iv = new byte[8];
                iv[0] = buffer3[2];
                iv[1] = buffer3[6];
                iv[2] = buffer3[0x12];
                iv[3] = buffer3[0x10];
                iv[4] = buffer3[0x13];
                iv[5] = buffer3[1];
                iv[6] = buffer3[9];
                iv[7] = buffer3[7];

                tdes_decrypt(@"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\nome_produto_offiLan.xcon",
                    @"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\" + x.ToString() + ".txt",
                    key, iv);

                string text = System.IO.File.ReadAllText(@"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\" + x.ToString() + ".txt");
                System.Console.WriteLine("String = {0}", text);
                x++;
            }
        }
    }
}

Hoje dia 26 de Dezembro, lembrei-me de ir ver qual era afinal a password do concurso, e foi então que descobri que era "_F2Liz12!", adicionei essa string ao meu programinha em C# e não é que funcionou?

Download do projecto unconceal (belo nome :-P) para Visual Studio, para caso alguém esteja interessado em brincar mais com isto. Não esquecer os caminhos que estão hardcoded ao chamar a função tdes_decrypt().

Acho que para a próxima os senhores do Pplware deviam fazer concursos mais bem pensados, onde ganhe quem acha o resultado final, e não quem escolhe um produto à sorte que esteja no intervalo de preços dito inicialmente (dor de corno).

Um abraço e até à próxima!

13 comentários a “Como não ganhar um iPad 2”

  1. Simplesmente Fantástico !!!!! :)

    Feliz Natal

  2. Ricardo Ferreira diz:

    É com escárnio e repúdio que leio os comentários selectivos que são postados no pplware acerca do "vencedor" deste desafio.

    Onde selectivamente estão a tentar denegrir a imagem de uma pessoa que tentou de uma forma tecnologicamente avançada resolver o desafio imposto, a pessoa em questão utilizou conhecimentos de programação, web parsing, engenharia reversa e criptografia, e mesmo assim foi apelidado de batoteiro (belos tempos estes...)

    Para explicar e encerrar o argumento da batotice, batoteiros são aqueles que postaram de forma aleatória com vários registos diferentes, e acredito que alguém com o nível de conhecimento demonstrado o pudesse ter feito, mas preferiu seguir a via da integridade, para os leigos passo a explicar de como fazer batota, o conceito é simples até para os idiotas que escrevem sem saber, utilizando um serviço de anonimização como por exemplo o TOR(ou proxys abertas) e um script para fazer o parsing é simples de colocar nos comentários todos os produtos recolhidos (e fazer figas), visto que o website nem CAPTCHA têm para a validação dos comentários....

    Para além disso o concurso poderia ser alojado no random.org ou outra entidade independente para garantir a integridade que um tal senhor (Pedro Pinto) apregoa nos comentários, mas disso nada vi.

    Logo deduzo que não houve qualquer tentativa de manter a integridade e verticalidade do concurso, por muita areia que me atirem para os olhos seja em censura seja em comentários difamatórios a verdade está a vista de qualquer um com dois palmos de testa.

    O website(pplware) demonstra perfeitamente a quantidade de pseudo balelas, (que ainda tem muita sopa a comer para obterem as divisas de balelas) quando uma opinião que não vai de encontro ao que os administradores querem ler é atacada a bene placito e apelidada de batoteira e de errónea.

    Na minha sincera opinião quem ganhou com isto tudo foi a pessoa que se manteve passiva não atacou pessoalmente ninguém e demonstrou ao contrario dos pseudos balelas o carácter e domínio tecnológico.

    Com isto tudo tenho a dizer que o que li por parte dos administradores foi do mais tecnojento que alguma vez li.

    O Salazar já lá vai por isso aos responsáveis parem de ser inócuos e demonstrem carácter não censurando os comentários.

    Um Feliz Natal e boas entradas em 2012 (ah…como desejo para os administradores do pplware peçam integridade e capacidades técnicas que muita falta fazem...)

    Um bem-haja a todos os "verdadeiros" (eles sabem quem são...)
    Parabéns ao autor deste post pois claramente já é um vencedor...

    Absum!

  3. Parabéns pelo trabalho, apesar de não ser essa a ideia do concurso, mas todo esse "trabalho" merece recompensa.

    Envia um email com os dados completos para ser enviado um "brinde".

    João Olival

  4. João Campos diz:

    Acho que o Ricardo Ferreira recebeu um foguete pelo c. acima :D ao criticar o pplware e eles, como é apanágio, deram-lhe uma bofetada de luva branca :D ao oferecer um prémio pelo esforço do dono deste blog.

    Embora me pareça, pelo que li nos comentários, que o dono deste blog teve mau perder e foi levantar um boato bem à maneira "casa dos segredos" e tipicamente tuga, como disseram nos comentários, sobre a seriedade do site em questão (país de cultura miseravel).

    Segui atentamente este trabalho aqui descrito e gostei do método, pena que depois o autor se perdeu em mesquinhices.

    À parte disso... bom trabalho.

    Próspero ano de 2012
    J.Campos

    • @João Campos
      Concordo em absoluto! O trabalho está fantástico e fui um dos primeiros a aplaudir tal iniciativa e a reconhecer o trabalho do Pedro Oliveira.
      Agora daí a dizer que, e passo a citação: "Sempre ouvi falar mal do Pplware e da inteligência dos comentários, mas desta vez ate dei uma oportunidade a este desafio, pois julguei que se tratasse de um desafio possível a solucionar, mas sinceramente já vi que os prémios são para ficar na casa."
      Condeno e repudio tal afirmação, até porque o objectivo do passatempo não era sequer decifrar o que estava dentro do ficheiro mas sim ser uma garantia para os utilizadores que nada é manipulado. Posso ainda afirmar que neste momento não tenho sequer as respostas dos possíveis vencedores e nem faço a mínima ideia quem será o vencedor.Quarta-Feira passarei essa informação à OfficeLan e tal como o João já propus, quem quiser estar presente é só comparecer nas instalações da empresa.

  5. Caro Ricardo Ferreira,

    Cuidado com os comentários e com as insinuações.

    Pedro Pinto

    • Ricardo Ferreira diz:

      Caros amigos do alheio,
      O que esta em causa foram as insinuações de batotice e de censura de resto pouco me interessa se deram ou não brindes/prémios por mim bem os podem colocar nas cavidades.

      Atentamente
      Ricardo Ferreira

  6. Ricardo Félix diz:

    Caro Pedro Pinto,

    Como se justifica que após o excelente trabalho de resolução do vosso passatempo se premeie a aleatoriedade e, não te querendo chocar com insinuações que possas achar injustificadas ou infundadas, na minha opinião seja também premiado o 'culto da burrice' através do 'sorteio' entre quem acertou nas respostas com base apenas em probabilidades Bayesiana's.

    Acho que está na altura do peopleware mostrar que valoriza efectivamente a tecnologia e o seu uso, fora das palavras, mas também em acções concretas.
    Se possível acho que era de bom tom a peopleware justificar os comentários e acusações de "batotice" perante o que foi aqui apresentado.

    Despeço-me com amizade,
    Ricardo Félix

    • Viva Ricardo Felix,
      Eu pessoalmente acho que ainda não se percebeu qual era o objectivo deste passatempo em concreto. Para ganhar o iPad2 oferecido no Pplware o utilizador apenas poderá contar com a sorte do seu lado. Por mais tentativas efectuadas na descoberta do produto (que estava dentro do ficheiro), o utilizador ficará sempre dependente da sorte já que o sorteio do vencedor (tendo como domínio todos os utilizadores que acertaram no nome do produto) será realizado pela OfficeLan e de uma forma aleatória. Como profissional na área da segurança informática, dou muito valor ao trabalho realizado pelo Pedro Oliveira e nunca afirmei que tal era batotice!!! Mesmo que eventualmente ele conseguisse descodificar a cifra, mais uma vez estaria dependente da sorte no sorteio final.

      Alguns utilizadores questionam? Então porque disponibilizar o ficheiro? Eu respondo, o ficheiro garante que não houve qualquer tipo de manipulações de informação, o nome do produto contido no ficheiro não mudou durante a realização do passatempo.

      Como já referi, a escolha do vencedor não será responsabilidade do pplware, será feito pela própria empresa e em espaço aberto para quem pretenda assistir. O pplware apenas enviará as respostas de todos os leitores e as mesmas podem ser confirmadas no artigo do passatempo.

      Mais uma vez digo, gostei da exposição feita pelo Pedro Oliveira mas condeno severamente as afirmações que fez posteriormente !!!

      Quanto a esta afirmação"
      Acho que está na altura do peopleware mostrar que valoriza efectivamente a tecnologia e o seu uso, fora das palavras, mas também em acções concretas... Estamos a pensar no futuro lançar alguns desafios na área da segurança informática. Estamos a pensar bem no tipo de passatempo para que depois também não nos venham acusar que incentivamos ao hacking...pirataria...cracking...nada disso.. Como exemplo do Pedro oliveira, as tentativas na descoberta do código levaram-no a aprender outros conceitos e a "brincar" com a criptografia...e será nesse sentido que pretendemos fazer um passatempo.

      Um abraço e aproveito para desejar umas boas Festas
      Pedro Pinto - Pplware

  7. Pedro Caetano diz:

    Muito boa tarde aos presentes,

    Como já foi possível notar em situações anteriores, o pplware é um site medíocre que vive de ir buscar notícias a outros sites internacionais, tirar uns printscreens e 'postar' o artigo como original.
    No meu entender isto é triste, mas já é algo com que os leitores da blogoesfera nacional já estão habituados.
    O que eu não compreendo é a razão de criarem um concurso com o objectivo de criar uma torrente enorme de visitas (quantas vezes pagaram o ipad2 em visitas?) em que o propósito é cativar o tipo que está a polir esquinas o dia todo para vir colocar um reply random... (a maior parte das pessoas nem reparou na informação que o artigo estaria na casa dos 50 - 100 euros)

    Parece-me ainda que o próprio staff não estava consciente que o utilitário que gerou o .xcon é fraco, e ao invés de premiarem o trabalho de reverse do algorítomo ficaram ofendidos por alguém ter uma abordagem disruptiva ao problema e não ir tentar a sua sorte.
    Apelidarem o método CORRECTO de encontrar a solução de um problema de batota, é falta de intelecto.

    Espero não ter posto sal na ferida, mas as verdades têm que ser ditas.

    • João Campos diz:

      Pedro Caetano, eles têm defeitos, alias quem não os tem, agora isso que dizes é mentira e a prova está no trabalhoq ue desenvolvem. São claramente os melhores e testam tudo o que têm apresentado, eu próprio já recorri a vários pedidos de ajuda e nunca o negaram, sabem do que falam.

      Esse teu testemunho é azia verdade? Nota-se bem.

      Sigo-os há uns 2... quase três anos... e desde então em português nunca mais vi nada tão completo: têm do melhor em software para Windows, com sgreenhots deles, testado por eles (ao contrario doq ue dizes), têm do melhor que se faz em Linux, Mac têm grandes guias testados e com explicações passo a passo... cosia que não vês por aí... notícias em primeira mão e muita boa informação e mais... repara que nos artigos deles têm a fonte, vai ver ao JN, DN, SIC, TVI, SOL, TEK, SAPO, DE se no final dos artigos tens a fonte.

      Eu em relação a este passatempo, também participei :D sim com o meu segundo e terceiro nome... não acertei... infelizmente... mas ao contrario de alguns não tenho mau perder.

      Repara que este espaço aqui, nem era conhecido, foi à conta do pplware que muta gente o conheceu, eu inclusive.

      Acho que a honestidade, que tu não tiveste, deverá ser ponto de honra... e eu também queria um iPad 2 :D ui se queria.... apostoq ue tu também concorres em todos... :D

  8. João Ratão diz:

    O que é um ipad ?

  9. batman diz:

    TL;DR --> in this thread: DRAMA!

Comentar

widgeon
widgeon
widgeon
widgeon