From dc6761ec01d914efb7285b7ab2bcfc81d8d46e06 Mon Sep 17 00:00:00 2001 From: Alexander Neff Date: Sun, 17 Sep 2023 23:00:25 +0200 Subject: [PATCH 01/20] Add README text --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3dacb6e5..1349659b 100755 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ 🚩 This is the open source repository of NetExec maintained by a community of passionate people # NetExec - The Network Execution Tool +This project was initially created in 2015 by @byt3bl33d3r, known as CrackMapExec. In 2019 @mpgn_x64 started maintaining the project for the next 4 years, adding a lot of great tools and features. In september 2023 he retired from maintaining the project. + +Like many other contributer we (NeffIsBack, Marshall-Hallenbeck and zblurx) started working on new features, bugfixes and helped maintaining The original project CrackMapExec. With the end of mpgn's maintainer role, we decided to maintain the project together as an fully free and open source project under the new name **NetExec** 🚀 +

@@ -22,10 +26,10 @@ All the hard work and development over the years from everyone in the CrackMapEx # Documentation, Tutorials, Examples -See the project's wiki (in development) for documentation and usage examples +See the project's [wiki](https://www.netexec.wiki/) for documentation and usage examples # Installation -Please see the installation instructions on the wiki (in development) +Please see the installation instructions on the [wiki](https://www.netexec.wiki/getting-started/installation) # Code Contributors Awesome code contributors of NetExec: From 8add99c4ad5282fdfed7d31cf253088c7062974a Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Mon, 18 Sep 2023 12:04:19 -0400 Subject: [PATCH 02/20] Update README.md Add additional rationale for our fork add development section placeholder move acknowledgements section down with code contributors Signed-off-by: Marshall Hallenbeck --- README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9144652c..e8a3c3d0 100755 --- a/README.md +++ b/README.md @@ -7,9 +7,12 @@ 🚩 This is the open source repository of NetExec maintained by a community of passionate people # NetExec - The Network Execution Tool -This project was initially created in 2015 by @byt3bl33d3r, known as CrackMapExec. In 2019 @mpgn_x64 started maintaining the project for the next 4 years, adding a lot of great tools and features. In september 2023 he retired from maintaining the project. +This project was initially created in 2015 by @byt3bl33d3r, known as CrackMapExec. In 2019 @mpgn_x64 started maintaining the project for the next 4 years, adding a lot of great tools and features. In September 2023 he retired from maintaining the project. -Like many other contributer we (NeffIsBack, Marshall-Hallenbeck and zblurx) started working on new features, bugfixes and helped maintaining The original project CrackMapExec. With the end of mpgn's maintainer role, we decided to maintain the project together as an fully free and open source project under the new name **NetExec** 🚀 +Along with many other contributers, we (NeffIsBack, Marshall-Hallenbeck, and zblurx) developed new features, bugfixes, and helped maintain the original project CrackMapExec. +During this time, with both a private and public repository, community contributions were not easily merged into the project. The 6-8 month discrepancy between the code bases caused many development issues and heavily reduced community-driven development. +With the end of mpgn's maintainer role, we (the remaining most active contributors) decided to maintain the project together as a fully free and open source project under the new name **NetExec** 🚀 +Going forward, our intent is to maintain a community-driven and maintained project with regular updates for everyone to use.

