# Giteaのセキュリティ

{{#include ../../banners/hacktricks-training.md}}

## Giteaとは

**Gitea**は**自己ホスト型のコミュニティ管理の軽量コードホスティング**ソリューションで、Goで書かれています。

![](<../../images/image (160).png>)

### 基本情報

{{#ref}}
basic-gitea-information.md
{{#endref}}

## ラボ

ローカルでGiteaインスタンスを実行するには、単にdockerコンテナを実行するだけです：
```bash
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
```
## 認証されていない列挙

- 公開リポジトリ: [http://localhost:3000/explore/repos](http://localhost:3000/explore/repos)
- 登録ユーザー: [http://localhost:3000/explore/users](http://localhost:3000/explore/users)
- 登録組織: [http://localhost:3000/explore/organizations](http://localhost:3000/explore/organizations)

デフォルトでは、**Giteaは新しいユーザーの登録を許可します**。これにより、新しいユーザーが他の組織やユーザーのリポジトリに特別なアクセスを得ることはありませんが、**ログインしたユーザー**は**より多くのリポジトリや組織を視覚化できる**かもしれません。

## 内部悪用

このシナリオでは、あなたがgithubアカウントへのアクセスを取得したと仮定します。

### ユーザー資格情報/ウェブクッキーを使用して

もしあなたが組織内のユーザーの資格情報を持っている場合（またはセッションクッキーを盗んだ場合）、**ただログイン**して、どの**リポジトリに対してどの**権限を持っているか、**どのチームにいるか、**他のユーザーを**リストし、**リポジトリがどのように保護されているかを確認できます。**

**2FAが使用される可能性がある**ため、そのチェックを**通過できる**場合にのみ、この情報にアクセスできることに注意してください。

> [!NOTE]
> `i_like_gitea`クッキーを**盗むことに成功した場合**（現在SameSite: Laxで設定されています）、資格情報や2FAを必要とせずに**ユーザーを完全に偽装**できます。

### ユーザーSSHキーを使用して

Giteaは**ユーザー**が**SSHキー**を設定することを許可しており、これが**コードをデプロイするための認証方法**として使用されます（2FAは適用されません）。

このキーを使用して、ユーザーがいくつかの権限を持つリポジトリで**変更を行う**ことができますが、gitea APIにアクセスして環境を列挙するためには使用できません。ただし、**ローカル設定を列挙**して、アクセスできるリポジトリやユーザーに関する情報を取得できます。
```bash
# 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 鍵

[**こちら**](https://github.com/carlospolop/hacktricks-cloud/blob/master/pentesting-ci-cd/gitea-security/broken-reference/README.md) で説明されているように、コミットに署名する必要がある場合や、発見される可能性があります。

現在のユーザーが鍵を持っているかどうかをローカルで確認してください:
```shell
gpg --list-secret-keys --keyid-format=long
```
### ユーザートークンを使用して

[**ユーザートークンの基本情報については、こちらを確認してください**](basic-gitea-information.md#personal-access-tokens) 。

ユーザートークンは、Giteaサーバーに対して**認証**するために**パスワードの代わりに**使用できます[**API経由で**](https://try.gitea.io/api/swagger#/)。ユーザーに対して**完全なアクセス**を持ちます。

### Oauthアプリケーションを使用して

[**Gitea Oauthアプリケーションの基本情報については、こちらを確認してください**](./#with-oauth-application) 。

攻撃者は、フィッシングキャンペーンの一環として、ユーザーが受け入れる可能性のある**悪意のあるOauthアプリケーション**を作成して、特権データやアクションにアクセスするかもしれません。

基本情報で説明されているように、アプリケーションは**ユーザーアカウントに対して完全なアクセス**を持ちます。

### ブランチ保護のバイパス

Githubには、デフォルトでリポジトリに対して**書き込みアクセスを持つトークン**を取得する**github actions**があります。これを使用して**ブランチ保護をバイパス**できます。この場合は**存在しない**ため、バイパスはより制限されます。しかし、何ができるか見てみましょう：

- **プッシュを有効にする**: 書き込みアクセスを持つ誰かがブランチにプッシュできる場合は、単にプッシュします。
- **制限されたプッシュをホワイトリストに追加**: 同様に、このリストの一部であればブランチにプッシュします。
- **マージホワイトリストを有効にする**: マージホワイトリストがある場合は、その中にいる必要があります。
- **承認が0より大きいことを要求**: その場合... 別のユーザーを妥協させる必要があります。
- **ホワイトリストに制限された承認**: ホワイトリストに登録されたユーザーのみが承認できる場合... そのリストにいる別のユーザーを妥協させる必要があります。
- **古い承認を無効にする**: 新しいコミットで承認が削除されない場合、すでに承認されたPRをハイジャックしてコードを挿入し、PRをマージすることができます。

**あなたがorg/repoの管理者である場合**、保護をバイパスできることに注意してください。

### ウェブフックの列挙

**ウェブフック**は、**特定の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` 新しい管理ユーザーを作成し、アクセストークンを取得します。

{{#include ../../banners/hacktricks-training.md}}
