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してきたイメージを指定して、RUN
でAWS 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してきたファイルが指定のディレクトリに置けていないみたいです。
試しにpwd
とls
を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アプリ開発超入門
- 作者: 中川幸哉
- 出版社/メーカー: 技術評論社
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Javaは本当に少しだけかじったことがある程度、AndroidStudioは初めて触るというレベルですが、わかりやすく解説されていてちゃんと1日で終わりました。
最後の章で作成したビンゴアプリがこちらです。
夏休みなのでAndroidアプリ開発に入門した!サンプルのビンゴアプリに履歴クリアするのも追加してみた pic.twitter.com/cFWO59Wbgj
— mizukichi3 (@mizukichi3_) August 13, 2019
章で作成する機能に履歴を削除する機能をプラスアルファでつけました。
意外とアプリって作れるんだな〜と自分の中のハードルが下がりました。
2日目
2日目は昨日のビンゴアプリの応用で、ルーレットアプリを作ろうと思い、作っています。
機能としては、名前を入力するとその中から1人選んで表示するという簡単なものです。
リセットボタンで入力した値、抽選結果のクリアもできるようにしました。
機能面は一旦完成、もう少し時間あるからデザインとかいじろうかな(苦手) pic.twitter.com/oIWPc4IIkH
— mizukichi3 (@mizukichi3_) August 14, 2019
コードはこちら。
あと実装しできたらしたいな〜と思っているのが
- 名前を表示する前にトゥルルル(ドラムロールがなりそうな感じ)なエフェクトをかけたい
- 「今回は」「さんお願いします!」の文を雰囲気を選ぶと変えられるようにしたい
- デザインをもう少しかっこよくしたい
なんですが、なかなか難しそうです…
今日中にどこまでいけるかな…
あとがき
アプリ開発というとなんとなくハードル高く感じていましたが、したいことをロジックに落とし込めれば案外作れるのかなと思いました。
気が向いたら他にも作ってみたいな〜と思っています。
職場のMacで寿司を流せないので家のMacにvimのpluginを入れて寿司を流す
まえがき
職場のMacがTouchbar付きのものになったので寿司を流したかったのですが、怒られそうなので家のMacでvimで寿司を流して楽しみます🍣
プラグインマネージャーインストール
vimのプラグインを入れるにはプラグインマネージャーが必要らしい。
入れたいプラグインのリポジトリに行くと、NeoBundleと書いてあるのでNeoBundleを入れます。
インストールはREADMEに従って行いました。
$ 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で流して楽しみます。
READMEに従って.vimrc
に下記を追記します。
NeoBundle 'pocke/sushibar.vim' set statusline=%!sushibar#sushibar() set laststatus=2
NeoBundleで始まる行をどこに書くかで詰まりました…
call neobundle#begin
とcall neobundle#end
の間に書く必要があるんですね…
保存して閉じて、もう一度vimを起動します。
寿司が流れました!
gifとかの撮り方がわからないので貼れないのが残念ですが、操作するたびに寿司が流れて楽しげな感じになりました。
まとめ
今回作ったvimrcはこちらです。
遊び心のあるものが結構好きなので、他にも色々試してみたいと思います🍣
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なので若干古いですね。
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の場合、「システム環境設定」からカスタマイズできます。
【手順】
- メニューバーのリンゴマークをクリックして「システム環境設定」を開く
- 「キーボード」を開き、「ショートカット」タブを開く
- 左のメニューから「サービス」を選択
- 下にスクロールしていくと「ファイルとフォルダ」という項目があるので、必要なものにチェックを入れる (不要なものがあればチェックを外す)
- iTerm等のターミナルソフトを入れていれば「ファイルとフォルダ」に表示されているはずなので、チェックをつける(ターミナルを直接開く方法は分からないです…)
3-14 ストレージ分析ソフトで無駄なファイルを洗い出す
Macの場合、下記の手順でストレージの状況を確認できます。
【手順】
- メニューバーのリンゴマークをクリックして「このMacについて」を開く
- 「ストレージ」タブを開き、「管理」をクリック
- 「おすすめ」メニューが表示されるので、お好みで設定する
- 自分で確認して整理したい場合は左メニューからファイルを確認できます
「おすすめ」については「ゴミ箱を自動で空にする」は設定してもいいと思います。
「不要なファイルを削除」は不要そうなファイルを判断して表示してくれます。
そこから本当に不要なものを削除できるので便利です。
他の2つについては私は使っていないです。
3-15 ランチャーを導入する
Macの場合Launchpad(親指と3本の指でつまむようにする)がデフォルトで入っているので特に何もしません。
(私の場合、Launchpadはあまり使わず、Spotlight検索(⌘+Space)を使っています)
3-16 ハッキング・ラボにおけるGit
プライベートリポジトリでコードを管理します。
私は普段からGitHubを使っているので、GitHubのプライベートリポジトリを使おうと思います。
この時に"Private"を選択します。
リポジトリを作ったらMac側にcloneします。
私はhome配下に作業用ディレクトリを作成して作業をしているので、そこにcdしてcloneします。
$ cd ~/<directory> $ git clone git@github.com:<username>/<repository-name>.git
ファイル等リポジトリの中身についてはおいおい追加していきます。
3-17 クラウドストレージの活用
代表的なクラウドストレージサービスとして下記の3つが紹介されています。
- Dropbox
- Google Drive
- OneDrive
私はすでにGoogle Driveを同期しているので、そのままGoogle Driveを使っていきたいと思います。
3-18 Prefetch機能を有効にする
コンテンツキャッシュが似たような機能を持っているかなと思ったのですが、調べていくうちに別物ということがわかりました。
Prefetch機能に当たるものは見つけられませんでした…
コンテンツキャッシュも面白そうな機能だったので、仕組みについて解説している公式ドキュメントを貼っておきます。
複数台Apple製品を運用している環境だとなかなか便利そうです。
3-19 WindowsにPython環境を構築する
MacはデフォルトでPython2系が入っていますが、3系も入れて混在環境を構築します。
バージョン混在環境作るの苦手なんですよね…
pyenvやvirtualenvを使う方法などありますが、今回はvirtualenvを使います。
こちらの記事を参考に進めていきます。
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分野でした。
- Web
- Pwnable
- Reversing
- Crypto
- 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が表示されています。
これでFlagゲットです。【Reversing】[warmup]Seccompare
$ 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などを見つつやってみたいなと思います。