> 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/ftp.md).

# FTP 취약점 진단

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FNndpr9PshA1nbjYesd5R%2Fimage.png?alt=media&amp;token=9199c460-2bf6-4d8a-b891-9fa25d508ada" alt=""><figcaption><p>FTP 진단 시 수행해야할 진단 리스트</p></figcaption></figure>

* 파일 읽기 가능 - 파일 다운로드 가능
* 파일 쓰기 가능 - 파일 업로드 가능

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

FTP(File Transfer Protocol)은 파일 전송 프로토콜로, 원격의 호스트와 파일을 주고받을 때 사용됩니다. 1970년대때부터 개발되어 사용되어 왔으며, 오랜 역사만큼이나 다양한 하드웨어 (프린터 등), 어플라이언스, 솔루션등에서 자주 사용되는 프로토콜입니다. 옛날에 만들어진 프로토콜답게 비 암호화 프로토콜로서, 파일 전송 시 네트워크 트래픽은 암호화 되지 않은 평문 트래픽으로 전달됩니다. 때문에 이를 방지하기 위해 SSH 기반의 SFTP (Secure FTP)를 사용하기도 합니다. FTP를 적용한 네트워크 서비스들은 대부분 포트 21에서 실행됩니다.

공격자로서 FTP는 매력적인 타겟입니다.

* **오랜 역사:** FTP는 나온 지 오래되었고, 프로토콜을 적용해 만들어진 네트워크 서비스들 (vsftpd, 등) 또한 오랜 역사를 가지고 있는 경우가 많습니다. 따라서 이와 관련된 공개 취약점과 익스플로잇들이 많습니다. 이 중에는 원격 코드 실행이나 원격 명령어 실행이 가능한 경우가 있기 때문에 취약점 진단을 실행해 이를 찾아내야 합니다.
* **파일 다운로드:** 타겟에 따라 FTP에는 중요한 데이터가 저장되어 있는 경우가 있습니다. 특히 오래된 레거시(legacy) 시스템들이 주고받는 평문 데이터, 백업 데이터 등이 그렇습니다. 실무에서는 오래되거나, IT팀이 "까먹은" FTP 서버 등에서 직원, 고객, 회사와 관련된 개인정보나 기밀정보/문건, 소스코드 베이스들이 발견되는 경우가 많이 있습니다.
* **파일 업로드:** FTP에 파일 업로드가 가능한 경우 악성코드를 업로드해 추가 공격을 노려볼 수도 있습니다. 이때는 어떤 디렉토리에 파일이 업로드 되는지, 그리고 다른 네트워크 서비스들을 통해 업로드한 파일을 실행 시킬 수 있는지 등에 대해서 알아봐야 합니다.

### 취약점 진단 <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>

FTP 취약점 진단을 진행할 때 보통 다음과 같은 취약점/잘못된 설정 등을 진단합니다.

* 서비스 버전: 오래된 네트워크 서비스 이름이나 버전을 바탕으로 공개 취약점 및 익스플로잇이 존재하는지 진단합니다.
* 익명 로그인 (Anonymous Login) 확인: 익명 로그인 기능이 활성화된 FTP 서비스의 경우 계정 정보 (유저이름 + 비밀번호) 없이 로그인을 해 파일 업로드나 다운로드를 진행할 수 있습니다.
* 파일 및 디렉토리 읽기 & 쓰기 권한 확인: 파일을 다운로드 할 수 있는지 및 특정한 디렉토리에 파일을 업로드할 수 있는지에 대한 읽기 & 쓰기 권한을 진단합니다.
* 기본 계정 이름 + 비밀번호 확인: 오래된 하드웨어나 어플라이언스의 경우 FTP 서비스에 `admin:admin`, `ftp:password` 등의 기본 계정 이름 및 비밀번호가 존재하는 경우가 많습니다. 이를 확인해 해당 기본 계정들이 사용 중인지에 대해 진단합니다.

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

### 1. FTP 서비스 이름, 버전, nmap 기본 스크립트 사용

