Shell ScriptShell Library셰일 라이브러리는 다양한 함수를 모아 만든 파일에서 통상 단독으로 실행되지 못하고 어떤 어플리케이션에서도 별도의 변형 없이 바로 부르고 사용할 수 있는 파일이다.솔루션을 개발하는 데 중요하거나 자주 사용하는 함수를 모으고 라이브러리 파일로 만들고, 복수의 앱에서 수시로 끌어 모으고 변경 없이 그대로 사용하면 효율적으로 작업이 있다.evaleval은 문자열(명령)를 변수로 인식하고 실행시킨다.엑스포트 엑스포트 변환은 A프로세스 중에 있는 변수를 B프로세스에 전달하는 명령어이다.하나의 엑스포트 변수를 보조 변수로 두고 많은 부모 프로세스가 이 보조 변수를 부르고 쓸 수 있다.해킹에서도 잘 사용 기법이지만, 타겟 머신에 들어 내보낼 변수가 들어 있는 간단한 백도어 파일을 넣어 놓고 나중에 침투 머신에서 Metasploit등으로 타겟 머신과 연결한 뒤 타겟 머신의 정보를 갖고 있는 변환 변수를 호출하고 침투 작업과 연계하여 작업을 수행시키기도 한다.$(명령)변수의 하나의 명령을$(명령)형태로 만들어 스크립트에 넣으면 변수처럼 사용할 수 있다.앞에서 명령어를 문자열로 작성해서 eval$(문자열)로 처리하는 기법과 유사하다.Pushd명령을 실행하면 현재 작업 디렉토리를 변경하면서 기존의 디렉토리를 스택에 저장하고 그 뒤 popd명령을 사용하여 스택에서 저장된 디렉토리를 꺼내고 작업 디렉토리를 변경할 수 있다.즉, pushd를 입력하면 현재 작업 중의 뭔가를 메모리에 업로드하고 다른 작업을 하고, 필요에 응하고 popd명령을 이용하고 다시 메모리로부터 읽어 작업을 계속 진행할 수 있다는 것이다.shell_lib 파일을 작성해 주었다.내용은 파일/디렉토리를 입력했을 때 파일인지 디렉토리인지 확인하고, 파일이면 아래 옵션에 따라 파일명, 파일 내의 행 수, 크기, 소유자, 마지막 업데이트 날짜를 확인할 수 있다.디렉터리라면 디렉터리 이름, 디렉터리 안에 파일이 몇 개 들어 있는지 소유자, 마지막 업데이트(수정 날짜)를 확인할 수 있다.shell_lib파일에 실행 권한을 부여하고 source shell_lib을 입력하면 shell_lib스크립트의 내용을 현재 사용하고 있는 셰일에 갖다가 쓴다는 뜻이다.file_type/usr/bin을 입력하고 echo$is_directory를 입력하면 값이 1이다.if[$is_directory==1];then print_directory_details/usr/bin;fi처럼 shell script형식으로 입력하면 스크립트의 내용을 현재 사용하고 있는 셰일에 갖다가 쓰고 있으므로 스크립트에서의 설정이 명령을 인식하고 설정한 대로 값을 표시하게 된다.file_type/etc/passwd를 입력하여 file type에 입력하고 파일인지 디렉토리인지 확인하며 파일이면 파일의 shell_lib 스크립트 내용처럼 파일에 대한 내용을 출력해 달라는 의미이다.sh_lib_usage.sh 파일을 작성해 주었다. 내용은 파일/디렉토리의 경로를 입력하면 파일/디렉토리의 내용을 출력해 준다는 의미이다.위와 같이 eval_str.sh 파일을 만들어 주었다. str에 ls-l/root/anaconda-ks.cfg를 인식시키고 eval$str을 입력하면 해당 명령어가 실행된다.eval_str.sh 에 실행 권한을 부여하고 basheval_str.sh 을 입력하면 eval 에 설정한 명령어가 실행된다.eval2.sh 파일을 만들어 주고 위와 같이 작성해 주었다. 내용은 ls/usr 명령어를 cmd에 저장시키고 echo에 설정한 문구가 출력되어 ls/usr을 실행시킨다.cmd1은 ls/usr/bin|wc-l 명령어를 저장하고 몇 줄인지 출력한다.city=Seoul을 입력하여 city에 Seoul이라는 내용을 저장시키고 echo$city를 입력하면 Seoul이 나온다.다른 사용자로부터 echo$city를 입력하면 아무것도 출력되지 않지만 export city를 입력하면 다른 사용자에게도 city=Seoul이라는 공식(?)이 적용되게 된다.오른쪽도 같은 원리로 한 문장을 만들 수 있다.변환을 악용하고 bash파일을 만든 뒤 명령을 실행할 수 있다.exp1.sh파일과 exp2.sh파일을 작성했다.내용은 str에 cat/etc/passwd명령을 적용시켰고, bash exp1.sh를 입력하면 exp1.sh가 eval$str이 입력되어/etc/passwd파일을 출력하게 된다.Telnet Telnet server우선 Telnet에서 원격 접속했을 때에는 일반 유저로부터 root권한으로 전환 su명령이 실행되지 않는 것을 알아 둘 필요가 있다.또, 원격 접속으로 사용자를 인증하는 Linux Kerberos서버가 있는 경우는 rlogin, SSH가 있으면 slogin로 로그온 할 필요가 있다.PASSIVE방식 FTP나 Telnet접속 시에 클라이언트가 서버에 192.168.100.100:23식에서 접속을 요청하면 대부분의 서버가 임의로 50001식 포트를 할당하고 접속하는 기본 접속 방식이다.ACTIVE방식의 클라이언트가 Dynamic Port중 하나의 번호를 지정하고 50000식에서 접속을 요청하면 서버가 요청된 포토 50000에서 클라이언트를 접속하는 방식으로 접속 보안을 좋게 한다.뒷문과 netcat 같은 도구로 흔히 쓴다.포토 종류 포토 번호 설명 Well-Known1~1,023대부분의 중요한 서버 서비스의 포트로 지정되어 클라이언트는 이 포구에서 서비스를 요청한다.IANA에서 규정한 포트이어서 함부로 변경할 수 없다.Registered1,024~49,151벤더가 자신들의 솔루션 서비스에 대한 포트를 ICANN에 등록하고 얻은 포트이다. Dynamic49,152~65,535서비스를 요청한 클라이언트에 서버가 임의로 할당 포트이다.포트 종류 포트 번호 설명 Well-Known1~1,023 대부분의 중요한 서버 서비스의 포트로 지정되어 있어 클라이언트는 이 포트로 서비스를 요청한다. IANA에서 규정한 포트이기 때문에 함부로 변경할 수 없다.Registered 1,024~49,151 벤더가 자신들의 솔루션 서비스에 대한 포트를 ICANN에 등록하여 얻은 포트다. 다이나믹 49,152~65,535 서비스를 요청한 클라이언트에게 서버가 임의로 할당하는 포트다.telnet-server, xinetd 패키지를 설치해줬어.telnet 파일을 작성해 주었다.iptables 파일에 새로운 규칙을 추가해 주었다. iptables 파일은 yum install iptables-service 패키지를 설치하면 파일이 생성된다. iptabels 파일에 새로운 규칙을 만들고 systemctl OR service 명령으로 재부팅해야 한다.iptables를 재시작하고 telnet.socket을 실행하여 23번 포트가 열려 있는지 확인해 주었다./etc/securetty에서 pts/0~pts/3번까지 쉘을 받을 수 있도록 허용하였다.텔넷 패키지를 설치해줘서telnet을 이용하고 centos2에서 centos1의 root유저로 연결했다.tty를 이용하고 확인하면-bash의 껍질을 받았음이 확인된다.SSH SH server인증서로 접속할 수도 있지만, ssl키를 사용한 접속도 가능하다.sshubuntu@ubuntu1 cat/etc/passwd식에서 ssh접속으로 명령을 추가하여 실행할 수도 있다.Parallel SSH를 사용하여 한번에 여러 타깃과 ssh로 연결하여 일괄 직업을 수행할 수도 있다.=>psh를 설치하자 pscp, prsync, pslurp등의 도구도 함께 설치된다.pdsh(Parallel Distributed Shell)라는 프로그램도 유용하지만 복수의 Linux클라이언트 머신이 들어 있는 Cloud와 BigData Hadoop환경에서 효율적으로 활용할 수 있다.CentOS 1의 /etc/hosts 파일을 위와 같이 수정해 주었다.scp 명령어를 이용하여 CentOS 1에서 CentOS 2로 /etc/hosts 파일을 전송하여 적용시키고, Ubuntu에서는 scp를 이용하여 CentOS 1의 /etc/hosts 파일을 가져와 ubuntu에 적용시켰다.Ubuntu, CentOS1에서 opensh-server 패키지를 설치해 주었다.CentOS 1에서 ssh-keygen-lf/etc/ssh/ssh_host_rsa_key.pub를 입력하면 공개키가 생성된다.Ubuntu에서 ssh로 Centos1에 접속하고 lsof-i|tail-5를 입력하면 Ubuntu가 접속하고 있는 것을 확인할 수 있다.상기와 같은 방식이 패스워드로 로그인을 하는 것이다.centos1, centos2, ubuntu에서 ssh-keygen을 입력하여 공개키와 개인키를 각각 생성하였다.각각의 centos1, centos2, ubuntu에서 /root/.sh 디렉토리에 공개키와 개인키가 생성되어 있는 것을 볼 수 있다.centos1, centos2에서 sh-copy-idubuntu@ubuntu를 입력하여 머신의 각각의 공개키를 ubuntu에게 보내주었다.Ubuntu에서 cat/home/ubuntu/.sh/authorized_keys 파일을 보면 centos1, centos2에서 보낸 공개키가 저장되어 있는 것을 볼 수 있다.다시 centos1, centos2로 돌아가서 ssh로 ubuntu와 접속하면 키로 로그인할 수 있다.sftpubuntu@ubuntu를 입력하고 sftp에 접속하면 파일을 get,put 명령어로 파일을 가져와 전송하기 쉬워진다.이번에는 서버에서 키를 생성하고, 클라이언트에 키를 배포 후에 서버에 접속하는 것을 보려고 한다.apt-y install python-pip을 설치하고 pip install psh를 설치하였다.cd/usr/local/bin 경로에 pssh를 설치하면서 함께 설치된 파일을 볼 수 있다./tmp/hosts 파일에 위와 같이 작성하여 저장해 주었다.Ubuntu에서 ssh-keygen을 입력하여 공개키, 개인키를 생성해 주었다.centos1, centos2, ubuntu 에게 열쇠를 보내주었다.apt-y install keychain을 입력하고, keychain을 설치했다.eval$(ssh-agent)을 입력하고 SSH에이전트를 활성화했다.SSH에이전트는 SSH키 관리가 쉽도록 사용되는 수단에서 비밀 키를 암호화하고 사용자가 이를 입력하지 않고도 SSH키를 사용할 수 있도록 한다.”ssh-add~~~. ssh/id_rsa”를 입력하고 개인 키를 sshagent에 개인 키를 추가했다.해당 키를 추가하면 ssh에 접속할 때 키를 추가하지 않아도 접속할 수 있도록 하는 것이다../pssh-v-A-h/tmp/hosts-o/tmp/out-lroot-i”hostname”를 입력하면 centos1, centos2, ubuntu이용자에 한번에 접속되어 pssh명령어를 이용하여 하나의 명령문을 완성시키면 3개 기계로 한꺼번에 같은 작업을 수행하게 된다.FTPFTP Server원격 호스트에 접속해서 파일을 주고받는 vsFTP서버를 설치하고 쓰자.Linux머신에서는/var/ftp/pub디렉터리가 외부에 노출하는 곳이라 여기에 파일을 넣어 두고 외부 접속하여 사용하는카테고리명령어접근명령어 user, pass, acct, rein, quit, quit, abor파일관리 명령어 cwd, dcup, dele , list , nlist , mkd , pwd , rmd , rnfr , rnt데이터형식화 명령어 type , stru, mode포트정의 명령어 get, passv, mget, mput,ret, stor, appe, stou, allo, rest, st, st, st, st, st, stat기타명령어의 도움말을 표시하지 않습니다카테고리명령어접근 명령어user, pass, acct, rein, quit, quit, abor 파일 관리 명령어 cwd, dcup, dele , list , nlist , mkd , pwd , rmd , rnfr , rnt 데이터 형식화 명령어 type , stru 、 mode 포트 정의 명령어 get 、 passv 、 mget 、 mput , ret 、 stor 、appe 、 stou、allo、rest、st、st、st、st、st、 stat기타 령어의 도움말을 표시하지 않습니다카테고리명령어접근 명령어user, pass, acct, rein, quit, quit, abor 파일 관리 명령어 cwd, dcup, dele , list , nlist , mkd , pwd , rmd , rnfr , rnt 데이터 형식화 명령어 type , stru 、 mode 포트 정의 명령어 get 、 passv 、 mget 、 mput , ret 、 stor 、appe 、 stou、allo、rest、st、st、st、st、st、 stat기타 령어의 도움말을 표시하지 않습니다vsftpd를 패키지를 설치해 주었습니다./etc/vsftpd/vsftpd.conf 파일에서 29, 33번째 줄에 주석을 풀었다. 내용은 anonymous 사용자도 업로드 할 수 있으며 디렉토리를 생성하고 수정할 수 있도록 하는 것이다.82, 83번째 줄에 주석을 지웠다. 내용은 텍스트 파일을 업로드, 다운로드하도록 설정한 것이다.ftpd banner를 수정했다.ftpd서버에 접속하면 설정하고 준 불평이 나오게 한 셈이다.101,104번 째 줄에 주석을 제거 시켰다.내용은/var/ftp/pub식에 디렉토리가 있다면,/pub디렉터리를 최상위 디렉터리에 보안적으로 강화하는 것이다.104곳에/var/ftp/pub을 적어 줘서/pub상위 디렉토리로 이동하지 못하도록 하고 주었다.setenforce 0을 해줘도 되는데 /etc/selinux/config에서 SELINUX=permissive로 변경을 해주었다./etc/vsftpd/user_list에 사용자를 쓰면 user_list에 적힌 사용자만 접속할 수 있도록 한 것이다./etc/vsftpd/ftpusers에 root에 주석을 붙였다이는 root유저로서 로그인할 수 있도록 할 것이다./etc/vsftpd/chroot_list파일을 만들어 centos, root, ubuntu를 적어 주셨다.이는 centos, root, ubuntu이용자 이외에는 root유저에 오를 수 없다는 뜻이다.vmlinuz, root 디렉토리의 하위 모든 파일/디렉토리를 /pub 디렉토리에 복사해 주었다.나중에 /pub 디렉토리를 ftp 사용자와 그룹으로 소유권을 변경하고 vs ftpd를 재실행해 주었다.Windows 7에서 Filezilla를 설치한 후 실행해 주었다. 수행하면 상기와 같은 윈도우가 표시된다.호스트에 CentOS의 IP 주소를 입력해 주고, 사용자 이름, 패스워드를 올바르게 입력해 주고, 21번 포트에 접속해 주었다 접속을 하면 pub 디렉토리의 내용을 확인할 수 있게 되고, 디렉토리 내의 파일을 다운로드 및 업로드 할 수 있게 된다.root 사용자에서는 디렉토리가 표시되지 않고, 익명 접속을 해보면 디렉토리가 생성되어 잘 보이는 것을 볼 수 있다.접속이 완료되면 설정해준 배너 문구가 출력되는 것을 알 수 있다.다운로드는 할 수 있지만, 업로드가 안되는…오류가 있는것 같다!CentOS에서 설정이 잘못된 듯 vsftpd.config파일에는 이상이 없음을 확인한 뒤 getsebool-a| grepftp를 누르고 치면 ftpd_anon_write->off, ftpd_full_access->off치를 on으로 변경했다.나중에 다시 파일을 업로드하면, 업로드가 잘 된 것을 볼 수 있다.ls/var/ftp/pub를 입력해 보면 Windows 7에서 업로드한 파일이 있는 것을 확인할 수 있다.BT에서 ftp://192.168.100.129를 입력하여 ftp 서버에 접속을 시도하였다. BT로도 잘 듣고 파일도 다운받을 수 있다.