【发布时间】: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