연재 시리즈

EKS 스터디 - 6주차 2편 - EKS pod가 IMDS API를 악용하는 시나리오

악분 2023. 5. 28. 12:05
반응형

이 글은 pod가 IMDS API를 사용하여 AWS 리소스를 제어하는 공격 시나리오를 설명합니다.

 

IMDS API란? 

IMDS API(Instance Metadata Service)는 EC2 메타데이터를 조회하는 API입니다. EC2인스턴스에서 IMDS API를 호출할 수 있습니다. EKS 워커노드를 EC2인스턴스로 사용하면, pod또한 IMDS API를 사용할 수 있습니다. IMDS API는 옵션으로 활성화/비활성화 합니다.

 

이 글은 영상으로도 만나볼 수 있습니다.

https://youtu.be/0aIfpNReeBc

 

IMDS API 위험

IMDS API은 EC2 메타데이터를 쉽게 조회하는 장점이 있지만, 해커에게 악용될 위험이 있습니다. EC2 인스턴스 IAM role 조회, 임시자격증명 발급 등 악용될 API가 많습니다.

 

임시자격증명을 받급받으면 EC2인스턴스 IAM role에 설정된 IAM policy를 갖게 됩니다. 만약, IMA policy에 Administrator가 있다면 임시자격증명은 AWS 관리자 계정을 갖게됩니다.

 

공격 시나리오

시나리오는 취약한 웹 애플리케이션 pod에서 임시자격증명을 발급받고 S3를 조회합니다.

 

전제조건

시나리오가 성공하려면 전제조건이 필요합니다.

  • 웹 애플리케이션은 EKS EC2 인스턴스에 배포되야 한다.
  • EC2 인스턴스는 IMDS API가 사용가능해야 한다.
  • 웹 애플리케이션에서 원격코드실행 취약점이 있어야 한다.

 

EC2 인스턴스 설정

공격 시나리오는 IMDS API를 사용하므로 웹 애플리케이션은 EC2 인스턴스 워커노드에 배포되야 합니다. 그리고 EC2 인스턴스는 IMDS API 활성화해야 합니다. 저는 실습을 쉽게 하기 위해 IMDSv1사용하도록 설정했습니다.

 

웹 어플리케이션 원격코드 실행 취약점

IMDS API를 사용하기 위해 웹 어플리케이션에서 코드를 실행하는 취약점이 필요합니다. 저는 DVWA(웹 취약점 연습 애플리케이션)을 배포했습니다.

 

DVWA 배포방법은 제 github repo에 공개했습니다.

 

공격과정

해커는 웹 페이지에서 코드를 실행하는 취약점을 발견했습니다. 비트연산을 사용하여 코드를 실행했습니다.

 

해커는 탐색을 시작했습니다. id와 hostname을 확인했습니다. hostname이 난수가 포함되어 있는 것을 발견했습니다. 해커는 웹 애플리케이션이 컨테이너로 실행될 가능성을 찾은 겁니다.

 

환경변수를 탐색하여 웹 애플리케이션이 쿠버네티스에 실행되는 것을 알았습니다.

 

해커는 쿠버네티스가 어떤 환경에 실행되는지 확인했습니다. 온프레미스인지 AWS 등 클라우드에 실행되는지 탐색했습니다. 만약 클라우드에 쿠버네티스가 실행된다면 각 클라우드 고유 API를 호출할 수 있을 것 같았습니다.

 

해커는 IMDS API를 호출 응답을 보고 쿠버네티스가 AWS에 실행되는 것을 알았습니다. 그리고 워커노드는 EC2 인스턴스라는 것도 알았습니다.

 

해커는 AWS공식문서를 통해, IMDS API로 임시자격증명 발급이 가능한 것을 알았습니다.

 

EC2 인스턴스 IAM Role을 확인한 후, 임시자격증명을 발급받았습니다.

 

해커는 발급받은 임시자격증명을 사용하여 aws CLI를 사용했습니다. s3목록이 잘 조회된 걸로 봐서는 EC2 인스턴스 IAM role에 s3권한이 있는 것을 알았습니다. 이제 해커는 2차 공격을 위해 AWS 스크립트를 준비합니다.

 

마치며

이 글에서 소개한 공격 시나리오는 미흡한 소스코드 보안과 미흡한 EC2 인스턴스 설정으로 AWS 임시자격증명을 발급받았습니다. 그리고 네트워크 보안 설정도 안 되어 있어 무방비로 해커에게 공격당하는 환경이었습니다.

 

특히 IAM role에 최소한의 권한만 부여되지 않았기 때문에, 임시자격증명을 받은 해커는 S3까지 접근이 가능했습니다. 시나리오를 연구하면서 최소한 권한이 왜 중요한지 느끼게 된 계기였습니다.

 

IMDS API는 불가피한 상황이 아니면 사용하지 않는 것이 좋아 보입니다. 꼭 사용해야한다면 IMDSv2를 사용해야할 것 같습니다. IMDSv2는 API인증과정이 있기 때문에 토큰을 발급받아야 합니다. eksctl도 v0.143이상부터는 IMDSv2로 설정되어 있습니다.

반응형