Im a credential ghoul

WebページのURLが与えられた。
このWebページを開くと、SSHサーバがあるという情報と、ファイル u0000.pubu0511.pub へのリンクが載っているページがあった。
このファイル群は多くが799バイトで、795バイトのものもあった。

そこで、ファイル群のページに対して wget -r -l 1 コマンドを使用し、ファイル群をダウンロードした。
u0000.pub を開いてみると、-----BEGIN PUBLIC KEY----------END PUBLIC KEY----- に挟まれたBase64データがあった。
CyberChefで16進数に変換し、Parse ASN.1 hex string をかけた結果と見比べると、
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.pubto 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 CyberChef, I converted the data to hexadecimal and compared with the results of "Parse ASN.1 hex string".
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:

zatu_ni_toridasu.pl

さらに、このプログラムをそれぞれのファイルに対して実行する以下のプログラムを作成・実行した。

Also, I created and executed this program to execute the program for each files:

run_zatutori.pl

そして、得られた数値群から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:

get_gcd.py

約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.

get_values.txt

さらに、これらの値を用い、以下のようにRSA秘密鍵のデータを構築した。

Then, using these values, I created data for a RSA private key.

build_key.txt

なお、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 を用いてTera Term でSSHサーバに接続した。
すると、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 Tera Term with the username 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.

flag{HEADLINE:new_prime_found_today_at_the_lage_integer_collider}

SquareCTF 2021