OZ1NG의 뽀나블(Pwnable)

[CVE] CVE-2020-8284 : trusting FTP PASV responses 정리 본문

Laboratory

[CVE] CVE-2020-8284 : trusting FTP PASV responses 정리

OZ1NG 2021. 2. 20. 21:55

curl 버그바운티를 하면서 curl에서 인정한 취약점에는 어떤 것들이 있었는지 봤다.

이 cve는 내 생각으로는 좀 특이하다고 생각해서 정리해봤다.

 

[*] CVE  

- 제목 : CVE-2020-8284 : trusting FTP PASV responses

- 심각성 : 낮음

- 포상금 : 700$

- CWE-200 : 비인가 행위자에게 중요한 정보 노출

- 원본 주소 : hackerone.com/reports/1040166

 

[*] 취약점 요약

- curl은 패시브 모드로 FTP 서버에 접근할 때 EPSV(확장 패시브 모드)로 시도하고 지원이 안되면 PASV(패시브 모드)로 시도.

- 이 점을 이용해서 curl을 악용하여 예를 들면 ssrf가 가능한 웹 서버에 대해서 내부망 대역 포트 스캐닝

등을 시도 가능함.

- 이것은 curlCURLOPT_FTP_SKIP_PASV_IP 옵션이 기본적으로 비활성화 되어 있어서 가능한 것임.

  (curl-7.74.0 버전 이상 부터 기본적으로 활성화 되도록 패치 됨.)

- CURLOPT_FTP_SKIP_PASV_IP 옵션 : PASV모드일때 재접속 하는 데이터 채널의 IP가 변경되지 않도록 하는 옵션

 

[*] FTP ?

이 취약점에 대해 설명하기 전에 FTP에 대한 이해가 필요하니 필요하다면 아래의 정리 글을 먼저보고 오는 것을

추천합니다.

oz1ng019.tistory.com/68

 

[*] FTP 정리

[*] FTP 정리 FTP는 TCP를 사용함. 따라서 사전에 3 Way-Handshake를 함. (종료할땐 4 Way-Handshake를 하여 종료.) FTP는 기본적으로 Command Port(21)과 Data Port(20)을 사용함. Command Port는 서버와 클라..

oz1ng019.tistory.com

 

[*] CVE 시나리오

[사진4] - CVE 시나리오

CVE 시나리오는 다음과 같다.

(여기서 나오는 코드들은 CVE 원작자께서 올리신 포트 스캐너 코드입니다. 언어는 bash 쉘 스크립트)

 

1. SSRF가 터지는 웹 서버(이하 타겟 서버)라고 가정 했을 때, 공격자는 타겟 서버 내에서 curl을 통해 

Passive 모드로 공격자의 FTP 서버에 접속을 요청한다.

이때 curl은 먼저 EPSV모드로 연결을 시도하는데, 공격자의 FTP 서버에서 지원을 안한다는 응답을 보내어

강제로 PASV모드를 사용하게 만든다. 해당 부분의 코드는 아래와 같다.

PORT*|EPRT*|EPSV*)
    write_data "500 What is this"
    ;;
# FTP 서버의 응답으로 500 명령어를 보내어 지원을 하지 않는다고 알림. (500 명령어는 Syntex Error 명령어이다.)

 

2. 공격자의 FTP 서버는 타겟 서버에게 응답 수락 패킷과 함께 스캐닝을 시도할 타겟 서버 내부망의 IP 주소와

임시 Data Port를 보낸다. (접속할 데이터 채널을 타겟 서버의 내부망으로 속이는 것임.)

(이때 스캐닝의 대상은 내부망 IP가 아니라 타겟 서버여도 된다.)

해당 부분의 코드는 아래와 같다.

PASV*)
    write_data "227 Entering PASSIVE Mode ($connection_info)" 
    pasv_flag=1
    ;;
# $connection_info : data chanel info
# PASV 명령어를 클라이언트(타겟 서버)로부터 받으면 227 명령어와 함께 데이터 포트에 대한 정보를 보낸다.

 

3. 그러면 타겟 서버에서 공격자의 FTP 서버로 부터 받은 스캔 대상의 IP 주소와 임시 Data Port를 기반으로 데이터 채널 연결을 요청한다.

 

4. 이것에 대한 타겟 서버 -> 공격자의 FTP 서버로의 응답 또는 대기 시간으로 해당 포트가 열려있는지, 방화벽에 의해 필터링 되어 있는지, 닫혀 있는지 알 수 있다. 이에 대한 기준은 아래와 같다.

- 열린 포트의 경우

PASV 명령어를 타겟 서버로 부터 받은 직후 TYPE(전송 모드 설정) 명령어를

받게 되면 열린 포트라고 판단.

 

 

 

 

 

 

 

- 방화벽에 의해 필터링된 포트의 경우

별다른 명령어 없이 응답이 없고 일정 시간이 초과된 경우 방화벽에 의해

필터링 된 포트라고 판단.

(방화벽에 걸린 경우에는 스캔 대상으로 부터 패킷은 보냈지만 다시 받지는 못하기 때문)

 

 

- 닫힌 포트인 경우

별다른 명령어 없이 빠르게 끝나버린 경우 닫힌 포트라고 판단.

 

 

 

 

 

 

 

 

- 시연

[사진5] - CVE 원작자의 포트 스캐닝 시연 [출처 : hackerone.com/reports/1040166]

 

[*] 마무리

이 CVE를 보면 느끼겠지만 이건 curl보다는 FTP PASV모드의 취약점에 더 가깝다.

단순(하지는 않지만) curl 악용 방법임에도 불구하고 curl에서는 해당 report를 취약점으로 인정 해주었다.

 

따라서 꼭 exploit 되는 취약점이 아니라 단순히 악용이 가능하다면 그것도 CVE로 인정이 될 수 있다는 결론을 낼 수

있다.

 

이 CVE를 공부하면서 잘 몰랐던 FTP에 대해 자세히 알게 되었고 생각보다 CVE 자체를 공부하는 것도 재밌다는 걸 알 수있었다. 앞으로는 종종 CVE도 공부 해야겠다.

 

[-] 참고

-해커원 원본

hackerone.com/reports/1040166

-CURL - CURL-OPT_FTP_SKIP_PASV_IP 옵션에 대한 curl 설명

curl.se/libcurl/c/CURLOPT_FTP_SKIP_PASV_IP.html

-FTP 클라이언트, 서버 명령어 및 FTP에 대한 설명

madplay.github.io/post/ftp-active-passive

-FTP 서버 응답 코드에 대한 자세한 설명 (아래 주소는 227꺼 위주로 보면 되고 더 필요하면 아래 사이트에서 찾으면 됨)

www.serv-u.com/resource/tutorial/225-226-227-230-ftp-response-codes

-EPSV vs PASV 모드에 대한 간략한 설명

supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk38618

 

 

Comments