PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Remote Exploits coden in Java



octogen
30.12.2000, 15:49
Hi!

Um mal etwas Schwung ins Forum zu bringen, zeige ich mal kurz das Öffnen einer einfachen Netzwerkverbindung mit Java, so daß man Daten reinschicken und rausziehen kann.

Das ist nur GRUNDLEGENDES, keine Socket-Timeouts usw. :D

Hier einmal ein Beispiel eines ganz einfachen Exploits, der das HTTP-Protokoll benutzt:



// Nicht vergessen, entsprechenden Libraries importieren
import java.io.*;
import java.net.Socket;

public class myRemoteExploit
{
public static void main(String argv[])
{
// initialisieren eines String-Objektes für das Senden via Netzwerk
String requeststring = new String();

// Der folgende Try-Block erlaubt, Fehler mit catch abzufangen - siehe unterhalb try-block
try
{

// Exploit String Initialisierung beginnen, z.B. HTTP-Protokoll
requeststring="GET /cgi-bin/exploitablescript?data=";

// jetzt z.B. Binary Data für einen StackSmasher oder ähnliches...
// wir füllen einfach mal mit ein paar hundert Zeichen
// (0125 == 0x55 == "U" == 85d == 01010101b U kommt ganz gut im debugger output ;o)

// anstatt requeststring = requeststring + "\125" verwenden wir die kurzform mit dem operand +=
for (int ctr=0; ctr<=535; ctr++)
{
// anstatt requeststring = requeststring + "\125" verwenden wir die kurzform mit dem operand +=
requeststring += "\125";
}
// mit \xxx wird ein specialcharacter erzeugt (xxx ist ein oktaler wert)

// HTTP-Request fertigstellen
requeststring += " HTTP/1.0";

// Wir nehmen die ersten 2 Argumente der Kommandozeile
// für Hostname/IP-Adresse und Ziel-Port
// Checking der Argumente vergessen wir mal, ist ja nur ein Exploit :D
// Wir initialisieren ein Socketobjekt (myRemoteComputer)
Socket myRemoteComputer = new Socket(argv[0],Integer.parseInt(argv[1]));
// Wenn das nicht funktioniert hat, wird Java eine Exception aus,
// und wir landen im catch-block

// Hat es funktioniert, dann gibts jetzt eine offene Netzwerkverbindung
// Wir rezeugen ein PrintStream Objekt (request), und docken es an den Socket (myRemoteComputer)
PrintStream request = new PrintStream(myRemoteComputer.getOutputStream());

// Jetzt müssen wir nur noch den Exploit-String senden
// Dazu benutzen wir die Methode println des PrintStreams request
request.println(requeststring);
// PrintStream verschrotten -> /dev/null, Socket wieder schließen
request = null;
myRemoteComputer.close();
// -- Exit, da die Methode hier endet --
}
// Mit catch (Exception oops) fangen wir alle Ausnahmebedingungen ab
catch (Exception oops)
{
// und Ausgabe des Fehlers auf /dev/stdout
System.out.println("Oooops... -> " + oops.toString());
}
}
}



HIER NOCHMAL DIE SOURCE (übersichtlich ohne bemerkungen):



import java.io.*;
import java.net.Socket;

public class myRemoteExploit
{
public static void main(String argv[])
{
String requeststring = new String();

try
{
requeststring="GET /cgi-bin/exploitablescript?data=";

for (int ctr=0; ctr<=535; ctr++)
{
requeststring += "\125";
}
requeststring += " HTTP/1.0";

Socket myRemoteComputer = new Socket(argv[0],Integer.parseInt(argv[1]));
PrintStream request = new PrintStream(myRemoteComputer.getOutputStream());

request.println(requeststring);

request = null;
myRemoteComputer.close();
}
catch (Exception oops)
{
System.out.println("Oooops... -> " + oops.toString());
}
}
}


// etuli: code tags; ich glaub damals gabs die nach nicht. :D

hawky
08.01.2001, 09:41
ich benutze als schleife immer folgendes um daten aus netzwerkverbindungen rauszuholen.

while ((str=in.readLine())!=null)
System.out.println (str);

wobei str nen string ist, und in nen bufferedreader oder sonstwas. :)
@octogen: gute idee, vielleicht sollten wir auf anfrage öfter so kleine tuts machen.

texavery
08.01.2001, 14:25
Da ich mit z.Z. vj++ code hab ich immer ein ActiveX html Obejct benutzt das sieht dann am beispiel eines sms verschickers so aus :



