Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > default
září 03
Jak připojit shadow copy jako písmenko disku

V dávném článku jsem psal o tom, jak ručně vytvářet volume shadow copy (VSS snapshot) pomocí PowerShellu a WMI. Tam se využíval příkaz MKLINK k připojení stínové kopie oddílu do nějakého adresáře (directory symbolic link, nebo junction). Dneska se podíváme, jak připojit shadow copy přímo jako písmeno disku/svazku (disk volume letter):

$src = @'
namespace Sevecek {

  using System.Runtime.InteropServices;

  public class Win32Api {

    [DllImport("kernel32.dll", SetLastError = true, PreserveSig = true, CharSet = CharSet.Auto)]
    public static extern bool DefineDosDevice(uint dwFlags, string lpDeviceName, string lpTargetPath);
  }
}
'@

if (-not ('Sevecek.Win32Api' -as [Type])) { Add-Type $src }

[Sevecek.Win32Api]::DefineDosDevice(0, 'S:', '\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy38')
květen 27
Zdrojové kódy mých výukových prográmků

​Už delší dobu se chystám uveřejnit nějak souhrně zdrojové kódy svých ukázkových programů, které používám na školeních v GOPASu a na přednáškách. Například teď na konferenci TechEd jsem ukazoval fake logon :-)

Obsahuje například toto:

- WS-Fed ukázku, která vypisuje claimy, zvlášť vhodné pro testování ADFS

- SAMLP ukázka, která generuje SAML-P požadavek a dekóduje jeho odpověď

- OAuth příklady ​testovací webové aplikace a jejího back-endu

- MFA adapter pro AD FS

- Fake Logon z TechEdu

Všechno je to ke stažení tady. Odkaz naleznete také na stránce spolu se slajdy a prezentacemi:

Všechny zdrojové kódy ukázkových aplikací

 

květen 27
Prezentace z letošní konference TechEd 2019

​Moje prezentace z letošní konference GOPAS TechEd jsou ke stažení zde:

Zabezpečení RDP

Přihlašování do Windows pomocí TPM

duben 02
Windows Update a restarty serverů

Klasický požadavek. Nechceme, aby se nám servery po automatické aktualizaci restartovaly. S Windows 2016 se to trošku změnilo, tak je každý zmatený a neví, čeho se chytit. Tak tady je čeho se chytit. Připomínám, že se bavíme o serverech a nikoliv o Windows 10 stanicích.

Ten požadavek je špatně. Musíte to chápat opačně. Musíte restartovat ihned po aktualizacích.

Jakmile už Windows Update nainstaluje aktualizace, tak je restart neodkladný. Dříve to možná šlo technicky odložit, dneska už to po několika dnech ani nejde. Na Windows 2016 náhodou kliknu zaktualizovat, potom na to zapomenu, a pak se divím, že se to samo po několika dnech v horkém čase otočilo. Tak na to zapomeňte.

Jakmile se nainstaluje aktualizace, tak je restart nutný z principu. Něco jste v systému změnili a neúplně jste to zavedli. Restartovat musíte stejně. A to co nejdřív. Jinak se to může chovat nestabilně.

Takže otázka není, jak odložit restart. Restart chcete automaticky hned (co nejdříve) po instalaci.

Otázka je pouze o tom, kdy instalovat aktualizace. To jde pro serverové edice v pohodě nastavit přes GPO pomocí volby:

Computer Configuration
  Administrative Templates
    Windows Components
      Windows Updates
        
        Configure Automatic Updates
          2 - notify for download and autoinstall
          3 - auto download and notify for install
          4 - auto download and schedule the install

        Allow automatic updates immediate installation = DISABLED
Registry to jsou tyto:
  HKLM\Software\Policies\Microsoft\WindowsUpdate\AU
    AUOptions = DWORD = 2/3/4
    AutoInstallMinorUpdates = DWORD = 0

Z tohoto si vyberte. Volba 2 znamená, že musíte přijít a ručně tu aktualizaci spustit, navíc se to bude teprve potom stahovat. S volbou 3 to bude už samo staženo a připraveno, zahájit aktualizaci musíte i nadále ručně. Při nastavení 4 se to celé bude dělat ve stanovený čas, například jednou týdně někdy v noci.

Aktualizace bude chvilku trvat, asi nejdéle v případě volby 2.

Takže jediné, co k tomu potřebujete pořešit je co nejrychlejší následný automatický restart. K tomu máte tyto volby:

