为啥写这东西
链接放这了,欢迎star。
好像没几个人写过专门用于Linux家族的远控或者后渗透工具,现有的项目在我看来都不够好使。
尤其是远程终端,就没人能把它做得能像回事。他们都满足于一个简陋无比的反弹shell,随便按下个ctrl-c就会挂掉,大部分终端应用程序几乎没法用。有的甚至连shell都不是,只有一个命令执行(甚至连管道和定向也不支持)。真彩色,快捷键支持,bashrc,job control这些“高级”功能想都不要想了。
作为一个活在终端里的资深Linux用户,我是无法忍受的。所以写emp3r0r的时候,我着重优化了反弹bash shell的终端使用体验。负责任地说,在emp3r0r里的远程终端体验毫不逊色于直接使用gnome terminal和openssh。
顺便提一嘴,终端指的是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裸连都在这了。
为了方便使用,我特意编译了一份能够扔到大部分linux机器上跑的纯静态tor二进制文件。
客户端设置好tor代理即可连接到tor上的C2服务器。需要注意的是,tor服务不一定需要运行在公网上,你可以随便在本地开个来测试。
用tor的好处不用我多说了,你们自然明白。但也别犯蠢,emp3r0r不适合除了正规测试以外的用途。
我其实专门写过一篇文章讲这个东西。
这是由我写的一个简单的外部库实现的,大体上结构类似于:
配置好的话,agent端的流量就是:
在C2服务器上看,是这样的:
主机信息
主机信息收集我觉得也很重要,所以我在保持基本美观的前提下,把我所想到的信息全部展示在预览中。图片在前面发过了,就是全家福那个。
下图是单个agent通过裸HTTP2连接的示意,上面是agent的debug输出。
下面的系统信息包括了:
agent编号和UUID
agent进程的用户名,其home目录,及UID,GID
系统版本,包括了发行版细分版本
来自哪个IP和端口,通过哪个transport过来的
本地绑了什么IP
ARP缓存
主机名和机器ID
CPU型号和数量
内存大小
硬件设备型号和制造商,及版本,如果是虚拟机则增加虚拟化技术的显示
是不是在容器里运行
agent的进程和父进程信息
具体的linux内核版本
自动出网代理
无需多言,这是很重要的一个功能。
我的想法是,如果网内安装的agent足够多,那么它们自己就能协商出一个出网通道来。
目前阶段只实现了单跳的出网代理(刚写的),不支持多跳出网。
多跳出网已经完成了。
这一切都是自动完成,agent根据自身网络情况决定是发广播给别人提供代理,或是接收这样的广播。
当然了,广播信息也是加密的,频率也低,一般没多少人注意。
下图就是一个Ubuntu机器通过kali提供的代理上线的示意。
这就是多跳出网:
C2在线状态检测
为了避免过高的poll频率引起注意,我们设置一个C2在线指示。它可以是GitHub上的一个文本文件或者微博上的一段文字,总之越难引人注意越好。
poll频率是随机变化的,想做时间pattern检测的还是多想想吧。
隐藏进程和文件
目前实现了基于glibc劫持的进程和文件隐藏,只要加载了libemp3r0r,持久化和隐藏就都有了。
模块功能
基础管理终端
这是你的起始控制终端,实现原理是把你的命令发给agent,agent调用exec
用sh -c
来执行,结果会返回给你。
实际上这不是一个shell,只是看上去像那回事。
如果有错误,会返回return code,如果返回一大坨刷屏的输出,那么会被自动扔到一个新的tmux面板里面,避免污染工作空间。
输入help,可以查看可用的功能,包括文件管理之类的。
然后别忘了,按tab键补全命令。
剩下的看图就知道了。
完美的反弹bash shell
这是我最满意的功能之一了。
从图里看:
本shell与系统默认shell完全无关,是一个纯静态的bash二进制文件,且使用不同的RC文件
默认不保存任何历史命令
可以用tmux和其它要求完整终端功能的软件,比如vim和top
有真彩色!
自动设置了PATH,将我们的自定义工具库安排上了。
一切你本地终端支持的,这里都支持!
然后这个bash反弹shell是一样的封装到HTTP2连接里,跟其它C2流量毫无区别。
插件系统
就在上面bash的图里,nmap,socat都在那了,想要别的什么可以自己上传。
我的“插件系统”实际上与母体没多大关系,emp3r0r做的仅仅是通过vaccine模块,把所有的“插件”打包上传给agent,然后agent配置好它们。
而你就通过控制终端来使用它们。
扩展性max!你可以添加bash脚本,不用管目标机器上是不是有bash,也可以添加二进制程序,要啥传啥就行。
持久化
目前支持了:
cron
LD_PRELOAD
加载我们的shared objectbash profile,注入常用命令
其它还在计划中
进程注入
还没完成,主要通过GDB来加载shared object到可注入的进程。
用户凭据收割
这是一个注入到sshd进程的shared object,通过ptrace
对sshd进行自动调试,最终目的是把它接到的明文密码dump出来。
用GDB完成的示例:
写到我博客了,还没集成进去,以后再说吧。
自动Root
可以通过一些好用的本地提权漏洞直接提升agent的权限到root:
具体的在我博客有介绍。
目前内置了一个CVE-2018-14665。
提权辅助
这个模块可以下载两个提权辅助脚本并在agent上运行,结果会返回给C2:
端口映射
支持从agent到C2的端口映射,本质上是由agent代理一个目标地址并对接到C2端。
这个也是完全一样的HTTP2封装。
socks代理
在agent上起一个socks5代理,然后映射到C2,从而可以让你在C2端使用代理。
怎么用
我写了个wiki,欢迎大家修改和添加内容。
这里简单介绍下编译和配置过程:
编译C2服务器
说明一下,编译C2会自动生成一个自签名CA,然后用它签发C2服务器的TLS证书。
一个C2服务器证书可以对多个DNS名称或者IP地址进行背书,你有几个就写几个,tor的onion地址也支持。
编译agent
编译agent的话,你只可以写一个C2地址,这是写死到agent里的。
indicator是指示C2是否在线的一个文件,内容是emp3r0r,参见前文介绍。
运行agent
根据C2服务器地址,你可以选择使用相应的命令行参数。
比如tor的话,你需要
-proxy 'socks5://torproxy:port'
CDN的话,你需要在C2端启用内置代理,然后在agent参数里指定如
-cdnproxy wss://cc.example.com/ws
这样的代理地址。
未来计划
支持更多的隐藏手段
打算把:
container based
LKM内核模块
进程注入
都实现一下。
内网渗透
扫描模块
自动漏洞利用和传播
网络流量抓取和分析
服务弱口令探测
集成常见的exploit kit
慢慢来吧,如果有需要可以给我打钱,我优先做(笑
鸣谢
虽然菜鸡但坚持写代码的我
给我打钱打star的你们
国内外大佬们的开源贡献