Stuxnet sadece yeni bir virüs veya solucan değil, aynı zamanda yeni bir malware döneminin başlangıcıdır. Bu virüs kötü amaçlı yazılımların anlamını ve hedeflerini değiştirdi. İnsanları kızdıran veya banka kredi kartlarını çalan bir çok virüs duyuyorsunuz, ancak bir virüsün ilk kez binalara zarar verdiğini, makineleri yok ettiğini veya insanları öldürdüğünü duyuyorsunuz. Stuxnet, üzerinden uzun zaman geçmesine rağmen kötü amaçlı yazılım araştırmacılarından ve medyadan büyük ilgi görmeye devam etmektedir. İran’ın nükleer programını sabote etmek için yaratılmıştır. Bu devlet destekli karmaşık tehdit, Windows işletim sisteminde en fazla dört sıfır gün güvenlik açığı kullanır ve virüsten koruma programları tarafından algılanmasını önlemek için birçok püf noktası içerir. İran nükleer santralindeki makineleri kontrol eden PLC’leri (Programlanabilir Mantık Denetleyici) etkileyerek İran nükleer reaktörüne ve makinelerine zarar vermiştir. Bu yazımda stuxnet ile ilgili teknik ayrıntılar ve bu kötü amaçlı yazılımın analizinden edindiğim deneyimlerimi sizlerle paylaşacağım. Stuxnet’in nasıl çalıştığı ve stuxnet yaşam döngüsünden bahsedeceğim. Ancak burada SCADA sistemleri ve stuxnet’in onları nasıl etkilediği hakkında konuşmayacağım ve stuxnet tarafından kullanılan güvenlik açıkları hakkında sizlere ipuçları vereceğim.
Bu zararlı yazılım temel olarak İran Nükleer Programını sabote etmek için yaratılmıştır. Bir PC’ye kurulduktan sonra, Stuxnet, makinelerin kendilerini kontrol eden PLC’lerin (programlanabilir mantık denetleyici) kodunu kontrol eden ve değiştiren WinCC ve PCS 7 programlarını çalıştıran sistemlere erişmek için Siemens’in varsayılan şifrelerini kullanmaktadır. Öncelikle Siemens sistemiyle ilgili yapılandırma bilgilerini bir komut ve kontrol sunucusuna yükleniyor. Bu şekilde saldırganlar bir hedef seçebilir ve gerçekten de çalışma şeklini yeniden programlayabilmektedirler. PLC’lerin onlar için nasıl çalışmasını istediklerine karar veriyorlar ve ardından PLC’lerin çalışma şeklini değiştirecek virüs bulaşmış makinelere kod gönderiyorlar. Yüksek hızlı santrifüjleri döndürmek ve onları yavaşlatmak için kontrol sistemlerinin yeniden programlanmasından önce İran’ın tartışmalı nükleer programına bağlı tesislere bulaşmayı başarmıştır.
Stuxnet virüsünün Windows işletim sistemindeki canlı döngüsünü inceleyeceğiz. Bu döngüdeki her adımı WTR4132.TMP isimli stuxnet solucanının ana bulaşma dosyası üzerinden başlayarak detaylı bir şekilde sizlere açıklamaya çalışacağım.

1. Ana Bulaşma Dosyası (~WTR4132.TMP)
Bu Dosya, Explorer.exe dosyasına yüklenmiş olan dinamik bir bağlantı kitaplığı dosyasıdır. İşlemi yürütmeye “.stub” bölümü adlı bir bölümü arayarak başlar.

Bu bölüm ana stuxnet DLL dosyasını içermektedir. Bu DLL tüm stuxnet’in fonksiyonlarını, mekanizmalarını, dosyalarını ve kök setlerini içermektedir. Aşağıda MZ Dosyasının içeriğindeki .stub bölümünü görmektesiniz:

