Убийство чужого сокета

Тема в разделе "WASM.WIN32", создана пользователем gloomyraven, 23 июн 2006.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Добрый вечер господа!

    Суть сабжа такова:

    1. Я сижу с правами юзера (др. вариантов в априоре нет);

    2. на локальной машине есть некий системный сервис (AdminMagic), который создал сокет и прослушивает порт на входящие соединения, количество этих соединений м.б. дохрена, для каждого, ессесно, создается отделный поток;

    3. администратор домена коннектится на этот порт и портит мне жизнь;

    4. я могу его обломать, если законнекчусь первее его, т.е. займу этот порт;



    ВОПРОС: могу ли я (юзер) открыть данный процесс (например OpenProcess), скопировать его хэндлы (сокеты) в мой процесс (DublicateHandle) и че-нть с ним сделать страшное, например закрыть совсем или уменьшить счетчик пользователей этого(их) объекта(ов) до нуля,чтоб система сама его(их) прибила (SetHandleInformation).

    Короче, надо сделать так, чтобы он больше не слушал =)
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    gloomyraven

    :)

    перехвати accept из winsock-a, и будет тебе счастье)
     
  3. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    MegaZu

    Это, конечно, решит проблему, но не совсем то, что надо.

    А если соединение УЖЕ установлено? =( Такое вполне возможно (конечно можно сетевой шнур выдернуть, но это слишком =))).



    Вопрос-то остается... Как получать чужие хэндлы и управлять ими как своими и закрывать когда захочется?



    P.S. что касается сокетов, то я где-то читал, что во время BIND`а создается таблица соответствий: порт - хэндл сокета. И к этой таблице можно поиметь доступ. Но как, если даже не понятно чё за таблица, где создается и кем...
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    gloomyraven

    можно поизвращаться, похувать сенд\ресв , там есть деск. сокета.



    Главное получить сокет, а закрыть его не проблема.
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    MegaZu

    Думаешь, если перехватить accept/recv, то в самох хуке можно узнать хэндл сокета?
     
  6. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    мдя) покури мсдн) первый параметр - сокет.
     
  7. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    MegaZu

    И еще: может так и можно получить "хэндл сокета", но ты слышал про таблицу описателей?

    Т.е., если твой перехватываемый skt HANDLE = 2h, то в таблице описателей хэндл будет выглядеть так:

    1 0х????????? 0x???????? 0x?????????

    2 0xF0000000 0x???????? 0x000000001 - "сокет"



    Эта таблица находится в самом процессе
     
  8. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Мы же не можем взять "2" и считать, что это хэндл сокета =) А даже если смотреть таблицу описателей (чёртову), то каким хреном можно узнать тип хэндла? А может это не сокет, а мьютекс =)
     
  9. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    gloomyraven

    почитай статью мс-рема, о работе с занят. файлами
     
  10. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Ведь переменные, которые мы объявляем как хэндлы в своих программах, совсем не хэндлы, а индексы в той самой таблице описателей. По этим индексам процесс получает указатель на хэндл. Это не я придумал, это все Джефри Рихтер из MS =)))

    Помогите разобраться, я уже запутался.
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Пасибо... пойду пока почитаю...
     
  12. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    К сожалению, без повышения привилегий ничего сделать нельзя. Без прав админа ты не сможешь ничего хукать, не сможешь получить хендл сокета, не сможежь загрузит драйвер и.т.д. Так что если сидишь с правами юзера, то про таблицы хэндлов можешь забыть сразу, лучше ищи эксплоиты для поднятия привилегий.
     
  13. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Так ведь обычные хуки можно ставить (Setwindowshook), мало того, у меня получался сплайсинг. Может там у юзера включена debugprivilege? =) Если это так, то можно ли все-таки получить этот сокет?
     
  14. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    С правами юзера только вытянуть шнур и потом быстро занять порт своей прогой. Имхо, проще всего.
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Во-первых, они работают только с GUI приложениями, во-вторых, для установки хука нужно иметь доступ к декстопу процесса (ну а у юзера досупа к десктопу процессов с более высокими привилегиями нет).





    Фиг то там :) С какой это стати ей быть включеной?



    Короче можно только выдернуть шнур.
     
  16. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Тут на форуме были примеры маленьких снифферов.

    Качаешь, настроиваешь на этот порт.

    Если кто канектится - твой снифак ловит и dest\source port и dest\source ip, дальще берёшь эти данные вставляешь в функцию SetTcpEntry и будет тебе счастье :)
     
  17. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    А доступ к RAW сокетам кто юзеру давать будет? Да и сомневаюсь, что SetTcpEntry от юзера сработает.
     
  18. khv_test

    khv_test New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    135
    согласно дядьке

    http://www.madwizard.org

    This piece of code kills a TCP connection, which does not necessarily have to be owned by your process. It kills the connection by setting the TCP state of it to 'deleted'. Setup a MIB_TCPROW structure which contains the local IP & port as well as the remote IP & port of the connection.

    Then with the TcpSetEntry function in the IP Helper API, set the state to MIB_TCP_STATE_DELETE_TCB.



    requires iphlpapi.lib (download from my site)

    iphlpapi may be useful, but necessary includes are

    shown below:

    ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    IF I_DONT_HAVE_IPHLPAPI_INCLUDES



    MIB_TCP_STATE_DELETE_TCB equ 12



    MIB_TCPROW STRUCT

    dwState DWORD ?

    dwLocalAddr DWORD ?

    dwLocalPort DWORD ?

    dwRemoteAddr DWORD ?

    dwRemotePort DWORD ?

    MIB_TCPROW ENDS

    ENDIF

    ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



    TestRow MIB_TCPROW <MIB_TCP_STATE_DELETE_TCB,

    IPADDR(127,0,0,1),PORTNR(1572), ;local IP & port number

    IPADDR(127,0,0,1),PORTNR(9944)> ;remote IP & port number



    ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    start:

    invoke SetTcpEntry, addr TestRow
     
  19. Flasher

    Flasher Member

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



    [​IMG] 435110422__test.asm
     
  20. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    khv_test

    Flasher

    Я уже думал насчет IPhlpApi (SetTcpSEntry и иже с ним), но, как сказал(а?) миссис Рэм, они не должны работать. Единственное, что можно извлечь полезного из этой длл (в контексте юзверя) это функцию определения состояния TCP. Да и к тому же библиотека на Си и переделывать её под масм лень (мож у кого есть?)



    2 all

    А пока напрашивается только один вариант: по количеству тредов в процессе (сервиса) определить есть ли к нему коннект от кого-либо и если есть, то выдергиваем сетевой шнур, быстренько коннектимся на ентот порт и вставляем шнур обратно =))) Но это как-то не изящно =) Хотелось бы без выдергивания.



    А кстати, как можно узнать, что процесс прослушивает порт, и на каком порту уже висит соединение, а то как сделал я... это смешно =D (не используя PCap и IPhlpApi)