Gitea Security

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요**!

HackTricks를 지원하는 다른 방법:

Gitea란

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

기본 정보

pageBasic Gitea Information

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

docker run -p 3000:3000 gitea/gitea

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

또한 쿠버네티스로 실행할 수도 있습니다:

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

인증되지 않은 열거

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

내부 침투

이 시나리오에서는 깃허브 계정에 약간의 액세스를 얻었다고 가정합니다.

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

어떤 식으로든 사용자의 자격 증명을 이미 가지고 있다면(또는 세션 쿠키를 훔쳤다면) 로그인하여 **어떤 권한을 가지고 있는지 확인하고 어떤 저장소에 대한 권한이 있는지, 어떤 팀에 속해 있는지, 다른 사용자 목록을 확인하고 어떻게 저장소가 보호되는지 확인할 수 있습니다.

2단계 인증(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 사용자 이름으로 사용자 이름을 구성했다면, 그 사용자가 설정한 공개 키에 접근할 수 있습니다. 이를 확인하여 찾은 개인 키를 사용할 수 있는지 확인할 수 있습니다.

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은 새로운 관리자 사용자를 생성하고 액세스 토큰을 받습니다.

最終更新