2

Can someone help me to checking a port scanner with specific range of IP addresses using command line. How can i make sure that the port scan with that IP's range.

args[0] and args[1] for IP Address range, while args[2] and args[3] for a port scanner.

For example I run "java Test 1.1.1.1 5 0 10" the program will check IP's from 1.1.1.1 to 1.1.1.5 on ports 0 - 10

Here my code:

import java.util.concurrent.*;
import java.util.*;
import java.net.*;

// source http://stackoverflow.com/questions/11547082/fastest-way-to-scan-ports-with-java

public class Test 
{   
public static void main(String [] args) throws Exception
{
    final ExecutorService es = Executors.newFixedThreadPool(20);
    int bRange = 0; //Declare String called bRange with initial value of 0.
    int eRange = 0; //Declare String called eRange with initial value of 0.
    final int timeout = 200;

    //byte[] ipAddr = InetAddress.getByName(args[0]).getAddress();
    //byte[] ipAddr1 = InetAddress.getByName(args[1]).getAddress();
    String ipAddr = args[0];
    String ipAddr1 = args[1];


    if (args.length != 3)
    {   
        try
        {               
            bRange = Integer.parseInt(args[2]); //Assign value of second argument to bRange.
            eRange = Integer.parseInt(args[3]); //Assign value of third argument to eRange.
        }
        catch(NumberFormatException E) //If user enter invalid data.
        {
            System.out.println("You did not enter a valid number for arguments 2 and 3. Please try again with valid Integers.");
            System.exit(0);
        }

        boolean fcheck = true; //DEBUG ONLY CAN DELETE
        final List<Future<Boolean>> futures = new ArrayList<>(); 

        ArrayList<Integer> portRange = new ArrayList<Integer>((eRange - bRange)); //Declare an ArrayList of Integer values called portRange and set its initial size.

        //For loop to randomize scans.
        for(int port = bRange; port <= eRange; port++) 
        {
            portRange.add(port);

            //Use ArrayList of portRange and shuffle to go through each port number once.
            Collections.shuffle(portRange); //Shuffle portRange.

            int size = portRange.size(); //Declare Integer called size and assign value of portRange ArrayList size value.
            int randPort = portRange.get(size-1); //Assign the last index of portRange ArrayList to Integer variable randPort.

            System.out.println(randPort); //Show all the ports

            //int randTimeout = randInt(30, 2000); //Assign random value to randTimeout by running method randInt(). PartD

            futures.add(portIsOpen(es, ipAddr, randPort, timeout));

            portRange.remove(size - 1); //Remove last element in portRange ArrayList.
        }

        es.shutdown(); //Tell the executor service that it can't accept new tasks, but the already submitted tasks continue to run.
        int openPorts = 0; //Declare Integer called openPorts and assign value of 0.


        for(final Future<Boolean> f : futures)
        {
            if(f.get()) 
            {
                openPorts++;
            }
        }
        System.out.println("There are " + openPorts + " open ports on host " + ipAddr + " to " + ipAddr1 + " probed with a timeout of " + timeout + "ms");
        //Print statement show how many ports open based on the particular IP Address and the timeout.
    }       
    else
    {
        System.out.println("Wrong number of arguments");
        System.out.println("Please try again");
    }   
}

public static Future<Boolean> portIsOpen(final ExecutorService es, final String ipAddr, final int port, final int timeout)
{
    return es.submit(new Callable<Boolean>() 
    {
        @Override public Boolean call()
        {
            try //Try block, each time the For loop increments the Try block gets invoked.
            {
                Socket socket = new Socket(); //The Try block creates an instance of the Socket Class.
                socket.connect(new InetSocketAddress(ipAddr, port), timeout); //Create a stream socket and connects it to specified port number at the specified IP Address.
                socket.close(); //Close the socket connection.
                System.out.println("open port found " + port); //Result show how many ports are open.
                return true;
            }
            catch (Exception ex) 
            {
                return false;
            }
        }
    });
}
}
Nixoderm
  • 355
  • 4
  • 23

1 Answers1

1

I suppose, it's much better to use a usual CIDR notaion to determine ip-addresses range. In that case you'll need to use inly one additional parameter, like 1.1.1.1/29, which means the ip-addresses range from 1.1.1.1 to 1.1.1.6 and 1.1.1.7 is broadcasting address. You can use Apache Commons Net class SubnetUtils to determine the range and get all included addresses:

public static void main(String[] args) {    
    String subnet = "1.1.1.1/29";
    SubnetUtils utils = new SubnetUtils(subnet);
    String[] addresses = utils.getInfo().getAllAddresses();
    for (String ip : addresses) {
      System.out.println(ip);
    }
}

But as now, it seems, that your example is checking only the first one address of the specified range, because you do not provide any logic to iterate the addresses range you give.

So, if you still wish to set the range the way before, you need to convert your range notation to the list of concrete addresses and then add an additional loop over this list and include it this loop the loop over ports.

To get this list you can use the logic like in getIpList method, just need to provide exceptoin handling etc.:

public static List<String> getIpList(String startIp, int number) {
    List<String> result = new ArrayList<>();
    String currentIp = startIp;
    for (int i = 0; i < number; i++) {
        String nextIp = nextIpAddress(currentIp);
        result.add(nextIp);
        currentIp = nextIp;
    }
    return result;
}

public static final String nextIpAddress(final String input) {
    final String[] tokens = input.split("\\.");
    if (tokens.length != 4)
        throw new IllegalArgumentException();
    for (int i = tokens.length - 1; i >= 0; i--) {
        final int item = Integer.parseInt(tokens[i]);
        if (item < 255) {
            tokens[i] = String.valueOf(item + 1);
            for (int j = i + 1; j < 4; j++) {
                tokens[j] = "0";
            }
            break;
        }
    }
    return new StringBuilder()
            .append(tokens[0]).append('.')
            .append(tokens[1]).append('.')
            .append(tokens[2]).append('.')
            .append(tokens[3])
            .toString();
}

And then you can get the list of IP within the range, add a loop:

List<String> ipRange = getIpList(ipAddr, ipAddr1);
for(String ipaddr : ipRange) {
  for (int port = bRange; port <= eRange; port++) {
    portRange.add(port);

    //Use ArrayList of portRange and shuffle to go through each port number once.
    Collections.shuffle(portRange); //Shuffle portRange.

    int size = portRange.size(); //Declare Integer called size and assign value of portRange ArrayList size value.
    int randPort = portRange.get(size - 1); //Assign the last index of portRange ArrayList to Integer variable randPort.

    System.out.println(randPort); //Show all the ports

    //int randTimeout = randInt(30, 2000); //Assign random value to randTimeout by running method randInt(). PartD

    futures.add(portIsOpen(es, ipaddr, randPort, timeout));

    portRange.remove(size - 1); //Remove last element in portRange ArrayList.
  }
}
Stanislav
  • 27,441
  • 9
  • 87
  • 82