Клавиатурный буфер

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 25 июл 2017, 14:34

seregin писал(а):И статья по этому коду http://www.cs.columbia.edu/~mikepo/pape ... osec13.pdf
Вы можете пойти, в конце этой публикации, в библиографию, там 35 наименований, слава Богу ... и пойти по их ссылкам по этой тематике.
Все они, в большинстве, крутятся вокруг обсуждений сообщения Anthony Lineberry на конференции Black Hat Europe April 2009.
Вот, в частности, в LinuxJournal обсуждение - Anthony Lineberry on /dev/mem Rootkits
August 2009
Aug 01, 2009 By Mick Bauer
Изображение
At Black Hat Europe in mid-April 2009, Anthony Lineberry presented an interesting paper on how attackers with root privileges might use a /dev/mem rootkit, hiding their attacks by directly altering kernel memory.
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 25 июл 2017, 14:40

Olej писал(а): А по поводу кода (модуля) сказано в тексте:
The pseudocode for scanning the low memory addresses of a 32-bit x86 system is shown in Figure 3.
Это очень важно, что этот код создавался для 32 бит системы.
Я думаю, главная причина ваших неудач по этой схеме состоит в том, что всё это описывается только для 32-бит адресации.
А способы адресации, структуры данных, ... и даже архитектура системных вызовов (всех сетевых, например) в ядре для 32 и 64 бит реализаций радикально отличаются, как небо и земля ;-) (это в пользовательском пространстве они почти одинаковы, похожи, но в ядре это совсем не так).

Если вам позарез нужно добить этот способ - попробуйте обкатать его в 32-бит системе.
У вас нет 32-бит системы? ;-)
Вы можете легко это сделать установив по-быстренькому под VirtualBox.
Обычно этот номер проходит.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 25 июл 2017, 14:51

Olej писал(а): А способы адресации, структуры данных, ... и даже архитектура системных вызовов (всех сетевых, например) в ядре для 32 и 64 бит реализаций радикально отличаются, как небо и земля ;-) (это в пользовательском пространстве они почти одинаковы, похожи, но в ядре это совсем не так).
А если (или когда :lol: ) вам захочется отследить различия между 32 и 64 бит (по коду ядра), то в помощь вам вот такие онлайновые ресурсы: Linux Cross Reference.
Потому что (по опыту!) отследить такие отличия по локальным исходникам, установленным на собственном компьютере, практически невозможно.

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 25 июл 2017, 17:53

попробовал, также, ерунда) ладно буду писать, что не удалось выполнить задание :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 25 июл 2017, 19:41

seregin писал(а):попробовал, также, ерунда) ладно буду писать, что не удалось выполнить задание :-(
Можно, наверное, довести эту задачу до ума.
Но только это - совершенно неординарная задача, и уж никак не для студенческого курсового задания, такими руткитами занимаются совершенно неординарные программисты, никак не среднего уровня.
Для того, чтобы это осилить, нужно, для начала, очень много и очень внимательно читать: всё, что дано в библиографии статьи, с которой началась тема (35 публикаций) + то что дальше потянется ссылками из этих статей.
Это была бы действительно хорошая работа ... перелопатив весь этот материал сложить реализующий программный код.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 26 июл 2017, 12:30

Olej писал(а): Все они, в большинстве, крутятся вокруг обсуждений сообщения Anthony Lineberry на конференции Black Hat Europe April 2009.
Вот, в частности, в LinuxJournal обсуждение - Anthony Lineberry on /dev/mem Rootkits
August 2009
Aug 01, 2009 By Mick Bauer
Изображение
At Black Hat Europe in mid-April 2009, Anthony Lineberry presented an interesting paper on how attackers with root privileges might use a /dev/mem rootkit, hiding their attacks by directly altering kernel memory.
...
Теперь меня уже самого заинтересовало их (авторов) обсуждение и можно ли с этой стороны ожидать каких-либо неприятностей в Linux? :cry:
Вообще то, все многочисленные обсуждения (2009г.) вокруг этих публикаций сводятся к простым вещам:
- тупо сканировать всю RAM память компьютера...
- в поисках той области, которая по признакам является клавиатурным буфером
- и главная нацеленность самих публикаций - использование GPU видеокарты, OpenCL для того, чтобы разгрузить CPU от сканирования памяти ... на манер того, как это делается в майнинге криптовалют.

Вопрос здесь главный в самих признаках: что станем искать?
seregin писал(а): И статья по этому коду http://www.cs.columbia.edu/~mikepo/pape ... osec13.pdf
3.1 Locating the Keyboard Buffer
In Linux, an attached USB device is represented by a USB Request Block (URB) structure, defined in the linux/usb.h header file of the Linux source tree. Figure 2 shows the fields of the USB Request Block structure that are relevant for our work. For a USB keyboard device, in particular, the keyboard buffer is part of the URB structure, in the field transfer_buffer. Unfortunately, the memory offset where the URB structure is placed is different every time the system restarts.
...
struct usb_device *dev
...
void *transfer_buffer
dma_addr_t *transfer_dma
...
u32 *transfer_buffer_length
...
Figure 2: Fields of interest in the USB Request Block (URB) structure.
А вот и сами признаки того что ищем:
The pseudocode for scanning the low memory addresses of a 32-bit x86 system is shown in Figure 3. This approach is sufficient for memory allocated using kmalloc(), which always returns kernel virtual addresses that have a physical mapping (logical addresses) [8]. To locate the keyboard buffer, we begin to search for pointers to USB device structures. Such pointers are memory-aligned to 0x400 boundaries, and the corresponding transfer_dma fields are aligned to 0x20 boundaries. If both conditions are true, we check if the product field contains any of the substrings “usb” and “keyboard” (for wired USB keyboards), or “usb” and “receiver” (for wireless keyboard/mouse sets). As a final step, we check that the field transfer_buffer_length contains the appropriate length (8 bytes) and that it contains valid keystroke values, e.g., all bytes are zero if no key is pressed. For 32-bit systems, in which the kernel address space is at most 1 GB, the total search time in the worst case is just about 3.2 seconds.

Код: Выделить всё

#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
for (i = 0; i < totalmem; i += 0x10) {
   struct urb *urbp = (struct urb *)__va(i);
   if (((urbp->dev % 0x400) == 0) &&
      ((urbp->transfer_dma % 0x20) == 0) && 
      (urbp->transfer_buffer_length == 8) &&
      (urbp->transfer_buffer != NULL) &&
      strncmp(urbp->dev->product, "usb", 32) &&
      strncmp(urbp->dev->product, "keyboard", 32)) {
/* potential match */
   }
}

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 26 июл 2017, 12:50

Olej писал(а): Вопрос здесь главный в самих признаках: что станем искать?
В итоге, что мы у них имеем:
- это всё рассказано только для 32-бит системы
- откуда такие границы выравнивания? - это нужно ещё проверять ... и для 64-бит системы struct urb может существенно отличаться
- это всё относится только к USB-клавиатуре... да и то, они различают 2 случая: а). проводная USB-клавиатура и б). беспроводной USB комплект (приёмник) клавиатура+ мышь...
а как быть если попадётся компьютер с PS/2
а как быть с встроенной клавиатурой ноутбуков?
а как быть, если клавиатура и мышь подключены через USB коммутатор D-Link DKVM? ... вот такой, например:

