Kayra Aktas - CTI Project
Go ile geliştirilmiş dark web intelligence dashboard. Tor scraper verilerini görselleştirir, analiz eder ve yönetir.
- Tor ağı üzerinden .onion sitelerini tarama
- SOCKS5 proxy desteği (127.0.0.1:9150)
- Otomatik kategori tahmini
- Hata yönetimi ve loglama
- SQLite veritabanı
- Otomatik başlık üretimi (regex/pattern matching)
- Kategori sınıflandırması (Forum, Market, Search Engine, Portal, Other)
- Kritiklik seviyesi (1-5)
- Tam metin arama
- Session-based authentication
- İstatistik kartları (toplam kayıt, kritik sayısı, vb.)
- Kategori ve kritiklik dağılımı grafikleri (Chart.js)
- Filtreleme (kategori, kritiklik, arama)
- Detay görüntüleme
- Kritiklik düzenleme (AJAX)
- Modern gradient UI
Dashboard'daki her özellik CTI analisti için farklı amaçlara hizmet eder:
Kategori Dağılımı Grafiği Hangi platformların aktif olduğunu gösterir. Forumlar artıyorsa tehdit aktörleri bilgi paylaşımını yoğunlaştırıyor demektir. Analist buna göre hangi kategoriye odaklanacağına karar verir.
Kritiklik Seviyeleri Grafiği Seviye 5 kayıtlar acil inceleme gerektirir. Analist önce bu kayıtlara bakar, zaman yönetimi yapar. Seviye 1 kayıtlar bilgilendirme amaçlıdır.
Filtreleme Sistemi Analist "exploit" veya "ransomware" gibi anahtar kelimelerle hızlı arama yapar. Kategori filtresi ile sadece forumları veya sadece marketleri inceleyebilir. Binlerce kayıt arasında ilgili tehdidi bulmak için gerekli.
Detay Sayfası Ham içerik ve metadata'yı birlikte görmek önemli. Analist kaynak URL'ini takip edebilir, aynı siteyi tekrar ziyaret edebilir. İçeriği okuyup kritiklik seviyesini değiştirebilir.
Kritiklik Düzenleme Başlangıçta orta (3) olan bir kayıt, içerik okunduktan sonra kritik (5) olabilir. Analist manuel düzenleme yaparak veriyi güncel tutar.
Kritiklik seviyeleri şu kriterlere göre belirlenir:
Seviye 5 (Kritik): 0-day exploit, ransomware-as-a-service, canlı veri sızıntısı
Seviye 4 (Yüksek): Güvenlik açığı tartışmaları, exploit kit satışı
Seviye 3 (Orta): Genel güvenlik forumları, tartışma platformları (varsayılan)
Seviye 2 (Düşük): Privacy araçları, VPN/proxy servisleri
Seviye 1 (Çok Düşük): Arama motorları, dizin siteleri, wiki sayfaları
Analist içeriği okuduktan sonra seviyeyi manuel değiştirebilir.
Forum: Tehdit aktörlerinin bilgi paylaştığı platformlar. En önemli kategori çünkü yeni tehditler buradan çıkar.
Market: Illegal araç, veri veya servis satışı. Ransomware, exploit kit, stolen data izlenir.
Search Engine: Yeni .onion siteleri keşfetmek için kullanılır.
Portal: Haber, wiki ve dizin siteleri. Dark web haritası çıkarmak için kullanılır.
Other: Kategorize edilemeyen siteler.
Backend:
- Go 1.21+
- Gin Web Framework
- GORM (ORM)
- SQLite (pure Go driver)
- Session management (cookie-based)
- Tor SOCKS5 proxy (golang.org/x/net/proxy)
Frontend:
- HTML5 / CSS3
- Vanilla JavaScript (AJAX)
- Chart.js (grafikler)
- Modern gradient design
# Docker ile çalıştır
docker-compose up -d
# Tarayıcıda aç
http://localhost:8080Login:
- Username:
Kayra - Password:
Aktas
# Bağımlılıkları yükle
go mod download
# Test verisi ekle
go run cmd/seed/seed.go
# Server başlat
go run cmd/server/main.goTor Browser'ı başlatın (Port 9150'de SOCKS5 proxy çalışacak).
targets.yaml dosyası oluşturun:
urls:
- http://example1.onion
- http://example2.onion
- http://testforum.oniongo run cmd/scraper/main.goTaranan siteler otomatik olarak veritabanına kaydedilir.
go run cmd/server/main.go
# http://localhost:8080Program, HTML içeriğinden otomatik başlık üretir:
- HTML title tag varsa → Kullan (temizle, 100 karakter limiti)
- H1 tag varsa → Kullan (HTML taglerini temizle)
- İlk paragraf metni → İlk 80 karakter + "..."
- URL + Kategori → "DomainName - Category"
- Regex ile HTML tag temizleme
- HTML entity decode (
,&, vb.) - Whitespace normalleştirme
- Uzunluk kontrolü (50-100 karakter)
Örnek:
HTML: "<title>Security Forum - Exploit Discussions</title>"
→ Başlık: "Security Forum - Exploit Discussions"
HTML: "<h1>Latest Vulnerabilities</h1><p>CVE discussions...</p>"
→ Başlık: "Latest Vulnerabilities"
HTML: "Boş veya title/h1 yok"
→ Başlık: "Darkforum - Forum"interactive-scraper/
├── cmd/
│ ├── server/main.go # Web server
│ └── seed/seed.go # Test data seeder
├── internal/
│ ├── database/
│ │ └── db.go # Veritabanı fonksiyonları (10 adet)
## Güvenlik
Session-based authentication
Cookie-based session storage
Protected routes (middleware)
SQL injection koruması (GORM)
XSS koruması (HTML escaping)
**Production Uyarısı:**
- `Kayra/Aktas` credential'larını değiştirin
- Session secret key'i değiştirin ([router.go](internal/web/router.go))
- HTTPS kullanın
### Content Struct
```go
type Content struct {
ID uint // Primary key
Title string // Üretilmiş başlık
SourceName string // Site adı
SourceURL string // .onion URL (unique)
RawContent string // Temizlenmiş metin
HTMLContent string // Ham HTML
PublishDate *time.Time // Paylaşım tarihi (opsiyonel)
Category string // Kategori
Criticality int // 1-5 kritiklik seviyesi
CreatedAt time.Time // Kayıt tarihi
UpdatedAt time.Time // Güncelleme tarihi
}
- 1: Çok Düşük
- 2: Düşük
- 3: Orta
- 4: Yüksek
- 5: Kritik
- Forum
- Market
- Search Engine
- Portal
- Other
| Fonksiyon | Açıklama |
|---|---|
Connect() |
Veritabanı bağlantısını başlatır |
SaveContent(content *Content) |
Yeni kayıt ekler |
GetAllContents() |
Tüm kayıtları getirir (en yeni önce) |
GetContentByID(id uint) |
ID'ye göre kayıt getirir |
UpdateCriticality(id uint, criticality int) |
Kritiklik seviyesini günceller |
DeleteContent(id uint) |
Kayıt siler |
| Fonksiyon | Açıklama |
|---|---|
GetContentsByCategory(category string) |
Kategoriye göre filtreler |
GetContentsByCriticality(criticality int) |
Kritiklik seviyesine göre filtreler |
SearchContents(query string) |
Başlık, içerik veya kaynak adında arama yapar |
GetStatistics() fonksiyonu şu bilgileri döndürür:
- Toplam kayıt sayısı
- Kategori dağılımı
- Kritiklik dağılımı
- Kritik kayıt sayısı (Seviye 5)
- Go 1.21+
- SQLite3
- Bağımlılıkları yükle:
go mod download- Uygulamayı çalıştır:
go run cmd/main.go- Veritabanı otomatik oluşturulur:
- Dosya:
scraper.db - Tablo:
contents
content := &models.Content{
Title: "Dark Web Forum Tartışması",
SourceName: "SecureForum",
SourceURL: "http://example.onion/thread/123",
RawContent: "İçerik metni...",
HTMLContent: "<html>...</html>",
Category: models.CategoryForum,
Criticality: 4,
}
err := database.SaveContent(content)forumContents, err := database.GetContentsByCategory(models.CategoryForum)stats, err := database.GetStatistics()
fmt.Printf("Toplam: %v\n", stats["total"])
fmt.Printf("Kritik: %v\n", stats["critical_count"])results, err := database.SearchContents("güvenlik")Test verileri ile uygulama otomatik test edilir:
go run cmd/main.goÇıktı:
✓ Veritabanı bağlantısı başarılı
✓ Yeni kayıt eklendi: ID=1, Title=...
✓ Kritiklik güncellendi: ID=2, Criticality=4
...
- Tüm URL'ler unique olarak saklanır
- Kritiklik seviyeleri 1-5 arası kontrol edilir
- GORM ile SQL injection koruması
- Hata yönetimi ve loglama
gorm� Docker Komutları
```bash
# Build ve başlat
docker-compose up -d
# Logları izle
docker-compose logs -f
# Durdur
docker-compose down
# Rebuild (kod değişikliği sonrası)
docker-compose up -d --build
Public:
GET /- Login sayfasıPOST /login- Login işlemi
Protected (Auth gerekli):
GET /dashboard- Ana dashboardGET /list- Kayıt listesi (filtreleme desteği)GET /detail/:id- Kayıt detayıPOST /update-criticality- Kritiklik güncellePOST /delete/:id- Kayıt silGET /api/stats- İstatistikler (JSON)GET /api/contents- Tüm kayıtlar (JSON)
# Test verisi ekle
go run cmd/seed/seed.go
# Server başlat
go run cmd/server/main.go
# API test
curl http://localhost:8080/api/statsCREATE TABLE contents (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
source_name TEXT NOT NULL,
source_url TEXT UNIQUE NOT NULL,
raw_content TEXT,
html_content TEXT,
publish_date DATETIME,
category TEXT,
criticality INTEGER DEFAULT 3,
created_at DATETIME,
updated_at DATETIME
);Bu proje CTI (Cyber Threat Intelligence) eğitimi kapsamında geliştirilmiştir.
Öğrenim Hedefleri:
- Dark web veri toplama ve analiz
- Veri görselleştirme ve dashboard tasarımı
- Go ile web uygulama geliştirme
- Docker containerization
- Veritabanı yönetimi
Kritiklik Seviyeleri Neden Önemli?
CTI analistleri için her veri kaynağının risk seviyesini bilmek kritiktir. Dashboard, analistlerin öncelikli tehditleri hızlıca tespit etmesini sağlar.
Kategori Dağılımı Neden?
Tehdit aktörlerinin hangi platformları (forum, market, vb.) kullandığını görmek, trend analizi ve proaktif tehdit avcılığı için gereklidir.
Educational purposes only - CTI Project
Kayra Aktas
- Email: dadas_862@hotmail.com
- GitHub: github.com/kayraaktas
- Proje: Interactive Scraper Dashboard