PyADRecon 0.11.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyadrecon-0.11.1/.dockerignore +36 -0
- pyadrecon-0.11.1/.github/ISSUE_TEMPLATE/bug_report.md +96 -0
- pyadrecon-0.11.1/.github/ISSUE_TEMPLATE/feature_request.md +71 -0
- pyadrecon-0.11.1/.github/pyadrecon.png +0 -0
- pyadrecon-0.11.1/.github/workflows/conventional-commits.yml +137 -0
- pyadrecon-0.11.1/.github/workflows/pypi.yml +59 -0
- pyadrecon-0.11.1/.gitignore +26 -0
- pyadrecon-0.11.1/CHANGELOG.md +36 -0
- pyadrecon-0.11.1/Dockerfile +63 -0
- pyadrecon-0.11.1/LICENSE +21 -0
- pyadrecon-0.11.1/PKG-INFO +231 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/PKG-INFO +231 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/SOURCES.txt +21 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/dependency_links.txt +1 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/entry_points.txt +2 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/requires.txt +9 -0
- pyadrecon-0.11.1/PyADRecon.egg-info/top_level.txt +1 -0
- pyadrecon-0.11.1/README.md +211 -0
- pyadrecon-0.11.1/package.json +3 -0
- pyadrecon-0.11.1/pyadrecon.py +6947 -0
- pyadrecon-0.11.1/pyproject.toml +39 -0
- pyadrecon-0.11.1/requirements.txt +5 -0
- pyadrecon-0.11.1/setup.cfg +4 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PyADRecon output directories
|
|
2
|
+
PyADRecon-Report-*/
|
|
3
|
+
results/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*$py.class
|
|
9
|
+
*.pyc
|
|
10
|
+
*.pyo
|
|
11
|
+
|
|
12
|
+
# Git
|
|
13
|
+
.git/
|
|
14
|
+
.gitignore
|
|
15
|
+
|
|
16
|
+
# IDE
|
|
17
|
+
.vscode/
|
|
18
|
+
.idea/
|
|
19
|
+
*.swp
|
|
20
|
+
*.swo
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
Thumbs.db
|
|
25
|
+
|
|
26
|
+
# Documentation
|
|
27
|
+
*.md
|
|
28
|
+
LICENSE
|
|
29
|
+
|
|
30
|
+
# CI/CD
|
|
31
|
+
.github/
|
|
32
|
+
|
|
33
|
+
# Virtual environments
|
|
34
|
+
venv/
|
|
35
|
+
env/
|
|
36
|
+
ENV/
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: 'BUG: '
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## PyADRecon Bug Report
|
|
11
|
+
|
|
12
|
+
Thank you for taking the time to report an issue!
|
|
13
|
+
|
|
14
|
+
To help diagnose quickly, please fill in the sections below with as much detail as you can.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### โ Summary
|
|
19
|
+
|
|
20
|
+
**Describe the problem in one or two sentences**
|
|
21
|
+
What is the observed behavior vs. what you expected?
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### ๐งช Command(s) run
|
|
26
|
+
|
|
27
|
+
Provide the exact command(s) you ran, including all flags:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# example
|
|
31
|
+
pyadrecon -d CONTOSO.LOCAL -u user01 -p 'Password123!' --output report.json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### ๐ฅ๏ธ Environment
|
|
37
|
+
|
|
38
|
+
- **PyADRecon version**:
|
|
39
|
+
Example: `v0.5.2` or `master @ commit abc1234`
|
|
40
|
+
- **Operating System** (where PyADRecon ran):
|
|
41
|
+
Example: Ubuntu 22.04, Windows 10
|
|
42
|
+
- **Python version**:
|
|
43
|
+
Example: `Python 3.11.2`
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### ๐ข Domain Environment
|
|
48
|
+
|
|
49
|
+
- **Domain Controller OS version(s)**:
|
|
50
|
+
Example: `Windows Server 2019 Standard`, `Windows Server 2022 DC`
|
|
51
|
+
- **AD user privileges** used for the run:
|
|
52
|
+
Example: `Domain User`, `Enterprise Admin`, `Cert Publishers`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### ๐ Output / Incorrect Parsing
|
|
57
|
+
|
|
58
|
+
For each field or section that is incorrect, please include:
|
|
59
|
+
|
|
60
|
+
- **Section name / object type**
|
|
61
|
+
- **Attribute(s) that are wrong**
|
|
62
|
+
- **What was parsed**
|
|
63
|
+
- **What you expected**
|
|
64
|
+
|
|
65
|
+
Example:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Collection: Users
|
|
69
|
+
Attribute: Enabled
|
|
70
|
+
Parsed: "True"
|
|
71
|
+
Expected: "False"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Paste text or small snippets (not entire output unless necessary).
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### ๐งพ Logs / Errors
|
|
79
|
+
|
|
80
|
+
If you saw warnings or errors, include relevant lines:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
# paste output here
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If debug logs are available, include them as a code block (sanitize any credentials first).
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### โ ๏ธ Additional context
|
|
91
|
+
|
|
92
|
+
Add any other context about the issue here (e.g., replication steps, domain peculiarities, related tooling).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
Thank you โ weโll triage this promptly!
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: 'FEATURE: '
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: ''
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## PyADRecon Feature Request
|
|
11
|
+
|
|
12
|
+
Please fill out the information below to help us understand the use case and scope of your proposal.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### ๐ Summary
|
|
17
|
+
|
|
18
|
+
**Describe the feature youโre proposing in one or two sentences.**
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
### ๐ฏ Motivation
|
|
23
|
+
|
|
24
|
+
- What problem does this solve?
|
|
25
|
+
- Who benefits (e.g., blue team, red team, auditors)?
|
|
26
|
+
- Are there existing tools or workflows this integrates with or complements?
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
### ๐ก Proposed Behavior
|
|
31
|
+
|
|
32
|
+
Describe how you envision this working:
|
|
33
|
+
|
|
34
|
+
- New command-line options?
|
|
35
|
+
- New report sections?
|
|
36
|
+
- New detection logic?
|
|
37
|
+
- New modules?
|
|
38
|
+
- What inputs/output formats should it use?
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### ๐งช Example Usage (optional)
|
|
43
|
+
|
|
44
|
+
If applicable, show example commands and expected output:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
# e.g., pyadrecon --detect-dmsa
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
DelegatedMSAs:
|
|
52
|
+
- dMSA: SQL-SvcAcct
|
|
53
|
+
Password Readers: Domain Users
|
|
54
|
+
Risk Level: CRITICAL
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### ๐ Alternatives Considered
|
|
60
|
+
|
|
61
|
+
If you considered alternatives (existing tools, different implementations), please describe why this approach is preferred.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### ๐ Additional context
|
|
66
|
+
|
|
67
|
+
Add any other context about the proposal here.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
Thank you โ your ideas help make PyADRecon better!
|
|
Binary file
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: write
|
|
11
|
+
packages: write
|
|
12
|
+
pull-requests: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
|
|
16
|
+
changelog:
|
|
17
|
+
name: Changelog
|
|
18
|
+
if: github.event_name != 'pull_request'
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
|
|
21
|
+
outputs:
|
|
22
|
+
skipped: ${{ steps.changelog.outputs.skipped }}
|
|
23
|
+
tag: ${{ steps.changelog.outputs.tag }}
|
|
24
|
+
clean_changelog: ${{ steps.changelog.outputs.clean_changelog }}
|
|
25
|
+
version: ${{ steps.changelog.outputs.version }}
|
|
26
|
+
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- name: Conventional Changelog Action
|
|
31
|
+
id: changelog
|
|
32
|
+
uses: TriPSs/conventional-changelog-action@v5
|
|
33
|
+
with:
|
|
34
|
+
preset: "conventionalcommits"
|
|
35
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
36
|
+
|
|
37
|
+
deploy:
|
|
38
|
+
name: Deploy Image
|
|
39
|
+
needs: [changelog]
|
|
40
|
+
if: github.event_name != 'pull_request' && needs.changelog.outputs.skipped == 'false'
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
|
|
43
|
+
steps:
|
|
44
|
+
- name: Get repository name
|
|
45
|
+
id: get_repo
|
|
46
|
+
run: echo "REPO_NAME=$(echo ${{ github.repository }} | cut -d'/' -f2 | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
|
|
47
|
+
|
|
48
|
+
- name: Checkout
|
|
49
|
+
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
|
50
|
+
with:
|
|
51
|
+
fetch-depth: 0
|
|
52
|
+
|
|
53
|
+
- name: Pull latest changes
|
|
54
|
+
run: |
|
|
55
|
+
git pull origin main
|
|
56
|
+
|
|
57
|
+
- name: Inject version into pyadrecon.py
|
|
58
|
+
run: |
|
|
59
|
+
VERSION=${{ needs.changelog.outputs.tag }}
|
|
60
|
+
sed -i 's/VERSION = ".*"/VERSION = "'${VERSION}'"/' pyadrecon.py
|
|
61
|
+
echo "Updated VERSION to ${VERSION}"
|
|
62
|
+
grep 'VERSION = ' pyadrecon.py
|
|
63
|
+
|
|
64
|
+
- name: Commit version update
|
|
65
|
+
run: |
|
|
66
|
+
git config --local user.email "21357789+l4rm4nd@users.noreply.github.com"
|
|
67
|
+
git config --local user.name "l4rm4nd"
|
|
68
|
+
git add pyadrecon.py
|
|
69
|
+
git commit -m "chore: bump version to ${{ needs.changelog.outputs.tag }} [skip ci]" || echo "No changes to commit"
|
|
70
|
+
git push origin main
|
|
71
|
+
|
|
72
|
+
- name: Login to GHCR.IO
|
|
73
|
+
uses: docker/login-action@v1
|
|
74
|
+
with:
|
|
75
|
+
registry: ghcr.io
|
|
76
|
+
username: ${{ github.actor }}
|
|
77
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
78
|
+
|
|
79
|
+
- name: Setup Docker Buildx
|
|
80
|
+
uses: docker/setup-buildx-action@v3
|
|
81
|
+
|
|
82
|
+
- name: Extract version parts
|
|
83
|
+
id: extract_version
|
|
84
|
+
run: |
|
|
85
|
+
VERSION=${{ needs.changelog.outputs.version }}
|
|
86
|
+
MAJOR_MINOR=$(echo $VERSION | cut -d'.' -f1,2)
|
|
87
|
+
echo "MAJOR_MINOR_TAG=${MAJOR_MINOR}.x" >> $GITHUB_ENV
|
|
88
|
+
|
|
89
|
+
- name: Setup Docker Metadata
|
|
90
|
+
uses: docker/metadata-action@v5
|
|
91
|
+
id: meta
|
|
92
|
+
with:
|
|
93
|
+
images: |
|
|
94
|
+
ghcr.io/${{ github.repository_owner }}/${{ env.REPO_NAME }}
|
|
95
|
+
tags: |
|
|
96
|
+
latest
|
|
97
|
+
${{ needs.changelog.outputs.version }}
|
|
98
|
+
${{ env.MAJOR_MINOR_TAG }}
|
|
99
|
+
|
|
100
|
+
- name: Build and Push Docker Image
|
|
101
|
+
uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5
|
|
102
|
+
with:
|
|
103
|
+
context: .
|
|
104
|
+
file: Dockerfile
|
|
105
|
+
push: true
|
|
106
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
107
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
108
|
+
platforms: linux/amd64, linux/arm64
|
|
109
|
+
|
|
110
|
+
release:
|
|
111
|
+
name: Release
|
|
112
|
+
needs: [changelog, deploy]
|
|
113
|
+
if: github.event_name != 'pull_request' && needs.changelog.outputs.skipped == 'false'
|
|
114
|
+
runs-on: ubuntu-latest
|
|
115
|
+
|
|
116
|
+
steps:
|
|
117
|
+
- name: Checkout
|
|
118
|
+
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
|
|
119
|
+
|
|
120
|
+
- name: Debug Changelog Outputs
|
|
121
|
+
run: echo ${{ needs.changelog.outputs.tag }}
|
|
122
|
+
|
|
123
|
+
- name: Create Release
|
|
124
|
+
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1
|
|
125
|
+
with:
|
|
126
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
127
|
+
tag_name: ${{ needs.changelog.outputs.tag }}
|
|
128
|
+
prerelease: false
|
|
129
|
+
draft: false
|
|
130
|
+
generate_release_notes: true
|
|
131
|
+
name: ${{ needs.changelog.outputs.tag }}
|
|
132
|
+
body: |
|
|
133
|
+
<details>
|
|
134
|
+
<summary>๐ค Autogenerated Conventional Changelog</summary>
|
|
135
|
+
|
|
136
|
+
${{ needs.changelog.outputs.clean_changelog }}
|
|
137
|
+
</details>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
tag:
|
|
9
|
+
description: "Release tag to publish (e.g. v0.11.0). Leave empty to use the current ref."
|
|
10
|
+
required: false
|
|
11
|
+
default: ""
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
id-token: write
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
publish:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Determine ref to build
|
|
23
|
+
id: ref
|
|
24
|
+
shell: bash
|
|
25
|
+
run: |
|
|
26
|
+
if [[ "${{ github.event_name }}" == "release" ]]; then
|
|
27
|
+
echo "ref=${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT"
|
|
28
|
+
elif [[ -n "${{ inputs.tag }}" ]]; then
|
|
29
|
+
echo "ref=${{ inputs.tag }}" >> "$GITHUB_OUTPUT"
|
|
30
|
+
else
|
|
31
|
+
echo "ref=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
- name: Checkout repo (for tags)
|
|
35
|
+
uses: actions/checkout@v4
|
|
36
|
+
with:
|
|
37
|
+
fetch-depth: 0
|
|
38
|
+
|
|
39
|
+
- name: Fetch tags
|
|
40
|
+
run: git fetch --tags --force
|
|
41
|
+
|
|
42
|
+
- name: Checkout ref
|
|
43
|
+
run: |
|
|
44
|
+
echo "Using ref: ${{ steps.ref.outputs.ref }}"
|
|
45
|
+
git checkout "${{ steps.ref.outputs.ref }}"
|
|
46
|
+
|
|
47
|
+
- name: Setup Python
|
|
48
|
+
uses: actions/setup-python@v5
|
|
49
|
+
with:
|
|
50
|
+
python-version: "3.11"
|
|
51
|
+
|
|
52
|
+
- name: Build dists
|
|
53
|
+
run: |
|
|
54
|
+
python -m pip install --upgrade pip build twine
|
|
55
|
+
python -m build
|
|
56
|
+
twine check dist/*
|
|
57
|
+
|
|
58
|
+
- name: Publish to PyPI (Trusted Publishing)
|
|
59
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# PyADRecon output directories
|
|
2
|
+
PyADRecon-Report-*/
|
|
3
|
+
results/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*$py.class
|
|
9
|
+
*.so
|
|
10
|
+
.Python
|
|
11
|
+
|
|
12
|
+
# Virtual environments
|
|
13
|
+
venv/
|
|
14
|
+
env/
|
|
15
|
+
ENV/
|
|
16
|
+
|
|
17
|
+
# IDE
|
|
18
|
+
.vscode/
|
|
19
|
+
.idea/
|
|
20
|
+
*.swp
|
|
21
|
+
*.swo
|
|
22
|
+
*~
|
|
23
|
+
|
|
24
|
+
# OS
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
## [0.11.1](https://github.com/l4rm4nd/PyADRecon/compare/v0.11.0...v0.11.1) (2026-02-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* trigger ci and test pypi release ([89d0e4e](https://github.com/l4rm4nd/PyADRecon/commit/89d0e4e9c9ec99a26c01defe1710e95a5f71d4e3))
|
|
7
|
+
|
|
8
|
+
## [0.11.0](https://github.com/l4rm4nd/PyADRecon/compare/v0.10.2...v0.11.0) (2026-02-11)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* striped cells, new collection methods, show maq in domain tab ([de701f9](https://github.com/l4rm4nd/PyADRecon/commit/de701f9a532aad3ec65398e4bb2d49677f13d68e))
|
|
14
|
+
|
|
15
|
+
## [0.10.2](https://github.com/l4rm4nd/PyADRecon/compare/v0.10.1...v0.10.2) (2026-02-10)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* improve password policy parsing and display as (d h m s) ([9161f8c](https://github.com/l4rm4nd/PyADRecon/commit/9161f8c925c768a301578575f7152fc7985b4cd2)), closes [#4](https://github.com/l4rm4nd/PyADRecon/issues/4)
|
|
21
|
+
* use empty workstation name instead of spoofing ([1a3db5b](https://github.com/l4rm4nd/PyADRecon/commit/1a3db5b627d1f40b81d3511164e76d052583513a))
|
|
22
|
+
|
|
23
|
+
## [0.10.1](https://github.com/l4rm4nd/PyADRecon/compare/v0.10.0...v0.10.1) (2026-02-09)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Bug Fixes
|
|
27
|
+
|
|
28
|
+
* use empty workstation name instead of spoofing ([80329a9](https://github.com/l4rm4nd/PyADRecon/commit/80329a9a9ba7825bf7ee9b2d6ef04f1da76edf0a))
|
|
29
|
+
|
|
30
|
+
## [0.10.0](https://github.com/l4rm4nd/PyADRecon/compare/v0.9.1...v0.10.0) (2026-02-09)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Features
|
|
34
|
+
|
|
35
|
+
* add logonWorkstation bypass via --workstation ([9bf02d3](https://github.com/l4rm4nd/PyADRecon/commit/9bf02d3d48ee8d76da305ed7b5ce3701c4cfdf00))
|
|
36
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Build stage
|
|
2
|
+
FROM python:3.12.4-slim AS builder
|
|
3
|
+
|
|
4
|
+
# Install build dependencies
|
|
5
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
6
|
+
gcc \
|
|
7
|
+
libffi-dev \
|
|
8
|
+
libssl-dev \
|
|
9
|
+
python3-dev \
|
|
10
|
+
build-essential \
|
|
11
|
+
libxml2-dev \
|
|
12
|
+
libxslt1-dev \
|
|
13
|
+
libkrb5-dev \
|
|
14
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
15
|
+
|
|
16
|
+
# Install Python packages
|
|
17
|
+
COPY requirements.txt /tmp/
|
|
18
|
+
RUN pip3 install --no-cache-dir --prefix=/install -r /tmp/requirements.txt
|
|
19
|
+
|
|
20
|
+
# Runtime stage
|
|
21
|
+
FROM python:3.12.4-slim
|
|
22
|
+
LABEL Maintainer="LRVT"
|
|
23
|
+
|
|
24
|
+
# Install only runtime libraries (not build tools)
|
|
25
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
26
|
+
libffi8 \
|
|
27
|
+
libssl3 \
|
|
28
|
+
libxml2 \
|
|
29
|
+
libxslt1.1 \
|
|
30
|
+
libkrb5-3 \
|
|
31
|
+
krb5-user \
|
|
32
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
33
|
+
|
|
34
|
+
# Configure OpenSSL to enable legacy providers (required for MD4/NTLM)
|
|
35
|
+
RUN mkdir -p /etc/ssl && \
|
|
36
|
+
cat > /etc/ssl/openssl.cnf <<EOF
|
|
37
|
+
openssl_conf = openssl_init
|
|
38
|
+
|
|
39
|
+
[openssl_init]
|
|
40
|
+
providers = provider_sect
|
|
41
|
+
|
|
42
|
+
[provider_sect]
|
|
43
|
+
default = default_sect
|
|
44
|
+
legacy = legacy_sect
|
|
45
|
+
|
|
46
|
+
[default_sect]
|
|
47
|
+
activate = 1
|
|
48
|
+
|
|
49
|
+
[legacy_sect]
|
|
50
|
+
activate = 1
|
|
51
|
+
EOF
|
|
52
|
+
|
|
53
|
+
# Set environment variable to use legacy OpenSSL config
|
|
54
|
+
ENV OPENSSL_CONF=/etc/ssl/openssl.cnf
|
|
55
|
+
|
|
56
|
+
# Copy Python packages from builder
|
|
57
|
+
COPY --from=builder /install /usr/local
|
|
58
|
+
|
|
59
|
+
# Copy application
|
|
60
|
+
COPY pyadrecon.py /app/
|
|
61
|
+
|
|
62
|
+
WORKDIR /app
|
|
63
|
+
ENTRYPOINT ["python", "pyadrecon.py"]
|
pyadrecon-0.11.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 LRVT
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|