Weblogic CVE-2023-21931 漏洞挖掘技巧:后反序列化利用

Weblogic CVE-2023-21931 漏洞挖掘技巧:后反序列化利用

原创 14m3ta7k GobySec 2023-04-20 09:39

G
o
b
y


2











6
856








1
8


01概述

近些年,Weblogic 反序列化漏洞一直围绕着反序列化的触发点进行漏洞挖掘,事实上还有很多存在反序列化但无法实时利用的点,在大家平时的漏洞挖掘中容易忽略。在行业内也有一些关于“后反序列化”的进一步讨论,这些看似无法利用的漏洞,其实可以通过一些后续的技巧完成稳定的利用效果。例如,进行

bind()
 或 
rebind()
 操作后,并没有触发漏洞,此时可以尝试其他方法如 
lookup()

lookupLink() 
等触发漏洞。

通过这种思路我们发现了两个 Weblogic 的后反序列化漏洞(CVE-2023-21931、CVE-2023-21839),获得了 Oracle 的官方确认。本文以这两个 Weblogic 漏洞为例,分享”后反序列化漏洞”的利用思路。
我们相信还有很多这类的漏洞在未来会逐渐被挖掘出来,希望本篇文章能够给大家一些启发。


02后反序列化漏洞

W
e
b
l
o
g
i
c













r
e
a
d
O
b
j
e
c
t
(
)

r
e
a
d
R
e
s
o
l
v
e
(
)

r
e
a
d
E
x
t
e
r
n
a
l
(
)







































W
e
b
l
o
g
i
c














































W
e
b
l
o
g
i
c































W
e
b
l
o
g
i
c






b
i
n
d
(
)

r
e
b
i
n
d
(
)























l
o
o
k
u
p
(
)

l
o
o
k
u
p
L
i
n
k
(
)









l
o
o
k
u
p
(
)











W
e
b
l
o
g
i
c

























03lookup













l
o
o
k
u
p
(
)







– W
e
b
l
o
g
i
c










B
a
s
i
c
S
e
r
v
e
r
R
e
f



i
n
v
o
k
e
(
)











  • i
    n
    v
    o
    k
    e
    (
    )




    W
    e
    b
    l
    o
    g
    i
    c








    r
    e
    s
    o
    l
    v
    e

    a
    n
    y



    r
    e
    s
    o
    l
    v
    e
    _
    a
    n
    y
    (
    )



  • r
    e
    s
    o
    l
    v
    e
    _
    a
    n
    y
    (
    )






    r
    e
    s
    o
    l
    v
    e
    O
    b
    j
    e
    c
    t
    (
    )















  • r
    e
    s
    o
    l
    v
    e
    O
    b
    j
    e
    c
    t
    (
    )
















    l
    o
    o
    k
    u
    p
    (
    )















  • W
    L
    C
    o
    n
    t
    e
    x
    t
    I
    m
    p
    l

    W
    L
    E
    v
    e
    n
    t
    C
    o
    n
    t
    e
    x
    t
    I
    m
    p
    l

    W
    L
    E
    v
    e
    n
    t
    C
    o
    n
    t
    e
    x
    t
    I
    m
    p
    l


    R
    o
    o
    t
    N
    a
    m
    i
    n
    g
    N
    o
    d
    e

    S
    e
    r
    v
    e
    r
    N
    a
    m
    i
    n
    g
    N
    o
    d
    e


    B
    a
    s
    i
    c
    N
    a
    m
    i
    n
    g
    N
    o
    d
    e






    l
    o
    o
    k
    u
    p
    (
    )







    B
    a
    s
    i
    c
    N
    a
    m
    i
    n
    g
    N
    o
    d
    e



    r
    e
    s
    o
    l
    v
    e
    O
    b
    j
    e
    c
    t
    (
    )








  • r
    e
    s
    o
    l
    v
    e
    O
    b
    j
    e
    c
    t
    (
    )




    o
    b
    j


    N
    a
    m
    i
    n
    g
    N
    o
    d
    e






    m
    o
    d
    e





    1





    W
    L
    N
    a
    m
    i
    n
    g
    M
    a
    n
    a
    g
    e
    r



    g
    e
    t
    O
    b
    j
    e
    c
    t
    I
    n
    s
    t
    a
    n
    c
    e
    (
    )









W
L
N
a
m
i
n
g
M
a
n
a
g
e
r


g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)




















g
e
t
R
e
f
e
r
e
n
t
(
)











l
o
o
k
u
p
(
)











C
V
E






g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)










04CVE-2023-21931

C
V
E

2
0
2
3

2
1
9
3
1







W
L
N
a
m
i
n
g
M
a
n
a
g
e
r


g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)








b
o
u
n
d
O
b
j
e
c
t



L
i
n
k
R
e
f













b
o
u
n
d
O
b
j
e
c
t

g
e
t
L
i
n
k
N
a
m
e
(
)






l
o
o
k
u
p
(
)



g
e
t
L
i
n
k
N
a
m
e
(
)





l
i
n
k
A
d
d
r
T
y
p
e






J
N
D
I







L
i
n
k
R
e
f















l
i
n
k
A
d
d
r
T
y
p
e




J
N
D
I













l
o
o
k
u
p
(
)







J
N
D
I

















package weblogic.jndi.internal;
public final class WLNamingManager {
    public static Object getObjectInstance(Object boundObject, Name name, Context ctx, Hashtable env) throws NamingException {
        if (boundObject instanceof ClassTypeOpaqueReference) {
            ......
        } else if (boundObject instanceof LinkRef) {
            String linkName = ((LinkRef)boundObject).getLinkName();
            InitialContext ic = null;
            try {
                ic = new InitialContext(env);
                boundObject = ic.lookup(linkName);  // 漏洞触发点
            } catch (NamingException var15) {
              ......
            } finally {......}
        }
    }
}


J
N
D
I





L
i
n
k
R
e
f






L
i
n
k
R
e
f

J
a
v
a









L
i
n
k
R
e
f
















l
i
n
k
A
d
d
r
T
y
p
e





g
e
t
L
i
n
k
N
a
m
e
(
)



l
i
n
k
A
d
d
r
T
y
p
e








package javax.naming;
public class LinkRef extends Reference {
    static final String linkClassName = LinkRef.class.getName();
    static final String linkAddrType = <span data-raw-text="" "="" data-textnode-index-1681866646750="276" data-index-1681866646750="2786" data-textnode-notemoji-index-1681866646750="2786" class="character">"LinkAddress<span data-raw-text="" "="" data-textnode-index-1681866646750="276" data-index-1681866646750="2798" data-textnode-notemoji-index-1681866646750="2798" class="character">";

    public LinkRef(Name linkName) {
        super(linkClassName, new StringRefAddr(linkAddrType, linkName.toString()));
    }

    public LinkRef(String linkName) {
        super(linkClassName, new StringRefAddr(linkAddrType, linkName));
    }

    public String getLinkName() throws NamingException {
        if (className != null && className.equals(linkClassName)) {
            RefAddr addr = get(linkAddrType);
            if (addr != null && addr instanceof StringRefAddr) {
                return (String)((StringRefAddr)addr).getContent();
            }
        }
        throw new MalformedLinkException();
    }
}








r
e
b
i
n
d
(
)

l
o
o
k
u
p
(
)



































W
L
N
a
m
i
n
g
M
a
n
a
g
e
r

g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)



l
o
o
k
u
p
(
)














J
N
D
I








G
o
b
y






C
V
E

2
0
2
3

2
1
9
3
1












s
h
e
l
l












05CVE-2023-21839

F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e

O
p
a
q
u
e
R
e
f
e
r
e
n
c
e








F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e













j
n
d
i
E
n
v
i
r
o
n
m
e
n
t

r
e
m
o
t
e
J
N
D
I
N
a
m
e






















e
n
v

r
e
m
o
t
e
J
N
D
I
N
a
m
e


















F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e


g
e
t
R
e
f
e
r
e
n
t
(
)



O
p
a
q
u
e
R
e
f
e
r
e
n
c
e









g
e
t
R
e
f
e
r
e
n
t
(
)





r
e
t
V
a
l

=

c
o
n
t
e
x
t
.
l
o
o
k
u
p
(
t
h
i
s
.
r
e
m
o
t
e
J
N
D
I
N
a
m
e
)
;



r
e
m
o
t
e
J
N
D
I
N
a
m
e




J
N
D
I



















package weblogic.jndi.internal;
public class ForeignOpaqueReference implements OpaqueReference, Serializable {
    private Hashtable jndiEnvironment;
    private String remoteJNDIName;
        ......
    public ForeignOpaqueReference(String remoteJNDIName, Hashtable env) {
        this.remoteJNDIName = remoteJNDIName;
        this.jndiEnvironment = env;
    }
    public Object getReferent(Name name, Context ctx) throws NamingException {
        InitialContext context;
        if (this.jndiEnvironment == null) {
            context = new InitialContext();
        } else {
            Hashtable properties = this.decrypt();
            context = new InitialContext(properties);
        }
        Object retVal;
        try {
            retVal = context.lookup(this.remoteJNDIName);   // 漏洞点
        } finally {
            context.close();
        }
        return retVal;
    }
    ......
}