Bu “.stub” bölümü, yayılma mekanizması, güncelleme mekanizması ve diğer birçok şey için önemli olan stuxnet’in yapılandırma verilerini de içermektedir. Bu bölümü bulduktan sonra, stuxnet DLL dosyasını özel bir şekilde yüklüyor. İlk olarak, yüklenecek DLL dosyası için bir bellek tamponu ayırmakla işe başlıyor. Sonra, aşağıdaki isimlere sahip 6 adet ntdll.dll API’sini yamalıyor.
1. ZwMapViewOfSection;
2. ZwCreateSection;
3. ZwOpenFile;
4. ZwClose;
5. ZwQueryAttributesFile;
6. ZwQuerySection;

Bu API’leri, ZwOpenFile ile açmanız gereken dosya gibi “.stub” bölümü yapmaya ve bu bölümden sabit diskteki bir dosya olarak okumayı zorluyor. Bu yamalar LoadLibraryA’nın sabit diskten değil de bellekteki bir yerden bir DLL dosyası yüklemesini sağlar. Ana DLL dosyasını yukarıda açıklandığı gibi yüklemek için KERNEL32.DLL.ASLR.XXXX gibi DLLName ile LoadLibraryA’yı çağırır ve daha sonra, Main Stuxnet DLL dosyasında fonksiyon #15’i çağırır.
2. Ana STUXNET DLL
1. Aşama : Yetki yükseltmesi ve yeni bulaştırma süreci: Ana DLL yürütmeye başladığında, kendini unupx (DLL upxed gibi) ve sonra bu stuxnet örneğinin yapılandırma verilerini kontrol eder ve ortamın baştan devam edip etmeyeceğini seçmek için ortamı kontrol eder. Yapılandırma verilerinin doğru ve güncel olup olmadığını kontrol eder ve ardından yönetici haklarını kontrol eder. Yönetici düzeyinde çalışmıyorsa, ayrıcalıkları yükseltmek ve yönetici düzeyinde çalıştırmak için sıfır günlük iki güvenlik açığından birini kullanır.
CVE-2010-2743(MS-10-073) –Win32K.sys Keyboard Layout Vulnerability
CVE-xxxx-xxxx(MS-xx-xxx) –Windows Task Scheduler Vulnerability

Bu iki güvenlik açığı, zararlı yazılımın ayrıcalıkları artırmasına ve yeni bir işlemde (Win32K.sys durumunda “csrss.exe”) veya Görev Zamanlayıcı durumunda yeni bir görevde çalışmasına izin verir. Ayrıca 64 bit veya 32 bit üzerinde kontrol gibi başka bazı kontrolleri gerçekleştirir. Her şey yolunda gittikten ve ortam stuxnet tarafından bulaştırılmaya hazır olduktan sonra, kendisini bu işlemden yüklemek için kendisini başka bir sürece enjekte ediyor. Enjeksiyon, makineye kurulu bir Antivirüs uygulamasını arayarak başlar. Virüsten koruma uygulamasına bağlı olarak, Stuxnet kendi içine enjekte edileceği işlemi seçer. Virüsten koruma programı yoksa, “lsass.exe” yi seçer.
Görev yöneticisinde bu işlemi kendine enjekte etmek için aramaz, ancak seçilen uygulamanın askıya alınmış haliyle yeni bir işlemi (CreateProcess kullanarak) oluşturur:
ESP ==> > 0006F4F8 |ModuleFileName = "C:\WINDOWS\\system32\\lsass.exe"
ESP+4 > 00000000 |CommandLine = NULL
ESP+8 > 00000000 |pProcessSecurity = NULL
ESP+C > 00000000 |pThreadSecurity = NULL
ESP+10 > 00000001 |InheritHandles = TRUE
ESP+14 > 0800000C |CreationFlags = CREATE_SUSPENDED|DETACHED_PROCESS|CREATE_NO_WINDOW
ESP+18 > 00000000 |pEnvironment = NULL
ESP+1C > 00000000 |CurrentDir = NULL
ESP+20 > 0006F13C |pStartupInfo = 0006F13C
ESP+24 > 0006F730 \pProcessInfo = 0006F730