Windows 2019, Windows 2016, Windows 2012 R2, Windows 8.1, Windows 2012, Windows 8

  Always automatically restart at scheduled time = 15 min
  No auto-restart with logged on users for scheduled automatic updates installations = DISABLED

Těch 15 minut je minimum, ale znamená to, že celý proces aktualizace včetně restartu bude trvat něco jako půl hodinky plus železný restart, pokud to je hardware. Pro starší systémy to buď necháte ve výchozím stavu, nebo nastavíte následující:

Windows 2008 R2, Windows 7, Windows 2008, Windows Vista, ...
    
  Delay restart for scheduled installations = 5 min
  No auto-restart with logged on users for scheduled automatic updates installations = DISABLED

Doporučena kombinace pro všechny server OS - pouze ruční instalace plus restart ihned

Computer Configuration
  Administrative Templates
    Windows Components
      Windows Updates

        Configure Automatic Updates
          3 - auto download and notify for install

        Allow automatic updates immediate installation = DISABLED

        Always automatically restart at scheduled time = 15 min
        Delay restart for scheduled installations = 5 min

        No auto-restart with logged on users for scheduled automatic updates installations = DISABLED

        Reschedule automatic updates scheduled installation = DISABLED
        Allow non-administrators to receive update notifications = DISABLED

Doporučena kombinace pro všechny server OS - automatická instalace v noci plus restart ihned

Computer Configuration
  Administrative Templates
    Windows Components
      Windows Updates

        Configure Automatic Updates
          4 - auto download and schedule the install
          schedule install day: saturday, 3:00

        Allow automatic updates immediate installation = DISABLED
    
        Always automatically restart at scheduled time = 15 min
        Delay restart for scheduled installations = 5 min

        No auto-restart with logged on users for scheduled automatic updates installations = DISABLED

        Reschedule automatic updates scheduled installation = DISABLED
        Allow non-administrators to receive update notifications = DISABLED
listopad 15
Na co je a na co není biometrika

Zase vyšel jeden článek, který nějak nerozumí biometrice. V článku je zajímavá jenom ta technologie. Veškerá ostatní omáčka je nesmysl.

Biometrické ověřování vždycky trpělo a bude trpět tím, že ho lze oblbnout a že svoje biometrická data zanecháváme kudy chodíme. Ať to bude dokonalé jakkoliv, tak vždycky půjde udělat falešný otisk, obličej, hlas, nebo prd, pokud seženeme ten správný vzorek od skutečného majitele. Má to i technicky prostě vždy nějakou false acceptance rate (FAR) - pustí to někoho jiného - a false rejection rate (FRR) - nepustí to toho správného.

Je tedy kravina chtít používat biometriku na placení v obchodě, nebo výběr z bankomatu. Nebo na vstup do budovy, nebo přihlašování na libovolné počítače ve společných (open space) prostorách. Biometrika je naopak velmi pohodlná pro uživatele vlastních zařízení, jako jsou mobily, osobní notebook, nebo hardware multifaktorové předměty, kde to nahradí PIN.

Jenže to je ten rozdíl. Mobil nebo notebook máte pořád při sobě a nikdo cizí se k němu nedostane. Čipovou kartu nebo token máte také při sobě a biometrika omezuje jeho použití při náhodné ztrátě a nálezu cizincem.

Takže útok na můj mobil s nějakým master otiskem neexistuje. Na zdraví!

srpen 06
Ukládání tajných informací a hesel pro skripty a naplánované úlohy

To je věčná otázka. Máte skript, nebo naplánovanou úlohu, nebo třeba dokonce službu, a potřebujete, aby měla k dispozici nějakou tajnou informaci, jako je třeba heslo k nějakému účtu, nebo šifrovací klíč k datům v databázi. Jak ho na počítači "bezpečně" uložíte?

Internet se hemží různými návody, jak uložit například PSCredentials do XML, nebo používat jakýsi cizí Get-PnPStoredCredential a ukládat hesla do takového toho zabudovaného trezoru na hesla.

To jsou všechno zbytečné obezličky. Já používám rovnou to nejjednodušší, přímo DPAPI, nad kterým jsou všechny ty ostatní metody stejně postaveny, a které je používáno libovolnými systémovými službami i aplikacemi. DPAPI je už minimálně od Windows 2000 zabudováno do systému a .NET Framework má pro něho už od verze 2.0 (a PowerShell 2.0 tedy také) statickou metodu, takže pohoda.

Jednoduché vysvětlení DPAPI

Detaily si můžete poslechnout na letošním hackerfest od Michaela Grafnettera. Mě zajímá princip. DPAPI (Data Protection API) vám jednoduše zašifruje cokoliv si řeknete svým náhodným klíčem. Každý počítač má svůj náhodný klíč per-machine. Tento klíč je uložen v systémových registrech počítače, nebo v systémovém profilu na disku (%windir%\system32\config\systemprofile) - Grafi bude vědět přesněji - je prostě na disku.

Každý uživatel má ve svém profilu (nejspíš opět v jeho registrech) také svůj náhodný profilový klíč, tedy per-user-profile. Schválně píšu per-user-profile, protože bez cestovního profilu máte na každém počítači jiný klíč, zatímco s profilem cestovním (roaming profile) máte všude klíč stejný. Také je důležité, že se jedná o profil, protože například IIS pracovní procesy (app pool) se ve výchozím stavu startují bez profilu a pokud u nich chcete DPAPI využívat, musíte jim profil zapnout ve vlastnostech apppool (processModel.loadUserProfile).

V uživatelském profilu je tento šifrovací náhodný klíč chráněn ještě navíc uživatelovým přihlašovacím heslem a paralelně AD záchraným klíčem. Je to tedy imunní proti offline krádeži profilu a díky AD klíči i proti resetu hesla správcem v AD. Lokální účty naopak nejsou imunní proti reset hesla správcem. Opět Grafi bude vědět detaily, předpokládám.

DPAPI umí použít buď tento per-machine, nebe per-user-profile náhodný klíč k tomu, aby vám zašifrovalo nějaká data. Pokud si to necháte zašifrovat per-machine, na daném počítači si to dešifruje úplně kdokoliv, nemusí být ani členem skupiny Administrators (příkladem je například SharePoint passphrase, jak už jsem tu o ní dávno psal). Pokud se k OS disku někdo dostane offline, také to dešifruje.

Pokud použijete klíč per-user-profile, tak to dešifruje pouze stejný uživatel na stejném počítači pokud nemá cestovní profil (roaming profile). Pokud cestovní profil má, tak na libovolném jiném počítači také.

Jak to použít z PowerShellu? Nejprve jeho obvyklé typy a práce s nimi

Člověk sbírá tajné údaje z hvězdiček jako SecureString:

$tajemstvi = Read-Host 'Zadej heslo nebo jine tajemstvi' -AsSecureString
$tajemstvi.GetType().FullName   # System.Security.SecureString

Nebo si to zkonvertuje z plaintextu:

$tajemstvi = ConvertTo-SecureString 'tajemstvi co je tajne' -AsPlainText -Force
$tajemstvi.GetType().FullName   # System.Security.SecureString

Nebo se zeptá rovnou na PSCredential:

$loginHeslo = Get-Credential -UserName 'gps\kamil' -Message 'Zadej heslo chlapku'
$loginHeslo.GetType().FullName   # System.Management.Automation.PSCredential

PSCredential lze rovnou založit přímo z plaintextu:

$loginHeslo = New-Object System.Management.Automation.PSCredential 'gps\kamil', (ConvertTo-SecureString 'Pa$$w0rd' -AsPlainText -Force)
$loginHeslo.GetType().FullName   # System.Management.Automation.PSCredential
$loginHeslo.UserName             # string
$loginHeslo.Password             # System.Security.SecureString

Poznámka. Už tady se používá DPAPI, sice jen paměťové, ale hodnota System.Security.SecureString je uložena v paměti opět v zašifrované formě (per-machine), aby to nešlo jenom tak prohlížet.

Ale bez problémů heslo dostanete ven i v čisté formě plaintextu:

$loginHeslo.GetNetworkCredential().Password   # Pa$$w0rd

Takže práce s tajnými údaji v PowerShellu by byla. Jak to uložit na disk, nebo do registrů, nebo do databáze?

Jak si nechat zašifrovat data pomocí DPAPI?

Jednoduše. Použijeme třídu System.Security.Cryptography.ProtectedData. Žádný klíč ani heslo nepotřebujete. Všechno je v počítači nebo ve vašem profilu samo od sebe. Jediné co ještě můžete přidat, když moooc chcete, je sůl (salt), neboli inicializační vektor (IV). Akorát tím zajistíte, že dvě stejné hodnoty by nemusely být zašifrovány stejným klíčem stejně (ale ony stejně nebudou, protože DPAPI samo vždycky zasolí nějakým náhodným číslem). Spíše tím zkomplikujete kreking, řekněme. Osobně necítím potřebu, vždycky je tam systémová sůl.