getReferent() 调用分析

package weblogic.jndi;
public interface OpaqueReference {
    Object getReferent(Name var1, Context var2) throws NamingException;
    String toString();
}

O
p
a
q
u
e
R
e
f
e
r
e
n
c
e











g
e
t
R
e
f
e
r
e
n
t
(
)

t
o
S
t
r
i
n
g
(
)
;

F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e


g
e
t
R
e
f
e
r
e
n
t
(
)





W
L
N
a
m
i
n
g
M
a
n
a
g
e
r



W
L
N
a
m
i
n
g
M
a
n
a
g
e
r


g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)








b
o
u
n
d
O
b
j
e
c
t





O
p
a
q
u
e
R
e
f
e
r
e
n
c
e












g
e
t
R
e
f
e
r
e
n
t
(
)




b
o
u
n
d
O
b
j
e
c
t

=

(
(
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
)
b
o
u
n
d
O
b
j
e
c
t
)
.
g
e
t
R
e
f
e
r
e
n
t
(
n
a
m
e
,

c
t
x
)
;







F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e




O
p
a
q
u
e
R
e
f
e
r
e
n
c
e












g
e
t
R
e
f
e
r
e
n
t
(
)
















package weblogic.jndi.internal;
public final class WLNamingManager {
  public static Object getObjectInstance(Object boundObject, Name name, Context ctx, Hashtable env) throws NamingException {
        if (boundObject instanceof ClassTypeOpaqueReference) {
            ......
        } else if (boundObject instanceof OpaqueReference) {
            boundObject = ((OpaqueReference)boundObject).getReferent(name, ctx);
        } else if (boundObject instanceof LinkRef) {
      ...
        }
    }
}

C
V
E

2
0
2
3

2
1
9
3
1








C
V
E

2
0
2
3

2
1
8
3
9




































F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e

g
e
t
R
e
f
e
r
e
n
t
(
)




l
o
o
k
u
p
(
)







G
o
b
y









C
V
E

2
0
2
3

2
1
8
3
9













S
h
e
l
l













06时间线

C
V
E

2
0
2
3

2
1
9
3
1
– 2
0
2
2

8

1
2






  • 2
    0
    2
    2

    8

    1
    9






  • 2
    0
    2
    3

    4

    1
    8






C
V
E

2
0
2
3

2
1
8
3
9
– 2
0
2
2

7

3
1






  • 2
    0
    2
    2

    8

    5






  • 2
    0
    2
    3

    1

    1
    6






07  研究环境

V
u
l
f
o
c
u
s

W
e
b
l
o
g
i
c


docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.2.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.1.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.3.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.4.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:14.1.1.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.1.2.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.1.3.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:10.3.6.0-jdk-release


08参考

1
.

J
a
v
a












R
u
i
l
i
n

(
h
t
t
p
:
/
/
r
u
i
0
.
c
n
/
a
r
c
h
i
v
e
s
/
1
3
3
8
)

2
.

R
u
i
l
1
n
/
a
f
t
e
r

d
e
s
e
r
i
a
l
i
z
a
t
i
o
n

a
t
t
a
c
k
:

J
a
v
a

A
f
t
e
r

D
e
s
e
r
i
a
l
i
z
a
t
i
o
n

A
t
t
a
c
k

(
h
t
t
p
s
:
/
/
g
i
t
h
u
b
.
c
o
m
/
R
u
i
l
1
n
/
a
f
t
e
r

d
e
s
e
r
i
a
l
i
z
a
t
i
o
n

a
t
t
a
c
k
)


本文中演示的漏洞与功能适配 Goby 版本:Beta 2.4.7,已支持Goby红队版、漏扫版扫描验证。最新版本下载体验:https://gobysec.net/

最新Goby 使用技巧分享

• 
su18 | Shell中的王者-JAVAWEB内存马【认知篇】

• 
su18 | Goby反序列化漏洞打入内存马【利用篇】

• su18 | Goby利用内存马的一些技术细节【技术篇】

• Corp0ra1 | 记一次不停的自我追问式学习(下)

• 14m3ta7k | 跨越语言的艺术:Weblogic序列化漏洞与IIOP协议





G
o
b
y





/











































稿

G
o
b
y

G
o
b
y



/


/




/




/




/

P
o
C



/

I
P


使



/

W
e
b
s
h
e
l
l

/

















G
o
b
y















~
~
~
– 微



































  • h
    t
    t
    p
    s
    :
    /
    /
    g
    o
    b
    y
    s
    e
    c
    .
    n
    e
    t
    /
    s
    a
    l
    e