Günümüzde, başta büyük şirketler olmak üzere birçok şirket hem online hem de offline sandbox çözümleri kullanmaktadır. Sandbox teknolojisi bir siber savunma merkezinin bel kemiğidir diyebiliriz. Çünkü sürekli olarak şirketinize zararlı dosyalar geliyor! “Gerçekten” yetişmiş birden fazla zararlı yazılım analisti bulmak zor ve bu işi yapacak doğru kişileri bulsanız bile bunu defalarca yapmaları gerekmektedir. Uzun lafı kısası bir sandbox çözümüne ihtiyacınız var ve hali hazırda bir sandbox teknolojisi kullanıyorsanız iyi şeyler yapıyorsunuz demektir.

Sandbox teknolojisinin günümüzdeki durumunda, özellikle hypervisor seviyesinde analiz yapabilenler sandboxlar öne çıkmaktadır. Bu tür sandboxların bypass edilmesi görece olarak daha zor kabul edilmektedir. Bu tür sandboxlar standart haline gelmiş anti-sanbox tekniklerini anlayabilmektedir ve karşı aksiyon alabilmektedir. Eğer bir sandbox teknolojisi kullanıyorsanız ve bu sandbox teknolojisi hypervisor seviyesinde analiz yapabiliyorsa iyi şeyleri doğru şekilde yapıyorsunuz demektir.

Hypervisor seviyesinde analiz yapan sandboxlar gibi ileri düzey analizler ve tespitler yapabilen sanboxları bypass etmek için tercih edeceğiniz yol kullanıcı etkileşimi gerektiren zararlı yazılımlar geliştirmektir. Örneğin, Pickl3 projesini zararlı yazılımınıza entegre edebilirsiniz. Entegrasyonu tamamladığınızda, Pickl3 hedef kullanıcıdan doğru Windows hesap bilgisini girmesini bekleyecektir. Eğer hedef kullanıcı doğru hesap bilgisini girerse zararlı yazılımınızı çalıştıracaksınız ve “KA-BOOM!” sandbox’ı çok yüksek ihtimal ile bypass etmiş olacaksınız. Ancak ben bu yazı içerisinde daha önce birçok operasyonda uyguladığım ve başarılı olduğum bir tekniği paylaşacağım. Bu teknik bana hep Odysseus’un Truva Atı’nı hatırlatmıştır.

Yapılan Hatalar ve Sonuçları

Sandbox teknolojisi her ne kadar gelişmiş olsa bile şirketler, sandbox içerisindeki çalışan işletim sistemini sıkılaştırmamaktadır. Red Team Operasyonlarını gerçekleştirenler veya saldırganlar, öncelikli olarak son kullanıcıları hedef alır. Şimdi sizinle beraber ortalama bir şirketin son kullanıcısının sistem özellikleri üzerinden neler yapabiliriz ona değinelim. Aşağıda bazı hatalardan ve neler yapabileceğimizden bahsettim.

Hata-1: Neredeyse her sandbox analiz yaparken zararlı yazılımı Administrator haklarında çalıştırır. Zararlı yazılımınızı şu sorunun cevabına göre çalışacak şekilde geliştirebilirsiniz; Administrator haklarına sahip misin?

Eğer Administrator haklarına sahip değil ise çalışmasını sağlayabilir ve sandbox’ı bypass edebilirsiniz. Bunun için GetTokenInformation ve AllocateAndInitializeSid API’ları bize gereken bilgiyi verecektir. Örnek C++ kodunu aşağıda verdim.

bool isAdministrator() {
	HANDLE access_token;
	DWORD buffer_size = 0;
	PSID admin_SID;
	TOKEN_GROUPS* group_token = NULL;
	SID_IDENTIFIER_AUTHORITY NT_authority = SECURITY_NT_AUTHORITY;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &access_token))
		return false;

	GetTokenInformation(
		access_token,
		TokenGroups,
		group_token,
		0,
		&buffer_size
	);

	std::vector<char> buffer(buffer_size);

	group_token =
		reinterpret_cast<TOKEN_GROUPS*>(&buffer[0]);

	bool succeeded = GetTokenInformation(
		access_token,
		TokenGroups,
		group_token,
		buffer_size,
		&buffer_size
	);

	CloseHandle(access_token);
	if (!succeeded)
		return false;

	if (!AllocateAndInitializeSid(
		&NT_authority,
		2,
		SECURITY_BUILTIN_DOMAIN_RID,
		DOMAIN_ALIAS_RID_ADMINS,
		0, 0, 0, 0, 0, 0,
		&admin_SID
	))
	{
		return false;
	}

	bool found = false;
	for (size_t i = 0; !found && i < group_token->GroupCount; i++)
		found = EqualSid(admin_SID, group_token->Groups[i].Sid);
	FreeSid(admin_SID);
	return found;
}

