Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > default
únor 17
Můj první MVA kurz

Můj první MVA (Microsoft Virtual Academy) kurz byl vydán právě před několika hodinami.​ Jedná se o Bezpečnost Windows pro pokročilé. Děkuji tímto Tomáši Kantůrkovi z Microsoftu, protože připravit to do provozu musela být pěkná dřina.

Další budou doufám v brzu následovat!

http://www.microsoftvirtualacademy.com/training-courses/bezpecnost-windows-pro-pokrocile-identity

únor 17
Moje slajdy z konference ShowIT 2015

Tak tohle byla naprosto luxusní konference! Parádní prostředí, katering, projekce!

Všechny moje slajdy jsou tady: https://www.sevecek.com/presentations/showit2015

únor 04
ISEčko jde skriptovat - automatické podepsání všech rozdělaných skriptů přímo z vývojového prostředí

Digitální podepisování PowerShell skriptů mě v poslední době docela otravuje, protože to zbytečně zdržuje. Kdykoliv uděláte nějakou změnu ve skriptu, musíte to nechat znovu podepsat. A PowerShell ISE má značný nedostatek v tom, že si nevšimne, když se soubory změní mimo prostředí. Takže je znovu nenahraje. Potřeboval jsem tedy primárně metodu, jak nechat pozavírat všechny soubory a znovu je otevřít. A vyklubalo se z toho toto:

Udělal jsem si tedy skript, který digitálně podepíše otevřené soubory (sign) rovnou z ISE. Řeší to několik problémů:

  • musíte nejprve neuložené soubory uložit. Nechcete ukládat už uložené, protože by to zbytečně změnilo jejich časová razítka
  • potom je musíte zavřít
  • abych zbytečně nezavíral všechny soubory, zavírám jenom ty, jejichž digitální signatura (digital signature) není platná. A pouze .PS1 přípony, ono ISE má i pěkné obarvování XML, které rád používám
  • podepsat ty soubory, co jste zavřeli
  • otevřít je znovu do ISE
  • a nastavit zpátky kurzor na pozici, kde byl před tím, než jsem je zavíral - jinak budete na začátku, což je dost otravné

Tady to je. Používám $psISE proměnnou. Funkci jsem si dal do PowerShell ISE profilu ($profile.AllUsersCurrentHost) a jede to jak po másle:

function global:Sign-ISE ([string] $signingCertSubjectMail = 'ondrej@sevecek.com')
{
  [System.Security.Cryptography.X509Certificates.X509Certificate2] $signingCert = $null
  $signingCert = dir Cert:\CurrentUser\My -CodeSigningCert | ? { $_.Subject -like "*E=$signingCertSubjectMail*" | Sort NotAfter | Select -Last 1 }
  
  if ($signingCert -ne $null) {

    $openFiles = $psISE.CurrentPowerShellTab | % { $_.Files }

    foreach ($oneOpenFile in $openFiles) {
 
      $oneFilePath = $oneOpenFile.FullPath
      $oneFileLine = $oneOpenFile.Editor.CaretLine
      $oneFileColumn = $oneOpenFile.Editor.CaretColumn
 
      if (-not $oneOpenFile.IsSaved) {

        [void] $oneOpenFile.Save()
      }


      if (([System.IO.Path]::GetExtension($oneFilePath) -eq '.ps1') -and ((Get-AuthenticodeSignature $oneFilePath).Status -ne 'Valid')) {

        [void] $psISE.CurrentPowerShellTab.Files.Remove($oneOpenFile)
        [void] (Set-AuthenticodeSignature $oneFilePath -Certificate $signingCert)
        $reloadedFile = $psISE.CurrentPowerShellTab.Files.Add($oneFilePath)
        $reloadedFile.Editor.SetCaretPosition($oneFileLine, $oneFileColumn)
      }
    }

  } else {

    throw 'Error: no signing certificate found'
  }
}

Dá se dokonce přidat do menu Add-ons volba na tuto funkci. A to všechno i s asociací klávesové zkratky. Takto:

$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("Sign all", { Sign-ISE }, 'Ctrl+Alt+S') 

 

únor 03
Nezadržitelně se blíží konference ShowIT

Od příštího úterý se koná v Bratislavě velkolepá konference ShowIT 2015! Ještě zbývá pár posledních míst, tak se honem přihlašte!

Moje přednášky:

  • Útoky, které žádný antivirus neodhalí, aneb na co je infrastrukturní bezpečnost
  • Principy Windows ověření a SSO
  • Nová dimenze bezpečnosti - přihlašování čipovými kartami
  • Bezpečné publikování webových služeb s pomocí Web Application Proxy (WAP)
  • Nasazení RODC do DMZ
  • Bezpečnostní aspekty platformy SharePoint 2013
  • TLS/SSL protokoly ve Windows
  • Kerberos delegace neboli double-hop
  • PowerShell pro pokročilé

Letos s velkou účastí spíkrů z Microsoftu. Konečně opět ve čtyřhvězdičkovém hotelu, takže se můžete těšit na skutečný katering a vyhřáté prostředí. Samozřejmě ve středu bohatá večerní akce.