$tajnyText = 'Tohle je megasuper tajne'
$bajty = [System.Text.Encoding]::Unicode.GetBytes($tajnyText)

# per-user-profile
$zasifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Protect($bajty, $null, 'CurrentUser')
[Convert]::ToBase64String($zasifrovaneBajty)

# per-machine
$zasifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Protect($bajty, $null, 'LocalMachine')
[Convert]::ToBase64String($zasifrovaneBajty)

Dobrá, slanější je vždycky chutnější:

$tajnyText = 'Tohle je megasuper tajne'
$sul = 'Hlavne to Jiriku nepresol'
$bajty = [System.Text.Encoding]::Unicode.GetBytes($tajnyText)
$iv = [System.Text.Encoding]::Unicode.GetBytes($sul)

# per-user-profile
$zasifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Protect($bajty, $iv, 'CurrentUser')
$tohleSeDaUlozit = [Convert]::ToBase64String($zasifrovaneBajty)
$tohleSeDaUlozit    # proste pekny ulozitelny text ve formatu Base64

# per-machine
$zasifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Protect($bajty, $iv, 'LocalMachine')
$tohleSeDaUlozit = [Convert]::ToBase64String($zasifrovaneBajty)
$tohleSeDaUlozit    # proste pekny ulozitelny text ve formatu Base64

Předpokládám, že uložit to Base64 zašifrované monstrum už zvládnete sami, ne?

Dešifrování DPAPI chráněných Base64 řetězců

Co jste si před chvilkou uložili ve formě Base64 zašifrovaného textu, si načtete a podle chuti přidáte původní inicializační vektor (IV):

$sul = 'Hlavne to Jiriku nepresol'
$iv = [System.Text.Encoding]::Unicode.GetBytes($sul)

# per-user-profile
$desifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Unprotect(([Convert]::FromBase64String($tohleSeDaUlozit)), $iv, 'CurrentUser')
[System.Text.Encoding]::Unicode.GetString($desifrovaneBajty)

# per-machine
$desifrovaneBajty = [System.Security.Cryptography.ProtectedData]::Unprotect(([Convert]::FromBase64String($tohleSeDaUlozit)), $iv, 'LocalMachine')
[System.Text.Encoding]::Unicode.GetString($desifrovaneBajty)

A jak by řekl Babica, když nemáte inicializační vektor, dáte tam něco jinýho. Akorát dejte bacha, aby vám z toho nevyšla nějaká ta jeho dobrota.

červenec 24
Vypadávání počítačů (a DC) z domény

Zrovna včera jsem řešil problém s počítačem, jehož účet do domény se nějak "poškodil" a on přestal s doménou komunikovat. Jedná se vcelku běžný problém, který si každý nejspíš několikrát zažil. Včera to bylo ještě trošku speciálnější, protože šlo o řadič té domény (DC - domain controller). Projevilo se to tak, že jeho služby běžící pod účtem SYSTEM a Network Service prostě nedokázaly komunikovat s jeho vlastním, lokálně běžícím, Active Directory. Například nenabíhal DNS server a hlásil, že se nemůže dostat do domény, i když Active Directory normálně běžela.

O účtech počítačů jsem tu už psal, takže to se rozepisovat nebudu kromě malého připomenutí a shrnutí. Ale chtěl bych vysvětlit, proč a kdy se tyto chyby občas dějí, a že to není vlastně nic divného.

Fakta o účtu počítače

Počítače mají svoje heslo v registrech ve formě LSA secret v klíči MACHINE$.ACC. Tam je v plné formě. Toto heslo se uloží na účet počítače v Active Directory při připojení počítače do domény a poté si ho počítače každých 30 dnů samy mění. V Active Directory je heslo uloženo normálně ve formě hash, stejně jako všechno ostatní hesla.

Po změně má v registrech počítač svoje aktuální heslo a pro hladkost běhu ještě i heslo předchozí, aby ještě dokázal přijímat dříve vydané Kerberos TGS tickety svých klientů (pokud je to server pro nějaké klienty). Sám používá hned a pouze jen to nové heslo při komunikaci s DC - AD replikační prodlevy tu nehrají roli, protože máte PDC, a tudíž se to chová stejně jako v případě normálních uživatelských účtů.