Bu işlemi oluşturduktan sonra, kendisine özel bir yolla enjekte olur. Bu özel yol, programı hafızasından kaldırmak (örneğin, lsass.exe modülünü hafızasından kaldırmak) ve daha önce kaldırılmış olan yerdeki stuxnet DLL kaynaklarından başka bir PE dosyası yüklemektir.
Bu yeni PE Dosyasını yüklemeden önce stuxnet, “.verif” adlı yeni bir bölüm ekleyerek dosyada bazı değişiklikler yapar. Bu bölüm PE Dosyasının boyutunu önceden boşaltılmış modülün boyutuna eşit olarak yaratır. Yüklenmemiş modülün giriş noktasının yerine, stuxnet bu PE Dosyasının giriş noktasına bir “jmp” komutu yazar.

Son adım olarak stuxnet, .stub bölümünü ve ana DLL dosyasını virüslü işlemin belleğine kopyalar ve .bin bölümüne işaretçiyi bu bellek arabelleğine yazar.

Sonunda, stuxnet bu virüslü işlemin ana iş parçacığını sürdürür. PE dosyası, ana stuxnet DLL dosyasını yeniden yükler ve fonksiyon #16’yı çağırır.
2. Aşama : STUXNET’i etkilenen makineye kurma süreci: Fonsiyon #16, yapılandırma verilerini kontrol ederek başlar ve kuruluma başlamak için her şeyin hazır olduğundan emin olur. Ayrıca, kayıt defterinde “NTVDM TRACE” adı verilen bir değer olup olmadığını kontrol eder.
SOFTWARE\Microsoft\Windows\CurrentVersion\MS-DOS Emulation
Ardından, bu değerin “19790509” değerine eşit olup olmadığını kontrol eder. Bu değer “9 Mayıs 1979” tarihine benziyor ve bu tarihin tarihi bir anlamı var. “Habib Elghanian, Tahran’daki sıkı sıkıya bağlı bir İran Yahudi topluluğuna şok dalgaları gönderen bir ateş timi tarafından idam edildiği tarihtir.”

Bu testten sonra, Stuxnet Windows dizinine 6 dosya yazarak kendisini yükler.

  • 4 şifreli dosya ismi ve yolu aşağıdaki gibidir.
    C:\WINDOWS\inf\oem7A.PNF
    C:\WINDOWS\inf\oem6C.PNF
    C:\WINDOWS\inf\mdmcpq3.PNF
    C:\WINDOWS\inf\mdmeric3.PNF
  • ve 2 aygıt sürücüsü ismi ve yolu aşağıdaki gibidir.
    C:\WINDOWS\system32\Drivers\mrxnet.sys
    C:\WINDOWS\system32\Drivers\mrxcls.sys

Bundan sonra, bilgisayarın her açılışında çalışacaklarından emin olmak için aygıt sürücülerini kayıt defterine yükler. Windows sistem uygulamalarının çoğundan önce başlangıçta yüklenmelerini zorlayacak şekilde bir komut satırı yer almaktadır.


Yüklemeden sonra, ZwLoadDriver’ı çağırarak mrxnet sürücüsünü yükler. SeLoadDriverPrivilege’ı ayrıcalıklarına eklemek için ayrıcalıklarını “AdjustTokenPrivileges” ile ayarladıktan sonra bu işlevi çağırır.
Sonunda, bu güvenlik duvarı tarafından durdurulmasını önlemek için Windows Güvenlik Duvarı (Windows Defender) ayarını değiştirir.
Anahtardaki bazı değerler:
SOFTWARE\Microsoft\Windows Defender\Real-Time Protection
Ve değerler:
EnableUnknownPrompts
EnableKnownGoodPrompts
ServicesAndDriversAgent

Hepsini sıfıra ayarlar ve stuxnet için güvenlik duvarını devre dışı bırakır. Şimdi kurulum bitiyor ve bir sonraki bölümde yayılma mekanizması hakkında size bilgi vereceğim.