import com.ms.wfc.app.*;
import com.ms.wfc.core.*;
import com.ms.wfc.ui.*;
import com.ms.wfc.html.*;

public class sms extends Form
{
public sms()
{
initForm();
}

private String replacetext(String in,String a1,String a2){

int i,b;
String finale=" ";
StringBuffer text=new StringBuffer(" ");
text.append(in);
char be = a1.charAt(0);
char c = a2.charAt(0);
for(i=0;i<text.length();i++)
{
try{
if(text.charAt(i)==be){
text.setCharAt(i,c);
}

}
catch(StringIndexOutOfBoundsException fg)
{
}
}
return text.toString();
}

public void dispose()
{
super.dispose();
components.dispose();
}

private void sendbutton_click(Object source, Event e)
{
boolean x=true;
if(number.getText().length()<1){number.setText("An fehlt");x=false;}
if(smstext.getText().length()<1){smstext.setText("Von fehlt");x=false;}
if(anbieter.getText().length()<1){anbieter.setText("Fehler");x=false;}

if(x==true){
String url;
int i = smstext.getText().length();
int a = -i+130;
url="http://www.lycos.de/cgi-bin/sms/send_sms2.cgi?res="+anbieter.getText()+"&ren="+number.getText()+"&msg="+new String(replacetext(smstext.getText()," ","+")).substring(1,new String(smstext.getText()).length())+"&Len="+a+"&SUBMIT=Abschicken&prg=1";
webBrowser1.Navigate(url,null,null,null,null);

}

}

/**
* HINWEIS: Der folgende Code ist für den Visual J++-
* Formulardesigner erforderlich. Er kann mit dem Formulareditor verändert werden. Ändern Sie
* ihn nicht mit dem Codeeditor.
*/
Container components = new Container();
shdocvw.WebBrowser.WebBrowser webBrowser1 = new shdocvw.WebBrowser.WebBrowser();
Label textlabel = new Label();
RichEdit smstext = new RichEdit();
Label numberlabel = new Label();
Edit number = new Edit();
Button sendbutton = new Button();
Label netzlabel = new Label();
ComboBox anbieter = new ComboBox();

private void initForm()
{
// HINWEIS: Dieses Formular speichert Ressourceninformationen in
// einer externen Datei. Ändern Sie nicht den Zeichenfolgenparameter für
// einen der Funktionsaufrufe von resources.getObject(). Ändern Sie z.B.
// nicht "foo1_location" in der folgenden Codezeile,
// auch nicht, wenn sich der Name des Foo-Objekts ändert:
// foo1.setLocation((Point)resources.getObject("foo1_location"));

IResourceManager resources = new ResourceManager(this, "sms");
this.setBackColor(new Color(0, 64, 0));
this.setForeColor(new Color(192, 192, 0));
this.setText("SMS");
this.setAutoScaleBaseSize(new Point(5, 13));
this.setBorderStyle(FormBorderStyle.FIXED_TOOLWIND OW);
this.setClientSize(new Point(250, 179));

components.add(webBrowser1, "webBrowser1");
webBrowser1.setLocation(new Point(16, 184));
webBrowser1.setSize(new Point(584, 312));
webBrowser1.setTabIndex(0);
webBrowser1.setOcxState((AxHost.State)resources.ge tObject("webBrowser1_ocxState"));

components.add(textlabel, "textlabel");
textlabel.setLocation(new Point(16, 88));
textlabel.setSize(new Point(56, 16));
textlabel.setTabIndex(1);
textlabel.setTabStop(false);
textlabel.setText("Text :");

components.add(smstext, "smstext");
smstext.setFont(Font.DEFAULT_GUI);
smstext.setForeColor(new Color(128, 128, 0));
smstext.setLocation(new Point(88, 88));
smstext.setSize(new Point(152, 80));
smstext.setTabIndex(2);
smstext.setText("");
smstext.setMaxLength(129);

components.add(numberlabel, "numberlabel");
numberlabel.setLocation(new Point(16, 48));
numberlabel.setSize(new Point(56, 16));
numberlabel.setTabIndex(3);
numberlabel.setTabStop(false);
numberlabel.setText("Nummer :");

components.add(number, "number");
number.setLocation(new Point(88, 48));
number.setSize(new Point(152, 20));
number.setTabIndex(4);
number.setText("");

components.add(sendbutton, "sendbutton");
sendbutton.setLocation(new Point(16, 152));
sendbutton.setSize(new Point(40, 16));
sendbutton.setTabIndex(5);
sendbutton.setText("send");
sendbutton.addOnClick(new EventHandler(this.sendbutton_click));

components.add(netzlabel, "netzlabel");
netzlabel.setLocation(new Point(16, 16));
netzlabel.setSize(new Point(48, 16));
netzlabel.setTabIndex(6);
netzlabel.setTabStop(false);
netzlabel.setText("Netz :");

components.add(anbieter, "anbieter");
anbieter.setLocation(new Point(88, 16));
anbieter.setSize(new Point(80, 21));
anbieter.setTabIndex(7);
anbieter.setText("");
anbieter.setItems(new Object[] {
"D1-0170",
"D1-0171",
"D1-0175",
"D2-0172",
"D2-0173",
"D2-0174",
"EP-0177",
"EP-0178"});

this.setNewControls(new Control[] {
anbieter,
netzlabel,
sendbutton,
number,
numberlabel,
smstext,
textlabel,
webBrowser1});

webBrowser1.begin();
}

public static void main(String args[])
{
Application.run(new sms());
}
}


