yyp٩( 'ω' )و

色々触って遊んでます

docker上で動くJenkinsでAWS CLIを使いたい(前編)

まえがき

dockerで動くJenkinsを構築し、そのジョブでAWS CLIを使う用事があったのですがなかなかできないので記事にしながら整理します…!
長くなってしまったので前編後編で分けます。

環境

  • OS: macOS Mojave
  • OS version: 10.14.6
  • docker version: 19.03.1

Jenkins構築

dockerhubから公式のJenkinsイメージをpullします。

% docker pull jenkins  

イメージがpullできたことを確認します。

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins             latest              cd14cecfdb3a        13 months ago       696MB

一度このイメージからコンテナを起動します。

% docker run -d -p 8080:8080 -it --name jenkins jenkins
% docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0a3ccda1f28c        jenkins             "/bin/tini -- /usr/l…"   25 seconds ago      Up 23 seconds       0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins

ブラウザでlocalhost:8080にアクセスすると、Jenkinsの初期設定画面が表示されます。
ここまでで一旦置いておきます。

AWS CLIを実行できるようにする

AWS CLIをインストールするためにDockerfileを作ります。
FROMで先ほどpullしてきたイメージを指定して、RUNAWS CLIのインストールをします。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
RUN unzip awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

docker buildでイメージを作ります。イメージ名はjenkins-awscliとします。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
 ---> Running in 19158b3354aa
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Warning: Failed to create the file awscli-bundle.zip: Permission denied
  0 11.9M    0 16360    0     0  12166      0  0:17:09  0:00:01  0:17:08 12172
curl: (23) Failed writing body (0 != 16360)
The command '/bin/sh -c curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"' returned a non-zero code: 23

ファイルを作る権限がないようです…
先ほど立てたjenkinsコンテナに入ってみると、最初のカレントディレクトリが/なので、これが原因かな…?
jenkinsユーザのホームディレクトリを指定してやってみます。
Dockerfileを下記のように修正します。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN unzip /var/jenkins_home/awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

もう一度イメージを作ります。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 18351a0165be
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0   870k      0  0:00:14  0:00:14 --:--:--  978k
Removing intermediate container 18351a0165be
 ---> 0f58bb1e22df
Step 3/4 : RUN unzip /var/jenkins_home/awscli-bundle.zip
 ---> Running in 859faaa07f33
unzip:  cannot find or open /var/jenkins_home/awscli-bundle.zip, /var/jenkins_home/awscli-bundle.zip.zip or /var/jenkins_home/awscli-bundle.zip.ZIP.
The command '/bin/sh -c unzip /var/jenkins_home/awscli-bundle.zip' returned a non-zero code: 9

どうもcurlしてきたファイルが指定のディレクトリに置けていないみたいです。
試しにpwdlsをRUNで実行してみます。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN pwd
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aw

ビルドします。

docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 036df9da7fcb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0  1416k      0  0:00:08  0:00:08 --:--:-- 1822k
Removing intermediate container 036df9da7fcb
 ---> fe9b3bb14ff9
Step 3/4 : RUN pwd
 ---> Running in 5d77ba51659a
/
Removing intermediate container 5d77ba51659a
 ---> 1ac650f90bf7
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in f4fb7e4bcc50
total 20
drwxr-xr-x 2 jenkins jenkins 4096 Aug 28 13:21 .
drwxr-xr-x 1 root    root    4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins  220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins 3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins  675 May 15  2017 .profile
Removing intermediate container f4fb7e4bcc50
 ---> 46ad3e98188b
Successfully built 46ad3e98188b
Successfully tagged jenkins-awscli:latest

カレントディレクトリは/で、/var/jenkins_home/にはやはりファイルが置かれていないようです…
curlの-o以降が認識されていないのでは?」と指摘をもらったので、ローカルでzipファイルをcurlして、COPYで置くことにしてみます。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルドしてみると、zipファイルが置けています。

% docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  12.52MB
Step 1/3 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/3 : COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
 ---> 9b0dccab7709
Step 3/3 : RUN ls -al /var/jenkins_home/
 ---> Running in 8233fb5290c3
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:30 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
Removing intermediate container 8233fb5290c3
 ---> 82c3c1da2556
Successfully built 82c3c1da2556
Successfully tagged jenkins-awscli:latest

unzipのコメントアウトを外してイメージを作り直してみます。
解凍先も指定しました。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN unzip /var/jenkins_home/awscli-bundle.zip -d /var/jenkins_home/
# lsでファイルがあることを確認
RUN ls -al /var/jenkins_home/
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルド〜

~~~  
Archive:  /var/jenkins_home/awscli-bundle.zip
  inflating: /var/jenkins_home/awscli-bundle/install
  inflating: /var/jenkins_home/awscli-bundle/packages/virtualenv-15.1.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/argparse-1.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.25.3.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/colorama-0.3.9.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-5.1.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/rsa-3.4.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/docutils-0.15.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/s3transfer-0.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.8.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/awscli-1.16.227.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/ordereddict-1.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.6.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/jmespath-0.9.4.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/botocore-1.12.217.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/pyasn1-0.4.6.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.22.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/six-1.12.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/futures-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/simplejson-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-3.13.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/setup/setuptools_scm-1.15.7.tar.gz
Removing intermediate container 6b1fea1c92b8
 ---> 82230c66e941
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in 552c780855a0
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:36 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
~~~

…?
解凍できてるっぽいのに解凍したものがディレクトリにありません。
コンテナを立ち上げてsshして手動でunzipしてみたのですがこれは普通にできました。

まとめ

直面した問題をまとめておきます。

  • Dockerfile内でのcurlはオプションが使えない?
    => ローカルに落としてきたzipをCOPYで置くことで暫定対応。どうしてcurlでファイルを配置できないのかは謎のまま。

  • Dockerfile内でのunzipができてる風なのにできていない?
    => コンテナに入って手動でのunzipはできるので謎。解凍済みのディレクトリを丸ごとコピーしてみようかと思う。

次は解凍済みのディレクトリをCOPYで置いてやってみるところからやってみようと思います。

夏休みなのでAndroidアプリ開発に入門した

まえがき

夏休み、昨日から2日間何も用事がないので何かやってみたかったことをやろうかなと思い、Androidアプリ開発に入門しました。

1日目

1日目はこちらの本を使ってサンプルアプリを作ってみました。

たった1日で基本が身に付く!  Androidアプリ開発超入門

たった1日で基本が身に付く! Androidアプリ開発超入門

Javaは本当に少しだけかじったことがある程度、AndroidStudioは初めて触るというレベルですが、わかりやすく解説されていてちゃんと1日で終わりました。
最後の章で作成したビンゴアプリがこちらです。

章で作成する機能に履歴を削除する機能をプラスアルファでつけました。

意外とアプリって作れるんだな〜と自分の中のハードルが下がりました。

2日目

2日目は昨日のビンゴアプリの応用で、ルーレットアプリを作ろうと思い、作っています。
機能としては、名前を入力するとその中から1人選んで表示するという簡単なものです。
リセットボタンで入力した値、抽選結果のクリアもできるようにしました。

コードはこちら。

github.com

あと実装しできたらしたいな〜と思っているのが

  • 名前を表示する前にトゥルルル(ドラムロールがなりそうな感じ)なエフェクトをかけたい
  • 「今回は」「さんお願いします!」の文を雰囲気を選ぶと変えられるようにしたい
  • デザインをもう少しかっこよくしたい

なんですが、なかなか難しそうです…
今日中にどこまでいけるかな…

あとがき

アプリ開発というとなんとなくハードル高く感じていましたが、したいことをロジックに落とし込めれば案外作れるのかなと思いました。
気が向いたら他にも作ってみたいな〜と思っています。

職場のMacで寿司を流せないので家のMacにvimのpluginを入れて寿司を流す

まえがき

職場のMacがTouchbar付きのものになったので寿司を流したかったのですが、怒られそうなので家のMacvimで寿司を流して楽しみます🍣

プラグインマネージャーインストール

vimプラグインを入れるにはプラグインマネージャーが必要らしい。
入れたいプラグインリポジトリに行くと、NeoBundleと書いてあるのでNeoBundleを入れます。
インストールはREADMEに従って行いました。

github.com

curlでインストールスクリプトを取ってきて実行します。

$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
$ sh ./install.sh
Please add the following settings for NeoBundle to the top of your .vimrc file:

と表示されるので、"NeoBundle Scripts-----------------------------で始まるブロックを.vimrcに追記します。

一度.vimrcを保存して閉じて、もう一度vimを起動すると、下記のように聞かれるので、yを入力します。

Not installed bundles:  ['vimshell', 'ctrlp.vim', 'vim-colorschemes', 'vim-fugitive', 'neosnippet.vim', 'neosnippet-snippets']
Install bundles now?
(y)es, [N]o:

下の方にNeoBundle Updateのように表示されるので、しばらく待ちます。
vim操作ができるようになったら、保存して終了します。

プラグインマネージャーのインストールは終わりです。

プラグインインストール

今回入れるプラグインはこちらです。
職場のMacのTouchbarで寿司を流せないのでvimで流して楽しみます。

github.com

READMEに従って.vimrcに下記を追記します。

NeoBundle 'pocke/sushibar.vim'

set statusline=%!sushibar#sushibar()
set laststatus=2

NeoBundleで始まる行をどこに書くかで詰まりました…
call neobundle#begincall neobundle#endの間に書く必要があるんですね…

保存して閉じて、もう一度vimを起動します。

寿司が流れました!
gifとかの撮り方がわからないので貼れないのが残念ですが、操作するたびに寿司が流れて楽しげな感じになりました。

まとめ

今回作ったvimrcはこちらです。

github.com

遊び心のあるものが結構好きなので、他にも色々試してみたいと思います🍣

treeコマンドが便利な話

まえがき

ディレクトリ構成を書くことがたびたびあるのですが、いちいち記号を探すのが面倒だったのでtreeコマンドを導入しました。

treeインストール

任意のパッケージ管理ツールでインストールします。
今回はMacに入れます。

環境は下記です。

  • OS: macOS Mojave
  • OS version: 10.14.5

brewでインストールします。

brew install tree

インストール終了後、treeを実行すると…

tree                                                                                                                                                                                               [master]
.
├── README.md
├── ansible
│   ├── check-connect-host.md
│   ├── execute-playbook-specific-host.md
│   ├── execute-playbook-specific-task.md
│   ├── show-hosts-list.md
│   ├── step-execute-playbook.md
│   └── use-variable-by-lookup.md
(略)

こんな感じで出てきます。
-Lで表示するディレクトリの深さも指定できます。

tree -L 1                                                                                                                                                                                          [master]
.
├── README.md
├── ansible
├── aws
├── bash
├── git
├── linux
├── mac
├── markdown
├── network
├── nodejs
├── pip
├── terraform
├── vim
├── windows
└── yum

14 directories, 1 file

表示するディレクトリも指定できます。

tree -L 1 ./aws                                                                                                                                                                                    [master]
./aws
└── search-resources-all-region.md

0 directories, 1 file

まとめ

いちいち記号を探す面倒から解放されました…!
環境によってはむやみにパッケージをインストールできないこともあるので、その時に別の環境で実行して記号を探すという使い方もできそうです(あんまりしたくない)

zshを導入したい(願望)

まえがき

bashを使っているのですが、zshの補完機能が良いと聞いたのでzshに切り替えたいなと思っています。
ですがzshrcを作る際に面倒がってしまい、事故りました…

環境

  • OS: macOS Mojave
  • OS version: 10.14.5

zshに切り替える

デフォルトで入っているzshに切り替える

Macにはデフォルトで何種類かシェルが入っています。
下記コマンドで確認できます。

$ cat /etc/shells

入っているのはだいたい下の6つかなと思います。

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

zshもデフォルトで入っているので切り替えてみます。
下記コマンドでログインシェルを切り替えます。

$ chsh -s /bin/zsh

一度ログアウトして再度ログインすると、zshになります。
何かしら失敗してたらログインできなくなる可能性があるため、新しいタブを開いてログインしてみるのがおすすめです。

バージョンを確認してみます。

% zsh --version
zsh 5.3 (x86_64-apple-darwin18.0)

Release notesによると最新版が5.7なので若干古いですね。

zsh.sourceforge.net

zshrcを作ろうとする

面倒だったので.bashrcを.zshrcにコピーしてみたところ、プロンプトがだめな感じになりました…そりゃそうか…
そして.zshrcを空にしてsourceしても戻らず…
色だけつけるように.zshrcに追記してみます。

autoload -Uz colors
colors
PROMPT='%{$fg\[red\]%}[%n@%m]%{$reset_color%}'

source .zshrcで読み込みますが変わらず…
ちゃんとした.zshrcを作り直すしかなさそうです…

あとがき

zshに切り替えるのはとても簡単でした。
ですが億劫がってしまったためにプロンプトがおかしなことになるという事故が発生してしまいました…
解決したらまた記事に書こうと思います(戒め)
zsh本体についてはbrewで最新版を入れることもできるようなので、こちらも試してみたいな〜と思っています。

「ハッキング・ラボのつくりかた」ホストOS環境構築(Macの場合) 後編

前編はこちら
「3-11 AutoPlayの設定を確認する」から進めていきます。

環境

前編と同じです。
* OS: macOS Mojave
* OS version: 10.14.4
* VirtualBox: 5.2.28
* Kali Linux: 2019.2

ホストOSの基本設定

3-11 AutoPlayの設定を確認する

Macの場合、デバイスをアタッチしても自動実行はされないはずなので、特に何もしません。
Finder等探しましたが、該当しそうな設定箇所はありませんでした。
ただ、少し古いOSだとある可能性はなくはないですね…

3-12 共有フォルダーの"Thums.db"の作成を抑止する

"Thumbs.db"はMacでは生成されないので、スキップします。
Macの場合".DS_Store"というファイルがこれに似た機能を持っていると思われます。
ファイルやフォルダがロックされるということはなさそうなので、今は何も設定せずに先へ進みます。
必要になったら設定したいと思います。

3-13 右クリックのショートカットメニューをカスタマイズする

「送る」メニューに追加する

ファイルやフォルダを右クリックした際、Windowsの場合は「送る」という項目が出てきます。
Macの場合、右クリックした際に表示される「共有」がこれに当たるかと思います。
【手順】
1. 適当なフォルダやファイルを選択した状態で右クリック
1. 「共有」> 「その他」を選択すると、機能拡張の設定画面が開きます。
1. ここで必要なものにチェックを入れたり、チェックを外したりしてカスタマイズ。
Windowsの「送る」に比べ、選択できるものが少ない気がします。
他にいい方法を見つけたらまた設定したいと思います。

右クリックのメニューに項目を追加する 以降

Windowsの場合、レジストリキーを操作することで右クリックのメニューをカスタマイズできますが、Macの場合、「システム環境設定」からカスタマイズできます。

【手順】

  1. メニューバーのリンゴマークをクリックして「システム環境設定」を開く
  2. 「キーボード」を開き、「ショートカット」タブを開く
  3. 左のメニューから「サービス」を選択
  4. 下にスクロールしていくと「ファイルとフォルダ」という項目があるので、必要なものにチェックを入れる (不要なものがあればチェックを外す)
  5. iTerm等のターミナルソフトを入れていれば「ファイルとフォルダ」に表示されているはずなので、チェックをつける(ターミナルを直接開く方法は分からないです…)

3-14 ストレージ分析ソフトで無駄なファイルを洗い出す

Macの場合、下記の手順でストレージの状況を確認できます。

【手順】

  1. メニューバーのリンゴマークをクリックして「このMacについて」を開く
  2. 「ストレージ」タブを開き、「管理」をクリック
  3. 「おすすめ」メニューが表示されるので、お好みで設定する
  4. 自分で確認して整理したい場合は左メニューからファイルを確認できます

「おすすめ」については「ゴミ箱を自動で空にする」は設定してもいいと思います。
「不要なファイルを削除」は不要そうなファイルを判断して表示してくれます。
そこから本当に不要なものを削除できるので便利です。
他の2つについては私は使っていないです。

3-15 ランチャーを導入する

Macの場合Launchpad(親指と3本の指でつまむようにする)がデフォルトで入っているので特に何もしません。
(私の場合、Launchpadはあまり使わず、Spotlight検索(⌘+Space)を使っています)

3-16 ハッキング・ラボにおけるGit

プライベートリポジトリでコードを管理します。
私は普段からGitHubを使っているので、GitHubのプライベートリポジトリを使おうと思います。

github.com上でプライベートリポジトリを作ります。

f:id:mizukichi3:20190528225233p:plain

この時に"Private"を選択します。
リポジトリを作ったらMac側にcloneします。
私はhome配下に作業用ディレクトリを作成して作業をしているので、そこにcdしてcloneします。

$ cd ~/<directory>
$ git clone git@github.com:<username>/<repository-name>.git

ファイル等リポジトリの中身についてはおいおい追加していきます。

3-17 クラウドストレージの活用

代表的なクラウドストレージサービスとして下記の3つが紹介されています。

  1. Dropbox
  2. Google Drive
  3. OneDrive

私はすでにGoogle Driveを同期しているので、そのままGoogle Driveを使っていきたいと思います。

3-18 Prefetch機能を有効にする

コンテンツキャッシュが似たような機能を持っているかなと思ったのですが、調べていくうちに別物ということがわかりました。
Prefetch機能に当たるものは見つけられませんでした…

コンテンツキャッシュも面白そうな機能だったので、仕組みについて解説している公式ドキュメントを貼っておきます。
複数台Apple製品を運用している環境だとなかなか便利そうです。

support.apple.com

3-19 WindowsPython環境を構築する

MacはデフォルトでPython2系が入っていますが、3系も入れて混在環境を構築します。
バージョン混在環境作るの苦手なんですよね…
pyenvやvirtualenvを使う方法などありますが、今回はvirtualenvを使います。
こちらの記事を参考に進めていきます。

qiita.com

homebrewでpython3を入れます。

$ brew install python3

バージョンを確認して、3系が入っていたらOKです。

$ python3 --version
Python 3.7.2

pip3でvirtualenvをインストールします。

$ pip3 install virtualenv

環境構築時に行うのはここまでです。
以下は開発とかをするときに行います。
まずpython3を使って開発をするときに使用するディレクトリに移動します。
例えばgitのローカルリポジトリを分けていたら、そのリポジトリに移動します。
その後virtualenvを実行します。

$ virtualenv --python=/usr/local/bin/python3 --no-site-packages env

アクティベートします。

$ source env/bin/activate

こんな感じでpython2, 3の混在環境の構築は完了です。

3-20 BIOS(UEFI)画面を表示する

起動する時にショートカットキーを押すと使える機能*1が似ているかなと思ったのですが、Macの場合、そもそもBIOSに入れないみたいですね…
今後わかったらまた書きます…!

まとめ

後編も終了です。
これから第2部で色々やってみたいと思います〜
余談ですが、この辺の設定をAnsilbe等の構成管理ツールでできたら楽そうだな〜と思ったんですが、そもそもMac用のモジュールがなさそうで、難しそうですね…

第2回 SECCON Beginners CTF Write-up

まえがき

初めてCTFに参加しました。
解けたのは下記2問。
- Misc: [warmup]Welcome
- Reversing: [warmup]Seccompare
正直今回は初参加だし、全然解けなくてもいいや〜と思っていたので、ちょっとでも解けてよかったです。

CTFとは?

CTFとは、"Capture the Flag"の略で、プログラムに埋め込まれているFlagを自分の持っているIT知識を駆使してGetする競技です。
何人かでチームを組んでも、一人で参加してもいいみたいです。
問題の分野はその会によって違いますが、今回参加したSECCON Beginnersは下記5分野でした。

  1. Web
  2. Pwnable
  3. Reversing
  4. Crypto
  5. Misc

細かい説明はwikipediaさんへ…
セキュリティ周りの知識が必要なので、その辺りに興味がある人は楽しいと思います。

環境

  • OS: macOS Mojave
  • OS version: 10.14.4
  • VirtualBox: 5.2.28
  • Kali Linux: 2019.2

    【Misc】[warmup]Welcome

    「SECCON Beginners CTFのIRCチャンネルで会いましょう。」とあります。
    何のことかよく分からずしばらく別の問題に取り組んでいたのですが、ルールを確認しようと思ってスコアサーバのRulesページをみたら、IRCへのリンクがあります。
    これをクリックすると"Connect to freenode IRC"ページに飛ぶので、必要事項を入力して"Connect"をクリックします。
    すると、IRCのページの一番上にFlagが表示されています。
    f:id:mizukichi3:20190526203439p:plain これでFlagゲットです。

    【Reversing】[warmup]Seccompare

    Kali Linuxsshし、Seccompareのファイルをwgetします。

$ wget https://score.beginners.seccon.jp/files/seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  

圧縮されているので解凍します。

$ tar xvzf seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  
./._seccompare
./seccompare

"seccompare"と"._seccompare"というファイルが生成されました。
どんなファイルか確認します。

# seccompareファイル  
$ file seccompare  
seccompare: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=4a607c82ea263205071c80295afe633412cda6f7, not stripped  
# ._seccompareファイル  
$ file ._seccompare 
._seccompare: AppleDouble encoded Macintosh file

"seccompare"の方は実行するファイルみたいです。
"._seccompare"の方はMac用にエンコードされたファイルみたいです。
grepしてファイルの中にflagがないか見てみます。

# 今回のflagの形式で検索  
$ grep ctf4b ./ -r
ヒットなし  
# "flag"という文字列で検索  
$ grep flag ./ -r
Binary file ./seccompare matches

"seccompare"ファイルの中に"flag"が含まれているようです。
stringsで"seccompare"ファイルの文字列だけ出力します。

$ strings seccompare  
/lib64/ld-linux-x86-64.so.2
libc.so.6
puts
......  
usage: %s flag
correct
wrong

flagという文字列がありました。
ファイルの権限を変えて、実行してみます。

$ chmod 755 seccompare  
$ ./seccompare 
usage: ./seccompare flag

引数が必要みたいです。
適当に引数を与えて再度実行してみます。

$ ./seccompare flag
wrong

どうやら正誤判定をしているらしいというところまで分かりました。
ltraceでトレースしながら実行してみます。

$ ltrace ./seccompare flag
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "flag")                          = -3
puts("wrong"wrong
)                                                           = 6
+++ exited (status 0) +++

strcmpは文字列の比較をするC言語のコマンドみたいです。
"ctf4b{5tr1ngs_1s_n0t_en0ugh}"と引数を比較しているみたいです。
引数"ctf4b{5tr1ngs_1s_n0t_en0ugh}"を与えてみると…

$ ltrace ./seccompare ctf4b{5tr1ngs_1s_n0t_en0ugh}
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "ctf4b{5tr1ngs_1s_n0t_en0ugh}")  = 0
puts("correct"correct
)                                                         = 8
+++ exited (status 0) +++

correctでした!flagゲットです。

まとめ

他の問題にも挑戦したのですが、分かりそうで分からなくて、「俺にもっと力があれば…!」という気持ちで取り組んでいました。
サーバは6/9までオープンしているそうなので、他の方のWrite-upなどを見つつやってみたいなと思います。