در این مقاله ۴ قسمتی میخوانیم که چگونه میتوانیم یک TCP پراکسی بسازیم. از این نوع پراکسی برای لاگ کردن، خواندن و بررسی ترافیک TCP، نه فقط http، اپلیکیشن بخصوصی که روی موبایل هوشمند نصب کردهایم استفاده میکنیم.
پراکسی چییست؟
پراکسی یک واسطه است که درخواست یا پیام را از طرف کلاینت به سرور مقصد ارسال میکند. برای مثال اگر در حالی که از پراکسی استفاده میکنید، در موتور جستجوی گوگل عبارت «چگونه میتوانم در بازی پوکر تقلب کنم» را جستجو کنید. شما مستقیم از گوگل درخواست نمیکنید و به جای شما پراکسی از گوگل این سوال را میپرسد، و جواب را میگیرد و به شما میدهد. گوگل در این حالت نمیداند چه کسی پشت پراکسی است.
از پراکسیها به طور گسترده در حریم شخصی، دور زدن سانسور و فیلتر، فیلتر محتوا، کش کردن، و تستهای امنیتی استفاده میشود.
در این آموزش نوع دیگری از پراکسی به نام مرد میانی را میسازیم. پراکسیهای مرد میانی معمولا توسط پنتسترها (نفوذگرهای امنیتی) برای خواندن، لاگ کردن و ویرایش کردن دادههایی که بین کلاینت و سرور از راه دور منتقل میشوند، مورد استفاده قرار میگیرند.
فرض کنید شما میخواستید از پراکسی MITM -که روی لپتاپتان اجرا میشود- برای بررسی ترافیک (ارسالی و دریافتی) اپلیکیشن دوستیابی استفاده کنید. در اینصورت ترافیک موبایلتان از پراکسی MITIM به سرور فرستاده میشود. بدین ترتیب هر درخواستی که اپلیکیشن دارد، اول به پراکسی و سپس به سرور اپلیکیشن دوستیابی ارسال میشود. جوابی که سرور اپلیکیشن میدهد نیز اول به پراکسی MITM و سپس به کلاینت منقل میشود. در این حالت میتوانید اطلاعاتی که ارسال و دریافت میشوند را لاگ کنید، بخوانید و بررسی کنید. به همین دلیل اسم این نوع پراکسی، مرد میانی است.
۲- طراحی پراکسی
این پراکسی سه مولفه دارد که هر کدام مساله متفاوتی را حل میکنند:
- یک سرور DNS جعلی برای فریب موبایل هوشمند تا ترافیک TCP را به پراکسی ما ارسال کند.
- یک سرور پراکسی برای مدیریت جریان داده بین موبایل و سرور از راه دور.
- یک مرجع صدور گواهی جعلی برای مدیریت رمزنگاری TLS بین موبایل و پراکسی.
این آموزش به ۴ قسمت تقسیم شده است. این قسمت اول ، نمای کلی از طراحی پروکسی و معرفی پروتکل ها و تکنیک هایی که ما استفاده خواهیم کرد ، ارائه می شود. سه قسمت آخر هر کدام نحوه ساخت یکی از اجزای فوق را توصیف می کنند.
۲.۱ – ساخت یک سرور DNS جعلی
با ساخت یک سرور DNS جعلی شروع میکنیم تا موبایل ترافیک اینترنتش را به سمت پراکسی هدایت کند.
ما فکر میکنیم که ارسال دادهها در اینترنت با استفاده از نام میزبانی (Hostname) صورت میگیرد. برای مثال هنگامی که در گوگل جستجو میکنیم، درخواست واقعا به سمت google.com ارسال میشود. اما مسیریابها دادهها را به آدرس IP سرور گوگل ارسال میکنند نه نام میزبانی. نام میزبانی فقط راهی برای دستیابی راحت و آسان به وبسایتها برای کاربران است، و اگرنه نامهای میزبانی هیچ معنیای برای بکبن اینترنت ندارند، و آنها فقط با آدرسهای IP کار میکنند.
دستگاههایی که به اینترنت متصل میشوند، مانند موبایلهایمان، ترجمه یا تغییر نام میزبانی به آدرس IP را از طریق پروتکل DNS انجام میدهند. بیشتر از ۲۰ سرور DNS عمومی و رایگان وجود دارند که پایگاه دادهای از تمام نگاشتهای نام میزبانی به آدرس IP را نگاه میدارند. برای نمونه آدرس IP سرور DNS گوگل 8.8.8.8 است.
فرض کنید از وبسایت koneshtech.academy بازدید میکنید. دستگاه شما قبل از ارسال درخواست به سرور مقصد، نام میزبانی (koneshtech.academy) را به آدرس IP متعلق به آن تغییر میدهد تا برای بکبن یا ستون فقرات اینترنت قابل فهم باشد. این باعث ثبت یک درخواست DNS به سرور DNS میشود، تا نام میزبانی را به آدرس IP آن تغییر بدهد. هنگامی که درخواست DNS، پاسخ که همان آدرس IP است را برگرداند، مرورگرتان یک درخواست http برای آدرس IP مشخص شده ارسال میکند.
شما میتوانید آدرس IP سرور DNS را در تنظیمات موبایل ببینید، و آن را به سرور مورد نظرتان تغییر دهید.
۲.۱.۱ – سرور DNS جعلی چیست؟
سرور DNS چیز بخصوصی ندارد. فقط یک سرور است که به درخواستهای DNS روی UDP درگاه ۵۳ گوش میکند و پاسخ میدهد. در واقع میتوانیم روی لپتاپ خودمان یک سرور DNS جعلی بسازیم و به موبایل بگوییم که بجای سرور DNS گوگل از این سرور استفاده کند. حتی میتوانیم سرور DNS جعلی را طوری برنامهریزی کنیم که به درخواستهای DNS هر پاسخی که ما میخواهیم بدهد. فرض کنید یک درخواست DNS ثبت شده، به منظور بازدید از وبسایت x.com، اگر بخواهیم میتوانیم با استفاده از سرور DNS جعلی به این درخواست یک پاسخ اشتباه بدهیم که در نهایت کاربر به وبسایتی به ظاهر شبیه آنچیزی که انتظار دارد اما روی لپتاپ ما هدایت شود.
برای اینکار و دریافت دادههایی که تغییر مسیر دادهاند نیاز به راهاندازی سرور دوم در لپتاپمان داریم. این سرور پراکسی واقعی خواهد بود که مسئول دریافت دادهها از موبایلتان است; خواندن و نوشتن این دادهها تا ما بتوانیم بررسیشان کنیم; و در نهایت این دادهها را به سمت مقصد اصلیشان هدایت میکند.
۲.۱.۲ – چرا نمیتوانیم کاری که Burp انجام میدهد را انجام دهیم؟
پراکسیهای http/s مانند Burp نیاز به راهاندازی سرور DNS ندارند، پس چرا TCP پراکسی نیاز به همچین سروری دارد؟
جواب کوتاه این است که این دو پروتکل با هم متفاوت هستند، اگر بخواهیم ترافیک http/s موبایل را بررسی کنیم، بله میتوانیم همچنان از پراکسیهایی مانند Burp استفاده کنیم، اما هنگامی که بخواهیم ترافیک TCP را بررسی کنیم مجبور به راهاندازی سرور DNS شخصی میشویم.
۲.۲ – سرور پراکسی
دومین قسمت این پراکسی ما خود سرور پراکسی است که روی لپتاپ شما اجرا میشود. این سرور با کمک سرور جعلی DNS، ترافیک موبایل را میگیرد و سپس به مقصدی که باید ارسال میکند، و پاسخی که اپلیکیشن مقصد ارسال کرده است را به موبایل هدایت میکند.
مشکل اصلیای که باید حل کنیم این است که مطمئن شویم، سرور پراکسی میداند که ترافیک موبایل را به کدام سرور راه دور باید ارسال کند. سرورهای پراکسی به خودی خود نمیدانند که ترافیکی که دریافت کردهاند را به کجا باید ارسال کنتد، باید به آنها گفته شود.
تصور کنید میخواهید با دوستتان شام بخورید. برای اینکار باید به او پیام بفرستید که «آیا مایل است امشب با یکدیگر شام بخورید؟». حال فرض کنید که یک دستیار دارید، که مانند پراکسی برای تمام پیغامهای شماست. شما یک پیغام برای او ارسال میکنید، و دستیارتان از طرف شما این پیغام را برای تمام دوستان و دشمنانتان ارسال میکند. اگر برای او پیغام «آیا مایل است امشب با یکدیگر شام بخورید؟» را ارسال کنید، آنها نمیدانند که این پیغام را باید به چه کسی ارسال کنند. در نتیجه احتمالا آن پیغام را پاک میکنند که گویی چیزی دریافت نکردهاند.
روشهای زیادی برای حل این مشکل پراکسی وجود دارد. میتوانید به ابتدای پیغام عبارت «بفرست به : شماره تلفن بخصوصی» را اضافه کنید.یا میتوانید قانونی اضافه کنید که تمام پیغامهای دعوت به شام به مادرتان ارسال شوند.
اگر این پراکسی از نوع http/s بود، این مشکل را نداشتیم، اما در مورد پراکسیهای TCP باید این مشکل را حل کنیم. برای حل این مشکل باید نام میزبانی (hostname) را در پراکسی خود hardcode کنیم، و به پراکسی بگوییم دادههایی که دریافت میکند را به این نام میزبانی ارسال کند. مانند اینکه به دستیار خود بگویید تمام پیغامهای امروز را به دوستتان، نام مشخص دوستتان، ارسال کند. شما قرار است از پراکسی TCP خود برای بررسی ترافیک یک اپلیکیشن استفاده کنید. این اپلیکیشن بخصوص قرار است دیتاهای خود را به یک hostname مشخص ارسال کند.
ما میتوانیم با نگاه کردن به لاگهای سرور DNS جعلیمان، لیست نامهای میزبانانی که موبایلمان میخواهد به آنها داده ارسال کند را ببینیم. سپس با حدس و گمان میتوانیم نام میزبانیای که برایمان قابل توجه است را پیدا کنیم. سپس این نام میزبانی را در پراکسیمان hardcode میکنیم، و به سرور پراکسی میگوییم تمام دادههایی که از موبایل دریافت میکند را به سمت این hostname ارسال کند.
توجه داشته باشید که سرور DNS جعلی را باید طوری پیکربندی کنیم تا فقط ترافیک پراکسیای که برای همان نام میزبانی در نظر گرفته شده است را ارسال کند. برای بقیه hostnameها سرور DNS جعلی باید یک درخواست واقعی DNS به سرور DNS واقعی ارائه دهد و پاسخ را به موبایل ارسال کند. در نتیجه موبایل با دور زدن پراکسی ما، تمام ترافیک این hostnameها را به مکان درستی ارسال میکند. اگر اینکار را نکنیم، پراکسی ما دادههای حساس را به سرورهای اشتباهی ارسال میکند.
منبع: https://robertheaton.com/2018/08/31/how-to-build-a-tcp-proxy-1/
[…] مقاله بخش دوم از قسمت ۱ چگونه یک TCP پراکسی بسازیم […]
[…] ادامه مجموعه مقاله آموزشی چگونه یک TCP پراکسی بسازیم، در این مقاله به ساخت سرور DNS جعلی […]
[…] مجموعه چگونه یک TCP پراکسی بسازیم، با ساخت سرور جعلی رسیدیم. اکنون قسمت دوم از […]