Skip to Content

IT nieuczesane.

prawdziwy PS guru

https://geekeefy.wordpress.com/

eN.

hack the hash – master level

Windows_PowerShell_iconpoprzedni konqrs okazał się zbyt łatwy. no to kto będzie prawdziwym cwaniakiem i rozkmini na tym poziomie? tym razem trochę wiedzy o:

  • rekurencji
  • zakresach zmiennych
  • praktyka
  • i kolejna zagadka (;

poprzedni wpis zainspirowany został podczas poprawiania skryptu.. czy też pisania go od nowa, który gdzieś tam wewnątrz miał funkcję budującą listę użytkowników grupy distribution:

jak widać jest to rekursywne zapytanie, w wersji ‚czyste zło’. zło, które zostało wskazane w odpowiedzi przez bula – tak na prawdę funkcja nie zwraca jednej zmiennej, tylko całą serię zagnieżdżonych zmiennych. zwróćcie uwagę, że wewnątrz funkcji jest deklaracja ‚$members=@()’ – czyli przy każdym kolejnym zagnieżdżeniu tworzy się nowy ‚$members’. w efekcie, nie dość, że technicznie nie ma jednego wyniq a seria wyniqw, to jeśli osoba należy do wielu grup, pojawi się wiele razy. jeśli okaże się, że grupy są gdzieś zapętlone, co przy skomplikowanej strukturze może się wydarzyć, to skrypt będzie leciał w nieskończoność [grupa A należy do grupy B, B do C, C do A – pętelka. AD pozwala nawet na A do B i B do A – nie ma tutaj weryfikacji].

rekursja jest również zła ze względu na obsługę pamięci i możliwość przepełnienia stosu. to trochę zabawne [i frustrujące] ale na pierwszym roq, na programowaniu uczono mnie rekurencji. potrzebowałem duuużo czasu i dobrego przykładu aż w końcu zrozumiałem. bo jak mówi stare przysłowie – ‚rekurencję zrozumiał ten, kto zrozumiał rekurencję‚. a jak już zrozumiałem, to ten sam wykładowca [Ś.P. prof. Bielecki] poświęcił następny semestr na wyjaśnianiu czemu rekurencja jest zła, czemu należy jej unikać i jak z niej wychodzić… w skrócie – nad wywołaniem rekurencyjnym na prawdę trudno zapanować, chyba że ktoś umie myśleć jak implementacja zagnieżdżonego stosu.

anyway… najprostszą metodą, jest po prostu wyrzucenie zmiennej do wspólnego zakresu [scope]. zmienne mają swoje ‚skołpy’, co najlepiej widać właśnie przy rekursji. ale w prostym przykładzie:

output to: 2,1 . wewnątrz funkcji ‚test’ są dwie zmienne $a – ta wewnątrz funkcji i ta zadeklarowana na poziomie skryptu. słowa ‚globalnie’ unikam świadomie, ponieważ są trzy podstawowe poziomy: global, script, local. więcej tutaj.

fajnym testem rekursji+zakresu jest taki przykład:

co wyświetli się na ekranie? spróbuj wymyślić, odpal kod, sprawdź… jeśli nie jesteś zaskoczony – to jesteś unikatem, który na prawdę zajebiście rozumie działanie stosu. ale to nie była końcowa zagadka. do tego jeszcze dojdę.

…. a nie będę pisał na razie dalszej części. zostawię w tym miejscu bo tłumacząc zepsuję zabawę, a dzięki temu ilość zagadek się zwiększy q:

czyli kolejna zagadka i kontynuacja przeróbki skryptu – jakoś na dniach ^^

hef fan

eN.

 

hack the hash

taki mały konqrs. jest sobie hash-tablica:

$a=@{}

cechą hashtable aka tablicy słownikowej jest to, że klucze w niej są unikalne – stąd nazwa ‚słownikowa’. przykład:

przy próbie dodania drugiego klucza o tej samej nazwie, dostajemy błąd. jasne.

no to teraz taki hack the hash:

i okazuje się, że są dwa klucze o tej samej nazwie!

pytanie konqrsowe – jak to możliwe? (:

odpowiedź… jak mi się przypomni q:

eN.

get-MACAddressVendor

Windows_PowerShell_iconadresy MAC to tzw. OUIs – Organizationally Unique Identifier przyznawane przez IEEE. wszystkie można ściągnąć w postaci pliq textowego (1oMB). w związq z tym skrypt, który odpytuje się o MACa może albo wykorzystać jakieś query dostępne w necie, albo ściągną bazę lokalnie i operować na lokalnym pliq.

plik można ściągnąć na kilka sposób. w tym przypadq invoke-webRequest się wywala ze względu na timeout [duża wielkość pliq]. można zmienić timeout, można oprogramować metodę [System.Net.WebClient] … a można wykorzystać BITS.

poniżej prosty skrypcik, do weryfikacji MAC vendor, po uprzednim zassaniu oui.txt lokalnie. to na co warto zwrócić uwagę – to alternatywny sposób na pobieranie pliqw z netu, oraz parametr ‚context’ dla select-string.

get-MACAddressVendor.ps1

eN.

 

 

what-is-my-ip – kontunuacja

Windows_PowerShell_iconpo  komentarzach na FB, zamieszczam prosty skrypt, który pozwala odpytać dwóch różnych stron – whatsmyipaddress, API, które zwraca czysty adres, ale ponieważ:

You may programmatically query that server but limit queries to no more than once per five minutes and include an appropriate user agent that will allow us to contact you if needed

dodałem starą metodę przegrzebującą się przez HTML.

get-ExternalIP.ps1

eN.

mała-wielka zmiana. MS16-072

chaoswyszła ostatnio poprawka, która zabezpiecza przed pewnymi scenariuszami MitM attacks. mniejsza-o-większość, szczegóły można doczytać na technecie, a ja chciałem się sqpić nad pewną drobną konsekwencją, która może sporo namieszać.

po zainstalowaniu tej poprawki, przestają działać te polisy, które filtrowane są na podstawie uprawnień dla poszczególnych obiektów, i nie posiadają dodanego ‚authenticated users: Read’ . w efekcie po wylistowaniu gpresult, pojawia się komunikat: ‚not applied (unknown)’ .

oczywiście – wedle ‚best practices’ nie powinno się nigdy zdejmować tego uprawnienia, a tylko wyrzucać ‚apply’, niemniej nigdy nie stanowiło to problemu.

widziałem już różne dziwne metody stosowania GPO u klientów – tak dziwne, że patrzyłem i nie wierzyłem, że można coś tak dziwnego wymyślić. efekt tego, że jakiś admin-samouk zaczął coś w pokrętny sposób wdrażać, a potem trzeba to było kontynuować, bo oczywiście posprzątanie to ryzyko i chaos. w takim środowisq, ta mała zmiana, będzie miała olbrzymi wpływ. dotknęło to również środowiska jednego z obecnych klientów, gdzie ktoś dzięki dziwnemu zestawowi uprawnień wdrożył polisy terminalowe w zupełnie odwrotny sposób – zamiast stworzyć GPO na komputer z ‚loopback processing’, zrobione były polisy na użytkowników, z wyciętymi uprawnieniami dla komputerów. nadal nie jestem pewien, jakim cudem to w ogóle działało… przyszła poprawka i wymusiła porządki.

to tak jakby ktoś miał wątpliwości, czemu warto stosować proste, prawidłowe metody, zamiast dziwolągów, bazujących na nieudokumentowanych testach – po prostu z-dnia-na-dzień mogą przestać działać.

eN.

mój zewnętrzny IP

Windows_PowerShell_icondość częste pytanie, jak się ma dynamiczny adres IP. najłatwiej oczywiście wejść na jakąś stronę, która ten adres pokazuje. ale lepiej napisać sobie skrypt (:

nie jest to skomplikowane, wystarczy użyć invoke-webRequest, który jest świetną przeglądarką textową. do testów wybrałem stronę ‚http://whatismyipaddress.com’ ale można wybrać dowolny inny. po wejściu od razu widzę, że jestem przekierowany na ‚http://whatismyipaddress.com/pl/moj-ip’. żeby oszczędzić sobie trochę grzebaniny robię inspekcję elementu, gdzie jest adres i widzę. że jest to DIV o ID=’section_left’. można to olać, ale przyda się żeby trochę zawęzić wyszukiwanie.

teraz z linii poleceń.

na początek trzeba się zaznajomić z obiektem więc warto sprawdzić:

polecam sprawdzić jeszcze $page.links oraz $page.images – może się kiedyś przydać. po wykonaniu

będzie już widać kawałek interesującego kodu. teraz trzeba wyłowić IP. do tego celu warto zrobić wyrażenie regularne, bo do tego są niezastąpione. np. takie super-proste, które po prostu szuka czterech liczb oddzielonych kropką, gdzie każda liczba ma od 1-3 cyfr:

do celów skryptu można by się poważyć o napisanie porządnej walidacji, czyli dodatkowo, żeby te liczby miały wartości od 1-255. ale to nie ten wpis. po przepuszczeniu wyniku będzie wyświetlone IP:

można teraz się dalej bawić, potestować na innych stronach, analizując elementy zwracanej strony. nie takie trudne (:

eN.

Jak szybko wygenerować certyfikaty dla Always On

Zadanie niby trywialne – skonfigurować TLS na SQL Server z grupami Always On. Chwila szukania i wiem co musi mieć template certyfikatu. https://technet.microsoft.com//en-us/library/ms189067(v=sql.105).aspx#Anchor_2 mówi, że jest potrzebne m.in.

The certificate must be meant for server authentication. This requires the Enhanced Key Usage property of the certificate to specify Server Authentication (1.3.6.1.5.5.7.3.1).

Pech chciał, że akurat miałem pasujący template, który poza tym pozwalał na client authentication i postanowiłem go użyć. Niestety takie podejście okazało się skuchą bo certyfikat musi mieć wyłącznie OID 1.3.6.1.5.5.7.3.1 . Jeśli pojawi się cokolwiek innego to koniec, kaplica, bez szans. SQL go nie uzna i nie pozwoli na użycie do szyfrowania połączeń. Z punktu widzenie bezpieczeństwa ma to sens ale mogło by się gdzieś w dokumentacji pojawić, że leniuchy będę musiały stracić czas na zastanawianie się czemu nie działa. Koniec końców, całkiem nieźle sprawdziłPKI się standardowy template Web Server :-)

Drugim problemem dla leniwego admina pojawia się wygenerowanie requestów z wszystkim nazwami listenerów (purystów przepraszam za moją hiperniepoprawną polszczyznę) na wszystkich serwerach. https://msdn.microsoft.com/en-us/library/hh213417.aspx#SSLcertificates bardzo ładnie podaje, że temat certyfikatu to hostname bądź fqdn serwera a SAN musi zawierać wszystkie nazwy DNSowe listenerów (zarówno skrócone jak i fqdn). I tu pojawiają się dwa problemy (korporacyjnie: wyzwania) bo po pierwsze serwerów jest dużo a po drugie każdy z nich ma po kilkanaście listenerów. Jako, że nie chce mi się tyle klikać w GUI a tym bardziej nie chcę zrobić nigdzie literówki, piszę coś takiego i paroma linijkami kodu ratuję sobie resztę dnia ;)

 

słowo o prywatności

privacytaka anegdotka na chwilę refleksji…

oddałem ostatnio stare kasety VHS i Hi8 do dygitalizacji. przed przekazaniem zapytałem, czy dostanę jakiś certyfikat, zapewniający, że materiał nie zostanie skopiowany ani wykorzystany bez mojej wiedzy. pan się uśmiechną, pokiwał głową i powiedział

‚wie Pan, przez tyle lat przychodziło tu tyle osób, nawet jacyś ambasadorzy, osoby publiczne…. i nikt nigdy nie prosił o takie zaświadczenie…’

eN.

 

nieautoryzowany email do zmiany hasła office365

ciekawy przypadek

firma X qpiła klientowi licencje i założyła tenant office365. projektu nie zrealizowała i przeszedł na nas. pozmienialiśmy wszystkie dane, przepięliśmy konto Global Admina, łącznie z ‚aternative mail address’. można to zrobić z interfejsu, a z PS wygląda to tak:

i niby wszystko załatwione….

ale zupełnie przypadkiem postanowiłem sprawdzić zmianę hasła i moim oczom ukazało się:

Microsoft Online Password Resetprzy czym ten drugi adres, należał do osoby z firmy X.

przeczesałem wszystkie znane miejsca i nigdzie tego adresu nie ma. w panelu o365 również widać tylko podstawowy.

o365 support

bardzo rozczarowało mnie wsparcie o365. wysłałem ticket jako partner obsługujący klienta, z oznaczeniem ‚critical – security breach’. przy każdej wymianie korespondencji były mi proponowane te same kroki, te same pytania, wysłałem screenshoty, wysłałem PSR (problem steps recoder) i nadal dostawałem instrukcję jak zmienić email przez portal o365. po kilq mailach ticket został zamknięty z informacją mniej-więcej ‚ten problem to nie problem’.  nie było eskalacji, po prostu nie potrafił rozwiązać to zamknął. łoś.

rozwiązanie

trochę mi zajęło, ale znalazłem miejsce, gdzie zapisany został drugi adres. trzeba założyć AzureAD [tak na prawdę pod spodem i tak się zakłada, ale cały portal manageazure jest nieaktywny], wyedytować właściwości domeny, włączyć usługę ‚Reset Password’ i przejść do skonfigurowania maila. okazuje się, że jest to oddzielna baza, do której nie ma innego dostępu [?]. poniżej kroki w obrazkach:

  • założenie portalu AAD

EnterAzureAD

  • Przejście do konfiguracji domenyResetPassword00
  • włączenie Reset Password. następnie trzeba przejść na stronę gdzie można skonfigurować dane [zaznaczone]ResetPassword01
  • i już widok samej strony gdzie są skonfigurowane daneResetPassword02

eN.