mirror of
https://github.com/BC-SECURITY/Empire
synced 2026-06-08 10:26:49 +00:00
Python 3.12 (#716)
* initial install script updates * more cleanup * merge common code * update Dockerfile * update dependencies for python 3.12 * allow 3.12 for deps * pysecretsocks compat * bump minimum py version to 3.10, upgrade deps for 3.12, add 3.12 to supported versions * bump to python 3.12 * upgrade deps * update pr matrix * ignore thread warnings * take out the huge query * take out the huge query in the perf test * typos in compose file * more tweaks * bump time limit on install tests * bump perf test again because py3.12 is slow on the runner for some reason * disable some steps * run ci * remove token * fix geo issue * run py 3.12 tests * uncomment * move symlink to install script. use sudo for mysql setup * fix symlinks * add keyring bypass to kali * setup keyring no matter the os. update nim symlinking * Update CHANGELOG.md * split install tests * org agnostic check * Fix function * remove release token from checkout in python step * remove release token from checkout in python step * fix function * syntax * update run-all-tests script * change var name * add some echos * split CI * updates * remove token * wrong path * re-enable token * disable parrot for now * install starkiller in the docker build. check or it in cst. update forked dep references * update changelog with warning
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
# Git
|
||||
**.git
|
||||
.gitignore
|
||||
.github
|
||||
|
||||
# CI
|
||||
.codeclimate.yml
|
||||
|
||||
@@ -1,10 +1,59 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
- name: "poetry python"
|
||||
command: "poetry"
|
||||
args: ["run", "which", "python3"]
|
||||
expectedOutput: ["/usr/local/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.11.*"]
|
||||
expectedOutput: ["Python 3.12.*"]
|
||||
- name: "poetry"
|
||||
command: "which"
|
||||
args: ["poetry"]
|
||||
expectedOutput: ["/usr/bin/poetry"]
|
||||
- name: "poetry version"
|
||||
command: "poetry"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Poetry (version 1.6*)*"]
|
||||
- name: "poetry python version"
|
||||
command: "poetry"
|
||||
args: ["run", "python3", "--version"]
|
||||
expectedOutput: ["Python 3.12.*"]
|
||||
- name: "dotnet which"
|
||||
command: "which"
|
||||
args: ["dotnet"]
|
||||
expectedOutput: ["/usr/bin/dotnet"]
|
||||
- name: "dotnet version"
|
||||
command: "dotnet"
|
||||
args: [ "--version" ]
|
||||
expectedOutput: ["6.0.*"]
|
||||
- name: "powershell which"
|
||||
command: "which"
|
||||
args: ["pwsh"]
|
||||
expectedOutput: ["/usr/bin/pwsh"]
|
||||
- name: "powershell version"
|
||||
command: "pwsh"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["PowerShell 7.*"]
|
||||
- name: "ps-empire help"
|
||||
command: "./ps-empire"
|
||||
args: ["server", "--help"]
|
||||
expectedOutput: ["usage: empire.py server [-h]*"]
|
||||
- name: "ps-empire version"
|
||||
command: "./ps-empire"
|
||||
args: ["server", "--version"]
|
||||
expectedOutput: ["5.* BC Security Fork"]
|
||||
fileExistenceTests:
|
||||
- name: 'profiles'
|
||||
path: '/empire/empire/server/data/profiles/'
|
||||
shouldExist: true
|
||||
- name: 'invoke obfuscation'
|
||||
path: '/usr/local/share/powershell/Modules/Invoke-Obfuscation/'
|
||||
shouldExist: true
|
||||
- name: 'sharpire'
|
||||
path: '/empire/empire/server/csharp/Covenant/Data/ReferenceSourceLibraries/Sharpire'
|
||||
shouldExist: true
|
||||
- name: 'starkiller'
|
||||
path: '/empire/empire/server/api/v2/starkiller/index.html'
|
||||
shouldExist: true
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
FROM debian:buster
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
# No to all extras except yes to "Python 3.8"
|
||||
RUN echo 'n\nn\nn\ny\n' | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM debian:bullseye
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes n | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -0,0 +1,18 @@
|
||||
ARG BASE_IMAGE
|
||||
FROM $BASE_IMAGE
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
RUN apt-get update && apt-get -y install sudo
|
||||
|
||||
# Add a non-root user
|
||||
RUN echo 'empire ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
|
||||
RUN useradd -m empire
|
||||
RUN chown -R empire:empire /empire
|
||||
USER empire
|
||||
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM kalilinux/kali-rolling:latest
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes n | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM parrotsec/core:latest
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes n | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM ubuntu:20.04
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes n | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM ubuntu:22.04
|
||||
WORKDIR /empire
|
||||
COPY . /empire
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN yes n | /empire/setup/install.sh
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
RUN yes | ./ps-empire server --reset
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
@@ -0,0 +1,8 @@
|
||||
schemaVersion: 2.0.0
|
||||
containerRunOptions:
|
||||
user: "empire"
|
||||
commandTests:
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3.8 which"
|
||||
command: "which"
|
||||
args: ["python3.8"]
|
||||
expectedOutput: ["/usr/local/bin/python3"]
|
||||
- name: "python3.8 version"
|
||||
command: "python3.8"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.8.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
expectedOutput: ["/usr/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.9.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -1,5 +1,32 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
# pyenv
|
||||
- name: "pyenv"
|
||||
command: "which"
|
||||
args: ["pyenv"]
|
||||
expectedOutput: ["/usr/bin/pyenv"]
|
||||
- name: "pyenv version"
|
||||
command: "pyenv"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["pyenv 2.3.*"]
|
||||
# poetry
|
||||
- name: "poetry python"
|
||||
command: "poetry"
|
||||
args: ["run", "which", "python3"]
|
||||
expectedOutput: ["/empire/.venv/bin/python3"]
|
||||
- name: "poetry"
|
||||
command: "which"
|
||||
args: ["poetry"]
|
||||
expectedOutput: ["/usr/bin/poetry"]
|
||||
- name: "poetry version"
|
||||
command: "poetry"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Poetry (version 1.6*)*"]
|
||||
- name: "poetry python version"
|
||||
command: "poetry"
|
||||
args: ["run", "python3", "--version"]
|
||||
expectedOutput: ["Python 3.12.*"]
|
||||
# dotnet
|
||||
- name: "dotnet which"
|
||||
command: "which"
|
||||
args: ["dotnet"]
|
||||
@@ -8,6 +35,7 @@ commandTests:
|
||||
command: "dotnet"
|
||||
args: [ "--version" ]
|
||||
expectedOutput: ["6.0.*"]
|
||||
# powershell
|
||||
- name: "powershell which"
|
||||
command: "which"
|
||||
args: ["pwsh"]
|
||||
@@ -16,6 +44,21 @@ commandTests:
|
||||
command: "pwsh"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["PowerShell 7.*"]
|
||||
# mysql
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
# nim
|
||||
- name: "nim which"
|
||||
command: "which"
|
||||
args: ["nim"]
|
||||
expectedOutput: ["/usr/bin/nim"]
|
||||
- name: "nim version"
|
||||
command: "nim"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Nim Compiler Version 1.6.*"]
|
||||
# run
|
||||
- name: "ps-empire help"
|
||||
command: "./ps-empire"
|
||||
args: ["server", "--help"]
|
||||
@@ -34,4 +77,3 @@ fileExistenceTests:
|
||||
- name: 'sharpire'
|
||||
path: '/empire/empire/server/csharp/Covenant/Data/ReferenceSourceLibraries/Sharpire'
|
||||
shouldExist: true
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
schemaVersion: 2.0.0
|
||||
containerRunOptions:
|
||||
user: "empire"
|
||||
commandTests:
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
expectedOutput: ["/usr/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.11.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -0,0 +1,8 @@
|
||||
schemaVersion: 2.0.0
|
||||
containerRunOptions:
|
||||
user: "empire"
|
||||
commandTests:
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
expectedOutput: ["/usr/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.9.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 15.*10.*-MariaDB"]
|
||||
@@ -0,0 +1,8 @@
|
||||
schemaVersion: 2.0.0
|
||||
containerRunOptions:
|
||||
user: "empire"
|
||||
commandTests:
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 8.0.*"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
expectedOutput: ["/usr/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.8.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 8.0.*"]
|
||||
@@ -1,18 +0,0 @@
|
||||
schemaVersion: 2.0.0
|
||||
commandTests:
|
||||
- name: "python3 which"
|
||||
command: "which"
|
||||
args: ["python3"]
|
||||
expectedOutput: ["/usr/bin/python3"]
|
||||
- name: "python3 version"
|
||||
command: "python3"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["Python 3.10.*"]
|
||||
- name: "mysql which"
|
||||
command: "which"
|
||||
args: ["mysql"]
|
||||
expectedOutput: ["/usr/bin/mysql"]
|
||||
- name: "mysql version"
|
||||
command: "mysql"
|
||||
args: ["--version"]
|
||||
expectedOutput: ["mysql Ver 8.0.*"]
|
||||
@@ -1,40 +1,65 @@
|
||||
# This is for testing the install script for the supported OS.
|
||||
version: '3'
|
||||
|
||||
x-common-build: &common-build
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/InstallTest.Dockerfile
|
||||
|
||||
x-common-platform: &common-platform
|
||||
platform: "linux/amd64"
|
||||
|
||||
services:
|
||||
ubuntu2004:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/Ubuntu2004.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: ubuntu:20.04
|
||||
image: bcsecurity/empire-test-ubuntu2004
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
ubuntu2204:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/Ubuntu2204.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: ubuntu:22.04
|
||||
image: bcsecurity/empire-test-ubuntu2204
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
debian10:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/Debian10.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: debian:buster
|
||||
image: bcsecurity/empire-test-debian10
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
debian11:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/Debian11.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: debian:bullseye
|
||||
image: bcsecurity/empire-test-debian11
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
debian12:
|
||||
build:
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: debian:bookworm
|
||||
image: bcsecurity/empire-test-debian12
|
||||
<<: *common-platform
|
||||
|
||||
kalirolling:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/KaliRolling.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: kalilinux/kali-rolling
|
||||
image: bcsecurity/empire-test-kalirolling
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
parrotrolling:
|
||||
build:
|
||||
context: ../../
|
||||
dockerfile: .github/install_tests/ParrotRolling.Dockerfile
|
||||
<<: *common-build
|
||||
args:
|
||||
BASE_IMAGE: parrotsec/core
|
||||
image: bcsecurity/empire-test-parrotrolling
|
||||
platform: "linux/amd64"
|
||||
<<: *common-platform
|
||||
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# The script is run like `./run-all-cst.sh debian12 debian11 debian10` to test multiple images
|
||||
# or `./run-all-cst.sh debian12` to test a single image
|
||||
# or `./run-all-cst.sh` to test all images
|
||||
|
||||
all_images=(debian12 debian11 debian10 ubuntu2004 ubuntu2204 kalirolling parrotrolling)
|
||||
|
||||
for image in "${@:-${all_images[@]}}"
|
||||
do
|
||||
yaml=""
|
||||
# For debian trim the numbers off the end
|
||||
if [[ $image == debian* ]]; then
|
||||
yaml=debian
|
||||
fi
|
||||
# For ubuntu trim the numbers off the end
|
||||
if [[ $image == ubuntu* ]]; then
|
||||
yaml=ubuntu
|
||||
fi
|
||||
# For kali and parrot trim "rolling" off the end
|
||||
if [[ $image == kali* || $image == parrot* ]]; then
|
||||
yaml=${image%rolling}
|
||||
fi
|
||||
|
||||
echo "Testing $image with $yaml.yaml"
|
||||
container-structure-test test -i docker.io/bcsecurity/empire-test-$image -c .github/install_tests/cst-config-install-base.yaml
|
||||
container-structure-test test -i docker.io/bcsecurity/empire-test-$image -c .github/install_tests/cst-config-$yaml.yaml
|
||||
done
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: psf/black@23.9.1
|
||||
- uses: psf/black@23.10.0
|
||||
- name: Run ruff
|
||||
run: |
|
||||
pip install ruff==0.0.283
|
||||
@@ -23,11 +23,11 @@ jobs:
|
||||
- id: release
|
||||
if: ${{ startsWith(github.head_ref, 'release/') || contains( github.event.pull_request.labels.*.name, 'run-all-versions') }}
|
||||
run: |
|
||||
echo "config={\"python-version\": [\"3.8\", \"3.9\", \"3.10\", \"3.11\"]}" >> $GITHUB_OUTPUT
|
||||
echo "config={\"python-version\": [\"3.10\", \"3.11\", \"3.12\"]}" >> $GITHUB_OUTPUT
|
||||
- id: not-release
|
||||
if: ${{ !startsWith(github.head_ref, 'release/') }}
|
||||
run: |
|
||||
echo "config={\"python-version\": [\"3.8\", \"3.11\"]}" >> $GITHUB_OUTPUT
|
||||
echo "config={\"python-version\": [\"3.10\", \"3.12\"]}" >> $GITHUB_OUTPUT
|
||||
outputs:
|
||||
config: ${{ steps.release.outputs.config || steps.not-release.outputs.config }}
|
||||
test:
|
||||
@@ -41,13 +41,13 @@ jobs:
|
||||
matrix: ${{ fromJson(needs.matrix-prep-config.outputs.config) }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
if: ${{ github.repository == 'BC-SECURITY/Empire' }}
|
||||
if: ${{ endsWith(github.repository, 'Empire') }}
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
# token is only needed in sponsors repo because of private submodules
|
||||
# don't use token in public repo because prs from forks cannot access secrets
|
||||
- uses: actions/checkout@v3
|
||||
if: ${{ github.repository == 'BC-SECURITY/Empire-Sponsors' }}
|
||||
if: ${{ endsWith(github.repository, 'Empire-Sponsors') }}
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
@@ -73,18 +73,18 @@ jobs:
|
||||
poetry install
|
||||
- name: Run test suite - mysql
|
||||
run: |
|
||||
set -o pipefail
|
||||
if [ "${{ matrix.python-version }}" = "3.11" ]; then
|
||||
DATABASE_USE=mysql poetry run pytest -v --runslow --cov=empire/server --junitxml=pytest.xml --cov-report=term-missing:skip-covered . | tee pytest-coverage.txt
|
||||
else
|
||||
DATABASE_USE=mysql poetry run pytest -v --runslow .
|
||||
fi
|
||||
set -o pipefail
|
||||
if [ "${{ matrix.python-version }}" = "3.12" ]; then
|
||||
DATABASE_USE=mysql poetry run pytest -v --runslow --cov=empire/server --junitxml=pytest.xml --cov-report=term-missing:skip-covered . | tee pytest-coverage.txt
|
||||
else
|
||||
DATABASE_USE=mysql poetry run pytest -v --runslow .
|
||||
fi
|
||||
- name: Run test suite - sqlite
|
||||
if: ${{ startsWith(github.head_ref, 'release/') || contains(github.event.pull_request.labels.*.name, 'test-sqlite') }}
|
||||
run: |
|
||||
DATABASE_USE=sqlite poetry run pytest . -v --runslow
|
||||
- name: Pytest coverage comment
|
||||
if: ${{ matrix.python-version == '3.11' }}
|
||||
if: ${{ matrix.python-version == '3.12' }}
|
||||
uses: MishaKav/pytest-coverage-comment@v1.1.48
|
||||
with:
|
||||
pytest-coverage-path: ./pytest-coverage.txt
|
||||
@@ -104,103 +104,45 @@ jobs:
|
||||
run: docker-compose -f .github/docker-compose.yml build
|
||||
- name: Run tests on docker image
|
||||
run: docker-compose -f .github/docker-compose.yml run test
|
||||
- name: run structure tests base
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: bcsecurity/empire-test:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests docker
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
uses: plexsystems/container-structure-test-action@v0.3.0
|
||||
with:
|
||||
image: bcsecurity/empire-test:latest
|
||||
config: .github/cst-config-docker.yaml
|
||||
test_install_script:
|
||||
needs: test
|
||||
timeout-minutes: 45
|
||||
timeout-minutes: 30
|
||||
runs-on: ubuntu-latest
|
||||
name: Test Install Script
|
||||
strategy:
|
||||
matrix:
|
||||
# Because the box runs out of disk space, we can't run all tests on a single docker compose build.
|
||||
images:
|
||||
- ['debian10', 'debian11', 'debian12']
|
||||
- ['ubuntu2004', 'ubuntu2204']
|
||||
- ['kalirolling'] # 'parrotrolling'
|
||||
# Parrot disabled for now because the apt repo is having some slowness issues.
|
||||
# Install is running up way too many minutes.
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
depth: 0
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
# To save CI time, only run these tests when the install script or deps changed
|
||||
- name: Get changed files using defaults
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v29.0.2
|
||||
- name: Build images
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
run: docker-compose -f .github/install_tests/docker-compose-install-tests.yml build --parallel
|
||||
- name: run structure tests base Ubuntu 20.04
|
||||
run: docker compose -f .github/install_tests/docker-compose-install-tests.yml build --parallel ${{ join(matrix.images, ' ') }}
|
||||
- name: run install tests
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-ubuntu2004:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Ubuntu 20.04
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-ubuntu2004:latest
|
||||
config: .github/install_tests/cst-config-ubuntu2004.yaml
|
||||
- name: run structure tests base Ubuntu 22.04
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-ubuntu2204:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Ubuntu 22.04
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-ubuntu2204:latest
|
||||
config: .github/install_tests/cst-config-ubuntu2204.yaml
|
||||
- name: run structure tests base Debian 10
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-debian10:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Debian 10
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-debian10:latest
|
||||
config: .github/install_tests/cst-config-debian10.yaml
|
||||
- name: run structure tests base Debian 11
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-debian11:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Debian 11
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-debian11:latest
|
||||
config: .github/install_tests/cst-config-debian11.yaml
|
||||
- name: run structure tests Kali base
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-kalirolling:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Kali
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-kalirolling:latest
|
||||
config: .github/install_tests/cst-config-kalirolling.yaml
|
||||
- name: run structure tests Parrot base
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-parrotrolling:latest
|
||||
config: .github/cst-config-base.yaml
|
||||
- name: run structure tests Parrot
|
||||
if: contains(steps.changed-files.outputs.modified_files, 'setup/install.sh') || contains(steps.changed-files.outputs.modified_files, 'poetry.lock')
|
||||
uses: plexsystems/container-structure-test-action@v0.1.0
|
||||
with:
|
||||
image: docker.io/bcsecurity/empire-test-parrotrolling:latest
|
||||
config: .github/install_tests/cst-config-parrotrolling.yaml
|
||||
# Using a script instead of prepackaged action because composite actions can't uses
|
||||
# a matrix and this is way simpler to read.
|
||||
run: |
|
||||
curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 && \
|
||||
chmod +x container-structure-test-linux-amd64 && \
|
||||
mkdir -p $HOME/bin && \
|
||||
export PATH=$PATH:$HOME/bin && \
|
||||
mv container-structure-test-linux-amd64 $HOME/bin/container-structure-test
|
||||
./.github/install_tests/run-all-cst.sh ${{ join(matrix.images, ' ') }}
|
||||
|
||||
@@ -15,7 +15,7 @@ repos:
|
||||
args: [--fix, --exit-non-zero-on-fix]
|
||||
|
||||
- repo: https://github.com/psf/black-pre-commit-mirror
|
||||
rev: 23.9.1
|
||||
rev: 23.10.0
|
||||
hooks:
|
||||
- id: black
|
||||
language_version: python3.9
|
||||
language_version: python3.10
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
3.12
|
||||
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
- Warning: You may run into errors installing things such as nim if you are running the install script on a machine that previously ran it. This is due to permissions changes with the install script. In this case it is recommended to use a fresh machine or manually remove the offending directories/files.
|
||||
- Update install script (@Vinnybod)
|
||||
- Use pyenv to install Python
|
||||
- Use the official Poetry installer
|
||||
- Don't run the entire script as root
|
||||
- Rewrite the test containers and reuse a templated Dockerfile
|
||||
- Add Debian12 support
|
||||
- Bump all OS to use Python 3.12
|
||||
- Refactor the script to be a bit more readable
|
||||
- Condense the test_install_script job
|
||||
- Update Dockerfile (@Vinnybod)
|
||||
- Use the official Poetry installer
|
||||
- Fix Starkiller trying to auto-update inside the container
|
||||
- Pre-install Starkiller as part of the docker build
|
||||
- Use Python 3.12
|
||||
- Dependency changes (@Vinnybod)
|
||||
- Use BC-Security fork of md2pdf until upstream can support Python 3.12
|
||||
- Use a patched version of pysecretsocks that packages asyncore for Python 3.12 support
|
||||
- Use docopt-ng for Python 3.12 support
|
||||
- Add packaging as a runtime dependency
|
||||
- Drop support for Python 3.8 and 3.9
|
||||
- Correct more deprecation warnings for SQLAlchemy and invalid escape sequences (@Vinnybod)
|
||||
- Added option to start MySQL service on boot to install script (@Cx01N)
|
||||
- Modernized the Python and IronPython agents with new agent and staging code (@Cx01N)
|
||||
|
||||
+12
-18
@@ -7,25 +7,16 @@
|
||||
# 2) create volume storage: `docker create -v /empire --name data bcsecurity/empire`
|
||||
# 3) run out container: `docker run -it --volumes-from data bcsecurity/empire /bin/bash`
|
||||
|
||||
# -----RELEASE COMMANDS----
|
||||
# Handled by GitHub Actions
|
||||
FROM python:3.12.0-bullseye
|
||||
|
||||
# -----BUILD ENTRY-----
|
||||
|
||||
# image base
|
||||
FROM python:3.11.4-bullseye
|
||||
|
||||
# extra metadata
|
||||
LABEL maintainer="bc-security"
|
||||
LABEL description="Dockerfile for Empire server and client. https://bc-security.gitbook.io/empire-wiki/quickstart/installation#docker"
|
||||
|
||||
# env setup
|
||||
ENV STAGING_KEY=RANDOM DEBIAN_FRONTEND=noninteractive DOTNET_CLI_TELEMETRY_OPTOUT=1
|
||||
|
||||
# set the def shell for ENV
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
RUN wget -q https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb && \
|
||||
RUN wget -q https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb && \
|
||||
dpkg -i packages-microsoft-prod.deb && \
|
||||
apt-get update && \
|
||||
apt-get install -qq \
|
||||
@@ -34,30 +25,33 @@ RUN wget -q https://packages.microsoft.com/config/debian/10/packages-microsoft-p
|
||||
dotnet-sdk-6.0 \
|
||||
libicu-dev \
|
||||
powershell \
|
||||
python3-dev \
|
||||
python3-pip \
|
||||
sudo \
|
||||
xclip \
|
||||
zip \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN curl -sSL https://install.python-poetry.org | python3 -
|
||||
RUN ln -s /root/.local/bin/poetry /usr/bin
|
||||
|
||||
WORKDIR /empire
|
||||
|
||||
COPY pyproject.toml poetry.lock /empire/
|
||||
|
||||
RUN pip install poetry \
|
||||
--disable-pip-version-check && \
|
||||
poetry config virtualenvs.create false && \
|
||||
RUN poetry config virtualenvs.create false && \
|
||||
poetry install --no-root
|
||||
|
||||
COPY . /empire
|
||||
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
|
||||
RUN mkdir -p /usr/local/share/powershell/Modules && \
|
||||
cp -r ./empire/server/data/Invoke-Obfuscation /usr/local/share/powershell/Modules
|
||||
|
||||
RUN rm -rf /empire/empire/server/data/empire*
|
||||
|
||||
RUN sed -i 's/use: mysql/use: sqlite/g' empire/server/config.yaml
|
||||
RUN sed -i 's/auto_update: true/auto_update: false/g' empire/server/config.yaml
|
||||
|
||||
RUN ./ps-empire sync-starkiller
|
||||
|
||||
ENTRYPOINT ["./ps-empire"]
|
||||
CMD ["server"]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<div align="center">
|
||||
|
||||

|
||||
|
||||

|
||||
[](https://github.com/sponsors/BC-SECURITY)
|
||||
[](https://bc-security.gitbook.io/empire-wiki/)
|
||||
[](https://discord.gg/P8PZPyf)
|
||||
@@ -34,7 +34,7 @@ Empire is a post-exploitation and adversary emulation framework that is used to
|
||||
- JA3/S and JARM Evasion
|
||||
- MITRE ATT&CK Integration
|
||||
- Integrated Roslyn compiler (Thanks to [Covenant](https://github.com/cobbr/Covenant))
|
||||
- Docker, Kali, ParrotOS, Ubuntu 20.04/22.04, and Debian 10/11 Install Support
|
||||
- Docker, Kali, ParrotOS, Ubuntu 20.04/22.04, and Debian 10/11/12 Install Support
|
||||
|
||||
### Agents
|
||||
- PowerShell
|
||||
|
||||
@@ -6,10 +6,10 @@ The following operating systems have been tested for Empire compatibility. We wi
|
||||
|
||||
* Kali Linux Rolling
|
||||
* Ubuntu 20.04 / 22.04
|
||||
* Debian 10 / 11
|
||||
* Debian 10 / 11 / 12
|
||||
* ParrotOS
|
||||
|
||||
As of Empire 4.0, Python 3.8 is the minimum Python version required.
|
||||
As of Empire 5.8, Python 3.10 is the minimum Python version required.
|
||||
|
||||
## Github
|
||||
|
||||
@@ -19,7 +19,7 @@ Note: The `main` branch is a reflection of the latest changes and may not always
|
||||
git clone --recursive https://github.com/BC-SECURITY/Empire.git
|
||||
cd Empire
|
||||
./setup/checkout-latest-tag.sh
|
||||
sudo ./setup/install.sh
|
||||
./setup/install.sh
|
||||
```
|
||||
|
||||
**Sponsors:**
|
||||
@@ -28,7 +28,7 @@ sudo ./setup/install.sh
|
||||
git clone --recursive https://github.com/BC-SECURITY/Empire-Sponsors.git
|
||||
cd Empire-Sponsors
|
||||
./setup/checkout-latest-tag.sh sponsors
|
||||
sudo ./setup/install.sh
|
||||
./setup/install.sh
|
||||
```
|
||||
|
||||
If you are using the sponsors version of Empire, it will pull the sponsors version of Starkiller.
|
||||
@@ -83,4 +83,4 @@ All image versions can be found at: [https://hub.docker.com/r/bcsecurity/empire/
|
||||
|
||||
## Community-Supported Operating Systems
|
||||
|
||||
At this time, we are choosing to only support Kali, Debian 10, and Ubuntu 20.04 installations, however, we will accept pull requests that fix issues or provide installation scripts specific to other operating systems to this wiki.
|
||||
At this time, we are choosing to only support Kali, ParrotOS, Debian 10/11/12, and Ubuntu 20.04/22.04 installations, however, we will accept pull requests that fix issues or provide installation scripts specific to other operating systems to this wiki.
|
||||
|
||||
@@ -93,8 +93,6 @@ def client():
|
||||
|
||||
yield TestClient(v2App)
|
||||
|
||||
print("cleanup")
|
||||
|
||||
from empire.server.server import main
|
||||
|
||||
main.shutdown()
|
||||
|
||||
@@ -115,11 +115,10 @@ def test_database_performance_checkins(models, host, agents, session_local):
|
||||
assert t() < 1
|
||||
|
||||
with timer() as t:
|
||||
query = db.query(models.AgentCheckIn).limit(100000)
|
||||
query = db.query(models.AgentCheckIn).limit(50000)
|
||||
query.all()
|
||||
log.info(f"Time to query {checkins} checkins: {t():0.4f} seconds")
|
||||
# Changed from 4 to 5 in 2023/07
|
||||
assert t() < 5
|
||||
assert t() < 6
|
||||
|
||||
agents = db.query(models.Agent).all()
|
||||
|
||||
@@ -190,7 +189,7 @@ def test_get_agent_checkins_multiple_agents(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.slow
|
||||
# @pytest.mark.slow
|
||||
def test_agent_checkins_aggregate(
|
||||
client, admin_auth_header, session_local, models, agents, empire_config
|
||||
):
|
||||
@@ -205,7 +204,7 @@ def test_agent_checkins_aggregate(
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.elapsed.total_seconds() < 2
|
||||
assert response.elapsed.total_seconds() < 5
|
||||
assert response.json()["bucket_size"] == "day"
|
||||
assert response.json()["records"][1]["count"] == 17280 * 3
|
||||
|
||||
@@ -216,7 +215,7 @@ def test_agent_checkins_aggregate(
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.elapsed.total_seconds() < 2
|
||||
assert response.elapsed.total_seconds() < 5
|
||||
assert response.json()["bucket_size"] == "hour"
|
||||
assert response.json()["records"][1]["count"] == 720 * 3
|
||||
|
||||
@@ -227,20 +226,22 @@ def test_agent_checkins_aggregate(
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.elapsed.total_seconds() < 2
|
||||
assert response.elapsed.total_seconds() < 5
|
||||
assert response.json()["bucket_size"] == "minute"
|
||||
assert response.json()["records"][1]["count"] == 12 * 3
|
||||
|
||||
response = client.get(
|
||||
"/api/v2/agents/checkins/aggregate",
|
||||
headers=admin_auth_header,
|
||||
params={"bucket_size": "second"},
|
||||
params={
|
||||
"bucket_size": "second",
|
||||
"start_date": start_time,
|
||||
"end_date": start_time + timedelta(hours=2),
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
# On an m1 macbook this is <1s, but in CI it's ~11s. ymmv
|
||||
# Changed from 15 to 17 in 2023/07
|
||||
assert response.elapsed.total_seconds() < 17
|
||||
assert response.elapsed.total_seconds() < 5
|
||||
assert response.json()["bucket_size"] == "second"
|
||||
assert response.json()["records"][1]["count"] == 1 * 3
|
||||
|
||||
|
||||
@@ -441,10 +441,10 @@ def test_bat_stager_creation(client, bat_stager, admin_auth_header):
|
||||
|
||||
# Check if the file is downloaded successfully
|
||||
assert response.status_code == 200
|
||||
assert (
|
||||
response.headers.get("content-type").split(";")[0]
|
||||
== "application/x-msdos-program"
|
||||
)
|
||||
assert response.headers.get("content-type").split(";")[0] in [
|
||||
"application/x-msdownload",
|
||||
"application/x-msdos-program",
|
||||
]
|
||||
assert isinstance(response.content, bytes)
|
||||
|
||||
# Check if the downloaded file is not empty
|
||||
|
||||
Generated
+966
-941
File diff suppressed because it is too large
Load Diff
+20
-19
@@ -13,32 +13,31 @@ packages = [
|
||||
]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.8,<3.12"
|
||||
urllib3 = "^2.0.3"
|
||||
python = ">=3.10,<3.13"
|
||||
urllib3 = "^2.0.7"
|
||||
requests = "^2.31.0"
|
||||
iptools = "^0.7.0"
|
||||
macholib = "^1.16.2"
|
||||
macholib = "^1.16.3"
|
||||
dropbox = "^11.36.2"
|
||||
pyOpenSSL = "^23.2.0"
|
||||
zlib_wrapper = "^0.1.3"
|
||||
netifaces = "^0.11.0"
|
||||
jinja2 = "^3.1.2"
|
||||
xlutils = "^2.0.0"
|
||||
pyparsing = "^3.1.0"
|
||||
pyparsing = "^3.1.1"
|
||||
PyMySQL = "^1.1.0"
|
||||
SQLAlchemy = "^2.0.18"
|
||||
SQLAlchemy = "^2.0.22"
|
||||
PyYAML = "^6.0.1"
|
||||
SQLAlchemy-Utc = "^0.14.0"
|
||||
prompt-toolkit = "^3.0.39"
|
||||
terminaltables = "^3.1.10"
|
||||
docopt = "^0.6.2"
|
||||
humanize = "^4.7.0"
|
||||
pycryptodome = "^3.18.0"
|
||||
cryptography = "^41.0.1"
|
||||
humanize = "^4.8.0"
|
||||
pycryptodome = "^3.19.0"
|
||||
cryptography = "^41.0.4"
|
||||
fastapi = "^0.99.1"
|
||||
uvicorn = "^0.22.0"
|
||||
jq = "^1.4.1"
|
||||
aiofiles = "^23.1.0"
|
||||
jq = "^1.6.0"
|
||||
aiofiles = "^23.2.1"
|
||||
python-multipart = "^0.0.6"
|
||||
python-jose = {version = "^3.3.0", extras = ["cryptography"]}
|
||||
passlib = {version = "^1.7.4", extras = ["bcrypt"]}
|
||||
@@ -46,22 +45,24 @@ websockify = "^0.10.0"
|
||||
websockets = "^11.0.3"
|
||||
pyperclip = "^1.8.2"
|
||||
pyvnc = {git = "https://github.com/BC-SECURITY/pyVNC.git"}
|
||||
python-socketio = {extras = ["client"], version = "^5.8.0"}
|
||||
Flask = "^2.3.2"
|
||||
pysecretsocks = {git = "https://github.com/BC-SECURITY/PySecretSOCKS.git"}
|
||||
python-socketio = {extras = ["client"], version = "^5.10.0"}
|
||||
Flask = "^2.3.3"
|
||||
pysecretsocks = {git = "https://github.com/BC-SECURITY/PySecretSOCKS.git", rev = "da5be0e"}
|
||||
donut-shellcode = "^1.0.2"
|
||||
python-obfuscator = "^0.0.2"
|
||||
pyinstaller = "^5.13.0"
|
||||
md2pdf = "^1.0.1"
|
||||
pyinstaller = "^5.13.2"
|
||||
md2pdf = {git = "https://github.com/bc-security/md2pdf", rev = "48d5a46"}
|
||||
tabulate = "^0.9.0"
|
||||
stix2 = "^3.0.1"
|
||||
docopt-ng = "^0.9.0"
|
||||
packaging = "^23.2"
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
httpx = "^0.24.1" # For starlette TestClient
|
||||
black = "^23.7.0"
|
||||
pytest = "^7.4.0"
|
||||
pytest-timeout = "^2.1.0"
|
||||
black = "^23.10.0"
|
||||
pytest = "^7.4.2"
|
||||
pytest-timeout = "^2.2.0"
|
||||
ruff = "^0.0.283"
|
||||
pytest-cov = "^4.1.0"
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
[pytest]
|
||||
log_cli = false
|
||||
log_cli_level = INFO
|
||||
# Should figure out a better way to do this, but for now filters out all the
|
||||
# warnings from the threads exiting.
|
||||
filterwarnings =
|
||||
ignore::pytest.PytestUnhandledThreadExceptionWarning
|
||||
|
||||
+144
-121
@@ -26,7 +26,12 @@ function command_exists() {
|
||||
function install_powershell() {
|
||||
echo -e "\x1b[1;34m[*] Installing PowerShell\x1b[0m"
|
||||
if [ "$OS_NAME" == "DEBIAN" ]; then
|
||||
wget https://packages.microsoft.com/config/debian/"${VERSION_ID}"/packages-microsoft-prod.deb
|
||||
# TODO Temporary until official Debian 12 support is added
|
||||
VERSION_ID_2=$VERSION_ID
|
||||
if [ "$VERSION_ID" == "12" ]; then
|
||||
VERSION_ID_2="11"
|
||||
fi
|
||||
wget https://packages.microsoft.com/config/debian/"${VERSION_ID_2}"/packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
rm packages-microsoft-prod.deb
|
||||
sudo apt-get update
|
||||
@@ -40,13 +45,13 @@ function install_powershell() {
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y powershell
|
||||
elif [ "$OS_NAME" == "KALI" ]; then
|
||||
apt update && apt -y install powershell
|
||||
sudo apt-get update && sudo apt-get -y install powershell
|
||||
elif [ $OS_NAME == "PARROT" ]; then
|
||||
apt update && apt -y install powershell
|
||||
sudo apt-get update && sudo apt-get -y install powershell
|
||||
fi
|
||||
|
||||
mkdir -p /usr/local/share/powershell/Modules
|
||||
cp -r "$PARENT_PATH"/empire/server/data/Invoke-Obfuscation /usr/local/share/powershell/Modules
|
||||
sudo mkdir -p /usr/local/share/powershell/Modules
|
||||
sudo cp -r "$PARENT_PATH"/empire/server/data/Invoke-Obfuscation /usr/local/share/powershell/Modules
|
||||
rm -f packages-microsoft-prod.deb*
|
||||
}
|
||||
|
||||
@@ -58,10 +63,10 @@ function install_mysql() {
|
||||
echo mysql-community-server mysql-server/default-auth-override select "Use Strong Password Encryption (RECOMMENDED)" | sudo debconf-set-selections
|
||||
|
||||
if [ "$OS_NAME" == "UBUNTU" ]; then
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server
|
||||
elif [[ "$OS_NAME" == "KALI" || "$OS_NAME" == "PARROT" || "$OS_NAME" == "DEBIAN" ]]; then
|
||||
sudo apt update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt install -y default-mysql-server # mariadb
|
||||
sudo apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y default-mysql-server # mariadb
|
||||
fi
|
||||
|
||||
echo -e "\x1b[1;34m[*] Starting MySQL\x1b[0m"
|
||||
@@ -72,15 +77,15 @@ function start_mysql() {
|
||||
sudo systemctl start mysql.service || true # will fail in a docker image
|
||||
|
||||
# Add the default empire user to the mysql database
|
||||
mysql -u root -e "CREATE USER IF NOT EXISTS 'empire_user'@'localhost' IDENTIFIED BY 'empire_password';" || true
|
||||
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'empire_user'@'localhost' WITH GRANT OPTION;" || true
|
||||
mysql -u root -e "FLUSH PRIVILEGES;" || true
|
||||
sudo mysql -u root -e "CREATE USER IF NOT EXISTS 'empire_user'@'localhost' IDENTIFIED BY 'empire_password';" || true
|
||||
sudo mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'empire_user'@'localhost' WITH GRANT OPTION;" || true
|
||||
sudo mysql -u root -e "FLUSH PRIVILEGES;" || true
|
||||
|
||||
# Some OS have a root password set by default. We could probably
|
||||
# be more smart about this, but we just try both.
|
||||
mysql -u root -proot -e "CREATE USER IF NOT EXISTS 'empire_user'@'localhost' IDENTIFIED BY 'empire_password';" || true
|
||||
mysql -u root -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'empire_user'@'localhost' WITH GRANT OPTION;" || true
|
||||
mysql -u root -proot -e "FLUSH PRIVILEGES;" || true
|
||||
sudo mysql -u root -proot -e "CREATE USER IF NOT EXISTS 'empire_user'@'localhost' IDENTIFIED BY 'empire_password';" || true
|
||||
sudo mysql -u root -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'empire_user'@'localhost' WITH GRANT OPTION;" || true
|
||||
sudo mysql -u root -proot -e "FLUSH PRIVILEGES;" || true
|
||||
|
||||
if [ "$ASSUME_YES" == "1" ]; then
|
||||
answer="Y"
|
||||
@@ -119,10 +124,73 @@ function install_bomutils() {
|
||||
rm -rf bomutils
|
||||
}
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
function install_dotnet() {
|
||||
echo -e "\x1b[1;34m[*] Installing dotnet for C# agents and modules\x1b[0m"
|
||||
if [ $OS_NAME == "UBUNTU" ]; then
|
||||
wget https://packages.microsoft.com/config/ubuntu/"${VERSION_ID}"/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
rm packages-microsoft-prod.deb
|
||||
|
||||
# If version is 22.04, we need to write an /etc/apt/preferences file
|
||||
# https://github.com/dotnet/core/issues/7699
|
||||
if [ "$VERSION_ID" == "22.04" ]; then
|
||||
echo -e "\x1b[1;34m[*] Detected Ubuntu 22.04, writing /etc/apt/preferences file\x1b[0m"
|
||||
sudo tee -a /etc/apt/preferences <<EOT
|
||||
Package: *
|
||||
Pin: origin "packages.microsoft.com"
|
||||
Pin-Priority: 100
|
||||
EOT
|
||||
fi
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y apt-transport-https dotnet-sdk-6.0
|
||||
elif [ $OS_NAME == "DEBIAN" ]; then
|
||||
wget https://packages.microsoft.com/config/debian/"${VERSION_ID}"/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y apt-transport-https dotnet-sdk-6.0
|
||||
else
|
||||
wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y apt-transport-https dotnet-sdk-6.0
|
||||
fi
|
||||
}
|
||||
|
||||
function install_nim() {
|
||||
if [ "$ASSUME_YES" == "1" ] ;then
|
||||
answer="Y"
|
||||
else
|
||||
echo -n -e "\x1b[1;33m[>] Do you want to install Nim and MinGW? It is only needed to generate a Nim stager (y/N)? \x1b[0m"
|
||||
read -r answer
|
||||
fi
|
||||
if [ "$answer" != "${answer#[Yy]}" ]; then
|
||||
sudo apt-get install -y curl git gcc xz-utils
|
||||
export CHOOSENIM_CHOOSE_VERSION=1.6.12
|
||||
curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y
|
||||
echo "export PATH=$HOME/.nimble/bin:$PATH" >> ~/.bashrc
|
||||
echo "export PATH=$HOME/.nimble/bin:$PATH" >> ~/.zshrc
|
||||
export PATH=$HOME/.nimble/bin:$PATH
|
||||
sudo ln -s $HOME/.nimble/bin/* /usr/bin/
|
||||
nimble install -y nimble@0.14.2
|
||||
nimble install -y winim zippy nimcrypto
|
||||
sudo apt-get install -y mingw-w64
|
||||
else
|
||||
echo -e "\x1b[1;34m[*] Skipping Nim\x1b[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
set -e
|
||||
|
||||
apt-get update && apt-get install -y wget sudo git lsb-release
|
||||
if [ "$EUID" -eq 0 ]; then
|
||||
if grep -q docker /proc/1/cgroup; then
|
||||
echo "This script is being run in a Docker build context."
|
||||
else
|
||||
echo "This script should not be run as root."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
sudo apt-get update && sudo apt-get install -y wget git lsb-release curl
|
||||
|
||||
sudo -v
|
||||
|
||||
@@ -130,14 +198,9 @@ sudo -v
|
||||
PARENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; cd .. ; pwd -P )
|
||||
OS_NAME=
|
||||
VERSION_ID=
|
||||
if grep "10.*" /etc/debian_version 2>/dev/null; then
|
||||
echo -e "\x1b[1;34m[*] Detected Debian 10\x1b[0m"
|
||||
if VERSION_ID=$(grep -oP '^(10|11|12)' /etc/debian_version 2>/dev/null); then
|
||||
echo -e "\x1b[1;34m[*] Detected Debian $VERSION_ID\x1b[0m"
|
||||
OS_NAME="DEBIAN"
|
||||
VERSION_ID="10"
|
||||
elif grep "11.*" /etc/debian_version 2>/dev/null; then
|
||||
echo -e "\x1b[1;34m[*] Detected Debian 11\x1b[0m"
|
||||
OS_NAME="DEBIAN"
|
||||
VERSION_ID="11"
|
||||
elif grep -i "NAME=\"Ubuntu\"" /etc/os-release 2>/dev/null; then
|
||||
OS_NAME=UBUNTU
|
||||
VERSION_ID=$(grep -i VERSION_ID /etc/os-release | grep -o -E "[[:digit:]]+\\.[[:digit:]]+")
|
||||
@@ -158,9 +221,26 @@ else
|
||||
fi
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3-dev python3-pip xclip
|
||||
# xclip for copying to clipboard
|
||||
# libpango-1.0-0 and libharfbuzz0b for weasyprint
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
||||
python3 \
|
||||
xclip \
|
||||
libpango-1.0-0 \
|
||||
libharfbuzz0b \
|
||||
libpangoft2-1.0-0
|
||||
|
||||
install_powershell
|
||||
if ! command_exists pwsh; then
|
||||
install_powershell
|
||||
fi
|
||||
|
||||
if ! command_exists dotnet; then
|
||||
install_dotnet
|
||||
fi
|
||||
|
||||
if ! command_exists nim; then
|
||||
install_nim
|
||||
fi
|
||||
|
||||
if ! command_exists mysql; then
|
||||
install_mysql
|
||||
@@ -195,103 +275,50 @@ else
|
||||
echo -e "\x1b[1;34m[*] Skipping OpenJDK\x1b[0m"
|
||||
fi
|
||||
|
||||
echo -e "\x1b[1;34m[*] Installing dotnet for C# agents and modules\x1b[0m"
|
||||
if [ $OS_NAME == "UBUNTU" ]; then
|
||||
wget https://packages.microsoft.com/config/ubuntu/"${VERSION_ID}"/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
rm packages-microsoft-prod.deb
|
||||
|
||||
# If version is 22.04, we need to write an /etc/apt/preferences file
|
||||
# https://github.com/dotnet/core/issues/7699
|
||||
if [ "$VERSION_ID" == "22.04" ]; then
|
||||
echo -e "\x1b[1;34m[*] Detected Ubuntu 22.04, writing /etc/apt/preferences file\x1b[0m"
|
||||
sudo tee -a /etc/apt/preferences <<EOT
|
||||
Package: *
|
||||
Pin: origin "packages.microsoft.com"
|
||||
Pin-Priority: 100
|
||||
EOT
|
||||
fi
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y apt-transport-https dotnet-sdk-6.0
|
||||
else
|
||||
wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
sudo dpkg -i packages-microsoft-prod.deb
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y apt-transport-https dotnet-sdk-6.0
|
||||
fi
|
||||
|
||||
if [ "$ASSUME_YES" == "1" ] ;then
|
||||
answer="Y"
|
||||
else
|
||||
echo -n -e "\x1b[1;33m[>] Do you want to install Nim and MinGW? It is only needed to generate a Nim stager (y/N)? \x1b[0m"
|
||||
read -r answer
|
||||
fi
|
||||
if [ "$answer" != "${answer#[Yy]}" ] ;then
|
||||
sudo apt install -y curl git gcc
|
||||
export CHOOSENIM_CHOOSE_VERSION=1.6.12
|
||||
curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y
|
||||
echo "export PATH=/root/.nimble/bin:$PATH" >> ~/.bashrc
|
||||
export PATH=/root/.nimble/bin:$PATH
|
||||
SOURCE_MESSAGE=true
|
||||
nimble install -y nimble@0.14.2
|
||||
nimble install -y winim zippy nimcrypto
|
||||
sudo apt install -y mingw-w64
|
||||
else
|
||||
echo -e "\x1b[1;34m[*] Skipping Nim\x1b[0m"
|
||||
fi
|
||||
|
||||
if [ "$OS_NAME" == "PARROT" ]; then
|
||||
# https://github.com/python-poetry/poetry/issues/1917#issuecomment-1235998997
|
||||
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
|
||||
fi
|
||||
# https://github.com/python-poetry/poetry/issues/1917#issuecomment-1235998997
|
||||
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
|
||||
echo -e "\x1b[1;34m[*] Checking Python version\x1b[0m"
|
||||
python_version=($(python3 -c 'import sys; print("{} {}".format(sys.version_info.major, sys.version_info.minor))'))
|
||||
if [ "${python_version[0]}" -eq 3 ] && [ "${python_version[1]}" -lt 8 ]; then
|
||||
if ! command_exists python3.8; then
|
||||
if [ "$OS_NAME" == "UBUNTU" ]; then
|
||||
echo -e "\x1b[1;34m[*] Python3 version less than 3.8, installing 3.8\x1b[0m"
|
||||
sudo apt-get install -y python3.8 python3.8-dev python3-pip
|
||||
elif [ "$OS_NAME" == "DEBIAN" ]; then
|
||||
echo -e "\x1b[1;34m[*] Python3 version less than 3.8, installing 3.8\x1b[0m"
|
||||
if [ "$ASSUME_YES" == "1" ] ;then
|
||||
answer="Y"
|
||||
else
|
||||
echo -n -e "\x1b[1;33m[>] Python 3.8 must be built from source. This might take a bit, do you want to continue (y/N)? \x1b[0m"
|
||||
read -r answer
|
||||
fi
|
||||
if [ "$answer" != "${answer#[Yy]}" ] ;then
|
||||
sudo apt-get install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev
|
||||
curl -O https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tar.xz
|
||||
tar -xf Python-3.8.16.tar.xz
|
||||
cd Python-3.8.16
|
||||
./configure --enable-optimizations
|
||||
make -j"$(nproc)"
|
||||
sudo make altinstall
|
||||
cd ..
|
||||
rm -rf Python-3.8.16
|
||||
rm Python-3.8.16.tar.xz
|
||||
else
|
||||
echo -e "Abort"
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# TODO: We should really use the official poetry installer, but since right now we
|
||||
# recommend running this script as sudo, it installs poetry in a way that you can't
|
||||
# run it without sudo su. We should probably update the script to not be run as sudo,
|
||||
# and only use sudo when needed within the script itself.
|
||||
python3.8 -m pip install poetry
|
||||
else
|
||||
if [ "${python_version[0]}" -eq 3 ] && [ "${python_version[1]}" -ge 11 ]; then
|
||||
python3 -m pip install poetry --break-system-packages
|
||||
else
|
||||
python3 -m pip install poetry
|
||||
fi
|
||||
|
||||
# Ubuntu 22.04 - 3.10, 20.04 - 3.8
|
||||
# Debian 10 - 3.7, 11 - 3.9, 12 - 3.11
|
||||
# Kali and Parrot do not have a reliable version
|
||||
if ! command_exists pyenv; then
|
||||
curl https://pyenv.run | bash
|
||||
|
||||
export PYENV_ROOT="$HOME/.pyenv"
|
||||
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
|
||||
eval "$(pyenv init -)"
|
||||
|
||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
|
||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
|
||||
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
|
||||
|
||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
|
||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
|
||||
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
|
||||
|
||||
sudo ln -s $HOME/.pyenv/bin/pyenv /usr/bin/pyenv
|
||||
|
||||
sudo DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC \
|
||||
apt-get -y install build-essential gdb lcov pkg-config \
|
||||
libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \
|
||||
libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
|
||||
lzma lzma-dev tk-dev uuid-dev zlib1g-dev
|
||||
|
||||
pyenv install 3.12.0
|
||||
fi
|
||||
|
||||
if ! command_exists poetry; then
|
||||
curl -sSL https://install.python-poetry.org | python3 -
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
echo "export PATH=$HOME/.local/bin:$PATH" >> ~/.bashrc
|
||||
echo "export PATH=$HOME/.local/bin:$PATH" >> ~/.zshrc
|
||||
sudo ln -s $HOME/.local/bin/poetry /usr/bin
|
||||
fi
|
||||
|
||||
echo -e "\x1b[1;34m[*] Installing Packages\x1b[0m"
|
||||
poetry config virtualenvs.in-project true
|
||||
poetry config virtualenvs.prefer-active-python true
|
||||
poetry install
|
||||
|
||||
echo -e '\x1b[1;32m[+] Install Complete!\x1b[0m'
|
||||
@@ -299,7 +326,3 @@ echo -e ''
|
||||
echo -e '\x1b[1;32m[+] Run the following commands in separate terminals to start Empire\x1b[0m'
|
||||
echo -e '\x1b[1;34m[*] ./ps-empire server\x1b[0m'
|
||||
echo -e '\x1b[1;34m[*] ./ps-empire client\x1b[0m'
|
||||
|
||||
if $SOURCE_MESSAGE; then
|
||||
echo -e '\x1b[1;34m[*] source ~/.bashrc to enable nim \x1b[0m'
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user