【TryHackMe】Linux Privilege Escalation #0 - Writeup

## はじめに

この記事は、TryHackMeの **"Linux Priviledge Escalation"** の前提知識編です。
Linuxコマンドの基礎を自分用にまとめたメモになっています。

https://tryhackme.com/room/linprivesc

続きは以下にまとめています。　

https://qiita.com/H4ppyR41nyD4y/items/547aeeb6a67062b15900

## Enumeration

ターゲットシステムに侵入し、権限昇格を行うためにはシステムの情報を列挙して調査する必要がある。以下では、その調査に利用できるコマンドがまとまっている。

#### hostname
ターゲットマシンのホスト名を表示するコマンド。
サーバ名などから用途が分かったりする。

#### uname
```
$ uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```
システムが使用しているカーネルに関する詳細情報が分かる。
カーネルの脆弱性が分かる。今回はLinux Kernel「3.13.0-24-generic」を検索すると、脆弱性があり、エクスプロイトコードが入手できる。

#### /proc/version
procファイルシステムを見ることでターゲットシステムのプロセスに関する情報が分かる。カーネルのバージョンやコンパイラのインストール状況などが分かる。
```
$ cat /proc/version
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP
 Thu Apr 10 19:11:08 UTC 2014 
```

#### /etc/issue
OSに関する情報が含まれている。
```
$ cat /etc/issue  
Ubuntu 14.04 LTS \n \l
```

#### ps 
実行中のプロセスが分かる
```
PID: プロセスID
TTY:　端末タイプ
Time:　プロセスが使用したCPU時間
CMD:　実行中のコマンドや実行可能ファイル
```
```
ps -A:　実行中の全プロセス
ps axjf:　プロセスツリーを表示
ps aux:　すべてのユーザー（a）のプロセス、プロセスを起動したユーザー（u）、端末に接続されていないプロセス（x）が表示される
```

#### env
環境変数を表示する。
PATH変数に、コンパイラや言語が含まれる可能性がある。
```
$ env     
MAIL=/var/mail/karen
USER=karen
SSH_CLIENT=10.100.2.89 59162 22
HOME=/home/karen
SSH_TTY=/dev/pts/0
QT_QPA_PLATFORMTHEME=appmenu-qt5
LOGNAME=karen
TERM=linux
XDG_SESSION_ID=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/l
ocal/games
XDG_RUNTIME_DIR=/run/user/1001
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/
SSH_CONNECTION=10.100.2.89 59162 10.10.35.181 22
```

#### sudo -l
sudoを使用して実行できるコマンドすべてを表示。ここから権限昇格できる可能性が高いので超重要。
→　あとで問題を解きながら理解できるのでふーんで良い

#### id
ユーザの権限情報
```
$ id 
uid=1001(karen) gid=1001(karen) groups=1001(karen)
--> whoamiでも現在実行しているユーザ名が分かる

$ id matt
uid=1000(matt) gid=1000(matt) groups=1000(matt),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),12
4(sambashare)
```


#### /etc/passwd

ユーザ名とパスワードが表示される。
通常システムに利用されるユーザはhomeディレクトリに配置されるため、`grep home`で絞っておくと良い。
```
$ cat /etc/passwd | grep home
syslog:x:101:104::/home/syslog:/bin/false
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
saned:x:108:115::/home/saned:/bin/false
matt:x:1000:1000:matt,,,:/home/matt:/bin/bash
karen:x:1001:1001::/home/karen:
---
ユーザ名:x(シャドウパスワード)orパスワード:userID:groupID:コメント:ホームディレクトリ、ログインシェル名
```
`etc/passwd`でパスワードがxになっている場合、パスワードはハッシュ化され`/etc/shadow`に保存されているが、権限がないと`etc/shadow`は閲覧できない。


#### history
過去に実行したコマンドがわかる。


#### ifconfig
システムのネットワークインターフェースが分かる。

```
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:14:21:f9:5f:9f  
          inet addr:10.10.96.33  Bcast:10.10.255.255  Mask:255.255.0.0
          inet6 addr: fe80::14:21ff:fef9:5f9f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:2277 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2136 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:178661 (178.6 KB)  TX bytes:310372 (310.3 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

#### netstat
既存の通信接続に関する情報がわかる。
```
netstat -a:　すべてのリスニングポートと確立されている接続を表示
netstat -at:　TCP,UDPのリスト
netstat -l:　リスニングモード（オープンポート）を列挙。tオプションを付けるとTCPのポートを列挙できる。
netstat -s:　プロトコルベルのNW使用統計。-t,-uと併用可。
netstat -tp:　サービス名とPID情報を持つ接続を列挙。
netstat -i:　インターフェース統計
netstat -ano: ？？
```

#### find

```
find . -name flag1.txt: 現在のディレクトリで「flag1.txt」という名前のファイルを探す
find /home -name flag1.txt: /home ディレクトリで「flag1.txt」という名前のファイルを探す
find / -type d -name config: 「/」の下でconfigという名前のディレクトリを探す
find / -type f -perm 0777: すべてのユーザーによって読み書き、実行可能なファイル（777の権限）を探す
find / -perm a=x: 実行可能なファイルを探す
find /home -user frank: 「/home」の下でユーザー「frank」のすべてのファイルを探す
find / -mtime 10: 最後の10日間に変更されたファイルを探す
find / -atime 10: 最後の10日間にアクセスされたファイルを探す
find / -cmin -60: 最後の1時間（60分）以内に変更されたファイルを探す
find / -amin -60: 最後の1時間（60分）以内にアクセスされたファイルを探す
find / -size 50M: 50 MBのサイズを持つファイルを探す

```

```
find / -writable -type d 2>/dev/null:　書き込み可能なディレクトリ
find / -perm -222 -type d 2>/dev/null:　パーミッション222（書き込み可能）なディレクトリ
find / -perm -o w -type d 2>/dev/null: 他のユーザ(-o,other)が書き込み可能なディレクトリ
find / -perm -o x -type d 2>/dev/null:　他のユーザが実行可能なディレクトリ
```
```
開発ツールおよびサポートされる言語の検索：
find / -name perl*
find / -name python*
find / -name gcc*
```

#### setuid
setuid(セットユーザーID)とは、wrxのような権限の１つで「誰がそのファイルを実行してもセットされたユーザで実行される」という状態である。例えば、passwdコマンドは所有者がrootであるため誰が実行しても必ずrootが実行した状態になる。この設定によっては脆弱性が潜んでいる可能性がある。
→　あとで問題を解きながら理解できるのでふーんで良い

```
find / -perm -u=s -type f 2>/dev/null: 現在のユーザーよりも高い権限レベルでファイルを実行することを可能にするSUIDビットを持つファイルを探す。
```
#### 一般的なLinuxコマンド
下記コマンドを使いこなせるようにしよう。
```
find、locate、grep、cut、sort
```

### 自動列挙ツール

調査を自動化するツールを使う場合、どのツールを利用できるかはターゲットシステムの環境に依存する。例えばpythonで書かれているツールはpythonがインストールされていない環境では利用できない。
以下のようなツールを知っておくと良い。

- LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum: https://github.com/rebootuser/LinEnum
- LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
- Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
- Linux Priv Checker: https://github.com/linted/linuxprivchecker

以上