3. Yayılma Mekanizması
1. USB ile Bulaşma ve Yayılma Süreci: USB Flash belleğe virüs bulaştırmak için, Stuxnet yeni bir “AFX64c313” gizli penceresi yaratır ve “WM_DEVICECHANGE” Windows Mesajı’nı bekleyerek bilgisayara eklenen herhangi bir yeni USB flash bellekten haberdar edilir.
Bilgisayara eklenen yeni bir sürücüden (USB Flash Bellek) haberdar olduktan sonra, stuxnet 6 dosyayı flash bellek sürücüsüne yazar:

  • Copy of Shortcut to.lnk
    Copy of Copy of Shortcut to.lnk
    Copy of Copy of Copy of Shortcut to.lnk
    Copy of Copy of Copy of Copy of Shortcut to.lnk
  • Ve 2 çalıştırılabilir dosya (DLL dosyaları):
    ~WTR4141.tmp
    ~WTR4132.tmp

Bu hatalı biçimlendirilmiş kısayol dosyaları, CVE-2010-2568 (MS-10-046) – Windows Shell LNK Güvenlik Açığı adlı Windows Kabuğu’ndaki güvenlik açığını kullanır. Bu güvenlik açığı, arabellek taşması güvenlik açığı değildir, ancak pencerelerin bu güvenlik açığını oluşturan LNK dosyaları için simgeler yüklemesinin kötü bir yolundan kaynaklanmaktadır. Bu kısayollar, CPL Dosyaları adlı bilinmeyen bir dosya türü için özel kısayollardır. Bu dosyalar, windows dizinindeki datetime.cpl ve çoğu Windows dizinindeki Denetim Masası uygulamalarıdır. Denetim Masası, ardından Klasik görünüme geçip herhangi bir uygulamaya sağ tıklayıp, resimde gördüğünüz gibi “create shortcut” u tıklayarak bu kısayollara benzer bir kısayol oluşturabilirsiniz.


Bu kısayolu stuxnet’in hatalı biçimlendirilmiş kısayolu ile karşılaştırmaya çalışırsanız, şunu göreceksiniz:

Çok benzerler (beyaz alan ile gösterilenler benzer yerlerdir). Farklılıklar kısayolun sonundadır. Kısayolu analiz edersek, tüm kısayolların aşağıdaki bölümleri içerdiğini görürüz:
.LNK File Format
1. Header
2. Shell Item Id List
3. File Location Info
4. Description
5. Relative Path
6. Working Directory
7. Command Line Arguments
8. Icon Filename
9. Additional Info
Kötü Biçimli Kısayolumuzda yalnızca ilk 2 bölüm vardır. İlk bölüm şu şekildedir:

Bu header, daha önce oluşturduğunuz CPL Kısayolu ile tam olarak aynıdır. Bir sonraki Bölüm, Shell Item ID List. Bu bölümü açıklamak zor ancak penceredeki her nesne (bir klasör, dosya, kontrol paneli vb.) PIDL’ye sahip. PIDL hakkında hiçbir fikrim yok, ancak bu nesneye gönderme yapan bir kimlik numarası olduğunu düşünüyorum. Shell Item ID, işaretsiz bir kısa değer ile başlar, tüm bölümün boyutunu gösterir (Orijinal CPL dosyasında uzuluk == size_of_whole_file – size_of_header).
Bundan sonra, bu işaretsiz kısa değer bir ID ve ardından listedeki bir öğenin kimliği, ardından bir sonraki boyut ve öğe vb. Bu bölümün sonuna ulaşana kadar devam eder. Bu bölüm, büyüklüğü sıfıra eşit bir öğe ile sona erer.
Veya bu hatalı biçimlendirilmiş kısayoldaki gibi Denetim Masası gibi sanal bir nesneyi temsil eder. Hatalı biçimlendirilmiş kısayolda, bu bölüm Kontrol Paneli’nin PID ile başlar ve daha sonra bir öğeye ulaşana kadar bazı diğer PID’ler stuxnet DLL dosyasının yolunu ve dosya adını içerir (“~ WTR4141.TMP”)
Dosya yolu şu şekildedir:
\\.\STORAGE#RemovableMedia#7&364cf31c&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\~WTR4141.tmp
Şimdi aklınızda şöyle bir soru oluşabilir, öyleyse neden dört kısayol dosyası var? Çünkü her dosya stuxnet’in bu güvenlik açığına sahip tüm Windows işletim sistemi sürümleriyle uyumlu olmasını sağlamak için wtr4141.tmp dosyasına giden yolun farklı bir biçimini içerdiğinden 4 farklı kısayol dosyası bulunmaktadır.
Diğer işletim sistemleri için dosya yolları aşağıdaki gibidir:
Windows 7:

