黑客网站入侵 编程 搭建 渗透 破解
3.61K subscribers
419 photos
13 links
Download Telegram
一枚野生resin filter内存马调试

在对java恶意样本调试指南公众号中发布的jsp内存马进行分析之后,发现是一枚野生的resin filter内存马,做为面向github 编程的我,还没有找到公开的resin内存马,决定细细的盘一下该内存马的逻辑部分。

恶意代码为Overbrilliantly:包含了一个构造器、两个静态变量和 static 静态代码块

主要逻辑static静态代码块中,样本字符串解密如原文描述类似:”字符串加密为xor,长度为7,加密后的字符串第一位为本次待解密字符串的长度”。我们的目的是为了能够还原resin 内存马,debug 过程直接跳过解密过程,在关键部分进行断点。
代码逻辑中利用反射方法 loadCLass 加载了 com.caucho.server.dispatch.ServletInvovation , com.caucho.server.dispatch.FilterConfigImpl 等类,这些是 resin 容器的基础类,可以看出这是一个针对 resin 容器的内存马,如果要进行debug 还需要引入resin依赖或者直接创建一个运行在resin上的web服务。
内存马的主要逻辑
该样本(resin)和其他容器filter 型内存马类似,创建 filter,添加 filterConfigImpl 实例,添加filterMapping 路由映射。

创建 filter
在反射加载完必要的依赖class之后,该样本调用 java.uti.Base64$decoder/javax.xml.bind.DatatypeConverter.parseBase64Binary对字符串 var17 进行解码;然后使用 defineClass 类加载器进行了加载,其中 var17 字符串就是样本构建的恶意filter类的base64编码,类名 PseudodramaticallyFilter。
加载的的 filter 说明
对前序加载的filter字串进行base64解码及反编译,是一个实现了filter接口的自定义filter,全限定名为com.caucho.filters.PseudodramaticallyFilter.class ,利用com.caucho.filters resin 依赖进行伪装,PseudodramaticallyFilter翻译为明显假的filter

类结构如下图所示,defineClass 加载类时会调用static静态代码块,对字符串进行解密。
调整 filter 顺序
在创建filter 实例,添加 filterConfigImpl及相应路由之后,样本路由添加到 WebApp._filerMapper 和 WebApp._loginFilterMapper 中,_filerMapper 及 _loginFilterMapper 中存放的是 ArrayList<FilterMapping> 数组,样本通过创建新的 ArrayList<FilterMapping> 并将前序步骤创建的 filterMapping 做为首位加入。

filterConfigImpl 实现了 javax.servlet.FilterConfig 和 javax.servlet.FilterRegistration.Dynamic 接口
通过Wireshark抓包如图所示,可以看到客户端发送的密码及填充字符串。

通过以上代码逻辑,可以找到一个识别Cobalt Strike Team Server的方法,流程图及部分代码,为了利用该特征获取更多资产,我们希望把Cobalt Strike 中被控制的IP给提取出来,就是Cobalt Strike 登陆后的Session Table提取出来
TeamQueue类的call方法中会根据传入的参数实例化一个Request对象,并添加进队列,之后TeamQueue Writer线程从队列获取请求对象,使用socket进行发送

以上就是Cobalt Strike客户端发包和接收响应的大致逻辑。在创建TeamQueue实例后开始调用call方法来发送不同阶段的请求
扫描结果分析
网络空间测绘始于扫描,不止于扫描。在找到该特征后,我们开始在互联网中进行挖掘。

使用搜索语句:response:"\x00\x00\xca\xfe" AND port: "50050",可以找到存在弱口令的Cobalt Strike,我们只对部分主机进行了受控IP的提取,这步骤稍微敏感,随机登录一台

通过搜索语法 response:"\x00\x00\x00\x00" AND port: "50050" AND service: "http/ssl"

可以找到没有爆破出密码的Cobalt Strike,可以看到共有5173条扫描记录,1049个IP。

网络空间测绘,始于资产,但不止于资产。

我们认为,主动测绘数据将会与终端行为样本数据、网络流量通信数据一样,是未来网络安全大数据&&威胁情报数据的重要源头。主动测绘数据和基于测绘数据分析后形成的知识将能够极大补充我们的视野
允许任意URL,预期任意代码执行

-- MARKDOWN --
- 我们发现并报告了流行软件中的一键式代码执行漏洞,包括 Telegram**、**Nextcloud**、**VLC**、**Libre-/OpenOffice**、**Bitcoin/Dogecoin Wallets**、**WiresharkMumble
- 将用户提供的 URL 传递给操作系统打开的桌面应用程序经常容易受到**通过用户交互执行代码**的
攻击 - 当打开指向托管在互联网可访问文件共享(`nfs`、`webdav`、`smb` 等)上的恶意可执行文件(`.desktop`、`.jar`、`.exe` 等)的 URL 时,或者利用打开的应用程序的 URI 处理程序中的其他漏洞时,都可以实现代码执行
- 其他软件中已经发现了遵循这种模式的漏洞,预计未来会发现更多漏洞

# 介绍

在本文中,我们展示了众多桌面应用程序中的代码执行漏洞,这些漏洞的根本原因都是一样的:对用户输入的验证不足,这些输入随后被视为 URL 并在操作系统的帮助下打开。所需的用户交互和利用策略取决于桌面环境以及应用程序是否经过强化,例如,使用 URI 方案允许/阻止列表。例如,以下是在 Xubuntu 20.04 上的 Nextcloud(< 3.1.3)中利用此问题的方式:
在某次授权红队行动中,客户给定目标外网资产很少

经过各种挖掘,各种尝试,久久没有结果,注意到某系统为通用系统。

寻找源码到getshell
查找源码
1、网盘泄露:这套系统并不开源,各种网盘泄露网站一顿查找,无果

2、Github、gitlab泄露:尝试了多个关键词,均无果

3、Fofa找同类型的站:用favicon.ico,或是用title来搜,并且将这些资产采集起来,最终在某个站发现web.rar,成功获得源码
从TemplatesImpl类Gadget中提取bytecode

前言
在Java反序列化的gadget中,有很多使用可反序列化TemplatesImpl类进行命令执行(比如CommonsCollections2-4、CommonsBeanutils1、Jdk7u21以及变种JRE8u20等等)。

实际上这类Gadget的反序列化过程中是直接或间接调用newTransformer或getOutputProperties方法,最终进入defineTransletClasses方法,将_bytecodes字段中存储的类的bytecode重新在JVM中定义为类,最终在对其调用newInstance方法时,触发写在该类static块或者无参构造方法中的代码块,从而达到代码执行的效果。

由于ysoserial中默认用于创建TemplatesImpl对象的createTemplatesImpl函数中,是在bytecode对应的类的静态代码块中加入执行java.lang.Runtime.exec的代码段,所以效果上来说,ysoserial创建的这类gadget是用于触发命令执行的,但实际上是可以进行任意代码执行的。
至此,我们拿到能够获得进行pickle序列化的所有条件


利用场景

Django创建cache文件夹的默认权限是700,这意味无法通过同组的用户来进行改写,但是Django的服务器一般是用nginx或者apache等来启动。有的情况下,nginx服务器底下可能不止一个服务在运行,也可能是PHP或者其他。那么如果其他服务能够进行对临时文件夹tmp或/var/tmp内部的内容进行读写的话,则可以对Django框架进行攻击
我们找到了一个名为FBSharedFramework的 Mach-O 64 位共享库二进制文件。我们将使用Hopper Disassembler打开该二进制文件,由于该文件较大,因此需要一些时间才能完全反汇编该二进制文件。

一个好的开始是使用应用程序上显示的警报错误进行搜索。因此,我们将尝试找到导致OpenSSL 证书验证错误的分支。

我们必须将b.ne(“不相等时分支”的缩写)指令反转为b.eq(“不相等时分支”的缩写)指令,前者当且仅当零标志清零时才会分支或“跳转”到指定的地址,后者当且仅当零标志清零时才会分支或“跳转”到指定的地址。因此,它不会进入导致 OpenSSL 证书验证错误的loc_1491b4分支,而是进入有效分支。