Windows Hacking Serisi #9 | Frida ile Uygulama İntrospeksiyonu

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,192
653
Frida ile Uygulama İntrospeksiyonu

Merhabalar, Frida'yı uygulama introspeksiyonu ve hooking için kullanmayı öğrenip temelden gireceğiz olaya. Function hook'larımıza yapılan değişiklikleri gerçek zamanlı olarak inceleyebileceğimiz kullanışlı bir canlı akış sunduğundan, bu konu boyunca frida-trace'i kullanacağız. JavaScript syntax'ına(sözdizimine) kafa yorduğunuzda, bu bilgiyi çeşitli Frida bağlantılarına (Python / C / Node / Swift / .Net / QML diye) katmanlandırabilirsiniz.

https://www.patreon.com/FuzzySec
https://www.frida.re/

Neden Frida? karmaşık olan hooking mantığını hızla geliştirebileceğiniz ve gereksinimleriniz geliştikçe üzerinde değişiklikler yapabileceğiniz basit bir arabirim sağlıyor (bunu, C ++ function hook'larını yeniden dağıtmanın maliyetli süreciyle karşılaştırabilirsiniz). Frida ne için kullanılır? Konu başlığında belirttiğim gibi introspeksiyon yani (uygulamanın davranışını analiz etmek için uygulamanın içine bakmak da diyebiliriz) ve hooking(ing.de kanca olarak biliyor olabilirsiniz ama hooking'ten kasıt uygulamanın davranışını değiştirmektir). Güvenlik açısından bakıldığında Frida, bir araştırma aracıdır. Ayrıca, daha EasyHook gibi farklı bir çerçevede uygulanabilecek saldırı hooklarını prototiplemek için kullanılabilir.

https://easyhook.github.io/

Kaynaklar:
+ Frida (@fridadotre) - https://twitter.com/fridadotre
+ Frida (Sam Rubenstein) ile kaputun altına bakmak - [ame]https://www.youtube.com/watch?v=RINNW4xOWL8[/ame]


Kayıt Gözetimi
Bu bölümde, rasgele Windows uygulamaları içinde kayıt defteri etkinliğini pasif olarak izlemeye bakacağız. Başlangıç ​​olarak, kayıt defteri anahtarlarını açmak için en yaygın olarak kullanılan RegOpenKeyExW'ye bir göz atacağız. Aşağıda C ++ fonksiyon prototipini görebiliriz.

Kod:
LONG WINAPI RegOpenKeyEx(
  _In_     HKEY    hKey,       // Handle to the open registry key (commonly the registry hive).
  _In_opt_ LPCTSTR lpSubKey,   // The name of the registry subkey to be opened.
  _In_     DWORD   ulOptions,  // REG_OPTION_OPEN_LINK/NULL.
  _In_     REGSAM  samDesired, // A mask that specifies the desired access rights to the key to be opened.
  _Out_    PHKEY   phkResult   // A pointer to a variable that receives a handle to the opened key.
);
Unutulmaması gereken bir nokta da çoğu API'nin bir ANSI ve bir Unicode sürümüne sahip olacağıdır. Hedefimize ulaşmak için Windows uygulamasının Unicode sürümünü kullanacağını varsaymalıyız. Şimdi Frida'yı tüm bu argümanları tanımlayıp/yazdırmak için kullanalım.

Frida-Trace-01.png


Frida bu süreci son derece kolaylaştırıyor. İzi kullanırken Frida, JS dosyalarını belirlediğiniz herhangi bir işlev için onEnter / onLeave prototipleriyle doldurduğu mevcut dizinde bir "__handlers__" klasörü oluşturur. Fonksiyon argümanlarını çıkarmak, bir dizideki argümanları yazdırmak kadar kolaydır. Yukarıdaki görüntü için JS işleyicisi aşağıda gösterilmiştir.

Kod:
/*
 * Auto-generated by Frida. Please modify to match the signature of RegOpenKeyExW.
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: http://www.frida.re/docs/javascript-api/
 */
 
