Posted in: Základy PowerShellu

Runas v PowerShellu

Určitě jste se octli v situaci, kdy je potřeba spustit něco jako jiný uživatel. V GUI je to jednoduché, stačí kontextové menu, ale má to háček, na PC se načte v minimální podobě profil daného uživatele, jak na to bez toho? Řešením je PowerShell nebo cmd, kdy v CMD místo proměnné zadáte username přímo do příkazu runas.

$ucet = Read-Host -promt "Zadej login"
Runas /noprofile /user:$ucet "powershell.exe"

Z PowerShellu pak už pod daným uživatelem spustíte cokoliv. Když bych chtěl napsat runas korektně PowerShellově, tak by to vypadalo takto:

Start-Process powershell.exe -Credential (Get-Credential) 

Nevýhodou zápisu výše je, že se chová jako GUI, tedy dojde k naštení minimální potřebné části profilu uživatele.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1

Úprava času pro zadání hesla do Windows

Jak jistě víte, doba, za kterou musíte stihnout zadat přihlašovací údaje do systému Windows je omezena, takže se vám opět ukáže přihlašovací obrazovka, i když jste velmi pomalými úhozy nepřestali psát a můžete začít znovu. Výchozí nastavení je vyladěno velmi dobře, proto většina lidí tento stav nikdy nezažije, pokud nepřeruší úkon přihlašování se.

Problém jsou lidé, kteří mají různé tělesné postižení, jež jim ztěžuje práci s počítačem a např. psaní na klávesnici je pro ně opravdu velmi náročnou a hodně pomalou činností. Pro tyto lidi je zde primárně Windows Hello, které jim umožní přihlásit se obličejem, otiskem prstu či krátkým pinem, ale co dělat, když z nějakého důvodu není technologie k dispozici?

Pomocí registrového klíče HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
je možné nastavit v milisekundách dobu pro zadání hesla. Konkrétně pomocí hodnoty IdleTimeOut typu DWORD, kam se zadává čas v milisekundách, po který má být možné vyplňovat přihlašovací údaje.

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Správa automatického spouštění aplikací PowerShellem

Všichni čas od času řešíme, co se nám spouští spolu s přihlášením, no startem systému. Často jsou to chtěné funkcionality, jako třeba OneDrive, ale např. Teams již chtěné být nemusí a spousta dalších aplikací zrovna tak. Běžně se tyto problémy dají řešit pomocí Autoruns od Sysinternals, správcem úloh, nebo složitěji přes registry, služby a specifické složky. Ale jak to řešit na vzdáleném počítači? Když vynecháme RDP, AnyDesk a další, které připojí pracovní plochu jiného PC, zbyde nám PowerShell a editor registru (pokud je povolná vzdálená správa registru). A právě o možnostech PowerShellu to dnes bude.

PowerShllem máme 2 možnosti řešení, tu komplexnější, kdy využijeme vzdáleného připojení pomocí Enter-PSSession -ComputerName <název počítače>, nebo budeme využívat parametr ComputerName. Níže budu popisovat řešení přímé připojení se k danému stroji pomocí Enter-PSSession.

Automaticky spouštěné položky vypíšeme následujícím příkazem:

Get-CimInstance Win32_StartupCommand | Select-Object Name, command, Location, User | Format-List

Bližší informace k příkazu Get-CimInstance jsou v dokumentaci. Příkaz Get-CimInstance podporuje parametr ComputerName. Pokud ve výstupu bude uvedeno jako Location: common startup location, jde o cestu: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Většina položek ovšem povede do registrů. Pro práci s registry se nám budou hodit následující příkazy:

  • Get-ItemProperty -Path <doplň>
  • Remove-ItemProperty -Path <doplň> -Name <doplň>

Pokud naopak budeme chtít něco do autoranu přidat, např. Outlook, tak do registrového klíče doplníme záznam příkazem: New-ItemProperty -Path <doplň> -Name <doplň> -PropertyType <doplň> -Value <doplň>

Posted in: Windows server

Manuální odebrání certifikační autority v AD

Dnes se chci podělit o postup odebrání certifikační autority v existující doméně, když z nějakého důvodu zkolabuje a nelze obnovit (poškození OS a zálohy). Pokud je to jen trochu možné, odebírejte certifikační autoritu dle pokynů MS (viz dokumentace). Níže uvedený postup je opravdu riskantní, protože můžete poškodit jinou certifikační autoritu v doméně, doporučil bych jej ve chvíli, kdy zkolabovaná autorita byla jedinou autoritou provést dříve, nežli do domény nasadíte novou autoritu.

