为啥写这东西

链接放了,欢迎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封装

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

1609393071_5fed63af1f2388ba64026.png!small


TOR

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

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

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

CDN

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

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

1609221047_5feac3b727e3dd50ba701.png!small

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

1609145566_5fe99cde5ed8d9601942f.png!small?1609145568165

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

1609145589_5fe99cf527811457cbd0c.png!small?1609145596199

主机信息

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

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

下面的系统信息包括了:

  • agent编号和UUID

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

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

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

  • 本地绑了什么IP

  • ARP缓存

  • 主机名和机器ID

  • CPU型号和数量

  • 内存大小

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

  • 是不是在容器里运行

  • agent的进程和父进程信息

  • 具体的linux内核版本

1609393602_5fed65c20a74a8552b5bf.png!small

自动出网代理

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

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

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

多跳出网已经完成了。

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

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

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

1609146001_5fe99e91122eaa1e40f89.png!small?1609146010261

这就是多跳出网:

1609310298_5fec205af24b372b6358c.png!small?1609310302533

C2在线状态检测

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

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

隐藏进程和文件

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

1609146029_5fe99ead6d226e394d27f.png!small?1609146030037

模块功能

基础管理终端

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

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

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

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

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

剩下的看图就知道了。

1609146040_5fe99eb8ede8656106dc5.png!small?1609146045683

完美的反弹bash shell

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

从图里看:

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

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

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

  • 有真彩色!

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

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

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

1609146055_5fe99ec7862a6a53664d4.png!small?1609146061137

插件系统

就在上面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完成的示例:

1609146066_5fe99ed27e321f6498bc9.png!small?1609146069250


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

自动Root

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

1609146082_5fe99ee21fdb70a5d3d4d.png!small?1609146082759

具体的在我博客有介绍。

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

提权辅助

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

1609146095_5fe99eef946c0602b7ebb.png!small?1609146096150

端口映射

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

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

1609146106_5fe99efa676bd966e8589.png!small?1609146107118

socks代理

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

怎么用

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

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

编译C2服务器

1609146141_5fe99f1d49cdfa158e938.png!small?1609146141776

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

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

编译agent

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

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

1609146150_5fe99f264b20a615770ed.png!small?1609146150705

运行agent

1609146161_5fe99f3144329f6a7d15f.png!small?1609146161765

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

比如tor的话,你需要

-proxy 'socks5://torproxy:port'

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

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

这样的代理地址。

未来计划

支持更多的隐藏手段

打算把:

  • container based

  • LKM内核模块

  • 进程注入

都实现一下。

内网渗透

  • 扫描模块

  • 自动漏洞利用和传播

  • 网络流量抓取和分析

  • 服务弱口令探测

  • 集成常见的exploit kit

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

鸣谢

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

  • 给我打钱打star的你们

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

本文作者:0x4d69