Řešil jsem v našem korporátu potřebu vyřešit jeden bezpečnostní problém. Bohužel se „svázanýma rukama“. Proč? No protože … zkrátka a jednoduše nemůžu si stáhnout NMap a začít skenovat síť. Není to schválený program a je to všechno prostě složité. No a protože vše špatné je i k něčemu dobré, začal jsem skriptovat v Powershellu a dnes narazil na super mega duper truper způsob, jak si postavit takový primitivní port skener a proskenovat celou síť.
Hned kraje je potřeba uvést, že následující není z mojí hlavy. Zdroj je zde: https://pen-testing.sans.org/blog/2017/03/08/pen-test-poster-white-board-powershell-built-in-port-scanner
Toto je port skener napsaný v PS. Je to až geniálně triviální. 1 … 1024 jsou čísla portů, které se skenují a IP adresa je jasná. Chyby jsou posílány do null. Víc netřeba.
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.100",$_)) "Port $_ is open!"} 2>$null
Tak a teď jak proskenovat celou síť? Triviální. 1 .. 20 jsou koncovky IP adresy. Verze 2 pak používá výčet portů, které se budou skenovat.
## verze 1 1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null} ## verze 2 1..20 | % { $a = $_; write-host "------"; write-host "10.0.0.$a"; 22,53,80,445 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}
Pro testovací účely je možné nechat všechny uvedené porty otevřít (1 .. 1024). Parametr allports.exposed říká systému, že má port otevřít. K čemu je to dobré? Třeba k testování firewallu. Otevřou se všechny porty, nahodí FW a testuje se, jestli správně fungují pravidla.
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("allports.exposed",$_)) "Port $_ is open" } 2>$null
Co dál je na vás. Až mi zas moje mega lenost dovolí, doplním to do svého korporátního nástroje a nastavím si automatizované skeny pro hledání potencionálních problémů. Vše napojím to do databáze a na email.