Yağmacı Docker Görüntüleri – ropnop blogu


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

Docker kayıt defteri

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:

1
2
3
4
5
6
rflathers@ubuntu:~$ docker login https://registry.example.com/v2/
Username: 
Password: 
Email: 
WARNING: login credentials saved in /home/rflathers/.docker/config.json
Login Succeeded

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
rflathers@ubuntu:~$ docker pull registry.example.com/admin
Using default tag: latest
latest: Pulling from admin
 
abcde9a29090: Pull complete
abcdefafa841: Pull complete
abcde18745c9: Pull complete
abcde3ccebb3: Pull complete
abcde8d47f87: Pull complete
abcde15b336e: Pull complete
abcdefe71cfb: Pull complete
abcdebdf2761: Pull complete
abcdef84677a: Pull complete
abcdefc04499: Pull complete
abcde54eb3fe: Pull complete
abcde656c3a9: Pull complete
abcde78fc125: Pull complete
abcde2baef4c: Pull complete
eabcde3df887: Pull complete
8f4abcde66dc: Pull complete
e7ceabcde9ea: Pull complete
9515abcde66e: Pull complete
Digest: sha256:64dff123453abcde712cef8895465d822308932abcde32a60b776c6cb578751
Status: Downloaded newer image for registry.example.com/admin:latest

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:

1
2
3
4
5
6
$ docker pull centurylink/dockerfile-from-image
$ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image"
$ dfimage --help
Usage: dockerfile-from-image.rb [options] 
    -f, --full-tree                  Generate Dockerfile for all parent layers
    -h, --help                       Show this message

Ş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:

1
rflathers@ubuntu:~$ dfimage -f 95247d7abcde

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.

1
2
3
rflathers@ubuntu:~$ docker run -i -t --entrypoint /bin/bash 95158d7abcde #image ID
admin@f03f4fabcdef:/$ hostname 
f03f4abcdef #now in shell in container

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):

1
2
rflathers@ubuntu:~$ docker ps -l -q
417c6a8abcde

Şimdi bu konteyner kimliğine tekrar bir kabuk almak için onu yeniden başlatıyoruz ve ardından exec /bin/bash:

1
rflathers@ubuntu:~$ docker start 417c6a8abcde && docker exec -i -t 417c6a8abcde /bin/bash

Veya genişletmelerden hoşlanmak ve bunu tek komutla yapmak için:

1
rflathers@ubuntu:~$ docker start $(docker ps -l -q) && docker exec -i -t $(docker ps -l -q) /bin/bash

Ç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):

1
2
3
rflathers@ubuntu:~$ docker ps -a
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                         PORTS               NAMES
f03f4fdabcde        95158d7abcde                             "/bin/bash"              4 minutes ago       Exited (0) 4 seconds ago                           backstabbing_bardeen

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:

1
rflathers@ubuntu:~$ docker cp f03f4fdabcde:/tmp/loot/myloot.tar.gz ./myloot.tar.gz

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:

1
rflathers@ubuntu:~$ docker cp $(docker create registry.example.com/admin):/home/admin/.ssh/id_rsa ./admin_ssh_key

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


Ayrıca bakınız



Source link