[Pascal] Gathor 0.1 (Recolector de informacion)

Iniciado por WarZ0n3, 1 Agosto 2013, 08:51 AM

0 Miembros y 1 Visitante están viendo este tema.

WarZ0n3

Saludos gente  ::)
Después de ausentarme un gran tiempo por trabajo y viajes, hoy que tuve un tiempo libre y como estaba aburrido, se me ocurrió hace una pequeña herramienta de gathering, debo decir que faltan agregarles muchas características y otras deben ser quitadas del código, estoy consiente que queda mucho por optimizar y bueno... al fin y al acabo nunca es suficiente.

También pensé que, en cuando tenga tiempo libre, programar un sniffer ¿Les gustaría?.

Y sin mas rodeos el código (Compilado en Delphi 7), también adjuntare unas imágenes con ciertos detalles de su interés:
Código (pascal) [Seleccionar]

program Gathor;

(*********************************************)
(* Software : Gathor 0.1                     *)
(* Autor    : WarZone                        *)
(* Fecha    : 1/8/13                         *)
(*********************************************)
(* Explicacion:                              *)
(* Un simple gathering de informacion web    *)
(* el cual tiene algunas caracteristicas     *)
(* como leer el source de la pagina(index),  *)
(* ver el servidor en que se esta corriendo, *)
(* fecha, version del protocolo, contenido,  *)
(* opciones de metodos usados <posiblemente  *)
(* permitiendo un Defacement>, etc..         *)
(*********************************************)
(* Parametros + Ejemplo :                    *)
(* <sitio_web> <puerto> <opcion>             *)
(* www.google.com 80 get_proto_0             *)
(*********************************************)
(*    -Opciones de uso / Caracteristicas-    *)
(*                                           *)
(* Los siguientes comandos permiten hacer    *)
(* peticiones HTTP por distintas opciones,   *)
(* GET, POST, HEAD, ETC... y version del     *)
(* protocolo respectivamente 1.0 o 1.1       *)
(*                                           *)
(* get_proto_0 -> metodo GET por HTTP/1.0    *)
(* get_proto_1 -> GET por HTTP/1.1           *)
(* post_proto_0 -> POST por HTTP/1.0         *)
(* post_proto_1 -> POST por HTTP/1.1         *)
(* options_proto_0 -> OPTIONS por HTTP/1.0   *)
(* options_proto_1 -> OPTIONS por HTTP/1.1   *)
(* head_proto_0 -> HEAD por HTTP/1.0         *)
(* head_proto_1 -> HEAD por HTTP/1.1         *)
(*********************************************)

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  WinSock;

const
  { Config }
  BL         = #13#10;

  { HTTP Methods }
  POST        = 'POST';
  GET         = 'GET';
  OPTIONS     = 'OPTIONS';
  HEAD        = 'HEAD';

  { Version }
  HTTP0       = ' HTTP/1.0';
  HTTP1       = ' HTTP/1.1';
  STP         = ' /';

  { Octetos }
  ZERO        = $00000000;
  BSIZE       = $00001024;
  BUFFSIZE    = $000000FF;
  BUFFDATA    = $00001000;
  INADDRSIZE  = $0000000A;

var
  WSData      : WsaData;
  TcpSocket   : tSocket;
  sAddr       : sockaddr_in;
  pIp         : string;
  I           : Integer;

  BuffName    : array [0..BUFFSIZE] of AnsiChar;
  sData       : array [0..BUFFDATA] of Char;

