安全黑客
当前位置:安全黑客文章资讯安全资讯安全新闻
日期:2019-01-09 23:23:00  来源:本站整理

Linux进程感染part1[安全新闻]

赞助商链接



  本文“Linux进程感染part1[安全新闻]”是由安全黑客为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

对于红队来说,他们需要执行各种各样的任务,而在这些任务中,有一个任务特别重要,因为需要精心构造:也就是将APT植入目标系统中并且要确保其可持续访问。不过,这种可持续性机制都是基于文件的,就是将可执行文件放在不同的位置,然后使用某种技术来激活(比如shell脚本,别名,链接,系统启动脚本等)。这种方法虽然可行,但是容易被蓝队安全专家发现,蓝队安全专家只需要定位到APT文件的位置并且可以对其进行分析。
尽管蓝队安全专家迟早会发现,红队也有一些技巧来增加APT文件的隐秘性,让目标系统中的APT文件更加难以检测(至少可以延迟检测到的时间)。在本系列文章中,我们不会讲解常规的基于文件系统的APT存储,相反,我们会详细讲解一些基于进程树的可持续性机制。
条件
该技术将在X86-64 GNU/Linux系统中来进行。当然,这个理论也可以很轻易的扩展到其他操作系统,只要具有完整的调试API即可。需要满足的最小的条件是:任何较新的GCC版本即可。
使用其他进程的地址空间作为仓库
这种技术的核心就是使用正在运行的非特权进程的地址空间作为存储区域并且向它们注入两个线程:第一个线程会尝试感染其他进程,另外一个线程则包含了payload(在这个例子中,它会确保文件系统的可持续性),如果文件被删除了,它会换一个文件名重新还原。
不过有一点需要注意,这种技术将会严重受到主机运行时的限制,应该在那些不经常重启的系统中使用该技术,这可以看做是可持续机制的一种补充机制。
构造注入
显然,这种技术的关键就是代码注入本身。由于无法预先知道代码将存放在目标系统中的位置,所以该代码应该是位置独立的代码,也就是与位置无关。这就表明了我们需要使用动态链接库,因为它们可以“原样”存储在内存中。不过,这种注入技术有一些不足之处:
· 绝大多数注入信息都是元数据(比如头信息等)
· 解析和加载库所需要的代码虽然不是特别复杂,但是与payload相比,也是不能忽略的。
· 共享库使用众所周知的文件格式,使得结果文件也易于分析
理想情况下,注入的代码越少越好,几页代码就行,可以是数据的附加页面。这些都可以通过链接器脚本来实现。不过,对于这种POC,我们需要将共享库作为“第一容器”。
另外,还有一点限制需要注意的是,可能不需要加载目标进程作为动态可执行文件(因此,可能无法动态地加载C库)。而且,在加载的共享库上手工解析符号也是非常痛苦的,依赖于ABI,并且几乎无法维护,这表明很多标准C函数需要手动重新实现。
而且,这种注入技术是基于ptrace系统调用的,如果目标进程没有足够的权限(或者是管理员明确禁止使用此功能),那么这种方法基本上也就无效了。
最后还有一个限制是动态内存的使用。动态内存的使用涉及到堆处理,堆的内部结构是非常不标准的,比较复杂。一般来说,在程序的地址空间中占用大量内存是不合理的。所以,要尽量少使用动态内存来减少内存空间占用。
Roadmap
这个POC将会执行以下操作:
库会保留两个入口点。入口点的位置会提前知道(因为它们与可执行文件的起始位置的距离是固定的),并且与注入线程的主函数的起始位置相对应。
感染线程会列出系统中正在运行的进程,然后定位到那些可能被攻击的进程。
对每个进程会执行ptrace函数并进行内存读取,检测是否已经被感染。
为了准备目标地址空间,必须注入系统调用。这些系统调用必须分配必要的内存页面来存储注入的代码。
生成两个线程并继续执行已调试的进程
每个阶段的每一步都需要精心准备,我会在下面的部分跟大家详细解释。
准备环境
为了使得代码尽可能简洁,编译为共享库的小型C程序将作为一个起点。另外,在程序完全自主运行之前进行一些测试,将会提供另一个在库中运行特定符号的小型C程序。为了简化开发过程,还会提供一个包含了所有构建规则的makefile。
对于可注入库的入口点来说,将会使用一下模本文件:
1.   void
2.   persist(void)
3.   {
4.   /* Implement me */
5.   }
6.   
7.   void
8.   propagate(void)
9.   {
10.  /* Implement me */
11.  }
执行入口点初始化执行过程的程序将被命名为“spawn.c”,代码如下:
1.   #include
2.   #include
3.   #include
4.   
5.   int
6.   main(int argc, char *argv[])
7.   {
8.   void *handle;
9.   void (*entry)(void);
10.  
11.  if (argc != 3) {
12.  fprintf(stderr, "Usage\n%s file symbol\n", argv[0]);
13.  exit(EXIT_FAILURE);
14.  }
15.  
16.  if ((handle = dlopen(argv[1], RTLD_NOW)) == NULL) {
17.  fprintf(stderr, "%s: failed to load %s: %s\n", argv[0], argv[1], dlerror());
18.  exit(EXIT_FAILURE);
19.  }
20.  
21.  if ((entry = dlsym(handle, argv[2])) == NULL) {
22.  fprintf(stderr, "%s: symbol `%s' not found in %s\n", argv[0], argv[2], argv[1]);
23.  exit(EXIT_FAILURE);
24.  }
25.  
26.  printf("Symbol `%s' found in %p. Jumping to function...\n", argv[2], entry);
27.  
28.  (entry) ();
29.  
30.  printf("Function returned!\n");
31.  
32.  dlclose(handle);
33.  return 0;
34.  }
最后,将会编译两个程序的Makefile文件代码如下:

[1] [2] [3]  下一页


  以上是“Linux进程感染part1[安全新闻]”的内容,如果你对以上该文章内容感兴趣,你可以看看安全黑客为您推荐以下文章:
  • Linux进程感染part1
  • Linux Userland内存代码注入实践
  • CVE-2018-19788:UID大于INT_MAX的Linux用户任意代码执行漏洞
  • Linux系统官网被黑,黑客“菊花”嘲讽
  • 利用Azure安全中心可以提前检测到Linux受到的攻击
  • 如何使用Firewalld配置Linux主机?
  • Linux kernel 4.20 BPF 整数溢出-堆溢出漏洞及其利用
  • 厉害了!Linux加密货币挖矿机可删除杀毒软件
  • 针对新型IoT僵尸网络Linux.Omni的分析
  • 微软购买价值2,400万美元价值的SUSE Linux
  • 微软Linux与Novell的协议
  • XPwn iPhone发布适用于Mac,Windows和Linux的黑客工具
  • 本文地址: 与您的QQ/BBS好友分享!

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    免责条款 - 广告合作 - 下载声明 - 欢迎投稿 - 友情连接 - 网站地图 -
    Copyright © 2012-2013 www.110hack.com. All Rights Reserved .