自宅のUbuntu DesktopにNextcloudを入れてローカル内で公開してみた
動作に必要な環境構築
最近、家にあったラップトップ一台をUbuntuにマルチブートしたので、サーバの勉強も兼ねやってみることにした。
それでは本題に入る。まずは、動作に必要な環境を揃える。次のコマンドを実行する。
$ sudo apt install apache2 mysql-server php php-xml php-cgi php-cli php-mysql php-mbstring php-gd php-curl php-zip
次に、phpの設定ファイルを少し書き換えます。sudoで行います。私はvimを使用しました。
$ sudo vim /etc/php/7.2/apache2/php.ini
そして、以下の部分を書き換えます。vimはページ内のキーワードを、'/target'で検索することが出来ます。
★メモリー使用量の上限
memory_limit = 512MB
★POSTデータの最大サイズ
post_max_size = 100M
★ファイル当たりの最大アップロードサイズ
upload_max_filesizes = 100M
そして、今度は.htaccessを有効にします。以下のコマンドを実行し、下の様になってる部分を書き換えます。
$ sudo vim /etc/apache2/apache2.conf
★イジる場所
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
以上の事が終えたら、一先ずapache2が動いてるか確認してみるために次のコマンドを実行し、プライベートIPをブラウザのアドレスが入る場所に入れて確認する。
$ sudo a2enmod headers
$ sudo systemcyl apache2
DBの作成
まず、MySQLサーバにログインする。
$ sudo mysql
ログインすると"mysql > "となる。続けてDB名、ユーザ名、パスワード名を設定していく。
> CREATE DATABASE nextcloud;
> GRANT ALL PRIVILEGES ON nextcloud.* TO 'ncadmin'@'localhost' IDNETIFIED BY 'password';
> exit
これでDBの作成は終了だ。
Nextcloudのインストール
最新のNextcludをダウンロードするために、Nextxloudの公式サイトにアクセスしそこから、最新版のzipを探してください。私の時はnextcloud-16.0.1.zipが最新版でした。wgetコマンドでダウンロードします。そしてこれはzipファイルなので解凍までします。
$ wget https://download.nextcloud.com/server/releases/nextcloud-16.0.1.zip --no-check-certificate
$ unzip nextcloud-16.0.1.zip
展開すると""nextcloud""フォルダが作成されます。これがNextcloudの本体です。これを、webサーバの""/var/www/html/""に移動させます。
$ sudo mv nextcloud /var/www/html/
Nextcloudは、基本的に自身を稼働させるホスト以外からのアクセスを受け付けていません。なので、次のコマンドで新たに設定ファイルを新規作成します。以下の様に記述します。
$ sudo vim /var/www/html/nextcloud/config/config.php
<?php $CONFIG = array ( 'trusted_domains' => array ( 0 => 'アクセスを許可するホストのIPや、NWアドレスを入れる', ), );
次に、移したフォルダーの所有者とグループを””Apache(www-data)""に変更すると、webブラウザ上でNextcloudが動作するようになります。
$ sudo chown -R www-data:www-data /var/www/html/nextcloud/
これで、Nextcloudサーバにアクセス出来るようになったので、webブラウザでサーバのIPアドレス/nextcloudにアクセスしてみましょう。別のPCでもアクセス可能です。初回アクセス時は、初期設定画面が出ると思うので指示に従ってセットアップしてください。
※プライベートIPも動的に振られているので、毎回同じアドレスで接続したい場合はIPアドレスをマシンの設定で静的に設定しておいた方が良いでしょう。動的に割り振った状態で使うときは、変わるたびにconfig.phpのアドレスの部分を書き換えなければなりません。
終わりに
今回は、ローカル環境でNextcloudサーバを構築してみました。親のデスクトップが資料まみれでバラバラだったのをこのクラウドで整理したり、写真の共有なんかにも使えててそこそこ便利です。そして、現在はサーバについて勉強中のため実際に手を動かすことでより理解できたので良かったです。
個人的な事ですが、最近はインプットの方が多く、ブログなどでアウトプットが出来ていませんでした。最低でも一ヶ月に一回は更新していきたいなぁ…と思っています。
CTFlearn : DON'T BUMP YOUR HEAD(ER)
今回はCTFlearnというサイトの問題を解いていこうと思う。
問題はこちらから。
解説
http://165.227.106.113/header.php
上記のサイトからフラッグを見つけるようだ。まずは開いてみる。
Useer Agentが正しくないとのこと。ページのソースを見てみる。すると以下の様になってた。
Sorry, it seems as if your user agent is not correct, in order to access this website. The one you supplied is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
<!-- Sup3rS3cr3tAg3nt -->
Sup3rS3cr3tAg3ntとあるので、User Agentの値をSup3rS3cr3tAg3ntに変える。今回はPostmanというのを使っていこうと思う。
ヘッダーのUser-Agentを変えて送ってみる。
すると、次は以下の様に出る。
Sorry, it seems as if you did not just come from the site, "awesomesauce.com".
<!-- Sup3rS3cr3tAg3nt -->
なので、今度はヘッダのRefereの値をawesomesauce.comに変える。
これでフラッグが出た。
終わりに
今回はhttpヘッダがメインの内容だった。ある程度は知っていたが、復習もかねて少しまとめてあるサイトを読んだりした。
picoCTF : store
久しぶりの記事です。今回はpicoCTFのstoreに挑戦したいと思います。
環境:VMware,DebianベースのLinuxを使っている
解説
問題は以下の様にある。
まず、sourceとstoreをダウンロードしてファイル形式を調べる。storeはelfファイル、sourceは普通にCのスクリプトですね。storeの方を実行してみます。すると以下の様になりました。
質問文を読むにflagを買えってことなんでしょうね。という事で、残高(account balance)を聞いてみました。すると、今は1100入ってることが確認できました
次に、[2]の"Buy Stuff"をやってみることにしました。直ぐに買えるといいなぁ、という淡い期待を抱きながらReal Flagである2番を選びましたが、普通に預金では買えない額ですね(笑)。100000$要るそうです。
という事で、今度は"1"の"I Can't Believe its not a Flag!"を選択してみました。1つは買えましたけど、意味ないですね…預金も減ってしまいました。
これまでの事を鑑み整理すると、私がしたいことは正解であろうRealFlagを購入できるだけの金額に預金を増やすことです。次は、ダウンロードしたソースコードを読むことにしました。
必要な部分だけ、ピックアップしてみることにしました。これから、分かることはfake flagの合計金額(total_cost)は、1000*number_flagsとして算出されているという事と、そして残高はaccount_balance = account_balance - total_costと処理されているという事です。これらの事から、number_flagsに巨大な整数を入力し整数オーバーフローを実行できることが予想出来ました。(number_flagsに対する入力チェックもなされていない)
予想から、大きな数字を入力してみると残高が莫大な数字に増えた。これで、RealFlagが買える。買ってみると、picoCTF{~~~}形式の答えが現れた。
終わりに
記事を出すのは久しぶりだったが、picoCTFをしていた。この"store"という問題は面白いなと思ったので記事にしてみた。入力された変数が適切な値であるかチェックすることが大切そうですね。
Google CTF : Beginner Quest : MEDIA-DB
前回と同じ前置きになるが、間違っているところや改善点があったらコメントして欲しい。
環境:VMware,DebianベースのLinuxを使っている
解説
今回は、"Google CTF : Beginner Quest : MEDIA-DB"を解いていく"Attachment"から問題ファイルをダウンロードする。zipファイルなので解凍する。
解凍すると、pythonのファイルが出てくる。nc media-db.ctfcompetition.com 1337 を実行することで出てくるプログラムのスクリプトのようだ。以下の様になっていた。
#!/usr/bin/env python2.7
import sqlite3
import random
import sys
BANNER = "=== Media DB ==="
MENU = """\
1) add song
2) play artist
3) play song
4) shuffle artist
5) exit"""
with open('oauth_token') as fd:
flag = fd.read()
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("CREATE TABLE oauth_tokens (oauth_token text)")
c.execute("CREATE TABLE media (artist text, song text)")
c.execute("INSERT INTO oauth_tokens VALUES ('{}')".format(flag))
def my_print(s):
sys.stdout.write(s + '\n')
sys.stdout.flush()
def print_playlist(query):
my_print("")
my_print("== new playlist ==")
for i, res in enumerate(c.execute(query).fetchall()):
my_print('{}: "{}" by "{}"'.format(i+1, res[1], res[0]))
my_print("")
my_print(BANNER)
while True:
my_print(MENU)
sys.stdout.write("> ")
sys.stdout.flush()
choice = raw_input()
if choice not in ['1', '2', '3', '4', '5']:
my_print('invalid input')
continue
if choice == '1':
my_print("artist name?")
artist = raw_input().replace('"', "")
my_print("song name?")
song = raw_input().replace('"', "")
c.execute("""INSERT INTO media VALUES ("{}", "{}")""".format(artist, song))
elif choice == '2':
my_print("artist name?")
artist = raw_input().replace("'", "")
print_playlist("SELECT artist, song FROM media WHERE artist = '{}'".format(artist))
elif choice == '3':
my_print("song name?")
song = raw_input().replace("'", "")
print_playlist("SELECT artist, song FROM media WHERE song = '{}'".format(song))
elif choice == '4':
artist = random.choice(list(c.execute("SELECT DISTINCT artist FROM media")))[0]
my_print("choosing songs from random artist: {}".format(artist))
print_playlist("SELECT artist, song FROM media WHERE artist = '{}'".format(artist))
else:
my_print("bye")
exit(0)
これを見ていくと、まずはSQLite3であることが分かる。SQLインジェクションを使う問題だろうと予想できる。また、色付けした部分を見ればoauth_tokenファイルに書かれているflagをoauth_tokensテーブルに置いてることが分かります。
次にSQLインジェクションをどうするか考えます。定石の、シングルクオーテーションを入れてみたら、エラーメッセージが表示されました。
=== Media DB ===
1) add song
2) play artist
3) play song
4) shuffle artist
5) exit
> 1
artist name?
'
song name?
'
1) add song
2) play artist
3) play song
4) shuffle artist
5) exit
> 4
choosing songs from random artist: '
== new playlist ==
Traceback (most recent call last):
File "./media-db.py", line 76, in
print_playlist("SELECT artist, song FROM media WHERE artist = '{}'".format(artist))
File "./media-db.py", line 45, in print_playlist
for i, res in enumerate(c.execute(query).fetchall()):
sqlite3.OperationalError: unrecognized token: "'''"
なので今回のsqlインジェクションではシングルクオーテーションを利用しようと思います。tokensの方から、tokenを取ってくるような分にします。” ' UNION SELECT ( SELECT oauth_token FROM oauth_tokens), 1 -- ”、としてやってみます。
成功した。CTF{~~}形式の文字が出てきたこれが今回の答えだ。
終わりに
今回の問題はSQLインジェクションを利用した問題だった。SQL文について調べたものの理解できたには程遠いと思うのでもっと勉強しておきたい。なかなか、入れるSQL文が思い浮かばないのが難点…まだまだ、SQLに対する理解は浅いのでより深いものにしたい。
参考にしたサイト(Google CTF: Beginner Quest: MEDIA-DB (SQL Injection) - YouTube)
Android Hacking with Evil-Droid
はじめに…
自分の管理下にあるネットワークや、デバイスで行ってください。他人のデバイスやネットワークに対して行った場合、法的措置(不正指令電磁的記録に関する罪等)に問われる可能性があります。この記事は攻撃を推奨するものではなく、侵入テストに対する記事です。発生した事象に対する一切の責任を負いません。
環境
下準備(少し説明)
題名の通り"Evil-Droid"というものを使っていく。ベースは言わずと知れた"Metasploit"、こちら使ったことのある方は分かると思うが、ほとんどCUI操作。これを、GUI操作に近くしたものが"Evil-Droid"。下のURLを参考に"git clone"してください。
こんな感じで実行ですね。私はデスクトップに入れました。"Evil-Droid"ファイルが出来るのでそちらに移動。ついでに、"chmod +x evil-droid"でアクセス権限を変更しとく。後は"./evil-droid"で実行。no.1参照。
本題
no.1をすると、下のno.2の様になる。最初は、Zipalignが入ってないとエラーを吐くと思うが、勝手に入るので。気にしなくていい。次に、ポップアップが出てくるのでyesを押す。
すると、postgresqlなど必要なサービスを開始してくれる。少しして、no.3のようになる。次はターゲットに送るペイロードの作成。ここからが、本番。
"[?] Select>:" 以降に"1"を入力。
壱. すると、ローカルホストのipアドレスを入力する様に聞いてくるので"ifconfig"なりで確認し、入力する。元から、埋まってる場合は書き換えなくても良い。多分。
弐. 次はポートの指定。大体"4444"が多いし、デフォルトで4444で埋まってる。
参. 次はこのペイロードの名前だ。私は”Zuck"にした。
肆. そして、どういった手法なのかを選ぶ。今回は"android/meterpreter/reverse_tcp"を選択。
伍. ペイロードが作成され保存場所が示される。
陸. 最後にハンドラモジュールを起動。
説明したようにすると、Metasploitが自動で動き出す。次に、ターゲットのアンドロイド端末に先ほど作ったペイロードを送り、そちらの端末でペイロードを実行する。送る方法は何でもいい。私は"var/html/www"にペイロードを置いてターゲット端末にダウンロードする方法でやった。すると、meterpreter >となりターゲット端末を扱えるようになります。ちなみに、私は最初にlsコマンドを使用しましたが、helpコマンドでどんな事が出来るのか見て試してみるといいと思います。
最後に
今回は、アンドロイド端末の簡単なハッキングをしてみた。思ったより色々な事が出来て面白かった。あと、普通にmsfconsoleから使うより楽だなと思いました。アンドロイドに限るけど。
Google CTF : Beginner Quest : GATEKEEPER
前回と同じ前置きになるが、間違っているところや改善点があったらコメントして欲しい。
環境:VMware,DebianベースのLinuxを使っている
解説
今回は、"Google CTF : Beginner Quest : GATEKEEPER"を解いていく"Attachment"から問題ファイルをダウンロードする。zipファイルなので解凍する。
解凍すると、gatekeeperが出てくる。"file"でどんなものなのか確認する。
$ file gatekeeper
gatekeeper: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a89e770cbffa17111e4fddb346215ca04e794af2, not stripped
elfのようなので実行してみると、以下の様に出力される。
エラーの内容を見るに、 "./gatekeeper ユーザー名 パスワード"の順で入力してログインする必要がありそうだ。なので、適当にやってみる。
$ ./gatekeeper hello 123
/========================================\
| Gatekeeper - Access your PC from everywhere! |
+=======================================+
~> Verifying....
ACCESS DENIED
~> Incorrect username
もちろん、アクセスできなかった。次は"strings"を利用してみる。すると、26行目辺りにヒントになりそうな文字が見える。他にも、11行目のstrcmpから文字列の比較をしている事も分かる。
$ strings ./gatekeeper
usleep
__cxa_finalize
strcmp
__libc_start_main
一部省略
Usage: %s <username> <password>
~> Verifying.
0n3_W4rM
~> Incorrect username
zLl1ks_d4m_T0g_I
Correct!
Welcome back!
CTF{%s}
~> Incorrect password
"0n3_W4rM"と、"zLl1ks_d4m_T0g_I"が怪しい。後者は、"I got mad skillz"を逆にした文字列と推測できる。(前者は"one warm")
0n3_W4rMの下の行に、incorrect usernameとあるので、これがユーザーネームと推測すした。そして、zLl1ks_d4m_T0g_Iがおそらくパスワード。試してみる。
Incorrect passwordと出てきた。ユーザーネームは有っていたようだ。zLl1ks_d4m_T0g_Iは先ほど言ったように、正しく読もうとすれば逆になっているので、逆にして入力してみる。(逆にしたものI_g0T_m4d_sk1lLz)
成功した。CTF{~~}形式の文字が出てきたこれが今回の答えだ。
終わりに
今回の問題は、リバースエンジニアリングが正攻法だと思う。しかし、半分勘みたいな所はあるがstringsだけでも分かった。次はもっとちゃんとしたリバースエンジニアリング出来るように知識を詰めたい。
ちなみに、3はe、4はa、0はo、5はs、etc...といった感じで海外では使われていますよね。leetと言うそうです。
Leet - Wikipedia
参考にしたサイト(Google Capture The Flag 2018 (Quals) / Beginner's Quest - Gatekeeper)
Google CTF : Beginner Quest : FIRMWARE
前回と同じ前置きになるが、間違っているところや改善点があったらコメントして欲しい。
環境:VMware,DebianベースのLinuxを使っている
解説
今回は、"Google CTF : Beginner Quest : FIRMWARE"を解いていく"Attachment"から問題ファイルをダウンロードする。zipファイルなので解凍する。
解凍すると、challenge.ext4.gzが出てくる。今度はgzファイルなので、guzipで解凍する。
$ gunzip challenge.ext4.gz
解凍すると、"challenge.ext4"が現れる。"mount"でフォルダにマウントする。私はCTFというフォルダを作りそこにマウントした。そして、CTFに移動する。中に何が入っているか確認するために"ls -a"を使った。すると、".mediapc_backdoor_password.gz"が怪しい。解凍してみる。最後にこれに"cat"を使うとCTF{・・・}が出てくる。
$ sudo mount challenge.ext4 ./CTF
$ cd CTF
$ ls -a
. boot home lost+found mnt root srv usr
.. dev lib media opt run sys var
bin etc lib64 .mediapc_backdoor_password.gz proc sbin tmp
$ gunzip .mediapc_backdoor_password.gz
$ cat .mediapc_backdoor_password
CTF{・・・・}
最後に出てきたこれがフラッグだ。
終わりに
今回の問題は、今までのに比べると温かった気がする。write upを参考にしなくても解けた。一応、確認の為みたサイトを挙げておく。
参考にしたサイト(CTF-Writeups/Google CTF 2018 Quals Beginners Quest/Firmware at master · BOAKGP/CTF-Writeups · GitHub)
気になったら調べておくといいかもなワード
- ext4ファイル
- mountコマンド(私は、復習に確認をした)