{"id":15115371,"url":"https://github.com/kmarkela/duffman","last_synced_at":"2025-05-08T21:28:19.042Z","repository":{"id":246528090,"uuid":"816192593","full_name":"kmarkela/duffman","owner":"kmarkela","description":"Fuzzer and Lightweight CLI Client for Postman Collections ","archived":false,"fork":false,"pushed_at":"2024-09-30T06:31:42.000Z","size":127830,"stargazers_count":60,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-15T16:41:09.087Z","etag":null,"topics":["api-pentest","api-testing","fuzz-testing","fuzzer","fuzzing","postman","postman-collection"],"latest_commit_sha":null,"homepage":"","language":"Go","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/kmarkela.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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,"publiccode":null,"codemeta":null}},"created_at":"2024-06-17T08:21:46.000Z","updated_at":"2024-09-25T18:21:10.000Z","dependencies_parsed_at":"2024-07-23T15:14:51.305Z","dependency_job_id":"0f8db500-bc8d-4b75-a4fb-1726c26d9885","html_url":"https://github.com/kmarkela/duffman","commit_stats":null,"previous_names":["kmarkela/duffman"],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kmarkela%2Fduffman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kmarkela%2Fduffman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kmarkela%2Fduffman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kmarkela%2Fduffman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kmarkela","download_url":"https://codeload.github.com/kmarkela/duffman/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238044095,"owners_count":19407128,"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":["api-pentest","api-testing","fuzz-testing","fuzzer","fuzzing","postman","postman-collection"],"created_at":"2024-09-26T01:43:47.935Z","updated_at":"2025-02-10T02:10:11.534Z","avatar_url":"https://github.com/kmarkela.png","language":"Go","funding_links":[],"categories":["Go","\u003ca name=\"Go\"\u003e\u003c/a\u003eGo"],"sub_categories":[],"readme":"# DuffMan: Diagnostic Utility for Fuzzing and Fault Management of API Nodes\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/kmarkela/duffman)](https://goreportcard.com/report/github.com/kmarkela/duffman)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/duffman.png\" alt=\"DuffMan\"/\u003e\n\u003c/p\u003e\n\nDuffMan is a tool written in Go that allows users to parse Postman collections and perform fuzz testing on all the endpoints defined within. it is also can act as lightweight CLI postman client. This tool is designed to help developers and security analysts discover potential vulnerabilities and ensure robust error handling in their APIs.\n\n## Install \n\nThere are three ways to install the DuffMan: building from source, using `go install`, or downloading pre-compiled binaries.\n\n### Building from Source\n\n```sh\ngit clone https://github.com/kmarkela/duffman\ncd duffman\ngo build -o duffman\n```\n\n### Using `go install`\n\n```sh\ngo install github.com/kmarkela/duffman@latest\n```\n\n### Binaries \n\nIf you prefer to download a pre-compiled binary for your platform, follow these steps:\n\n1. Navigate to the [Releases page](https://github.com/kmarkela/duffman/releases) of the DuffMan repository.\n2. Download the appropriate binary for your operating system and architecture.\n3. Move the binary to your desired location.\n\n\n## Usage\n\n```sh\nDiagnostic Utility for Fuzzing and Fault Management of API Nodes\n\nUsage:\n  DuffMan [flags]\n  DuffMan [command]\n\nAvailable Commands:\n  client      Lightweight CLI postman client\n  fuzz        Fuzz all endpoint from Postman Collection\n  help        Help about any command\n  parse       Parse only collection file\n  version     Print Version\n\nFlags:\n  -f, --collection string    path to collection file\n  -e, --environment string   path to environment file\n  -h, --help                 help for DuffMan\n\nUse \"DuffMan [command] --help\" for more information about a command.\n```\n\n### Client\n\nA lightweight CLI postman client. \n\n![demo](./assets/inter.gif)\n\nNavigation:\n- `enter` - open folder/request \n- `up/down` - list navigation\n- `esc` - exit\n- `backspace` - go to parrent folder\n- `tab` - swich tabs in request view (`REQUEST`/`VARIABLES`/`RESPONSE`)\n- `ctrl+s` - save variables\n- `ctrl+r` - send request\n- `ctrl+l` - back to requests list\n\n### Parse\n\nParses Postman Collection and Environment files and print Requests/Variables/etc defined within.\n\n```sh\nparse only collection file\n\nUsage:\n  DuffMan parse [flags]\n\nFlags:\n  -h, --help            help for parse\n      --output string   output type. Possible values: brief, req, full (default \"req\")\n\nGlobal Flags:\n  -f, --collection  string   path to collection file\n  -e, --environment string   path to environment file\n```\n\n#### Example\n\n```sh\nduffman parse -e test/testing_environment.json -f test/testing_collection.json\n\n```\n\n```sh\n\n ####                                       ###\n ######                                   #######\n ########                       ######   #########\n ##########                    ########  ###   ##\n ####  #####                   ###  ###  ###\n ####   #####                  ###       ###\n ####    #####                 ###       ###\n ####     #####                ###       ###\n ####     #####                ###       ###\n ####      #####               ###       ###\n ####      #####               ###       ###       ###\n ####      #####  ###   ####   ###       ###    ######\n ####      #####  ###   ####   ###       ### #######\n ####      #####  ###   ####   ###       ########\n ####       ####  ###   ####   ###      ######\n ####       ####  ###   ####   ###   ########\n ####       ####  #### #####   ##############\n ####      #####  #########    #######   ####\n ####      #####   ########  ######       ###\n ####      ####      ###  ########        ###\n ####     #####        ####### ###        ###\n ####    #####       ######    ###   ###  ###\n ####   #####      #####    #   ##  #### ####\n #### ######      ###     ####  ##  ########\n #########                ########   ######\n #######                   #######\n #####                      ####\n\n[*] Environment:\n  - env1: 9999\n  - env2: 8888\n  - env3: 7777\n[*] Variables:\n  - testing: 123456\n[*] Req amount: 9\n[*] Requests:\n  - URL: http://foo.bar/3-sub/post/raw-json\n  - URL: http://foo.bar/2-sub/post/raw-text\n  - URL: http://foo.bar/2-sub/post/raw_params\n  - URL: http://foo.bar/2-sub/post/form_params\n  - URL: http://foo.bar/2-sub/post/urlen_params_header\n  - URL: http://foo.bar/1-sub/get/var/1111/2222\n  - URL: http://foo.bar/get/var/1111/2222\n  - URL: http://foo.bar/get/variable/1111/2222\n  - URL: http://foo.bar/env\n```\n\n### Fuzz\n\n```sh\nIt allows to fuzz muptiple parameters over multiple endpoints\n\nUsage:\n  DuffMan fuzz [flags]\n\nFlags:\n      --headers strings               replace header if exists, add if it wasn't in original request\n  -h, --help                          help for fuzz\n  -r, --hide-response-time int        hide requests with response time less than X in milliseconds\n  -m, --maxReq int                    max amount of requests per second\n  -p, --proxy string                  proxy\n  -b, --status-codes-blacklist ints   hide responses with specified status codes\n      --variables strings             replace variables value\n  -l, --wordlist string               wordlits to fuzz\n  -w, --workers int                   amount of workers (default 10)\n\nGlobal Flags:\n  -f, --collection string    path to collection file\n  -e, --environment string   path to environment file\n```\n\n#### Example\n\n```sh\ngo run main.go fuzz -f test/testing_collection.json -e test/testing_environment.json --headers \"User-Agent: duffman\" --headers \"X-Fuzz: test\" -m 40 -w 100 -p http://127.0.0.1:8080 -l ~/1.lst -b 404,401\n```\n\n```sh\n\n ####                                       ###\n ######                                   #######\n ########                       ######   #########\n ##########                    ########  ###   ##\n ####  #####                   ###  ###  ###\n ####   #####                  ###       ###\n ####    #####                 ###       ###\n ####     #####                ###       ###\n ####     #####                ###       ###\n ####      #####               ###       ###\n ####      #####               ###       ###       ###\n ####      #####  ###   ####   ###       ###    ######\n ####      #####  ###   ####   ###       ### #######\n ####      #####  ###   ####   ###       ########\n ####       ####  ###   ####   ###      ######\n ####       ####  ###   ####   ###   ########\n ####       ####  #### #####   ##############\n ####      #####  #########    #######   ####\n ####      #####   ########  ######       ###\n ####      ####      ###  ########        ###\n ####     #####        ####### ###        ###\n ####    #####       ######    ###   ###  ###\n ####   #####      #####    #   ##  #### ####\n #### ######      ###     ####  ##  ########\n #########                ########   ######\n #######                   #######\n #####                      ####\n\n########################################################\n#                        DuffMan                       #\n# [*] Wordlist count: 3                                #\n# [*] Amount of request: 9                             #\n# [*] Amount of parameters: 16                         #\n# [*] Total to fuzz: 48                                #\n# [*] Status Code Blacklist: 404,401                   #\n########################################################\n\n+-----------------------------------------------+--------+-------------------+------+------+--------+------+\n| ENPOINT                                       | METHOD | PARAMETER         | FUZZ | CODE | LENGTH | TIME |\n+-----------------------------------------------+--------+-------------------+------+------+--------+------+\n| http://foo.bar/3-sub/post/raw-json            | POST   | test1             | pwn2 |  501 |    357 | 44ms |\n| http://foo.bar/3-sub/post/raw-json            | POST   | test1             | pwn1 |  501 |    357 | 69ms |\n| http://foo.bar/3-sub/post/raw-json            | POST   | test1             |      |  501 |    357 | 24ms |\n| http://foo.bar/3-sub/post/raw-json            | POST   | test2.test3.test4 | pwn1 |  501 |    357 | 14ms |\n| http://foo.bar/3-sub/post/raw-json            | POST   | test2.test3.test4 | pwn2 |  501 |    357 | 15ms |\n| http://foo.bar/3-sub/post/raw-json            | POST   | test2.test3.test4 |      |  501 |    357 | 29ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | testing-param     | pwn1 |  501 |    357 | 11ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | testing-param     | pwn2 |  501 |    357 | 12ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | testing-param     |      |  501 |    357 | 18ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | test              | pwn1 |  501 |    357 | 92ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | test              | pwn2 |  501 |    357 | 89ms |\n| http://foo.bar/2-sub/post/form_params         | POST   | testing-param     | pwn1 |  501 |    357 | 49ms |\n| http://foo.bar/2-sub/post/raw_params          | POST   | test              |      |  501 |    357 | 78ms |\n| http://foo.bar/2-sub/post/form_params         | POST   | testing-param     | pwn2 |  501 |    357 | 38ms |\n| http://foo.bar/2-sub/post/form_params         | POST   | testing-param     |      |  501 |    357 | 18ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | testing-param     | pwn1 |  501 |    357 | 12ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | testing-param     | pwn2 |  501 |    357 | 21ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | testing-param     |      |  501 |    357 | 14ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | params            | pwn1 |  501 |    357 | 16ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | params            | pwn2 |  501 |    357 | 11ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | params            |      |  501 |    357 | 18ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | param2            | pwn1 |  501 |    357 | 13ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | param2            | pwn2 |  501 |    357 | 15ms |\n| http://foo.bar/2-sub/post/urlen_params_header | POST   | param2            |      |  501 |    357 | 17ms |\n+-----------------------------------------------+--------+-------------------+------+------+--------+------+\n\n[-] 3 Errors occur during Fuzz:\n  - Endpoint http://foo.bar/2-sub/post/form_params:\n    * Param: post\n    * Error: no encoder for: multipart/form-data; boundary=------border\n  - Endpoint http://foo.bar/2-sub/post/form_params:\n    * Param: post\n    * Error: no encoder for: multipart/form-data; boundary=------border\n  - Endpoint http://foo.bar/2-sub/post/form_params:\n    * Param: post\n    * Error: no encoder for: multipart/form-data; boundary=------border\n```\n\n### License \n\nThis project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.\n\n### Disclamer \n\nThe DuffMan is intended for security research and testing purposes only. This tool should only be used on systems that you own or are explicitly authorized to test. Ethical conduct is required from all users.\n\nThe author(s) of this tool take no responsibility for any misuse of the software. It is the end user's responsibility to comply with all applicable local, state, federal, and international laws. By using this tool, you agree that you hold responsibility for any consequences that arise from its use.\n\n### Contributing\n\nWe welcome contributions! Please read our [CONTRIBUTING](./CONTRIBUTING.md) for details on how to submit pull requests, the process for submitting bugs, feature requests, and how to propose changes.\n\n### Authors\n\n- Kanstantsin Markelau \n- Sam Cosentino \n\n### Limitations \n\nDuffMan can fuzz `JSON` bodies, but with the following limitations:\n\n1. DuffMan only fuzzes the first element in an array.\n2. Complex schemas with multiple nested arrays may not be reconstructed accurately.\n\nExaples of tested `JSON` can be found [here](./test/json.md)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkmarkela%2Fduffman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkmarkela%2Fduffman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkmarkela%2Fduffman/lists"}