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

Penulis : Megabyte ~ Sebuah blog yang menyediakan berbagai macam informasi

Artikel Portando cualquier programa GNU/Linux a Android ini dipublish oleh Megabyte pada hari martes, 29 de enero de 2013. Semoga artikel ini dapat bermanfaat.Terimakasih atas kunjungan Anda silahkan tinggalkan komentar.sudah ada 0 komentar: di postingan Portando cualquier programa GNU/Linux a Android
 

0 comentarios:

Publicar un comentario