در سال 1998 محقق امنیتی Salvatore Sanfilippo (ایشون توسعه دهنده hping, redis, dump1090, Kilo و کلی پروژههای دیگه هستن)، یک روش جدید رو برای اسکن (scan) یک ماشین هدف ارائه داد. این مِتُد به نام idle scan شناخته میشه (علت نام گذاری رو جلو تر توضیح میدیم).
برای اسکن TCP یک Port روی یک ماشین ابتدا باید یک بسته SYN فرستاده بشه و اگر در پاسخ یک بسته SYN-ACK دریافت بشه به این معنی هست که این درگاه (Port) باز هست.
مشکل برای مهاجمین این هست که در این روش آدرس IP ماشین مهاجم مشخص هست و این میتونه یک ردپا از مهاجم باشه یا حتی باعث فیلتر شدن توسط firewall بشه. روشهایی برای فرار از این مشکل توسعه داده شده، مثلا مهاجم بصورت اتفاقی (random) شروع میکنه به فرستادن بستههای مشابه با IP جعلشده (spoofed) این روش اسکن که با نام scan with decoy هم شناخته میشه، باعث میشه ماشین هدف تعداد زیادی از آدرسهای IP با درخواستهای مختلف ببینه که بستههای مهاجم بین این بستهها پخش شده. ولی بازهم این روش اسکن نیازمند برقراری ارتباط بین مهاجم و ماشین هدف هست.
در روش idle scan لازم نیست مهاجم مستقیم با ماشین هدف ارتباط برقرار کنه و حتی یک بسته هم جابهجا نمیشه. در واقع این روش با استفاده از یک side channel هوشمندانه از یک ماشین سوم بالقوه (Zombie) استفاده میکنه تا ماشین هدف رو اسکن کنه.
هرچند این روش نسبت به روشهای دیگه پیچیدهتر هست ولی با دونستن مقدار کمی TCP/IP میشه متوجه سازوکار اون شد. میدونیم که:
- اگه به یک Port روی یک ماشین، یک بسته (session establishment) SYN ارسال کنیم اون ماشین اگه Port باز باشه (session request acknowledgment) SYN-ACT میفرسته و اگه بسته باشه یک بسته RST (reset) میفرسته.
- اگه یک ماشین یک بسته SYN-ACT ناخواسته دریافت کنه (در واقع SYN فرستاده نشده و Session ایجاد نشده باشه)، اون بسته رو با یک RST پاسخ میده.
- تمام بستههای IP دارای یک شناسه هستند (IP ID) که این شناسه توسط سیستمعامل در هر بسته تعیین میشه.
با دونستن این موارد میریم سراغ سازوکار idle scan
سازوکار Idle Scan
برای اجرای این روش اسکن نیاز به یک ماشین سوم هست که ترافیک کمی داره و همچنین از یک سیستم تعیین IP ID افزایشی و قابل حدس استفاده کنه. علت رو جلو تر متوجه میشیم.
مراحل این اسکن به این صورت هست:
- در ابتدا مهاجم مقدار IP ID کنونی ماشین سوم (Zombie) رو میگیره و ذخیره میکنه. این کار به سادگی با فرستادن یک بسته SYN-ACT و دریافت RST و بررسی مقدار IP ID انجام میشه.
- توی این مرحله مهاجم بسته SYN رو به Port مورد نظر روی ماشین هدف ارسال میکنه با این تفاوت کنه آدرس IP مبدا رو جعل میکنه و آدرس Zombie رو قرار میده در نتیجه پاسخ ماشین هدف به ماشین سوم ارسال میشه.
- اینجا مهاجم به مقدار کافی صبر میکنه و سپس مرحله یک رو تکرار میکنه.
حالا مهاجم دو مقدار مختلف IP ID داره که یکی مربوط به قبل از ارسال بستههای مربوط به اسکن میشه و دومی مربوط به بعد ارسال.
در ابتدا گفتیم که برای اجرای این روش نیازمند یک ماشین هستیم که مقدار IP ID رو افزایشی تغییر بده و همچنین ترافیک کمی داشته باشه. توی این مثال فرض کنید ماشین سوم هیچ ترافیکی نداره ( در نتیجه بستهای ردوبدل نمیشه و مقدار IP ID تغییر نمیکنه).
با این شرایط میتونیم با مشاهده تغییرات IP ID ماشین سوم وضعیت Port روی ماشین هدف رو تعیین کنیم. برای درک بیشتر به تصاویر زیر دقت کنید:
the attacker, the zombie, the target.
توی این مثال در مرحله اول مهاجم بسته SYN-ACT رو به Zombie ارسال کرده و در بسته RST پاسخ مقدار IP ID که 31337 هست رو ذخیره کرده. تو مرجله بعد یک بسته SYN با آدرس جعل شده Zombie به ماشین هدف میفرسته. و ماشین هدف هم بسته SYN-ACT رو به zombie میفرسته (به علت آدرس جعل شده در بسته SYN). اینجا Zombie یک بسته SYN-ACT ناخواسته رو دریافت میکنه و اون رو با RST پاسخ میده (به علاوه مقدار IP ID رو هم یک مقدار افزایش میده که میشه 31338). مهاجم بعد از صبر کردن به اندازه کافی باز هم مرحله یک رو تکرار میکنه و IP ID دوم رو با اولی مقایسه میکنه. اگه مقدار دوم 2 تا بیشتر شده باشه مهاجم متوجه میشه که یک بسته RST توسط zombie به ماشین هدف ارسال شده و این به این معنی هست که Port مورد نظر روی ماشین هدف باز هست.
در دو مثال بالا هم عینا مراحل مثال قبلی رو میبینیم با این تفاوت که Port مورد نظر یا بسته (closed) هست یا filtered (به این معنی که توسط فایروال فیلتر شده و پاسخی فرستاده نشده). در نتیجه هر دو مقدار IP ID دوم یک اختلاف با مقدار اول داره و این باعث میشه که مهاجم نتونه بین Portهای بسته و فیلتر شده تمایزی قائل بشه. توجه کنید که مقدار IP ID اگه random یا همیشه صفر (all zeros) باشه ماشین مورد نظر قابلیت استفاده به عنوان zombie رو نداره. از مشکلات دیگه این روش این هست که دهها برابر کند تر از یک اسکن عادی هست.
همونطور که دیدیم مهاجم بدون فرستادن یک بسته با آدرس IP خودش تونست Port Scanning رو روی ماشین هدف انجام بده.
علت نامگذاری این روش هم این هست که در این روش از یک ماشین سومی استفاده میشه که ترافک کمی داره و در حالت idle هست. در مثالهای بالا برای سادگی، فرض رو بر این گرفتیم که zombie هیچ ترافیکی نداره، اما در واقع zombie میتونه ترافیک داشته باشه ولی مقدار کمی باشه. در این صورت مهاجم برای مدتی zombie رو زیر ذرهبین قرار میده تا یک نمودار از مقدار IP ID تهیه کنه. بعد از این، مهاجم با توجه به متوسط مقدار افزایشی IP ID ماشین zombie شروع میکنه به ارسال n بسته به یک Port رو ماشین هدف. این باعث میشه که نمودار مقدار افزایشی IP ID ماشین zombie به صورت چشمگیری بالا بره و مشخص کنه که Port مورد نظر باز هست.
انجام idle scan در دنیای واقعی
سازوکار این اسکن برای پیاده سازی کار سادهای نیست اما ابزارهای scanning شبکه مثل nmap این روش رو به شیوه بسیار قابل قبولی پیاده سازی کردن و مهاجم میتونه به سادگی این اسکن رو انجام بده.
در ابتدا برای اسکن یک ماشین بالقوه میتونیم از یک اسکریپت ipidseq در برنامه nmap استفاده کنیم.
# nmap --script ipidseq 5.144.130.203 -n -Pn
Starting Nmap 7.80 ( https://nmap.org ) at 2020-05-24 10:06 +0430
Nmap scan report for 5.144.130.203
Host is up (0.036s latency).
Not shown: 47 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
3389/tcp open ms-wbt-server
Host script results:
|_ipidseq: Incremental!
Nmap done: 1 IP address (1 host up) scanned in 2.26 seconds
همونطور که میبینید اسکریپت تشخیص داد که مقدار IP ID ماشین مورد نظر افزایشی هست و با احتمال بالایی میشه از اون به عنوان یک zombie استفاده کرد.
سپس با استفاده از این دستور میشه idle scan رو با zombie مورد نظر انجام داد.
# nmap -Pn -p- -sI 5.144.130.203 www.riaa.com
Starting Nmap 7.80 ( https://nmap.org ) at 2020-05-24 10:12 +0430
Idlescan using zombie 5-144-130-203.static.hostiran.name (5.144.130.203); Class: Incremental
Nmap scan report for 208.225.90.120
(The 65524 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
25/tcp open smtp
80/tcp open http
111/tcp open sunrpc
135/tcp open loc-srv
443/tcp open https
1027/tcp open IIS
1030/tcp open iad1
2306/tcp open unknown
7937/tcp open unknown
7938/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 4218.73 seconds
همونطور که میبینید حدود 1 ساعت زمان برد تا یک اسکن کامل روی هدف انجام بشه. فلگ (flag) -p برای تعیین port ها برای اسکن هست و مقدار – به این معنی هست که تمام 65535 درگاه اسکن بشه. همچنین فلگ -Pn به nmap میگه ماشین هدف رو ping نکنه و اون رو alive در نظر بگیره.
برای اطلاعات بیشتر از الگوریتم پیاده شده توسط nmap میتونید لینک زیر رو هم بررسی کنید:
مطالبی که می نویسم صرفا خلاصه مطالعه RFC ها و کتابهای معروفه که همتون میشناسید. و هیچ کدوم از این ها کشفیات خودم نبوده و نیست. خوشحال میشم نقد کنید و اگه موردی از نظرتون درست نبود بهم بگید.
راه ارتباطی با من معمولا aggr3ssor@protonmail.com هست و در توییتر با 0xc0d میتونید منو پیدا کنید.
سلام. مطلب بسیار آموزنده بود. سپاسگزارم بابت به اشتراک گزاری این مطاب مفید.
آیا راهی هست تا IP ID سیستم خودمون رو به گونه ای تغییر بدیم که Incremental نباشه تا به راحتی به عنوان طعمه ازش استفاده نشه؟
عالی دمتون گرم خیلی روان و ساده مطلب رو بیان کرده بودین ادامه بدین