Python+Seleniumで2段階認証(6桁のパスコード)を突破する全手順

こんにちは、ハッカー見習いのたぬ(@tanuhack)です!

Seleniumを使って、セキュリティが高めなWebサイトを自動操作をするときの強敵といえば何が思いつきますか?

そう、Googleの『2段階認証プロセス(6桁のパスコード)』ですよね!

ご存知の通り、認証作業をする際スマホに6桁のパスコードが送られ、1分単位でパスワードが変わります。

そのため、入力を高速でしないといけなかったりスマホが無かったら解錠ができなかったりと、手間が増え大変です。

しかし、今回紹介する方法を用いれば、なんとPython+Seleniumだけで『6桁の2段階認証』を突破することができるようになります!

それでは、どうぞ!

注意
注意
Macユーザー向けに書いているところが多々あります。Windowsユーザーの方は、適宜コマンドを修正しながら読み進めて下さい。

下準備

手順
  1. oath-toolkitをインストール
  2. アカウント追加用キーを取得

oath-toolkitをインストールする

ターミナルで以下のコードを入力するだけです。

ターミナル
$ brew install oath-toolkit

アカウント追加用キーを取得する

各サイトの2段階認証設定ページから、QRコードが表示されるページまでアクセスします。

サイトによって文言は異なりますが、『CAN'T SCAN IT』や『スマートフォンのみをご利用の場合』等の文言が書いてるリンクをクリックすると、アカウント追加用キーが取得出来ます。

今回は例として、『amazon seller central』という2段階認証設定を紹介します。参考程度に流してください。

STEP1:2段階認証設定のページにアクセスする

selenium-2step-authentication1

STEP2:QRコードが表示されるページまでたどり着く

selenium-2step-authentication2

STEP3:アカウント追加用のキーを保存する

selenium-2step-authentication3

キーを保存すれば完了です。

oath-toolkitのインストール』と『アカウント追加用キーを取得』まで終わったことを確認して、次はPythonからその6桁の数字を取得してみましょう!

Pythonでパスコードを取得

まず、ターミナルでインストールした『oath-toolkit』を使って、正常に6桁の数字が返されるか確認します

ターミナル
$ oathtool --totp --base32 アカウント追加用のキー(※スペース無し)

selenium-2step-authentication4

大丈夫だと思いますが、1分おきに6桁の数字がちゃんと変わるか確認しておいておくと安心ですね。

PythonでUNIXコマンドを使う

まず、PythonでUNIXのコマンドを使うために、subprocessモジュールをインポートして、oathtoolコマンドを実行します。

import subprocess

two_step_authentication = ['oathtool', '--totp', '--base32', 'アカウント追加用のキー']
print(subprocess.check_output(two_step_authentication))
実行結果|Python
b'347045\n'

正規表現やデコードして文字列を整える

一見、さっきのプログラムで6桁のパスコードが返されているように見えますが、文字タイプがbytesになっていたり、不要な文字列があったりと不十分です。

デコードしたり、不要な文字列を取り除いたりして6桁の数字だけに文字整形します。

import subprocess
import re

two_step_authentication = ['oathtool', '--totp', '--base32', 'アカウント追加用のキー']
SecondLoginPass = re.findall(r'\d+', subprocess.check_output(two_step_authentication).decode('utf-8'))
print(SecondLoginPass[0])
実行結果|Python
347045

6桁の文字列が取得できれば、後はSeleniumのsend_keysを使って、パスワードを入力するだけです!!

お疲れ様でした。

[aside] Seleniumモジュールの使い方が分からない人は、こちらからどうぞ!
【完全版】PythonとSeleniumでブラウザを自動操作(クローリング/スクレイピング)するチートシート [/aside]

最後に

今回は、PythonとSeleniumを使って、二段階認証を突破するための6桁の数字を取得する方法を紹介しました。

堅牢な二段階認証ですらもPython+Seleniumで突破して、どんどん作業を効率化させよう!!

それでは。

[aside]補足

reCAPTCHAも突破したい欲張りさんは過去記事を参考にどうぞ!

【2Captcha】Python+Seleniumで『reCAPTCHA』を突破する方法 [/aside]