ニュース

Let's Encrypt で無料SSL証明書を取得してみた

kanata8年以上前に追加

ServersManのCentOS7で、Let's Encryptを利用して、無料SSL証明書を取得してみました。
詳細はServersManを参照。

これだとオレオレ証明書と違って、ブラウザで警告がでません!

katagaitai CTF勉強会 - 関東|hard に参加してきました (2コメント)

kanata8年以上前に追加

場所は前回と同じ、人員の許容量が宇宙ヤバい秋葉原UDXで開催

午前の部 trmrさん

共通鍵暗号であるAESの内部をとてもわかりやすく説明してくれました。
AESは、フタを開けてみると、わかりやすい構造になってました。
今までブラックボックスとしか見ていなかったので、とても勉強になりました!!

しかし演習問題として解説してくれた [Ghost in the shellcode CTF 2013] Q20 - Subme の難易度の高さに笑った。
あんなん難しすぎるやろwww

ちなみに、以下が唯一のwriteupだそうです。
MSLC - Gits ctf 2013 Crypto 500

子育てお疲れ様です。

午後の部 bataさん

ほぼ4時間しゃべりっぱなしのbataさんお疲れ様でした。

初体験、ARMアーキテクチャのアセンブラを読む!ですが、exploitの基本的な原理はx86となんら変わらないので、話にはついていけましたよ!(解けるとは言っていない)
デバック環境の構築だけでもかなり有用でした。素敵な知見が沢山得られました。

特に、telnetを経由してバイナリを送り込んで、リモートで実行する一連の流れを自動化している実演を見たときは、感動致しました。
美しいですな~。

解法その2の方は、意味は解るんだけど、自力でそこに到達できる気がしなかったw
トップレベルの人はすごい事思いつくのね。。

20151220_katagaitaiCTF.jpg

おまけ

後援のNRIセキュアテクノロジーズさんから、謎の暗号が書いてあるハッカ飴を頂きました!
ありがとうございます。(ハッカーとハッカをかけたんですね)
暗号すごい気になるけど、場阿忍愚CTF中なので、ちょっとガマンしよう。。

20151220_katagaitaiCTF_NRIsecure1.jpg

裏面は、前回頂いたコースターと同じ感じかな?

20151220_katagaitaiCTF_NRIsecure2.jpg

SECCON 2015 Writeup

kanata8年以上前に追加

CTF Writeup SECCON 2015

結果&感想

今回、チームsky3は、某チームに合流してSECCON2015に参加しました。
楽しかったです!!
ある程度人数がいると、閃きと気づきの総数が増えるので、単独では解けなかった問題が、チームの皆さんの手により、あれよあれよという間に解かれていきました。

あと相変わらず、メンバーの c@tさん, リリりん♪さんは、スゴかったです。

チーム名公表していいかわからないので、とりあえず伏せておきますが、ランキングは出場チーム上位3%に入っていることを申し添えておきます。

いちおう300点分獲得できたので、その問題について、writeup書きました。
チームメンバが解いた問題のwriteupも、了解が取れれば合わせて公開するやも。

Individual Elebin

問題

すべてのELFファイルを実行せよ
Individual_Elebin.zip

中身は、1.bin … 11.bin が入っている。


とりあえず定番のfileコマンド

$ file ./*
./1.bin:  ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, stripped
./10.bin: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped
./11.bin: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped
./2.bin:  ELF 32-bit MSB executable, MC68HC11, version 1 (SYSV), statically linked, stripped
./3.bin:  ELF 32-bit LSB executable, NEC v850, version 1 (SYSV), statically linked, stripped
./4.bin:  ELF 32-bit MSB executable, Renesas M32R, version 1 (SYSV), statically linked, stripped
./5.bin:  ELF 64-bit MSB executable, Renesas SH, version 1 (SYSV), statically linked, stripped
./6.bin:  ELF 32-bit MSB executable, SPARC, version 1 (SYSV), statically linked, stripped
./7.bin:  ELF 32-bit LSB executable, Motorola RCE, version 1 (SYSV), statically linked, stripped
./8.bin:  ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked, stripped
./9.bin:  ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, stripped

どう見ても、CPUアーキテクチャ別のELFファイルです。本当にありがとうございました。

・・・がんばって実行するぞ!!

実行するための方法

以下の4つの方法で実行します。

そのまま普通に実行

1.bin だけは x86 なのでそのまま実行できますね。

$ ./1.bin 
SECCON{AaA

クロスコンパイル環境 gdb を使う

自分のPCのCPUアーキテクチャ以外は、クロスコンパイル環境を使って実行するのがよいでしょう。
ただし、1からコンパイルを始めると競技時間内に終わりません。
予め、コンパイル済みの環境を準備しておくしかありません。

そこで!!!1

kozosの坂井さんの力をお借りします。

cross-gcc4-20130826.zip をインストール済みのCentOS6.5イメージ (OVAフォーマット)
FreeBSDのVirtualBox用イメージを,OVAフォーマットにしたもの

ここの仮想環境を使わせて頂きます。
ちなみに坂井さんの著作はバイナリアン必見の良書揃いです!

ももいろテクノロジー 各種アーキテクチャのクロスコンパイラ環境を構築するも大変参考になります。

さて、坂井さんのCentOS6.5を起動して、クロスコンパイルの環境を確認してみます。

$ pwd
/usr/local/cross-gcc4/bin
$ ls *gdb
arm-elf-gdb   cris-elf-gdb   m32c-elf-gdb        mips16-elf-gdb   powerpc-elf-gdb  sh64-elf-gdb   v850-elf-gdb
avr-elf-gdb   frv-elf-gdb    m32r-elf-gdb        mips-elf-gdb     rl78-elf-gdb     sh-elf-gdb
bfin-elf-gdb  h8300-elf-gdb  microblaze-elf-gdb  mn10300-elf-gdb  rx-elf-gdb       sparc-elf-gdb

いろんなCPU用に用意されているのがわかります。

CPUアーキテクチャの違うバイナリでも、staticリンクのバイナリであれば、各CPUアーキテクチャ用のgdbで実行できます。

gdb起動後は、

target sim
load 
run

の順に入力して実行します。

$ ./arm-elf-gdb /tmp/Individual_Elebin/10.bin
GNU gdb (GDB) 7.5.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /tmp/Individual_Elebin/10.bin...(no debugging symbols found)...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x848 vma 0x1400
Loading section .rodata, size 0xe4 vma 0x1c48
Loading section .data, size 0x4 vma 0x2000
Start address 0x1400
Transfer rate: 18816 bits in <1 sec.
(gdb) run
Starting program: /tmp/Individual_Elebin/10.bin 
8a0d28f[Inferior 1 (process 42000) exited normally]
(gdb) quit

ちょっと判りにくいかもしれませんが、8a0d28f が表示されてます。

クロスコンパイル環境 run を使う

ぶっちゃけ、実行だけならgdbより、こっちの方が楽です。

$ pwd
/usr/local/cross-gcc4/bin
$ ls *run
arm-elf-run   cr16-elf-run  h8300-elf-run  microblaze-elf-run  mn10300-elf-run  rx-elf-run    sparc-elf-run
avr-elf-run   cris-elf-run  m32c-elf-run   mips16-elf-run      powerpc-elf-run  sh64-elf-run  v850-elf-run
bfin-elf-run  frv-elf-run   m32r-elf-run   mips-elf-run        rl78-elf-run     sh-elf-run
$ ./v850-elf-run /tmp/Individual_Elebin/3.bin 
i
$ ./m32r-elf-run /tmp/Individual_Elebin/4.bin 
N
$ ./sh64-elf-run /tmp/Individual_Elebin/5.bin 
12345678
$ ./sparc-elf-run /tmp/Individual_Elebin/6.bin 
90abcdef
$ ./cris-elf-run /tmp/Individual_Elebin/8.bin 
AW
$ ./avr-elf-run /tmp/Individual_Elebin/9.bin 
3a5d37a3
$ ./arm-elf-run /tmp/Individual_Elebin/10.bin 
8a0d28f
$ ./mips16-elf-run /tmp/Individual_Elebin/11.bin 
aAq}

2.bin と 7.binが実行できずに残ってしまいましたが、坂井さんが提供してくださっているFreeBSDの方に該当のCPUアーキテクチャのクロスコンパイル環境が入っています。

$ ./m6811-elf-run /tmp/Individual_Elebin/2.bin 
B
$ ./mcore-elf-run /tmp/Individual_Elebin/7.bin 
BDFHJLNP

qemuを使う

qemuを使う方法もあります。
Ubuntu とか Debian とか Kali Linux で、以下実施してqemuインストール

# apt-get install qemu-user-static

/usr/bin 配下に qemu-[CPU arch]-static が出来るので、それを実行する。
例はこんな感じ。cpuのチップセット(?)を指定するのがコツ。

# ./qemu-cris-static -cpu help /tmp/Individual_Elebin/8.bin 
Available CPUs:
  crisv8
  crisv9
  crisv10
  crisv11
  crisv32
# ./qemu-cris-static -cpu crisv8 /tmp/Individual_Elebin/8.bin 
AW

答え

実行結果を全部くっつけるとフラグになります。

 1.bin  SECCON{AaA
 2.bin  B
 3.bin  i
 4.bin  N
 5.bin  12345678
 6.bin  90abcdef
 7.bin  BDFHJLNP
 8.bin  AW
 9.bin  3a5d37a3
10.bin  8a0d28f
11.bin  aAq}

SECCON{AaABiN1234567890abcdefBDFHJLNPAW3a5d37a38a0d28faAq}

Steganography2

問題

ファイルからflagをさがせ.
sunrise.zip

中身は、sunrize.pngという画像


まず、バイナリエディタでゆるーく見てみましょう!

20151210_sunrize1.png

ファイルの終端付近に、様子の変な領域が見えますね。
png画像の終端を表す 00 00 00 00 49 45 4E 44 AE 42 60 82 "IENDョB`" が見えるので、当然この変な領域も画像として出力されていなければいけないはずですが、画像に変な箇所は見られませんでした。綺麗な朝日です。

それで、「あ、実際の画像サイズより小さくなってるんじゃね?」と思いついて調べてみました。
pngの画像サイズは、イメージヘッダ(Image header、IHDR)という場所に書かれています。

参考:イメージヘッダ(Image header、IHDR)
http://www.setsuki.com/hsp/ext/chunk/IHDR.htm

具体的には、"IHDR"という文字が書かれた後4Byteが画像の幅を表し、その更に後の4byteが画像の高さを表しています。

20151210_sunrize2.png

画像の高さを修正したいので、00 00 0F C0 の所の数を適当に増やしてみます。
画像の下部にフラグが出てきました。

20151210_sunrize3.jpg

文字コードのカオスな世界を整理してみた

kanata8年以上前に追加

文字コード

なんか仕事でやりそうだったので、この際カオスだった文字コード云々を整理してみる。

概要

文字セットと符号化方式

まず、文字セット(文字集合)と符号化方式という概念を理解することが必要。

文字セットとは

アルファベットや記号はもちろん、漢字やひらがな、ハングルやヘブライ文字など、世界中で使われている文字を集めたもの。

Unicodeは文字集合です。

Unicodeは便宜上、Unicodeスカラ値(16進数にU+をつけて U+0000~U+20FFFF で表現)という値で文字を管理しています。
Unicodeスカラ値はコードポイントという呼ばれ方をすることもあります。厳密には意味が違いますが、ここでは同じものだと思っておけば大過ありません。

符号化方式とは

文字セットで定義されている一つ一つの文字を、どのように符号化するかという文字符号化方式(エンコーディング)です。

Unicodeという一つの文字集合に対して、異なる文字符号化方式UTF-8、UTF-16が存在し、符号化した結果も異なります。

UTF-8とUTF-16の符号化方式の実装例

Unicodeスカラ値 文字 説明 UTF-8 UTF-16
U+0041 A ラテン文字 41 0041
U+0061 a ラテン文字 61 0061
U+00E8 è ラテン文字 C3 A8 00E8
U+042F Я キリル文字(ロシア) D0 AF 042F
U+05D0 א ヘブライ文字 D7 90 05D0
U+0905 デーヴァナーガリ文字 E0 A4 85 0905
U+0E04 タイ文字 E0 B8 84 0E04
U+2162 ローマ数字 E2 85 A2 2162
U+3042 ひらがな E3 81 82 3042
U+4E9C 漢字(あ) E4 BA 9C 4E9C
U+D558 ハングル ED 95 98 D558
U+103A0 𐎠*1 楔形文字 F0 90 8E A0 D800 DFA0
U+2000B 𠀋 漢字(じょう) F0 A0 80 8B D840 DC0B
U+20BB7 𠮷 漢字(よし) F0 A0 AE B7 D842 DFB7
U+29E3D 𩸽 漢字(ほっけ) F0 A9 B8 BD D867 DE3D

*1…現状どのブラウザでも表示できないっぽい。フォントが用意されていないのかも?

文字セットと符号化方式の関係

ここ超重要。

┏文字セット(JIS) ━━━━━━━━━━┓              ┏文字セット(Unicode) ━━━━━━━━┓
┃                                    ┃              ┃                                    ┃
┃┌JIS X 0213(JIS2004) ──────┐┃              ┃┌UCS4──────────────┐┃
┃│ 第三水準                       │┃              ┃│ 4byteで表現できる文字の範囲    │┃
┃│ 第四水準                       │┃ どんな文字を ┃│                                │┃
┃│ +10文字                        │┃ 取り込むか   ┃│                                │┃
┃│                                │┃ インプットに ┃│                                │┃
┃│┌JIS X 208(JIS90)─┐          │┃ なってる     ┃│┌UCS2───────┐          │┃
┃││ 第一水準         │          │┃ →→→→→→ ┃││2byteで表現できる │          │┃
┃││ 第二水準         │          │┃              ┃││文字の範囲        │          │┃
┃││                  │          │┃              ┃││                  │          │┃
┃│└─────────┘          │┃              ┃│└─────────┘          │┃
┃└────────────────┘┃              ┃└────────────────┘┃
┃                                    ┃              ┃                                    ┃
┃ ※文字毎にJISコードっていう番号が  ┃              ┃ ※文字毎にUnicodeスカラ値っていう  ┃
┃   振られているけど、現在ではあまり ┃              ┃   番号が振られているけど、そのまま ┃
┃   使われない。                     ┃              ┃   使わない。                   ┃
┗━━━━━━━━━━━━━━━━━━┛              ┗━━━━━━━━━━━━━━━━━━┛
  ↓JISコードを1bitシフト ↓JISコードに0x8080を加算     ↓スカラ値をなんか  ↓スカラ値をなんか
  ↓                      ↓                            ↓いい感じに計算    ↓いい感じに計算
┌Shift JIS ──┐┌EUC ─────┐          ┌UTF-16───────┐┌UTF-8 ───────┐
│JIS X 208まで ││              │          │基本           2byte││ASCII          1byte│
└───────┘└───────┘          │サロゲート文字 4byte││ギリシャ文字等 2byte│
  ↓                                          └──────────┘│ほとんどの漢字 3byte│
  ↓Microsoftが独自拡張                                               │JIS X 0213相当 4byte│
  ↓                                                                  └──────────┘
┌CP932 ────────────┐
│拡張文字が詰め込まれている    │
│ - JIS X 0201(半角カナ)       │
│ - NEC拡張文字(①とか)        │
│ - IBM拡張文字                │
│ - NEC選定IBM拡張文字         │
│                              │
│呼び方違うだけで同じものがある│
│MS932       ← Javaでの呼び方 │
│Windows-31J ← IANAでの呼び方 │
└───────────────┘

JIS X 0213(JIS2004)とUTF-16(サロゲート文字)とUTF-8(4Byte文字)の微妙な関係

UTF-16(サロゲート文字)

サロゲート文字に、JIS X 0213(JIS2004)の文字が、 だいたい 入っている。
ただ、2Byte範囲の方にも入っているので、完全に対応していない。

UTF-8(4Byte文字)

UTF-8(4Byte文字)に、JIS X 0213(JIS2004)の文字が、 だいたい 入っている。らしい。
(本当かどうか未確認)

みんなの混乱を招く、混同している所

Shift JIS と CP932の混同

  • Windowsは、ANSIと呼んたりする。それCP932や。。
  • CP932をShift JISと呼んでるソフトやOSがあるが、厳密には間違っている。

同じものなのに呼称が異なる

  • CP932,MS932,Windows-31J 同じもんや・・・しかも、これらが Shift JISと混同される

UnicodeとUTF-16・UTF-8の混同

Unicodeは、文字セットであり、文字コードでは無いが、一部のソフトやOSで混同している。

  • Windowsでは、Unicodeと言えば、UTF-16を指している

サロゲートペア・サロゲート文字の混同

本来は、UTF-16の2byte範囲で表現しきれない文字に対して、名付けられた名称である。
が、UTF-8の4Byte文字に対して、サロゲート文字と誤って呼ぶケースが多い。

EBCDIC+JEF

蛇足だが、レガシーシステムの文字コードはこんな感じ。

┌EBCDIC──┐ ┌JIS X 028(JIS90)──────────┐
│ASCIIとは │ │そのままのJISコード値を使うが、     │
│別の独自の│+│どこから漢字かが、判らないので      │
│文字コード│ │KI:漢字イン                         │
│          │ │KO:漢字アウト                       │
│          │ │と呼ばれる制御コードで囲む必要がある│
└─────┘ └──────────────────┘

hidekatsu-izuno 日々の記録 - JEF4J をリリースしてみた。あるいは、メインフレームの文字コードの話。
http://hidekatsu-izuno.hatenablog.com/entry/2018/01/14/140124

UTF-8の4Byte文字(または、サロゲートペア)は、何が面倒なのか

UTF-8から、CP932(または、Shift JIS)への変換ができない

UTF-8の4Byteは、すべからくJISの第三水準・第四水準文字であるから、CP932(または、Shift JIS)には変換できない。

Windowsは「JIS第3・第4水準はUnicodeで対応する(Shift JISには追加しない)」というスタンスらしい。

DB保存ができない

MySQLもOracle Database同様にUTF-8で文字を保存できる。ところが、4Byte文字を想定していないために、4バイトとなる文字を格納できない。

プログラミングが面倒

byteとして扱った瞬間から、文字数のカウントやら、どれがサロゲート文字なのか判定が必要やら、考慮しなきゃいけないことが増えまくる。

容量の見積もりが面倒

実際は、DBの容量見積もりとかも含めて、もっと大きなスケールになると思うけど。

100文字記録されるファイルが100個あるとするじゃん?
1文字2byteだったら、

2byte * 100文字 * 100ファイル ≒ 20kbyte じゃん?

でも、UTF-8だと、1文字1byte~4byteじゃん?
しょうがないから、最大値で見積もるじゃん?

4byte * 100文字 * 100ファイル ≒ 40kbyte で倍になるじゃん?

でも、サロゲート文字で埋め尽くされることは無いだろうから、容量の無駄じゃん?
「容量の無駄なんでちょっと減らしときますね^^」とか、お客さんに説明できないじゃん?

文字コードにおける諸所のトラブル原因

波ダッシュ問題

まとめ中

Unicodeの字形の登録ミスに起因して、以下の状態になっています。

  • 波ダッシュ 〜

    • WAVE DASH(ユニコードポイント : U+301C)
  • 全角チルダ ~

    • FULLWIDTH TILDE(ユニコードポイント : U+FF5E)
    • Shift JIS には存在しない

同じ字形に見えますね。Windowsなどでは波ダッシュの代用として全角チルダが不適切に使われるので混乱の元となっています。Macで入力した"〜"とWindowsで入力した"~"は違うものとして扱われます。仮にパスワードや、パスワードを忘れた際の合言葉に使っていた場合「あれ~MacではログインできるのにWindowsではログインできないな~」ということになります。

寿司ビール問題

まとめ中

🍣🍺という文字を扱えないソフトウェアがあるという所から名付けられた問題です。UTF-8において、1文字4Byteの文字を考慮しないかったことに起因した不具合でした。最近は、この不具合を抱えたソフトウェアは少なくなりました。

Unicode/UTF-8のあまり知られていない仕様

サロゲートペア

まとめ中

𩸽

Unicode結合文字

まとめ中

橋本商会 - UTF-8-MACをUTF-8に変換する
http://shokai.org/blog/archives/5953

Unicode正規化 変換するワンライナー

Unicode正規化するシェル芸を作りました

python3で

echo -n "DQⅢ①⑳海海神神㌔㍉ビデブー" | python -c "import sys,unicodedata; print(unicodedata.normalize(\"NFKC\", sys.stdin.read()));"
DQIII120海海神神キロミリビデブー

perlで

echo -n "DQⅢ①⑳海海神神㌔㍉ビデブー" | perl -e "use strict;use utf8;use Encode;use Unicode::Normalize;binmode STDIN, ':encoding(UTF-8)';binmode STDOUT, ':encoding(UTF-8)';print Unicode::Normalize::NFKC(<STDIN>);"
DQIII120海海神神キロミリビデブー

検出する方法について

異字体セレクタ

まとめ中

Article

Qiita - 絵文字を支える技術の紹介
https://qiita.com/nonanona/items/b148c212ba7c24942e93

絵文字がある種のUnicodeバグを世界から一掃しつつある件について
https://note.mu/ruiu/n/nc9d93a45c2ec

書籍

たかが文字コード、されど文字コード/ShiftJISerへ贈る鎮魂歌
https://techbookfest.org/product/5677280795820032?productVariantID=5733665126481920

ユニコード戦記 ─文字符号の国際標準化バトル
https://amzn.to/3redEnc

[改訂新版]プログラマのための文字コード技術入門 WEB+DB PRESS plus
https://amzn.to/3KY0276

参考

Shapecatcher(手書きの文字からUnicodeを検索)
https://shapecatcher.com/#

(プログラマのための)いまさら聞けない標準規格の話
https://www.ogis-ri.co.jp/otc/hiroba/technical/program_standards/part1.html

ㇹ゚ン゚'ㇳ̃ヴ゙ニ゙コ゚ヮヰ文̂字̠コ゚−ト゚ノ゙ㇵナ゚ㇱ(現在に至るまでの文字コードの軌跡と簡単な使い方について)
https://heppoko.hatenadiary.jp/entry/2018/04/28/184559

ウナのIT資格一問一答 - 文字コードやフォント、その他PC関連の読み物です。
http://una.soragoto.net/topics/index.html

JISから迫る文字コード入門
https://speakerdeck.com/todokr/jiskarapo-ruwen-zi-kodoru-men

hidekatsu-izuno 日々の記録 - JEF4J をリリースしてみた。あるいは、メインフレームの文字コードの話。
http://hidekatsu-izuno.hatenablog.com/entry/2018/01/14/140124

長くて覚えやすくて複雑なパスワードとemojiの話
https://speakerdeck.com/ozuma/chang-kutejue-eyasukutefu-za-napasuwadotoemojifalsehua

Dive Into Python 3 第4章.文字列
http://diveintopython3-ja.rdy.jp/strings.html

C++標準化委員会、ついに文字とは何かを理解する: char8_t
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b

アプリの国際化の舞台裏
https://speakerdeck.com/niw/apurifalseguo-ji-hua-falsewu-tai-li

Unicodeで絶対知っておくべきセキュリティ5つの注意(翻訳)
https://techracho.bpsinc.jp/hachi8833/2017_11_28/48435

UTF-8の冗長なエンコード
https://gihyo.jp/admin/serial/01/charcode/0004#sec2

全ての開発者が知っておくべきUnicodeについての最低限の知識
https://gigazine.net/news/20231005-unicode/

絵文字を支える技術について
https://note.com/ttuusskk/n/n1bff5d8e638c

MobaXterm - 求めていたWindows用GNU環境がここにあった!!!1

kanata8年以上前に追加

Windowsでgrepしたいとか、シェルスクリプトでデータ編集したいとか、scp使いたいとか、sed使いたいとか、もぅあれやこれやが稀によくあった。
でも、cygwinを入れるという気にならなかった。portable版がないしね。ちょこっとGNUコマンド使いたいだけなんだけど。

MobaXtermが全てを解決してくれたんだ!!1

  • 日常的に使いたいコマンドがほぼ全部最初入っている!シェルスクリプト組む時に、足りないコマンドが無い。
  • それにしても軽い。
  • portable版がある。20MBくらい。余裕で持ち運べる。
  • SSHクライアントも入ってる。超便利。TeraTermの代わりになる。
  • X Clientもできる。
  • ちなみにmoshも入ってる。

素晴らしい。

MobaXterm
http://mobaxterm.mobatek.net/

20151107_mobaxterm.jpg

Dentoo.LT#12を聴講させて頂きました

kanata8年以上前に追加

以前参加させて頂いたすみだセキュリティ勉強会2015#1Dentoo.LTというものの存在を知り、前々から興味があったので、聴講させて頂きました。

コレ好きィ!
とっても面白かった。いつか自分も発表したい!

色々なマニアックな話題の中にも、高度に技術的な話が織り込まれていて、いや、これ、ホントレベル高いと思っていながらも、ずっと笑ってました。
完飲。

あと、文字フリマのステッカー頂きました。ありがとうございます。

「ポートスキャンしたらsshが100個見えるようにしてみた」をやってみた

kanata8年以上前に追加

_人人人人人人人人人人_ 
> 突然の100個のssh <
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

KippoBrinker

結論だけ見たい人は最後の「第7回 ハニーポッター技術交流会(2020/1/25)で得た知見」を見て~


先日、すみだセキュリティ勉強会2015#2に参加してきました

すみだセキュリティ勉強会2015#2
http://ozuma.sakura.ne.jp/sumida/2015/08/20152.html

ろば電子が詰まっている
http://d.hatena.ne.jp/ozuma/20150829/1440837066

その中で、以下の知見を得ることができました。

sshのポートをデフォルトの22/tcpから変えるべきか論争

  • sshのポートは、やっぱり22/tcpから変えましょう
  • プリンタポート…具体的には9100/tcpから9107/tcpの8つのポートにするだけで隠れることができる
    9100/tcpはプリンタが使うポートで、一部の機種ではここに送られたデータをそのまま印刷するという機能を持ちます。バージョン情報取得のため、nmapでスキャンをすると大量の印刷をしてしまうおそれがあるため、デフォルトでスキャン対象していない。ため。

  • ポートスキャンをしても一発で分からないようにすればいい

  • ssh分身の術により、大量のsshを見せる

_人人人人人人人人人人_ 
> 突然の100個のssh <
  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

やってみた。
以下は、CentOS7で動作確認しています。

kippo

kippoとは

kippoとはsshっぽく振る舞うハニーポット
python(ver2系)製

kippoのインストール

必要なパッケージのインストール

# yum install python-devel

virtualenvによる仮想環境の作成(別に直でも問題ない)

virtualenvによる仮想環境を作ると、必要環境をユーザ環境にインストールできるようになる。
よく解らない人は、pythonを参照。

$ mkdir kippo
$ virtualenv --no-site-packages kippo
$ cd kippo
$ source bin/activate
(kippo)$

ちなみに仮想環境抜ける時は、以下ね。

(kippo)$ deactivate

必要パッケージのインストール&kippoセットアップ

仮想環境に必要パッケージをインストールする。
twistedは、最新バージョンだと動かないので注意。
起動時にFailed to load application: 'module' object has no attribute 'IPluggableAuthenticationModules'
というエラーが出る場合、どうやら Twisted のバージョンの問題らしい。15.2.0 を入れることで解決する。

(kippo)$ pip install twisted==15.2.0
(kippo)$ pip install PyCrypto
(kippo)$ pip install pyasn1
(kippo)$ git clone https://github.com/desaster/kippo
(kippo)$ cp -i kippo.cfg.dist kippo.cfg
(kippo)$ ./start.sh

起動したら、セットアップ完了。動作を確認してみる。

$ ssh localhost -p 2222

root:123456でログインできる。

動作確認後

動作が確認できたら、以下をやっておこう。

停止

(kippo)$ sh ./stop.sh

root:123456でログインできないようにする。

(kippo)$ cd data
(kippo)$ cp -pi userdb.txt  userdb.txt.org
(kippo)$ vi userdb.txt

- root:0:123456
+ [でたらめな文字列]:0:[でたらめな文字列]

kippoBrinkerSumida

概要

kippoは、通常は1つの環境しか立ち上げられない。
それを複数起動可能にするシェルスクリプトを作ってみた。

インストール&セットアップ

kippoインストール先に、以下のファイルを置く。

kippoBrinkerSumida.sh
kippoBrinkerStop.sh

実行権を付与する。

(kippo)$ chmod u+x kippoBrinkerSumida.sh
(kippo)$ chmod u+x kippoBrinkerStop.sh

ダミーとして起動したいポート番号を指定する。

(kippo)$ vi kippoBrinkerSumida.sh
- KIPPO_PORT_LIST="1020 1021 1022 1023 1024 1025" # ダミーsshdのポートリスト
+ KIPPO_PORT_LIST="任意のポート番号1 任意のポート番号2 任意のポート番号3..." # ダミーsshdのポートリスト

sshのバナーを合わせる。
自分のサーバのsshのバナーに合わせておかないと偽物だってバレちゃうので、自分のsshサーバのバナーを確認する。

$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.7

上の結果だと、SSH-2.0-OpenSSH_6.7 がそれ。
確認したらCtrl+cで抜ける。

確認結果を設定する。

(kippo)$ vi kippoBrinkerSumida.sh
- SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.6.1"
+ SSH_VERSION_STRING="SSH-2.0-OpenSSH_6.7"

このまま真似しないでね。みんなの環境とは、それぞれバージョンが違うはずだから。

起動

以下、実行するだけ。

(kippo)$ ./kippoBrinkerSumida.sh

起動完了後に、実際にsshっぽく見えるか確認してみよう。

$ telnet localhost [設定したポート番号]

ウェルノンポートを指定してダミーを起動したい場合

まず、前提としてkippoはユーザ権限で起動した方がいい。
万が一、kippoに脆弱性があった時に、root権限だったりすると死ぬ。

しかし、ユーザ権限ではウェルノンポート(0~1023のポート番号)をBINDできない。
でもウェルノンポートで起動したい場合もあるよね。
Linuxの機能により、以下の方法でrootの一部権限をファイルに付与できる。

ウェルノンポートでBINDする権限を付与

# setcap CAP_NET_BIND_SERVICE+ep /[virtualenv環境]/bin/python

確認は以下

# getcap /[virtualenv環境]/bin/python
# /[virtualenv環境]/bin/python = cap_net_bind_service+ep

権限剥奪は以下

# setcap -r /[virtualenv環境]/bin/python

停止

以下、実行するだけ。

(kippo)$ ./kippoBrinkerStop.sh

kippoBrinker

概要

kippoBrinkerSumidaには、1つデメリットがあって、ダミーsshを増やした分、プロセスが増えてリソースを圧迫します。
100個とかあげたら、それはもぅ大変な無駄遣いになりそう。
そこで、こいつの登場です。こんな動きをします。
本物sshサーバは、22番からポート番号を変更している前提です。

  • ダミープロセスが、22番ポート(変更可)を開いて待ち受ける。釣りである。勝手にアクセスしてくる奴は悪意があると判断する。
  • 接続してきた奴がいたら、すぐさまコネクションを切断する。
  • すぐさまkippoをポート番号ランダムで25個(変更可)立ち上げる。
  • 30分したら、25個のダミーsshは落とす。
  • 再び、22番ポートで、釣り。最初に戻る。

これなら、リソースを無駄に消費している状況が30分に抑えられます。
まぁ、しつこくアクセスしてきたら変わらないんですけどね。

インストール&セットアップ

kippoインストール先に、以下のファイルを置く。
kippoBrinkerStop.shは、kippoBrinkerSumida.shと共用なので、導入済みならやらなくていい。

kippoBrinker.sh
kippoBrinker.txt
kippoBrinkerDummyEntry.py
kippoBrinkerStop.sh

実行権を付与する。

(kippo)$ chmod u+x kippoBrinker.sh
(kippo)$ chmod u+x kippoBrinkerStop.sh

ダミー待受ポート番号、起動するkippoの多重度を、必要に応じて編集する。

(kippo)$ vi kippoBrinker.sh
MY_IP_ADDR=`hostname -i|head -1|cut -d' ' -f2`  # 自分のIPアドレスを設定(このIPでBINDする)
PROC_NUM="25"   # ダミーsshdを何個立ち上げるか
EXEMPT_PORT_LIST="80 443"     # ダミーsshdの対象外ポート
DUMMY_ENTRY_PORT="22"   # ダミー待ち受けポート

sshのバナー情報を設定する。デフォルトでいくつか入れてあります。
kippoBrinker.shは、ここからランダムに選択してダミーを起動する。
古くなったら、適宜新しいバージョンのバナーを追加するとよいだろう。

$ cat kippoBrinker.txt 
SSH-2.0-OpenSSH_6.7p1 Debian-5
SSH-2.0-OpenSSH_6.7
SSH-2.0-OpenSSH_6.6.1
SSH-2.0-OpenSSH_6.2
SSH-2.0-OpenSSH_6.0
SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1
SSH-2.0-OpenSSH_5.9
SSH-2.0-OpenSSH_5.8p2_hpn13v11 FreeBSD-20110503
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu5
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu7
SSH-2.0-OpenSSH_5.5p1 Debian-6
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze2
SSH-2.0-OpenSSH_5.3

ウェルノンポートを指定してダミーを起動したい場合

上のkippoBrinkerSumidaと同じ。

起動

以下、実行するだけ。

(kippo)$ ./kippoBrinker.sh

以下、やってみると動作を確認できる。
すぐさま切断されて、kippoが起動していく。

telnet localhost 22

停止

以下、実行するだけ。
kippoBrinkerSumida.shで実行してある分があれば、もろとも一緒に停止する。

(kippo)$ ./kippoBrinkerStop.sh

第7回 ハニーポッター技術交流会(2020/1/25)で得た知見

第7回 ハニーポッター技術交流会で登壇しました

すごいね…難読化シェル芸の時もそうでしたが、技術って発信すると集まってくる…最高

つまりですね…こういう小難しいことしなくて良かったんです(5年間気づかなかった)

iptablesにポートリダイレクトを定義すればいい…と…

Memo

雑記帳 - cowrieはkippoを改良したSSHハニーポット
http://yagamikou.hateblo.jp/entry/2015/09/25/015735

オープンソースカンファレンス2015 Tokyo/Fall に行ってきました

kanata8年以上前に追加

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

春に続き、今回の秋も行ってみました。やっぱ楽しい!
そしてまた沢山ノベルティを頂いてしまった(ありがてぇ・・)

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

  • #aozorahack

何の気なしに利用させて頂いていた青空文庫なんですが、実は裏側ではきちんと構成管理されているそうです。
でも、機器老朽化により、いつ飛んでもおかしくない状況だったそうで、いま一生懸命サーバ保護と移転作業をしているそうです。
さらに、もっと面白くしたいという思いがあるそうで、そんな強い情熱を感じました。
興味のある方は参加してみては。

  • LibreOffice

あのLibreOfficeですが、なんとオンライン版を作っているそうですよ・・・!

http://www.ospn.jp/

20151024_ospn.JPG

インターネット上にあるサーバが開いているポートTop10を出力する

kanata8年以上前に追加

nmapの調査結果(?)から確認することができます。
ワンライナーでいける。

$ curl -s https://svn.nmap.org/nmap/nmap-services|grep '^[a-z].*[0-9]*\/tcp' nmap-services  |sort -nr -k 3 | head -10
http    80/tcp  0.484143        # World Wide Web HTTP
telnet  23/tcp  0.221265
https   443/tcp 0.208669        # secure http (SSL)
ftp     21/tcp  0.197667        # File Transfer [Control]
ssh     22/tcp  0.182286        # Secure Shell Login
smtp    25/tcp  0.131314        # Simple Mail Transfer
ms-wbt-server   3389/tcp        0.083904        # Microsoft Remote Display Protocol (aka ms-term-serv, microsoft-rdp)
pop3    110/tcp 0.077142        # PostOffice V.3
microsoft-ds    445/tcp 0.056944        # SMB directly over IP
netbios-ssn     139/tcp 0.050809        # NETBIOS Session Service

ちなみに、ポートスキャンは、この上位10ポートをスキャンすると、全体の50%をカバーできるんだそうで、ポート番号を総ナメしなくても、それなりに判っちゃうらしい。

ちょっと思うところがあって、調べてみました。

zlib圧縮部分を抽出・展開してファイルに保存するツール作りました

kanata8年以上前に追加

CTFでzlib圧縮部分に気づかずに、解けなかった問題が過去2問あって、
これはいかんと思いました(小並感)。

zlib圧縮部分って、マジックナンバーが定まっているわけじゃなくて、目grepでもすごく判別しにくい。
しかも、fileコマンドでも、tridでも、判らないんだよね。

バイナリからzlib圧縮データを探す
http://teraapi.blogspot.jp/2012/05/zlib.html

よくある: 
78 01, 78 5e, 78 9c, 78 da 

稀 :
08 1d, 08 5b, 08 99, 08 d7, 18 19, 18 57, 18 95, 18 d3, 
28 15, 28 53, 28 91, 28 cf, 38 11, 38 4f, 38 8d, 38 cb, 
48 0d, 48 4b, 48 89, 48 c7, 58 09, 58 47, 58 85, 58 c3, 
68 05, 68 43, 68 81, 68 de 

極稀:
08 3c, 08 7a, 08 b8, 08 f6, 18 38, 18 76, 18 b4, 18 f2, 
28 34, 28 72, 28 b0, 28 ee, 38 30, 38 6e, 38 ac, 38 ea, 
48 2c, 48 6a, 48 a8, 48 e6, 58 28, 58 66, 58 a4, 58 e2, 
68 24, 68 62, 68 bf, 68 fd, 78 3f, 78 7d, 78 bb, 78 f9  

そこで、引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存するツール作った。

CentOSで動作確認済み。Kali Linuxだとopensslでzlibのdecodeが出来なかったので、たぶん、Debian でも動かないかも。
まぁ、zpipeで代替すれば、どの環境でも行けるはず。
ちなみに、動作はめっちゃ遅い。

#!/bin/bash

# zlib_extraction.sh ver 1.3
# 引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する
# 2015.10.06 kanata 

while [ "$#" -gt 0 ]
do

if [ ! -f "${1}" ]
then
  echo "file open error ($1)"
  exit 1
fi

FILESIZE=`ls -l ${1}|awk '{print $5}'`
ZLIBPART="${1##*/}"
ZLIBPART="${ZLIBPART%.*}"
I="0"
FORK_COUNT="0"

  while [ "${I}" -lt "${FILESIZE}" ]
  do
    ZLIBPART_FILE="${ZLIBPART}_${I}.bin"
    ( cat ${1} | dd bs=1 skip=${I} | openssl zlib -d > ${ZLIBPART_FILE} 2>/dev/null ; if [ -s ${ZLIBPART_FILE} ] ; then file ${ZLIBPART_FILE} ; else rm -f ${ZLIBPART_FILE} ; fi )&

    # 並列実行時のサブシェルが増大していくのを抑止
    # 同時35多重までに抑止 25回に1度チェック ( 数値を弄ってチューニングできます )
    if [ $(( I % 25 )) -eq "0" ] ; then FORK_COUNT=`ps -u |fgrep -c ${0}` ; fi
    while  [ "${FORK_COUNT}" -gt "35" ] 
    do
      printf "[WARNING] SubProcess Exceed Limit. fork:%s offset:%s\n" ${FORK_COUNT} ${I}
      FORK_COUNT=`ps -u |fgrep -c ${0}`
    done

    I=$(( I + 1 ))
  done

shift
done

exit 0

遅かったので、処理を並列化したんだけど、その並列化を制御する処理自体がボトルネックになって、そんなに速くならなかった。微妙。

これでpdfとかswfとかから、データの抽出ができるハズ。

詳細:CTF Forensic

2016.8.3 追記
バージョンアップした。シリアル処理と並列処理を選択できるようにした。

CTF Forensic - 引数のファイルに含まれるzlib圧縮部分を抽出・展開してファイルに保存する

1 ... 10 11 12 13 14 ... 16 (111-120/152)

他の形式にエクスポート: Atom

クリップボードから画像を追加 (サイズの上限: 100 MB)