A short note on AWS KEY ID から学ぶ

ソース:

medium.com

脆弱性AWS KEY ID

 

訳:

この件について誰かがすでに発表していないか探していたところ、 スコット・パイパーによる研究を見つけました。

https://summitroute.com/blog/2018/06/20/aws_security_credential_formats

 

と、エイダン・スティール。

 

awsteele.com

具体的には、エイダンはどうすればよいかを見つけようとしていた account_id内でエンコードされます aws_access_key_id: 例えば、 ASIAY34FZKBOKMUTVV7AアカウントIDをエンコードする方法 "609629065308"

エイダンさんは、ほぼ正解だったが、いくつかの特殊なケースでは間違えたと書いている。
Aidan は正しい解決策に非常に近づいたと思いますが、ほんの少しの調整 (以下を参照 😃) が必要なだけです。

 

・最初の 4 文字 ( ASIAこの例では) は実際に文書化されたプレフィックスであり、キーのタイプに依存します。

 

・文字列の残りの部分 (通常は 16 バイトの長さ) は Base32 でエンコードされます。を参照してください。

 

これにより、80 ビットのデータ、つまり 10 バイトが得られます。

・アカウント ID は 5 バイト以内に収まりますが、データは 1 ビットシフトされます。 (エイダンの元の計算を 少し 歪めています。かなり意図した冗談です)

 

すべてを Python スクリプトにまとめます。

 

import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print ("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

 

 

残された疑問と今後の道のり

  • 残りのデータ ビット内に何がエンコードされるか (エンコードされる場合) aws_access_key_id
  • スクリプトを試してみて、エッジケースに遭遇した場合はフィードバックを送っていただければ幸いです

 

ほなほな。