Gitea Security

HackTricks 지원

Gitea란 무엇인가

Gitea는 Go로 작성된 셀프 호스팅 커뮤니티 관리 경량 코드 호스팅 솔루션입니다.

기본 정보

Basic Gitea Information

실습

로컬에서 Gitea 인스턴스를 실행하려면 docker 컨테이너를 실행하면 됩니다:

docker run -p 3000:3000 gitea/gitea

포트 3000에 연결하여 웹 페이지에 액세스합니다.

kubernetes로도 실행할 수 있습니다:

helm repo add gitea-charts https://dl.gitea.io/charts/
helm install gitea gitea-charts/gitea

Unauthenticated Enumeration

기본적으로 Gitea는 새로운 사용자가 등록할 수 있도록 허용합니다. 이는 다른 조직/사용자의 저장소에 대해 특별히 흥미로운 접근 권한을 제공하지 않지만, 로그인한 사용자더 많은 저장소나 조직을 시각화할 수 있습니다.

Internal Exploitation

이 시나리오에서는 github 계정에 대한 일부 접근 권한을 얻었다고 가정합니다.

조직 내 사용자의 자격 증명(또는 세션 쿠키)을 이미 가지고 있다면 그냥 로그인하여 어떤 권한을 가지고 있는지, 어떤 팀에 속해 있는지, 다른 사용자를 나열하고, 저장소가 어떻게 보호되고 있는지 확인할 수 있습니다.

2FA가 사용될 수 있으므로 이 정보를 액세스하려면 해당 검사를 통과해야 합니다.

i_like_gitea 쿠키를 훔칠 수 있다면 (현재 SameSite: Lax로 설정됨) 자격 증명이나 2FA 없이 사용자를 완전히 가장할 수 있습니다.

With User SSH Key

Gitea는 사용자SSH 키를 설정하여 코드를 배포하는 인증 방법으로 사용할 수 있도록 허용합니다 (2FA는 적용되지 않음).

이 키를 사용하면 사용자가 일부 권한을 가진 저장소에서 변경을 수행할 수 있지만, gitea api를 사용하여 환경을 열거할 수는 없습니다. 그러나 로컬 설정을 열거하여 접근할 수 있는 저장소와 사용자에 대한 정보를 얻을 수 있습니다:

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

만약 사용자가 자신의 gitea 사용자 이름으로 사용자 이름을 설정했다면, https://github.com/<gitea_username>.keys 에서 계정에 설정된 공개 키에 접근할 수 있습니다. 이를 통해 발견한 개인 키가 사용 가능한지 확인할 수 있습니다.

SSH keysdeploy keys로 저장소에 설정될 수도 있습니다. 이 키에 접근할 수 있는 사람은 누구나 저장소에서 프로젝트를 실행할 수 있습니다. 보통 다른 deploy keys가 있는 서버에서는 로컬 파일 **~/.ssh/config**이 어떤 키와 관련이 있는지 정보를 제공합니다.

GPG Keys

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

현재 사용자가 어떤 키를 가지고 있는지 로컬에서 확인하십시오:

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

With User Token

User Tokens에 대한 기본 정보 소개를 참조하세요.

사용자 토큰은 비밀번호 대신 Gitea 서버에 인증하기 위해 API를 통해 사용할 수 있으며, 사용자에 대한 완전한 접근 권한을 가집니다.

With Oauth Application

Gitea Oauth Applications에 대한 기본 정보 소개를 참조하세요.

공격자는 악성 Oauth Application을 만들어 피싱 캠페인의 일환으로 이를 수락한 사용자의 권한 있는 데이터/작업에 접근할 수 있습니다.

기본 정보에서 설명한 것처럼, 애플리케이션은 사용자 계정에 대한 완전한 접근 권한을 가집니다.

Branch Protection Bypass

Github에서는 github actions가 기본적으로 저장소에 대한 쓰기 권한이 있는 토큰을 얻어 브랜치 보호를 우회할 수 있습니다. 이 경우에는 존재하지 않으므로, 우회가 더 제한적입니다. 하지만 할 수 있는 것들을 살펴보겠습니다:

  • Enable Push: 쓰기 권한이 있는 사람이 브랜치에 푸시할 수 있다면, 그냥 푸시하세요.

  • Whitelist Restricted Push: 동일하게, 이 목록에 포함되어 있다면 브랜치에 푸시하세요.

  • Enable Merge Whitelist: 병합 허용 목록이 있다면, 그 안에 있어야 합니다.

  • Require approvals is bigger than 0: 그렇다면... 다른 사용자를 타협해야 합니다.

  • Restrict approvals to whitelisted: 허용된 사용자만 승인할 수 있다면... 그 목록에 있는 다른 사용자를 타협해야 합니다.

  • Dismiss stale approvals: 새로운 커밋으로 승인이 제거되지 않는다면, 이미 승인된 PR을 하이재킹하여 코드를 주입하고 PR을 병합할 수 있습니다.

org/repo 관리자인 경우 보호를 우회할 수 있다는 점에 유의하세요.

Enumerate Webhooks

Webhooks특정 gitea 정보를 일부 장소로 전송할 수 있습니다. 이 통신을 악용할 수 있습니다. 그러나 일반적으로 비밀검색할 수 없도록 webhook에 설정되어 있어, URL을 알고 있지만 비밀을 모르는 외부 사용자가 webhook을 악용하지 못하게 합니다. 하지만 때때로 사람들은 비밀을 제자리에 설정하는 대신, URL에 매개변수로 설정하므로 URL을 확인하면 비밀과 추가로 악용할 수 있는 다른 장소를 찾을 수 있습니다.

Webhooks는 repo 및 org 수준에서 설정할 수 있습니다.

Post Exploitation

Inside the server

어떻게든 gitea가 실행 중인 서버 내부에 접근했다면 gitea 구성 파일을 찾아야 합니다. 기본적으로 /data/gitea/conf/app.ini에 위치해 있습니다.

이 파일에서 비밀번호를 찾을 수 있습니다.

gitea 경로(기본값: /data/gitea)에서도 다음과 같은 흥미로운 정보를 찾을 수 있습니다:

  • sqlite DB: gitea가 외부 db를 사용하지 않는 경우 sqlite db를 사용합니다.

  • 세션 폴더 내의 세션: cat sessions/*/*/*을 실행하면 로그인한 사용자의 사용자 이름을 볼 수 있습니다(gitea는 세션을 DB에 저장할 수도 있습니다).

  • jwt 폴더 내의 jwt 개인 키

  • 이 폴더에서 더 많은 민감한 정보를 찾을 수 있습니다.

서버 내부에 있는 경우 gitea 바이너리를 사용하여 정보에 접근/수정할 수 있습니다:

  • gitea dump는 gitea를 덤프하고 .zip 파일을 생성합니다.

  • gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET는 지정된 유형의 토큰을 생성합니다(영구성).

  • gitea admin user change-password --username admin --password newpassword 비밀번호 변경

  • gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token 새 관리자 사용자 생성 및 액세스 토큰 받기

HackTricks 지원

Last updated