WebページのURLが与えられた。
このWebページを開くと、SSHサーバがあるという情報と、ファイル u0000.pub
~ u0511.pub
へのリンクが載っているページがあった。
このファイル群は多くが799バイトで、795バイトのものもあった。
そこで、ファイル群のページに対して wget -r -l 1
コマンドを使用し、ファイル群をダウンロードした。
u0000.pub
を開いてみると、-----BEGIN PUBLIC KEY-----
と -----END PUBLIC KEY-----
に挟まれたBase64データがあった。
0x20バイト目 (0-origin) から大きい数値のデータが始まり、最後から6バイト目まで続きそうであることがわかった。
これを踏まえ、各ファイルから大きい数値を表すと予想できる部分を取り出す以下のプログラムを作成した。
An URL of a web page was given.
Opening the web page, I found information saying there is a SSH server, and a page with links to files u0000.pub
to u0511.pub
.
Most of the files are 799-byte long, and some of the files are 795-byte long.
Seeing this, I used a command wget -r -l 1
to the page with the links to files to download the files.
Opening u0000.pub
, I found Base64-encoded data between -----BEGIN PUBLIC KEY-----
and -----END PUBLIC KEY-----
.
With
As a result, I found that the data standing for the large integer begins from the 0x20-th byte (the first byte is 0th), and that the data continues until the 6th byte from the last.
Based on this, I created this program to extract the part that looks standing for the large integer from each files:
さらに、このプログラムをそれぞれのファイルに対して実行する以下のプログラムを作成・実行した。
Also, I created and executed this program to execute the program for each files:
そして、得られた数値群から2個を選ぶ組み合わせ全てについて最大公約数を求め、1より大きかったらその値を出力する以下のプログラムを作成・実行した。
Then, I created and executed this program to calculate the greatest common divisors of all combinations of 2 numbers and output the result if it ls larger than 1:
約4分で実行が完了し、u0170.pub
から取り出した数値と u0340.pub
から取り出した数値の最大公約数が1より大きいことがわかった。
そこで、この値に基づき、Pythonのインタラクティブモードを用いて以下のようにRSA秘密鍵ファイルを作るのに用いる値を計算した。
After about 4 minutes, the execution completed and it indicated that the greatest common divisor of numbers extracted from u0170.pub
and u0340.pub
is larger than 1.
Seeing this, I calculated values to create a RSA private key file from this value using the interactive mode of Python.
さらに、これらの値を用い、以下のようにRSA秘密鍵のデータを構築した。
Then, using these values, I created data for a RSA private key.
なお、RSA秘密鍵の構造については、以下のページを参考にした。
I referred to this page to know the structure of RSA private keys.
RSA 秘密鍵/公開鍵ファイルのフォーマット - bearmini's blog
構築したデータをCyberChefでBase64に変換した。
I converted the data to Base64 using CyberChef.
Find / Replace, 4 more - CyberChef
変換結果を -----BEGIN RSA PRIVATE KEY-----
と -----END RSA PRIVATE KEY-----
で挟み、テキストファイルに保存した。
保存したファイルを秘密鍵として用い、数値を取り出したファイル名からわかるユーザ名 u0170
を用いて
すると、flagが出力され、接続が切れた。
I put the converted data between -----BEGIN RSA PRIVATE KEY-----
and -----END RSA PRIVATE KEY-----
, and saved to a text file.
Using the saved file as the private key, I connected to the SSH server using u0170
, that can be obtained from the name of the file from which I extracted the number.
Then, the flag was printed and the connection was closed.