News

オープンソースカンファレンス2016 Tokyo/Fall に行ってきました (1 comment)

Added by kanata almost 5 years ago

オープンソースカンファレンスは、オープンソースの今を伝えるイベントで、オープンソース関連のコミュニティや協賛企業・後援団体による、セミナーやプロダクトの展示などを入場・参加料が無料でご覧いただけるイベントです。

オープンソースカンファレンス2016 Tokyo/Fall - オープンソースの文化祭!

春に続き、今回の秋も行ってみました。やっぱ楽しい!

こんなセミナも聴講しました!!

セキュリティ・キャンプ2016の報告も聞きたっかんだけど、都合が合わなくて聞けなかった。残念。

[飲食OK]ライトニングトーク(by OSCスポンサー)

ライトニングトーク

みんな楽しそうにLTしておりました。聞いてて楽しい。LTっていいですなぁ。

マルチスレッド・ライブラリ自作で知るOS動作の基礎

マルチスレッド・ライブラリ自作で知るOS動作の基礎

低レイヤの達人であり、アセンブラ短歌六歌仙の一人、kozosの坂井さんが、C言語のユーザーランドでスレッドプログラミング(ライブラリ使うのではなくて、自分でコンテキストスイッチするところからw)の解説。いつもながらすごいこと考えつきますね。。

坂井さんには、11/6にLT予定の「アセンブラ漢文」の発表資料の公開をお願いしちゃった。レ点よろしく、jmp命令を駆使して飛びまくるコードと想像。面白そうw楽しみ。

特に面白かった物/興味深かったもの

プラレールで半加算器

プラレールで半加算器を設計した話 | サイボウズ式

これの実物&作成者からの解説が炸裂してました。

何故作ったのかという問いに、「 男のロマンだ!!!!! 」とwwwwww
世界最大の半加算器だと力強く語っておりました。笑った。


そしてまた沢山ノベルティを頂いてしまった(ありがてぇ・・)

20161105_ospn.jpg

第25回もう4年もやってんのかシェル芸勉強会に参加させて頂きました! (1 comment)

Added by kanata almost 5 years ago

シェルスクリプト大好きなんですが、新しい知見が得られて、やっぱり面白いですね!
問題解説は、本家のサイトが詳しいので、そちらにお任せするとして、ここは私なりの感想と解説(?)をしたいと思います。

【問題と解答】第25回もう4年もやってんのかシェル芸勉強会

jus共催 第7回初心者の定義で大揉め午前のシェル勉強会/第25回もう4年もやってんのかシェル芸勉強会

Q1

 www.usptomo.comのIPアドレスだけを出力するワンライナーを考えてみてください。

解答&解説

digでもpingでもnslookupでも出来るけど、なぜかtracerouteを思いついた。
ちなみにnslookupを使う人はおじさんらしい。

$ traceroute www.usptomo.com | head -1 |awk '{print $4}'|tr -d '(),'
157.7.203.188

Q2

次のような出力を作ってください。

ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ

解答&解説

ぜんぜん解けなかったw
ループ使うしなないかな、とか思ってたんだけど、ループ無しでも解けるそうで、目から鱗。

$ yes 'ひらけ!ポンキッキ' | tr -d '\n' | fold -w 30 | head -n 9 | sed 's/.$//'

これずげぇ。

Q3

rbashと打つとリダイレクトが使えなくなります。

この状況で、/etc/passwdからbashをログインシェルにしているユーザのレコードを抽出し、hoge等のファイルに出力してみましょう。様々な方法を考えてみましょう。bashと打ったりexitでもとのbashに戻るのは反則とします。

解答&解説

自分の環境には、rbash入ってなかったんだけど(?)、bash -r と同等らしい。これを使うとリダイレクトとTAB補完その他が制限されるという鬼畜仕様。

要は、リダイレクトを使わずにファイルに出力する方法を思いつけば解ける。その時に出たファイル出力するコマンドを以下に挙げておきます。

  • sort -o file
  • dd of=file
  • awk '{print $0 > "file"}'
  • sed 'w file'
  • iconv -o file
  • cp /dev/stdin hoge

Q4

以下のひらがなからワンライナーを始めて、濁点がつく字だけに濁点をつけてみてください。

解答&解説

無理だった。
ASCIIコードの英小文字と英大文字は32を足したり引いたりすると変換できるんだけど、その応用かな?とか考えてた。

nkfだった。nkf芸。

$ echo すけふぇにんけん | sed 's/./&゛/g'| nkf --katakana | nkf -Z4 | nkf --hiragana | sed 's/゛//g'
ずげぶぇにんげん

Q5

1秒に一つ*が伸びていくアニメーションを作ってください。

解答&解説

お、こりゃー解けるよ。

#!/bin/bash

for i in $(seq 1 100)
do
  printf '*'
  sleep 1
done

これを一行にする。

$ for i in $(seq 1 100);do printf '*'; sleep 1;done

Q6

日本語のメッセージから作った次の文字列を復元してください。

$ xxd crypt 
0000000: 6237 3330 6137 3330 6562 3330 6238 3832  b730a730eb30b882
0000010: 3061 3030 0a                             0a00.

解答&解説

おおっ。CTFっぽい!燃える!(と思ったけど、自分が解くより他の方が先に解いてた)

目grep力がある人ならば

b730
0a00

あたりで、ピンと来る・・・か。リトルエンディアンになっているね。で、2Byte文字っぽくて、0x30から始まる・・・となると、Unicodeだと解る、と。

なので、リトルエンディアン変換&Unicodeをお使いの環境(UTF-8)に変換するには、こんな感じ、と。
なるほど。

$ cat crypt | xxd -ps -r | iconv -f=ucs-2le -t=utf8

ちなみに、 UnicodeとUTF-8って何が違うの? っていうのは、私がまとめた 文字コードの解説 があるので、ご参考にどうぞ。

Q7

本日(2016年10月29日)の範囲の毎秒のUNIX時刻で素数となるものを全て列挙してください。出力はUNIX時刻でなく、何時何分何秒か分かるようにしましょう。世界標準時で考えてください。

解答&解説

お、これもなんかできそう。

$ seq $(date -d '2016/10/29' -u +%s) $(date -d '2016/10/29 1 day' -u +%s) | factor | awk 'NF==2{print $2}'|xargs -n1 -I% date -ud @%

分解すると、
2016年10月29日の範囲の毎秒のUNIX時刻

$ seq $(date -d '2016/10/29' -u +%s) $(date -d '2016/10/29 1 day' -u +%s) 

素数の判別

$ seq 1 100| factor | awk 'NF==2{print $2}'

通算秒から、普通のフォーマットに変換

$ echo 1477785349 | date -ud -

Q8

次のようにサイン波を描いてください。

20161030_shellgei_q8.png

解答&解説

も、もぅ無理。サイン波は、なんとか出せるとして、それの縦横をひっくり返すのが至難。

結局、Tukubaiのtateyokoコマンドを使うか、rsコマンドを使う解法でした。

なんか、普通に用意されているコマンドで出来たような気もするんだけど、思い出せなかった。

$ seq 1 20 | awk '{a=sin($1/3) * 10 + 10;for(i=0;i<a;i++)printf "@ ";printf "* ";for(i=a;i<20;i++)printf "@ ";print ""}' | rs -t 23 | tr @ ' '

懇談会&LT

いや、これめっちゃ面白かった!!
モバイルバッテリーの研究とか、ゲノムにまつわるシェル芸の応用とか、ちょっと、自分もLTやってみようかな。
CTFにおけるシェル芸の応用とか。

AVTOKYO2016に行ってきました

Added by kanata almost 5 years ago

AVTOKYO JP

AVTokyo2016まとめ

まったり酒飲みながら聴講したとさ〜。面白かった!

20161022_AVTOKYO1.jpg

聞いていた中で面白かったものをいくつか紹介。
ハンズオンやCTFもあったんだけどノートPC持ってないとか、プレゼン聞きたいとかあって断念した。

Nmap 9つの真実 もう「何も言えねぇ」

おっこれは…と、思っても、「役に立たない」と締め括るスタイルに草。

House of Einherjar -- Yet Another Heap Exploitation Technique on GLIBC(AVTOKYO ed.)

これは…このスライドが欲しい!!!ヒープだ!ヒープ解説だ!!ヒープは仕様が複雑な割には解説しているサイトが少ない貴重な資料。

20161022_AVTOKYO2.jpg


この業界の有名人が沢山いて、あとお見かけしたことないのは、piyokangoさんと徳丸先生だな。コンプリートできるかしら(おい

AV TOKYO 来年は10周年だそうだ。また来年も期待しています。

ドメインを移行しました

Added by kanata almost 5 years ago

十年以上前に、無料で取得した fish.minidns.net を利用させて頂いていたんですが、ついに終了の時を迎えたようです。
ありがとう minidns.net 最高でした。

今後は、https://raintrees.net になります。

普通にRedmineを使っているとUTF8の4Byte文字が入力できない事に気付く

Added by kanata about 5 years ago

「𩸽」「🍠」「🍣」とか、軒並み入力できない

正確には入力できるんだけど、保存後の表示とかがおかしくなった

原因は、Mariadb(MySQL)の設定文字コードが、「latin1」とかいうよく解らない文字コードになっているから

Mariadb(MySQL)にログインした後、以下のSQLを実行することで、現状の文字コードが確認できる

> show variables like 'char%';

よっしゃ、そしたらutf8にしたるわ。。。と思っても1つ落とし穴がある。

Mariadb(MySQL)には、 utf8 という設定値と utf8mb4 という設定値の両方があり、4Byte文字を格納するためには、 utf8mb4 に設定しなければならない。

対策は、現状のDB文字コード設定を変更して、かつ、現状使用しているテーブルの文字コードも変更するということをしないといけない。

詳細は、以下を参照。

ALMInium - MariaDB(MySQL)の文字コードをutf8mb4にする

以下を参照して実施しました。ありがとうございます大変助かりました。

Dig that groovy! - Redmine構築後のDBの文字コードをutf8mb4に変換して絵文字に対応する
http://zappy.hatenablog.jp/entry/2015/05/19/015044

参考:世界の特殊文字ウィキ - ユニコード6.0以降で使用できる絵文字(食編)

Redmineのwikiでもシェルスクリプトに色を着けたい

Added by kanata about 5 years ago

デフォルトでbashのシンタックスハイライトの機能が無かったので、色のない簡素な感じになっていた。
こんな感じ。

#!/bin/bash

DATA=`date`
echo "This is test. ${DATE}"

これを、以下のように色つけるための手順
素敵。

#!/bin/bash

DATA=`date`
echo "This is test. ${DATE}"

詳細

Redmine - BASH Syntax Highlighting(bashのシンタックスハイライトを追加)

第24回◯◯o◯裏番組シェル芸勉強会に参加させて頂きました!

Added by kanata about 5 years ago

第24回◯◯o◯裏番組シェル芸勉強会に参加させて頂きました。

シェルスクリプト大好きなんですが、今回は新しい知見が得られすぎて、目からうろこが滝のように落ちました。
問題解説は、本家のサイトが詳しいので、そちらにお任せするとして、ここは私なりの感想と解説(?)をしたいと思います。

【問題と解答】第24回◯◯o◯裏番組シェル芸勉強会

第6回もう初心者向けでないなんて言わないよ絶対午前のシェル勉強会/第24回◯◯o◯裏番組シェル芸勉強会

Q1

$ cat Q1
玉子 卵 玉子 玉子 玉子 玉子
玉子 玉子 卵 卵 卵 玉子
卵 玉子 卵 玉子 玉子 玉子
卵 玉子 卵 卵 卵 卵
玉子 卵 玉子

上のようなQ1ファイルについて、次のような出力を得てください。

玉子:5 卵:1 
玉子:3 卵:3 
玉子:4 卵:2 
玉子:1 卵:5 
玉子:2 卵:1 

解答&解説

現地では、時間切れ。解説を聞いてなるほど~。と思った。むしろawk芸。

$ cat Q1 | awk '{for(i=1;i<=NF;i++){a[$i]++};for(k in a){printf("%s:%d ",k,a[k]);a[k]=0}print ""}'

私なりに解説しますと、awkの所がこんな感じ。

{
  for(i=1;i<=NF;i++){
    a[$i]++                  # 連想配列を使って、玉子と卵をカウント
  };
  for(k in a){
    printf("%s:%d ",k,a[k]); # 1行分の玉子と卵を出力
    a[k]=0                   # 連想配列を初期化
  }
  print ""                   # 改行を出力
}

Q2

次のようなテキストについて、繰り返し出てきた文字の2つ目以降を省いて出力してください。例えばQ2のファイル

$ cat Q2
へのへのもへじ

の場合、「へのもじ」が正解の出力になります。

解答&解説

自分が作ったシェル芸と解答が同じだった

$ cat Q2 | grep -o . | awk '{if(!a[$1]){printf $1};a[$1]=1}END{print ""}'

横文字を縦にする技

$ echo abcdefg | grep -o .
a
b
c
d
e
f
g
$ echo abcdefg | fold -w 1  # これでもいいか
a
b
c
d
e
f
g
$ echo abcdefg | sed 's/./&\n/g' # まぁ、これでもいいか
a
b
c
d
e
f
g

awk部分の解説

{
  if(!a[$1]){ # 連想配列の要素が存在していなかったら
    printf $1 # 文字を表示する
  };
  a[$1]=1     # 連想配列を存在させる
}
END{
  print ""    # 最後の最後に改行する
}

Q3

$ cat Q3
金 日成
キム ワイプ
金 正日
キム タオル
金 正男

というデータを、

%%
キム タオル
キム ワイプ
%%
金 正男
金 正日
金 日成
%%

というように第一フィールドをキーにして%%でレコードを区切ってください。awkを使ってできた人は、awkを使わないでやってみてください。

解答&解説

$ sort Q3 | awk '{if($1!=a){print "%%";print;a=$1}else{print}}END{print "%%"}'

awk解説

{
  if($1!=a){    # 1個目の要素(キムか金)が、aじゃなかったら
    print "%%"; # %%を出力
    print;      # 1行出力 
    a=$1        # aに1個目の要素(キムか金)を代入
  }else{
    print       # 1行出力
  }
}
END{
  print "%%"    # 最後の%%を出力
}

なるほどね~

Q4

Q4.xlsxのA1のセルには数字が書いてあります。その数字を出力してください。A4には文字列が書いてあるので余裕がある人はそれも特定してみましょう。

解答&解説

拡張子xlsxのファイルは実はzipという事を知っていれば、なんとかなる問題

A1のセル

初めて使ったけど、zipgrepというコマンドを使った。上田先生の解答はunzip -p を使っていました。

$ zipgrep . Q4.xlsx |grep A1
caution: filename not matched:  [Content_Types].xml
xl/worksheets/sheet1.xml:<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><dimension ref="A1:B4"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="A5" sqref="A5"/></sheetView></sheetViews><sheetFormatPr baseColWidth="12" defaultRowHeight="18" x14ac:dyDescent="0"/><cols><col min="1" max="1" width="15.83203125" bestFit="1" customWidth="1"/><col min="2" max="2" width="14.33203125" bestFit="1" customWidth="1"/></cols><sheetData><row r="1" spans="1:2"><c r="A1"><v>114514</v></c><c r="B1" t="s"><v>0</v></c></row><row r="2" spans="1:2"><c r="A2" t="s"><v>1</v></c><c r="B2" t="s"><v>3</v></c></row><row r="3" spans="1:2"><c r="A3" t="s"><v>2</v></c><c r="B3" t="s"><v>4</v></c></row><row r="4" spans="1:2"><c r="A4" t="s"><v>6</v></c><c r="B4" t="s"><v>5</v></c></row></sheetData><phoneticPr fontId="1"/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><extLst><ext uri="{64002731-A6B0-56B0-2670-7721B7C09600}" xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="0" OnePage="0" WScale="0"/></ext></extLst></worksheet>

これで答えが見えるので、強引になんとかできる。

$ zipgrep . Q4.xlsx |sed 's/<c/\n<c/g'|grep r=\"A1|cut -d '>' -f 3 |cut -d '<' -f 1
114514

A4のセル

上田先生のエクシェル芸ツールを使ってズルしたw

$ exread-str Q4.xlsx 
0 シェル芸バイブ
1 危険シェル芸
2 キュアエンジニア
3 ドラゴン曲線
4 素数
5 変態シェル芸
6 エクシェル芸

A4のセルに入っている文字列が、6番めの"エクシェル芸"であるということは、以下でわかる

$  zipgrep . Q4.xlsx |sed 's/<c/\n<c/g'|grep A4
caution: filename not matched:  [Content_Types].xml
<c r="A4" t="s"><v>6</v></c>

Q5

ファイルQ5について、xに好きな数を代入して各行の式を計算してください。

$ cat Q5
x + x^2
x + 1/x
x*x*x

余裕のある人は、例えばxに2を代入したければ、

$ echo 2 | ...

というようにecho <代入したい数>から始めてワンライナーで解いてみてください。

解答&解説

解説を聞いて、はえ~ってなった。

$ echo -2 | xargs -I@ awk -v a=@ '{gsub(/x/,a,$0);print}' Q5 | bc -l

awkは、こんな感じ

# a変数には、-2が設定されているところからスタート
{
  gsub(/x/,a,$0); # xを-2で置換 $0は1行全体が置換対象という意味
  print           # 出力
}

Q6

「玉子」と「卵」の数を数えて、数が少ない方を数が大きい方で置換してください。

$ cat Q6 
卵卵玉子玉子玉子玉子玉子卵卵卵玉子玉子卵玉子玉子玉子玉子卵卵玉子卵玉子卵卵玉子卵玉子

解答&解説

力技でいかようにもできそうだけれど、エレガントな解法を考えるとキツイ
解答もやっぱり力技だったw

$ cat Q6 | grep -oE '(玉子|卵)' | sort | uniq -c | sort -n -k1,1n | awk '{print $2}' | xargs | awk '{print "s/"$1"/"$2"/g"}' | xargs -I@ sed @ Q6

grep -oE '(玉子|卵)' は、縦にする魔法。mecabを使うという方法もあったが、私の環境には入っていない。

$ cat Q6 | grep -oE '(玉子|卵)' 
卵
卵
玉子
玉子
玉子
玉子
玉子
卵
卵
卵
玉子
玉子
卵
玉子
玉子
玉子
玉子
卵
卵
玉子
卵
玉子
卵
卵
玉子
卵
玉子

カウントすると玉子の方が多いですね

$ cat Q6 | grep -oE '(玉子|卵)' | sort | uniq -c | sort -n -k1,1n 
     12 卵
     15 玉子

次が新しい知見で、awkでなんとsedのパラメタを作り出して流しこむという・・・!!

これが

$ cat Q6 | grep -oE '(玉子|卵)' | sort | uniq -c | sort -n -k1,1n | awk '{print $2}' | xargs | awk '{print "s/"$1"/"$2"/g"}' 
s/卵/玉子/g

こうなる・・・!

$ cat Q6 | grep -oE '(玉子|卵)' | sort | uniq -c | sort -n -k1,1n | awk '{print $2}' | xargs | awk '{print "s/"$1"/"$2"/g"}' | xargs -I@ sed @ Q6
玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子玉子

Q7

次のseq(あるいはjot等)の出力から、各桁の数字の構成が同じもの(例: 11122と22111等)を重複とみなし、除去してください。

$ seq -w 00000 99999

解答&解説

考え方は合ってたんだけど、コードが書けなかった。
考え方としては、1行の各数字をソートして、uniqすればいい(上田先生の解答では、 sort -u を使っている)
awkのasort関数か~。そういうのがあるのか~。

$ seq -w 00000 99999 | sed 's/./& /g' | awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(k in a){printf a[k]}print ""}' | sort -u

空白区切りでバラす技

$ echo abcdefg | sed 's/./& /g'
a b c d e f g 

awkは、こんな感じ

{
  for(i=1;i<=NF;i++)a[i]=$i; # 連想配列に数字を格納
  asort(a);                  # 連想配列aをソート
  for(k in a){               # 
    printf a[k]              # そして表示
  }
  print ""                   # 改行を出力
}

Q8

  1. まず、1〜7を全て含む7桁の整数を全て列挙して、tmpというファイルに出力してください。

  2. 次に、相異なる7以下の正の整数a,b,c,d,e,f,gを用いて、

abcd + efg

と表せる素数と、その時のa〜gの数字を全て求めましょう。tmpを用いて構いません。

(参考: 2011年日本数学オリンピック予選第3問から。一部改。http://www.imojp.org/challenge/old/jmo21yq.html)

解答&解説

まず、1〜7を全て含む7桁の整数を全て列挙して、tmpというファイルに出力してください。

ズルしたw
自作の重複順列作成ツールがあるので、それを使ってしまった。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 重複順列求めるツール ver 0.1
# 2016.08.02 kanata

import sys
from itertools import permutations

if( (len(sys.argv)-1) != 2 or not sys.argv[1].isdigit() ):
  print 'Usage:'+sys.argv[0]+" [length] [element]"
  print '   ex:'+sys.argv[0]+" 3 abc123"
  sys.exit(1)

# permutations…重複順列
# combinations…組み合わせ
itr = permutations(sys.argv[2],int(sys.argv[1]))

for i in itr:
  print "".join(map(str,i))
sys.exit(0)
$ permutations.py 7 1234567
1234567
1234576
1234657
  .
  .
7654321

ただ、上田先生の解法が目から鱗で、1234567の全てを含む結果を出せばいいだけだった。

$ seq -w 0000000 9999999 | grep -v [089] | grep 1 | grep 2 | grep 3 | grep 4 | grep 5 | grep 6 | grep 7 > tmp

次に、相異なる7以下の正の整数a,b,c,d,e,f,gを用いて...

factorコマンドを使うというイメージはあったんだけど、そこで止まった。

$ cat tmp | sed 's/./& /g' | awk '{print $1$2$3$4$5$6$7,$1*$2*$3*$4+$5*$6*$7}' | while read a b ; do echo $b | factor | awk -v n=$a 'NF==2{gsub(/./,"& ",n);print n,$2}' ; done

まず、[元の数字列] [計算結果]というフォーマットを出力する

$ cat tmp | sed 's/./& /g' | awk '{print $1$2$3$4$5$6$7,$1*$2*$3*$4+$5*$6*$7}' 
1234567 234
1234576 234
1234657 234
     .
     .

これに対してwhile文を使う

while read a b
do
  echo $b | factor | awk -v n=$a 'NF==2{gsub(/./,"& ",n);print n,$2}'
done

$bが素数であるという事と、それを表示するという事を以下でやってる。

$ echo 179 | factor | awk -v n=$a 'NF==2{print $2}' # 素数じゃなかったら出力されない
179

いい感じで整形した結果

$ cat tmp | sed 's/./& /g' | awk '{print $1$2$3$4$5$6$7,$1*$2*$3*$4+$5*$6*$7}' | while read a b ; do echo $b | factor | awk -v n=$a 'NF==2{gsub(/./,"& ",n);print n,$2}' ; done
2 3 4 6 1 5 7  179
2 3 4 6 1 7 5  179
2 3 4 6 5 1 7  179
        .
        .
        .

勉強になりました~。

アクセスログから、Googleでどんな検索をして、このサイトに来たかを知る方法

Added by kanata about 5 years ago

やりたいこと

まず、こういうタイプのApacheのログがある。

999.999.999.999 - - [01/Jun/2016:00:00:00 +0900] "GET /projects/a-painter-and-a-black-cat/news HTTP/1.1" 200 54953 "https://www.google.co.jp/search?q=%E7%94%BB%E5%83%8F+%E3%83%87%E3%83%BC%E3%82%BF+%E9%9A%A0%E8%94%BD+ctf&btnG=%E6%A4%9C%E7%B4%A2&hl=ja" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"

このログからは、googleで検索して、このページに来たことがわかる。Refererに記録されている。

ただ、マルチバイト文字は、すべからくURLエンコードされていて、そのままでは読めない。ログから、それを抽出して、デコードして表示してみましょう。

Google Analyticsを使えばいいという話もあるけれど、シェル芸の練習でやってみます。

ログの抽出

ここがシェルスクリプトの真骨頂である。1行でいける。

まず、該当のログを出力してみる。

# cat /var/log/httpd/access_log-???????? /var/log/httpd/access_log

全部のログが表示されちゃう。絞り込んでみよう。

  • "google"が含まれるログに絞り込む。
| grep google
  • そこから、"Googlebot"を含まないログに絞り込む。
|grep -v Googlebot
  • そこから、q=&"を含まないログに絞り込む。
|grep -v "q=&"
  • そこから、"q=cache"を含まないログに絞り込む。
|grep -v "q=cache"
  • そこから、"q="を含むログに絞り込む。
|grep q=

全部くっつけて、、、こうじゃ!

# cat /var/log/httpd/access_log-???????? /var/log/httpd/access_log |grep google|grep -v Googlebot|grep -v "q=&"|grep -v "q=cache"|grep q=

環境の違いで、微妙に上手くいかない人もいるかと思うが、適宜調整してください。

URLデコード

URLデコードは、実はワンライナーで実現できる。

perl -e '$ARGV[0]=~s/\+/ /g;$ARGV[0]=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;print"$ARGV[0]\n"' "ここにURLエンコードデータ"

上の方に書いたログで試してみよう。

対象は、以下の部分である。

%E7%94%BB%E5%83%8F+%E3%83%87%E3%83%BC%E3%82%BF+%E9%9A%A0%E8%94%BD+ctf

ほい。

$ perl -e '$ARGV[0]=~s/\+/ /g;$ARGV[0]=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;print"$ARGV[0]\n"' "%E7%94%BB%E5%83%8F+%E3%83%87%E3%83%BC%E3%82%BF+%E9%9A%A0%E8%94%BD+ctf"
画像 データ 隠蔽 ctf

さて、ログから該当部分を抽出するにはどうするか。

こうした。

  • "q="を区切り文字として、それ以降を出力
echo 'ログのデータ1行' | awk -F'q=' '{print $2}'
  • "&"を区切り文字として、その手前を出力
|awk -F'&' '{print $1}'
  • "(ダブルコーテーション)を区切り文字として、その手前を出力
|awk -F'\"' '{print $1}'

全部くっつけて、、、こうじゃ!

echo 'ログのデータ1行' | awk -F'q=' '{print $2}'|awk -F'&' '{print $1}'|awk -F'\"' '{print $1}'

実際に試してみよう。

$ echo '999.999.999.999 - - [01/Jun/2016:00:00:00 +0900] "GET /projects/a-painter-and-a-black-cat/news HTTP/1.1" 200 54953 "https://www.google.co.jp/search?q=%E7%94%BB%E5%83%8F+%E3%83%87%E3%83%BC%E3%82%BF+%E9%9A%A0%E8%94%BD+ctf&btnG=%E6%A4%9C%E7%B4%A2&hl=ja" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"' | awk -F'q=' '{print $2}'|awk -F'&' '{print $1}'|awk -F'\"' '{print $1}'
%E7%94%BB%E5%83%8F+%E3%83%87%E3%83%BC%E3%82%BF+%E9%9A%A0%E8%94%BD+ctf

ちゃんと抽出できてますね。

Googleでどんな検索をして、このサイトに来たかを知るツール(シェルスクリプト)

それで、こんなシェルスクリプトを作ってみた。
時系列でどんな検索ワードで飛んできたかわかる。

PrintGoogleSearchWords.sh

#!/bin/bash

IFS='
'

CONTENT=`cat /var/log/httpd/access_log-???????? /var/log/httpd/access_log |grep google|grep -v Googlebot|grep -v "q=&"|grep -v "q=cache"|grep q=`

for WORD in ${CONTENT}
do
  HOST_NAME=`echo ${WORD} | awk '{print $1}'`
  ACCESS_DATE=`echo ${WORD} | awk '{print $4}'|tr -d '['`
  URL_ENCODE_DATA=`echo ${WORD} | awk -F'q=' '{print $2}'|awk -F'&' '{print $1}'|awk -F'\"' '{print $1}'`
  URL_DECODE_DATA=`perl -e '$ARGV[0]=~s/\+/ /g;$ARGV[0]=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;print"$ARGV[0]\n"' ${URL_ENCODE_DATA}`
  printf "%s %15s %s\n" ${ACCESS_DATE} ${HOST_NAME} ${URL_DECODE_DATA}
done

exit 0

ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール作りました

Added by kanata about 5 years ago

ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール

これでちょっとは楽になるんじゃないだろうか。

CTFって、Base64が頻出するわりには、手作業でデコードしてたので、嫌になって自動化した。
これでちょっとは楽になるかな?

$ base64_extraction.py test.txt 
checking...7190/42005   test_7191.png
checking...13406/42005  test_13407.png
checking...18594/42005  test_18595.png
checking...24697/42005  test_24698.png
checking...29677/42005  test_29678.png
checking...35553/42005  test_35554.png
checking...38782/42005  test_38783.png
checking...41550/42005  test_41551.stream

まぁ長いASCII文字列があるとBase64形式だと見誤ってデコードしちゃうんだけど、それはもぅ回避できない仕様。

詳細

CTF Crypto - ファイルに含まれるbase64部分を抽出・デコードしてファイルに保存するツール

江戸前セキュリティ勉強会(2016/08)に参加してきました

Added by kanata about 5 years ago

江戸前セキュリティ勉強会(2016/08)に参加してきました

江戸前セキュリティ勉強会(2016/08) - 江戸前セキュリティ勉強会

三村聡志さんの、流れるようなマクラからの入りは、もぅそれ落語家として食べていけるレベルでしたw

園田先生のSECCON GOも楽しかったです。CTFの裏側が見えて面白かったです。

NECTFの園田さんも、なんか、よくわかります。。企業内の苦労話。

Trendmicro CTFの岩田さん、先日は楽しませて行きました。
そう言えば、TMCTF2016のForensic 200の問題ファイルが3Gバイトだったけど、アレ何の問題(トラフィック的な)もなくダウンロードできたんですよね。やっぱりアレは、あのインフラのなせる技ですか。と、質問しようと思ってたのを後で思い出しました。残念。

CTF for GILRS!鈴木さん、裏方はとっても大変な部分もあると思いますが、応援しております!
AMATERAS零(アマテラス・ゼロ)カッコイイよね。

仕切ってくださった、まっちゃだいふくさんお疲れ様でした。ともて有意義でございました。

しかもお菓子が出るんです!!ごちそうさまです!美味でございました。(しかも2個食べました)

20160806_edomaesec.jpg

また参加したいと思いました!

1 ... 6 7 8 9 10 ... 15 (71-80/146)

Also available in: Atom

Add picture from clipboard (Maximum size: 100 MB)