과정목표
프로그램의 대한 이해력 (프로그램은 어렵지 않다)
프로그램에 대한 문법 (프로그램 작성시 문법의 대한 애러를 줄이는법)
스크립트 방식의 언어 의 이해(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
필드를 기준으로 나눠서 원하는 값만 출력하거나 필드를 바꿈.
* 필드의 예시. |
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
'모의해킹 침해대응 과정 > 본 과정' 카테고리의 다른 글
쉘 프로그래밍(bash)_3 / day31 (0) | 2021.05.10 |
---|---|
쉘 프로그래밍(bash)_2 / day30 (0) | 2021.05.07 |
쉘 프로그래밍(bash)_1 / day29 (0) | 2021.05.06 |
쉘 스크립트(bash)_2 / day29 (0) | 2021.05.04 |
쉘 스크립트(bash)_1 / day28 (0) | 2021.05.04 |