T3/IIOP NAT穿透问题

    渗透测试 lz520520 4年前 (2021-02-23) 1579次浏览

    IIOP

    https://xz.aliyun.com/t/7498 https://xz.aliyun.com/t/8508

    https://gist.github.com/fnmsd/b3e90da874d779f665b3ba06f9c93a31

    https://blog.csdn.net/qq_42426159/article/details/109156048

    上面链接里,白帽汇提到了几种解决IIOP nat穿透的方法,包括自实现GIOP、javassist字节码库、源代码修改,发现第二种方法最省事,但文中的方案是在把class在内存中修改后然后重新classloader,并且修改的方法位置也不太好,结合第一篇中说到的修改位置和javassist字节码库,最终有了下面优化的方案,目前测试下来没啥问题而且省时省力,不需要指定jdk版本编译,同时可以适用其他weblogic版本。

    修改weblogic.iiop.ior.IOPProfile read(CorbaInputStream in),原本this.host 和this.port会赋值为接收数据里真实的IP和端口,在这里将其修改为外网IP端口即可。

    T3/IIOP NAT穿透问题

     

    修改weblogic的class文件,如果按传统方式反编译打包会比较麻烦,这里通过javassist库来辅助,javassist用于操作class文件,代码如下,会生成一个新的class,将其覆盖原来的class即可。在insetAt方法里,$0表示this,$1表示该方法第一个参数,$2、$3以此类推。
    为了通用,这里是通过((IIOPInputStream)$1).getEndPoint().getRemoteChannel().getPublicAddress()和getPublicPort()来获取实际的信息。

    T3/IIOP NAT穿透问题

    方案二,通过项目代码中设置系统属性,然后在IOPProfile获取即可实现跨项目获取数据,为什么需要这个方案,因为上面那个方案在第一次getRemoteChannel()时会很慢。
    代码如下

     

    插入后class文件如下

    T3/IIOP NAT穿透问题

    然后exp发送前设置系统属性,测试效果如下

    T3/IIOP NAT穿透问题

    T3

    https://mp.weixin.qq.com/s/cwkZXWCOKYpLDK9o_J_G1w

    T3通过RMI调用也存在类似问题,但会更麻烦点,和上面不一样,刚好相反,需要社会JVMID属性为真实内网端口传输给服务端,如果数据包里设置的JVMID端口和监听端口不一致,则目标则不会返回任何数据(和IP无关),而且在仅开放T3协议的情况下,没有其他手段获取内网真实信息,目前获取内网端口的两个方法,一是发送数据包里遍历所有端口,会比较费时;二是通过IIOP协议来获取。

    回过头再说实现,因为内网端口只能手动设置,所以只能考虑通过系统属性设置的方案来实现。

    测试在weblogic.rjvm.ConnectionManager类的方法findOrCreateConnection,MsgAbbrevOutputStream msg创建前,修改JVMID的端口即可修复nat问题, 如果在JVMID创建时就修改会导致socket往该端口发起连接,最终超时。下面位置是调试到的一个合适位置。

    T3/IIOP NAT穿透问题

    调用堆栈如下,(PS: JVMID创建是在堆栈第三层的bootstrap里)

    T3/IIOP NAT穿透问题

     

     

    class hook代码如下

    T3/IIOP NAT穿透问题

    修改后的class如下

    T3/IIOP NAT穿透问题

     


    Security , 版权所有丨如未注明 , 均为原创丨
    转载请注明原文链接:T3/IIOP NAT穿透问题
    喜欢 (40)