├── .gitignore ├── LICENSE ├── README.md ├── banner.png ├── go.mod ├── go.sum ├── keys.json ├── main.go ├── modules ├── BreachDirectory.go ├── Core.go ├── EmailRep.go ├── FileWriter.go ├── Googling.go ├── Holehe.py ├── Hunter.go ├── Intelx.go ├── Lookup.go ├── SocialScan.py ├── ThreatCrowd.go └── Verify.go ├── outputs └── DELETEME.txt └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | ### Linux ### 2 | *~ 3 | 4 | # temporary files which can be created if a process still has a handle open of a deleted file 5 | .fuse_hidden* 6 | 7 | # KDE directory preferences 8 | .directory 9 | 10 | # Linux trash folder which might appear on any partition or disk 11 | .Trash-* 12 | 13 | # .nfs files are created when an open file is removed but is still being accessed 14 | .nfs* 15 | 16 | ### macOS ### 17 | # General 18 | .DS_Store 19 | .AppleDouble 20 | .LSOverride 21 | 22 | # Icon must end with two \r 23 | Icon 24 | 25 | 26 | # Thumbnails 27 | ._* 28 | 29 | # Files that might appear in the root of a volume 30 | .DocumentRevisions-V100 31 | .fseventsd 32 | .Spotlight-V100 33 | .TemporaryItems 34 | .Trashes 35 | .VolumeIcon.icns 36 | .com.apple.timemachine.donotpresent 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | 45 | ### Python ### 46 | # Byte-compiled / optimized / DLL files 47 | __pycache__/ 48 | *.py[cod] 49 | *$py.class 50 | 51 | # C extensions 52 | *.so 53 | 54 | # Distribution / packaging 55 | .Python 56 | build/ 57 | develop-eggs/ 58 | dist/ 59 | downloads/ 60 | eggs/ 61 | .eggs/ 62 | lib/ 63 | lib64/ 64 | parts/ 65 | sdist/ 66 | var/ 67 | wheels/ 68 | pip-wheel-metadata/ 69 | share/python-wheels/ 70 | *.egg-info/ 71 | .installed.cfg 72 | *.egg 73 | MANIFEST 74 | 75 | # PyInstaller 76 | # Usually these files are written by a python script from a template 77 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 78 | *.manifest 79 | *.spec 80 | 81 | # Installer logs 82 | pip-log.txt 83 | pip-delete-this-directory.txt 84 | 85 | # Unit test / coverage reports 86 | htmlcov/ 87 | .tox/ 88 | .nox/ 89 | .coverage 90 | .coverage.* 91 | .cache 92 | nosetests.xml 93 | coverage.xml 94 | *.cover 95 | *.py,cover 96 | .hypothesis/ 97 | .pytest_cache/ 98 | pytestdebug.log 99 | 100 | # Translations 101 | *.mo 102 | *.pot 103 | 104 | # Django stuff: 105 | *.log 106 | local_settings.py 107 | db.sqlite3 108 | db.sqlite3-journal 109 | 110 | # Flask stuff: 111 | instance/ 112 | .webassets-cache 113 | 114 | # Scrapy stuff: 115 | .scrapy 116 | 117 | # Sphinx documentation 118 | docs/_build/ 119 | doc/_build/ 120 | 121 | # PyBuilder 122 | target/ 123 | 124 | # Jupyter Notebook 125 | .ipynb_checkpoints 126 | 127 | # IPython 128 | profile_default/ 129 | ipython_config.py 130 | 131 | # pyenv 132 | .python-version 133 | 134 | # pipenv 135 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 136 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 137 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 138 | # install all needed dependencies. 139 | #Pipfile.lock 140 | 141 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 142 | __pypackages__/ 143 | 144 | # Celery stuff 145 | celerybeat-schedule 146 | celerybeat.pid 147 | 148 | # SageMath parsed files 149 | *.sage.py 150 | 151 | # Environments 152 | .env 153 | .venv 154 | env/ 155 | venv/ 156 | ENV/ 157 | env.bak/ 158 | venv.bak/ 159 | pythonenv* 160 | 161 | # Spyder project settings 162 | .spyderproject 163 | .spyproject 164 | 165 | # Rope project settings 166 | .ropeproject 167 | 168 | # mkdocs documentation 169 | /site 170 | 171 | # mypy 172 | .mypy_cache/ 173 | .dmypy.json 174 | dmypy.json 175 | 176 | # Pyre type checker 177 | .pyre/ 178 | 179 | # pytype static type analyzer 180 | .pytype/ 181 | 182 | # profiling data 183 | .prof 184 | 185 | ### venv ### 186 | # Virtualenv 187 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ 188 | [Bb]in 189 | [Ii]nclude 190 | [Ll]ib 191 | [Ll]ib64 192 | [Ll]ocal 193 | [Ss]cripts 194 | pyvenv.cfg 195 | pip-selfcheck.json 196 | 197 | ### vscode ### 198 | .vscode/* 199 | !.vscode/settings.json 200 | !.vscode/tasks.json 201 | !.vscode/launch.json 202 | !.vscode/extensions.json 203 | *.code-workspace 204 | 205 | ### Windows ### 206 | # Windows thumbnail cache files 207 | Thumbs.db 208 | Thumbs.db:encryptable 209 | ehthumbs.db 210 | ehthumbs_vista.db 211 | 212 | # Dump file 213 | *.stackdump 214 | 215 | # Folder config file 216 | [Dd]esktop.ini 217 | 218 | # Recycle Bin used on file shares 219 | $RECYCLE.BIN/ 220 | 221 | # Windows Installer files 222 | *.cab 223 | *.msi 224 | *.msix 225 | *.msm 226 | *.msp 227 | 228 | # Windows shortcuts 229 | *.lnk 230 | 231 | # End of https://www.toptal.com/developers/gitignore/api/python,vscode,macos,windows,linux,venv -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MOSINT 2 | 3 |

4 | 5 |

6 | 7 | ## What is the MOSINT 8 | 9 | MOSINT is an OSINT Tool for emails. It helps you gather information about the target email. 10 | 11 | #### Features: :eyes: 12 | 13 | * Email validation 14 | * Check social accounts with Socialscan and Holehe 15 | * Check data breaches and password leaks 16 | * Find related emails and domains 17 | * Scan Pastebin and Throwbin Dumps 18 | * Google Search 19 | * DNS Lookup 20 | * IP Lookup 21 | * Output to text file 22 | 23 | 24 | ## Services (APIs): 25 | 26 | \[not required to run the program\] 27 | 28 | | Service | Function | Status | 29 | | :--- | :--- | :--- | 30 | | [ipapi.co](https://ipapi.co/) - Public | More Information About Domain | :white\_check\_mark: | 31 | | [hunter.io](https://hunter.io/) - Public | Related Emails | :white\_check\_mark: :key: | 32 | | [emailrep.io](https://emailrep.io/) - Public | Breached Sites Names | :white\_check\_mark: :key: | 33 | | [scylla.so](https://scylla.so/) - Public | Database Leaks | :construction: | 34 | | [breachdirectory.org](https://breachdirectory.org/) - Public | Password Leaks | :white\_check\_mark: :key: | 35 | | [Intelligence X](https://intelx.io/)| Password Leaks | :white\_check\_mark: :key: | 36 | 37 | :key: API key required 38 | 39 | #### For Use: 40 | 41 | - Save your API key in the `keys.json` 42 | - Install Go and Python on your system 43 | 44 | ## Installation: 45 | 46 | `git clone https://github.com/alpkeskin/mosint.git` 47 | 48 | `cd mosint` 49 | 50 | `pip3 install -r requirements.txt` 51 | 52 | ## Usage: 53 | 54 | you can type `-h` for help menu. 55 | 56 | | FLAGS | DESCRIPTION | ISREQUIRED | 57 | |-----------|---------------------------------------------------|------------| 58 | | -e | Set target email | Yes | 59 | | -verify | Verify target email | No | 60 | | -social | Social scan for target email | No | 61 | | -relateds | Find related emails and domains with target email | No | 62 | | -leaks | Find password leaks for target email | No | 63 | | -dumps | Search pastebin dumps for target email | No | 64 | | -domain | More information about target email's domain | No | 65 | | -o | Output to text file | No | 66 | | -v | Version of mosint | No | 67 | | -h | Help Menu | No | 68 | | -all | All features! | No | 69 | 70 | ### Example: 71 | 72 | `go run main.go -e example@domain.com -all` 73 | 74 | Just type `-o` for output file (.txt) 75 | 76 | 77 | ## Screen : 78 | 79 | [![mosint](https://asciinema.org/a/479072.svg)](https://asciinema.org/a/479072) 80 | 81 | ### Buy me a coffee: :money_with_wings: 82 | 83 | https://www.buymeacoffee.com/alpkeskin 84 | 85 | #### Tested on: 86 | 87 | - [x] Linux 88 | - [x] macOS 89 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blackhatethicalhacking/mosint/e427f68f646f330cdcea4208c435b62330707b80/banner.png -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/AfterShip/email-verifier v1.3.0 7 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178 8 | github.com/dimiro1/banner v1.1.0 9 | github.com/fatih/color v1.13.0 10 | github.com/mattn/go-colorable v0.1.9 11 | github.com/olekukonko/tablewriter v0.0.5 12 | github.com/rocketlaunchr/google-search v1.1.4 13 | github.com/schollz/progressbar/v3 v3.8.6 14 | github.com/valyala/fasthttp v1.31.0 15 | ) 16 | 17 | require ( 18 | github.com/PuerkitoBio/goquery v1.5.0 // indirect 19 | github.com/andybalholm/brotli v1.0.2 // indirect 20 | github.com/andybalholm/cascadia v1.0.0 // indirect 21 | github.com/antchfx/htmlquery v1.0.0 // indirect 22 | github.com/antchfx/xmlquery v1.0.0 // indirect 23 | github.com/antchfx/xpath v1.0.0 // indirect 24 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 // indirect 25 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5 // indirect 26 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c // indirect 27 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7 // indirect 28 | github.com/gobwas/glob v0.2.3 // indirect 29 | github.com/gocolly/colly/v2 v2.0.1 // indirect 30 | github.com/gofrs/uuid v4.2.0+incompatible // indirect 31 | github.com/golang/protobuf v1.4.3 // indirect 32 | github.com/google/go-cmp v0.5.4 // indirect 33 | github.com/hbollon/go-edlib v1.4.0 // indirect 34 | github.com/kennygrant/sanitize v1.2.4 // indirect 35 | github.com/klauspost/compress v1.13.4 // indirect 36 | github.com/mattn/go-isatty v0.0.14 // indirect 37 | github.com/mattn/go-runewidth v0.0.13 // indirect 38 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect 39 | github.com/rivo/uniseg v0.2.0 // indirect 40 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect 41 | github.com/temoto/robotstxt v1.1.1 // indirect 42 | github.com/valyala/bytebufferpool v1.0.0 // indirect 43 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 // indirect 44 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect 45 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect 46 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect 47 | golang.org/x/text v0.3.6 // indirect 48 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect 49 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect 50 | google.golang.org/appengine v1.6.1 // indirect 51 | google.golang.org/protobuf v1.25.0 // indirect 52 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect 53 | h12.io/socks v1.0.3 // indirect 54 | ) 55 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/AfterShip/email-verifier v1.3.0 h1:RhRLm3v2Iui5ZmWg6e+Q0xQU2Bai3mgINkY2t2p9u0g= 3 | github.com/AfterShip/email-verifier v1.3.0/go.mod h1:XeRhBrlxgnon6zOZ05EBNNanuxSy5uXl22RRBd5Jcug= 4 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 5 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178 h1:3BGr4zPVNltiGPrwF2kjPaiBk3cLguAC0CZkT8n68po= 6 | github.com/IntelligenceX/SDK v0.0.0-20211026051259-f2f7df085178/go.mod h1:sF7U8A+lYVdZYVmdbW1QceYaGpI1h2mXMbNdllz6uYs= 7 | github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk= 8 | github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= 9 | github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= 10 | github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= 11 | github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= 12 | github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= 13 | github.com/antchfx/htmlquery v1.0.0 h1:O5IXz8fZF3B3MW+B33MZWbTHBlYmcfw0BAxgErHuaMA= 14 | github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8= 15 | github.com/antchfx/xmlquery v1.0.0 h1:YuEPqexGG2opZKNc9JU3Zw6zFXwC47wNcy6/F8oKsrM= 16 | github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk= 17 | github.com/antchfx/xpath v1.0.0 h1:Q5gFgh2O40VTSwMOVbFE7nFNRBu3tS21Tn0KAWeEjtk= 18 | github.com/antchfx/xpath v1.0.0/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= 19 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 20 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 21 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 h1:tjT4Jp4gxECvsJcYpAMtW2I3YqzBTPuB67OejxXs86s= 22 | github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= 23 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 24 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 25 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 26 | github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= 27 | github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= 28 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 29 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 30 | github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= 31 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= 32 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5 h1:4U+x+EB1P66zwYgTjxWXSOT8vF+651Ksr1lojiCZnT8= 33 | github.com/go-dedup/megophone v0.0.0-20170830025436-f01be21026f5/go.mod h1:poR/Cp00iqtqu9ltFwl6C00sKC0HY13u/Gh05ZBmP54= 34 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c h1:mucYYQn+sMGNSxidhleonzAdwL203RxhjJGnxQU4NWU= 35 | github.com/go-dedup/simhash v0.0.0-20170904020510-9ecaca7b509c/go.mod h1:gO3u2bjRAgUaLdQd2XK+3oooxrheOAx1BzS7WmPzw1s= 36 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7 h1:11wFcswN+37U+ByjxdKzsRY5KzNqqq5Uk5ztxnLOc7w= 37 | github.com/go-dedup/text v0.0.0-20170907015346-8bb1b95e3cb7/go.mod h1:wSsK4VOECOSfSYTzkBFw+iGY7wj59e7X96ABtNj9aCQ= 38 | github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= 39 | github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= 40 | github.com/gocolly/colly/v2 v2.0.1 h1:GGPzBEdrEsavhzVK00FQXMMHBHRpwrbbCCcEKM/0Evw= 41 | github.com/gocolly/colly/v2 v2.0.1/go.mod h1:ePrRZlJcLTU2C/f8pJzXfkdBtBDHL5hOaKLcBoiJcq8= 42 | github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= 43 | github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= 44 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 45 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 46 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 47 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 48 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 49 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 50 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 51 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 52 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 53 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 54 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 55 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 56 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 57 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 58 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 59 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 60 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 61 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 62 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 63 | github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= 64 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 65 | github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364 h1:5XxdakFhqd9dnXoAZy1Mb2R/DZ6D1e+0bGC/JhucGYI= 66 | github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364/go.mod h1:eDJQioIyy4Yn3MVivT7rv/39gAJTrA7lgmYr8EW950c= 67 | github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= 68 | github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= 69 | github.com/hbollon/go-edlib v1.4.0 h1:k0D3nH6HXOXvlM1v0XPRS7Nn5TBQKWYXv4tPrZgPrgQ= 70 | github.com/hbollon/go-edlib v1.4.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM= 71 | github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= 72 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 73 | github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= 74 | github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= 75 | github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= 76 | github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= 77 | github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= 78 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 79 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 80 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 81 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 82 | github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= 83 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 84 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 85 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 86 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 87 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= 88 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 89 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 90 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 91 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 92 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= 93 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= 94 | github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= 95 | github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= 96 | github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= 97 | github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= 98 | github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= 99 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 100 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 101 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 102 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 103 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 104 | github.com/rocketlaunchr/google-search v1.1.4 h1:11tA5CoeUjoNnvdyUMGwyuxzihbBRDhoEFXlMmPm0k4= 105 | github.com/rocketlaunchr/google-search v1.1.4/go.mod h1:6WRqswVvv6PJtvGCB1sEVxt726NolmA0QTl6xSEXel0= 106 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= 107 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= 108 | github.com/schollz/progressbar/v3 v3.8.6 h1:QruMUdzZ1TbEP++S1m73OqRJk20ON11m6Wqv4EoGg8c= 109 | github.com/schollz/progressbar/v3 v3.8.6/go.mod h1:W5IEwbJecncFGBvuEh4A7HT1nZZ6WNIL2i3qbnI0WKY= 110 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 111 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 112 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 113 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 114 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 115 | github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA= 116 | github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= 117 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 118 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 119 | github.com/valyala/fasthttp v1.31.0 h1:lrauRLII19afgCs2fnWRJ4M5IkV0lo2FqA61uGkNBfE= 120 | github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= 121 | github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= 122 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 123 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 124 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 125 | golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 126 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE= 127 | golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 128 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 129 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 130 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 131 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 132 | golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 133 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 134 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 135 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 136 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 137 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 138 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 139 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 140 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 141 | golang.org/x/net v0.0.0-20201207224615-747e23833adb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 142 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 143 | golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 144 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= 145 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 146 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 147 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 148 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 149 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 150 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 151 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 152 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 153 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 154 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 155 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 156 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 157 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 158 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 159 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 160 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 161 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 162 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 163 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 164 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= 165 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 166 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 167 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= 168 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 169 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 170 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 171 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 172 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 173 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 174 | golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 175 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= 176 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 177 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 178 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 179 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 180 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 181 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 182 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 183 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 184 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 185 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 186 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 187 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 188 | google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= 189 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 190 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 191 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 192 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 193 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 194 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 195 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 196 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 197 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 198 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 199 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 200 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 201 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 202 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 203 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 204 | google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= 205 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 206 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 207 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 208 | gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= 209 | gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= 210 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 211 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 212 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 213 | h12.io/socks v1.0.3 h1:Ka3qaQewws4j4/eDQnOdpr4wXsC//dXtWvftlIcCQUo= 214 | h12.io/socks v1.0.3/go.mod h1:AIhxy1jOId/XCz9BO+EIgNL2rQiPTBNnOfnVnQ+3Eck= 215 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 216 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 217 | -------------------------------------------------------------------------------- /keys.json: -------------------------------------------------------------------------------- 1 | { 2 | "BreachDirectory.org API Key": "", 3 | "Hunter.io API Key": "", 4 | "EmailRep.io API Key": "", 5 | "Intelx.io API Key": "" 6 | } -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package main 6 | 7 | import ( 8 | "bufio" 9 | "flag" 10 | "fmt" 11 | "log" 12 | "main/modules" 13 | "strconv" 14 | 15 | "os" 16 | 17 | "github.com/dimiro1/banner" 18 | "github.com/fatih/color" 19 | "github.com/mattn/go-colorable" 20 | "github.com/olekukonko/tablewriter" 21 | "github.com/schollz/progressbar/v3" 22 | ) 23 | 24 | func init() { 25 | templ := `{{ .Title "mosint" "" 2 }} 26 | {{ .AnsiColor.BrightWhite }}v2.1{{ .AnsiColor.Default }} 27 | {{ .AnsiColor.BrightCyan }}https://github.com/alpkeskin/{{ .AnsiColor.Default }} 28 | Now: {{ .Now "Monday, 2 Jan 2006" }}` 29 | 30 | banner.InitString(colorable.NewColorableStdout(), true, true, templ) 31 | println() 32 | } 33 | 34 | func help_menu() { 35 | data := [][]string{ 36 | {"-e", "Set target email", "Yes"}, 37 | {"-verify", "Verify the target email", "No"}, 38 | {"-social", "Social scan for target email", "No"}, 39 | {"-relateds", "Find related emails and domains with target email", "No"}, 40 | {"-leaks", "Find password leaks for target email", "No"}, 41 | {"-dumps", "Search pastebin dumps for target email", "No"}, 42 | {"-domain", "More information about target email's domain", "No"}, 43 | {"-o", "Output to text file", "No"}, 44 | {"-v", "Version of mosint", "No"}, 45 | {"-h", "Help Menu", "No"}, 46 | {"-all", "All features!", "No"}, 47 | } 48 | table := tablewriter.NewWriter(os.Stdout) 49 | table.SetHeader([]string{"Flags", "Description", "isRequired"}) 50 | for _, v := range data { 51 | table.Append(v) 52 | } 53 | table.Render() 54 | color.Yellow("Example: go run main.go -e example@domain.com -all") 55 | } 56 | 57 | func verifyPrint(verifyData modules.VerifyStruct, emailRepData modules.EmailRepStruct, email string) { 58 | if verifyData.IsVerified { 59 | fmt.Println(email+" =>", color.GreenString("Verified \u2714")) 60 | outputText += email + " => Verified \n" 61 | } else { 62 | fmt.Println(email+" =>", color.RedString("Not Verified \u2718")) 63 | outputText += email + " => Not Verified \n" 64 | } 65 | if verifyData.IsDisposable { 66 | fmt.Println(email+" =>", color.RedString("Disposable \u2718")) 67 | outputText += email + " => Disposable \n" 68 | } else { 69 | fmt.Println(email+" =>", color.GreenString("Not Disposable \u2714")) 70 | outputText += email + " => Not Disposable \n" 71 | } 72 | 73 | if modules.GetAPIKey("EmailRep.io API Key") != "" { 74 | fmt.Println("\nEmailRep Data for", color.WhiteString(email)) 75 | outputText += "\nEmailRep Data for " + email + "\n" 76 | fmt.Println("|- Reputation:", color.YellowString(emailRepData.Reputation)) 77 | outputText += "|- Reputation: " + emailRepData.Reputation + "\n" 78 | fmt.Println("|- Blacklisted:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Blacklisted))) 79 | outputText += "|- Blacklisted: " + strconv.FormatBool(emailRepData.Details.Blacklisted) + "\n" 80 | fmt.Println("|- Malicious Activity:", color.WhiteString(strconv.FormatBool(emailRepData.Details.MaliciousActivity))) 81 | outputText += "|- Malicious Activity: " + strconv.FormatBool(emailRepData.Details.MaliciousActivity) + "\n" 82 | fmt.Println("|- Credential Leaked:", color.WhiteString(strconv.FormatBool(emailRepData.Details.CredentialsLeaked))) 83 | outputText += "|- Credential Leaked: " + strconv.FormatBool(emailRepData.Details.CredentialsLeaked) + "\n" 84 | fmt.Println("|- First Seen:", color.YellowString(emailRepData.Details.FirstSeen)) 85 | outputText += "|- First Seen: " + emailRepData.Details.FirstSeen + "\n" 86 | fmt.Println("|- Last Seen:", color.YellowString(emailRepData.Details.LastSeen)) 87 | outputText += "|- Last Seen: " + emailRepData.Details.LastSeen + "\n" 88 | fmt.Println("|- Day Since Domain Creation:", color.WhiteString(strconv.Itoa(emailRepData.Details.DaysSinceDomainCreation))) 89 | outputText += "|- Day Since Domain Creation: " + strconv.Itoa(emailRepData.Details.DaysSinceDomainCreation) + "\n" 90 | fmt.Println("|- Spam:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Spam))) 91 | outputText += "|- Spam: " + strconv.FormatBool(emailRepData.Details.Spam) + "\n" 92 | fmt.Println("|- Free Provider:", color.WhiteString(strconv.FormatBool(emailRepData.Details.FreeProvider))) 93 | outputText += "|- Free Provider: " + strconv.FormatBool(emailRepData.Details.FreeProvider) + "\n" 94 | fmt.Println("|- Deliverable:", color.WhiteString(strconv.FormatBool(emailRepData.Details.Deliverable))) 95 | outputText += "|- Deliverable: " + strconv.FormatBool(emailRepData.Details.Deliverable) + "\n" 96 | fmt.Println("|- Valid MX:", color.WhiteString(strconv.FormatBool(emailRepData.Details.ValidMx))) 97 | outputText += "|- Valid MX: " + strconv.FormatBool(emailRepData.Details.ValidMx) + "\n" 98 | } else { 99 | color.Red("EmailRep.io API Key is not set!") 100 | outputText += "EmailRep.io API Key is not set!\n" 101 | } 102 | } 103 | 104 | func socialPrint(filename string) { 105 | 106 | f, err := os.Open(filename) 107 | if err != nil { 108 | log.Fatal(err) 109 | } 110 | outputText += "Social Media Search Results: \n" 111 | defer f.Close() 112 | scanner := bufio.NewScanner(f) 113 | for scanner.Scan() { 114 | fmt.Println("|- "+scanner.Text(), color.GreenString("\u2714")) 115 | outputText += "|- " + scanner.Text() + "\n" 116 | 117 | } 118 | if err := scanner.Err(); err != nil { 119 | log.Fatal(err) 120 | } 121 | e := os.Remove(filename) 122 | if e != nil { 123 | log.Fatal(e) 124 | } 125 | } 126 | 127 | func relatedPrint(relEmails []string, relDomains []string, fromGoogle []string, hunterData modules.HunterStruct) { 128 | 129 | fmt.Println("Related Emails:") 130 | outputText += "Related Emails: \n" 131 | for _, v := range relEmails { 132 | fmt.Println("|- "+v, color.GreenString("\u2714")) 133 | outputText += "|- " + v + "\n" 134 | } 135 | if modules.GetAPIKey("Hunter.io API Key") != "" { 136 | for _, v := range hunterData.Data.Emails { 137 | fmt.Println("|- "+v.Value, color.GreenString("\u2714")) 138 | outputText += "|- " + v.Value + "\n" 139 | } 140 | } 141 | println("") 142 | fmt.Println("Related Domains:") 143 | outputText += "Related Domains: \n" 144 | for _, v := range relDomains { 145 | fmt.Println("|- "+v, color.GreenString("\u2714")) 146 | outputText += "|- " + v + "\n" 147 | } 148 | for _, v := range fromGoogle { 149 | fmt.Println("|- "+v, color.GreenString("\u2714")) 150 | outputText += "|- " + v + "\n" 151 | } 152 | } 153 | 154 | func leakPrint(breachData modules.BreachDirectoryStruct, intelxData []string) { 155 | fmt.Println("Password Leaks:") 156 | outputText += "Password Leaks: \n" 157 | if breachData.Success { 158 | for _, v := range breachData.Result { 159 | for _, w := range v.Sources { 160 | fmt.Println("|- " + w) 161 | outputText += "|- " + w + "\n" 162 | } 163 | if v.HasPassword { 164 | fmt.Println("|-- "+v.Password, color.GreenString("\u2714")) 165 | outputText += "|-- " + v.Password + "\n" 166 | } 167 | } 168 | } else { 169 | fmt.Println("|- No Password Leaks from Breach Directory") 170 | outputText += "|- No Password Leaks from Breach Directory \n" 171 | } 172 | println("\nPassword Leaks from Intelx:") 173 | if len(intelxData) > 0 { 174 | for _, v := range intelxData { 175 | fmt.Println("|- "+v, color.GreenString("\u2714")) 176 | outputText += "|- " + v + "\n" 177 | } 178 | } else { 179 | color.Red("No intelx file!") 180 | outputText += "No intelx file! \n" 181 | } 182 | } 183 | 184 | func dumpPrint(binData []string) { 185 | fmt.Println("Pastebin and Throwbin Search Results:") 186 | outputText += "Pastebin and Throwbin Search Results: \n" 187 | for _, v := range binData { 188 | fmt.Println("|- "+v, color.GreenString("\u2714")) 189 | outputText += "|- " + v + "\n" 190 | } 191 | } 192 | 193 | func domainPrint(table *tablewriter.Table, ipapi modules.IPAPIStruct) { 194 | println("\nDomain Information:") 195 | outputText += "Domain Information: \n" 196 | fmt.Println("|- IP: "+ipapi.IP, color.GreenString("\u2714")) 197 | outputText += "|- IP: " + ipapi.IP + "\n" 198 | fmt.Println("|- City: "+ipapi.City, color.GreenString("\u2714")) 199 | outputText += "|- City: " + ipapi.City + "\n" 200 | fmt.Println("|- Region: "+ipapi.Region, color.GreenString("\u2714")) 201 | outputText += "|- Region: " + ipapi.Region + "\n" 202 | fmt.Println("|- Region Code: "+ipapi.RegionCode, color.GreenString("\u2714")) 203 | outputText += "|- Region Code: " + ipapi.RegionCode + "\n" 204 | fmt.Println("|- Country: "+ipapi.Country, color.GreenString("\u2714")) 205 | outputText += "|- Country: " + ipapi.Country + "\n" 206 | fmt.Println("|- Country Code: "+ipapi.CountryCode, color.GreenString("\u2714")) 207 | outputText += "|- Country Code: " + ipapi.CountryCode + "\n" 208 | fmt.Println("|- Country Name: "+ipapi.CountryName, color.GreenString("\u2714")) 209 | outputText += "|- Country Name: " + ipapi.CountryName + "\n" 210 | fmt.Println("|- Postal: "+ipapi.Postal, color.GreenString("\u2714")) 211 | outputText += "|- Postal: " + ipapi.Postal + "\n" 212 | fmt.Println("|- TimeZone: "+ipapi.Timezone, color.GreenString("\u2714")) 213 | outputText += "|- TimeZone: " + ipapi.Timezone + "\n" 214 | fmt.Println("|- Country Calling Code: "+ipapi.CountryCallingCode, color.GreenString("\u2714")) 215 | outputText += "|- Country Calling Code: " + ipapi.CountryCallingCode + "\n" 216 | fmt.Println("|- Currency: "+ipapi.Currency, color.GreenString("\u2714")) 217 | outputText += "|- Currency: " + ipapi.Currency + "\n" 218 | fmt.Println("|- Organization: "+ipapi.Org, color.GreenString("\u2714")) 219 | outputText += "|- Organization: " + ipapi.Org + "\n" 220 | 221 | println("\nDNS Records:") 222 | table.Render() 223 | } 224 | 225 | var outputText string = "" 226 | 227 | func main() { 228 | var email *string = flag.String("e", "", "Set email") 229 | var verify *bool = flag.Bool("verify", false, "Verify method") 230 | var social_accounts *bool = flag.Bool("social", false, "Finding registered accounts from email") 231 | var relateds *bool = flag.Bool("relateds", false, "Finding related emails and domains from domain") 232 | var leaks *bool = flag.Bool("leaks", false, "Finding password leaks from email") 233 | var dumps *bool = flag.Bool("dumps", false, "Finding Pastebin dumps from email") 234 | var domain *bool = flag.Bool("domain", false, "More information about domain") 235 | var output *bool = flag.Bool("o", false, "Output to text file") 236 | var version *bool = flag.Bool("v", false, "Version of mosint") 237 | var help *bool = flag.Bool("h", false, "Help Menu") 238 | var all *bool = flag.Bool("all", false, "All features!") 239 | flag.Parse() 240 | println("") 241 | if len(*email) == 0 { 242 | help_menu() 243 | os.Exit(0) 244 | } else if *help { 245 | help_menu() 246 | os.Exit(0) 247 | } else if *version { 248 | color.White("version: 2.1") 249 | os.Exit(0) 250 | } else if *all { 251 | 252 | var bar = progressbar.Default(100, "mosinting") 253 | bar.Add(5) 254 | var verifyData = modules.VerifyEmail(*email) 255 | bar.Add(7) 256 | var emailRepData = modules.EmailRep(*email) 257 | bar.Add(8) 258 | modules.Runner(*email, "SocialScan") 259 | bar.Add(8) 260 | modules.Runner(*email, "Holehe") 261 | var relEmails = modules.RelatedEmails(*email) 262 | bar.Add(8) 263 | var relDomains = modules.RelatedDomains(*email) 264 | bar.Add(8) 265 | var fromGoogle = modules.Related_domains_from_google(*email) 266 | bar.Add(8) 267 | var hunterData = modules.Hunter(*email) 268 | bar.Add(8) 269 | var breachData = modules.BreachDirectory(*email) 270 | bar.Add(8) 271 | var binData = modules.BinSearch(*email) 272 | bar.Add(8) 273 | var ipapi = modules.IPAPI(*email) 274 | bar.Add(8) 275 | var table = modules.DNS_lookup(*email) 276 | bar.Add(8) 277 | var intelxData = modules.Intelx(*email) 278 | bar.Finish() 279 | verifyPrint(verifyData, emailRepData, *email) 280 | socialPrint("socialscantempresult.txt") 281 | socialPrint("holehetempresult.txt") 282 | relatedPrint(relEmails, relDomains, fromGoogle, hunterData) 283 | leakPrint(breachData, intelxData) 284 | dumpPrint(binData) 285 | domainPrint(table, ipapi) 286 | if *output { 287 | var filename = modules.FileWriter(*email, outputText) 288 | color.Green("\nOutput file: " + filename) 289 | } 290 | os.Exit(0) 291 | } else { 292 | if *verify { 293 | verifyPrint(modules.VerifyEmail(*email), modules.EmailRep(*email), *email) 294 | if *output { 295 | var filename = modules.FileWriter(*email, outputText) 296 | color.Green("\nOutput file: " + filename) 297 | } 298 | os.Exit(0) 299 | } 300 | if *social_accounts { 301 | fmt.Println("Social media accounts opened with", color.WhiteString(*email)) 302 | modules.Runner(*email, "SocialScan") 303 | modules.Runner(*email, "Holehe") 304 | socialPrint("socialscantempresult.txt") 305 | socialPrint("holehetempresult.txt") 306 | if *output { 307 | var filename = modules.FileWriter(*email, outputText) 308 | color.Green("\nOutput file: " + filename) 309 | } 310 | os.Exit(0) 311 | } 312 | if *relateds { 313 | relatedPrint(modules.RelatedEmails(*email), modules.RelatedDomains(*email), modules.Related_domains_from_google(*email), modules.Hunter(*email)) 314 | if *output { 315 | var filename = modules.FileWriter(*email, outputText) 316 | color.Green("\nOutput file: " + filename) 317 | } 318 | os.Exit(0) 319 | } 320 | if *leaks { 321 | leakPrint(modules.BreachDirectory(*email), modules.Intelx(*email)) 322 | if *output { 323 | var filename = modules.FileWriter(*email, outputText) 324 | color.Green("\nOutput file: " + filename) 325 | } 326 | os.Exit(0) 327 | } 328 | if *dumps { 329 | dumpPrint(modules.BinSearch(*email)) 330 | if *output { 331 | var filename = modules.FileWriter(*email, outputText) 332 | color.Green("\nOutput file: " + filename) 333 | } 334 | } 335 | if *domain { 336 | domainPrint(modules.DNS_lookup(*email), modules.IPAPI(*email)) 337 | if *output { 338 | var filename = modules.FileWriter(*email, outputText) 339 | color.Green("\nOutput file: " + filename) 340 | } 341 | os.Exit(0) 342 | } 343 | } 344 | 345 | } 346 | -------------------------------------------------------------------------------- /modules/BreachDirectory.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "encoding/json" 9 | "io/ioutil" 10 | "net/http" 11 | ) 12 | 13 | type BreachDirectoryStruct struct { 14 | Success bool `json:"success"` 15 | Found int `json:"found"` 16 | Result []struct { 17 | HasPassword bool `json:"has_password"` 18 | Sources []string `json:"sources"` 19 | Password string `json:"password,omitempty"` 20 | Sha1 string `json:"sha1,omitempty"` 21 | Hash string `json:"hash,omitempty"` 22 | } `json:"result"` 23 | } 24 | 25 | func BreachDirectory(email string) BreachDirectoryStruct { 26 | key := GetAPIKey("BreachDirectory.org API Key") 27 | url := "https://breachdirectory.p.rapidapi.com/?func=auto&term=" + email 28 | 29 | req, _ := http.NewRequest("GET", url, nil) 30 | 31 | req.Header.Add("x-rapidapi-host", "breachdirectory.p.rapidapi.com") 32 | req.Header.Add("x-rapidapi-key", key) 33 | 34 | res, _ := http.DefaultClient.Do(req) 35 | 36 | defer res.Body.Close() 37 | body, _ := ioutil.ReadAll(res.Body) 38 | data := BreachDirectoryStruct{} 39 | json.Unmarshal(body, &data) 40 | return data 41 | } 42 | -------------------------------------------------------------------------------- /modules/Core.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "bufio" 9 | "encoding/json" 10 | "fmt" 11 | "io" 12 | "io/ioutil" 13 | "os/exec" 14 | ) 15 | 16 | func GetAPIKey(key string) string { 17 | data, err := ioutil.ReadFile("keys.json") 18 | if err != nil { 19 | panic(err) 20 | } 21 | var returnData map[string]interface{} 22 | err = json.Unmarshal(data, &returnData) 23 | if err != nil { 24 | fmt.Printf("%+v", err.Error()) 25 | return "" 26 | } 27 | return returnData[key].(string) 28 | } 29 | 30 | func Runner(email string, kind string) { 31 | cmd := exec.Command("python3", "modules/"+kind+".py", "-e", email) 32 | stdout, err := cmd.StdoutPipe() 33 | if err != nil { 34 | panic(err) 35 | } 36 | stderr, err := cmd.StderrPipe() 37 | if err != nil { 38 | panic(err) 39 | } 40 | err = cmd.Start() 41 | if err != nil { 42 | panic(err) 43 | } 44 | 45 | go copyOutput(stdout) 46 | go copyOutput(stderr) 47 | cmd.Wait() 48 | 49 | } 50 | 51 | func copyOutput(r io.Reader) { 52 | scanner := bufio.NewScanner(r) 53 | for scanner.Scan() { 54 | fmt.Println(scanner.Text()) 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /modules/EmailRep.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "encoding/json" 9 | "io/ioutil" 10 | "net/http" 11 | ) 12 | 13 | type EmailRepStruct struct { 14 | Email string `json:"email"` 15 | Reputation string `json:"reputation"` 16 | Suspicious bool `json:"suspicious"` 17 | References int `json:"references"` 18 | Details struct { 19 | Blacklisted bool `json:"blacklisted"` 20 | MaliciousActivity bool `json:"malicious_activity"` 21 | MaliciousActivityRecent bool `json:"malicious_activity_recent"` 22 | CredentialsLeaked bool `json:"credentials_leaked"` 23 | CredentialsLeakedRecent bool `json:"credentials_leaked_recent"` 24 | DataBreach bool `json:"data_breach"` 25 | FirstSeen string `json:"first_seen"` 26 | LastSeen string `json:"last_seen"` 27 | DomainExists bool `json:"domain_exists"` 28 | DomainReputation string `json:"domain_reputation"` 29 | NewDomain bool `json:"new_domain"` 30 | DaysSinceDomainCreation int `json:"days_since_domain_creation"` 31 | SuspiciousTld bool `json:"suspicious_tld"` 32 | Spam bool `json:"spam"` 33 | FreeProvider bool `json:"free_provider"` 34 | Disposable bool `json:"disposable"` 35 | Deliverable bool `json:"deliverable"` 36 | AcceptAll bool `json:"accept_all"` 37 | ValidMx bool `json:"valid_mx"` 38 | PrimaryMx string `json:"primary_mx"` 39 | Spoofable bool `json:"spoofable"` 40 | SpfStrict bool `json:"spf_strict"` 41 | DmarcEnforced bool `json:"dmarc_enforced"` 42 | Profiles []string `json:"profiles"` 43 | } `json:"details"` 44 | } 45 | 46 | func EmailRep(email string) EmailRepStruct { 47 | key := GetAPIKey("EmailRep.io API Key") 48 | 49 | client := &http.Client{} 50 | req, _ := http.NewRequest("GET", "https://emailrep.io/"+email, nil) 51 | req.Header.Set("Key", key) 52 | req.Header.Set("User-Agent", "mosint") 53 | resp, _ := client.Do(req) 54 | body, _ := ioutil.ReadAll(resp.Body) 55 | data := EmailRepStruct{} 56 | json.Unmarshal(body, &data) 57 | return data 58 | } 59 | -------------------------------------------------------------------------------- /modules/FileWriter.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "log" 9 | "os" 10 | "strconv" 11 | "time" 12 | ) 13 | 14 | func FileWriter(email string, text string) string { 15 | t := time.Now() 16 | 17 | var filename string = "outputs/" + email + "-" + strconv.FormatUint(uint64(t.Unix()), 10) + ".txt" 18 | f, err := os.Create(filename) 19 | 20 | if err != nil { 21 | log.Fatal(err) 22 | } 23 | defer f.Close() 24 | f.WriteString(text) 25 | return filename 26 | } 27 | -------------------------------------------------------------------------------- /modules/Googling.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | googlesearch "github.com/rocketlaunchr/google-search" 9 | ) 10 | 11 | func BinSearch(email string) []string { 12 | var url_array []string 13 | q := "intext:" + string('"') + email + string('"') + " site:pastebin.com" 14 | res, _ := googlesearch.Search(nil, q) 15 | size := len(res) 16 | for i := 0; i < size; i++ { 17 | url_array = append(url_array, res[i].URL) 18 | } 19 | q = "intext:" + string('"') + email + string('"') + " site:throwbin.io" 20 | res, _ = googlesearch.Search(nil, q) 21 | size2 := len(res) 22 | for i := 0; i < size2; i++ { 23 | url_array = append(url_array, res[i].URL) 24 | } 25 | return url_array 26 | } 27 | 28 | func Related_domains_from_google(email string) []string { 29 | var url_array []string 30 | res, _ := googlesearch.Search(nil, email) 31 | size := len(res) 32 | for i := 0; i < size; i++ { 33 | url_array = append(url_array, res[i].URL) 34 | } 35 | return url_array 36 | } 37 | -------------------------------------------------------------------------------- /modules/Holehe.py: -------------------------------------------------------------------------------- 1 | #mosint v2.1 2 | #Author: Alp Keskin 3 | #Github: github.com/alpkeskin 4 | #Website: https://imalp.co 5 | from genericpath import exists 6 | import trio 7 | import httpx 8 | import argparse 9 | from holehe.modules.social_media.wattpad import wattpad 10 | from holehe.modules.social_media.discord import discord 11 | from holehe.modules.social_media.plurk import plurk 12 | from holehe.modules.social_media.imgur import imgur 13 | 14 | 15 | def parse_args(): 16 | parser = argparse.ArgumentParser() 17 | parser.add_argument("-e", "--email", type=str, required=True, help="Email") 18 | return parser.parse_args() 19 | 20 | 21 | async def main(): 22 | try: 23 | args = parse_args() 24 | mail = args.email 25 | out = [] 26 | client = httpx.AsyncClient() 27 | 28 | await wattpad(mail, client, out) 29 | await discord(mail, client, out) 30 | await plurk(mail, client, out) 31 | await imgur(mail, client, out) 32 | file = open("holehetempresult.txt", "w") 33 | for i in out: 34 | if i["exists"]: 35 | file.write(i["name"]) 36 | await client.aclose() 37 | file.close() 38 | except Exception as e: 39 | print(e) 40 | 41 | trio.run(main) 42 | -------------------------------------------------------------------------------- /modules/Hunter.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "encoding/json" 9 | "io/ioutil" 10 | "net/http" 11 | "strings" 12 | ) 13 | 14 | type HunterStruct struct { 15 | Data struct { 16 | Domain string `json:"domain"` 17 | Disposable bool `json:"disposable"` 18 | Webmail bool `json:"webmail"` 19 | AcceptAll bool `json:"accept_all"` 20 | Pattern string `json:"pattern"` 21 | Organization string `json:"organization"` 22 | Country string `json:"country"` 23 | State interface{} `json:"state"` 24 | Emails []struct { 25 | Value string `json:"value"` 26 | Type string `json:"type"` 27 | Confidence int `json:"confidence"` 28 | Sources []struct { 29 | Domain string `json:"domain"` 30 | URI string `json:"uri"` 31 | ExtractedOn string `json:"extracted_on"` 32 | LastSeenOn string `json:"last_seen_on"` 33 | StillOnPage bool `json:"still_on_page"` 34 | } `json:"sources"` 35 | FirstName string `json:"first_name"` 36 | LastName string `json:"last_name"` 37 | Position string `json:"position"` 38 | Seniority string `json:"seniority"` 39 | Department string `json:"department"` 40 | Linkedin interface{} `json:"linkedin"` 41 | Twitter interface{} `json:"twitter"` 42 | PhoneNumber interface{} `json:"phone_number"` 43 | Verification struct { 44 | Date string `json:"date"` 45 | Status string `json:"status"` 46 | } `json:"verification"` 47 | } `json:"emails"` 48 | LinkedDomains []interface{} `json:"linked_domains"` 49 | } `json:"data"` 50 | Meta struct { 51 | Results int `json:"results"` 52 | Limit int `json:"limit"` 53 | Offset int `json:"offset"` 54 | Params struct { 55 | Domain string `json:"domain"` 56 | Company interface{} `json:"company"` 57 | Type interface{} `json:"type"` 58 | Seniority interface{} `json:"seniority"` 59 | Department interface{} `json:"department"` 60 | } `json:"params"` 61 | } `json:"meta"` 62 | } 63 | 64 | func Hunter(email string) HunterStruct { 65 | key := GetAPIKey("Hunter.io API Key") 66 | 67 | client := &http.Client{} 68 | req, _ := http.NewRequest("GET", "https://api.hunter.io/v2/domain-search?domain="+strings.Split(email, "@")[1]+"&api_key="+key, nil) 69 | req.Header.Set("User-Agent", "mosint") 70 | resp, _ := client.Do(req) 71 | body, _ := ioutil.ReadAll(resp.Body) 72 | data := HunterStruct{} 73 | json.Unmarshal(body, &data) 74 | return data 75 | } 76 | -------------------------------------------------------------------------------- /modules/Intelx.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "context" 9 | "fmt" 10 | 11 | "github.com/IntelligenceX/SDK/Go/ixapi" 12 | ) 13 | 14 | const defaultMaxResults = 10 // max results to query and show 15 | const frontendBaseURL = "https://intelx.io/" 16 | 17 | var urls []string 18 | 19 | func Intelx(email string) []string { 20 | key := GetAPIKey("Intelx.io API Key") 21 | 22 | search(context.Background(), key, email, 2) 23 | 24 | return urls 25 | } 26 | 27 | func search(ctx context.Context, Key, Selector string, Sort int) { 28 | 29 | search := ixapi.IntelligenceXAPI{} 30 | search.Init("", Key) 31 | results, selectorInvalid, err := search.Search(ctx, Selector, Sort, defaultMaxResults, ixapi.DefaultWaitSortTime, ixapi.DefaultTimeoutGetResults) 32 | 33 | if err != nil { 34 | fmt.Printf("Error querying results: %s\n", err) 35 | return 36 | } else if len(results) == 0 && selectorInvalid { 37 | return 38 | } 39 | 40 | text := generateResultText(ctx, &search, results) 41 | fmt.Println(text) 42 | } 43 | 44 | func generateResultText(ctx context.Context, api *ixapi.IntelligenceXAPI, Records []ixapi.SearchResult) (text string) { 45 | 46 | for n, record := range Records { 47 | resultLink := frontendBaseURL + "?did=" + record.SystemID.String() 48 | 49 | title := record.Name 50 | if title == "" { 51 | title = "Untitled Document" 52 | } 53 | urls = append(urls, resultLink) 54 | 55 | if n >= defaultMaxResults-1 { 56 | break 57 | } 58 | } 59 | 60 | return 61 | } 62 | -------------------------------------------------------------------------------- /modules/Lookup.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "encoding/json" 9 | "net" 10 | "os" 11 | "strings" 12 | 13 | "github.com/olekukonko/tablewriter" 14 | "github.com/valyala/fasthttp" 15 | ) 16 | 17 | type IPAPIStruct struct { 18 | IP string `json:"ip"` 19 | Version string `json:"version"` 20 | City string `json:"city"` 21 | Region string `json:"region"` 22 | RegionCode string `json:"region_code"` 23 | Country string `json:"country"` 24 | CountryName string `json:"country_name"` 25 | CountryCode string `json:"country_code"` 26 | CountryCodeIso3 string `json:"country_code_iso3"` 27 | CountryCapital string `json:"country_capital"` 28 | CountryTld string `json:"country_tld"` 29 | ContinentCode string `json:"continent_code"` 30 | InEu bool `json:"in_eu"` 31 | Postal string `json:"postal"` 32 | Latitude float64 `json:"latitude"` 33 | Longitude float64 `json:"longitude"` 34 | Timezone string `json:"timezone"` 35 | UtcOffset string `json:"utc_offset"` 36 | CountryCallingCode string `json:"country_calling_code"` 37 | Currency string `json:"currency"` 38 | CurrencyName string `json:"currency_name"` 39 | Languages string `json:"languages"` 40 | CountryArea float64 `json:"country_area"` 41 | CountryPopulation int `json:"country_population"` 42 | Asn string `json:"asn"` 43 | Org string `json:"org"` 44 | } 45 | 46 | func DNS_lookup(email string) *tablewriter.Table { 47 | splt := strings.Split(email, "@") 48 | 49 | data := [][]string{} 50 | iprecords, _ := net.LookupIP(splt[1]) 51 | for _, ip := range iprecords { 52 | row := []string{"IP", ip.String()} 53 | data = append(data, row) 54 | } 55 | nameserver, _ := net.LookupNS(splt[1]) 56 | for _, ns := range nameserver { 57 | row := []string{"NS", ns.Host} 58 | data = append(data, row) 59 | } 60 | mxrecords, _ := net.LookupMX(splt[1]) 61 | for _, mx := range mxrecords { 62 | row := []string{"MX", mx.Host} 63 | data = append(data, row) 64 | } 65 | txtrecords, _ := net.LookupTXT(splt[1]) 66 | for _, txt := range txtrecords { 67 | row := []string{"TXT", txt} 68 | data = append(data, row) 69 | } 70 | 71 | table := tablewriter.NewWriter(os.Stdout) 72 | table.SetHeader([]string{"Name", "Record"}) 73 | 74 | for _, v := range data { 75 | table.Append(v) 76 | } 77 | //table.Render() 78 | return table 79 | } 80 | 81 | func IPAPI(email string) IPAPIStruct { 82 | data := IPAPIStruct{} 83 | splt := strings.Split(email, "@") 84 | ips, _ := net.LookupIP(splt[1]) 85 | ip4api := "" 86 | for _, ip := range ips { 87 | if ipv4 := ip.To4(); ipv4 != nil { 88 | ip4api = ipv4.String() 89 | } 90 | } 91 | if ip4api != "" { 92 | req := fasthttp.AcquireRequest() 93 | resp := fasthttp.AcquireResponse() 94 | defer fasthttp.ReleaseRequest(req) 95 | defer fasthttp.ReleaseResponse(resp) 96 | 97 | req.SetRequestURI("https://ipapi.co/" + ip4api + "/json/") 98 | 99 | fasthttp.Do(req, resp) 100 | 101 | bodyBytes := resp.Body() 102 | 103 | json.Unmarshal(bodyBytes, &data) 104 | } 105 | return data 106 | } 107 | -------------------------------------------------------------------------------- /modules/SocialScan.py: -------------------------------------------------------------------------------- 1 | #mosint v2.1 2 | #Author: Alp Keskin 3 | #Github: github.com/alpkeskin 4 | #Website: https://imalp.co 5 | from socialscan.util import Platforms, sync_execute_queries 6 | import argparse 7 | 8 | 9 | 10 | def parse_args(): 11 | parser = argparse.ArgumentParser() 12 | parser.add_argument("-e", "--email", type=str, required=True, help="Email") 13 | return parser.parse_args() 14 | 15 | 16 | def main(): 17 | try: 18 | args = parse_args() 19 | mail = args.email 20 | q = [mail] 21 | platforms = [ 22 | Platforms.GITHUB, 23 | Platforms.TWITTER, 24 | Platforms.INSTAGRAM, 25 | Platforms.PINTEREST, 26 | Platforms.SPOTIFY, 27 | Platforms.FIREFOX, 28 | ] 29 | results = sync_execute_queries(q, platforms) 30 | f = open("socialscantempresult.txt", "w") 31 | for result in results: 32 | if not result.available: 33 | f.write(f"{result.platform}\n") 34 | f.close() 35 | except Exception as e: 36 | print(e) 37 | 38 | main() 39 | -------------------------------------------------------------------------------- /modules/ThreatCrowd.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "encoding/json" 9 | "fmt" 10 | "strings" 11 | 12 | "github.com/valyala/fasthttp" 13 | ) 14 | 15 | func doRequest(url string, kind string) []string { 16 | req := fasthttp.AcquireRequest() 17 | resp := fasthttp.AcquireResponse() 18 | defer fasthttp.ReleaseRequest(req) 19 | defer fasthttp.ReleaseResponse(resp) 20 | 21 | req.SetRequestURI(url) 22 | 23 | fasthttp.Do(req, resp) 24 | var data_array []string 25 | bodyBytes := resp.Body() 26 | var dat map[string]interface{} 27 | if err := json.Unmarshal(bodyBytes, &dat); err != nil { 28 | panic(err) 29 | } 30 | if dat["response_code"] == "1" { 31 | 32 | q := dat[kind] 33 | str := fmt.Sprintf("%v", q) 34 | splt := strings.Split(str, " ") 35 | length := len(splt) 36 | if length > 0 { 37 | for i := 0; i < length; i++ { 38 | if i == 0 { 39 | data_array = append(data_array, splt[i][1:]) 40 | } else if i == (length - 1) { 41 | data_array = append(data_array, splt[i][:len(splt[i])-1]) 42 | } else { 43 | data_array = append(data_array, splt[i]) 44 | } 45 | } 46 | } 47 | } 48 | return data_array 49 | } 50 | 51 | func RelatedDomains(email string) []string { 52 | return doRequest("https://www.threatcrowd.org/searchApi/v2/email/report/?email="+email, "domains") 53 | } 54 | 55 | func RelatedEmails(email string) []string { 56 | return doRequest("https://www.threatcrowd.org/searchApi/v2/domain/report/?domain="+strings.Split(email, "@")[1], "emails") 57 | } 58 | -------------------------------------------------------------------------------- /modules/Verify.go: -------------------------------------------------------------------------------- 1 | // mosint v2.1 2 | // Author: Alp Keskin 3 | // Github: github.com/alpkeskin 4 | // Website: https://imalp.co 5 | package modules 6 | 7 | import ( 8 | "strings" 9 | 10 | emailverifier "github.com/AfterShip/email-verifier" 11 | ) 12 | 13 | type VerifyStruct struct { 14 | IsVerified bool `json:"is_verified"` 15 | IsDisposable bool `json:"is_disposable"` 16 | Err error `json:"err"` 17 | } 18 | 19 | var ( 20 | verifier = emailverifier.NewVerifier(). 21 | EnableAutoUpdateDisposable() 22 | ) 23 | 24 | func VerifyEmail(email string) VerifyStruct { 25 | v := VerifyStruct{} 26 | ret, err := verifier.Verify(email) 27 | if err != nil { 28 | v.Err = err 29 | } 30 | if !ret.Syntax.Valid { 31 | v.IsVerified = false 32 | } else { 33 | domain := strings.Split(email, "@")[1] 34 | v.IsVerified = true 35 | if !verifier.IsDisposable(domain) { 36 | v.IsDisposable = false 37 | } else { 38 | v.IsDisposable = true 39 | } 40 | } 41 | return v 42 | 43 | } 44 | -------------------------------------------------------------------------------- /outputs/DELETEME.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | holehe==1.60.3 2 | httpx==0.22.0 3 | socialscan==1.4.1 4 | trio==0.20.0 5 | --------------------------------------------------------------------------------