gsocket(1) General Commands Manual gsocket(1)

gsocket — برقراری ارتباط امن از میان فایروال بدون نیاز به باز کردن پورت

gsocket [-qT] [-s secret] [-k keyfile] [-p port] [program] [args ...]

ابزار gsocket می‌تواند برای توانمندسازی یک برنامه جهت برقراری ارتباط از میان فایروال در شرایطی استفاده شود که برقراری اتصال مستقیم به یک میزبان یا ایستگاه کاری دیگر امکان‌پذیر نیست (پشت NAT یا فایروال). سناریوی معمول شامل دو ایستگاه کاری است که در شبکه‌های خصوصی مجزا و پشت فایروال‌های جداگانه قرار دارند. ابزار gsocket توابع کتابخانه شبکه برنامه (مانند ()connect و ()accept) را در اختیار گرفته و ترافیک را رمزگذاری کرده و از طریق شبکه رله سوکت سراسری (GSRN) هدایت می‌کند.

هیچ‌یک از ایستگاه‌های کاری نیازی به باز کردن پورت در فایروال خود یا پذیرش اتصالات TCP ورودی ندارند.

این اتصال با استفاده از پروتکل SRP (طبق RFC 5054) همراه با الگوریتم AES-256 و عدد اول ۴۰۹۶ بیتی به‌صورت سرتاسری (End-to-End) رمزگذاری می‌شود. شبکه GSRN تنها ترافیک رمزگذاری‌شده را مشاهده می‌کند.

کاربردهای متداول شامل موارد زیر است:

  • اتصال ssh از یک ایستگاه کاری به دیگری
  • برقراری ارتباط OpenVPN میان دو ایستگاه کاری
  • استفاده از netcat بین دو ایستگاه کاری
  • و کاربردهای بسیار دیگر.

ایده آدرس‌های IP و شماره پورت‌ها را کنار بگذارید: دو برنامه باید بتوانند تا زمانی که یک عبارت رمز مشترک (secret) را می‌دانند، با یکدیگر ارتباط برقرار کنند (به جای دانستن آدرس IP و شماره پورت یکدیگر). ابزار gsocket چنین اتصالی را بدون توجه به آدرس IP محلی یا موقعیت جغرافیایی و مستقل از آن‌ها برقرار می‌سازد. این کار با تحلیل برنامه و جایگزین کردن لایه IP با سازوکار انتقال اختصاصی خود از طریق GSRN انجام می‌شود. اتصال به‌صورت سرتاسری رمزگذاری شده است و GSRN تنها ترافیک رمزگذاری‌شده را می‌بیند.

سناریوی معمول، یک پیکربندی کلاینت/سرور مانند ssh و sshd است: اتصالات برقرارشده با ssh به هر نام میزبانی که به ‎'.gsocket'‎ ختم می‌شود، (از طریق GSRN) به سرور sshd (پشت فایروال) هدایت می‌شوند.

تغییر مسیر به ازای هر برنامه انجام می‌گیرد (و فقط به همان برنامه محدود می‌شود). ابزار gsocket جدول مسیریابی (routing table) را تغییر نمی‌دهد و تنظیمات NAT یا فایروال را نیز دستکاری نمی‌کند. این ابزار همچنین نیازی به مجوزهای کاربر ارشد (superuser) ندارد.

secret
یک عبارت رمز برگزیده توسط کاربر. هر دو طرف اتصال باید از عبارت رمز یکسانی برای برقراری ارتباط استفاده کنند.
file
فایلی که حاوی عبارت رمز است.
تولید یک عبارت رمز تصادفی امن و ارسال آن به خروجی استاندارد.
حالت بی‌صدا (Quiet). هیچ هشدار یا خطایی را در خروجی چاپ نمی‌کند.
استفاده از شبکه تور (TOR). ابزار gsocket از طریق شبکه TOR به GSRN متصل خواهد شد. این گزینه نیازمند نصب و فعال بودن تور است.
port
محدوده پورت‌های شنود TCP برای هدایت و تغییر مسیر [پیش‌فرض: همه].

اتصالات به هر نام میزبانی که به ‎'*.gsocket'‎ ختم شود یا به آدرس آی‌پی ‎'127.31.33.7'‎، از طریق شبکه GSRN هدایت می‌شوند.

اتصالات به هر نام میزبانی که به ‎'*.thc'‎ ختم شود یا به آدرس آی‌پی ‎'127.31.33.8'‎، ابتدا از طریق تور (TOR) و سپس از طریق GSRN هدایت می‌شوند.

مثال ۱ - برقراری ارتباط OpenSSH بین دو ایستگاه کاری پشت فایروال:

سرور:

$ gsocket -s MySecret /usr/sbin/sshd
کلاینت:
$ gsocket -s MySecret ssh xaitax@gsocket

مثال ۲ - برقراری ارتباط netcat میان دو ایستگاه کاری پشت فایروال:

سرور:

