terça-feira, 25 de fevereiro de 2014

CUPP.py: veja por que você não deve usar senhas fracas

Senhas, senhas e mais senhas. Já parou para se perguntar quantas senhas você têm para gerenciar? Senha de bancos, senhas de sistemas na empresa, senhas de serviços on-line. Meu software gerenciador de senhas, possui armazenado até a data de hoje (fevereiro/2014), 232 senhas de diferentes serviços. Simplesmente impossível de lembrar e gerenciar tudo isso, sem o auxílio de um gerenciador, mas afinal, é pra isso que existem os gerenciadores de senhas, certo? Para que nós não precisemos ficar decorando senhas ou anotando-as em locais inseguros. Lembre-se que o processo da segurança tem disso: a segurança diminui a facilidade de uso. É chato ter de gerenciar diferentes senhas? É, claro que é; trabalhoso inclusive. Quem me dera ter, por exemplo, uma única senha universal que desse acesso a todos os meus serviços. Bastaria eu me lembrar dessa senha única para poder logar nos meus 232 serviços distintos. Porém se alguém descobrisse essa senha, também teria acesso a todos as minhas aplicações e creio que a essa altura você já tenha entendido o equívoco que é utilizar a mesma senha para serviços diferentes, certo?.

Conforme o criptólogo e especialista em segurança Bruce Schneier, o conceito de senhas é baseado num oxímoro. A ideia é ter uma palavra randômica fácil de lembrar para  servir de autenticação. Infelizmente, se é fácil de lembrar, como “Cristiano” por exemplo, então não deve ser algo randômico. Se for randômico, como “TRsdj-dsi18*”, então certamente não é muito fácil de lembrar. Um conceito muito interessante que Schneier aborda no seu livro "Secrets & Lies" (que em breve colocarei na seção Livros deste blog), é justamente sobre autenticação; o quanto nós, seres humanos, somos especialistas nesse processo, afinal, autenticamos pessoas e coisas diversas vezes por dia. Fazemos isso desde pequenos, nosso cérebro é treinado para isso, somos experts. Se virmos uma pessoa das nossas relações na rua, usando barba, óculos escuros e chapéu, ainda assim somos capazes de reconhecê-la facilmente (motivo pelo qual super-heróis usam máscara e todos os amigos do Superman são perfeitos idiotas ;o)). Ao atender o telefone, é bem possível que no próprio alô já reconheçamos quem está do outro lado da linha desde que, obviamente, seja uma pessoa do nosso convívio.

Agora perceba que todo esse nosso poder de autenticar pessoas que viemos desenvolvendo desde o nosso nascimento é transferido para o computador através da simples combinação: "usuário x senha". Não é suficiente. Quando se entra num sistema com as informações de login, estão acontecendo dois processos distintos. O primeiro é o de identificação, ou seja, você diz ao computador quem você é através do seu nome de usuário. O segundo processo é o da autenticação propriamente dita, ou seja, você prova para o computador que você realmente é quem diz ser ao informar sua senha. Você consegue notar a fragilidade dessa lógica? Uma senha é algo que o usuário sabe e isso pode ser transmitido à qualquer outra pessoa. Se o usuário for desleixado o suficiente, essa informação pode ser inclusive roubada. O fato de alguém ter se logado num sistema especificando um usuário e uma senha, não significa necessariamente que aquela pessoa tinha permissão de uso ao sistema e sim que sabia de credenciais corretas, mas esse papo de autenticação ficará para outro post pois têm bastante pano pra manga, nesse post vamos manter o foco nas senhas. ;o)

Por mais insuficiente que seja a combinação usuário/senha os usuários sempre darão um jeitinho de piorar a situação: se você os deixar escolher uma senha sem qualquer critério, eles automaticamente escolherão uma senha fraca, como “internacional” ou “gremio”. Se você os forçar a escolher uma senha forte com letras maiúsculas, minúsculas, números e símbolos, eles irão anotar num papel e esconder embaixo do teclado. Se você os pedir para alterar, eles alterarão para a mesma senha que usavam no mês passado. Junte-se isso ao fato de usarem a mesma senha para diversos serviços diferentes e está feito o cenário do caos da segurança digital. Afinal, se até o Comando Aéreo Estratégico dos EUA mantiveram por 20 anos os códigos de lançamento dos mísseis nucleares como "00000000", o que impediria o usuário mediano de usar senhas fracas? Ah sim, "senhas fracas". Se você utiliza computadores há algum tempo, certamente já ouviu falar que não deve criar "senhas fracas" certo, mas o que isso quer dizer? Sem querer reinventar a roda, senhas fracas podem ser definidas como:

- Nome dos pais;
- nome de filhos;
- nome de amigos; 
- sobrenomes;
- datas de aniversário;
- números de telefone;
- números de documentos (RG, CPF, etc);
- placas de automóveis;
- nomes de agremiações esportivas;
- nome de animais de estimação;
- conjuntos musicais;
- artistas preferidos;
- nome da empresa onde trabalha;
- palavras contidas em dicionários (de qualquer idioma, mesmo que de trás pra frente) e etc;

Veja que esses são apenas alguns exemplos, essa lista não se encerra aqui. Para facilitar ainda mais o entendimento, vejamos um exemplo prático do porque não se deve utilizar esse tipo de senha. Para isso, utilizaremos a ferramenta CUPP.py disponível no Backtrack para criar uma lista de senhas, também conhecida como "wordlist". Essa lista de senhas poderá ser utilizada com qualquer ferramentas de quebra de senhas por ataque de dicionário. O CUPP (Common User Passwords Profiler) é a mesma ferramenta que utilizamos no post sobre quebra de redes sem fio WPA/WPA2 e foi desenvolvida por Muris Kurgas. Essa é sua telinha inicial:


Imagine que temos um usuário chamado João que, ao ser solicitado para criar uma senha, definiu-a com o apelido do seu filho junto da sua data de nascimento: "pedrinho2011". Como nosso usuário sabe que essa não é uma senha forte e já ouviu falar que uma gama maior de caracteres deve ser utilizada para compor suas senhas, ele decidiu trocar algumas letras por números, para dificultar o trabalho de um possível invasor. Sua senha então ficou: "P3dr1nh02011" (João alterou o "e" por "3", o "i" por "1" e o "o" por "0"). João então testou a referida senha no site "How Secure is My Password", e teve a confirmação de que essa era uma senha forte, afinal, um computador Desktop normal levaria em torno de 25.000 anos para quebrá-la.


Porém esse cálculo é feito considerando-se o método de força bruta. Num ataque de dicionário, uma wordlist será utilizada para tentar quebrar a senha do João, ou seja, tudo dependerá da qualidade da wordlist do atacante. O CUPP.py nos permitirá criar uma wordlist personalizada, sempre levando em consideração que nosso usuário foi tolo o suficiente para utilizar informações pessoais para compor uma senha. Nesse caso, estamos supondo também que o atacante pode ser uma pessoa próxima a João ou mesmo que tenha descoberto diversos dados pessoais através de currículos coletados na Internet, redes sociais ou mesmo através de engenharia social.

Ao rodar o Cupp com o parâmetro "-i", o programa executará no modo interativo, solicitando as informações do alvo para o atacante. Veja na imagem abaixo que foram solicitados o nome do alvo, seu sobrenome, apelido e data de nascimento, informações sobre o cônjuge do alvo, informações sobre o filho do alvo, nome do animal de estimação e nome da empresa onde trabalha.


Além disso, foi questionado se era necessário adicionar palavras específicas sobre a vítima. No exemplo, considerei que João é um gremista fanático e adicionei palavras como "gremio", "futebol", "zeroberto" e "barcos". O programa questiona se é necessário inserir caracteres especiais, ao qual eu confirmei. O programa questiona se é necessário adicionar números randômicos ao final das palavras, o que eu também confirmei. Por último, o programa questiona se deve ser utilizado o modo "Leet", ou seja, substituir letras por números ("leet" vira "1337", por exemplo), o que eu também confirmei. O resultado, é uma wordlist com 483.422 senhas sugeridas pelo programa. Entre elas, veja a senha que ele sugere abaixo:


Se este arquivo fosse utilizado como wordlist num ataque de dicionário contra o usuário João, certamente sua senha seria quebrada. Então novamente, caso ainda não tenha ficado claro o suficiente: NÃO UTILIZE ESSE TIPO DE SENHA!!!! NÃO COMPONHA SENHAS USANDO INFORMAÇÕES PESSOAIS. São extremamente fáceis de serem quebradas e existem ferramentas específicas para isso.

É importante notar que o CUPP possui um arquivo de configuração no seu diretório corrente, chamado cupp.cfg. Nele, é possível configurar os caracteres utilizados na opção "leet". Você pode por exemplo, definir que a letra "a" deve ser substituída por "4" ou por "@" ou mesmo por ambas, como mostra a figura abaixo:


Também é possível configurar quais caracteres especiais devem ser utilizados, comprimento mínimo e máximo que devem ser utilizados para compor as senhas, entre outras opções que merecem atenção.


Portanto permanece o alerta: evite criar senhas fracas e, se você utiliza informações pessoais nesse processo, saiba que essa também pode ser considerada uma senha fraca. Como criar senhas fortes? Dê uma olhadinha aqui.
Para finalizar, outra informação importante que devemos atentar refere-se ao ato de anotar senhas em papel, e aqui, diversos especialistas de segurança da informação poderão tirar-lhe a vida se souberem que você adota essa prática (inclusive eu iria, até pouco tempo atrás ;o)). O mesmo Schneier, defende que a situação ideal, seria transformar o processo de autenticação única num processo de autenticação dupla. A autenticação única, com usuário e senha a qual estamos acostumados, baseia-se em algo que o usuário sabe. Se o usuário escrever parte da senha num papel ele estará transformando algo que ele sabe (a senha), em algo que ele tem (a folha de papel). Note que o efeito é o mesmo do que ter um cartão bancário onde, para retirar dinheiro você precisa informar a senha (algo que você sabe) e passar o cartão magnético (algo que você tem).  É claro que, para essa lógica funcionar, a parte da senha anotada no papel deve ser grande e aleatória o suficiente para tornar essa senha segura. Na próxima vez que o usuário logar, estará usando uma autenticação dupla, especificando algo que ele sabe e utilizando algo que ele tem guardado na carteira.

Suponha por exemplo que vamos utilizar a senha criada nesse exemplo: (Meu vizinho João, 87, gosta bastante de limonada. = MvJ,87,gbdl.). A essa senha, vou adicionar caracteres aleatórios: "@Mg7F-097DsLp-12". Alteraria então minha senha do Twitter (apenas um exemplo de serviço) para: "MvJ,87,gbdl.@Mg7F-097DsLp-12", sendo que "MvJ,87,gbdl." é a parte que eu sei e "@Mg7F-097DsLp-12" é a parte que levo anotada na carteira. Segundo o "How Secure is My Password", são necessários 252 undecilhões de anos para quebrar essa senha (me arrisco a dizer que ela é segura ;o)):


Note que mesmo com essa técnica, alguns problemas de segurança permanecem, pois não adianta fazer todo esse processo, se você "emprestar" algo que você sabe (senha) e algo que você tem (o papel com a informação aleatória) para outras pessoas logarem por você (mais ou menos o que você faz quando está com preguiça e dá seu cartão do banco e senha para outras pessoas comprarem coisas por você na padaria, tsc tsc tsc). Ainda assim, é possível tornar esse processo bem mais seguro. Esse é certamente um bom sistema pessoal de autenticação, desde que a segunda parte da senha esteja guardada com segurança. Mesmo que alguém consiga visualizar a informação escrita no papel, terá apenas um pedaço da senha. Como alternativa eu recomendaria o uso de programas como o KeePass, que podem ser instalados tanto no PC quanto em smartphones. Ao invés de guardar essa informação na carteira, você pode guardá-la com criptografia num programa no seu smartphone. Ainda assim, muito interessante a ideia de levar parte da senha na carteira. Afinal, que outro lugar melhor para guardar essa informação do que no mesmo local onde você guarda seu dinheiro, sua identificação, seus cartões de crédito e etc? Grande Schneier.

P.S.: esse post demonstra apenas um tipo de ataque à senhas dos usuários. Existem diversas outras maneiras de se chegar ao mesmo ponto e esse post nem de longe pretende esgotar o assunto.

t+

Cristiano
"A grandeza não consiste em receber honras, mas em merecê-las." - Aristóteles 

Nenhum comentário:

Related Posts Plugin for WordPress, Blogger...