Concourse Enumeration & Attacks
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın: GCP Hacking'i öğrenin ve pratik yapın:
Concourse beş rol ile gelir:
Concourse Admin: Bu rol yalnızca ana takım (varsayılan başlangıç concourse takımı) sahiplerine verilir. Yöneticiler diğer takımları yapılandırabilir (örn.: fly set-team
, fly destroy-team
...). Bu rolün izinleri RBAC tarafından etkilenemez.
sahip: Takım sahipleri takım içindeki her şeyi değiştirebilir.
üye: Takım üyeleri takım varlıkları içinde okuma ve yazma yapabilir ancak takım ayarlarını değiştiremez.
pipeline-operator: Pipeline operatörleri pipeline işlemleri gerçekleştirebilir, örneğin derlemeleri tetikleyebilir ve kaynakları sabitleyebilir, ancak pipeline yapılandırmalarını güncelleyemezler.
görüntüleyici: Takım görüntüleyicileri bir takıma ve onun pipeline'larına "salt okunur" erişime sahiptir.
Ayrıca, sahip, üye, pipeline-operator ve görüntüleyici rollerinin izinleri RBAC yapılandırılarak değiştirilebilir (daha spesifik olarak, eylemleri yapılandırarak). Daha fazla bilgi için:
Concourse'un pipeline'ları Takımlar içinde grupladığını unutmayın. Bu nedenle bir Takıma ait olan kullanıcılar o pipeline'ları yönetebilecektir ve birden fazla Takım var olabilir. Bir kullanıcı birden fazla Takıma ait olabilir ve her birinde farklı izinlere sahip olabilir.
Statik vars görev adımlarında belirtilebilir:
Or using the following fly
arguments:
-v
or --var
NAME=VALUE
değişken NAME
için VALUE
değerini ayarlar.
-y
or --yaml-var
NAME=VALUE
VALUE
'yi YAML olarak ayrıştırır ve bunu değişken NAME
için değer olarak ayarlar.
-l
or --load-vars-from
FILE
FILE
'yi yükler, bu dosya değişken adlarını değerlere eşleyen bir YAML belgesidir ve hepsini ayarlar.
Eğer Concourse'a yazma erişiminiz varsa, bu sırları sızdırmak için işler oluşturabilirsiniz çünkü Concourse bunlara erişebilmelidir.
Bir concourse ortamını saymak için önce geçerli kimlik bilgilerini toplamanız veya muhtemelen bir .flyrc
yapılandırma dosyasında bir kimlik doğrulama jetonu bulmanız gerekir.
Giriş yapmak için endpoint, takım adı (varsayılan main
) ve kullanıcının ait olduğu takımı bilmeniz gerekir:
fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]
Yapılandırılmış hedefleri alın:
fly targets
Yapılandırılmış hedef bağlantısının hala geçerli olup olmadığını kontrol edin:
fly -t <target> status
Belirtilen hedefe karşı kullanıcının rolünü alın:
fly -t <target> userinfo
API jetonu varsayılan olarak $HOME/.flyrc
dosyasında kaydedilir, bir makineyi ele geçiriyorsanız, kimlik bilgilerini orada bulabilirsiniz.
Takımların bir listesini alın
fly -t <target> teams
Takım içindeki rolleri alın
fly -t <target> get-team -n <team-name>
Kullanıcıların bir listesini alın
fly -t <target> active-users
Listele pipeline'ları:
fly -t <target> pipelines -a
Pipeline yaml'ını al (hassas bilgiler tanımda bulunabilir):
fly -t <target> get-pipeline -p <pipeline-name>
Tüm pipeline yapılandırma beyan edilen değişkenlerini al
for pipename in $(fly -t <target> pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t <target> get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done
Kullanılan tüm pipeline gizli adlarını al (bir iş oluşturabilir/değiştirebilir veya bir konteyneri ele geçirebilirseniz, bunları sızdırabilirsiniz):
worker'ları listele:
fly -t <target> workers
container'ları listele:
fly -t <target> containers
build'leri listele (ne olduğunu görmek için):
fly -t <target> builds
admin:admin
test:test
Önceki bölümde, pipeline tarafından kullanılan tüm gizli anahtarların isimlerini ve değişkenlerini nasıl alabileceğinizi gördük. Değişkenler hassas bilgiler içerebilir ve gizli anahtarların isimleri daha sonra çalmaya çalışmak için faydalı olacaktır.
Yeterli ayrıcalıklara sahipseniz (üye rolü veya daha fazlası) pipeline'ları ve rolleri listeleyebilir ve sadece <pipeline>/<job>
container'ında bir oturum açabilirsiniz:
Bu izinlerle şunları yapabilirsiniz:
Konteynerin içindeki gizli bilgileri çalmak
Düğüme kaçmaya çalışmak
Cloud metadata uç noktasını (pod'dan ve mümkünse düğümden) sayım yapmak/suistimal etmek
Yeterli ayrıcalıklara sahipseniz (üye rolü veya daha fazlası) yeni pipeline'lar oluşturabilir/düzenleyebilirsiniz. Bu örneğe bakın:
Yeni bir pipeline'ın değiştirilmesi/oluşturulması ile şunları yapabileceksiniz:
Gizli bilgileri çalmak (onları dışa vurarak veya konteynere girip env
komutunu çalıştırarak)
Düğümden kaçmak (size yeterli ayrıcalıklar vererek - privileged: true
)
Bulut meta verisi uç noktasını listelemek/suistimal etmek (pod'dan ve düğümden)
Oluşturulan pipeline'ı silmek
Bu, önceki yönteme benzer, ancak tamamen yeni bir pipeline'ı değiştirmek/oluşturmak yerine sadece özel bir görevi çalıştırabilirsiniz (bu muhtemelen çok daha gizli olacaktır):
Önceki bölümlerde concourse ile yetkili bir görevi nasıl çalıştıracağımızı gördük. Bu, konteynıra bir docker konteynerindeki yetkili bayrağın sağladığı erişimi tam olarak vermeyecek. Örneğin, /dev içinde düğüm dosya sistemi cihazını göremeyeceksiniz, bu nedenle kaçış daha "karmaşık" olabilir.
Aşağıdaki PoC'de, bazı küçük değişikliklerle kaçış yapmak için release_agent'i kullanacağız:
Bu durum için küçük bir değişiklikle normal bir release_agent kaçışı yeterlidir:
Web konteynerinde bazı savunmalar devre dışı bırakılmış olsa bile, yaygın bir ayrıcalıklı konteyner olarak çalışmıyor (örneğin, mount yapamazsınız ve yetkiler çok sınırlıdır, bu nedenle konteynerden kaçmanın kolay yolları işe yaramaz).
Ancak, yerel kimlik bilgilerini düz metin olarak saklar:
Bu kimlik bilgilerini web sunucusuna giriş yapmak ve ayrılmış bir konteyner oluşturup düğüme kaçmak için kullanabilirsiniz.
Ortamda ayrıca concourse'un kullandığı postgresql örneğine erişim bilgilerini (adres, kullanıcı adı, şifre ve veritabanı gibi diğer bilgiler) bulabilirsiniz:
Bu sadece hizmetle ilgili bazı ilginç notlar, ancak yalnızca localhost'ta dinlediği için, bu notlar daha önce zaten sömürdüğümüz bir etki sunmayacak.
Sadece yerel olarak (127..0.0.1) açık ve bence işçi, özel SSH hizmeti ile Web'e kimlik doğrulaması yaptığında, web sunucusunun her işçi içindeki her Garden hizmeti ile konuşabilmesi için bir tünel oluşturuluyor.
Web sunucusu, her birkaç saniyede bir çalışan konteynerleri izliyor ve beklenmeyen konteynerler siliniyor. Bu nedenle, özel bir konteyner çalıştırmak istiyorsanız, web sunucusu ile garden hizmeti arasındaki iletişimi bozmanız gerekiyor.
Concourse işçileri yüksek konteyner ayrıcalıklarıyla çalışır:
Ancak, düğümün /dev cihazını veya release_agent'i kullanmak (çünkü düğümün dosya sistemi ile gerçek cihaz erişilebilir değil, sadece sanal bir tane var) çalışmayacak. Düğümün süreçlerine erişemiyoruz, bu nedenle çekirdek istismarları olmadan düğümden kaçmak karmaşık hale geliyor.
Önceki bölümde ayrıcalıklı bir konteynerden nasıl kaçılacağını gördük, bu nedenle eğer mevcut işçi tarafından oluşturulan bir ayrıcalıklı konteynerde komutları çalıştırabilirsek, düğüme kaçabiliriz.
Concourse ile oynarken, bir şey çalıştırmak için yeni bir konteyner oluşturulduğunda, konteyner süreçlerinin işçi konteynerinden erişilebilir olduğunu fark ettim, bu nedenle bir konteynerin içinde yeni bir konteyner oluşturması gibi.
Çalışan bir ayrıcalıklı konteynere girmek
Yeni bir ayrıcalıklı konteyner oluşturma
Yeni bir konteyner oluşturmak çok kolaydır (rastgele bir UID çalıştırın) ve üzerinde bir şey çalıştırabilirsiniz:
Ancak, web sunucusu her birkaç saniyede bir çalışan konteynerleri kontrol ediyor ve eğer beklenmedik bir tane keşfedilirse, silinecektir. İletişim HTTP üzerinden gerçekleştiği için, beklenmedik konteynerlerin silinmesini önlemek için iletişimi değiştirebilirsiniz:
https://concourse-ci.org/vars.html
YAML yapılandırmalarında değerleri ((_source-name_:_secret-path_._secret-field_))
sözdizimini kullanarak yapılandırabilirsiniz.
source-name isteğe bağlıdır, ve atlandığında, kullanılacaktır veya değer olarak sağlanabilir.
isteğe bağlı _secret-field_ alınan gizli bilgide okunacak bir alanı belirtir. Atlandığında, kimlik yöneticisi, alan mevcutsa alınan kimlikten 'varsayılan alan' okumayı seçebilir.
Ayrıca, secret-path ve secret-field .
ve :
gibi özel karakterler içeriyorsa çift tırnak "..."
ile çevrilebilir. Örneğin, ((source:"my.secret"."field:1"))
secret-path değerini my.secret
ve secret-field değerini field:1
olarak ayarlayacaktır.
-i
or --instance-var
NAME=VALUE
VALUE
'yi YAML olarak ayrıştırır ve bunu örnek değişken NAME
için değer olarak ayarlar. Örnek değişkenler hakkında daha fazla bilgi için sayfasına bakın.
Bir Credential Manager'ın bir pipeline'da nasıl belirtileceği konusunda farklı yollar vardır, adresinden okuyun. Ayrıca, Concourse farklı kimlik bilgisi yöneticilerini destekler:
Görmüş olabileceğiniz gibi, bu sadece bir ve sadece düğümdeki cmd yolunu değiştirmek yeterlidir.
Varsayılan olarak her concourse işçi, 7777 numaralı portta bir hizmeti çalıştıracaktır. Bu hizmet, Web yöneticisi tarafından işçiye ne yapması gerektiğini belirtmek için kullanılır (görüntüyü indirmek ve her görevi çalıştırmak). Bu, bir saldırgan için oldukça iyi görünüyor, ancak bazı güzel korumalar var:
AWS Hacking öğrenin ve pratik yapın: GCP Hacking öğrenin ve pratik yapın:
kontrol edin!
💬 veya katılın ya da Twitter'da 🐦 'i takip edin.**
Hacking ipuçlarını paylaşmak için ve github reposuna PR gönderin.