Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab
82 changes: 82 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Bug report
description: Report a bug or unexpected behavior in Ghostline
title: "[Bug] "
labels: ["bug"]
body:
- type: textarea
id: summary
attributes:
label: Summary
description: One or two sentences describing the bug.
placeholder: "RID enumeration crashes when target is unreachable."
validations:
required: true

- type: input
id: version
attributes:
label: Ghostline version
description: "Commit SHA or release tag. Run `git rev-parse --short HEAD` in the repo root."
placeholder: "e.g. v1.0.0 or abc1234"
validations:
required: true

- type: input
id: os
attributes:
label: Operating system
description: "Distribution and version."
placeholder: "e.g. Kali Linux 2025.3"
validations:
required: true

- type: dropdown
id: module
attributes:
label: Affected module
options:
- lib/core.sh
- lib/ui.sh
- lib/installer.sh
- lib/modules/config.sh
- lib/modules/passive.sh
- lib/modules/active.sh
- lib/modules/special.sh
- install.sh
- ghostline.sh (entry point)
- Not sure
validations:
required: true

- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: Exact menu path, inputs, and target configuration.
placeholder: |
1. Launch ./ghostline.sh
2. Main Menu → [3] Active Enumeration → [5] RID Enumeration
3. Target was set to 10.10.10.10 (offline)
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected behavior
validations:
required: true

- type: textarea
id: actual
attributes:
label: Actual behavior
description: Paste error output. Use code fences (```) for logs.
validations:
required: true

- type: textarea
id: extra
attributes:
label: Additional context
description: Logs, screenshots, related issues — anything else that helps.
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/WhiteMuush/Ghostline/security/advisories/new
about: Report a security issue privately via GitHub Security Advisories.
57 changes: 57 additions & 0 deletions .github/ISSUE_TEMPLATE/tool_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Tool request
description: Propose a new tool or module for Ghostline
title: "[Tool] "
labels: ["enhancement", "tool-request"]
body:
- type: input
id: tool_name
attributes:
label: Tool name
placeholder: "e.g. certipy"
validations:
required: true

- type: input
id: tool_url
attributes:
label: Upstream URL
placeholder: "https://github.com/ly4k/Certipy"
validations:
required: true

- type: textarea
id: rationale
attributes:
label: Why this tool fits Ghostline
description: How does it help with Active Directory enumeration or exploitation?
validations:
required: true

- type: dropdown
id: target_module
attributes:
label: Suggested module placement
options:
- lib/modules/passive.sh
- lib/modules/active.sh
- lib/modules/special.sh
- New module
validations:
required: true

- type: textarea
id: install_hint
attributes:
label: Installation hint
description: How is the tool installed on Debian/Kali? (apt, pipx, git clone, ...)
placeholder: |
pipx install certipy-ad
validations:
required: true

- type: textarea
id: example_usage
attributes:
label: Example invocation
description: A representative command, ideally usable as the body of the new module function.
render: bash
32 changes: 32 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!--
Thanks for contributing to Ghostline!
Please fill in the sections below. Strike out lines that don't apply.
-->

## Summary

<!-- One or two sentences explaining the change. -->

## Type of change

- [ ] New tool / module
- [ ] Bug fix
- [ ] Refactor / cleanup
- [ ] Documentation
- [ ] CI / tooling

## Checklist

- [ ] `bash -n` passes on every modified `.sh`
- [ ] `shellcheck` passes (CI will verify)
- [ ] `lib/` source chain still loads (smoke test in CI)
- [ ] No French text introduced (project is English-only)
- [ ] If adding a tool: I followed `docs/ADDING_A_TOOL.md`
- [ ] `README.md` updated if the menus, CLI or install steps changed

## Test plan

<!--
How did you exercise the change?
For modules: which target did you point it at, and what was the result?
-->
99 changes: 99 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: ci

on:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
shellcheck:
name: ShellCheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run shellcheck
uses: ludeeus/action-shellcheck@master
env:
SHELLCHECK_OPTS: -e SC1091 -e SC2034 -e SC2154
with:
severity: warning
ignore_paths: >-
graphify-out

syntax:
name: bash -n
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Syntax check every shell script
shell: bash
run: |
set -euo pipefail
failed=0
while IFS= read -r -d '' file; do
if ! bash -n "$file"; then
echo "SYNTAX ERROR: $file"
failed=1
fi
done < <(find . -name '*.sh' -not -path './.git/*' -print0)
exit "$failed"

smoke:
name: Source chain smoke test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Verify expected functions are exported
shell: bash
run: |
set -uo pipefail
# shellcheck disable=SC1091
source ./lib/core.sh
# shellcheck disable=SC1091
source ./lib/installer.sh
# shellcheck disable=SC1091
source ./lib/ui.sh
# shellcheck disable=SC1091
source ./lib/modules/config.sh
# shellcheck disable=SC1091
source ./lib/modules/passive.sh
# shellcheck disable=SC1091
source ./lib/modules/active.sh
# shellcheck disable=SC1091
source ./lib/modules/special.sh

expected=(
log_step log_info log_warn log_error log_success
prompt_value prompt_password prompt_yesno press_enter_to_continue
ensure_command resolve_command
clone_or_pull pip_install pipx_install apt_install
generate_main_menu generate_config_menu generate_passive_menu
generate_active_menu generate_special_menu
display_banner_with_menu display_title_middle_screen prompt_menu_choice
require_target require_domain require_credentials ensure_output_dir
handle_config_menu handle_passive_menu handle_active_menu handle_special_menu
passive_run_nmap passive_run_enum4linux passive_run_rpc
passive_run_ldap passive_run_dns
active_run_bloodhound active_run_cme active_run_adidns
active_run_getnpusers active_run_ridenum
special_run_workflow special_run_smb_vulns special_run_secretsdump
special_view_results
)

missing=0
for fn in "${expected[@]}"; do
if ! declare -F "$fn" >/dev/null; then
echo "MISSING: $fn"
missing=$((missing+1))
fi
done

if (( missing > 0 )); then
echo "Smoke test FAILED: $missing function(s) missing"
exit 1
fi
echo "Smoke test PASSED — ${#expected[@]} functions present"
38 changes: 38 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Enumeration output directories
ad_enum_*/
output/
results/

# Editor / IDE
.idea/
.vscode/
*.swp
*.swo
*~
.DS_Store
Thumbs.db

# Python (in case modules grow Python tooling later)
__pycache__/
*.pyc
*.pyo
.venv/
venv/
*.egg-info/

# Logs and tmp
*.log
*.tmp
*.bak

# Tooling internals (project-local Claude instructions, graph dumps)
CLAUDE.md
graphify-out/

# Credentials and secrets — defensive, never commit
*.key
*.pem
*.crt
.env
.env.*
!.env.example
13 changes: 13 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Code of Conduct

This project adopts the **Contributor Covenant**, version 2.1.

The full text is published at
<https://www.contributor-covenant.org/version/2/1/code_of_conduct/>.

By participating in this project (issues, pull requests, discussions)
you agree to abide by its terms.

To report a concern, contact the maintainer via the email address on
their GitHub profile, or privately through
[GitHub Security Advisories](https://github.com/WhiteMuush/Ghostline/security/advisories/new).
Loading
Loading