(* Reporte de desensamblado en GetIp
00408450  /$ 55             PUSH EBP            <-----| Callback IP |
00408451  |. 8BEC           MOV EBP,ESP
00408453  |. 6A 00          PUSH 0
00408455  |. 53             PUSH EBX
00408456  |. 33C0           XOR EAX,EAX
00408458  |. 55             PUSH EBP
00408459  |. 68 BA844000    PUSH Project2.004084BA
0040845E  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00408461  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00408464  |. 68 9C374100    PUSH Project2.0041379C                   ; /pWSAData = Project2.0041379C
00408469  |. 6A 01          PUSH 1                                   ; |RequestedVersion = 1 (1.0.)
0040846B  |. E8 98FFFFFF    CALL <JMP.&wsock32.WSAStartup>           ; \WSAStartup
00408470  |. 90             NOP
00408471  |. 90             NOP
00408472  |. 90             NOP
00408473  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
00408476  |. B8 01000000    MOV EAX,1
0040847B  |. E8 88A3FFFF    CALL Project2.00402808
00408480  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00408483  |. E8 A4BBFFFF    CALL Project2.0040402C
00408488  |. 50             PUSH EAX                                 ; /Name
00408489  |. E8 72FFFFFF    CALL <JMP.&wsock32.gethostbyname>        ; \gethostbyname
0040848E  |. 8B40 0C        MOV EAX,DWORD PTR DS:[EAX+C]
00408491  |. 33D2           XOR EDX,EDX
00408493  |. 8B0490         MOV EAX,DWORD PTR DS:[EAX+EDX*4]
00408496  |. FF30           PUSH DWORD PTR DS:[EAX]
00408498  |. E8 3BFFFFFF    CALL <JMP.&wsock32.inet_ntoa>
0040849D  |. 8BD8           MOV EBX,EAX
0040849F  |. E8 6CFFFFFF    CALL <JMP.&wsock32.WSACleanup>           ; [WSACleanup
004084A4  |. 33C0           XOR EAX,EAX
004084A6  |. 5A             POP EDX
004084A7  |. 59             POP ECX
004084A8  |. 59             POP ECX
004084A9  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004084AC  |. 68 C1844000    PUSH Project2.004084C1
004084B1  |> 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004084B4  |. E8 83B7FFFF    CALL Project2.00403C3C
004084B9  \. C3             RETN



*)
function
  GetIP(): PChar;
type
  aIn_addr      = array [0..INADDRSIZE] of pInAddr;
  pIn_addr      = ^aIn_addr;
var
  Hostent     : PHostEnt;
  HostAddr    : pIn_addr;
  HostPData   : PChar;
  Int         : Integer;
begin
  WSAStartup($1, WSData);
  asm
    NOP
    NOP
    NOP
  end;
  Hostent:= GetHostBYName( PChar(ParamStr(1)) );
  HostAddr:= pIn_addr(Hostent^.h_addr_list);
  Int:= 0;
  Result:= inet_ntoa(HostAddr^[Int]^);
  WSACleanUp;
end;

function
  CALLBACK__getIp: string;
asm
  @@StartUp:
    XOR EAX,EAX
    XOR ECX,ECX
    XOR EDX,EDX
    MOV DWORD PTR FS:[EAX],ESP
    LEA EDX,DWORD PTR SS:[EBP-4]
    MOV EAX,1
    MOV EAX,DWORD PTR SS:[EBP-4]
    MOV EAX,DWORD PTR DS:[EAX+$C]
    XOR EDX,EDX
    MOV EDX,EBX
    XOR EAX,EAX
    MOV DWORD PTR FS:[EAX],EDX
    LEA EAX,DWORD PTR SS:[EBP-4]
    NOP
    NOP

    PUSH Pointer($00408450) //Pointer($00408450)
    POP EDX
    CALL EDX                 (* CALLBACK DE LA FUNCION *)
end;

begin
  if (ParamCount<=1) then
    WriteLn('Parametros usados: <sitio_web> <puerto> <opcion>'+BL);
     
  WSAStartUp($1, WSData);
  TcpSocket:= Socket (AF_INET, SOCK_STREAM, ZERO);
 
  sAddr.sin_family:= af_inet;
  sAddr.sin_addr.s_addr:= inet_addr(GetIP()); //INET_ADDR('173.194.42.209');
  sAddr.sin_port:= htons(StrToInt(ParamStr(2))); //htons(Integer(ParamStr(2)));

  (* Opcion por default *)
  if (ParamStr(3)<' ') then
    sData:= 'OPTIONS /index.html HTTP/1.0'+BL+BL;

  (* Gathering automatico *)
  if (ParamStr(3)>' ') then
  begin
    if (ParamStr(3)='get_proto_0') then
      sData:= GET+STP+HTTP0+BL+BL;
    if (ParamStr(3)='get_proto_1') then
      sData:= GET+STP+HTTP1+BL+BL;
    if (ParamStr(3)='post_proto_0') then
      sData:= POST+STP+HTTP0+BL+BL;
    if (ParamStr(3)='post_proto_1') then
      sData:= POST+STP+HTTP1+BL+BL;
    if (ParamStr(3)='options_proto_0') then
      sData:= OPTIONS+STP+HTTP0+BL+BL;
    if (ParamStr(3)='options_proto_1') then
      sData:= OPTIONS+STP+HTTP1+BL+BL;
    if (ParamStr(3)='head_proto_0') then
      sData:= HEAD+STP+HTTP0+BL+BL;
    if (ParamStr(3)='head_proto_1') then
      sData:= HEAD+STP+HTTP1+BL+BL;
  end;
  Try
    if (CALLBACK__getIp<='') then
    begin
      WriteLn('Conectando al servidor: ', GetIP); end
    else begin WriteLn('Conectando al servidor: ', CALLBACK__getIp); end;

    Winsock.Connect(TcpSocket, sAddr, sizeof(sAddr));
    WriteLn('Parametro: ', sData);
    Winsock.Send(TcpSocket, sData, StrLen(sData), MSG_DONTROUTE);
    Winsock.Recv(TcpSocket, BuffName, BSIZE, SD_RECEIVE);
    WriteLn(BuffName);
  Finally
    Shutdown(TcpSocket, SD_BOTH);
    CloseSocket(TcpSocket);
    WSACleanUp();
  end;
end.


Gathor con metódo OPTIONS:


Gathor con metódo POST:


Gathor con metódo GET:


Gathor con metódo HEAD:



PD: Lo del stack y el heap lo agrego por que aun que a muchos no les interese que sea una aplicación grande o pequeña, es un detalle que siempre tengo presente.

Y como ven el tamaño del stack no fue tan drástico (como en otras comparaciones que hice) y me olvide de tomar fotos  >:D
Claro que es un aplicación pequeña...




Y el heap por lo menos no se disperso tanto como pensaba...