このブログは https://terassyi.net をリニューアルしたものです。

過去の記事はできる限りそのまま移行しています。 古いブログのリンクを踏んだ際はこちらのサイトにリダイレクトするようにしています。

Linux Network Namespaceを使用したネットワークシミュレータの紹介

こんにちは.12月に入り非常に寒い日々が続いています.個人的には10月から続いていたセキュリティキャンプが一段落して少し余裕が出てきました. また,この記事はSecHack365 Advent Calendar 2020の記事として書いています. 今回は趣味で開発しているツールを紹介します.

[Read More]

XDPが実行できるVagrantfileを探して

こんにちは.大学院の後期授業も開始され,さらに多数イベントが同時並行で開催されており非常に忙しい日々を過ごしています.最近は将棋の勉強にも精を出しています.弱いですが. 今回はXDPが実行できるVMをVagrantで作ります. 先日GMOペパボさんのeBPFインターンシップに参加させていただいて以降eBPF関連の技術に興味を持っておりXDPに手を出してみます.

[Read More]
xdp  ebpf  vagrant 

GMOペパボの研究開発コースインターンシップに参加しました

参加の経緯

確か最初にインターンの開催を知ったのはtwitterだったと記憶しています.エンジニアインターンはWeb系の募集がほとんどで低レイヤを扱うインターンを探していたので即応募しました.

内容

僕が参加したのは研究開発/SREコースでeBPFを使用したトレーシングツールの作成を行いました.eBPFとはextended Berkeley Packet Filterの略でユーザー空間からプログラムを挿入してカーネル空間のデータを取得することができる技術です. 今回のインターンではUchio KondoさんとP山さんにメンターとしてついていただきeBPFのチュートリアルから初めて最終的に参加者それぞれが一つのツールにまとめて成果として最終日に発表しました.お二方には期間中とても手厚くサポートしていただきました.ありがとうございました.

[Read More]

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を梯子して僕がどのように考えたのかをメモします.実行ファイルchallmain.clibc-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関数のリターンアドレスを書き換えるようなことはできなさそうです.mallocbufferの領域を保持してそこにreadを使用して値を書き込んで配列xに値を書き込んでいくプログラムのようです. mallocした場所に入力値を格納しているのですが,ローカル変数*bufferとして保持した領域のポインタを持っているのでなんとかなりそう. /bin/shをどうやって実行させるかを考えますが,今回はreadlong関数内のatolをGOT overwriteしてsystem('/bin/sh')を呼び出すべきだったようです.しかし,libcのアドレスがわからないのでsystemのアドレスがわからないんですね.ここで僕は全くわからなかったんですが,一度atol@gotprintfに書き換えることでatol(buf)printf(buf)とすることでformat string bugを発生させることが出来るそうです.なるほどすごい.format string attackでlibcのアドレスをリークすることでsystem関数を呼び出すことが出来るようになります. 手順的には以下のような感じ.

[Read More]
ctf  ctf4b  seccon  pwn 

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で動いてそうですね.

[Read More]
ctf  ctf4b  seccon  pwn  web 

自作コンテナランタイムでつまずいてる話

こんにちは.緊急事態宣言がのびたので相変わらずの外出自粛中です.最近は外出自粛にも少し慣れましたがやはり退屈です.僕は作業中のBGMとして何度か見たことのあるアニメなどを流しているんですがそれらのストックも無くなってきています.ループしようかな.ちなみにおすすめはガンダムUCですね.音楽が素晴らしいですし,SFアニメはモチベが上がっていいです. さて,今回は自作コンテナランタイムに挑戦したという話です.前回のポストではruncを使ってみましたが,今回はruncを参考に挑戦してみました.

ちなみにコード書いて試してたときにrm -rfで書いてたコード全消去して萎えました.

gitで管理するのって大事ですね. リポジトリはこちら

タイトルについて

タイトルにつまずいているとつけましたが,つまずいてます.長い間同じ箇所でエラーがでて前に進めていません. 僕の魂の叫びがこちら.

[Read More]

runcを使ってみる

こんにちは.前回のポストからだいぶ時間が空きましたが,相変わらず緊急事態宣言中で自宅待機なので時間を持て余しています. ONE PIECEを読み返していたんですが,無料で読める分を読み終わってしまったので暇です. 今回はdockerに使用されているコンテナランタイムであるruncを使ってみました. では,いきます.

[Read More]

セキュアなコンテナgVisor

こんにちは.緊急事態宣言が出ているため相変わらず外出ができません.早く収束して欲しいものです. 今回はdocker関連の話題についてです.Googleが開発したgVisorというコンテナランタイムについて調べてみました.

gVisor

Documentを意訳

gVisorとはGo言語で実装されたユーザー空間カーネルです.ほとんどのLinuxシステムコールインターフェースを実装しており,ホストOSと起動しているアプリケーションとの間に隔離層を設けることで安全性を実現しています. gVisorにはrunscというOCI仕様に準拠したコンテナランタイムを含んでいます.runscはDockerやKubernetesで使用でき,簡単にサンドボックス化されたコンテナを実行できます. gVisorは既存のサンドボックス化ツールと異なるアプローチを用いています.

[Read More]

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")
}