본문 바로가기
모의해킹 침해대응 과정/본 과정

쉘 스크립트(bash) / day28

by 알거음슴 2021. 5. 4.

과정목표

프로그램의 대한 이해력 (프로그램은 어렵지 않다)

프로그램에 대한 문법 (프로그램 작성시 문법의 대한 애러를 줄이는법)

스크립트 방식의 언어 의 이해(perl, php, python)

 * bash shell script 통해 가벼운 공격 프로그램 개발에 활용.

 * liunx server 보안 : 서버 취약점 진단 프로그램 개발에 활용.

 

 

선수지식

쉘 스크립트 작성 관련 CMD (grep, sed, awk) + sort, uniq, head, tail, cut ... 등

쉘의 특성 (redirection, pipe, shell function, variable, metacharacter, alias, ...)

 * 다른 언어의 경우 함수를 활용하듯, 쉘 스크립트 내에선 liunx CMD를 활용하여 적용함.

 

 

BASH Shell

쉘은 명령어 해석기의 역할을 가진다.

쉘의 특징을 이용하여 프로그램을 작성할 수 있다. (shell script)

 *사용하고 있는 쉘 확인(sh, csh, ksh, bash)

 현재쉘 확인 : ps

 로그인셀 확인 : grep root /etc/passwd (# echo $SHELL)

 현재쉘 변경 : sh

 로그인쉘 변경 : usermod -s /bin/sh root ($ chsh CMD)

[참고]쉘의 실행 순서

쉘 내부에 있는 명령어 (if, while..) -> MEM에 있는 명령어 (alias 로 선언) -> DISK 내에 존재하년 명령어 (/bin/ls)

 * alias 로 ls를 선언 시 DISK 내 ls 보다 우선순위를 받음으로 다른의미로 해석될 수 있다.

 

 

추가학습 CMD 

1. grep (기존 학습 완료)

1) 옵션 (복습)

 grep -l : 해당 패턴이 있는 파일 이름을 출력한다.

 grep -r : 하위폴더 포함하여 해당 패턴이 있는 파일 안에있는 내용들을 출력한다. ([파일이름]:[파일내패턴내용])

 grep -n : 출력할때 패턴이 있는 해당 줄번호와 함깨 출력해준다.

 grep -v : 패턴이 있는 내용을 제외한 나머지 모든 내용의 줄을 출력한다. ( keyword 제외 )

 grep -i : 패턴을 찾을때 대소문자를 구분하지 않고 모두 출력한다.

 grep -w : 키워드를 한단어로 인식해서 찾아줌 ( grep root 의 경우 rootroot.txt 는 제외 root.txt 는 찾음 )