Yukarıdaki kodu daha ileri seviyeye taşımak isterseniz zararlı processinizin Integrity Level’ına da bakabilirsiniz. ;)

Hata-2: Birçok şirket Sandbox’ın analiz ortamı için Active Directory (Etki Alanı) kurmamaktadır. Ortalama her şirket etki alanına sahiptir ve son kullancılar bu etki alanına dahildir. Yani geliştirdiğiniz zararlı yazılım etki alanı entegrasyonu olan bir sisteme çalışacak demektir. Zararlı yazılımınızı şu sorunun cevabına göre çalışacak şekilde geliştirebilirsiniz; Çalıştığın ortam etki alanına entegre mi? Eğer sistem etki alanına entegre ise çalışmasını sağlayabilir ve sandbox’ı bypass edebilirsiniz. Bunun için DsRoleGetPrimaryDomainInformation API’ını kullanabilirsiniz. Bu API dahil olunmuş olan etki alanı hakkında bilgiler döndürür. Örnek C++ kodunu aşağıda verdim.

bool isMemberOfAD() {
   bool memberOfAD = FALSE;

   DSROLE_PRIMARY_DOMAIN_INFO_BASIC* dsRoleInfo;
   DWORD dwCode;

   dwCode = DsRoleGetPrimaryDomainInformation(NULL, DsRolePrimaryDomainInfoBasic, (PBYTE*)&dsRoleInfo);
  
   if (dwCode != ERROR_SUCCESS) {
       memberOfAD = FALSE;
   }

   if ((dsRoleInfo->DomainForestName != NULL) && (dsRoleInfo->DomainNameDns != NULL)) {
       memberOfAD = TRUE;
   }

   return memberOfAD;
}

Hata-3: Bir önceki adımı anlattığım tekniği daha ileri seviyeye taşıyabiliriz. Bir önceki adımda hedef sistemin etki alanı (Active Directroy) entegrasyonu hakkında işlem gerçekleştirdik. Direkt olarak belirli bir etki alanına entegrasyonu için de kontrol yapabiliriz. Örneğin, hedef şirketimiz DZ Corp Inc. ve iç ağlarında dzcorp.local ismine sahip bir etki alanı kullanıyorlar. Bir önceki adımda zararlımızın etki alanına dahil bir sistemde çalışmasını sağladık şimdi sadece dzcorp.local ismine sahip etki alanında çalışmasını sağlayacağız. Bunun için hedef sistemin etki alanı için ayarlanmış DNS adını bulmamız gerekiyor. Bunun için izlenebilir iki tane adım bulunmaktadır.

  • İfşa olan SSL sertifikaları bulmak
  • İnternetten erişilebilen ve NTLM Autentication’a izin veren bir dizin bulmak
    • Skype for Business (eski adıyla Microsoft Lync veya Microsoft Office Communicator) sunucusunu bulmak

İfşa Olan SSL Sertifikaları

İnternet üzerinde sertifikaları tarayıp kayıt altına alan birçok sistem bulunuyor. Şirketler internete açık sistemlerinde bazen iç ağdaki sertifikalarını kullanarak internete açabiliyor. İç ağda kullanmak üzere oluşturulan sertifikanın alan adı genelde iç etki alanının DNS adı olabilmektedir. Bu gibi durumlarda iç tarafta kullanılan etki alanının DNS adını bulabilirsiniz.

NTLM Authentication’a İzin Veren Dizinler

Şirketler çeşitli teknolojiler kullanır ve bunlardan bazıları NTLM Authentication özelliğine sahiptir. Bunlardan bazıları aşağıda verilmiştir.

  • OWA Servers
  • Skype for Business (eski adıyla Microsoft Lync veya Microsoft Office Communicator)
  • Autodiscover Servers (autodiscover.domain.com ve lyncdiscover.domain.com)
  • ADFS Servers