$ gsocket -s MySecret nc -lp 31337
کلاینت:
$ gsocket -s MySecret nc gsocket 31337

مثال ۳ - ارتباط OpenVPN میان دو ایستگاه کاری پشت فایروال:

سرور:

$ gsocket -s MySecret openvpn --dev tun1 --proto tcp-server --ifconfig 10.9.8.1 10.9.8.2
کلاینت:
$ gsocket -s MySecret openvpn --dev tun1 --proto tcp-client --ifconfig 10.9.8.2 10.9.8.1 --remote gsocket

مثال ۴ - ارتباط IRCD میان دو ایستگاه کاری پشت فایروال:

سرور:

$ gsocket -s MySecret inspircd --nolog --nofork
کلاینت:
$ gsocket -s MySecret irssi -c gsocket

مثال ۵ - ارتباط Socat میان دو ایستگاه کاری پشت فایروال:

سرور:

$ gsocket -s MySecret socat - TCP_LISTEN:31337
کلاینت:
$ gsocket -s MySecret socat - TCP:gsocket:31337

امکان در دسترس قرار دادن هر سرویس یا دیمنی از میان هر نوع فایروال وجود دارد. در این حالت سرویس تنها از طریق GSRN و فقط در صورتی که کلاینت عبارت رمز را بداند قابل دسترسی خواهد بود. هیچ پورت یا سرویسی در اینترنت عمومی باز و نمایان نمی‌شود و وجود سرویس پنهان باقی می‌ماند. این مثال سرور openssh-server (سرویس sshd) را از طریق GSRN در دسترس قرار می‌دهد. هیچ‌کس، حتی گردانندگان GSRN، به پورت، دیمن یا سرویس دسترسی ندارند (زیرا از عبارت رمز بی‌اطلاع هستند). سرویس جدید در کنار openssh-server موجود همزیستی داشته و هیچ اختلالی در عملکرد آن ایجاد نمی‌کند.

۱. کپی فایل /etc/systemd/system/sshd به /etc/systemd/system/gs-sshd

۲. ویرایش /etc/systemd/system/gs-sshd و تغییر این سطر:

ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
به
ExecStart=gsocket -s MySecret /usr/sbin/sshd -D $SSHD_OPTS

۳. شروع سرویس تازه ایجاد شده

# systemctl start gs-sshd

۴. بررسی وضعیت سرویس

# systemctl status gs-sshd

۵. اتصال از هر میزبان دیگر به openssh-server تازه ایجاد شده (و پنهان):

$ gsocket -s MySecret ssh user@gsocket

ابزار gsocket از روش LD_PRELOAD برای در اختیار گرفتن فراخوانی‌های شبکه از پردازه فراخواننده استفاده می‌کند. سپس شماره پورت را به عبارت رمز الحاق کرده و پردازه gs-netcat را برای هدایت اتصال TCP اجرا می‌کند. این پیکربندی را می‌توان با gs-netcat آزمایش کرد.

آزمون ۱ - سرور gsocket و کلاینت gs-netcat:

سرور:

$ gsocket -s MySecret nc -lp 1234 # پورت TCP برابر ۱۲۳۴ است
کلاینت:
$ gs-netcat -s 1234-MySecret # توجه کنید: `<port>-<SECRET>`

آزمون ۲ - کلاینت gsocket و سرور gs-netcat:

سرور:

$ gs-netcat -s 1234-MySecret -l
کلاینت:
$ gsocket -s MySecret nc blah.gsocket 1234

از نظر داخلی، ابزار gsocket (در سمت کلاینت) یک پردازه پس‌زمینه gs-netcat منشعب می‌کند که روی 127.31.33.7 روی یک پورت تصادفی TCP شنود می‌کند. سپس ابزار gsocket تلاش `nc` برای تحلیل نام `blah.gsocket` را تشخیص داده و آدرس 127.31.33.7 را به `nc` بازمی‌گرداند. سپس پردازه `nc` در عوض به 127.31.33.7 متصل می‌شود و پردازه gs-netcat (که به‌طور خودکار آغاز شده است) اتصال را تحویل گرفته و ترافیک را از طریق GSRN منتقل می‌کند. ابزار `nc` همچنین می‌تواند برای آزمایش مستقیماً به 127.31.33.7 به جای blah.gsocket متصل شود:

کلاینت:

$ gsocket -s MySecret nc -n 127.31.33.7 1234

آزمون ۳ - سرویس SSHD از طریق gsocket:

سرور:

$ gsocket -s MySecret /usr/sbin/sshd -D -p 1234
کلاینت:
$ gs-netcat -s 1234-MySecret
SSH-2.0-OpenSSH_8.4p1 Debian-2

استفاده از gs-netcat به عنوان هدایت‌کننده پورت و ssh برای اتصال:

کلاینت:

$ gs-netcat -s 1234-MySecret -p 44222
$ ssh -p 44222 user@127.1

آزمون ۴ - اتصال SSH از طریق gsocket:

روی سرور، یک فوروارد پورت gs-netcat اجرا کنید تا اتصالات ورودی GSRN را به SSHD روی localhost هدایت کند:

سرور:

$ gs-netcat -s 22-MySecret -l -d 127.0.0.1 -p 22
کلاینت:
$ gsocket -s MySecret ssh user@gsocket

متغیرهای محیطی زیر را می‌توان برای کنترل رفتار gsocket تنظیم کرد:

GSOCKET_SOCKS_IP

آدرس IP سرور TOR (یا هر سرور SOCKS دیگر) را تعیین می‌کند. همراه با -T استفاده می‌شود. پیش‌فرض 127.0.0.1 است.

GSOCKET_SOCKS_PORT

شماره پورت سرور TOR (یا هر سرور SOCKS دیگر). همراه با -T استفاده می‌شود. پیش‌فرض 9050 است.

GSOCKET_ARGS

رشته‌ای حاوی پارامترهای اضافی خط فرمان. ابتدا پارامترهای معمول خط فرمان پردازش شده و سپس پارامترهای خط فرمان موجود در GSOCKET_ARGS اعمال می‌شوند.

ارسال گذرواژه به عنوان پارامتر خط فرمان امن نیست. استفاده از گزینه k- یا GSOCKET_ARGS یا وارد کردن گذرواژه در هنگام اعلان ورودی را مد نظر قرار دهید:

$ gsocket -k <file>
$ export GSOCKET_ARGS="-s MySecret"
$ gsocket

۱. امنیت به‌صورت سرتاسری (End-to-End) است. بدین معنی که رمزگذاری از کاربر تا کاربر است (و نه صرفاً تا سرورهای GSRN). شبکه GSRN تنها داده‌های (رمزگذاری‌شده) را میان کاربران رله می‌کند.

۲. نشست ارتباطی ۲۵۶ بیتی و موقت (ephemeral) است. برای هر نشست به‌طور تصادفی از نو ایجاد می‌شود (و بر پایه گذرواژه ساخته نمی‌شود). این ابزار از SRP کتابخانه OpenSSL با الگوریتم AES-256 و عدد اول ۴۰۹۶ بیتی بهره می‌برد.

۳. گذرواژه می‌تواند «ضعیف» باشد بدون آنکه امنیت نشست را تضعیف کند. یک حمله جستجوی فراگیر (brute force) علیه یک گذرواژه ضعیف، برای هر بار حدس زدن نیازمند برقراری یک اتصال جدید TCP خواهد بود.

۴. از گذرواژه‌های ساده و ناامن مانند 'password123' استفاده نکنید. نفوذگر ممکن است تصادفاً همان رمز را انتخاب کرده و متصل شود. در صورت تردید، از دستور gs-netcat -g برای تولید یک عبارت رمز قوی استفاده کنید. گذرواژه طرفین ارتباط باید حداقل به اندازه‌ای قوی باشد که مهاجم نتواند تصادفاً در مدتی که یکی منتظر اتصال دیگری است، آن را حدس بزند.

۵. اگر شخصی گذرواژه یکسانی را با دو نفر به اشتراک بگذارد و هر یک متصل شوند، نمی‌تواند تشخیص دهد کدام‌یک متصل شده است.

۶. فرض کنید فردی گذرواژه مشترکی با کاربر مجاز و نفوذگر دارد. هنگامی که کاربر مجاز گوش دادن به اتصالات را متوقف کند، نفوذگر می‌تواند به جای او شروع به شنود کند. کلاینت هنگام برقراری اتصال جدید نمی‌تواند تشخیص دهد به چه کسی متصل می‌شود. در صورت نگرانی درباره این موضوع از a <token>- استفاده کنید. خلاصه: هنگام اشتراک‌گذاری یک گذرواژه با گروهی بیش از ۲ نفر، فرض بر این است که همه افراد با حسن‌نیت عمل می‌کنند؛ در غیر این صورت از SSH بر بستر اتصال GS/TLS استفاده نمایید.

۷. پروتکل SRP دارای رازداری پیش‌رو کامل (Perfect Forward Secrecy) است. این یعنی حتی در صورت افشای گذرواژه در آینده، نشست‌های ثبت‌شده قبلی رمزگشایی نخواهند شد.

جدیدترین نسخه از طریق نشانی https://github.com/hackerschoice/gsocket در دسترس است.

gs-netcat(1), gs-sftp(1), gs-mount(1), blitz(1), nc(1), socat(1)

تلاش‌های زیادی انجام گرفته تا ابزار gsocket در تمامی حالت‌های گوناگون خود رفتار درستی داشته باشد. در صورتی که احساس می‌کنید تحت هر شرایطی عملکرد نادرستی دارد، لطفاً به آدرس (skyper@thc.org) اطلاع داده و نحوه رفتار مورد انتظار را بیان فرمایید.

March 2, 2021 Linux 6.12.107+deb13-amd64