Jenkins Security
Podstawowe informacje
Jenkins to narzędzie, które oferuje prosty sposób na ustanowienie środowiska ciągłej integracji lub ciągłego dostarczania (CI/CD) dla prawie dowolnej kombinacji języków programowania i repozytoriów kodu źródłowego za pomocą potoków. Ponadto automatyzuje różne rutynowe zadania deweloperskie. Chociaż Jenkins nie eliminuje konieczności tworzenia skryptów dla poszczególnych kroków, zapewnia szybszy i bardziej niezawodny sposób integracji całego ciągu narzędzi do budowy, testowania i wdrażania niż można to łatwo zrobić ręcznie.
pageBasic Jenkins InformationNieuwierzytelniona enumeracja
Aby wyszukać interesujące strony Jenkins bez uwierzytelnienia (np. /people lub /asynchPeople, które wyświetlają aktualnych użytkowników), można użyć:
Sprawdź, czy możesz wykonywać polecenia bez konieczności uwierzytelniania:
Bez poświadczeń dostępu możesz zajrzeć do ścieżki /asynchPeople/ lub /securityRealm/user/admin/search/index?q= w poszukiwaniu nazw użytkowników.
Możesz uzyskać wersję Jenkinsa z ścieżki /oops lub /error
Znane podatności
Logowanie
W podstawowych informacjach możesz sprawdzić wszystkie sposoby logowania do Jenkinsa:
pageBasic Jenkins InformationRejestracja
Możesz znaleźć instancje Jenkinsa, które pozwalają na utworzenie konta i zalogowanie się do niego. Tak proste to jest.
Logowanie SSO
Jeśli funkcjonalność SSO/wtyczki były obecne, powinieneś spróbować zalogować się do aplikacji za pomocą konta testowego (np. testowego konta Github/Bitbucket). Trik z tutaj.
Bruteforce
Jenkins brakuje polityki hasła i zapobiegania atakom brute-force na nazwy użytkowników. Istotne jest przeprowadzenie ataku brute-force na użytkowników, ponieważ mogą być używane słabe hasła lub nazwy użytkowników jako hasła, nawet odwrócone nazwy użytkowników jako hasła.
Sprejowanie haseł
Użyj tego skryptu w języku Python lub tego skryptu w PowerShell.
Ominięcie białej listy adresów IP
Wiele organizacji łączy systemy zarządzania kontrolą źródła oparte na chmurze (SCM), takie jak GitHub lub GitLab, z wewnętrznym, samohostowanym systemem CI jak Jenkins lub TeamCity. Taka konfiguracja pozwala systemom CI odbierać zdarzenia webhook od dostawców SCM w chmurze, głównie do uruchamiania zadań w potoku.
Aby to osiągnąć, organizacje dodają do białej listy zakresy adresów IP platform SCM, pozwalając im na dostęp do wewnętrznego systemu CI za pomocą webhooków. Jednak ważne jest zauważenie, że każdy może utworzyć konto na GitHubie lub GitLabie i skonfigurować je do wywoływania webhooka, potencjalnie wysyłając żądania do wewnętrznego systemu CI.
Nadużycia wewnętrznego Jenkinsa
W tych scenariuszach zakładamy, że masz ważne konto do dostępu do Jenkinsa.
W zależności od skonfigurowanego mechanizmu Autoryzacji w Jenkinsie i uprawnień skompromitowanego użytkownika możesz lub nie możesz wykonać poniższe ataki.
Aby uzyskać więcej informacji, sprawdź podstawowe informacje:
pageBasic Jenkins InformationWyświetlanie użytkowników
Jeśli uzyskasz dostęp do Jenkinsa, możesz wyświetlić innych zarejestrowanych użytkowników pod adresem http://127.0.0.1:8080/asynchPeople/
Wyciek informacji z budów w celu znalezienia haseł w tekście jawnym
Użyj tego skryptu do wycieku konsoli budowy i zmiennych środowiskowych budowy, aby mieć nadzieję znaleźć hasła w tekście jawnym.
Kradzież danych uwierzytelniających SSH
Jeśli skompromitowany użytkownik ma wystarczające uprawnienia do tworzenia/modyfikowania nowego węzła Jenkins i dane uwierzytelniające SSH są już przechowywane do dostępu do innych węzłów, mógłby ukraść te dane uwierzytelniające, tworząc/modyfikując węzeł i ustawiając host, który zarejestruje dane uwierzytelniające bez weryfikacji klucza hosta:
Zazwyczaj dane uwierzytelniające SSH Jenkins znajdują się w globalnym dostawcy (/credentials/
), więc można je również wydobyć tak samo jak każde inne tajne informacje. Więcej informacji w sekcji Wydobywanie tajemnic.
RCE w Jenkins
Uzyskanie dostępu do powłoki na serwerze Jenkins daje atakującemu możliwość ujawnienia wszystkich tajemnic i zmiennych środowiskowych oraz wykorzystania innych maszyn znajdujących się w tej samej sieci lub nawet zebrania danych uwierzytelniających chmury.
Domyślnie Jenkins będzie działać jako SYSTEM. Dlatego skompromitowanie go da atakującemu uprawnienia SYSTEMU.
RCE Tworzenie/Modyfikowanie projektu
Tworzenie/Modyfikowanie projektu to sposób na uzyskanie RCE na serwerze Jenkins:
pageJenkins RCE Creating/Modifying ProjectRCE Wykonanie skryptu Groovy
Można również uzyskać RCE wykonując skrypt Groovy, co może być bardziej dyskretne niż tworzenie nowego projektu:
pageJenkins RCE with Groovy ScriptRCE Tworzenie/Modyfikowanie Potoku
Można również uzyskać RCE poprzez tworzenie/modyfikowanie potoku:
pageJenkins RCE Creating/Modifying PipelineEksploatacja Potoku
Aby wykorzystać potoki, nadal trzeba mieć dostęp do Jenkins.
Budowanie Potoków
Potoki mogą również być używane jako mechanizm budowania w projektach, w takim przypadku można skonfigurować plik wewnątrz repozytorium, który będzie zawierał składnię potoku. Domyślnie używany jest /Jenkinsfile
:
Możliwe jest również przechowywanie plików konfiguracyjnych potoku w innych miejscach (na przykład w innych repozytoriach) w celu oddzielenia dostępu do repozytorium i dostępu do potoku.
Jeśli atakujący ma uprawnienia do zapisu tego pliku, będzie mógł go zmodyfikować i potencjalnie uruchomić potok nawet bez dostępu do Jenkins. Może się okazać, że atakujący będzie musiał obejść pewne zabezpieczenia gałęzi (w zależności od platformy i uprawnień użytkownika mogą one zostać obejścia lub nie).
Najczęstsze sposoby uruchomienia niestandardowego potoku to:
Pull request do głównej gałęzi (lub potencjalnie do innych gałęzi)
Push do głównej gałęzi (lub potencjalnie do innych gałęzi)
Aktualizacja głównej gałęzi i oczekiwanie, aż zostanie wykonana w jakiś sposób
Jeśli jesteś zewnętrznym użytkownikiem, nie powinieneś oczekiwać, że stworzysz PR do głównej gałęzi repozytorium innego użytkownika/organizacji i uruchomisz potok... ale jeśli jest źle skonfigurowany, możesz w pełni skompromitować firmy, wykorzystując to.
RCE Potoku
W poprzedniej sekcji RCE już wskazano technikę uzyskania RCE poprzez modyfikację potoku.
Sprawdzanie zmiennych środowiskowych
Można zadeklarować zmienne środowiskowe w postaci tekstu jawnego dla całego potoku lub dla konkretnych etapów. Te zmienne środowiskowe nie powinny zawierać poufnych informacji, ale atakujący zawsze może sprawdzić wszystkie konfiguracje potoku/pliki Jenkinsfile:
Wyciekanie sekretów
Aby uzyskać informacje na temat tego, jak zazwyczaj traktowane są sekrety przez Jenkins, zapoznaj się z podstawowymi informacjami:
pageBasic Jenkins InformationPoświadczenia mogą być ograniczone do globalnych dostawców (/credentials/
) lub do konkretnych projektów (/job/<project-name>/configure
). Dlatego, aby wydobyć wszystkie z nich, musisz skompromitować co najmniej wszystkie projekty, które zawierają sekrety i wykonać niestandardowe/zatrute potoki.
Istnieje jeszcze jeden problem, aby uzyskać sekret w środowisku potoku, musisz znać nazwę i typ sekretu. Na przykład, jeśli próbujesz załadować sekret usernamePassword
jako sekret string
, otrzymasz ten błąd:
Oto sposób ładowania niektórych typowych typów sekretów:
Na końcu tej strony możesz znaleźć wszystkie typy poświadczeń: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
Najlepszym sposobem na wyciek wszystkich sekretów naraz jest skompromitowanie maszyny Jenkins (uruchomienie odwrotnego shella na wbudowanym węźle na przykład) a następnie wyciek kluczy głównych i zaszyfrowanych sekretów oraz ich odszyfrowanie offline. Więcej informacji na ten temat znajdziesz w sekcji Węzły i Agenci oraz w sekcji Post Exploitation.
Wyzwalacze
Z dokumentacji: Dyrektywa triggers
definiuje automatyczne sposoby ponownego uruchamiania Pipelina. Dla Pipelinów zintegrowanych z takimi źródłami jak GitHub lub BitBucket, triggers
mogą nie być konieczne, ponieważ integracja oparta na webhookach prawdopodobnie już istnieje. Obecnie dostępne wyzwalacze to cron
, pollSCM
i upstream
.
Przykład Cron:
Sprawdź inne przykłady w dokumentacji.
Węzły i Agenci
Instancja Jenkinsa może mieć różne agenty uruchamiane na różnych maszynach. Z perspektywy atakującego, dostęp do różnych maszyn oznacza różne potencjalne poświadczenia chmurowe do kradzieży lub różny dostęp do sieci, który mógłby być wykorzystany do atakowania innych maszyn.
Aby uzyskać więcej informacji, sprawdź podstawowe informacje:
pageBasic Jenkins InformationMożesz wyliczyć skonfigurowane węzły w /computer/
, zazwyczaj znajdziesz **Węzeł wbudowany
** (który jest węzłem uruchamiającym Jenkins) i potencjalnie więcej:
Jest szczególnie interesujące skompromitowanie węzła wbudowanego, ponieważ zawiera wrażliwe informacje Jenkinsa.
Aby wskazać, że chcesz uruchomić potok w wbudowanym węźle Jenkinsa, możesz określić wewnątrz potoku następującą konfigurację:
Pełny przykład
Potok w określonym agent, z wyzwalaczem cron, zmiennymi środowiskowymi potoku i etapu, wczytujący 2 zmienne w kroku i wysyłający odwróconą powłokę:
Post Eksploatacja
Metasploit
Sekrety Jenkinsa
Możesz wyświetlić listę sekretów, uzyskując dostęp do /credentials/
, jeśli masz wystarczające uprawnienia. Należy zauważyć, że zostaną wyświetlone tylko sekrety znajdujące się w pliku credentials.xml
, ale pliki konfiguracyjne budowy mogą również zawierać więcej poświadczeń.
Jeśli możesz zobaczyć konfigurację każdego projektu, możesz również zobaczyć tam nazwy poświadczeń (sekretów) używanych do dostępu do repozytorium oraz inne poświadczenia projektu.
Za pomocą Groovy
pageJenkins Dumping Secrets from GroovyZ dysku
Do odszyfrowania sekretów Jenkinsa potrzebne są następujące pliki:
secrets/master.key
secrets/hudson.util.Secret
Takie sekrety zazwyczaj można znaleźć w:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Oto wyrażenie regularne, które pozwala je znaleźć:
Odszyfruj tajne informacje Jenkins offline
Jeśli zdobyłeś potrzebne hasła do odszyfrowania tajnych informacji, skorzystaj z tego skryptu do odszyfrowania tych informacji.
Odszyfruj tajemnice Jenkins z Groovy
Utwórz nowego użytkownika admina
Otwórz plik Jenkins config.xml w
/var/lib/jenkins/config.xml
lubC:\Program Files (x86)\Jenkis\
Znajdź słowo
<useSecurity>true</useSecurity>
i zmień słowotrue
nafalse
.sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Uruchom ponownie serwer Jenkins:
service jenkins restart
Teraz przejdź ponownie do portalu Jenkins i Jenkins nie poprosi o żadne poświadczenia tym razem. Przejdź do "Zarządzaj Jenkins", aby ponownie ustawić hasło administratora.
Włącz ponownie bezpieczeństwo, zmieniając ustawienia na
<useSecurity>true</useSecurity>
i ponownie uruchom Jenkins.
Referencje
Last updated