@octogen :Den code von dir find ich richtig genial

Asraniel
05.12.2002, 22:08
Wow, bin per zufall über den Tread gestolpert.... kann ich irgendwie noch mehr solche sources in java finden? oder sonstwas in der art? Denn java ist die einzige sprache die ich mehr oder weniger kann.

destructor
06.12.2002, 18:09
@octogen:
Ich würde jeden Stream zuerst mit close() schließen, und ihn erst dann explizit auf null setzen (Das gibt dem OS die Ressourcen, die der Stream belegt hat zurück). Zudem würde ich auch das Socket auf null setzen.

@hawky
Das geht natürlich nur wenn du ein Protokoll verwendest, das die Connection nicht 'offen' hält. (HTTP ist nach einer Anfrage beendet)
Wenn du das selbe mit z.B.: FTP oder SMTP versuchst, dann wirst du ewig darauf warten, dass du dein nächstes Kommando senden kannst. (ein BufferedReader gibt erst dann null zurück, wenn der Stream beendet ist)

@Asraniel
Auch ich denke, dass es gut wäre, wenn man hier in diesem Forum öfter mal sowas machen würde, wie es octogen gemacht hat. Ich glaube, dass viele Leute so eine ganze Menge dazulernen können ohne vorher haufenweise text durchzulesen.

C-Hoernsche
07.12.2002, 09:30
InetSocketAddress isa = new InetSocketAddress(InetAddress.getByName(host), port);
sc = SocketChannel.open();
sc.connect(isa);
sc.configureBlocking(false);
sc.connect(isa);
//Just do it here

NON-Blocking reading from SocketChannel :)

Funzt aber erst seit JDK 1.4.1
Da gibbets auch Selectors um Events auf Channels abzufragen.

Andere Möglichkeit das Blocking Problem zu umgehen ist das lesen in einen "Lese-Thread" zu packen.

destructor
07.12.2002, 12:29
man kann das ja auch machen, indem man den RFC des Protokolls genau liest. In SMTP und FTP ist es z.B.: so, dass wenn die Antwort mit einem Statuscode und einem - beginnt, muss man lesen, bis eine Zeile mit dem Statuscode und einem ' ' beginnt
z.B.:
200-OK
200-Irgendein mehrzeiliger Response
Der aber nicht in jeder Zeile mit dem Statuscode anfangen muss
200 Hier ist dann das Ende der Response und man kann z.b. eine Schleife verlassen
Ich habe mir dafür eine Methode geschrieben:

public String readResponse(BufferedReader in)
throws IOException
{
StringBuffer ret = new StringBuffer();
String temp = in.readLine();
if (temp != null) {
ret.append(temp);
if (temp.indexOf('-') == 3) {
String start = temp.substring(0,3);
while (!(temp = in.readLine()).startsWith(start+" ")) {
ret.append("\r\n"+temp);
}
ret.append("\r\n"+temp);
}
}
return ret.toString().trim();
}Das funktioniert ganz gut so.

harl
09.12.2002, 09:08
Original geschrieben von destructor
@octogen:
Ich würde jeden Stream zuerst mit close() schließen, und ihn erst dann explizit auf null setzen (Das gibt dem OS die Ressourcen, die der Stream belegt hat zurück). Zudem würde ich auch das Socket auf null setzen.

Ich glaub, inzwischen hat er es ganz gut raus... :D


