vlambda博客
学习文章列表

一个绕过osquery socket日志监控的小技巧(非阻塞调用connect)

https://github.com/osquery/osquery/issues/6609

很久之前提的一个issue,最近刚好看又有人遇到了相同的问题。

osquery 处理系统调用时会默认将状态码错误的调用直接丢弃,无法通过audit获取相应系统调用事件



osquery 获取socket events

https://osquery.readthedocs.io/en/stable/deployment/process-auditing/#linux-socket-auditing-using-audit

osquery 通过audit 读取系统syscall 日志,同时将网络连接相关信息存入 socket_events 表,查询时,直接

select * from socket_events;
// 得到的数据格式{ "action": "added", "columns": { "time": "1527895541", "success": "1", "remote_port": "80", "action": "connect", "auid": "1000", "family": "2", "local_address": "", "local_port": "0", "path": "/usr/bin/curl", "pid": "30220", "remote_address": "172.217.164.110" }, "unixTime": 1527895545, "hostIdentifier": "vagrant", "name": "socket_events", "numerics": false}


数据丢失发生在osquery 处理audit 日志时:


下方关键数据处理逻辑,导致数据丢失

当status != yes 时即丢弃掉用日志;

https://github.com/osquery/osquery/blob/56efd73165e53a65b7e0bd148e801d05fecae32e/osquery/events/linux/auditeventpublisher.cpp#L244


正常情况下丢弃不成功的系统调用日志是没问题的,可惜 linux 的 connect (syscall=42有点特殊,


connect 调用存在阻塞和非阻塞调用两种,

非阻塞调用的情况下,系统直接返回错误码 -115,但是实际上这个socket连接还是可以被使用


以下写法发起的非阻塞调用,osquery 不会记录socket日志

import socketsock = socket.socket()sock.setblocking(False)sock.connect(('www.google.com',443))