ksnctf Crawling Chaos を解いた

こんばんは。久しぶりに(1年ぶりくらい)CTFが解きたくなり、ksnctfを見てたらサクッと解けた問題があったので、忘れないうちに備忘録として書き記そうと思う。 解いた問題はksnctf 3番目の問題のCrawling Chaos。

ksnctfのリンクは以下から… ksnctf.sweetduet.info

※ちなみに私はCTFの経験はcpawCTFを全部解き終えているぐらい…(1年前近くなので記憶がない…)

Crawling Chaos問題概要

与えられたURLがありアクセスを行うとフォームが一つと送信ボタンがある。 文字を入力して送信を行うも、NOと返される。

方針

何か特定の文字列を入力すれば、良いっぽいなあ。それがFLAGだったら良いなあ。

パッと思いついたのは以下の2通り。

htmlソースコードを見る。

    <script>
  (ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー…
    </script>

の箇所が怪しいっぽいが…それ以上の情報が得られなかったので、断念。。。

Firefoxの開発ツールを使用する。

Web系の問題なら、開発ツールを使用してなんとかしたい気持ちがある。 そんな気持ちで使ってみた。Firefox

メニュー→ウェブ開発→開発ツールの表示でいける(Ctl + Shift + Iでもいけるっぽい)

f:id:matukyou:20201213203257p:plain
Web開発ツール実行時の様子

フォームに入力&送信を実行し、デバッガーを確認すると何やら怪しいスクリプトが得られた。

(Webの保護を有効にしていた場合には、Clientで実行されるスクリプトデバッグでひっかかるのか)

$(function()
{
    $("form").submit(function(){var t=$('input[type="text"]').val();
    var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);
    var f=false;
        if(p.length==t.length){
             f=true;
             for(var i=0;i<p.length;i++) if(t.charCodeAt(i)*(i+1)!=p[i])f=false;
             if(f)alert("(」・ω・)」うー!(/・ω・)/にゃー!");
        }
        if(!f)alert("No");return false;
    });
});

適当に改行している。これを見ると、pという配列が与えられていて、tは入力した文字列であることがわかる。

if(p.length==t.length)

上記より、入力文字列と与えられている配列 p の長さが一致していないといけないっぽい。

for(var i=0;i<p.length;i++) if(t.charCodeAt(i)*(i+1)!=p[i])f=false;

このコードより、入力文字列のi番目の文字(先頭の文字は0文字目)のcharCode(Asciiコード?) と i + 1を掛けたものが配列pのi番目に一致しなければならないみたい。 つまり、tの i番目の文字はは\frac{p[i]}{i +1}をAscii文字に表したものっぽい。

var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);

Asciiコード一覧はググればたくさん出てくる。以下のように計算を行うと…

  1. 70 /1 = 70 → F
  2. 152 /2 = 76 →L
  3. 195 /3 = 65 →A …

と答えっぽい!

あとはPythonか何かでパパっと計算スクリプト書いたらOK。書いたものは以下のような感じ…

a=[70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449]

res = []
j = 1
for i in a:
    t = int(i/j)
    chr_t = chr(t)
    j = j+1
    res.append(chr_t)

print ("".join(res))

これで答えが出て無事にできた。 もっと精進します。

情報セキュリティの基本の基本について

なんとなく、セキュリティについてまとめてしまおうと思う。

ある本でセキュリティについて以下のように書かれていて、心に残ったことがある。

セキュリティは、便利さと被害妄想との間のバランスである

割と抽象的である気がするのでもう少し具体的に落とし込んでいこうと思う。


情報セキュリティのCIA

情報セキュリティのCIAというものを聞いたことがある人もいるだろう。IPAの資格試験にもよく出てくるものであり、AP(応用情報処理),SC(情報処理安全確保支援士)などにもよく出てくる単語だと思う。 それぞれの意味としては以下の通りである。

  • 機密性(Confidentiality)・・・機密情報が意図した相手以外に漏れていないこと
  • 完全性(Integrity)・・・情報が誰にも改ざんされていないこと
  • 可用性(Availability)・・・使用可能である状態の時、使用したときに使用できること

機密性/完全性/可用性を合わせて情報セキュリティのCIAと呼ばれる。

例えば、Webサイト(ショッピングサイトとか)を例にとるとCIAは以下のことに対応している。

  • 機密性・・・パスワードやクレジットカード情報が第三者に漏れていないこと(情報漏洩/盗聴などの攻撃)
  • 完全性・・・注文した住所ではないところに荷物が届けられる(情報の改ざんなどの攻撃)
  • 可用性・・・サーバーダウンとか(DoS攻撃など)

CIAを考慮しつつセキュリティを考えていくべきってたくさんの本に書いてある。 CIAは確かに大切だけど、ショッピングサイトと個人ブログページに同じレベルのコストはかけないよね?って話

例えば、ショッピングサイトで情報漏洩/フィッシングサイトがあれば大問題にもなるし、損害額が大きくなる。だから、セキュリティにもコストをかけたほうが良いだろうということ。 そのために多段認証だとか、ワンタイムパスワードとかちょっとめんどくさくして安全性を確保している。

便利さと心配性のバランスを見誤ると息苦しくなるか、パンデミックが起こるか…

なんとなく、体系的に学習したことをまとめたくなったので、こんなことをしてみた。 技術的なことのほうは結構書きやすいけど基本の基本の部分ってあまりアウトプットしないよね…本を一回読んで流したり(理解したような気分に)しがちだけども、かなり重要だよね。

Scapyでpcap 内すべてのパケットのsource ,destination MAC アドレスを初期化する

pcap内のパケットの書きかえをPython, Scapyで行ったので記す。

今回はMACアドレスの初期化(具体的な値でもよい)を行っている。

応用すれば、IPの書き換えなどもすぐ行えるだろう。

使用用途

テスト用のパケットを流入する際に、MACアドレスIPアドレスが違うと流せない場合がある。環境に合わせてテストパケットをpcapから流せるようにすることが今回の目的となる。

例えば、TAG VLANがついているパケットはレイヤが2の箇所で環境依存してしまう。

VLANを合わせるか、UNTAGにする必要がある。

 

内容

Pythonでパパっと書いてみた。

scapyにはpcapの中身を読み取る関数と、packetをpcapに書き出す関数があるので、

パケットの読み取り→パケット操作(今回はMACアドレス編集)→編集後のパケットをパケットリストに追加→すべて終わったらpcapに書き出し。

と行った。

 

Githubソースコードをアップした。

(Pythonをほとんど書いたことがないため、汚いコードかも)

github.com

 

 

vagrant SSH パスワード認証

TerminalソフトとしてTeratermを使用しているとvagrantマシンにログイン時に鍵を選択しないといけない。

また使用目的上rootユーザーで使いたいのでその設定を行う。

従来

従来vagrantで動かしたマシンにログインする際以下のように行っていた。

user名:vagrant 鍵選択:vagrant作業フォルダー配下にあるprivate_keyを選択

rootユーザーになるためにはvagrantでログインしたのち、

su -コマンドにて実行していた(デフォルトパスワードはvagrant)

設定手順

以下のコメントアウトを外したらできるようになった。

  1. /etc/sshd_configの内容を以下のように書き換える
#PermitRootLogin yes //コメントアウト外す
#PasswordAuthentication yes //コメントアウト外す
PasswordAuthentication no //コメントアウトつける
  1. systemctl restart sshd

デフォルトのroot ユーザーのパスワードはvagrantでこれを入力したらOK

CentOS7 にPython3の環境構築(scapy入れてみる)

作成した仮想マシン(CentOS7)にPython3の環境を構築したい。

今までPyhtonの環境をまじめに作ったことないので手さぐりの状態でやっていこうと思う。 備忘録的に書いていく。

IUSリポジトリのインストール

IUSはCentOSに最新のパッケージを提供してくれるいい感じのやつ。 CentOS7はデフォルトでPython2.7が入っているが、今回はPython3をインストールするため最新のやつが欲しいから行う。

以下のコマンドをroot userで実行する。

 # yum install -y https://repo.ius.io/ius-release-el7.rpm

このコマンドを打つとyumでpython3.6をインストールすることができる。

python3.6のインストール

以下のコマンドを実行

yum install python36u python36u-pip python36u-devel

python3.6とpipをインストールできた。

# python3 --version
Python 3.6.8

## pip3 --version
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)

pipのアップグレード

以下のコマンドを実施

# pip3 install --upgrade pip

pip3のアップグレード確認

# python3 -m pip --version
pip 20.1.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

※以下のようにするとエラーが出るため上記のようにコマンドを変更しています。

# pip3 --version
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.1.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

以上で環境作れたかな。

scapy のインストール

scapyで遊んでみたいので以下を入れる

# python3 -m pip install scapy
Collecting scapy
  Downloading scapy-2.4.3.tar.gz (905 kB)
     |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 905 kB 976 kB/s
Using legacy setup.py install for scapy, since package 'wheel' is not installed.
Installing collected packages: scapy
    Running setup.py install for scapy ... done
Successfully installed scapy-2.4.3

実際に使ってみる

# python3

上記コマンドにてpythonインタラクティブに起動する。(root userで実行する必要があります)

>>> from scapy.all import IP
>>> ip=IP()
>>> ip.show()
###[ IP ]###
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     =
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

>>>

で何となく使えてそう

vagrantでの環境構築は便利

環境構築についての記憶がよく飛ぶので改めて手順や設定方法についてまとめてみる。

vagrantとは

vagrantとは簡単に言ってしまえば、仮想マシンをいい感じにしてくれるものである。

具体的にどこがいい感じなのかというと以下の点が挙げられる。

  1. 仮想マシンの起動や終了が簡単
  2. Vagrantfileにより仮想マシンの設定が記述できる

Vagrantfileで設定できる項目は、Networkの項目やホストマシンとのファイル共有フォルダーなど多岐にわたる。

Vagrantfileを作成しておけばどこでも同じような仮想マシンの生成ができる。

とりあえずLinux環境を仮想マシン上に作成したい人は使用してみるといいと思う。

vagrant公式ホームページ

www.vagrantup.com

今回の環境

ホストマシン: Windows10 1909

Vagrant version: Vagrant 2.2.9

Virtual box version: 6.0

本記事は上記のVagrantとVirtual boxはインストールしてあることを前提にする。
また、私の環境では以下のプラグインを入れている。

> vagrant plugin list
vagrant-vbguest (0.24.0, global)
  - Version Constraint: > 0

※インストール手順はcmd上でvagrant plugin install vagrant-vbguest にて可能

仮想マシン構築

実際に仮想マシンを構築していく。

作成したいイメージの検索

作成したい仮想マシンの検索を行う。以下のURLから検索ができる。

Discover Vagrant Boxes - Vagrant Cloud

CentOS7で作成したいため、centos/7で検索をしている。

今回は一番上に出てきたcentos/7で作成を行う。

Vagrantfileを作る

事前に作業用フォルダーを作成しておく。

作成しておいた作業フォルダーで以下のコマンドを実行する

>vagrant init centos/7

コマンドを実行するとVagrantfileが生成されている。

Vagrantfileの設定をしていく。

設定

ネットワークの設定をする。

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
   config.vm.network "private_network", ip: "192.168.33.10"

本設定にて仮想マシンにIP アドレス 192.168.33.10が割り当てられ、ホストマシンからも通信できるようになる。

Vagrantfileのあるディレクトリにてvagrant up をcmdで実行すると仮想マシンが起動する。

==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

こんな感じのログが出る。 上記の例ではsshポートが2222で繋げることができる。

ターミナルソフトで(自分はteraterm)IPアドレス localhost port 2222で接続できる (または、IPアドレス 192.168.33.10 port 22でも接続可能)

ユーザー名:vagrant private key file:vagrant作業ディレクトリ.vagrant\machines\default\virtualbox\private_key を選択するとログインできる。

これで仮想マシンを使うことができる。

簡単なのでなんとかやってみたい。