Praktický celý postup zvládneme v konzoli Active Directory Sites and Services, kde je potřeba mít zobrazené služby.

Pro práci budeme potřebovat větev Services\Public Key Services, kde se budeme pohybovat. S mazáním začneme ve větvi AIA uvnitř Public Key Services, kde najdeme objekt autority, kterou chceme smazat, klikneme na něj pravým tlačítkem a dáme Delete.

Nyní se přesuneme do větve CDP, kde najdeme kontejner odpovídající autority a celý jej smažeme.

Dále pokračujeme ve větvi Certification Authorities, kde smažeme objekt odpovídající autority. Pokud je odebíraná autorita podřízenou autoritou, je potřeba ověřit všechny vazby před smazáním objektu.

Dalším krokem je smazání objektu dané certifikační autority ve větvi KRA.

Posledním bodem práce v této konzoli je pak odebrání objektu autority v Enrollment Service.

Definitivní tečkou je pak odebrání autority v atributu domény, které již provedeme pomocí PowerShellu. Na tento příkaz již potřebujete oprávnění Enterprise admina.

$doma="<zadej název domény před tečkou>"
$top="<zadej název domény za tečkou>"
certutil -viewdelstore "ldap:///CN=NtAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=$domena,DC=$top?cACertificate?base?objectclass=certificationAuthority"

V příkazu certutil výše přeci je doporučuji proměnné zaměnit za konkrétní hodnoty, kterých by nabývaly. Pokud Příkaz proběhne správně, zobrazí se seznam certifikátů všech certifikačních autorit v prostředí, vybereme požadovaný certifikát a potvrdíme OK.

Zdroj

Vlastní zkušenost s tímto úkonem a článek: Ruční odebrání starých odkazů na certifikační autority ve službě Active Directory | Řešení zabezpečení od Microsoftu (wordpress.com), ze kterého pochází obrázky, protože snímky z produkčního prostředí použít nemohu.

Posted in: Windows server

Přihlašovací hodiny

Dnes se chci podělit o to, jak pomocí PwerShellu hromadně přenastavit, nebo vypnout přihlašovací hodny, tedy omezení, kdy se daný uživatel může v síti hlásit. Tato nastavení není v AD žádnou novinkou a důvody nastavení mohou být buď politické (požadavek vedení), nebo bezpečnostní, protože v době, kdy se uživatel nemůže hlásit, nemůže ani spouštět plánované akce a nelze jeho účet zablokovat pomocí chybného zadávání hesla. Toto nastavení by se nemělo za žádných okolností zadávat administrátorským účtům a BFÚ (obyčejným) účtům administrátorů, aby bylo možné kdykoliv reagovat na jakoukoliv situaci.

Pokud je firma s jednosměnným provozem, tak dává smysl, aby všechny zaměstnanecké (nikoliv adminské a servisní) účty byly uzamčené přes noc a pokud firma běžně pracuje od pondělí do pátku, tak také přes víkend. Toto nastavení pomůže snížit riziko kybernetického útoku, protože útočníci se snaží firmy napadat v době, kdy na ně interní IT nebude reagovat. Ve školním prostředí pak dává smysl omezit všem žákům možnost přihlášení na dobu od 7 do 16 hodin (možná 17 hodin), čímž nemusím jako admin řešit, kdo má nultou hodinu a kdo odpoledku.

Jak na to hromadně?

Začneme tím nejjednodušším a to je návrat k výchozímu stavu, tedy přihlášení povolení 24/7 všem uživatelům. Na to nám stačí jednoduchý příkaz:

#Nastavíme proměnou hours na 25/7
[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255)
Get-ADUser -Filter * | Set-ADUser -Replace @{logonhours = $hours}

Jak vyresetovat jen konkrétní OU ukáže následující příklad na OU žáci:

#Nastavíme proměnou hours na 25/7
[byte[]]$hours = @(255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255)
Get-ADUser -SearchBase "OU=Zaci,OU=Uzivatele,OU=Skola,DC=skola,DC=local" -Filter * | Set-ADUser -Replace @{logonhours = $hours}

Jak nastavit pro všechny žáky povolení přihlášení jen v pracovní dny od 7 do 16?

[byte[]]$hours = @(000,000,000,192,127,000,192,127,000,192,127,000,192,127,000,192,127,000,000,000,000)
Get-ADUser -SearchBase "OU=Zaci,OU=Uzivatele,OU=Skola,DC=skola,DC=local" -Filter * | Set-ADUser -Replace @{logonhours = $hours}

Kde vzít ono bytové pole? To je dobrá otázka, která má ve skutečnosti jednoduchou odpověď. Otevřeme si libovolného uživatele a v GUI mu nastavíme přihlašovací hodiny dle libosti, např. takto:

Když vše potvrdíme a uložíme, otevřeme znovu uživatele a podíváme do editoru atributů na atribut logonhours, který dvojklikem otevřeme a necháme si jej zobrazit dekadicky, binární příklad přidávám níže:

Tento výpis, v dekadické podobě, zkopírujeme do proměnné $hours v příkazech výše, čímž dojedeme k tomu, že dle tohoto uživatele můžeme nastavit celé OU nebo celou doménu. A proč jsem vložil binární příklad? Protože si vysvětlíme, jak to funguje.

  • 1 bit = 1 hodina
  • 3 byty (3x 8 bit) = 1 den
  • 168 bit = jeden týden

První 3 byty jsou neděle, druhé 3 byty pondělí atd. Nyní je rovněž jasné, jak vše spočítat a do příakzů výše zadávat rovnou vypočtené hodnoty 😉

Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Oprava opakovaného vyžádání obnovovacího klíče Bitlocker

Dnes jen malá poznámka o problému, se kterým se setkávám a to je, když nástroj Bitlocker si vyžádá kód pro obnovení i po správně zadaném hesle. Nejčastěji je na vině aktualizace, BIOS bez pozastavené ochrany, ale někdy i ovladačů nebo pouze systému. Níže představím rychlé řešení, které lze aplikovat z běžícího systému, nebo z WinPE po odemčení jednotky, viz starší článek.

Začne řešením pro případ, že jednotka se odemyká automaticky pomocí TPM.

manage-bde -protectors -delete C: -Type TPM
manage-bde -protectors -add c: -tpm

Případ, kdy kombinujeme TPM a PIN je obdobný, příkazy níže:

manage-bde -protectors -delete C: -Type TPMAndPIN
manage-bde -protectors -add c: -TPMAndPIN

Byť to nemusí být nezbytné, doporučuji po této operaci znovu zálohovat klíč pro obnovu. Jak tomuto stavu předcházet? Na 100% to nelze, ale nejčastěji je na vině aktualizace BIOS, proto před jejím započetím doporučuji Bitlocker pozastavit a po jejím dokončení opět obnovit ochranu.

Posted in: Windows 10, Windows 11, Windows server

Stažení databáze hesel Have i been pwned

Správci systémů někdy potřebují databáze uniklých přihlašovacích údajů k tomu, aby zjistili, zda někdo z jejich uživatelů nepoužívá kompromitované přístupové údaje. Krom různých fór útočníků a pentesterů je jedním z dobrých zdrojů služba Have i been pwned. Dříve se přímo ze stránek této služby nechala stáhnout databáze s uniklými hesly ve formátu NTLM pro kontrolu těchto údajů v AD. Jedním z nástrojů, které umí tyto údaje kontrolovat je DSInternals. Nově web Have i been pwned má aplikaci pro stahování databáze hesel a o tom je tento příspěvek.

Stažená

Pro stažení a samotnou práci s aplikací je potřeba mít .NET6, jak jej instalovat jsem již psal. Pro instalaci downloaderu pak může sloužit např. příkaz:

dotnet tool install haveibeenpwned-downloader --tool-path "C:\Program Files\NET6\Tools"

Stažení databáze hesel ve formátu NTLM

Vlastní stažení databáze do složky aplikace je pak v PowerShellu velice jednoduché, jak ukazuje příklad níže.

#Přepneme se do adresáře aplikace
cd C:\Program Files\NET6\Tools
#Stáhneme hesla
.\haveibeenpwned-downloader.exe -n pwnedpasswords_ntlm
Posted in: Windows 10, Windows 11, Windows 8 a 8.1, Windows server

Výpis oprávnění ke všem SMB share na serveru

Dnes si ukážeme malý kus PowerShellu, který velice usnadní auditování oprávnění na sdílených složkách. Jako první si uvedeme příklad kódu, který vypíše všechny složky, kde je nějak nastaveno oprávnění pro úroveň Everyone:

$SMB = (Get-SMBShare).Name
foreach($n in $SMB)
{
    Get-SmbShareAccess -Name "$n" | where AccountName -EQ Everyone
    
} 

Kompletní výpis pak poskytne odlehčená verze kódu:

$SMB = (Get-SMBShare).Name
foreach($n in $SMB)
{
   Get-SmbShare -Name "$n"   
   Get-SmbShareAccess -Name "$n"   
} 

Bližší informace, jako je cesta a server vkládá do výpisu s oprávněními právě příkaz Get-SmbShare, který lze volat i samostatně k vypsání informací o všech sdílených složkách (bez parametrů) krom oprávnění.

Back to Top