Hesla počítačových účtů nikdy nevyprší. To znamená, že počítače si hesla mění samy dobrovolně. Pokud si heslo z nějakého důvodu počítač nezmění, prostě používá i nadále to původní. Například není problém, abyste měli stroj třeba rok vypnutý, po startu se s doménou spojí v pořádku. I když bude počítač několik měsíců mimo vnitřní síť (bez VPN), tak se zase nic neděje, i když celou dobu jede. V průběhu své nepřítomnosti se pokouší heslo změnit, nemůže kontaktovat AD, tak si ho samozřejmě nezmění.

Heslo počítače používají služby běžící pod účtem SYSTEM, Network Service, IIS APPPOOL a NT SERVICE pro přístup do sítě. Pokud by se heslo nějak poškodilo, tak nebude počítači fungovat například:

  • dynamická aktualizace vlastních DNS A záznamů v DNS, pokud to obvykle vyžaduje secure dynamic update
  • vydávání certifikátů počítače z AD CS
  • aktualizace zásad skupin (group policy) počítačového účtu. Zatímco uživatelské zásady se dříve stahovaly pod účtem uživatele, dnes už se nebudou stahovat ani ty
  • lokální interaktivní přihlašování (ctrl-alt-del) uživatelů, kteří nejsou nakešovaní. Účty uživatelů, které jsou na počítači nakešované od předchozích přihlášení se normálně přihlásí a dokonce se mohou pohybovat po síti, protože jejich účet je v pořádku. Lidé to sami moc tedy nepoznají, takže to bývá mnohdy dost dlouho neviditelné
  • ze sítě se na počítač s ověřením nedostanete a je jedno, jestli to je Kerberos, nebo NTLM
  • tím pádem nelze na počítač nic vzdáleně instalovat, ani se k němu nepřipojí žádný manadžovací server typu SCCM, SCOM, antivirový server apod.
  • na počítač se nedostanete ani přes RDP, protože NLA vás dál nepustí (to je to stejné, jako že se tam nedá dostat ze sítě na sdílené adresáře ani do WMI, PS Remoting apod.)

Obvyklé chybové hlášky při pokaženém hesle jsou:

Trust relationship between this workstation and primary domain failed

Target principal name is incorrect

Event ID: 5722
Source: NETLOGON
Event Type: Error
The session setup from the computer ComputerName failed to authenticate. The name of the account referenced in the security database is Computer$.

Oprava hesla se provede odpojením a opětovným připojením počítače do domény, nebo pomocí NETDOM RESETPWD, nebo pomocí Reset-ComputerMachinePassword. Samozřejmě pouze lokálně, protože vzdáleně se na mašinu nedostanete.

Proč se to proboha děje?

A dostáváme se konečně k jádru článku :-) Jak se to stane? Jak se to staně i DC samotnému? Jednoduše. Změna hesla není transakčně bezpečná.

Uvědomte si, o co se jedná při změně hesla počítače. Jde o distribuovanou transakci mezi dvěma mašinami. Vstupuje do toho počítač a DC. Počítač si vytvoří TCP spojení na DC a uvnitř nechá provést změnu hesla (ověří se, provede změnu buď přes SMB, DCOM nebo Kerberos). DC provede kontrolu kvality hesla a případně ho pomocí nějakého password filteru odešle do dalších připojených systémů. Následně si DC vypočítá jeho hash a tuto si uloží do Active Directory.

Když je heslo uloženo v AD, tak se po tom stejném TCP spojení pošle klientovi informace, že všechno je ok. Až tuto informaci klient dostane, uloží si nové heslo do registrů a původní heslo si pošoupne v registrech do zálohy. A je hotovo.

Jenže co se stane, když třeba:

  • data na disk se z Active Directory zapisují asynchronně, takže pokud DC zrovna klekne/zdechne/spadne/vypadne elektřina, tak se nové heslo do AD ve skutečnosti neuloží. Po příštím náběhu je v AD stále ještě heslo staré, zatímco stanice už chce používat jen to novější. V tomto případě se třeba i nadále dá na stanici dostat ze sítě, zatímco stanice si už nedokáže stahovat sama politiku.
  • co když upadne TCP spojení zrovna v okamžiku, kdy si AD uložilo heslo u sebe? V ADčku je heslo nové, stanice ale nedostala potvrzení o změně. Stanice tedy nové heslo u sebe neuloží a bude používat i nadále heslo starší. Což už použít nejde, protože AD má heslo novější, které ovšem stanice nezná. A šmitec.
  • stejně tak registry na stanici, ty se také zapisují na disk asynchronně. Takže pokud hned po změně dojde k výpadku proudu na počítači, tak se registry neuloží a opět stanice nové heslo nezná, zatímco na DC je přepsané.

