{"id":16774706,"url":"https://github.com/leonjza/qrxfer","last_synced_at":"2025-03-17T02:31:34.096Z","repository":{"id":49294747,"uuid":"54720300","full_name":"leonjza/qrxfer","owner":"leonjza","description":"Transfer files from Air gapped machines using QR codes","archived":false,"fork":false,"pushed_at":"2021-06-19T15:09:57.000Z","size":6,"stargazers_count":108,"open_issues_count":2,"forks_count":22,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-02-27T16:48:20.877Z","etag":null,"topics":["exfiltration","qrcode"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leonjza.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-25T13:28:29.000Z","updated_at":"2025-02-03T10:53:15.000Z","dependencies_parsed_at":"2022-08-31T03:53:51.442Z","dependency_job_id":null,"html_url":"https://github.com/leonjza/qrxfer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonjza%2Fqrxfer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonjza%2Fqrxfer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonjza%2Fqrxfer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leonjza%2Fqrxfer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leonjza","download_url":"https://codeload.github.com/leonjza/qrxfer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243841125,"owners_count":20356440,"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":["exfiltration","qrcode"],"created_at":"2024-10-13T06:49:54.613Z","updated_at":"2025-03-17T02:31:33.849Z","avatar_url":"https://github.com/leonjza.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QRXfer\nTransfer files from Air gapped machines using QR codes\n\n## introduction\nQRXfer is one of those \"I had to give it a try\" ideas. The basic idea is that it is possible to play back QR code encoded data to a receiver that may be able to reconstruct the data and reproduce the file that was originally sent.  \n\nThink about an airgapped machine being able to generate the QR codes, you recording it with your phone, and playing it back to the receiver later.\n\nSilly, I know.\n\nI tested 2 main scenarios.  \nThe first was starting the listener on my laptop with the webcam, and the emitter on another pc (so 2 screens facing each other, not connected in *any* way). This method was the least error prone as both the sender and receiver were standing still.\n\nThe second was recording the emitter with my phone, and then placing my phone in front of the webcam with the receiver running. This was obviously much more error prone with me not being able to hold the phone still ;)\n\n## installation\nI used a [Kali Rolling](https://www.kali.org/downloads/) virtual machine with my laptops builtin Webcam added to the VMs hardware to build and test this.  \nInstallation on Kali is relatively simple. QRXfer uses [OpenCV](http://opencv.org/) python bindings and [Zbar](http://zbar.sourceforge.net/) python bindings for most of the magic.\n\n  1. Install `click` with `pip install click`\n  2. Install `opencv` with `apt-get install python-opencv`\n  3. Install `zbar` with `apt-get install python-zbar`\n  4. `git clone https://github.com/leonjza/qrxfer.git` or just grab a copy of the `qrxfer.py` script.\n\n## usage\n```\n# python qrxfer.py --help\nUsage: qrxfer.py [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  --help  Show this message and exit.\n\nCommands:\n  preview\n  receive\n  send\n\n```\n\n## demos\n### send\nThe below asciicast shows how to send a file using `qrxfer.py`.  \nThe command used in this case was `python qrxfer.py send -s 20 -i /tmp/test_file`:\n\n[![asciicast](https://asciinema.org/a/6arvdtdycl2mlxsp060n2u1a7.png)](https://asciinema.org/a/6arvdtdycl2mlxsp060n2u1a7)\n\n### receive\nThe below asciicast shows how to receive a file using `qrxfer.py`.  \nThe command used in this case was `python qrxfer.py receive -d incoming`:\n\n[![asciicast](https://asciinema.org/a/3f2vfou57yhib3l478pwow84n.png)](https://asciinema.org/a/3f2vfou57yhib3l478pwow84n)\n\n## contact\n[@leonjza](https://twitter.com/leonjza)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonjza%2Fqrxfer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleonjza%2Fqrxfer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleonjza%2Fqrxfer/lists"}