Docker’ın büyük bir hayranı değilim. Bunu her kullanmaya çalıştığımda kafam karışıyor, sinirleniyorum ve sinirleniyorum ve bunun yerine serseri ile başka bir VM çalıştırıyorum. Ancak giderek daha popüler hale geldiği ve giderek daha fazla kuruluşun ona güvendiği inkar edilemez.
Yakın zamanda yapılan bir sızma testinde iş arkadaşım ve ben, kuruluşun özel Docker kayıt defterine ait kimlik bilgilerine rastladık. Docker hakkında pek bir şey bilmiyordum (ve açıkçası hâlâ da bilmiyorum), ancak onları aşağı çekip inceleyebilmem için Docker görüntülerinde bazı ilginç dosyalar ve anahtarlar olması gerektiğini biliyordum. Docker komutlarını aradıktan ve SO yanıtlarını araştırdıktan sonra, docker görüntülerinden kaynak kodunu ve yönetici SSH anahtarlarını aldım. Başkalarının referans olması için attığım adımları paylaşmayı düşündüm.
Docker Kayıtları
Özel bir Docker kayıt defterinin URL’sini ve bazı düz metin kimlik bilgilerini keşfettik. Daha önce kayıtları kullanmamıştım, bu yüzden nasıl çalıştıklarına ve onlara nasıl erişebileceğime bakmam gerekiyordu. Paha biçilmez olduğu kanıtlanan bu kopya kağıdını kullandım. Hile sayfasından:
Depo, bir kapsayıcının dosya sistemini birlikte oluşturan etiketli görüntülerin barındırılan bir koleksiyonudur.
Kayıt defteri, depoları saklayan ve depoların yüklenmesini ve indirilmesini yönetmek için bir HTTP API sağlayan bir sunucu olan bir ana bilgisayardır.
Bulduğumuz kayıt defterinin URL’si şuydu: https://registry.example.com/v2 ve Temel kimlik doğrulaması gerekiyordu.
Kayıt defterindeki görsellerin listesini görüntülemek için URL’ye “_catalog” ekleyin; bu, tüm depo ve görsel adlarının JSON’unu gösterecektir: https://registry.example.com/v2/_catalog
Listeye baktığımızda, “yönetici” adı verilen bir fotoğraf da dahil olmak üzere, potansiyel olarak hassas bazı görseller gördük.
Bir kayıt defterinden çekme
Kısa not: İşleri Mac’imden çalıştırmayı ne kadar sevsem de Docker’ın Mac’ten çalıştırılması büyük bir sıkıntıdır ve yine de bir VM gerektirir. Bunun yerine Docker’ı etrafta dolaştığım bir Ubuntu VM’ye kurdum
Özel bir kayıt defterinden bir görüntüyü almak için öncelikle kimlik doğrulaması yapmak üzere Docker ‘login’ komutunu kullanmanız gerekir. Kullanıcı adı/şifre zaten elimizdeydi, bu yüzden onu girdik ve hazırdık:
|
|
Not: Docker’ın sizi güzel bir şekilde uyardığı gibi, kimlik bilgileri config.json dosyasında düz metin olarak kaydedilir. Sömürü sonrası yağma sırasında akılda tutulması gereken bir şey
Docker depoda oturum açtıktan sonra şunları yapabilirsiniz: docker pull
Görüntüyü ana makinenize indirmek için. Kayıt defterinin tam adını eklemeniz gerekir, aksi takdirde Docker görüntü için genel kayıt defterinde arama yapacaktır. Örneğin “admin” isimli bir görseli çekmek için:
|
|
Bu noktada görüntü indirilir ve çalıştırılıp kapsayıcıya alınabilir. Burada Docker konteynerlerini çalıştırmaya girmeyeceğim çünkü onu çalıştırmakla ilgilenmiyordum – sadece görüntüdeki dosyaları yağmalamak istedim.
Docker görüntüsünden Dockerfile’a
Uygun bir şekilde dockerfile-from-image olarak adlandırılan, halka açık bir görüntüyü kullanarak Docker Görüntüsünden bir Docker dosyası türetmek mümkündür. Bu, temel görüntüye herhangi bir özel komut dosyası veya komut eklenip eklenmediğini görmenin kolay bir yoludur.
Bu imajı aynı ana bilgisayara kurmanız ve ardından docker dosyasının oluşturulmasını istediğiniz imaja yönlendirmeniz gerekir. Onların benioku, aynı zamanda yararlı bir takma ad oluşturmanızı da sağlar:
|
|
Şimdi onu çalıştırmak için özel kayıt defterinden alınan resmin kimliğini verin. Görüntülü kimliklerin listesini görmek için şunu kullanın: docker images
. Kimlik veya tam adın her ikisi de çalışır:
|
|
Kabuk Erişimi Alma
Görüntüyü keşfetmek ve dosyaları keşfetmek için genellikle etkileşimli bir kabuk alıp dosya sistemini keşfetmek en kolay yoldur. Bunu yapmak için aslında konteyneri asıl amacı doğrultusunda “çalıştırmanıza” gerek yok, Docker’a /bin/bash komutunu çalıştırmasını söylemeniz yeterli. Bu, görüntüden bir kapsayıcı oluşturacaktır (unutmayın: kapsayıcılar ve görüntüler farklıdır) ve ardından sizi sahte bir TTY’ye bırakacaktır.
|
|
Artık görüntüde ne varsa yağmalayabilirsiniz. Bu özel görevde, özel depolara git işlemleri gerçekleştiren önyükleme komut dosyaları (bunları yukarıda oluşturulan Docker dosyasında gördüm) vardı. SSH üzerinden kimlik doğrulaması yapıldı ve “/home/admin/.ssh/id_rsa” konumunda özel bir anahtar vardı.
Çıkılan konteynere yeniden takılma. Oturumdan çıktığınızda kapsayıcıdan çıkılacaktır. eğer yaparsan docker run
yine görüntü üzerinde yeni bir kapsayıcı oluşturulacak ve eski kapsayıcıda oluşturduğunuz tüm çalışmaları veya dosyaları “kaybedeceksiniz”. Bulunduğunuz önceki kapsayıcıya yeniden bağlanmak için, onu yeniden başlatmanız ve ardından çalıştırmanız gerekir. docker exec
. Öncelikle üzerinde çalıştığınız konteyner kimliğini bulmanız gerekir. docker ps -a
en yenisi en üstte olacak şekilde tüm çıkılan konteynerleri gösterecektir. Alternatif olarak, aşağıdaki komut oluşturulan son kabın kimliğini verecektir (komutlarda genişletme için kullanışlıdır):
|
|
Şimdi bu konteyner kimliğine tekrar bir kabuk almak için onu yeniden başlatıyoruz ve ardından exec /bin/bash:
|
|
Veya genişletmelerden hoşlanmak ve bunu tek komutla yapmak için:
|
|
Çalışan bir kapsayıcıdan dosya almanın en kolay yolu docker cp komutudur. Komutu yalnızca bir kez çalıştırmak istediğimden, kabuk erişimi olan kabı araştırırken /tmp/loot’a istediğim her şeyi kopyaladım ve tgz’i tek bir dosyaya kopyaladım (/tmp/loot/myloot.tar.gz
)
Kabuk oturumundan çıktığınızda kapsayıcıdan da çıkılır ancak oluşturduğunuz tüm dosyalara kapsayıcıdan hâlâ erişilebilir. Dosyaları bir kapsayıcıdan çekmek için, çalıştırılarak bulunabilecek kapsayıcı kimliğine ihtiyacınız vardır. docker ps -a
. Yeni çıktıysanız, en üstte olmalıdır (ya da sadece çalıştırın) docker ps -l -q
son konteyneri görmek için):
|
|
Diyelim ki /tmp/loot/myloot.tar.gz adresinde bir yağma dosyanız var. Konteynerden çıkın ve konteyner kimliğini not edin. Dosyayı kapsayıcıdan ana bilgisayara çıkarmak için:
|
|
Bu, dosyayı kapsayıcıdan yerel ana makinenize kopyalayacaktır.
Belirli bir kapsayıcıyla çalışmanız gerekmiyorsa ve istediğiniz dosyanın konumunu biliyorsanız, tek bir komutla bir kapsayıcı oluşturabilir ve dosyayı cp’leyebilirsiniz:
|
|
Tüm dosya sisteminin dökümü
Kabuk aracılığıyla araştırma yapmak ve tek tek dosyaları kopyalamak istemiyorsanız, tüm dosya sistemini bir Docker kapsayıcısından çıkarmak da mümkün olmalıdır. Liman işçisinin kaydetme ve dışa aktarma komutları, bir görüntüyü veya kabı (sırasıyla) bir tarball’a aktarır.
Ne yazık ki bu tarball’lar gerçekte yalnızca Docker’ın işine yarar. Ancak bu görüntülerden kullanışlı bir dosya sistemi çıkarabilen “undocker” (https://github.com/larsks/undocker/) adında bir araç var. Yazarın yazısı için buraya bakın: http://blog.oddbit.com/2015/02/13/unpacking-docker-images/
Zaten tam dosya sistemine ihtiyacım olmadığından bu aracı henüz denemedim, ancak kullandıysanız veya başka bir öneriniz varsa lütfen yorum yapın!
-ropnop