こんにちは.最近は呪術廻戦をアニメで見て漫画を全巻揃えてしまいました.いつになってもバトル漫画は良いものです.今回はNTTコミュニケーションズさんにより開催されたインターンシップに参加して二週間ネットワークをゴニョゴニョしてきました.
[Read More]SecHack365を修了しました
こんにちは.今回はSecHack365のレポートを書きます. 私は開発駆動コースに参加していました.
SecHack365とは?
SecHack365(以下SecHack)はNICTが主催する人材育成プロジェクトです.特徴を公式サイトから引用します.
若手セキュリティイノベーター育成プログラム SecHack365は、25歳以下の学生や社会人から公募選抜する40名程度の受講生を対象に、サイバーセキュリティに関するソフトウェア開発や研究、実験、発表を一年間継続してモノづくりをする機会を提供する長期ハッカソンです。全国の一流研究者・技術者や受講生等との交流をするなかで、自ら手を動かし、セキュリティに関わるモノづくりができる人材 (セキュリティイノベーター) を育てます。
公式サイトにあるように産学の各領域の第一線で活躍されている方々とNICTからサポートを受けながら1年間開発を行うことができます.
[Read More]Linux Network Namespaceを使用したネットワークシミュレータの紹介
こんにちは.12月に入り非常に寒い日々が続いています.個人的には10月から続いていたセキュリティキャンプが一段落して少し余裕が出てきました. また,この記事はSecHack365 Advent Calendar 2020の記事として書いています. 今回は趣味で開発しているツールを紹介します.
[Read More]XDPが実行できるVagrantfileを探して
こんにちは.大学院の後期授業も開始され,さらに多数イベントが同時並行で開催されており非常に忙しい日々を過ごしています.最近は将棋の勉強にも精を出しています.弱いですが. 今回はXDPが実行できるVMをVagrantで作ります. 先日GMOペパボさんのeBPFインターンシップに参加させていただいて以降eBPF関連の技術に興味を持っておりXDPに手を出してみます.
[Read More]GMOペパボの研究開発コースインターンシップに参加しました
参加の経緯
確か最初にインターンの開催を知ったのはtwitterだったと記憶しています.エンジニアインターンはWeb系の募集がほとんどで低レイヤを扱うインターンを探していたので即応募しました.
内容
僕が参加したのは研究開発/SREコースでeBPFを使用したトレーシングツールの作成を行いました.eBPFとはextended Berkeley Packet Filterの略でユーザー空間からプログラムを挿入してカーネル空間のデータを取得することができる技術です.
今回のインターンではUchio KondoさんとP山さんにメンターとしてついていただきeBPFのチュートリアルから初めて最終的に参加者それぞれが一つのツールにまとめて成果として最終日に発表しました.お二方には期間中とても手厚くサポートしていただきました.ありがとうございました.
SoftEther VPN Server APIのGo版を作った
こんにちは.最近は学校の課題や事務手続きやらインターンどうしようかやらで非常に忙しいです.それに加えてSecHack365に参加することとなりこれはうれしい悲鳴ですがさらに忙しいです.(嬉しい) さて今回はSoftEtherについてです.学生などにはあまり馴染みがなさげなソフトですが,僕は研究でこのソフトに非常にお世話になっております.このソフトウェアはとてもすごいんですが,マネージャーソフトがwindows用しかなくてCUIベースの操作が大変なのでWebベースのマネージャーを作ろうと思い立ちました.そこでまずGo言語でAPIのラッパーを作成しました.
[Read More]SECCON Beginners CTF 2020 Elementary stackを理解する
こんにちは.リモート授業で一度も授業が一度も授業に現れず資料も与えられずにただただ課題のPDFが配布される授業があるのですが,中間試験はしっかりと行われることが告知されて萎えています.今回はCTF4Bから2週間弱たちましたが,解けなかった問題について考えてみました.
僕が本番で解けた問題のWrite upはこちら.
Elementary stack
Pwnの問題です.本番ではチラッと覗いて難しそうだったのであまり時間をかけず他の問題を考えていましたが.楽しそうなのでこの問題について考えてみました.いくつかwrite upを梯子して僕がどのように考えたのかをメモします.実行ファイルchallとmain.c,libc-2.27.soが与えられました.
コードは以下のようになっています.
long readlong(const char *msg, char *buf, int size) {
printf("%s", msg);
if (read(0, buf, size) <= 0)
fatal("I/O error");
buf[size - 1] = 0;
return atol(buf);
}
int main(void) {
int i;
long v;
char *buffer;
unsigned long x[X_NUMBER];
if ((buffer = malloc(0x20)) == NULL)
fatal("Memory error");
while(1) {
i = (int)readlong("index: ", buffer, 0x20);
v = readlong("value: ", buffer, 0x20);
printf("x[%d] = %ld\n", i, v);
x[i] = v;
}
return 0;
}
無限ループに囲まれているのでmain関数のリターンアドレスを書き換えるようなことはできなさそうです.mallocでbufferの領域を保持してそこにreadを使用して値を書き込んで配列xに値を書き込んでいくプログラムのようです.
mallocした場所に入力値を格納しているのですが,ローカル変数*bufferとして保持した領域のポインタを持っているのでなんとかなりそう.
/bin/shをどうやって実行させるかを考えますが,今回はreadlong関数内のatolをGOT overwriteしてsystem('/bin/sh')を呼び出すべきだったようです.しかし,libcのアドレスがわからないのでsystemのアドレスがわからないんですね.ここで僕は全くわからなかったんですが,一度atol@gotをprintfに書き換えることでatol(buf)をprintf(buf)とすることでformat string bugを発生させることが出来るそうです.なるほどすごい.format string attackでlibcのアドレスをリークすることでsystem関数を呼び出すことが出来るようになります.
手順的には以下のような感じ.
SECCON Beginners CTF 2020解けた問題 writeup
こんにちは.福岡では緊急事態宣言は解除されましたが授業もアルバイト,ゼミもリモートのため相変わらず外出しない生活を送っています.
ctf4b
ctf4bに大学の研究室のメンバーで参加してきました.昨年は全く手が出ませんでしたが今年は結構楽しくCTFができました.(解けたとは言ってない.)
得意分野と言える分野もないので雑食でいろいろな分野を覗いてました.
僕はreadme,beginner's stack,tweetstoreをときました.また,時間内にフラグは得られませんでしたが終了後に気づいたunzipも記載します.
(その他の問題も解けたら追記しようかな)
では,
https://www.seccon.jp/2019/seccon_beginners/seccon_beginners_ctf_2020_5_23_1400.html
追記
pwnのelementary stackについてポストしました.
readme
Miscの問題です.問題サーバで動いているコードが配布されます.
#!/usr/bin/env python3
import os
assert os.path.isfile('/home/ctf/flag') # readme
if __name__ == '__main__':
path = input("File: ")
if not os.path.exists(path):
exit("[-] File not found")
if not os.path.isfile(path):
exit("[-] Not a file")
if '/' != path[0]:
exit("[-] Use absolute path")
if 'ctf' in path:
exit("[-] Path not allowed")
try:
print(open(path, 'r').read())
except:
exit("[-] Permission denied")
ncコマンドでサーバに接続するとFile: と出てきてパスを入力します./home/ctf/flagを開くことができればフラグが得られそうです.
しかし.入力文字列にはいくつかの制限があります.
- 指定したパスが存在する
- 指定したパスがファイルである
- 指定したパスが絶対パスである
- 指定されたパスに
ctfという文字列が存在しない - 指定したファイルが開ける
条件は以上です.
ctfが許されないので/home/ctf/flagは当然の如く失敗します.
ctfという文字列を使用せずにどの様にしてパスを取得するかがポイントです.
現在のプロセスが動いているカレントディレクトリを取得することができれば良さげです.
そこで登場するのが/procです.
/procファイルシステムは特殊なディレクトリでシステムの情報や動作しているプロセスの情報を取得することができます.
あるプロセスに関する情報が欲しい場合は/proc/[pid]を参照します.自身のプロセスの情報を得たい場合は/proc/selfです.
/procは面白いのでぜひいろいろ覗いてみてください.
さて,/proc/self/cwdがプロセス自身のカレントディレクトリへのシンボリックリンクとなっています.が,ここで/proc/self/cwdを入れてもファイルじゃないのでダメです.そこで,/proc/self/environを入力してみます.すると環境変数がいっぱい出てきます.その中にPWD=/home/ctf/serverが見つかりました.
このプロセスは/home/ctf/serverで動いてそうですね.
自作コンテナランタイムでつまずいてる話
こんにちは.緊急事態宣言がのびたので相変わらずの外出自粛中です.最近は外出自粛にも少し慣れましたがやはり退屈です.僕は作業中のBGMとして何度か見たことのあるアニメなどを流しているんですがそれらのストックも無くなってきています.ループしようかな.ちなみにおすすめはガンダムUCですね.音楽が素晴らしいですし,SFアニメはモチベが上がっていいです.
さて,今回は自作コンテナランタイムに挑戦したという話です.前回のポストではruncを使ってみましたが,今回はruncを参考に挑戦してみました.
ちなみにコード書いて試してたときにrm -rfで書いてたコード全消去して萎えました.
間違えてrm -rf /[project]やって書いてたソース全部消失したくっそ萎えた
— terassyi (@terassyi_) May 2, 2020
gitで管理するのって大事ですね. リポジトリはこちら
タイトルについて
タイトルにつまずいているとつけましたが,つまずいてます.長い間同じ箇所でエラーがでて前に進めていません. 僕の魂の叫びがこちら.
[Read More]runcを使ってみる
こんにちは.前回のポストからだいぶ時間が空きましたが,相変わらず緊急事態宣言中で自宅待機なので時間を持て余しています.
ONE PIECEを読み返していたんですが,無料で読める分を読み終わってしまったので暇です.
今回はdockerに使用されているコンテナランタイムであるruncを使ってみました.
では,いきます.