ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Weblogic学习(1)

2020-09-23 19:31:21  阅读:309  来源: 互联网

标签:var1 socket var3 var2 return 学习 Weblogic weblogic


前期准备

已知可发送b't3 12.2.1\nAS:255\nHL:19\n\n'来触发T3协议,所以可以写一个小脚本来重复发送请求,方便分析:

import socket
from time import sleep

def send(ip, port, data):
    # data = data.encode("utf8")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = (ip, int(port))
    try:
        sock.connect(server_address)
        sock.sendall(data)
        response = sock.recv(1024)
        sleep(1)
        print(response)
    except socket.error as e:
        print('[!] Socket Error')
    finally:
        sock.close()


if __name__ == '__main__':
    t3 = b"t3 12.2.1\nAS:255\nHL:19\n\n"
    while input("[*] Go?(Y/N):")[0].lower() == 'y':
        send('192.168.126.128', 7001, t3)

分析

分析的版本为10.3.6

Weblogic判断协议过程

断点下在server/lib/weblogic.jar/weblogic/socket/PosixSocketMuxer.class的第129行,如图:

之后一直调试,直到server/lib/weblogic.jar/weblogic/socket/SocketMuxer.class第643行var1.isMessageComplete(),如图:

该方法经反编译后的代码如下:

public boolean isMessageComplete() {
    int var1 = 0;

    for(int var2 = 0; var2 < this.handlers.length; ++var2) {
        ProtocolHandler var3 = this.handlers[var2];
        if (var3.claimSocket(this.head)) {
            this.claimedIndex = var2;
            break;
        }

        var1 = Math.max(var1, var3.getHeaderLength());
    }

    if (this.availBytes < var1) {
        return false;
    } else if (this.claimedIndex < 0) {
        SocketLogger.logConnectionRejected(this.channels[0].getChannelName());
        SocketMuxer.getMuxer().deliverHasException(this.getSocketFilter(), new ProtocolException("Incoming socket: '" + this.getSocket() + "' has unhandled protocol prefix"));
        return false;
    } else {
        return true;
    }
}

this.headers中存储着weblogic规定的协议,this.head中存储着我们发送的数据,claimSocket方法用来判断我们发送的数据属于哪种协议,其反编译后的代码如下:

public boolean claimSocket(Chunk var1) {
    return this.claimSocket(var1, "GIOP");
}

GIOP就是协议的名字,this.claimSocket反编译后的代码如下:

protected boolean claimSocket(Chunk var1, String var2) {
    int var3 = var2.length();
    if (var1.end < var3) {
        return false;
    } else {
        byte[] var4 = var1.buf;

        for(int var5 = 0; var5 < var3; ++var5) {
            if (var4[var5] != var2.charAt(var5)) {
                return false;
            }
        }

        return true;
    }
}

很简单,大概意思就是比较前几位是不是为指定的字符(比如判断前4位是否为GIOP),根据判断协议的不同,该函数也会变。

最后当发送的数据不符合IIOP、T3、LDAP、SNMP所规定的形式时,就会被归类到HTTP去

weblogic对T3协议的处理

在判断了发送的数据是什么协议之后,会通过dispatch()server/lib/weblogic.jar/weblogic/socket/MuxableSocketDiscriminator,74行)去获取真正的协议名:

然后在maybeFilter中根据系统设置判断是否要更换一下协议名:

之后提取我们发送的信息中的版本号、AS、HL信息(weblogic/rjvm/t3/MuxableSocketT3.classreadBootstrapMessage方法)

然后在weblogic/socket/Login.class中的connectReplyOK中构造我们看到的HELO等信息,并将它们传回来(可能会出现刚发完HELO就断开连接的情况,可以视自己手速加一下sleep):

标签:var1,socket,var3,var2,return,学习,Weblogic,weblogic
来源: https://www.cnblogs.com/r0co/p/13720426.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有