mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/banners/hacktricks-training.md', 'src/pentesting-ci-cd/
This commit is contained in:
@@ -16,7 +16,7 @@ API 게이트웨이의 리소스 정책을 수정하여 자신에게 접근 권
|
||||
|
||||
### Modify Lambda Authorizers
|
||||
|
||||
모든 엔드포인트에 대한 접근 권한을 부여하기 위해 람다 인증자의 코드를 수정합니다.\
|
||||
람다 인증자의 코드를 수정하여 모든 엔드포인트에 대한 접근 권한을 부여합니다.\
|
||||
또는 인증자의 사용을 제거합니다.
|
||||
|
||||
### IAM Permissions
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Cognito
|
||||
|
||||
자세한 정보는 다음을 참조하십시오:
|
||||
자세한 정보는 다음을 참조하세요:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-cognito-enum/
|
||||
@@ -12,16 +12,16 @@
|
||||
|
||||
### 사용자 지속성
|
||||
|
||||
Cognito는 인증되지 않은 사용자와 인증된 사용자에게 역할을 부여하고 사용자 디렉토리를 제어할 수 있는 서비스입니다. 지속성을 유지하기 위해 변경할 수 있는 여러 가지 구성 요소가 있습니다:
|
||||
Cognito는 인증되지 않은 사용자와 인증된 사용자에게 역할을 부여하고 사용자 디렉토리를 제어할 수 있는 서비스입니다. 일부 지속성을 유지하기 위해 변경할 수 있는 여러 가지 구성은 다음과 같습니다:
|
||||
|
||||
- **사용자가 제어하는 사용자 풀**을 아이덴티티 풀에 추가
|
||||
- 인증되지 않은 아이덴티티 풀에 **IAM 역할을 부여하고 기본 인증 흐름을 허용**
|
||||
- 공격자가 로그인할 수 있는 경우 **인증된 아이덴티티 풀**에
|
||||
- 주어진 역할의 **권한을 개선**
|
||||
- **속성을 통해 사용자 생성, 검증 및 권한 상승**을 수행하거나 **사용자 풀**에 새로운 사용자 추가
|
||||
- **외부 아이덴티티 제공자**가 사용자 풀 또는 아이덴티티 풀에 로그인할 수 있도록 허용
|
||||
- **사용자 풀**에서 속성이 제어하는 사용자 또는 새로운 사용자를 통해 **생성, 검증 및 권한 상승**
|
||||
- **외부 아이덴티티 공급자**가 사용자 풀 또는 아이덴티티 풀에 로그인할 수 있도록 허용
|
||||
|
||||
이 작업을 수행하는 방법은 다음을 확인하십시오:
|
||||
이 작업을 수행하는 방법은 다음에서 확인하세요
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-cognito-privesc.md
|
||||
@@ -29,7 +29,7 @@ Cognito는 인증되지 않은 사용자와 인증된 사용자에게 역할을
|
||||
|
||||
### `cognito-idp:SetRiskConfiguration`
|
||||
|
||||
이 권한을 가진 공격자는 위험 구성을 수정하여 **알람이 발생하지 않고** Cognito 사용자로 로그인할 수 있습니다. [**CLI를 확인하십시오**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) 모든 옵션을 확인하려면:
|
||||
이 권한을 가진 공격자는 위험 구성을 수정하여 **알람이 발생하지 않고** Cognito 사용자로 로그인할 수 있습니다. [**CLI를 확인하세요**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) 모든 옵션을 확인하려면:
|
||||
```bash
|
||||
aws cognito-idp set-risk-configuration --user-pool-id <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
|
||||
@@ -38,7 +38,7 @@ aws lambda create-event-source-mapping \
|
||||
|
||||
### DynamoDB를 C2 채널로 사용하기
|
||||
|
||||
공격자는 명령을 포함하는 항목을 생성하고 손상된 인스턴스나 Lambda 함수를 사용하여 이러한 명령을 가져오고 실행함으로써 DynamoDB 테이블을 **명령 및 제어 (C2) 채널**로 사용할 수 있습니다.
|
||||
공격자는 명령을 포함하는 항목을 생성하고 손상된 인스턴스나 Lambda 함수를 사용하여 이러한 명령을 가져오고 실행함으로써 DynamoDB 테이블을 **명령 및 제어(C2) 채널**로 사용할 수 있습니다.
|
||||
```bash
|
||||
# Create a DynamoDB table for C2
|
||||
aws dynamodb create-table \
|
||||
@@ -54,6 +54,6 @@ aws dynamodb put-item \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
손상된 인스턴스나 Lambda 함수는 주기적으로 C2 테이블에서 새로운 명령을 확인하고, 이를 실행하며, 선택적으로 결과를 테이블에 다시 보고할 수 있습니다. 이는 공격자가 손상된 리소스에 대한 지속성과 제어를 유지할 수 있게 합니다.
|
||||
손상된 인스턴스나 Lambda 함수는 주기적으로 C2 테이블에서 새로운 명령을 확인하고, 이를 실행하며, 선택적으로 결과를 테이블에 다시 보고할 수 있습니다. 이를 통해 공격자는 손상된 리소스에 대한 지속성과 제어를 유지할 수 있습니다.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -14,12 +14,12 @@
|
||||
|
||||
수비수가 **EC2 인스턴스가 침해되었다**고 판단하면, 그는 아마도 **네트워크**를 **격리**하려고 할 것입니다. 그는 명시적인 **Deny NACL**을 사용하거나 (하지만 NACL은 전체 서브넷에 영향을 미침), **보안 그룹을 변경하여** **모든 종류의 인바운드 또는 아웃바운드** 트래픽을 허용하지 않을 수 있습니다.
|
||||
|
||||
공격자가 **기계에서 시작된 리버스 셸**을 가지고 있었다면, SG가 인바운드 또는 아웃바운드 트래픽을 허용하지 않도록 수정되더라도, **연결은** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**로 인해 종료되지 않을 것입니다.**
|
||||
공격자가 **기계에서 발생한 리버스 셸**을 가지고 있었다면, SG가 인바운드 또는 아웃바운드 트래픽을 허용하지 않도록 수정되더라도, **연결은** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**로 인해 종료되지 않을 것입니다.**
|
||||
|
||||
### EC2 Lifecycle Manager
|
||||
|
||||
이 서비스는 **AMI 및 스냅샷의 생성**을 **예약**하고 심지어 **다른 계정과 공유**할 수 있게 해줍니다.\
|
||||
공격자는 **모든 이미지 또는 모든 볼륨의 AMI 또는 스냅샷 생성을** **매주** 구성하고 **자신의 계정과 공유**할 수 있습니다.
|
||||
공격자는 **모든 이미지 또는 모든 볼륨의 AMI 또는 스냅샷 생성을** **매주** 예약하고 **자신의 계정과 공유**할 수 있습니다.
|
||||
|
||||
### Scheduled Instances
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
### Spot Fleet Request
|
||||
|
||||
스팟 인스턴스는 **정규 인스턴스보다 저렴**합니다. 공격자는 **5년 동안의 작은 스팟 플릿 요청**을 시작할 수 있으며 (예를 들어), **자동 IP** 할당과 **스팟 인스턴스가 시작될 때 공격자에게 전송되는 사용자 데이터**와 **높은 권한의 IAM 역할**을 사용할 수 있습니다.
|
||||
스팟 인스턴스는 **정규 인스턴스보다 저렴**합니다. 공격자는 **5년 동안의 작은 스팟 플릿 요청**을 시작할 수 있으며 (예를 들어), **자동 IP** 할당과 **스팟 인스턴스가 시작될 때 공격자에게 전송되는 사용자 데이터**를 포함할 수 있습니다. **IP 주소**와 함께 **높은 권한의 IAM 역할**을 사용할 수 있습니다.
|
||||
|
||||
### Backdoor Instances
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
### 리포지토리 정책
|
||||
|
||||
리포지토리에 대한 접근 권한을 자신(또는 모든 사람)에게 부여하는 정책을 추가하세요:
|
||||
리포지토리에 대한 액세스를 자신(또는 모든 사람)에게 부여하는 정책을 단일 리포지토리에 추가하세요:
|
||||
```bash
|
||||
aws ecr set-repository-policy \
|
||||
--repository-name cluster-autoscaler \
|
||||
@@ -41,15 +41,15 @@ aws ecr set-repository-policy \
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> ECR는 사용자가 **인증**을 위해 **`ecr:GetAuthorizationToken`** API를 호출할 수 있는 **권한**을 IAM 정책을 통해 가져야 한다는 점에 유의하십시오. 그래야만 레지스트리에 인증하고 Amazon ECR 리포지토리에서 이미지를 푸시하거나 풀 수 있습니다.
|
||||
> ECR는 사용자가 **인증**을 위해 **`ecr:GetAuthorizationToken`** API를 호출할 수 있는 **권한**을 IAM 정책을 통해 가져야 한다는 점에 유의하십시오. 이를 통해 레지스트리에 인증하고 Amazon ECR 리포지토리에서 이미지를 푸시하거나 풀 수 있습니다.
|
||||
|
||||
### 레지스트리 정책 및 크로스 계정 복제
|
||||
|
||||
크로스 계정 복제를 구성하여 외부 계정에서 레지스트리를 자동으로 복제하는 것이 가능합니다. 여기서 레지스트리를 복제하려는 **외부 계정**을 **지정**해야 합니다.
|
||||
외부 계정에서 레지스트리를 자동으로 복제하는 것이 가능하며, 이 경우 레지스트리를 복제할 외부 계정을 **지정해야** 합니다.
|
||||
|
||||
<figure><img src="../../../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
먼저, 다음과 같은 **레지스트리 정책**을 사용하여 외부 계정에 레지스트리에 대한 액세스를 부여해야 합니다:
|
||||
먼저, 외부 계정에 **레지스트리 정책**을 통해 레지스트리에 대한 액세스를 부여해야 합니다:
|
||||
```bash
|
||||
aws ecr put-registry-policy --policy-text file://my-policy.json
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# AWS - ECS Persistence
|
||||
# AWS - ECS 지속성
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECS
|
||||
|
||||
자세한 내용은 다음을 확인하세요:
|
||||
자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-ecs-enum.md
|
||||
@@ -44,7 +44,7 @@ aws events put-targets --rule "malicious-ecs-task-rule" --targets '[
|
||||
}
|
||||
]'
|
||||
```
|
||||
### 기존 ECS 작업 정의에서 백도어 컨테이너
|
||||
### 기존 ECS 작업 정의의 백도어 컨테이너
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: 테스트
|
||||
|
||||
+3
-3
@@ -12,15 +12,15 @@
|
||||
|
||||
### 인스턴스 내 지속성
|
||||
|
||||
AWS 계정 내에서 지속성을 유지하기 위해 **인스턴스 내에 지속성 메커니즘을 도입할 수 있습니다** (cron job, ssh key...) 그래서 공격자는 이를 통해 접근하고 IAM 역할 **자격 증명을 메타데이터 서비스에서 탈취할 수 있습니다**.
|
||||
AWS 계정 내에서 지속성을 유지하기 위해, **인스턴스 내에 지속성 메커니즘을 도입할 수 있습니다** (cron job, ssh key...) 그래서 공격자는 이를 통해 접근하고 IAM 역할 **자격 증명을 메타데이터 서비스에서 탈취할 수 있습니다**.
|
||||
|
||||
### 버전 내 백도어
|
||||
|
||||
공격자는 S3 리포지토리 내의 코드를 백도어하여 항상 자신의 백도어와 예상되는 코드가 실행되도록 할 수 있습니다.
|
||||
공격자는 S3 리포지토리 내의 코드를 백도어하여 항상 자신의 백도어와 예상 코드를 실행하도록 할 수 있습니다.
|
||||
|
||||
### 새로운 백도어 버전
|
||||
|
||||
공격자는 실제 버전의 코드를 변경하는 대신 애플리케이션의 새로운 백도어 버전을 배포할 수 있습니다.
|
||||
공격자는 실제 버전의 코드를 변경하는 대신, 애플리케이션의 새로운 백도어 버전을 배포할 수 있습니다.
|
||||
|
||||
### 사용자 정의 리소스 생명 주기 훅 악용
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
### 일반적인 IAM 지속성
|
||||
|
||||
- 사용자 생성
|
||||
- 제어된 사용자를 권한이 있는 그룹에 추가
|
||||
- 제어된 사용자를 특권 그룹에 추가
|
||||
- 액세스 키 생성 (새 사용자 또는 모든 사용자)
|
||||
- 제어된 사용자/그룹에 추가 권한 부여 (첨부된 정책 또는 인라인 정책)
|
||||
- MFA 비활성화 / 자신의 MFA 장치 추가
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
### 백도어 역할 신뢰 정책
|
||||
|
||||
신뢰 정책에 백도어를 추가하여 외부 리소스를 당신이 제어할 수 있도록 가정할 수 있습니다 (또는 모든 사용자에게):
|
||||
신뢰 정책에 백도어를 추가하여 외부 리소스를 가정할 수 있습니다 (또는 모든 사용자에게):
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - KMS Persistence
|
||||
# AWS - KMS 지속성
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### KMS 정책을 통한 접근 권한 부여
|
||||
|
||||
공격자는 **`kms:PutKeyPolicy`** 권한을 사용하여 자신의 제어 하에 있는 사용자에게 키에 대한 **접근 권한을 부여**하거나 외부 계정에 부여할 수 있습니다. 더 많은 정보는 [**KMS Privesc 페이지**](../aws-privilege-escalation/aws-kms-privesc.md)를 확인하세요.
|
||||
공격자는 **`kms:PutKeyPolicy`** 권한을 사용하여 자신의 통제 하에 있는 사용자에게 키에 대한 **접근 권한을 부여**하거나 심지어 외부 계정에 부여할 수 있습니다. 더 많은 정보는 [**KMS Privesc 페이지**](../aws-privilege-escalation/aws-kms-privesc.md)를 확인하세요.
|
||||
|
||||
### 영구 권한 부여
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### Lambda Layer Persistence
|
||||
|
||||
람다가 은밀하게 실행될 때 **임의의 코드를 실행하기 위해 레이어를 도입/백도어**하는 것이 가능합니다:
|
||||
람다가 은밀하게 실행될 때 **임의 코드를 실행하기 위해 레이어를 도입/백도어**하는 것이 가능합니다:
|
||||
|
||||
{{#ref}}
|
||||
aws-lambda-layers-persistence.md
|
||||
@@ -35,7 +35,7 @@ aws-abusing-lambda-extensions.md
|
||||
### Versions, Aliases & Weights
|
||||
|
||||
람다는 **다양한 버전**(각 버전마다 다른 코드)을 가질 수 있습니다.\
|
||||
그런 다음, **다양한 버전의 람다에 대해 다양한 별칭을 생성**하고 각 별칭에 대해 다른 가중치를 설정할 수 있습니다.\
|
||||
그런 다음, **다양한 버전의 람다에 대해 다양한 별칭을 생성하고** 각 별칭에 대해 다른 가중치를 설정할 수 있습니다.\
|
||||
이렇게 하면 공격자는 **백도어가 있는 버전 1**과 **정상 코드만 있는 버전 2**를 생성하고 **1%의 요청에서만 버전 1을 실행**하여 은밀함을 유지할 수 있습니다.
|
||||
|
||||
<figure><img src="../../../../images/image (120).png" alt=""><figcaption></figcaption></figure>
|
||||
@@ -43,8 +43,8 @@ aws-abusing-lambda-extensions.md
|
||||
### Version Backdoor + API Gateway
|
||||
|
||||
1. Lambda의 원본 코드를 복사합니다.
|
||||
2. 원본 코드를 **백도어하는 새로운 버전을 생성**합니다(또는 악성 코드만 포함). 해당 버전을 게시하고 **$LATEST에 배포**합니다.
|
||||
1. 람다와 관련된 API 게이트웨이를 호출하여 코드를 실행합니다.
|
||||
2. **원본 코드를 백도어하는 새로운 버전을 생성**합니다(또는 악성 코드만 포함). 해당 버전을 게시하고 **$LATEST에 배포**합니다.
|
||||
1. 코드를 실행하기 위해 람다와 관련된 API 게이트웨이를 호출합니다.
|
||||
3. **원본 코드로 새로운 버전을 생성**, 게시하고 해당 **버전을 $LATEST에 배포**합니다.
|
||||
1. 이렇게 하면 이전 버전에서 백도어 코드가 숨겨집니다.
|
||||
4. API Gateway로 이동하여 **새 POST 메서드**(또는 다른 메서드 선택)를 생성하여 람다의 백도어 버전을 실행합니다: `arn:aws:lambda:us-east-1:<acc_id>:function:<func_name>:1`
|
||||
@@ -54,11 +54,11 @@ aws-abusing-lambda-extensions.md
|
||||
|
||||
### Cron/Event actuator
|
||||
|
||||
무언가가 발생하거나 시간이 경과할 때 **람다 함수를 실행할 수 있다는 사실**은 람다를 지속성을 얻고 탐지를 피하는 좋은 일반적인 방법으로 만듭니다.\
|
||||
무언가가 발생하거나 시간이 경과할 때 **람다 함수를 실행할 수 있다는 사실**은 람다를 지속성을 얻고 탐지를 피하는 좋은 방법으로 만듭니다.\
|
||||
여기 AWS에서 **은밀하게 존재하기 위해 람다를 생성하는 몇 가지 아이디어가 있습니다**.
|
||||
|
||||
- 새로운 사용자가 생성될 때마다 람다가 새로운 사용자 키를 생성하고 공격자에게 보냅니다.
|
||||
- 새로운 사용자가 생성될 때마다 람다가 새로운 사용자 키를 생성하고 공격자에게 전송합니다.
|
||||
- 새로운 역할이 생성될 때마다 람다가 손상된 사용자에게 역할 수임 권한을 부여합니다.
|
||||
- 새로운 클라우드트레일 로그가 생성될 때마다 이를 삭제/변경합니다.
|
||||
- 새로운 cloudtrail 로그가 생성될 때마다 삭제/변경합니다.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+5
-5
@@ -11,11 +11,11 @@ Lambda 확장은 다양한 **모니터링, 가시성, 보안 및 거버넌스
|
||||
|
||||
[**Lambda 확장이 작동하는 방식에 대한 자세한 정보는 문서를 확인하세요**](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html).
|
||||
|
||||
### 지속성, 요청 도용 및 요청 수정용 외부 확장
|
||||
### 지속성, 요청 훔치기 및 요청 수정용 외부 확장
|
||||
|
||||
이 게시물에서 제안된 기술의 요약입니다: [https://www.clearvector.com/blog/lambda-spy/](https://www.clearvector.com/blog/lambda-spy/)
|
||||
|
||||
Lambda 런타임 환경의 기본 Linux 커널이 “**process_vm_readv**” 및 “**process_vm_writev**” 시스템 호출로 컴파일되어 있다는 것이 발견되었습니다. 그리고 모든 프로세스는 동일한 사용자 ID로 실행되며, 외부 확장을 위해 생성된 새로운 프로세스도 마찬가지입니다. **이는 외부 확장이 설계상 Rapid의 힙 메모리에 대한 전체 읽기 및 쓰기 접근 권한을 갖는다는 것을 의미합니다.**
|
||||
Lambda 런타임 환경의 기본 Linux 커널이 “**process_vm_readv**” 및 “**process_vm_writev**” 시스템 호출로 컴파일되어 있다는 것이 발견되었습니다. 그리고 모든 프로세스는 동일한 사용자 ID로 실행되며, 외부 확장을 위해 생성된 새로운 프로세스도 마찬가지입니다. **이는 외부 확장이 설계상 Rapid의 힙 메모리에 대한 전체 읽기 및 쓰기 액세스를 갖는다는 것을 의미합니다.**
|
||||
|
||||
게다가, Lambda 확장은 **호출 이벤트에 구독할 수 있는 능력**이 있지만, AWS는 이러한 확장에 원시 데이터를 공개하지 않습니다. 이는 **확장이 HTTP 요청을 통해 전송된 민감한 정보에 접근할 수 없도록 보장합니다.**
|
||||
|
||||
@@ -26,13 +26,13 @@ Init (Rapid) 프로세스는 [http://127.0.0.1:9001](http://127.0.0.1:9001/)에
|
||||
변수 **`AWS_LAMBDA_RUNTIME_API`**는 **자식 런타임 프로세스** 및 추가 확장에 대한 Rapid API의 **IP** 주소와 **포트** 번호를 나타냅니다.
|
||||
|
||||
> [!WARNING]
|
||||
> **`AWS_LAMBDA_RUNTIME_API`** 환경 변수를 우리가 접근할 수 있는 **`port`**로 변경하면 Lambda 런타임 내의 모든 작업을 가로챌 수 있습니다 (**중간자 공격**). 이는 확장이 Rapid Init과 동일한 권한으로 실행되며, 시스템의 커널이 **프로세스 메모리 수정**을 허용하여 포트 번호를 변경할 수 있기 때문에 가능합니다.
|
||||
> **`AWS_LAMBDA_RUNTIME_API`** 환경 변수를 우리가 접근할 수 있는 **`port`**로 변경함으로써, Lambda 런타임 내의 모든 작업을 가로챌 수 있습니다 (**man-in-the-middle**). 이는 확장이 Rapid Init과 동일한 권한으로 실행되며, 시스템의 커널이 **프로세스 메모리 수정**을 허용하여 포트 번호를 변경할 수 있기 때문에 가능합니다.
|
||||
|
||||
**확장이 모든 런타임 코드 이전에 실행되기 때문에**, 환경 변수를 수정하면 런타임 프로세스(예: Python, Java, Node, Ruby)가 시작될 때 영향을 미칩니다. 또한, 이 변수에 의존하는 **우리 이후에 로드된 확장**도 우리의 확장을 통해 라우팅됩니다. 이 설정은 악성 소프트웨어가 보안 조치나 로깅 확장을 런타임 환경 내에서 완전히 우회할 수 있게 할 수 있습니다.
|
||||
**확장이 모든 런타임 코드 이전에 실행되기 때문에**, 환경 변수를 수정하면 런타임 프로세스(예: Python, Java, Node, Ruby)가 시작될 때 영향을 미칩니다. 또한, **우리의 확장 이후에 로드된** 확장도 이 변수를 의존하여 우리의 확장을 통해 라우팅됩니다. 이 설정은 악성 코드가 보안 조치나 로깅 확장을 런타임 환경 내에서 완전히 우회할 수 있게 할 수 있습니다.
|
||||
|
||||
<figure><img src="../../../../images/image (267).png" alt=""><figcaption><p><a href="https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.mitm.png">https://www.clearvector.com/blog/content/images/size/w1000/2022/11/2022110801.rapid.mitm.png</a></p></figcaption></figure>
|
||||
|
||||
도구 [**lambda-spy**](https://github.com/clearvector/lambda-spy)는 **메모리 쓰기**를 수행하고 Lambda 요청, 다른 **확장** **요청**에서 민감한 정보를 **도용**하고 **수정**하기 위해 만들어졌습니다.
|
||||
도구 [**lambda-spy**](https://github.com/clearvector/lambda-spy)는 **메모리 쓰기**를 수행하고 Lambda 요청, 다른 **확장** **요청**에서 민감한 정보를 **훔치고** 심지어 **수정하는** 데 사용됩니다.
|
||||
|
||||
## 참고 문헌
|
||||
|
||||
|
||||
+23
-23
@@ -8,7 +8,7 @@ Lambda 레이어는 **추가 코드를 포함할 수 있는** .zip 파일 아카
|
||||
|
||||
**함수당 최대 다섯 개의 레이어**를 포함할 수 있습니다. 함수에 레이어를 포함하면 **내용이 실행 환경의 `/opt`** 디렉토리에 추출됩니다.
|
||||
|
||||
**기본적으로**, 생성한 **레이어**는 **귀하의 AWS 계정에만 비공개**입니다. 다른 계정과 레이어를 **공유**하거나 레이어를 **공개**할 수 있습니다. 귀하의 함수가 다른 계정에서 게시한 레이어를 사용하는 경우, 레이어가 삭제되거나 레이어에 대한 접근 권한이 취소된 후에도 **함수는 레이어 버전을 계속 사용할 수 있습니다**. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.
|
||||
**기본적으로**, 생성한 **레이어**는 AWS 계정에 **비공개**입니다. 다른 계정과 레이어를 **공유**하거나 레이어를 **공개**할 수 있습니다. 함수가 다른 계정에서 게시한 레이어를 사용하는 경우, 해당 레이어가 삭제되거나 레이어에 대한 접근 권한이 취소된 후에도 **함수는 레이어 버전을 계속 사용할 수 있습니다**. 그러나 삭제된 레이어 버전을 사용하여 새 함수를 생성하거나 함수를 업데이트할 수는 없습니다.
|
||||
|
||||
컨테이너 이미지로 배포된 함수는 레이어를 사용하지 않습니다. 대신, 이미지를 빌드할 때 선호하는 런타임, 라이브러리 및 기타 종속성을 컨테이너 이미지에 패키징합니다.
|
||||
|
||||
@@ -18,23 +18,23 @@ Python이 lambda에서 사용할 load path는 다음과 같습니다:
|
||||
```
|
||||
['/var/task', '/opt/python/lib/python3.9/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python39.zip', '/var/lang/lib/python3.9', '/var/lang/lib/python3.9/lib-dynload', '/var/lang/lib/python3.9/site-packages', '/opt/python/lib/python3.9/site-packages']
|
||||
```
|
||||
Check how the **second** and third **positions** are occupy by directories where **lambda layers** uncompress their files: **`/opt/python/lib/python3.9/site-packages`** and **`/opt/python`**
|
||||
두 번째와 세 번째 위치는 **lambda layers**가 파일을 압축 해제하는 디렉토리인 **`/opt/python/lib/python3.9/site-packages`**와 **`/opt/python`**에 의해 차지됩니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> If an attacker managed to **backdoor** a used lambda **layer** or **add one** that will be **executing arbitrary code when a common library is loaded**, he will be able to execute malicious code with each lambda invocation.
|
||||
> 공격자가 사용 중인 lambda **layer**에 **백도어**를 걸거나 **일반 라이브러리가 로드될 때 임의의 코드를 실행하는** **layer**를 추가하면, 각 lambda 호출 시 악성 코드를 실행할 수 있습니다.
|
||||
|
||||
따라서 요구 사항은 다음과 같습니다:
|
||||
|
||||
- **Check libraries** that are **loaded** by the victims code
|
||||
- Create a **proxy library with lambda layers** that will **execute custom code** and **load the original** library.
|
||||
- 피해자의 코드에 의해 **로드되는 라이브러리** 확인
|
||||
- **커스텀 코드를 실행하고 원래** 라이브러리를 **로드하는 lambda layers**로 **프록시 라이브러리** 생성
|
||||
|
||||
### Preloaded libraries
|
||||
### 미리 로드된 라이브러리
|
||||
|
||||
> [!WARNING]
|
||||
> When abusing this technique I found a difficulty: Some libraries are **already loaded** in python runtime when your code gets executed. I was expecting to find things like `os` or `sys`, but **even `json` library was loaded**.\
|
||||
> In order to abuse this persistence technique, the code needs to **load a new library that isn't loaded** when the code gets executed.
|
||||
> 이 기술을 악용할 때 어려움을 발견했습니다: 일부 라이브러리는 코드가 실행될 때 파이썬 런타임에 **이미 로드되어** 있습니다. `os`나 `sys`와 같은 것들을 찾을 것으로 예상했지만, **`json` 라이브러리조차 로드되어 있었습니다.**\
|
||||
> 이 지속성 기술을 악용하기 위해서는 코드가 실행될 때 **로드되지 않은 새로운 라이브러리**를 **로드해야** 합니다.
|
||||
|
||||
With a python code like this one it's possible to obtain the **list of libraries that are pre loaded** inside python runtime in lambda:
|
||||
이와 같은 파이썬 코드를 사용하면 lambda의 파이썬 런타임 내에서 **미리 로드된 라이브러리 목록**을 얻을 수 있습니다:
|
||||
```python
|
||||
import sys
|
||||
|
||||
@@ -44,24 +44,24 @@ return {
|
||||
'body': str(sys.modules.keys())
|
||||
}
|
||||
```
|
||||
그리고 이것은 **목록**입니다 (라이브러리 `os` 또는 `json`이 이미 있는지 확인하십시오)
|
||||
그리고 이것은 **목록**입니다 (라이브러리 `os` 또는 `json`이 이미 있는지 확인하세요)
|
||||
```
|
||||
'sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'pwd', '_locale', '_bootlocale', 'site', 'types', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'copyreg', 're', '_json', 'json.scanner', 'json.decoder', 'json.encoder', 'json', 'token', 'tokenize', 'linecache', 'traceback', 'warnings', '_weakrefset', 'weakref', 'collections.abc', '_string', 'string', 'threading', 'atexit', 'logging', 'awslambdaric', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib', 'awslambdaric.lambda_context', 'http', 'email', 'email.errors', 'binascii', 'email.quoprimime', '_struct', 'struct', 'base64', 'email.base64mime', 'quopri', 'email.encoders', 'email.charset', 'email.header', 'math', '_bisect', 'bisect', '_random', '_sha512', 'random', '_socket', 'select', 'selectors', 'errno', 'array', 'socket', '_datetime', 'datetime', 'urllib', 'urllib.parse', 'locale', 'calendar', 'email._parseaddr', 'email.utils', 'email._policybase', 'email.feedparser', 'email.parser', 'uu', 'email._encoded_words', 'email.iterators', 'email.message', '_ssl', 'ssl', 'http.client', 'runtime_client', 'numbers', '_decimal', 'decimal', '__future__', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.compat', 'simplejson._speedups', 'simplejson.scanner', 'simplejson.decoder', 'simplejson.encoder', 'simplejson', 'awslambdaric.lambda_runtime_exception', 'awslambdaric.lambda_runtime_marshaller', 'awslambdaric.lambda_runtime_client', 'awslambdaric.bootstrap', 'awslambdaric.__main__', 'lambda_function'
|
||||
```
|
||||
그리고 이것은 **람다에서 기본적으로 설치된 라이브러리** 목록입니다: [https://gist.github.com/gene1wood/4a052f39490fae00e0c3](https://gist.github.com/gene1wood/4a052f39490fae00e0c3)
|
||||
그리고 이것은 **lambda가 기본적으로 설치한 라이브러리** 목록입니다: [https://gist.github.com/gene1wood/4a052f39490fae00e0c3](https://gist.github.com/gene1wood/4a052f39490fae00e0c3)
|
||||
|
||||
### 람다 레이어 백도어
|
||||
### Lambda Layer 백도어
|
||||
|
||||
이 예제에서는 타겟 코드가 **`csv`**를 임포트한다고 가정해 보겠습니다. 우리는 **`csv` 라이브러리의 임포트를 백도어**할 것입니다.
|
||||
|
||||
이를 위해, 우리는 **`/opt/python/lib/python3.9/site-packages`** 경로에 **`__init__.py`** 파일이 있는 **csv** 디렉토리를 **생성**할 것입니다.\
|
||||
그런 다음, 람다가 실행되고 **csv**를 로드하려고 할 때, 우리의 **`__init__.py` 파일이 로드되고 실행될 것입니다**.\
|
||||
이를 위해, 우리는 lambda에 의해 로드되는 경로에 **`csv`** 디렉토리와 그 안에 **`__init__.py`** 파일을 생성할 것입니다: **`/opt/python/lib/python3.9/site-packages`**\
|
||||
그런 다음, lambda가 실행되고 **csv**를 로드하려고 할 때, 우리의 **`__init__.py` 파일이 로드되고 실행될 것입니다**.\
|
||||
이 파일은 다음을 수행해야 합니다:
|
||||
|
||||
- 우리의 페이로드를 실행
|
||||
- 원래의 csv 라이브러리 로드
|
||||
- 우리의 페이로드를 실행합니다
|
||||
- 원래의 csv 라이브러리를 로드합니다
|
||||
|
||||
우리는 다음을 통해 두 가지를 모두 수행할 수 있습니다:
|
||||
우리는 다음을 사용하여 두 가지를 모두 수행할 수 있습니다:
|
||||
```python
|
||||
import sys
|
||||
from urllib import request
|
||||
@@ -83,11 +83,11 @@ import csv as _csv
|
||||
|
||||
sys.modules["csv"] = _csv
|
||||
```
|
||||
그런 다음, 이 코드를 **`python/lib/python3.9/site-packages/__init__.py`** 경로에 포함하여 zip 파일을 만들고 이를 lambda layer로 추가합니다.
|
||||
그런 다음, 이 코드를 경로 **`python/lib/python3.9/site-packages/__init__.py`**에 넣고 lambda 레이어로 추가하는 zip 파일을 만듭니다.
|
||||
|
||||
이 코드는 [**https://github.com/carlospolop/LambdaLayerBackdoor**](https://github.com/carlospolop/LambdaLayerBackdoor)에서 찾을 수 있습니다.
|
||||
|
||||
통합된 페이로드는 **첫 번째 호출 시 또는 lambda 컨테이너가 재설정된 후 IAM 자격 증명을 서버로 전송합니다** (코드 변경 또는 콜드 람다), 그러나 **다음과 같은 다른 기술**도 통합될 수 있습니다:
|
||||
통합된 페이로드는 **IAM 자격 증명을 서버로 전송합니다. 처음 호출되거나 lambda 컨테이너가 재설정된 후**(코드 변경 또는 콜드 람다) **다음과 같은 다른 기술**도 통합될 수 있습니다:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md
|
||||
@@ -95,14 +95,14 @@ sys.modules["csv"] = _csv
|
||||
|
||||
### 외부 레이어
|
||||
|
||||
**외부 계정의 lambda layers를 사용할 수 있다는 점에 유의하십시오.** 또한, lambda는 권한이 없더라도 외부 계정의 레이어를 사용할 수 있습니다.\
|
||||
**외부 계정의 lambda 레이어를 사용할 수 있다는 점에 유의하십시오.** 또한, lambda는 권한이 없더라도 외부 계정의 레이어를 사용할 수 있습니다.\
|
||||
또한 **lambda가 가질 수 있는 최대 레이어 수는 5개**입니다.
|
||||
|
||||
따라서 이 기술의 다재다능성을 향상시키기 위해 공격자는 다음과 같은 방법을 사용할 수 있습니다:
|
||||
|
||||
- 사용자의 기존 레이어에 백도어를 설치합니다 (외부는 없습니다)
|
||||
- **자신의 계정에** **레이어**를 **생성**하고, **희생자 계정에 레이어 사용 권한을 부여**하고, **희생자의 Lambda에 레이어를 구성**한 후 **권한을 제거**합니다.
|
||||
- **Lambda**는 여전히 **레이어를 사용할 수 있으며** **희생자는** **레이어 코드를 다운로드할 수 있는 쉬운 방법이 없습니다** (람다 내부에서 rev shell을 얻는 것을 제외하고)
|
||||
- 사용자의 기존 레이어에 백도어를 설치합니다(외부는 없음).
|
||||
- **자신의 계정에** **레이어**를 **생성**하고, **희생자 계정에** 레이어 사용 권한을 부여한 후, **희생자의 Lambda에서** **레이어를 구성**하고 **권한을 제거**합니다.
|
||||
- **Lambda**는 여전히 **레이어를 사용할 수 있으며** **희생자는** **레이어 코드를 다운로드할 수 있는 쉬운 방법이 없습니다**(람다 내부에서 리버스 쉘을 얻는 것을 제외하고).
|
||||
- 희생자는 **`aws lambda list-layers`**를 사용하여 **외부 레이어를 볼 수 없습니다**.
|
||||
```bash
|
||||
# Upload backdoor layer
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - RDS Persistence
|
||||
# AWS - RDS 지속성
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
|
||||
### KMS 클라이언트 측 암호화
|
||||
|
||||
암호화 프로세스가 완료되면 사용자는 KMS API를 사용하여 새 키(`aws kms generate-data-key`)를 생성하고 **생성된 암호화된 키를 파일의 메타데이터에 저장**합니다 ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) 그래서 복호화가 발생할 때 KMS를 사용하여 다시 복호화할 수 있습니다:
|
||||
암호화 프로세스가 완료되면 사용자는 KMS API를 사용하여 새 키(`aws kms generate-data-key`)를 생성하고 **생성된 암호화 키를 파일의 메타데이터에 저장합니다** ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) 그래서 복호화가 발생할 때 KMS를 사용하여 다시 복호화할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
따라서 공격자는 메타데이터에서 이 키를 가져와 KMS(`aws kms decrypt`)로 복호화하여 정보를 암호화하는 데 사용된 키를 얻을 수 있습니다. 이렇게 하면 공격자는 암호화 키를 가지게 되고, 만약 그 키가 다른 파일을 암호화하는 데 재사용된다면 이를 사용할 수 있습니다.
|
||||
따라서 공격자는 메타데이터에서 이 키를 가져와 KMS(`aws kms decrypt`)로 복호화하여 정보를 암호화하는 데 사용된 키를 얻을 수 있습니다. 이렇게 하면 공격자는 암호화 키를 가지게 되고, 그 키가 다른 파일을 암호화하는 데 재사용된다면 이를 사용할 수 있습니다.
|
||||
|
||||
### S3 ACL 사용하기
|
||||
|
||||
|
||||
+2
-2
@@ -12,13 +12,13 @@
|
||||
|
||||
### 리소스 정책을 통한 접근
|
||||
|
||||
리소스 정책을 통해 **외부 계정에 비밀에 대한 접근 권한을 부여**할 수 있습니다. 자세한 내용은 [**Secrets Manager Privesc 페이지**](../aws-privilege-escalation/aws-secrets-manager-privesc.md)를 확인하세요. **비밀에 접근하기 위해서는** 외부 계정이 **비밀을 암호화하는 KMS 키에 대한 접근 권한도 필요**하다는 점에 유의하세요.
|
||||
리소스 정책을 통해 **외부 계정에 비밀에 대한 접근 권한을 부여**할 수 있습니다. 더 많은 정보는 [**Secrets Manager Privesc 페이지**](../aws-privilege-escalation/aws-secrets-manager-privesc.md)를 확인하세요. **비밀에 접근하기 위해서는** 외부 계정이 **비밀을 암호화하는 KMS 키에 대한 접근 권한도 필요**하다는 점에 유의하세요.
|
||||
|
||||
### Secrets Rotate Lambda를 통한 접근
|
||||
|
||||
비밀을 자동으로 **회전**하기 위해 구성된 **Lambda**가 호출됩니다. 공격자가 **코드**를 **변경**할 수 있다면, 그는 직접 **새 비밀을 자신에게 유출**할 수 있습니다.
|
||||
|
||||
이런 행동을 위한 Lambda 코드의 예시는 다음과 같을 수 있습니다:
|
||||
이런 행동을 위한 lambda 코드의 예시는 다음과 같을 수 있습니다:
|
||||
```python
|
||||
import boto3
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - SNS Persistence
|
||||
# AWS - SNS 지속성
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Persistence
|
||||
### 지속성
|
||||
|
||||
**SNS 주제**를 생성할 때 **누가 읽고 쓸 수 있는지** IAM 정책으로 지정해야 합니다. 외부 계정, 역할의 ARN 또는 **"\*"**를 지정할 수 있습니다.\
|
||||
다음 정책은 AWS의 모든 사용자에게 **`MySNS.fifo`**라는 SNS 주제에서 읽고 쓸 수 있는 권한을 부여합니다:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - SQS Persistence
|
||||
# AWS - SQS 지속성
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -32,6 +32,6 @@ SQS에서는 IAM 정책으로 **누가 읽고 쓸 수 있는지** 명시해야
|
||||
}
|
||||
```
|
||||
> [!NOTE]
|
||||
> 새로운 메시지가 큐에 추가될 때마다 **공격자의 계정에서 Lambda를 트리거할 수 있습니다** (어떻게든 다시 추가해야 합니다). 이를 위해 다음 지침을 따르십시오: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
> 새로운 메시지가 큐에 추가될 때마다 **공격자의 계정에서 Lambda를 트리거할 수 있습니다** (다시 추가해야 할 필요가 있습니다). 이를 위해 다음 지침을 따르십시오: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1 +1 @@
|
||||
# AWS - SSM Perssitence
|
||||
# AWS - SSM 지속성
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Step Functions
|
||||
|
||||
자세한 내용은 다음을 확인하세요:
|
||||
자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
|
||||
@@ -21,9 +21,9 @@ aws sts get-session-token \
|
||||
--serial-number <mfa-device-name> \
|
||||
--token-code <code-from-token>
|
||||
|
||||
# 하드웨어 장치 이름은 일반적으로 장치 뒷면의 번호, 예: GAHT12345678
|
||||
<strong># SMS 장치 이름은 AWS의 ARN, 예: arn:aws:iam::123456789012:sms-mfa/username
|
||||
</strong># 가상 장치 이름은 AWS의 ARN, 예: arn:aws:iam::123456789012:mfa/username
|
||||
# 하드웨어 장치 이름은 일반적으로 장치 뒷면의 번호입니다, 예: GAHT12345678
|
||||
<strong># SMS 장치 이름은 AWS의 ARN입니다, 예: arn:aws:iam::123456789012:sms-mfa/username
|
||||
</strong># 가상 장치 이름은 AWS의 ARN입니다, 예: arn:aws:iam::123456789012:mfa/username
|
||||
</code></pre>
|
||||
|
||||
### Role Chain Juggling
|
||||
@@ -44,7 +44,7 @@ optional arguments:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>PowerShell에서 역할 조작을 수행하는 코드</summary>
|
||||
<summary>PowerShell에서 역할 저글링을 수행하는 코드</summary>
|
||||
```powershell
|
||||
# PowerShell script to check for role juggling possibilities using AWS CLI
|
||||
|
||||
|
||||
Reference in New Issue
Block a user