@Asraniel
Auch ich denke, dass es gut wäre, wenn man hier in diesem Forum öfter mal sowas machen würde, wie es octogen gemacht hat. Ich glaube, dass viele Leute so eine ganze Menge dazulernen können ohne vorher haufenweise text durchzulesen.
Ich bin grade dabei (btw. hab ich octogen erst letzte Woche drauf den einen text in sachen "advanced remote exploits in java" zu schreiben.

Der wird allerdings vom Zeitaufwand her noch Minimum einen Monat brauchen, bei Interesse poste ich die von mir bisher zusammengetragenen Ressourcen zu der Thematik.

so long,

h3.

morpheus
10.08.2003, 13:35
Hallo,
Original geschrieben von harl
Ich bin grade dabei (btw. hab ich octogen erst letzte Woche drauf den einen text in sachen "advanced remote exploits in java" zu schreiben.Ist jetzt doch schon etwas laenger her der letzte Post in diesem Thread aber es wuerde mich dennoch interessieren, ob daraus etwas geworden ist.
Original geschrieben von harl
[...] bei Interesse poste ich die von mir bisher zusammengetragenen Ressourcen zu der Thematik.Wenn du es noch irgendwo liegen hast, dann bitte, da es mich interessieren wuerde.

MfG
morpheus

Asraniel
10.08.2003, 14:23
Würd mich auch interessieren...

harl
11.08.2003, 11:09
Klar, das Paper liegt mehr oder minder fertig im 1Gig großen Projektverzeichnis.

Ist allerdings in Ermangelung eines aktuellen Beispiels etwas zu abstrakt.

Schickt mir mal einer bitte eine PN, dann schau ich am Woe danach ;)

Asraniel
11.08.2003, 12:35
Wie auch immer, würde mich zumindest imens interessieren.. schon nur weil ich ferien habe und mich langweile und mal n bischen inteligent beschäftigt sein möchte...

harl
11.08.2003, 13:28
Original geschrieben von Asraniel
Wie auch immer, würde mich zumindest imens interessieren.. schon nur weil ich ferien habe und mich langweile und mal n bischen inteligent beschäftigt sein möchte...

*argl, wer will sowas hören ...

Asraniel
11.08.2003, 18:28
niemand, deine antwort jedoch auch ned. Man darf doch versuchen sich hier normal zu unterhalten oder etwa nicht?
Und ich hatte es absolut ernst gemeint, da in ca 3 wochen die schule wieder anfängt und ich mich wieder etwas in Java einleben sollte(ich bin Informatiker) von da her ist es doch nicht abwegig mal 2 sachen die einen interessieren zu verbinden, oder doch?

morpheus
11.08.2003, 20:12
Hallo,

@Asraniel
Erstmal sind die OT-Tags dazu da um sie zu verwenden ...

Es ist aber nicht noetig, dass du dein Interesse ein paar Mal mitteilst. Das warum und wie passt einfach nicht in diesen Thread.

MfG
morpheus

cryptic
02.09.2003, 12:10
*g* Du bist Informatiker ? *g* Wenn die alle so autodidaktisch selbständig lernen können, dann brauchen wir ja bald keine Inder mehr...

mfg

cryptic

Asraniel
05.09.2003, 08:31
Ich glaube du hast mich nicht ganz verstanden. Es ging mir nur darum dass wenn schon jemand eine samlung von texten hat das es sicher hilfreich wäre die zu bekommen. Klar kann ich das auch selber suchen/lernen, was ich auch tue, mach dir keine Sorgen, aber wie gesagt, wär halt hilfreich gewesen.
Ich kann glaub besser Java als du denkst... also hören wir mal damit auf hier, ich meine, was soll das

menace
05.09.2003, 10:30
jo, jeder weitere Satz von dir reitet dich weiter rein.

DarkTom
08.09.2003, 00:59
Ist ja gut jetzt.

Zwingt mich nicht dazu, diesen Thread noch zu schliessen. Es wäre schade, falls doch noch jemand ausnahmsweise mal was zum Thema schreiben wollte und es dann nicht mehr könnte.

slssq
09.09.2003, 11:09
wie schon im Betreff -> die .java file im Anhang ist ein Client von einem Trojaner die ich umgepfuscht habe (betonung auf gepfuscht, ist aber eh ersichtlich)


da ich mich in java noch nicht wirklich gut auskenne bitte ich um verbesserung -> aus fehlern lernt man ;-)




danke!