{
  /**
   * Called synchronously when about to call RegOpenKeyExW.
   *
   *  @[URL="https://www.turkhackteam.org/member.php?u=592971"]this[/URL] {object} - Object allowing you to store state for use in onLeave.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {function} log - Call this function with a string to be presented to the user.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use Memory.readUtf8String(args[0]) if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter: function (log, args, state) {
    log("[+] RegOpenKeyExW");
    log("¦- hKey: " + args[0]);
    log("¦- lpSubKey: " + args[1]);
    log("¦- ulOptions: " + args[2]);
    log("¦- samDesired: " + args[3]);
    log("¦- PHKEY: " + args[4] + "\n");
  },
 
  /**
   * Called synchronously when about to return from RegOpenKeyExW.
   *
   * See onEnter for details.
   *
   *  @[URL="https://www.turkhackteam.org/member.php?u=592971"]this[/URL] {object} - Object allowing you to access state stored in onEnter.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {function} log - Call this function with a string to be presented to the user.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {NativePointer} retval - Return value represented as a NativePointer object.
   *  @[URL="https://www.turkhackteam.org/member.php?u=531255"]para[/URL]m {object} state - Object allowing you to keep state across function calls.
   */
  onLeave: function (log, retval, state) {
  }
}
Gördüğümüz gibi, tüm bu fonksiyon argümanlarını çıkarabiliyoruz, ancak kayıt defteri etkinliğine hızlı bir şekilde bakmak için en açıklayıcı argüman muhtemelen lpSubKey'dir. Elbette string pointer(işaretçi) pek kullanışlı değildir, ancak aşağıda gösterildiği gibi unicode stringi çıkarmak için onEnter fonksiyonumuzu kolayca yeniden yazabiliriz.

Kod:
onEnter: function (log, args, state) {
    log(Memory.readUtf16String(args[1]));
}
Değişikliklerimizi kaydeder ve uygulamada bazı yeni etkinlikler gerçekleştirirsek, uygulama tarafından erişilen tam alt anahtar(subkey) kayıt defteri yollarını görürüz.

Frida-Trace-02.png


Sonuca daha yakından bakarsanız bir şeyin eksik olduğunu göreceksiniz. Aslında kayıt defterini alamıyoruz, bunun nedeni sorgulanan şey için önceden açılmış şeyin kullanılmasıdır.

Ayrıcalık artırma ve kalıcılık için COM Hijacking ile bazı saçma şeyleri takip ediyorsanız, aramanın sonucunun bir başarısızlık olduğu "CLSID " içeren yollara kayıt defteri erişimini listelemek için bir kullanım durumu olabileceğini anlayabilirsiniz çünkü alt anahtar HKEY_CURRENT_USER'da sorgulanmaktadır. Bunları yakalamak için POC'umuzu aşağıdaki gibi hızlı bir şekilde değiştirebiliriz.

Kod:
 onEnter: function (log, args, state) {
    this.SubKey = Memory.readUtf16String(args[1]); //  @[URL="https://www.turkhackteam.org/member.php?u=592971"]this[/URL] is available in onLeave
    if (this.SubKey) {                             // Make sure the value is not null
        if (this.SubKey.indexOf("CLSID") >= 0) {
            this.ContainsCLSID = 1;                // Bool -> contains substring
        }
    }
},
 
onLeave: function (log, retval, state) {
    if (this.ContainsCLSID) {                      // Check Bool
        if (retval != 0){                          // If return value is not ERROR_SUCCESS
            log(this.SubKey);                      // Print subkey
        }
    }
}
POC'mizi kaydetmek, yalnızca sonucun ERROR_SUCCESS olmadığı CLSID alt anahtarlarını açmaya çalışır.

Frida-Trace-03.png


Benzer şekilde, hangi sorguların başarılı olduğunu da takip edebildik. Bir alt anahtar handle'ını başarıyla açtıktan sonra hangi anahtar değerlerine erişildiğini bilmek istersek ne olur? İşlemimizi bu iki fonksiyonda kullanırsak başarılı bir RegOpenKeyEx çağrısı tarafından döndürülen handle'ı sakladığımız, saf mantığı uygulayabiliriz ve RegQueryValueEx'i çağırırken girdi handle'ını kaydettiğimizle karşılaştırırız, eğer eşleşirlerse sorgulanan değeri yazdırabiliriz. Bunu yapmak için gereken kodu aşağıda görebiliriz.

Kod:
// The contents of the RegOpenKeyExW.js
//---------------------------------------------------------
 
onEnter: function (log, args, state) {
    this.SubKey = Memory.readUtf16String(args[1]); //  @[URL="https://www.turkhackteam.org/member.php?u=592971"]this[/URL] is available in onLeave
    if (this.SubKey) {                             // Make sure the value is not null
        if (this.SubKey.indexOf("CLSID") >= 0) {
            this.ContainsCLSID = 1;                // Bool -> contains substring
            this.hSubKey = args[4];
        }
    }
},
 
onLeave: function (log, retval, state) {
    if (this.ContainsCLSID) {                      // Check Bool
        if (retval == 0){                          // If return value is ERROR_SUCCESS
            state.HandleKey = new Array(Memory.readInt(this.hSubKey), this.SubKey);
        }                                          //  @[URL="https://www.turkhackteam.org/member.php?u=56213"]state[/URL] persists across API calls
                                                   // We create an array with the handle & path
    }
}
 
// The contents of the RegQueryValueExW.js
//---------------------------------------------------------
onEnter: function (log, args, state) {
    if (state.HandleKey) {                         // Check our array exists
        if (state.HandleKey[0] == args[0]) {       // Compare stored handle with the new handle
            if (Memory.readUtf16String(args[1])) { // Make sure the value is not null
                log("[+] hKey: " + state.HandleKey[0] + "; Path: " + state.HandleKey[1]);
                log("¦- KeyValue: " + Memory.readUtf16String(args[1]) + "\n");
                state.HandleKey = null;            // We null here to clear the array
            }
        }
    }
},
 
onLeave: function (log, retval, state) {
}
POC'umuzu yenilemek artık yalnızca filtrelediğimiz entryleri(girişleri) döndürüyor.

Frida-Trace-04.png


Bu basit bir örnektir, ancak Frida ile oldukça maliyetli bir Derleme -> Test -> Derleme döngüsü kullanmadan aynı işlevleri kolayca yerine getirmenize ve onlarla oynamanıza izin verdiğini görebilirsiniz.

Hooking Mesaj Kutusu
Şimdiye kadar nasıl pasif keşif yapabileceğimizi gördük, bu bölümde bir uygulamanın davranışını nasıl etkileyebileceğimizi göreceğiz. Basit bir örnek olarak, Windows API'nin "Merhaba Dünyası" MessageBox(mesaj kutusunu) kullanmayı seçtim. Dinamik olarak test etmemize izin vermek için C# 'da küçük bir şey ayarladım, nasıl çalıştığını aşağıda görebilirsiniz.

Kod:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace msgbox
{
    public partial class Form1 : Form
    {
        // Unmanaged MessageBoxA import
        [DllImport("user32.dll")]
        public static extern int MessageBox(
            IntPtr hWnd,
            String lpText,
            String lpCaption,
            UInt32 uType);
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private **** button1_Click(object sender, EventArgs e)
        {
            // Grab our textbox inputs
            String lpText = textBox1.Text;
            String lpCaption = textBox2.Text;
            UInt32 uType = Convert.ToUInt32(textBox3.Text);
 
            MessageBox(IntPtr.Zero, lpText,lpCaption,uType);
        }
    }
}
Önceki bölümde gördüğümüz aynı teknikleri kullanmak, uygulamayı hızlı bir şekilde bağlayabilir ve MessageBox parametrelerini atmak için bazı temel JS leri yazabilir. MessageBoxA ile eşleştirmek için readAnsiString'in kullanımına dikkat edin.

Kod:
onEnter: function (log, args, state) {
    log("[+] MessageBoxA");
    log("¦- hWnd: " + args[0]);
    log("¦- lpText: " + Memory.readAnsiString(args[1]));
    log("¦- lpCaption: " + Memory.readAnsiString(args[2]));
    log("¦- uType: " + args[3] + "\n");
},
 
onLeave: function (log, retval, state) {
}
Frida-Trace-05.png


Frida'nın belleği düzenleyip ayarlamak için bir dizi işlevi vardır, siz değerli okuyucuların API belgelerine bir göz atmasını öneririm. Basit gösterimiz için JS'yi iki tür hooking uygulayacak şekilde değiştirdim: (1) lpText "Bob" ise onu "Alice" olarak değiştir ve (2) uType 6 ise 0 olarak değiştir.

Kod:
onEnter: function (log, args, state) {
    log("");
    log("[+] MessageBoxA");
    log("¦- hWnd: " + args[0]);
    log("¦- lpText: " + Memory.readAnsiString(args[1]));
    log("¦- lpCaption: " + Memory.readAnsiString(args[2]));
    log("¦- uType: " + args[3] + "\n");
     
    // uType hook
    if (args[3] == 6) {
        log("[!] Hooking uType: 6 -> 0");
        args[3] = ptr(0); // Overwrite uType with NativePointer(0)
    }
     
    // lpText hook
    if (Memory.readAnsiString(args[1]) == "Bob") {
        log("[!] Hooking lpText: Bob -> Alice");
        this.lpText = Memory.allocAnsiString("Alice"); // Allocate new heap ANSI string
        args[1] = this.lpText; // Replace lpText pointer
    }
},
 
onLeave: function (log, retval, state) {
}
Sonuçları aşağıdaki resimden görebilirsiniz. Parametrelerin ayrı ayrı kontrol edildiğine dikkat edin, böylece hooklarımızın her ikisinin / hiçbirinin / birinin etkin olduğu bir koşulunuz olabilir.

Frida-Trace-06.png


Userland Process Hiding -> SystemProcessInformation

Bu yazının son kısmı için kısaca daha karmaşık bir hooking örneği göstermek istiyorum. Windows üzerinde belgelenmemiş API'lerle çalıştıysanız, büyük olasılıkla NtQuerySystemInformation ve bazı bilgi sınıflarını kullanmışsınızdır. Bu sınıflardan biri SystemProcessInformation sınıfıdır (0x5). Görünüşe göre SystemProcessInformation, kullanıcı alanındaki süreçler için yetkili bir kaynaktır ve bu nedenle hangi API'ler aracılığıyla işlem listelerini alan tüm uygulamalar, farkında olsalar da olmasalar da NtQuerySystemInformation'a (Görev Yöneticisi/İşlem Gezgini/İşlem Korsanlığı(process hacker)) filtreleme uygular.)

Geçenlerde Get-SystemProcessInformation adlı bu işlev için bir PowerShell wrapper yazdım, bu yüzden bu işlevi Frida ile birlikte kullanıp kullanıcı alanını gizlemeyi göstermenin iyi bir fikir olduğunu düşündüm.

SystemProcessInformation Bellek Düzeni
SystemProcessInformation sınıfı kullanıldığında NtQuerySystemInformation'ın gerçekte ne döndürdüğünü bilmemiz gerekir. Umarım aşağıda verilenler biraz netlik sağlamaya yardımcı olur.

Kod:
NTSTATUS WINAPI NtQuerySystemInformation(
  _In_      UINT   SystemInformationClass,  // SYSTEM_INFORMATION_CLASS
  _Inout_   P****  SystemInformation,       // A pointer to a buffer that receives the requested information
  _In_      ULONG  SystemInformationLength, // Byte count allocated for the request
  _Out_opt_ PULONG ReturnLength             // Pointer to the variable to receives the output size
);

SystemInformationClass => SystemProcessInformation = 0x5
SystemInformation => Pointer, eg 0x11223344556 -----------------------|
                                                                      |
                                                                      |
                                                                      |
                                           [Points at an array of SYSTEM_PROCESS_INFORMATION Structs]
                                                                      |
                                                                      |
                    |-------------------------------------------------|
                    |
 |--------------------------------------|
 | [Int]NextEntryOffset (eg:0x1fb)      |  -------------------->
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |      [2nd Entry = 1st Entry + 0x1fb]
 |   |-> svchost.exe                    |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
 | [Int]NextEntryOffset (eg:0x222)      |  <------------------->
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |      [3rd Entry = 2nd Entry + 0x222]
 |   |-> powershell.exe                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
 | [Int]NextEntryOffset (eg:0x3a0)      |  <------------------->
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |      [4th Entry = 3rd Entry + 0x3a0]
 |   |-> notepad.exe                    |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
                                           .....  <------------>
Bu gösterim tam olarak doğru değildir çünkü dizinin başlangıcında bazı sabit süreçler var. Temel nokta, SYSTEM_PROCESS_INFORMATION yapısına kaç SYSTEM_THREAD_INFORMATION yapısının eklendiğine bağlı olarak her blobun boyutunun değişmesidir.

SystemProcessInformation Hooking
Diyelim ki bu listedeki tüm PowerShell işlemlerini gizlemek istiyoruz, tek yapmamız gereken listeyi geçmek ve PowerShell'den önce girişi yeniden yazmak, böylece NextEntryOffset listedeki bir sonraki girişi işaret eder.

Kod:
|--------------------------------------|
 | [Int]NextEntryOffset (eg:0x1fb 0x41d)|  -------------------->
 |                               I      |                      |
 |                               I      |                      |
 |                               I      |                      |
 |              .......          I==================================> [3nd Entry = 1st Entry + 0x1fb + 0x222
 |                                      |                      |       => 1st Entry + 0x41d]
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |
 |   |-> svchost.exe                    |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
 | [Int]NextEntryOffset (eg:0x222)      |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |
 |   |-> powershell.exe                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
 | [Int]NextEntryOffset (eg:0x3a0)      |  <------------------->
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 | [UNICODE_STRING]ImageName            |                      |      [4th Entry = 3rd Entry + 0x3a0]
 |   |-> notepad.exe                    |                      |
 |                                      |                      |
 |                                      |                      |
 |                                      |                      |
 |              .......                 |                      |
 |                                      |                      |
 |                                      |                      |
 | SYSTEM_THREAD_INFORMATION structs    |                      |
 |--------------------------------------|                      |
                                           .....  <------------>
Bu biraz karmaşık görünebilir, ancak tek yapmamız gereken API çağrısını geri dönmek üzereyken durdurmak, ofsetleri/unicode dizeleri okuyarak liste üzerinde döngü yapmak ve tanımlanan her PowerShell işlemi için tek bir tamsayının üzerine yazmaktır. Frida uygulamamı aşağıda görebilirsiniz. Lütfen bu uzaklıkların yalnızca x64 Win10'da test edildiğini unutmayın (Win7-10 x64 için de geçerli olmalı).

Kod:
onEnter: function (log, args, state) {
    if (args[0] == 5) {
        log("NtQuerySystemInformation:");
        log("  --> Class : " + args[0] + " [SystemProcessInformation]");
        log("  --> Addr  : " + args[1]);
        log("  --> len   : " + args[2]);
        log("  --> Retlen: " + Memory.readInt(args[3]) + "\n");
         
        this.IsProcInfo = 1;
        this.Address = args[1];
    }
},
 
onLeave: function (log, retval, state) {
    if (this.IsProcInfo) {
        while (true) {
            // Get struct offsets
            var ImageOffset = ptr(this.Address).add(64); // ImageName->UNICODE_STRING->Buffer
            var ImageName = Memory.readPointer(ImageOffset); // Cast as ptr
            var ProcID = ptr(this.Address).add(80); // PID
             
            // If PowerShell, rewrite the linked list
            if (Memory.readUtf16String(ImageName) == "powershell.exe") {
                log("[!] Hooking to hide PowerShell..");
                log("  --> Rewriting linked list\n");
                this.PreviousStruct = ptr(this.Address).sub(NextEntryOffset);
                Memory.writeInt(this.PreviousStruct, (Memory.readInt(this.PreviousStruct)+Memory.readInt(this.Address)))
            }
     
            // Move pointer to next struct
            var NextEntryOffset = Memory.readInt(this.Address);
            this.Address = ptr(this.Address).add(NextEntryOffset);
            if (NextEntryOffset == 0) { // The last struct has a NextEntryOffset of 0
                break
            }
        }
         
        // Null
        this.IsProcInfo = 0;
    }
}
YouTube'a SystemProcessInformation hooking'i gösteren kısa bir video yükledim. Bu arada teoride kodla ilgili düzeltmediğim bir edge-case (uç durum) sorunu var (tabi asla tetiklemedim), bana ne olduğunu söyleyebilecek olan varsa minnettar kalırım.

[ame]https://www.youtube.com/watch?v=hYbQjiZsrmw[/ame]

Source: https://www.fuzzysecurity.com/tutorials/29.html
Translator @Gauloran
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.