🍯 Cowrie Honeypot - Tam Rehber
Bu rehber, Cowrie Honeypot'unuzu kurduktan sonra nasıl yöneteceğinizi, izleyeceğinizi ve raporlayacağınızı anlatır.
Bu rehber, Cowrie Honeypot'unuzu kurduktan sonra nasıl yöneteceğinizi, izleyeceğinizi ve raporlayacağınızı anlatır.
📍 Dizin Yapısı (Önerilen)
Production ortamı için /mnt/block/cowrie/ dizinini kullanıyoruz.
/mnt/block/cowrie/
├── docker-compose.yml # Container ayarları
├── etc/
│ └── cowrie.cfg # Cowrie config
├── var/
│ ├── log/cowrie/
│ │ └── cowrie.json # ANA LOG DOSYASI
│ └── lib/cowrie/
│ ├── downloads/ # İndirilen malware'ler
│ └── tty/ # Session kayıtları (playback)
├── passwords_collected.txt # Toplanan şifreler
├── create_report.sh # HTML Rapor scripti
├── daily_summary.sh # Günlük Özet scripti
└── report.html # HTML rapor çıktısı
1. Sistem Durumu ve Yönetim
Container Kontrol
# Durum
docker ps | grep cowrie
# Detaylı durum
docker inspect cowrie | jq '.[0].State'
# Kaynak kullanımı (CPU, RAM)
docker stats cowrie --no-stream
Başlat / Durdur / Yeniden Başlat
cd /mnt/block/cowrie
# Başlat
docker compose up -d
# Durdur
docker compose down
# Yeniden başlat
docker compose restart
# Loglarla birlikte başlat (debug için)
docker compose up
Port Durumu
# Honeypot portları açık mı?
sudo lsof -i :22
sudo lsof -i :23
# Gerçek SSH (bizim erişimimiz)
sudo lsof -i :2222
| Port | Servis | Açıklama |
|---|---|---|
| 22 | SSH Honeypot | Saldırganlar buraya düşer |
| 23 | Telnet Honeypot | IoT botları buraya gelir |
| 2222 | Gerçek SSH | Bizim güvenli erişimimiz |
2. Canlı İzleme Komutları
🔴 Canlı Tüm Olaylar
🟢 Canlı - Sadece Önemli Olaylar (Önerilen)
tail -f /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r '
if .eventid == "cowrie.login.success" then
"🟢 GİRİŞ: \(.src_ip) → \(.username):\(.password)"
elif .eventid == "cowrie.login.failed" then
"🔴 BAŞARISIZ: \(.src_ip) → \(.username):\(.password // "KEY")"
elif .eventid == "cowrie.command.input" then
"⚡ KOMUT: \(.src_ip) → \(.input)"
elif .eventid == "cowrie.session.file_download" then
"📥 DOWNLOAD: \(.src_ip) → \(.url)"
elif .eventid == "cowrie.session.closed" then
"🚪 ÇIKIŞ: \(.src_ip) (\(.duration | tostring | split(".")[0])sn)"
else
empty
end
'
📊 Watch ile Dashboard (Terminal)
Her 5 saniyede bir güncellenen canlı izleme ekranları:
Son Saldırılar:
watch -n 5 'echo "=== SON SALDIRILAR ===" && cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r "select(.eventid | test(\"login\")) | \"\(.timestamp | split(\"T\")[1] | split(\".\")[0]) \(.src_ip) \(.username):\(.password // \"KEY\")\"" | tail -10'
Son Komutlar:
watch -n 5 'echo "=== SON KOMUTLAR ===" && cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r "select(.eventid == \"cowrie.command.input\") | \"\(.timestamp | split(\"T\")[1] | split(\".\")[0]) | \(.src_ip) | \(.input)\"" | tail -15'
Genel İstatistik:
watch -n 10 'echo "=== HONEYPOT İSTATİSTİK ===" && \
echo "Toplam Bağlantı: $(cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r ".session" | sort -u | wc -l)" && \
echo "Benzersiz IP: $(cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r ".src_ip" | sort -u | wc -l)" && \
echo "Başarılı Giriş: $(cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r "select(.eventid==\"cowrie.login.success\")" | wc -l)" && \
echo "Çalıştırılan Komut: $(cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r "select(.eventid==\"cowrie.command.input\")" | wc -l)"'
3. Analiz Komutları
IP Analizi
# Benzersiz saldırgan IP'leri
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r '.src_ip' | sort -u
# IP sayısı
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r '.src_ip' | sort -u | wc -l
# En aktif 20 IP
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r '.src_ip' | sort | uniq -c | sort -rn | head -20
# Belirli IP'nin tüm aktiviteleri
IP="27.47.3.64"
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r "select(.src_ip==\"$IP\")"
Şifre Analizi
# En çok denenen 30 şifre
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.password != null) | .password' | sort | uniq -c | sort -rn | head -30
# En çok denenen kullanıcı adları
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.username != null) | .username' | sort | uniq -c | sort -rn | head -20
# Şifreleri dosyaya kaydet (Sözlük oluştur)
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.password != null) | .password' | sort -u >> /mnt/block/cowrie/passwords_collected.txt
Komut Analizi
# En çok çalıştırılan komutlar
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.eventid == "cowrie.command.input") | .input' | sort | uniq -c | sort -rn | head -20
# Tehlikeli komutlar (wget, curl, chmod)
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.eventid == "cowrie.command.input") | select(.input | test("wget|curl|chmod|busybox")) | "\(.src_ip) | \(.input)"'
Malware Analizi
# İndirme denemeleri (URL'ler)
cat /mnt/block/cowrie/var/log/cowrie/cowrie.json | jq -r 'select(.eventid | test("download")) | "\(.src_ip) | \(.url // .outfile)"'
# İndirilen dosyalar
ls -lah /mnt/block/cowrie/var/lib/cowrie/downloads/
# Dosya hash'leri (VirusTotal için)
sha256sum /mnt/block/cowrie/var/lib/cowrie/downloads/* 2>/dev/null
Session (Oturum) Analizi
# TTY kayıtlarını listele
ls -la /mnt/block/cowrie/var/lib/cowrie/tty/
# TTY kaydını oynat (session izle)
# Dosya adını değiştir
docker exec cowrie python3 /cowrie/cowrie-git/bin/playlog /cowrie/cowrie-git/var/lib/cowrie/tty/DOSYA_ADI.log
4. Log Yönetimi ve Temizlik
Honeypot logları çok hızlı büyür. Düzenli temizlik şarttır.
Log Boyutunu Kontrol
Otomatik Log Rotation (Cron)
Her gece 03:00'te logları yedekleyip temizleyen script.
- Scripti oluştur:
nano /mnt/block/cowrie/log_rotate.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/mnt/block/cowrie/backups"
LOG_FILE="/mnt/block/cowrie/var/log/cowrie/cowrie.json"
mkdir -p $BACKUP_DIR
# Yedekle ve sıkıştır
cp $LOG_FILE ${BACKUP_DIR}/cowrie_${DATE}.json
gzip ${BACKUP_DIR}/cowrie_${DATE}.json
# TTY (Oturum kayıtları) yedekle
tar -czf ${BACKUP_DIR}/tty_${DATE}.tar.gz /mnt/block/cowrie/var/lib/cowrie/tty/ 2>/dev/null
# Log dosyasını sıfırla
> $LOG_FILE
# Container'ı yeniden başlat (Temiz başlangıç)
cd /mnt/block/cowrie && docker compose restart
# 30 günden eski yedekleri sil
find $BACKUP_DIR -type f -mtime +30 -delete
echo "$(date): Log rotation tamamlandı" >> /mnt/block/cowrie/rotation.log
- Çalıştırılabilir yap:
chmod +x /mnt/block/cowrie/log_rotate.sh - Cron'a ekle:
crontab -e->0 3 * * * /mnt/block/cowrie/log_rotate.sh
5. Otomatik Raporlama
A. Günlük Özet Script (Terminal)
Hızlıca "Bugün ne oldu?" görmek için.
- Script:
nano /mnt/block/cowrie/daily_summary.sh
#!/bin/bash
LOG="/mnt/block/cowrie/var/log/cowrie/cowrie.json"
echo "╔════════════════════════════════════════════════╗"
echo "║ 🍯 COWRIE GÜNLÜK RAPOR ║"
echo "╚════════════════════════════════════════════════╝"
echo "📅 Tarih: $(date)"
echo ""
echo "📊 GENEL İSTATİSTİKLER"
echo "─────────────────────────────────────────────────"
echo " Toplam Bağlantı : $(cat $LOG | jq -r '.session' | sort -u | wc -l)"
echo " Benzersiz IP : $(cat $LOG | jq -r '.src_ip' | sort -u | wc -l)"
echo " Başarılı Giriş : $(cat $LOG | jq 'select(.eventid=="cowrie.login.success")' | wc -l)"
echo " Başarısız Giriş : $(cat $LOG | jq 'select(.eventid=="cowrie.login.failed")' | wc -l)"
echo " Çalıştırılan Komut : $(cat $LOG | jq 'select(.eventid=="cowrie.command.input")' | wc -l)"
echo ""
echo "🌍 EN AKTİF 5 SALDIRGAN"
echo "─────────────────────────────────────────────────"
cat $LOG | jq -r '.src_ip' | sort | uniq -c | sort -rn | head -5 | awk '{printf " %-20s : %s deneme\n", $2, $1}'
echo ""
echo "🔑 EN ÇOK DENENEN 5 ŞİFRE"
echo "─────────────────────────────────────────────────"
cat $LOG | jq -r 'select(.password != null) | .password' | sort | uniq -c | sort -rn | head -5 | awk '{printf " %-20s : %s kez\n", $2, $1}'
echo ""
echo "💻 SON 5 KOMUT"
echo "─────────────────────────────────────────────────"
cat $LOG | jq -r 'select(.eventid == "cowrie.command.input") | " \(.src_ip): \(.input)"' | tail -5
echo ""
echo "📥 İNDİRİLEN MALWARE"
echo "─────────────────────────────────────────────────"
ls /mnt/block/cowrie/var/lib/cowrie/downloads/ 2>/dev/null | head -5 || echo " Henüz yok"
echo ""
echo "═════════════════════════════════════════════════"
- Çalıştırılabilir yap:
chmod +x /mnt/block/cowrie/daily_summary.sh
B. HTML Dashboard Raporu (Görsel) ✨
Şık, karanlık modlu bir HTML raporu oluşturur.
- Script:
nano /mnt/block/cowrie/create_report.sh
#!/bin/bash
LOG_FILE="/mnt/block/cowrie/var/log/cowrie/cowrie.json"
OUTPUT_FILE="/mnt/block/cowrie/report.html"
cat <<EOF > $OUTPUT_FILE
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="60">
<title>🍯 Honeypot Dashboard</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Segoe UI', Tahoma, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
color: #eee;
padding: 20px;
min-height: 100vh;
}
h1 {
text-align: center;
color: #00d9ff;
margin-bottom: 10px;
text-shadow: 0 0 20px rgba(0,217,255,0.5);
}
.timestamp { text-align: center; color: #888; margin-bottom: 30px; }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
max-width: 1400px;
margin: 0 auto;
}
.card {
background: rgba(255,255,255,0.05);
backdrop-filter: blur(10px);
padding: 20px;
border-radius: 15px;
border: 1px solid rgba(255,255,255,0.1);
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
}
.card h2 {
color: #00d9ff;
margin-bottom: 15px;
font-size: 1.1em;
display: flex;
align-items: center;
gap: 10px;
}
.metric {
font-size: 3em;
font-weight: bold;
color: #00ff88;
text-shadow: 0 0 30px rgba(0,255,136,0.5);
}
.metric-row {
display: flex;
justify-content: space-around;
text-align: center;
}
.metric-item { flex: 1; }
.metric-label { color: #888; font-size: 0.9em; margin-top: 5px; }
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
th {
background: rgba(0,217,255,0.2);
color: #00d9ff;
padding: 12px;
text-align: left;
font-weight: 600;
}
td {
padding: 10px 12px;
border-bottom: 1px solid rgba(255,255,255,0.05);
}
tr:hover { background: rgba(255,255,255,0.05); }
.danger { color: #ff6b6b; }
.success { color: #00ff88; }
.command {
font-family: 'Fira Code', 'Consolas', monospace;
color: #ffd93d;
font-size: 0.85em;
word-break: break-all;
}
.ip { color: #74b9ff; }
.count {
background: rgba(0,217,255,0.2);
padding: 4px 8px;
border-radius: 12px;
font-size: 0.85em;
}
.full-width { grid-column: 1 / -1; }
pre {
background: rgba(0,0,0,0.3);
padding: 15px;
border-radius: 8px;
overflow-x: auto;
font-size: 0.85em;
}
</style>
</head>
<body>
<h1>🍯 Honeypot İstihbarat Merkezi</h1>
<p class="timestamp">Son Güncelleme: $(date '+%Y-%m-%d %H:%M:%S') | Sayfa 60 saniyede yenilenir</p>
<div class="grid">
<div class="card">
<h2>📊 Genel Bakış</h2>
<div class="metric-row">
<div class="metric-item">
<div class="metric">$(cat $LOG_FILE | jq -r '.session' | sort -u | wc -l)</div>
<div class="metric-label">Toplam Bağlantı</div>
</div>
<div class="metric-item">
<div class="metric">$(cat $LOG_FILE | jq -r '.src_ip' | sort -u | wc -l)</div>
<div class="metric-label">Benzersiz IP</div>
</div>
</div>
</div>
<div class="card">
<h2>🔐 Giriş İstatistikleri</h2>
<div class="metric-row">
<div class="metric-item">
<div class="metric success">$(cat $LOG_FILE | jq 'select(.eventid=="cowrie.login.success")' | wc -l)</div>
<div class="metric-label">Başarılı</div>
</div>
<div class="metric-item">
<div class="metric danger">$(cat $LOG_FILE | jq 'select(.eventid=="cowrie.login.failed")' | wc -l)</div>
<div class="metric-label">Başarısız</div>
</div>
</div>
</div>
<div class="card">
<h2>🌍 En Aktif Saldırganlar</h2>
<table>
<tr><th>IP Adresi</th><th>Deneme</th></tr>
$(cat $LOG_FILE | jq -r '.src_ip' | sort | uniq -c | sort -rn | head -10 | awk '{print "<tr><td class=\"ip\">"$2"</td><td><span class=\"count\">"$1"</span></td></tr>"}')
</table>
</div>
<div class="card">
<h2>🔑 En Çok Denenen Şifreler</h2>
<table>
<tr><th>Şifre</th><th>Deneme</th></tr>
$(cat $LOG_FILE | jq -r 'select(.password != null) | .password' | sort | uniq -c | sort -rn | head -10 | awk '{print "<tr><td class=\"danger\">"$2"</td><td><span class=\"count\">"$1"</span></td></tr>"}')
</table>
</div>
<div class="card">
<h2>👤 En Çok Denenen Kullanıcılar</h2>
<table>
<tr><th>Kullanıcı</th><th>Deneme</th></tr>
$(cat $LOG_FILE | jq -r 'select(.username != null) | .username' | sort | uniq -c | sort -rn | head -10 | awk '{print "<tr><td>"$2"</td><td><span class=\"count\">"$1"</span></td></tr>"}')
</table>
</div>
<div class="card">
<h2>💻 Son Çalıştırılan Komutlar</h2>
<table>
<tr><th>IP</th><th>Komut</th></tr>
$(cat $LOG_FILE | jq -r 'select(.eventid == "cowrie.command.input") | "<tr><td class=\"ip\">\(.src_ip)</td><td class=\"command\">\(.input)</td></tr>"' | tail -10)
</table>
</div>
<div class="card full-width">
<h2>🦠 İndirilen Zararlı Yazılımlar</h2>
<pre>$(ls -lh /mnt/block/cowrie/var/lib/cowrie/downloads/ 2>/dev/null | tail -n +2 | awk '{print $9 " (" $5 ")"}')</pre>
$(if [ -z "$(ls /mnt/block/cowrie/var/lib/cowrie/downloads/ 2>/dev/null)" ]; then echo "<p style='color:#888;'>Henüz malware yakalanmadı</p>"; fi)
</div>
<div class="card full-width">
<h2>⚡ Son 10 Olay (Canlı Akış)</h2>
<table>
<tr><th>Zaman</th><th>IP</th><th>Olay</th><th>Detay</th></tr>
$(cat $LOG_FILE | jq -r '
if .eventid == "cowrie.login.success" then
"<tr><td>\(.timestamp | split("T")[1] | split(".")[0])</td><td class=\"ip\">\(.src_ip)</td><td class=\"success\">✓ Giriş</td><td>\(.username):\(.password)</td></tr>"
elif .eventid == "cowrie.login.failed" then
"<tr><td>\(.timestamp | split("T")[1] | split(".")[0])</td><td class=\"ip\">\(.src_ip)</td><td class=\"danger\">✗ Başarısız</td><td>\(.username):\(.password // "KEY")</td></tr>"
elif .eventid == "cowrie.command.input" then
"<tr><td>\(.timestamp | split("T")[1] | split(".")[0])</td><td class=\"ip\">\(.src_ip)</td><td>💻 Komut</td><td class=\"command\">\(.input)</td></tr>"
else
empty
end
' | tail -10)
</table>
</div>
</div>
</body>
</html>
EOF
echo "✅ Rapor oluşturuldu: $OUTPUT_FILE"
- Çalıştırılabilir yap:
chmod +x /mnt/block/cowrie/create_report.sh
Raporu Web'de Yayınla (Nginx)
# Nginx zaten varsa, sembolik link oluşturun (root yetkisi gerekir)
sudo ln -sf /mnt/block/cowrie/report.html /var/www/html/honeypot.html
# Sonra tarayıcıdan girin
# http://SUNUCU_IP/honeypot.html
6. Sorun Giderme
Container Başlamıyor
Permission Hatası Volume map edilen klasörlerin izinleri yanlışsa container yazamaz.
Log Dosyası Yok