カテゴリー「未分類」の記事

UEFI PXE netboot用のDHCPサーバをCentOS6で作る際はdhcpd.confにnext-serverの設定を入れよう

2018年4月18日 / 未分類

タイトルで言いたいことは言い終わった。

いきさつ

諸事情から40台のコンピュータにUbuntuインストールすることになり、手動でやるのは死ねるのでPXE boot + Preseedで自動インストールしようと思い、手元にあった環境でテストしてた。諸事情によりネットワークブート用のサーバとして使えたのはCentOS6の入ったコンピュータであった(悲劇の始まり)

UEFI/PXE-netboot-install – Ubuntu Wikiを見ながらネットワークブートの環境を作っていた。Ubuntu Wikiではdnsmasqを使っていたが、以前使ったことがあって設定もある程度調べていたdhcpdを使うことにした。同じように設定すればいいだろうと思って。あとDNSに関すること全くさせないのにdnsmasq使うのが何となく嫌だった。

で、いざやってみるとtftp経由でgrubイメージ読むところまではうまくいっているが、その後grub.cfgを読みに来ない。GRUBのシェルになる。dnsmasqを使ってやるとちゃんとgrub.cfgを読みに来てブートメニューが表示される。

なんでじゃーと思い、方々を調べながら試行錯誤を繰り返していたところ、dhcpd.confにnext-serverの設定を追加したら期待通りの動作をするようになった。
Man page of dhcpd.confから

next-server 文は初期ブートファイル (filename 文で指定したもの) をロードするサーバのホストアドレスを指定するために使います。 server-name は数値の IP アドレスかドメイン名です。 接続してきたクライアントに対して与えるべき next-server パラメータがなければ、DHCP サーバの IP アドレスが用いられます

next-serverの項目書いてなければDHCPサーバのIPアドレスになるとあり、実際grubイメージは同じIPで動いているTFTPサーバに読みに来てるのに、その先にはnext-serverの項目がないと進まないってわけがわからないよ。

追記

manpageからnext-serverが存在しないときの部分が削られてた。手元でman dhcpd.confしたら新しいのがちゃんと出てきた。13年以上前の情報が平然と上位に出てくるインターネットこわい。

オチ

不可解な点はあっても問題は解決したのでよしよし、同じことで困ってる人もいるだろうから帰ってブログエントリ書くか、と思ってUbuntu 16.04でやってみたらnext-serverなくてもしっかり動いて悲しみにくれる。

結論

CentOS6とかいう旧時代の遺物は破却しましょう。する。

SECCON 2017 Online CTF Writeup #seccon

2017年12月11日 / 未分類

スキルも文章力もない奴が何偉そうに言ってんの?(自分です)と思ったので書く。

とあるチームに参加して4問解いた。Submitしたのは上の3問で計500点。

Vigenere3d (Crypto 100)

ヴィジュネル暗号の3次元版。
2つ目の鍵を使ってヴィジュネル暗号の表を3次元方向に拡張している。

ヴィジュネル暗号の強さは鍵の長さ(=周期)に依存している。
Vigenere3dは、鍵を2つ用いているため、周期は2つの鍵の長さの最小公倍数となる。
問題のプログラムでは2つの鍵が同じ長さになっているため、拡張した意味がまったくない…

さて、暗号プロセスを見てみると、平文1文字に対して、2つの鍵のsにおけるインデックスの和で暗号文が決まることがわかる。
t[x]のデータを表にしてみるとわかりやすい。以下は平文が’S’の場合。

この問題では、2つ目の鍵は1つ目の鍵を逆順にしたものにしている。
このため、1つ目の鍵と2つ目の鍵のインデックスの和、というのは、後ろ半分の8文字目からは1~7文字目の順番を逆にしたものとなり、前半分の7文字分だけ鍵(のインデックスの和)がわかれば全部わかることになる。
7文字分は平文と暗号文の両方がわかっているため、これだけで鍵が全部導出できる。
平文1文字分ずつ上記の表を出して暗号文との対応から鍵を求めていくと、vigenere3d.pyの入力として与える鍵(の一例)は

AAAAAAA_aZ2PK_

であることがわかる。
あとは復号プログラムを作って暗号文と鍵を与えてやればいい。

import sys

def _l(idx, s):
    return s[idx:] + s[:idx]

def main(c, k1, k2):
    s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
    t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
    i1 = 0
    i2 = 0
    p = ""
    for a in c:
        for i in range(len(s)):
            if t[i][s.find(k1[i1])][s.find(k2[i2])] == a:
            p += s[i]
            break
        i1 = (i1 + 1) % len(k1)
        i2 = (i2 + 1) % len(k2)
    return p

print main(sys.argv[1], sys.argv[2], sys.argv[2][::-1])
Flag: SECCON{Welc0me_to_SECCON_CTF_2017}

Run me! (Programming 100)

与えられたソースコードを見ると、11011番目のフィボナッチ数の頭32桁がフラグの模様。
あとは下の通り。

Flag: SECCON{65076140832331717667772761541872}

Powerful Shell (Binary 300)

難読化(?)されたPowershellスクリプトを解析する(Binary…?)
要所要所で変数に保持したPowershellプログラムを実行する部分があるので、代わりにWrite-Hostで標準出力に出すなどしてやれば見ることができる。

1段目。
文字を延々と生成して変数$ECCONに追加している。
最後の”Write-Progress -Completed”の後に実行しているので変数$ECCONを出力してやればよい。

2段目。
キーボードを叩いて秘密のメロディを演奏させる。演奏されたメロディが正しいと次の段階に進む。
環境等チェックしているところはコメントアウトしつつ、Powershell ISEでデバッグ実行するのが楽、
“Play the secret melody.”と標準出力に出しているところまで進むと$keytoneにキーと鳴らす音の周波数の対応が入っている。
正解のメロディは少し後の$secret変数に周波数の列として納められているので$keytoneの内容と見比べて正解のキー列を得る。
ソースを追っていくと入力したキー列は$fに文字列の形で入っているため、正解のキー列で文字列を作っておく。

$f = "hhjhhjhjkjhjhf"

この$fは後でXORデコードの鍵として使われる。
下の方の$text以降に上記の$fの値を設定する一行を加え、最後のiexをWrite-Hostに書き換えれば実行されるコードを取得できる。

3段目。
最後はPowershellでの記号プログラミング。
記号のみで任意のPowerShellコードを実行 – JPerl advent calendar 2010 Sym Trackに書かれているのとまったく同じやりかたで記号化している。
(上記リンクはサーバにアクセスできなかったため、Web Archiveにリンクしている)
やり方を見て解読していけばいい。

Flag: SECCON{P0wEr$H311}

Simon and Speck Block Ciphers (Crypto 100)

アルゴリズム、平文、暗号文、鍵の一部が与えられており、鍵がフラグになっている。
鍵のうちわからない部分はたった4文字なので、Brute forceすればよい。
ググるとGitHubに実装があったのでこれを使った。

from simon import SimonCipher

def str2long(s):
    l = 0
    for i in range(len(s)):
        l = l * 256 + ord(s[i])
    return l

plain = 0x6d564d37426e6e71
cipher = 0xbb5d12ba422834b5

chars = [ chr(i) for i in range(33, 127) ]
solved = False
for c1 in chars:
    for c2 in chars:
        print "c1 = %c, c2 = %c" % (c1, c2)
        for c3 in chars:
            for c4 in chars:
                k = "SECCON{%c%c%c%c}" % (c1, c2, c3, c4)
                s = SimonCipher(str2long(k), key_size = 96, block_size = 64)
                if s.encrypt(plain) == cipher:
                    print "Key = %s" % k
                    solved = True
                    break
            if solved:
                break
        if solved:
            break
    if solved:
        break
Flag: SECCON{6Pz0}

以上。
久しぶりのCTFで楽しかったが、セキュリティの知識が必要とされる問題を解けていないことがわかる。
実働時間も短かった(まあこれはしょうがない)
Pwn系を解けなかったしそのスキルがあるとは思えないので精進したい。

Trend Micro CTF 2015 Writeup #TrendCTF #TrendCTF2015

2015年9月27日 / 未分類

Trend Micro CTF Asia Pacific & Japan 2015に参加した。
チームとしては1400点獲得。
自分は200点問題を3問解いたので書いていく。
(問題文等の確保をしてなかったのでその辺は適当。後ほどアップデートできればする)

続きを読む»

SECCON 2014 Online予選(2) writeup

2014年12月8日 / 未分類

オンライン予選冬の陣に参加したので取り組んだ問題について書いていく。

続きを読む»

bashの脆弱性を突くアクセス

2014年9月26日 / 未分類

bashの脆弱性が話題です。
bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた – piyolog

うちに攻撃が来てないかどうかaccess.logをgrepしてみた。

tkito@sakura:/var/log/apache2$ grep "()" access.log
209.126.230.72 - - [25/Sep/2014:09:13:47 +0900] "GET / HTTP/1.0" 200 929 "() { :; }; ping -c 11 209.126.230.74" "shellshock-scan (http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html)"
xx.xx.xx.xx - - [25/Sep/2014:17:45:57 +0900] "GET /cgi-sys/defaultwebpage.cgi HTTP/1.0" 404 508 "-" "() { :;}; /bin/ping -c 1 198.101.206.138"

こんな感じ。
うちは元々のアクセス数も少ないサイトなので現状この程度。

1行目はErrata Securityによるshellshock-scanである。
アクセス元IP、ping先IP共にErrata SecurityのIPアドレスであり、問題のあるアクセスではない。

2行目は、恐らく善意ではなく脆弱なサービスを探索するスキャンだと思われる。
アクセス元はオランダのIP、ping先はクラウドサービスのIPであり、実施者の詳細は不明。
GET対象のパスを調べたところ、cPanelというサーバ管理ソフトで使われるものらしい。
いかにも内部でsystem関数なりでコマンド発行してそうなソフトである。

注意

うちの場合grepしてわかったのは上記の2件だけだが、それで全てだと思ってはいけない。
shellshock-scanのブログを見ると、リクエストヘッダのうちCookieとHostとRefererにコードを入れていて、実際にアクセスログに残っているのはRefererのみであった。
当サーバのログはcombinedで残すようになっている(デフォルトのまま)が、CookieとHostはアクセスログには残っていない。
他にもデフォルトでログに残らないヘッダはある(Accept-Encodingなど)ので、ログに残ってなかったからといって攻撃がなかったというわけではない。
自分が攻撃者ならできるだけログに残らない方法でスキャンを行う。
気づかないうちにバックドアが仕掛けられているかもしれないのだ。
危険なCGIなどを設置していたサーバは入念な調査が必要だと思われる。
(※本当に痕跡残さずに攻撃が可能かどうかは時間がなくて検証してない)

 

SECCON 2014 横浜大会に参加した

2014年9月8日 / 未分類

去る9/3と9/4、SECCON 2014の横浜大会に参加した。
開会式等が9/2にあったのだが、それまでに仕事を倒しきれず開会式への参加は断念。無念。
1日目にバイナリ/ネットワーク/Webのジャンルで与えられた問題を解く競技があり、2日目に1日目で勝ちあがった人+敗者復活戦通過者でクイズ大会。
1日目は通過したものの、2日目で敗退してしまった。
以下詳細

続きを読む»

SECCON 2014 オンライン予選に参加した&writeup

2014年7月27日 / 未分類

7/19(土) 9:00-21:00に開催されたSECCON CTFオンライン予選に参加しました。
うちのチームは練習問題含めて8問解いて1000点獲得。
一週間遅れですが、解けなかったものも含めてWriteup書いた。

続きを読む»

tkbctf3に参加したけどだめだったのでwriteup集めた

2014年5月6日 / 未分類

tkbctf

だめでした。
何がだめって、解けないとすべてを諦めてしまうあたり。
Misc 100、Network 100、Binary 300にチャレンジしていろいろやってみたけど結局解けずじまい。
続きを読む»

CODEGATE 2014 WeirdShark writeup

2014年2月25日 / 未分類

Forensicカテゴリ。
150点。
今回の最少得点問題。

続きを読む»

CODEGATE 2014 dodoCrackme writeup

2014年2月25日 / 未分類

Reversingカテゴリ。
200点。
このエントリ無駄に縦に長くなった。
続きを読む»

TOPへ戻る