@@ -21,15 +24,18 @@ You are on the **latest up-to-date** repository of the project NetExec (nxc) ! - 🔀 If you want to contribute, open a [Pull Request](https://github.com/Pennyw0rth/NetExec/pulls) - 💬 If you want to discuss, open a [Discussion](https://github.com/Pennyw0rth/NetExec/discussions) -# Acknowledgments -All the hard work and development over the years from everyone in the CrackMapExec project - # Documentation, Tutorials, Examples See the project's [wiki](https://netexec.wiki/) (in development) for documentation and usage examples # Installation Please see the installation instructions on the [wiki](https://netexec.wiki/getting-started/installation) (in development) +# Development +Development guidelines and recommendations in development + +# Acknowledgments +All the hard work and development over the years from everyone in the CrackMapExec project + # Code Contributors Awesome code contributors of NetExec: From 5220ea5eb64282cc4e17a2764d5653f6328e6755 Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Tue, 19 Sep 2023 11:14:05 +0200 Subject: [PATCH 03/20] Add discord channel to readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e8a3c3d0..9388a8cd 100755 --- a/README.md +++ b/README.md @@ -24,6 +24,12 @@ You are on the **latest up-to-date** repository of the project NetExec (nxc) ! - 🔀 If you want to contribute, open a [Pull Request](https://github.com/Pennyw0rth/NetExec/pulls) - 💬 If you want to discuss, open a [Discussion](https://github.com/Pennyw0rth/NetExec/discussions) +## Official Discord Channel + +If you don't have a Github account, you can ask your question on Discord + +[![NetExec](https://discordapp.com/api/guilds/1148685154601160794/widget.png?style=banner3)](https://discord.gg/pjwUTQzg8R) + # Documentation, Tutorials, Examples See the project's [wiki](https://netexec.wiki/) (in development) for documentation and usage examples From 05e8f6a0531ef676f2b90a60c91226babae91487 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Tue, 19 Sep 2023 12:29:14 -0400 Subject: [PATCH 04/20] Update README.md Signed-off-by: Marshall Hallenbeck --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9388a8cd..318e3a39 100755 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ You are on the **latest up-to-date** repository of the project NetExec (nxc) ! ## Official Discord Channel -If you don't have a Github account, you can ask your question on Discord +If you don't have a Github account, you can ask your questions on Discord! [![NetExec](https://discordapp.com/api/guilds/1148685154601160794/widget.png?style=banner3)](https://discord.gg/pjwUTQzg8R) From dbd9bdfdde5c50288754c363b31773575ccc520e Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:09:52 +0200 Subject: [PATCH 05/20] Create CODE_OF_CONDUCT.md Signed-off-by: Alex <61382599+NeffIsBack@users.noreply.github.com> --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..18c91471 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 0a02081ab55bf818866e32f3c9b87c96c0f9c279 Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:23:11 +0200 Subject: [PATCH 06/20] Create CONTRIBUTING.md Signed-off-by: Alex <61382599+NeffIsBack@users.noreply.github.com> --- CONTRIBUTING.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f52c6d65 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +# Contributing to Transcriptase +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features +- Becoming a maintainer + +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. Ensure the test suite passes. +4. Make sure your code lints. +5. Issue that pull request! + +## Any contributions you make will be under the BSD-2-Clause Software License +In short, when you submit code changes, your submissions are understood to be under the same [BSD-2-Clause License](https://choosealicense.com/licenses/bsd-2-clause/) that covers the project. Feel free to contact the maintainers if that's a concern. + +## Report bugs using Github's [issues](https://github.com/briandk/transcriptase-atom/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy! + +## Write bug reports with detail, background, and sample code + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Give sample code if you can. +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) + +People *love* thorough bug reports. I'm not even kidding. + +## Use a Consistent Coding Style +[PEP](https://peps.python.org/pep-0008/) is used in this project + +* 4 spaces for indentation rather than tabs +* We use Ruff as linter, there is a VS-Code extension available you can use + +## License +By contributing, you agree that your contributions will be licensed under its BSD-2-Clause License. + +## References +This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md) From 69b00ab1f18a77c3cfe78060f5460cb317d2bdab Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:42:54 +0200 Subject: [PATCH 07/20] Update CONTRIBUTING.md --- CONTRIBUTING.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f52c6d65..a0ddf4dc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,11 +7,11 @@ We love your input! We want to make contributing to this project as easy and tra - Proposing new features - Becoming a maintainer -## We Develop with Github +## We Develop with GitHub We use github to host code, to track issues and feature requests, as well as accept pull requests. -## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests -Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: +## We Use [GitHub Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase (we use [GitHub Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 1. Fork the repo and create your branch from `master`. 2. If you've added code that should be tested, add tests. @@ -22,8 +22,8 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu ## Any contributions you make will be under the BSD-2-Clause Software License In short, when you submit code changes, your submissions are understood to be under the same [BSD-2-Clause License](https://choosealicense.com/licenses/bsd-2-clause/) that covers the project. Feel free to contact the maintainers if that's a concern. -## Report bugs using Github's [issues](https://github.com/briandk/transcriptase-atom/issues) -We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy! +## Report bugs using GitHub's [issues](https://github.com/Pennyw0rth/NetExec/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/Pennyw0rth/NetExec/issues/new/choose); it's that easy! ## Write bug reports with detail, background, and sample code @@ -43,6 +43,7 @@ People *love* thorough bug reports. I'm not even kidding. [PEP](https://peps.python.org/pep-0008/) is used in this project * 4 spaces for indentation rather than tabs +* Double quotes on outside of strings * We use Ruff as linter, there is a VS-Code extension available you can use ## License From 840419a0f778bdc24a7aba8238f17a30651c09ce Mon Sep 17 00:00:00 2001 From: Alex <61382599+NeffIsBack@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:46:53 +0200 Subject: [PATCH 08/20] Remove "private" because sometimes there isnt the option --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 18c91471..02f50a54 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -76,7 +76,7 @@ the consequences for any action they deem in violation of this Code of Conduct: **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. -**Consequence**: A private, written warning from community leaders, providing +**Consequence**: A written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. From 732929e1691ead0f29e67c150cd5c8e25493ee9a Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Thu, 28 Sep 2023 14:04:34 -0400 Subject: [PATCH 09/20] Update CODE_OF_CONDUCT.md add note about certain conduct that may lead directly to a permanent ban with no warning Signed-off-by: Marshall Hallenbeck --- CODE_OF_CONDUCT.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 02f50a54..78a3d4d7 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -58,9 +58,8 @@ representative at an online or offline event. ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -. +Instances of abusive, harassing, or otherwise unacceptable behavior should be +reported to the community leaders (i.e. official maintainers) responsible for enforcement. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the @@ -71,6 +70,10 @@ reporter of any incident. Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: +*Note*: egregious rule breaking, such as obvious trolling, death threats, etc may +lead directly to a permanent ban without warning, i.e. there is no correction or +warnings attempts. + ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed From 8d64b22663704d64f22cea13b268b4f1c15b7d02 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 15:13:27 -0400 Subject: [PATCH 10/20] break up native binary and zipapp build --- .github/workflows/netexec-build-zipapp.yml | 38 ++++++++++++++++++ .github/workflows/netexec-build.yml | 39 +++++++++++++++++++ .github/workflows/netexec.yml | 45 ---------------------- netexec.spec | 2 +- 4 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/netexec-build-zipapp.yml create mode 100644 .github/workflows/netexec-build.yml delete mode 100644 .github/workflows/netexec.yml diff --git a/.github/workflows/netexec-build-zipapp.yml b/.github/workflows/netexec-build-zipapp.yml new file mode 100644 index 00000000..6b774cb9 --- /dev/null +++ b/.github/workflows/netexec-build-zipapp.yml @@ -0,0 +1,38 @@ +name: NetExec Build ZippApps + +on: + workflow_dispatch: + +jobs: + build: + name: Building NetExec Python ZipApp on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + python-version: ["3.8", "3.9", "3.10", "3.11"] + steps: + - uses: actions/checkout@v3 + - name: NetExec set up python on ${{ matrix.os }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Build Python ZipApp with Shiv + run: | + pip install shiv + python build_collector.py + - name: Upload nxc ZipApp + uses: actions/upload-artifact@v3 + with: + name: nxc-zipapp-${{ matrix.os }}-${{ matrix.python-version }} + path: bin/nxc + - name: Upload nxcdb ZipApp + uses: actions/upload-artifact@v3 + with: + name: nxcdb-zipapp-${{ matrix.os }}-${{ matrix.python-version }} + path: bin/nxcdb + - name: Upload ZipApps + uses: actions/upload-artifact@v3 + with: + name: nxc-${{ matrix.os }}-${{ matrix.python-version }} + path: bin/nxc diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml new file mode 100644 index 00000000..18dd90ab --- /dev/null +++ b/.github/workflows/netexec-build.yml @@ -0,0 +1,39 @@ +name: NetExec Build Binaries + +on: + workflow_dispatch: + +jobs: + build: + name: Building NetExec Binary on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.11"] + #os: [ubuntu-latest, macOS-latest, windows-latest] + #python-version: ["3.8", "3.9", "3.10", "3.11"] + steps: + - uses: actions/checkout@v3 + - name: NetExec set up python on ${{ matrix.os }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Build Native Binary + #if: runner.os == 'windows' + run: | + pip install pyinstaller + pip install . + pyinstaller netexec.spec + - name: Upload Windows Binary + if: runner.os == 'windows' + uses: actions/upload-artifact@v3 + with: + name: nxc.exe + path: dist/nxc.exe + - name: Upload Nix/OSx Binary + if: runner.os != 'windows' + uses: actions/upload-artifact@v3 + with: + name: nxc-${{ matrix.os }}-${{ matrix.python-version }} + path: bin/nxc diff --git a/.github/workflows/netexec.yml b/.github/workflows/netexec.yml deleted file mode 100644 index 798263d5..00000000 --- a/.github/workflows/netexec.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: NetExec Build Binaries - -on: - workflow_dispatch: - -jobs: - build: - name: NetExec Tests on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - python-version: ["3.8", "3.9", "3.10", "3.11"] - steps: - - uses: actions/checkout@v3 - - name: NetExec set up python on ${{ matrix.os }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Build binaries with Shiv - run: | - pip install shiv - python build_collector.py - - name: Build Windows binary - if: runner.os == 'windows' - run: | - pip install pyinstaller - pip install . - pyinstaller netexec.spec - - name: Upload nxc binary - uses: actions/upload-artifact@master - with: - name: nxc-${{ matrix.os }}-${{ matrix.python-version }} - path: bin/nxc - - name: Upload nxcdb binary - uses: actions/upload-artifact@master - with: - name: nxcdb-${{ matrix.os }}-${{ matrix.python-version }} - path: bin/nxcdb - - name: Upload netexec binary (Windows) - if: runner.os == 'windows' - uses: actions/upload-artifact@master - with: - name: netexec-${{ matrix.os }} - path: dist/netexec.exe diff --git a/netexec.spec b/netexec.spec index 2a4f2413..2a2cdb11 100644 --- a/netexec.spec +++ b/netexec.spec @@ -85,7 +85,7 @@ exe = EXE( a.zipfiles, a.datas, [], - name='netexec', + name='nxc', debug=False, bootloader_ignore_signals=False, strip=False, From 62fdbb3456f6fe3408ae584f7894e39765bb7a3c Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 15:17:16 -0400 Subject: [PATCH 11/20] have to add a push initiall for workflow_dispatch --- .github/workflows/netexec-build-zipapp.yml | 1 + .github/workflows/netexec-build.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/netexec-build-zipapp.yml b/.github/workflows/netexec-build-zipapp.yml index 6b774cb9..c6066f24 100644 --- a/.github/workflows/netexec-build-zipapp.yml +++ b/.github/workflows/netexec-build-zipapp.yml @@ -2,6 +2,7 @@ name: NetExec Build ZippApps on: workflow_dispatch: + push: jobs: build: diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 18dd90ab..02aeb489 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -2,6 +2,7 @@ name: NetExec Build Binaries on: workflow_dispatch: + push: jobs: build: From 033961cdbe6586cc329c71665d258ffac14655fd Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 15:31:27 -0400 Subject: [PATCH 12/20] remove the on pull and change to windows to test windows build first --- .github/workflows/netexec-build-zipapp.yml | 3 +-- .github/workflows/netexec-build.yml | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/netexec-build-zipapp.yml b/.github/workflows/netexec-build-zipapp.yml index c6066f24..708f69ad 100644 --- a/.github/workflows/netexec-build-zipapp.yml +++ b/.github/workflows/netexec-build-zipapp.yml @@ -1,8 +1,7 @@ -name: NetExec Build ZippApps +name: Build ZippApps on: workflow_dispatch: - push: jobs: build: diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 02aeb489..1eaa2e7c 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -1,8 +1,7 @@ -name: NetExec Build Binaries +name: Build Binaries on: workflow_dispatch: - push: jobs: build: @@ -10,7 +9,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest] + os: [windows-latest] python-version: ["3.11"] #os: [ubuntu-latest, macOS-latest, windows-latest] #python-version: ["3.8", "3.9", "3.10", "3.11"] From 5434ee9d0172043eac3e5a2134f655853135c0da Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 15:35:12 -0400 Subject: [PATCH 13/20] remove redundant upload --- .github/workflows/netexec-build-zipapp.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/netexec-build-zipapp.yml b/.github/workflows/netexec-build-zipapp.yml index 708f69ad..2201ab41 100644 --- a/.github/workflows/netexec-build-zipapp.yml +++ b/.github/workflows/netexec-build-zipapp.yml @@ -31,8 +31,3 @@ jobs: with: name: nxcdb-zipapp-${{ matrix.os }}-${{ matrix.python-version }} path: bin/nxcdb - - name: Upload ZipApps - uses: actions/upload-artifact@v3 - with: - name: nxc-${{ matrix.os }}-${{ matrix.python-version }} - path: bin/nxc From e39721ae98f43e238f146175357486ef6df8deb5 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 15:35:36 -0400 Subject: [PATCH 14/20] force github push... --- .github/workflows/netexec-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 1eaa2e7c..99cf34ad 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -2,6 +2,7 @@ name: Build Binaries on: workflow_dispatch: + push: jobs: build: From f40ed5bad8f5078ae472b114e28fc6eb136b4805 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 16:01:16 -0400 Subject: [PATCH 15/20] fix tabbing --- netexec.spec | 102 +++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/netexec.spec b/netexec.spec index 2a2cdb11..184be698 100644 --- a/netexec.spec +++ b/netexec.spec @@ -13,57 +13,57 @@ a = Analysis( ('./nxc/modules', 'nxc/modules') ], hiddenimports=[ - 'impacket.examples.secretsdump', - 'impacket.dcerpc.v5.lsat', - 'impacket.dcerpc.v5.transport', - 'impacket.dcerpc.v5.lsad', - 'impacket.dcerpc.v5.gkdi', - 'impacket.dcerpc.v5.rprn', - 'impacket.dpapi_ng', - 'impacket.tds', - 'impacket.version', - 'impacket.ldap.ldap', - 'nxc.connection', - 'nxc.servers.smb', - 'nxc.protocols.smb.wmiexec', - 'nxc.protocols.smb.atexec', - 'nxc.protocols.smb.smbexec', - 'nxc.protocols.smb.mmcexec', - 'nxc.protocols.smb.smbspider', - 'nxc.protocols.smb.passpol', - 'nxc.protocols.mssql.mssqlexec', - 'nxc.helpers.bash', - 'nxc.helpers.bloodhound', - 'nxc.helpers.msada_guids', - 'paramiko', - 'pypsrp.client', - 'pywerview.cli.helpers', - 'pylnk3', - 'pypykatz', - 'masky', - 'msldap', - 'msldap.connection', - 'lsassy', - 'lsassy.dumper', - 'lsassy.parser', - 'lsassy.session', - 'lsassy.impacketfile', - 'dns', - 'dns.name', - 'dns.resolver', - 'dploot', - 'dploot.triage', - 'dploot.triage.rdg', - 'dploot.triage.vaults', - 'dploot.triage.browser', - 'dploot.triage.credentials', - 'dploot.triage.masterkeys', - 'dploot.triage.backupkey', - 'dploot.triage.wifi', - 'dploot.lib.target', - 'dploot.lib.smb', - 'pyasn1_modules.rfc5652', - 'unicrypto.backends.pycryptodomex', + 'impacket.examples.secretsdump', + 'impacket.dcerpc.v5.lsat', + 'impacket.dcerpc.v5.transport', + 'impacket.dcerpc.v5.lsad', + 'impacket.dcerpc.v5.gkdi', + 'impacket.dcerpc.v5.rprn', + 'impacket.dpapi_ng', + 'impacket.tds', + 'impacket.version', + 'impacket.ldap.ldap', + 'nxc.connection', + 'nxc.servers.smb', + 'nxc.protocols.smb.wmiexec', + 'nxc.protocols.smb.atexec', + 'nxc.protocols.smb.smbexec', + 'nxc.protocols.smb.mmcexec', + 'nxc.protocols.smb.smbspider', + 'nxc.protocols.smb.passpol', + 'nxc.protocols.mssql.mssqlexec', + 'nxc.helpers.bash', + 'nxc.helpers.bloodhound', + 'nxc.helpers.msada_guids', + 'paramiko', + 'pypsrp.client', + 'pywerview.cli.helpers', + 'pylnk3', + 'pypykatz', + 'masky', + 'msldap', + 'msldap.connection', + 'lsassy', + 'lsassy.dumper', + 'lsassy.parser', + 'lsassy.session', + 'lsassy.impacketfile', + 'dns', + 'dns.name', + 'dns.resolver', + 'dploot', + 'dploot.triage', + 'dploot.triage.rdg', + 'dploot.triage.vaults', + 'dploot.triage.browser', + 'dploot.triage.credentials', + 'dploot.triage.masterkeys', + 'dploot.triage.backupkey', + 'dploot.triage.wifi', + 'dploot.lib.target', + 'dploot.lib.smb', + 'pyasn1_modules.rfc5652', + 'unicrypto.backends.pycryptodomex', ], hookspath=['./nxc/.hooks'], runtime_hooks=[], From 085dfbff0311d4f5f0d10b0f86ab4f94a6896374 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 17:05:23 -0400 Subject: [PATCH 16/20] test ubuntu build --- .github/workflows/netexec-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 99cf34ad..7159fce7 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [windows-latest] + os: [ubuntu-latest, windows-latest] python-version: ["3.11"] #os: [ubuntu-latest, macOS-latest, windows-latest] #python-version: ["3.8", "3.9", "3.10", "3.11"] @@ -36,5 +36,5 @@ jobs: if: runner.os != 'windows' uses: actions/upload-artifact@v3 with: - name: nxc-${{ matrix.os }}-${{ matrix.python-version }} + name: nxc-${{ matrix.os }} path: bin/nxc From 73910ec29a3d44681c01bca827277a61ed266cd0 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 17:13:29 -0400 Subject: [PATCH 17/20] upload new netexec icon --- nxc/data/nxc.ico | Bin 4224 -> 38111 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/nxc/data/nxc.ico b/nxc/data/nxc.ico index ddaa2288e417159671d13f5d797d379f66cc5a0b..6b840dfc3d3a93c659409842803e2a6b61355239 100644 GIT binary patch literal 38111 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 fwk=-{Aq42#D;8g}_lfyG2Q6@` literal 4224 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 From 2fc141d3da4c44385ff48dbe6a66886b20415316 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 17:13:46 -0400 Subject: [PATCH 18/20] reference actual binary for ubuntu build --- .github/workflows/netexec-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 7159fce7..f4629b26 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -37,4 +37,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: nxc-${{ matrix.os }} - path: bin/nxc + path: dist/nxc From 3053b6d9399a1702043ae590552fcf9a5f5a8fc8 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 17:22:15 -0400 Subject: [PATCH 19/20] remove unnecessary project name from github job build name --- .github/workflows/netexec-build-zipapp.yml | 2 +- .github/workflows/netexec-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/netexec-build-zipapp.yml b/.github/workflows/netexec-build-zipapp.yml index 2201ab41..e65ea743 100644 --- a/.github/workflows/netexec-build-zipapp.yml +++ b/.github/workflows/netexec-build-zipapp.yml @@ -5,7 +5,7 @@ on: jobs: build: - name: Building NetExec Python ZipApp on ${{ matrix.os }} + name: Building Python ZipApp on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index f4629b26..43a8b6ba 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -6,7 +6,7 @@ on: jobs: build: - name: Building NetExec Binary on ${{ matrix.os }} + name: Building Binary on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: From bf91d6dd49e69e8187de37b12727127bc379bc11 Mon Sep 17 00:00:00 2001 From: Marshall Hallenbeck Date: Sat, 30 Sep 2023 17:51:52 -0400 Subject: [PATCH 20/20] add in macOS build target and remove unnecessary comment --- .github/workflows/netexec-build.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/netexec-build.yml b/.github/workflows/netexec-build.yml index 43a8b6ba..0764e99a 100644 --- a/.github/workflows/netexec-build.yml +++ b/.github/workflows/netexec-build.yml @@ -2,7 +2,6 @@ name: Build Binaries on: workflow_dispatch: - push: jobs: build: @@ -10,10 +9,9 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest, macOS-latest, windows-latest] python-version: ["3.11"] - #os: [ubuntu-latest, macOS-latest, windows-latest] - #python-version: ["3.8", "3.9", "3.10", "3.11"] + #python-version: ["3.8", "3.9", "3.10", "3.11"] # for binary builds we only need one version steps: - uses: actions/checkout@v3 - name: NetExec set up python on ${{ matrix.os }} @@ -21,7 +19,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Build Native Binary - #if: runner.os == 'windows' run: | pip install pyinstaller pip install .