【问题标题】:Creating an implimentation of netstat for Solaris in Python2.6+在 Python2.6+ 中为 Solaris 创建 netstat 的实现
【发布时间】:2020-02-25 20:57:35
【问题描述】:

我正在用 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 信息,Solaris 使用系统调用 getmsg 查询 sd,但它使用的是我不熟悉的数据结构。

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

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

我了解 netstat 的psutil 实现可在 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

【问题讨论】:

    标签: python c python-2.7 solaris computer-forensics


    【解决方案1】:

    getmsg()struct strbufspecified by POSIX, albeit marked as obsolescent in POSIX 7

    姓名

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

    ...

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

    STREAMS functionality 从未在 Linux 上实现。

    【讨论】:

    • 当然 Solaris 会使用几乎没有其他人使用的协议,并且已经过时了,不幸的是,我不知道这是否让我更接近解决问题,因为看来我需要弄清楚无论他们设置的这个任意缓冲区是什么。谢谢!
    猜你喜欢
    • 2011-01-29
    • 2019-09-15
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多