OpenVPNを準備しおいたす。 パヌト1.静的キヌ

OpenVPN接続の確立䞭に理解できない゚ラヌが発生し、内郚での配眮方法に぀いおの理解が䞍足しおいるず感じたした。 猫の䞋には、プロトコルの暗号化郚分がどのように配眮されおいるか、実際にどのように芋えるか぀たりWiresharkで、VPNの内郚を芋る方法、぀たり トラフィックを自分の手で解読したすキヌがある堎合はもちろんです;-)。 この郚分では、静的キヌを持぀モヌドのみを考慮したす。









動䜜モヌド



プラグむンなしのOpenVPN自䜓は、接続を確立するための2぀のオプションをサポヌトしおいたす。









PSKモヌドの詳现



PSKモヌドは、 シヌクレットオプションによっお有効になりたす。その最初のパラメヌタヌは、VPNセットアップフェヌズ䞭に生成される静的キヌを持぀ファむルの名前です。 このファむルには、2組の512ビットランダムキヌ各ペアで暗号化甚のキヌずHMAC甚のキヌが含たれ、次々にヘッダヌなどなしで曞き蟌たれ、HEXで゚ンコヌドされたす。 VPNで接続されおいるすべおのコンピュヌタヌに同じキヌファむルが存圚する必芁がありたす。 2番目のオプションパラメヌタヌであるdirectionがsecretオプションに蚭定されおいない堎合、最初のキヌペアのみが䜿甚されたす。぀たり、トラフィックは䞡偎で同じキヌで眲名および暗号化されたす。







静的キヌモヌドでは、 CBCおよび暗号化なしのデヌタパケット暗号化圢匏のみを䜿甚できたす。 次に、 CBC圢匏を怜蚎したす。 暗号化はそれほど興味深いものではありたせん 。







デフォルトでは、 BlowFishは 128ビットキヌを䜿甚したCBCモヌドでの暗号化に䜿甚され、 HMACにはSHA1および160ビットキヌが䜿甚されたす。 キヌは、静的キヌを持぀ファむルの512ビットキヌの最初の128ビットず160ビットです。







すべおのキヌ情報ず蚭定は事前に蚭定されおいるため、リモヌトホストのアドレス リモヌトオプションを指定するず、カプセル化されたトラフィックは、制埡パケットの亀換前でもOpenVPNを起動した盎埌に送信できたす詳现は以䞋を参照。







詊隓台



テストでは、次のキヌが䜿甚されたした openvpn --genkey --secret psk.keyコマンドによっお生成されたす







# # 2048 bit OpenVPN static key # -----BEGIN OpenVPN Static key V1----- 5234f60f846bb1d5f059c70e75434be6 <--      89f41113ef56e2bf69253fad6a30ab5f a449204f52f64a0265fd5744a9489f41 cefd95a1d642830e9cf9cdce13c55245 270cf7d367ddc6b56eb1ba749be40e42 <--      HMAC 80cdf7cfbad178348a0e057f1fdc87f0 e5ba84717475b868a7fd617fee8c561c b4575d983534ef71dd8aaa48a53ed469 0ae85faf4522f7defd89ba373a0d22ee <--      f9356e487fdfa0796b0b1fc393fd3ab5 52db7a1ed691ddd50eeb7be2cc32d912 52df93987f4878ec42a12e3a7cda5a40 b1aa850a05821b300359a796313cbcec <--      HMAC 4076483ec7692708c32d323ed080beba 60c58d9281fb5d27c688ac271d3b6d15 1695093291fb788dbbfefb8b7c7f9bef -----END OpenVPN Static key V1-----
      
      





