Alguns anos atrás eu havia criado uma ferramenta para levantar informações sobre um certificado SSL usando RSA. O objetivo era fornecer algumas informações que poderiam depois ser usadas em outros ataques.
Resolvi publicar ela num único arquivo .c para demonstrar como é fácil programar em BIGNUM usando SSl API para obter informações úteis e simples que podem ser usadas em ataques mais avançados.
A ferramenta se chama "RSa Analyzer" e o uso é bem simples. Inicialmente podemos "baixar" um certificado de um site e depois exibir as informações dele. A tela abaixo demonstra isso:
$ echo "\n\n" | openssl s_client -connect www.google.com:443 > saida.http ; awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' saida.http > google.crt
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
Uma vez que salvamos o certificado como google.crt, podemos então ler o seu conteúdo executando a ferramenta:
$ ./rsa_analyzer -x /tmp/google.crt
Emissor: C=US, O=Google Inc, CN=Google Internet Authority G2
Valido de: Nov 5 11:34:39 2014 GMT
Valido ate: Feb 3 00:00:00 2015 GMT
Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=google.com
Public-Key: (2048 bit)
Modulus:
00:94:17:af:1b:4e:f2:cc:fe:49:be:97:d3:4a:4a:
ab:bc:66:e7:26:55:e2:4b:38:55:5d:ae:96:19:07:
a0:a6:69:22:96:b1:95:a4:e6:6c:d5:bf:e5:d4:37:
dc:ad:63:6d:13:25:4c:27:0c:b3:ee:04:ee:1f:95:
64:1d:b5:39:70:03:44:56:89:d6:dc:a7:a4:58:a3:
cf:d4:40:14:aa:ec:06:72:79:bb:e1:c3:37:28:ec:
f1:d2:59:d6:a3:20:87:51:42:65:f3:aa:cd:28:f0:
d0:4f:0c:54:b2:69:a3:70:79:52:9b:3d:b4:3e:5d:
b0:70:21:eb:fe:5b:c2:70:a7:93:8d:e0:c0:0c:d4:
fb:a2:f4:c6:08:2a:6b:ce:43:f1:0e:cc:e2:1a:38:
ab:22:97:7e:b2:e6:19:81:6f:b0:85:e9:df:6e:8a:
9c:4a:83:7e:b8:7c:89:86:bd:22:f7:62:8d:d1:85:
15:2b:6b:ca:e9:04:a8:44:6c:03:11:01:2a:17:a1:
73:d9:41:33:af:d4:73:1a:14:34:68:32:76:68:8f:
cb:a1:2d:2f:55:dc:98:a2:51:49:92:41:12:9a:f3:
34:aa:45:45:30:50:a4:3d:c8:a2:db:f0:6b:61:0f:
b3:6b:c3:f0:fa:5b:b1:c0:7b:f3:e5:f7:c5:6b:f8:
89:53
Exponent: 65537 (0x10001)
Extensoes X509v3:
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:google.com, DNS:*.2mdn.net, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.au.doubleclick.net, DNS:*.cc-dt.com, DNS:*.cloud.google.com, DNS:*.de.doubleclick.net, DNS:*.doubleclick.com, DNS:*.doubleclick.net, DNS:*.fls.doubleclick.net, DNS:*.fr.doubleclick.net, DNS:*.google-analytics.com, DNS:*.google.ac, DNS:*.google.ad, DNS:*.google.ae, DNS:*.google.af, DNS:*.google.ag, DNS:*.google.al, DNS:*.google.am, DNS:*.google.as, DNS:*.google.at, DNS:*.google.az, DNS:*.google.ba, DNS:*.google.be, DNS:*.google.bf, DNS:*.google.bg, DNS:*.google.bi, DNS:*.google.bj, DNS:*.google.bs, DNS:*.google.bt, DNS:*.google.by, DNS:*.google.ca, DNS:*.google.cat, DNS:*.google.cc, DNS:*.google.cd, DNS:*.google.cf, DNS:*.google.cg, DNS:*.google.ch, DNS:*.google.ci, DNS:*.google.cl, DNS:*.google.cm, DNS:*.google.cn, DNS:*.google.co.ao, DNS:*.google.co.bw, DNS:*.google.co.ck, DNS:*.google.co.cr, DNS:*.google.co.hu, DNS:*.google.co.id, DNS:*.google.co.il, DNS:*.google.co.im, DNS:*.google.co.in, DNS:*.google.co.je, DNS:*.google.co.jp, DNS:*.google.co.ke, DNS:*.google.co.kr, DNS:*.google.co.ls, DNS:*.google.co.ma, DNS:*.google.co.mz, DNS:*.google.co.nz, DNS:*.google.co.th, DNS:*.google.co.tz, DNS:*.google.co.ug, DNS:*.google.co.uk, DNS:*.google.co.uz, DNS:*.google.co.ve, DNS:*.google.co.vi, DNS:*.google.co.za, DNS:*.google.co.zm, DNS:*.google.co.zw, DNS:*.google.com, DNS:*.google.com.af, DNS:*.google.com.ag, DNS:*.google.com.ai, DNS:*.google.com.ar, DNS:*.google.com.au, DNS:*.google.com.bd, DNS:*.google.com.bh, DNS:*.google.com.bn, DNS:*.google.com.bo, DNS:*.google.com.br, DNS:*.google.com.by, DNS:*.google.com.bz, DNS:*.google.com.cn, DNS:*.google.com.co, DNS:*.google.com.cu, DNS:*.google.com.cy, DNS:*.google.com.do, DNS:*.google.com.ec, DNS:*.google.com.eg, DNS:*.google.com.et, DNS:*.google.com.fj, DNS:*.google.com.ge, DNS:*.google.com.gh, DNS:*.google.com.gi, DNS:*.google.com.gr, DNS:*.google.com.gt, DNS:*.google.com.hk, DNS:*.google.com.iq, DNS:*.google.com.jm, DNS:*.google.com.jo, DNS:*.google.com.kh, DNS:*.google.com.kw, DNS:*.google.com.lb, DNS:*.google.com.ly, DNS:*.google.com.mm, DNS:*.google.com.mt, DNS:*.google.com.mx, DNS:*.google.com.my, DNS:*.google.com.na, DNS:*.google.com.nf, DNS:*.google.com.ng, DNS:*.google.com.ni, DNS:*.google.com.np, DNS:*.google.com.nr, DNS:*.google.com.om, DNS:*.google.com.pa, DNS:*.google.com.pe, DNS:*.google.com.pg, DNS:*.google.com.ph, DNS:*.google.com.pk, DNS:*.google.com.pl, DNS:*.google.com.pr, DNS:*.google.com.py, DNS:*.google.com.qa, DNS:*.google.com.ru, DNS:*.google.com.sa, DNS:*.google.com.sb, DNS:*.google.com.sg, DNS:*.google.com.sl, DNS:*.google.com.sv, DNS:*.google.com.tj, DNS:*.google.com.tn, DNS:*.google.com.tr, DNS:*.google.com.tw, DNS:*.google.com.ua, DNS:*.google.com.uy, DNS:*.google.com.vc, DNS:*.google.com.ve, DNS:*.google.com.vn, DNS:*.google.cv, DNS:*.google.cz, DNS:*.google.de, DNS:*.google.dj, DNS:*.google.dk, DNS:*.google.dm, DNS:*.google.dz, DNS:*.google.ee, DNS:*.google.es, DNS:*.google.fi, DNS:*.google.fm, DNS:*.google.fr, DNS:*.google.ga, DNS:*.google.ge, DNS:*.google.gg, DNS:*.google.gl, DNS:*.google.gm, DNS:*.google.gp, DNS:*.google.gr, DNS:*.google.gy, DNS:*.google.hk, DNS:*.google.hn, DNS:*.google.hr, DNS:*.google.ht, DNS:*.google.hu, DNS:*.google.ie, DNS:*.google.im, DNS:*.google.info, DNS:*.google.iq, DNS:*.google.ir, DNS:*.google.is, DNS:*.google.it, DNS:*.google.it.ao, DNS:*.google.je, DNS:*.google.jo, DNS:*.google.jobs, DNS:*.google.jp, DNS:*.google.kg, DNS:*.google.ki, DNS:*.google.kz, DNS:*.google.la, DNS:*.google.li, DNS:*.google.lk, DNS:*.google.lt, DNS:*.google.lu, DNS:*.google.lv, DNS:*.google.md, DNS:*.google.me, DNS:*.google.mg, DNS:*.google.mk, DNS:*.google.ml, DNS:*.google.mn, DNS:*.google.ms, DNS:*.google.mu, DNS:*.google.mv, DNS:*.google.mw, DNS:*.google.ne, DNS:*.google.ne.jp, DNS:*.google.net, DNS:*.google.ng, DNS:*.google.nl, DNS:*.google.no, DNS:*.google.nr, DNS:*.google.nu, DNS:*.google.off.ai, DNS:*.google.pk, DNS:*.google.pl, DNS:*.google.pn, DNS:*.google.ps, DNS:*.google.pt, DNS:*.google.ro, DNS:*.google.rs, DNS:*.google.ru, DNS:*.google.rw, DNS:*.google.sc, DNS:*.google.se, DNS:*.google.sh, DNS:*.google.si, DNS:*.google.sk, DNS:*.google.sm, DNS:*.google.sn, DNS:*.google.so, DNS:*.google.sr, DNS:*.google.st, DNS:*.google.td, DNS:*.google.tg, DNS:*.google.tk, DNS:*.google.tl, DNS:*.google.tm, DNS:*.google.tn, DNS:*.google.to, DNS:*.google.tt, DNS:*.google.us, DNS:*.google.uz, DNS:*.google.vg, DNS:*.google.vu, DNS:*.google.ws, DNS:*.googleadapis.com, DNS:*.googleapis.cn, DNS:*.googlecommerce.com, DNS:*.googlevideo.com, DNS:*.gstatic.cn, DNS:*.gstatic.com, DNS:*.gvt1.com, DNS:*.gvt2.com, DNS:*.jp.doubleclick.net, DNS:*.metric.gstatic.com, DNS:*.uk.doubleclick.net, DNS:*.urchin.com, DNS:*.url.google.com, DNS:*.youtube-nocookie.com, DNS:*.youtube.com, DNS:*.youtubeeducation.com, DNS:*.ytimg.com, DNS:ad.mo.doubleclick.net, DNS:android.com, DNS:doubleclick.net, DNS:g.co, DNS:goo.gl, DNS:google-analytics.com, DNS:google.ac, DNS:google.ad, DNS:google.ae, DNS:google.af, DNS:google.ag, DNS:google.al, DNS:google.am, DNS:google.as, DNS:google.at, DNS:google.az, DNS:google.ba, DNS:google.be, DNS:google.bf, DNS:google.bg, DNS:google.bi, DNS:google.bj, DNS:google.bs, DNS:google.bt, DNS:google.by, DNS:google.ca, DNS:google.cat, DNS:google.cc, DNS:google.cd, DNS:google.cf, DNS:google.cg, DNS:google.ch, DNS:google.ci, DNS:google.cl, DNS:google.cm, DNS:google.cn, DNS:google.co.ao, DNS:google.co.bw, DNS:google.co.ck, DNS:google.co.cr, DNS:google.co.hu, DNS:google.co.id, DNS:google.co.il, DNS:google.co.im, DNS:google.co.in, DNS:google.co.je, DNS:google.co.jp, DNS:google.co.ke, DNS:google.co.kr, DNS:google.co.ls, DNS:google.co.ma, DNS:google.co.mz, DNS:google.co.nz, DNS:google.co.th, DNS:google.co.tz, DNS:google.co.ug, DNS:google.co.uk, DNS:google.co.uz, DNS:google.co.ve, DNS:google.co.vi, DNS:google.co.za, DNS:google.co.zm, DNS:google.co.zw, DNS:google.com.af, DNS:google.com.ag, DNS:google.com.ai, DNS:google.com.ar, DNS:google.com.au, DNS:google.com.bd, DNS:google.com.bh, DNS:google.com.bn, DNS:google.com.bo, DNS:google.com.br, DNS:google.com.by, DNS:google.com.bz, DNS:google.com.cn, DNS:google.com.co, DNS:google.com.cu, DNS:google.com.cy, DNS:google.com.do, DNS:google.com.ec, DNS:google.com.eg, DNS:google.com.et, DNS:google.com.fj, DNS:google.com.ge, DNS:google.com.gh, DNS:google.com.gi, DNS:google.com.gr, DNS:google.com.gt, DNS:google.com.hk, DNS:google.com.iq, DNS:google.com.jm, DNS:google.com.jo, DNS:google.com.kh, DNS:google.com.kw, DNS:google.com.lb, DNS:google.com.ly, DNS:google.com.mm, DNS:google.com.mt, DNS:google.com.mx, DNS:google.com.my, DNS:google.com.na, DNS:google.com.nf, DNS:google.com.ng, DNS:google.com.ni, DNS:google.com.np, DNS:google.com.nr, DNS:google.com.om, DNS:google.com.pa, DNS:google.com.pe, DNS:google.com.pg, DNS:google.com.ph, DNS:google.com.pk, DNS:google.com.pl, DNS:google.com.pr, DNS:google.com.py, DNS:google.com.qa, DNS:google.com.ru, DNS:google.com.sa, DNS:google.com.sb, DNS:google.com.sg, DNS:google.com.sl, DNS:google.com.sv, DNS:google.com.tj, DNS:google.com.tn, DNS:google.com.tr, DNS:google.com.tw, DNS:google.com.ua, DNS:google.com.uy, DNS:google.com.vc, DNS:google.com.ve, DNS:google.com.vn, DNS:google.cv, DNS:google.cz, DNS:google.de, DNS:google.dj, DNS:google.dk, DNS:google.dm, DNS:google.dz, DNS:google.ee, DNS:google.es, DNS:google.fi, DNS:google.fm, DNS:google.fr, DNS:google.ga, DNS:google.ge, DNS:google.gg, DNS:google.gl, DNS:google.gm, DNS:google.gp, DNS:google.gr, DNS:google.gy, DNS:google.hk, DNS:google.hn, DNS:google.hr, DNS:google.ht, DNS:google.hu, DNS:google.ie, DNS:google.im, DNS:google.info, DNS:google.iq, DNS:google.ir, DNS:google.is, DNS:google.it, DNS:google.it.ao, DNS:google.je, DNS:google.jo, DNS:google.jobs, DNS:google.jp, DNS:google.kg, DNS:google.ki, DNS:google.kz, DNS:google.la, DNS:google.li, DNS:google.lk, DNS:google.lt, DNS:google.lu, DNS:google.lv, DNS:google.md, DNS:google.me, DNS:google.mg, DNS:google.mk, DNS:google.ml, DNS:google.mn, DNS:google.ms, DNS:google.mu, DNS:google.mv, DNS:google.mw, DNS:google.ne, DNS:google.ne.jp, DNS:google.net, DNS:google.ng, DNS:google.nl, DNS:google.no, DNS:google.nr, DNS:google.nu, DNS:google.off.ai, DNS:google.pk, DNS:google.pl, DNS:google.pn, DNS:google.ps, DNS:google.pt, DNS:google.ro, DNS:google.rs, DNS:google.ru, DNS:google.rw, DNS:google.sc, DNS:google.se, DNS:google.sh, DNS:google.si, DNS:google.sk, DNS:google.sm, DNS:google.sn, DNS:google.so, DNS:google.sr, DNS:google.st, DNS:google.td, DNS:google.tg, DNS:google.tk, DNS:google.tl, DNS:google.tm, DNS:google.tn, DNS:google.to, DNS:google.tt, DNS:google.us, DNS:google.uz, DNS:google.vg, DNS:google.vu, DNS:google.ws, DNS:googlecommerce.com, DNS:gstatic.com, DNS:urchin.com, DNS:youtu.be, DNS:youtube.com, DNS:youtubeeducation.com
Authority Information Access:
CA Issuers - URI:http://pki.google.com/GIAG2.crt
OCSP - URI:http://clients1.google.com/ocsp
X509v3 Subject Key Identifier:
68:CE:43:7F:C1:2E:9D:5A:EE:23:23:70:55:CD:65:78:8C:88:66:38
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:4A:DD:06:16:1B:BC:F6:68:B5:76:F5:81:B6:BB:62:1A:BA:5A:81:2F
X509v3 Certificate Policies:
Policy: 1.3.6.1.4.1.11129.2.5.1
X509v3 CRL Distribution Points:
Full Name:
URI:http://pki.google.com/GIAG2.crl
Signature Algorithm: sha1WithRSAEncryption
2e:1a:b0:85:17:78:a4:d0:f6:f1:76:32:6b:0b:ca:e5:2c:d7:
ac:55:60:92:c2:9d:0c:00:51:1c:e7:cc:6a:e1:86:94:65:15:
ef:d5:b3:6e:02:6d:07:ef:50:53:3e:43:1a:5d:f9:68:52:5a:
51:23:a6:27:31:a2:6d:10:f6:60:a3:41:f3:50:28:e6:b2:84:
d0:93:16:d9:10:34:e0:9c:d1:0d:36:7b:9c:ec:f1:b8:4f:6d:
2f:d8:d5:8f:30:d7:da:ec:0a:72:39:be:b9:a3:a0:54:e5:74:
45:a0:69:db:1c:fc:6a:37:db:11:2e:9a:cd:ac:f4:e1:6a:9a:
86:67:c6:a1:ae:09:0b:12:72:55:86:b9:4d:79:fb:52:0b:01:
85:86:69:7e:0e:ec:c9:6b:11:f5:2f:ba:19:4b:8a:a2:7e:cd:
a9:b6:5e:fa:22:e2:93:9d:05:1f:f0:ab:d3:0f:a3:6e:c9:54:
73:59:60:fa:b8:52:fc:c0:9e:09:1c:f3:fb:30:59:69:2f:a5:
fa:8f:6e:2d:1d:50:15:65:5d:51:b8:0f:57:45:49:92:a9:a3:
b1:eb:c9:d9:65:18:71:64:df:70:57:7b:9d:f4:8b:fe:7c:4c:
1d:ad:f7:7b:9d:72:bb:f6:2b:ff:1c:c4:2f:aa:49:21:be:82:
40:25:c9:14
nashleon@nashleon-Inspiron-3647:~/workspace/rsa_analyzer$
Então, acima vemos algumas informações sobre o certificado usado pelo google. Vemos o tamanho do expoente, o módulo N, os domínios permitidos e etc.
Podemos então extrair o módulo N do certificado para checar o seu tamanho. Para isso executamos o seguinte comando:
$ ./rsa_analyzer -x /tmp/google.crt | awk '/Modulus/,/Exponent/' | grep -v "Modulus" | grep -v "Exponent" | sed -e 's/://g' | tr "\\n" " " | sed -e 's/ //g' ; echo
009417af1b4ef2ccfe49be97d34a4aabbc66e72655e24b38555dae961907a0a66
92296b195a4e66cd5bfe5d437dcad636d13254c270cb3ee04ee1f95641db53970
03445689d6dca7a458a3cfd44014aaec067279bbe1c33728ecf1d259d6a320875
14265f3aacd28f0d04f0c54b269a37079529b3db43e5db07021ebfe5bc270a7938
de0c00cd4fba2f4c6082a6bce43f10ecce21a38ab22977eb2e619816fb085e9df6e
8a9c4a837eb87c8986bd22f7628dd185152b6bcae904a8446c0311012a17a173d
94133afd4731a1434683276688fcba12d2f55dc98a251499241129af334aa45453
050a43dc8a2dbf06b610fb36bc3f0fa5bb1c07bf3e5f7c56bf88953
Quebrei a saída acima para facilitar a exibição.
Uma vez com o número extraído, podemos executar novamente a ferramenta:
$ ./rsa_analyzer -n 009417af1b4ef2ccfe49be97d34a4aabbc66e72655e24
b38555dae961907a0a6692296b195a4e66cd5bfe5d437dcad636d13254c
270cb3ee04ee1f95641db5397003445689d6dca7a458a3cfd44014aaec06
7279bbe1c33728ecf1d259d6a32087514265f3aacd28f0d04f0c54b269a37
079529b3db43e5db07021ebfe5bc270a7938de0c00cd4fba2f4c6082a6bce
43f10ecce21a38ab22977eb2e619816fb085e9df6e8a9c4a837eb87c8986bd
22f7628dd185152b6bcae904a8446c0311012a17a173d94133afd4731a143
4683276688fcba12d2f55dc98a251499241129af334aa45453050a43dc8a2d
bf06b610fb36bc3f0fa5bb1c07bf3e5f7c56bf88953
Vortex Virtual
http://www.vortexvirtual.com.br
RSA Analyzer - Versao v1.0
*** Numero de Bits: 2048 ***
A ferramenta ainda serve para nos informar o tamanho mínimo de um expoente público em relação ao módulo N:
$ ./rsa_analyzer -a 009417af1b4ef2ccfe49be97d34a4aabbc66e72655e\24b38555dae961907a0a6692296b195a4e66cd5bfe5d437dcad636d13254c270cb3ee04ee1f95641db5397003445689d6dca7a458a3cfd44014aaec067279bbe1c33728ecf1d259d6a32087514265f3aacd28f0d04f0c54b269a37079529b3db43e5db07021ebfe5bc270a7938de0c00cd4fba2f4c6082a6bce43f10ecce21a38ab22977eb2e619816fb085e9df6e8a9c4a837eb87c8986bd22f7628dd185152b6bcae904a8446c0311012a17a173d94133afd4731a1434683276688fcba12d2f55dc98a251499241129af334aa45453050a43dc8a2dbf06b610fb36bc3f0fa5bb1c07bf3e5f7c56bf88953 | more
Vortex Virtual
http://www.vortexvirtual.com.br
RSA Analyzer - Versao v1.0
Gerando Pseudo Master-Key DES = 64 bits..
OK.
Pseudo Master-Key (F2D1C559120BDC7B)Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 2 = E651450039B018FA5BB04713FC75A319
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 3 = DA758D20384E1C8E1BEC0AB52D3AE419153462C628C1D903
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 4 = CF3621C924660D6AA5A59EF3C21C61AA701A5CAA8D6A1820BB45E2DDB4C2D871
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 5 = C48AF6DE7A0C2019A0B45C45803100801070BDA8F92B456AEFC728BC2409ED79AE5433BD8A7A1A4B
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 6 = BA6C6A552D25021C4CD17A9AEF7192F1CE77BC33C6453946805E88DA22274E9868A59E996D12678823B7233DDE7C1609
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 7 = B0D33EBD9EDF9D40F28414550A3A0FFD48A83E0979E846396E7AA31B7A15BF617F4D0C06A1538798831C1229D8CAF34DBE05F8EF1CF15253
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 8 = A7B896158E2DDE2C9DC3258EC414D2AC9A43333BA3D641D8923E4187282D8B7200A114A30F03943998D15BF36A452E7F830677B16B8398A7611DCBC5A
A42E1E1
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 9 = 9F15ECDE4E7DF34F7710D0DF0DA346B7820F27D1D7ABE8F7959CC4E3EA830EECB6AA8E5C9DDB9DF883FB774A1E0C714D17562B1B70BA52B7A0D42DE7F
BEDA25BAFA97744CEEAE31B
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 10 = 96E51573C0CE7A210E9DEC36B4F83C19E9116AC6905B3DE27D48AD3F9FBC56EA6DC976671E7EAF5ABDEFD7BAB05E9F2C402565CAF965046CBBEE2E1A
B7712BC9928A8FBD9477A6479EE49353EE2F51F9
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 11 = 8F2033A0B98D39F14E9AB3BBD20571983BF95036FD36691B867E59FD6C1781C19A4DB76F2A2546793FBD4EF9A3595BA4AE336E071076934971A6F3F3
FDBAB976003CE94595E07ADF22EA7E90182755BB889A966122E15EA3
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 12 = 87C1B86DA9A284048FCA1568A28318847EE9746558A7DFCA1D4C780AE45C96B2817ADAAF9DBEC6FE1D26E59922F97FCB4DBF33E86FE4DFEFC3B04FE6
1A83BC1F9461FACAD25C04DD7908B50C05E19207CD35386352FAA4C7AD6268A6F69D8C51
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 13 = 80C45E268ABA895A77F366310C9F4D96AD0030A3B6F40A0080102C8D0572ED9421B6F5C76B414EFFDC127BB46EEE0C9CBD980F0445DB85D1BEF561D5
642D79592EBE0076B73FC8A5CF1178E9E224B56F7BDA0C2BB9102521BFFE2980A9FD469E369C8DF39BC306EB
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 14 = 7A2324953667C23ECF77D27C06382D5C6667565CA7F529E3ECCBC91DBD0FF9C19615FA3BB10FF826EBA729AE55870AE8D76587DDA939A7CB751C1D9C
866C006B075F7AA2C2CFBB40735D85EC619A5DAF86BB7DA2F4DDDC1E7859658F9AA69C1FB67380C820CE96F9089C347842BF46E9
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 15 = 73D94D6D753A2C58AA82F3D97CD5721130E61877EDF2121FF20D7F49A8D9C2DF8EFD8A4CB87EF0282DABE3B99689AF5098B1D0DC763233DEAFF12F00
DC4C0F1D1159E527F5F88296B0F20FD8906DF56B4F786935A8128B4E156F42EF3632F99686B463800F11143F94869D2C0444FFD1A24AD459E0DA4DF3
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 16 = 6DE258E836797E3BF8D10A6A2E99DDAB42D7C18DEE6CBF73B777528077AC266F4043390A9C5E7637CBDA6B786222017319C4C6E9B146C6E43B337373
C59B9111D101E788F8BD755C0F5121986639E32E9433445FE272A13E330C618F033490D9BD15BF9216FE550809922E82688070C57F59DE5E69C63A873D615FC2135147C1
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 17 = 683A028B82EDEEC8A483F04F775B684B944E755AA4B2B03117E70C0AC6A1AED2E52A459995C9837827D6D307CD65217001A3D44438312D59AFF1BDB3
76F2795173A5F8C9C1AC322FBF14CEC01807FFE8D4A8DA435640F25A5167582CBA12442D116873F7385F9604C5703553E627B4DB53370C268B7F67368E290A2A1BEA122B38D0CD7BC90255BB
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 18 = 62DC3E1CDD23F6AB140DEBCCC9370D0AC5A6F968207FE1141D67E1A0D73799C3E1571216EE56386F493CCDB91160E5FAC83B0F91555E912AAE8D6EA1
3BCECC9609B9B3643A56925905EE35605F3AB34D9D71630E80E59121996BEB131D461316DD7F6AF00133856FA2A4677ED90C1733093B083C8B9A0870E4FFA29BE41B77407D94130497B900ADB6D09D5B6AD4E4D9
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 19 = 5DC534BBDFF268B920EF9DFA90B741EB4716D4868FBA031FF933A400024D798BB772421F5B5509E5F79D3AAC02D2E5B5B9DDAF644AEA1CDA297135AB
C7C4B9AD4A2CE4F847E3ABCC8CCC53BF0631C710A9BE789EEF086E47153F51E02EF25C9533DA1234F44BD9E4ECFFCCF7E631D1ACBE179772DAD896C7748C3D29331F93576BFB6A6B55916CA29BD4FBBB1B07A8BB3D2E466960477043
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 20 = 58F1422308D51A7DE706BB2C1DF9CC0EB68DED4E63032342413EF674914B7531E2DBE6630F1F744E0A7DD03A239183774DB4F8477459BCD263B1E78D
7E4FFEA6D2D0BA252D360CF25483B6601801F8F10057D42EC86501DF6AB8A50DB5CADA575C0C8900110F7E346BDB4D86F0D9A545C7483B94074E77B79725BA801930460B0B1D87CA88F529AB2019BB49A63D6A80EBCEE1D5F65890A6
07F722A02FAD8431
...
...
Elevando Pseudo Mensagem - Master-Key (F2D1C559120BDC7B) a 148 = 1A3C9C4228219929EF7DD40351C9BD99B7873D5CBBE1287A188394BB25794F3CFB89BF71CA06E9DFF14F880C414FC83DDA71D617A3A7838EEA2A97E
D9078E5C4D298F97C7DDE739338149EE34000714E1EF422CF68751715F90EB42BD123FFB640DD90272D8D81D6BB0224EEA8F895729AF0A87A9D9DFD7CF7F6B9C9BE79DE22FB2470183A631027013FF6B64A10EA98B249BEB37A6BE33
779B882C3A0F8A376EDF4667C16741BA089C378559283ECCED81E04045ACF5875276DF6935AB7A3F36C39C8DB4208403AFF78B54B20579B702EAB951DB5262B1B3BA352C44B2D7A3B418DE76120A464B784C46099336E03A58CEAEAD
5D529CD1DF68EAE677C0B7F25F8AC13A1798915CDE728A6225C35D6B64E1A931E2FC40E734BC9A03C945FE2961B6B4AC178A2B8B055195C26C6D5851558B0F44760E2B4D2C5353F6A2EB306BF157F12A1A97EF8473EC59286509FB27
7E52196822CD3B32AA1324CF11847775EF491A1AC52EF9432EC12A81B144D11D5AB618951505A2D55D42B0688441B5397D7E6901C5F86D9713493BC45BB68C8BE612D94C89D5D493CD6C5F02F0B06C583DF29FF5609C9367D85D89D5
6302689BA6E5E886600738132D4E7888E21CB79C654FCF9B88B8AF62B9266B679FA33FFC86FBEDE5B25E7350DB6D89FEBFAB645BC1161AFA25D77EC2E81A5E89B07E5A015A69A1010B7696C920CAA02FF67C45380D424F09EE28191C
5AF55F1B654BD98775B19F0814DB9DD638971015C4E0E7D4F94422DB9DA72EEB266930A080FA1D92CBA44E9F70475011F28D35381489FD7F671F3514932F1449C09510EDB71CC34FB0058E23A89349613C7CD48180BFA68F53C73214
58C8D4B09C62462A8AA5E67C837DA5623F07C00DAB17F282D3269CB53FB703FBEB4444ED67DA2D59FD4B025DEEF77394CE8B52FAAA66AB724CE3688FFD54EA7B0B422793E1C7F0FE7978EA839B80322E3014A22C9BF2BEA7CC4E06EA
9473CA72D431987CA66048178BA350B555B676F8BD967208672DF3EAF4FE13B46E6FAFF3EDB971985655DC868FB5895BAC87F7ED82E1FDBD2420F654FAC4B899AA94CAF119F3A8ADF03AA700A9D4F7F3EAE5ECBA88BE2960FDAEBEEA
CBA0524CFFF6C990C0F11A789B0C9F01B67DE4792C886165251D6790620E1FB58B2690A5C22413561BDEECDA355AE81E5C01E41700E7A70EC68D8B2B4F89759E991628A6D8E77B9FC0DD8304C0908B4B408CE4E91A376FB5164DD21A
00CFAEDB38F1BE72C8D108468B7E3871B103CD35B4165D7A2A72B3EE8E8A9DBB66EF81E3488941745FA9A2F4B736A01A1406C3F9BCFEFAA2D2D9E8B8CA7970CA9EBFB42E287A6AC2A4132B4714C53E032CD60BC7F23A01EFD107625E
A6E34E490D54FD8BDD3399F3B2F8A5615DC307442C4ED53B0C5208996442AF666553F45A61D37400F06050CEE1EA6B12FE2B65DB16C0AC73344755CFF4802A4B463E339656A8C1296DDB6CEF7C3ADBF854CA86C32C4D3A6B8C13FD07
D3B5CC8C4CCF5E92A4EFBDF1650EFA727E6E72AAC46735D09DC975EEC5A2BAF73EEB92D54440F7B7E6AA886E66503FA16588CCD07E24565B9779C1235BD56EDD6B6BC8ED30B11883679F86E47091001990AC82707FC80BF74831CA8D
1BB879E668E9A96DBBB3C247AFBEB54C0A12231
**** Valor Minimo aceitavel para e: 148 ****
**** Tamanho em Bits de Master-Key elevado a e: 9461 ****
E serve ainda para dizer de um determinado número é primo:
$ ./rsa_analyzer -p 3
Vortex Virtual
http://www.vortexvirtual.com.br
RSA Analyzer - Versao v1.0
*** Numero Primo! ***
O código fonte da mesma segue abaixo. Ela tem se mostrado útil para agilizar outros ataques.
---------- rsa_analyzer.c ----------
/* Vortex Virtual - RSA Analyzer.
* http://www.vortexvirtual.com.br/
*
* Glaudson Ocampos <glaudson@securitylabs.com.br>
* Nash Leon - <nashleon2.0@gmail.com>
*
* Compile com:
*
* $ gcc -o rsa_analyzer rsa_analyzer.c -lssl -lcrypto -Wall
*
* Atualizado em Novembro de 2014.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include <openssl/bn.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/err.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#define ERRO -1
#define VERSAO "v1.0"
#define BANNER1 "Vortex Virtual"
#define BANNER2 "RSA Analyzer"
#define SITE "http://www.vortexvirtual.com.br"
#define AUTOR "Glaudson Ocampos"
#define EMAIL "glaudson@securitylabs.com.br"
#define NUMERO_BITS_MASTERKEY 64 //SSL define valor de MASTER-KEY.
#define MAXTRY 65537 //Valor considerado seguro, atualmente(2014).
void exibe_banner() {
fprintf(stdout, "%s\n%s\n%s - Versao %s\n\n", BANNER1, SITE, BANNER2,
VERSAO);
fflush(stdout);
}
/* Exibimos qual o valor aceitavel para o expoente
* e para um determinado modulo N de X bits.
*/
void display_valor_aceitavel_e(char *valor) {
BIGNUM *MK = NULL, *r = NULL, *p = NULL;
char numero[4096];
unsigned int nbits = NUMERO_BITS_MASTERKEY;
unsigned int i = 0;
BN_CTX *ctx;
exibe_banner();
int val = atoi(valor);
if (val < 0) {
fprintf(stderr, "Argumento possui valor negativo!\n");
exit(ERRO);
}
memset(numero, 0x0, sizeof(numero));
ctx = BN_CTX_new();
if (ctx == NULL) {
fprintf(stderr, "Erro na criacao de BN_CTX\n");
fflush(stderr);
exit(ERRO);
}
r = BN_CTX_get(ctx);
if (r == NULL) {
fprintf(stderr, "Erro na criacao do BIGNUM de Resposta (r)!\n");
fflush(stderr);
exit(ERRO);
}
p = BN_CTX_get(ctx);
if (p == NULL) {
fprintf(stderr, "Erro na criacao do BIGNUM de Potencia (p)!\n");
fflush(stderr);
exit(ERRO);
}
MK = BN_CTX_get(ctx);
if (MK == NULL) {
fprintf(stderr, "Erro na criacao de Bignum para Master-Key!\n");
fflush(stderr);
exit(ERRO);
}
fprintf(stdout, "Gerando Pseudo Master-Key DES = 64 bits..\n");
fflush(stdout);
srand(100);
/* Geramos um primos qualquer para ser Master-Key */
if ((BN_generate_prime(MK, nbits, 1, NULL, NULL, NULL, NULL)) == NULL) {
fprintf(stderr, "Erro na geracao do numero primo!\n");
BN_free(MK);
BN_free(r);
BN_free(p);
exit(ERRO);
}
fprintf(stdout, "OK.\nPseudo Master-Key (%s)", BN_bn2hex(MK));
fflush(stdout);
for (i = 2; i < MAXTRY; i++) {
sprintf(numero, "%d", i);
BN_dec2bn(&p, numero);
fprintf(stdout, "Elevando Pseudo Mensagem - Master-Key (%s) a %s = ",
BN_bn2hex(MK), BN_bn2dec(p));
fflush(stdout);
if (BN_exp(r, MK, p, ctx) == 0) {
fprintf(stderr, "Erro na elevacao a potencia!\n");
BN_free(MK);
BN_free(r);
BN_free(p);
exit(ERRO);
}
fprintf(stdout, "%s\n", BN_bn2hex(r));
fflush(stdout);
if (BN_num_bits(r) > val) {
fprintf(stdout, "\n**** Valor Minimo aceitavel para e: %s ****\n",
BN_bn2dec(p));
fprintf(stdout,
"\n**** Tamanho em Bits de Master-Key elevado a e: %d ****\n",
BN_num_bits(r));
fflush(stdout);
break;
}
}
BN_free(MK);
BN_free(r);
BN_free(p);
}
/* Checamos e exibimos o tamanho em bits de um bignum */
void checa_tamanho_bignum(char *numero) {
BIGNUM *N = NULL;
unsigned int nbits = 0;
exibe_banner();
N = BN_new();
if (N == NULL) {
fprintf(stderr, "Erro na criacao de Bignum!\n");
fflush(stderr);
exit(ERRO);
}
BN_hex2bn(&N, numero);
nbits = BN_num_bits(N);
fprintf(stdout, "*** Numero de Bits: %d ***\n", nbits);
fflush(stdout);
BN_free(N);
}
/* Checamos se um determinado numero eh primo */
void checa_primo_bignum(char *numero) {
BIGNUM *N = NULL;
int r = 0;
exibe_banner();
N = BN_new();
if (N == NULL) {
fprintf(stderr, "Erro na criacao de Bignum!\n");
fflush(stderr);
exit(ERRO);
}
BN_hex2bn(&N, numero);
/* OpenSSL executa o teste de Miller-Rabin para saber
* se o numero eh primo.
*/
r = BN_is_prime(N, 10, NULL, NULL, NULL);
if (r == 0) {
fprintf(stdout, "\n*** Numero Composto! ***\n");
fflush(stdout);
} else if (r == 1) {
fprintf(stdout, "\n*** Numero Primo! ***\n");
fflush(stdout);
} else {
fprintf(stderr, "\nProblemas na checagem do numero!\n");
fflush(stderr);
}
BN_free(N);
}
/* Exibimos informacoes de um certificado.
*/
void display_info_certificado(char *certificado) {
BIO *certbio = NULL;
BIO *outbio = NULL;
X509 *cert = NULL;
int ret = 0;
X509_CINF *ci = NULL;
EVP_PKEY *pkey = NULL;
OpenSSL_add_all_algorithms();
ERR_load_BIO_strings();
ERR_load_crypto_strings();
certbio = BIO_new(BIO_s_file());
outbio = BIO_new_fp(stdout, BIO_NOCLOSE);
ret = BIO_read_filename(certbio, certificado);
if (ret == 0) {
fprintf(stderr, "Erro na leitura do arquivo de certificado!\n");
fflush(stderr);
_exit(ERRO);
}
if (!(cert = PEM_read_bio_X509(certbio, NULL, 0, NULL))) {
BIO_printf(outbio, "Falha no carregamento do certificado!\n");
exit(-1);
}
BIO_printf(outbio, "Emissor: ");
X509_NAME_print(outbio, X509_get_issuer_name(cert), 0);
BIO_printf(outbio, "\n");
BIO_printf(outbio, "Valido de: ");
ASN1_TIME_print(outbio, X509_get_notBefore(cert));
BIO_printf(outbio, "\n");
BIO_printf(outbio, "Valido ate: ");
ASN1_TIME_print(outbio, X509_get_notAfter(cert));
BIO_printf(outbio, "\n");
BIO_printf(outbio, "Subject: ");
X509_NAME_print(outbio, X509_get_subject_name(cert), 0);
BIO_printf(outbio, "\n");
pkey = X509_get_pubkey(cert);
EVP_PKEY_print_public(outbio, pkey, 0, NULL);
EVP_PKEY_free(pkey);
ci = cert->cert_info;
X509V3_extensions_print(outbio, "Extensoes X509v3", ci->extensions,
X509_FLAG_COMPAT, 0);
X509_signature_print(outbio, cert->sig_alg, cert->signature);
X509_free(cert);
BIO_free_all(certbio);
BIO_free_all(outbio);
exit(0);
}
void uso(char *progname) {
fprintf(stdout, "%s\n%s\n%s - Versao %s\n", BANNER1, SITE, BANNER2, VERSAO);
fprintf(stdout, "Desenvolvido por %s <%s>\n\n", AUTOR, EMAIL);
fprintf(stdout, "%s [opcoes]\n\n", progname);
fprintf(stdout,
"-n <bignum>\t\t\tCheca tamanho de BIGNUM (em hexadecimal)\n");
fprintf(stdout,
"-p <bignum>\t\t\tCheca se BIGNUM (em hexadecimal) eh primo\n");
fprintf(stdout,
"-x <certificado>\t\tExtrai Informacoes de um Certificado\n");
fprintf(stdout,
"-a <tamanho_modulo_N>\t\tExibe valor aceitavel para expoente publico (e) em relacao ao modulo N (mod N)\n");
fprintf(stdout, "-h \t\t\t\tExibe essa tela de ajuda.\n\n\n");
}
int main(int argc, char *argv[]) {
int c;
char *valor;
if (argc < 2) {
uso(argv[0]);
}
while ((c = getopt(argc, argv, "a:n:p:x:h?")) != -1) {
switch (c) {
case 'a':
valor = optarg;
display_valor_aceitavel_e(valor);
break;
case 'n':
valor = optarg;
checa_tamanho_bignum(valor);
break;
case 'x':
valor = optarg;
display_info_certificado(valor);
break;
case 'p':
valor = optarg;
checa_primo_bignum(valor);
break;
case '?':
uso(argv[0]);
break;
case 'h':
default:
uso(argv[0]);
break;
}
}
return 0;
}
----------
Nenhum comentário:
Postar um comentário
Comentários são moderados visando evitar spams e permitir discussões sadias.