> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/ssh.md).

# SSH 취약점 진단

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FhEHe7BO953TB4qh3EfMn%2Fimage.png?alt=media&amp;token=b397825b-cef9-485f-ad53-fb883a87e197" alt=""><figcaption></figcaption></figure>

* **사용자 인증 방법**
  * 공개키 로그인 : 공개키와 맞물려있는 개인키를 가지고 있어야 접속 가능
  * 비밀번호 로그인 : 유저이름/비밀번호를 알면 접속 가능
* 공개키와비밀번호 로그인까지 같이 있는 경우에는 **브루트포스 (Bruteforce), 패스워드 스프레잉 (Password Spraying) 공격 가능**
* 유저 이름 정보( OpenSSH < 7.7) 를 수집한 후에 유저 이름 브루트 포스 공격 가능

## SSH 취약점 진단 <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

SSH(Secure Shell)은 원격 호스트에 암호화된 방식으로 접속해 명령 실행 및 파일 전송을 할 수 있게 해주는 프로토콜입니다. 대부분 포트 22에서 실행되며, 유명한 네트워크 서비스로는 OpenSSH 등이 있습니다. 90년대 중반에 개발되어 그 이후로 다양한 오픈소스 프로젝트들에 적용이 되어 왔기 때문에, OPENSSH 등의 네트워크 서비스에서 SSH 프로토콜 자체의 취약점이나, 서비스 내의 취약점을 찾기는 어렵습니다.&#x20;

하지만 오래된 버전에는 유저 이름 정보 수집이나 원격 코드 실행 등의 취약점들이 있습니다. 또한, **잘못된 설정 (Misconfiguration)**&#xC774; 있는 경우 공격자들이 **브루트포스 (Bruteforce), 패스워드 스프레잉 (Password Spraying), 크레덴셜 스터핑 (Credential Stuffing)** 등의 공격을 할 수 있기 때문에 꼼꼼한 취약점 진단을 해야 합니다.

### 취약점 진단 <a href="#bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8" id="bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8"></a>

* 사용자 인증 방법: SSH에는 (크게 보자면) 공개/개인키 로그인과 비밀번호 로그인 두 가지 방식의 사용자 인증 방법이 존재합니다. 비밀번호 로그인의 경우 설정이 미흡하다면 위에서 언급된 브루트포스 공격 등에 취약해질 수 있습니다. 때문에 타겟 호스트에서 어떤 사용자 인증 방법을 지원하는지 점검해야 합니다.
* 유저 이름 정보 수집: OpenSSH < 7.7 버전들의 경우 유저 이름 브루트포스를 통해 호스트에 존재하는 로컬 유저들의 계정 이름을 알아낼 수 있습니다.
* 계정 정보 공격 대응 미흡 혹은 부재: 비밀번호 로그인이 가능할 경우 방화벽 혹은 호스트 기반 침입방지시스템 (IPS) 등이 없다면 다양한 계정 정보 공격 (브루트포스, 패스워드 스프레잉, 크레덴셜 스터핑)에 취약해질 수 있습니다.
* 오래된 OpenSSH 버전 및 SFTP: 오래된 OpenSSH 및 SFTP 서비스들의 경우 원격 코드 실행이 가능할 수도 있기 때문에 버전 정보를 진단 한 뒤, 공개 취약점 & 익스플로잇 등을 확인해야 합니다.

### 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

### 1. 서비스 버전 확인

