nanka iroiro

wakaran

セキュリティ界隈の方々って誰をフォローしてるの?のその後

はじめに

思ったより多くの方々に見ていただいたようで,非常に驚います.ブックマークしてくれた方,いいねしてくれた方,ツイートしてくれた方,ありがとうございます!!今回はこの記事への反応を見て書きたくなったことを書きます.

その前に

セキュリティ界隈、誰をフォローしたら良いの?二番煎じで考えてみた。

やまざきkei5さんも解析したようです.こちらは特定のハッシュタグを含むツイートをした人を対象としています.#ssmjpのほかにもCODE BLUEやSECCCONなども対象になっているので,こちらの方が正確です.やまざきkei5さんありがとうございます!!!

#ssmjpを対象とした件について

やまざきkei5さんの記事でも言及していた通り #ssmjpはセキュリティ勉強会ではありません. それでも#ssmjpを選んだ理由は,セキュリティ技術者が多く参加していて,直近の勉強会開催頻度も多く,そして私が参加したことのある勉強会であるからです.

とにかく今回は #ssmjpはITインフラ系勉強会である ということだけでも覚えていただけると嬉しいです.紛らわしい記事を書いて申し訳ございませんでした.

対象の偏り

前回記事は#ssmjpのみを対象としているため,出てくるランキングも偏ったものになります.前回結果の場合だと#ssmjpの関係者や発表者などは順位が高くなる傾向にあると考えられます.

対象の勉強会を変えるだけでもランキングは異なったものになります.例えば,濱せっく勉強会参加者で集計した場合のTop20はこのようになります(97名,1回以上参加,情報取得は2017年1月13日1時頃).#ssmjpでTOP50に入っていないアカウントは太字にしました.

Rank ID Name Count
1 ntsuji 辻 伸弘(nobuhiro tsuji) 69
2 ockeghem 徳丸 浩 65
3 Sh1n0g1 Shøta Shinogۜi🗝 63
3 piyokango piyokango 63
5 ripjyr まっちゃだいふく 59
6 takesako Yoshinori (y0sh1) 58
7 takahoyo ほよたか 57
8 sen_u Sen UENO 55
9 hasegawayosuke Yosuke HASEGAWA 52
10 r00tapple 黒林檎 50
10 secconctf SECCON CTF 50
12 jpcert JPCERTコーディネーションセンター 47
12 lac_security 情報セキュリティのラック 47
14 yamatosecurity yamatosecurity 46
15 bata_24 bata 45
15 kitagawa_takuji 北河拓士 KITAGAWA,Takuji 45
17 codeblue_jp CODE BLUE 44
17 MasafumiNegishi Masafumi Negishi 44
19 ctf4b SECCON Beginners 43
20 security_camp セキュリティ・キャンプ 42
20 tigerszk とある診断員 42
20 ScanNetSecurity ScanNetSecurity 42

Top20のうち,6つのアカウントが#ssmjpの方ではTop50に入っていないという結果になりました.ざっと見た感じ,SECCONやCTF関連のアカウントの順位が全体的に高くなっていました.このように当然ではありますがどこを対象とするかにより結果は大きく変わってきます.そのため前回の結果はあくまでも参考程度でお願いいたします.

海外アカウント限定での集計

海外アカウントが全く無いというツイートがいくつかありました.確かにそのとおりだけど,ちゃんと追っかけている人もいるはずということで海外アカウント限定で集計してみました.対象は前回記事と同じで,出てきた結果について以下の条件に当てはまるアカウントのみを抽出しました. 1. アカウントの言語設定が日本ではない 2. 居住地が日本ではない 3. アカウント名に日本語が含まれない 4. 自己紹介欄に日本語が含まれない 5. 直近の100ツイート(2017年1月13日3時頃取得)について日本語が含まれているツイートが5%以下

条件としては2と5の条件のみで良いのですが,twitterAPIの関係上1から4の条件も入れました.結果はこんな感じです.

Rank ID Name Count
1 ExploitDB Exploit Database 59
2 defcon DEF CON 55
3 Dropbox Dropbox 54
4 BlackHatEvents Black Hat 52
5 TheHackersNews The Hacker News 46
6 mikko Mikko Hypponen 43
7 FireEye FireEye 42
8 kalilinux Kali Linux 39
9 metasploit Metasploit Project 36
10 owasp owasp 35
11 github GitHub 34
12 awscloud Amazon Web Services 33
13 nmap Nmap Project 32
13 malware_traffic Brad 32
13 USCERT_gov US-CERT 32
13 CTFtime All about CTF 32
17 Snowden Edward Snowden 31
17 sans_isc SANS ISC 31
17 Burp_Suite Burp Suite 31
27 Docker Docker 31
21 msftsecurity Microsoft Secure 30
21 echofon echofon 30
21 BillGates Bill Gates 30
21 Google Google 30
25 msftsecresponse Security Response 29
26 kaspersky Kaspersky Lab 28
26 TimMedin Tim Medin 28
28 SANSInstitute SANS Institute 27
28 threatpost Threatpost 27
30 rapid7 Rapid7 26
30 SecurityTube Pentester Academy 26
32 sansforensics SANS DFIR 24
32 symantec Symantec 24
32 offsectraining Offensive Security 24
32 CiscoSecurity Cisco Security 24
32 teamcymru TEAM CYMRU 24
37 SlackHQ Slack 23
38 kafeine Kafeine 22
38 Mandiant Mandiant 22
38 MalwareTechBlog MalwareTech 22
41 OpenStack OpenStack 21
41 LegitBS_CTF Legit BS 21
41 Android Android 21
41 Twitter Twitter 21
41 thedarktangent The Dark Tangent 21
41 McAfee_Labs McAfee Labs 21
47 wikileaks WikiLeaks 20
47 PhysicalDrive0 PhysicalDrive0 20
47 packet_storm packet storm 20
47 TwitPic TwitPic 20
47 virustotal VirusTotal 20

多くが企業アカウントなどで個人アカウントはほとんど出てきませんでした.ただ界隈の方々がチェックしている海外の企業や団体,ニュースサイトなどがなんとなくわかりました. 海外アカウントでの集計は対象アカウントを変えて行うべきですが,どうすればよいかの案が特にないので誰か詳しい方やってください.

さいごに

重ね重ねになりますが前回は多くの方に記事を見ていただきありがとうございます.ただ前回の記事は自分の文章がとても秀逸だったとかではなく他の要因がとても大きいので,もっと素晴らしい記事をかけるようになりたいです.でもこれからも特に目標は定めず,書きたい時に書きたいことを書いていきたいと思います.

セキュリティ界隈の方々って誰をフォローしてるの?

やったこと

twitterをはじめてみたはいいものの誰をフォローしてよいか分からなかったので,セキュリティ界隈の方々のフォロー一覧を取得して集計することにより,フォローする方を決めてみました.

対象ユーザ

今回は#ssmjpのメンバーから以下の条件に当てはまる322名の方々を対象としました.

  1. ssmjpに2回以上参加している
  2. 最終参加日が2015年1月1日以降
  3. twitterと連携している
  4. twitterが鍵垢ではない

結果

322名の方がフォローしていたアカウントTop10はこんな感じです.敬称略です.

Rank ID Name Count
1 ockeghem 徳丸 浩 214
2 ntsuji 辻 伸弘(nobuhiro tsuji) 194
3 piyokango piyokango 180
4 togakushi no root, nobody 179
5 hasegawayosuke Yosuke HASEGAWA 163
6 tigerszk とある診断員 159
7 _ssmjp #ssmjp info 154
8 sen_u Sen UENO 151
9 kitagawa_takuji 北河拓士 KITAGAWA,Takuji 149
10 takesako Yoshinori (y0sh1) 148

やはりお馴染みの方々が目立ちますね.一位の徳丸さんはなんと全体の2/3の方々にフォローされています.またtigerszkさんやtogakushiさんなどの#ssmjpの運営の方々や#ssmjpのインフォメーションアカウントもTop10に入っています.

次に11位から50位です.

Rank ID Name Count
11 ripjyr まっちゃだいふく 146
12 jpcert JPCERTコーディネーションセンター 145
13 MasafumiNegishi Masafumi Negishi 144
14 lumin lumin 131
15 OwaspJapan OWASP Japan Chapter 124
16 lac_security 情報セキュリティのラック 124
17 number3to4 abend 121
18 YuhoKameda ykame 118
19 ScanNetSecurity ScanNetSecurity 113
20 kinugawamasato Masato Kinugawa 110
21 takahoyo ほよたか 108
22 jvnjp JVN 脆弱性レポート 106
23 JVNiPedia IPA (JVNiPedia) 105
24 0x009AD6_810 Neutral8✗9eR 104
25 Typhon666_death Typhon✡MetalTonight 104
26 HiromitsuTakagi Hiromitsu Takagi 104
27 you0708 NAKATSURU You 102
28 nekoruri Aki@C93金曜-東3キ43b 102
29 yousukezan yousukezan 102
30 ymzkei5 やまざきkei5 101
31 cas_nisc NISC内閣サイバーセキュリティセンター 101
32 yakumo3 yakumo3 100
33 JSECTEAM マイクロソフト セキュリティチーム 98
34 def_jp JPドメイン Web改竄速報 bot 98
35 enigma63 えにぐま 96
36 matsuu matsuu 92
37 avtokyo avtokyo 92
38 IPAjp IPA情報処理推進機構 92
39 secconctf SECCON CTF 91
40 jnsa JNSA 91
41 OrangeMorishita Yasuhiro Morishita 90
42 yarai1978 Yuu Arai 90
43 tetsutalow 上原 哲太郎/Tetsu. Uehara 90
44 vulcain ヴァルカン 90
45 okdt riotaro okada 89
46 wakatono wakatono(JK) 89
47 codeblue_jp CODE BLUE 88
48 nisc_forecast 内閣サイバー(注意・警戒情報) 87
49 ICATalerts IPA (ICATalerts) 87
50 mimura1133 みむら 86

このあたりは個人のアカウントというよりはラックやマイクロソフトなどの法人,CODE BLUE,AVTOKYOなどのカンファレンス,「JPドメイン Web改竄速報 bot」などの情報アカウント,IPA,JPCERT,NISCなどが目立ちます.

ちなみに全体の20%以上がフォローしているアカウントは全部で109ありました.この界隈の方々がフォローするアカウントは割と固定化されていると感じました.

まとめ

今回は自分のフォローしたい方を決定するために,セキュリティ界隈のフォロー一覧を調べてみました.せっかくデータを取得したのでもうちょっと色々と調べてみたいと思います.あと今回の結果は割と偏りがあるので,他の方法でも集計してみたいです.

追記

続き書きました.

SECCON 2017 Online CTFのWriteupを書いてみる

他の方のWriteup読んでたら自分も書きたくなった. Writeupを書くのは初めてだし,そもそもこういったOnlineのCTFに参加すること自体,今まで1,2回くらいしかなかったので,ミスは大目に見てほしい.

7問+1を解いて1100ptで190位だった.チーム名は"ttt". もうちょっとちゃんとした名前にすればよかった.

Vigenere3d 100

i文字目の暗号文c[i]を,変換テーブルtを用いてc[i]=t[k][m][n]と表すとき,c[i]

c[i] = s[(k+m+n)%65]
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"

のように表すことができる.pを平文,k1,k2を鍵とすると,k=s.find(p[i]), m=s.find(k1[i]), n=s.find(k2[i])なのでc[i]

c[i] = s[(s.find(p[i])+s.find(k1[i])+s.find(k2[i]))%65]

と書くことができる. 平文の最初の7文字は既知であり,k1の鍵長は14文字,さらにk2=k1[::-1]であることから以下の対応が得られる.

P = s[15] = s[18+s.find(k1[0])+s.find(k1[13]))%65]
O = s[14] = s[4+s.find(k1[1])+s.find(k1[12]))%65]
R = s[17] = s[2+s.find(k1[2])+s.find(k1[11]))%65]
4 = s[30] = s[2+s.find(k1[3])+s.find(k1[10]))%65]
d = s[39] = s[14+s.find(k1[4])+s.find(k1[9]))%65]
n = s[49] = s[13+s.find(k1[5])+s.find(k1[8]))%65]
y = s[60] = s[63+s.find(k1[6])+s.find(k1[7]))%65]

さらに0<=i<=64より

s.find(k1[0])+s.find(k1[13]) = 62
s.find(k1[1])+s.find(k1[12]) = 10
s.find(k1[2])+s.find(k1[11]) = 15
s.find(k1[3])+s.find(k1[10]) = 28
s.find(k1[4])+s.find(k1[9]) = 25
s.find(k1[5])+s.find(k1[8]) = 36
s.find(k1[6])+s.find(k1[7]) = 62

となる.

8文字目は

T = s[19] = s[(s.find(p[7])+s.find(k1[7])+s.find(k1[6]))%65]

ここにs.find(k1[7])+s.find(k1[6]) = 62を代入して

s[19] = s[(s.find(p[7])+62)%65]
19 = (s.find(p[7]) + 62) % 65
s.find(p[7]) = 22
p[7] = "W"

同様にして9文字目以降も求めることができる. コード

s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
cipher = "POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9"

table = [62, 10, 15, 28, 25, 36, 62]
table = table +table[::-1]

p = ""
for i, c in enumerate(cipher):
    p += s[(s.find(c) - table[i % len(table)]) % len(s)]
print p
SECCON{Welc0me_to_SECCON_CTF_2017}

Run me! 100

フィボナッチ数列.コード書くのが面倒だったので計算サイトに投げた

SECCON{65076140832331717667772761541872}

putchar music 100

映画のタイトルと聞いてスターウォーズかなぁと思い文字列を見てみると

###<f_YM\204g_YM\204g_Y_H #<f_YM\204g_YM\204g_Y_H #+-?[WKAMYJ/7 #+-?[WKgH #+-?[WKAMYJ/7hk\206\203tk\\YJAfkkk";for(i=0;t=1;i=(i+1)%

はじめの###とかそのあとの繰り返し部分でああこれスターウォーズだと確信した.てか映画に疎いので他に世界的に知られている映画の曲はわからんです.

SECCON{STAR_WARS}

他の方のWriteupを見て実際に動かしてみた.soxというツールを使えばいいらしい.

gcc -Wall putchar_music.c -o putchar_music -lm
./putchar_music | sox -r 8000 -b 8 -c 1 -t raw -s - -d

聴けた.すごい.

SHA-1 is dead 100

適当にググるいい感じのツールがあった. 2つのpdfファイルのSHA-1を衝突させてくれるらしい.

これを用いて,一文字違いのtxtファイルを生成し,pdfに変換,上記のツールを使用してSHA-1が衝突するpdfを生成,ファイルサイズが2017KiBと2018KiBの間なら終了する雑なプログラムを書いた.range(3200,3300)は大体の当たりをつけて書いた.

import subprocess
import string
import random
import os.path

def stringSplit(string, num):
    s = []
    for i in range(len(string) // num):
        s.append(string[num*i:num*(i+1)])
    r = len(string) % num
    if r:
        s.append(string[-r:])
    return s

def writeFile(filename, str):
    f = open(filename, 'w')
    for r in str:
        f.writelines(r+"\n")
    f.close()

def makePdf(filename):
    cmd = "a2ps "+filename+".txt -o "+filename+".ps"
    subprocess.call( cmd.strip().split(" ")  )
    cmd = "ps2pdf "+filename+".ps"
    subprocess.call( cmd.strip().split(" ")  )

for n in range(3200,3300):
    random_str = ''.join([random.choice(string.ascii_letters) for i in range(n)])
    i = random.randint(1, n)
    random_str2 = random_str[:i]+"_"+random_str[i+1:]

    random_str = stringSplit(random_str, 50)
    writeFile("text1.txt", random_str)

    random_str2 = stringSplit(random_str2, 50)
    writeFile("text2.txt", random_str2)

    makePdf("text1")
    makePdf("text2")

    cmd = "python3 sha1collider/collide.py text1.pdf text2.pdf"
    subprocess.call( cmd.strip().split(" ")  )

    n = os.path.getsize("out-text1.pdf")
    print n
    if n > 1024*2017 and n < 1024*2018:
        break
SECCON{SHA-1_1995-2017?}

この資料によるとSHA-1はメッセージをブロックに分割して,ブロックを一つずつ読み込みながら内部状態を更新し,最終的なハッシュを出力しているようである.よってある時点で内部状態が一致し,かつその後のデータが同じであれば,後に何を追加してもハッシュは同じである.これとpdfの仕様をうまく利用してあらゆる(?)pdfにおいてハッシュの衝突が可能になる.

このことから出題者の意図としては上記の解法よりも,衝突しているpdfにデータを追加して目的のサイズに合わせる,という解法のほうが趣旨にあっていると思う.如何に自分がsha-1を分かっていなかったか.

Powerful_Shell 300

難読化されたPowerShellスクリプト.このままでは分からないのでコードを出力してみる.コードの出力は$ECCON+=の処理の末尾に,以下を追加すれば良い.

"$ECCON"
$ErrorActionPreference = "ContinueSilently"
[console]::BackgroundColor = "black";...-n;x;x;

<# Host Check #>
Write-Host -b 00 -f 15 Checking Host... Please wait... -n
Try{
        If ((Get-EventLog -LogName Security | Where EventID -Eq 4624).Length -Lt 1000) {
                Write-Host "This host is too fresh!"
                Exit
        }
}Catch{
        Write-Host "Failed: No admin rights!"
        Exit
}
Write-Host "Check passed"

$keytone=@{'a'=261.63}
$pk='a'
ForEach($k in ('w','s','e','d','f','t','g','y','h','u','j','k')){
        $keytone+=@{$k=$keytone[$pk]*[math]::pow(2,1/12)};$pk=$k
}
Write-Host -b 00 -f 15 "Play the secret melody."

Write-Host -b 15 -f 00 -n '   '
...
Write-Host -b 15 -f 00  '    '
Write-Host
$stage1=@();$f="";
While($stage1.length -lt 14){
        $key=(Get-Host).ui.RawUI.ReadKey("NoEcho,IncludeKeyDown")
        $k=[String]$key.Character
        $f+=$k;
        If($keytone.Contains($k)){
                $stage1+=[math]::floor($keytone[$k])
                [console]::beep($keytone[$k],500)
        }
}
$secret=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)
If($secret.length -eq $stage1.length){
        For ($i=1; $i -le $secret.length; $i++) {
                If($secret[$i] -ne $stage1[$i]){
                        Exit
                }
        }
        x "Correct. Move to the next stage."
}
$text=@"
YkwRUxVXQ05DQ1N...BE2FxROE10VShZOTBFTF2E=
"@

$plain=@()
$byteString = [System.Convert]::FromBase64String($text)
$xordData = $(for ($i = 0; $i -lt $byteString.length; ) {
        for ($j = 0; $j -lt $f.length; $j++) {
                $plain+=$byteString[$i] -bxor $f[$j]
                $i++
                if ($i -ge $byteString.Length) {
                        $j = $f.length
                }
        }
})
iex([System.Text.Encoding]::ASCII.GetString($plain))

出力したコードを実行してみるが動かない.

Write-Host -b 00 -f 15 Checking Host... Please wait... -n
Try{
        If ((Get-EventLog -LogName Security | Where EventID -Eq 4624).Length -Lt 1000) {
                Write-Host "This host is too fresh!"
                Exit
        }
}Catch{
        Write-Host "Failed: No admin rights!"
        Exit
}
Write-Host "Check passed"

この箇所を見る限り,Admin権限でないまたはEventID4624に関するログが1000件未満だと動作を停止するそう. しかしここの処理は後の処理に関係ないので,この箇所を削除したコードを直接実行する.

すると鍵盤のようなものが出てきた.対応するキーを叩くとちゃんと音が出る.

押したキーが以下の場合は次に行けるようである.

$secret=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)

440って「ラ」だよなぁと思ったのでググりながら音階の周波数を調べ,押すキーを求めた.

hhjhhjhjkjhjhf

ここを突破するとパスワードが求められた.該当のコードはbase64になっていたので,上と同様にしてコードを出力する.

${}=+$();${=}=${;};${+}=++${;};${@}=++${;};${.}=++${;};${[}=++${;};${]}=++${;};${(}=++${;};${)}=++${;};${&}=++${;};${|}=++${;};${"}="["+"$(@{})"[${)}]+"$(@{})"["${+}${|}"]+"$(@{})"["${@}${=}"]+"$?"[${+}]+"]";${;}="".("$(@{})"["${+}${[}"]+"$(@{})"["${+}${(}"]+"$(@{})"[${=}]+"$(@{})"[${[}]+"$?"[${+}]+"$(@{})"[${.}]);${;}="$(@{})"["${+}${[}"]+"$(@{})"[${[}]+"${;}"["${@}${)}"];"${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${(}${+}+${"}${&}${@}+${"}${+}${=}${+}+${"}${|}${)}+${"}${+}${=}${=}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${[}${]}+${"}${&}${=}+${"}${+}${+}${[}+${"}${+}${+}${+}+${"}${+}${=}${|}+${"}${+}${+}${@}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${|}+${"}${(}${|}+${"}${+}${+}${=}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${+}${+}${[}+${"}${.}${@}+${"}${+}${+}${(}+${"}${+}${=}${[}+${"}${+}${=}${+}+${"}${.}${@}+${"}${+}${+}${@}+${"}${|}${)}+${"}${+}${+}${]}+${"}${+}${+}${]}+${"}${+}${+}${|}+${"}${+}${+}${+}+${"}${+}${+}${[}+${"}${+}${=}${=}+${"}${.}${|}+${"}${+}${.}+${"}${+}${=}+${"}${)}${.}+${"}${+}${=}${@}+${"}${[}${=}+${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${.}${@}+${"}${[}${]}+${"}${+}${=}${+}+${"}${+}${+}${.}+${"}${.}${@}+${"}${.}${|}+${"}${&}${=}+${"}${[}${&}+${"}${+}${+}${|}+${"}${(}${|}+${"}${+}${+}${[}+${"}${.}${(}+${"}${)}${@}+${"}${]}${+}+${"}${[}${|}+${"}${[}${|}+${"}${.}${|}+${"}${[}${+}+${"}${+}${@}${.}+${"}${+}${.}+${"}${+}${=}+${"}${|}+${"}${&}${)}+${"}${+}${+}${[}+${"}${+}${=}${]}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${|}+${"}${)}${+}+${"}${+}${+}${+}+${"}${+}${+}${+}+${"}${+}${=}${=}+${"}${.}${@}+${"}${)}${[}+${"}${+}${+}${+}+${"}${|}${&}+${"}${.}${.}+${"}${.}${|}+${"}${]}${|}+${"}${+}${.}+${"}${+}${=}+${"}${|}+${"}${&}${)}+${"}${+}${+}${[}+${"}${+}${=}${]}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${[}+${"}${&}${.}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${+}${@}${.}+${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${+}${@}${]}+${"}${.}${[}+${"}${+}${.}+${"}${+}${=}+${"}${+}${@}${]}|${;}"|&${;}

すごい.

こっから全然わからんなーと思いつつ色々やったところ,Get-Variableで変数一覧を表示した時に以下が出てきた.

Name    Value                                                
----    -----     
"               [CHar]                                                   
$               .\powerfullshell.ps1
&               8                                                   
(               6                                                   
)               7                                                   
.               3                                                   
;               iex                                               
?               True                                                 
@               2                                                   
[               4                                                   
]               5                                                   
^               .\powerfullshell.ps1
|               9                                                   
+               1                                                   
=               0             

ここから${}の中は上記の変換をすれば良いと考え,変換した.

解読してみたところ,If($ECCON -eq 'P0wEr$H311')みたいな文字列と,Write-Host "SECCON{$ECCON}"みたいな文字列を見つけたので,これをフラグとして出したら通った.

SECCON{P0wEr$H311}

Log search 100

よくわからず.とりあえず"flag"という文字列とマイナス検索を駆使して/flag-xxxとなっているものでResponseが200のものを見つけたのでアクセスしたらフラグを見つけた.

SECCON{N0SQL_1njection_for_Elasticsearch!}

他の方のWriteupを見る限り,どうやらElastic SearchのURIサーチが使えるそう.

+request:"/flag" +response:200

Ps and Qs 200

某Crypto Challenges List(https://pastebin.com/cSfZW2yX)にのってたRSALOTと同じ解法で解けた.素数使いまわしているとgcdを求めることで素数の推定ができるよって問題.

公開鍵のコンポーネントを抽出し

openssl rsa -pubin -in pub1.pub -text -noout

公約数を求めるコードを書き

import math
n1 = int(open('pub1.pub.mod.txt', 'r').read().strip(), 16)
n2 = int(open('pub2.pub.mod.txt', 'r').read().strip(), 16)
cp = math.gcd(n1, n2)
if cp != 1:
    q1 = n1 // cp
    q2 = n2 // cp
    print ('q1: ', q1)
    print ('q2: ', q2)

rsatool秘密鍵を求め

python rsatool/rsatool.py -f PEM -o key1 -p 28491351268021265...2684652311433029 -q 29756285957217824...9605071066540057

復号する.

openssl rsautl -decrypt -inkey key1 -in cipher
SECCON{1234567890ABCDEF}

RSAは鍵生成時の素数の選び方などをミスると簡単に秘密鍵が推測できてしまうことがある.(参考資料) しかし実際に運用でそういったことって起こるのだろうか.

Thank you for playing! Thank you! 100

初めてのSECCON CTFにしては頑張ったほうだと思う.ただ実際にWriteupを書いてみるとほとんど真面目に解いてないことがわかったのでちゃんと復習したい.来年は高い得点の問題を解くこととpwn問を最低一問解くことを目標にしたい.あともっといろんなCTFに参加したいと思う.

SECCON{We have done all the challenges. Enjoy last 12 hours. Thank you!}