一个绕过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 socket
sock = socket.socket()
sock.setblocking(False)
sock.connect(('www.google.com',443))