ottenendo la chiave privata dal modulo

2

Mentre facevo un pentest interno (fondamentalmente un esercizio di squadra rossa) ho scoperto i seguenti componenti di una chiave privata (per essere esatti OpenSSLRSAPrivateCrtKey):

  • Modulo
  • Esponente pubblico
  • Esponente privato
  • Primo primo
  • Secondo primo
  • Primo esponente
  • Secondo esponente
  • Coefficiente

Ora c'è un modo per ricostruire l'intera chiave privata con questo? E quella chiave (se ricostruita) sarà sufficiente per decifrare il traffico?

Per dare un contesto migliore ecco i valori che sono stato in grado di estrarre finora:

modulus = e62a3583cb27093288d04f0a329ccec23f4fce25832f9a91633ed845f31c72cc276f538a313a4dd29d71770bafa0a828e931767c8fa7839e966f9222854a800980771f4998a25acfdea4c0fbcef9171827fe813b59a24f44ec0b09e8983ac7150636cff3d527be5554d2e8266d9f4ad3704406c01c4faabb2e3692c2f449da3fff865d99586e9a54bfe602a54566f74eb0841e545e5f76408ee68bd65c086b46bd47ebfffd84d537b47c3b938b1777549294cfa2b08c7b690728af55c194aae743166a237f92ff69c85e931e4c424fe9940d55ac15cfa2830f8cec4de04dc4afa8f2b74454a35f9175970c22830d5de2038e0768abb7ca2c8f746cde79d757e3

publicExponent = 10001

privateExponent = b205bfb29a752cf5fb4033824db75f6c7b0fbd00e2c0f52ab2baaf091b8acb7800a068db204c5a592711d5e422097f4775669ea0a57409a7a5efd1f60566a435b5396de7bcb906c8750ab5818e8ab74425db0215e7b454df983ac985300976665a9216b22012477334d29460f4b51a69041279ae29b7acf46e4023afcac73c9880012ef8ea0c46f80af6e00c6ca3dd051bf8e48a70419bf2097609ef41547f0852a469dcbb360e90e16a8a7cf5b23ebdfde0ca20c69f8346fb2cac8b227168733ea30f7ca07d51b61a9f50b9b911de31676a2e5826c78094f2fd8b73611d02b3b1a9cee7bfe43cf73f8f12c47d1d31e04f7a9acc9fea829053c24f7546342021

primeP = f5da5ef5099cc70460afb65874f0981e4220d79005c3ee07ea7557be612e9890ac28c47bee93d6a556bc8205826daf1bd23c768fe47dc50f65d33b0f7c5328047b51d85dec29b7f4fcb01984966b272f37e3cd5c45cd0e2216f916c9408d0b5d468b60f9231a73c83d70dc455f1360f8a254338305930220b403053f33d24ee9

primeQ = efaa14abb77223209b416f147acec8c1805393d688864cb33c896d84eb2fa2d4859925a1a0a619799c152d2dd5ade93ab2981f784dc735e882dcac298254e1365127a2b64b31307d87edf882662dd378ee236c3d90ae5568c7eb9b2c19740027625da33b791143ce2a7dd40d2dfce0735a338b325ea028713c43a4924400a8eb

primeExponentP = 3637eb5b14bc9b734eb3517e5e83b4b86f92f8970d7e711f13c8bf0a003a9b70c456d546138e4cf6f792e905b806e2683b4c14491cc5d3d09a7f23f63d4fc5727f93c428aa6d64e1455cbcb3edcc41befb0f64f9a5771c57ce432e90418919697fa63b4396473e2379d14af28d8e238390a10a1f29fa8aac95a658e0e057d009

primeExponentQ = 750ef3adb39a32021912eab86c0b580efb28d74aafc038f24a9d2d3b00cc7191aff74f64145d4c9013665c7cc8a37b094a75f6d901d44d4655b486fa774812003fbf46401795dd0353432e60329c2b70239075abd460f2228d934c654bc156d9e5b7aaa4bfcb68fce7d031a48653bf2558675893af983668a870b98f1f5bdb25

crtCoefficient = 354ba87acadf85a7f1178011a03ca25a8c359400d2ca7cffc0391d911342bc2f424268d0e445470b306f0179c780cad52c8a011ebffae5f1269f80ab0b6d68697aa977a0a8992b887477711ecb3caf1176b9ea2c940eff41e2de6c314ca73590275d654025cd56637a0b856152ff31cf7d814d5d6b47676c78b9dc783711214c

    
posta qre0ct 21.06.2017 - 16:01
fonte

3 risposte

0

Ok .. assolutamente enorme grazie a @aedcv per la sua incredibile risposta / commenti. Alla fine ho capito il mio codice Python per ricostruire la chiave privata in formato PEM dai vari componenti della chiave privata. Di seguito è riportato il codice (per il mio riferimento futuro e per quello di altri come me :))

from Crypto.PublicKey import RSA
from base64 import b64decode

# modulus as is from the components obtained
modulus = 'b733eb38bf886b43962bdde4688a8f5638f59a01416e59d543a29d5686d31be1623bcb5aebffa897ce3c702e6275b5ee22b77825d67f321fd90feda390780dc63beb04b4fcdf8b21d7e424d9ef4a319bc910790b36e844dee62582c2bf3ca6b9fbb219083a9d36044f7bf777c90101b8165cdfe6477ac83af9f320b2bfe39f35d6476c1f8c2e8c0dcd790c6d364d21559c75d496a0383952649ec136a48fd1ba41cedd63c5bf8d0138fb1d68c8935754a38e6dff4389dc7f42ea4bc754fab5fa49f2da9efb007a8a81219375e798e43b4fa970e8694557e7bd781e7bde90b38428df92d90c3ed5594d71d95ebb9fd9ce830484319698c736a6dd43242209a8af'

# public exponent as is from the components obtained
publicExponent = '10001'

# private exponent as is from the components obtained
privateExponent = '293675c8eb556e03e34974fe48023ba282e7c540590ed108a7d172219fece7cdb9028889a8a377b2c6c353dd2b6b1d8537ac1c4c2ec7a867ffb59499020befd5536f583cbad233036704bcc1861223bcceeb74bf7017aa3e927983c3f9af54366c87b117e7cfabf2264b55ed4d7b7b7e85115990fd2d82d3b99cd7133f159df320f7c6b4b1510c1dfe043a46d0616355fd3464ba55e923fef0262532f6f6239de21a1eb404597a620995083dc3e8cfbe3b0fcafedf52b69c8954def6abd1391acc34fc10f4f0e3e8e6f4d0a324414ae317135f58133025fb6e802a35b85b417ab25e53b5701475bcc82123756861e7252c3596d06397d4c58f0d83334b4d3ae9'

# primeP as is from the components obtained
primeP = 'e330e4226321ce47f8e81577a9914ad512d9006c0e197f99261c18c474acc218104ee8ca7808943adf9f4cdf9e541c6f2799cb27b77b9751b93ae001ee6e731cb48d293568b88764629d1a0014179ea51b5b49fa2a0a3dcc4852cea8c23bd244773b391a71e63820e809968a188dbd3f3609d62c4ca24df3373873d8bb9096bb' 

# primeQ as is from the components obtained
primeQ = 'ce6f13a87e04662296619ff6c56c9c2fc8e5fc3678b53d609d6be7a654319262a9a788226900ab833cb4e0e578691570f0739134aed7e77587dadc6ba1b12dc489fe254d48f8e03e3032f95d91fff0e5200883b31cdd00b89eb4895aa9b60907ec3ee3eec65946f36d8d6d733e7df7f8de641473c995ec2c39275dd72370209d'

# crtCoefficient as is from the components obtained
crtCoefficient = '542a5d9afcf012d6488bab79d38e7c74a1f5ccae51779d4191964c29137b8093bb355208d8358d8e40e8fca254e3e863c2557cae180e976d44f34d692984da2af4c213d42b9dc519376b2bc76790d93fc7c04018806f4cafe2390b30e01fbbab65c143ceb62a0ee1985025a748749117b85fac7b78d51a3830a9d216dea4046'


# converting each of the above from hex to long integers. Why, becasue pyCrypto contruct expects them to be that way
modulus_int = long(modulus,16)
publicExponent_int = long(publicExponent, 16)
privateExponent_int = long(privateExponent, 16)
primeP_int = long(primeP, 16)
primeQ_int = long(primeQ, 16)
crtCoefficient_int = long(crtCoefficient, 16)

private_key = RSA.construct((modulus_int, publicExponent_int, privateExponent_int, primeP_int, primeQ_int))

# encrypted stuff as is from the request response
cipher_text = 'QLOWI4eOKYnjGxwjMccbbepL5Nq8exGiwZQWSK2YiefFIS2+a7uaZn9cZzI0ywq9bfaTjUM/T2dvx7hsf9AgbEPGVbwruZFWpB8vlTxHVO0ynKJHpGE1L3jyuXg81oxzdr1wCetuBBN1tgc1T7JwDSWrq3/x4L4KKJ8VC+Ui0S9hYssH7zWWCYqYzb5bV0sMOYyJMLxP/VT2R/DYfAMIXegsDP/1blK16V4fVdu11zmuSNK8gMKYpnXZ2zD3hUWYu+9nj3g+mI/bTBP77aDdK/sPUjN2qYc7lV3VlAf1bBIhaToddWQwiLbrh2O80ZMdcF+EBkkoHBlT6J7yMyQtvw=='

raw_cipher_data = b64decode(cipher_text)

# decrypt the message directly with the private key
decrypted_data = private_key.decrypt(raw_cipher_data)
print decrypted_data

# export the private key to PEM format 
pem_key = private_key.exportKey('PEM')
print pem_key
    
risposta data 23.06.2017 - 08:13
fonte
3

Sì, supponendo che tu abbia effettivamente tutti i valori corretti. Tutto ciò che devi fare è esponente privato (d) e modulo (n).

Sia c un testo cifrato e m sia un messaggio. Questo è calcolato in questo modo:

EccocomevienegeneratalachiaveprivatadelcryptosystemRSA(semplificataperituoiscopi).

  1. Vengonosceltiduenumeriprimi:peq
  2. n=pq
  3. CalcoliamolafunzionetotitivadiCarmichaeldin,lcm(p-1,q-1),chiamiamoilvalorecheotteniamoC
  4. Scegliamouninteroetaleche1<e<CetalecheeeCsonocoprimi.
  5. Troviamod=e^-1(modC).dè inversione moltiplicativa modulare di e modulo C

Ora, la chiave pubblica è composta dalla coppia (e, n). La chiave privata è composta dalla coppia (d, n). e è "l'esponente pubblico" ed è "l'esponente privato".

    
risposta data 21.06.2017 - 16:45
fonte
1

Potresti decrittografare il traffico solo se hai catturato l'handshake SSL iniziale. SSL utilizza un codice simmetrico per crittografare il traffico. La chiave per crittografare / decifrare usando questo cifrario (negoziato durante l'handshake) viene scambiata usando le chiavi RSA. Puoi trovare il codice scelto nei pacchetti di handshake.

Se il server utilizza lo scambio di chiavi Diffie-Hellman, sei praticamente fregato.

    
risposta data 21.06.2017 - 18:24
fonte

Leggi altre domande sui tag