6

emp3r0r - Linux用户打造的Linux后渗透框架

 3 years ago
source link: https://www.freebuf.com/sectool/259079.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为啥写这东西

链接放 了,欢迎star。

好像没几个人写过专门用于Linux家族的远控或者后渗透工具,现有的项目在我看来都不够好使。

尤其是远程终端,就没人能把它做得能像回事。他们都满足于一个简陋无比的反弹shell,随便按下个ctrl-c就会挂掉,大部分终端应用程序几乎没法用。有的甚至连shell都不是,只有一个命令执行(甚至连管道和定向也不支持)。真彩色,快捷键支持,bashrc,job control这些“高级”功能想都不要想了。

作为一个活在终端里的资深Linux用户,我是无法忍受的。所以写 emp3r0r 的时候,我着重优化了反弹bash shell的终端使用体验。负责任地说,在 emp3r0r 里的远程终端体验毫不逊色于直接使用 gnome terminalopenssh

顺便提一嘴,终端指的是gnome terminal这种程序,它只负责显示和接收输入,而shell指的是bash这样的东西,别搞混了。

除此之外,我也希望把个人所学都放进 emp3r0r 项目,可能我以后成为大佬了, emp3r0r 也会成为一款好使的Linux入侵工具(笑

至于为什么叫做”emp3r0r“,我最早是参照Windows下的 empire 项目来做的,既然它叫帝国,我就叫皇帝好了。

核心功能

HTTP2通信隧道

HTTP2相比与HTTP1.1,除了高效快速之外,最重要的是它能够实现全双工,这也是一款完整的远控必需的特性之一。

还有一个选择是websocket(应用也更广泛),但我想搞个不一样的,刚好有个以色列的大佬写了个HTTP2连接的库 h2conn ,那就它了。

然后,TLS是强制的。emp3r0r的通信加密主要靠TLS,为了防止MITM攻击,我设计的编译脚本会自动生成自签名CA,用它签发服务器证书,并将agent的CA池清空,仅信任我们C2服务器的CA。

另外HTTP2也可以支持任意代理协议,如果愿意,你可以把agent的流量封装到任何可行的协议里,只用实现你的协议隧道,提供个HTTP代理接口就行。这个东西你们可能会叫它流量伪装,no,这不是伪装,这是封装。

其它Transport封装

为了方便,我就直接放个全家福。 Tor CDN HTTP2 裸连都在这了。

FZ3eIb.jpg!mobile

为了方便使用,我特意编译了一份能够扔到大部分linux机器上跑的 纯静态 tor二进制文件

客户端设置好tor代理即可连接到tor上的C2服务器。需要注意的是,tor服务不一定需要运行在公网上,你可以随便在本地开个来测试。

用tor的好处不用我多说了,你们自然明白。但也别犯蠢, emp3r0r 不适合除了正规测试以外的用途。

CDN

我其实专门写过 一篇文章 讲这个东西。

这是由我写的一个简单的 外部库 实现的,大体上结构类似于:

BFN3ErR.jpg!mobile

配置好的话,agent端的流量就是:

N3M7F3Y.jpg!mobile

在C2服务器上看,是这样的:

YnQru2Y.jpg!mobile

主机信息

主机信息收集我觉得也很重要,所以我在保持基本美观的前提下,把我所想到的信息全部展示在预览中。图片在前面发过了,就是全家福那个。

下图是单个agent通过裸HTTP2连接的示意,上面是agent的debug输出。

下面的系统信息包括了:

  • agent编号和UUID

  • agent进程的用户名,其home目录,及UID,GID

  • 系统版本,包括了发行版细分版本

  • 来自哪个IP和端口,通过哪个transport过来的

  • 本地绑了什么IP

  • ARP缓存

  • 主机名和机器ID

  • CPU型号和数量

  • 内存大小

  • 硬件设备型号和制造商,及版本,如果是虚拟机则增加虚拟化技术的显示

  • 是不是在容器里运行

  • 具体的linux内核版本

IzyMbuu.jpg!mobile

自动出网代理

无需多言,这是很重要的一个功能。

我的想法是,如果网内安装的agent足够多,那么它们自己就能协商出一个出网通道来。

目前阶段只实现了单跳的出网代理(刚写的),不支持多跳出网。

多跳出网已经完成了。

这一切都是自动完成,agent根据自身网络情况决定是发广播给别人提供代理,或是接收这样的广播。

当然了,广播信息也是加密的,频率也低,一般没多少人注意。

下图就是一个Ubuntu机器通过kali提供的代理上线的示意。

jUvqYfM.jpg!mobile

这就是多跳出网:

fmumiau.jpg!mobile

C2在线状态检测

为了避免过高的poll频率引起注意,我们设置一个C2在线指示。它可以是 GitHub上的一个文本文件 或者微博上的一段文字,总之越难引人注意越好。

poll频率是随机变化的,想做时间pattern检测的还是多想想吧。

隐藏进程和文件

目前实现了基于glibc劫持的进程和文件隐藏,只要加载了 libemp3r0r ,持久化和隐藏就都有了。

BZ3MruM.jpg!mobile

模块功能

基础管理终端

这是你的起始控制终端,实现原理是把你的命令发给agent,agent调用 execsh -c 来执行,结果会返回给你。

实际上这不是一个shell,只是看上去像那回事。

如果有错误,会返回return code,如果返回一大坨刷屏的输出,那么会被自动扔到一个新的 tmux 面板里面,避免污染工作空间。

输入help,可以查看可用的功能,包括文件管理之类的。

然后别忘了,按tab键补全命令。

剩下的看图就知道了。

qUvEr2R.jpg!mobile

完美的反弹bash shell

这是我最满意的功能之一了。

从图里看:

  • 本shell与系统默认shell完全无关,是一个纯静态的bash二进制文件,且使用不同的RC文件

  • 默认不保存任何历史命令

  • 可以用tmux和其它要求完整终端功能的软件,比如vim和top

  • 有真彩色!

  • 自动设置了PATH,将我们的自定义工具库安排上了。

一切你本地终端支持的,这里都支持!

然后这个bash反弹shell是一样的封装到HTTP2连接里,跟其它C2流量毫无区别。

FJ7BZnB.jpg!mobile

插件系统

就在上面bash的图里,nmap,socat都在那了,想要别的什么可以自己上传。

我的“插件系统”实际上与母体没多大关系,emp3r0r做的仅仅是通过 vaccine 模块,把所有的“插件” 打包 上传给agent,然后agent配置好它们。

而你就通过控制终端来使用它们。

扩展性max!你可以添加bash脚本,不用管目标机器上是不是有bash,也可以添加二进制程序,要啥传啥就行。

目前支持了:

  • cron

  • LD_PRELOAD加载我们的 shared object

  • bash profile,注入常用命令

  • 其它还在计划中

进程注入

还没完成,主要通过GDB来加载shared object到可注入的进程。

用户凭据收割

这是一个注入到sshd进程的shared object,通过 ptrace 对sshd进行自动调试,最终目的是把它接到的明文密码dump出来。

用GDB完成的示例:

z2IFrum.jpg!mobile

写到 我博客 了,还没集成进去,以后再说吧。

自动Root

可以通过一些好用的本地提权漏洞直接提升agent的权限到root:

iY3yum.jpg!mobile

具体的在 我博客 有介绍。

目前内置了一个CVE-2018-14665。

提权辅助

这个模块可以下载两个提权辅助脚本并在agent上运行,结果会返回给C2:

JBnaau.jpg!mobile

端口映射

支持从agent到C2的端口映射,本质上是由agent代理一个目标地址并对接到C2端。

这个也是完全一样的HTTP2封装。

be6NRfy.jpg!mobile

socks代理

在agent上起一个socks5代理,然后映射到C2,从而可以让你在C2端使用代理。

我写了个 wiki ,欢迎大家修改和添加内容。

这里简单介绍下编译和配置过程:

编译C2服务器

3ARVNfF.jpg!mobile

说明一下,编译C2会自动生成一个自签名CA,然后用它签发C2服务器的TLS证书。

一个C2服务器证书可以对多个DNS名称或者IP地址进行背书,你有几个就写几个,tor的onion地址也支持。

编译agent

编译agent的话,你只可以写一个C2地址,这是写死到agent里的。

indicator是指示C2是否在线的一个文件,内容是emp3r0r,参见前文介绍。

biQz6fm.jpg!mobile

运行agent

qaYJBbM.jpg!mobile

根据C2服务器地址,你可以选择使用相应的命令行参数。

比如tor的话,你需要

-proxy 'socks5://torproxy:port'

CDN的话,你需要在C2端启用内置代理,然后在agent参数里指定如

-cdnproxy wss://cc.example.com/ws

这样的代理地址。

未来计划

支持更多的隐藏手段

打算把:

  • container based

  • LKM内核模块

  • 进程注入

都实现一下。

内网渗透

  • 扫描模块

  • 自动漏洞利用和传播

  • 网络流量抓取和分析

  • 服务弱口令探测

  • 集成常见的exploit kit

慢慢来吧,如果有需要可以 给我打钱 ,我优先做(笑

鸣谢

  • 虽然菜鸡但坚持写代码的我

  • 给我打钱打star的你们

  • 国内外大佬们的开源贡献


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK