[Cloud] Accessing AWS EC2 metadata and stealing sensitive information using SSRF

silver35·2023년 4월 30일

Cloud

목록 보기
1/1

SSRF(Server-Side Request Forgery) 란?

공격자가 접근이 불가능한 Server Side에서 이루어지는 요청을 변조 해 내부시스템에 접근하거나 외부로 데이터를 유출할 수 있는 공격이다.

SSRF를 이용한 AWS EC2 메타데이터 탈취

시나리오

AWS의 EC2 Instance Meta-data는 EC2 인스턴스 내부에서 실행 중인 애플리케이션에서 자신의 인스턴스 ID, 호스트 이름, 보안 그룹 및 IAM 역할과 같은 인스턴스에 대한 데이터이다. EC2 인스턴스 메타 데이터는 http://169.254.169.254 를 통해 접근할 수 있다. 시나리오는 아래와 같이 SSRF취약점을 이용해 AWS EC2 Instance Meta-data에 접근해 IAM Role(AccessKeyId, SecretAccessKey, Token)등을 획득한다. 그 후, S3 Stroage에 접근해 중요 데이터를 탈취한다.

실습

(1) 실습 환경 구축
아래와 같이 간단한 실습 페이지를 구축하였다.

소스코드는 url 파라미터에 전달된 url을 열고, 해당 url에서 응답 데이터를 읽어오는 코드이다.

from flask import Flask, request
import urllib.request

app = Flask(__name__)

@app.route('/render', methods=['GET'])
def fetch_url():
    url = request.args.get('url')

    if url:
        try:
            req = urllib.request.urlopen(url)
            data = req.read()
            req.close()
        except:
            return 'Error fetching URL'
        return data
    else:
        return 'URL parameter required'

(2) SSRF 취약점 확인
url 파라미터에 ifconfig.io 페이지 요청 시 응답값을 확인해보면 IP 주소와 Remote Host 정보가 내 현재 로컬 ip가 아닌 EC2 정보가 나와있다. 즉, 내가 직접 브라우저에서 url을 요청하지 않고 AWS 서비스가 직접 url를 요청해 응답값을 클라이언트에게 전달하는 것을 알 수 있다.

(3) IAM Role credential 획득
url파라미터에 EC2 인스턴스 메타데이터인 http://169.254.169.254/latest/meta-data 을 요청 시 iam 디렉터리를 확인할 수 있다.

아래 공식 문서에서 확인해보면 iam/security-credentials은 해당 EC2 인스턴스에 할당된 IAM Role를 확인할 수 있다.

그 후 iam/security-credentials/{role-name}을 요청 시 role-name과 연결 된 보안 자격을 확인할 수 있으며 AccessKeyId, SecretAccessKey, Token을 획득했다.

참고자료 ) 인스턴스 메타데이터 카테고리 - Amazon Elastic Compute Cloud

(4) AWS CLI를 통한 iAM Role 권한 탈취
aws 콘솔을 통해 (3)에서 탈취한 AWS Access Key ID, AWS Secret Access Key를 admin_role이라는 프로필을 생성한다.

/.aws/credentials 파일에 aws_session_token도 추가한다.

(5) s3 storage 접근

(4)에서 설정한 admin 계정으로 s3(저장소) 버킷 목록을 출력하면 아래와 같이 bucketsilver35의 버킷을 확인할 수 있다.
admin_role 프로필을 사용하여 AWS S3(Command Line Interface) CLI를 통해 "bucketsilver35" 버킷 내에 있는 객체(파일)의 목록을 가져온다. 아래와 같이 폴더 및 파일들을 확인할 수 있으며 우리는 secret 폴더 내에 credentials 파일을 탈취하고자 한다.
"admin_role" 프로필을 사용하여 AWS S3 (Command Line Interface) CLI를 통해 "bucketsilver35" 버킷 내에 있는 "secret/credentials" 객체(파일)를 로컬 파일 시스템에 "credentials.txt"라는 이름으로 다운로드 시도한다.
아래와 같이 다운로드한 credentials.txt 파일을 보면 ID, PW가 적혀있는 파일을 탈취하였다.

보안대책

인스턴스 메타데이터에 접근하는 옵션을 비활성화 시키거나 인스턴스 메타데이터 서비스 액세스 제한을 설정한다. 즉, Iptables을 이용하거나 IPFW를 사용하여 엑세스 제한을 한다. 또는 사용자 입력값을 검증해 입력한 데이터에 대해 허용할 List에 속하는 경우에만 처리를 하며 지정된 목록에 속하지 않는 경우 에러페이지를 응답하도록 설정한다.

참고자료) AWS Instance Meta-data SSRF to RCE
https://www.skshieldus.com/download/files/download.do?o_fname=EQST그룹이+제안하는+클라우드+모의해킹+방법론(AWS).pdf&r_fname=20220217153343976.pdf

0개의 댓글