lunedì 1 aprile 2019

BONUS POST - dsget, dsquery, dsadd, dsmod - usare dsadd per creare molti gruppi di sicurezza in una specifica OU

Buongiorno a tutti e benvenuti a questo nuovo post del blog.
Il mini-post di quest'oggi è una sorta di BONUS TRACK della miniserie sugli strumenti di gestione di Active Directory da riga di comando di cui posto qui i links:



Oggi ho avuto la possibilità di applicare nella realtà un dei miei post recenti riguardo DSADD. Ho avuto la necessità di:

creare più security groups da un elenco, in una specifica OU, con uno script


Mi sono trovato in una situazione in cui dovevo creare numerosi gruppi, di tipo "domain local-security" sotto una specifica Organizational Unit di AD.

Ed ecco che ho "risfoderato" l'articolo che avevo scritto e messo un comando in un FOR:

FOR /F "usebackq delims=;" %a IN ("ADGRoups_daCreare.txt") DO @dsadd group "CN=%a,OU=PEC_MailDocPro,OU=xPermissions,OU=RUOLI,DC=DASItalia,DC=local" -secgrp yes -scope l -desc "gruppo di profilo sicurezza per maildocpro"

Ed ecco il nostro bellissimo risultato: gruppi creati in pochi secondi.
Gli errori sono derivati dal fatto che alcuni gruppi li avevo già creati manualmente.

HAPPY SCRIPTING a tutti!

martedì 12 febbraio 2019

Le potenti hash table di powershell - episodio 2


Buongiorno e benvenuti a questo secondo ed ultimo episodio di questa mini-serie dedicata alle hash table di Powershell.
In questa “puntata” dedicherò un po’ di tempo ai possibili modi di interagire ciclicamente con una hashtable.
Se non avete letto il primo episodio di questa mini-serie, vi consiglio di andare a leggervelo qui.
Detto questo, mettiamoci all’opera.

Ciclare su una hash table – non così diretto

Come potete notare, una hashtable non è una collection di oggetti nuda e cruda, ma ogni voce della hashtable ha un nome e un valore.




Come vedete dalle prove che  ho fatto in questa immagine, non è possibile NEMMENO richiamare la proprietà Name o Value di ogni foreach, mentre è necessario utilizzare il metodo getEnumerator()

GetEnumerator() … …con qualche limite

Ecco quindi venirci in aiuto il GetEnumerator che, tuttavia, impone qualche limite sull’uso di oggetti come chiave. Vedete nell’immagine sopra che, quando il ciclo è arrivato sul punto in cui la chiave è un oggetto , lo script è andato in errore…
Quindi va benissimo usare questo sistema con hashtable testuali, ma quando abbiamo chiavi particolari, meglio usare il metodo che segue…

Il metodo migliore, secondo me: usiamo il metodo .Keys

Con il metodo .Keys della classe HashTable, otteniamo un array di tutte le chiavi. Utilizzando poi la notazione con le parentesi quadre per recuperare i valori dalla array, possiamo ciclare in tutta libertà sulla nostra hashtable.







Bene! Anche per oggi spero di aver stuzzicato la vostra voglia di scriptare e la vostra fantasia.
Happy Scripting a tutti!

domenica 10 febbraio 2019

Le potenti hash table di powershell - episodio 1


Buongiorno a tutti e benvenuti in un nuovo POST del mio blog: “Lo scriptomane”
Oggi parliamo di un bellissimo costrutto del linguaggio powershell: le hash table (o hashtable, le chiamano tutti in entrambi i modi).
Le hash tables sono delle array associative in powershell. Quindi sono delle array con un indice non numerico, ma che può essere testuale, senza un ordine prefissato (salvo creare una [ordered] hashtable, vedere link di approfondimento + avanti), ma che accetta l’inserimento di variabili associate ad un index (o chiave, key).
In powershell le hash tables non sono un tipo di variabile, ma ognuna di esse è un’istanza dell’oggetto System.Collections.Hashtable ed è quindi possibile richiamare ed utilizzare i metodi di quest’oggetto.
Per approfondire potete andare sul sito di microsoft qui.
La sintassi delle hashtable è questa:

@{ = ; [ = ] ...}

Sicchè, come avrete capito, vi possono essere infinite coppie di chiave – valore.
Quest’oggetto veramente interessante di powershell ha una caratteristica molto potente:

Ogni valore può essere qualsiasi cosa: un’oggetto, un’istanza di oggetto, una variabile, un’altra hashtable, etc… INOLTRE ogni chiave, a sua volta, può essere qualsiasi cosa (questo non molti lo immaginano), con poche limitazioni che ne derivano.





In questo senso assomigliano moltissimo alle array di PHP (altro linguaggio a me caro).
Stando così le cose, mi sembra chiaro che, con un po’ di fantasia, è possibile creare oggetti per stoccare ordinatamente un po’ qualsiasi cosa, davvero con pochissime limitazioni.

Come creare una Hash Table in powershell

A questo punto, direi di vedere come si crea una Hash Table. La sintassi è semplicissma:

$toMap = @{}

In questo modo avremo creato una hash table vuota. Oppure

$toMap = @{“chiave”=”valore”; “chiave2”=”valore2”}

… per creare una HashTable già “popolata”.



Come inserire un valore nuovo in una Hash Table in powershell

La sintassi è veramente semplice, si usano le parentesi quadre, indicando la chiave.

$toMap["chiaveNuova"]="valore" # con chiave testuale e valore testuale
$toMap["chiaveNuovissima"]=$user # con chiave testuale e valore oggetto o variabile
$toMap[$user]="prova" # con chiave oggetto o variabile e valore testuale

Se l’indice era già presente all’interno della Hash Table, il valore che viene indicato verrà sostituito, se invece non era presente, il nuovo elemento verrà aggiunto.


Come recuperare un valore da una HashTable in powershell

Ed ecco che, una volta inseriti i valori vogliamo recuperarli… questo è semplicissimo e si può fare con

$toMap["chiaveNuova"]

Ma ecco che c’è subito una casistica particolare e interessante: se usiamo, come chiave, un oggetto, possiamo recuperare il valore anche utilizzando un oggetto identico?

Vi faccio un esempio: da una parte devo usare una hash per immagazzinare determinati parametri di configurazione per un utente, quindi uso l’utente come chiave e il valore sarà un’altra hash table.
Giacché poi ciclo e recupero gli utenti, inserendoli in variabile, posso recuperare i valori di configurazione precedentemente immagazzinati?

Ecco qui un’immagine che vi farà capire meglio cosa intendo:


come vedete, purtroppo, le istanze degli oggetti ADUser non sono IDENTICHE in tutto e per tutto, quindi non possiamo usare questo tipo di oggetto per recuperare un valore da una chiave rappresentata da un’istanza di ADUser dello stesso utente.
Tuttavia, se gli oggetti sono IDENTICI, allora è possibile. Guardate quest’immagine:





… per oggi Finisco qui, dedicherò un approfondimento a brevissimo su come si può ciclare su di un oggetto HashTable.


Happy Scripting a Tutti!

venerdì 8 febbraio 2019

Utilizzare una funzione definita in un file di Powershell


Buongiorno a tutti e benvenuti nuovamente nel mio blog!
Capita spesso, in programmazione e così anche negli script, di creare delle funzioni generiche che ci piacerebbe riutilizzare.

Nei linguaggi di scripting, tuttavia, non sempre è intuitivo capire come “includere” le definizioni di funzioni: ogni linguaggio ha il suo “dialetto”…

Ecco, in breve, come sfruttare questa buona pratica di programmazione, il riutilizzo del codice, con powershell.

Supponiamo, ad esempio, di aver scritto questa funzione dentro un file “FUNZIONI.ps1”:

function echoMyName($user){
      write-host "Ciao, $($user.Name), questo e' il tuo nome e quest'altro e' il tuo ufficio: $($user.Office) "
}

… e di volerla riutilizzare per la nostra amministrazione via powershell o in nuovi script, per riutilizzo del codice (ottima pratica).
Quindi? Ecco qui di seguito alcuni trick per farlo:

Richiamare una function dal file da linea di comando shell

È presto fatto, basta ricordarsi una notazione un po’ particolare. Dobbiamo cominciare con una & e una parentesi graffa, dentro quest’ultima un punto prima del percorso del file che contiene la funzione, quindi il percorso, un punto e virgola (che separa il comando successivo) e
·         La & serve per indicare a powershell che stiamo per eseguire un comando.
·         La parentesi graffa serve per “racchiudere” i comandi in un unico “set di comandi”.
·         Il punto serve per indicare che vogliamo “eseguire” il file PS1 (che conterrà solo definizioni di funzione, quindi non avrà alcun output).
Mi raccomando lo spazio tra il primo punto e il percorso del file
Come di seguito:

& { ..\Funzioni.ps1”;  echoMyName((get-aduser DiegoC))}



Come usare una funzione powershell scritta in un file, su di un loop

Per utilizzare una funzione powershell da un file, però sugli oggetti di un loop, magari i risultati in una collection derivanti da un comando che  abbiamo lanciato.
Per farlo è sufficiente includere i comandi dentro le graffe all’interno di quelle del foreach o del for, così:
get-Aduser -Filter*| foreach { ..\Funzioni.ps1”;  echoMyName($_) }


Come includere un file .ps1 che contiene delle funzioni

Per includere ed usare, in uno script powershell, delle funzioni che avete definito in UN ALTRO file…
È sufficiente usare questa notazione:
. ".\FUNZIONI.ps1"
Da quel momento in avanti potrete usare le funzioni che avete scritto


Bene, spero di aver solleticato anche oggi un po’ la vostra fantasia…
Happy Scripting a tutti!

mercoledì 30 gennaio 2019

Hackerare tutte le password delle reti WiFi memorizzate su un computer


Buongiorno a tutti e bentornati sul mio blog.

A dire la verità, questo articolo me lo stavo serbando per un altro blog che ho intenzione di creare, un blog sulla CyberSecurity applicata. In sostanza vorrei creare uno spazio dove pubblicare news di attualità e soprattutto articoli sui veri metodi di exploit, le anatomie degli attacchi, le riflessioni sul social engineering e vedere, IN PRATICA, da una parte quanto sia facile sfruttare le vulnerabilità per chi sa come fare, dall’altra come ci si può proteggere ed acquisire soprattutto una buona conoscenza di cosa fare e cosa invece no.

Tu, che stai leggendo adesso, cosa ne pensi di questo mio progetto? Dovrei portarlo avanti? Lasciami un commento adesso in fondo a questo articolo, per piacere. Scrivi pure solo: “si, mi piacerebbe il blog di CyberSecurity”, se non hai tempo di scrivere di più. 😊 Grazie!

Ma veniamo a noi: ho promesso di mostrarvi quanto sia facile hackerare le password della wirless di un computer che ci capita sottomano (ovviamente devo dirvi che farlo su un computer che non è il vostro e/o non essendo autorizzati NON E’ LEGALE.  “Uomo avvisato…”).

Salvare la password del wifi su windows NON E’ SICURO, di per se’.

Dobbiamo proteggere l’accesso al nostro sitema, ed essere certi che possiamo usarlo SOLO NOI e persone di cui ci fidiamo… …o almeno controllare quello che fanno gli altri sul nostro sistema, con i nostri occhi e prestando molta attenzione.
A che cosa serve proteggere la vista dell’input della password del wifi su Windows, se poi si recuperano con un semplice script? Serve SOLO a impedire che chi sta guardando il nostro schermo veda quello che digitiamo. Tuttavia ci suggerisce anche un falso senso di sicurezza…
Forse molti di voi ancora pensano che non sia possibile recuperare le password delle reti wireless da un computer. Beh, vi sbagliate.
Il processo non solo è possibile, ma anche in modo semplice e senza autorizzazioni di amministratore.
Il trucco è compatibile con:
·         Windows XP (non ricordo essattamente… qualcuno ha a disposizione un PC su cui provare?)
·         Windows 7
·         Windows 8 e 8.1
·         Windows 10
Quindi, anche non essendo amministratore del vostro PC,  se questo accede alla rete wireless, potete vederla tranquillamente (occhio alla legalità dell’operazione, vedi sopra).

Come vedere tutte le reti wireless a cui si è connesso un PC.

Per elencare tutti i profili wifi memorizzati da un PC con windows 10 è possibile semplicemente usare il comando:

netsh wlan show profile

ed ecco comparirci una lista di tutte le reti wireless a cui ci siamo connessi.


Come vedere i dettagli di connessione di una rete WiFi

Per vedere tutti i dettagli disponibili circa la rete wireless a cui ci vogliamo connettere o che vogliamo scoprire, possiamo lanciare lo stesso comando seguito dal nome della rete:

netsh wlan show profile

ed ecco comparire una sequela di dettagli sulla configurazione della rete e del nostro PC rispetto a quella rete. Ad esempio è possibile vedere se il PC è impostato per connettervisi automaticamente o meno.

Come vedere in chiaro la password di una rete wifi (rimuovere gli asterischi, in sostanza)

Per vedere senza asterischi la password salvata di quel profilo, è sufficiente aggiungere un’opzione alla fine:
key= clear
ed ecco che il comando diventa:

netsh wlan show profile key= clear



… e potevamo fermarci qui! Ma non sarebbe stato da veri “Scriptomani”.

Come hackerare TUTTE le password di TUTTE le reti wireless a cui ci siamo connessi

… anche una sola volta, anche molto tempo fa…. Il nostro PC ha buona memoria!
Ecco che, come al solito, ci vengono in aiuto i comandi di sistema. In questo caso creiamo uno script che, semplice semplice, ci restituisce un elenco completo di tutte le reti wireless con le rispettive password.
Ma ecco qui lo script, in tutta la sua bellezza e semplicità:

@echo OFF
setlocal EnableDelayedExpansion
FOR /F "usebackq delims=: tokens=2" %%a IN (`netsh wlan show profiles`) DO (
set nomeRet=%%a
set nomeRete=!nomeRet:~1!
@netsh wlan show profiles name=!nomeRete! key=clear | FINDSTR /RI /C:"Nome[ ]*SSID" /C:"Contenuto[ ]*chiave"
echo.
)
Pause

Ed ecco l’output dello script, oscurato ovviamente nelle “zone sensibili”:




BENE! Ed ecco che anche oggi abbiamo finito. Spero di aver stuzzicato la vostra fantasia e di aver dimostrato, un’altra volta, che “lo scripting scorre potente in Windows“ e che abbiamo a disposizione comandi per fare pressochè qualsiasi cosa, senza disturbare i signori compilatori, Linux, superprogrammatori, etc, etc…


Detto questo:
“usa lo script, Luke!”
E
Happy Scripting a tutti!

mercoledì 23 gennaio 2019

Eliminare le righe numero X da un file di testo - vbscript

Buongiorno a tutti!
Oggi, in questo brevissimo post, voglio condividere con voi uno dei mitici script che ho creato nel mio “viaggio” come Sysadmin…


Capita a volte di trovarsi a dover manipolare programmaticamente dei file e di doverne analizzare e modificare di davvero ENORMI…

…a questo punto ecco entrare in gioco il mitico scripting, che permette di programmare on-the-fly ed avere il risultato pronto, senza bisogno di scomodare il signor compilatore… 😊


Con questo script è possibile eliminare, da un file di testo MOOOOLTO grande, un elenco specifico di righe.
In pratica mi avevano chiesto di ricevere un file ed un elenco delle righe da eliminare e… bumble bumble magicabula … generare un file corretto…

ma ecco lo script, sperando che possa tornare utile a qualcun altro.

' Elimina le righe numero X da un file di testo. i numeri riga da eliminare li prende da un file di testo. const ForReading = 1 const ForWriting = 2 const ForAppending = 8 set Dic = createObject("Scripting.dictionary") Set objFSO1 = createObject("Scripting.FilesystemObject") Set objFSO2 = createObject("Scripting.FilesystemObject") Set objFSO3 = createObject("Scripting.FilesystemObject") Set myRegExp = New RegExp myRegExp.IgnoreCase = True myRegExp.Global = True myRegExp.Pattern = "regex" percBase="C:\Users\DiegoC\Desktop\TMP\2014-10-21_varie\ScriptAmministrazione\" numFile=4 fileRighe = percBase & "errori file" & numFile & ".csv" fileOrigine = percBase & "contratti_" & numFile & ".txt" fileDestinazione = percBase & "contratti_pulito_" & numFile & ".txt" Set objFileRighe = objFSO1.OpenTextFile(fileRighe, ForReading) Set objFileOrigine = objFSO2.OpenTextFile(fileOrigine, ForReading) Set objFileDestinazione = objFSO3.OpenTextFile(fileDestinazione, ForAppending, True) ' caccia i numeri riga da eliminare in un dictionary 'apri file di testo, e parsalo row-by-row nel dic. (includendo 1) perch� la riga 1 (la zero sarebbe) contiene le intestazioni REM Dic.Add 0, "" Do Until objFileRighe.AtEndOfStream strLine = objFileRighe.ReadLine strArr=split(strLine, ";") strRowToDel=CLng(strArr(2)) strRowToDel=strRowToDel-1 Dic.Add strRowToDel, "" REM wscript.echo " ciaociao " & strRowToDel Loop 'apri il file di destinazione (un nuovo file di testo for append. 'apri il file di origine for reading. i=0 Do Until objFileOrigine.AtEndOfStream 'row by row incrementa puntatore, se puntatore � in dictionary delle righe da eliminare, salta la riga, altrimenti appendila nel file di destinazione. strLine = objFileOrigine.ReadLine REM wscript.echo "riga " & i if Dic.Exists(i) then REM wscript.echo "byebye" else objFileDestinazione.WriteLine strLine end if i=i+1 Loop


HAPPY SCRIPTING!

martedì 22 gennaio 2019

Trovare i file in tutte le sottocartelle con il comando DIR (e filtrarli, se necessario) - episodio 2

Buongiorno e benvenuti a questo secondo episodio della mini-serie dedicata al comando dir.
Se non avete ancora letto il primo articolo, fatelo ora qui

http://scriptomane.blogspot.com/2019/01/dir-avanzato-sottocartelle-1.html



Oggi procediamo con le presentazioni dei vari parametri più o meno sconosciuti di DIR e le loro funzionalità.

Buona lettura!

Come ordinare i files/cartelle per …

Quindi prendiamo l’opzione del comando /O, per ordinare l’output in base ad un attributo. IN questo caso scegliamo la data di ultima modifica. Quindi:

Dir /S /B /OD



… e per ordinare dal più recente:

dir /S /B /O-D



Se vogliamo poi usare una data diversa da quella di ultima scrittura / modifica, possiamo usare l’ulteriore opzione /T, che determina QUALE data usare per l’ordinamento:

C  Creazione
A  Ultimo accesso
W  Ultima scrittura


Come eseguire un comando su ogni file o cartella presente in tutte le sottodirectory

… e, per finire, un tema che, spero, stuzzicherà la vostra fantasia.

Supponiamo di essere stati incaricati di appendere una riga di testo in tutti i files formato TXT contenuti in un albero di cartelle. Questa riga di testo dovrà separarsi dalle precedenti con una riga vuota e costituire il “footer” di tutte le comunicazioni antecedenti alla data odierna.
Ed ecco che, con una riga di comando, senza neppure scomodare il file .bat …
Siamo in grado di adempiere al nostro compito nel modo più efficace ed efficiente possibile:

FOR /F “usebackq delims=; tokens=*” %a IN (`DIR /A-D /S /B c:\interventi\test\*.txt`) DO (
Echo.>>%a
Echo --- footer - comunicazione antecedente alla data %date% --->>%a
)





Come sempre, ricordatevi che, se lo volete inserire in un file batch, le %a devono diventare %%a

… detto questo …

Happy Scripting a tutti!