loader
Foto

Portscanner készítése Python nyelven

Több portscan alkalmazás is elérhető a github-on, illetve vannak olyan Linux disztribúciók is, amelyek "alapból" tartalmazzák az nmap-ot. Ezt egyébként sokan a legjobb scannernek tartják. Ebben a cikkben mi is készítünk néhány portscan alkalmazást azért, hogy elmélyedjünk a socket-ek Python nyelven történő használatában.

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.

kep
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.

kep
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.

kep
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ó.

kep
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.

kep
5. ábra   Aszinkron portscan használatának futási eredménye
 

Ezek a Python alkalmazások elérhetők a WebElektronika github oldalán.

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

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. . . .