Compare commits

...

14 Commits

Author SHA1 Message Date
Carlos Polop
1375f61d38 workflow: exclude chack temp artifacts from sanitized master-fix patch 2026-02-14 01:37:17 +01:00
Carlos Polop
45105f6f39 workflow: always sanitize master-fixer output to non-workflow diff 2026-02-14 01:28:56 +01:00
Carlos Polop
da70f4f64f workflow: tolerate pr-creation policy block in master fixer 2026-02-14 01:20:39 +01:00
Carlos Polop
45990c68c2 workflow: push chack local commits in master-failure fixer 2026-02-14 01:11:41 +01:00
Carlos Polop
381bf74ebd test: intentional master break in linpeas builder for chack validation 2026-02-14 01:03:28 +01:00
Carlos Polop
44969c086d Revert "workflow: sanitize chack commits and add failure log excerpts (#596)"
This reverts commit 1e6c83f43b.
2026-02-14 01:03:10 +01:00
SirBroccoli
1e6c83f43b workflow: sanitize chack commits and add failure log excerpts (#596) 2026-02-14 00:40:02 +01:00
SirBroccoli
993679e8a2 workflow: push chack-produced commits even when tree is clean (#595) 2026-02-14 00:32:56 +01:00
SirBroccoli
82a9aecd08 ci: harden chack rerun flow and restore macos pip compatibility (#593) 2026-02-13 20:47:18 +01:00
SirBroccoli
c3a942fdba ci: remove macOS pip break-system-packages flags (#592) 2026-02-13 20:35:41 +01:00
SirBroccoli
7ca05693ef ci: fix chack agent_config key for task-steps init (#590) 2026-02-13 18:15:25 +01:00
SirBroccoli
0ec20d2512 ci: enable chack workflow_run jobs and use codex backend (#589) 2026-02-13 18:11:02 +01:00
Carlos Polop
3e2af030d4 f 2026-02-12 20:02:37 +01:00
Carlos Polop
ec746e73e3 additions 2026-02-12 03:44:02 +01:00
30 changed files with 709 additions and 169 deletions

View File

@@ -7,8 +7,7 @@ on:
jobs: jobs:
chack_agent_triage: chack_agent_triage:
# Temporarily disabled by maintainer request. if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: ${{ false && github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
@@ -31,10 +30,15 @@ jobs:
- name: Resolve PR context - name: Resolve PR context
id: gate id: gate
env: env:
PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }}
HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
GH_REPO: ${{ github.repository }} GH_REPO: ${{ github.repository }}
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
run: | run: |
pr_number="${{ github.event.workflow_run.pull_requests[0].number }}" pr_number="${PR_NUMBER}"
if [ -z "$pr_number" ] && [ -n "$HEAD_BRANCH" ]; then
pr_number="$(gh pr list --state open --head "$HEAD_BRANCH" --json number --jq '.[0].number')"
fi
if [ -z "$pr_number" ]; then if [ -z "$pr_number" ]; then
echo "No pull request found for this workflow_run; skipping." echo "No pull request found for this workflow_run; skipping."
echo "should_run=false" >> "$GITHUB_OUTPUT" echo "should_run=false" >> "$GITHUB_OUTPUT"
@@ -83,12 +87,24 @@ jobs:
${{ steps.gate.outputs.base_ref }} \ ${{ steps.gate.outputs.base_ref }} \
+refs/pull/${{ steps.gate.outputs.pr_number }}/head +refs/pull/${{ steps.gate.outputs.pr_number }}/head
- name: Set up Node.js for Codex
if: ${{ steps.gate.outputs.should_run == 'true' }}
uses: actions/setup-node@v5
with:
node-version: "20"
- name: Install Codex CLI
if: ${{ steps.gate.outputs.should_run == 'true' }}
run: |
npm install -g @openai/codex
codex --version
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_chack
if: ${{ steps.gate.outputs.should_run == 'true' }} if: ${{ steps.gate.outputs.should_run == 'true' }}
uses: carlospolop/chack-agent@master uses: carlospolop/chack-agent@master
with: with:
provider: openrouter provider: codex
model_primary: CHEAP_BUT_QUALITY model_primary: CHEAP_BUT_QUALITY
main_action: peass-ng main_action: peass-ng
sub_action: Chack-Agent PR Triage sub_action: Chack-Agent PR Triage
@@ -99,7 +115,7 @@ jobs:
Remember taht you are an autonomouts agent, use the exec tool to run the needed commands to list, read, analyze, modify, test... Remember taht you are an autonomouts agent, use the exec tool to run the needed commands to list, read, analyze, modify, test...
tools_config_json: "{\"exec_enabled\": true}" tools_config_json: "{\"exec_enabled\": true}"
session_config_json: "{\"long_term_memory_enabled\": false}" session_config_json: "{\"long_term_memory_enabled\": false}"
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}" agent_config_json: "{\"self_critique_enabled\": false, \"require_task_steps_manager_init_first\": true}"
output_schema_file: .github/chack-agent/pr-merge-schema.json output_schema_file: .github/chack-agent/pr-merge-schema.json
user_prompt: | user_prompt: |
You are reviewing PR #${{ steps.gate.outputs.pr_number }} for ${{ github.repository }}. You are reviewing PR #${{ steps.gate.outputs.pr_number }} for ${{ github.repository }}.
@@ -123,7 +139,7 @@ jobs:
Output JSON only, following the provided schema: Output JSON only, following the provided schema:
.github/chack-agent/pr-merge-schema.json .github/chack-agent/pr-merge-schema.json
openrouter_api_key: ${{ secrets.OPENROUTER_API_KEY }} openai_api_key: ${{ secrets.OPENAI_API_KEY }}
- name: Parse Chack Agent decision - name: Parse Chack Agent decision
id: parse id: parse
@@ -157,8 +173,7 @@ jobs:
merge_or_comment: merge_or_comment:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: chack_agent_triage needs: chack_agent_triage
# Temporarily disabled by maintainer request. if: ${{ github.event.workflow_run.conclusion == 'success' && needs.chack_agent_triage.outputs.should_run == 'true' && needs.chack_agent_triage.outputs.decision != '' }}
if: ${{ false && github.event.workflow_run.conclusion == 'success' && needs.chack_agent_triage.outputs.should_run == 'true' && needs.chack_agent_triage.outputs.decision != '' }}
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write

View File

@@ -7,9 +7,8 @@ on:
jobs: jobs:
chack_agent_fix_master_failure: chack_agent_fix_master_failure:
# Temporarily disabled by maintainer request.
if: > if: >
${{ false && github.event.workflow_run.conclusion == 'failure' && ${{ github.event.workflow_run.conclusion == 'failure' &&
github.event.workflow_run.head_branch == 'master' && github.event.workflow_run.head_branch == 'master' &&
!startsWith(github.event.workflow_run.head_commit.message, 'Fix CI-master failures for run #') }} !startsWith(github.event.workflow_run.head_commit.message, 'Fix CI-master failures for run #') }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -98,11 +97,21 @@ jobs:
echo "Leave the repo in a state ready to commit; changes will be committed and pushed automatically." echo "Leave the repo in a state ready to commit; changes will be committed and pushed automatically."
} > chack_prompt.txt } > chack_prompt.txt
- name: Set up Node.js for Codex
uses: actions/setup-node@v5
with:
node-version: "20"
- name: Install Codex CLI
run: |
npm install -g @openai/codex
codex --version
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_chack
uses: carlospolop/chack-agent@master uses: carlospolop/chack-agent@master
with: with:
provider: openrouter provider: codex
model_primary: CHEAP_BUT_QUALITY model_primary: CHEAP_BUT_QUALITY
main_action: peass-ng main_action: peass-ng
sub_action: CI-master Failure Chack-Agent PR sub_action: CI-master Failure Chack-Agent PR
@@ -112,42 +121,77 @@ jobs:
prompt_file: chack_prompt.txt prompt_file: chack_prompt.txt
tools_config_json: "{\"exec_enabled\": true}" tools_config_json: "{\"exec_enabled\": true}"
session_config_json: "{\"long_term_memory_enabled\": false}" session_config_json: "{\"long_term_memory_enabled\": false}"
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}" agent_config_json: "{\"self_critique_enabled\": false, \"require_task_steps_manager_init_first\": true}"
openrouter_api_key: ${{ secrets.OPENROUTER_API_KEY }} openai_api_key: ${{ secrets.OPENAI_API_KEY }}
- name: Commit and push fix branch if changed - name: Commit and push fix branch if changed
id: push_fix id: push_fix
env:
ORIGINAL_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
run: | run: |
if git diff --quiet; then rm -f chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt
echo "No changes to commit."
pushed=false
if ! git diff --quiet; then
git add -A
# Avoid workflow-file pushes with token scopes that cannot write workflows.
git reset -- .github/workflows || true
git checkout -- .github/workflows || true
git clean -fdx -- .github/workflows || true
git reset -- chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt
if git diff --cached --name-only | grep -q '^.github/workflows/'; then
echo "Workflow-file changes are still staged; skipping push without workflows permission."
echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0
fi
if ! git diff --cached --quiet; then
git commit -m "Fix CI-master failures for run #${{ github.event.workflow_run.id }}"
fi
fi
after_head="$(git rev-parse HEAD)"
if [ "$after_head" = "$ORIGINAL_HEAD_SHA" ]; then
echo "No commit produced by Chack Agent."
echo "pushed=false" >> "$GITHUB_OUTPUT" echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0 exit 0
fi fi
rm -f chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt echo "Sanitizing Chack commit range to non-workflow changes only."
git add -A git diff --binary "$ORIGINAL_HEAD_SHA"..HEAD -- \
# Avoid workflow-file pushes with token scopes that cannot write workflows. . \
git reset -- .github/workflows || true ':(exclude).github/workflows/**' \
git checkout -- .github/workflows || true ':(exclude)chack_failure_summary.txt' \
git clean -fdx -- .github/workflows || true ':(exclude)chack_prompt.txt' \
git reset -- chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt ':(exclude)chack_failed_steps_logs.txt' > /tmp/chack_nonworkflow.patch
if git diff --cached --name-only | grep -q '^.github/workflows/'; then if [ ! -s /tmp/chack_nonworkflow.patch ]; then
echo "Workflow-file changes are still staged; skipping push without workflows permission." echo "Only workflow-file changes were produced; skipping push."
echo "pushed=false" >> "$GITHUB_OUTPUT" echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0 exit 0
fi fi
git reset --hard "$ORIGINAL_HEAD_SHA"
git apply --index /tmp/chack_nonworkflow.patch
rm -f chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt
git reset -- chack_failure_summary.txt chack_prompt.txt chack_failed_steps_logs.txt || true
if git diff --cached --quiet; then if git diff --cached --quiet; then
echo "No committable changes left after filtering." echo "No non-workflow changes left after sanitizing."
echo "pushed=false" >> "$GITHUB_OUTPUT" echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0 exit 0
fi fi
git commit -m "Fix CI-master failures for run #${{ github.event.workflow_run.id }}" git commit -m "Fix CI-master failures for run #${{ github.event.workflow_run.id }}"
if ! git push origin HEAD:"$FIX_BRANCH"; then if ! git push origin HEAD:"$FIX_BRANCH"; then
echo "Push failed (likely token workflow permission limits); skipping PR creation." echo "Push failed (likely token workflow permission limits); skipping PR creation."
echo "pushed=false" >> "$GITHUB_OUTPUT" echo "pushed=false" >> "$GITHUB_OUTPUT"
exit 0 exit 0
fi fi
echo "pushed=true" >> "$GITHUB_OUTPUT" pushed=true
if [ "$pushed" = "true" ]; then
echo "pushed=true" >> "$GITHUB_OUTPUT"
else
echo "pushed=false" >> "$GITHUB_OUTPUT"
fi
- name: Create PR to master - name: Create PR to master
if: ${{ steps.push_fix.outputs.pushed == 'true' }} if: ${{ steps.push_fix.outputs.pushed == 'true' }}
@@ -156,15 +200,34 @@ jobs:
GH_TOKEN: ${{ secrets.CHACK_AGENT_FIXER_TOKEN || github.token }} GH_TOKEN: ${{ secrets.CHACK_AGENT_FIXER_TOKEN || github.token }}
RUN_URL: ${{ github.event.workflow_run.html_url }} RUN_URL: ${{ github.event.workflow_run.html_url }}
run: | run: |
pr_url=$(gh pr create \ set +e
pr_output=$(gh pr create \
--title "Fix CI-master_test failure (run #${{ github.event.workflow_run.id }})" \ --title "Fix CI-master_test failure (run #${{ github.event.workflow_run.id }})" \
--body "Automated Chack Agent fix for failing CI-master_test run: ${RUN_URL}" \ --body "Automated Chack Agent fix for failing CI-master_test run: ${RUN_URL}" \
--base "$TARGET_BRANCH" \ --base "$TARGET_BRANCH" \
--head "$FIX_BRANCH") --head "$FIX_BRANCH" 2>&1)
echo "url=$pr_url" >> "$GITHUB_OUTPUT" rc=$?
set -e
if [ $rc -eq 0 ]; then
echo "url=$pr_output" >> "$GITHUB_OUTPUT"
echo "created=true" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "$pr_output"
if echo "$pr_output" | grep -qi "not permitted to create or approve pull requests"; then
echo "PR creation blocked by repository Actions policy. Fix branch was pushed: $FIX_BRANCH"
echo "url=" >> "$GITHUB_OUTPUT"
echo "created=false" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "Unexpected PR creation error."
exit $rc
- name: Comment on created PR with Chack Agent result - name: Comment on created PR with Chack Agent result
if: ${{ steps.push_fix.outputs.pushed == 'true' && steps.run_chack.outputs.final-message != '' }} if: ${{ steps.push_fix.outputs.pushed == 'true' && steps.create_pr.outputs.created == 'true' && steps.run_chack.outputs.final-message != '' }}
uses: actions/github-script@v7 uses: actions/github-script@v7
env: env:
PR_URL: ${{ steps.create_pr.outputs.url }} PR_URL: ${{ steps.create_pr.outputs.url }}

View File

@@ -7,12 +7,9 @@ on:
jobs: jobs:
resolve_pr_context: resolve_pr_context:
# Temporarily disabled by maintainer request.
if: > if: >
${{ false && github.event.workflow_run.conclusion == 'failure' && ${{ github.event.workflow_run.conclusion == 'failure' &&
github.event.workflow_run.pull_requests && !startsWith(github.event.workflow_run.head_commit.message || '', 'Fix CI failures for PR #') }}
github.event.workflow_run.pull_requests[0] &&
!startsWith(github.event.workflow_run.head_commit.message, 'Fix CI failures for PR #') }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
pull-requests: read pull-requests: read
@@ -28,8 +25,23 @@ jobs:
id: pr_context id: pr_context
env: env:
PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }}
HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}
run: | run: |
if [ -z "$PR_NUMBER" ] && [ -n "$HEAD_BRANCH" ]; then
PR_NUMBER="$(gh pr list --state open --head "$HEAD_BRANCH" --json number --jq '.[0].number')"
fi
if [ -z "$PR_NUMBER" ]; then
echo "No pull request found for workflow_run; skipping."
{
echo "number="
echo "author="
echo "head_repo="
echo "head_branch=${HEAD_BRANCH}"
echo "should_run=false"
} >> "$GITHUB_OUTPUT"
exit 0
fi
pr_author=$(gh api -H "Accept: application/vnd.github+json" \ pr_author=$(gh api -H "Accept: application/vnd.github+json" \
/repos/${{ github.repository }}/pulls/${PR_NUMBER} \ /repos/${{ github.repository }}/pulls/${PR_NUMBER} \
--jq '.user.login') --jq '.user.login')
@@ -58,14 +70,13 @@ jobs:
chack_agent_on_failure: chack_agent_on_failure:
needs: resolve_pr_context needs: resolve_pr_context
# Temporarily disabled by maintainer request. if: ${{ needs.resolve_pr_context.outputs.author == 'carlospolop' && needs.resolve_pr_context.outputs.should_run == 'true' }}
if: ${{ false && needs.resolve_pr_context.outputs.author == 'carlospolop' && needs.resolve_pr_context.outputs.should_run == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write
issues: write issues: write
actions: read actions: write
env: env:
CHACK_LOGS_HTTP_URL: ${{ secrets.CHACK_LOGS_HTTP_URL }} CHACK_LOGS_HTTP_URL: ${{ secrets.CHACK_LOGS_HTTP_URL }}
steps: steps:
@@ -156,11 +167,21 @@ jobs:
echo "Leave the repo in a state ready to commit as when you finish, it'll be automatically committed and pushed." echo "Leave the repo in a state ready to commit as when you finish, it'll be automatically committed and pushed."
} > chack_prompt.txt } > chack_prompt.txt
- name: Set up Node.js for Codex
uses: actions/setup-node@v5
with:
node-version: "20"
- name: Install Codex CLI
run: |
npm install -g @openai/codex
codex --version
- name: Run Chack Agent - name: Run Chack Agent
id: run_chack id: run_chack
uses: carlospolop/chack-agent@master uses: carlospolop/chack-agent@master
with: with:
provider: openrouter provider: codex
model_primary: CHEAP_BUT_QUALITY model_primary: CHEAP_BUT_QUALITY
main_action: peass-ng main_action: peass-ng
sub_action: PR Failure Chack-Agent Dispatch sub_action: PR Failure Chack-Agent Dispatch
@@ -171,38 +192,51 @@ jobs:
prompt_file: chack_prompt.txt prompt_file: chack_prompt.txt
tools_config_json: "{\"exec_enabled\": true}" tools_config_json: "{\"exec_enabled\": true}"
session_config_json: "{\"long_term_memory_enabled\": false}" session_config_json: "{\"long_term_memory_enabled\": false}"
agent_config_json: "{\"self_critique_enabled\": false, \"require_task_list_init_first\": true}" agent_config_json: "{\"self_critique_enabled\": false, \"require_task_steps_manager_init_first\": true}"
openrouter_api_key: ${{ secrets.OPENROUTER_API_KEY }} openai_api_key: ${{ secrets.OPENAI_API_KEY }}
- name: Commit and push if changed - name: Commit and push if changed
env: env:
TARGET_BRANCH: ${{ needs.resolve_pr_context.outputs.head_branch }} TARGET_BRANCH: ${{ needs.resolve_pr_context.outputs.head_branch }}
PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }} PR_NUMBER: ${{ needs.resolve_pr_context.outputs.number }}
ORIGINAL_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
GH_TOKEN: ${{ github.token }}
run: | run: |
if git diff --quiet; then
echo "No changes to commit."
exit 0
fi
rm -f chack_failure_summary.txt chack_prompt.txt rm -f chack_failure_summary.txt chack_prompt.txt
git add -A
# Avoid workflow-file pushes with token scopes that cannot write workflows. pushed=false
git reset -- .github/workflows || true
git checkout -- .github/workflows || true if ! git diff --quiet; then
git clean -fdx -- .github/workflows || true git add -A
git reset -- chack_failure_summary.txt chack_prompt.txt # Avoid workflow-file pushes with token scopes that cannot write workflows.
if git diff --cached --name-only | grep -q '^.github/workflows/'; then git reset -- .github/workflows || true
echo "Workflow-file changes are still staged; skipping push without workflows permission." git checkout -- .github/workflows || true
git clean -fdx -- .github/workflows || true
git reset -- chack_failure_summary.txt chack_prompt.txt
if git diff --cached --name-only | grep -q '^.github/workflows/'; then
echo "Workflow-file changes are still staged; skipping push without workflows permission."
exit 0
fi
if ! git diff --cached --quiet; then
git commit -m "Fix CI failures for PR #${PR_NUMBER}"
fi
fi
after_head="$(git rev-parse HEAD)"
if [ "$after_head" = "$ORIGINAL_HEAD_SHA" ]; then
echo "No commit produced by Chack Agent for PR #${PR_NUMBER}."
exit 0 exit 0
fi fi
if git diff --cached --quiet; then
echo "No committable changes left after filtering."
exit 0
fi
git commit -m "Fix CI failures for PR #${PR_NUMBER}"
if ! git push origin HEAD:${TARGET_BRANCH}; then if ! git push origin HEAD:${TARGET_BRANCH}; then
echo "Push failed (likely token workflow permission limits); leaving run successful without push." echo "Push failed (likely token workflow permission limits); leaving run successful without push."
exit 0 exit 0
fi fi
pushed=true
if [ "$pushed" = "true" ]; then
gh workflow run PR-tests.yml --ref "${TARGET_BRANCH}"
fi
- name: Comment with Chack Agent result - name: Comment with Chack Agent result
if: ${{ steps.run_chack.outputs.final-message != '' }} if: ${{ steps.run_chack.outputs.final-message != '' }}

View File

@@ -813,6 +813,12 @@ search:
bad_regex: "auth|accessfile=|secret=|user" bad_regex: "auth|accessfile=|secret=|user"
remove_regex: "^#|^@" remove_regex: "^#|^@"
type: f type: f
- name: "*"
value:
bad_regex: "nullok|nullok_secure|pam_permit\\.so|pam_rootok\\.so|pam_exec\\.so|pam_unix\\.so.*(nullok|remember=0)|sufficient\\s+pam_unix\\.so"
only_bad_lines: True
remove_regex: "^#|^@"
type: f
type: d type: d
search_in: search_in:
- ${ROOT_FOLDER}etc - ${ROOT_FOLDER}etc
@@ -1235,12 +1241,20 @@ search:
auto_check: False auto_check: False
files: files:
- name: "agent*" - name: "agent.*"
value: value:
type: f type: f
remove_path: ".dll" remove_path: ".dll"
search_in: search_in:
- ${ROOT_FOLDER}tmp - ${ROOT_FOLDER}tmp
- ${ROOT_FOLDER}run
- name: "ssh-agent.sock"
value:
type: f
search_in:
- ${ROOT_FOLDER}tmp
- ${ROOT_FOLDER}run
- name: SSH_CONFIG - name: SSH_CONFIG
value: value:
@@ -2067,6 +2081,45 @@ search:
type: f type: f
search_in: search_in:
- common - common
- name: "*.asc"
value:
type: f
remove_path: "/usr/share/|/usr/lib/|/lib/|/man/"
search_in:
- common
- name: "secring.gpg"
value:
type: f
search_in:
- common
- name: "pubring.kbx"
value:
type: f
search_in:
- common
- name: "trustdb.gpg"
value:
type: f
search_in:
- common
- name: "gpg-agent.conf"
value:
type: f
search_in:
- common
- name: "secret.asc"
value:
type: f
just_list_file: True
search_in:
- common
- name: "private-keys-v1.d/*.key" - name: "private-keys-v1.d/*.key"
value: value:
type: f type: f
@@ -2844,6 +2897,85 @@ search:
remove_path: "example" remove_path: "example"
search_in: search_in:
- common - common
- name: Proxy_Config
value:
config:
auto_check: True
files:
- name: "environment"
value:
bad_regex: "(http|https|ftp|all)_proxy|no_proxy"
only_bad_lines: True
remove_empty_lines: True
remove_regex: '^#'
type: f
check_extra_path: "^/etc/environment$"
search_in:
- common
- name: "apt.conf"
value:
bad_regex: "Acquire::http::Proxy|Acquire::https::Proxy|proxy"
only_bad_lines: True
remove_empty_lines: True
remove_regex: '^#'
type: f
search_in:
- common
- name: "apt.conf.d"
value:
type: d
files:
- name: "*"
value:
bad_regex: "Acquire::http::Proxy|Acquire::https::Proxy|proxy"
only_bad_lines: True
remove_empty_lines: True
remove_regex: '^#'
type: f
search_in:
- common
- name: Sniffing_Artifacts
value:
config:
auto_check: True
files:
- name: "*.pcap"
value:
just_list_file: True
type: f
search_in:
- common
- name: "*.pcapng"
value:
just_list_file: True
type: f
search_in:
- common
- name: "keys.log"
value:
bad_regex: "CLIENT_RANDOM|SERVER_HANDSHAKE_TRAFFIC_SECRET|CLIENT_HANDSHAKE_TRAFFIC_SECRET|EXPORTER_SECRET|RESUMPTION_MASTER_SECRET"
only_bad_lines: True
remove_empty_lines: True
type: f
search_in:
- common
- name: "sslkeylog.log"
value:
bad_regex: "CLIENT_RANDOM|SERVER_HANDSHAKE_TRAFFIC_SECRET|CLIENT_HANDSHAKE_TRAFFIC_SECRET|EXPORTER_SECRET|RESUMPTION_MASTER_SECRET"
only_bad_lines: True
remove_empty_lines: True
type: f
search_in:
- common
- name: Msmtprc - name: Msmtprc
value: value:
@@ -3948,6 +4080,13 @@ search:
search_in: search_in:
- common - common
- name: "*.maintenance*"
value:
just_list_file: True
type: f
search_in:
- common
- name: "*.key" - name: "*.key"
value: value:
just_list_file: True just_list_file: True

View File

@@ -36,6 +36,14 @@ print_2title "Container details"
print_list "Is this a container? ...........$NC $containerType" print_list "Is this a container? ...........$NC $containerType"
if [ -e "/proc/vz" ] && ! [ -e "/proc/bc" ]; then
print_list "Container Runtime ..............$NC OpenVZ"
fi
if [ -f "/run/systemd/container" ]; then
print_list "Systemd Container ..............$NC $(cat /run/systemd/container)"
fi
# Get container runtime info # Get container runtime info
if [ "$(command -v docker || echo -n '')" ]; then if [ "$(command -v docker || echo -n '')" ]; then
print_list "Docker version ...............$NC " print_list "Docker version ...............$NC "

View File

@@ -37,10 +37,10 @@
# - Container escape tool execution # - Container escape tool execution
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: checkContainerExploits, checkProcSysBreakouts, containerCheck, print_2title, print_3title, print_info, print_list, warn_exec # Functions Used: checkContainerExploits, checkProcSysBreakouts, containerCheck, enumerateDockerSockets, print_2title, print_3title, print_info, print_list, warn_exec
# Global Variables: $binfmt_misc_breakout, $containercapsB, $containerType, $core_pattern_breakout, $dev_mounted, $efi_efivars_writable, $efi_vars_writable, $GREP_IGNORE_MOUNTS, $inContainer, $kallsyms_readable, $kcore_readable, $kmem_readable, $kmem_writable, $kmsg_readable, $mem_readable, $mem_writable, $modprobe_present, $mountinfo_readable, $panic_on_oom_dos, $panic_sys_fs_dos, $proc_configgz_readable, $proc_mounted, $run_unshare, $release_agent_breakout1, $release_agent_breakout2, $release_agent_breakout3, $sched_debug_readable, $security_present, $security_writable, $sysreq_trigger_dos, $uevent_helper_breakout, $vmcoreinfo_readable, $VULN_CVE_2019_5021, $self_mem_readable # Global Variables: $binfmt_misc_breakout, $containercapsB, $containerType, $core_pattern_breakout, $dev_mounted, $efi_efivars_writable, $efi_vars_writable, $GREP_IGNORE_MOUNTS, $inContainer, $kallsyms_readable, $kcore_readable, $kmem_readable, $kmem_writable, $kmsg_readable, $mem_readable, $mem_writable, $modprobe_present, $mountinfo_readable, $panic_on_oom_dos, $panic_sys_fs_dos, $proc_configgz_readable, $proc_mounted, $run_unshare, $release_agent_breakout1, $release_agent_breakout2, $release_agent_breakout3, $sched_debug_readable, $security_present, $security_writable, $sysreq_trigger_dos, $uevent_helper_breakout, $vmcoreinfo_readable, $VULN_CVE_2019_5021, $self_mem_readable
# Initial Functions: containerCheck # Initial Functions: containerCheck
# Generated Global Variables: $defautl_docker_caps, $containerd_version, $runc_version, $containerd_version # Generated Global Variables: $defautl_docker_caps, $containerd_version, $runc_version, $seccomp_mode_num, $seccomp_mode_desc
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 0 # Small linpeas: 0
@@ -57,14 +57,34 @@ if [ "$inContainer" ]; then
# Security mechanisms # Security mechanisms
print_3title "Security Mechanisms" print_3title "Security Mechanisms"
print_list "Seccomp enabled? ............... "$NC seccomp_mode_num="$(awk '/^Seccomp:/{print $2}' /proc/self/status 2>/dev/null)"
([ "$(grep Seccomp /proc/self/status | grep -v 0)" ] && echo "enabled" || echo "disabled") | sed "s,disabled,${SED_RED}," | sed "s,enabled,${SED_GREEN}," seccomp_mode_desc="unknown"
case "$seccomp_mode_num" in
0) seccomp_mode_desc="disabled" ;;
1) seccomp_mode_desc="strict" ;;
2) seccomp_mode_desc="filtering" ;;
esac
print_list "Seccomp mode ................... "$NC
(printf "%s (%s)\n" "$seccomp_mode_desc" "${seccomp_mode_num:-?}") | sed "s,disabled,${SED_RED}," | sed "s,strict,${SED_RED_YELLOW}," | sed "s,filtering,${SED_GREEN},"
if grep -q "^Seccomp_filters:" /proc/self/status 2>/dev/null; then
print_list "Seccomp filters ............... "$NC
awk '/^Seccomp_filters:/{print $2}' /proc/self/status 2>/dev/null | sed -${E} "s,^[0-9]+$,${SED_GREEN}&,"
fi
print_list "AppArmor profile? .............. "$NC print_list "AppArmor profile? .............. "$NC
(cat /proc/self/attr/current 2>/dev/null || echo "disabled") | sed "s,disabled,${SED_RED}," | sed "s,kernel,${SED_GREEN}," (cat /proc/self/attr/current 2>/dev/null || echo "disabled") | sed "s,disabled,${SED_RED}," | sed "s,kernel,${SED_GREEN},"
print_list "User proc namespace? ........... "$NC print_list "User proc namespace? ........... "$NC
if [ "$(cat /proc/self/uid_map 2>/dev/null)" ]; then (printf "enabled"; cat /proc/self/uid_map) | sed "s,enabled,${SED_GREEN},"; else echo "disabled" | sed "s,disabled,${SED_RED},"; fi if [ "$(cat /proc/self/uid_map 2>/dev/null)" ]; then
(printf "enabled"; cat /proc/self/uid_map) | sed "s,enabled,${SED_GREEN},";
echo ""
echo " Mappings (Container -> Host -> Range):"
cat /proc/self/uid_map | awk '{print " " $1 " -> " $2 " -> " $3}'
else
echo "disabled" | sed "s,disabled,${SED_RED},";
fi
# Known vulnerabilities # Known vulnerabilities
print_3title "Known Vulnerabilities" print_3title "Known Vulnerabilities"
@@ -155,6 +175,9 @@ if [ "$inContainer" ]; then
cat /proc/self/status | tr '\t' ' ' | grep Cap | sed -${E} "s, .*,${SED_RED},g" | sed -${E} "s/00000000a80425fb/$defautl_docker_caps/g" | sed -${E} "s,0000000000000000|00000000a80425fb,${SED_GREEN},g" cat /proc/self/status | tr '\t' ' ' | grep Cap | sed -${E} "s, .*,${SED_RED},g" | sed -${E} "s/00000000a80425fb/$defautl_docker_caps/g" | sed -${E} "s,0000000000000000|00000000a80425fb,${SED_GREEN},g"
echo $ITALIC"Run capsh --decode=<hex> to decode the capabilities"$NC echo $ITALIC"Run capsh --decode=<hex> to decode the capabilities"$NC
fi fi
print_list "Ambient capabilities ........... "$NC
(grep "CapAmb:" /proc/self/status 2>/dev/null | grep -v "0000000000000000" | sed "s,CapAmb:.,," || echo "No") | sed -${E} "s,No,${SED_GREEN}," | sed -${E} "s,[0-9a-fA-F]\+,${SED_RED}&,"
# Additional capability checks # Additional capability checks
print_list "Dangerous syscalls allowed ... "$NC print_list "Dangerous syscalls allowed ... "$NC
@@ -200,6 +223,10 @@ if [ "$inContainer" ]; then
echo "No" echo "No"
fi fi
print_list "Looking and enumerating Docker Sockets (if any):\n"$NC
enumerateDockerSockets
# Additional breakout vectors # Additional breakout vectors
print_3title "Additional Breakout Vectors" print_3title "Additional Breakout Vectors"

View File

@@ -17,7 +17,7 @@
# Functions Used: print_2title, print_list, echo_not_found # Functions Used: print_2title, print_list, echo_not_found
# Global Variables: $SEARCH_IN_FOLDER, $Wfolders, $SED_RED, $SED_RED_YELLOW, $NC # Global Variables: $SEARCH_IN_FOLDER, $Wfolders, $SED_RED, $SED_RED_YELLOW, $NC
# Initial Functions: # Initial Functions:
# Generated Global Variables: $WRITABLESYSTEMDPATH, $line, $service, $file, $version, $user, $caps, $path, $path_line, $service_file, $exec_line, $exec_value, $cmd, $cmd_path # Generated Global Variables: $WRITABLESYSTEMDPATH, $line, $service, $file, $version, $user, $caps, $path, $path_line, $service_file, $exec_line, $exec_value, $cmd, $cmd_path, $svc_path_entry, $svc_writable_path
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -113,6 +113,19 @@ if ! [ "$SEARCH_IN_FOLDER" ]; then
service=$(echo "$line" | awk '{print $1}') service=$(echo "$line" | awk '{print $1}')
service_file=$(get_service_file "$service") service_file=$(get_service_file "$service")
if [ -n "$service_file" ]; then if [ -n "$service_file" ]; then
# Check service-specific PATH entries (Environment=PATH=...)
svc_writable_path=$(grep -E '^Environment=.*PATH=' "$service_file" 2>/dev/null | sed -E 's/^Environment=//; s/^"//; s/"$//; s/^PATH=//' | tr ':' '\n' | while read -r svc_path_entry; do
[ -z "$svc_path_entry" ] && continue
if [ -d "$svc_path_entry" ] && [ -w "$svc_path_entry" ]; then
echo "$svc_path_entry"
fi
done)
if [ "$svc_writable_path" ]; then
for svc_path_entry in $svc_writable_path; do
echo "$service: Writable service PATH entry '$svc_path_entry'" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
done
fi
# Check ExecStart paths # Check ExecStart paths
grep -E "ExecStart|ExecStartPre|ExecStartPost" "$service_file" 2>/dev/null | grep -E "ExecStart|ExecStartPre|ExecStartPost" "$service_file" 2>/dev/null |
while read -r exec_line; do while read -r exec_line; do
@@ -130,6 +143,9 @@ if ! [ "$SEARCH_IN_FOLDER" ]; then
# Check for relative paths only in the command, not arguments # Check for relative paths only in the command, not arguments
if [ -n "$cmd_path" ] && [ "${cmd_path#/}" = "$cmd_path" ] && [ "${cmd_path#\$}" = "$cmd_path" ]; then if [ -n "$cmd_path" ] && [ "${cmd_path#/}" = "$cmd_path" ] && [ "${cmd_path#\$}" = "$cmd_path" ]; then
echo "$service: Uses relative path '$cmd_path' (from $exec_line)" | sed -${E} "s,.*,${SED_RED},g" echo "$service: Uses relative path '$cmd_path' (from $exec_line)" | sed -${E} "s,.*,${SED_RED},g"
if [ "$svc_writable_path" ]; then
echo "$service: Relative Exec path + writable service PATH can allow path hijacking" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
fi
fi fi
done done
fi fi

View File

@@ -11,7 +11,7 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.1 # Version: 1.1
# Functions Used: print_2title, print_info # Functions Used: print_2title, print_info
# Global Variables: $EXTRA_CHECKS, $groupsB, $groupsVB, $IAMROOT, $idB, $knw_grps, $knw_usrs, $nosh_usrs, $SEARCH_IN_FOLDER, $sh_usrs, $USER, $SED_RED, $SED_GREEN, $NC, $RED # Global Variables: $EXTRA_CHECKS, $groupsB, $groupsVB, $IAMROOT, $idB, $knw_grps, $knw_usrs, $nosh_usrs, $SEARCH_IN_FOLDER, $sh_usrs, $USER, $SED_RED, $SED_GREEN, $SED_RED_YELLOW, $NC, $RED
# Initial Functions: # Initial Functions:
# Generated Global Variables: $unix_scks_list, $unix_scks_list2, $perms, $owner, $owner_info, $response, $socket, $cmd, $mode, $group # Generated Global Variables: $unix_scks_list, $unix_scks_list2, $perms, $owner, $owner_info, $response, $socket, $cmd, $mode, $group
# Fat linpeas: 0 # Fat linpeas: 0
@@ -142,10 +142,13 @@ if ! [ "$IAMROOT" ]; then
# Highlight dangerous ownership # Highlight dangerous ownership
if echo "$owner_info" | grep -q "root"; then if echo "$owner_info" | grep -q "root"; then
echo " └─(${RED}Owned by root${NC})" echo " └─(${RED}Owned by root${NC})"
if echo "$perms" | grep -q "Write"; then
echo " └─High risk: root-owned and writable Unix socket" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
fi
fi fi
fi fi
fi fi
done done
fi fi
echo "" echo ""
fi fi

View File

@@ -5,10 +5,10 @@
# Description: Check for internet access # Description: Check for internet access
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: check_dns, check_icmp, check_tcp_443, check_tcp_443_bin, check_tcp_80, print_2title, check_external_hostname # Functions Used: check_dns, check_icmp, check_tcp_443, check_tcp_443_bin, check_tcp_80, print_2title, print_3title, print_info, check_external_hostname
# Global Variables: # Global Variables: $E
# Initial Functions: # Initial Functions:
# Generated Global Variables: $pid4, $pid2, $pid1, $pid3, $$tcp443_bin_status, $NOT_CHECK_EXTERNAL_HOSTNAME, $TIMEOUT_INTERNET_SECONDS # Generated Global Variables: $pid4, $pid2, $pid1, $pid3, $tcp443_bin_status, $NOT_CHECK_EXTERNAL_HOSTNAME, $TIMEOUT_INTERNET_SECONDS
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 0 # Small linpeas: 0
@@ -29,8 +29,8 @@ check_tcp_443 "$TIMEOUT_INTERNET_SECONDS" 2>/dev/null & pid2=$!
check_icmp "$TIMEOUT_INTERNET_SECONDS" 2>/dev/null & pid3=$! check_icmp "$TIMEOUT_INTERNET_SECONDS" 2>/dev/null & pid3=$!
check_dns "$TIMEOUT_INTERNET_SECONDS" 2>/dev/null & pid4=$! check_dns "$TIMEOUT_INTERNET_SECONDS" 2>/dev/null & pid4=$!
# Kill all after 10 seconds # Kill all check workers after timeout + 1s without relying on integer arithmetic
(sleep $(( $TIMEOUT_INTERNET_SECONDS + 1 )) && kill -9 $pid1 $pid2 $pid3 $pid4 2>/dev/null) & (sleep "$TIMEOUT_INTERNET_SECONDS"; sleep 1; kill -9 $pid1 $pid2 $pid3 $pid4 2>/dev/null) &
check_tcp_443_bin $TIMEOUT_INTERNET_SECONDS 2>/dev/null check_tcp_443_bin $TIMEOUT_INTERNET_SECONDS 2>/dev/null
tcp443_bin_status=$? tcp443_bin_status=$?
@@ -50,3 +50,9 @@ if [ "$tcp443_bin_status" -eq 0 ] && \
fi fi
echo "" echo ""
print_3title "Proxy discovery"
print_info "Checking common proxy env vars and apt proxy config"
(env | grep -iE '^(http|https|ftp|all)_proxy=|^no_proxy=') 2>/dev/null | sed -${E} "s,_proxy|no_proxy,${SED_RED_YELLOW},g"
grep -RinE 'Acquire::(http|https)::Proxy|proxy' /etc/apt/apt.conf /etc/apt/apt.conf.d 2>/dev/null | sed -${E} "s,proxy|Acquire::http::Proxy|Acquire::https::Proxy,${SED_RED_YELLOW},g"
echo ""

View File

@@ -5,8 +5,8 @@
# Description: Check network interfaces # Description: Check network interfaces
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: print_2title # Functions Used: print_2title, print_3title
# Global Variables: # Global Variables: $E, $SED_RED_YELLOW
# Initial Functions: # Initial Functions:
# Generated Global Variables: $iface, $state, $mac, $ip_file, $line # Generated Global Variables: $iface, $state, $mac, $ip_file, $line
# Fat linpeas: 0 # Fat linpeas: 0
@@ -73,4 +73,22 @@ else
parse_network_interfaces parse_network_interfaces
fi fi
echo "" if command -v ip >/dev/null 2>&1; then
print_3title "Routing & policy quick view"
ip route 2>/dev/null
ip -6 route 2>/dev/null | head -n 30
echo ""
ip rule 2>/dev/null
print_3title "Virtual/overlay interfaces quick view"
ip -d link 2>/dev/null | grep -E "^[0-9]+:|veth|docker|cni|flannel|br-|bridge|vlan|bond|tun|tap|wg|tailscale" | sed -${E} "s,veth|docker|cni|flannel|br-|bridge|vlan|bond|tun|tap|wg|tailscale,${SED_RED_YELLOW},g"
print_3title "Network namespaces quick view"
ip netns list 2>/dev/null
ls -la /var/run/netns/ 2>/dev/null
fi
print_3title "Forwarding status"
sysctl net.ipv4.ip_forward net.ipv6.conf.all.forwarding 2>/dev/null | sed -${E} "s,=[[:space:]]*1,${SED_RED_YELLOW},g"
echo ""

View File

@@ -6,7 +6,7 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: print_2title, print_3title, print_info # Functions Used: print_2title, print_3title, print_info
# Global Variables: $E, $SED_RED # Global Variables: $E, $SED_RED, $SED_RED_YELLOW
# Initial Functions: # Initial Functions:
# Generated Global Variables: $pid_dir, $tx_queue, $pid, $rem_port, $proc_file, $rem_ip, $local_ip, $rx_queue, $proto, $rem_addr, $program, $state, $header_sep, $proc_info, $inode, $header, $line, $local_addr, $local_port # Generated Global Variables: $pid_dir, $tx_queue, $pid, $rem_port, $proc_file, $rem_ip, $local_ip, $rx_queue, $proto, $rem_addr, $program, $state, $header_sep, $proc_info, $inode, $header, $line, $local_addr, $local_port
# Fat linpeas: 0 # Fat linpeas: 0
@@ -122,6 +122,45 @@ get_open_ports() {
parse_proc_net_ports "udp" parse_proc_net_ports "udp"
fi fi
# Focused local service exposure view
print_3title "Local-only listeners (loopback)"
if command -v ss >/dev/null 2>&1; then
ss -nltpu 2>/dev/null | grep -E "127\.0\.0\.1:|::1:" | sed -${E} "s,127\.0\.0\.1:|::1:,${SED_RED},g"
elif command -v netstat >/dev/null 2>&1; then
netstat -punta 2>/dev/null | grep -i listen | grep -E "127\.0\.0\.1:|::1:" | sed -${E} "s,127\.0\.0\.1:|::1:,${SED_RED},g"
fi
print_3title "Unique listener bind addresses"
if command -v ss >/dev/null 2>&1; then
ss -nltpuH 2>/dev/null | awk '{
a=$5
if (a ~ /^\[/) {
sub(/^\[/, "", a)
sub(/\]:[0-9]+$/, "", a)
} else if (a ~ /:[0-9]+$/) {
sub(/:[0-9]+$/, "", a)
}
sub(/^::ffff:/, "", a)
if (a != "") print a
}' | sort -u | sed -${E} "s,127\.0\.0\.1|::1,${SED_RED},g"
elif command -v netstat >/dev/null 2>&1; then
netstat -punta 2>/dev/null | grep -i listen | awk '{
a=$4
if (a ~ /^\[/) {
sub(/^\[/, "", a)
sub(/\]:[0-9]+$/, "", a)
} else if (a ~ /:[0-9]+$/) {
sub(/:[0-9]+$/, "", a)
}
if (a == ":::" ) a="::"
sub(/^::ffff:/, "", a)
if (a != "") print a
}' | sort -u | sed -${E} "s,127\.0\.0\.1|::1,${SED_RED},g"
fi
print_3title "Potential local forwarders/relays"
ps aux 2>/dev/null | grep -E "[s]ocat|[s]sh .*(-L|-R|-D)|[n]cat|[n]c .*-l" | sed -${E} "s,socat|ssh|-L|-R|-D|ncat|nc,${SED_RED_YELLOW},g"
# Additional port information # Additional port information
if [ "$EXTRA_CHECKS" ] || [ "$DEBUG" ]; then if [ "$EXTRA_CHECKS" ] || [ "$DEBUG" ]; then
print_3title "Additional Port Information" print_3title "Additional Port Information"

View File

@@ -6,9 +6,9 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: print_2title, print_3title, print_info, warn_exec # Functions Used: print_2title, print_3title, print_info, warn_exec
# Global Variables: $EXTRA_CHECKS, $E, $SED_RED, $SED_GREEN # Global Variables: $EXTRA_CHECKS, $E, $SED_RED, $SED_GREEN, $SED_RED_YELLOW
# Initial Functions: # Initial Functions:
# Generated Global Variables: $tools_found, $tool, $interfaces, $interfaces_found, $iface, $cmd, $pattern, $patterns # Generated Global Variables: $tools_found, $tool, $interfaces, $interfaces_found, $iface, $cmd, $pattern, $patterns, $dumpcap_test_file
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -26,8 +26,17 @@ check_command() {
# Function to check if we can sniff on an interface # Function to check if we can sniff on an interface
check_interface_sniffable() { check_interface_sniffable() {
local iface=$1 local iface=$1
if timeout 1 tcpdump -i "$iface" -c 1 >/dev/null 2>&1; then if check_command tcpdump; then
return 0 if timeout 1 tcpdump -i "$iface" -c 1 >/dev/null 2>&1; then
return 0
fi
elif check_command dumpcap; then
dumpcap_test_file="/tmp/.linpeas_dumpcap_test_$$.pcap"
if timeout 2 dumpcap -i "$iface" -c 1 -q -w "$dumpcap_test_file" >/dev/null 2>&1; then
rm -f "$dumpcap_test_file" 2>/dev/null
return 0
fi
rm -f "$dumpcap_test_file" 2>/dev/null
fi fi
return 1 return 1
} }
@@ -55,6 +64,20 @@ check_network_traffic_analysis() {
tools_found=1 tools_found=1
# Check tcpdump version and capabilities # Check tcpdump version and capabilities
warn_exec tcpdump --version 2>/dev/null | head -n 1 warn_exec tcpdump --version 2>/dev/null | head -n 1
getcap "$(command -v tcpdump)" 2>/dev/null
fi
if check_command dumpcap; then
echo "dumpcap is available" | sed -${E} "s,.*,${SED_GREEN},g"
tools_found=1
warn_exec dumpcap --version 2>/dev/null | head -n 1
getcap "$(command -v dumpcap)" 2>/dev/null
if id -nG 2>/dev/null | grep -qw wireshark; then
echo "Current user is in wireshark group" | sed -${E} "s,.*,${SED_GREEN},g"
elif getent group wireshark >/dev/null 2>&1; then
echo "wireshark group exists but current user is not in it" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
fi
fi fi
if check_command tshark; then if check_command tshark; then
@@ -68,10 +91,28 @@ check_network_traffic_analysis() {
echo "wireshark is available" | sed -${E} "s,.*,${SED_GREEN},g" echo "wireshark is available" | sed -${E} "s,.*,${SED_GREEN},g"
tools_found=1 tools_found=1
fi fi
if check_command ngrep; then
echo "ngrep is available" | sed -${E} "s,.*,${SED_GREEN},g"
tools_found=1
fi
if check_command tcpflow; then
echo "tcpflow is available" | sed -${E} "s,.*,${SED_GREEN},g"
tools_found=1
fi
if [ $tools_found -eq 0 ]; then if [ $tools_found -eq 0 ]; then
echo "No sniffing tools found" | sed -${E} "s,.*,${SED_RED},g" echo "No sniffing tools found" | sed -${E} "s,.*,${SED_RED},g"
fi fi
if check_command tcpdump; then
echo "Sniffable interfaces according to tcpdump -D:"
timeout 2 tcpdump -D 2>/dev/null
elif check_command dumpcap; then
echo "Sniffable interfaces according to dumpcap -D:"
timeout 2 dumpcap -D 2>/dev/null
fi
# Check network interfaces # Check network interfaces
echo "" echo ""
@@ -88,25 +129,28 @@ check_network_traffic_analysis() {
fi fi
for iface in $interfaces; do for iface in $interfaces; do
if [ "$iface" != "lo" ]; then # Skip loopback if [ "$iface" = "lo" ]; then
echo -n "Interface $iface (loopback): "
else
echo -n "Interface $iface: " echo -n "Interface $iface: "
if check_interface_sniffable "$iface"; then fi
echo "Sniffable" | sed -${E} "s,.*,${SED_GREEN},g"
interfaces_found=1 if check_interface_sniffable "$iface"; then
echo "Sniffable" | sed -${E} "s,.*,${SED_GREEN},g"
# Check promiscuous mode interfaces_found=1
if check_promiscuous_mode "$iface"; then
echo " - Promiscuous mode enabled" | sed -${E} "s,.*,${SED_RED},g" # Check promiscuous mode
fi if [ "$iface" != "lo" ] && check_promiscuous_mode "$iface"; then
echo " - Promiscuous mode enabled" | sed -${E} "s,.*,${SED_RED},g"
# Get interface details
if [ "$EXTRA_CHECKS" ]; then
echo " - Interface details:"
warn_exec ip addr show "$iface" 2>/dev/null || ifconfig "$iface" 2>/dev/null
fi
else
echo "Not sniffable" | sed -${E} "s,.*,${SED_RED},g"
fi fi
# Get interface details
if [ "$EXTRA_CHECKS" ]; then
echo " - Interface details:"
warn_exec ip addr show "$iface" 2>/dev/null || ifconfig "$iface" 2>/dev/null
fi
else
echo "Not sniffable" | sed -${E} "s,.*,${SED_RED},g"
fi fi
done done
@@ -145,7 +189,12 @@ check_network_traffic_analysis() {
print_info "To capture sensitive traffic, you can use:" print_info "To capture sensitive traffic, you can use:"
echo "tcpdump -i <interface> -w capture.pcap" | sed -${E} "s,.*,${SED_GREEN},g" echo "tcpdump -i <interface> -w capture.pcap" | sed -${E} "s,.*,${SED_GREEN},g"
echo "tshark -i <interface> -w capture.pcap" | sed -${E} "s,.*,${SED_GREEN},g" echo "tshark -i <interface> -w capture.pcap" | sed -${E} "s,.*,${SED_GREEN},g"
echo "dumpcap -i <interface> -w capture.pcap" | sed -${E} "s,.*,${SED_GREEN},g"
fi fi
echo ""
print_3title "Running sniffing/traffic reconstruction processes"
ps aux 2>/dev/null | grep -E "[t]cpdump|[d]umpcap|[t]shark|[w]ireshark|[n]grep|[t]cpflow" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
# Additional information # Additional information
if [ "$EXTRA_CHECKS" ]; then if [ "$EXTRA_CHECKS" ]; then

View File

@@ -6,9 +6,9 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: print_2title, print_3title, warn_exec, echo_not_found # Functions Used: print_2title, print_3title, warn_exec, echo_not_found
# Global Variables: $EXTRA_CHECKS, $E, $SED_RED, $SED_GREEN, $SED_YELLOW # Global Variables: $EXTRA_CHECKS, $E, $SED_RED, $SED_GREEN, $SED_YELLOW, $SED_RED_YELLOW
# Initial Functions: # Initial Functions:
# Generated Global Variables: $rules_file, $cmd, $tool, $config_file # Generated Global Variables: $rules_file, $cmd, $tool, $config_file, $sysctl_var
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -90,6 +90,9 @@ analyze_nftables() {
# List all rules # List all rules
echo -e "\nNftables Ruleset:" echo -e "\nNftables Ruleset:"
warn_exec nft list ruleset 2>/dev/null warn_exec nft list ruleset 2>/dev/null
echo -e "\nNftables Ruleset with handles (-a):"
warn_exec nft -a list ruleset 2>/dev/null | sed -${E} "s,\\bdrop\\b|\\breject\\b|handle [0-9]+,${SED_RED_YELLOW},g"
# Check for saved rules # Check for saved rules
echo -e "\nSaved Rules:" echo -e "\nSaved Rules:"
@@ -180,6 +183,17 @@ analyze_firewall_rules() {
analyze_nftables analyze_nftables
analyze_firewalld analyze_firewalld
analyze_ufw analyze_ufw
echo ""
print_3title "Forwarding and rp_filter"
for sysctl_var in net.ipv4.ip_forward net.ipv6.conf.all.forwarding net.ipv4.conf.all.rp_filter; do
sysctl "$sysctl_var" 2>/dev/null | sed -${E} "s,=[[:space:]]*1,${SED_RED_YELLOW},g"
done
if check_command conntrack; then
echo -e "\nConntrack state (first 20):"
warn_exec conntrack -L 2>/dev/null | head -n 20
fi
# Additional checks if EXTRA_CHECKS is enabled # Additional checks if EXTRA_CHECKS is enabled
if [ "$EXTRA_CHECKS" ]; then if [ "$EXTRA_CHECKS" ]; then
@@ -207,4 +221,4 @@ analyze_firewall_rules() {
} }
# Run the main function # Run the main function
analyze_firewall_rules analyze_firewall_rules

View File

@@ -34,6 +34,9 @@ if ! [ "$IAMROOT" ] && [ -w '/etc/sudoers.d/' ]; then
echo "You can create a file in /etc/sudoers.d/ and escalate privileges" | sed -${E} "s,.*,${SED_RED_YELLOW}," echo "You can create a file in /etc/sudoers.d/ and escalate privileges" | sed -${E} "s,.*,${SED_RED_YELLOW},"
fi fi
for f in /etc/sudoers.d/*; do for f in /etc/sudoers.d/*; do
if [ -w "$f" ]; then
echo "Sudoers file: $f is writable and may allow privilege escalation" | sed -${E} "s,.*,${SED_RED_YELLOW},g"
fi
if [ -r "$f" ]; then if [ -r "$f" ]; then
echo "Sudoers file: $f is readable" | sed -${E} "s,.*,${SED_RED},g" echo "Sudoers file: $f is readable" | sed -${E} "s,.*,${SED_RED},g"
grep -Iv "^$" "$f" | grep -v "#" | sed "s,_proxy,${SED_RED},g" | sed "s,$sudoG,${SED_GREEN},g" | sed -${E} "s,$sudoVB1,${SED_RED_YELLOW}," | sed -${E} "s,$sudoVB2,${SED_RED_YELLOW}," | sed -${E} "s,$sudoB,${SED_RED},g" | sed "s,pwfeedback,${SED_RED},g" grep -Iv "^$" "$f" | grep -v "#" | sed "s,_proxy,${SED_RED},g" | sed "s,$sudoG,${SED_GREEN},g" | sed -${E} "s,$sudoVB1,${SED_RED_YELLOW}," | sed -${E} "s,$sudoVB2,${SED_RED_YELLOW}," | sed -${E} "s,$sudoB,${SED_RED},g" | sed "s,pwfeedback,${SED_RED},g"

View File

@@ -8,12 +8,12 @@
# Functions Used: print_2title, print_info # Functions Used: print_2title, print_info
# Global Variables:$DEBUG, $SEARCH_IN_FOLDER, $USER, $wgroups # Global Variables:$DEBUG, $SEARCH_IN_FOLDER, $USER, $wgroups
# Initial Functions: # Initial Functions:
# Generated Global Variables: $screensess, $screensess2 # Generated Global Variables: $screensess, $screensess2, $uscreen
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
if ([ "$screensess" ] || [ "$screensess2" ] || [ "$DEBUG" ]) && ! [ "$SEARCH_IN_FOLDER" ]; then if (command -v screen >/dev/null 2>&1 || [ -d "/run/screen" ] || [ "$DEBUG" ]) && ! [ "$SEARCH_IN_FOLDER" ]; then
print_2title "Searching screen sessions" print_2title "Searching screen sessions"
print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#open-shell-sessions" print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#open-shell-sessions"
screensess=$(screen -ls 2>/dev/null) screensess=$(screen -ls 2>/dev/null)
@@ -25,5 +25,16 @@ if ([ "$screensess" ] || [ "$screensess2" ] || [ "$DEBUG" ]) && ! [ "$SEARCH_IN_
find /run/screen -type s -path "/run/screen/S-*" -not -user $USER '(' '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null | while read f; do find /run/screen -type s -path "/run/screen/S-*" -not -user $USER '(' '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null | while read f; do
echo "Other user screen socket is writable: $f" | sed "s,$f,${SED_RED_YELLOW}," echo "Other user screen socket is writable: $f" | sed "s,$f,${SED_RED_YELLOW},"
done done
if [ -r "/etc/passwd" ]; then
print_3title "Checking other users screen sessions"
cut -d: -f1,7 /etc/passwd 2>/dev/null | grep "sh$" | cut -d: -f1 | grep -v "^$USER$" | while read u; do
uscreen=$(screen -ls "${u}/" 2>/dev/null | grep -v "No Sockets found" | grep -v "^$")
if [ "$uscreen" ]; then
echo "User $u screen sessions:"
printf "%s\n" "$uscreen" | sed -${E} "s,.*,${SED_RED},"
fi
done
fi
echo "" echo ""
fi fi

View File

@@ -8,7 +8,7 @@
# Functions Used: print_2title, print_3title # Functions Used: print_2title, print_3title
# Global Variables: $HOME, $HOMESEARCH, $ROOT_FOLDER, $SEARCH_IN_FOLDER, $TIMEOUT, $USER, $wgroups # Global Variables: $HOME, $HOMESEARCH, $ROOT_FOLDER, $SEARCH_IN_FOLDER, $TIMEOUT, $USER, $wgroups
# Initial Functions: # Initial Functions:
# Generated Global Variables: $certsb4_grep, $hostsallow, $hostsdenied, $sshconfig, $writable_agents, $privatekeyfilesetc, $privatekeyfileshome, $privatekeyfilesroot, $privatekeyfilesmnt, # Generated Global Variables: $certsb4_grep, $hostsallow, $hostsdenied, $sshconfig, $writable_agents, $agent_sockets, $privatekeyfilesetc, $privatekeyfileshome, $privatekeyfilesroot, $privatekeyfilesmnt,
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -19,12 +19,18 @@ if ! [ "$SEARCH_IN_FOLDER" ]; then
sshconfig="$(ls /etc/ssh/ssh_config 2>/dev/null)" sshconfig="$(ls /etc/ssh/ssh_config 2>/dev/null)"
hostsdenied="$(ls /etc/hosts.denied 2>/dev/null)" hostsdenied="$(ls /etc/hosts.denied 2>/dev/null)"
hostsallow="$(ls /etc/hosts.allow 2>/dev/null)" hostsallow="$(ls /etc/hosts.allow 2>/dev/null)"
writable_agents=$(find /tmp /etc /home -type s -name "agent.*" -or -name "*gpg-agent*" '(' '(' -user $USER ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null) agent_sockets=$(find /run/user /tmp -type s \( -path "/run/user/*/ssh-*/agent.*" -o -name "ssh-agent.sock" -o -path "/tmp/ssh-*" \) 2>/dev/null)
writable_agents=$(find /tmp /etc /home /run/user \
\( -type s -a \( -name "agent.*" -o -name "ssh-agent.sock" -o -path "*/ssh-*/agent.*" -o -name "*gpg-agent*" \) \
-a \( \( -user "$USER" \) -o \( -perm -o=w \) -o \( -perm -g=w -a \( $wgroups \) \) \) \) 2>/dev/null)
else else
sshconfig="$(ls ${ROOT_FOLDER}etc/ssh/ssh_config 2>/dev/null)" sshconfig="$(ls ${ROOT_FOLDER}etc/ssh/ssh_config 2>/dev/null)"
hostsdenied="$(ls ${ROOT_FOLDER}etc/hosts.denied 2>/dev/null)" hostsdenied="$(ls ${ROOT_FOLDER}etc/hosts.denied 2>/dev/null)"
hostsallow="$(ls ${ROOT_FOLDER}etc/hosts.allow 2>/dev/null)" hostsallow="$(ls ${ROOT_FOLDER}etc/hosts.allow 2>/dev/null)"
writable_agents=$(find ${ROOT_FOLDER} -type s -name "agent.*" -or -name "*gpg-agent*" '(' '(' -user $USER ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null) agent_sockets=$(find "${ROOT_FOLDER}"tmp "${ROOT_FOLDER}"run -type s \( -name "agent.*" -o -name "ssh-agent.sock" \) 2>/dev/null)
writable_agents=$(find "${ROOT_FOLDER}" \
\( -type s -a \( -name "agent.*" -o -name "ssh-agent.sock" -o -path "*/ssh-*/agent.*" -o -name "*gpg-agent*" \) \
-a \( \( -user "$USER" \) -o \( -perm -o=w \) -o \( -perm -g=w -a \( $wgroups \) \) \) \) 2>/dev/null)
fi fi
peass{SSH} peass{SSH}
@@ -58,7 +64,7 @@ fi
if [ "$certsb4_grep" ] || [ "$PSTORAGE_CERTSBIN" ]; then if [ "$certsb4_grep" ] || [ "$PSTORAGE_CERTSBIN" ]; then
print_3title "Some certificates were found (out limited):" print_3title "Some certificates were found (out limited):"
printf "$certsb4_grep\n" | head -n 20 printf "$certsb4_grep\n" | head -n 20
printf "$$PSTORAGE_CERTSBIN\n" | head -n 20 printf "$PSTORAGE_CERTSBIN\n" | head -n 20
echo "" echo ""
fi fi
if [ "$PSTORAGE_CERTSCLIENT" ]; then if [ "$PSTORAGE_CERTSCLIENT" ]; then
@@ -71,6 +77,11 @@ if [ "$PSTORAGE_SSH_AGENTS" ]; then
printf "$PSTORAGE_SSH_AGENTS\n" printf "$PSTORAGE_SSH_AGENTS\n"
echo "" echo ""
fi fi
if [ "$agent_sockets" ]; then
print_3title "Potential SSH agent sockets were found:"
printf "%s\n" "$agent_sockets" | sed -${E} "s,.*,${SED_RED},"
echo ""
fi
if ssh-add -l 2>/dev/null | grep -qv 'no identities'; then if ssh-add -l 2>/dev/null | grep -qv 'no identities'; then
print_3title "Listing SSH Agents" print_3title "Listing SSH Agents"
ssh-add -l ssh-add -l

View File

@@ -23,6 +23,7 @@ if ! [ "$STRACE" ]; then
fi fi
suids_files=$(find $ROOT_FOLDER -perm -4000 -type f ! -path "/dev/*" 2>/dev/null) suids_files=$(find $ROOT_FOLDER -perm -4000 -type f ! -path "/dev/*" 2>/dev/null)
printf "%s\n" "$suids_files" | while read s; do printf "%s\n" "$suids_files" | while read s; do
[ -z "$s" ] && continue
s=$(ls -lahtr "$s") s=$(ls -lahtr "$s")
#If starts like "total 332K" then no SUID bin was found and xargs just executed "ls" in the current folder #If starts like "total 332K" then no SUID bin was found and xargs just executed "ls" in the current folder
if echo "$s" | grep -qE "^total"; then break; fi if echo "$s" | grep -qE "^total"; then break; fi
@@ -59,6 +60,8 @@ printf "%s\n" "$suids_files" | while read s; do
if [ -O "$sline_first" ] || [ -w "$sline_first" ]; then #And modifiable if [ -O "$sline_first" ] || [ -w "$sline_first" ]; then #And modifiable
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can modify it (strings line: $sline) (https://tinyurl.com/suidpath)\n" printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can modify it (strings line: $sline) (https://tinyurl.com/suidpath)\n"
fi fi
elif echo "$sline_first" | grep -q "/" && [ -d "$(dirname "$sline_first")" ] && [ -w "$(dirname "$sline_first")" ]; then #If path does not exist but can be created
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can create it inside writable dir $RED$(dirname "$sline_first")$NC$ITALIC (strings line: $sline) (https://tinyurl.com/suidpath)\n"
else #If not a path else #If not a path
if [ ${#sline_first} -gt 2 ] && command -v "$sline_first" 2>/dev/null | grep -q '/' && echo "$sline_first" | grep -Eqv "\.\."; then #Check if existing binary if [ ${#sline_first} -gt 2 ] && command -v "$sline_first" 2>/dev/null | grep -q '/' && echo "$sline_first" | grep -Eqv "\.\."; then #Check if existing binary
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is executing $RED$sline_first$NC$ITALIC and you can impersonate it (strings line: $sline) (https://tinyurl.com/suidpath)\n" printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is executing $RED$sline_first$NC$ITALIC and you can impersonate it (strings line: $sline) (https://tinyurl.com/suidpath)\n"

View File

@@ -17,6 +17,7 @@ print_2title "SGID"
print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#sudo-and-suid" print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#sudo-and-suid"
sgids_files=$(find $ROOT_FOLDER -perm -2000 -type f ! -path "/dev/*" 2>/dev/null) sgids_files=$(find $ROOT_FOLDER -perm -2000 -type f ! -path "/dev/*" 2>/dev/null)
printf "%s\n" "$sgids_files" | while read s; do printf "%s\n" "$sgids_files" | while read s; do
[ -z "$s" ] && continue
s=$(ls -lahtr "$s") s=$(ls -lahtr "$s")
#If starts like "total 332K" then no SUID bin was found and xargs just executed "ls" in the current folder #If starts like "total 332K" then no SUID bin was found and xargs just executed "ls" in the current folder
if echo "$s" | grep -qE "^total";then break; fi if echo "$s" | grep -qE "^total";then break; fi
@@ -53,6 +54,8 @@ printf "%s\n" "$sgids_files" | while read s; do
if [ -O "$sline_first" ] || [ -w "$sline_first" ]; then #And modifiable if [ -O "$sline_first" ] || [ -w "$sline_first" ]; then #And modifiable
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can modify it (strings line: $sline)\n" printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can modify it (strings line: $sline)\n"
fi fi
elif echo "$sline_first" | grep -q "/" && [ -d "$(dirname "$sline_first")" ] && [ -w "$(dirname "$sline_first")" ]; then #If path does not exist but can be created
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is using $RED$sline_first$NC$ITALIC and you can create it inside writable dir $RED$(dirname "$sline_first")$NC$ITALIC (strings line: $sline)\n"
else #If not a path else #If not a path
if [ ${#sline_first} -gt 2 ] && command -v "$sline_first" 2>/dev/null | grep -q '/'; then #Check if existing binary if [ ${#sline_first} -gt 2 ] && command -v "$sline_first" 2>/dev/null | grep -q '/'; then #Check if existing binary
printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is executing $RED$sline_first$NC$ITALIC and you can impersonate it (strings line: $sline)\n" printf "$ITALIC --- It looks like $RED$sname$NC$ITALIC is executing $RED$sline_first$NC$ITALIC and you can impersonate it (strings line: $sline)\n"
@@ -90,4 +93,4 @@ printf "%s\n" "$sgids_files" | while read s; do
fi fi
fi fi
done; done;
echo "" echo ""

View File

@@ -6,7 +6,7 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: echo_not_found, print_2title, print_info # Functions Used: echo_not_found, print_2title, print_info
# Global Variables: $HOMESEARCH, $knw_usrs, $MACPEAS, $nosh_usrs, $SEARCH_IN_FOLDER, $sh_usrs, $USER # Global Variables: $HOMESEARCH, $knw_usrs, $MACPEAS, $nosh_usrs, $SEARCH_IN_FOLDER, $sh_usrs, $USER, $writeB, $writeVB
# Initial Functions: # Initial Functions:
# Generated Global Variables: # Generated Global Variables:
# Fat linpeas: 0 # Fat linpeas: 0
@@ -16,12 +16,12 @@
print_2title "Files with ACLs (limited to 50)" print_2title "Files with ACLs (limited to 50)"
print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#acls" print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#acls"
if ! [ "$SEARCH_IN_FOLDER" ]; then if ! [ "$SEARCH_IN_FOLDER" ]; then
( (getfacl -t -s -R -p /bin /etc $HOMESEARCH /opt /sbin /usr /tmp /root 2>/dev/null) || echo_not_found "files with acls in searched folders" ) | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," ( (getfacl -t -s -R -p /bin /etc $HOMESEARCH /opt /sbin /usr /tmp /root 2>/dev/null) || echo_not_found "files with acls in searched folders" ) | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," | sed -${E} "s,$writeVB,${SED_RED_YELLOW},g" | sed -${E} "s,$writeB,${SED_RED},g"
else else
( (getfacl -t -s -R -p $SEARCH_IN_FOLDER 2>/dev/null) || echo_not_found "files with acls in searched folders" ) | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," ( (getfacl -t -s -R -p $SEARCH_IN_FOLDER 2>/dev/null) || echo_not_found "files with acls in searched folders" ) | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," | sed -${E} "s,$writeVB,${SED_RED_YELLOW},g" | sed -${E} "s,$writeB,${SED_RED},g"
fi fi
if [ "$MACPEAS" ] && ! [ "$FAST" ] && ! [ "$SUPERFAST" ] && ! [ "$(command -v getfacl || echo -n '')" ]; then #Find ACL files in macos (veeeery slow) if [ "$MACPEAS" ] && ! [ "$FAST" ] && ! [ "$SUPERFAST" ] && ! [ "$(command -v getfacl || echo -n '')" ]; then #Find ACL files in macos (veeeery slow)
ls -RAle / 2>/dev/null | grep -v "group:everyone deny delete" | grep -E -B1 "\d: " | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," ls -RAle / 2>/dev/null | grep -v "group:everyone deny delete" | grep -E -B1 "\d: " | head -n 70 | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," | sed -${E} "s,$writeVB,${SED_RED_YELLOW},g" | sed -${E} "s,$writeB,${SED_RED},g"
fi fi
echo "" echo ""

View File

@@ -8,7 +8,7 @@
# Functions Used: echo_not_found, print_2title, print_info, print_3title # Functions Used: echo_not_found, print_2title, print_info, print_3title
# Global Variables: $capsB, $capsVB, $IAMROOT, $SEARCH_IN_FOLDER # Global Variables: $capsB, $capsVB, $IAMROOT, $SEARCH_IN_FOLDER
# Initial Functions: # Initial Functions:
# Generated Global Variables: $cap_name, $cap_value, $cap_line, $capVB, $capname, $capbins, $capsVB_vuln # Generated Global Variables: $cap_name, $cap_value, $cap_line, $capVB, $capname, $capbins, $capsVB_vuln, $proc_status, $proc_pid, $proc_name, $proc_uid, $user_name, $proc_inh, $proc_prm, $proc_eff, $proc_bnd, $proc_amb, $proc_inh_dec, $proc_prm_dec, $proc_eff_dec, $proc_bnd_dec, $proc_amb_dec
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -69,6 +69,40 @@ if ! [ "$SEARCH_IN_FOLDER" ]; then
fi fi
done done
echo "" echo ""
print_3title "Processes with capability sets (non-zero CapEff/CapAmb, limit 40)"
find /proc -maxdepth 2 -path "/proc/[0-9]*/status" 2>/dev/null | head -n 400 | while read -r proc_status; do
proc_pid=$(echo "$proc_status" | cut -d/ -f3)
proc_name=$(awk '/^Name:/{print $2}' "$proc_status" 2>/dev/null)
proc_uid=$(awk '/^Uid:/{print $2}' "$proc_status" 2>/dev/null)
user_name=$(awk -F: -v uid="$proc_uid" '$3==uid{print $1; exit}' /etc/passwd 2>/dev/null)
[ -z "$user_name" ] && user_name="$proc_uid"
proc_inh=$(awk '/^CapInh:/{print $2}' "$proc_status" 2>/dev/null)
proc_prm=$(awk '/^CapPrm:/{print $2}' "$proc_status" 2>/dev/null)
proc_eff=$(awk '/^CapEff:/{print $2}' "$proc_status" 2>/dev/null)
proc_bnd=$(awk '/^CapBnd:/{print $2}' "$proc_status" 2>/dev/null)
proc_amb=$(awk '/^CapAmb:/{print $2}' "$proc_status" 2>/dev/null)
[ -z "$proc_eff" ] && continue
if [ "$proc_eff" != "0000000000000000" ] || [ "$proc_amb" != "0000000000000000" ]; then
echo "PID $proc_pid ($proc_name) user=$user_name"
proc_inh_dec=$(capsh --decode=0x"$proc_inh" 2>/dev/null)
proc_prm_dec=$(capsh --decode=0x"$proc_prm" 2>/dev/null)
proc_eff_dec=$(capsh --decode=0x"$proc_eff" 2>/dev/null)
proc_bnd_dec=$(capsh --decode=0x"$proc_bnd" 2>/dev/null)
proc_amb_dec=$(capsh --decode=0x"$proc_amb" 2>/dev/null)
echo " CapInh: $proc_inh_dec" | sed -${E} "s,$capsB,${SED_RED},g"
echo " CapPrm: $proc_prm_dec" | sed -${E} "s,$capsB,${SED_RED},g"
echo " CapEff: $proc_eff_dec" | sed -${E} "s,$capsB,${SED_RED_YELLOW},g"
echo " CapBnd: $proc_bnd_dec" | sed -${E} "s,$capsB,${SED_RED},g"
echo " CapAmb: $proc_amb_dec" | sed -${E} "s,$capsB,${SED_RED_YELLOW},g"
echo ""
fi
done | head -n 240
echo ""
else else
print_3title "Current shell capabilities" print_3title "Current shell capabilities"

View File

@@ -6,19 +6,27 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: echo_not_found, print_2title, print_info # Functions Used: echo_not_found, print_2title, print_info
# Global Variables: $DEBUG, $knw_usrs, $nosh_usrs, $sh_usrs, $USER # Global Variables: $capsB, $DEBUG, $knw_usrs, $nosh_usrs, $sh_usrs, $USER
# Initial Functions: # Initial Functions:
# Generated Global Variables: # Generated Global Variables: $pam_cap_lines
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 0 # Small linpeas: 0
if [ -f "/etc/security/capability.conf" ] || [ "$DEBUG" ]; then if [ -f "/etc/security/capability.conf" ] || [ "$DEBUG" ] || grep -Rqs "pam_cap\.so" /etc/pam.d /etc/pam.conf 2>/dev/null; then
print_2title "Users with capabilities" print_2title "Users with capabilities"
print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#capabilities" print_info "https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html#capabilities"
if [ -f "/etc/security/capability.conf" ]; then if [ -f "/etc/security/capability.conf" ]; then
grep -v '^#\|none\|^$' /etc/security/capability.conf 2>/dev/null | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," grep -v '^#\|none\|^$' /etc/security/capability.conf 2>/dev/null | sed -${E} "s,$sh_usrs,${SED_LIGHT_CYAN}," | sed -${E} "s,$nosh_usrs,${SED_BLUE}," | sed -${E} "s,$knw_usrs,${SED_GREEN}," | sed "s,$USER,${SED_RED}," | sed -${E} "s,$capsB,${SED_RED},g"
else echo_not_found "/etc/security/capability.conf" else echo_not_found "/etc/security/capability.conf"
fi fi
echo "" echo ""
fi print_info "Checking if PAM loads pam_cap.so"
pam_cap_lines=$(grep -RIn "pam_cap\.so" /etc/pam.d /etc/pam.conf 2>/dev/null)
if [ "$pam_cap_lines" ]; then
printf "%s\n" "$pam_cap_lines" | sed -${E} "s,pam_cap\\.so,${SED_RED_YELLOW},g"
else
echo_not_found "pam_cap.so in /etc/pam.d or /etc/pam.conf"
fi
echo ""
fi

View File

@@ -6,7 +6,7 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: print_2title, print_info # Functions Used: print_2title, print_info
# Global Variables: $IAMROOT, $ITALIC, $SEARCH_IN_FOLDER, $USER, $Wfolders, $wgroups # Global Variables: $IAMROOT, $ITALIC, $SEARCH_IN_FOLDER, $USER, $Wfolders, $ldsoconfdG, $wgroups
# Initial Functions: # Initial Functions:
# Generated Global Variables: $ini_path, $fpath # Generated Global Variables: $ini_path, $fpath
# Fat linpeas: 0 # Fat linpeas: 0
@@ -26,40 +26,53 @@ if ! [ "$SEARCH_IN_FOLDER" ] && ! [ "$IAMROOT" ]; then
echo "Content of /etc/ld.so.conf:" echo "Content of /etc/ld.so.conf:"
cat /etc/ld.so.conf 2>/dev/null | sed -${E} "s,$Wfolders,${SED_RED_YELLOW},g" cat /etc/ld.so.conf 2>/dev/null | sed -${E} "s,$Wfolders,${SED_RED_YELLOW},g"
# Check each configured folder # Check each configured folder and include directives
cat /etc/ld.so.conf 2>/dev/null | while read l; do cat /etc/ld.so.conf 2>/dev/null | while IFS= read -r l; do
if echo "$l" | grep -q include; then l=$(echo "$l" | sed 's/#.*$//' | xargs 2>/dev/null)
[ -z "$l" ] && continue
if echo "$l" | grep -qE '^include[[:space:]]+'; then
ini_path=$(echo "$l" | cut -d " " -f 2) ini_path=$(echo "$l" | cut -d " " -f 2)
fpath=$(dirname "$ini_path") fpath=$(dirname "$ini_path")
if [ -d "/etc/ld.so.conf" ] && [ -w "$fpath" ]; then if [ -d "$fpath" ] && [ -w "$fpath" ]; then
echo "You have write privileges over $fpath" | sed -${E} "s,.*,${SED_RED_YELLOW},"; echo "You have write privileges over $fpath" | sed -${E} "s,.*,${SED_RED_YELLOW},";
printf $RED_YELLOW$ITALIC"$fpath\n"$NC; printf $RED_YELLOW$ITALIC"$fpath\n"$NC;
else else
printf $GREEN$ITALIC"$fpath\n"$NC; printf $GREEN$ITALIC"$fpath\n"$NC;
fi fi
if [ "$(find $fpath -type f '(' '(' -user $USER ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null)" ]; then if [ "$(find "$fpath" -type f '(' '(' -user "$USER" ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null)" ]; then
echo "You have write privileges over $(find $fpath -type f '(' '(' -user $USER ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null)" | sed -${E} "s,.*,${SED_RED_YELLOW},"; echo "You have write privileges over $(find "$fpath" -type f '(' '(' -user "$USER" ')' -or '(' -perm -o=w ')' -or '(' -perm -g=w -and '(' $wgroups ')' ')' ')' 2>/dev/null)" | sed -${E} "s,.*,${SED_RED_YELLOW},";
fi fi
for f in $fpath/*; do for f in $ini_path; do
if [ -w "$f" ]; then [ -f "$f" ] || continue
echo "You have write privileges over $f" | sed -${E} "s,.*,${SED_RED_YELLOW},";
if [ -w "$f" ]; then
echo "You have write privileges over $f" | sed -${E} "s,.*,${SED_RED_YELLOW},";
printf $RED_YELLOW$ITALIC"$f\n"$NC; printf $RED_YELLOW$ITALIC"$f\n"$NC;
else else
printf $GREEN$ITALIC" $f\n"$NC; printf $GREEN$ITALIC" $f\n"$NC;
fi fi
cat "$f" | grep -v "^#" | while read l2; do cat "$f" 2>/dev/null | grep -v "^#" | while IFS= read -r l2; do
if [ -f "$l2" ] && [ -w "$l2" ]; then l2=$(echo "$l2" | xargs 2>/dev/null)
echo "You have write privileges over $l2" | sed -${E} "s,.*,${SED_RED_YELLOW},"; [ -z "$l2" ] && continue
if [ -d "$l2" ] && [ -w "$l2" ]; then
echo "You have write privileges over $l2" | sed -${E} "s,.*,${SED_RED_YELLOW},";
printf $RED_YELLOW$ITALIC" - $l2\n"$NC; printf $RED_YELLOW$ITALIC" - $l2\n"$NC;
else elif [ -d "$l2" ]; then
echo $ITALIC" - $l2"$NC | sed -${E} "s,$l2,${SED_GREEN}," | sed -${E} "s,$Wfolders,${SED_RED_YELLOW},g"; echo $ITALIC" - $l2"$NC | sed -${E} "s,$ldsoconfdG,${SED_GREEN},g" | sed -${E} "s,$Wfolders,${SED_RED_YELLOW},g";
fi fi
done done
done done
elif [ -d "$l" ] && [ -w "$l" ]; then
echo "You have write privileges over $l" | sed -${E} "s,.*,${SED_RED_YELLOW},";
printf $RED_YELLOW$ITALIC"$l\n"$NC;
else
echo $ITALIC"$l"$NC | sed -${E} "s,$ldsoconfdG,${SED_GREEN},g" | sed -${E} "s,$Wfolders,${SED_RED_YELLOW},g";
fi fi
done done
echo "" echo ""
@@ -75,4 +88,4 @@ if ! [ "$SEARCH_IN_FOLDER" ] && ! [ "$IAMROOT" ]; then
if [ -f "$l" ] && [ -w "$l" ]; then echo "You have write privileges over $l" | sed -${E} "s,.*,${SED_RED_YELLOW},"; fi if [ -f "$l" ] && [ -w "$l" ]; then echo "You have write privileges over $l" | sed -${E} "s,.*,${SED_RED_YELLOW},"; fi
done done
fi fi

View File

@@ -6,9 +6,9 @@
# License: GNU GPL # License: GNU GPL
# Version: 1.0 # Version: 1.0
# Functions Used: echo_not_found # Functions Used: echo_not_found
# Global Variables: $GREP_DOCKER_SOCK_INFOS, $GREP_DOCKER_SOCK_INFOS_IGNORE, $IAMROOT # Global Variables: $GREP_DOCKER_SOCK_INFOS, $GREP_DOCKER_SOCK_INFOS_IGNORE
# Initial Functions: # Initial Functions:
# Generated Global Variables: $SEARCHED_DOCKER_SOCKETS, $dock_sock, $docker_enumerated, $dockerVersion, $int_sock, $sockInfoResponse # Generated Global Variables: $SEARCHED_DOCKER_SOCKETS, $docker_enumerated, $dockerVersion, $int_sock, $sockInfoResponse
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
@@ -17,34 +17,55 @@ enumerateDockerSockets() {
dockerVersion="$(echo_not_found)" dockerVersion="$(echo_not_found)"
if ! [ "$SEARCHED_DOCKER_SOCKETS" ]; then if ! [ "$SEARCHED_DOCKER_SOCKETS" ]; then
SEARCHED_DOCKER_SOCKETS="1" SEARCHED_DOCKER_SOCKETS="1"
for int_sock in $(find / ! -path "/sys/*" -type s -name "docker.sock" -o -name "docker.socket" -o -name "dockershim.sock" -o -name "containerd.sock" -o -name "crio.sock" -o -name "frakti.sock" -o -name "rktlet.sock" 2>/dev/null); do # NOTE: This is intentionally "lightweight" (checks common runtime socket names) and avoids
if ! [ "$IAMROOT" ] && [ -w "$int_sock" ]; then # pseudo filesystems (/sys, /proc) to reduce noise and latency.
for int_sock in $(find / \
-path "/sys" -prune -o \
-path "/proc" -prune -o \
-type s \( \
-name "docker.sock" -o \
-name "docker.socket" -o \
-name "dockershim.sock" -o \
-name "containerd.sock" -o \
-name "crio.sock" -o \
-name "frakti.sock" -o \
-name "rktlet.sock" \
\) -print 2>/dev/null); do
# Basic permissions hint (you generally need write perms to connect to a unix socket).
if [ -w "$int_sock" ]; then
if echo "$int_sock" | grep -Eq "docker"; then if echo "$int_sock" | grep -Eq "docker"; then
dock_sock="$int_sock" echo "You have write permissions over Docker socket $int_sock" | sed -${E} "s,$int_sock,${SED_RED_YELLOW},g"
echo "You have write permissions over Docker socket $dock_sock" | sed -${E} "s,$dock_sock,${SED_RED_YELLOW},g"
echo "Docker enummeration:"
docker_enumerated=""
if [ "$(command -v curl || echo -n '')" ]; then
sockInfoResponse="$(curl -s --unix-socket $dock_sock http://localhost/info)"
dockerVersion=$(echo "$sockInfoResponse" | tr ',' '\n' | grep 'ServerVersion' | cut -d'"' -f 4)
echo $sockInfoResponse | tr ',' '\n' | grep -E "$GREP_DOCKER_SOCK_INFOS" | grep -v "$GREP_DOCKER_SOCK_INFOS_IGNORE" | tr -d '"'
if [ "$sockInfoResponse" ]; then docker_enumerated="1"; fi
fi
if [ "$(command -v docker || echo -n '')" ] && ! [ "$docker_enumerated" ]; then
sockInfoResponse="$(docker info)"
dockerVersion=$(echo "$sockInfoResponse" | tr ',' '\n' | grep 'Server Version' | cut -d' ' -f 4)
printf "$sockInfoResponse" | tr ',' '\n' | grep -E "$GREP_DOCKER_SOCK_INFOS" | grep -v "$GREP_DOCKER_SOCK_INFOS_IGNORE" | tr -d '"'
fi
else else
echo "You have write permissions over interesting socket $int_sock" | sed -${E} "s,$int_sock,${SED_RED},g" echo "You have write permissions over interesting socket $int_sock" | sed -${E} "s,$int_sock,${SED_RED},g"
fi fi
else else
echo "You don't have write permissions over interesting socket $int_sock" | sed -${E} "s,$int_sock,${SED_GREEN},g" echo "You don't have write permissions over interesting socket $int_sock" | sed -${E} "s,$int_sock,${SED_GREEN},g"
fi fi
# Validate whether this looks like a Docker Engine API socket (amicontained-style) when curl exists.
docker_enumerated=""
if [ "$(command -v curl 2>/dev/null || echo -n '')" ]; then
sockInfoResponse="$(curl -s --max-time 2 --unix-socket "$int_sock" http://localhost/info 2>/dev/null)"
if echo "$sockInfoResponse" | grep -q "ServerVersion"; then
echo "Valid Docker API socket: $int_sock" | sed -${E} "s,$int_sock,${SED_RED_YELLOW},g"
dockerVersion=$(echo "$sockInfoResponse" | tr ',' '\n' | grep 'ServerVersion' | cut -d'"' -f 4)
echo "$sockInfoResponse" | tr ',' '\n' | grep -E "$GREP_DOCKER_SOCK_INFOS" | grep -v "$GREP_DOCKER_SOCK_INFOS_IGNORE" | tr -d '"'
docker_enumerated="1"
fi
fi
# Fallback to docker CLI if curl is missing or the /info request didn't work.
# Use DOCKER_HOST so we can target non-default socket paths when possible.
if [ "$(command -v docker 2>/dev/null || echo -n '')" ] && ! [ "$docker_enumerated" ]; then
if [ -w "$int_sock" ] && echo "$int_sock" | grep -Eq "docker"; then
sockInfoResponse="$(DOCKER_HOST="unix://$int_sock" docker info 2>/dev/null)"
if [ "$sockInfoResponse" ]; then
dockerVersion=$(echo "$sockInfoResponse" | grep -i "^ Server Version:" | awk '{print $4}' | head -n 1)
printf "%s\n" "$sockInfoResponse" | grep -E "$GREP_DOCKER_SOCK_INFOS" | grep -v "$GREP_DOCKER_SOCK_INFOS_IGNORE" | tr -d '"'
fi
fi
fi
done done
fi fi
} }

View File

@@ -217,7 +217,7 @@ print_title(){
max_title_len=80 max_title_len=80
rest_len=$((($max_title_len - $title_len) / 2)) rest_len=$((($max_title_len - $title_len) / 2))
printf ${BLUE} printf "%s" "${BLUE}"
for i in $(seq 1 $rest_len); do printf " "; done for i in $(seq 1 $rest_len); do printf " "; done
printf "╔" printf "╔"
for i in $(seq 1 $title_len); do printf "═"; done; printf "═"; for i in $(seq 1 $title_len); do printf "═"; done; printf "═";
@@ -231,13 +231,13 @@ print_title(){
echo "" echo ""
printf ${BLUE} printf "%s" "${BLUE}"
for i in $(seq 1 $rest_len); do printf " "; done for i in $(seq 1 $rest_len); do printf " "; done
printf "╚" printf "╚"
for i in $(seq 1 $title_len); do printf "═"; done; printf "═"; for i in $(seq 1 $title_len); do printf "═"; done; printf "═";
printf "╝" printf "╝"
printf $NC printf "%s" "${NC}"
echo "" echo ""
} }

View File

@@ -13,4 +13,4 @@
# Small linpeas: 1 # Small linpeas: 1
capsB="=ep|cap_chown|cap_former|cap_setfcap|cap_dac_override|cap_dac_read_search|cap_setuid|cap_setgid|cap_kill|cap_net_bind_service|cap_net_raw|cap_net_admin|cap_sys_admin|cap_sys_ptrace|cap_sys_module" capsB="=ep|cap_chown|cap_fowner|cap_fsetid|cap_setpcap|cap_setfcap|cap_dac_override|cap_dac_read_search|cap_setuid|cap_setgid|cap_kill|cap_net_bind_service|cap_net_raw|cap_net_admin|cap_sys_admin|cap_sys_ptrace|cap_sys_module|cap_sys_rawio|cap_bpf|cap_perfmon"

View File

@@ -18,7 +18,9 @@ cap_sys_ptrace:python \
cap_sys_module:kmod|python \ cap_sys_module:kmod|python \
cap_dac_override:python|vim \ cap_dac_override:python|vim \
cap_chown:chown|python \ cap_chown:chown|python \
cap_former:chown|python \ cap_fowner:chown|python \
cap_setfcap:python|perl|ruby|php|node|lua|bash \
cap_setpcap:python|perl|ruby|php|node|lua|bash \
cap_setuid:peass{CAP_SETUID_HERE} \ cap_setuid:peass{CAP_SETUID_HERE} \
cap_setgid:peass{CAP_SETGID_HERE} \ cap_setgid:peass{CAP_SETGID_HERE} \
cap_net_raw:python|tcpdump" cap_net_raw:python|tcpdump|dumpcap|tcpflow"

View File

@@ -24,4 +24,4 @@ pwd_in_variables7="MAILGUN_APIKEY|MAILGUN_API_KEY|MAILGUN_DOMAIN|MAILGUN_PRIV_KE
pwd_in_variables8="OKTA_OAUTH2_ISSUER|OMISE_KEY|OMISE_PKEY|OMISE_PUBKEY|OMISE_SKEY|ONESIGNAL_API_KEY|ONESIGNAL_USER_AUTH_KEY|OPENWHISK_KEY|OPEN_WHISK_KEY|OSSRH_PASS|OSSRH_SECRET|OSSRH_USER|OS_AUTH_URL|OS_PROJECT_NAME|OS_TENANT_ID|OS_TENANT_NAME|PAGERDUTY_APIKEY|PAGERDUTY_ESCALATION_POLICY_ID|PAGERDUTY_FROM_USER|PAGERDUTY_PRIORITY_ID|PAGERDUTY_SERVICE_ID|PANTHEON_SITE|PARSE_APP_ID|PARSE_JS_KEY|PAYPAL_CLIENT_ID|PAYPAL_CLIENT_SECRET|PERCY_TOKEN|PERSONAL_KEY|PERSONAL_SECRET|PG_DATABASE|PG_HOST|PLACES_APIKEY|PLACES_API_KEY|PLACES_APPID|PLACES_APPLICATION_ID|PLOTLY_APIKEY|POSTGRESQL_DB|POSTGRESQL_PASS|POSTGRES_ENV_POSTGRES_DB|POSTGRES_ENV_POSTGRES_USER|POSTGRES_PORT|PREBUILD_AUTH|PROD.ACCESS.KEY.ID|PROD.SECRET.KEY|PROD_BASE_URL_RUNSCOPE|PROJECT_CONFIG|PUBLISH_KEY|PUBLISH_SECRET|PUSHOVER_TOKEN|PUSHOVER_USER|PYPI_PASSOWRD|QUIP_TOKEN|RABBITMQ_SERVER_ADDR|REDISCLOUD_URL|REDIS_STUNNEL_URLS|REFRESH_TOKEN|RELEASE_GH_TOKEN|RELEASE_TOKEN|remoteUserToShareTravis|REPORTING_WEBDAV_URL|REPORTING_WEBDAV_USER|repoToken|REST_API_KEY|RINKEBY_PRIVATE_KEY|ROPSTEN_PRIVATE_KEY|route53_access_key_id|RTD_KEY_PASS|RTD_STORE_PASS|RUBYGEMS_AUTH_TOKEN|s3_access_key|S3_ACCESS_KEY_ID|S3_BUCKET_NAME_APP_LOGS|S3_BUCKET_NAME_ASSETS|S3_KEY" pwd_in_variables8="OKTA_OAUTH2_ISSUER|OMISE_KEY|OMISE_PKEY|OMISE_PUBKEY|OMISE_SKEY|ONESIGNAL_API_KEY|ONESIGNAL_USER_AUTH_KEY|OPENWHISK_KEY|OPEN_WHISK_KEY|OSSRH_PASS|OSSRH_SECRET|OSSRH_USER|OS_AUTH_URL|OS_PROJECT_NAME|OS_TENANT_ID|OS_TENANT_NAME|PAGERDUTY_APIKEY|PAGERDUTY_ESCALATION_POLICY_ID|PAGERDUTY_FROM_USER|PAGERDUTY_PRIORITY_ID|PAGERDUTY_SERVICE_ID|PANTHEON_SITE|PARSE_APP_ID|PARSE_JS_KEY|PAYPAL_CLIENT_ID|PAYPAL_CLIENT_SECRET|PERCY_TOKEN|PERSONAL_KEY|PERSONAL_SECRET|PG_DATABASE|PG_HOST|PLACES_APIKEY|PLACES_API_KEY|PLACES_APPID|PLACES_APPLICATION_ID|PLOTLY_APIKEY|POSTGRESQL_DB|POSTGRESQL_PASS|POSTGRES_ENV_POSTGRES_DB|POSTGRES_ENV_POSTGRES_USER|POSTGRES_PORT|PREBUILD_AUTH|PROD.ACCESS.KEY.ID|PROD.SECRET.KEY|PROD_BASE_URL_RUNSCOPE|PROJECT_CONFIG|PUBLISH_KEY|PUBLISH_SECRET|PUSHOVER_TOKEN|PUSHOVER_USER|PYPI_PASSOWRD|QUIP_TOKEN|RABBITMQ_SERVER_ADDR|REDISCLOUD_URL|REDIS_STUNNEL_URLS|REFRESH_TOKEN|RELEASE_GH_TOKEN|RELEASE_TOKEN|remoteUserToShareTravis|REPORTING_WEBDAV_URL|REPORTING_WEBDAV_USER|repoToken|REST_API_KEY|RINKEBY_PRIVATE_KEY|ROPSTEN_PRIVATE_KEY|route53_access_key_id|RTD_KEY_PASS|RTD_STORE_PASS|RUBYGEMS_AUTH_TOKEN|s3_access_key|S3_ACCESS_KEY_ID|S3_BUCKET_NAME_APP_LOGS|S3_BUCKET_NAME_ASSETS|S3_KEY"
pwd_in_variables9="S3_KEY_APP_LOGS|S3_KEY_ASSETS|S3_PHOTO_BUCKET|S3_SECRET_APP_LOGS|S3_SECRET_ASSETS|S3_SECRET_KEY|S3_USER_ID|S3_USER_SECRET|SACLOUD_ACCESS_TOKEN|SACLOUD_ACCESS_TOKEN_SECRET|SACLOUD_API|SALESFORCE_BULK_TEST_SECURITY_TOKEN|SANDBOX_ACCESS_TOKEN|SANDBOX_AWS_ACCESS_KEY_ID|SANDBOX_AWS_SECRET_ACCESS_KEY|SANDBOX_LOCATION_ID|SAUCE_ACCESS_KEY|SECRETACCESSKEY|SECRETKEY|SECRET_0|SECRET_10|SECRET_11|SECRET_1|SECRET_2|SECRET_3|SECRET_4|SECRET_5|SECRET_6|SECRET_7|SECRET_8|SECRET_9|SECRET_KEY_BASE|SEGMENT_API_KEY|SELION_SELENIUM_SAUCELAB_GRID_CONFIG_FILE|SELION_SELENIUM_USE_SAUCELAB_GRID|SENDGRID|SENDGRID_API_KEY|SENDGRID_FROM_ADDRESS|SENDGRID_KEY|SENDGRID_USER|SENDWITHUS_KEY|SENTRY_AUTH_TOKEN|SERVICE_ACCOUNT_SECRET|SES_ACCESS_KEY|SES_SECRET_KEY|setDstAccessKey|setDstSecretKey|setSecretKey|SIGNING_KEY|SIGNING_KEY_SECRET|SIGNING_KEY_SID|SNOOWRAP_CLIENT_SECRET|SNOOWRAP_REDIRECT_URI|SNOOWRAP_REFRESH_TOKEN|SNOOWRAP_USER_AGENT|SNYK_API_TOKEN|SNYK_ORG_ID|SNYK_TOKEN|SOCRATA_APP_TOKEN|SOCRATA_USER|SONAR_ORGANIZATION_KEY|SONAR_PROJECT_KEY|SONAR_TOKEN|SONATYPE_GPG_KEY_NAME|SONATYPE_GPG_PASSPHRASE|SONATYPE_PASSSONATYPE_TOKEN_USER|SONATYPE_USER|SOUNDCLOUD_CLIENT_ID|SOUNDCLOUD_CLIENT_SECRET|SPACES_ACCESS_KEY_ID|SPACES_SECRET_ACCESS_KEY" pwd_in_variables9="S3_KEY_APP_LOGS|S3_KEY_ASSETS|S3_PHOTO_BUCKET|S3_SECRET_APP_LOGS|S3_SECRET_ASSETS|S3_SECRET_KEY|S3_USER_ID|S3_USER_SECRET|SACLOUD_ACCESS_TOKEN|SACLOUD_ACCESS_TOKEN_SECRET|SACLOUD_API|SALESFORCE_BULK_TEST_SECURITY_TOKEN|SANDBOX_ACCESS_TOKEN|SANDBOX_AWS_ACCESS_KEY_ID|SANDBOX_AWS_SECRET_ACCESS_KEY|SANDBOX_LOCATION_ID|SAUCE_ACCESS_KEY|SECRETACCESSKEY|SECRETKEY|SECRET_0|SECRET_10|SECRET_11|SECRET_1|SECRET_2|SECRET_3|SECRET_4|SECRET_5|SECRET_6|SECRET_7|SECRET_8|SECRET_9|SECRET_KEY_BASE|SEGMENT_API_KEY|SELION_SELENIUM_SAUCELAB_GRID_CONFIG_FILE|SELION_SELENIUM_USE_SAUCELAB_GRID|SENDGRID|SENDGRID_API_KEY|SENDGRID_FROM_ADDRESS|SENDGRID_KEY|SENDGRID_USER|SENDWITHUS_KEY|SENTRY_AUTH_TOKEN|SERVICE_ACCOUNT_SECRET|SES_ACCESS_KEY|SES_SECRET_KEY|setDstAccessKey|setDstSecretKey|setSecretKey|SIGNING_KEY|SIGNING_KEY_SECRET|SIGNING_KEY_SID|SNOOWRAP_CLIENT_SECRET|SNOOWRAP_REDIRECT_URI|SNOOWRAP_REFRESH_TOKEN|SNOOWRAP_USER_AGENT|SNYK_API_TOKEN|SNYK_ORG_ID|SNYK_TOKEN|SOCRATA_APP_TOKEN|SOCRATA_USER|SONAR_ORGANIZATION_KEY|SONAR_PROJECT_KEY|SONAR_TOKEN|SONATYPE_GPG_KEY_NAME|SONATYPE_GPG_PASSPHRASE|SONATYPE_PASSSONATYPE_TOKEN_USER|SONATYPE_USER|SOUNDCLOUD_CLIENT_ID|SOUNDCLOUD_CLIENT_SECRET|SPACES_ACCESS_KEY_ID|SPACES_SECRET_ACCESS_KEY"
pwd_in_variables10="SPA_CLIENT_ID|SPOTIFY_API_ACCESS_TOKEN|SPOTIFY_API_CLIENT_ID|SPOTIFY_API_CLIENT_SECRET|sqsAccessKey|sqsSecretKey|SRCCLR_API_TOKEN|SSHPASS|SSMTP_CONFIG|STARSHIP_ACCOUNT_SID|STARSHIP_AUTH_TOKEN|STAR_TEST_AWS_ACCESS_KEY_ID|STAR_TEST_BUCKET|STAR_TEST_LOCATION|STAR_TEST_SECRET_ACCESS_KEY|STORMPATH_API_KEY_ID|STORMPATH_API_KEY_SECRET|STRIPE_PRIVATE|STRIPE_PUBLIC|STRIP_PUBLISHABLE_KEY|STRIP_SECRET_KEY|SURGE_LOGIN|SURGE_TOKEN|SVN_PASS|SVN_USER|TESCO_API_KEY|THERA_OSS_ACCESS_ID|THERA_OSS_ACCESS_KEY|TRAVIS_ACCESS_TOKEN|TRAVIS_API_TOKEN|TRAVIS_COM_TOKEN|TRAVIS_E2E_TOKEN|TRAVIS_GH_TOKEN|TRAVIS_PULL_REQUEST|TRAVIS_SECURE_ENV_VARS|TRAVIS_TOKEN|TREX_CLIENT_ORGURL|TREX_CLIENT_TOKEN|TREX_OKTA_CLIENT_ORGURL|TREX_OKTA_CLIENT_TOKEN|TWILIO_ACCOUNT_ID|TWILIO_ACCOUNT_SID|TWILIO_API_KEY|TWILIO_API_SECRET|TWILIO_CHAT_ACCOUNT_API_SERVICE|TWILIO_CONFIGURATION_SID|TWILIO_SID|TWILIO_TOKEN|TWITTEROAUTHACCESSSECRET|TWITTEROAUTHACCESSTOKEN|TWITTER_CONSUMER_KEY|TWITTER_CONSUMER_SECRET|UNITY_SERIAL|URBAN_KEY|URBAN_MASTER_SECRET|URBAN_SECRET|userTravis|USER_ASSETS_ACCESS_KEY_ID|USER_ASSETS_SECRET_ACCESS_KEY|VAULT_APPROLE_SECRET_ID|VAULT_PATH|VIP_GITHUB_BUILD_REPO_DEPLOY_KEY|VIP_GITHUB_DEPLOY_KEY|VIP_GITHUB_DEPLOY_KEY_PASS" pwd_in_variables10="SPA_CLIENT_ID|SPOTIFY_API_ACCESS_TOKEN|SPOTIFY_API_CLIENT_ID|SPOTIFY_API_CLIENT_SECRET|sqsAccessKey|sqsSecretKey|SRCCLR_API_TOKEN|SSHPASS|SSMTP_CONFIG|STARSHIP_ACCOUNT_SID|STARSHIP_AUTH_TOKEN|STAR_TEST_AWS_ACCESS_KEY_ID|STAR_TEST_BUCKET|STAR_TEST_LOCATION|STAR_TEST_SECRET_ACCESS_KEY|STORMPATH_API_KEY_ID|STORMPATH_API_KEY_SECRET|STRIPE_PRIVATE|STRIPE_PUBLIC|STRIP_PUBLISHABLE_KEY|STRIP_SECRET_KEY|SURGE_LOGIN|SURGE_TOKEN|SVN_PASS|SVN_USER|TESCO_API_KEY|THERA_OSS_ACCESS_ID|THERA_OSS_ACCESS_KEY|TRAVIS_ACCESS_TOKEN|TRAVIS_API_TOKEN|TRAVIS_COM_TOKEN|TRAVIS_E2E_TOKEN|TRAVIS_GH_TOKEN|TRAVIS_PULL_REQUEST|TRAVIS_SECURE_ENV_VARS|TRAVIS_TOKEN|TREX_CLIENT_ORGURL|TREX_CLIENT_TOKEN|TREX_OKTA_CLIENT_ORGURL|TREX_OKTA_CLIENT_TOKEN|TWILIO_ACCOUNT_ID|TWILIO_ACCOUNT_SID|TWILIO_API_KEY|TWILIO_API_SECRET|TWILIO_CHAT_ACCOUNT_API_SERVICE|TWILIO_CONFIGURATION_SID|TWILIO_SID|TWILIO_TOKEN|TWITTEROAUTHACCESSSECRET|TWITTEROAUTHACCESSTOKEN|TWITTER_CONSUMER_KEY|TWITTER_CONSUMER_SECRET|UNITY_SERIAL|URBAN_KEY|URBAN_MASTER_SECRET|URBAN_SECRET|userTravis|USER_ASSETS_ACCESS_KEY_ID|USER_ASSETS_SECRET_ACCESS_KEY|VAULT_APPROLE_SECRET_ID|VAULT_PATH|VIP_GITHUB_BUILD_REPO_DEPLOY_KEY|VIP_GITHUB_DEPLOY_KEY|VIP_GITHUB_DEPLOY_KEY_PASS"
pwd_in_variables11="VIRUSTOTAL_APIKEY|VISUAL_RECOGNITION_API_KEY|V_SFDC_CLIENT_ID|V_SFDC_CLIENT_SECRET|WAKATIME_API_KEY|WAKATIME_PROJECT|WATSON_CLIENT|WATSON_CONVERSATION_WORKSPACE|WATSON_DEVICE|WATSON_DEVICE_TOPIC|WATSON_TEAM_ID|WATSON_TOPIC|WIDGET_BASIC_USER_2|WIDGET_BASIC_USER_3|WIDGET_BASIC_USER_4|WIDGET_BASIC_USER_5|WIDGET_FB_USER|WIDGET_FB_USER_2|WIDGET_FB_USER_3|WIDGET_TEST_SERVERWORDPRESS_DB_USER|WORKSPACE_ID|WPJM_PHPUNIT_GOOGLE_GEOCODE_API_KEY|WPT_DB_HOST|WPT_DB_NAME|WPT_DB_USER|WPT_PREPARE_DIR|WPT_REPORT_API_KEY|WPT_SSH_CONNECT|WPT_SSH_PRIVATE_KEY_BASE64|YANGSHUN_GH_TOKEN|YT_ACCOUNT_CHANNEL_ID|YT_ACCOUNT_CLIENT_ID|YT_ACCOUNT_CLIENT_SECRET|YT_ACCOUNT_REFRESH_TOKEN|YT_API_KEY|YT_CLIENT_ID|YT_CLIENT_SECRET|YT_PARTNER_CHANNEL_ID|YT_PARTNER_CLIENT_ID|YT_PARTNER_CLIENT_SECRET|YT_PARTNER_ID|YT_PARTNER_REFRESH_TOKEN|YT_SERVER_API_KEY|ZHULIANG_GH_TOKEN|ZOPIM_ACCOUNT_KEY" pwd_in_variables11="VIRUSTOTAL_APIKEY|VISUAL_RECOGNITION_API_KEY|V_SFDC_CLIENT_ID|V_SFDC_CLIENT_SECRET|WAKATIME_API_KEY|WAKATIME_PROJECT|WATSON_CLIENT|WATSON_CONVERSATION_WORKSPACE|WATSON_DEVICE|WATSON_DEVICE_TOPIC|WATSON_TEAM_ID|WATSON_TOPIC|WIDGET_BASIC_USER_2|WIDGET_BASIC_USER_3|WIDGET_BASIC_USER_4|WIDGET_BASIC_USER_5|WIDGET_FB_USER|WIDGET_FB_USER_2|WIDGET_FB_USER_3|WIDGET_TEST_SERVERWORDPRESS_DB_USER|WORKSPACE_ID|WPJM_PHPUNIT_GOOGLE_GEOCODE_API_KEY|WPT_DB_HOST|WPT_DB_NAME|WPT_DB_USER|WPT_PREPARE_DIR|WPT_REPORT_API_KEY|WPT_SSH_CONNECT|WPT_SSH_PRIVATE_KEY_BASE64|YANGSHUN_GH_TOKEN|YT_ACCOUNT_CHANNEL_ID|YT_ACCOUNT_CLIENT_ID|YT_ACCOUNT_CLIENT_SECRET|YT_ACCOUNT_REFRESH_TOKEN|YT_API_KEY|YT_CLIENT_ID|YT_CLIENT_SECRET|YT_PARTNER_CHANNEL_ID|YT_PARTNER_CLIENT_ID|YT_PARTNER_CLIENT_SECRET|YT_PARTNER_ID|YT_PARTNER_REFRESH_TOKEN|YT_SERVER_API_KEY|ZHULIANG_GH_TOKEN|ZOPIM_ACCOUNT_KEY|USERNAME|PASSWORD|PASSWD|CREDENTIALS?"

View File

@@ -12,4 +12,4 @@
# Fat linpeas: 0 # Fat linpeas: 0
# Small linpeas: 1 # Small linpeas: 1
sudoB="$(whoami)|ALL:ALL|ALL : ALL|ALL|env_keep|NOPASSWD|SETENV|/apache2|/cryptsetup|/mount|/restic|--password-command|--password-file|-o ProxyCommand|-o PreferredAuthentications" sudoB="$(whoami)|ALL:ALL|ALL : ALL|ALL|env_keep|NOPASSWD|SETENV|/apache2|/cryptsetup|/mount|/restic|/usermod|/sbin/ldconfig|/usr/sbin/ldconfig|ldconfig -f|--password-command|--password-file|-o ProxyCommand|-o PreferredAuthentications"

View File

@@ -13,4 +13,4 @@
# Small linpeas: 1 # Small linpeas: 1
writeVB="/etc/anacrontab|/etc/apt/apt.conf.d|/etc/bash.bashrc|/etc/bash_completion|/etc/bash_completion.d/|/etc/cron|/etc/environment|/etc/environment.d/|/etc/group|/etc/incron.d/|/etc/init|/etc/ld.so.conf.d/|/etc/master.passwd|/etc/passwd|/etc/profile.d/|/etc/profile|/etc/rc.d|/etc/shadow|/etc/skey/|/etc/sudoers|/etc/sudoers.d/|/etc/supervisor/conf.d/|/etc/supervisor/supervisord.conf|/etc/systemd|/etc/sys|/lib/systemd|/etc/update-motd.d/|/root/.ssh/|/run/systemd|/usr/lib/cron/tabs/|/usr/lib/systemd|/systemd/system|/var/db/yubikey/|/var/spool/anacron|/var/spool/cron/crontabs|"$(echo $PATH 2>/dev/null | sed 's/:\.:/:/g' | sed 's/:\.$//g' | sed 's/^\.://g' | sed 's/:/$|^/g') #Add Path but remove simple dot in PATH writeVB="/etc/anacrontab|/etc/apt/apt.conf.d|/etc/bash.bashrc|/etc/bash_completion|/etc/bash_completion.d/|/etc/cron|/etc/environment|/etc/environment.d/|/etc/group|/etc/incron.d/|/etc/init|/etc/ld.so.conf.d/|/etc/ld.so.preload|/etc/master.passwd|/etc/passwd|/etc/profile.d/|/etc/profile|/etc/rc.d|/etc/shadow|/etc/skey/|/etc/sudoers|/etc/sudoers.d/|/etc/supervisor/conf.d/|/etc/supervisor/supervisord.conf|/etc/systemd|/etc/sys|/lib/systemd|/etc/update-motd.d/|/root/.ssh/|/run/systemd|/usr/lib/cron/tabs/|/usr/lib/systemd|/systemd/system|/var/db/yubikey/|/var/spool/anacron|/var/spool/cron/crontabs|"$(echo $PATH 2>/dev/null | sed 's/:\.:/:/g' | sed 's/:\.$//g' | sed 's/^\.://g' | sed 's/:/$|^/g') #Add Path but remove simple dot in PATH

View File

@@ -46,7 +46,7 @@ class LinpeasBuilder:
def build(self): def build(self):
print("[+] Building variables...") print("[+] Building variables...")
variables = self.__generate_variables() variables = self.__generate_variabless()
self.__replace_mark(PEAS_VARIABLES_MARKUP, variables, "") self.__replace_mark(PEAS_VARIABLES_MARKUP, variables, "")
if len(re.findall(r"PSTORAGE_[a-zA-Z0-9_]+", self.linpeas_sh)) > 1: #Only add storages if there are storages (PSTORAGE_BACKUPS is always there so it doesn't count) if len(re.findall(r"PSTORAGE_[a-zA-Z0-9_]+", self.linpeas_sh)) > 1: #Only add storages if there are storages (PSTORAGE_BACKUPS is always there so it doesn't count)