1.WEST-SECで利用するLinux環境
WEST-SECで利用するLinux環境は、主にAmazonLinuxです。CentOSベースなので、CentOSのコマンドがほぼ使えます。
たまに、利用するツールなどの関係でUbuntuを使うこともあります。
2.Linuxコマンド
WEST-SECでは、Linuxサーバの操作が必要な場合があります。基本コマンドをある程度理解し、それ以外は「検索すればいいじゃん」という考えでいいと思います。
(1)基本コマンド
ファイルを表示するls、パスを移動するcd、ファイルをコピーするcp、ファイルを削除するrm、ファイルの中身を表示する(catやless)、検索するgrepなどがあります。
以下のサイトがわかりやすいです。
qiita.com
qiita.com
・事前作業(主催者)
以下のフォルダを作り、読み書き実行権限(Read:4 + Write:2 + Execute:1 =7)を付与しています。
mkdir /var/www/html/user chmod 757 /var/www/html/user #otherのユーザにw権限を与えるという意味で、chmod o+w /var/www/html/user でもいい。
・皆さんの作業
cd /var/www/html/user/ mkdir userX <--自分のユーザ番号 cd userX
(2)viエディタ
WEST-SECでは、設定を書き換える問題は、それほど多くありません。
ですが、古くからある標準のテキストエディタであるvi、または、改良版(iMproved)のvimを使えるようにしましょう。
以下のサイトに、基本的な操作がまとまっています。
eng-entrance.com
最低限の操作であれば、以下だけ覚えておきましょう。
・i で編集モードにする
・ESCで編集モードを抜ける --> ESCキーを押した後、Shift を押しながらzzで保存
--> ESCキーを押した後、間違えて保存したくないなら :q!
では、以下でエディタを開き、好きな文字を入れてみましょう。HTMLの構文にする必要はありません。
cd /var/www/html/user/user1
vi index.html
http://IPアドレス/user/user1/index.html に接続すると、上記で入力した文字が表示されることでしょう。
(3)Webサーバのログ確認
・主催者から指定されたWebサーバに接続してください。
・自分のグローバルIPアドレスを調べます。
ネットで「自分のIPアドレス」などで検索すると、調査してくれるサイトが表示されます。例)
https://www.cman.jp/network/support/go_access.cgi
・ログファイルを見てみましょう。
- CentOSの場合:/var/log/httpd/access_log
- Ubuntuの場合:/var/log/apache2/access.log
※事前にchmod o+r+x /var/log/httpd/access_log として、一般ユーザがログを閲覧できるようにしています。
・Logがたくさんありますね。これではどれが自分のログかがわかりません。そこで、grepを使って、自分のIPアドレスのログがあるかを確認しましょう。
cat /var/log/httpd/access_log | grep 203.113.0.132
(4)ログ解析のコマンド
ログは表示項目が大量にあり、そのまま解析するのは大変です。Excelで解析もいいのですが、Linux上でも整形できます。
いくつかの方法がありますが、awk(オーク)を使ってみましょう。awkに関しては、以下がまとまっています。
とほほのAWK入門 - とほほのWWW入門
①表示したい行を限定
cat /var/log/httpd/access_log | awk '{print $1}'
※複数表示する場合は、'{print $1,$2}' という感じで。
※awk -F "," とすることで、区切り文字をカンマ(,)に指定できます。
(2)数を数える
uniqで重複を排除、sortで並び替え、-cオプションで件数を数える
cat /var/log/httpd/access_log | awk '{print $1}' | sort | uniq -c
さらに、この結果を件数が多い順に並び替えるには、以下。※2回sortしないとカウントされないものがあります。
cat /var/log/httpd/access_log | awk '{print $1}' | sort | uniq -c | sort -n -r
3.nginx
nginx(エンジンエックス)は軽量のWebサーバ
(1)設定の確認
#バージョンの確認 nginx -v # ==> nginx version: nginx/1.22.1 #サービスが起動しているかの確認 systemctl status nginx
ブラウザを立ち上げ、http://(サーバのIPアドレス)を指定し、Webサーバにアクセスできるかを確認。※httpsではないので注意。
「Welcome to nginx!」の文字が見えるはず。
(2)Webページの作成、該当ページへのアクセス
次は自分専用のページを作りましょう。
以下のフォルダがnginxのコンテンツの置き場所(デフォルト)。
/usr/share/nginx/html
・デフォルトのページを見てみよう。
#該当フォルダへ移動 $ cd /usr/share/nginx/html #index.htmlを表示する $ cat index.html
すると、先ほど見た「Welcome to nginx!」と記載されたページの内容が書かれてあるはず。
・自分のユーザ名のフォルダに移動してファイルを作成する。
#たとえば、user34であれば cd /usr/share/nginx/html/user/user34 #viまたはvimでファイルを作成。拡張子は.htmlとしましょう。 vim a.html #単に文字を打つだけなら、以下でも可能 echo "hello" >/usr/share/nginx/html/user/user34/a.html
・以下にアクセスし、自分が作ったファイルが作成されていることを確認しましょう。
http://(サーバのIPアドレス)/user/user34/a.html
文字化けするときは、以下を入れてください。
<meta http-equiv="content-type" charset="UTF-8">
たとえば、以下のようになります。
<html> <meta http-equiv="content-type" charset="UTF-8"> こんにちは! </html>
(3)設定ファイルの確認
nginxの設定ファイル(/etc/nginx/nginx.conf)を見て、このWebサーバの待ち受けポートや、コンテンツファイルやログのpathを確認しましょう。
(4)ログの確認
先ほどの設定ファイルに記載があったように、ログは以下です。
/var/log/nginx/access.log
tailまたはlessでログを見ましょう。
#lessでファイルを見る。抜ける場合は「q」。 less -f /var/log/nginx/access.log #lessでファイルを見る。必要に応じて、自分のIPアドレスでgrepすると、自分のログだけ見えます。 less -f /var/log/nginx/access.log | grep 203.0.113.231 #tail-f でリアルタイムログ。以下を実行し、再度Webページにアクセスすると、ログが増える。抜ける場合は「ctl」+「c」 tail -f /var/log/nginx/access.log
・ログには何が書いてありますか?中身を全て確認しておきましょう。
http://nginx.org/en/docs/http/ngx_http_log_module.html
最後のuser-agentは、PCとスマホで違いを確認しましょう。
・以下を参考にして、user-agentごとに何件のアクセスがあったかを確認してください。
https://west-sec.com/linux_command#4%E3%83%AD%E3%82%B0%E8%A7%A3%E6%9E%90%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
ヒントは以下をドラッグ
区切り文字として"を指定するとわかりやすいです。 -F '"'
4.ユーザのログイン関連の確認コマンド
・last:ログイン履歴
last ユーザ名か、| grepで自分のユーザを指定し、ログイン時刻を確認しましょう。
last user1
・lastb:ログイン失敗履歴
/var/log/btmpファイルは一般ユーザには権限がないので、好ましい設定ではないですが、 chmod o+r /var/log/btmp を実行しています。
みると、大量の不正アクセスが確認できる。
lastb
・who:現在ログインしているユーザの一覧
whoコマンドは、現在ログインしているユーザが、いつ、どこからログインしたかを表示する。直接ログインしている場合はtty(teletypewriter)と表示され、リモートなどから接続する場合はpts(pseudo terminal slave)と表示されます。
who
・/var/log/secure:ログイン成功/ログイン失敗
ログインだけでなく、パスワード変更、sudoコマンド実行などの履歴が表示される。
| grep で自分のユーザを指定し、履歴を確認しましょう。
cat /var/log/secure
5.PHP
(1)インストールなど
・PHP(Personal Home Page Tools)は、Webページで簡単にプログラムを書くことができる言語です。
・インストール
yum install -y php php-devel php-mysql php-gd php-mbstring
・バージョンの確認をしてみよう。
php -v
・初歩の初歩として、簡単なページを動かしてみましょう。以下が参考になります。
https://www.pasonatech.co.jp/workstyle/column/detail.html?p=2097#chapter-10
・/var/www/html/user/userXの配下にtest.phpなどの名前で作成します。
cd /var/www/html/user/ #以下は、すでに作成してあれば不要 mkdir userX <--自分のユーザ番号 #自分のディレクトリに移動 cd userX vi test.php
たとえば、こんなソースコードです。インターネットからアクセスしてみましょう。うまく表示されましたか?
<?php echo 'run PHP'; ?>
(2)フォームを作ってみよう
・作成するページは以下の2つ
ファイル名 | 説明 |
---|---|
input.html | 数字を入力してもらう |
number.php | 入力された数字を表示する |
・作り方
- 入力してもらうには formタグを使う
- method="post"としてください。
- 渡された値をphpで表示するには、print($_REQUEST['number']); とする
では皆さん、頑張って作ってみてください。
【補足】nginxを使うなどして、文字化けするようであれば、以下を入れてください。
<meta http-equiv="content-type" charset="UTF-8">
■input.html
<html> <meta http-equiv="content-type" charset="UTF-8"> 好きな数字を半角で入力してください。 <form action="./number.php" method="post"> <input type="text" name="number" value=""><br> <input type="submit" value="送信" > </form> </html>
■number.php
<html> <meta http-equiv="content-type" charset="UTF-8"> あなたの好きな数字は、 <?php print($_REQUEST['number']); ?> です。 </html>
(3)変更してみよう
❶メソッド
method="get"とmethod="post"でどんな違いがあるかを確認しよう。
URLとWebサーバのログを確認しましょう。
- CentOSの場合:/var/log/httpd/access_log
- Ubuntuの場合:/var/log/apache2/access.log
❷演算してみましょう。
・数字を2つ入力させて、その掛け算結果を表示してみよう。その際、(int)をつけて、文字を数字に型変換(キャスト)しましょう。
・送信の表示を「掛け算」にすると、皆さん手作りの電卓アプリっぽいですね。
■input.html
<html> 好きな数字を2つ、半角で入力してください。 <form action="./number.php" method="post"> 数字1<input type="text" name="number1" value=""><br> 数字2<input type="text" name="number2" value=""><br> <input type="submit" value="掛け算" > </form> </html>
■number.php
<html> あなたの好きな2つの数字を掛け算すると、 <?php print((int)$_REQUEST['number1']*(int)$_REQUEST['number2']); ?> です。 </html>
(4)OSコマンドインジェクションの脆弱性
以下のphpファイルを作ってください。コピペで動くと思います。
|
■ping.php
<!DOCTYPE html> <html lang="ja"> <body style="text-align:center;"> <h1>Ping</h1> <?php print "Enter IP address<br>\n"; ?> <form method="post"> <input type="text" size="30" name="ipaddress" placeholder="127.0.0.1"><br> <input type="submit" value="check"> </form> <?php if(isset($_POST['ipaddress'])){ $ipaddress = $_POST["ipaddress"]; $output = null; $retval = null; exec("ping -c 1 $ipaddress", $output, $retval); $output = nl2br(mb_convert_encoding(implode("\n", $output), "utf-8", "auto")); echo $output; } ?> </body> </html>
ソースコードの以下の部分がポイントです。OSコマンドを実行させるには、何を入れたらいいか、考えてみてください。
exec("ping -c 1 $ipaddress", $output, $retval);
攻撃1:whoコマンドを実行する
攻撃2:/etc/passwdファイルを表示する
もし、ソースコードが以下だったら、どういう値を入れればいいでしょうか。
exec("ping -c 1 '$ipaddress'", $output, $retval);
4.C言語
(1)概要など
・かつて、プログラム言語を学ぶときの基本として多くの方が学習した言語です。最近は、javaやpythonを含め、他の言語が使われることが増えています。
・以下のサイトに基礎の基礎があります。
https://c-lang.sevendays-study.com/day1.html
(2)簡単なプログラムを作ってみよう
画面上に「hello」を出力するプログラムである hello.exe を作ります。
①hello.cというファイルを作ります。
#include<stdio.h> int main(){ printf("こんにちは\n"); }
②コンパイルして、hello.exeというファイルを出力
gcc -o hello.exe hello.c
③実行権限の付与
chmod +x hello.exe
④ファイルの実行
./hello.exe
⑤pingを打つプログラムを作ってみよう
#include<stdio.h> int main () { system ( "ping 8.8.8.8" ); }
5.Python言語
(1)概要など
オブジェクト指向型の言語で、スクリプト言語です。CやJavaなどに比べてシンプルな構文になっていて、なおかつ軽量、高速で、非常に人気のプログラムです。
❶環境構築
・WindowsPCやLinux環境でも動作しますが、GoogleColab環境が手軽でグラフィカルな表示もできてお勧めです。
https://colab.research.google.com/?hl=ja
・Googleアカウントが無い場合、paiza.ioが便利です。
https://paiza.io/ja/projects/new?language=python3
❷Linuxの場合
# python3 --version Python 3.7.15 # python3
これにより、Pythonを実行できます。
(2)とりあえず、動かしてみよう
以下、いくつか初歩的な操作の記載があります。
https://qiita.com/AI_Academy/items/b97b2178b4d10abe0adb
>>> 1+1 2 >>> a=1 >>> b=2 >>> a+b 3
(3)ループ処理をしてみよう
❶1~10までの和を求めよう
注意点は、インデントに意味があるという点です。困ったら、ツールの自動インデント機能を使いましょう。具体的には前の行でEnterを押します。
total=0 for n in range(1,11): #nは1-10の値を取ります。 total = total + n print(total) #-->55
または、こんな風にも書けます。
print(sum(range(1,11)))
❷1~nまでの和が1830になるnを求めよう
以下をいれてみよう。このままでは動かないので、少し工夫してください。
if total == 1830: break
正解は以下になります。マウスでドラッグしてください。※仕様上、インデントが消えてしまっていますので、ご注意を。
for n in range(100):
total = total + n
if total == 1830:
break
print(n)
❸パスワードを解析(ハッシュ値から元のパスワードを求める)
user32のパスワードを解析したいと思います。
パスワードはmd5によってハッシュ化(=暗号化)されていて、サーバを攻撃して得たハッシュ値は 52dcb810931e20f7aa2f49b3510d3805 です。
user32のパスワードは、文字「pass」と数字5桁を組み合わせた単純なものであることがわかっています。***を設定して、プログラムを完成させましょう。
import hashlib hash='52dcb810931e20f7aa2f49b3510d3805' for ***: data='pass'+str(i) calc = hashlib.md5(pwd.encode()).hexdigest() if calc == hash: *** break
正解は以下になります。マウスでドラッグしてください。※仕様上、インデントが消えてしまっていますので、ご注意を。
import hashlib
hash='52dcb810931e20f7aa2f49b3510d3805'
for i in range(100000):
data='pass'+str(i)
calc = hashlib.md5(data.encode()).hexdigest()
if calc == hash:
print(data)
break
(4)動かないときの対処
プログラムがエラーになって困ったら、自分で考える以外に、今はchatGPTに聞くって方法もあります!どこが間違っているかを指摘し、修正コードまで書いてくれます。