در ادامه مجموعه مقاله آموزشی چگونه یک TCP پراکسی بسازیم، در این مقاله به ساخت سرور DNS جعلی پرداختهایم.
در این قسمت یک سرور DNS جعلی میسازیم که روی لپتاپ اجرا میشود. موبایل هوشمند را تنظیم میکنیم تا هنگام نیاز به DNS سرور، از سرور ما استفاده کند. هنگامی که موبایل درخواست IP یک فضای میزبانی (برای مثال api.targetapp.com) را داشته باشد، سرور DNS جعلی ما به جای IP اصلی آن hostname، آدرس IP داخلی لپتاپ را برمیگرداند.
موبایل به پاسخ سرور اعتماد میکند، و باور میکند که IP داخلی لپتاپ همان IP اصلی api.targetapp.com است. از این پس هر زمانی که موبایل بخواهد به سرور api.targetapp.com داده ارسال کند، دادهها را به جای سرور مقصد به لپتاپ ما ارسال خواهد کرد. این اولین قدم از پراکسی TCP ما خواهد بود.
۱- نگاهی دقیق به DNS
قبل از کار روی سرور DNS جعلی، از ابزارهای موجود برای تحلیل درخواست های واقعی DNS استفاده میکنیم. همچنین برخی پاسخهای DNS را دستکاری میکنیم تا ثابت شود که موبایل به پاسخهای DNS دستکاری شده توسط لپتاپ، اعتماد خواهد کرد. با وجود اینکه پراکسی ما برای تحلیل ترافیک TCP خواهد بود، برای سادگی کار از درخواستهای http استفاده میکنیم.
۱.۱ – ارسال درخواستهای DNS موبایل به لپتاپ
ما کاری میکنیم که موبایل درخواست DNS اش را به جای DNS سرور واقعی به لپتاپ ارسال کند.
ابتدا مطمئن شوید که لپتاپ و موبایل هر دو به یک شبکه اینترنت بیسیم متصل شدهاند. سپس IP داخلی لپتاپتان را با دستورifconfig | grep 'en0' -A 2 | grep netmask
پیدا کنید (اگر سیستم عامل ویندوز دارید، از دستور ipconfig
استفاده کنید) . این دستور باید IP داخلی لپتاپ شما را برگرداند. این آدرس احتمالا چیزی شبیه 192.168.x.y است.
اکنون صفحه تنظیمات DNS موبایلتان را پیدا کنید. در این صفحه میتوانید سرور DNS که موبایلتان درخواستهای DNS را به آن ارسال میکند را تغییر دهید. IP سرور DNS را به IP داخلی لپتاپتان تغییر دهید. اگر بعد از این تغییر از اپلیکیشن یا یک وبسایت بازدید کنید، متوجه میشوید که هیچ چیز کار نمیکند.
اکنون موبایل شما تمام درخواستهای DNS را روانه لپتاپ شما میکند، اما لپتاپ نمیداند با این درخواستها چکار کند، و به آنها هیچ پاسخی نمیدهد.
۱.۲ – بررسی درخواستهای DNS
۱.۲.۲ – بررسی درخواستهای DNS با استفاده از وایرشارک
اگر موبایل شما دیگر هیچ وبسایتی را بارگذاری نمیکند، مشکلی نیست! در واقع این خبر خوبی است، نشان دهنده این است که درخواستهای DNS موبایل به لپتاپ میرود. اکنون با استفاده از وایرشارک، ترافیک شبکه لپتاپ را بررسی میکنیم و بدنبال درخواستهای DNS شکست خورده میگردیم. نشان میدهیم که درخواستها به سمت لپتاپ فرستاده شدهاند، اما لپتاپ هیچ پاسخی ارسال نکرده است.
وایرشارک را با فیلتر udp port 53
اجرا کنید. درخواستهای DNS از طریق پروتکل UDP و درگاه ۵۳ فرستاده میشوند. حالا روی لپتاپتان از یک وبسایت بازدید کنید، درخواست DNS پاسخ آن را در وایرشارک خواهید دید. این لپتاپ شماست که درخواست DNS را به سرور DNS واقعی ارسال میکند، که در نتیجه میتواند درخواست http از مرورگر شما به آدرس IP وبسایت مورد نظرتان را ارسال کند.
اگر این کوئریها را نمیبینید، احتمال این وجود دارد که لپتاپ شما از جوابهای کش شده استفاده کند، با وبسایتهای دیگری امتحان کنید.
اکنون به سراغ تلفنهای هوشمندمان برویم. فیلتر وایرشارک را به udp port 53 && dst $YOUR_LAPTOPS_IP
تغییر دهید- به جای $YOUR_LAPTOPS_IP باید IP لپتاپتان را بنویسید. روی موبایلتان (همچنان DNS سرورش روی IP لپتاپ تنظیم شده است) از یک وبسایت بازدید کنید – شاید مجبور شوید با وبسایتهای مختلف امتحان کنید، به دلیل کش شدن DNS. باید روی وایرشارک درخواست DNS این وبسایت را ببینید، در حالیکه فیلد IP مقصد در بسته UDP روی آدرس لپتاپ تنظیم شده است. اگر اینچنین است، یعنی موبایل با لپتاپ صحبت میکند، و کارمان را درست انجام دادهایم. با اینحال وایرشارک پاسخ DNS مربوطه را نشان نمیدهد. این به دلیل این است که هنوز به لپتاپ نگفتهایم چه کاری با درخواستهای DNS ای که از طرف موبایل دریافت میکند، انجام دهد.
قبل از شروع کار با لپتاپ، نگاهی به ترافیک DNS از زاویه دیگر، با استفاده از Netcat میپردازیم.
1.2.2 – بررسی درخواست های DNS با استفاده از Netcat
از وایرشارک برای بازرسی passive بستهها هنگام عبور از لپتاپ استفاده کردیم. اکنون با استفاده از ابزار netcat برای شنیدن درخواستهای DNS ورودی و حتی ارسال پاسخهای DNS اولیه استفاده میکنیم.
Netcat ابزاری برای خواندن و نوشتن دادهها در ارتباطات شبکه UDP و TCP است. همانطور که دیدیم تلفن هوشمند درخواستهای DNS را از طریق UDP روی درگاه ۵۳ ارسال میکند. برای گوش دادن به این درخواستها با استفاده از netcat دستور زیر را دنبال کنید:
sudo ncat -nluvvv 53
این دستور در ترمینال، باید با کاربر ریشه، sudo، اجرا شود.
بعد از اجرای این دستور اگر با موبایل هوشمندتان از یک وبسایت بازدید کنید، درخواست DNS را در ترمینال لپتاپ خواهید دید. از آنجاییکه این درخواست برای آسان خواندن انسان طراحی نشده، ممکن است عجیب بنظر برسد. با اینحال میتوانید نام وبسایتی که قصد بازدید از آن را داشتید را در میان آنها پیدا کنید.
اکنون هم با وایرشارک و هم با نتکت، درخواستهای DNS موبایل را بررسی کردیم. با اینحال هنوز لپتاپ نمیداند که چگونه پاسخ دهد، بهمین دلیل تلفن هوشمندتان هیچ صفحه وبی را بارگذاری نمیکند. در ادامه با استفاده از گزینههای Netcat، این مشکل را برطرف میکنیم و لپتاپ پاسخ DNS را ارسال خواهد کرد.
۱.۳ – استفاده از Netcat برای ارسال پاسخ DNS
شنوندگان UDP نتکت گزینهای به نام –exec دارند. با استفاده از –exec میتوانید دستوری را مشخص کنید که هر زمان شنونده UDP بستهای را دریافت کرد، netcat آن دستور را اجرا کند. نتکت محتوای بسته را بعنوان ورودی به دستور مشخص شده توسط –exec میفرستد، و خروجی دستور را به فرستنده اصلی بسته برمیگرداند. برای مثال، برای اجرای اسکریپت پایتون زیر زمانی که شنونده شما یک بسته UDP دریافت کند، باید دستور زیر را اجرا کنید:
sudo ncat -nluvvv --keep-open --exec "/usr/bin/python /PATH/TO/THE/SCRIPT.py" 53
در ادامه از --exec
برای پاسخ DNS موبایل استفاده میکنیم. این اسکریپت پایتون را در لپتاپتان ذخیره کنید:
import sys # Read the first 2 bytes from the DNS request that netcat # is piping in on stdin. These byte are the request ID and # must be included at the start of the response so that the # requester can match the response up with its original request req_id = sys.stdin.read(2) # Convert the bytes to hex req_id_hex_str = ''.join(["%02X" % ord(c) for c in str(req_id)]) # This is hex for the DNS response body "robertheaton.com # is at IP address 104.18.32.191". To give yourself some # confidence that I'm telling the truth, run: # # python -c "print bytearray.fromhex('$COPY_THE_HEX_STRING_HERE')" # # in a terminal. resp_body_str = "818000010002000000000c726f62657274686561746f6e03636f6d0000010001c00c000100010000012b0004681220bfc00c000100010000012b0004681221bf" # Construct a DNS response, convert it to bytes, and write # it to stdout so that netcat's --exec option sends it back # to your smartphone full_resp_body_bytes = bytearray.fromhex(req_id_hex_str + resp_body_str) sys.stdout.write(full_resp_body_bytes)
این اسکریپت به stdout، یک پاسخ DNS از پیش ساخته شده و هارد کدی که از وایرشارک کپی-پیست کردهایم را خروجی میدهد. این پاسخ هارد کد شده به موبایل هوشمند شما میگوید برای مثال IP دامنه robertheaton.com آدرس 104.18.32.191 است. برای اطمینان از اینکه درخواست کننده میتواند پاسخ ما را با درخواست اصلی خود مطابقت دهد، این اسکریپت دو بایت اول درخواست را میخواند، و آنها را به بدنه اصلی پاسخ اضافه میکند. این بدان علت ضروریست که UDP یک ارتباط غیراتصالگراست، و هیچ روش داخلیای برای موبایل هوشمند فراهم نمیکند تا پاسخهای DNS را با درخواستهای آنها تطابق دهد.
شما باید تائید کنید که رشته hex پاسخ DNS همان کاری که ادعا میکند را انجام میدهد. براحتی میتوانید به موبالتان بگویید که مثلا apple.com روی یک سرور مشکوک در روسیه هاست میشود. با اجرای دستور زیر در ترمینال میتوانید پاسخ DNS را تائيد کنید:
python -c "print bytearray.fromhex('$COPY_THE_HEX_STRING_HERE')"
حتی بهتر، کد hex یکی از درخواستهای DNS خود را از Wireshark کپی و در جای مشخص آن در اسکریپت استفاده کنید.
برای استفاده از اسکریپت جهت ارسال پاسخ DNS به موبایل، مطمئن باشید که DNS سرور موبایل همچنان روی آدرس لپتاپ تنظیم شده، سپس دستور زیر را اجرا کنید:
sudo ncat -nluvvv --keep-open --exec "/usr/bin/python /PATH/TO/THE/SCRIPT.py" 53
اکنون از وبسایتی به غیر از robertheaton.com، یا وبسایت مد نظر خودتان که از وایرشارک کپی کرده بودید، بازدید کنید، نباید هیچ صفحهای را ببینید. این بدان علت است که شما مثلا از وبسایت facebook.com بازدید میکنید و لپتاپ شما در پاسخ DNS به موبایل مینویسد «robertheaton.com روی آدرس 104.18.32.191 است». از آنجاییکه درخواست و پاسخ باهم سازگار نیستند، موبایل این پاسخ را در نظر نمیگیرد.
در این حالت تنها وبسایتی که روی موبایل میتوانیم از آن بازدید کنیم، در این مثال ما، robertheaton.com است، چون سرور DNS جعلیای که ساختهایم فقط به این درخواست پاسخ میدهد.
منبع: https://robertheaton.com/2018/08/31/how-to-build-a-tcp-proxy-2/
[…] با ساخت سرور جعلی رسیدیم. اکنون قسمت دوم از مقاله ساخت سرور جعلی DNS را ادامه میدهیم. در این قسمت میخوانیم که چگونه […]