Gitea Security

HackTricks 지원하기

Gitea란 무엇인가

GiteaGo로 작성된 자가 호스팅 커뮤니티 관리 경량 코드 호스팅 솔루션입니다.

기본 정보

Basic Gitea Information

실습

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

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

인증되지 않은 열거

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

내부 악용

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

사용자 자격 증명/웹 쿠키로

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

2FA가 사용될 수 있으므로 이 정보를 얻으려면 그 검사를 통과해야만 합니다.

i_like_gitea 쿠키를 훔치는 데 성공하면 (현재 SameSite: Lax로 구성됨) 자격 증명이나 2FA 없이 사용자를 완전히 가장할 수 있습니다.

사용자 SSH 키로

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 키배포 키로 리포지토리에 설정할 수도 있습니다. 이 키에 접근할 수 있는 사람은 리포지토리에서 프로젝트를 시작할 수 있습니다. 일반적으로 서로 다른 배포 키가 있는 서버에서는 로컬 파일 **~/.ssh/config**가 관련된 키에 대한 정보를 제공합니다.

GPG 키

여기에서 설명한 바와 같이, 때때로 커밋에 서명해야 하거나 발견될 수 있습니다.

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

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

사용자 토큰 사용

사용자 토큰에 대한 기본 정보를 확인하여 소개를 참조하세요.

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

Oauth 애플리케이션 사용

Gitea Oauth 애플리케이션에 대한 기본 정보를 확인하여 소개를 참조하세요.

공격자는 악성 Oauth 애플리케이션을 생성하여 피싱 캠페인의 일환으로 이를 수락하는 사용자들의 권한 있는 데이터/작업에 접근할 수 있습니다.

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

브랜치 보호 우회

Github에서는 기본적으로 쓰기 접근 권한이 있는 토큰을 얻는 github actions가 있어 브랜치 보호를 우회하는 데 사용할 수 있습니다. 이 경우 존재하지 않으므로, 우회는 더 제한적입니다. 하지만 어떤 작업을 할 수 있는지 살펴보겠습니다:

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

  • 제한된 푸시 화이트리스트: 이 목록의 일원이라면 브랜치에 푸시하세요.

  • 병합 화이트리스트 활성화: 병합 화이트리스트가 있다면, 그 안에 있어야 합니다.

  • 승인 요구가 0보다 큼: 그러면... 다른 사용자를 타협해야 합니다.

  • 화이트리스트에 승인 제한: 화이트리스트에 있는 사용자만 승인할 수 있다면... 그 목록에 있는 다른 사용자를 타협해야 합니다.

  • 오래된 승인 무효화: 새로운 커밋으로 승인이 제거되지 않는다면, 이미 승인된 PR을 탈취하여 코드를 주입하고 PR을 병합할 수 있습니다.

조직/레포 관리자라면 보호를 우회할 수 있습니다.

웹훅 열거

웹훅특정 gitea 정보를 일부 장소로 전송할 수 있습니다. 이 통신을 악용할 수 있습니다. 그러나 일반적으로 비밀웹훅에 설정되어 있어 URL을 아는 외부 사용자가 비밀을 모르면 웹훅을 악용할 수 없습니다. 하지만 어떤 경우에는 사람들이 비밀을 제자리에 설정하는 대신 URL에 매개변수로 설정하기 때문에, URL을 확인하면 비밀과 추가로 악용할 수 있는 다른 장소를 찾을 수 있습니다.

웹훅은 레포 및 조직 수준에서 설정할 수 있습니다.

포스트 익스플로잇

서버 내부

어떻게든 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