首页 > 解决方案 > 在 Python2.6+ 中为 Solaris 创建 netstat 的实现

问题描述

我正在 python 中编写一个集合脚本,以使用 Python 2 脚本从各种 *nix 主机中获取取证工件,但是我在为 Solaris 编写 netstat 集合时遇到了一些问题。

我如何实现这一目标有一些限制。我无法在计算机上使用 ELF 二进制文件(Python 除外)(因为它们经常在 *nix 机器受到攻击时被操纵),我无法导入外部库(因为这不会在我管理的计算机上运行),并且必须编写出于向后兼容性的原因,在 Python 2 中。

话虽如此,我使用 Illumos 的 netstat.c 文档(一个开源 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 信息,Solarissd使用 syscall进行查询getmsg,但它使用的是我不熟悉的数据结构。

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

我不知道如何在 Python 2 中重建它,你们中的任何人对我可以从这里去哪里有任何想法吗?我解释错了吗?

我知道psutilnetstat 的实现在 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

标签: pythoncpython-2.7solariscomputer-forensics

解决方案


getmsg()并由POSIX 指定,尽管在 POSIX 7 中标记为struct strbuf过时:

姓名

getmsg, getpmsg - 从 STREAMS 文件 (STREAMS) 接收下一条消息

概要

[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()函数应检索位于与 STREAMS 文件关联的 STREAM 头读取队列头部的消息内容,并将内容放入一个或多个缓冲区。消息包含数据部分、控制部分或两者。消息的数据和控制部分应放置在单独的缓冲区中,如下所述。每个部分的语义由消息的发起者定义。

...

我不知道 Solaris 上 STREAMS 的任何 Python 绑定。

STREAMS 功能从未在 Linux 上实现。


推荐阅读