Код: Выделить всё

[olej@xenix ~]$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 2101:020f ActionStar 
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Код: Выделить всё

[olej@xenix ~]$ lsusb -v -d 2101:020f

Bus 003 Device 002: ID 2101:020f ActionStar 
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.00
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x2101 ActionStar
  idProduct          0x020f 
  bcdDevice            0.01
  iManufacturer           0 
  iProduct                0 
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           59
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      63
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      72
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
P.S. И не совсем понятно, зачем они возятся с GPU сканированием, если CPU у них сканирует всю память за 3 сек., а адрес искомой области меняется только при перезагрузке системы? (ну, возможно ещё, при механическом отключении-включении USB-клавиатуры на ходу).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение Olej » 26 июл 2017, 14:25

seregin писал(а): Единственную информацию, которая я думаю подходит я нашел здесь: https://github.com/x0r1/Demon Там ищется буфер клавиатуры(наверно)
И статья по этому коду http://www.cs.columbia.edu/~mikepo/pape ... osec13.pdf
Вот та реализация на GIT, она действительно в точности наследует (повторяет) псевдокод из статьи.
Но этот код даже не компилируется!
Если уж кого заинтересует этот код (?), то в приложении файл, по крайней мере компилирующийся, собирающийся в модуль ядра:

Код: Выделить всё

[olej@xenix module_scan]$ make
make -C /lib/modules/4.11.10-200.fc25.x86_64/build SUBDIRS=/home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan modules
make[1]: вход в каталог «/usr/src/kernels/4.11.10-200.fc25.x86_64»
  CC [M]  /home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/mod_scan.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/mod_scan.mod.o
  LD [M]  /home/olej/WORK_2017/own.WORK/AntiHack/CapturingKeystrokes/Demon-master/module_scan/mod_scan.ko
make[1]: выход из каталога «/usr/src/kernels/4.11.10-200.fc25.x86_64»
Но даже в таком виде его загрузка (insmod) заканчивается SIGSEGV - нарушением защиты памяти. :-o
Вложения
mod_scan.c
(2.19 КБ) 123 скачивания

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 27 июл 2017, 11:19

https://github.com/volatilityfoundation ... bioskbd.py находил такой плагин) по идее он ищет буфер) вот что писал разработчик этого плагина, я ему писал, спрашивал про буфер
Hmmm,

I'm afraid I'm not very well versed on the linux plugins. The
bioskbd.py reads real-mode memory and therefore is independent of the
operating system. I would still expect to find the data there, what
kind of a memory image are you using?

If you're trying to read directly from /dev/mem, that isn't really a
memory image and you might find that the linux kernel you're running
under doesn't allow access to that particular part of memory. I'd
recommend trying to acquire the memory some other way. There are
multiple tools for memory acquisition, but most are windows based.
Volatility itself doesn't do acquisition, it just reads pre-acquired
memory image files. As such, volatility doesn't read a specific file on
linux, it reads from a full memory dump which /dev/mem may not provide.

It sounds like your real question is "how can I access the full physical
memory of a machine from linux" and unfortunately I don't know that
answer to that. I hope that's been of some help?

Mike 5:)

seregin
Писатель
Сообщения: 33
Зарегистрирован: 23 июл 2017, 12:46
Контактная информация:

Re: Клавиатурный буфер

Непрочитанное сообщение seregin » 28 июл 2017, 01:16

а вот смотрите, у клавиатуры есть 60 порт, можно ли как-то с помощью ассемблера записать туда что нибудь и узнать адрес куда записалось это
или функции byte = inb (0x60);
вот статья http://albsig.hgesser.de/bs-ss2013/albs ... 2013-c.pdf (последние слайды)

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей