こんにちは.12月に入り非常に寒い日々が続いています.個人的には10月から続いていたセキュリティキャンプが一段落して少し余裕が出てきました. また,この記事はSecHack365 Advent Calendar 2020の記事として書いています. 今回は趣味で開発しているツールを紹介します.
[Read More]このブログは https://terassyi.net
をリニューアルしたものです。
過去の記事はできる限りそのまま移行しています。 古いブログのリンクを踏んだ際はこちらのサイトにリダイレクトするようにしています。
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
を使ってみました.
では,いきます.
セキュアなコンテナgVisor
こんにちは.緊急事態宣言が出ているため相変わらず外出ができません.早く収束して欲しいものです. 今回はdocker関連の話題についてです.Googleが開発したgVisorというコンテナランタイムについて調べてみました.
gVisor
Documentを意訳
gVisorとはGo言語で実装されたユーザー空間カーネルです.ほとんどのLinuxシステムコールインターフェースを実装しており,ホストOSと起動しているアプリケーションとの間に隔離層を設けることで安全性を実現しています.
gVisorにはrunsc
というOCI仕様に準拠したコンテナランタイムを含んでいます.runsc
はDockerやKubernetesで使用でき,簡単にサンドボックス化されたコンテナを実行できます.
gVisorは既存のサンドボックス化ツールと異なるアプローチを用いています.
hello-from-terassyi
welcome to my home page
Welcome!
This is terassyi’s home page.
code
import fmt
func main() {
fmt.Println("Hello from terassyi")
}