\\.\STORAGE#Volume#_??_USBSTOR#Disk&Ven_____USB&Prod_FLASH_DRIVE&Rev_#12345000100000000173&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\~WTR4141.tmp
Windows Vista:
\\.\STORAGE#Volume#1&19f7e59c&0&_??_USBSTOR#Disk&Ven_____USB&Prod_FLASH_DRIVE&Rev_#12345000100000000173&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\~WTR4141.tmp
Windows XP, Windows Server 2003 and Windows 2000:
\\.\STORAGE#RemovableMedia#8&1c5235dc&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\~WTR4141.tmp
\\.\STORAGE#RemovableMedia#7&1c5235dc&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\~WTR4141.tmp
Bu dosya yolları Explorer.exe’yi stuxnet’i yüklemeye ve kodunu çalıştırmaya zorlar. Explorer, wtr4141.tmp ana işlevini yürüten LoadLibraryA API’sini çağıran bu kısayolun simgesini yüklemek için “Shell32.LoadCPLModule” adlı bir API’yi çağırır. Bu güvenlik açığını kullanan Stuxnet’in bulaşma mekanizması budur.
2. Network’de yayılma süreci: Stuxnet, güvenlik açıklarından birini kullanarak Ağ üzerinden yayılmayı sağlıyor. Bunlar;
CVE-2008-4250(MS-08-067) –Windows Server Service NetPathCanonicalize() Vulnerability
CVE-2010-2729(MS-10-061) –Windows Print Spooler Service Vulnerability
İlk güvenlik açığı sıfırcı gün bir güvenlik açığı değildir, zaten bilinmektedir. Bu güvenlik açığı daha önce Conficker tarafından kullanılıyordu. Bu güvenlik açığında, stuxnet uzak sistemlerdeki C$ ve Admin$ paylaşımlarını arar. Ardından, paylaşımda bulunan ilk yazılabilir dizinde “DEFRAGxxxxx.TMP” adlı bir dosya olarak kendisini kopyalar. Ve sonra, aşağıdaki gibi bir komutu çalıştırmaya çalışır:
rundll32.exe “DEFRAGxxxxx.TMP”,DllGetClassObjectEx
İkinci güvenlik açığı sıfırcı gün bir güvenlik açığıdır. Bu güvenlik açığı ilk olarak Carsten Kohler tarafından Hacking Security Magazine 04-2009’da “Print Your Shell” adlı bir makalede açıklanmıştır.
Bu güvenlik açığı, Stuxnet’e kadar hiçbir yerde kullanılmamıştır. Bu güvenlik açığı, misafir bir kullanıcı hesabının makineyle paylaşılan bir yazıcıyla iletişim kurmasını sağlar ve içindeki dosyayı sistem dizinine yazar.
Yazdırma için Windows API’leri, dosyanızı “GetSpoolFileHandle” adında bir API ile kopyalamak istediğiniz dizini seçmenize izin verir, yeni oluşturulan dosyanın dosya tanıtıcısını hedef makinede bulabilir ve daha sonra “ReadFile” ve “WriteFile” ile kolayca yapabilirsiniz. API’lerinizi dosyanızı hedef makineye kopyalayabilirsiniz.
Stuxnet için 2 dosyayı hedef makineye kopyalar:
Windows\System32\winsta.exe
Windows\System32\wbem\mof\sysnullevnt.mof

İlk dosya stuxnet bırakıcısı, ikincisi ise “Managed Object Format” dosyasıdır. Bu dosya (bazı koşullar altında) winsta.exe dosyasını yani stuxnet dropper’ı çalıştırır.
STUXnet analizine devam etmek için 2 bölümde incelemenin daha verimli olacağını düşündüm. Bir sonraki bölümde STUXnet güncelleme mekanizmalarını, Rootkit yapısını ve Yükleme mekanizmasını anlatacağım. Bir sonraki yazımda görüşmek dileğiyle şimdilik hoşçakalın…