```sql
nmap -p 21 -sV -sC -Pn -n --open --min-rate 1000 [ip] -oA tcpdatailed
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FUcHJGEGnbhoz1CahrBSJ%2Fimage.png?alt=media&amp;token=c034f31c-ce6f-46f7-8c55-3672ff406ef8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FBDYFYWqvmPmoIWJOrodl%2Fimage.png?alt=media&amp;token=5e16df09-d6ec-4e37-8ba6-ea0a63e2ae4b" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F5dcZdEIK2qOlKZ5Zzcpf%2Fimage.png?alt=media&amp;token=de95e7d2-3bc4-47de-9c54-80498c1cdb29" alt=""><figcaption></figcaption></figure>

### 2. 익명 로그인 확인

* 유저 이름 `anonymous`, 비밀번호는 아무거나 (예. `asdf`)

> 강의 영상에서는 유저 이름도 아무거나 쳐도 된다고 말했지만, 실제로는 `anonymous` 만 가능합니다. 물론 FTP가 아닌 다른 네트워크 서비스들의 anonymous/null 세션 로그인 시 유저 이름도 아무렇게나 쳐도 되는 경우가 있긴 하지만, FTP의 경우 대부분 유저 이름은 anonymous로 지정해 줘야 합니다.

{% code overflow="wrap" %}

```sql
└─# ftp 172.31.188.187

Connected to 172.31.188.187.
220 (vsFTPd 3.0.3)
Name (172.31.188.187:root): anonymous
asdf331 Please specify the password.
Password: 
230 Login successful.
```

{% endcode %}

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F6RC3ZyJxswVeja3o9dWy%2Fimage.png?alt=media&amp;token=b9c1c618-b82c-4dbd-b622-ee51285c6fc5" alt=""><figcaption></figcaption></figure>

### **3. 읽기/쓰기 권한 확인**

* 파일 권한을 확인하는 것도 좋으나, 가장 확실하게 알아볼 수 있는 방법은 파일 다운로드나 업로드를 실행하는 것입니다.
* 실무에서는 파일 업로드는 잘 확인하지 않는 편입니다. 고객사의 호스트에 최대한 아티팩트들을 남기면 안되기 때문입니다.

```sql
ftp> cd ./uploads
250 Directory successfully changed.

ftp> ls -a
229 Entering Extended Passive Mode (|||34105|)
150 Here comes the directory listing.
drwxr-xr-x    2 101      102          4096 Oct 12 04:05 .
drwxr-xr-x    3 0        0            4096 Oct 12 04:05 ..
-rw-r--r--    1 0        0              20 Oct 12 04:05 index.php
-rw-r--r--    1 0        0              27 Oct 12 04:05 secret.txt
```

* `Others` 그룹에 읽기 권한이 있는 것으로 보아 파일들을 모두 다운로드 할 수 있습니다.
* 단, 현 디렉토리의 권한은 `rwxr-xr-x` 이기 때문에 파일을 업로드 할 수는 없습니다.

### **4. 기본 계정 이름 및 비밀번호 확인**

* 네트워크 서비스 이름 및 버전 정보를 바탕으로 구글링을 통해 찾아냅니다.

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

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2Fa2M3npqKwrXerMOXAG6t%2Fimage.png?alt=media&amp;token=c2fd6e0e-fcfc-4cd7-84fe-29c5158c2b58" alt=""><figcaption></figcaption></figure>

FTP 서비스를 진단하고 공격할 때는 다음과 같은 것들을 꼭 생각해 놓으시면 좋습니다.

* 이 FTP 서버에는 어떤 파일이 존재할까?
  * 호스트 이름, DNS A 레코드, 디렉토리 이름 확인 후 유추. 예. `pciprodftp01.example.com` 이라면 PCI (카드 결제 관련 개인정보)를 담당하고 있는 `PRODuction` 프로덕션 FTP서버일 확률이 높음.
* 익명 로그인이 아니라 계정 이름 & 비밀번호로 로그인이 가능할 경우, 꼭 접근해서 파일 및 디렉토리들을 살펴볼 것
* 흥미로운 파일들은 다운로드 해서 분석하되, 개인정보가 들어있을 것 같은 파일은 최소한으로 다운로드 한 뒤 분석할 것.
  * 예를 들어, `ad-blob-storage-2023-12-28-backup-customerdata.zip` 와 비슷한 파일이 수백 개 있을 경우, 누가봐도 고객 정보가 들어있을 수 있기 때문에 수백개의 zip파일을 다운받아 분석할 필요가 없습니다. 이때는 파일 1\~2개만 다운 받아 최소한의 분석만 진행하고, 개인정보가 있을 경우 고객사에게 이를 알립니다.

### 연습 문제 <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>

* FTP가 실행 중인 모든 포트를 찾아보세요
* 모든 FTP를 상대로 익명 로그인을 시도 해보세요.
* FTP가 실행 중인 포트를 상대로 파일 업로드나 다운로드가 가능한지 확인 해보세요.
* 특정 FTP에 파일을 업로드 했을 때, 다른 네트워크 서비스를 통해 해당 파일에 접근할 수 있는지 확인 해보세요 (힌트: FTP + HTTP)
