스노트에서 지원하는 pcre 옵션을 활용하면 정규표현식으로 시그니처를 표현할 수 있습니다. 정규표현식에 대한 이해는 필수 겠지만 pcre의 변경자(modifier) 옵션에 대한 이해까지 수반된다면 좀 더 손쉽게 다양한 표현식 작성이 가능해집니다. 


이번 포스트에서는 pcre의 modifier 옵션에 대해 다루고자 합니다. 



스노트에서 제공하는 pcre 문법입니다. 빨간색으로 칠한 부분에 대해 알아봅시다. 


pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKYS]";




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


  • Perl과 호환되는 옵션들 


  •  i (PCRE_CASELESS) 

정규표현식에 설정한 패턴의 대문자와 소문자를 구별하지 않습니다. 가장 흔하게 쓰는 옵션이라고 할 수 있습니다. 


 문자열

 aAaAa
 시그니처  탐지 됨  pcre:"/aaa/i"; 
 탐지 안됨   pcre:"/aaa/"; 


  • s (PCRE_DOTALL) 

기본적으로 점(.)은 어떤 한 문자를 표현할 때 사용하는 메타문자입니다. 하지만 줄바꿈은 점(.)에 의해 매치가 되지 않습니다. 

s 옵션을 사용하면 점(.)으로 줄바꿈 까지도 매치가 가능합니다. 


 문자열

 aAaAa
 bBbBb 

 hex값
 61 41 61 41 61 0d 0a 62 42 62 42 62
 시그니처 탐지 됨 pcre:"/a..b/s"; 
 탐지 안됨 

 pcre:"/a..b/"; 


  • m (PCRE_MULTILINE) 

기본적으로 주어진 문자열을 한 줄로 취급합니다. 여러개의 줄바꿈이 존재하더라도 문자열의 처음과 끝 외에는 캐럿(^)과 달러($)에 의한 매치가 되지 않습니다. 

m옵션을 사용하면 줄바꿈(newline)의 바로 앞은 달러($)로 바로 다음은 캐럿(^)으로 매치할 수 있습니다. 

참고로, 캐럿(^)은 문자열의 처음, 달러($)는 문자열의 끝을 찾는 메타문자입니다. 


 문자열

 aAaAa
 bBbBb
 시그니처 탐지 됨

 pcre:"/^bB/m"; 

 탐지 안됨 

 pcre:"/^bB/"; 


  • x (PCRE_EXTENDED) 

패턴(시그니처)에 있는 이스케이프 처리되지 않은 모든 공백 문자를 무시합니다. 거의 사용하지 않는 옵션입니다. 


 문자열

 aAaAa
 시그니처 탐지 됨

 pcre:"/a A a/x"; 

 탐지 안됨 

 pcre:"/a A a/"; 



  • PCRE와 호환되는 옵션들 (일부 옵션 명이 다를 수 있음)


  • A  (PCRE_ANCHORED)

문자열의 시작에 매치도록 합니다. 캐럿(^)과 동일한 기능을 합니다. 


 문자열

 aabcdeab

 시그니처 탐지 됨

 pcre:"/ab/"; 

 탐지 안됨 

 pcre:"/ab/A"; 


  • E  (PCRE_DOLLAR_ENDONLY)

기본적으로 달러($)는 마지막 문자가 줄바꿈(뉴라인)일 경우에는 바로 직전의 문자에도 매칭합니다. (마지막이 아닌 줄바꿈은 제외) 

하지만, 이 옵션을 사용하면 달러($)는 오직 주어진 문자열의 마지막에만 매치됩니다.

이 변경자는 변경자 m과 함께 사용되면 무시됩니다. 


 문자열

 aAaAa

 시그니처 탐지 됨

 pcre:"/aAa/"; 

 탐지 안됨 

 pcre:"/aAa/E"; 


  • G (PCRE_UNGREEDY) 

기본적으로 PCRE는 greedy 하게 동작합니다. 이는 가능한 최대로 매치를 하게 됩니다. 

하지만, 이 옵션을 사용하면 lazy하게 동작하게 됩니다. 이는 가능한 최소로 매치를 하게 됩니다. 

greedy와 lazy는 아래 예시를 보면 쉽게 이해가 될겁니다. 


-Greey 방식

  표현식   <.*>

  문자열  Regex <b>Greedy</b> Style


-Lazy방식

  표현식   <.*?>

  문자열   Regex <i>Lazy</i> Style


 문자열

 <b>aaa</b>

 시그니처

 greedy

 pcre:"/<.*>/"; 

 pcre:"/<.*?>/G";

 lazy 

 pcre:"/<.*?>/"; 

 pcre:"/<.*>/G"; 



  • Snort에서만 사용하는 옵션들


  • R 

마지막에 패턴 매치된 부분부터 검사를 수행합니다. 

즉, content 옵션과 함께 사용하는 distance:0 과 동일한 문자열 버퍼에 대해 패턴 매치를 시도합니다.  


URI 버퍼 값에 대해서 패턴 매치를 시도합니다. 

즉, http_uri 혹은 uricontent와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • I

정규화 작업을 하지 않은 URI 버퍼에 대해 패턴 매치를 시도합니다. 

즉, http_raw_uri 와 동일한 문자열 버퍼에 대해 패턴 매치를 시도합니다. 


  • P

정규화 되지 않은 HTTP request body 버퍼 값에 대해 패턴 매치를 시도합니다. 

즉, http_client_body와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • H

정규화된 HTTP request나 response 헤더 버퍼 값에 대해서 패턴 매치를 시도합니다. 

즉, http_header와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • D

정규화 되지 않은 HTTP request 나 response 헤더 버퍼값에 대해서  패턴 매치를 시도합니다. 

즉, http_raw_header와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • M

정규화된 HTTP request method 버퍼값에 대해서 패턴 매치를 시도합니다. 

즉, http_method와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • C

정규화된 HTTP request와 response cookie 버퍼값에 대해서 패턴 매치를 시도합니다. 

즉, http_cookie 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • K

정규화되지 않은 HTTP request와 response cookie 버퍼값에 대해서 패턴 매치를 시도합니다. 

즉, http_cookie 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • S

HTTP response status code 버퍼값에 대해서 패턴 매치를 시도합니다. 

즉, http_stat_code 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • Y

HTTP response status 메시지 버퍼값에 대해서 패턴 매치를 시도합니다. 

즉, http_stat_msg 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다. 


  • B

HTTTP 관련 버퍼를 사용하지 않고 원본 패킷에 대해서 패턴 매치를 시도합니다. 

즉, rawbytes와 유사합니다.  


  • O

설정 파일(snort.conf)에서 지정한 pcre match limit 값을 무시하는 목적으로 사용합니다.  match limit은 pcre에 의해 너무 오랜 시간 수행 되는것을 방지하는 목적으로 검사 횟수를 제한 하는 값입니다.  

이 옵션을 사용하면, 해당 시그니처에 한해서 match recusion 횟수에 제한없이 탐지를 수행합니다. 



위 내용을 정리해보면 다음과 같습니다. 

 순번

 pcre

 유사한 content 옵션

 주의 사항

 1

 R

 distance:0;

 'U,I,P,H,D,M,C,K,S,Y' 옵션과 함께 사용 못함

 2

 U

 http_uri; or uricontent;

 'I' 옵션과 함께 사용 못함

 3

 I

 http_raw_uri; 'U' 옵션과 함께 사용 못함

 4

 P

 http_client_body; 

 5

 H

 http_header;

 'D' 옵션과 함께 사용 못함

 6

 D

 http_raw_header;

 'H' 옵션과 함께 사용 못함

 7

 M

 http_method; 

 8

 C

 http_cookie; 'K' 옵션과 함께 사용 못함

 9

 K

 http_raw_cookie; 'C' 옵션과 함께 사용 못함

 10

 S

 http_stat_code; 

 11

 Y

 http_stat_msg; 

 12

 B

 rawbytes;

 'U,I,P,H,D,M,C,K,S,Y' 옵션과 함께 사용 못함


▶ 정규표현식 관련 글 보기

[프로그래밍] 정규표현식 (Regular Expression) - 초급

Posted by KT한
,

크롬(Chrome) 브라우저를 사용하고 있다면 웹 페이지에서 모르는 영어 단어가 나오면 손 쉽게 사전에서 찾아주는 어플이 있습니다. 현재는 서비스 중단된 야후 미니 영어 사전에서 제공하던 펜 기능과 유사하다고 생각하시면 됩니다. 단점이라면 크롬에서만 된다는 것이겠죠. 


사실 요즘은 은행업무나 결재 할때를 제외하면 인터넷익스플로러가 아니더라도 사용하는데 전혀 불편함이 없죠. 오히려 크롬이 속도도 더 빠르고 여러가지 편의성 측면에서 봐도 더 좋은것 같더라구요. 만약 다른 브라우저를 사용하고 계시다면 한번 설치해서 사용해 보세요. 그 매력에 금방 빠져들게 될 겁니다. 


자 그럼 크롬 부라우저에서 구글 사전 어플을 사용하는 법을 알아봅시다. 



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



1. 웹 스토어 들어가기

크롬 부라우저 우측 하단의 '웹 스토어'를 클릭합니다. 

혹은, 애플리케이션 페이지에서 '크롬 웹 스토어'를 클릭하셔도 됩니다. 



2. 사전 어플 검색

좌측 상단 검색창에 'google dictionary'를 검색합니다. 

검색된 어플을 'CHROME에 추가' 버튼을 클릭해서 설치 합니다. 


3. 실행 

다운 및 설치가 완료되면 우측 상단에 빨간색 사전 모양의 아이콘이 생깁니다. 

사전 아이콘을 클릭해서 실행시켜줍니다. 


4. 단어 검색

모르는 영어 단어를 마우스로 더블 클릭을 하면 조그만하게 창이 뜨면서 단어에 대한 설명이 나옵니다. 

단어 옆에 있는 스피커 아이콘을 클릭하면 발음도 들을 수 있습니다. 

그런데, 설명이 영어로 나올 수 있답니다. 한글로 바꿔야 좀 더 편하겠죠?


5. 설정

구글 사전 아이콘에서 마우스 우 클릭을 해줍니다. 

그럼 메뉴가 나오게 되고 '옵션'을 선택 하시면 됩니다. 



6. 언어 변경

설정 탭이 뜨게 되고, 언어를 한국어로 변경하시면 됩니다. 


7. 다시 단어 검색

다시 영어 단어를 더블 클릭 해보니 단어 뜻이 한글로 잘 나오는 군요. 


영어 기사나 문서를 볼 때 설치해두면 참 편리하답니다. 


'IT 생활 > 유틸' 카테고리의 다른 글

[유틸] uDiskToolBar로 USB에 CD이미지 굽기 및 초기화  (5) 2012.04.17
Posted by KT한
,

스노트(Snort)는 보편적으로 사용되고 있는 IPS 오픈소스 입니다. (만약 생소하시다면 이전 포스팅 들을 참고하세요.)


오픈 소스이기에 소스를 공개하고 있음에도 워낙 분량이 방대하여 소스를 봐도 동작 방식을 이해하기란 쉽지 않습니다. 심지어 주요 함수에는 주석으로 친절한 설명까지 잘 남겨져 있음에도 완벽히 이해하기란 쉽지 않은것이 현실입니다. 물론, 소스를 열어서 확인 하는 사람은 극 소수겠죠. 


이번 포스팅에서는 스노트의 패턴 매칭 순서 및 동작 방식에 대한 이야기를 풀어 보고자 합니다. 

사실... 상당히 난해한 주제입니다.  



설명에 앞서 기본적인 용어를 하나 정의하고 가겠습니다. 

시그니처를 하나 예제로 살펴 봅시다. 


drop tcp 10.1.2.100 any > 10.1.1.100 22 (                                                 

        msg:"SSH Brute Force Attempt"; flow:established,to_server;              

        content:"SSH"; nocase; offset:0; depth:4;                                        

        detection_filter:track by_src, count 30, seconds 60; sid:1000001; rev:1;)


첫 번째 줄을 스노트에서는 RTN(Rule Tree Node)이라고 합니다. IP주소와 포트, 프로토콜 정보를 여기에다 저장합니다. 나머지 3 줄을 OTN(Option Tree Node)이라고 합니다. 실제 시그니처의 내용으로 공격 정보를 담고 있게 됩니다. 



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



자.. 그럼 본론으로 들어가서.. 

일반적으로 스노트는 시그니처의 RTN을 먼저 검사 한 후 OTN을 검사하는 순서로 진행한다고 생각하기 쉽습니다. 

자.. 아래 문제를 한번 풀어볼까요?


문제. 

4210 포트에서 80 포트의 HTTP 서버로 가는 패킷을 탐지하고자 하는데, 시그니처 중에 12345 에서 80으로 가는 패킷을 탐지하는 시그니처가 있다고 가정해봅시다. 
이 경우 옵션 부분인 OTN을 검사 할까요? 안할까요?

패킷:  


시그니처:
alert tcp any 12345 -> any 80 (msg:"abnormal traffic"; .... )



상식적으로 port값만 비교해 봐도 출발지 포트가 같지 않으므로 보나마나 탐지가 안된다고 결론을 내릴 수 있음에도, Snort는 목적지 포트인 80이 일치 되는것만 확인하고는 시그니처 탐지를 수행합니다. OTN을 모두 검사 한 후 RTN을 검사하는 과정에서야 출발지 포트가 해당되지 않는 다는걸 알게 되는 것이죠. 


그 이유에 대해 알고자 한다면 Aho-Corasick 매턴 매칭 알고리즘에 대해 먼저 알아야 합니다.
 
Aho-Corasick 알고리즘은 멀티 패턴 매칭 알고리즘으로 매우 잘 알려져 있습니다. 
Aho와 Corasick 두 사람이 고안해낸 이 알고리즘은 입력받은 패턴에 대해 매칭되는 모든 패턴들을 trie 구조로 만든 후 단 한번의 검사 만으로 검출하는것이 가능합니다. 


그림 1. Aho-Corasick diagram - 출저: 위키페디아



Snort에서는 시그니처의 패턴을 추출해서 위와 같은 맵을 생성하고, 패킷이 들어오면 이 맵에 의해 단 한 번 검사만으로 패턴 매치에 성공한 시그니처의 id를 얻을 수 있습니다. 

이게 아무리 효율적이라고 해도 port값 먼저 확인 하는게 더 효율적이지 않나 라는 의문은 여전히 남아 있을 겁니다. 

자! 이런 경우를 생각해봅시다. 
시그니처가 3,000개 정도 있는 경우를 생각해 봅시다. 하나의 패킷이 들어오면 3,000개의 시그니처에 대해 포트가(출발지,목적지) 일치 하는게 있는지 찾아야 합니다. 이 작업을 3,000번 한다고 생각해보세요. 생각보다 시간이 많이 걸립니다. 물론 시그니처가 늘어나면 시간은 선형적으로(linear) 증가 할 수 밖에 없는 구조가 되는겁니다. 

결국, 첫 단계에서 최소의 시간안에 최대한 유력한 시그니처를 걸러내는게 효율적이라는걸 알 수 있습니다. 이 작업을 Aho-Corasick 알고리즘을 활용해서 하는 겁니다. 한마디로 필터링을 하는 것이죠. 

그렇다고 모든 패턴을 죄다 뽑아서 Aho-Corasick을 수행하면 시간이 많이 걸리기 때문에, 스노트에서는 Aho-Corasick에 사용할 패턴은 각 시그니처 중에서 가장 긴 패턴 (longest pattern) 하나를 대표로 골라서 Aho-Corasick에 사용하도록 했습니다. (최신 버전에서는 시그니처를 만드는 사람이 Aho-Corasick에 사용될 longest pattern을 지정 할 수 있도록 'fast_pattern'이란 옵션을 지원합니다.) 이를 스노트에서는 멀티 패턴 탐색 엔진 - MPSE(Multi Pattern Search Engine)라고 합니다. 


스노트는 이런 MPSE 맵을 포트(port)별로 생성해서 관리를 합니다. 이를 소스에서는 'PORT_GROUP'이란 구조체로 사용 하고 있어서 포트 그룹이라고도 부릅니다. 그 이유는 MPSE맵이 너무 커지면 한 번의 매칭을 위해 비교해야 할 경우의 수가 늘어나게 되므로 성능 저하가 불가피 하기 때문입니다. 


아래 그림은 스노트에서 MPSE를 관리하는 구조를 그림으로 표현한 것입니다. 


그림 2. Snort Port table structure


먼저 프로토콜(TCP/UDP/ICMP/IP)별로 출발지/목적지 포트에 대해 각각 65535 개의 만큼의 배열을 가지고 있습니다. 각 배열에는 시그니처를 읽어 들이면서 MPSE가 생성 될 때 마다 해당 포트에 링크를 달아둡니다. 예를 들어 목적지 80 포트에 대해 탐지하는 시그니처가 있으면 MPSE를 생성 한 후 배열의 80번째 값에 달아 주는 식입니다. 

그렇다면 출발지/목적지 포트에 모두 특정 포트 값이 지정 되어 있다면 어떻게 할까요?
이런 경우 출발지/목적지 포트 그룹에 모두 추가해 주게 됩니다. 
둘 중 한 곳에만 해줘도 문제가 없을것 같은데.. 스노트는 왜 두 군데 모두 추가하는지 이해가 되지 않네요. 혹시 아시는분 계시면 댓글 남겨주세요~ ^^ 



여기까지 하면서 뭔가 빠진게 있는것 같다라는 생각이 들지 않나요? 


바로, 출발지/목적지 포트가 모두 'any'인 경우가 남았네요. 

출발지/목적지가 모두 'any'라면 Generic이라는 포트 그룹을 별도로 하나 더 두고 여기에 포함시킵니다. 말 그대로 특정 포트가 아닌 일반적이고 포괄적인 녀석들을 묶어 두는 겁니다. 



그림 3. Snort Generic Port table structure


당연히 포트 값 별로 MPSE를 관리할 필요는 없지만 대신 any-any 시그니처가 많아지면 MPSE의 크기가 많이 커지게 될 수 밖에 없습니다. 그렇기 때문에 가능하면 시그니처에 포트 정보를 넣어주는게 좋습니다. 



참고로, 시그니처에 패턴(content, uricontent)이 없다면 nc룰(no-content) 이라고 부르며 패턴이 없기 때문에 당연히 MPSE를 만드는 것도 불가능해집니다. 이런 시그니처들은 한 데 모아서 순차적으로 검사하도록 합니다. 



지금까지의 내용을 정리해보면 스노트는 시그니처를 아래와 같은 구조로 관리하게 됩니다. 


alert TCP any any -> 192.168.123.0/24 80 (msg:"GET KT"; content:"GET"; content:"KT"; sid:1)

alert TCP 20.20.20.0/24  5424  -> any 80 (msg:"GET OP"; content:"GET"; content:"OP"; sid:2)

alert TCP any any -> 132.42.10.0/24 80 (msg:"GET HT"; content:"GET"; content:"HT"; sid:3)





그림 3. Snort Rule Table structure


결과적으로 프로토콜이 일치하는 경우 포트 중 하나(출발지/목적지)가 일치 되면 패턴 매칭을 시도하게 되는 구조입니다. 

※ OTN과 RTN이 트리(tree)구조로 매달려 있는 것은 나중에 따로 포스팅 하겠습니다. 



OTN은 MPSE로 부터의 연결 점이 되는 root OTN이 하나 존재하고,

 패턴과 같이 시그니처의 옵션 정보를 가지고 있는 child OTN이 여러개 나올 수 있으며, 

시그니처 옵션의 마지막 정보이자 sid 와 RTN정보를 모두 포함하고 있는 leaf OTN 노드가 존재하게 됩니다. 



이제 어떤 구조로 시그니처를 관리하며 어떤 순서로 공격 패킷을 탐지 하는지 대충 감이 오시나요? 


Posted by KT한
,


RPM (Red Hat Package Manager)은 리눅스에 사용되는 가장 일반적인 소프트웨어 패키지 방법입니다. 

Debian에서 사용하는 deb방식도 있지만 일반적으로 rpm으로 패키징 되어 배포되고 있습니다. 


rpm을 만드는 내용은 .spec 파일에 정의해 주면 됩니다. 

spec파일은 vim 에디터로 name.spec 과 같이 임의의 파일을 생성하면 자동으로 기본 탬플릿을 채워줍니다. 




rpmbuild 명령어로 spec파일을 인자로 주어 실행하게 되면 패키징을 수행합니다. 


$ rpmbuild -bb name.spec


spec파일에는 수행해야할 명령들이 정의해줘야 합니다. (위에 접혀 있는 'spec 파일 탬플릿 열기'를 펼쳐 보세요.)




spec 파일의 각 파트별 역할에 대해 알아봅시다. 


Preamble(서문)


● Source


RPM을 만들기 위해 사용할 압축 파일(.tar.gz) 지정 해 줄 수 있습니다. 

Source 뒤에 숫자를 붙여 여러 소스파일을 지정 해 줄 수 있습니다. 숫자는 '0' 부터 시작해야 합니다. 


Source0: myrpm.tar.gz



● Requires


이 rpm이 built(설치)되기 이전에 설치 되어 있어야 할 rpm을 지정해줄 수 있습니다. 

기본적으로 이름만 써도 되지만, 버전을 체크 하도록 할 수 있습니다. 

비교 연산자는 ( <, >, =, >=,  <=) 를 지원합니다. 

Requires: gcc >= 4.4.4 


만약 64bit 머신에 32bit rpm을 설치해야 할 일이 있는경우 해당 정보를 지정해 주어야 합니다. 

아래 처럼 괄호안에 지정해 주면 됩니다. 


Requires: libedit(x86-32)

 

 

● BuildRequires 

이 rpm을 build 하기 위해 필요한 rpm을 지정해 줄 수 있습니다.  

빌드에 필요한 rpm이므로 주로 devel 패키지가 될 겁니다. 


BuildRequires: libpcap-devel




- Scriptlets 


실제로 수행할 명령을 지정해주는 섹션으로 bash shell 명령어를 지원합니다. 



● %prep 

Source0에서 지정한 파일을 빌드를 하기 위해 필요한 일들을 지정해 줍니다. 압축을 푸는 작업이 주된 작업이 됩니다.  


-q 옵션을 사용하면 압축을 푸는 과정을 보여주지 않습니다. 진행 과정을 감춘다고 생각하면 됩니다. 

-n 옵션으로는 이름을 지정해 줄 수 있습니다. 


%prep

%setup -q -n myrpm 



● %build

'%prep' 다음에 수행되며, 압축을 푼 소스를 가지고 빌드를 수행합니다. 


주로 './configure'를 실행하여 'Makefile'을 생성하고, 'make'를 수행하여 빌드를 수행합니다. 



● %install

'%build' 다음에 수행되며, 빌드 수행결과 생성된 파일들을 설치 폴더로 복사하는 역할을 수행합니다. 


주로, 'make install'을 수행해서 실행 파일들을 '~/rpmbuild/BUILDROOT' 폴더 아래로 넣는 작업을 수행합니다. 

물론, Makefile에 make install시 수행할 동작에 대해 미리 정의해 주어야 합니다. 

일반적으로 빌드를 통해 생성된 실행 파일을 특정 경로에 넣어주는 작업을 설정해주게 됩니다. 


아래는 'mybin' 이란 파일을 지정한 경로에 설치 하기 위한 Makefile 예제입니다. 


Makefile

install:

test  -z  "$(INSTALLDIR)/"  ||  mkdir  -p  "$(INSTALLDIR)"

install  -m  644  mybin  $(INSTALLDIR)/



물론, Makefile에는 값에 대한 정의가 되어 있어야 겠죠. 


Makefile

INSTALLDIR=$(shell pwd)/myinstall



만약 path를 Makefile에 넘겨줘야 할 상황이 발생하게 되면 아래와 같은 방식으로 지정해 줄 수 있습니다. 


.spec 

%install

make INSTALLDIR=$RPM_BUILD_ROOT install



● %check 


'%install' 다음에 수행되며, 설치 이후에 테스트 케이스 검증같은 작업을 위해 사용합니다. TDD기반의 프로젝트라면 이 위치에 테스트를 수행하도록 설정해주면 됩니다. 



● %clean


빌드 마지막에 수행합니다. 빌드 과정에서 생긴 파일들을 지우도록 설정 할 수 있으며, 주로 설치 폴더를 삭제하도록 설정해줍니다. 

spec파일 기본 탬플릿에 있는 내용을 그대로 사용하시면 됩니다. 



● %files 


rpm 파일에 묶여야(패키징) 하는 파일의 이름을 지정해주게 됩니다. 물론, 폴더 이름을 지정 해주는 것도 가능한데, 하위 폴더를 포함 한 모든 파일을 모두 묶는 의미로 사용됩니다. 

여기서 지정한 파일만 rpm 파일에 묶이게 된다고 생각하면 됩니다. 


파일 리스트를 파일로 입력 받는것도 가능합니다. 


%files -f myfile.list 



패키징 될 파일의 경로(path)정보는 Makefile에서 사용한 값을 사용하게 됩니다. 

다시 말해서.. Makefile에서 install 한 경로 정보와 동일한 값으로 spec 파일에 지정해 주어야 하는 것입니다. 


물론, automake와 같은 툴을 사용한다면 크게 신경쓰지 않아도 되는 부분이기는 하나, Makefile을 직접 만들었다면 절대 경로가 아닌 상대 경로에 설치 하도록 해주어야만 rpmbuild 수행 시 ~/rpmbuild/BUILDROOT/ 아래 설치 하는게 성공 할 수 있습니다. 



파일 리스트 앞에는 Prefix가 붙을 수 있으며, 각각의 의미는 다음과 같습니다. 


◆  [기본] - 아무런 Prefix가 없음 

데이터 파일이라고 생각해서 항상 엎어쓰고 rpm 삭제시에는 제거해줍니다. 혹시 기존에 설치 되었던 파일을 수정했었다 하더라도 신경쓰지 않습니다. 


◆  %config

기존에 설치 된 파일이 수정되었다면 기존 파일을 '.rpmsave' 확장자를 붙여서 백업해놓고 새로운 파일을 설치합니다. 설치 이후에 파일이 수정되었다면 변경된 설정 값을 지우지 않고 백업해 준다는 의미입니다. 


◆  %config(noreplace)

기존에 설치 된 파일이 수정되었다면 기존 파일을 유지하고, 새로 설치될 파일을'.rpmsave' 확장자를 붙여서 설치합니다. 설치 이후에 파일이 수정되었다면 수정된 설정 값을 유지 시키기 위해 사용합니다. 


 옵션 이름

RPM에 포함된 파일 수정?

설치된 파일 편집 안됨 

설치된 파일 편집 됨 

 [기본]

No 

RPM으로 부터 설치 

RPM으로 부터 설치 

 Yes

RPM으로 부터 설치 

RPM으로 부터 설치 

%config 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

RPM으로 부터 설치 기존 파일은 .rpmsave로 이름수정 

%config(noreplace) 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

기존 파일 유지. RPM에서 받아온 파일은 .rpmnew로 저장. 



◆  %attr 

설치된 rpm 권한과 소유권을 지정해 줄 수 있습니다. 


%attr (<mode>, <user>, <group>) filename 


예) %attr (600, root, -) /etc/mybin



◆  %defattr 

기본 권한 값을 설정 해 줄 수 있습니다. 


%deattr(<file mode>, <user>, <group>, <dir mode>)


예) %defattr(644, root, root, -)



◆  %dir

패키지에 포함시킬 폴더를 지정해줘서 생성하도록 합니다. 주로 특정 위치에 빈 폴더를 생성 시키기 위해 사용합니다. 




● %package


서브-패키지를 생성하기 위해 사용합니다. 이름은 당연히 'Name' 필드에 지정해준 이름을 사용하며 여기서 지정해준 이름을 이어서 패키지 이름을 지어주게 됩니다. 


Name은 'foo' 이고 '%package bar' 라고 지정하게 된다면 'foo-bar.rpm' 이란 이름의 rpm 파일이 생성될겁니다. (물론 뒤에 버전 정보 같은것도 들어가겠죠.) 


release 번호는 메인-패키지와 별도로 지정이 가능합니다. 



%if - %else - %endif

빌드 환경을 체크해서 환경에 따라 다르게 동작하게 할 수 있습니다. 


%if 의 종류는... 

아키텍쳐(architecture)를 검사하는 %ifarch 와 %ifnarch가 있습니다.  (i386, alpha, sparc, etc.. )

운영체제(operating system)을 검사하는 %ifos 와 %ifnos가 있습니다.  (linux, etc... )


%else와 %endif는 %if와 짝으로 사용하면 됩니다. 이름만으로 어떻게 동작하시는지 아실겁니다. 


%ifarch i386

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS -I ."

%else

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%endif




● %post


 rpm 설치 이후에 뭔가 추가 작업을 해줘야 할때 사용합니다. 

예를 들면.. 설정 파일에서 값을 변경하거나.. chkconfig 와 같은 작업 지정이 가능합니다. 





※ 참고로 rpmbuild시 path 정보는 rpmmacros 파일에 정의해주면 됩니다. 


$ vi ~/.rpmmacros


%_topdir /home/kyungtae/rpmdir

%_builddir %{_topdir}/BUILD

%_rpmdir %{_topdir}/RPMS

%_sourcedir %{_topdir}/SOURCES

%_specdir %{_topdir}/SPECS

%_srcrpmdir %{_topdir}/SRPMS


물론, BUILD, RPMS, SOURCES, SPECS, SRPMS 폴더는 미리 만들어 줘야 합니다. 



참고 링크 : 

http://www.rpm.org/max-rpm-snapshot/ch-rpm-specref.html


Posted by KT한
,

그림 1. SURICATA 로고 


Suricata(수리카타)는 Open source기반의 IDS(Intrusion detection system)입니다. 사실 Open source 기반의 IDS/IPS라고 하면 Snort(스노트)가 대표적입니다. 거의 독보적이라고 할 정도로 오랜 시간 입지를 굳혀오고 있었지요. 오픈 소스의 특성상 많은 사람들이 사용하고 피드백을 주게 되면 그 만큼 오류 수정 및 기능 추가에 용의하게 됩니다. Snort는 오랜 시간 전 세계 많은 사용자의 도움으로 다양한 공격을 좀 더 정확하게 탐지하는 방법에 중점을 두고 발전을 해왔다고 봅니다. 


문제는, 그 사이 인터넷 세상은 집집마다 광 케이블을 통한 초고속 인터넷이 설치 되는가 하면 스마트폰 보급이 빠른 속도로 진행되면서 급속도로 팽창하게 됩니다. 그 결과 트래픽 양이 급격히 증가하면서 대용량 트래픽의 실시간 처리에 대한 이슈가 부각되게 됩니다. Snort는 구조상 단일 스레드(Single-thread)만 지원 하다 보니 처리 대용량 트래픽을 실시간으로 처리하기에 버거운 환경이 된 겁니다. 


Suricata는 Snort의 단점은 개선하면서 장점은 그대로 수용하여 이상적인 IDS/IPS를 개발하는 것이 기본적인 목표인것 같습니다. 아래는 Suricata의 주요 장점이라고 할 수 있는 내용입니다. 


1. 멀티 코어(Multicore)/멀티 스레드 (Multi-threading) 완벽 지원 (snort는 지원 불가. snort-3.0에서 시도 했으나 포기함.)

2. Snort 룰 완벽 호환 ( 기존 시스템에서 사용중인 snort 시그니처를 그대로 사용 할 수 있음.)

3. 하드웨어 밴더의 개발 지원으로 하드웨어 가속 지원. (GPU 가속)

4. 스크립터 언어(lua)로 시그니처 작성 가능 (snort 룰 포맷을 몰라도 시그니처 작성이 가능함.)

5. Snort의 대부분의 기능 모두 지원 



그림 2. suricata work flow


Suricata는 OISF(Open Information Security Foundation)에서 개발 한 것으로, 2009년 12월에 베타 버전이 나온 이후로.. 2012년 10월에는 Fedora 17버전에 포함되면서 엄청나게 빠른 속도로 기반을 잡아가고 있습니다. 

이제는 Fedora에서 '# yum install suricata'라는 명령 하나만으로 Suricata를 설치/사용 할 수 있는 환경이 된 것이죠. 


이처럼 급격한 성장은 OISF라는 단체에 대해 알고 나면 금방 이해가 될 겁니다.  

OISF는 미국의 해군 우주해양전쟁시스템센터(SPAWAR-Navy's Space and Naval Warfare Systems Command)국토안보부의 과학기술국 (Department of Homeland Security's Directorate for Science and Technology)오픈 보안기술(HOST-Homeland Open Security Technology) 프로그램의 일환으로 창립 되었습니다. 


그림 3. OISF 로고


이 재단의 목표는, 미국 정부 기관의 전반적인 보안 및 인터넷 보안을 위해 사용할 새로운 보안 시스템을 개발 하는 것입니다. 오픈 프로젝트여서 결과물에 대해서 사용자나 기관에서 사용 할 수 있도록 공개도 해줍니다. 


우리나라는 강 바닥 파는데 투자할 때 미국은 보안 소프트웨어에 대대적인 투자를 시작한것이죠. 이게 시각의 차이인가 싶네요. 


어쨌든, 미국의 국토안보부에서 재정 지원을 하는 만큼 재정적으로 부족함이 없을것 같네요. 


아래는 OISF의 파트너사 입니다. 


그림 4. OISF Partners


미국 처럼 큰 나라의 정부가 주관하는 프로젝트여서 그런지 많이 들어본 친숙한 회사들이 여럿 있습니다. 


어찌 보면 이제 시작인지도 모릅니다. 시간이 지나면서 점점 참여 업체가 많아지고.. 실제로 사용할 만한 수준이 되고 나면 급속도로 snort가 차지하고 있던 시장을 대체해 버릴지도 모르겠네요. 따지고 보면 snort는 한 업체의 제품이고 suricata는 미국의 범 정부 차원의 프로젝트 결과물이니 당연한 것인지도 모르겠네요. 


어쨌든, 한국 IPS시장도 현재는 Snort 일색인데.. 머지않은 미래에 큰 변화가 생길지도 모르겠네요. 


아래는 관련 사이트 링크 


Posted by KT한
,

일반 키보드에 컨트롤 키는 너무 아래쪽에 위치하고 있어서.. 컨트롤 키를 자주 눌러야 하는 사람들은 소중한 새끼 손가락을 혹사 시킬 수 밖에 없는 구조랍니다. 

이럴 때 자주 사용하는 키와 자주 사용하지 않는 키의 위치를 바꿔줌으로써 새끼 손가락의 부담을 조금이나마 덜어 줄 수 있답니다. 



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



방법: 


1. '레지스트리 편집기'를 실행합니다. 

실행 창에 'regedit' 이라고 입력하면 편집기가 실행 됩니다.  


2. 아래 위치로 이동합니다. 

HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Control > Keyboard Layout


※ 바로 아래 있는 'Keyboard Layouts'와 헷갈리지 않도록 조심해야 합니다. 



3. 새로운 값을 생성합니다. 

마우스 우 클릭 후 '새로 만들기 > 이진값' 을 선택합니다. 

새로 생성된 파일의 이름은 'Scancode Map' 으로 변경해줍니다. 




4. 코드 값을 변경해줍니다. 

'Scancode Map'에서 마우스 우 클릭 후 '수정'을 선택하면 '이진 값 편집' 팝업창이 뜨게 되고 값을 아래와 같이 수정합니다. 


0000   00 00 00 00   00 00 00 00                  <- 시작                                                            시작

0008   03 00 00 00   1D 00 3A 00                 <- 03은 키를 변경할 갯수 + 1                       3A 를 1D로 매핑 (첫번째 키 매핑)

0010   3A 00 1D E0   00 00 00 00                 <- 1D E0를 3A로 매핑 ( 두 번째 키 매핑)   종료




그렇다면, 저 키 값은 어떻게 알아야 할까요?


아래 키보드 위치 코드 값으로 알 수 있습니다. 

자신의 키보드에서 위치를 바꾸고자 하는 키에 해당 하는 숫자를 찾습니다. 



이 표에서 해당 키보드 값에 해당하는 XT값을 찾으면 됩니다. 


예) 캡스락(Capslock)키의 Key 번호는 30이고, 해당되는 XT값은 3A 입니다. 맵 값은 '3A 00'으로 입력하시면 됩니다. 


키 번호가 62가 넘어가면 XT값에 'EO'가 붙어 있는 값이 보입니다. 이럴 경우 앞에 붙은 값(E0)을  뒤에 써주면 됩니다. 


예) 오른쪽 컨트롤(ctrl) 같은 경우 64번이고, XT값은 'EO1D' 입니다. 맵 값은 '1D E0'가 됩니다.  



5. 컴퓨터를 리붓하고 나면 '캡스 락(Caps lock)'키가 '오른쪽 컨트롤(ctrl)'키와 위치가 바뀌어 동작하게 됩니다. 



위치를 바꿨던 키를 원래데로 복구 하려면 추가했던 'Scancode Map'를 삭제하시면 됩니다. ^^


Posted by KT한
,

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

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

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


젠킨스(허드슨) 설치

킨스(허드슨) 


오늘은 젠킨스를 좀 더 잘 활용 할 수 있는 방법에 대해 알아보려 합니다. 

젠킨스는 그 자체만으로도 충분히 훌륭한데요. 

플러그인 기능을 통해서 필요 및 취향에 맞게 최적화가 가능합니다. 



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


자 그럼 플러그인을 설치해 봅시다. 

1. 젠킨스 메인 페이지에 접속 합니다. 

좌측 메뉴에서 'Jenkins 관리'를 선택해서 들어가면 '플러그인 관리' 페이지가 있습니다. 


2. 설치하고 싶은 플러그인을 선택합니다. 

'설치 가능' 탭을 선택합니다. 

그럼 수백개의 설치 가능한 플러그인을 볼 수 있을 겁니다. 


이제 설치하고 싶은 플러그인을 찾아봅시다. 


3. 설치할 플러그인 고르기 

내가 원하는 플러그인이 맞는지 확인은 필수 겠죠?


관심있는 플러그인 이름의 링크를 클릭하면 설명 페이지가 열립니다. 

아쉽게도 설명은 한글로 번역이 되어 있지는 않습니다. 


참고로, 사용자 그래프가 있는데 설치하는데 참고용으로 유용합니다. 

아무래도 많은 사람들이 지속적으로 설치한다는 것은 그만큼 안정적이고 유용하다는 의미일 테니깐요. 

그렇지만 어디까지나 참고용일 뿐입니다! 


4. 플러그인 다운로드 및 설치 

플러그인 앞에 있는 체크박스에 체크 후 

화면 하단에 있는 설치 버튼을 클릭합니다. 


빌드 중일때 서비스를 재시작 하면 안되기 때문에 재시작 하지 않고 설치만 해둡니다. 


5. 다운로드 

선택한 플러그인이 설치 리스트에 추가되고 

열심히 다운을 받게 됩니다. 


6. 잠시 후 정상적으로 설치 된 것을 확인 할 수 있습니다. 

설치 후 빌드되는게 없다면 젠킨스를 재시작 하는 체크박스가 보입니다. 

바로 적용하고 싶다면 체크해 주시면 됩니다. 


이런 식으로 다양한 플러그인들을 설치해서 젠킨스를 좀 더 다양한 용도로 활용 할 수 있습니다. 


예를 들면, 

iOS 어플을 개발하기 위해서는 'Xcode plugin'을 설치하면 됩니다. 

설명도 자세하게 나와있어서 쉽게 설정이 가능합니다. (물론, 영어로 나와있긴 하지만요. )



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



유용하게 사용되는 플러그인 들


  • 버그 질라 연동

플러그인 'Bugzilla Plugin'을 설치 합니다. 

Jenkins 관리 > 시스템 설정 에 들어가면 'Bugzilla'라는 항목이 있습니다. 

버그질라 주소와 버그 ID와 연동할 포맷을 정규 표현식으로 설정 합니다. 

소스를 커밋 할 때 설명으로 입력한 문구에 정규표현식에 매칭되는 숫자가 나오면 버그질라 서버로 링크를 걸어 주는 겁니다. 



예를 들어 소스 커밋을 할 때 다음과 같이 입력 하게 되면.. '1234'링크를 클릭하면 버그질라 서버의 해당 버그 id로 연결이 되는 겁니다. 

Bug 1234 - 오류 수정 



  • SSH 연동

플러그인 'SSH plugin'를 설치 합니다. 

빌드 과정에서 ssh로 특정 host에 접속해서 작업을 해줘야 할게 있을 때 사용하면 좋습니다. 


Jenkins 관리 > 시스템 설정 에 들어가면 'SSH remote hosts'라는 항목이 있습니다. 

여기서 접속할 호스트에 대한 정보를 미리 설정 해줍니다. 



Job에서 설정 메뉴에 들어가서 빌드를 위한 명령을 입력 하는 과정에서 ssh가 필요하다면, 'Add build step'버튼을 눌러 'Execute shell script on remote host using ssh' 을 추가합니다. 


아래와 같은 메뉴가 나타나면 host를 선택하고 명령을 입력해줍니다. 

만약 명령 실행 순서를 변경하고 싶다면 아래처럼 해당 박스를 클릭 후 '드래그 앤 드랍'으로 위치를 변경해 주시면 됩니다. 


  • 재미난 기능

플러그인중에는 emotional-jenkins-plugin 아래처럼 재밌는 기능들도 있는데요.

빌드가 깨지면 온화했던 젠킨스 아저씨가 악마로 변하는 플러그인 이에요.  



이 외에도 수 많은 플러그인들이 존재합니다. 

필요한 기능이 있다면 한번 찾아보시고 설치해서 사용해 보세요~ 


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

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



Posted by KT한
,

Brute-Force라 하면 무작위로 여러 가지 경우의 수를 계산해서 시도해보는 것을 의미하는데요. 

사람은 유사한 작업을 반복하는것을 매우 힘들어하고 싫어하는 반면 컴퓨터는 반복 작업도 곧잘 해냅니다. 

이런 컴퓨터에게 수 많은 경우의 수를 감안해서 다양한 무작위 시도를 하게 함으로써 원하는 정보를 획득 하는게 가능합니다. 


일반적으로 'SSH Brute-Force 공격'이 유명하죠. 

성공할 경우 타겟 장비의 root권한을 획득 할 수 있으므로 주의가 필요한 공격 중 하나라고 할 수 있습니다. 


이에 대한 방어를 준비했다면 제대로 방어가 되는지 확인이 필요하겠죠?

이 작업을 도와줄 좋은 도구가 있답니다. 


리눅스용 과 윈도우용 두 가지 간단한 툴을 소개하고자 합니다. 


※ 절대 이 도구를 악의적인 목적으로 사용하지는 마시기 바랍니다. 


  • 파이썬(Python)으로 작성된 리눅스용 Brute-Force 검증 툴


이름은 'Patator'인데요.. 사전상에 정확한 의미는 없지만.. 유추해 보기로는 'patate'를 사람명사로 표현해서 '바보처럼 같은 행위를 반복해주는 녀석' 정도가 아닐까 생각됩니다. 


믿음직 스러운건 구글 코드에 등록되어 있다는 겁니다. (아직 베타 버전인가 봅니다. 버전이 0.3 이네요.)

구글 코드 페이지 에서 기본 사용법인 지원 가능한 리스트를 확인 할 수 있습니다. 

자세한 설명은 다운받은 파일을 문서 편집 툴로 열어서 확인해보시면 됩니다. 


아래 링크를 클릭해서 다운 받으시면 됩니다. 

Patator 다운로드 



Patator 사용법:


다운 받은 실행 파일을 Brute-Force를 시도할 장비로 옮겨둡니다. 

실행 권한을 미리 부여해 두면 사용이 더 편리합니다. 


# chmod 777 ./patator_v0.3.py


이름도 간단하게 변경해 줍시다. 


# mv patator_v0.3.py patator.py



1. 사용 가능한 명령 리스트 조회

이것도 역시 '-h'옵션을 주면 됩니다. 


여기서는 공격 종류를 모듈이라고 부르고 있습니다. 아무래도 공격이라고 하면 왠지 어감이 안좋아서 그런것 같기도 하네요.


모듈 종류별로 별도의 도움말 페이지 조회 방법도 나오네요. 


# ./patator.py -h

Usage:

  $ ./patator.py module --help

or

  $ ln -s patator.py module

  $ ./module --help


Available modules:

  + ftp_login     : Brute-force FTP authentication

  + ssh_login     : Brute-force SSH authentication

  + telnet_login  : Brute-force Telnet authentication

  + smtp_login    : Brute-force SMTP authentication

  + smtp_vrfy     : Enumerate valid users using SMTP VRFY

  + smtp_rcpt     : Enumerate valid users using SMTP RCPT TO

  + http_fuzz     : Fuzz HTTP/HTTPS

  + pop_passd     : Brute-force poppassd authentication (http://netwinsite.com/poppassd/ not POP3)

  + smb_login     : Brute-force SMB authentication

  + ldap_login    : Brute-force LDAP authentication

  + mssql_login   : Brute-force MSSQL authentication

  + oracle_login  : Brute-force Oracle authentication

  + mysql_login   : Brute-force MySQL authentication

  + pgsql_login   : Brute-force PostgreSQL authentication

  + vnc_login     : Brute-force VNC authentication

  + dns_reverse   : Reverse lookup subnets

  + dns_forward   : Forward lookup subdomains

  + snmp_login    : Brute-force SNMP v1/2/3 authentication

  + unzip_pass    : Brute-force the password of encrypted ZIP files

  + keystore_pass : Brute-force the password of Java keystore files


2. 모듈 별 사용법 조회 
FTP에 대한 설명을 조회해봅시다. 
위에서 확인했던 명령어로 조회를 하면 됩니다. 

간단한 사용법까지 나와있어 옵션에 대한 설명을 다 보지 않더라도 사용이 가능합니다. 

# ./patator.py ftp_login --help
Usage:
ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt 1=passwords.txt -x ignore:mesg='Login incorrect.' -x ignore,reset,retry:code=500 -x reset:fgrep='Login successful'

Module options:
  host          : hostnames or subnets to target
  port          : ports to target [21]
  user          : usernames to test
  password      : passwords to test
  persistent    : use persistent connections [1|0]



3. 명령 실행
위에 나온 사용 예제를 활용해서 실행하면 됩니다. 

# ./patator.py ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt  1=passwords.txt -x ignore:mesg='Login incorrect.' -x ignore,reset,retry:code=500 -x reset:fgrep='Login successful'

여기서 사용된 옵션에 대해 간략히 살펴보면 이렇습니다. 
  1. host로 설정해준 '10.0.0.1'에 대해 FTP 로그인을 시도합니다. 
  2. FTP 로그인에 시도할 user ID와 password는 별도의 파일에 리스트 형식으로 입력해줍니다. 
  3. logins.txt에는 user ID를 한 줄에 한 개씩 가능성 있는 ID들을 입력해 줍니다. 
  4. passwords.txt에는 password를 ID처럼 가능성 있는 다양한 비밀번호를 입력해 줍니다. 
  5. 로그인 실패 메시지는 무시하고, 성공하게 되면 다른 ID/PW로 시도하기 위해 현재 연결을 끊어줍니다. 
  6. 문법 오류가 있을 때 발생하는 에러 코드 500 에 대해서도 무시하도록 합니다. 


실행 과정을 모두 보고 싶다면 뒷 부분 옵션을 생략하면 됩니다. 

# ./patator.py ftp_login host=10.0.0.1 user=FILE0 password=FILE1 0=logins.txt  1=passwords.txt


4. 결과 확인
간략한 사용결과를 보기 위해 ID만 파일에서 읽어오도록 하고 실행한 결과입니다. 

# ./patator.py ftp_login host=192.168.10.10 user=FILE0 password=qwe123 0=logins.txt
18:24:17 patator    INFO - Starting Patator v0.3 (http://code.google.com/p/patator/) at 2012-09-18 18:24 KST
18:24:17 patator    INFO -
18:24:17 patator    INFO - code & size     | candidate                   |   num | mesg
18:24:17 patator    INFO - ---------------------------------------------------------------
18:24:17 patator    INFO - 230 17          | root                        |     7 | Login successful.
18:24:20 patator    INFO - 530 16          | admin                       |     1 | Login incorrect.
18:24:20 patator    INFO - 530 16          | administrator               |     2 | Login incorrect.
18:24:20 patator    INFO - 530 16          | user                        |     3 | Login incorrect.
18:24:20 patator    INFO - 530 16          | guest                       |     4 | Login incorrect.
18:24:20 patator    INFO - 530 16          | tmp                         |     5 | Login incorrect.
18:24:20 patator    INFO - 530 16          | test                        |     6 | Login incorrect.
18:24:20 patator    INFO - Hits/Done/Size/Fail: 7/7/7/0, Avg: 2 r/s, Time: 0h 0m 3s


시간대 별로 로그인을 시도한 ID별로 결과 코드와 메시지가 출력됩니다. 
메시지에 'Login successful'이 출력되어 있다면 FTP Brute-Force에 의해 취약점이 드러난게 됩니다. 


실행시에 디펜던시(dependency)가 걸린 다른 프로그램이 있다면 실행이 되지 않겠죠? 
추가적으로 설치 해야할 게 있다면 이렇게 오류 메시지가 나타나게 됩니다. 

# ./patator.py ssh_login --help
ERROR: paramiko (http://www.lag.net/paramiko/) is required to run ssh_login.
Please read the README inside for more information.

해당 프로그램을 설치 한 후에 다시 실행 하시면 됩니다. 


=== 본문 내용 추가 ===
디펜던시를 파일들을 설치하는 법에 대한 문의가 있어 내용을 추가합니다. 
우선 파이썬(Python)을 처음 접해보시거나 익숙하지 않으시다면 파이썬 파일들을 간편하게 설치할 수 있도록 도와주는 툴을 하나 다운받아 설치 하세요. 
우리가 사용할 것은 'easy_install'인데 이것은 'setuptools'에 포함되어 있습니다. 
해당 사이트에 가서 'setuptools' 파일을 다운 받아 주세요.  wget 명령어로 받으셔도 됩니다. 

개인 사정으로 Ubuntu환경에서 설치하는 과정을 올리게 됐습니다. 다른 OS라면 감안하셔서 진행해주세요. 

$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-1.1.6.tar.gz

파일을 받았다면 압축을 풀어주세요. 

$ tar xvf setuptools-1.1.6.tar.gz 

압축을 다 풀고 나면 폴더에 들어가서 설치를 진행해 주면 됩니다. 

$ python setup.py  build
$ sudo python setup.py  install

setup.py라는 파일을 실행하면 되는데, 뒤에 'build', 'install'처럼 수행할 명령어를 지정해주면 됩니다. 
'install'은 root 권한이 있어야만 됩니다. 

이제 easy_install이란 명령어가 사용 가능할 겁니다. 이 명령어로 디펜던시 파일들을 설치 하시면 됩니다. 
한 예로 ssh_login 모듈에 필요한 'paramiko'를 설치하는 법을 알아봅시다. 

먼저 에러 메시지에 있는 링크에 들어가서 'paramiko' 파일을 받아줍니다. 물론, wget으로 받아도 됩니다. 

$ wget https://github.com/paramiko/paramiko/archive/v1.12.0.tar.gz

압축을 풀고 폴더에 들어가서 조금전에 설치 했던 'easy_install'을 활용해서 설치를 진행합니다. 

$ sudo easy_install ./
Processing 
Writing /home/kyungtae/Workspace/Reference/paramiko-1.12.0/setup.cfg
Running setup.py -q bdist_egg --dist-dir /home/kyungtae/Workspace/Reference/paramiko-1.12.0/egg-dist-tmp-8Fc0eB
warning: no files found matching '*' under directory 'docs'
zip_safe flag not set; analyzing archive contents...
Adding paramiko 1.12.0 to easy-install.pth file

Installed /usr/local/lib/python2.7/dist-packages/paramiko-1.12.0-py2.7.egg
Processing dependencies for paramiko==1.12.0
Searching for ecdsa
Reading https://pypi.python.org/simple/ecdsa/
Best match: ecdsa 0.9
Downloading https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.9.tar.gz#md5=2b9c35245ce391d6b7d8f991aad5c630
Processing ecdsa-0.9.tar.gz
Writing /tmp/easy_install-_16pCs/ecdsa-0.9/setup.cfg
Running ecdsa-0.9/setup.py -q bdist_egg --dist-dir /tmp/easy_install-_16pCs/ecdsa-0.9/egg-dist-tmp-0hYqTP
zip_safe flag not set; analyzing archive contents...
Adding ecdsa 0.9 to easy-install.pth file

Installed /usr/local/lib/python2.7/dist-packages/ecdsa-0.9-py2.7.egg
Finished processing dependencies for paramiko==1.12.0

설치가 완료 되었다면 다시 patator를 실행해봅시다. 

$ python patator.py  ssh_login
Usage: 
ssh_login host=10.0.0.1 user=root password=FILE0 0=passwords.txt -x ignore:mesg='Authentication failed.' -x ignore,reset,retry:mesg='No existing session' -x reset:code=0

설치가 정상적으로 되었군요. 이제 사용법에 맞는 명령어를 써서 사용하시면 됩니다. 



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




  • 윈도우용 GUI기반 Brute-Force 검증 툴 

Bruteus라는 툴입니다. 
최근에는 업데이트가 되고 있지는 않지만.. Brute-Force가 워낙 고전적인 방식이라.. 검증하는데는 크게 문제가 없어보입니다. 윈도우7에서도 정상적으로 동작합니다. 

홈페이지에서 설명 및 다운이 가능합니다. 


Brutus 사용법:

BrutusA2.exe 를 실행 시킵니다. 
한 눈에 보기에도 직관적으로 사용이 가능할 정도로 심플합니다. 

먼저, Target에 검증 할 서버의 IP주소를 넣어줍니다. 
Type에서 원하는 종류를 선택 후 'Start'버튼을 눌러주면 됩니다. 


화면 하단에 현재 진행 상황에 대한 메시지와 함께 진행률이 표시됩니다. 


사용자 ID와 비밀번호 파일은 함께 제공되고 있습니다. 

비밀번호는 800여개나 되네요. 만약 저 파일에 제공되는 비밀번호 중 하나를 사용중이라면 변경하는게 좋겠죠? 



우리의 서버 우리가 먼저 검증해서 안전하게 지킵시다~ 


Posted by KT한
,
블로거라면 '다음 뷰' 를 알고 계실텐데요.

 

다음 뷰를 보고 방문하는 사람도 은근히 많고
쌓여가는 추천 수를 보고 있으면 왠지 모를 뿌듯함 까지 느낄 수 있죠. 


그런데.. 
모바일용 다음뷰 서비스를 지원 해주면서
퍼가기 에는 모바일용 주소를 제공해 주지 않더라는 거죠. 

이런 버튼 말이죠~
추천은 저를 춤추게 합니다 ^^


요즘은 스마~트 시대여서 
모바일 기기에서 방문하는 숫자가 갈수록 증가하는 추세라 아쉬움이 더 큽니다. 

그래서 열심히 검색도 해봤지만..
아무도 알려주는 곳이 없더군요. 


그리하야 독학으로 찾아낸 방법!

다음 뷰 모바일 페이지의 소스를 뒤져서 소스를 어렵사리 구할 수 있었습니다. 

※ 아래 코드를 더블클릭 하시면 복사가 가능합니다. 
 

빨간색으로 표시한 부분만 넣고자 하는 포스팅의 id값으로 수정해주시면 됩니다.


<iframe class="tt_plugin_daumView" src="http://api.v.daum.net/open/recommend_widget?nid=17123113&amp;service=tistory" width="56" height="55" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" title="Daum view 추천"></iframe>


그런데.. 내 포스팅의 id를 어떻게 아냐구요?

어렵지 않아요~ 

여러분이 올린 글을 다음뷰에서 클릭 하면  아래 그림처럼 나오는데요.. 
오른쪽에보면 '추천 분석'을 클릭 후 '추천 위젯'을 클릭하면 됩니다.  

이걸 클릭하면 퍼갈 수 있게 소스를 보여줍니다. 


여기서 id값을 복사하면 됩니다.
아래 발간색 박스 친 부분에 있는 숫자가 여러분이 찾는 id 값이랍니다. 



이 값만 바꿔서 글에 등록 하면 
이런 이쁜 모바일용 다음뷰 아이콘이 등록 됩니다.  참잘했어요


참고로, 다음뷰 소스를 서식에 저장해놓고 쓰면 매우 편리합니다. 

이제 모바일 페이지에서도 원하는 위치에 다음뷰 추천 배너를 넣어봅시다~  

추신) '다음 지도'와 함께 넣게 되면 모바일 페이지에서 추천 버튼 이후 내용이 잘려버립니다. ㅠ.ㅠ  
지도를 넣어야 하는 포스트에서는 iframe대신 embed를 사용하시거나 네이버 지도를 사용하셔야 합니다. 

<embed class="tt_plugin_daumView" src="http://api.v.daum.net/open/recommend_widget?nid=17123113&amp;service=tistory" width="56" height="55" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" title="Daum view 추천"></embed>

※ 아래 코드를 더블클릭 하시면 복사가 가능합니다. 

네이버 지도 넣는법은 '티스토리에 네이버 지도 넣기' 포스트를 참고하세요. 

네이버 블로그에 다음뷰를 넣고자 하시는 분들의 문의가 많은데요. 

PC버전에서는 잘 되지만 모바일 페이지에서는 보이지 않는 문제가 있습니다. 
이는 네이버에서 외부 사이트 링크에 대해서 주소가 'www.youtube.com'이 아니면 무조건 필터링을 통해 내용을 지워버리는 것으로 확인 되었습니다. 
현재 여러가지로 방법을 찾아보고는 있으나.. 쉽지 않네요. 
혹시 방법을 아시는 분이 계시다면 정보 공유 부탁드립니다. ^^ 

 
도움이 되셨다면 추천 한번 눌러주세요~ ^^ 


'IT 생활 > 블로그' 카테고리의 다른 글

[블로그] 티스토리에 네이버 지도 넣기  (0) 2012.04.09
Posted by KT한
,

내가 만든rpm에 서명을 넣는 방법에 대해 알아봅시다. 


우선 rpm에 서명(signature)를 넣는 방법은 크게 두 가지가 있을 수 있습니다. 


  1. rpm 빌드 할 때 서명을 넣는 방법
  2. rpm 생성을 완료한 후 서명을 넣는 방법


저는 젠킨스(Jenkins)라는 CI(Continuous Integration)를 사용하고 있기 때문에, 젠킨스를 통해 rpm 생성 시점에서 서명을 넣는 방법을 택하였습니다. 


수행 절차:


1. 서명 만들기 


gpg 명령어를 써서 서명을 만들어봅시다. 

$ gpg --gen-key 


서명을 만드는 절차를 모두 보고 싶다면.. 


키 생성은 DSA로 하였으며, 키 길이는 1024로 해줬습니다. 

'Real name'에 입력한 값은 꼭 기억해 둬야 합니다. 


2. rpm 만들때 서명 넣기 


  • 서명 넣기 

$ rpm --addsign -D '_signature gpg' -D '_gpg_name Realname' -D '_gpg_path ~/.gnupg/'  sign_to_this.rpm"

Enter pass phrase: *****

Pass phrase is good.


  • 입력 값 
  1. 서명 타입( _signature - gpg로 생성했으므로 gpg
  2. 서명 이름( _gpg_name ) - 서명을 만들 때 'Real name'에 입력했던 이름
  3. 서명 경로( _gpg_path ) - 일반적으로 'home'경로의 '.gnupg' 폴더에 생성됨
  4. 서명을 넣고자 하는 rpm 경로 및 이름  


  • 통합 관리  

/home/.rpmmacros 파일에 위 정보들을 넣어두면 매번 수동으로 입력해주지 않아도 됩니다. 


%_signature gpg

%_gpg_path ~/.gnupg

%_gpg_name UserName (Example GPG Key Signature For RPM Packages) <user@signature.com>

%_gpgbin /usr/bin/gpg                              <- which gpg로 확인 가능 




3. rpm에 넣은 서명 확인 


$ rpm --checksig <rpm_name> 

혹은 -K 옵션도 동일 


예) $ rpmsign -K my_signed.x86_64.rpm

my_signed.x86_64.rpm: (SHA1) DSA sha1 md5 (GPG)



4. yum으로 서명이 들어간 rpm 설치하기  


먼저 KEY파일을 rpm을 설치하는 장비에 옮겨놔야합니다. 

/etc/pki/rpm-gpg 폴더에 fedora에서 사용하는 key파일이 있으므로 이곳으로 옮겨줍니다. 


그 다음.. 

/etc/yum.repos.d/<name>.repo  파일을 열어서 다음 옵션을 사용해서 설치할 rpm의 서명을 확인 하도록 'gpgcheck'값을 1로 변경해줍니다. 

물론, gpgkey 경로도 설정해줘야 하구요. 


gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/Username-GPG-KEY



5. 서명 자동화 

위 작업을 빌드 자동화 시스템에 추가하고자 한다면 매번 수동으로 서명을 넣는 것은 미친 짓일겁니다. 
이제 반복잡업을 군소리 없이 잘 해주는 컴퓨터에게 매번 알아서 하도록 시켜줘야겠죠?

자동화 작업의 최대 난관은 서명을 추가할 때 마다 비밀번호를 입력 받는다는 것입니다. 
비밀번호를 요구할 때 자동으로 지정해준 비밀번호를 넣어주도록 해줘야 하는데 이를 위해 expect를 사용하기로 했습니다. 

조인씨 사이트에 나온 설명을 인용하자면..  

expect 를 이용하면 다른 어플리케이션과 상호대화를 할수 있게 됨으로 자동화된 프로그램을 만들수가 있다. 



expect에 대한 설명 뿐 아니라 perl을 사용해서 자동화 프로그램을 작성하는 법 및 예문까지 친절하게 나와있답니다. 


참고로, 위 작업을 위해서는 expect와 perl-Expect를 설치해주셔야 합니다. 

$ yum install perl-Expect

Downloading Packages:
(1/2): perl-Expect-1.21-3.fc12.noarch.rpm                                                                           |  70 kB     00:00
(2/2): perl-IO-Tty-1.08-3.fc12.x86_64.rpm                                                                             |  39 kB     00:00
-------------------------------------------------------------------------------------------------------------

$ yum install expect 

Downloading Packages:
(1/2): expect-5.43.0-19.fc12.x86_64.rpm                                                                                  | 238 kB     00:00
(2/2): tcl-8.5.7-5.fc12.x86_64.rpm                                                                                           | 1.9 MB     00:00
-------------------------------------------------------------------------------------------------------------                                                                                                  


스크립트는 다음만 조심해서 작성하면 됩니다. 

  •  spawn() 함수 
상호대화할 프로그램을 띄우기 위한 목적으로 사용됩니다. 여기서는 rpm 으로 서명을 넣는 명령을 정의해 주면 됩니다. 

예)
my $exp = Expect->spawn("rpm --addsign -D '_signature gpg' -D '_gpg_name UserName' -D '_gpg_path ~/.gnupg/' sign_to_this.rpm");

  • expect() 함수
특정한 문자열을 기다리고, 해당 문자열을 발견하게 되면, 어떤 행동을 취할수 있도록 인터페이스를 제공해줍니다. 
여기서는 서명에 대한 비밀번호 입력 요청을 기다리게 됩니다.  

예)
$exp->expect($timeout,
    [qr 'Enter pass phrase:' => \&inputpassphrase],);

sub inputpassphrase
{
    my $lexp = shift;
    $lexp->send("mypassword\n");
    exp_continue;
}

  • send()함수 
원하는 문자열을 전달합니다. 위의 예제를 보시면 알 수 있듯 비밀번호를 전송하게 됩니다. 

예)
$lexp->send("mypassword\n");


6. 검증 

이제 자동화 스크립트에 의해 서명이 들어간 rpm이 제대로 설치 되는지만 확인해보면 된답니다. 
Posted by KT한
,