leden 30
Bez komentáře - jen moje poznámky k řešení potíží s Claims to Windows token service (c2wts)

Tohle ani nečtěte. Jen jsem si chtěl někam poznačit věci, které jsem používal k řešení potíží s claims to windows token service (c2wts, c2wtshost), neboli Windows Identity Foundation(WIF). Nebudu to vysvětlovat, takže jenom pro moji vlastní referenci.

# Kerberos S4U login with UPN only
# Common problems - the caller must be member of "Windows Authorization Access Group"
# or at least have Read permission to tokenGroupsGlobalAndUniversal AD LDAP attribute of the subject account
# If the caller is not member of local Administrators or does not have SeTcbPrivilege, the resulting access token will only be at the Identification level
$s4u = New-Object System.Security.Principal.WindowsIdentity 'sp-admin@gopas.virtual'

# Using identity foundation and the c2wts service
# Common problems - the caller must be listed among the allowedCallers in the c2wtshost.exe.config file or you get the "wts0003: the caller is not authorized to use the service" error.
# Later permission issues manifest themselves with "Token cannot be zero" exception
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.IdentityModel')
[System.Security.Principal.WindowsIdentity] $winId = [Microsoft.IdentityModel.WindowsTokenService.S4UClient]::UpnLogon("sp-admin@gopas.virtual")

# Get the c2wts named pipe and the net.pipe URL
# The pipe name will be a random {guidguid-guid-guid-guid-guidguidguid}
# it seams like it is always with 8 instances. But the simplest way
# to determine which one it is, is to get the list before and after the c2wts
# service is running and compare
[System.IO.Directory]::GetFiles('\\.\pipe')
pipelist | ? { $_ -like '*-*-*-*-*' }

$pipeName = (t:\sysinternals\handle.exe 'net.pipe:' | ? { $_ -like 'c2wtshost.exe*' } | % { $_.Split('\') } | select -l 1 | % { $_.Split(':') } 

| select -l 1).SubString(1)
$bytes = [convert]::FromBase64String($pipeName)

# The result was
# net.pipe://+/S4U/022694F3-9FBD-422B-B4B2-312E25DAE2A2/
# which is a normalized version of the following: net.pipe://localhost/S4U/022694F3-9FBD-422B-B4B2-312E25DAE2A2/
[System.Text.ASCIIEncoding]::ASCII.GetString($bytes)


# The SharePoint Secure Store error when trying generate key through the central admin
# solution was to make the Secure Store service account be member of local Administrators
# but this is not what would satisfy me :-)
Exception calling "UpnLogon" with "1" argument(s): "Token cannot be zero."
SPSecurityContext Could not retrieve valid windows identity username Token cannot be zero
.Exception.HResult = -2146233087 = COR_E_SYSTEM
.Exception.InnerException.HResult = -2147024809 = COR_E_ARGUMENT

 

leden 29
Asynchronní spouštění PowerShell skriptu

Začal jsem pokusovat s asynchronním vykonáváním skriptů (příprava na Forms a GUI obecně). Není úplně dobré na to používat Start-Job, protože ten normálně spustí znovu celý PowerShell proces, což je trošku velký kalibr. Tak jsem prozatím zjistil tohle. Což je mimochodem taky cesta, jak vůbec volat PowerShell skripty z C#.

Běží to opravdu krásně asynchronně. Ještě k tomu přidám nějakou další diagnostiku a jdu do toho. Hlavně vymyslet, jak si předávat objekty za jízdy z jednoho vlákna do druhého. Což o to, vymyslet by to tak těžké nebylo, jako že to budu muset vyzkoušet. Miláček PowerShell není úplně vždy moc milý k programátorům :-)

[System.Management.Automation.PowerShell] $powershell = [powershell]::Create()

$script = @'
  param([int] $delay = 4)

  $testFile = "$env:TEMP\test.txt"
  '----' | Out-File $testFile  -Append
  (Get-Date).ToString('s') | Out-File $testFile -Append
  Start-Sleep $delay
  (Get-Date).ToString('s') | Out-File $testFile -Append
  
  return 58, (Get-Process lsass), 'text'
'@

$powershell.AddScript($script)
$powershell.AddParameter('delay', 6)
$async = $powershell.BeginInvoke()

Write-Host ('Async: {0}' -f ($async | fl * | Out-String)) -ForegroundColor Green

try {

  # Note: break manually with Ctrl-C
  #       it will go through finally{} well
  while ($true) {

    $now = [DateTime]::Now
    Write-Host ('Main: {0:s}:{1:D3} | thread completed = {2}' -f $now, $now.Millisecond, $async.IsCompleted)
    
    Start-Sleep -Milliseconds 300
  }

}

finally {

  Write-Host ('Pre-finished: {0:s}' -f (Get-Date)) -ForegroundColor Green

  # Note: this will wait until the task has really finished
  $results = $powershell.EndInvoke($async)
  $powershell.Dispose()

  Write-Host ('Finished: {0:s}' -f (Get-Date)) -ForegroundColor Green
  
  Write-Host ('Results: {0}' -f ($results -join ', '))
  Write-Host ('Result types: {0}' -f (($results | % { $_.GetType().Name }) -join ', '))
}


Dobrou.

leden 23
Blesk peněženka

Nudím se v nemocnici, tak jsem si koupil v trafice Blesk peněženku a zkoumám to (web mají na www.bleskpenezenka.cz). Jedná se o platební kartu, kterou si koupíte za 150,- Kč v trafice. Dostanete MasterCard, normálně s číslem a CVV vzadu, platí mi do 10/17. Zdá se že je i bezkontaktní (idioti). Potom už to jenom dobíjíte přes Sazka terminály, přes internet z jiné platební karty (který musí mít 3D Secure), nebo převodem z účtu.

Na co to je? Někdo díky tomu může mít totálně anonymní platby, jako třeba když se rozvádíte a potřebujete vypadat jako socka. To já nepotřebuju. Jde mi o to, abych nemusel všude zadávat svoji kreditku. Minule mi z ní někdo vyndal 110 000,- na letenku do Peru :-) Prostě teda něco jako paypal.

Mají webový portál, kam se přihlásíte a vidíte platby do karty a kartou.

Podstatná omezení:

  • horní limit na jedno dobití přes internet je 1500,-
  • horní limit na jedno dobití obecně je 10 000,- (takže asi přes Sazku a převodem) za den, to musím ještě vyzkoušet
  • převod z banky se přičte až za 3 dny
  • jednotlivá platba může být max 10 000,- Kč
  • zdá se, že i maximální zůstatek na kartě je jenom 10 000,- Kč
  • dá se to údajně zvýšit až na 50 000,- ale musíte telefonem nahlásit, jak se jmenujete. I když teď se zrovna dívám na webu na limity a je tam rovnou 50 000,-. Tak uvidíme.
  • placení je zadarmo, ale dobití (a to i převodem z banky) je za 25,- což znamená, že dobíjet to z karty přes internet je drahé

Zážitky:

  • v pohodě jsem zaplatil na americkém webu 50 USD při zadání čísla a CVV bez nutnosti potvrdit to SMSkou
  • klesly mi peníze pod 300,- a přišla mi zadarmo SMS o tom, že tam mám málo peněz
  • myslel jsem, že ta karta má taky sama 3D Secure, ale zaplatil jsem právě na českém webu, kde to normálně moje kreditní karta vyžaduje, ale tahle to nechtěla
  • historii obou plateb vidím okamžitě na webu, pěkné
  • do jejich webu se přihlašujete jenom heslem, ale nedá se od tam nic odeslat, takže jenom přehled plateb. pěkné.

Tak uvidíme, jak se to bude dále vyvíjet. V podstatě bych to viděl jako dobrou kartu na neznámé weby, kde se zadávají údaje do toho webu a ne do nějakého rozumného platebního portálu.

leden 20
Jak vytvořit ručně shadow copy (stínovou kopii svazku)

Když vám nejede zálohování, nebo prostě jen tak kvůli kdoví čemu :-) není špatné si vytvořit ručně shadow copy (stínovou kopii svazku) nějakého diskového oddílu. Potřebujete k tomu jenom nástroj diskshadow a případně PowerShell a příkazovou řádku, pokud nemáte diskshadow na stanicích.

Když už to píšu u sebe na bezpečnostním blogu, tak upozorňuju, že shadow copy máte nejspíš na všech stanicích, kde je ve výchozím stavu zapnuta funkce system restore, neboli system protection. Operační systém vám sám od sebe dělá shadow copy před každou instalací programů i aktualizací. Dá se to potom použít k průzkumu různě napadených počítačů, protože útočníci si obvykle neuvědomují a i když smažou nějaké staré soubory, nebo logy, možná je ještě najdete v nějaké shadow copy.

Jak vylistovat všechny kopie svazku

Můžete to udělat buď pomocí diskshadow, nebo pomocí PowerShell:

diskshadow
  list shadows all


