Skip to Content

IT nieuczesane.
category

Category: DevOps/Scripting

skrypty, programy, command line i inne

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.

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.

CSV, SSV… ? ULSLSSV!

Windows_PowerShell_iconwpis z cyklu ‚człowiek uczy się całe życie’ (; od zawsze pluję się, że durny Excel pliki CSV – Comma Separated Value – zapisuje/odczytuje jako Semicolon Separated Value z niewyjaśnionych przyczyn.

okazuje się, że sprawa jest bardziej skomplikowana i to nie jest ani CSV, ani SSV tylko ULSLSSV – czyli User Language Specyfic List Separator Separated Value (;

listSeparator

o ile dla US „List separator” to przecinek, więc dla Amerykanów CSV to CSV o tyle dla Polaków „List separator” to średnik… jest to dodatkowe utrudnienie na które trzeba uważać w skryptach bo mogą uruchamiać je osoby o różnych ustawieniach regionanych. o ile głupotą jest że CSV to SSV kod jest prosty:

a prawidłowo-bezpiecznie, w skryptach trzeba uważać i zamienić to na:

eN.

SecureString

Windows_PowerShell_iconscenariusz użycia

używanie SecureStringów w PS jest poniekąd wymuszone – w taki sposób przechowywane są hasła, np. w credentialsach:

SecureString przydaje się do przechowywania haseł, używanych w skryptach – np. skrypt do automatycznego podpięcia licencji office365, który wymaga podania credsów użytkownika z uprawnieniami co najmniej ‚User Manager’. można hasło zapisać w pliq jako SS a potem wewnątrz skryptu je odczytać i użyć do złożenia credsów:

bezpieczeństwo SS

rodzą się natychmiast pytania o bezpieczeństwo SecureString – czy takie hasło da się odszyfrować i jak łatwo? hasło jest szyfrowane kluczem, który generowany jest na podstawie hasła użytkownika, a masterkey jest przechowywany na komputerze lokalnym. odpowiedzialne jest za to DPAPI – tutaj znajdziecie więcej informacji. klucz jest przechowywany w $env:USERPROFILE\Application Data\Microsoft\Protect\<GUID>. w efekcie

  • plik jest nie do odczytania na innej maszynie
  • plik jest nie do odczytania przez innego użytkownika

czyli nic da ‚wykradzenie’ pliq lub użycie go w kontexcie innego użytkownika.

są potencjalnie metody potrafiące złamać klucz [np. hawkeye inject], ale nie znalazłem praktycznego opisu i na pewno nie są to metody na poziomie script kiddie. można zatem uznać, że jest to świetne narzędzie dla skryptów, które wymagają podania hasła.

addendum

na koniec – jak  odczytać hasło zapisane jako SS? podam dwie metody – dla devów i dla opsów (;

dla devów:

dla opsów:

po zbudowaniu obiektu credential z wcześniejszego przykładu, mamy zmienną $creds

eN.

port ping upd

Update-icon

update do poprzedniego wpisu – można bez tooli zewnętrznych zrobić tą samą operację przy pomocy test-netConnection

ziemq, dzięki za update (:

ale o co cho z captchą – nie wiem. testowałem i nie mam żadnych obrazqw q:

eN.

dopełnienie zerami

Windows_PowerShell_iconprzykładowy scenariusz: mamy notację nazewniczą serwerów ze stałym prefixem ‚server’ oraz jego kolejny numer – liczba z dopełnieniem zerami do trzech znaków. np. server001, server002[…],server011[…],server12o[…]

problem: jak skryptem łatwo wygenerować takie nazwy?

rozwiązanie: i na to oczywiście jest skrót/automat w PS (: potrafi to funkcja ‚toString’ – wystarczy jako parametr podać ilość zer odpowiadająca dopełnieniu.

eN.

 

 

PowerShell dla początqjących cz.2

MVAmiło mi poinformować, iż dostępna jest kontynuacja szkolenia z PowerShell dla początqjących na MVA.

serdecznie zapraszam do drugiej części z cyklu PowerShell dla początqjących.

eN.

RemoteSigned i ADS

Windows_PowerShell_iconpo ściągnięciu skryptu z Internetu może być problem z jego uruchomieniem – zależnie od polityki uruchomienia (Execution Policy). imho optymalnym ustawieniem jest ‚RemoteSigned‚, który pozwala na swobodne uruchamianie skryptów, które się samemu pisze oraz tych zassanych z netu pod warunkiem, że są podpisane certyfikatem. skrypty podpisane certem są jak białe kruki – podobno istnieją. jednak jest to zabezpieczenie przed tym, aby bezmyślnie nie uruchomić pierwszego-lepszego chłamu i chwilę się zastanowić.

a skąd system wie, że skrypt jest ściągnięty z netu? o tym już kilqkrotnie pisałem – informacja zapisana jest w Alternate Data Stream o nazwie ‚zone.identifier’. łącząc te dwa klocki w całość, po weryfikacji tego, co skrypt robi, można usunąć informację, iż jest ściągnięty:

natomiast nie polecam ustawiania polityki na ‚unrestricted‚ – mimo wszystko takie proste mechanizmy, zmuszające do krótkiego przemyślenia tego, co się robi, bywają przydatne…

eN.

 

%d bloggers like this: