Github Security

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **히어로**까지 **AWS 해킹**을 배우세요!

HackTricks를 지원하는 다른 방법:

Github이란

(여기에서) Github은 개발자가 코드를 저장하고 관리하며 코드의 변경 사항을 추적하고 제어하는 데 도움을 주는 웹사이트 및 클라우드 기반 서비스입니다.

기본 정보

pageBasic Github Information

외부 Recon

Github 저장소는 공개, 비공개 및 내부로 구성할 수 있습니다.

  • 비공개조직의 사람들만 액세스할 수 있음을 의미합니다.

  • 내부기업의 사람들만 액세스할 수 있음을 의미합니다(기업은 여러 조직을 가질 수 있음).

  • 공개인터넷 전체가 액세스할 수 있음을 의미합니다.

대상으로 할 사용자, 저장소 또는 조직을 알고 있다면 각 저장소에서 민감한 정보 또는 민감한 정보 누출을 찾기 위해 github dorks를 사용할 수 있습니다.

Github Dorks

Github는 사용자, 저장소 또는 조직을 범위로 지정하여 검색할 수 있습니다. 따라서 민감한 정보 근처에 나타날 문자열 목록을 사용하여 대상에서 잠재적인 민감한 정보를 쉽게 검색할 수 있습니다.

도구(각 도구에는 dorks 목록이 포함됨):

Github 누출

Github dorks는 또한 github 검색 옵션을 사용하여 누출을 찾기 위해 사용됩니다. 이 섹션은 이러한 도구들에 각 저장소를 다운로드하고 그 안에 민감한 정보를 검색할 것입니다(일부 커밋의 특정 깊이도 확인).

도구(각 도구에는 정규식 목록이 포함됨):

저장소에서 누출을 찾고 git log -p와 같은 것을 실행할 때 다른 브랜치에 다른 커밋이 포함될 수 있음을 잊지 마세요!

외부 Forks

풀 리퀘스트를 악용하여 저장소를 침해할 수 있습니다. 저장소가 취약한지 알아보려면 대부분 Github Actions yaml 구성을 읽어야 합니다. 아래에서 자세한 정보를 확인하세요.

조직 강화

구성원 권한

조직의 구성원에게 할당할 수 있는 기본 권한이 있습니다. 이는 페이지 https://github.com/organizations/<org_name>/settings/member_privileges 또는 Organizations API에서 제어할 수 있습니다.

  • 기본 권한: 구성원은 조직 저장소에 대한 권한 None/Read/write/Admin을 갖게 됩니다. 권장되는 것은 None 또는 Read입니다.

  • 저장소 포킹: 필요하지 않다면 구성원이 조직 저장소를 포크할 수 없도록 하는 것이 좋습니다.

  • 페이지 생성: 필요하지 않다면 구성원이 조직 저장소에서 페이지를 게시하지 못하도록 하는 것이 좋습니다. 필요한 경우 공개 또는 비공개 페이지를 만들 수 있습니다.

  • 통합 액세스 요청: 이를 활성화하면 외부 협력자가 GitHub 또는 OAuth 앱이 이 조직 및 해당 리소스에 액세스하도록 요청할 수 있습니다. 일반적으로 필요하지만 그렇지 않은 경우 비활성화하는 것이 좋습니다.

  • API 응답에서 이 정보를 찾을 수 없었습니다. 찾으면 공유해주세요

  • 저장소 가시성 변경: 활성화된 경우 저장소의 관리자 권한을 가진 구성원가시성을 변경할 수 있습니다. 비활성화된 경우 조직 소유자만 저장소 가시성을 변경할 수 있습니다. 사람들이 것을 공개로 만들기를 원치 않는다면 이것이 비활성화되어 있는지 확인하세요.

  • API 응답에서 이 정보를 찾을 수 없었습니다. 찾으면 공유해주세요

  • 저장소 삭제 및 이전: 활성화된 경우 저장소의 관리자 권한을 가진 구성원은 공개 및 비공개 저장소를 삭제하거나 이전할 수 있습니다.

  • API 응답에서 이 정보를 찾을 수 없었습니다. 찾으면 공유해주세요

  • 구성원이 팀 생성을 허용: 활성화된 경우 조직의 구성원은 새로운 을 만들 수 있습니다. 비활성화된 경우 조직 소유자만 새로운 팀을 만들 수 있습니다. 이것을 비활성화하는 것이 좋습니다.

  • API 응답에서 이 정보를 찾을 수 없었습니다. 찾으면 공유해주세요

  • 이 페이지에서 더 많은 것을 구성할 수 있지만, 이전에 언급한 것들이 보안과 관련된 것입니다.

작업 설정

작업에 대해 여러 보안 관련 설정을 페이지 https://github.com/organizations/<org_name>/settings/actions에서 구성할 수 있습니다.

모든 이 구성은 각 저장소에서도 독립적으로 설정할 수 있습니다.

  • Github 작업 정책: 어떤 저장소가 워크플로우를 실행할 수 있고 어떤 워크플로우가 허용되어야 하는지 지정할 수 있습니다. 허용되어야 하는 저장소를 지정하고 모든 작업을 실행하지 않도록 하는 것이 좋습니다.

  • 외부 협력자가 포크 풀 리퀘스트 워크플로우: 모든 외부 협력자에게 승인을 요구하는 것이 좋습니다.

  • 이 정보를 포함한 API를 찾지 못했습니다. 찾으면 공유해주세요

  • 풀 리퀘스트에서 워크플로우 실행: 풀 리퀘스트에서 워크플로우를 실행하는 것은 권장되지 않습니다. 외부 협력자의 fork 원본 유지자가 소스 저장소에서 읽기 권한이 있는 토큰을 사용할 수 있게 됩니다.

  • 이 정보를 포함한 API를 찾지 못했습니다. 찾으면 공유해주세요

  • 워크플로우 권한: 읽기 저장소 권한만 부여하는 것이 매우 권장됩니다. GITHUB_TOKEN의 남용을 피하기 위해 쓰기 및 생성/승인 풀 리퀘스트 권한을 부여하지 않는 것이 좋습니다.

통합

이 정보에 액세스하는 API 엔드포인트를 알고 계신다면 알려주세요!

  • 제3자 응용 프로그램 액세스 정책: 모든 응용 프로그램의 액세스를 제한하고 필요한 것만 허용하는 것이 권장됩니다 (검토 후).

  • 설치된 GitHub 앱: 필요한 것만 허용하는 것이 권장됩니다 (검토 후).

정찰 및 자격 증명 남용 공격

이 시나리오에서는 GitHub 계정에 액세스 권한을 얻은 것으로 가정합니다.

사용자 자격 증명으로

조직 내 사용자의 자격 증명을 이미 얻은 경우 로그인하여 어떤 기업 및 조직 역할을 가지고 있는지 확인할 수 있습니다. 원시 구성원인 경우 원시 구성원이 가지고 있는 권한, 속한 그룹, 리포지토리에 대한 권한, 리포지토리 보호 상태를 확인할 수 있습니다.

2단계 인증(2FA)을 사용할 수 있으므로 해당 확인을 통과해야만 이 정보에 액세스할 수 있습니다.

사용자 세션 쿠키를 도난당하면 (현재 SameSite: Lax로 구성됨) 자격 증명이나 2FA가 필요하지 않고도 사용자를 완전히 가장할 수 있습니다.

유용하다고 생각되면 브랜치 보호 우회에 대한 섹션을 확인하세요.

사용자 SSH 키로

Github는 사용자가 코드를 배포하는 인증 방법으로 사용될 SSH 키를 설정할 수 있습니다 (2FA가 적용되지 않음).

이 키를 사용하여 사용자가 일부 권한을 가진 리포지토리에서 변경을 수행할 수 있지만, github api에 액세스하여 환경을 열거할 수는 없습니다. 그러나 로컬 설정을 열거하여 액세스할 수 있는 리포지토리 및 사용자에 대한 정보를 얻을 수 있습니다:

# Go to the the repository folder
# Get repo config and current user name and email
git config --list

만약 사용자가 자신의 github 사용자 이름으로 사용자 이름을 구성했다면 그 사용자의 계정에 설정한 공개 키에 액세스할 수 있습니다. 이를 확인하여 찾은 개인 키를 사용할 수 있는지 확인할 수 있습니다.

SSH 키는 또한 배포 키로 저장소에 설정될 수 있습니다. 이 키에 액세스할 수 있는 사람은 해당 키를 사용하여 저장소에서 프로젝트를 시작할 수 있습니다. 일반적으로 서버에 다른 배포 키가 있는 경우 로컬 파일 **~/.ssh/config**에서 키 관련 정보를 확인할 수 있습니다.

GPG 키

여기에서 설명한대로 때로는 커밋에 서명해야 하거나 발견될 수 있습니다.

현재 사용자가 키를 가지고 있는지 로컬에서 확인하세요:

gpg --list-secret-keys --keyid-format=long

사용자 토큰을 사용하는 경우

사용자 토큰에 대한 기본 정보를 확인하려면 여기를 클릭하세요.

사용자 토큰은 Git을 통해 HTTPS로 사용자 암호 대신 사용하거나 기본 인증을 통해 API에 인증하는 데 사용할 수 있습니다. 해당 토큰에 부여된 권한에 따라 다양한 작업을 수행할 수 있습니다.

사용자 토큰은 다음과 같이 보입니다: ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123

Oauth 애플리케이션을 사용하는 경우

Github Oauth 애플리케이션에 대한 기본 정보를 확인하려면 여기를 클릭하세요.

공격자는 악의적인 Oauth 애플리케이션을 만들어 사용자의 특권 데이터/작업에 액세스할 수 있습니다. 이는 피싱 캠페인의 일부로 사용자가 수락할 가능성이 있는 것입니다.

이것은 Oauth 애플리케이션이 요청할 수 있는 범위입니다. 사용자는 수락하기 전에 요청된 범위를 항상 확인해야 합니다.

또한, 기본 정보에서 설명한대로 조직은 제3자 애플리케이션에 대한 액세스 권한을 부여/거부하여 조직과 관련된 정보/저장소/작업에 대한 액세스를 제어할 수 있습니다.

Github 애플리케이션을 사용하는 경우

Github 애플리케이션에 대한 기본 정보를 확인하려면 여기를 클릭하세요.

공격자는 악의적인 Github 애플리케이션을 만들어 사용자의 특권 데이터/작업에 액세스할 수 있습니다. 이는 피싱 캠페인의 일부로 사용자가 수락할 가능성이 있는 것입니다.

또한, 기본 정보에서 설명한대로 조직은 제3자 애플리케이션에 대한 액세스 권한을 부여/거부하여 조직과 관련된 정보/저장소/작업에 대한 액세스를 제어할 수 있습니다.

Github 액션을 탈취하고 남용하기

Github 액션을 탈취하고 남용하는 여러 기술이 있습니다. 여기에서 확인할 수 있습니다:

pageAbusing Github Actions

브랜치 보호 우회

  • 승인 횟수 필요: 여러 계정을 탈취했다면 다른 계정에서 PR을 수락할 수 있습니다. PR을 만든 계정만 있는 경우 자신의 PR을 수락할 수 없습니다. 그러나 레포 안의 Github 액션 환경에 액세스할 수 있다면 GITHUB_TOKEN을 사용하여 자신의 PR을 승인하고 이 방법으로 1회 승인을 받을 수 있습니다.

  • 이와 코드 소유자 제한에 대한 참고로 일반적으로 사용자는 자신의 PR을 승인할 수 없지만, 그렇게 할 수 있다면 자신의 PR을 수락하도록 남용할 수 있습니다.

  • 새로운 커밋이 푸시될 때 승인 해제: 이 옵션이 설정되어 있지 않으면 합법적인 코드를 제출한 후 승인을 기다린 다음 악의적인 코드를 넣고 보호된 브랜치로 병합할 수 있습니다.

  • 코드 소유자로부터 리뷰 필요: 이 옵션이 활성화되어 있고 코드 소유자인 경우 Github 액션이 PR을 생성하고 자체적으로 승인할 수 있습니다.

  • CODEOWNER 파일이 잘못 구성된 경우 Github는 불만을 표시하지 않지만 사용하지 않습니다. 따라서 잘못 구성된 경우 코드 소유자 보호가 적용되지 않습니다.

  • 지정된 사용자가 pull request 요구 사항을 우회할 수 있도록 허용: 이러한 사용자 중 하나인 경우 pull request 보호를 우회할 수 있습니다.

  • 관리자 포함: 이 옵션이 설정되어 있지 않고 레포의 관리자인 경우 이 브랜치 보호를 우회할 수 있습니다.

  • PR 납치: 다른 사람의 PR을 수정하여 악의적인 코드를 추가하고 결과 PR을 승인한 후 모든 것을 병합할 수 있습니다.

  • 브랜치 보호 제거: 레포의 관리자인 경우 보호를 비활성화할 수 있으며, PR을 병합한 후 보호를 다시 설정할 수 있습니다.

  • 푸시 보호 우회: 레포가 특정 사용자만 푸시(코드 병합)를 허용하는 경우(브랜치 보호가 모든 브랜치를 보호하도록 지정할 수 있음) 해당 사용자가 아니라면 코드를 푸시할 수 없습니다. 그러나 브랜치 보호로 인해 코드를 푸시할 수 없는 경우에도 새로운 브랜치를 만들고 그 안에 코드가 푸시될 때 트리거되는 github 액션을 만들 수 있습니다. 브랜치 보호가 브랜치가 생성될 때까지 보호하지 않기 때문에 이 브랜치로의 첫 번째 코드 푸시는 github 액션이 실행됩니다.

환경 보호 우회

Github 환경에 대한 기본 정보를 확인하려면 여기를 클릭하세요.

환경이 모든 브랜치에서 액세스할 수 있는 경우, 보호되지 않으며 환경 내의 비밀 정보에 쉽게 액세스할 수 있습니다. 모든 브랜치가 보호되는 레포를 찾을 수도 있습니다(이름으로 지정하거나 *을 사용하여) 이러한 시나리오에서 코드를 푸시할 수 있는 브랜치를 찾아 비밀 정보를 빼내어 새로운 github 액션을 만들 수 있습니다(또는 수정할 수 있습니다).

모든 브랜치가 보호되는 특수한 경우를 찾을 수도 있습니다(와일드카드 *를 통해) 누가 브랜치로 코드를 푸시할 수 있는지 지정되어 있지만 사용자가 허용되지 않은 경우입니다. 여전히 사용자 지정 github 액션을 실행할 수 있습니다. 새로운 브랜치를 만들고 자체적으로 푸시 트리거를 사용할 수 있기 때문에 브랜치 보호가 새로운 브랜치로의 푸시를 허용하므로 github 액션이 트리거됩니다.

push: # Run it when a push is made to a branch
branches:
- current_branch_name #Use '**' to run when a push is made to any branch

브랜치 생성 후에 새 브랜치에는 브랜치 보호가 적용되어 수정할 수 없지만, 그 시간에 이미 시크릿을 노출시켰을 것입니다.

지속성

  • 사용자 토큰 생성

  • 시크릿에서 github 토큰 도용

  • 워크플로우 결과브랜치 삭제

  • 모든 조직에 더 많은 권한 부여

  • 정보 유출을 위한 웹훅 생성

  • 외부 협력자 초대

  • SIEM에서 사용하는 웹훅 제거

  • 백도어가 있는 Github Action 생성/수정

  • 시크릿 값 수정을 통한 명령 삽입 취약한 Github Action 찾기

위장 커밋 - 리포 커밋을 통한 백도어

Github에서는 포크된 리포로부터 리포에 PR을 생성하는 것이 가능합니다. PR이 수락되지 않더라도, 원본 리포의 커밋 ID가 코드의 포크 버전을 위해 생성됩니다. 따라서, 공격자는 리포 소유자가 아닌 것처럼 보이는 리포의 특정 커밋을 사용할 수 있습니다.

예시: 여기

name: example
on: [push]
jobs:
commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e
- shell: bash
run: |
echo 'hello world!'

더 많은 정보는 https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd에서 확인하세요.

htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 영웅까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

最終更新