# Kali Agent (LocalAI) Yerel bir LLM (BaronLLM Llama-3.1) ile **Kali Linux** sanal makinesini SSH üzerinden süren otonom bir sızma testi (pentest) ajanı. Beyin Windows'ta, "kollar" Kali'de. Artık sesli komutla da kontrol edilebilir (offline STT, Türkçe). > Eğitim ve yetkili sızma testi senaryoları içindir. Sadece izin aldığın sistemler üzerinde çalıştır. --- ## Mimari Özet ``` [Kullanıcı: klavye veya mikrofon] | v +------------------- Windows --------------------+ | agent.py (REPL + ReAct loop) | | | | | +-- voice.py (faster-whisper STT, ops.) | | +-- ollama.Client -> BaronLLM (Modelfile) | | +-- tool_call.py (parse + dispatcher) | | +-- safety.py (komut filtresi) | | +-- ssh_client.py | | +-- logger.py (JSONL session logu) | +-----------------------|------------------------+ | paramiko / SSH (anahtar) v +--------- Kali VM ---------+ | bash + nmap/sqlmap/... | +---------------------------+ ``` **ReAct döngüsü** her adımda şu akışı izler: ``` Thought: Action: run_cmd Action Input: ``` Komut Kali'de çalıştırılır, çıktı `Observation:` olarak modele geri verilir. Görev `Final Answer:` ile veya `--max-steps` limitiyle biter. Manuel modda her adımda Enter ile onay alınır. --- ## Klasör Yapısı ``` LocalAI/ agent.py # Ana orkestrator, REPL, ReAct döngüsü config.py # .env'den dataclass'lara mapping ssh_client.py # paramiko sarmalayıcısı (Kali SSH) tool_call.py # ReAct parser + ToolDispatcher safety.py # Yıkıcı komut filtresi (block/warn) voice.py # Sesli komut: faster-whisper + sounddevice logger.py # Oturum başına JSONL log Modelfile # Ollama: BaronLLM + sistem promptu + parametreler requirements.txt .env / .env.example test_ssh.py # SSH bağlantısı için izole test logs/ # session-YYYYMMDD-HHMMSS.jsonl ``` --- ## Kurulum ### 1. Kali VM tarafı ```bash sudo apt update && sudo apt install -y openssh-server sudo systemctl enable --now ssh ip a # bridged adapter ise LAN IP'sini not al ``` Windows'ta üretilmiş public key'i (`~/.ssh/id_ed25519.pub` içeriği) Kali'de: ```bash mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "ssh-ed25519 AAAA... kerem@windows" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` ### 2. Windows tarafı ```powershell cd C:\Users\kerem\Documents\LocalAI python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt ``` > Python 3.12 / 3.13 / 3.14 destekleniyor. `faster-whisper` arka planda `ctranslate2` derler; wheel mevcut değilse Visual Studio Build Tools gerekebilir. ### 3. Ollama + model ```powershell # Ollama kurulu degilse: https://ollama.com/download ollama serve # arka planda calissin # baronllm-llama3.1-v1-q6_k.gguf dosyasini proje koküne koyduktan sonra: ollama create KaliSupport -f .\Modelfile ollama list # KaliSupport gorulmeli ``` ### 4. `.env` `.env.example` dosyasını kopyalayıp düzenle: ```powershell Copy-Item .env.example .env notepad .env ``` Doldurulması zorunlu alanlar: - `KALI_HOST` — Kali VM'in LAN IP'si - `KALI_SSH_KEY` — Windows'taki **private** anahtarın tam yolu - `OLLAMA_MODEL` — `ollama list`'te gördüğün isim (örn. `KaliSupport`) ### 5. SSH'i tek başına doğrula ```powershell python test_ssh.py ``` `pong` görüyorsan bağlantı sağlam. --- ## Çalıştırma ### REPL (varsayılan) ```powershell python agent.py ``` REPL komutları: | Giriş | Anlamı | |------|--------| | `` | Görev metni; ajan ReAct'e başlar | | `:v` veya `voice` | Mikrofonu aç, konuşmayı transkript et, görev olarak gönder | | `:r` veya `reset` | Mesaj geçmişini temizle (model konteksini sıfırla) | | `:q` / `quit` / `exit` | Çık | ### Voice-first mod Her prompt'ta otomatik mikrofon açılsın (yine de Enter'a basıp metin de yazabilirsin): ```powershell python agent.py --voice ``` ### Otomatik mod (her adımı sormadan) ```powershell python agent.py --auto python agent.py --auto --voice ``` ### Tek seferlik görev ```powershell python agent.py "192.168.1.20 portlarini tara ve 80 acıksa dirb yap" ``` ### Manuel mod adım onayı | Tuş | Etki | |-----|------| | Enter / `e` | Komutu çalıştır | | `d` | Komutu düzenle | | `s` | Bu adımı atla (modele "skipped" döner) | | `q` | Loop'u durdur | --- ## Voice (Sesli Komut) ### Nasıl çalışıyor 1. `:v` yazınca mikrofon akışı (`sounddevice`, 16 kHz mono float32) açılır. 2. Ekrana akan `.` ve `#` karakterleri mini bir VU-meter gibi davranır (`.` sessizlik, `#` ses var). 3. Konuşmaya başlayınca kayıt başlar; `VOICE_SILENCE_SECONDS` (varsayılan 1.5sn) kesintisiz sessizlikten sonra otomatik kapanır. 4. Ses parçası `faster-whisper` ile yerelde transkript edilir (varsayılan model: `small`, dil: `tr`). 5. Transkript ekrana yazılır; onay/düzenleme menüsü gelir: | Tuş | Etki | |-----|------| | Enter / `e` | Aynen görev olarak gönder | | `d` | Önce düzenle, sonra gönder | | `r` | Yeniden dinle | | `q` | İptal | ### Ortam değişkenleri (`.env`) | Değişken | Varsayılan | Açıklama | |----------|------------|----------| | `VOICE_ENABLED` | `true` | `false` -> `:v` komutu kapalı, kütüphaneler yine de yüklenmeyebilir | | `VOICE_PREWARM` | `true` | Agent başlangıcında modeli yükle. Açıkken startup ~5-30 sn uzar, ama ilk `:v`'de bekleme olmaz | | `VOICE_MODEL` | `small` | `tiny` / `base` / `small` / `medium` / `large-v3`. Türkçe için minimum `small` öneririm | | `VOICE_DEVICE` | `cpu` | `cpu` / `cuda` / `auto`. CUDA seçersen `compute_type`'ı da güncelle | | `VOICE_COMPUTE_TYPE` | `int8` | CPU: `int8`. GPU: `float16` veya `int8_float16` | | `VOICE_LANGUAGE` | `tr` | `tr`, `en`, ... `auto` -> dili Whisper tahmin eder | | `VOICE_SAMPLERATE` | `16000` | 16 kHz Whisper'in beklediği değer; değiştirme | | `VOICE_SILENCE_THRESHOLD` | `0.012` | RMS eşiği. Klavye/fan yüzünden tetiklenirse yükselt; konuşma duyulmuyorsa düşür | | `VOICE_SILENCE_SECONDS` | `1.5` | Kayıt durduran kesintisiz sessizlik süresi | | `VOICE_MAX_SECONDS` | `60` | Sert üst sınır | | `VOICE_INITIAL_TIMEOUT` | `8` | Konuşma hiç başlamazsa kaç saniye sonra iptal | | `VOICE_INPUT_DEVICE` | *(boş)* | Boş = sistem default. Sayı ya da isim parçası verilebilir | | `VOICE_CONFIRM` | `true` | `false` -> transkript görünür ama onay sormadan görev olarak gider | ### Mikrofon listesi ```powershell python -m voice devices ``` Çıktıdaki numarayı `VOICE_INPUT_DEVICE`'a yaz, ya da ismin bir parçasını (örn. `Realtek`). ### Sadece STT'yi test et ```powershell python -m voice listen ``` Konuş, transkript ekranda. Ajan, SSH, hiçbiri açılmaz; mikrofon + Whisper bütünleşmesini izole etmek için ideal. ### Voice kapanırsa `:v`'yi her tuşladığında "voice kapali" diyorsa: ```powershell python -c "import voice; print(voice.VoiceInput(__import__('config').VoiceConfig.from_env()).is_available())" ``` Çıkan mesaj: - `sounddevice yuklu degil` → `pip install sounddevice` (PortAudio sürücüsü Windows'ta gömülü gelir) - `faster-whisper yuklu degil` → `pip install faster-whisper` - `VOICE_ENABLED=false` → `.env`'de `true` yap - `Mikrofon akisi acilamadi` → `python -m voice devices` ile başka cihaz dene ### Performans ipuçları - **CPU + `small` + `int8`** ortalama bir laptop'ta ~5-10 sn'lik bir görev için 1-3 sn transkript verir. - **GPU yetmezse** `VOICE_DEVICE=cpu` kalsın; BaronLLM zaten 4-6 GB VRAM kullanıyor, paylaşmaktansa CPU'da Whisper koşturmak daha sağlıklı. - Daha hızlı istiyorsan: `VOICE_MODEL=base`. Daha doğru: `medium` (CPU'da yavaşlar ~2x). ### İlk çalıştırma: model indirme İlk `:v`'de (veya `VOICE_PREWARM=true` ile agent başlangıcında) faster-whisper modeli HuggingFace Hub'dan indirilir. Boyutlar (yaklaşık): | Model | İndirme | Bellek | |-------|---------|--------| | `tiny` | 75 MB | ~150 MB | | `base` | 150 MB | ~300 MB | | `small` | 466 MB | ~700 MB | | `medium` | 1.5 GB | ~2.5 GB | | `large-v3` | 2.9 GB | ~5 GB | İndirilen dosyalar `C:\Users\\.cache\huggingface\hub\` altında saklanır. **HF rate limit / hız:** anonim indirme yavaş olabilir. Hızlandırmak için bir HuggingFace token üret ([huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)) ve PowerShell'de: ```powershell $env:HF_TOKEN = "hf_xxxxxxxxxxxxxxxxxx" python agent.py ``` Ya da `.env` dosyasına `HF_TOKEN=hf_...` ekle (python-dotenv zaten yükler). ### Mikrofon ayarı: konuşmama tetiklenmiyor / kayıt durmuyor Recording sonu basılan `[voice] kayit bitti: 9.7s, rms=0.011 (esik=0.012)` satırı en kritik tanı çıktısı: - **`rms < esik`** ise kayıt boyunca eşiğin altındasın; transkript boş gelebilir. Çözüm: mikrofona daha yakın konuş, ya da `VOICE_SILENCE_THRESHOLD`'u düşür (örn. `0.005`). - **Kayıt hiç durmuyor** (sürekli `#`): arka plan gürültüsü yüksek; eşiği yükselt (`0.020`+) ya da `VOICE_MAX_SECONDS`'i kısalt. --- ## Konfigürasyon Referansı ### Ollama | Değişken | Açıklama | |---------|----------| | `OLLAMA_HOST` | `http://127.0.0.1:11434` | | `OLLAMA_MODEL` | `Modelfile`'dan ürettiğin isim | | `OLLAMA_NUM_GPU` | GPU katmanı sayısı. CUDA OOM alırsan düşür | | `OLLAMA_NUM_CTX` | Bağlam penceresi (token). 4096 tipik nmap çıktıları için yeterli | | `OLLAMA_TEMPERATURE` | Pentest komutları için 0.3-0.5 öneririm | | `OLLAMA_KEEP_ALIVE` | **Birim zorunlu**. `30m`, `1h`, `0` (anında unload), `-1` (sonsuz). Birimsiz sayı yazarsan `config.py` otomatik dakikaya çevirir | ### SSH | Değişken | Açıklama | |----------|----------| | `KALI_HOST` / `KALI_PORT` / `KALI_USER` | Kali VM bağlantısı | | `KALI_SSH_KEY` | Private key tam yolu | | `KALI_SSH_KEY_PASSPHRASE` | Boş bırak ya da parola | | `KALI_SSH_PASSWORD` | Public key oturana kadar fallback | | `SSH_COMMAND_TIMEOUT` | Saniye. nmap full scan için 600+ tut | ### Safety | Değişken | Açıklama | |----------|----------| | `SAFETY_MODE` | `enforce` (varsayılan; `block` kuralları durdurur) / `audit` (her şey geçer, sadece loglanır) | `safety.py` içinde tanımlı kurallar (özet): - `rm -rf /`, `rm -rf ~`, kritik `/etc` üzerine yazma - `mkfs`, `dd of=/dev/sd*`, `wipefs` - Fork bomb (`:(){ :|:& };:`) - `shutdown` / `reboot` / `systemctl poweroff` - `~/.ssh` veya `authorized_keys` silme; `sshd` durdurma - `userdel root/kali` - `curl ... | bash` (warn) Kuralları elle test: ```powershell python safety.py "rm -rf /" python safety.py "nmap -sV 192.168.1.10" ``` --- ## Loglar Her oturum yeni bir JSONL dosyası: `logs/session-YYYYMMDD-HHMMSS.jsonl`. Olay tipleri: - `session_start` / `session_end` - `info` / `warn` / `error` - `model` — modelden dönen metin (thought/response) - `tool_call` — ajanın istediği tool ve argümanlar - `command` — Kali'de çalışan komutun stdout/stderr/exit_code - `safety_match` — kuralla eşleşen komutlar - `voice_*` — voice yaşam döngüsü (`voice_record_start`, `voice_transcript`, `voice_cancelled`, ...) Ham logları görmek için: ```powershell Get-Content .\logs\session-*.jsonl -Tail 30 | ConvertFrom-Json | Format-Table ts,type,message ``` --- ## Sorun Giderme | Belirti | Sebep / Çözüm | |---------|---------------| | `time: missing unit in duration "1"` | `OLLAMA_KEEP_ALIVE` birim içermiyor. `30m`, `1h`, `-1` yaz. (`config.py` artık otomatik düzeltir) | | `Ollama'ya ulasilamadi` | `ollama serve` çalışmıyor veya `OLLAMA_HOST` yanlış | | `Ollama'da '' modeli yok` | `ollama create -f Modelfile` çalıştır | | `Kimlik dogrulama basarisiz: kali@...` | Public key Kali'deki `~/.ssh/authorized_keys`'te değil; ya da KALI_SSH_KEY private değil | | `Komut zaman asimina ugradi` | `SSH_COMMAND_TIMEOUT`'u artır | | `[voice kapali] sounddevice yuklu degil` | `pip install sounddevice` | | `Mikrofon akisi acilamadi` | `python -m voice devices` ile mevcut cihazları gör; uygun olanı `VOICE_INPUT_DEVICE`'a yaz | | Konuşunca hiçbir şey kaydedilmiyor (`...........`) | `VOICE_SILENCE_THRESHOLD` çok yüksek; `0.005` deneyebilirsin | | Sürekli `#` çıkıyor, kayıt durmuyor | Mikrofon arka plan gürültüsü yüksek; eşiği yükselt veya VOICE_MAX_SECONDS düşür | | `:v` sonrası uzun süre tepkisiz | Model indiriyor (ilk seferde 466 MB / `small`). `VOICE_PREWARM=true` ile bunu agent başlangıcına taşı; veya `HF_TOKEN` set et | | `unauthenticated requests to the HF Hub` uyarısı | Anonim indirme; `HF_TOKEN` set edilirse kaybolur ve indirme hızlanır | | CUDA OOM | `OLLAMA_NUM_GPU`'yu düşür; voice'u CPU'da bırak (`VOICE_DEVICE=cpu`) | --- ## Geliştirici Notları ### Kod stili - Python 3.12+ syntax (`X | Y`, `dict[str, Y]`) - Tüm fonksiyon imzalarında tip ipucu - Yan etki içeren her modül `if __name__ == "__main__":` self-test'iyle gelir: ```powershell python tool_call.py # ReAct parser testi python safety.py # safety kural testi python -m voice listen # STT entegrasyon testi python test_ssh.py # SSH end-to-end ``` ### Yeni tool eklemek `tool_call.py` içinde `ToolDispatcher.register("benim_tool", fn)` ile dinamik kayıt: ```python def my_tool(args: dict[str, str]) -> str: return f"Observation gibi geri dönecek string" dispatcher.register("my_tool", my_tool) ``` Modelin bu tool'u tetiklemesi için `Modelfile`'daki sistem promptuna kullanım örneği eklemen gerekir. ### Yol haritası - [ ] TTS (sesli yanıt) — modelin Final Answer'ını sesli okusun - [ ] Wake-word (her zaman dinle, "Kali" deyince devreye gir) - [ ] Çoklu tool (`run_python`, `read_file`, `download`) - [ ] Web dashboard (logs/`*.jsonl` üzerinden canlı izleme) --- ## Lisans Kişisel/eğitim amaçlı. Bağımlı oldukları kütüphanelerin lisansları geçerlidir (paramiko BSD, ollama-python MIT, faster-whisper MIT, sounddevice MIT).