{"id":13937264,"url":"https://github.com/NullHypothesis/exitmap","last_synced_at":"2025-07-19T23:31:18.921Z","repository":{"id":44329160,"uuid":"14591713","full_name":"NullHypothesis/exitmap","owner":"NullHypothesis","description":"A fast and modular scanner for Tor exit relays. The canonical repository (including issue tracker) is at https://gitlab.torproject.org/tpo/network-health/exitmap","archived":true,"fork":false,"pushed_at":"2023-10-16T15:30:05.000Z","size":1585,"stargazers_count":457,"open_issues_count":0,"forks_count":105,"subscribers_count":39,"default_branch":"master","last_synced_at":"2025-04-02T06:35:57.598Z","etag":null,"topics":["python","scanner","security","tor","tor-network"],"latest_commit_sha":null,"homepage":"https://www.cs.kau.se/philwint/spoiled_onions/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NullHypothesis.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2013-11-21T15:41:22.000Z","updated_at":"2025-02-02T12:21:20.000Z","dependencies_parsed_at":"2024-04-23T19:06:08.964Z","dependency_job_id":"7e78c377-bcd0-4830-858a-3869168f1014","html_url":"https://github.com/NullHypothesis/exitmap","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/NullHypothesis/exitmap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullHypothesis%2Fexitmap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullHypothesis%2Fexitmap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullHypothesis%2Fexitmap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullHypothesis%2Fexitmap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NullHypothesis","download_url":"https://codeload.github.com/NullHypothesis/exitmap/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullHypothesis%2Fexitmap/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266041690,"owners_count":23867944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","scanner","security","tor","tor-network"],"created_at":"2024-08-07T23:03:26.734Z","updated_at":"2025-07-19T23:31:18.669Z","avatar_url":"https://github.com/NullHypothesis.png","language":"Python","readme":"![exitmap logo](doc/logo.png)\n\n**This repository is unmaintained.\nRefer to [The Tor Project's fork](https://gitlab.torproject.org/tpo/network-health/exitmap).**\n\nOverview\n--------\n\nExitmap is a fast and modular Python-based scanner for\n[Tor](https://www.torproject.org) exit relays.  Exitmap modules implement tasks\nthat are run over (a subset of) all exit relays.  If you have a background in\nfunctional programming, think of exitmap as a `map()` interface for Tor exit\nrelays: Modules can perform any TCP-based networking task like fetching a web\npage, uploading a file, connecting to an SSH server, or joining an IRC channel.\n\nIn practice, exitmap is useful to monitor the reliability and trustworthiness of\nexit relays.  The Tor Project uses exitmap to check for false negatives on the\nTor Project's [check](https://check.torproject.org) service and to find\n[malicious exit relays](http://www.cs.kau.se/philwint/spoiled_onions).  It is\neasy to develop new modules for exitmap; just have a look at the file HACKING in\nthe doc/ directory or check out one of the existing modules.\n\nExitmap uses [Stem](https://stem.torproject.org) to create circuits to all given\nexit relays.  Each time tor notifies exitmap of an established circuit, a module\nis invoked for the newly established circuit.  Modules can be pure Python\nscripts or executables.  For executables,\n[torsocks](https://github.com/dgoulet/torsocks/) is necessary.\n\nFinally, note that exitmap is a network measurement tool and of little use to\nordinary Tor users.  The Tor Project is already running the tool regularly.\nMore exitmap scans just cause unnecessary network load.  The only reason exitmap\nis publicly available is because its source code and design might be of interest\nto some.\n\nInstallation\n------------\n\nExitmap uses the library Stem to communicate with Tor.  There are\n[plenty of ways](https://stem.torproject.org/download.html) to install Stem.\nThe easiest might be to use pip in combination with the provided\nrequirements.txt file:\n\n    $ pip install -r requirements.txt\n\nRunning exitmap\n---------------\n\nThe only argument exitmap requires is the name of a module.  For example, you\ncan run exitmap with the checktest module by running:\n\n    $ ./bin/exitmap checktest\n\nThe command line output will then show you how Tor bootstraps, the output of the\nchecktest module, and a scan summary.  If you don't need three hops and prefer\nto use two hops with a static first hop, run:\n\n    $ ./bin/exitmap --first-hop 1234567890ABCDEF1234567890ABCDEF12345678 checktest\n\nTo run the same test over German exit relays only, execute:\n\n    $ ./bin/exitmap --country DE --first-hop 1234567890ABCDEF1234567890ABCDEF12345678 checktest\n\nIf you want to pause for five seconds in between circuit creations to reduce the\nload on the Tor network and the scanning destination, run:\n\n    $ ./bin/exitmap --build-delay 5 checktest\n\nNote that `1234567890ABCDEF1234567890ABCDEF12345678` is a pseudo fingerprint\nthat you should replace with an exit relay that you control.\n\nTo learn more about all of exitmap's options, run:\n\n    $ ./bin/exitmap --help\n\nExitmap comes with batteries included, providing the following modules:\n\n* testfds: Tests if an exit relay is able to fetch the content of a simple\n  web page.  If an exit relay is unable to do that, it might not have enough\n  file descriptors available.\n* checktest: Attempts to find false negatives in the Tor Project's\n  [check](https://check.torproject.org) service.\n* dnspoison: Attempts to resolve several domains and compares the received DNS A\n  records to the expected records.\n* dnssec: Detects exit relays whose resolver does not validate DNSSEC.\n* patchingCheck: Checks for file tampering.\n* cloudflared: Checks if a web site returns a CloudFlare CAPTCHA.\n* rtt: Measure round-trip times through an exit to various destinations.\n\nConfiguration\n-------------\n\nBy default, exitmap tries to read the file .exitmaprc in your home directory.\nThe file accepts all command line options, but you have to replace minuses with\nunderscores.  Here is an example:\n\n    [Defaults]\n    first_hop = 1234567890ABCDEF1234567890ABCDEF12345678\n    verbosity = debug\n    build_delay = 1\n    analysis_dir = /path/to/exitmap_scans\n\nAlternatives\n------------\n\nDon't like exitmap?  Then have a look at\n[tortunnel](http://www.thoughtcrime.org/software/tortunnel/),\n[SoaT](https://gitweb.torproject.org/torflow.git/tree/NetworkScanners/ExitAuthority/README.ExitScanning),\n[torscanner](https://code.google.com/p/torscanner/),\n[DetecTor](http://detector.io/DetecTor.html), or\n[SelekTOR](https://www.dazzleships.net/selektor-for-linux/).\n\nTests\n-----\n\nBefore submitting pull requests, please make sure that all unit tests pass by\nrunning:\n\n    $ pip install -r requirements-dev.txt\n    $ py.test --cov-report term-missing --cov-config .coveragerc --cov=src test\n\nFeedback\n--------\n\nContact: Philipp Winter \u003cphw@nymity.ch\u003e  \nOpenPGP fingerprint: `B369 E7A2 18FE CEAD EB96  8C73 CF70 89E3 D7FD C0D0`\n","funding_links":[],"categories":["Tools","Python"],"sub_categories":["Scanner"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNullHypothesis%2Fexitmap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNullHypothesis%2Fexitmap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNullHypothesis%2Fexitmap/lists"}