A tak bych nmohl pokračovat. Nicméně síťové výpadky jsou nejspíš ten nejčastější důvod. Uvědomte si, jak často lidé přechází s notebookem z kabelu na wifi a na jinou wifi, a která také často padá. Síťová zařízení jsou občas přetížena atd.

Je to jen občas, ale ochrana proti tomu není žádná. Samozřejmě by mohl Microsoft vyvinout nějaký robustní transakční systémy, kdy se jak na AD, tak na počítačích tyto změny dokázaly roll-backnout v případě výpadků, ale to je tak složité a přitom neúspěch tak málo pravděpodobný, že to prostě řešit nechtěli.

Jednoduše si heslo resetnete, když se to projeví a hotovo.

Zajímavé je samozřejmě, že se to děje i na DC samotných. DC má také svůj účet, heslo v registrech a heslo v AD. Sice oboje na jedné mašině lokálně, ale procedura je stejná. I lokálně můžete mít výpadky proudu, pády služeb, nebo výpadek síťového spojení (zakvedlejte kabelem, nebo vypněte switch, uvidíte).

Snapshot, imidž, checkpoint

Prosím vás, i tohle je jeden z důvodů, proč nepoužívat virtualizační snapshoty, checkpointy, nebo diskové image, a jak je to nejisté. Možná vám virtualizace nabízí různé ochrany typu GenerationID, ale pokud vrátíte staré heslo, tak není cesta, jak to "samo"opravit a musíte stejně zasáhnout ručně.

červen 20
Skupiny na španělském serveru

Tak u nás aspoň překladatelé nekouří při práci a i když překládají jména systémových služeb​, tak aspoň nesahají na jména skupin. To už je moc, řekl bych:



květen 15
TechEd 2018 - řešení nedostatků z přednášky o účtech pro služby

Tak jsem to dořešil, trvalo to cca 5 minut. Sakra, to se tak na přednáškách stává :-)

​a) nejprve mi nešel NIRSOFT nástroj NETPASS, který mi měl zobrazit hesla naplánovaných úloh. Nojo, jenže já jsem spouštěl omylem 32bitovou verzi. NETPASS64 funguje v pohodě.

b) nemohl jsem se také dostat do webové aplikace, kterou jsem přenastavil, aby běžela pod Group Managed Service accountem (gMSA). A přitom bylo vidět, že Kerberos už funguje a ticket mi to vydalo na klientovi v pořádku. Nojo, jenže ona ta aplikace původně běžela pod účtem IIS APPPOOL (ApplicationPoolIdentity) a zůstala jí zapnuta Kernel Mode autentizace. Když jsem ji vypnul, tak se to rozběhlo.

Jsem prostě jenom chaotik :-)

květen 15
TechEd 2018 - Slajdy ze všech přednášek

Jsou (nebo přesněji budou) k nalezení zde https://www.sevecek.com/presentations/teched2018

Postupně to aktualizuji, takže například do Fiddleru jsem přidal registrové klíče k vypnutí Extended Protection for Authentication (neboli Channel Binding) pro RD Gateway

květen 14
TechEd 2018 - Přednáška o Fiddleru

​Slajdy k přednášce o tom, jak jednoduše používat Fiddler k průzkumu HTTPS komunikací, bez ohledu na to, jestli to je prohlížeč, nebo GUI program, si můžete stáhnout zde.

Současně je zde zdrojový kód skriptu pro nastavení proxy (ať už to je Fiddler nebo něco jiného). Baťáček je zajímavé také tím, že si umí sám požádat o zvýšení UAC oprávnění (elevate - spustí se podruhé zvýšeně pomocí parametru -Verb runas):

fiddle.bat

@ECHO OFF

IF "%1" == "noElevate" GOTO NoElevate

powershell -NoLogo -ExecutionPolicy Bypass -Command "Start-Process %~d0%~p0%~n0.bat noElevate -Verb runas"
GOTO Exit

:NoElevate

powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1"

:Exit

fiddle.ps1

[string] $fdl = (Read-Host 'Fiddler machine name (or [-] to reset proxy)').Trim()

if ($fdl -eq '') {

  $fdl = 'localhost'
}

