Создание реализации netstat для Solaris в Python2.6 + - PullRequest
1 голос
/ 30 октября 2019

Я пишу сценарий коллекции на python для сбора криминалистических артефактов с различных * nix-хостов с использованием сценариев Python 2, однако я сталкиваюсь с некоторыми проблемами при написании коллекции netstat для Solaris.

Есть несколько ограничений:как мне этого добиться. Я не могу использовать двоичные файлы ELF (кроме Python) на компьютере (так как ими часто манипулируют, когда компьютеры атакуют * nix), я не могу импортировать внешние библиотеки (так как это не будет работать на компьютерах, которые я администрирую), и это должно быть записанов Python 2 по причинам обратной совместимости.

Все это, как говорится, я использую документ netstat.c от Illumos (реализация Solaris с открытым исходным кодом) в качестве своей базы, и, по сути, пытаюсь реверс-инжиниринг этого и переписать егов Python 2.

https://searchcode.com/codesearch/raw/52916131/

До сих пор я понял, что скрипт открывает «/ dev / arp» и «/ dev / kstat», чтобы обеспечить возвратзначения.

import os
sd = os.open('/dev/arp', os.O_RDWR)
kc = os.open('/dev/kstat', os.O_RDWR)

После того, как это было сделано, значение 'sd' используется для сбора статистики сети с помощью метода mibget ().

И вот в чем дело. Чтобы собрать информацию о netstat, Solaris запрашивает sd с помощью системного вызова getmsg, однако он использует структуру данных, с которой я не знаком.

getcode = getmsg(sd, &ctlbuf, (struct strbuf *)0, &flags);

Я понятия не имею, как восстановить это в Python 2У кого-нибудь из вас есть хорошие люди, есть идеи, куда я могу пойти отсюда? Я неверно истолковываю это?

Я понимаю, что psutil реализация netstat работает в Solaris, поэтому должен быть способ для этого.

Спасибо всем за помощь.

Редактировать:

Похоже, это соответствующий раздел truss netstat:

open("/etc/default/inet_type", O_RDONLY)        Err#2 ENOENT
open("/dev/arp", O_RDWR)                        = 3
ioctl(3, I_PUSH, "tcp")                         = 0
ioctl(3, I_PUSH, "udp")                         = 0
ioctl(3, I_PUSH, "icmp")                        = 0
putmsg(3, 0x08047E3C, 0x00000000, 0)            = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C)   = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C)   = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C)   = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C)   = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
getmsg(3, 0x00000000, 0x08047E48, 0x08047E5C)   = 0
getmsg(3, 0x08047E3C, 0x00000000, 0x08047E5C)   = 2
brk(0x080736E0)                                 = 0

1 Ответ

0 голосов
/ 30 октября 2019

getmsg() и struct strbuf являются , указанными POSIX, хотя и помечены как устаревшие в POSIX 7 :

ИМЯ

getmsg, getpmsg - получить следующее сообщение из файла STREAMS (STREAMS)

SYNOPSIS

[OB XSR] [Option Start] #include <stropts.h>

int getmsg(int fildes, struct strbuf *restrict ctlptr,
       struct strbuf *restrict dataptr, int *restrict flagsp);
int getpmsg(int fildes, struct strbuf *restrict ctlptr,
       struct strbuf *restrict dataptr, int *restrict bandp,
       int *restrict flagsp); [Option End]

ОПИСАНИЕ

Функция getmsg() должна извлечь содержимое сообщения, расположенного в начале очереди чтения заголовка STREAM, связанной с файлом STREAMS, и поместить содержимое в один или несколько буферов. Сообщение содержит либо часть данных, либо часть управления, либо обе. Данные и управляющие части сообщения должны быть помещены в отдельные буферы, как описано ниже. Семантика каждой части определяется отправителем сообщения.

...

Мне не известны какие-либо привязки Python для STREAMS в Solaris.

Функциональность STREAMS никогда не была реализована в Linux.

...