2) 패턴 사용법

 . : 모든 문자가 올 수 있음 (# grep 'no...y' /etc/passwd)

 * : 앞문자가 0회 이상 반복 (# grep 'r*' /etc/passwd)

 + : 앞문자가 1회 이상 반복 (# grep 'r+*' /etc/passwd)

 ? : 앞문자가 0또는 1회 반복

 {m} : 앞문자가 m번 반복

 {m,n} : 앞문자가 m번 이상 n번 이하 반복

 [abc] : 선택적인 한문자

 [a-c] : 선택적인 한문자

 [^a] : 제외시킬 한문자 

 ^root : 라인의 처음에 매칭되는

 root$ : 라인의 끝에 매칭되는

3) 변수

 변수의 경우 "" 로 묶어서 활용하는것을 추천, ( '' 의 경우 해석하지않음 )

 

2. sed

stream edior - 원본파일을 건드리지 않고 모니터에만 편집하여 출력함.

 1) 옵션

sed -i : 원본파일을 수정

sed -n : 원본파일을 출력하지않고 수정사항만 출력함

sed 'p' : 선언하는 값을 출력

  sed -n '1,3p' /etc/hosts (# head -3 /etc/hosts) : 1~3번 줄을 출력

  sed -n '1,/adm/p' /etc/passwd : 1~adm 이 검색된 줄까지 출력 ( // 사이에 문자를 입력 )

sed 'd' : 지정대상만 지우고 출력

  sed '1,3p' /etc/hosts : 1~3번 줄을 지우고 출력

  sed '/127.0.0.1/,172.16.6.200/d' /etc/hosts : 지정영역을 지우고 출력

sde 's' : 치환하여 출력 (vi 편집기 내 : 와 사용법이 유사)

  sed 's/root/ROOT/' /etc/passwd : root 를 ROOT로 변경하여 출력

  sed '1,3s/root/ROOT/g' /etc/group : 1~3줄의 root를 ROOT로 변경하라 (g : 전역)

  sed 's;/test/file.sh;/test/file.c;g' file1 : /test/file.sh 를 /test.file.c 로 변경하라 

* 즉, 꼭 지정을 // 로 아닌 ;; 또는 ## 다양한것으로도 선언가능

* 변수 선언시에는 '' 이 아닌 "" 으로 묶어야 해석가능.

 

3. awk

필드를 기준으로 나눠서 원하는 값만 출력하거나 필드를 바꿈.

* 필드의 예시.
  -rw-r--r--         1      root     other        0     11
10   06:29 file1
<-----$1----> <-$2-> <-$3-> <--$4--> <-$5-> <-$6-> .....
<------------------------------------$0----------------------------------->

awk '{print $0}' : 전체를 출력

awk '{print $3 $1 $2}' : 3번필드 1번필드 2번필드 출력 (순서변경이 적용)

 * 이름을 지정시에는 위와 동일하게 // 로 지정가능 

 1) 옵션

-F : 필드 구분자를 띄워쓰기가 아닌 다른 문자로 인식

 

4. 기타

 sort : 정렬 ( -u :중복제거)

 uniq : 중복제거 

 cat : 특정 영역을 잘라서 출력. ( cut -c1-5 /etc/hosts : 1~5번 캐릭터 삭제 후 출력 )

 tr : 변환 ( cat /etc/hosts | tr "[A-Z]" "[a-z]" : 대문자를 소문자로 변환)

 split : 균등분할 하여 저장.

 paste : 결합 ( paste file1 file2 : file1,2 를 붙여준다 * 가로로 나란히 붙임 )

 

 

변수

선언 : VAR=5 이후 export VAR

확인 echo $VAR

* 기존 다른 언어 $VAR=5 가 아닌 방식임으로 많은 오류가 나올 수 있음.

 1) 특수변수

$$ : 현재 쉘의 PID 번호 저장(EX: 임시 파일 생성, /tmp/.tmp.$$)

$! : 바로 이전 수행된 백그라운드 프로세스의 PID 번호 저장

$? : 바로 이전 수행된 명령어의 return value 저장(0 ~ 255)

$* : 모든 인자($* == $@)

$# : 인자의 개수

$0 : 프로그램 이름

$1 : 프로그램에 대한 첫번째 인자

$2 : 프로그램에 대한 두번째 인자

$3 : 프로그램에 대한 세번째 인자

 

 

함수

선언 : a() { ls ; date ; cal; }

확인 : a 입력 시 ls와 date, cal 모두 출력됨

 * typeser -f : 선언된 함수들을 확인 할 수 있음.

 

 

Here Documentation

cat CMD 와 함깨 활용됨.

 출력내용이 많은 text을 효율적으로 출력하기 위한 방법

 선택하는 메뉴을 출력하기 위한 방법

 명령어의 입력값(stdin)으로 사용하기 위한 방법

사용법 :

cat << E0F

E0F

* 위의 경우 E0F 사이에 있는 모든 내용은 cat 명령어로 인해 출력됨.

 

 

true / false

 && : and의 의미 A && B 의 경우 A 가 실행될 경우 B가 무조건적으로 실행되어야함.

 || : or의 의미 A || B 의 경우 A가 실행될경우 B는 실행안함, A가 실행안될경우 B가 실행됨.

ex) [ -f /etc/passwd ] && echo "OK" || echo "Fail"

 -> /etc/passwd 가 있을경우 OK 없을경우 Fail

 

 

파일의 이름/경로

ex) DIR1=/etc/sysconfig/network-scripts/ifcfg-eth0 

 dirname $DIR1 : 디렉토리의 경로만 출력 -> /etc/sysconfig/network-scripts

 basename $DIR1 : 파일의 이름만 출력 -> ifcfg-eth0