gwmi Win32_ShadowCopy | 
  select *,
         @{ n = 'DriveLetter' ; e = { (gwmi -Query ('SELECT * FROM Win32_Volume WHERE DeviceId = "{0}"' -f $_.VolumeName.Replace('\', '\\'))).DriveLetter } }

gwmi Win32_ShadowStorage | 
  select *, 
         @{ n = 'DriveLetter' ; e = { ([wmi] $_.Volume).DriveLetter } },
         @{ n = 'DiffVolumeLetter' ; e = { ([wmi] $_.DiffVolume).DriveLetter } }

V tabulce Win32_ShadowCopy je seznam všech kopií, které jsou k dispozici na všech vašich oddílech. V tabulce Win32_ShadowStorage jsou konfigurace úložišť shadow copy rozdílových kopií pro každý oddíl, který to má vůbec nějak definováno - tedy na který disk se to ukládá (obvykle na ten stejný oddíl do složky System Volume Information) a maximální omezení na velikost, pokud nějaké existuje.

Jak si stínovou kopii svazku vytvořit

Opět ji vytvoříte buď pomocí diskshadow, nebo přes WMI a PowerShell:

diskshadow
  set context persistent
  begin backup
  add volume c:
  end backup


([wmiclass] 'Win32_ShadowCopy').Create('C:\', 'ClientAccessible')

A to hlavní, jak se k ní vůbec dostat?

Je úplně jedno, jestli je client accessible, nebo není. Jestli je to produkt shadow copies for shared folders, nebo je to výsledek system protection (system restore). Pokud znáte její device object ID (deviceObjectId), tedy něco ve formátu \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy38, tak se k jejímu obsahu dostanete.

Můžete zkusit několik cest:

diskshadow
  list shadows all
  expose {guidguid-guid-guid-guid-guidguidguid} R:\


mklink /D c:\mojekopie "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy38\"

U té druhé metody s mkdir a directory junction (parameter /J), nebo symbolic link (parametr /D), nesmíte zapomenout na konci na zpětné lomítko (backslash). Pokud to tam nedáte, sice se to namapuje, ale dostanete při přístupu chybovou hlášku "is not accessible, the parameter is incorrect".

Mazání shadow copy na závěr

Samozřejmě jdou smazat přes diskpart, nebo také přes WMI, kde použijete metodu .Delete().

leden 20
Kombilace C# vloženého uvnitř PowerShell a změna dočasného adresáře

Jenom zajímavůstka pro PowerShellisty. Do skriptu v PowerShell jde vložit (ne)přímo kus kódu v jazyce C# (csharp, c-sharp, cs). PowerShell ho potom umí spustit. Používá se to například, pokud chcete využívat PInvoke metodu na volání Win32 API, což jinak přímo z PowerShell nejde. Já to mám například ve svém keyloggeru, a zrovna se tím chystám přidat nějakou funkcionalitu do forensní analýzy.

Právě kvůli tomu volatile forensics scriptu jsem ale zkoumal, jak to dělá.

Kompilace pomocí Add-Type a temp adresáře

Kód napsaný v jazyce C# se do PowerShellu vloží pomocí herestring. Příklad následuje. Je to prostě jen jednoduchá třídička (class) s konstantou a její okamžité použití:

$cs = @'

namespace Sevecek.PowerShell { 

  public class Constants { 
     
    public const int OneValue = 5;
  }
}

'@

Add-Type -TypeDefinition $cs

[Sevecek.PowerShell.Constants]::OneValue

Jenže ten C# se musí zkompilovat. Kompiluje se pomocí cs.exe kompilátoru, který máte vždycky nainstalovaný spolu s .NET framework. PowerShell potřebuje .NET framework, takže tam ten kompilátor je úplně vždycky.

Použil jsem process monitor (procmon) k tomu, abych zjistil, kam to zapisuje. Jakmile zavoláte Add-Type, celý obsah toho herestring se vyextrahuje a uloží do soubouru v tempu - konkrétně v té cestě, která je v proměnné %tmp%, neboli pro PowerShell tedy $env:tmp. Existuje ještě jedna úplně stejná proměnná %temp%, tedy $env:temp, ale ta se v tomto okamžiku nepoužije. PowerShell to ukládá opravdu do dočasného adresáře, který je v proměnné $env:tmp. Vyzkoušeno pro všechny verze PowerShellu 2, 3 i 4.

Vytvoří to tam několik souborů, kód je v souboru .cs a příkazová řádka pro cs.exe kompilátor je v souboru .cmdline. Příkazové řádky pro C# compiller jsou zde:

# PowerShell version 2 CS/C# compiller command line
# used by Add-Type -TypeDefinition.
# The temporary files goe into the path specified by 
# the $env:TMP (%TMP%) environment variable:
#
# /t:library /utf8output /R:"System.dll" /R:"C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll" /out:"qbrwvho.dll" /D:DEBUG /debug+ /optimize- /warnaserror  "qbrwvho.0.cs"

# PowerShell version 4 CS/C# compiller command line
# used by Add-Type -TypeDefinition
# The temporary files goe into the path specified by 
# the $env:TMP (%TMP%) environment variable:
#
# /t:library /utf8output /R:"System.dll" /R:"C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll" /R:"System.Core.dll" /out:"sxbfvua.dll" /D:DEBUG /debug+ /optimize- /warnaserror  "sxbfvua.0.cs"

Změna dočasného adresáře pro kompilaci

Za normálních okolností asi nebudete chtít měnit adresář, do kterého se budou dočasné kompilační soubory ukládat. Jde to do dočasného adresáře tmp, u kterého se očekává, že prostě plní tuto funkci. V mém případě to ale není dobře, protože potřebuji kompilaci provádět do vyhrazeného adresáře ve svém forensním balíčku, abych minimalizoval zanášení změn do zkoumaného systému.

Jak tedy změníte dočasný adresář pro kompilace vloženého C# kódu? Jednoduše. Stačí nastavit jinou cestu do proměnné $evn:tmp.

$env:tmp = 'C:\MyTempCompilationTarget'

 

leden 19
Process memory dump a historie příkazů cmd a PowerShell

Dneska jsem narazil na zajímavý problém. Udělal jsem si memory dump příkazových řádek z procesů cmd a powershell pomocí programu procdump (ofiko program od Microsoftu ke stažení zde). Jak jistě pravidelně sami používáte, tyto programy si pamatují historii (command history) příkazů, které jste zadávali. Můžete se na ně vracet buď pomocí šipek nahoru a dolů, nebo si je dokonce zobrazit přes klávesu F7.

Používám procdump ve svém forensním nástroji na sběr informací z počítačů, pokud je podezření na nějaký incident. No a co když tam někdo nechal běžet příkazovou řádku, nebo právě PowerShell. Nepůjde z toho memory dumpu vyndat seznam těch použitých příkazů?

Nečekal jsem, že by to bylo nějak blízko u sebe, nebo přehledně, ale ono to v těch procesech nebylo vůbec. Přitom ještě nedávno jsem to tam našel. Jak to?

Stačilo si uvědomit, že dneska jak cmd, tak i PowerShell, spouští ještě další proces conhost.exe na to, aby hovořili s uživatelem. Moc nerozumím proč, ale dělá to už od Windows 7. Ale to není ani podstatné. Důležité je to, že historie příkazů je v tom conhost procesu, a nikoliv v cmd.exe, nebo v powershell.exe.

Takže stačí použít další utilitku strings, tedy něco jako

procdump -ma -o <conhostPID> conhost.dmp
strings conhost.dmp > conhost.txt

A ty příkazy už v tom najdete. Samozřejmě nejsou tam moc pěkně pohromadě, ale na to, abyste zjistili, nebo si potvrdili, co tam kdo zadával, to úplně stačí.

leden 09
Pentest - Ukázkový kód modifikace obsahu webového požadavku pro Fiddler

Právě pracuju na jednom penetračním testování webové aplikace a zase jako vždycky, když se k něčemu vracím po pár měsících, tak si už nic nepamatuju, a všechno hledám. Tak tohle berte jenom jako můj vlastní semplík, abych to příště měl po ruce.

Jedná se o ukázku kódu do Fiddler pravidla (rule), který modifikuje jméno souboru uploadovaného z formuláře, který používá enctype="multipart/form-data". Navíc to obarví tu položku na červeno a ztlustí ji (bold). Na zbytek už máte Fiddler ScriptEditor, a jeho inteli sense, ale s něčím musím vždycky začít.

if (oSession.HostnameIs("test.gopas.cz") && oSession.uriContains("/default.aspx") && oSession.HTTPMethodIs("POST")) {

  oSession["ui-color"] = "red";
  var oBody = System.Text.Encoding.UTF8.GetString(oSession.RequestBody);
           
  if (oBody.Contains("Content-Disposition: form-data; name=\"fileUpload\";")) {
       
    oSession["ui-bold"] = "true";
    oBody = System.Text.RegularExpressions.Regex.Replace(oBody, "(Content-Disposition: form-data; name=\"fileUpload\"; filename=\")(.+?)(\")", "$1test.pdf$3");
    oSession.utilSetRequestBody(oBody);
  }
}

 

Tak dobrou. Mimochodem, tenhle pentest opět ukázal, že mnozí vývojáři webových aplikací o bezpečnosti ještě neslyšeli. A to i když dodávají aplikaci pro banku.

leden 08
Odpověď - jak zablokovat přístup na internet některým uživatelům, nebo počítačům

Dneska ještě jedna odpověď - jak zablokovat přístup na internet z nějakých počítačů, centrálně přes GPO (Group Policy Object)?

Odpověď

Nejspíš docela jednoduše pomocí Windows Firewall. Windows Firewall se dá nastavit přes Group Policy. V editoru je to v části:

Computer configuration
  Policies
    Windows settings
      Security settings
        Windows firewal with advanced security

Česky to je tady:

Konfiugrace počítače
  zásady
    nastavení systému Windows
      nastavení zabezpečení
        brána Windows Firewall s pokročilým zabezpečením

Umí udělat blokovací Outbound pravidlo. Tam si zadáte třeba rozsah IP adres. Pokud bych měl třeba vnitřní síť 192.168.1.x, tak bych tam dal dva blokované rozsahy 0.0.0.0-192.168.0.255 a druhý nad tím privátním 192.168.2.0-223.255.255.255.

Nesmíte to přehnat moc nahoru, musíte skončit na 223. Protože nad tím je multicast, který potřebujete i ve vnitřní síti - možná. Jediná věc je, že tohle se nastavuje per počítač - tedy přes GPO, ale je to v počítačové části toho Group Policy Object.

To znamená, že se to bude vstahovat na konkrétní počítače a nikoliv na nějaké konkrétní uživatele. Pokud lidi mají svůj počítač, tak to je ok. Pokud se ale nějaký uživatel přesouvá, tak toho nedosáhnete.

Ještě odkazy na předchozí článečky o Windows Firewall - problémy s jeho GPO pravidly, pokud se používají výchozí předdefinovaná a obecně o jeho smysluplnosti.

leden 08
Odpověď - jak je to s virtuálními čipovými kartami na Windows 7

Právě dorazil zajímavý dotaz a vzhledem k tomu, že to může mít složitější vysvětlení, dávám to rovnou sem:

Dotaz

Obdržel jsem zajímavý dotaz a protože nevím odpověď, obracím se na největšího mně známého odborníka. Zákazník by rád využil virtuální smart karty, ale nechce přejít na Win8, rád by zůstal u Win7. V těch nativně tahle funkcionalita není, ale možná existují nějaká řešení třetích stran se stejnou funkcionalitou. Věděl bys o něčem respektive doporučil bys nějaké řešení pro tenhle scénář?

Moje odpověď

Nejprve rychle - ne, nevím o ničem pro Windows 7. Microsoft měl nějakou interní utilitku na simulaci čipové karty do souboru na testování Base Smart Card Crypto Provideru, tu jsem nějak "pokoutně" dostal, ale je to opravdu jen testovací a ne úplně to funguje. Navíc to ukládá klíče do souboru, což není bezpečné vůbec.

O jiném software nevím, podle mě to nikdo nestačil ani vyvinout, než vyšly Windows 8. Nehledě na to, že na to není trh, aby to někdo vyvíjel.

Ale lepší odpověď, možná z ní vyplyne, že to není ani tak moc výhodné a není na škodu si prostě koupit za 1000,- CZK karty fyzické, které dávají mnohem více muziky (porovnejte s cenou počítače). Kolik by asi takový software stál v porovnání s jednou kartou?

Úvod do virtuálních čipových karet

Ano, od Windows 8 je za pomoci TPM čipu na motherboard (základní desce) počítače k dispozici funkce zvaná virtual smart card. Znamená to, že si člověk může ukládat privátní klíče k certifikátům, v principu, do základní desky a nemusí být na disku počítače.

Windows umožňují teď tedy ukládat privátní klíče na třech místech:

  • na disku v profilu - normálně jsou totiž jednoduše v souborech, v profilu uživatele. Je to cesta %AppData%\Microsoft\Crypto\RSA v případě CSP poskytovatele, nebo v %AppData%\Microsoft\Crypto\Keys v případě CNG poskytovatele. Chráněno je to zde přihlašovacím heslem uživatele. Chráněno znamená zašifrováno. Pomocí DPAPI atd. Bez znalosti hesla uživatele to tedy nikdo nedostane.
  • do TPM module na základní desce. Tady to může být dále chráněno TPM PINem. Jedná se o uložení do samostatného hardware, mimo operační systém počítače.
  • do separátní fyzické čipové karty (smart card), kterou připojíte přes USB reader, nebo ve formě přímo USB tokenu.

Výhody hardware úložiště

Psal jsem o tom například zde. Nejen že to ukládá privátní klíče mimo operační systém, ale ty privátní klíče nejdou ani exportovat. Veškeré kryptografické operace provádí nikoliv Windows operační systém, ale přímo čip na čipové kartě, nebo právě TPM čip.

Tím pádem, když si uživatel stáhne do počítače nějaký exploit, tak mu to ty privátní klíče nemůže přímo ukrást z disku.

Rozdíly čipové karty a TPM virtual smart card

No v podstatě je to stejné, krom několika omezení, která TPMko má. Ano, můžete se obojím přihlašovat do Windows (pomocí Kerberos PKINIT) a samozřejmě na VPN a DirectAccess a RDP apod.

Výhody TPM:

  • oproti tokenu, nebo čipové kartě to nemusíte tahat sebou
  • nemusíte si to separátně koupit za pár korun, zatímco můžete zaplatit hodně peněz za corporate grade notebook, který má TPM :-)

Nevýhody TPM virtuální čipové karty:

  • nelze to vytáhnout, takže se na to neuplatňuje automatické zamykání počítače při vytažení
  • nemůžete v tom mít RFID anténu, takže si s tím dveře neotevřete
  • mezi více počítači je to nepřenosné - mnohdy potřebujete mít svoje přihlašovací údaje na kartě, abyste se mohli hlásit na víc strojích
  • zadáváte jen kraťoučký PIN, stejně jako u čipové karty - jenže když to kolega odpozoruje (právě, protože je tak krátký) - přijde k vašemu počítači a přihlásí se stejně
    • používat dlouhý PIN pomalu postrádá krásu čipových karet - to už můžete mít skoro heslo, ne?
  • není to multifactor autentizace, protože vám stačí pamatovat si PIN. Neznamená to, že musíte něco mít. Sice ano, musíte mít svůj počítač, ale ten musíte mít i s čipovou kartou, že?

Závěrem

Je to pěkné, pokud máte na počítači TPM a máte Windows 8 a nechce se vám kupovat kartu, tak pojďme do toho, je to pohodlné vylepšení bezpečnosti. Super.

Ale pokud už řešíte PKI a chcete opravdovou bezpečnost, potřebujete čipové karty (smart card). 

leden 06
Povolení Kerberos delegace (double hop) pro PowerShell remoting

V poslední době se člověkům dost zvyšuje používání PowerShell příkazové řádky na správu více serverů. Speciálně s Hyper-V cluster a podobně. A člověk rád používá remoting, tedy Invoke-Command a podobně. A začíná bojovat s problémem přístupu na ještě vzdálenější servery - tedy double hop (neboli delegation).

Už jsem tu před nějakou dobou psal o tom, jak (ne)povolovat delegaci pro PowerShell remoting a jeho příkazy jako je Invoke-Command nebo Enter-PSSession. Článek byl o tom, že musíte použít pouze volbu Trust this computer for delegation to any service. Teď jsem to vyzkoušel na Windows 2012 a jede to i s druhou volbou Trust this computer for delegation to specified services only with Any authentication protocol.

Ani jedna volba není ideální, ale podívejme se tedy na obě možnosti pořádně.

PowerShell remoting a problém s double-hop (neboli delegation)

Scénář je tento Client8 ---> Srv2k12r2 ---> Data1. Na klientovi máte puštěný PowerShell. Na prostředním serveru Srv2k12r2 chcete spouštět příkazy. Spouštíte nějaký příkaz pomocí Invoke-Command, nebo třeba Enter-PSSession.

K tomu musíte být samozřejmě členem skupiny Administrators na tom vzdáleném počítači, bez toho byste se tam ani nedostali (tohle povolit by bylo ještě stokrát složitější). To je ok.

Jenže ten příkaz, který poběží na vzdáleném počítači chce jít ještě na nějaký další počítač. Děláte tedy tak zvaný double-hop, neboli delegation (Kerberos delegation).

Pokud to nemáte nějak povoleno, tak Invoke-Command neuspěje stejně, jako v prvním případě na obrázku. Tedy chyba jako:

Access is denied (error 0x5, 0xC0000005)
Permission denied, UnauthorizedAccessException, Anonymous logon

To stejné byste zažili, kdybyste dělali kompletní Enter-PSSession.

Ve druhém případě se to už povedlo, což by mělo dokumentovat okamžik, kdy už máte tu delegaci (delegation, double hop) povolenu.

Jak povolit delegation a dokázat potom udělat double hop?

Máte v zásadě dvě základní možnosti:

  • použijete CredSSP ověřování. To ale budete muset zadávat login a heslo při připojování a ještě to budete muset povolovat v politice.
  • použijete jednu ze dvou možných Kerberos delegation. Jak už jsem psal dříve, původně fungovala jenom jedna metoda Kerberos delegace, na Windows 2012 už fungují dvě ze tří. Asi to soudruzi vylepšili.
    • funguje - Trust this computer for delegation to any service
    • nefunguje - Trust this computer for delegation to specified services only with Kerberos only
    • funguje od Windows 2012 - Trust this computer for delegation to specified services only with Any authentication protocol

Povolení double hop PowerShell remoting pomocí Trust this computer for delegation to any service

Tahle metoda povolí delegaci úplně kamkoliv. Kdokoliv se dokáže připojit přes WinRM na ten server vzdáleně, se potom dostane už úplně kamkoliv jinam. Současně povolujete také libovolným službám na tom serveru, aby po příchodu nějakého libovolného ověřeného uživatele pokračovaly kamkoliv dále.

To je hrozně nebezpečné. Ale funguje to už od domain functional level 2000. Nastavíte prostě delegaci pro prostřední server takto:

Obrázek: volba Trust this computer for delegation to any service, v češtině Důvěřovat tomuto počítači pro delegování libovolné službě (pouze protokol Kerberos).

Dále musíte ještě přidat ten účet prostředního serveru do skupiny WAAG (Windows Authorization Access Group). Tahle skupina totož umí číst atribut tokenGroupsGlobalAndUniversal. Obvykle to sice není potřeba, protože skupina Authenticated Users je by default členem skupiny Pre-Windows 2000 compatible access, ale pro jistotu tím nic nezkazíte:

A musíte ten prostřední server (v mém případě Srv2k12r2) restartovat! LSASS má různé keše, které je potřeba vyhodit. Nepomůže ani chvilku počkat, ani restartovat jen nějakou službu. Otočte to celé. Samozřejmě možná něco někdy pojede i bez restartu, ale už jsem na tom strávil hodně bezesných nocí.

Na klientovi se musíte odhlásit! Aby se vám vyčistila klientská keš Kerberos tiketů. Opět by mohlo pomoci klist purge, ale není to úplně na jistotu.

Poněkud omezenější a bezpečnější Kerberos delegation za pomoci Trust this computer for delegation to specified services only with Any authentication protocol

Druhá možnost delegace je na jedné straně více omezená. Na druhé straně je tedy také komplikovanější, pokud chcete povolit více double hop služeb na vzdálených serverech. Na třetí straně tím dáváte možnost prostřednímu serveru (a tedy jeho libovolným službám běžícím jako SYSTEM, Network Service, nebo pod virtuální servisní identitou - virtual service identity) dělat si delegaci, aniž by se k nim vůbec musel někdo připojovat. Takže za jistých podmínek dokonce nebezpečnější.

Podle obrázků to povolíte podobně, jenom musíte vyjmenovat seznam služeb, do kterých může prostřední server delegovat:

Obrázek: volba Trust this computer for delegation to specified services only, Any authentication protocol. V češtině Důvěřovat tomuto počítači pro delegování pouze určeným službám - Používající libovolný protokol pro ověření.

Závěr

Ani CredSSP, ani Kerberos delegation není v podstatě jednoduchá na zapnutí a navíc to vyvolává bezpečnostní pochybnosti. Já to nerad používám. Vždycky se to dá obejít nějak jinak.

Jak jsme dneska zjistili, například to koliduje s nastavením delegace pro Hyper-V live migration.

1 - 14Next
>
 

 Rychlovky lepší než tvítr

 
12.2.2015 19:16
Jestli budeš zlobit, tak tě odvezu do Norska a dám ti na ulici před sociálkou na zadek!
12.2.2015 7:45
Antiviry na mou ranni prednasku se uz instaluji. Dneska mame Avast, Eset a Symantec. Avg nesla stahnout trialka :-)
10.2.2015 15:10
Tak to je parada - jakoze si udelam z Azuru VPN primo do firmy, aby kazdej  Ind co to spravuje mel pristup primo k nam domu :-)
9.2.2015 7:05
Vikendovy pobyt na chalupe se zmenil na poblit. Ooo boze. Je to hnus vasnosti.
7.2.2015 10:47
Vcera vecer na parkingu pred McDonaldem muj milacek Janek poblil meho milacka auto a ja to ted drhnu. Fuj :-)
2.2.2015 21:46
to jsou idioti. MS zrušil "remote control" na RDP ve Windows 2012, aby se to zase vrátilo pod názvem "shadowing" ve Windows 2012 R2. panebože
31.1.2015 14:00
Hlazeni rejnoku kteri zerou z ruky tak to je paraaada. Zoo Lesna Zlin!
30.1.2015 21:19
hej more, zuno lezbank (aneb "zuno, less bank, more life")
29.1.2015 23:25
dívám se, že včera mi vyšel článek na technetu: http://blogs.technet.com/b/technetczsk/archive/2015/01/29/co-skutecne-znamenaji-jednotliva-uzivatelska-prava-aneb-ceho-se-bat-a-ceho-ne.aspx
26.1.2015 6:20
Bankomat nejel. Zadny prachy, zadny kafe. Umiram
23.1.2015 19:24
aktualizoval jsem svuj volatile forensics script - ted to audituje i certifikáty, lépe to překládá SIDy přihlášených uživatelů a používá to svůj vlastní Temp. https://www.sevecek.com/files/volatileForensics. Sice to nejsou úplně prchavé informace, dají se samozřejmě zjistit později i z imidže, ale i tak není špatné to slíznout rovnou.
23.1.2015 13:12
dejte si do google obrázků "my new credit card". Ti lidi musí být úplní magoři :-)
22.1.2015 7:06
Tak znovu. Kde je NEuspornost normalni zarovky? Co vytopim zarovkama usetrim na topeni. Stoji zlomek a SVITI!
16.1.2015 8:48
Přednáška o Kerberos, už příští týden na WUG Bratislava v GOPASu od 17 hodin: http://www.wug.sk/?name=events&e=172
16.1.2015 8:44
plazi se slimaci a potkaj tretiho. ten ma vestu s trhavinou, v jedny ruce granat a v druhy odpalovaci zarizeni. ty dva na nej koukaj a povidaj: a ty ses kdo ? a on odpovi: ja sem muslimak
15.1.2015 13:57
zdroják všech mých PowerShell kódů, pokud vynechám občasné maličkosti, právě dosáhl 25112 řádků včetně poznámek. Nepočítám prázdné řádky.
13.1.2015 8:39
Tri volavky? v letu, paráda
12.1.2015 17:11
no nechápu proč je na myši nastaveno ve výchozím stavu "Allow this device to wake up computer". Obvykle to vypínám potom, co se mě natvrdo po cestě vybije noťas.
9.1.2015 11:16
To jsem nevěděl, že PowerShell validace paremetrů v klauzuli Param() platí pro tu proměnnou i nadále uvnitř dalšího kódu. (Get-Variable $vstup).attributes.
7.1.2015 18:32
dneska spam - že prý "splňte si předsevzetí začít pracovat efektivně už v lednu"? Jakože "jsem línej lempl, tak třeba mě někdo poradí, jak se toho zbavit"? :-) Ale rovnou jsem to smazal, tak nevím.
7.1.2015 15:21
CD se posouvaji do dalsi dimenze. Jidelnicek RailJet: dva parky plus rohlik = 153 CZK, jeden kynuty knedlik = 185 CZK
22.12.2014 8:25
"Dnes mají rodiče největší obavy z toho, co jejich syn stahuje z Internetu a co jejich dcera na Internet nahrává."
18.12.2014 14:42
No hned si valím nainstalovat tenhle kazič stability a výkonu. To stojí za to: http://www.zive.cz/bleskovky/viber-se-pustil-do-esetu-ten-mu-to-spocital-na-twitteru/sc-4-a-176542/default.aspx
2.12.2014 6:13
Windows 8.1 se nasilne restartnou po aktualizacich, kdyz to dlouho neudelate sami, jak jsem prave zazil :-) Ale zase potom pospousti vsechny predchozi program.
29.11.2014 11:48
Znamy po me chtel nastaveni sites v IE pres GPO. https://www.sevecek.com/Lists/Posts/Post.aspx?ID=411