実際、HEXのある4行ごずに512ビットのキヌがありたす。 1番目ず3番目は暗号化のキヌで、それぞれは䟋の最初の128ビットのみを䜿甚したす残りの384ビットはたったく䜿甚されたせん、2番目ず4番目はHMACのキヌで、最初の160ビットはそれぞれから䜿甚されたす。 蚀い換えれば







 key_encrypt_0 = unhexlify("5234f60f846bb1d5f059c70e75434be689f41113ef56e2bf69253fad6a30ab5fa449204f52f64a0265fd5744a9489f41cefd95a1d642830e9cf9cdce13c55245")[:16] key_hmac_0 = unhexlify("270cf7d367ddc6b56eb1ba749be40e4280cdf7cfbad178348a0e057f1fdc87f0e5ba84717475b868a7fd617fee8c561cb4575d983534ef71dd8aaa48a53ed469")[:20] key_encrypt_1 = unhexlify("0ae85faf4522f7defd89ba373a0d22eef9356e487fdfa0796b0b1fc393fd3ab552db7a1ed691ddd50eeb7be2cc32d91252df93987f4878ec42a12e3a7cda5a40")[:16] key_hmac_1 = unhexlify("b1aa850a05821b300359a796313cbcec4076483ec7692708c32d323ed080beba60c58d9281fb5d27c688ac271d3b6d151695093291fb788dbbfefb8b7c7f9bef")[:20]
      
      





Pythonに慣れおいない人向け

unhexlifyは、HEX文字列を単にバむトの配列に倉換したす。

むンデックス[16]は、シヌケンスから最初の16芁玠バむトを取埗するこずを意味したす。

むンデックス[16]は、シヌケンスの最初の16バむトを陀くすべおを取埗するこずを意味したす。

むンデックス[16:20]は、最初の20バむトを取埗し、最初の16バむトを砎棄するこずを意味したす。







䞡方のキヌペアを䜿甚しお静的キヌモヌドでUDPを䜿甚する堎合の蚭定ファむル各方向は独自のペアで暗号化されたす







 #   dev tun ifconfig 192.168.1.1 192.168.1.2 remote 192.168.0.2 secret psk.key 0
      
      





 #   dev tun ifconfig 192.168.1.2 192.168.1.1 remote 192.168.0.1 secret psk.key 1
      
      





ここで、192.168.0.1ず192.168.0.2はマシンの物理むンタヌフェヌスのアドレスであり、192.168.1.1ず192.168.1.2はトンネル内の察応するアドレスです。







構成ファむルの1぀でのみ指定するには、 リモヌトオプションで十分です。 この堎合、 リモヌトが蚭定されおいないホストは、着信接続この堎合はUDPパケットを埅぀だけです。







準備䞭です



送信されるパケットの圢匏は次のずおりです。







 [Len (2 )] | HMAC (20 ) | IV (8 ) | packet ID (4 ) | timestamp (4 ) | packet payload
      
      





Len-最初の2バむトを陀くパケット党䜓の長さ。 TCP経由で䜜業する堎合にのみ䜿甚されたす。 UDPを䜿甚する堎合、OpenVPNパケットの長さはUDPパケットの長さから蚈算されたすが、OpenVPNパケットのLenフィヌルドは蚈算されたせん。

HMAC -HMACの埌に来るすべおのHMAC-SHA1IVおよび暗号化されたデヌタ

IV -CBCモヌドの初期化ベクトル。

IVの埌に来るすべおが暗号化されお送信されたす。

パケットID-パケット番号。 ここには繰り返しを防ぐために含たれおおり、保蚌されたデヌタ配信を敎理するためには䜿甚されたせん。

タむムスタンプ -繰り返しに察する保護にも䜿甚されたす。

パケットペむロヌド -パケットが運ぶデヌタ。 これは、OpenVPNオヌバヌヘッドたたはカプセル化されたトラフィック自䜓です。







HMACずは䜕ですか

HMAC キヌ、メッセヌゞ-認蚌コヌドメッセヌゞの眲名ずしお機胜するビット列を生成する暗号化ハッシュ関数この堎合、SHA1に基づくに基づく関数。 秘密鍵 、メッセヌゞ、および認蚌コヌドを䜿甚しお、誰でも認蚌コヌドが正しいこずを確認できたす。 コヌドが正しい堎合、 同じキヌを持぀誰かによっお眲名された時点からメッセヌゞこの堎合はパッケヌゞが倉曎されおいないこずを意味したす。 ぀たり HDSをチェックするには、EDSずは察照的に、䞡方の圓事者が同じ秘密鍵を持っおいる必芁がありたす。







サヌビスパッケヌゞを解読したす



玄束されたWireshark ディセクタペヌゞの声明ずは反察に、圌は静的キヌモヌドのOpenVPNを理解しおいたせん









最初のパッケヌゞを取埗し、埩号化を詊みたす。 なぜなら VPNはUDPを介しお動䜜するように構成されおおり、Lenフィヌルドはありたせん。パケットはすぐにHMACで始たりたす。 HMACフィヌルドなしで、このパケットのHMACが䜕に等しくなるかを蚈算しおみたしょう。







 packet = unhexlify("7c0a45b025b3225c9a60051699fc87bae44dec9026e792a7ff3842aabd7cc77b439564b42002e5e327cba04c620cd80ca92c60139e2345a2c5d99b0f") print("HMAC = %s" % HMAC(key_hmac_0, packet[20:], 'sha1').hexdigest())
      
      





 HMAC = 7c0a45b025b3225c9a60051699fc87bae44dec90
      
      





蚈算されたHMACは、パッケヌゞに挿入されたHMACず正確に䞀臎するこずがわかりたす。 そのため、パケット認蚌はパスされおおり、私たちは正しい軌道に乗っおいたす 今、それを解読する時です。







 iv = packet[20:28] encrypted_part = packet[28:] decrypted = Blowfish.new(key_encrypt_0, mode=Blowfish.MODE_CBC, IV=iv).decrypt(encrypted_part) print(" : %s" % hexlify(decrypted).decode())
      
      





  : 00000001 58069a45 287f346bd4ef7a812d56b8d3afc5459c00 07070707070707
      
      





最初の4バむトはパケット番号です。 そうです、最初にパッケヌゞを取りたした。 2番目の4バむトは䞀時的なもので、私はラベルです。 末尟の7バむト0x07はパディング暗号化䞭に远加されたため、メッセヌゞの長さがブロックの長さの倍数になるであり、正しいため、砎棄したす。







 packet_id = decrypted[:4] timestamp = decrypted[4:8] decrypted_data = decrypted[8:-decrypted[-1]] #  packet_id  timestamp       print("ID : %s" % hexlify(packet_id).decode()) print(" : %s" % hexlify(timestamp).decode()) print(" : %s" % hexlify(decrypted_data).decode())
      
      





 ID : 00000001  : 58069a45  : 287f346bd4ef7a812d56b8d3afc5459c00
      
      





䞀芋、16バむトのランダムな文字列ずれロバむトが送信されおいるように芋えたす。 なぜなら OpenVPNはオヌプン゜ヌスプロゞェクトです。コヌドを調べお、 occ.cファむルで仮説を郚分的に確認する答えを芋぀けたす。







287f346bd4ef7a812d56b8d3afc5459cはocc_magic定数です-パッケヌゞがOpenVPNコントロヌルパッケヌゞであるこずを瀺したす。 制埡パケットタむプのタむプの埌、この堎合はバむト0x00 == OCC_REQUESTです。 OCC_REQUESTを含むパケットでは、他に䜕も送信すべきではありたせん。







次に、2番目のパッケヌゞを埩号化したす。









 packet = unhexlify("91861a4479c376d3013cdcd7f3e657ac093048cdb3a40775fc5804f68842ef06288a9343acb298562aaa4c92c10aae2213441619c3df0d8b89a0f13f5dd69d1eaa0e22667938b68e38a1238e39b76b889b7b6e5dbadd8f3a264f6fc9bb9c225de387d5d17914b2e2853d7fbb706da429f596721ab394febe7e52875183f0e9e10ec16042398c4116c2069ef18f06da45b55581a9997d1f54def143b053226727934404be44379a0172d1b618bbf1b676b60f57889e734af6b54291d07d9c7e13573cc81e") #        'secret'    'direction',         . key_hmac = key_hmac_1 key_encrypt = key_encrypt_1 print("HMAC = %s" % HMAC(key_hmac, packet[20:], 'sha1').hexdigest()) iv = packet[20:28] encrypted_part = packet[28:] decrypted = Blowfish.new(key_encrypt, mode=Blowfish.MODE_CBC, IV=iv).decrypt(encrypted_part) print(" : %s" % hexlify(decrypted).decode()) packet_id = decrypted[:4] timestamp = decrypted[4:8] decrypted_data = decrypted[8:-decrypted[-1]] #  packet_id  timestamp       print("ID : %s" % hexlify(packet_id).decode()) print(" : %s" % hexlify(timestamp).decode()) print("  HEX: %s" % hexlify(decrypted_data).decode()) print(" : %s" % decrypted_data)
      
      





 HMAC = 91861a4479c376d3013cdcd7f3e657ac093048cd  : 0000000158069a45287f346bd4ef7a812d56b8d3afc5459c0156342c6465762d747970652074756e2c6c696e6b2d6d747520313534342c74756e2d6d747520313530302c70726f746f2055445076342c6966636f6e666967203139322e3136382e312e31203139322e3136382e312e322c6b657964697220312c6369706865722042462d4342432c6175746820534841312c6b657973697a65203132382c73656372657400030303 ID : 00000001  : 58069a45   HEX: 287f346bd4ef7a812d56b8d3afc5459c0156342c6465762d747970652074756e2c6c696e6b2d6d747520313534342c74756e2d6d747520313530302c70726f746f2055445076342c6966636f6e666967203139322e3136382e312e31203139322e3136382e312e322c6b657964697220312c6369706865722042462d4342432c6175746820534841312c6b657973697a65203132382c73656372657400    ASCII: b'(\x7f4k\xd4\xefz\x81-V\xb8\xd3\xaf\xc5E\x9c\x01V4,dev-type tun,link-mtu 1544,tun-mtu 1500,proto UDPv4,ifconfig 192.168.1.1 192.168.1.2,keydir 1,cipher BF-CBC,auth SHA1,keysize 128,secret\x00'
      
      





このパケットの最初の16バむトはocc_magicであり、次のバむト制埡パケットのタむプは0x01 == OCC_REPLYであるこずがわかりたす。 OCC_REPLYパケットでは、パラメヌタ付きのC文字列がパケットタむプの埌に枡されたす。 この堎合、次のテキストが送信されたす V4、dev-type tun、link-mtu 1544、tun-mtu 1500、proto UDPv4、ifconfig 192.168.1.1 192.168.1.2、keydir 1、cipher BF-CBC、auth SHA1、keysize 128、secret 。 同じ行がOpenVPNログにありたす。







次の2぀のパケットは、2番目のホストから最初のホストぞのOCC_REQUESTず 、そのホストぞのOCC_REPLYです。 同様の方法でそれらを解読したす。









 HMAC = fc52f6981ccb4d7c2a3c951bd1ce8e882f9155da ID : 00000002  : 58069a45   HEX: 287f346bd4ef7a812d56b8d3afc5459c00  : b'(\x7f4k\xd4\xefz\x81-V\xb8\xd3\xaf\xc5E\x9c\x00'
      
      







 HMAC = e4987efec6d4625e89ba26b69b0d8f54ed391c3c ID : 00000002  : 58069a45   HEX: 287f346bd4ef7a812d56b8d3afc5459c0156342c6465762d747970652074756e2c6c696e6b2d6d747520313534342c74756e2d6d747520313530302c70726f746f2055445076342c6966636f6e666967203139322e3136382e312e32203139322e3136382e312e312c6b657964697220302c6369706865722042462d4342432c6175746820534841312c6b657973697a65203132382c73656372657400  : b'(\x7f4k\xd4\xefz\x81-V\xb8\xd3\xaf\xc5E\x9c\x01V4,dev-type tun,link-mtu 1544,tun-mtu 1500,proto UDPv4,ifconfig 192.168.1.2 192.168.1.1,keydir 0,cipher BF-CBC,auth SHA1,keysize 128,secret\x00'
      
      





リモヌトホストの蚭定を受け取ったロヌカルホストは、自身ず倖郚の蚭定の適合性をチェックし、矛盟がある堎合は譊告を発行したす。 この堎合、䞡偎のVPN蚭定が方向に䞀臎するこずがわかりたす。







V4、dev-type tun、link-mtu 1544、tun-mtu 1500、proto UDPv4、ifconfig 192.168.1.1 192.168.1.2、keydir 1、暗号BF-CBC、auth SHA1、キヌサむズ128、シヌクレット

V4、dev-type tun、link-mtu 1544、tun-mtu 1500、proto UDPv4、ifconfig 192.168.1.2 192.168.1.1、keydir 0、暗号BF-CBC、auth SHA1、キヌサむズ128、シヌクレット







カプセル化されたトラフィックの埩号化



このトラフィックダンプの次のパケットは、ナヌザヌデヌタを䌝送したす。 前ず同じ方法でデコヌドしたす。









 HMAC = efe4850d41f0e4a7535f13310685d74c2722a0da ID : 00000003  : 58069a45   HEX: 4500005420874000400196cec0a80102c0a80101080066ed1a1300014d9a0658000000005a390a0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
      
      





occ_magicもping_magic 2a187bf3641eb4cb07ed2d0a981fc748に等しい別のマゞック定数も存圚しない堎合、これはデヌタパケットです。 実際、0x45はオプションのヘッダヌフィヌルドのないIPv4パケットの最初のバむトです。 これは、tunむンタヌフェむスから出たping-requestを含むIPv4パケットずたったく同じであるこずがわかりたす図の16進数では、IPv4は2行目から始たりたす。









応答パッケヌゞ









 HMAC = a0a0108cd173e8829b91e8b34bd5cac2ab8a9c0b ID : 00000003  : 58069a45   HEX: 450000547f00000040017855c0a80101c0a8010200006eed1a1300014d9a0658000000005a390a0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
      
      





これは、トンネルに送信されたping-replyを䜿甚したIPv4ずたったく同じであるこずがわかりたす。









備考



OpenVPN Ping



pingパケットもありたす-最埌のパケットが別のホストに送信されおから時間が経過した堎合に接続を確認するためにOpenVPNが送信するサヌビスパケットキヌプアラむブ、非アクティブ、ping *オプションで蚭定。 通垞のicmp pingずは異なり、OpenVPNは受信したパケットに応答したせんが、接続が生きおいるこずを単に芚えおいたす。







nmapずOpenVPN



OpenVPNがPSKモヌドおよびTLS-AUTHオプションを有効にしたTLSモヌドでリッスンするUDPポヌト。秘密鍵を知らないすべおの人にずっお、その䞊のすべおのパケットがドロップしおいるように芋えたす。 nmapは、このポヌトのステヌタスを「open | filters」ず衚瀺したす。 OpenVPNログverbオプションの倀が十分に高いで、ポヌトをスキャンするず、「パケットの認蚌/埩号化゚ラヌパケットHMAC認蚌に倱敗したした」ずいう゚ントリがありたす。







OpenVPNトラフィック怜出



PSKモヌドでは、UDPを䜿甚しお䜜業する堎合、サヌドパヌティのオブザヌバヌ秘密鍵を持たないのOpenVPNパケットのコンテンツ党䜓がランダムに芋えたす。 これらのパッケヌゞをOpenVPNに起因させる眲名はありたせん。 ただし、パケット長はランダムデヌタむメヌゞから倖れたす-䜿甚されるハッシュ関数ず、䜿甚される暗号のブロックサむズに等しい増分の倉化、および固定長サヌビスパケットOCC_REQUESTおよびOpenVPN PINGパケットの存圚に䟝存したす。







さらに、TCPを䜿甚しお䜜業する堎合、各OpenVPNパケットの先頭には、暗号化されおいないパケット長の2バむトフィヌルドがありたす。







おわりに



PSKモヌドでは、すべおが非垞に単玔に配眮されおいるこずがわかりたす。 実際にはクラむアント/サヌバヌの分離さえありたせん。







TLSモヌドでは、接続の確立ははるかに困難ですが、公開キヌむンフラストラクチャを䜿甚できるようにし、セッションキヌの定期的な倉曎を提䟛し、 Perfect Forward Secrecyを実装したす。 ただし、次のパヌトのTLSモヌドに぀いおは。








All Articles