2026-10-24

netcat ile sunucu ve dinleyici

Linux altında nc, Windows altında ncat ile yerel ağda küçük bir sunucu ve dinleyici kurulabilir. Basit bir yapı için Linux üzerinde bir sunucu oluşturayım.

nc -l 1234

1234/tcp portu ile dinleme başladı. Ya güvenlik duvarı kapalı olmalı, ya da 1234/tcp için kural oluşturulmalı. Benzer şekilde Windows istemci üzerinde de ncat ile bu porta bağlanalım.

ncat 192.168.7.7 1234

Herşey yolunda giderse bu aşamada karşı tarafa bağlantı gerçekleşir. İki bilgisayardan da bu terminallere girilen karakterler karşı tarafa gönderilir. Yani basit bir chat platformu gibi.

Bir de dosya göndermeyi deneyelim. En basit hali ile sunucuyu alıcı olarak yapılandırıp gelen verileri bir dosyaya kaydetmesini isteyelim. Dosyanın şu an için bir txt dosyası olduğunu varsayıyorum.

ncat -l 1234 > dosya.txt

Gönderen Windows makinede de bir dosya seçip gönderelim. Bunu yapmanın iki yolu var. İlki cmd.exe ile.

ncat.exe 192.168.7.7 1234 < D:\dosya.txt

İkinci powershell ile.

Start-Process "D:\Nmap\ncat.exe" -ArgumentList "192.168.7.7 1234" -NoNewWindow -RedirectStandardInput "D:\dosya.txt"

Bir adım öteye gidiyorum; dosyayı gönderen sunucu olsun. Sunucunun linux olması durumundan başlayalım. Linux'ta bash ile bir oluştalım.


while true; do
    { printf 'HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-Disposition: attachment; filename="dosya.zip"\r\nContent-Length: '; stat -c %s dosya.zip | tr -d '\n'; printf '\r\nConnection: close\r\n\r\n'; cat dosya.zip; } | nc -l -p 8080
done

Bu yapılandırma ile linux sunucu üzerinde mevcut klasörde bulunan dosya.zip'i indirmek isteyen karşı tarafın yapması gereken, web tarayıcısının adres satırına

http://192.168.7.7:8080

gibi bir ifade yazmak. Üstteki bash dosyasında yapılandırmayı 8080 portu üzerinden yaptım. Tarayıcı bağlanır bağlanmaz bir dosya indirecek. Metin verisi olmasına gerek yok, binary dosyalar da aktarılabilir.

Sunucunun Windows olması durumunda işi powershell ile yürütebiliriz.



$file = 'D:\dosya.zip'
$port = 8080

$listener = [System.Net.Sockets.TcpListener]::new(
    [System.Net.IPAddress]::Any, $port
)
$listener.Start()

Write-Host "Dosya: $file"
Write-Host "Port: $port"
Write-Host "Durdurmak icin Ctrl+C"

while ($true) {
    $client = $listener.AcceptTcpClient()

    try {
        $stream = $client.GetStream()

        $reader = [System.IO.StreamReader]::new(
            $stream, [System.Text.Encoding]::ASCII
        )
        $request = $reader.ReadLine()
        while ($reader.ReadLine() -ne '') {}

        $name = [System.IO.Path]::GetFileName($file)
        $length = (Get-Item -LiteralPath $file).Length

        $header = "HTTP/1.1 200 OK`r`n"
        $header += "Content-Type: application/octet-stream`r`n"
        $header += "Content-Disposition: attachment; filename=`"$name`"`r`n"
        $header += "Content-Length: $length`r`n"
        $header += "Connection: close`r`n`r`n"

        $bytes = [System.Text.Encoding]::ASCII.GetBytes($header)
        $stream.Write($bytes, 0, $bytes.Length)

        $fs = [System.IO.File]::OpenRead($file)
        try {
            $fs.CopyTo($stream)
        }
        finally {
            $fs.Dispose()
        }

        Write-Host "Gonderildi: $request"
    }
    catch {
        Write-Warning $_
    }
    finally {
        $client.Close()
    }
}

netcat demiştim, konunun biraz dışına çıktım.

---

https://anto.online/netcat-command-line-cheat-sheet/
https://anto.online/nmap-command-line-cheat-sheet/

Hiç yorum yok: