本校の学生はCTFをほとんど経験したことないのですが、面白そうということで2チームほど編成して参加してきました。 www.ishikawa-nct.ac.jp
この記事ではWrite upとしてどの問題を解いたかを紹介します。
ついでに現実問題としてどのような対処をすべきかもかければ御の字ですね。
問題のスクリーンショットや解き方を記録しているわけでもないので今から記憶力テストが始まります。
はじめに
このWrite upでは解いた問題を最初に紹介します。
フラグは全部忘れたのでFLAG{hogehoge}
で代用しています。
解けなかった問題で触って色々考えた問題は別記事にしました。
k-hyoda.hatenablog.com
Write up
01. 回答は半角で
この文字列は一体なんだろう?という感じの問題文に続いて次のような文字列が表示されています。
%EF%BC%A6%EF%BC%AC%EF%BC%A1%EF%BC%A7%EF%BD%9B%EF%BD%88%EF%BD%8F%EF%BD%87%EF%BD%85%EF%BD%88%EF%BD%8F%EF%BD%87%EF%BD%85%EF%BD%9D
Web系のプログラミングをしたことがある人は察しが付くと思いますが、これはパーセントエンコーディングが施された全角文字列です。
ja.wikipedia.org
URL(正確にはURI)には使用できる文字の種類が決まっていて、残念ながら日本語などの全角文字列は使用できる文字に含まれていません。
そこで、全角文字をURIで使用できる文字に置き換えて表現したのがパーセントエンコーディングです。
特徴として、文字を表現する際に必ず%から始まっているというものがあります。
WebサイトのURLで日本語が含まれる場合はよく使われています。*1
エンコードとデコードは簡単で、URLエンコード
などと検索してもらえばエンコード/デコードができるWebサイトにたどり着くので、そこで文字列をデコードすればフラグを手に入れることができます。
ただし、パーセントエンコーディングが施された文字列は全角文字列なので問題タイトルにあるとおり半角文字列に置き換える必要があります。
03. 20回もやれば、暗号と認めてやってもいいだろう。
問題文の内容は覚えていませんが、メチャクチャな文字列(暗号化されたフラグ)だけが書いてあったような気がします。
次のような感じです。
Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZadGNFSmxSbGw1VTJ0V1ZXSkhhRzlVVmxaM1ZsWmFjVkZ0UmxSTmJFcEpWbTEwYTFkSFNrZGpTRUpYWVRGd2FGcFdXbUZrUlRGVlZXeFNUbUY2UlRGV2EyUXdZekpHYzFOdVVtaFNlbXhXVm1wT1QwMHhjRlpYYlVaclVqQTFSMWRyV2xOVWJVcEdZMFZ3VjJKVVJYZFdha1pYWkVaT2MxZHNhR2xTTW1oWlYxZDRiMkl5Vm5OVmJGWlRZbFZhY1ZadGRHRk5SbFowWlVaT1ZXSlZjRWRaTUZaM1ZqSktWVkpZWkZwV1JWcHlWVEJhVDJOc2NFaGpSbEpUVmxoQ1dsWXhXbE5TTWxGNVVtdGthbEp0VWxsWmJGWmhZMnhXY1ZKdFJsUlNiR3cxVkZaU1UxWnJNWEpqUld4aFUwaENTRlpxU2tabFZsWlpXa1p3YkdFelFrbFhXSEJIVkRKU1YxWnVUbGhpVjJoeldXeG9iMkl4V25STldHUlZUV3RzTlZWdGRHdGhiRXAwVld4c1dtSkdXbWhaTW5oWFl6RldjbHBHWkdsU2JrSmFWMnhXWVZReFdsaFRiRnBZVmtWd1YxbHJXa3RUUmxweFUydGFiRlpzV2xwWGExcDNZa2RGZWxGcmJGaFhTRUpJVmtSS1UxWXhXblZWYldoVFlYcFdlbGRYZUc5aU1XUkhWMjVTVGxOSFVuTlZha0p6VGtaVmVXUkhkRmhTTUhCSlZsZDRjMWR0U2tkWGJXaGFUVzVvV0ZreFdrZFdWa3B6VkdzMVYwMVZiekZXYlhCTFRrWlJlRmRzYUZSaVJuQnhWV3hrVTFsV1VsWlhiVVpPVFZad2VGVXlkREJXTVZweVkwWndXR0V4Y0hKWlZXUkdaVWRPUjJKR2FHaE5WbkJ2Vm10U1MxUXlVa2RVYmtwaFVteEtjRlpxU205bGJHUllaVWM1YVUxWFVraFdNalZUVkd4YVJsTnNhRlZXYkZZMFZHdGFZVmRIVWtoa1JtUk9WakZLU2xkV1ZtRmpNV1IwVTJ0a1dHSlhhR0ZVVnpWdlYwWnJlRmRyWkZkV2EzQjZWa2R6TVZZd01WWmlla1pYWWxoQ1MxUldaRVpsUm1SWldrVTFWMVpzY0ZWWFZsSkhaREZaZUdKSVNsaGhNMUpWVlcxNGQyVkdWblJOVldSV1RXdHdWMWxyVW1GWFIwVjRZMGhLV2xaWFVrZGFWV1JQVTBVNVYxcEhhR2hOU0VKMlZtMTBVMU14VVhsVmEyUlZZbXR3YUZWdGVFdGpSbHB4VkcwNVYxWnNjRWhYVkU1dllWVXhXRlZ1Y0ZkTlYyaDJWMVphUzFJeFRuVlJiRlpYVFRGS05sWkdVa2RWTVZwMFVtdG9VRlp0YUZSVVZXaERVMnhhYzFwRVVtcE5WMUl3VlRKMGIyRkdTbk5UYkdoVlZsWndNMVpyV21GalZrcDFXa1pPVjJFeGNEVldSRVpyWXpGVmQwMUliR2hTYlhoWVdXeG9RMVJHVW5KWGJFcHNVbTFTZWxsVldsTmhSVEZ6VTI1b1YxWjZRalJVYTJSSFVqRmFXVnBIYUZOV1ZGWlZWbGN4TkdReVZrZFdiR1JvVW5wc2IxUldXbmRsYkZsNVkwVmtWMDFFUmpGWlZXUnZWMnhhV0ZWclpHRldWMUpRVldwS1IxSXlSa2hpUms1cFlUQndNbFp0TVRCVk1VMTRWVmhzVm1FeVVsWlpiWFIzWVVaV2RHVkZkR3BTYkhCNFZUSXdOV0pIU2toVmJHeGhWbGROTVZsV1ZYaFhSbFp6WVVaa1RsWXlhREpXYWtKclV6RmtWMVp1U2xCV2JIQnZXVlJHZDFOV1draGxSMFphVm0xU1IxUnNXbUZWUmxwMFlVWlNWVlpYYUVSVk1uaGhZekZ3UlZWdGNFNVdNVWwzVmxSS01HSXlSa2RUYms1VVlrZG9WbFpzV25kTk1WcHlWMjFHYWxack5YbFhhMXBQWVZaS2NtTkVXbGRoTWs0MFdYcEdWbVZXVG5WVGJGSnBWbFp3V1ZaR1l6RmlNV1JIV2taa1dHSkZjSE5WYlRGVFpXeHNWbGRzVG1oV2EzQXhWVmQ0ZDFZeVNsbFZiR2hoVWtWYVlWcFZaRXRUVms1ellVZG9UazFWY0ZaV2JHTjRUa2RSZVZaclpGZFhSM2h5VldwQ1lXTkdWblJsU0dSc1lrWldOVnBWYUd0WFIwcEhZMFpvV2sxSGFFeFdha1poVW14a2NtVkdaRTVXYmtKSlYxUkplRk14U1hoalJXaHBVbTFvVkZac2FFTlRNVnAwVFZSQ1ZrMVZNVFJXYkdodlYwWmtTR0ZHYUZwaVdHaG9WbTE0YzJNeGNFaFBWbVJUWWtWd1dsWkhlR3BPVmxsNFYyNU9hbEpYYUZsV2ExVXhaR3hzVjFaWWFHcGlWWEJHVmxkNGExUnNXWGxoUkVwWFlXdEtjbFY2Umt0amF6VlhXa1prYVZKc2NGbFdSbEpIVXpBMWMxZHJhR3RTTUZwWVdXeGFZVmRXV2xoa1J6bG9UVlZ3TUZsVldsTldWbHBZWVVWU1ZrMXVhR2haZWtaM1VsWldkR05GTlZkTlZXd3pWbXhTUzAxSFNYbFNhMlJVWW1zMVZWbHJaRzlXYkZwelYyNWtUazFXY0hsV01qRkhZV3hhY2s1WWJGaGhNWEJRV1ZaYVMyTnRUa1ZYYkdScFVqQTBNRmRZY0VkV2JWRjNUVlZzYUZKck5XOVphMmhEVjFaa1YxcEVRbXRpVmtZMFZqSjRWMVV5U2tkalNFNVdZbFJHVkZSV1dsWmxWMDQyVW14b1UyRXpRbUZXVm1NeFlqRlplRmRxV2xKaGJFcGhXVmQwWVZsV2NGWlhiR1JxVFd0YVIxUXhXbXRoUjFaelYyeEdWMkV4Y0doWFZtUlNaVlphY2xwR1pGaFNNMmg1VmxkMFYxTXhaRWRWYkdSWVltMVNjMVp0TVRCTk1WbDVUbGQwV0ZKcmJETldiWEJUVjJzeFIxTnNRbGRoYTNCSVdUSjRhMk50VmtkYVIyaG9UVEJLVWxac1pEUlpWMFY1VkZob2FsSlhhSEJWYlRGdlZrWmFjMkZGVGxSTlZuQXdWRlpTUTFack1WWk5WRkpYWWtkb2RsWXdXbXRUUjBaSFlrWndhVmRIYUc5V2JYQkhZekpOZUdORmFGQldiVkpVV1d4b2IxbFdaRlZSYlVab1RXdFdNMVJXV210aGJFNUlZVVprVjJKdVFrZGFSRVp6VmpGYVdXRkdhRk5pUm5BMlYxWldZV0V4VW5SU2JrNVlZWHBHV0ZsWGRFdGpiRlkyVW1zNVUwMVdjREZXVjNoUFlWWkplRk51WkZkaVdGSllWbTB4VW1WR1pIVlNiRXBwVmxad2FGWnRNSGhWTVU1WFYyeG9hMUo2Ykc5VVZsWjNUVVpzVmxkc1RsaGlWWEJJV1RCV05GWnJNWFZoU0VwWFlXdGFhRnBGV2t0a1IwNUdUbFprVGxaWGQzcFdiWGhUVXpBeFNGTlliRk5oTWxKVldXMXpNVlpXYkhKYVJ6bFhZa1p3ZWxZeU5XdFVhekZYWTBoc1YwMXFSa2haVjNoaFkyMU9SVkpzYUdoTldFSlJWbXRrTkZsWFRuUlVhMVpYWWtkU1ZGUlVTbTlpTVZweVZXdDBVMDFYVWtoVk1uaHpXVlpKZWxGc1VsZGhhelYyVmpGYWExZEhWa2hQVmtwT1ZtdHdTVlpzWXpGVE1XUklVMnRhYWxORk5WZFpiRkpIVmtad1dHVklUbGRpUjFKNlZrY3hiMVV4V2taWGFscFhWa1ZyZUZscVJscGxSbVJ4VjJ4T1YxSlZjRzlXVjNSWFdWZE9jMVp1UmxSaE0xSlZWbTE0UzAxR2JGWlhhemxwVWpCd1dsbFZVbUZXTURGWVZWaGtXRlp0VWxOYVZscGhZMnh3UjFwSGJHbFNXRUpSVm0weE5HRXhWWGhYYms1V1lrZG9jbFV3WkZOV1JsSlhWMjVPVDFadVFsZFpWV1F3VjBaSmQyTkZhRnBOUm5CMlZqSnplRk5IUmtabFJtUm9ZVEZ3YjFaWE1UUmhNazUwVm10a1lWSlVWbGhaYlhSTFUyeFplRlZyY0d4U2F6RTBWVEZvYzFVeVJYbFZiVGxXWWxob1RGWnJXbUZqTWtaR1ZHeFNUbFp1UVhkV1JscFRVVEZhY2sxV1drNVdSa3BZV1d0a2IyUnNXWGRYYlhSVVVqQmFTRmxWV25kaFZtUklZVWM1VjJKVVJUQlpla3BPWlVkT1JtRkdRbGRpVmtwVlYxZDBWMlF4WkhOWGEyaHNVak5DVUZadGVITk9SbGw1VGxVNWFHSkZjRmxaVlZwelZqSkZlRlpZYUdGU00yaDZWbXBHWVZkWFJrZGhSazVwVW0wNU5GWXhVa05aVjBWNFZXNU9XRmRIZUc5VmExWjNWMFpTVjFkdVpHaFNiRmt5VlcxMGQySkdTbk5UYWtaWFlsaG9URmxXV2t0ak1rNUhZa1pvVjAweFNqSldWbEpIWVRGWmVGcElTbWhTTTFKVVZGVmFkMlZHV2tkYVNIQk9WakZhZWxkcmFFdGhSa3B5VGxjNVZWWnNXbnBVYkZwelZtMUdSbFJzWkdsV1dFSktWMVpXVjFReGJGZFRhMXBZWW10d1dGbFhkR0ZoUm5CR1ZsUldWMDFXY0hsVWJGcHJZVmRGZDFkWWNGZGlXR2h4V2tSQmVGWXhVbGxoUm1ob1RXMW9WbGRYZEd0aU1rbDRWbTVTVGxaNmJGaFphMXAzWld4WmVVNVhkRlZoZWtaYVZWZDRjMWxXV2xoaFJYaGFZVEZ3WVZwVldtdGpiVTVIWVVkb1RsZEZTbEpXYlhSclRrWnNXRlJ1VWxSWFNFSm9WVzB4YjJOR1ZuUmxTR1JwVFZkU1dGWlhkREJWTURGWFlrUlNWMUl6YUhwWlYzaExaRlpHY2s5V1ZsZGxhMW95Vm1wR1lWbFdTWGhpUkZwVFlsZDRUMVpxUmt0VFZscHhVMVJHVTAxV1ZqVlZNblJoWVd4T1JrNVdaRnBpUmtwSVZtdGFXbVZYVmtoa1IzQnBVbTVDVjFaWE1UUmlNVlY1VWxod1VtSlZXbGhXYlRGU1RVWnNObEp0ZEZOTlYxSXhWbGQ0WVdGSFNrbFJiR1JYWWxSRk1GcEVTbGRqTVdSMVVteE9hVkl4U25oV1JscHJWVEpXYzJKR1dtRlRSVFZ2Vm0xNGQyVldhM2RYYm1SWFRXdHdTVlpIY0ZOV1YwVjVWV3hPWVZac2NHaFpNbmgzVWpGd1NHSkhiRk5YUlVwU1ZtMHdlRTVIUlhoV1dHaGhVbGRTVjFsclduZFdNV3hWVTJ4T2FrMVdjREJhVlZZd1lrZEtSMk5FUWxWV1ZrcFlWbXBCZUZKV1NuTmFSbkJwWW10S1RWWnRNSGhUTVdSWFZtNVdXR0pIVW05WlZFWjNZakZhV0UxVVVtaE5helV3Vm0xMGExbFdTWGxoUnpsVlZrVktURlpYZUdGak1XdDZZVVU1VTJKWWFGcFdhMXB2WWpKR2MxTnNhR2hUUlVwWFdXeG9UbVZHV2tWU2JVWnFUVmRTZWxrd1pEUmhWa3AxVVZoa1dHSkdXbkpWYWtaaFkyc3hWMWR0YkZOU2EzQm9WMVpTUjJReVRuTlhXR1JoVWxoU2NWbHNWVEZTTVZGNFYyMTBhRlp0VWtsWGFrNTNWakpHY2xOdGFGcGxhMXB5VmpCYVUyTnNjRWhTYkU1cFZtdHdWbFl4WkRCWlYxRjNUbFprV0dKc1NrOVdhMVpMV1ZaYWRHVkZaRTlTYkhBd1dsVmFhMVpYU2taalJXeGFUVE5DZVZWR1JUbFFVVDA5
20回もやれば暗号
っていう文章で「base64だろうなぁ」って思ってしまいました。
ja.wikipedia.org
base64は英数字のみでマルチバイト文字*2を表すエンコーディングです。
電子メールを使用する場合にはマルチバイト文字をこのような方法でエンコードして送る場合が多いです。
CTFやってないとCTFでbase64が多用されていることはわからないと思います。
フラグを得るにはbase64デコードを20回すればOKです。
base64デコード
などと検索してもらえばデコードするページがあるので、そこで20回デコードを繰り返してもいいですし、プログラムで20回デコードしてもらってもOKです。
import base64 string = "Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZadGNFSmxSbGw1VTJ0V1ZXSkhhRzlVVmxaM1ZsWmFjVkZ0UmxSTmJFcEpWbTEwYTFkSFNrZGpTRUpYWVRGd2FGcFdXbUZrUlRGVlZXeFNUbUY2UlRGV2EyUXdZekpHYzFOdVVtaFNlbXhXVm1wT1QwMHhjRlpYYlVaclVqQTFSMWRyV2xOVWJVcEdZMFZ3VjJKVVJYZFdha1pYWkVaT2MxZHNhR2xTTW1oWlYxZDRiMkl5Vm5OVmJGWlRZbFZhY1ZadGRHRk5SbFowWlVaT1ZXSlZjRWRaTUZaM1ZqSktWVkpZWkZwV1JWcHlWVEJhVDJOc2NFaGpSbEpUVmxoQ1dsWXhXbE5TTWxGNVVtdGthbEp0VWxsWmJGWmhZMnhXY1ZKdFJsUlNiR3cxVkZaU1UxWnJNWEpqUld4aFUwaENTRlpxU2tabFZsWlpXa1p3YkdFelFrbFhXSEJIVkRKU1YxWnVUbGhpVjJoeldXeG9iMkl4V25STldHUlZUV3RzTlZWdGRHdGhiRXAwVld4c1dtSkdXbWhaTW5oWFl6RldjbHBHWkdsU2JrSmFWMnhXWVZReFdsaFRiRnBZVmtWd1YxbHJXa3RUUmxweFUydGFiRlpzV2xwWGExcDNZa2RGZWxGcmJGaFhTRUpJVmtSS1UxWXhXblZWYldoVFlYcFdlbGRYZUc5aU1XUkhWMjVTVGxOSFVuTlZha0p6VGtaVmVXUkhkRmhTTUhCSlZsZDRjMWR0U2tkWGJXaGFUVzVvV0ZreFdrZFdWa3B6VkdzMVYwMVZiekZXYlhCTFRrWlJlRmRzYUZSaVJuQnhWV3hrVTFsV1VsWlhiVVpPVFZad2VGVXlkREJXTVZweVkwWndXR0V4Y0hKWlZXUkdaVWRPUjJKR2FHaE5WbkJ2Vm10U1MxUXlVa2RVYmtwaFVteEtjRlpxU205bGJHUllaVWM1YVUxWFVraFdNalZUVkd4YVJsTnNhRlZXYkZZMFZHdGFZVmRIVWtoa1JtUk9WakZLU2xkV1ZtRmpNV1IwVTJ0a1dHSlhhR0ZVVnpWdlYwWnJlRmRyWkZkV2EzQjZWa2R6TVZZd01WWmlla1pYWWxoQ1MxUldaRVpsUm1SWldrVTFWMVpzY0ZWWFZsSkhaREZaZUdKSVNsaGhNMUpWVlcxNGQyVkdWblJOVldSV1RXdHdWMWxyVW1GWFIwVjRZMGhLV2xaWFVrZGFWV1JQVTBVNVYxcEhhR2hOU0VKMlZtMTBVMU14VVhsVmEyUlZZbXR3YUZWdGVFdGpSbHB4VkcwNVYxWnNjRWhYVkU1dllWVXhXRlZ1Y0ZkTlYyaDJWMVphUzFJeFRuVlJiRlpYVFRGS05sWkdVa2RWTVZwMFVtdG9VRlp0YUZSVVZXaERVMnhhYzFwRVVtcE5WMUl3VlRKMGIyRkdTbk5UYkdoVlZsWndNMVpyV21GalZrcDFXa1pPVjJFeGNEVldSRVpyWXpGVmQwMUliR2hTYlhoWVdXeG9RMVJHVW5KWGJFcHNVbTFTZWxsVldsTmhSVEZ6VTI1b1YxWjZRalJVYTJSSFVqRmFXVnBIYUZOV1ZGWlZWbGN4TkdReVZrZFdiR1JvVW5wc2IxUldXbmRsYkZsNVkwVmtWMDFFUmpGWlZXUnZWMnhhV0ZWclpHRldWMUpRVldwS1IxSXlSa2hpUms1cFlUQndNbFp0TVRCVk1VMTRWVmhzVm1FeVVsWlpiWFIzWVVaV2RHVkZkR3BTYkhCNFZUSXdOV0pIU2toVmJHeGhWbGROTVZsV1ZYaFhSbFp6WVVaa1RsWXlhREpXYWtKclV6RmtWMVp1U2xCV2JIQnZXVlJHZDFOV1draGxSMFphVm0xU1IxUnNXbUZWUmxwMFlVWlNWVlpYYUVSVk1uaGhZekZ3UlZWdGNFNVdNVWwzVmxSS01HSXlSa2RUYms1VVlrZG9WbFpzV25kTk1WcHlWMjFHYWxack5YbFhhMXBQWVZaS2NtTkVXbGRoTWs0MFdYcEdWbVZXVG5WVGJGSnBWbFp3V1ZaR1l6RmlNV1JIV2taa1dHSkZjSE5WYlRGVFpXeHNWbGRzVG1oV2EzQXhWVmQ0ZDFZeVNsbFZiR2hoVWtWYVlWcFZaRXRUVms1ellVZG9UazFWY0ZaV2JHTjRUa2RSZVZaclpGZFhSM2h5VldwQ1lXTkdWblJsU0dSc1lrWldOVnBWYUd0WFIwcEhZMFpvV2sxSGFFeFdha1poVW14a2NtVkdaRTVXYmtKSlYxUkplRk14U1hoalJXaHBVbTFvVkZac2FFTlRNVnAwVFZSQ1ZrMVZNVFJXYkdodlYwWmtTR0ZHYUZwaVdHaG9WbTE0YzJNeGNFaFBWbVJUWWtWd1dsWkhlR3BPVmxsNFYyNU9hbEpYYUZsV2ExVXhaR3hzVjFaWWFHcGlWWEJHVmxkNGExUnNXWGxoUkVwWFlXdEtjbFY2Umt0amF6VlhXa1prYVZKc2NGbFdSbEpIVXpBMWMxZHJhR3RTTUZwWVdXeGFZVmRXV2xoa1J6bG9UVlZ3TUZsVldsTldWbHBZWVVWU1ZrMXVhR2haZWtaM1VsWldkR05GTlZkTlZXd3pWbXhTUzAxSFNYbFNhMlJVWW1zMVZWbHJaRzlXYkZwelYyNWtUazFXY0hsV01qRkhZV3hhY2s1WWJGaGhNWEJRV1ZaYVMyTnRUa1ZYYkdScFVqQTBNRmRZY0VkV2JWRjNUVlZzYUZKck5XOVphMmhEVjFaa1YxcEVRbXRpVmtZMFZqSjRWMVV5U2tkalNFNVdZbFJHVkZSV1dsWmxWMDQyVW14b1UyRXpRbUZXVm1NeFlqRlplRmRxV2xKaGJFcGhXVmQwWVZsV2NGWlhiR1JxVFd0YVIxUXhXbXRoUjFaelYyeEdWMkV4Y0doWFZtUlNaVlphY2xwR1pGaFNNMmg1VmxkMFYxTXhaRWRWYkdSWVltMVNjMVp0TVRCTk1WbDVUbGQwV0ZKcmJETldiWEJUVjJzeFIxTnNRbGRoYTNCSVdUSjRhMk50VmtkYVIyaG9UVEJLVWxac1pEUlpWMFY1VkZob2FsSlhhSEJWYlRGdlZrWmFjMkZGVGxSTlZuQXdWRlpTUTFack1WWk5WRkpYWWtkb2RsWXdXbXRUUjBaSFlrWndhVmRIYUc5V2JYQkhZekpOZUdORmFGQldiVkpVV1d4b2IxbFdaRlZSYlVab1RXdFdNMVJXV210aGJFNUlZVVprVjJKdVFrZGFSRVp6VmpGYVdXRkdhRk5pUm5BMlYxWldZV0V4VW5SU2JrNVlZWHBHV0ZsWGRFdGpiRlkyVW1zNVUwMVdjREZXVjNoUFlWWkplRk51WkZkaVdGSllWbTB4VW1WR1pIVlNiRXBwVmxad2FGWnRNSGhWTVU1WFYyeG9hMUo2Ykc5VVZsWjNUVVpzVmxkc1RsaGlWWEJJV1RCV05GWnJNWFZoU0VwWFlXdGFhRnBGV2t0a1IwNUdUbFprVGxaWGQzcFdiWGhUVXpBeFNGTlliRk5oTWxKVldXMXpNVlpXYkhKYVJ6bFhZa1p3ZWxZeU5XdFVhekZYWTBoc1YwMXFSa2haVjNoaFkyMU9SVkpzYUdoTldFSlJWbXRrTkZsWFRuUlVhMVpYWWtkU1ZGUlVTbTlpTVZweVZXdDBVMDFYVWtoVk1uaHpXVlpKZWxGc1VsZGhhelYyVmpGYWExZEhWa2hQVmtwT1ZtdHdTVlpzWXpGVE1XUklVMnRhYWxORk5WZFpiRkpIVmtad1dHVklUbGRpUjFKNlZrY3hiMVV4V2taWGFscFhWa1ZyZUZscVJscGxSbVJ4VjJ4T1YxSlZjRzlXVjNSWFdWZE9jMVp1UmxSaE0xSlZWbTE0UzAxR2JGWlhhemxwVWpCd1dsbFZVbUZXTURGWVZWaGtXRlp0VWxOYVZscGhZMnh3UjFwSGJHbFNXRUpSVm0weE5HRXhWWGhYYms1V1lrZG9jbFV3WkZOV1JsSlhWMjVPVDFadVFsZFpWV1F3VjBaSmQyTkZhRnBOUm5CMlZqSnplRk5IUmtabFJtUm9ZVEZ3YjFaWE1UUmhNazUwVm10a1lWSlVWbGhaYlhSTFUyeFplRlZyY0d4U2F6RTBWVEZvYzFVeVJYbFZiVGxXWWxob1RGWnJXbUZqTWtaR1ZHeFNUbFp1UVhkV1JscFRVVEZhY2sxV1drNVdSa3BZV1d0a2IyUnNXWGRYYlhSVVVqQmFTRmxWV25kaFZtUklZVWM1VjJKVVJUQlpla3BPWlVkT1JtRkdRbGRpVmtwVlYxZDBWMlF4WkhOWGEyaHNVak5DVUZadGVITk9SbGw1VGxVNWFHSkZjRmxaVlZwelZqSkZlRlpZYUdGU00yaDZWbXBHWVZkWFJrZGhSazVwVW0wNU5GWXhVa05aVjBWNFZXNU9XRmRIZUc5VmExWjNWMFpTVjFkdVpHaFNiRmt5VlcxMGQySkdTbk5UYWtaWFlsaG9URmxXV2t0ak1rNUhZa1pvVjAweFNqSldWbEpIWVRGWmVGcElTbWhTTTFKVVZGVmFkMlZHV2tkYVNIQk9WakZhZWxkcmFFdGhSa3B5VGxjNVZWWnNXbnBVYkZwelZtMUdSbFJzWkdsV1dFSktWMVpXVjFReGJGZFRhMXBZWW10d1dGbFhkR0ZoUm5CR1ZsUldWMDFXY0hsVWJGcHJZVmRGZDFkWWNGZGlXR2h4V2tSQmVGWXhVbGxoUm1ob1RXMW9WbGRYZEd0aU1rbDRWbTVTVGxaNmJGaFphMXAzWld4WmVVNVhkRlZoZWtaYVZWZDRjMWxXV2xoaFJYaGFZVEZ3WVZwVldtdGpiVTVIWVVkb1RsZEZTbEpXYlhSclRrWnNXRlJ1VWxSWFNFSm9WVzB4YjJOR1ZuUmxTR1JwVFZkU1dGWlhkREJWTURGWFlrUlNWMUl6YUhwWlYzaExaRlpHY2s5V1ZsZGxhMW95Vm1wR1lWbFdTWGhpUkZwVFlsZDRUMVpxUmt0VFZscHhVMVJHVTAxV1ZqVlZNblJoWVd4T1JrNVdaRnBpUmtwSVZtdGFXbVZYVmtoa1IzQnBVbTVDVjFaWE1UUmlNVlY1VWxod1VtSlZXbGhXYlRGU1RVWnNObEp0ZEZOTlYxSXhWbGQ0WVdGSFNrbFJiR1JYWWxSRk1GcEVTbGRqTVdSMVVteE9hVkl4U25oV1JscHJWVEpXYzJKR1dtRlRSVFZ2Vm0xNGQyVldhM2RYYm1SWFRXdHdTVlpIY0ZOV1YwVjVWV3hPWVZac2NHaFpNbmgzVWpGd1NHSkhiRk5YUlVwU1ZtMHdlRTVIUlhoV1dHaGhVbGRTVjFsclduZFdNV3hWVTJ4T2FrMVdjREJhVlZZd1lrZEtSMk5FUWxWV1ZrcFlWbXBCZUZKV1NuTmFSbkJwWW10S1RWWnRNSGhUTVdSWFZtNVdXR0pIVW05WlZFWjNZakZhV0UxVVVtaE5helV3Vm0xMGExbFdTWGxoUnpsVlZrVktURlpYZUdGak1XdDZZVVU1VTJKWWFGcFdhMXB2WWpKR2MxTnNhR2hUUlVwWFdXeG9UbVZHV2tWU2JVWnFUVmRTZWxrd1pEUmhWa3AxVVZoa1dHSkdXbkpWYWtaaFkyc3hWMWR0YkZOU2EzQm9WMVpTUjJReVRuTlhXR1JoVWxoU2NWbHNWVEZTTVZGNFYyMTBhRlp0VWtsWGFrNTNWakpHY2xOdGFGcGxhMXB5VmpCYVUyTnNjRWhTYkU1cFZtdHdWbFl4WkRCWlYxRjNUbFprV0dKc1NrOVdhMVpMV1ZaYWRHVkZaRTlTYkhBd1dsVmFhMVpYU2taalJXeGFUVE5DZVZWR1JUbFFVVDA5" for _ in range(20): string= base64.b64decode(string) print(string)
ちなみにエンコードするプログラムはこんな感じです。
import base64 string = "FLAG{hogehoge}".encode('utf-8') for _ in range(20): string = base64.b64encode(string) print(string)
上にも書いたように、base64のエンコーディングはメールの送受信に使われています。
今も現役でバリバリメールを送信している大人気プロトコルSMTPは、一切の内容を7bitのASCIIコードでしか表現してはいけないという規則になっており、画像や動画ファイルを送信することができません。
そこで、1本のメールの中に複数のコンテンツを用意し、そのコンテンツがそれぞれASCIIコードとなるような符号化が施されたものになるように規則が追加されました。
これはMIMEと呼ばれています。
ja.wikipedia.org
ja.wikipedia.org
これによって、英語だけの文章はそのまま、日本語などのマルチバイト文字で構成される文章や画像や動画ファイルはbase64エンコーディングを行って送信することができるようになりました。
GmailからGmailに送信されてきたメールを開き、メッセージのソースを表示
をクリックすればbase64エンコードされた内容を見ることができます。
Delivered-To: ************@gmail.com Received: by ************ with SMTP id **************; ************** (PDT) MIME-Version: 1.0 From: "******" <*******@gmail.com> Date: *********** Message-ID: <***********************@mail.gmail.com> Subject: テストメール To: ********@gmail.com Content-Type: multipart/alternative; boundary="0000000000001aeb6c0595e2a89d" --0000000000001aeb6c0595e2a89d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 44GT44KM44Gv44OG44K544OI44Oh44O844Or44Gn44GZ44CCDQrjgZPjga7jgojjgYbjgavml6Xm nKzoqp7jgaflhaXlipvjgZfjgZ/mlofnq6Djga/jgqjjg7PjgrPjg7zjg4njgZXjgozjgabpgIHj gonjgozjgb7jgZnjgIINCg== --0000000000001aeb6c0595e2a89d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj7jgZPjgozjga/jg4bjgrnjg4jjg6Hjg7zjg6vjgafjgZnjgII8 L2Rpdj48ZGl2PuOBk+OBruOCiOOBhuOBq+aXpeacrOiqnuOBp+WFpeWKm+OBl+OBn+aWh+eroOOB r+OCqOODs+OCs+ODvOODieOBleOCjOOBpumAgeOCieOCjOOBvuOBmeOAgjxicj48L2Rpdj48L2Rp dj4NCg== --0000000000001aeb6c0595e2a89d--
メーラーはこのbase64エンコードされた内容を見て、自動的にデコードしてからユーザーに表示しています。
ここで注意ですが、エンコーディングは文字を置き換えただけであって、暗号化したわけではありません。
エンコーディングの方法が分かれば誰でも元の文字列を得ることができます。
なのでパーセントエンコードやbase64でエンコードしただけで「暗号化したので安全です」なんて言ってはいけません。
企業がそういうことをすれば多分炎上できます。やったね。
06. 無言のELF
問題文は忘れました(また)が、多分「このプログラムはなにか言えば話してくれるんじゃないか?」みたいなこと書いてあったような気がします。
そしてa.outというファイルのダウンロードリンクがありました。
おそらくプログラムは次のような感じ。
#include <stdio.h> #include <string.h> int main(void) { char* str = "keyCode"; char* flag = "FLAG{hogehoge}"; char input[8]; scanf("%s", input); if(strcmp(str, input) == 0) { printf("%s", flag); } return 0; }
実際はフラグは解析されづらい構造になっていましたが、ここではその点は重要ではないのでそのまま書いておきます。
試しに実行すると、プログラムはユーザーからの入力を待機していて、内部で保持している文字列と一致しない限りそのまま終了するということがわかります。
つまり、キーとなる文字列(キーコード)を割り出す必要があります。
解答者側はプログラムの実行ファイルしかもらえないので、逆アセンブルしてしまいます。
IDAというソフトウェアが非商用に限り無償で利用できるので、それを使用します。
www.hex-rays.com
これをインストール後、実行ファイルを読み込ませることで逆アセンブルが行われてある程度読むことができる情報が手に入ります。
ここで、文字列がいくつか表示されているので、それを試しに入力してみるとフラグを手に入れることができます。
このプログラムは比較的簡単なものですが、一応プログラムは実行できる状態でも頑張れば人間が読むことができます。
これを悪用するとゲームでのチート行為をしたり、ソフトウェアの違法利用をしたりすることができます。
そういうことを防ぐために、メチャクチャな挙動をすることで人間が読む気をなくすようにしたり、重要な内容は暗号化して保存しておいたりする必要があります。*3
ちなみに、この問題はELFの実行ファイルだったのでLinux環境が必要でした。
私はそのときmacを使っていて実行できなかったので急遽Linuxコンピュータを用意してそちらで動かしました。
最近はWindowsでもWindows Subsystem for Linuxが使えるので絶対動かない人というのは減ってきたとは思いますが、環境依存なものはあんまり良くないんじゃないかと思います。
他の問題にはWindows用の実行ファイルでしか配布されていなかったものもあったので、Windowsを使っている人に任せました。
12. 大人たちの無意味な慣習
パケットキャプチャをしたログファイルをダウンロードしてそこからフラグを入手するような問題です。
knowledge.sakura.ad.jp
パケットキャプチャは早い話「通信をまるごと盗み見れば通信で何しているかわかるよね」っていうものです。
Wiresharkではネットワークの監視の他、プロトコル別の解析なども行えるので便利です。
今回もWiresharkでログファイルを覗いてみました。
中には色々な通信ログが書かれているのですが、中でもHTTPの通信だけにフィルタリングして見てみました。
すると、どうやら利用者はWebページにアクセスして、そこからZIPファイルをダウンロードしていたみたいです。
そのZIPファイルが欲しいのでパケットログから奪っちゃいましょう。
HTTPのパケットにはzipファイルがそのまま乗っかっているので、Wiresharkの機能でファイルを抽出することができます。
troushoo.blog.fc2.com
欲しいZIPファイルを抽出したら、早速解凍*4...と行きたいところですが、どうやらパスワードがかかっているようです。
ZIPファイルのパスワードは総当りで外してもいいんですが、パケットをもう一度よく見てみることにしましょう。
どうやらHTTPのWebページはメールボックスのようで、メール本文と添付ファイルをダウンロードしたときのパケットが記録されているようです。
ところで、ZIPファイルにパスワードをかけて別のメールでパスワードを送るという習慣をご存知ですか?
www.atmarkit.co.jp
今回もそのパターンじゃないかと推測して、ファイルをダウンロードしたときのパケットの前後のパケットから、Webページを表示したときのパケットを選んでHTMLとして保存します。
これもWiresharkでできます。Wiresharkスゴイ!
すると、次のような感じのメールが届いていたことがわかります。
XXX様 お世話になっております。OOO商事の***です。 先程お送りいたしましたZIPファイルのパスワードをお送りします。 パスワードは hogehoge です。 よろしくお願いいたします。 __________ OOO商事 *** (Tel. 01-1234-1234) __________
まさしくこれですね。ここに書かれたパスワードを先程のZIPファイルのパスワードとして入力して解凍してみます。
すると、中にflag.txtと書かれたファイルがあるのでそれを開くとフラグが入っています。
実際問題として、このファイル送信方法はよく取られます。IT企業でも普通に行われていたので苦笑いしてしまったこともあります。
じゃあどうすればいいのかというと、対策は3つあります。
パケットを盗聴されないような場所で使用する
パケットは簡単に盗聴することができます。
コンピュータにウイルスを仕込んでもいいですし、同じネットワークに入って全部のパケット取りまくってもいいですし、通信ケーブルに穴開けてそこからパケットを引っ張っても見れます。*5
コンピュータにはウイルス対策ソフトを導入し、常に最新の状態を保ちましょう。
また、ネットワークへの参加は必要なものだけを接続し、簡単に接続できないようにしましょう。
通信ケーブルに穴を開けられないようにしましょう。
Wi-Fiも安心とは言えません。Wi-Fiはパスワードが設定されていない場合は誰でも盗聴し放題なのでとても危険です。
パスワードが設定されていないフリーWi-Fiを使用は避けましょう。
また、パスワードが設定されているWi-Fiでも、そのWi-Fi自体が悪意ある者によって用意された場合もあります。*6 Wi-Fiを安全に使用するには、VPNを使用して通信を暗号化する方法が手軽です。 japan.norton.com VPNは、信頼できるコンピュータに対して暗号化した通信を一旦送信し、そこで復号化した上で本当に通信したい相手に送信するという技術です。 これによって、Wi-Fiを設置した人は完全に通信内容がわからなくなります。
VPNを使用すればパスワードを設定していないWi-Fiでも比較的安全になります。*7HTTPS通信を行う
HTTPの通信*8は通信内容が暗号化されません。HTTPSという通信方法*9であれば通信内容が暗号化されるので安全です。 japan.norton.com HTTPSで暗号化された通信はパケットキャプチャをしても暗号化された情報しか表示されないので、どのような内容を送受信しているのか全くわかりません。
ただし、自己署名証明書*10で暗号化された通信の場合は、その証明書を持っている人は復号化することができるので安全とは言えません。
SSL(HTTPS)を導入しようか検討している会社の方はぜひちゃんとしたSSL証明書を発行してくれる会社を選んでください。
安いからといって自己署名証明書を使ったHTTPSなんてやると炎上しますよ。そもそもこんな方法で送らない
パスワードを別のメールで送信するなんて方法で安全だと思っているなら大間違いです。誤送を防ぐ手段にもなりません。ZIPファイルの暗号は力づくで破ることもできます。ではどうやってZIPファイルを送れば良いのか。メール以外の手段(例えば、エンドツーエンドの暗号化を備えるビジネスチャットなど)を検討する必要があるかもしれません。
もしデータ送付にどうしてもメールを使用しなければならないのであれば、S/MIMEやPGPといった「公開鍵暗号方式」を用いるか、せめて「電話」「郵送」「直接会う」など、別経路でパスワードを送付する必要があります。
21世紀の人類がZIPのパスワードを直後のメールで送るのは、なぜデスか?:こうしす! こちら京姫鉄道 広報部システム課 @IT支線(11) - @IT
また、内閣サイバーセキュリティセンターが公開している「情報セキュリティハンドブック」という資料を参照して運用を決めるのもいいかもしれません。
www.nisc.go.jp
13. 名前を解決したい!
問題文は「Webサイトのドメインを購入したので設定したがうまく反映されていない。なんでだ!?」みたいなことが書いてあります。
一緒にそのWebサイトのドメインが書いてあるので、そのURLへアクセスしてみます。 サイトにはアクセスできません。どうやらそのドメインに対応するIPアドレスが設定されていないようです。
こういうときはdigコマンドでAレコード*11に何が設定されているか見てみます。
ここではサンプルとして、example.comへの問い合わせを一部改変して紹介します。
$ dig www.example.com a ; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> www.exmaple.com a ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45420 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.exmaple.com. IN A ;; AUTHORITY SECTION: exmaple.com. 3600 IN SOA jule.ns.cloudflare.com. dns.cloudflare.com. 2032310433 10000 2400 604800 3600 ;; Query time: 23 msec ;; SERVER: ***.***.***.*** ;; WHEN: *** *** *** *** ;; MSG SIZE rcvd: 103
すると、ANSWER SECTIONに何も入っていないことがわかります。AAAAレコード*12にも何も入っていません。MXレコード*13もです。
大体こういうときはTXTレコード*14に入ってることが多いのでそちらを見てみます。
$ dig www.example.com txt ; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> www.example.com txt ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31288 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.example.com. IN TXT ;; ANSWER SECTION: www.example.com. 86400 IN TXT "ip=***.***.***.***" ;; Query time: 131 msec ;; SERVER: ***.***.***.*** ;; WHEN: *** *** ** **** ;; MSG SIZE rcvd: 68
このIPアドレスにアクセスしてみればフラグを入手できます。
今回使用したTXTレコードは、そのドメインを誰が持っているのかを示すために使います。
GoogleのG Suiteには、ドメインの所有権をTXTレコードで証明する方法がある他、迷惑メール対策としてTXTレコードを活用することがあります。
迷惑メールの対策方法にはいくつかありますが、SPFという方法はドメインの所有者を確認して迷惑メールの判定を行います。
メールを送信するプロトコルであるSMTPは、送信者のアドレスを簡単に偽装することができます。
これを使えば、Googleのメールアドレスを語って別のアドレスからメールを送信することも可能で、SMTPにはこれを対策する手段がありません。
SPFはメールを受信した際に、メールが送信されたコンピュータのIPアドレスがドメインに紐付いているかを確認してくれます。
このときの確認方法がTXTレコードの参照です。
例えば、example.comのTXTレコードを見てみましょう。
$ dig example.com txt ; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> example.com txt ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8727 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;example.com. IN TXT ;; ANSWER SECTION: example.com. 86400 IN TXT "v=spf1 -all" ;; Query time: 125 msec ;; SERVER: ***.***.***.*** ;; WHEN: *** *** ** **** ;; MSG SIZE rcvd: 64
ANSWER SECTIONのTXTレコードにあるとおり、v=spf1
から始まる記述があります。これがSPFです。
ここに書いたIPアドレス、もしくはここに書かれたドメインに紐付いているIPアドレスから送信されたメールであればSPFとしては信用できるということになります。*15
今のexample.comの設定だとどのIPアドレスも禁止となっているようです。
ドメインを購入しても正しく設定を行わないと使えません。
Webサイトの設定方法はそこまで難しくないのですが、やったことがない人に本番運用のサイトのドメインを設定してもらうのは危険なので、練習用のドメインを用意しておくといいかもしれません。
今回の場合では、TXTレコードにあるip=***.***.***.***
のIPアドレス部分をAレコードに書くだけで動くようになります。
ただ、spfの設定は少しややこしいので十分に設定方法を確認した上で行いましょう。
salt.iajapan.org
17. 目に見えなくても
とあるWebサイトのURLが書いてあり、問題文には「このURLにあるWebサイトの中からフラグを見つけ出せ」と書いてあります。
早速アクセスすると、特に何も表示されません。
とりあえずWebブラウザの拡張機能でHTMLソースを見ると、コメントが挿入されているのがわかります。
次のような感じです。
<!DOCTYPE html> <html lang="ja"> <head></head> <body> <!-- FLAG{hogehoge} --> </body> </html>
ここに書かれているのがフラグです。
HTMLではコメントを書くことができ、それはWebブラウザ上では表示されませんが、ソースコードを表示すれば誰でも見ることができます。
一時的になにか書いておくのは問題ありませんが、ユーザーに見られると困るような情報を書くと情報漏えいの原因になるので安易に使用するのはやめましょう。
20. 偉くなりたい
とあるWebサイトのURLが書いてあり、問題文には「このURLにあるWebサイトに管理者としてログインしてフラグを入手せよ。ユーザー名はuser、パスワードはp@ssw0rdである。」と書いてあります。
アクセスすると、ユーザー名とパスワードを入力する欄があり、ここに細工するようです。
問題で与えられたユーザー名とパスワードを使ってログインすると普通に「Hello user!」と言われるだけです。
戻ってログインページのソースコードを見てみましょう。
大体次のような感じでした。
<!DOCTYPE html> <html lang="ja"> <head></head> <body> <form action="./" method="post"> name: <input type="text" name="name"> password: <input type="password" name="pass"> <input type="hidden" name="hidden" value="is_not_admin"> <input type="submit" value="Login"> </form> </body> </html>
最近のWebブラウザーは現在表示しているWebページをソースコードから変更を加えてリアルタイムに反映することができます。
ここでは、hidden要素のvalueをis_not_admin
からis_admin
に変えてユーザー名/パスワードを入力し送信してみます。
するとフラグを得ることができます。
HTMLのフォームではhiddenを使うことがよくあります。ユーザーには見せたくないけど次のフォームに伝えたいことがある場合は便利です。
しかし、HTMLはユーザー側で簡単に変更することができてしまうのでこの手法は避けるべきです。
では一体どうやって次のフォームにデータを伝えるのかと言うと、セッションCookieを使用します。
qiita.com
ユーザーの手元には伝えたい情報を残さず、サーバ上に残しておきます。
その情報と紐づく無関係な文字列を用意して、ユーザーの手元にはその無関係な文字列を渡しておくことで情報を伝達するという手法です。
これをうまく活用すれば、ユーザーにデータを改変される心配も少なくなります。
ちなみにWebブラウザのHTML変更機能を使えばこのようにTwitterのBio欄*16を書き換えることもできます。
最後に
とりあえず解いた問題だけの解説を書きました。触ったけど解いていない問題については別記事があるのでそちらをご覧ください。
k-hyoda.hatenablog.com
CTFを通じてセキュリティに関心をもつ人が増えればいいなと思っています。
参加者そして運営者の皆さん、お疲れさまでした!