```sql
nmap -sV -p 22 [ip]
nmap -sV -sC -p 2222 [ip]
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FlY1w6skodP913dIdnm2A%2Fimage.png?alt=media&amp;token=4a620bf6-7d23-48ff-8654-89f194aa8f02" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FyUBrUbvfOf5ZItoVJWfO%2Fimage.png?alt=media&amp;token=b7a04db7-e64a-4b9c-87c6-2460fa6563f1" alt=""><figcaption></figcaption></figure>

* 2222 포트의 SSH는 버전이 7.2 이기 때문에 유저 정보 수집이 가능(openSSH 7.7 이하)하며, 브루트 포스 공격도 가능하다.

### 2. 유저 이름 정보 수집 - Metasploit

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2Fd6hhzxjiW7SsgA6WJJDC%2Fimage.png?alt=media&amp;token=a125da8b-0f34-4291-a5c1-5fe159682a2a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FhU3iB4OfntCT9sOyK5OW%2Fimage.png?alt=media&amp;token=ab78ce25-007a-4dbe-85f1-7d1467332b12" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F0ElPNFSm8d3vCjHDuezK%2Fimage.png?alt=media&amp;token=96a22879-ca60-465a-ab10-d2be7b5f395a" alt=""><figcaption></figcaption></figure>

* 유저 이름 브루트포싱을 통해 알아내기 때문에 유저 이름 사전 파일이 필요합니다. BHPT 실습에서는 Seclist 프로젝트에 있는 간단한 사전 파일을 사용합니다 - [링크](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Usernames/top-usernames-shortlist.txt) / [링크](https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Usernames/Names/names.txt)

<pre class="language-sql"><code class="lang-sql"><strong>vim username.txt
</strong>
root
admin
test
guest
info
adm
mysql
user
administrator
oracle
ftp
pi
puppet
ansible
ec2-user
vagrant
azureuser
groot
-- wq! 저장

msfconsole 
use auxiliary/scanner/ssh/ssh_enumusers 
set rhosts [ip] - 공격대상의 IP 
set rport 2222
set user_file [filepath]
run
</code></pre>

### 3. 브루트포스 대응 미흡/부재 확인

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FYBoyccw4IanJvaEaGg0R%2Fimage.png?alt=media&amp;token=1619aa8f-dabf-4bda-bfab-1b3c36836f44" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F5HXZmcr4TWoYjZAyO5S4%2Fimage.png?alt=media&amp;token=1802176a-5556-4ca3-afbf-c8a746d72662" alt=""><figcaption></figcaption></figure>

<pre class="language-sql"><code class="lang-sql"><strong># rockyou : 14000개의 계정 ID를 모아놓은 txt 파일
</strong><strong>
</strong><strong># 안전한 확인을 위해 비밀번호 50개만 사용 
</strong>cat /usr/share/wordlists/rockyou.txt | head -50 > pass.txt 

# 안전한 확인을 위해 존재하지 않은 유저 이름을 사용 
hydra -l thisuserdoesnotexist -P pass.txt ssh://[ip]:[port] -V -f
</code></pre>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FW387zKKcsgR80Bvmu0Cq%2Fimage.png?alt=media&amp;token=7e3381a6-7b41-4847-9d16-801021be5825" alt=""><figcaption><p>10회 이상 지속되고 자동으로 아이피 차단이 되지 않는 다면 사실상 브루트포스 대응이 없다고 봐도 무방</p></figcaption></figure>

* 실무에서는 최소한으로 진행하거나, 고객사의 사전 허락 없이는 절대로 진행하지 않습니다.
* 진단을 실행하다 계정 잠금을 일으키거나 너무 많은 보안 알람이 고객사의 SIEM/SOC등으로 들어갈 수 있기 때문입니다.
* 브루트포스 공격이 10회 이상 지속되고 자동으로 아이피 차단이 되지 않는 다면 사실상 브루트포스 대응이 없다고 봐도 무방합니다.

### 마치며 <a href="#bkmrk-eb-a7-88-ec-b9-98-eb-a9-b0" id="bkmrk-eb-a7-88-ec-b9-98-eb-a9-b0"></a>

SSH는 기본적으로 취약점이 발견되지 않는 안전한 프로토콜입니다. 하지만 SSH를 적용한 OpenSSH나 SFTP 등의 네트워크 서비스들은 공개 취약점들이 어느 정도 존재하고, 잘못된 설정을 한 경우 다양한 계정 정보 공격에 취약해질 수 있습니다. 따라서 SSH는 꼭 취약점 진단을 꼼꼼히 진행해야 합니다.

* SSH 공개키 발견 -> 공개키 로그인 시도
* 유저 이름 발견 -> 브루트포스 및 패스워드 스프레잉 공격 시도
* 오래된 서비스 -> 유저 이름 정보 수집, 원격 코드/명령어 실행 익스플로잇, 등.

### 연습 문제 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>

&#x20;

* `mod3ex`에서 실행 중인 모든 SSH 포트들을 찾아보세요.
* SSH 포트들을 상대로 히드라(Hydra)를 이용해 유저 이름 브루트포스를 실행 해보세요. 어떤 유저 이름을 찾았나요?
* 찾아낸 유저 이름들을 바탕으로 비밀번호 브루트포스 공격을 진행 해보세요. 중간에 공격이 끊기거나 막히는지 확인 해보세요
