Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # +-----------------------------------------------------------------------+
- # | Simple port scanning for ipv4 ranges, with standart python libraries |
- # | by molemime 2020 (c) use at your own risk |
- # +-----------------------------------------------------------------------+
- import sys, threading, socket, struct
- from threading import Thread
- # generate ipv4 list by ip range in CIDR notice
- def converter( cidr ):
- result = []
- _range = cidr.split("/")
- if len( _range ) < 2 :
- sys.exit( "\nLoad invalid range format from source file. Try again in CIDR notice!\n" )
- else:
- if int(_range[1]) <= 32 and int(_range[1]) >= 24 :
- block = 256 - 2 ** (32 - int(_range[1]))
- _mask = "255.255.255."+ str( block )
- if int(_range[1]) <= 23 and int(_range[1]) >= 16:
- block = 256 - 2 ** (24 - int(_range[1]))
- _mask = "255.255."+ str(block) +".0"
- if int(_range[1]) <= 15 and int(_range[1]) >= 8:
- block = 256 - 2 ** (15 - int(_range[1]))
- _mask = "255."+ str(block) +".0.0"
- if int(_range[1]) <= 7 and int(_range[1]) >= 0:
- block = 256 - 2 ** (7 - int(_range[1]))
- _mask = str(block) +".0.0.0"
- _s = struct.unpack( "!l", socket.inet_aton(_range[0]) )[0]
- _e = struct.unpack( "!l", socket.inet_aton(_range[0]) )[0] - struct.unpack( "!l", socket.inet_aton(_mask) )[0]
- for address in range(_s, _e):
- result.append( socket.inet_ntoa( struct.pack("!l", address) ) )
- return result
- # connect on port by socket library
- def checker( host, port ):
- try:
- s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
- s.settimeout(5)
- s.connect( (str(host), int(port)) )
- with open( "service-check.log", "a+" ) as _log:
- _log.write( host +"\t"+ str(port) +"\tport available\n" )
- _log.close()
- except socket.error:
- sys.stdout.write( host +"\t"+ str(port) +"\taddress not available\r" )
- pass
- except socket.timeout:
- sys.stdout.write( host +":\t"+ str(port) +"\tport filtred\r" )
- pass
- finally:
- sys.stdout.flush()
- if __name__ == "__main__":
- if len(sys.argv) < 3:
- # so few input argument, print help info
- print "_____________________________________________________________"
- print "\n\t+ Use this script as command: \n\t|_ python "+ sys.argv[0] +" /source/file.txt 80"
- print "\t|_ python "+ sys.argv[0] +" /source/file.txt 80-8080"
- print "\t|_ python "+ sys.argv[0] +" /source/file.txt 80,81,82"
- print "_____________________________________________________________"
- print "\n* Source file must contain ip ranges in CIDR notice.\n"
- else:
- # for scanning by port range
- if sys.argv[2].find("-") > 0:
- for port in range( int(sys.argv[2].split("-")[0]), int(sys.argv[2].split("-")[1]) + 1 ):
- for line in open(sys.argv[1]):
- for ip in converter( line.replace("\n", "") ):
- myThread = threading.Thread( target=checker, args=( str(ip) , int(port) ) )
- myThread.start()
- # for scannig by port list
- if sys.argv[2].find(",") > 0:
- for port in sys.argv[2].split(","):
- for line in open(sys.argv[1]):
- for ip in converter( line.replace("\n", "") ):
- myThread = threading.Thread( target=checker, args=( str(ip) , int(port) ) )
- myThread.start()
- # for scanning by single port
- if sys.argv[2].find(",") == -1 and sys.argv[2].find("-") == -1:
- for line in open(sys.argv[1]):
- for ip in converter( line.replace("\n", "") ):
- myThread = threading.Thread( target=checker, args=( str(ip) , int(sys.argv[2] ) ) )
- myThread.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement