
إطار عمل بسيط للشل العكسي المُوثَّق للوصول إلى المضيفين الذين لديهم اتصال إنترنت صادر.
bepr هي أداة صغيرة لصدفة عكسية (reverse shell) موثوقة بين عميل وخادم عبر اتصالات WebSocket الصادرة.
ملف ثنائي واحد يغطي جميع الأوضاع الثلاثة: وضع الخادم، وضع العميل، ووضع المستخدم. وهي معبأة مع تعليمات تثبيت لـ rpm و deb و pkg، بحجم 1 ميجابايت.
أنشأت bepr لأنني أسافر وأرغب في التحكم بأجهزتي المنزلية دون تعريضها للإنترنت العام. هذا يتطلب فقط نطاقاً (لـ TLS) وخادماً للعمل.
اذهب إلى https://github.com/Aperocky/bepr/releases للعثور على إصدار الحزمة المناسب لمنصتك. قم بتنزيله واستخدم هذه الأوامر للتثبيت
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
أو استخدم نصوص التحديث لتثبيتها تلقائياً بتشغيل النص:
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-deb.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-macos.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-rpm.sh | sh
والآن، حسب ما سيُستخدم جهازك من أجله، قم بتهيئة كل مضيف. الملف الثنائي يعمل في الأوضاع الثلاثة لكنه لا يتزامن تلقائياً — قم بالإعداد قبل أن تغادر!
تحتاج إلى شهادة TLS ونطاق خاصين بك؛ هذا الجزء لا يغطيه bepr. أنشئ إعدادات الخادم:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
ابدأ الخدمة:
لينكس:
sudo systemctl enable --now bepr
من الخادم يمكنك سرد العملاء المسجلين والمستخدمين المتصلين، ويتم ذلك عبر مقبس محلي.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
يمكنك أيضاً الاتصال بعميل مباشرة عبر هذا المقبس المحلي، ويتصرف هذا بنفس طريقة وضع المستخدم.
bepr connect laptop
هذا يوفر مسارات المستخدم والعميل على نطاقك:
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
بمجرد الاتصال، يتم أنبوبة (pipe) الإدخال/الإخراج القياسي (stdin/stdout) لطرفية bepr connect إلى شل العميل المحدد. تعمل شل العميل داخل PTY، بينما الخادم هو موجه بايت خام تمريري (pass-through). يمكن توصيل عدة عملاء بالخادم في نفس الوقت، لكن لا يمكن لعميل واحد أن يكون له سوى مستخدم واحد متصل في كل مرة.
على كل مضيف عميل، قم بتوليد زوج مفاتيح:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
انسخ المفتاح العام إلى key_dir الخاص بالخادم:
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
أنشئ إعدادات العميل. يجب أن يتطابق معرف العميل في الرابط مع اسم ملف المفتاح العام على الخادم:
# cat /etc/bepr/client.conf
server = wss://server.example/bepr/client/pi_zero
private_key_path = /etc/bepr/client-keys/pi_zero
shell = /bin/sh
ابدأ الخدمة/الخفي:
لينكس:
sudo systemctl enable --now bepr
ماك:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.bepr.plist
sudo launchctl enable system/com.bepr
sudo launchctl kickstart -k system/com.bepr
المسار القديم domain/bepr/$name مقبول أيضاً للتوافق العكسي مع العملاء الأقدم. ابدأ الخدمة بنفس طريقة الخادم.
ملاحظة: يقوم العميل بإنشاء شل فور الاتصال بالخادم، وليس عندما يتصل مستخدم. تعمل الشل باستمرار في الخلفية. إذا اتصلت ووجدت الطرفية في حالة سيئة، نفذ stty sane. إذا كانت الشل نفسها غير مستجيبة، قم بقتلها باستخدام معرف العملية (PID) على جهاز العميل — سيعيد العميل الاتصال تلقائياً وينشئ شل جديدة خلال 10 ثوانٍ.
للعمل من جهاز بعيد دون إعادة توجيه SSH لمقبس الخادم، استخدم وضع المستخدم. على الخادم، أضف user_key_dir إلى إعدادات الخادم:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
user_key_dir = /etc/bepr/user-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
انسخ المفتاح العام للمستخدم إلى الخادم:
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
على جهاز المستخدم، أنشئ إعدادات المستخدم:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
سيستخدم bepr list و bepr connect هذه الإعدادات تلقائياً دون أعلام إضافية. أوامرك تنقل من الخادم مباشرة إلى مضيفي العميل.
يمكن تشغيل الملف الثنائي bepr يدوياً دون خدمة/حزمة باستخدام أوامر ووسائط مباشرة:
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination