티스토리는 기본적으로 
'DAUM 지도'를 손쉽게 넣을 수 있도록 지원해줍니다. 

하지만, 
가끔은 필요에 의해서 네이버 지도를 넣어야 할 경우도 발생합니다.

알면 참 쉬운 네이버지도 넣기! 
한번 알아볼까요? 

추천은 저를 춤추게 합니다 ^^



1. 네이버 지도 페이지에 들어갑니다. 
퍼가고 싶은 위치를 검색해서 원하는 위치로 이동 후..
'지도공유'에서 '지도복사' 기능을 선택합니다. 


2. 지도 복사 팝업이 뜹니다. 

여기서 원하는 사이즈를 선택합니다. 

요즘은 스마트폰도 화면이 크기 때문에 최대 크기로 하셔도 됩니다. 

3. '다음' 버튼을 누르면 '지도 복사' 팝업이 뜹니다. 

여기서 html 코드를 복사하기 버튼을 눌러 소스를 복사합니다. 

4. 이제 블로그로 가서 우측 상단의 'HTML' 체크박스를 선택한 후,

복사해온 소스를 붙여넣습니다. 


5. 'HTML'체크박스를 해제하면 

복사해온 지도가 예쁘게 붙어 있는걸 확인 할 수 있습니다. 


참 쉽죠?



그런데 왜 번거롭게 네이버 지도를 해야 하냐구요? 


1). 가끔 경로를 첨부하고 싶을 때 참 편리합니다. 

아래 사진처럼 말이죠~ 

2). 스마트폰에서 볼때, 

다음 지도는 손으로 휘~휘 화면을 넘기다 보면 

어느순간 화면은 안 내려가고 지도만 움직이고 있는 경험이 있으실 텐데요. 

네이버 지도는 스크롤에는 반응하지 않고, 클릭하면 새창에서 네이버 지도페이지가 뜹니다. 


3). '다음 지도'는 html 소스와 충돌이 나는 경우가 있답니다. 

네이버 지도는 충돌이 않는다면 이럴땐 선택의 여지가 없이 네이버 지도를 사용해야 겠죠? 


이제 그때그때 상황따라 취향따라 지도를 골라서 넣어보세요~ 

Posted by KT한
,

먼저 젠킨스(허드슨)를 설치 하셨다는 가정하에 설명을 시작하겠습니다. 

젠킨스(Jenkins)와 허드슨(Hudson)은 이름만 바뀌었을 뿐 설정 및 기능은 거의 같습니다. 

만약 아직 설치 하지 않으셨다면 이전 포스팅을 참고하세요~ 


소스 자동 빌드 시스템 - 젠킨스(허드슨) 설치


Xcode와 같은 프로젝트에 활용하는 방법은 다음 포스팅을 참고하세요

소스 자동 빌드 시스템 - 젠킨스(허드슨) 플러그인 기능 활용 


추천은 저를 춤추게 합니다 ^^


1. 젠킨스 메인 페이지에 접속해봅시다

기본값은 서버 주소에 8080 포트로 접속하면 됩니다. (예: http://192.168.10.10:8080) 


2. 왼쪽 메뉴에서 "Manage Jenkins"를 선택합니다. 

 설정 메뉴가 나오면, "configure system"을 선택합니다. 

시스템의 기본 설정을 하기 위해서죠. 


3. 가장 먼저 작업 갯수를 설정 합니다. 

①에 있는 실행 갯수 만큼 좌측 메뉴에 작업 수가 늘어납니다. 

② enable security를 체크하면 유저 별로 권한 설정이 가능합니다. 

편의상 로그인한 유저라면 모든 설정이 가능하도록 했습니다. 


4. 좀 더 스크롤을 내려봅시다. 

요즘은 소스 관리에 주로 svn을 사용하죠.. 

① 버전이 기본은 1.4로 되어 있는걸 1.6으로 변경해줍니다. 

② 빌드가 깨졌을 때 연관된 사람들에게 메일을 보내주는 기능이 있습니다. 

신속한 대응을 위해서 유용하니 메일을 보낼 사람의 계정 정보를 넣어줍니다. 

(메일 수신인은 프로젝트 설정에서 합니다.)

설정이 끝났다면 저장합니다. 


5. 이제 프로젝트를 생성해봅시다. 

① New Job 을 클릭해봅시다. 

② 이름을 설정해주고..

③ 제일 무난한 free-style 프로젝트를 선택합니다. 

④ 만약 기존에 설정했던 설정을 템플릿 처럼 쓰고 싶다면 맨 아래 'copy existing job'을 선택하면 됩니다. 

입력 필드에 기존에 생성한 job 이름을 입력해줍시다. 

자동완성 기능을 지원하므로, 기존에 생성한 job 이름의 첫 글자만 기억하고 있으면 됩니다. 

(한글화 화면 - 브라우져의 언어에 따라 자동으로 선택됨)


6. 생성하면 자동으로 설정화면으로 넘어갑니다. 

① svn 정보를 넣어줍니다. 

② 최신 소스를 어떻게 관리할지 선택합니다. 

특별한 문제가 없다면 'svn update'를 하면 됩니다. 

하지만, 가끔 소스가 꼬이면 'Always check out a fresh copy'를 선택하면 기존 소스를 지우고

새로 받아서 다시 빌드를 시도합니다. 

알아두면 유용합니다. 

③ 만약 svn서버에 권한이 필요하다면 'enter credential' 링크를 클릭합니다. 

7. 위에서 자격 증명하기를 클릭하셨다면 이런 화면이 나옵니다. 

계정 정보와 비번을 입력해주면 됩니다. 


8. 좀 더 화면을 아래로 내려봅시다. 

① 주기적으로 소스를 가져다가 빌드를 수행하게 하려면 설정해줍니다. 

crontab을 생각하면 이해가 쉬울겁니다. 

② 빌드 단계를 추가해줍시다. 

③ 'Execute shell'을 선택하면 command를 입력할 수 있는 창이 뜨게 되고, 

순차적으로 진행할 명령들을 입력해줍니다. 

(명령창은 복수 개 등록 가능합니다. )

④ 빌드 성공 후 생성된 파일들을 어떻게 할지 설정해줍니다.  

⑤ 만약 빌드에 실패했을 때 담당자(개발자 혹은 QA-검증자)들에게 메일을 보내기 위해 사용합니다. 

수신인 메일 주소를 넣어주면 됩니다. 

⑥ 만약 컴파일을 실패할 때 마다 메일을 보내고 싶다면 체크해줍니다. 

빌드가 깨졌는데 이를 복구하지 못한 상태에서 

다른 사람들이 계속 소스 커밋을 하게 되면 폭탄메일을 받을 수 있으니 참고하세요. 

⑦ 빌드를 깨먹은 사람한테만 메일을 보내려면 이 옵션을 체크합니다. 

단, 메일 리스트에 입력해둔 사용자에게 보내는것과 별개로 동작하는 옵션입니다. 

메일 리스트에 아무도 입력하지 않고, 이 옵션만 체크해야만.. 

빌드가 깨졌을 때 실제로 소스를 커밋한 사람한테만 메일을 전송합니다. 


9. 사용자 계정 관리  

사용자 계정은 한가지만 조심하시면 됩니다. 

svn에 소스를 커밋한 계정을 보고 젠킨스가 자동으로 사용자 계정을 만들어 둡니다. 

때문에, svn과 동일한 계정으로 ID를 만들려고 하면 이미 존재하는 ID라고 오류가 발생하죠. 

이때는 관리자 계정으로 해당 계정의 설정 메뉴를 클릭하면 비번을 설정 할 수 있답니다. 


10. 이제 아래처럼 항상 햇님이 반짝 떠 있도록 관리만 잘 하시면 됩니다. 

① 특정한 순간에 수동으로 빌드를 시작하고 싶다면 '빌드 시작' 버튼을 누르면 됩니다. 

나머지 소소한 기능들은 차차 사용하면서 알아가면 될겁니다. ^^ 



※ 이 외에 세부설정은 hudson book을 참고하세요. 

book-hudson.pdf


  • 유용한 플러그인 배워보기

[프로그래밍] 젠킨스(Jenkins) 플러그인 활용 - Groovy Postbuild


Posted by KT한
,

지속적 통합관리(CI - Continuous Integration툴인 

젠킨스(구:허드슨)을 설치하는 방법에 대해 설명 드리겠습니다. 


2011년에 허드슨(Hudson)이 젠킨스(Jenkins)로 이름을 바꾸게 되었는데요. 

이는 오라클에서 Hudson이란 상표를 가지고 있어서 바뀌었다고 합니다. 


하지만, 이름만 바뀌었을 뿐 기능은 지속적으로 유지 및 향상 되어가고 있답니다. 

프로젝트의 안정적인 유지 관리를 위해서라도 이번 기회에 최신 버전으로 갈아타는것도 괜찮겠죠? 



※ 참고로 Fedora12에서 설치하였습니다.  



젠킨스 설정 방법에 대한 내용은 다음 포스팅을 참고하세요. 

소스 자동 빌드 관리 툴 - 젠킨스(허드슨) 설정 

추천은 저를 춤추게 합니다 ^^



1. 젠킨스(Jenkins) 다운 및 설치


- 향후 젠킨스(Jenkins)를 패치할 상황을 대비해서.. 

조금 번거롭더라도 yu리포지터리(repository)를 추가해 주도록 합니다. 


(YUM에 대해서 잘 모르시는 분은.. 온라인 업데이트 정도로 생각하시면 될것 같네요. )


# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key


- 정상적으로 추가했다면 yum으로 젠킨스를 설치합니다. 


# yum install jenkins


- 만약 젠킨스의 업데이트 정보를 정상적으로 받아오지 못한다면,  yum db를 한번 지워주세요. 


# yum clean all && yum install jenkins


-정상적으로 설치 되었는지 확인해봅니다.  


#  rpm -qa | grep jenkins
jenkins-1.457-1.1.noarch



2. 젠킨스를 실행하기 위해 필요한 java 설치


- 역시 yum으로 설치 해줍니다. 

(한번에 정상적으로 설치가 안되는 경우가 있습니다.  이럴 때는 한 번 더 실행해 줍니다. )


# yum install java


- 다음과 같은 파일들이 설치 되어야 합니다. 


Installed:

  java-1.5.0-gcj.x86_64 0:1.5.0.0-29.fc12 

  java-1.6.0-openjdk.x86_64 1:1.6.0.0-43.1.8.3.fc12


Dependency Installed:

  gmp.x86_64 0:4.3.1-5.fc12  java_cup.noarch 1:0.11a-1.fc12  jpackage-utils.noarch 0:1.7.5-3.8.fc12  

  libgcj.x86_64 0:4.4.4-10.fc12    sinjdoc.x86_64 0:0.5-9.fc12giflib.x86_64 0:4.1.6-3.fc12  

  jline.noarch 0:0.9.94-0.6.fc12  rhino.noarch 0:1.7-0.7.r2.fc12   tzdata-java.noarch 0:2010o-1.fc12  



3. 실행하기


- 정상적으로 설치 됐다면 간단하게 실행 가능합니다.


# service jenkins start


- 실행 결과:


Starting Jenkins                                           [  OK  ]




4. 접속하기


- 브라우져의 주소창에 서버 주소와 기본포트인 8080을 입력합니다. 


http://server주소:8080/


- 정상적으로 실행 된다면 이런 화면이 뜨게 됩니다. 

짜릿한 기분을 느낄 수 있는 순간이기도 하죠. ^ㅡ^




5. 잘 활용하기 


- 이제, 관리해야할 subversion 정보를 등록하고 자동으로 빌드를 수행하도록 하면 됩니다. 


  • 유용한 플러그인 배워보기

[프로그래밍] 젠킨스(Jenkins) 플러그인 활용 - Groovy Postbuild




Posted by KT한
,
애플의 아이폰은 
디자인 뿐 아니라 기능도 다양해서 많은 사랑을 받고 있는 제품이죠

그런데.. 한 가지 큰 단점이 있습니다. 
 AS 서비스가 우리가 기대했던 것과 너무나 다릅니다. 

버튼만 고장나도 어마어마한 수리비를 요구합니다. 

모든 전자제품은 오랜 시간 사용하다 보면 
이유없이 고장이 나기 때문에 
이런 문제를 어떻게 대처하느냐.. 그것이 문제입니다!!


추천은 저를 춤추게 합니다 ^^



애플의 리퍼 서비스를 활용해봅시다! 


애플의 AS서비스는 흔히 리퍼 서비스라고 하는데요..
내 휴대폰을 고쳐주는게 아니라
남의 고장난 휴대폰을 가져다가 수리해서 내 고장난 휴대폰과 바꿔 주는 거죠..

좋은점은.. 
액정, 배터리와 같은 소모품은 새걸로 해준다는 겁니다!! 
와우~
이러면 얘기가 다르죠?

아이폰을 구매 후 1년 이내에는 
파손이 아니면 리퍼 제품으로 교환하는 AS를 받을 수 있다는 겁니다!


그럼 이제 남은 건..
어떻게 리퍼로 교환받느냐...

이 문제는 참 쉽습니다.

먼저 애플 전문 AS센터인 UBASE를 찾아갑니다. 


 
 
참고로, 아이폰과 맥북 등 제품별 전문 AS매장이 있기 때문에 UBASE라고 해서 무조건 찾아가지 말고 미리 알아보고 가는게 좋습니다. 
자칫 헛걸음 하는 수가 있습니다. 


위치는 애플 홈 페이지에서 확인 가능합니다.

공식 서비스 센터 검색

 
 
AS상담원이 무슨 일로 왔냐고
 물어보면 
다음 두 가지 중 한 가지를 얘기하면 쉽게 교환해줍니다. 
 

1. 홈 버튼(아래쪽 동그란 버튼)이 잘 안눌릴 때가 있습니다. 
2. 배터리가 수명이 너무 짧아서 사용하기 불편합니다. 

그럼 AS 상담원은 잠시 검사(침수 테스트)를 한 후 깨끗한 리퍼 제품을 가지고 나올겁니다. 

참고로, 내 휴대폰에서 배터리만 교체 하는것도 가능합니다. 
하지만.. 홈 버튼 수명이 생각보다 짧기 때문에.. 
개인적으로는.. 리퍼 교환을 추천합니다 ^^

축하합니다! 
이제 아이폰을 처음 샀을 때의 기분으로 
룰루랄라 거리며 사용하면 됩니다. ^^ 

마지막으로, 리퍼를 받으실 거라면 
데이터 백업은 필수입니다~ ^^ 

"소 잃고 외양간 고치지 맙시다!"

Posted by KT한
,
시작하면서..

스노트는 HTTP 패킷에 대해..
패킷 전체가 아닌 특정 필드값에서 패턴을 찾는 작업을 지원한다.
이는 오탐을 줄이는 동시에 성능을 향상시켜주는 효과가 있다.

스노트 사용에 어느정도 자신감이 생겼다면..
이 옵션을 사용하는 것을 강력히 추천한다.

기본적인 사용법은 메뉴얼을 보면 되겠지만
HTTP 패킷을 분석하는 일에 친숙하지 않은 사람들을 위해..
각 옵션들이 가리키는 필드에 대해 자세하게 알아보도록 하자.


추천은 저를 춤추게 합니다 ^^




먼저, HTTP관련 매칭 옵션들은 크게 다음 7가지가 있다.
이 옵션들은 'content'라는 패턴 매칭 옵션과 함께 사용해야 한다.

1. http_method
-HTTP 패킷의 method값을 저장하고 있다.
그러므로, 다른 옵션들과 비교해서 패킷의 가장 앞 부분을 가리킨다.

2. http_uri (http_raw_uri)
-HTTP 패킷의 uri값을 저장하고 있다.
'uricontent'옵션을 사용하는 것과 동일하다.
'raw'는 normalized(디코딩, 정규화)한 값과 하지 않은 값의 차이이다.   
(당연히 'raw'가 붙은것이 하지 않은 값이다.) 

참고로, 'http_uri'와 'rawbytes'옵션을 함께 사용하면 'http_raw_uri'와 동일하다고 생각하기 쉽지만..
이런 조합은 허용되지 않는다.

content + http_uri = uricontent (O)
content + http_uri + rawbytes  ≠ http_raw_uri  (X)
uricontent + rawbytes  ≠ http_raw_uri  (X)



 3. http_header (http_raw_header)
- HTTP 패킷의 header값을  저장하고 있다. 
request와 response에 모두 사용하는 옵션이다.
'raw'의 의미는 'http_raw_uri'와 동일하다.

4. http_cookie (http_raw_cookie)
- HTTP 패킷의 cookie값을  저장하고 있다. 
'raw'의 의미는 'http_raw_uri'와 동일하다.

5. http_client_body
- HTTP 패킷의 body값을  저장하고 있다. 
참고로, GET패킷에는 body가 없다. 
아래 예제에서 POST패킷에만 HTTP body를 가리키는 색이 칠해져 있는 이유이다. 


 사용전 확인사항 
snort.conf 파일에
'post_depth 0'을 반드시 지정해 주어야한다. (0은 body전체를 extract한다는 의미)
default 값이 -1인데 이는 body를 extract하지 않는 다는 의미이기 때문이다.
참고로, 이 값은 이전 버전의 snort와는 다를 수 있다. 

preprocessor http_inspect_server: server default \
    profile all ports { 80 8080 8180 } \
    post_depth 0 



6.
http_stat_code
- HTTP response의 status code 필드 값을  저장하고 있다.
코드 값에 대한 내용은 이 사이트를 참고하세요. 

※사용전 확인사항 
snort.conf 파일에
'extended_response_inspection'을 반드시 지정해 주어야한다 

preprocessor http_inspect_server: server default \
    profile all ports { 80 8080 8180 } \
    extended_response_inspection 


7. http_stat_msg
- HTTP response의 status message 필드값을  저장하고 있다. 
기본적인 설정 및 사용법은 'http_stat_code'와 동일하다. 


실제 패킷 예제를 통해 확실히 이해하자!
위에서 설명한 각 옵션들이 저장하고 있는 필드값을 각각에 맞는 색상으로 표시해 두었다. 


1. client request 패킷 (GET)

0000   47 45 54 20 2f 63 63 3f 61 3d 74 6f 70 2e 6c 6f  GET /cc?a=top.lo
0010   67 6f 26 72 3d 26 69 3d 37 38 30 30 30 43 30 31  go&r=&i=78000C01
0020   5f 30 30 30 30 30 30 30 37 32 31 46 37 26 6e 73  _0000000721F7&ns
0030   63 3d 6e 61 76 65 72 74 6f 70 2e 76 33 26 77 3d  c=navertop.v3&w=
0040   31 31 31 37 26 70 78 3d 33 32 38 26 70 79 3d 39  1117&px=328&py=9
0050   38 26 73 78 3d 33 32 38 26 73 79 3d 39 38 26 6d  8&sx=328&sy=98&m
0060   3d 31 26 75 3d 68 74 74 70 25 33 41 25 32 46 25  =1&u=http%3A%2F%
0070   32 46 77 77 77 2e 6e 61 76 65 72 2e 63 6f 6d 25  2Fwww.naver.com%
0080   32 46 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73  2F HTTP/1.1..Hos
0090   74 3a 20 63 63 2e 6e 61 76 65 72 2e 63 6f 6d 0d  t: cc.naver.com.
00a0   0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65 65  .Connection: kee
00b0   70 2d 61 6c 69 76 65 0d 0a 55 73 65 72 2d 41 67  p-alive..User-Ag
00c0   65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30  ent: Mozilla/5.0
00d0   20 28 57 69 6e 64 6f 77 73 20 4e 54 20 36 2e 31   (Windows NT 6.1
00e0   29 20 41 70 70 6c 65 57 65 62 4b 69 74 2f 35 33  ) AppleWebKit/53
00f0   35 2e 37 20 28 4b 48 54 4d 4c 2c 20 6c 69 6b 65  5.7 (KHTML, like
0100   20 47 65 63 6b 6f 29 20 43 68 72 6f 6d 65 2f 31   Gecko) Chrome/1
0110   36 2e 30 2e 39 31 32 2e 37 37 20 53 61 66 61 72  6.0.912.77 Safar
0120   69 2f 35 33 35 2e 37 0d 0a 41 63 63 65 70 74 3a  i/535.7..Accept:
0130   20 74 65 78 74 2f 68 74 6d 6c 2c 61 70 70 6c 69   text/html,appli
0140   63 61 74 69 6f 6e 2f 78 68 74 6d 6c 2b 78 6d 6c  cation/xhtml+xml
0150   2c 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 6d 6c  ,application/xml
0160   3b 71 3d 30 2e 39 2c 2a 2f 2a 3b 71 3d 30 2e 38  ;q=0.9,*/*;q=0.8
0170   0d 0a 52 65 66 65 72 65 72 3a 20 68 74 74 70 3a  ..Referer: http:
0180   2f 2f 77 77 77 2e 6e 61 76 65 72 2e 63 6f 6d 2f  //www.naver.com/
0190   0d 0a 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e  ..Accept-Encodin
01a0   67 3a 20 67 7a 69 70 2c 64 65 66 6c 61 74 65 2c  g: gzip,deflate,
01b0   73 64 63 68 0d 0a 41 63 63 65 70 74 2d 4c 61 6e  sdch..Accept-Lan
01c0   67 75 61 67 65 3a 20 65 6e 2d 55 53 2c 65 6e 3b  guage: en-US,en;
01d0   71 3d 30 2e 38 0d 0a 41 63 63 65 70 74 2d 43 68  q=0.8..Accept-Ch
01e0   61 72 73 65 74 3a 20 49 53 4f 2d 38 38 35 39 2d  arset: ISO-8859-
01f0   31 2c 75 74 66 2d 38 3b 71 3d 30 2e 37 2c 2a 3b  1,utf-8;q=0.7,*;
0200   71 3d 30 2e 33 0d 0a 43 6f 6f 6b 69 65 3a 20 4e  q=0.3..Cookie: N
0210   42 3d 47 49 33 44 43 4e 52 57 47 4d 33 54 41 4e  B=GI3DCNRWGM3TAN
0220   5a 52 3b 20 4e 4e 42 3d 5a 49 45 35 41 4a 35 4b  ZR; NNB=ZIE5AJ5K
0230   55 56 4f 55 34 3b 20 6e 70 69 63 3d 22 37 4d 58  UVOU4; npic="7MX
0240   49 78 4b 75 71 49 52 77 37 4f 69 47 61 53 2f 39  IxKuqIRw7OiGaS/9
0250   37 6e 6a 53 37 52 33 39 31 55 42 43 4e 49 63 2b  7njS7R391UBCNIc+
0260   2f 67 42 71 68 31 47 63 32 48 68 58 73 66 4e 65  /gBqh1Gc2HhXsfNe
0270   42 63 78 35 54 67 45 66 63 71 36 71 6b 43 41 3d  Bcx5TgEfcq6qkCA=
0280   3d 22 3b 20 6e 73 72 5f 61 63 6c 3d 31 3b 20 44  ="; nsr_acl=1; D
0290   41 5f 48 43 3d 4c 5a 31 31 36 38 30 35 38 30 2c  A_HC=LZ11680580,
02a0   4c 41 0d 0a 0d 0a                                LA....




2. Client Request 패킷 (POST)

0000   50 4f 53 54 20 2f 65 6e 67 69 6e 65 5f 70 72 6f  POST /engine_pro

0010   63 6f 6e 2e 6a 73 70 3f 70 72 6f 6d 6f 74 69 6f  con.jsp?promotio

0020   6e 33 20 48 54 54 50 2f 31 2e 31 0d 0a 52 65 66  n3 HTTP/1.1..Ref

0030   65 72 65 72 3a 20 2f 65 6e 67 69 6e 65 5f 70 72  erer: /engine_pr

0040   6f 63 6f 6e 2e 6a 73 70 3f 70 72 6f 6d 6f 74 69  ocon.jsp?promoti

0050   6f 6e 33 0d 0a 41 63 63 65 70 74 3a 20 74 65 78  on3..Accept: tex

0060   74 2f 2a 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 70  t/*..Content-Typ

0070   65 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  e: application/x

0080   2d 77 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63  -www-form-urlenc

0090   6f 64 65 64 0d 0a 55 73 65 72 2d 41 67 65 6e 74  oded..User-Agent

00a0   3a 20 4d 65 6c 4f 6e 20 50 6c 61 79 65 72 20 56  : MelOn Player V

00b0   33 2e 30 0d 0a 48 6f 73 74 3a 20 61 70 70 73 76  3.0..Host: appsv

00c0   72 2e 6d 65 6c 6f 6e 2e 63 6f 6d 0d 0a 43 6f 6e  r.melon.com..Con

00d0   74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 33 32 0d  tent-Length: 32.

00e0   0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20  .Cache-Control:

00f0   6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6f 6b 69 65  no-cache..Cookie

0100   3a 20 57 4d 4f 4e 49 44 3d 56 32 64 2d 67 7a 36  : WMONID=V2d-gz6

0110   4e 31 47 2d 3b 20 4a 53 45 53 53 49 4f 4e 49 44  N1G-; JSESSIONID

0120   3d 4d 47 71 51 50 37 7a 30 70 34 79 33 35 59 78  =MGqQP7z0p4y35Yx

0130   4e 32 7a 4a 59 63 56 64 71 6b 59 37 4e 33 34 6e  N2zJYcVdqkY7N34n

0140   38 6e 54 76 59 36 34 58 4c 4a 53 54 47 58 76 58  8nTvY64XLJSTGXvX

0150   71 79 7a 78 4b 21 34 30 39 33 32 32 33 32 34 3b  qyzxK!409322324;

0160   20 58 54 56 49 44 3d 31 30 30 37 32 31 31 37 30   XTVID=100721170

0170   34 31 36 35 35 39 37 39 34 33 39 3b 20 58 54 4c  41655979439; XTL

0180   49 44 3d 31 36 37 33 34 31 33 30 0d 0a 0d 0a 74  ID=16734130....t

0190   72 65 65 70 6f 6c 65 0b 31 36 37 33 34 31 33 30  reepole.16734130

01a0   2a 31 32 37 39 36 39 39 34 35 36 35 35 36 0b     *1279699456556.

 

3. Server Response 패킷 
 

주의할 점은 header의 시작 지점이 status 메시지 직후에 오는 hex값 '0d 0a'를 포함한다는 것이다.
offset, depth와 같은 옵션을 함께 사용할꺼라면 반드시 기억해야 한다.

0000   48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d  HTTP/1.1 200 OK.

0010   0a 44 61 74 65 3a 20 57 65 64 2c 20 32 31 20 4a  .Date: Wed, 21 J

0020   75 6c 20 32 30 31 30 20 30 38 3a 30 33 3a 35 33  ul 2010 08:03:53

0030   20 47 4d 54 0d 0a 53 65 72 76 65 72 3a 20 41 70   GMT..Server: Ap

0040   61 63 68 65 0d 0a 4c 61 73 74 2d 4d 6f 64 69 66  ache..Last-Modif

0050   69 65 64 3a 20 4d 6f 6e 2c 20 31 39 20 4a 75 6c  ied: Mon, 19 Jul

0060   20 32 30 31 30 20 31 31 3a 33 33 3a 32 35 20 47   2010 11:33:25 G

0070   4d 54 0d 0a 45 54 61 67 3a 20 22 31 34 38 61 63  MT..ETag: "148ac

0080   30 2d 64 32 2d 34 38 62 62 62 65 66 63 61 34 62  0-d2-48bbbefca4b

0090   34 30 22 0d 0a 41 63 63 65 70 74 2d 52 61 6e 67  40"..Accept-Rang

00a0   65 73 3a 20 62 79 74 65 73 0d 0a 43 6f 6e 74 65  es: bytes..Conte

00b0   6e 74 2d 4c 65 6e 67 74 68 3a 20 32 31 30 0d 0a  nt-Length: 210..

00c0   43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 65  Content-Type: te

00d0   78 74 2f 70 6c 61 69 6e 0d 0a 0d 0a              xt/plain....


Posted by KT한
,

Boyer-moore 문자열 탐색 알고리즘은 Robert S. Boyer와 J Strother Moore에 의해 1977년에 개발되었다. 

알고리즘의 컨셉은 패턴을 뒤에서부터 비교하여 탐지하는 것이 특징이다. 


Boyer-moore 알고리즘은 크게 다음 두 가지 방식의 탐지 방식을 사용하고 있다.

두 가지 방식 중 더 큰 값만큼 이동하면서 패턴 매칭을 시도하게 된다. 


1. bad character method 

주로, 문자열이 매칭되지 않았을 때 많이 이동 할 수 있는 알고리즘. 
character set인 256만큼의 배열을 잡아서 패턴 길이 값으로 초기화를 시켜준다. 

이후 패턴의 앞 부터 한자씩 읽어 가면서 해당 배열값에 마지막 글자까지의 값으로 설정
예를 들면, 아래 문장의 가장 처음 'A'의 경우, 'A'는 10진수 65이다. 
그러므로, 배열의 65번째 값에 'A'와 패턴의 끝인 'N' 와 7글자 떨어져 있으므로 7을 넣어준다. 
이와 같은 방식으로 A->N->P->A->N->M->A를 처리한다. 만약, 동일한 문자가 나오면 마지막 글자와 가까운 위치에 탐지를 해야할 문자가 있는 것이므로 해당 값을 덮어쓰게 된다.  (마지막 글자 N은 떨어진 거리가 0이므로 제외)
그 결과 아래 표와 같은 결과를 얻을 수 있다. 

예) ANPANMAN 

CharacterShift
A 1
M 2
N 3
P 5
all other characters 8

2. good-sufix method 
주로, 문자열이 매칭된 경우 많이 이동할 수 있는 알고리즘. 
입력받은 패턴을 가지고 최대 이동 값을 미리 계산해둔다. (문자열 길이만큼의 배열)

최대 이동값을 계산하는 방식은 아래 표와 같다.  

i는 현재 패턴을 매칭하기까지 매칭에 성공한 문자 개수이다. 
pattern에서 취소선이 그어져 있다면, 해당 문자는 매칭이 되지 않음을 의미한다. 
Left shift는 왼쪽으로 얼마만큼 이동할지를 의미한다. 
(최종적으로 배열에는 i + left shift 값으로 설정해주게 된다. )

예) ANPANMAN 

iPatternLeft Shift
0 N
오른쪽 끝 문자가 N이 아닌 문자만큼 왼쪽으로 이동.
오른쪽 두번째 문자가 A이므로, 한 칸 이동한다. (만약 'ANPANMNN'이라면 두 칸 이동하게 된다. ) 
1
1 AN AN 은 ANPANMAN에 더이상 나오지 않는다. 때문에, 패턴 길이 만큼 이동하게 된다.
8
2 MAN
 MAN 은 ANPANMAN  패턴에서 세칸 이동하면 찾을 수 있다.  
3
3 NMAN
 'NMAN' 은  'ANPANMAN' 에 더이상 나오지 않는다. 
하지만,  'NMAN' 은 6 칸 이동하면 또 나타난다.  
('NMANPANMAN')  = 6
4 ANMAN
'ANMAN'은 더이상 나오지 않는다. 하지만,'ANMAN' 은 6 칸 이동하면 나타난다.   
('ANMANPANMAN') = 6
5 PANMAN
'PANMAN'은 더이상 나오지 않는다. 하지만, ' PANMAN' 은 6 칸 이동하면 나타난다.    
('PANMANPANMAN')  = 6
6 NPANMAN
'NPANMAN'은 더이상 나오지 않는다. 하지만, ' NPANMAN' 은 6 칸 이동하면 나타난다.     
('NPANMANPANMAN')  = 6
7 ANPANMAN
'ANPANMAN'은 더이상 나오지 않는다. 하지만, ' ANPANMAN' 은 6 칸 이동하면 나타난다.      
('ANPANMANPANMAN')  = 6


  • 탐지 예제

 순번

 M

P

 1

A

       
 2  

 A

A       
 3    


- 순번 1: 패턴의 뒤에서부터 매칭을 시도 하면 문자열 ‘A’와 패턴 ‘N’이 같지 않으므로 이동을 해야 한다. bad-character method 와 good-suffix method모두 이동 값이 1 이므로 1칸만 이동.

- 순번 2: 뒤에서 ‘AN’이 매칭되었으므로, bad-character method에 의해 ‘P’의 이동 값이 5에서 ‘AN’ 두 문자만큼의 값을 뺀 3만큼 이동하게 된다. Good-suffix method에 의해서도 i가 2일 때 값이 3이므로 3만큼 이동하여 다시 매칭을 시도한다. 
- 순번 3: 원하는 문자열을 찾았다. 


Posted by KT한
,
정규표현식에 대해 생소한 분들은 초/중급 포스팅을 참고하세요. 
정규표현식 초급정규표현식 중급 


 여기서는 자주 사용되지는 않지만..
잘 알고 사용하면 여러가지로 유용한 내용들에 대해 다뤄보고자 합니다.

1. 단어 경계 - \b, \B 
 매칭하고자 하는 패턴의 단어 경계를 지정하는데 사용. 

단어의 경계를 찾는 '
\b'옵션을 사용하면
문자열 중 일부에만 매칭되는 경우는 제외하게 된다. 
====================================
  
표현식  \bart\b
  
문자열  The art of music part of artist
==================================== 

'
\B' 는  '\b'와 반대의 의미로 사용된다. 


2. 비 캡처 그룹 - (?: )
그룹화 기호를 사용해서 매칭을 시도할 경우 
매칭되는 내용은 캡처되어 추후에 재사용 할 수 있도록 한다. 

하지만, 재사용할 일이 없을 경우 
비 캡처 그룹으로 표현해주므로써 캡처 그룹에서 제외시키고,
적지만 성능 향상도 기대할 수 있다. 
====================================
  
표현식  (?:one|two|three)
==================================== 


3. 명명 재참조 - (?P<name>) , (?<name>)혹은 (?'name') 
특정한 패턴을 캡처한 후 이를 사용하기 편하도록 이름을 지어준 후
그 이름으로 캡처된 패턴을 불러다 사용.

캡처된 값들에 이름을 지정해주므로써 보는 사람 관점에서도 이해하기 쉽도록 도와주고, 
특정 위치의 값을 저장해두었다가 다른 위치에서 동일한 값이 나오는지 확인 하는데 유용함.

방식은 크게 세가지가 지원되며, 버전에 따라 지원되지 않는 것도 있을 수 있다. 
값을 캡처하고 명명 할 때와 이를 호출해서 사용 하는 방법은 다음과 같다. 

     명명              =>                 호출 
(?P<name>)        =>              (?P=name)     
(?<name>)
          =>             \k<name>
(?'name')            =>              \k'name'


 
====================================
  
표현식1  (?P<hour>\d\d):(?P<min>\d\d)-(?P=hour)-(?P=min)
  표현식2  (?<hour>\d\d):(?<min>\d\d)-\k<hour>-\k<min>
  표현식3  
(?'hour'\d\d):(?'min'\d\d)-\k'hour'-\k'min'

  
문자열  17:53-17-53
==================================== 


4. 주석 처리 - (?# ) 혹은 (?#>     <)

정규표현식에 설명을 추가하고 싶을 때 사용.
자칫 잘못 사용하면 복잡도가 증가하여 오히려 역효과를 불러 일이킬 수 있다. 

 
====================================
  
표현식  (?#year)\d{4}-(?#mon)\d{2}-(?#day)\d{2}
 

====================================
Posted by KT한
,
스노트에서 고급 옵션이라고 볼 수 있는...
byte 관련 keyword에 대해 알아봅시다.

※ 이 글은 snort-2.9.1 버전을 기준으로 작성되었습니다. 

먼저, 이런 옵션들을 언제 왜 사용할까요?
일반적인 패킷에서 특정 패턴을 비교하는 것 만으로는 탐지 할 수 없는게 존재합니다. 

예를 들면, RPC 와 같은 프로토콜의 패킷을 처리할 때 요긴합니다. 
이런 패킷은 특정 위치에 버전, 타입과 같은 값을 넘겨 주기 때문에... 
그 특정 위치가 어딘지만 안다면 정확한 검증이 가능합니다. 

1. byte_test
특정 위치의 값을 비교/확인 하는데 사용. 

① 기본 포맷 
 

byte_test:<변환할 bytes>, [!]<연산자>, <비교할 값>, <offset> [, relative][, <endian>][, string, <숫자 형식>][, dce];


시작 위치부터 4개의 값(offset까지)은 필수 항목이다. 
순서 또한 고정되어 있으므로 위치를 헷갈리지 않도록 주의 해야한다.


② 옵션 항목 설명 
 
변환할 bytes: 몇 바이트의 패킷을 변환할지 지정
연산자: 변환한 값과 비교할 값을 비교할 때 사용할 연산자 
비교할 값: 변환된 값과 비교할 값
offset: 페이로드에서 변환할 바이트만큼 선택 할 시작위치 
relative: 마지막 패턴 매칭이 성공한 위치를 시작위치로 지정
즉, content와 같은 옵션과 같이 사용 할 경우, 패턴 매칭에 성공한 위치를 offset의 시작위치로 설정 

endian: 변환할 바이트 값의 endian 정보를 지정

▷참고: big endian 컴퓨터에서는 16진수 "4F52"를 저장공간에 "4F52"라고 저장 (만약 4F가 1000번지에 저장되었다면, 52는 1001번지에 저장될 것이다). 반면에, little endian 시스템에서 이것은 "524F"와 같이 저장.


string: 패킷에 문자열 포맷으로 되어있다고 지정
 

▷이는 글로 설명하기 쉽지 않으니 아래 예제를 참고하자. 

숫자 형식: 'string'와 함께 사용하며, 
문자열 포맷의 데이터의 숫자 형식을 지정 

dce: DCE/RPC preprocessor와 관련된 옵션으로 숫자의 endian을 결정하기 위해 사용. 
DEC/RPC preprocessor를 수행한 결과 endian이 무엇인지 알고있다. 


③ 옵션 유효값 
 
bytes : 1 ~ 10
연산자 : 부등호( <, =, >)  또는 bitwise값 (&, ^)
비교할 값 : 0 ~ 4294967295
offset : -65535 ~ 65535

endian : big 또는 little
숫자 형식 : hex, dec, oct


 예제 

만약 패킷이 다음과 같다고 하면..


00 00 00 00 00 00 00 06 73 79 73 74 65 6d 33 00 ........system3.



이 패킷을 탐지하는 시그니처는 다음처럼 작성 할 수 있다. 

⑴ byte_test: 1, =, 3, 14, string ; 
- 패킷의 14번째에 있는 1바이트 값이 3과 같은지 비교. 
   위 패킷에서 14번째 바이트는 33이다.
   ('6d'가 아님을 기억하세요!!  offset이 '0'이면 맨 처음 값을 사용한다!) 
  이 값을 10진수 string으로 처리한다고 했으니.. 결국 비교할 값은 '3'이 된다. 
 

⑵ byte_test: 1, =, 51, 14 , dec; 
- 패킷의 14번째에 있는 1바이트 값이 51과 같은지 비교
  33은 10진수로 51이므로.. 결국 비교할 값은 '51'이 된다.  
 

⑶ content:"system"; byte_test: 1, =, 51, 0, relative, dec ; 
- 'system'이라는 문자열을 찾고... 
   매칭이 이루어진 곳에서 0만큼 떨어진 곳의 1바이트 값이 51인지 비교한다. 
   relative 옵션을 썼다는것 빼고는 위의 예제와 동일하므로.. 이해하기 그리 어렵지 않다. 
   
 
⑷ content:"system"; byte_test: 1, =, 0x03, 0, relative, string, hex; 
- 위의 예제들을 모두 이해했다면.. 길기만 하지 별로 복잡하지 않다는 것을 알것이다. 
   다만 값을 string으로 처리해서 hex값으로 비교한다. 

 byte_test:1, &, 16, 14; 
- 패킷의 14번째에 있는 1바이트 값과 16을 비트 AND 연산을 한다.
   14번째 바이트 값(hex값 33)과 16을 2진수로 전환해서 비트 연산을 해보면.. 

   00 11 00 11 (16진수 33)
   00 01 00 00 (10진수 16)
& -----------------
   00 01 00 00   => 16 

  이와 같은 연산에 의해서 이 시그니처는 탐지가 된다. 


2. byte_jump
특정 위치의 값 만큼 탐지(매칭) 포인터를 이동/점프 하고자 할때 사용. 

① 기본 포맷 

 

byte_jump:<변환할 bytes>, <offset>
[, relative][, multiplier <mult_value>][, <endian>][, string, <숫자 형식>][, align][, from_beginning][, post_offset <adjustment value>][, dce];


시작 위치부터 2개의 값(offset까지)은 필수
 항목이다. 

순서 또한 고정되어 있으므로 위치를 헷갈리지 않도록 주의 해야한다.
 
 
② 옵션 항목 설명 

변환할 bytes: 몇 바이트의 패킷을 변환할지 지정
offset: 페이로드에서 변환할 바이트만큼 선택 할 시작위치 
relative마지막 패턴 매칭이 성공한 위치를 시작위치로 지정
multiplier <값>:  변환할 bytes 값에 곱해서 그 값만큼 jump하고자 할 때 사용
endian: 변환할 바이트 값의 endian 정보를 지정
string: 패킷에 문자열 포맷으로 되어있다고 지정
align: 변환할 bytes값을 32bit(4바이트) 단위로 반올림해서 처리  
RPC와 같은 트래픽은 32bit 단위로 사용되므로.. 이런 트래픽을 처리할 때 용의

예) jump할 bytes값이 9bytes로 나왔을 경우,
32bit 단위로 반올림하게 되면 12bytes가 된다. 
align 옵션을 사용했다면.. 비록 결과는 9였지만, 12bytes 만큼 jump하게 된다.

from_beginning: 현재 위치에서가 아닌 패킷의 시작 위치에서 jump
 값을 계산하는 것과 별개로 jump할 때만 사용됨 

post_offset <값>:  jump한 이후에 다음 매칭을 시도할 위치를 여기서 설정한 값 만큼 이동.
소스를 보신 분들이라면..
doe_ptr (
detection offset pointer)에 여기서 설정한 값을 더해준다고 하면 이해가 더 쉬울겁니다.

예) 다음 두 시그니처는 동일한 동작을 수행한다.  
1) content:"MM"; byte_jump:3,0,relative, post_offset 2; content:"AA";distance:0;
2) content:"MM"; byte_jump:3,0,relative; content:"AA"; distance:2;
 
dce: DCE/RPC preprocessor와 관련된 옵션으로 숫자의 endian을 결정하기 위해 사용. 
 

③ 옵션 유효값 
bytes : 1 ~ 10
offset : -65535 ~ 65535
mult_value : 0 ~ 65535
post_offset : -65535 ~ 65535
 

 예제 
 
 
⑴ content:"|00 00 00 01|"; byte_jump:4, 12, relative, align;
- 패턴 매칭이 이루어진 값 부터 12번째 부터 15번째(12번째 부터 4개) 까지의 bytes값 만큼 jump
만약 값이 4의 배수가 아니라면 반올림해서 그 값만큼 jump 
 
 

2. byte_extract 
특정 위치의 값을 변수로 저장.
값을 저장한 변수는 다음 옵션들에서 사용 가능.

ⓐ content/uricontent의 offset,depth,distance,within 값
ⓑ byte_test의 offset,value 값
ⓒ byte_jump의 offset 값
ⓓ  isdataat의 offset 값

① 기본 포맷 

byte_extract:<bytes_to_extract>, <offset>, <name> [, relative][, multiplier <multiplier value>][, <endian>][, string, <숫자 형식>][, align <align value>][, dce]


시작 위치부터 3개의 값(name까지)은 필수
 항목이다. 

순서 또한 고정되어 있으므로 위치를 헷갈리지 않도록 주의 해야한다.

② 옵션 항목 설명
(byte_test나 byte_jump에서 동일하게 사용되는 옵션 생략)

name:
발췌한 값을 저장한 변수 명
align <값>:  발췌한 값을 특정 bytes 단위로 반올림 하고자 할 때 사용. 


③ 옵션 유효값 
 
bytes : 1 ~ 10
offset : -65535 ~ 65535
mult_value : 0 ~ 65535
 
 
 예제 

 ⑴ byte_extract:1, 0, str_offset; content:"bad stuff"; offset:str_offset;
-  패킷의 시작위치에서 1바이트에 있는 값 만큼 떨어진 곳에서 "bad stuff" 문자열을 찾는다. 
 

Posted by KT한
,
  • Snort-2.9.1 버전에 대해..
대표적인 IDS/IPS 오픈소스인 스노트가 2.9.xx 버전이 나온지도 한참 지났네요.
2.8.xx 버전과 비교해서 많은 기능이 추가되었고, 수 많은 버그 또한 수정 되었지요. 
(물론, 모든 버그가 수정된건 아니겠지만..)

어쨌든.. 
지속적으로 추가되는 기능들 때문에.. 
처음 접하는 사람들에게는 조금 부담 스러울 수도 있을 정도로 복잡해져 가는것 같습니다. 

설치 과정부터 사용법까지 차근차근 포스팅 해보려고 합니다. 


혹시 몰라 페도라 17에 snort 설치 하는 법에 대한 영문 매뉴얼을 첨부했으니 필요하신분은 참고하세요.
  • 설치 과정
먼저, 사전에 설치 해야할 rpm 들이 있습니다. 'rpm.pbone.net' 혹은 구글링을 통해 다운 받아둡니다. 
'# rpm -i <패키지 이름>' 으로 설치 합니다. 
libpcap
libpcap-devel
pcre
pcre-devel
libdnet
libdnet-devel 


1.  daq 다운 

우선 아래 홈페이지에 접속해서 snort와 필수 유틸인 daq를 다운 받아야 합니다. 


스노트(snort) 공식 홈페이지 

rpm을 받으셔도 되고 tar로 묶인 소스 파일을 받으셔도 됩니다.


2. daq를 설치


1) tar파일을 받으셨다면..
압축을 풀어주시고..
README 파일에 나와있는 설치 순서에 따라 실행해주면 됩니다. 


   # ./configure

   # make

   # sudo make install


2) rpm을 받으셨다면 rpm명령으로 설치하시면 됩니다. 

# rpm -ivh daq-*.rpm 

이 과정에서 libpcap(버전 1.0.0 이상) 이나 
다른 필요 항목들이 설치되어 있는지 확인하는 과정을 거치게 됩니다.  

daq는 패킷을 처리하기 위한 필수 유틸로
이를 설치하지 않으면 snort가 정상적으로 설치되지 않습니다. 

(2.8.xx 버전에는 없었으나.. 2.9.xx에서 추가된 기능 같더군요. )


3. snort 설치


snort 홈페이지에서 tar확장자로 압축된 snort 파일을 다운 받아 압축을 풀고..
 
snort-2.9.1/doc/INSTALL 파일에 나와있는 설치 순서에 따라 실행해주면 됩니다.


1) 이전 버전의 snort가 설치되어 있다면.. 이를 제거해줘야 겠죠?

# sudo make uninstall


2) 필수 유틸들이 정상적으로 설치되어 있는지 확인합니다. 

libdnet, libpcap, libpcre 가 확인해야할 유틸들입니다. 

또한, 'which' 명령어를 써서 dnet-config, pcre-config, daq-modules-config 가 존재 하는지 확인합니다. 


예) # which daq-modules-config

/usr/local/bin/daq-modules-config


만약, 위의 것들중 없거나 설치되지 않은게 있다면 먼저 설치해 주어야 합니다. 


3) 설치를 시작합니다. 

snort 폴더에 있는 configure 를 실행합니다. 

만약 설정을 바꾸고 싶은게 있다면 '-h' 명령어로 세부 내용을 확인 후 설정값을 넣어주면 됩니다. 


예)

 # ./configure --enable-active-response --enable-reload --enable-react


4)  설치를 진행합니다. 

# make && sudo make install


5) 정상적으로 설치 되었는지 확인 후 실행하시면 됩니다. 

실행파일은 'src/snort' 파일로 생성되며,

'make install' 후에는 '/usr/local/bin/snort' 에도 들어가게 됩니다. 

※ bin 폴더에 넣어줌으로써 어떤 경로에서든 snort를 자유롭게 실행할 수 있게 되는 겁니다. 


daq가 정상적으로 설치 되었는지 확인 해보는 작업을 예로 들어보겠습니다. 


예) 

# snort --daq-list


Available DAQ modules:

pcap(v3): readback live multi unpriv 

ipq(v5): live inline multi 

ipfw(v2): live inline multi unpriv 

dump(v1): readback live inline multi unpriv 

afpacket(v4): live inline multi unpriv


만약 DAQ 모듈에 대한 정보가 정상적으로 출력되지 않는다면.. 

설치 과정에서 DAQ가 정상적으로 설치되지 않은 것입니다. 


6) 설정 적용 및 시그니처 파일 설정

기본적으로 '/etc/snort/snort.conf' 파일에서 원하는 설정 정보를 수정 및 적용 가능합니다. 

또한, '/etc/snort/rules/' 폴더에서 'rules'라는 확장자를 가진 파일에서는 시그니처를 설정 및 적용 할 수 있습니다. 


아래와 같이 설정 파일(snort.conf)에 시그니처 파일의 경로를 지정하면 해당 시그니처 파일의 경로를 찾아서 시그니처를 로드하게 됩니다. 

'/etc/'snort/rules'폴더를 변수로 설정 하고, 해당 경로의 'my.rules'를 include 함으로써 snort가 해당 시그니처 파일을 읽도록 설정해주는 내용입니다. 

var RULE_PATH /etc/snort/rules 

include $RULE_PATH/my.ruels 


7) 실행 옵션 지정

실행에 필요한 옵션 정보는 다음과 같이 조회가 가능합니다. 


# snort -?


'-D' 옵션은 데몬모드로 실행하도록 하는 옵션입니다. 

이런 내용은 위 명령어를 쓰면 모두 조회가 가능합니다. 



4. snort 사용 및 검증

우선 '-D'옵션을 사용해서 데몬 모드로 실행합니다. 


# snort -D -Q --daq afpacket -i eth1:eth2 --daq-var buffer_size_mb=64 -c /etc/snort/snort.conf 


시그니처가 정상적으로 탐지되고 있는지 확인하기 위해 snort에서 생성하는 alert 파일을 열어봅니다. 

# tail -f /var/log/snort/alert
  
[**] [1:225:7] test [**]
[Priority: 0]
11/04-17:36:58.370718 192.168.11.101:445 -> 192.168.9.148:49220
TCP TTL:127 TOS:0x0 ID:96 IpLen:20 DgmLen:1500 DF
***A**** Seq: 0x911E284F  Ack: 0x1E88D7E9  Win: 0xFC4E  TcpLen: 20


이벤트가 발생할 때마다 위와 같은 포맷의 결과를 확인할 수 있습니다. 

만약 snort가 동작중에 시그니처를 변경했다면.. 
다음 명령어로 snort를 종료하지 않고 설정을 다시 읽어들일 수 있습니다. 
 
# kill -SIGHUP <snort pid> 


만약 reload가 되지 않는다면..
'--enable-reload' 옵션을 주고 configure를 다시 수행 해보시기 바랍니다.  

이제 열심히 snort를 즐기기만 하면 됩니다!!
HAVE FUN! 


 

Posted by KT한
,

gdb 사용에 관한 기본적인 내용은 다음 포스트를 참고하세요.
http://kthan.tistory.com/6

명령어의 일부를 빨간색으로 표시한건 단축키를 의미합니다. 



1. 브레이크포인트 설정 명령어

1.1 break : 특정 위치에 브레이크 포인트 설정


예) break func : func 함수의 시작위치에 설정
     break 123   : 123번째 줄에 설정
     break main.c:func  : main.c 파일의 func 함수의 시작 위치에 설정
     break 123 if i == 1  : i값이 1 일때 123번째 줄에 설정


1.2 rbreak :정규표현식(regular expression)을 사용해 여러 심볼에 브레이크포인트 설정


예) rbreak ^func : fun로 시작하는 모든 심볼에 설정
     rbreak func : func를 포함하는 모든 심볼에 설정


1.3 clear :특정 브레이크포인트 지우기 

     예) clear func : func 함수에 설정한 브레이크포인트 지움
          clear 123  : 123번째 줄에 설정한 브레이크포인트 지움


1.4 info breakpoints: 설정한 브레이크포인트 정보 조회


1.5 enable/disable breakpoints :특정 브레이크 포인트 활성화/비활성화 


예) disable breakpoints : 모든  브레이크포인트 비활성화

     disable breakpoints 1,2,5 : 1,2,5번 브레이크 포인트 비활성화 (info b로 조회한 브레이크포인트 숫자)

     enable breakpoints : 모든  브레이크포인트 활성화

     enable breakpoints 1,2,5 : 1,2,5번 브레이크 포인트 활성화 


1.6 delete :설정한 모든 브레이크포인트를 지움



2. 값 출력 

2.1. info 명령어

info <출력할 타입>: 특정 타입의 info 정보를 출력.
(gdb에서 info를 입력하고 Tab키를 누르면 조회 가능한 모든 값들을 볼 수 있음. )


예) info locals : 지역 변수와 값 출력 
     info variables : 전역 변수와 값 출력
     info registers : 레지스터의 값 출력
     info frame: 스택 프레임 정보 출력
     info thread: 스레드별 정보 출력 


2.2. print 명령어

print/[출력 형식] (형 변환)[변수] : 특정 변수 값을 원하는 포맷으로 출력 

  • 출력 형식:
    t: 2진수
    o: 8진수
    d: int형 10진수
    u: unsigned int형 10진수
    x: 16진수
    c: 1 바이트를 char형
    f: float형 

예) print/x lval : lval를 16진수로 출력 
     print (char *) str : str변수를 "char *" 타입으로 변환 후 출력           


  • 다양한 값 지정 

예) print array@12   : 크기가 12인 array라는 배열을 출력           
    print func::value  : func라는 함수에 있는 value라는 변수 출력 


2.3. list 명령어
list  : 소스 리스트 출력  

예) list    : 현재 실행중인 위치 주변의 소스 출력 
     list func : func 함수의 주변의 소스 출력  
     list 199 : 199 라인 주변의 소스 출력  
     list main.c:main  :  main.c 함수의 main함수 주변의 소스 출력  
     list main.c:199    : main.c 함수의 199 라인 주변의 소스 출력   

  • 보여지는 라인 수 설정 
  예) (gdb) set listsize 20 : list 명령어로 보여지는 라인수를 20줄로 변경



2.4 display 명령어

display <lvalue> : s(step)명령 수행시 매번 lvalue값을 출력
enable/disable display <display번호> : 설정한 번호의 display를 활성화/비활성화



3. 진행 관련 명령어

watch <lvalue> : lvalue에 값이 써질때 마다 브레이크
rwatch <lvalue> : lvalue에서 값을 읽을 때 마다 브레이크

thread [n] : n번째 스레드로 이동(info thread 명령어로 스레드별 정보 조회 가능)

frame [n] : n번째 스택 프레임으로 이동
up [n] : n번째 상위 스택으로 이동
down [n] : n번째 하위 스택으로 이동

※ 'bt' 명령어로 조회되는 결과에서 앞쪽에 있는 숫자가 스택 번호임 


Posted by KT한
,