TechKnow

Author Topic: [PYTHON] Cross-Platform Network Scanner v1.0  (Read 525 times)

0 Members and 1 Guest are viewing this topic.

Offline HcH

  • TechKnow Owner, Ethical Hacker
  • Administrator
  • Uber Member
  • *****
  • Posts: 9936
  • Karma: +2284/-111
[PYTHON] Cross-Platform Network Scanner v1.0
« on: October 15, 2017, 01:21:03 AM »

Cross-Platform Network Scanner v1.0

Release date: 20171015
Type: Python 2.7 system ping / TCP network scanner script
Description: Network scanner, determines it's own currect network, makes a range of network addresses to scan, utilises system (linux/windows) ping and performs TCP portscans. No need for parameters on this one, or code modifications, just run it! Easy to modify to your own needs, such as the ports/protocols to scan for. Tested on Windows and Raspbian.


Introductie:

Beste lezer,

in deze les leert u hoe we met een Raspberry Pi een netwerk kunnen scannen. De les is bedoeld voor zowel beginners als gevorderden. We beginnen bij het begin, wat is een netwerk? Een netwerk is een systeem waarover o.a. computers communiceren. Het internet is daar een goed voorbeeld van. Niet veel mensen weten dat internet staat voor ‘interconnected computer networks’, de werking van internet is dan ook nagenoeg hetzelfde als van een lokaal netwerk. Wanneer we een netwerk betreden en we geen kennis hebben van waar welke apparaten/servers/services aanwezig zijn, kunnen we met een scanner om ons heen kijken in een netwerk. Er zijn vele scanners, maar wat doet een scanner nou eigenlijk?

Een scanner kijkt of er apparaten op het netwerk zijn, vroeger was een ping rond het netwerk eigenlijk voldoende, maar tegenwoordig zijn er veel apparaten standaard in stealth mode, wat alleen maar inhoud dat ze niet reageren op een ICMP (ping) aanvraag. Dat wil nog niet zeggen dat we het apparaat niet kunnen ontdekken, door een TCP verbinding te openen op veelvoorkomende communicatie poorten zoals 80 voor HTTP, 21 voor FTP en 23 voor Telnet kunnen we zien dat een apparaat antwoord, en daarom aanwezig is op het netwerk. In sommige gevallen kan men eenvoudig toegang krijgen vervolgens. Een bereik van het netwerk is in de meeste gevallen de eerste 3 octetten van het ipv4 host adres van 1-254 (bijvoorbeeld 192.168.10.1 - 192.168.10.254). Tenzij er sprake is van 1 of meerdere VLANs, dan krijgen we bijvoorbeeld ook 192.168.11.1-254 maar dat slaan we voor nu even over.

In Python kunnen we eigenlijk vrij eenvoudig een scanner maken. Omdat ping nog niet uitgesloten is en soms nog effectief keuren we die ontdekkingsmethode nog niet af, daarnaast scannen we de veelgebruikte poorten op TCP. Het zou makkelijk zijn als de scanner zelf de scanrange kan bepalen, met name scripted scanners hebben veelal allerlei input nodig van de gebruiker, het zou mooier zijn als onze scanner het zelf kan bepalen.


Source:

#Cross-Platform Network Scanner v1.0 by HcH
#Network scanner based on system ping and TCP scanning, tested on Windows/Raspbian

#returning the system/OS name can be done using platform

from platform import system as system_name
#for executing shell commands we import system
from os import system as system_call
#for gethostname function we need socket
import socket

#get the range of the scan based off the host ip address that's able to communicate to the internet
#it returns a join with rpartition, it splits the string at the last occurrence of the argument string so the last octet of the ipv4 address is removed
def get_scanrange():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return ''.join(s.getsockname()[0].rpartition('.')[:2])

#a scanrange will look like 10.0.0. , the for loop will fill in 1-254 for us at the last octet of the ipv4 address
network = str(get_scanrange())

#ping as system call function, for windows and linux!
def ping(host):
    #ping parameters depending on OS
    parameters = "-n 1 -w 3" if system_name().lower()=="windows" else "-c 1"
    #the ping command itself
    return system_call("ping " + parameters + " " + host + ">NUL") == 0

#scannerplugin example, tries to connect to webservers
def http(ipaddr):
    s = socket(AF_INET, SOCK_STREAM)
    s.settimeout(0.3)
    if not s.connect_ex((ipaddr,80)):
        s.close()                     
        return 1
    else:
        s.close()

#scannerplugin example, tries to connect to ftpservers
def ftp(ipaddr):
    s = socket(AF_INET, SOCK_STREAM)
    s.settimeout(0.3)
    if not s.connect_ex((ipaddr,21)):
        s.close()                     
        return 1
    else:
        s.close()

#scannerplugin example, tries to connect to telnetservers
def telnet(ipaddr):
    s = socket(AF_INET, SOCK_STREAM)
    s.settimeout(0.3)
    if not s.connect_ex((ipaddr,23)):
        s.close()                     
        return 1
    else:
        s.close()

#to obtain getfqdn function we now import from socket:
from socket import *

def run():
    print ''
    #ping addresses <network>.1 to <network>.254
    for ip in xrange(1,254):
        ipaddr = network + str(ip)
        #the function 'getfqdn' returns the remote hostname, add it easily to a 1 line output
        if ping(ipaddr):
            print '%s \t ::: \t PING  \t ::: \t %s' %(ipaddr, getfqdn(ipaddr))
        if ftp(ipaddr):
            print '%s \t ::: \t FTP   \t ::: \t %s' %(ipaddr, getfqdn(ipaddr))
        if telnet(ipaddr):
            print '%s \t ::: \t TNET  \t ::: \t %s' %(ipaddr, getfqdn(ipaddr))
        if http(ipaddr):
            print '%s \t ::: \t HTTP  \t ::: \t %s' %(ipaddr, getfqdn(ipaddr))

#here's the main:
if __name__ == '__main__':
    print '\n' + 'Cross-Platform Network Scanner v1.0' + '\n' + '\n' + 'Scanning ' + network + '1-254 ...'
    run()
    raw_input('\n' + 'Done')

Download: registered members can download attachments of this post.
« Last Edit: October 16, 2017, 11:52:15 AM by HardcoreHacker »