Indítsuk el a két virtuális gépet, a Kali Linux-ot, illetve azt az Ubuntu Server VM-et, amely egy virtuális PLC-t implementál (az ipari protokollokat). A cikk írásakor a Kali LIinux IP címe 192.168.56.114, a virtuális PLC-é 192.168.56.113.
Végezzünk először egy port scant az "nmap" alkalmazás segítségével. Ez a portscanner megtalálható a Parrot OS-nél is. Teljes TCP portscan (-p-) szükséges azért, mert az ipari protokollok működését is vizsgálni akarjuk. Adjuk ki a következő parancsot.
sudo nmap -p- IP CÍM
A futási eredmény látható az első ábrán.
1. ábra Az "nmap" futási eredménye
Írjunk most egy olyan alkalmazást Python nyelven, amelynek a használatával az adott IP adott portjának az állapota lekérdezhető. Ehhez a "socket", a "sys", illetve a "termcolor" csomagokra van szükségünk. Célszerű először ellenőrizni azt, hogy ezek a csomagok rendelkezésre állnak-e a Kali Linux-on.
Az ellenőrzéshez a következő parancs kiadása szükséges.
sudo pip3 list
Ha a keresett csomag nem található meg, akkor telepíteni kell a következő utasítás segítségével.
sudo pip3 install CSOMAGNÉV
Másoljuk ki a következő kódot, és mentsük el, a neve legyen például "portscan1.py".
#! /usr/bin/python
import socket
import sys
import termcolor
socket.setdefaulttimeout(1)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
hostIP = sys.argv[1]
portNumber = sys.argv[2]
def portScanner(port):
if sock.connect_ex((hostIP, int(port))):
print(termcolor.colored(("Port %d is closed." % int(port)), "red"))
else:
print(termcolor.colored(("Port %d is open." % int(port)), "green"))
portScanner(portNumber)
Futtassuk most az alkalmazásunkat. Nem fontos a "root" jogosultság, az alkalmazás neve után viszont meg kell adni először az IP címet, azután a portszámot is.
Látható a következő ábrán, hogy a nyitott port esetén zöld színnel kerül az értesítés megjelenítésre.
2. ábra Első port scan alkalmazás futtatása nyitott, illetve zárt portvizsgálatnál
Módosítsuk most a fenti Python kódot a következők szerint. Elhagyásra került a színek alkalmazása, illetve a socket létrehozása is váltzott.
#! /usr/bin/python
import socket
import sys
socket.setdefaulttimeout(1)
sock = socket.socket()
hostIP = sys.argv[1]
portNumber = int(sys.argv[2])
def connScan(hostIP, port):
if sock.connect_ex((hostIP, port)):
print("Port %d is closed." % port)
else:
print("Port %d is open." % port)
sock.close()
def portScanner(port):
connScan(hostIP, portNumber)
portScanner(portNumber)
Futtatva a módosított portscan alkalmazást, a következő eredmény jelenik meg a terminálablakban.
3. ábra Módosított portscan alkalmazás futási eredménye
Ismét módosítsuk az alkalmazást úgy, hogy a Python kód futtatásánál ne kelljen megadni a kérdéses portszámot, mert egy előre definiált porttartomány kerül vizsgálat alá. Ez a tartomány a forrásfile-ban található. Fontos cél továbbá az is, hogy ahol lehet, megjelenítésre kerüljön az adott szolgáltatás verziószáma, neve is.
#! /usr/bin/python
import socket
import sys
hostIP = sys.argv[1]
def connScan(hostIP, port):
try:
sock = socket.socket()
sock.settimeout(0.5)
sock.connect((hostIP, port))
try:
print("[+] Open Port " + str(port) + ", " + sock.recv(2048).decode())
except:
print('[+] Open Port ' + str(port))
except:
pass
def portScanner():
for tgtIP in range(1,10000):
connScan(hostIP, tgtIP)
portScanner()
Ez a portscanner nem tartalmaz szálkezelést, a futási eredmény a 4. ábrán látható.
4. ábra Szinkron portscan futási eredménye
Végül újra módosítsuk a portscannerünket úgy, hogy a portok vizsgálatánál szálkezelést alkalmazzunk. Ez növeli a portscanner működési sebességét. A szálkezeléshez importálni kell a "threading" csomagot.
#! /usr/bin/python
import socket
import sys
from threading import *
hostIP = sys.argv[1]
def connScan(hostIP, port):
try:
sock = socket.socket()
sock.settimeout(0.5)
sock.connect((hostIP, port))
try:
print("[+] Open Port " + str(port) + ", " + sock.recv(2048).decode())
except:
print('[+] Open Port ' + str(port))
except:
pass
def portScanner():
for tgtIP in range(1,10000):
t = Thread(target=connScan, args=(hostIP, tgtIP))
t.start()
portScanner()
A futási eredmény a következő ábrán látható, könnyen észrevehető a terminálablakban lévő eredményen, hogy a 21-es port után a 23-as következik, majd azután a 22-es. Ez a szálkezelés alkalmazása miatt van.
5. ábra Aszinkron portscan használatának futási eredménye
Ezek a Python alkalmazások elérhetők a WebElektronika github oldalán.
Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .
A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .
Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .