Huhu liebe Community!
Hatte in letzter Zeit viel Zeit. Naja, das fängt stil-technisch schon mal gaaaanz unschön an...
Whatever, ich habe mich mit Package Bots und Brute Force Programmen beschäftigt; So habe ich min 4 Wochen lang an einem (SDS) Staemme Bot gearbeitet, das Projekt liegt mittlerweile auf Eis, wie fast alle Privatprojekte.
An diese Stelle, falls wer Interesse an den Sourcen hat und mit meinem SpagetthiCode klarkommt, immer her mit den Anfragen...
Grunlage all dieser aus Langer Weile entstandenen Progrämmchen, waren meine Connections Klassen, mit denen ich Http Requests erschaffen kann und somit alles, was Internet ist, automatisiert nachstellen kann.
Vielen Menschen sagt dass vermutlich nichts...Doch wenn man Packete selber "bauen" kann, lässt sich sehr sehr viel anstellen. Als Börsianer (wie ich es bin) kann man sein eigenes BuchhaltungsNotizprogrämmchen immer mit den neuesten Daten bekannter und schneller Börsen-Internetseiten füttern.
Oder man loggt sich automatisch irgendwo ein und drückt auf ein Button. Man macht einen Bot. Ein Brute-Force Tool, dass MultiThreaded ist und parallel mehrere Requests gleichzeitig abschickt. Eine "Ionenkanone" (DDos Tool) dass multiThreaded ist und durch einen Server über mehrere Pcs ferngesteuert wird und Visa lahm legt. Alles kein Problem.
Letzendlich kann man sogar die Tauglichkeit der Proxylisten, die unerlässlich bei jeder Attacke sind, mit Requests auf ihre Tauglichkeit überprüfen...
Doch nun genug.
Zunächst eine kurze Erklärung was HTTP Requests überhaupt sind. In Http "Anfragen" fragt normalerweise der Browser was er vom Server haben will. Gibt man beispielsweise wikipedia.de im Firefox Browser ein, schickt der Browser eine Anfrage via Hyper-Text-Transfer-Protocol, das auf dem abstrakteren TCProtokoll basiert, ab. Dass sieht dann so aus:
HTML Code:
http://wikipedia.de/
GET / HTTP/1.1
Host: wikipedia.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: cookies=1
Was was ist:
Host: wohin ihr eure Anfrage geschickt habt.
User Agent: Wie ihr selbst heisst. Man kann sich auch böser Bot nennen.
Accept: Was du selbst als Antwort annimmst.
Keep-Alive: wie lange die Verbindung aufrecht erhalten bleiben soll
Cookie: Du teilst dem Server irgendetwas mit einer kleinen Textdatei mit. Ein Cookie hat NUR 2 Eigenschaften: ein wert und einen namen. Der Name ist hier
cookies und der Wert ist
1.
Aber all dies wird viel besser in anderen Tuts erklärt. Schaut euch dazu Shadows Tuts an. Schliesslich wollt ihr ja meinen Code copieren^^
Na denn. Wie bereits erwähnt muss man, wenn man das alles automatisch machen will, also programmieren will, diese Anfragen selber zusammenbauen.
Ich für meinen Teil benutze dafür HttpClient von Apache. Eine Bibliothek die diese Http Anfragen viel einfacher macht und den low level Teil der Anfragen abnimmt. Im Low Level Teil muss man Sockets manuell öffnen und den ganzen Kram...
Meine Grundlage besteht aus 3 Klassen. Einer Connections Klasse, einer GetRequest Klasse und einer PostRequest Klasse. die Request Klassen erben dabei von der Connections Klasse.
Also, falls ihr kein Java könnt, keine OOP beherrscht, ihr unter 16 seit oder sonstig geistig Krank. Brecht hier ab. Ihr werdet das Ding nicht zum laufen bringen...
Hier die Klasse Connections. Sie beihnhaltet alles unspezifische. einzige ausnahme ist ein bruch in der logik, da man der Connections Klasse post daten hinzufügen kann. dass wird komisch, wenn die GetRequest Klasse dann davon erbt. Egal. Weiter gehts in den Comments...
PHP Code:
// wie bereits erwähnt braucht ihr http client von apache. das müsst ihr einbinden
import java.io.*;
import java.util.ArrayList;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
/**
*
* @author Nikolai aka Spinnengetier
* Bitte NICHT als eigenen Code ausgeben. Copyright liegt bei mir. Benutzen
* dürft ihr natürlich alles
*/
public class Connections {
protected BufferedReader br; // da kommt mal die Antwort des Servers rein
protected Cookie[] cookies; // cookies halt oO
protected String[][] Request_Header_Data;
protected Header[] response_header;
protected PostMethod postmethod;
protected GetMethod getmethod;
protected HttpClient client;
protected StringBuffer response_content;
protected int statuscode;
protected String statuscodeAll;
private int keep_alive;
protected String URI;
private String PROXY_IP;
private int PROXY_PORT;
private HostConfiguration config;
private Credentials credentials;
private AuthScope authScope;
public Connections() {
this.postmethod = new PostMethod();
this.getmethod = new GetMethod();
this.br = null;
this.cookies = null;
this.Request_Header_Data = new String[9][2];
this.client = new HttpClient();
this.response_content = new StringBuffer();
this.keep_alive = 75;
this.PROXY_IP = null;
this.PROXY_PORT = 0;
this.config = client.getHostConfiguration();
this.credentials = new UsernamePasswordCredentials("", "");
init_Header();
}
private void init_Header() {
//ArrayList would be more appropriate, but does work like it is ans is lil bit faster ;)
Request_Header_Data[1][0] = "User-Agent";
Request_Header_Data[1][1] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12";
Request_Header_Data[2][0] = "Accept";
Request_Header_Data[2][1] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
Request_Header_Data[3][0] = "Accept-Language";
Request_Header_Data[3][1] = "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
Request_Header_Data[4][0] = "Accept-Charset";
Request_Header_Data[4][1] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
Request_Header_Data[5][0] = "Keep-Alive";
Request_Header_Data[5][1] = String.valueOf(this.keep_alive);
Request_Header_Data[6][0] = "Connection";
Request_Header_Data[6][1] = "keep-alive";
}
public void BuildHeader() {
String[] helparray = new String[2];
for (int i = 0; i < Request_Header_Data.length; i++) {
for (int j = 0; j < Request_Header_Data[i].length; j++) {
helparray[j] = Request_Header_Data[i][j];
}
postmethod.setRequestHeader(helparray[0], helparray[1]);
}
}
public void setPostData(ArrayList<NameValuePair> postdata) {
for (int i = 0; i < postdata.size(); i++) {
try {
this.postmethod.addParameter(postdata.get(i).getName(), postdata.get(i).getValue());
} catch (IllegalArgumentException illegalArgumentException) {
System.out.println("couldnt add post patams");
}
}
}
public void setCookies(String cookies) {
Request_Header_Data[8][0] = "Cookie";
Request_Header_Data[8][1] = cookies;
}
public void setHostname(String hostname) {
Request_Header_Data[0][0] = "Host";
Request_Header_Data[0][1] = hostname;
}
public void setReferer(String referer) {
Request_Header_Data[7][0] = "Referer";
Request_Header_Data[7][1] = referer;
}
//when get_request is implemented, modify
public StringBuffer getResponseContent() {
return this.response_content;
}
public void clearResponseContent(){
//delete whole content
this.response_content = new StringBuffer();
}
public void print_responseHeader() {
System.out.println("\n******************************Response Header******************************");
for (int i = 0; i < response_header.length; i++) {
System.out.println(response_header[i].toString());
}
System.out.println("******************************Response Header******************************\n");
}
public Header getHeader(String headername, boolean isPostHeader) {
if (isPostHeader) {
return this.postmethod.getResponseHeader(headername);
} else {
return this.getmethod.getResponseHeader(headername);
}
}
public void print_Cookies() {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
System.out.println(
"Cookie: " + cookie.getName()
+ ", Value: " + cookie.getValue()
+ ", IsPersistent?: " + cookie.isPersistent()
+ ", Expiry Date: " + cookie.getExpiryDate()
+ ", Comment: " + cookie.getComment());
}
}
public Cookie[] getCookies() {
return this.cookies;
}
/**
* @return the statuscode
*/
public int getStatuscode() {
return statuscode;
}
/**
* @return the statuscodeAll
*/
public String getStatuscodeAll() {
return statuscodeAll;
}
/**
* @param keep_alive the keep_alive to set
*/
public void setKeep_alive(int keep_alive) {
this.keep_alive = keep_alive;
Request_Header_Data[5][1] = String.valueOf(this.keep_alive);
}
/**
* @return the URI
*/
public String getURI() {
return URI;
}
/**
* @param URI the URI to set
*/
public void setURI(String URI) {
this.URI = URI;
}
/**
* @param PROXY_HOST the PROXY_HOST to set
*/
public void setPROXY(String PROXY_IP, int PROXY_PORT) {
this.PROXY_IP = PROXY_IP;
this.PROXY_PORT = PROXY_PORT;
this.config.setProxy(PROXY_IP, PROXY_PORT);
authScope = new AuthScope(this.PROXY_IP, this.PROXY_PORT);
client.getState().setProxyCredentials(authScope, credentials);
}
}
Wie ihr seht hatte ich keine Bock mehr zu kommentieren. Whatever. Ihr müsst den Code auch nicht verstehen. Ihr müsst wissen wie mann es anzuwenden hat...
Jetzt fehlen noch 2 Klassen:
GetRequest Klasse:
PHP Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
/**
*
* @author Nikolai aka Spinnengetier
*/
public class GetRequest extends Connections {
public GetRequest(){
super();
}
public void doGetRequest(boolean printOutput) {
client.getHttpConnectionManager().getParams().setConnectionTimeout(10000);//if proxy is too slow kill the connection
try {
this.getmethod = new GetMethod(this.URI);
int returnCode = client.executeMethod(getmethod);
this.response_header = this.getmethod.getResponseHeaders();
this.statuscode = this.getmethod.getStatusCode();
this.statuscodeAll = this.getmethod.getStatusText();
if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) {
System.out.println("The Get method is not implemented by this URI");
// still consume the response body
getmethod.getResponseBodyAsString();
} else {
this.cookies = client.getState().getCookies();
br = new BufferedReader(new InputStreamReader(getmethod.getResponseBodyAsStream()));
String readLine;
while (((readLine = br.readLine()) != null)) {
if (printOutput) {
System.out.println(readLine);
}
this.response_content.append(readLine);
}
}
} catch (Exception e) {
System.out.println("Connection Error \n" + e);
} finally {
getmethod.releaseConnection();
getmethod = new GetMethod();
if (br != null) {
try {
br.close();
} catch (Exception fe) {
}
}
}
}
}
Und die PostRequest Klasse:
PHP Code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.methods.PostMethod;
/**
*
* @author Nikolai aka Spinnengetier
*/
public class PostRequest extends Connections {
public PostRequest() {
super();
}
synchronized public void doPostConnection(boolean printOutput) {
client.getHttpConnectionManager().getParams().setConnectionTimeout(1000);//if proxy is too slow kill the connection
try {
this.postmethod.setURI(new URI(this.URI));
int returnCode = this.client.executeMethod(this.postmethod);
this.response_header = this.postmethod.getResponseHeaders();
this.statuscode = this.postmethod.getStatusCode();
this.statuscodeAll = this.postmethod.getStatusText();
if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) {
System.out.println("The Post method is not implemented by this URI");
// still consume the response body
this.postmethod.getResponseBodyAsString();
} else {
//System.out.println("Request send...");
this.cookies = this.client.getState().getCookies();
br = new BufferedReader(new InputStreamReader(this.postmethod.getResponseBodyAsStream()));
String readLine;
while (((readLine = br.readLine()) != null)) {
if (printOutput) {
System.out.println(readLine);
}
this.response_content.append(readLine);
}
}
} catch (Exception e) {
System.out.println("Connection Error \n" + e);
} finally {
this.postmethod.releaseConnection();
this.postmethod = new PostMethod();
if (br != null) {
try {
br.close();
} catch (Exception fe) {
}
}
}
}
}
Soooo...Jetzt ein Anwendungsbeispiel. Ich bin immer der Meinung dass Briana
Banks ne geile Frau ist und dass man durch Beispiele am Besten lernt:
Wir wollen uns natürlich bei die-staemme einloggen. Falls das PW richtig ist schickt der Server eine Antwort mit allen Welten. JavaScript basiert.
das sieht ungefähr so aus:
HTML Code:
{"res":"<form action=\"index.php?action=login\" method=\"post\" class=\"server-form\" id=\"server_select_list\">\n\t<input name=\"user\" type=\"hidden\" value=\"Avaa\" \/>\n\t<input name=\"password\" type=\"hidden\" value=\"da07f0fef372e242e12d59beaba1c1568b75305a\" \/>\n\t<div id=\"active_server\" style=\"overflow:visible; margin-bottom:5px;\">\n \t<p style=\"margin: 5px; margin-left: 0px; margin-bottom: 10px; font-weight:bold;\">Auf welcher Welt willst du dich einloggen?<\/p>\n \t\t\t\t\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de63');\"><span class=\"world_button_active\">Welt 63<\/span><\/a>\n\t\t\t\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de67');\"><span class=\"world_button_active\">Welt 67<\/span><\/a>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de69');\"><span class=\"world_button_inactive\">Welt 69<\/span><\/a>\n\t\t\n\t\t \n\t\t\t<p id=\"show_all_server\" style=\"margin-top:14px;text-align:center\"><a href=\"#\" onclick=\"$('#show_all_server').hide();$('#inactive_server_list').show();\">Zeige alle Welten<\/a><\/p>\n\t\t <\/div>\n \t<div id=\"inactive_server_list\" style=\"display:none;overflow:visible;margin-bottom:1px;margin-top:10px;clear:both;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de36')\"><span class=\"world_button_inactive\">Welt 36<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de37')\"><span class=\"world_button_inactive\">Welt 37<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de38')\"><span class=\"world_button_inactive\">Welt 38<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de39')\"><span class=\"world_button_inactive\">Welt 39<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de40')\"><span class=\"world_button_inactive\">Welt 40<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de41')\"><span class=\"world_button_inactive\">Welt 41<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de42')\"><span class=\"world_button_inactive\">Welt 42<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de43')\"><span class=\"world_button_inactive\">Welt 43<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de44')\"><span class=\"world_button_inactive\">Welt 44<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de45')\"><span class=\"world_button_inactive\">Welt 45<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de46')\"><span class=\"world_button_inactive\">Welt 46<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de47')\"><span class=\"world_button_inactive\">Welt 47<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de48')\"><span class=\"world_button_inactive\">Welt 48<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de49')\"><span class=\"world_button_inactive\">Welt 49<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de50')\"><span class=\"world_button_inactive\">Welt 50<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de51')\"><span class=\"world_button_inactive\">Welt 51<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de52')\"><span class=\"world_button_inactive\">Welt 52<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de53')\"><span class=\"world_button_inactive\">Welt 53<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de54')\"><span class=\"world_button_inactive\">Welt 54<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de55')\"><span class=\"world_button_inactive\">Welt 55<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de56')\"><span class=\"world_button_inactive\">Welt 56<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de57')\"><span class=\"world_button_inactive\">Welt 57<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de58')\"><span class=\"world_button_inactive\">Welt 58<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de59')\"><span class=\"world_button_inactive\">Welt 59<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de60')\"><span class=\"world_button_inactive\">Welt 60<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de61')\"><span class=\"world_button_inactive\">Welt 61<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de62')\"><span class=\"world_button_inactive\">Welt 62<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de64')\"><span class=\"world_button_inactive\">Welt 64<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de65')\"><span class=\"world_button_inactive\">Welt 65<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de66')\"><span class=\"world_button_inactive\">Welt 66<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_de68')\"><span class=\"world_button_inactive\">Welt 68<\/span><\/a>\t\t\t\t\t\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_dec1')\"><span class=\"world_button_inactive\">Classic<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_des1')\"><span class=\"world_button_inactive\">SDS<\/span><\/a>\t\t\t\t\t<a href=\"#\" onclick=\"return Index.submit_login('server_des2')\"><span class=\"world_button_inactive\">SDS 2<\/span><\/a>\t\t\t<\/div>\n\t<\/form>\n"}
Aber falls der Login falsch ist, schickt der Server sowas zurück:
HTML Code:
{"error":"Passwort ung\u00fcltig"}
Und wie macht man das?
genau so:
PHP Code:
public class Main {
import blabla.blabla.PostRequest ;
import java.util.ArrayList ;
import org.apache.commons.httpclient.NameValuePair;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
PostRequest request = new PostRequest();
ArrayList<NameValuePair> postdata = new ArrayList<NameValuePair>();
postdata.add(new NameValuePair("user", "der username"));
postdata.add(new NameValuePair("password", "das passwort"));
postdata.add(new NameValuePair("clear", "true"));//irgendwas komisches
request.setURI("http://www.die-staemme.de/index.php?action=login&server_list=1&show_server_selection=1"); //den host wählen
request.setPostData(postdata); //die logindaten mitgeben
request.doPostConnection(true); // wenn ihr hier true eingebt wird die antwort vom server ausgegeben
}
}
Viel spass damit
EDIT:
Keine Angst Leute, wenn ich zeit habe wird das hier geupdated...