Örneğin, hedef şirket Skype for Business kullanıyorsa ve bu sunucu internete açık ise bunu Subdomain Bruteforce ile bulabilirsiniz. Örneğin Skype for Business için Subdomain’i bir kez bulunca aşağıdaki dizinlerden birine istek yaparak NTLM Authentication bulunan bir dizini bulmamız gerekmektedir. Aşağıdaki muhtemel dizinleri verdim.

/abs/
/adfs/services/trust/2005/windowstransport
/aspnet_client/
/autodiscover/
/autoupdate/
/certenroll/
/certprov/
/certsrv/
/conf/
/deviceupdatefiles_ext/
/deviceupdatefiles_int/
/dialin/
/ecp/
/etc/
/ews/
/exchange/
/exchweb/
/hybridconfig/
/groupexpansion/
/mcx/
/mcx/mcxservice.svc
/meet/
/meeting/
/microsoft-server-activesync/
/oab/
/ocsp/
/owa/
/persistentchat/
/phoneconferencing/
/powershell/
/public/
/reach/sip.svc
/requesthandler/
/requesthandlerext/
/rgs/
/rgsclients/
/rpc/
/rpcwithcert/
/scheduler/
/ucwa/
/unifiedmessaging/
/webticket/
/webticket/webticketservice.svc

NTLM Authentication gerektiren bir dizin bulduktan sonra geriye sadece iç ağda kullanılan etki alanına ait DNS adını bulmak kalmaktadır. Skype for Business için yukarıda verdiğim dizinlerden birine istek yaptığınızda eğer NTLM Authentication aktif ise HTTP(S) proxy kullanarak trafiğini izleyin. Herhangi bir hesap bilgisi ile giriş yapmayı deneyin. Sunucu size HTTP 401 (Unauthorized) durum kodu ve WWW-Authenticate header bilgisinde TlRMTVNTUAACAAAA... ile başlayan bir değer ile cevap verecektir. İşte bu WWW-Authenticate başlık bilgisi içerisinde hedef şirketin kullandığı etki alanı DNS adı geçmektedir. Bu binary veriyi okuduğunuz aşağıdaki gibi bir değer elde edeceksiniz.

Msg Type: 2 (Challenge)
Target Name: u'HLLDZ' [123456233fsdfe0112900aaaa00] (05b @11)
Challenge: 0xaaaaaaaaaaaaaaaa
Context: '' [] (0b @0)
Target: [block] (111b @11)
    AD domain name (2): HLLDZ
    Server name (1): SRV0001
    DNS domain name (4): hlldz.dzcorp.local
    FQDN (3): srv0001.hlldz.dzcorp.local
    Parent DNS domain (5): dzcorp.local

Artık hedef şirketin etki alanı DNS ismi hakkında gerekli bilgiye sahipsiniz. Zararlı yazılımınızı şu soruların cevabına göre çalışacak şekilde geliştirebilirsiniz; Çalıştığın ortam etki alanına entegre mi? Eğer öyle ise, bu etki alanı dzcorp.local isimine mi sahip?

Bunun için aşağıdaki kodda bulunan dsRoleInfo->DomainForestName ya da dsRoleInfo->DomainNameDns ile hedef şirketin etki alanı DNS adını karşılaştırabilirsiniz.

bool isMemberOfTargetAD() {
   bool isMemberOfTargetAD = FALSE;

   DSROLE_PRIMARY_DOMAIN_INFO_BASIC* dsRoleInfo;
   DWORD dwCode;

   dwCode = DsRoleGetPrimaryDomainInformation(NULL, DsRolePrimaryDomainInfoBasic, (PBYTE*)&dsRoleInfo);
  
   if (dwCode != ERROR_SUCCESS) {
       isMemberOfTargetAD = FALSE;
   }

   if ((dsRoleInfo->DomainForestName != NULL) && (dsRoleInfo->DomainNameDns != NULL)) {
        // Compare dsRoleInfo->DomainForestName or dsRoleInfo->DomainNameDns with target information
        // Then return TRUE or FALSE
        isMemberOfTargetAD = TRUE;
   }

   return isMemberOfTargetAD;
}

Happy hunting!

Referanslar