if (($fdl -ne '-') -and ($fdl -ne '[-]')) {

  if ($fdl -notlike '*?:?*') {

    $fdl = '{0}:8888' -f $fdl
  }

  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer $fdl
  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable 1

  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer $fdl
  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable 1

  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer $fdl
  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable 1

  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer $fdl
  Set-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable 1

  # Note: for example, the "Bypass proxy for local addresses" would be specified as 
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyOverride
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyOverride
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyOverride
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyOverride

  netsh winhttp set proxy $fdl | Out-Null

  $remoteFdl = $fdl.Split(':')[0]
  if (($remoteFdl -ne 'localhost') -and ($remoteFdl -ne '127.0.0.1')) {

    $remoteAdmin = (Read-Host 'Credentials to make Fiddler certificate trusted (or nothing to skip)').Trim()

    if (($remoteAdmin -ne '') -and ($remoteAdmin -ne '-')) {

      $remotePwd = (New-Object System.Management.Automation.PSCredential ('DummyLogin', (Read-Host 'Password' -AsSecureString))).GetNetworkCredential().Password

      [System.Management.ConnectionOptions] $wmiRegOptions = New-Object System.Management.ConnectionOptions
      $wmiRegOptions.Impersonation = [System.Management.ImpersonationLevel]::Impersonate
      $wmiRegOptions.Username = $remoteAdmin
      $wmiRegOptions.Password = $remotePwd
      $wmiRegOptions.EnablePrivileges = $true
      [System.Management.ManagementScope] $wmiRegScope = New-Object System.Management.ManagementScope (('\\{0}\root\default' -f $remoteFdl), $wmiRegOptions)
      $wmiRegScope.Connect()
      [System.Management.ManagementClass] $wmiReg = New-Object System.Management.ManagementClass ($wmiRegScope, 'stdRegProv', $null)

      [System.Management.ManagementBaseObject] $wmiRes = $wmiReg.EnumKey(2147483650, 'Software\Microsoft\SystemCertificates\Root\Certificates')
      foreach ($oneThumbprint in ([string[]] $wmiRes.sNames)) {

        $wmiRes = $wmiReg.GetBinaryValue(2147483650, 'Software\Microsoft\SystemCertificates\Root\Certificates\{0}' -f $oneThumbprint, 'Blob')
        [Security.Cryptography.X509Certificates.X509Certificate2] $oneCert = New-Object Security.Cryptography.X509Certificates.X509Certificate2 @(, ([byte[]] $wmiRes.uValue))

        if ($oneCert.Subject -eq 'CN=DO_NOT_TRUST_FiddlerRoot, O=DO_NOT_TRUST, OU=Created by http://www.fiddler2.com') {

          $rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store ('Root', 'LocalMachine')
          $rootStore.Open('MaxAllowed')
          $rootStore.Add($oneCert) 
          $rootStore.Close()
        }
      }       
    }
  }

} else {

  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable

  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-19\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable

  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable

  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyServer
  Remove-ItemProperty 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable

  netsh winhttp reset proxy | Out-Null
}

Write-Host ('')
Read-Host 'Press ENTER to exit'

 

květen 02
Žvejk

Rozhodl jsem se, že konečně vyřeším letitý problém termínu hash. Buď se to musí používat v prvním pádu, nebo se počeští a skloňuje, což je ještě horší. Bohužel čeština nezná (nebo možná jen já neznám) slovo pro to, co vznikne v ústech po rozkousání a proslinění sousta potravy před tím, než je to odesláno dolů hltanem, nebo vyplivnuto, pokud při zpracování narazíme na něco nechutného. Takže nově zavádím termín:

žvejk

Odpovídající slovesa zavádím:

sežvejknout, žvejkat

Záměrně jsem vybral nespisovnou formu (tedy až do tohoto okamžiku, kdy se to zespisovnilo), aby to bylo v technické dokumentaci jasně čitelné a rozeznatelné na první pohled.

Příklady užití

Dnes už prohlížeče vyžadují certifikáty číslicově podepsané za pomoci moderních žvejků jako je SHA256. Otisk certifikátu se ale stále provádí žvejkem SHA-1, který je k tomu účelu stále dostatečně bezpečný a přitom nabízí výbornou míru slučitelnosti.

Dokument se sežvejkne pomocí SHA256 a to se číslicově podepíše pomocí RSA.

Hesla se obvykle ukládají ve tvaru žvejků. Pokud získáte žvejk hesla, můžete ho zkusit prolomit hrubou silou pomocí různých 3D GPU žvejkaček, nebo zkusit nějakou duhovou tabulku.

duben 13
Co jsou osobní údaje a co musíme chránit

Ach jo. Lidi! Nejhorší je, že ani různí právníci a rádoby poradci prostě nětuší, co to jsou osobní údaje. Takže GDPR definice podle článku 4, odstavec 1:

„osobními údaji“ veškeré informace o identifikované nebo identifikovatelné fyzické osobě ...

Veškeré!

Osobním údajem je tedy také historie nákupů ve vašem e-shopu, detaily o vaší půjčce, informace o tom, že jste si v masně koupili dva párky, že vlastním kolo značky Merida staré 11 let, že můj synek se jmenuje Janek, že máte rádi pálivej stejk, co si stahujete za filmy a které novinové články jste si přečetli, i když jste je nelajkovali, že jste byli na služební cestě v Mnichově, fotka vaší boty i fakt, že pracujete ve firmě XY, značka SPZ vašeho rodinného vozu, hodnota faktury za plyn, teplou vodu a telefon, nebo faktura za novou koupelnu.

Ani jedno z toho předchozího není identifikující údaj. To sice znamená, že podle této informace vás asi nikdo přesně neidentifikuje, nejspíš ani podle kombinace těchto údajů. Ale jsou to pořád vaše osobní údaje a musí požívat dostatečnou ochranu.

Takže není potřeba chránit jenom emailovou adresu a telefonní číslo a fotky obličejů. Ano, to jsou ty identifikující údaje. Ale uvědomte si, že únik samotných identifikujících údajů sám o sobě není zrovna to riziko, kvůli kterému tady GDPR přichází a vůbec stávající ochrana osobních údajů dávno je.

To že unikne seznam emailových adres ohrožuje koho a jak? Jo mohl by vám chodit spam. Tý jo, tak to se třesu strachem. Naopak únik těch prvních neidentifikujících údajů, které je skrze nějaký identifikující (nebo jejich kombinaci) možné navázat na fyzickou osobu, je to skutečné riziko.

Tzn. pokud unikne seznam jmen plus hodnota faktury za stavbu nové koupelny, ohrožuje to fyzické osoby například tím, že se zloději domáknou těch bohatších a půjdou se k nim podívat. Sousedé vám budou závidět a pomlouvat vás, za co utrácíte. Ohrožuje to i ty chudší faktury, protože se jim budou ostatní posmívat, že mají sračkovou koupelnu. Pokud někdo vystaví na netu seznam jmen a SPZ, jasně vás budou někteří hejtovat pokud pojedete někde rychle, pomalu, nebo budete stát, nebo předjíždět, nebo naopak předjíždět nebudete.

Takže chránit je potřeba všechny informace o fyzických osobách, které jsou na tyto osoby nějak, jakkoliv, identifikovatelné.

Při hodnocení úniku je potom potřeba si uvědomit co skutečně uniklo. Ne jestli unikl seznam emailů, hesel a fotek. To jsou všechno jen identifikující údaje, které moc rizika nepředstavují (kromě případu, kdy na fotce máte obřího jebáka co se zrovna chystá prasknout, nebo se drbete na zadku hřebínkem pro panenky).

Aby to byl únik, není ani nutné, aby identifikovatelnost osob byla nějaká "širokopásmová". Stačí, že se někdo, kdo o někom jiném něco nevěděl, je schopen o něm něco dozvědět :-)

Takže si buďte jisti, že i reklamní bilboard Lidl s nabídkou "každá pokladní 25 000+" je tedy kurva zveřejnění osobních údajů! Jestli je kdokoliv schopen přijít do Lidla a vidí tam pokladní, nebo ví, že jeho sousedka je tam pokladní, tak se právě dozvěděl, že ta osoba vydělává 25+.

říjen 25
Nesmysly a skutečná rizika

Už mě začíná otravovat ta šou ohledně KRACKu. Určitě jste o tom taky slyšeli. Prostě jde dešifrovat WPA2. A co jako?

Ono se WiFi snad někdy považovalo samo o sobě za nějak bezpečné? Vždyť to byla vždycky jenom otázka alespoň trošku porovnatelné bezpečnosti s kabelovým ethernetem. Nic lepšího. O nic lepšího se nikdo ani nesnažil. Bylo snad od jakživa jasné, že bez VPN nebo TLS nebo IPSec se vevnitř neobejdete. Na bezpečnost WPA2 doufám nikdo nezávisí.

Takže co je KRACK? Je to prostě jenom pěkná vědecko-kryptologická chyba.

Je tu ale mnohem lepší chyba

https://crocs.fi.muni.cz/public/papers/rsa_ccs17

1 - 14Next
>