728x90

리눅스 특수권한에 대해 살펴보겠습니다.

리눅스는 보통 사용자와 파일에 권한을 부여해 가장 기초적인 보안 체계를 이룹니다.

일반적으로 파일이나 디렉토리에는 user, group, other 권한이 존재하고

각각 읽기, 쓰기, 실행 권한을 부여할 수 있습니다.

이런 일반 권한 이외에도 리눅스에는 특수권한이란 것이 존재합니다.

 

  • SetUID

SetUID가 설정된 파일을 실행할 때 일시적으로 파일 소유자의 권한을 얻어 실행할 수 있도록 합니다. 

예를들어 root 권한으로 지정된 프로그램에 SetUID가 지정되어 있다면 실행할 때 root 권한으로 실행됩니다.

SetUID를 적용하기 위해서는 기존의 허가권 앞에 4를 붙이면 됩니다.

ex) # chmod 4644 파일이름

<기존 권한에 실행권한이 없으면 대문자 S, 있으면 소문자 s로 표시됩니다.>

 

SetUID가 적용되어 있는 파일 중 가장 대표적인 것은 /usr/bin/passwd 파일입니다.

해당 파일은 계정의 비밀번호를 변경할 수 있도록 하는 명령어 실행 파일로

/etc/passwd로 접근하여 비밀번호를 변경하도록 합니다.

실제 /etc/passwd의 권한은 소유주인 root만이 변경이 가능하도록 설정이 되어있습니다.

만약 /usr/bin/passwd에 SetUID가 적용되어있지 않다면 일반 사용자들은 

항상 관리자를 거쳐 자신의 비밀번호를 변경해야합니다.

이런 번거로움을 줄이기위해 일반 사용자들도 root의 권한으로 /etc/passwd 파일을 수정 가능하도록 설정한 것입니다.

 

  • SetGID

 SetUID와 마찬가지로 SetGID가 설정된 파일을 실행할 때 일시적으로 파일 소유그룹의 권한을 얻어 실행하도록 합니다.

SetGID를 적용하기 위해서는 기존의 허가권 앞에 2를 붙이면 됩니다.

ex) # chmod 2644 파일이름

<기존 권한에 실행권한이 없으면 대문자 S, 있으면 소문자 s로 표시됩니다.>

 

  • Sticky Bit

Sticky Bit가 설정된 디렉토리에 파일을 생성하면 해당 파일은 생성한 사람의 소유가 되며

소유자와 root만이 해당 파일에 대한 삭제 및 수정에 대한 권한을 가질 수 있습니다.

즉, Sticky Bit가 설정된 디렉토리안에 누구나 파일을 생성할 수는 있지만 삭제는 본인과 관리자만 가능하게 되는겁니다. 

Sticky Bit를 적용하기 위해서는 기존의 허가권 앞에 1를 붙이면 됩니다.

ex) # chmod 1644 디렉토리이름

<기존 권한에 실행권한이 없으면 대문자 T,  있으면 소문자 t로 표시됩니다.>

 

 

일반적으로 유닉스 운영체제는 파일이나 디렉토리의 소유자, 소유그룹만이 삭제, 수정을 할 수 있도록 권한을 지정하지만

모든 사용자들이 파일 생성, 수정, 삭제 할 수 있는 디렉토리가 있습니다. 

/tmp와 /var/tmp 디렉토리는 모든 사용자가 사용하는 공용 디렉토리입니다.

그렇다보니 파일의 소유자가 아닌 다른 사용자가 777권한인 파일을 삭제, 수정하는 부분에서 문제가 발생하게 됩니다.

이를 방지하기 위해 Sticky Bit를 설정하여 공용 디렉토리라 하더라도

그 파일의 소유자와 관리자만이 삭제, 수정 권한을 가질 수 있습니다.

 

  • 참고로 특수 권한은 해당 자리의 기존 권한에 실행 권한이 있어야 정상적으로 적용이 됩니다.
728x90

트랩도어란 시스템 보안이 제거된 비밀 통로로, 서비스 기술자나 유지ㆍ보수 프로그램 작성자의 접근 편의를 위해 시스템 설계자가 일부러 만들어 놓은 시스템의 보안 구멍을 의미합니다. 백도어(Backdoor)라고도 합니다. 대규모의 응용 프로그램이나 운영체제 개발에서는 코드 도중에 트랩도어라는 중단 부분을 설정해 쉽게 보수할 수 있도록 하고 있습니다.

최종 단계에서 삭제돼야 하는 트랩도어가 남아 있으면 컴퓨터 범죄에 악용되기도 합니다.

728x90

 

 

 

1. 개요

 

사이버 범죄자들은 특정 기업이나 조직, 개인을 해킹하기 위해서 어떤 방법을 사용할까? 메일에 악성코드를 첨부해서 전달하는 방법, 정보시스템의 취약점을 이용하는 방법, 악성 행위 유포지를 이용하는 방법 등 다양한 방법이 알려져 있다. 그 중 이번 호에서는 해킹 사건·사고의 빈번한 원인이 되는 '워터링 홀(Watering Hole)‘ 공격에 대해 알아보자. 2018년 국내 A가상화폐 거래소는 워터링 홀 공격을 빌미로 200억 원어치의 가상화폐를 도난 당했다. 경찰은 사이버 범죄자가 워터링 홀 공격을 시작으로 했다는 발표를 했다.

 

1) 워터링 홀 공격이란

 

워터링 홀 공격이란 공격대상이 자주 방문하는 홈페이지를 사전에 악성코드에 감염시킨 뒤 공격대상이 접속 할 때까지 잠복하면서 기다린다. 그리고 공격대상이 접속하면 비로서 공격을 시도하는 수법이다. 홈페이지에 접속하는 모든 사용자를 공격하기 때문에 접속하는 모든 사용자가 공격의 대상이 될 수 있다. 워터링 홀의 어원은 사자가 먹잇감을 습격하기 위해 물 웅덩이 근처에 숨어 있는 모습을 빗댄 표현이다. 먹잇감이 물을 마시기 위해 물 웅덩이로 접근하면 숨어있던 사자가 기습 사냥에 나서는 것이다. 

 

예를 들어 사이버 범죄자가 워터링 홀 공격으로 A사에 재직 중인 김씨의 컴퓨터를 해킹한다고 하자. 사이버 범죄자는 사전에 김씨가 자주 방문하는 홈페이지와 정보시스템을 조사, 분석한 후 악성코드에 감염시킨다. A사의 대표 홈페이지, 그룹웨어, 계열사 홈페이지 등이 될 수 있다. 다음으로 김씨가 홈페이지에 접속하면 잠복해있는 악성코드가 동작해 김씨 컴퓨터를 해킹하는 것이다. 대표적으로 브라우저에서 동작하는 Flash, Javascript, VBScript, ActiveX, XSS, HTML, Image 취약점 등을 공격에 사용한다. 

 

 

2) 워터링 홀 공격과정

 



 

3) 워터링 홀 공격요소

 

워터링 홀 공격은 인터넷 브라우저에서 동작하는 다양한 엔진들의 취약점을 이용한다.

 


 

 

2. 크로스 사이트 스크립트 취약점(Cross Site Script)을 이용한 공격 분석

 

1) 크로스 사이트 스크립트 취약점을 이용한 공격 시나리오

 

사이버 범죄자는 공격대상이 자주 방문하는 홈페이지에 크로스 사이트 스크립트 취약점을 공격한다. 취약점이 발견되면 악성 행위 스크립트를 삽입해 공격대상이 접속할 때까지 기다린다. 해당 페이지에 공격대상이 접속을 하면 악성 스크립트가 실행이 된다. 

 


 

① 사이버 범죄자는 크로스 사이트 스크립트 취약점이 존재하는 페이지에 악성 스크립트를 삽입한다.

- 악성 스크립트 구문 :

- 설명 : hook.js는 공격자 서버에서 동작하고 있는 BeEF 브라우저 후킹 공격 스크립트이다. 해당 스크립트 구문은 공격대상 PC에서 실행된다.

※ BeEF(Browser Exploitation Exploitation Framework) : 인터넷 브라우저를 이용한 여러 가지 공격 모듈을 가지고 있으며, 공격대상 PC에서 스크립트를 실행 시켜 공격한다.

 

② 피해자가 악성 스크립트가 삽입된 페이지에 접속한다.

③ 피해자 PC에서 스크립트가 실행되면서 인터넷 브라우저 후킹된다. 사이버 범죄자는 공격대상의 PC를 공격할 수 있게 된다.

 

 

2) 크로스 사이트 스크립트 취약점을 이용한 공격 분석

 

공격자는 BeEF 브라우저 후킹 도구를 동작시킨 후 공격대상이 자주 방문하는 홈페이지에 악성 스크립트 구문을 몰래 삽입한다. 공격대상이 해당 페이지에 접근할 경우 공격자에게 후킹되어 공격자는 홈페이지 로그인 쿠키(Cookie) 값을 탈취한다.​

 

① 공격자는 BeEF를 동작시킨다.


 

② 공격대상이 자주 가는 홈페이지 게시판에 BeEF 후킹 스크립트 구문을 몰래 삽입한다.


 

③ 공격대상이 해당 페이지에 접근한다. 아무런 증상이 없어 보이지만, 공격자의 후킹 스크립트가 실행되고 있다. (피해자 IP: 192.168.111.4)


 

④ 피해자의 인터넷 브라우저가 후킹되어 공격자의 BeEF 콘솔에 등록된다.


 

⑤ BeEF 도구를 통해서 공격대상의 브라우저 관련 정보를 확인할 수 있다.


 

⑥ 아래와 같이 BeEF 도구에 각종 해킹툴 모듈을 추가하면 수백가지 취약점으로 공격 시도할 수 있다.


 

⑦ 아래와 같이 공격자는 파해자의 세션 쿠키 정보를 탈취할 수 있다.


 

⑧ 마지막으로 세션 쿠키 정보를 위조해서 피해자 계정으로 로그인 할 수 있다.

 

 

3) 크로스 사이트 스크립트 취약점을 이용한 공격 대응 방법

 

▶ 게시물에 HTML이나 자바 스크립트에 해당되는 태그 사용을 사전에 제한

▶ 사용자가 입력한 값에 대한 필터링 작업 필요

▶ 게시물의 본문, 제목, 댓글, 검색어 입력 창, 그 외 사용자 측에서 넘어오는 값에 대해서 필터링을 수행함

▶ 입력값에 대한 필터링 로직 구현 시 공백 문자를 제거하는 trim, replace 함수를 사용하여 반드시 서버 측에서 구현되어야 함

 

※ 필터링 조치 대상 입력 값

- 스크립트 태그 : < SCRIPT >, < OBJECT >, < APPLET >, < EMBED >, < FORM >, < IFRAME > 등

- 특수문자 : <, >, ", ', &, %, %00(null) 등​

 

 

3. 인터넷 브라우저 취약점(CVE-2019-0752)을 이용한 공격 분석

 

1) 인터넷 브라우저 취약점을 이용한 공격 시나리오

 

사이버 범죄자는 인터넷 브라우저 취약점을 공격하는 홈페이지를 개설한다. 피해자가 홈페이지에 접속하면 브라우저의 취약점을 공격해 공격명령을 실행한다. 홈페이지에 접속 한 것 만으로 사이버 범죄자의 명령이 실행되는 것이다.

 


 

① 사이버 범죄자는 인터넷 브라우저 취약점을 공격하는 홈페이지를 개설하거나 피해자가 즐겨 찾는 홈페이지에 몰래 삽입한다.

② 피해자가 감염 홈페이지에 접속한다.

③ 웹 페이지의 악성코드를 인터넷 브라우저가 프로세싱 하면서 공격구문이 실행된다.

 - 악성코드 다운로드, 악성코드 실행, 계정 유출 등 다양한 공격이 가능

 

 

2) 인터넷 브라우저 취약점을 이용한 공격 분석

 

① 공격자는 인터넷 브라우저의 스크립트 엔진 취약점을 공격하는 코드를 작성해 홈페이지에 삽입한다. 해당 시나리오를 구현하기 위해서 CVE-2019-0752 취약점을 사용했다.

※ CVE-2019-0752 : 인터넷 익스플로러 10, 11버전의 VBScript 엔진의 취약점이다. 소스코드를 프로세싱 하는 과정에 메모리 취약점으로 공격 명령을 실행시킬 수 있다.

 

② 피해자가 해당 홈페이지에 접속하면 인터넷 브라우저가 스크립트 엔진을 실행하면서 공격자의 공격 명령이 실행된다.

※ 피해자 PC 정보 : 윈도우 10, 인터넷 익스플로러 11 사용

 

③ 취약점을 이용해 파워쉘을 실행한 후 윈도우 운영체제에 등록된 계정을 확인하는 공격 코드를 작성하였다. 공격대상이 홈페이지에 접속하면 자동으로 파워쉘 명령이 실행된다. 실행되는 과정은 아래와 같이 확인할 수 있다.



④ 피해자가 홈페이지에 접속한 것만으로 공격 명령이 실행되는 것을 확인할 수 있다.


 

⑤ 브라우저 취약점을 이용하면 악성코드를 다운받거나 원격제어를 하는 등의 악성 행위를 할 수 있다.

 

 

3) 인터넷 브라우저 취약점을 이용한 공격 대응 방법

 

▶ 최신 버전의 인터넷 브라우저를 사용한다.

▶ 소프트웨어 자동 업데이트 기능을 활성화한다.

▶ 운영체제의 자동 업데이트 기능을 활성화한다.

▶ 백신 프로그램의 실시간 감시, 자동 업데이트 기능을 활성화한다.

▶ 수상한 이메일에 포함된 링크를 함부로 클릭하지 않는다.

 

 

4. 결론

 

워터링 홀 공격은 사이버 범죄자들이 자주 사용하는 공격기법이다. 특정 공격대상과 불특정 다수를 노릴 수 있고 주로 알려지지 않은 취약점을 이용하기 때문에 굉장히 위협적이다. 대응하기도 쉽지 않다. 사이버 범죄자가 홈페이지의 취약점을 이용해 악성코드를 숨겨두기 때문에 사용자는 보안패치, 백신 업데이트를 하는 등의 최소한의 보안 조치가 필요하다. 하지만 근본적으로 해결하기 위해서는 소프트웨어를 개발할 때부터 취약점 점검 및 제거하는 노력으로 워터링 홀 공격에 대비해야 한다.​ 

728x90
구분 정량적 위험분석 정성적 위험분석
접근유형 수학 공식 접근법
확률 분포 추정법
확률 지배
몬테카를로 시뮬레이션
과거자료 분석법
델파이법
시나리오법
순위결정법
퍼지행렬법
질문서법
장점 객관적인 평가 기준 적용
논리적으로 평가되어 이해가 쉬움
위험관리 성능평가 용이
가치평가 및 계산이 필요 없음
단점 많은 시간과 비용이 소요
자동화의 경우 정확도의 변이
주관적인 평가 우려
결과의 이해가 어려움
위험관리 성능 추적이 어렵다.

대부분 문제의 단골은 접근유형의 종류를 물어보는 문제이다.

 

나는 그래서 앞글자를 따서 암기하려고 노력한다.

 

정량적인 방법은 수학에 있는 확률들로 과거 자료인 문테카를로 분석! 

 

정성적인 방법은 질문  시(시나리오)퍼(퍼지행렬) 델(델파이법)순(순위결정법)....

 

무튼 나는 이렇게 암기를 한다...

 

암기가 참 어려운데 사실 정량적 위험분석과 정성적 위험 분석을 이해하면 쉽게 풀 수 있다.

 

정량적인 방법은 수치를 중심으로 정성적인 방법은 수치가 아닌 만족도라고 생각한다.

 

수치에 중심적인 정량적 방법은 논리적이며 객관적이지만 많은 시간과 비용이 소요된다.

 

만족도 및 표현에 중심인 정성적 위험분석은 계산을 따로 안해도 되지만 주관적인 평가를 할 수 있다.

 

기출 문제를 예시로 풀어보자.

더보기

Q. 다음 중 정량적 위험분석 기법과 정성적 위험분석 기법의 장단점에 대한 설명으로 틀린것은?

1. 정량적 위험분석 기법은 객관적인 평가 기준이 적용된다.

2. 정량적 위험분석 기법은 위험관리 성능 평가가 용이하다.

3. 정성적 위험분석 기법은 손실 및 위험을 개략적인 크기로 비교하여 점수화한다.

4. 정성적 위험분석 기법은 비용/가치분석이 수행될 수 있다.

답은?

 

더보기

Q. 다음 중 정량적 위험분석 기법과 정성적 위험분석 기법의 장단점에 대한 설명으로 틀린것은?

1. 정량적 위험분석 기법은 객관적인 평가 기준이 적용된다.

2. 정량적 위험분석 기법은 위험관리 성능 평가가 용이하다.

3. 정성적 위험분석 기법은 손실 및 위험을 개략적인 크기로 비교하여 점수화한다.

4. 정성적 위험분석 기법은 비용/가치분석이 수행될 수 있다.

-> 가치 분석이 필요 없음

 

오늘은 이렇게 정성적 위험분석과 정량적 위험분석을 공부했다.

'IT > 정보보안' 카테고리의 다른 글

디지털 포렌식 5대 원칙  (0) 2021.08.25
오용탐지와 이상탐지  (0) 2021.08.25
암호화 알고리즘  (0) 2021.08.25
재해복구시스템의 복구 수준별 유형  (0) 2021.08.25
접근 통제 정책  (0) 2021.08.18
728x90

대칭키 알고리즘 : 같은키로 암호화 복호화
AES, DES
암호화 복호화에 같은키 1개를 사용하므로 속도면에서 이점이 있음
송신측 소스 123 이라면 +1 로 암호화 해서 234 로 보내면 수신측에서는 -1 해서 123으로 복호화 하는 방식

공개키 암호화 알고리즘 : 공개키로 암호화 하고 비밀키로 복호화
RSA
암호화 복호화에 다른 2개의 키를 사용함

https:// 로 시작하는 URL의 경우 웹사이트 인증에는 공개키 암호화 알고리즘을 사용하고
데이터 송수신에는 대칭키 암호화 방식을 사용함

디피 헬만키 교환 알고리즘

대칭키의 속도 이점을 취하면서 중간에 키를 탈취당해도 정보를 지키는 방법

2가지 요건을 만족해야함
1. 중간에 다른 사람이 반 쪽 키 두개를 모두 탈취 한다고 해도 온전한 대칭 키를 만들 수 없다.
2. 반쪽 키를 합쳐서 온전한 키를 만드는 방법은 공개되어 있어야 한다.

양방향 함수 : 2x=y 와 같은 형태
일방향 함수 : Y=a^x mod b

디피 헬만 키 교환 알고리즘은 이산 대수 문제라는 일방향 함수의 특징을 그대로 활용하여 만난 적도, 본 적도 없는 두 사람 만이 아는 비밀의 대칭 키를 만들어 내는 마법같은 알고리즘 입니다.

728x90

'IT > 정보보안' 카테고리의 다른 글

디지털 포렌식 5대 원칙  (0) 2021.08.25
오용탐지와 이상탐지  (0) 2021.08.25
정량적 위험분석 기법과 정성적 위험분석 기법  (1) 2021.08.25
암호화 알고리즘  (0) 2021.08.25
접근 통제 정책  (0) 2021.08.18
728x90

강제적 접근통제 정책에 대한 설명으로 옳지 않은 것은?
①모든 주체와 객체에 보안관리자가 부여한 보안레이블이 부여되며 주체가 객체를 접근할 때 주체와 객체의 보안 레이블을 비교하여 접근허가 여부를 결정한다. 
② 미리 정의된 보안규칙들에 의해 접근허가 여부가 판단되므로 임의적 접근통제 정책에 비해 객체에 대한 중앙 집
중적인 접근통제가 가능하다.
③ 강제적 접근통제 정책을 지원하는 대표적 접근통제 모델로는 BLP(Bell-Lapadula), Biba 등이 있다.
④ 강제적 접근통제 정책에 구현하는 대표적 보안 메커니즘으로 Capability List와 ACL(Access Control List) 등 이 있다


접근통제 정책의 구분

  1. 임의적 접근통제정책(DAC ; Discretionary Access Control)

  2. 강제적 접근통제정책(MAC ; Mandatory Access Control)

  3. 역할기반 접근통제정책(RBAC ; Role-based Access Control)

 

1. 임의적 접근통제정책(DAC)

 (1) DAC의 개념

  데이터의 소유자(owner)가 접근을 요청하는 사용자의 신분 즉 식별자(identity ; ID)에 기초하여 객체에 대해 접근을 제한하는 접근통제 방법이다.

 

 (2) DAC의 특징

  ① 접근 권한을 객체의 소유자가 임의로 지정하는 자율적 정책이다.

  ② 허가된 주체에 의하여 변경 가능한 하나의 주체와 객체간의 관계를 정의한다.

  ③ 접근 통제 목록(ACL ; Access Control List)등을 사용한다.

  ④ 강제적 접근제어 (MAC) 방식을 대체하는 기술은 아니다.

  ⑤ 오렌지북 C-레벨의 요구사항이다.

  ⑥ 장 · 단점

   ㄱ. 장점 : 융통성이 많아 상업적 용도로 사용된다.

   ㄴ. 신분(ID)도용 시 통제 방법이 없다.

 

 (3) DAC의 종류

  ① Identity-Based DAC : 주체와 객체의 ID(Identity)에 따른 접근통제로 유닉스에서 사용한다.

  ② User-Directed : 객체를 소유하고 있는 소유자가 접근 권한을 설정 및 변경할 수 있는 접근 통제이다.

 

 

 

2. 강제적 접근통제정책(MAC)

 (1) MAC의 개념

  강제적인 접근 제한 또는 MAC은 정보시스템 내에서 어떤 주체가 어떤 객체에 접근하려 할 때 양자의 보안레이블(보안등급)을 비교하여 높은 보안을 요하는 정보가 낮은 보안수준의 주체에게 노출되지 않도록 접근을 제한하는 접근통제 방법이다.

 

 (2) MAC의 주요 특징

  ① 접근승인은 보안레벨(level)과 카테고리(category)로 구성되는 보안레이블(Security label)에 의해 제한된다.

  ② 접근정책은 시스템(system)에 의하여 강제적으로 정의되기 대문에 Rule-based 접근통제라고도 한다.

  ③ 오렌지북 B-레벨의 요구사항으로 DAC보다 안전하다.

  ④ 장 · 단점

   ㄱ. 장점 : 보안이 매우 엄격하여 군대와 같은 민감한 정보의 기밀성을 보장하는데 사용된다.

   ㄴ. 단점 : 모든 접근에 대해 보안등급을 정의하고 정책을 확인해야 하기 때문에 개발, 구현이 어렵다.

 

 (3) MAC의 종류

  ① Rule-based MAC : 주체와 객체의 특성에 관계된 특정 규칙에 따른 접근 통제이다.

  ② Administratively-directed MAC : 객체에 접근할 수 있는 시스템 관리자에 의한 통제이다.

  ③ CBP(Compartment-Based Policy) : 일련의 객체 집합을 다른 객체들과 분리하여 통제이다.

  ④ MLB(Multi-Level Policy) : 각 객체별로 지정된 등급만 사용하고, TCSEC(미국방성의 컴퓨터 보안 평가지표)에서 사용되고 있으며 BLP(벨-라파둘라) 수학적 모델로 표현이 가능하다.

 

 

 

3. 역할기반 접근통제정책(RBAC)

 (1) RBAC의 개념

  주체가 적절한 역할(role)에 할당되고 역할에 적합한 접근권한이 할당된 경우만 객체에 접근할 수 있는 비임의적 접근제어(Non DAC) 방식으로 전통적인 DAC와 MAC의 대체 수단으로 사용된다.

 

 (2) RBAC의 주요 특징

  ① 주체의 역할이나 임무에 따라 객체의 접근 권한을 제어하는 방식이다.

  ② 조직의 기능 변화나 인사이동에 따른 관리적업무의 효율성을 꾀할 수 있다.

  ③ 역할에 따라 설정된 권한만 할당하기에 보안 관리를 아주 단순하고 편리하게 할 수 있다.

  ④ 알 필요성 원칙, 최소권한 원칙, 직무분리 원칙이 지켜진다.

  ⑤ 금융기관, 정부나 공공기관에서 효과적으로 사용된다.

  ⑥ 오렌지북 C- 레벨의 요구사항이다.

 

 (3) RBAC의 종류

  ① Task-based Non DAC : 해당 업무에 해당하는 것만 접근가능하다.

  ② Latticed-based Non DAC : 역할에 할당된 민감도 레벨에 의해 접근이 결정되고, 관련된 정보로만 접근할 수 있도록 통제된다.

 

※ 1. Orange Book(미국 국방부 컴퓨터 시스템 평가기준 ; TCSEC)

 ① 시스템 즉 운영체제에 대한 신뢰 수준을 정의한 문서

 ② 시스템 보안 평가 기준 중 최초로 수용된 평ㅇ가 기준

 ③ 네트워크를 고려하지 않은 단일 시스템 보안 평가 기준

 

 

 

접근통제 정책 정리


강제적  MAC 임의적  DAC  역할기반 RBAC
 접근권한 부여자  시스템  데이터소유자  Central Authority
 접근여부 결정기준  보안 레이블  신분  역할
 정책  경직  유연  유연
 오렌지 북  B-레벨  C-레벨  C-레벨
 장점  안전/중앙집중관리  구현이 용이  다양한 접근권한
 단점  구현, 비용, 성능문제  신분위장  X

 

 

 

접근통제 보안모델

 (1) 개요

  보안모델이란 조직에서 보안 정책을 실제로 구현하기 위한 이론적 모델로 수학적 검증을 통과한 모델이다. 수학적 모델이란 명백하고, 실행가능하고, 쉽게 이해하고, 보안정책의 반영이 용이한 장점이 있다.

 

 보안모델  주요 특징
 Bell-LaPadula (벨라파둘라)  기밀성을 목적으로 하는 최초의 수학적 보안모델
 Biba (비바)  무결성을 목적으로 하는 최초의 수학적 보안모델
 Clark and Wilson (클락윌슨)  무결성 유지 정책을 이용한 상업용 보안모델
 Brewer Nash (만리장성)  이해 충돌 회피를 위한 보안모델

 

----------------------------------------------------------------------------------------------------------------------------------

 

접근 통제

운영체제에서 접근 통제(Access Control)은 디렉터리나 파일, 네트워크 소켓 같은 시스템 자원을 적절한 권한을 가진 사용자나 그룹이 접근하고 사용할 수 있게 통제하는 것을 의미합니다.

접근 통제에서는 시스템 자원을 객체(Object)라고 하며 자원에 접근하는 사용자나 프로세스는 주체(Subject)라고 정의합니다.

즉 /etc/passwd 파일은 객체이고 이 파일에 접근해서 암호를 변경하는 passwd 라는 명령어는 주체이며 아파치 웹 서버의 설정 파일인 /etc/httpd/conf/httpd.conf 는 객체이며 웹 서버 프로그램인 /sbin/httpd 는 주체가 됩니다.

임의 접근 통제(DAC)

임의 접근 통제(DAC;Discretionary Access Control)는 시스템 객체에 대한 접근을 사용자나 또는 그룹의 신분을 기준으로 제한하는 방법입니다.

사용자나 그룹이 객체의 소유자라면 다른 주체에 대해 이 객체에 대한 접근 권한을 설정할 수 있습니다.

여기서 임의적이라는 말은 소유자는 자신의 판단에 의해서 권한을 줄 수 있다는 의미이며 구현이 용이하고 사용이 간편하기 때문에 전통적으로 유닉스나 윈도우등 대부분의 운영체제의 기본 접근 통제 모델로 사용되고 있습니다.

임의적 접근 통제는 사용자가 임의로 접근 권한을 지정하므로 사용자의 권한을 탈취당하면 사용자가 소유하고 있는 모든 객체의 접근 권한을 가질 수 있게 되는 치명적인 문제가 있습니다.

특히 root 계정은 모든 권한을 갖고 있으므로 root 권한을 탈취하면 시스템을 완벽하게 장악할 수 있으며 권한 탈취시 많이 사용되는 것은 아래에서 설명할 유닉스의 구조적인 2가지 보안 취약점입니다.

 

setuid/setgid 문제

사용자들의 암호는 /etc/shadow 에 저장되어 있으며 루트만 읽고 쓸수 있습니다.

하지만 사용자들은 passwd 명령어를 실행하여 자신의 암호를 변경할 수 있고 이때 /etc/shadow 파일이 수정됩니다.

상대방 호스트가 동작하는지 확인하기 위해 사용하는 ping 은 ICMP(Internet Control Message Protocol) 패킷을 사용하므로 루트 권한이 필요하지만 일반 사용자도 ping 명령어를 사용하여 상대 호스트의 이상 여부를 확인할 수 있습니다.

 

유닉스 계열의 운영 체제는 실행 파일의 속성에 setuid(set user ID upon execution)또는 setgid(set group ID upon execution) 비트라는 것을 설정할 수 있으며 이 비트가 설정되어 있을 경우 해당 프로그램을 실행하면 실행 시점에 설정된 사용자(setuid), 또는 그룹(setgid) 권한으로 동작합니다.

 

이를 확인해 보기 위해 대표적인 setuid 비트가 붙은 프로그램인 ping  passwd 의 권한을 확인해 봅시다.

$ ls -l /bin/ping /usr/bin/passwd -rwsr-xr-x 1 root root 44168 May 8 2014 /bin/ping -rwsr-xr-x 1 root root 54256 May 17 08:37 /usr/bin/passwd

Copy

TODO: s 진하게 표시

ls -l 실행 결과

 

파일의 사용자 퍼미션 부분의 's' 표시는 setuid 비트이며 그룹 퍼미션 부분에 's' 표시가 있을 경우 setgid 비트로 passwd 와 ping 은 setuid 비트가 설정되어 있고 소유자가 root 인 것을 알수 있습니다.

즉 passwd 나 ping 는 실행시 root 사용자로 전환되므로 root 만 가능한 동작(예: /etc/passwd 파일 수정)을 수행할 수 있습니다.

배포판의 종류와 버전에 따라 ping 에 setuid 비트가 붙지 않았을 수도 있습니다.

 

하지만 setuid 비트가 붙은 프로그램에 보안 취약점이 있을 경우 root 로 구동중이었으므로 공격자가 손쉽게 루트 권한을 획득할 수 있는 문제가 있습니다.

이 때문에 setuid 비트는 필요하지만 유닉스 시스템의 주요 보안 취약점이었으며 시스템 관리자의 골칫 덩어리이었습니다.

 

리눅스 시스템에 있는 setuid 비트(4000)와 setgid 비트(2000)이 붙은 모든 프로그램은 다음 명령어로 찾을 수 있습니다.

$ find /bin /usr/bin /sbin -perm -4000 -o -perm -2000 |xargs ls -l

Copy

setuid/setgid 비트 프로그램 검색

 

잘 알려진 포트 daemon 문제

잘 알려진 포트(well-known port) 는 특정한 쓰임새를 위해서 "인터넷 할당 번호 관리기관"(IANA; Internet Assigned Numbers Authority)에서 할당한 TCP 및 UDP 포트 번호들의 일부로 1024 미만의 포트 번호를 사용하고 있습니다.

예로 웹에 사용되는 http(80), 메일 전송에 사용되는 smtp(25), 파일 전송에 사용되는 ftp(20, 21) 등이 잘 알려진 포트입니다.

전통적으로 잘 알려진 포트는 루트만이 사용할 수 있으므로 데몬 서비스는 모두 루트의 권한으로 기동됩니다.

보안 문제는 여기에서 발생하며 루트로 구동되었으므로 만약 서비스 데몬이 보안 취약점이 있거나 잘못된 설정이 있을 경우 서비스 데몬을 통해서 공격자는 루트 권한을 획득하게 될 위험이 있으며 이때문에 웹 서버등은 구동한 후에 자식 프로세스를 생성(fork 시스템 콜)한 후에 쉘이 없는 사용자 계정으로 전환해서 동작하고 있습니다.

 

예로 아파치 웹 서버(User/Group 지시자)와 nginx(user 지시자)는 아래와 같이 구동할 사용자를 지정하고 있습니다.

## 아파치 웹 서버 User apache Group apache ## nginx user nginx;

Copy

웹 서버 사용자 전환

위와 같이 사용자 전환을 하지만 부모 프로세스는 계속 루트로 구동되어 있으므로 1024 미만의 포트를 사용하는 데몬 프로세스에 대한 보안 대책이 필요하게 됩니다.

 

그러나 1024 미만의 포트를 일반 사용자가 쓸 수 있게 하거나 root 가 아닌 별도의 계정에게만 허용하는 것은 전통적인 유닉스의 동작 방식에 어긋나며 커널 수정이나 기타 유틸리티의 대폭 수정이 필요하며 운영자의 혼란을 유발하므로 좋은 방법이 아닙니다.

강제 접근 통제(MAC)

강제 접근 통제(MAC; Mandatory Access Control)는 미리 정해진 정책과 보안 등급에 의거하여 주체에게 허용된 접근 권한과 객체에게 부여된 허용 등급을 비교하여 접근을 통제하는 모델입니다.

높은 보안을 요구하는 정보는 낮은 보안 수준의 주체가 접근할 수 없으며 소유자라고 할 지라도 정책에 어긋나면 객체에 접근할 수 없으므로 강력한 보안을 제공합니다.

 

MAC 정책에서는 루트로 구동한 http 서버라도 접근 가능한 파일과 포트가 제한됩니다. 즉 취약점을 이용하여 httpd 의 권한을 획득했어도 /var/www/html, /etc/httpd 등의 사전에 허용한 폴더에만 접근 가능하며 80, 443, 8080 등 웹 서버에 사전에 허용된 포트만 접근이 허용되므로 ssh로 다른 서버로 접근을 시도하는등 해킹으로 인한 이차 피해가 최소화 됩니다.

단점으로는 구현이 복잡하고 어려우며 모든 주체와 객체에 대해서 보안 등급과 허용 등급을 부여하여야 하므로 설정이 복잡하고 시스템 관리자가 접근 통제 모델에 대해 잘 이해하고 있어야 합니다.

728x90

FTP란 무엇일까

FTP는 File Transfer Protocol의 약자로 말그대로 파일을 전송하는 통신 규약입니다. FTP 서버에 파일들을 업로드, 다운로드할 수 있도록 해주는 프로토콜이며, 이는 FTP 서버와 FTP 클라이언트 간에 통신에서 이루어집니다.

FTP는 Active 모드와 Passive 모드라는 2개의 모드가 존재하며 각각의 모드에서는 2개 또는 2개 이상의 포트가 연결을 맺고 데이터를 전송하는데 사용됩니다. 사용되는 포트는 연결을 제어하는 Command 포트가 있으며 데이터를 전송하는 DATA 포트가 있습니다.

FTP는 TCP 기반으로 만들어져 있으며 기본으로 동작 모드로 Active 모드를 사용하며 20번 또는 1024번 이후의 데이터(Data) 포트는 데이터를 전송하는데 사용하게 되고, 21번 포트는 접속시에 사용되는 명령(Command )포트입니다.

 

Active 모드

FTP Active 모드의 동작 방식을 그림으로 보면 아래와 같습니다. 참고로 아래 사용된 명령(Command) 포트와 데이터(Data) 포트는 서버의 설정에서 임의로 수정하여 사용할 수 있습니다.

 

  • 1) 클라이언트는 서버의 21번 포트로 접속한 후에 자신이 사용할 두 번째 포트를 서버에 미리 알려줍니다.
  • 2) 서버는 클라이언트의 요청에 응답합니다. (acks)
  • 3) 서버의 20번 데이터 포트는 클라이언트가 알려준 두 번째 포트로의 접속을 시도합니다.
  • 4) 클라이언트가 서버의 요청에 응답합니다. (acks)

위 과정에서 액티브 모드는 “클라이언트가 서버에 접속을 하는 것이 아닌 서버가 클라이언트에 접속을 하는 것”을 확인할 수 있습니다. 만일 FTP 클라이언트에 방화벽이 설치되어 있는 등 외부에서의 접속을 허용하지 않는 상황이라면 FTP 접속이 정상적으로 이루어지지 않을 것입니다. 접소기 되더라도 데이터 목록을 받아오지 못하게 되는 경우도 있고요.

 

Passive 모드

위에서 살펴본 Active 모드의 단점을 해결하기 위한 Passive 모드를 살펴봅시다. 역시나 아래 그림에서 사용된 커맨드 포트와 데이터 포트는 서버 설정에서 변경할 수 있습니다. 특히 Passive 모드에서는 데이터 포트 번호를 특별하게 지정하지 않는 경우 1024 ~ 65535번 중에서 사용 가능한 임의 포트를 사용하게 됩니다. 포트 번호를 지정할 때는 10001 ~ 10005번과 같이 범위를 지정할 수도 있습니다.

 

  • 1) 클라이언트가 커맨드 포트로 접속을 시도합니다. (Passive 모드 연결)
  • 2) 서버에서는 사용할 두 번째 포트를 클라이언트에게 알려줍니다.
  • 3) 클라이언트는 다른 포트를 열어 서버가 알려준 포트로 접속을 시도합니다.
  • 4) 서버가 클라이언트의 요청에 응답합니다. (acks)

Passive 모드에서는 앞선 Active 모드에서 사용했던 20번 포트를 사용하지 않고 1024번 이후의 임의의 포트를 데이터 채널 포트로 사용하게 됩니다.

 

연결 방식에 따른 주의사항

Active Mode의 경우는 클라이언트 측의 방화벽에 20번 포트가 차단되어 있다면, 데이터 채널 연결이 불가능해집니다. 연결은 되더라도 데이터 조회부터 실패되는 경우가 발생할 수 있습니다. 따라서 서버측은 20번 포트는 아웃바운드(OUTBOUND, 내 서버에서 외부서버로 보내는 요청) 허용, 클라이언트는 인바운드(INBOUND, 외부에서 내 서버로 들어오는 요청) 허용이 방화벽 설정에 필요합니다.

Passive Mode의 경우는 서버 측의 데이터 채널 포트가 막혀있는 경우 데이터 채널 연결이 불가능하게 됩니다. 그리고 앞서 소개한 것처럼 데이터 채널 포트의 범위를 지정할 수 있는데, 별도로 지정하지 않는 경우는 1024 ~ 65535번의 포트를 사용하게 됩니다. 따라서 INBOUND 모두 허용이 필요하게 되는데, 서버 측에서 데이터 채널 포트 범위를 지정하여 특정 범위의 포트만 허용해주면 모든 포트 허용의 문제를 어느 정도 해결할 수 있습니다.

 

 

-------------------------------------------------------------------------------------------------------------------------------

 

ftp는 다른 서비스와는 달리 Active 모드와 Passive 모드 두가지가 존재한다.

일반적으로 우리가 알고있는 21번 포트는  접속 및 명령어 전송에 사용되고, 20번 포트는 데이터 전송에 사용된다.

 

그렇다면 이 두가지 모드의 차이점에 대해 간략하게 정리하면(어디까지나 간략하게)

 

< Active mode >

1. 클라이언트에서 서버의 21번 포트로 접속을 시도한다. 동시에 ftp서버가 passive connection 을 사용하는지 확인

( 이때 클라이언트는 임의의 N번 포트를 사용한다. 즉 Client N port -> Server 21 port )

2. 클라이언트가 서버로 접속을 시도하는 동시에 데이터 전송에 사용할 또다른 포트를 서버쪽에 알려준다.

( Client의 N port는 접속용, 데이터용도로 사용할 N2 port를 결정하여 서버쪽에 알려줌 )

3. 서버에서 데이터 전송용으로 사용되는 20번 포트에서 클라이언트가 알려준 N2 port로 접속을 시도한다.

( Server 20 port -> Client N2 port )

 

Active mode의 가장 큰 특징은, 일반적인 Client-Server 모델과는 달리, 서버쪽에서 클라이언트의 포트로 접속을 한다는 것.

 

 

< Passive mode >

1. 클라이언트에서 서버의 21번 포트로 접속을 시도한다. 동시에 ftp서버가 passive connection 을 사용하는지 확인

( 여기까지는 똑같다. 클라이언트는 임의의 N번 포트를 사용한다. 즉 Client N port -> Server 21 port )

2. 서버쪽에서는 클라이언트의 요청에 응답을 해줌과 동시에, 서버쪽에서 사용할 또다른 포트를 클라이언트에 알려준다.

( 이때 또다른 포트를 S2 port라 하면, Server S2 port -> Client N port )

3. 클라이언트는 데이터 전송에 사용할 또다른 포트를 사용하여, 서버가 알려준 포트에 접속을 시도한다.

( Client N2 port -> Server S2 port )

 

Passive mode의 가장 큰 특징은 클라이언트에서 서버쪽으로 접속을 시도한다는 것.

 

 

일반적인 ftp client 프로그램은 Active mode로 동작하게 되어 있으며,

웹 브라우저의 경우에는 Passive mode가 기본 모드로 설정이 되어있다.

 

Active mode로 접속시 접속은 되지만 파일리스트등이 제대로 보이지 않는 경우가 있는데

대부분의 문제점은 client와 server 사이에 존재하는 방화벽이 원인이 되는 경우가 많다.

특히 client 쪽에 방화벽이 있거나 server쪽 방화벽에서 outbound 패킷에 대해 필터링을 하는 경우,

서버에서는 클라이언트가 알려준 포트로 접속을 해야 하는데, 방화벽에서 차단을 하기 때문에 데이터 전송이 안되는 것이다.

 

그래서 해결책으로 passive mode로의 연결이 있으며, 서버쪽에서는 passive mode에 사용할 포트를 미리 지정한 후

해당 포트에 대해 inbound 방화벽을 미리 오픈해 놓으면 된다.

728x90

HTTP

HTTP는 웹상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고 받을 수 있는 프로토콜입니다. 클라이언트가 HTTP 프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을 클라이언트에게 전송합니다. 이 때, HTTP 요청에 포함되는 HTTP 메소드는 서버가 요청을 수행하기 위해 해야할 행동을 표시하는 용도로 사용합니다. 이 HTTP 메소드 중 GET과 POST의 특징과 차이점을 알아보겠습니다.

GET

HTTP/1.1 스펙인 RFC2616의 Section9.3에 따르면 GET은 서버로부터 정보를 조회하기 위해 설계된 메소드입니다.
GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리스트링을 통해 전송합니다. URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 쿼리스트링이라고 부릅니다. 만약, 요청 파라미터가 여러 개이면 &로 연결합니다. 쿼리스트링을 사용하게 되면 URL에 조회 조건을 표시하기 때문에 특정 페이지를 링크하거나 북마크할 수 있습니다.

쿼리스트링을 포함한 URL의 샘플은 아래와 같습니다. 여기서 요청 파라미터명은 name1, name2이고, 각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보내게 됩니다.

www.example-url.com/resources?name1=value1&name2=value2

그리고 GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있습니다. js, css, 이미지 같은 정적 컨텐츠는 데이터양이 크고, 변경될 일이 적어서 반복해서 동일한 요청을 보낼 필요가 없습니다. 정적 컨텐츠를 요청하고 나면 브라우저에서는 요청을 캐시해두고, 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시된 데이터를 사용합니다. 그래서 프론트엔드 개발을 하다보면 정적 컨텐츠가 캐시돼 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 종종 발생합니다. 이 때는 브라우저의 캐시를 지워주면 다시 컨텐츠를 조회하기 위해 서버로 요청을 보내게 됩니다.

POST

POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송합니다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있습니다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있습니다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 합니다.

그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 합니다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장자명 등으로 데이터 타입을 유추합니다. 만약, 알 수 없는 경우에는 application/octet-stream로 요청을 처리합니다.

GET과 POST의 차이

GET은 Idempotent, POST는 Non-idempotent하게 설계되었습니다.
Idempotent(멱등)은 수학적 개념으로 다음과 같이 나타낼 수 있습니다.

수학이나 전산학에서 연산의 한 성질을 나타내는 것으로, 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질

즉, 멱등이라는 것은 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 합니다.
여기서 GET이 Idempotent하도록 설계되었다는 것은 GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미합니다. 이에 따라 GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent하기 때문에 주로 조회를 할 때에 사용해야합니다. 예를 들어, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위는 GET으로 요청하게 됩니다.

반대로 POST는 Non-idempotent하기 때문에 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있습니다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용됩니다. 게시글을 쓰면 서버에 게시글이 저장이 되고, 게시글을 삭제하면 해당 데이터가 없어지는 등 POST로 요청을 하게 되면 서버의 무언가는 변경되도록 사용됩니다. 이처럼 POST는 생성, 수정, 삭제에 사용할 수 있지만, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있습니다.

GET과 POST는 이처럼 큰 차이가 있기 때문에 설계원칙에 따라 적절한 용도로 사용해야합니다.

728x90

터미널에서

1. # yum update << 치고 930M 정도되는 업데이트를 20분간 실행한다.

2. # yum groupinstall "Development Tools" << 치고 설치.

3. # yum install kernel-devel << 치고 설치

4. 바탕화면에 있는 게스트확장CD 아이콘 실행

설치완료.

728x90

다음 설명에 해당하는 서비스거부(DoS) 공격은?   1
[보기]
헤더가 조작된 일련의 IP 패킷조각(IP Fregments)들을 전송함으로써 공격이 이루어지며 공격자는 데이터의 일부가 겹치거다. 일부 데이터를 포함하지 않는 패킷 조각들을 전송함으로써 패 킷 재조합 시 공격대상에서 부하를 발생시키는 공격 유형이다.
① Teardrop 
② Land attack
③ Syn Flooding
④ Smurf attack


티어드롭 공격, Teardrop Attack

서비스 거부 공격(DOS)의 하나. 공격 대상 컴퓨터에 헤더가 조작된 일련의 IP 패킷 조각(IP fragments)들을 전송함으로써 컴퓨터의 OS를 다운시키는 공격이다. 주로 MS 윈도나 리눅스 2.0.32와 2.1.63 이전 버전의 OS에 영향을 준다.

 

 

 

랜드 공격, Local Area Network Denial Attack, LAND Attack

공격자가 패킷의 출발지 주소(Address)나 포트(port)를 임의로 변경하여 출발지와 목적지 주소(또는 포트)를 동일하게 함으로써, 공격 대상 컴퓨터의 실행 속도를 느리게 하거나 동작을 마비시켜 서비스 거부 상태에 빠지도록 하는 공격 방법. 수신되는 패킷 중 출발지 주소(또는 포트)와 목적지 주소(또는 포트)가 동일한 패킷들을 차단함으로써 이 공격을 피할 수 있다.

 

 

 

신 플러딩 공격, SYN Flooding Attack

Client가 Server로 SYN패킷을 보내면 Server는 SYK/ACK를 보내고 해당 connection을 backlog Queue에 넣어준다.

이 Backlog Queue가 더 꽉차서 더 이상 새로운 connection을 형성을 못하는 경우를 SYN Flooding 이라고 하고 이러한 공격을 SYN Flooding Attack 이라고 한다.

 

 

 

스머프 공격, smurf attack

인터넷 프로토콜(IP) 브로드캐스트나 기타 인터넷 운용 측면을 이용하여 인터넷 망을 공격하는 행위.

‘스머핑’이라는 프로그램을 사용하여 네트워크를 공격하는데, 스머핑은 IP와 인터넷 제어 메시지 프로토콜(ICMP)의 특성을 이용한다고 알려져 있다. ICMP는 원래 네트워크 노드와 관리자들이 네트워크의 정보를 교환하기 위해 사용되는 프로토콜로서 운용 중인 노드들이 있는지 보기 위해 핑(ping) 명령을 사용하여 현재 동작 중인 노드가 에코 메시지를 보내게 한다. 스머핑 프로그램은 마치 다른 네트워크 주소(이것을 스머핑 주소라 함)로부터 생성된 것처럼 보이는 네트워크 패킷을 만들어 주어진 네트워크 내의 모든 IP 주소들, 즉 IP 브로드캐스트 주소로 ICMP 핑 메시지를 보낸다. 이 핑 메시지에 대한 응답은 스머핑 주소로 보내지는데, 엄청난 양의 핑과 그에 대응한 에코 메시지로 인해 네트워크는 실시간 트래픽을 처리할 수 없을 만큼 많은 정보로 넘쳐 흐르게 된다. 

스머핑 공격을 무력화시키는 방법은 각 네트워크 라우터에서 IP브로드캐스트 주소를 사용할 수 없게 미리 설정해 놓는 것이다.

'IT > 해킹(Hacking)' 카테고리의 다른 글

트랩도어(Trapdoor)  (0) 2021.08.25
워터링 홀(Watering Hole) 공격  (0) 2021.08.25
구글(Google) 검색엔진을 이용한 해킹  (0) 2021.07.07
Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
728x90

포트 스캔

[정의]

포트 스캔(port scan)은 운영 중인 서버에서 열려 있는 포트를 검색하는 것을 의미한다.

[목적]

자신의 서버의 네트워크 서비스들을 점검하기 위해 사용하거나 해커가 해킹을 하기 위해 정보 수집에서 타겟 서버의 정보를 수집하기 위해 사용한다. 알고자하는 패킷에 특정한 패킷을 보냈을 때 돌아오는 응답에 따라 포트가 열려있는지 닫혀있는지 판단한다.

[유형]

  • TCP
  • TCP half-open
  • UDP
  • Stealth

TCP

TCP 스캔은 TCP 처음 연결 시 일어나는 3-웨이 핸드쉐이킹을 탐지하는 기법이다. 만약 핸드쉐이킹이 정상적으로 완료되었다면, 해당 TCP 포트는 정상적으로 열려 있는 것으로 판단할 수 있다. 서비스 거부 공격을 막기 위해, 포트 스캐너는 핸드쉐이킹 직후 연결을 종료한다. 이 방식은 일반적인 소켓 connect()를 이용하기 때문에, Nmap 등의 프로그램에서는 이 방식을 연결 스캔(connect scan)으로 부른다.

[시도 및 응답]

  • 열려있는 경우 : SYN + ACK
  • 닫혀있는 경우 : RST + ACK

[그림1] 열려있는 경우

[그림2] 닫혀있는 경우

[알려진 포트]

1. 포트 80(HTTP) : 이 포트는 우리가 발견한 열린 포트의 14% 이상을 차지한다.

2. 포트 23(Telnet) : 텔넷은(암호화되지 않아) 보안이 불안하긴 하지만 계속 존재했다.

3. 포트 443(HTTPS) : SSL 암호화된 웹서버는 이 포트를 기본적으로 사용한다.

4. 포트 21(FTP) : 텔넷처럼 FTP는 없어져야 하는 보안이 불안한 프로토콜이다. 

5. 포트 22(SSH) : 텔넷을 대체하는 암호화된 프로토콜로 보통 보안 셸로 알려졌다.

6. 포트 25(SMTP) : 표준 메일 전송 프로토콜(보안이 돼 있지 않다).

7. 포트 3389(ms-term-server) : 마이크로소프트 터미널 서비스 관리 포트

8. 포트 110(POP3) : 이메일 추출을 위한 포스트 오피스 프로토콜 버전 3(비보안)

9. 포트 445(마이크로소프트-DS) : (파일/프린터 공유 같은)마이크로소프트 윈도우 서비스에 있는 IP에 대한 SMB 통신을 위한 포트

10. 포트 143(IMAP) : 인터넷 메시지 접근 프로토콜 버전 2. 보안이 안 된 이메일 추출 프로토콜

11. 포트 53(도메인) : 도메인 네임 시스템DNS, 호스트/도메인명과 IP주소 사이의 대화를 위한 보안이 안 된 시스템

12. 포트 3306(MySQL) : MySQL 데이터베이스와 통신을 위한 포트

13. 포트 8080(HTTP-proxy) : 일반적인 웹서버를 위한 HTTP 프록시나 다른 포트로써 흔하게 사용되는 포트

14. 포트 995(POP3S)  : 보안을 위해 추가된 SSL이 있는 POP3

15. 포트 5900(VNC) : 그래픽 데스크탑 공유 시스템(비보안)

 

TCP half-open

half-open 스캔은 TCP 핸드쉐이킹을 완전히 수행하지 않고, 처음 SYN 패킷만을 받은 후 검사를 완료하는 방식이다. 이 방식은 실제 TCP 연결이 일어나지 않는다. 이 방식을 사용하기 위해서는 TCP 스캔과 같이 connect() 함수를 이용할 수 없고, 포트 스캐너는 이 스캔 작업을 위해 TCP 패킷을 직접 생성한다.

[시도 및 응답]

  • 열려있는 경우 : SYN + RST 패킷을 받은 후 응답하지 않는다.
  • 닫혀있는 경우 : SYN + ACK 패킷을 받은 후 RST 패킷을 보내 연결을 끊는다.

* FIN를 보냈을 때

- 열려있는 경우 : 응답없음

- 닫혀있는 경우 : RST + ACK

* SYN+ACK를 보냈을 때

- 열려있는 경우 : RST

- 닫혀있는 경우 : RST

[그림1] 열려있는 경우

[그림2] 닫혀있는 경우

 

UDP

UDP 프로토콜은 TCP와 다르게 핸드쉐이킹 과정이 존재하지 않고, 따라서 일반적으로는 포트가 열려 있다고 하더라도 서버에서 아무런 응답을 하지 않을 수도 있다. 하지만, 많은 시스템에서는 보낸 패킷에 대한 응답이 없을 때 ICMP unreachable 메시지를 보낸다. 많은 UDP 스캐너는 이 메시지를 탐지하는 방향으로 동작한다. 이 방식은 서버에서 ICMP 메시지를 보내지 않는 경우 닫혀 있는 포트를 열려 있다고 판단하는 경우가 존재한다.

다른 방식으로는 각 포트에 따라서 그에 대응하는 프로토콜 패킷을 전송하는 방식이다. 예를 들어, DNS 서버는 53번 포트에서 동작하며, UDP 스캐너는 해당 포트에 DNS 정보 요청 패킷을 보낸 후 응답을 받는 방식이다. 이러한 방식은 잘 알려진 포트와 대응 프로토콜에 대해서만 사용할 수 있다는 한계가 있지만, ICMP 메시지가 없는 경우 활용할 수 있다.

[시도 및 응답]

  • 열려있는 경우 : 응답없음
  • 닫혀있는 경우 : icmp destination unreachable

[알려진 포트]

1. 포트 631(IPP) : 인터넷 프린팅 프로토콜

2. 포트 161(SNMP) : 간단한 네트워크 관리 프로토콜

3. 포트 123(NTP) : 네트워크 타임 프로토콜

4. 포트 1434(MS-SQL-DS) : 마이크로소프트 SQL 서버

5. 포트 67(DHCPS) : 다이내믹 호스트 구성 프로토콜 서버

6. 포트 53(도메인) : 도메인 네임 시스템DNS 서버

7. 포트 68(DHCPC) : DHCP 클라이언트 포트

8. 포트 520(라우트) : 라우팅 정보 프로토콜RIP

9. 포트 69(TFTP) : 간단한 파일 전송 프로토콜

 

Stealth

세션을 완전히 성립하지 않고, 공격 대상 시스템의 포트 활성화 여부를 알아내기 때문에 공격 대상 시스템에 로그가 남지 않는다. 따라서 공격 대상의 시스템 관리자는 어떤 IP를 가진 공격자가 자신의 시스템을 스캔 했는지 확인 할 수 없다. 스텔스 스캔은 닫혀있는 포트에 대해서만 응답하고 종류는 ACK, NULL, X-MAS스캔 등이 있다.

[유형]

  • ACK or FIN : ack 혹은 FIN flag만 보내는 스캔
  • NULL : flag를 하나도 보내지 않는 스캔
  • X-MAS : 모든 flag를 보내거나 FIN, PSH, URG flag를 보내는 스캔

[시도 및 응답]

  • 열려있는 경우 : 응답없음
  • 닫혀있는 경우 : RST

[그림1] ACK, FIN 열려있는 경우

[그림2] ACK, FIN 닫혀있는 경우

[그림3] X-MAS 닫혀있는 경우

 

NMAP

[목적]

nmap은 원래 Gordon Lyon에 의해 쓰인 보안 스캐너이다. 컴퓨터와 서비스를 찾기 위해 사용된다. Nmap은 서비스 탐지 프로토콜로 자신을 광고하지 않는 수동적인 서비스들도 찾아낼 수 있다. 게다가 Nmap은 원격 컴퓨터들의 상세정보도 알아낼 수 있다. 이 상세정보에는 OS, 장치 종류, 운영 시간, 서비스에 쓰이는 소프트웨어 제품과 버전, 방화벽 기술 존재와 LAN에서 NIC의 공급자 정보도 포함한다.

[특징]

  • 호스트 탐지 : 네트워크 상에서 컴퓨터들을 확인한다. 예를 들어 ping 응답이나 특정포트가 열린 컴퓨터들을 나열한다.
  • 포트 스캔 : 하나 혹은 그 이상의 대상 컴퓨터들에 열린 포트들을 나열한다.
  • 버전 탐지 : 응용프로그램의 이름과 버전 번호를 확인하기 위해 원격 컴퓨터의 서비스를 확인 한다.
  • OS 탐지 : 원격으로 OS와 네트워크 장치의 하드웨어 특성을 확인 한다.

[설치 및 사용 방법]

#> yum install nmap

#> nmap [Scan Type] [Option] [Address]

[옵션]

옵션  설명
-sT 일반적인 TCP 포트스캐닝
-sS half-open 스캔
-sP ping 을 이용한 일반적인 스캔
-sU UDP 포트 스캐닝
-PO 대상 호스트에 대한 ping 응답을 요청하지 않음, log 기록과 filtering 을 피할 수 있음
-PT 일반적이 ICMP ping이 아닌 ACK 패킷으로 ping 을 보내고 RST 패킷으로 응답을 받음
-PI 일반적인 ICMP ping 으로 방화벽이나 필터링에 의해 걸러짐
-PB ping 을 할 때 ICMP ping 과 TCP ping을 동시에 이용
-PS ping 을 할 때 ACK 패킷대신 SYN 패킷을 보내 스캔
-O 대상 호스트의 OS 판별
-P 대상 호스트의 특정 포트를 스캔하거나, 스캔할 포트의 범위를 지정
ex) -p 1-100
-D Decoy 기능으로 대상 호스트에게 스캔을 실행한 호스트의 주소를 속임
-F /etc/services 파일 내에 기술된 포트만 스캔
-I TCP 프로세서의 identd 정보를 가져옴
-n IP 주소를 DNS 호스트명으로 바꾸지 않음, 속도가 빠름
-R IP 주소를 DNS 호스트명으로 바꿔서 스캔, 속도가 느림
-o 스캔 결과를 택스트 파일로 저장
-i 스캔 대상 호스트의 정보를 지정한 파일에서 읽어서 스캔
-h 도움말 보기

[출처] 위키 백과, https://asecurity.so, http://wildpup.cafe24.com, http://www.hacure.com

'IT > 네트워크(Network)' 카테고리의 다른 글

FTP Active와 Passive 차이  (0) 2021.08.18
GET과 POST의 차이  (0) 2021.08.18
Mikrotik hAP ac2 - 트러블슈팅  (0) 2021.07.27
미크로틱 라우터(Mikrotik Router) 보안 강화하기  (0) 2021.07.09
Mikrotik RB4011iGS+RM  (0) 2021.07.05
728x90

utmp : 현재 로그인한 사용자 상태 정보를 담보 있는 로그파일

위치 - /var/run/utmp

확인 명령어 w, who, finger

 

wtmp : 성공한 로그인/로그아웃 정보 및 시스템의 boot/shutdown의 히스토리를 담고있는 로그파일

위치 - /var/log/wtmp

확인 명령어 last

 

btmp : 실패한 로그인 정보를 담고 있는 로그파일

위치 - /var/log/btmp

확인 명령어 lastb

 

last log : 마지막으로 성공한 로그인 정보를 담고 있는 로그 파일

위치 - /var/log/lastlog

확인 명령어 - lastlog

 

sulog : su(switch user) 명령어와 관련된 로그 기록

 

 1) 시스템에 현재 로그인한 사용자들에 대한 상태를 기록하여 "who" 명령으로 내용을 볼 수 있다. - utmp

 2) 사용자가 로그인 또는 로그아웃 할 때마다 그 정보가 기록되며, "last" 명령으로 내용을 볼 수 있다. - wtmp

 3) 사용자들에 의해 실행된 모든 명령이 기록되며, "lastcomm" 명령으로 그 내용을 볼 수 있다 - pacct

 4) 가장 최근에 ID가 user01 라는 사용자가 로그인한 기록을 보고 싶을 때 - lastlog -u user01

 5) wtmp 파일에 저장된 ID가 user02 라는 사용자가 로그인한 기록을 보고 싶을 때 - last user02

 6) wtmp 파일에 저장된 정보 중 시스템 재부팅 기록을 보고 싶을 때 - last reboot

 7) btmp 파일에 저장된 로그인 실패기록을 보고 싶을 때 - lastb

 

acct/pacct 로그파일은 로그인부터 로그아웃까지 사용자가 입력한 명령어를 확인할 수 있다.

확인 명령어 - lastcomm 

728x90

MikroTik hAP ac2 트러블슈팅 내역입니다.

사용 중 생기는 문제와 해결방법을 수시로 업데이트하려 합니다.

 

1. 아이패드 와이파이 재연결

 

아이패드가 슬립모드로 들어간 상태에서 몇 분 이상이 지났다가 풀렸을 때

와이파이 신호를 다시 잡으면서 백그라운드에 있던 어플(ex. 유튜브)을 실행하면

와이파이가 끊어진 것으로 인식되며 새로고침 하였을 때 다시 정상 동작하는 문제였습니다.

 

제 경우에는 와이파이가 붙은 다른 기기들에서는 발생한 사항은 아니었고 아이패드에서만 발생하였으며

iOS 기기에서만 발생하는 것으로 추측되었습니다.

 

* 원인

DHCP 임대 시간문제

기존에 사용하던 AC68P에서는 볼 수 없었던 문제여서 제가 확인해 볼 수 있는 설정값을

비교해본 결과 DHCP 임대 시간문제로 확인되었습니다.

 

ASUS 공유기의 기본 IP 임대시간은 1일이었으며,

미크로틱의 RouterOS에서 설정된 기본 IP 임대 시간은 10분입니다.

 

아이패드가 슬립모드 일 때 임대 시간이 만료되는 시점에 연결을 끊고

다시 슬립모드가 풀릴 때 재연결을 하는 케이스로 추측됩니다.

 

* 해결

 

DHCP Server 설정

winbox > IP > DHCP Server 설정에서

Lease Time 항목을 10분에서 1일(24시간)로 변경합니다.

 

 

 

2. 특정 기기 5Ghz 대역 인식 불가

 

특정 기기에서 2.4Ghz 연결에서는 이상이 없고

5Ghz 는 SSID가 보이지 않거나 보이더라도 연결이 안되는 문제입니다.

 

* 원인

5Ghz 대역에서 사용하는 채널이 기기에서 지원하는 채널과 달라 발생한 사항입니다.

 

* 해결

 

802.11ac 5Ghz 국가별 채널 리스트

quickset (위 스크린샷은 webfig 화면이지만 winbox 화면과 유사합니다. / 출처 : wiki.mikrotik.com)

winbox > quickset > Wireless에서 Frequency 항목을

국가별 허용 채널로 변경해줍니다.

제 경우에는 우리나라와 일본 둘 다 허용되는 채널로 변경하였습니다.

 

국가별 채널 리스트 참고

https://en.wikipedia.org/wiki/List_of_WLAN_channels

 

List of WLAN channels - Wikipedia

Wikipedia list article WLAN (wireless local area network) channels are frequently accessed using IEEE 802.11 protocols, and equipment that does so is sold mostly under the trademark Wi-Fi. Other equipment also accesses the same channels, such as Bluetooth.

en.wikipedia.org

 

출처 : https://core00.tistory.com/11

728x90

미크로틱 라우터OS의 보안 강화하기입니다.

 

1. winbox 실행 후 IP -> SERVICES 항목에서 winbox 제외하고 다 비활성화 합니다.

 

2. 방화벽에 다음 포트스캔 관련 차단 정책 Rule을 추가합니다.

/ip firewall filter

add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="Port scanners to list " in-interface=ether1 protocol=tcp psd=21,3s,3,1
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="NMAP FIN Stealth scan" in-interface=ether1 protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="SYN/FIN scan" in-interface=ether1 protocol=tcp tcp-flags=fin,syn
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="SYN/RST scan" in-interface=ether1 protocol=tcp tcp-flags=syn,rst
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="FIN/PSH/URG scan" in-interface=ether1 protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="ALL/ALL scan" in-interface=ether1 protocol=tcp tcp-flags=fin,syn,rst,psh,ack,urg
add action=add-src-to-address-list address-list="port scanners" address-list-timeout=2w chain=forward comment="NMAP NULL scan" in-interface=ether1 protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg
add action=drop chain=input comment="black list" in-interface=ether1 src-address-list=blacklist

 

참고 : ether1 이 WAN 으로 쓰는경우 설정값입니다. 위 값에서 ether1 은 설정된 WAN 포트명으로 맞추세요.

 

3. 블랙리스트 적용 방법
http://joshaven.com/resources/tricks/mikrotik-automatically-updated-address-list/

add chain=input action=drop comment="Drop new connections from blacklisted IP's to this router" \
    connection-state=new src-address-list=blacklist in-interface=ether1-WAN
----------------------------------------------------------------------------------------------------------------------------------
SpamHaus
"Spamhaus Do n't Route Or Peer List (DROP)" "

# Script which will download the drop list as a text file
/system script add name="DownloadSpamhaus" source={
/tool fetch url="http://joshaven.com/spamhaus.rsc" mode=http;
:log info "Downloaded spamhaus.rsc from Joshaven.com";
}

# Script which will Remove old Spamhaus list and add new one
/system script add name="ReplaceSpamhaus" source={
/ip firewall address-list remove [find where comment="SpamHaus"]
/import file-name=spamhaus.rsc;
:log info "Removed old Spamhaus records and imported new list";
}

# Schedule the download and application of the spamhaus list
/system scheduler add comment="Download spamnaus list" interval=3d \
  name="DownloadSpamhausList" on-event=DownloadSpamhaus \
  start-date=jan/01/1970 start-time=02:57:54
/system scheduler add comment="Apply spamnaus List" interval=3d \
  name="InstallSpamhausList" on-event=ReplaceSpamhaus \
  start-date=jan/01/1970 start-time=03:02:54
 
----------------------------------------------------------------------------------------------------------------------------------
dshield
“This list summarizes the top 20 attacking class C (/24) subnets over the last three days. The number of ‘attacks’ indicates the number of targets reporting scans from this subnet.”

# Script which will download the drop list as a text file
/system script add name="Download_dshield" source={
/tool fetch url="http://joshaven.com/dshield.rsc" mode=http;
:log info "Downloaded dshield.rsc from Joshaven.com";
}

# Script which will Remove old dshield list and add new one
/system script add name="Replace_dshield" source={
/ip firewall address-list remove [find where comment="DShield"]
/import file-name=dshield.rsc;
:log info "Removed old dshield records and imported new list";
}

# Schedule the download and application of the dshield list
/system scheduler add comment="Download dshield list" interval=3d \
  name="DownloadDShieldList" on-event=Download_dshield \
  start-date=jan/01/1970 start-time=03:07:54
/system scheduler add comment="Apply dshield List" interval=3d \
  name="InstallDShieldList" on-event=Replace_dshield \
  start-date=jan/01/1970 start-time=03:12:54

----------------------------------------------------------------------------------------------------------------------------------
malc0de
"The files below will be updated daily with domains that have been indentified distributing malware during the past 30 days"

# Script which will download the malc0de list as a text file
/system script add name="Download_malc0de" source={
/tool fetch url="http://joshaven.com/malc0de.rsc" mode=http;
:log info "Downloaded malc0de.rsc from Joshaven.com";
}

# Script which will Remove old malc0de list and add new one
/system script add name="Replace_malc0de" source={
/ip firewall address-list remove [find where comment="malc0de"]
/import file-name=malc0de.rsc;
:log info "Removed old malc0de records and imported new list";
}

# Schedule the download and application of the malc0de list
/system scheduler add comment="Download malc0de list" interval=3d \
  name="Downloadmalc0deList" on-event=Download_malc0de \
  start-date=jan/01/1970 start-time=03:07:54
/system scheduler add comment="Apply malc0de List" interval=3d \
  name="Installmalc0deList" on-event=Replace_malc0de \
  start-date=jan/01/1970 start-time=03:12:54

----------------------------------------------------------------------------------------------------------------------------------
VoIP Blacklist
"Protect your business and PBX's against VoIP Fraud Minimize the risks of attacks on your Telephony Server Save bandwidth by using Geolocation filtering."

WARNING: Use carefully! This is a huge list which can quickly cause performance issues.

# Script which will download the voip-bl list as a text file
/system script add name="Download_voip-bl" source={
/tool fetch url="http://joshaven.com/voip-bl.rsc" mode=http;
:log info "Downloaded voip-bl.rsc from Joshaven.com";
}

# Script which will Remove old voip-bl list and add new one
/system script add name="Replace_voip-bl" source={
/ip firewall address-list remove [find where comment="VoIP BL"]
/import file-name=voip-bl.rsc;
:log info "Removed old voip-bl records and imported new list";
}

# Schedule the download and application of the voip-bl list
/system scheduler add comment="Download voip-bl list" interval=3d \
  name="Refresh_voip-bl" on-event=Download_voip-bl \
  start-date=jan/01/1970 start-time=03:07:54
/system scheduler add comment="Apply voip-bl List" interval=3d \
  name="Update_voip-bl" on-event=Replace_voip-bl \
  start-date=jan/01/1970 start-time=03:12:54

----------------------------------------------------------------------------------------------------------------------------------

 

4. 설정 예제

##  2016/09/15 추가: 격리된 포트가 다른 포트와 통신이 되는 것을 확인하여 격리설정은 다음에 수정하겠습니다. ##

##  2016/09/19 추가 : 격리포트는 /ip route rules에서 설정하여 Layer 3 레벨 격리를 구현하였습니다. ##

격리공간을 만들어 둔 이유는, 직업상 영어메일을 읽어야 할 상황이 있어서 만약을 대비한 격리공간입니다.

이 모든 설정은 winbox GUI로도 커맨드와 똑같은 메뉴를 따라 설정가능합니다만 사진을 왕창 추가하기에는

여러모로 곤란하므로 불친절하더라도 커맨드와 설명만 적어두었습니다.



혹시 이 세팅을 적용하실 경우 일단 현재 세팅을 백업 후에 하시길 권장합니다.

> export verbose file=[적당한 파일이름].rsc

이렇게 하면 라우터의 루트디렉토리에 설정파일이 저장되고, Files탭에서 파일을 볼 수 있으며, 드래그해서

컴퓨터에 간단하게 저장도 가능합니다. 물론 반대도 가능합니다.



이렇게 세팅하면 무선기기는 AP에 접속할 경우 CCR1009로부터 dhcp로 ip를 받아와 인터넷에 연결됩니다.

VLAN을 쓰면 더 간단하고 CPU부하도 적게 할 수도 있을 것 같은데 저는 잘 몰라서 이렇게 설정했습니다.



메인라우터 CCR1009 설정

# 각 포트별 명칭을 알아보기 쉽게 지정하였습니다. 굳이 안해도 됩니다만, 후반 설정에 이름이 영향을 #

# 미치므로 변경하지 않을 경우 포트이름만 etherX로 고쳐쓰시면 됩니다. eth1-4는 스위치그룹이므로 eth1을 #

# 마스터로 지정하였습니다. #

/interface ethernet
set [ find default-name=ether1 ] arp=proxy-arp comment="LAN1 Switch1" name=eth1-LAN1
set [ find default-name=ether2 ] arp=proxy-arp master-port=eth1-LAN1 name=eth2-LAN1
set [ find default-name=ether3 ] arp=proxy-arp master-port=eth1-LAN1 name=eth3-LAN1
set [ find default-name=ether4 ] arp=proxy-arp master-port=eth1-LAN1 name=eth4-LAN1
set [ find default-name=ether5 ] comment=LAN2 name=eth5-LAN2
set [ find default-name=ether6 ] comment="LAN3 RBcAP2n AP" name=eth6-LAN3
set [ find default-name=ether7 ] comment="Isolated sandbox port" name=eth7-LAN4SB
set [ find default-name=ether8 ] arp=proxy-arp comment=WAN name=ether1
set [ find default-name=sfp-sfpplus1 ]comment=SFP
# 각 LAN환경에 설정해 줄 대역을 지정해줍니다. 구체적으로 VPN클라이언트 연결이나 DHCP ip분배 등에 쓰입니다. #

/ip pool
add name=LAN1 ranges=192.168.88.10-192.168.88.49
add name=LAN2 ranges=192.168.89.10-192.168.89.49
add name=LAN3 ranges=192.168.90.10-192.168.90.49
add name=LAN4SB ranges=192.168.91.10-192.168.91.49
# NAT-LAN 환경에서 분배할 DHCP 서버를 구성합니다. 위의 그림에서 설명한 대역을 지정하였습니다. #

# eth1-eth4는 같은 스위치그룹이므로 편하게 쓰고자, eth1을 master로 두고 2,3,4를 slave로 설정하였습니다. #

/ip dhcp-server
add add-arp=yes address-pool=LAN1 disabled=no interface=eth1-LAN1 name=DHCP-LAN1
add add-arp=yes address-pool=LAN2 disabled=no interface=eth5-LAN2 name=DHCP-LAN2
add add-arp=yes address-pool=LAN3 disabled=no interface=eth6-LAN3 name=DHCP-LAN3
add address-pool=LAN4SB disabled=no interface=eth7-LAN4SB name=DHCP-LAN4

 

/ip dhcp-server network
add address=192.168.88.0/24 dns-server=192.168.88.1 gateway=192.168.88.1
add address=192.168.89.0/24 dns-server=192.168.89.1 gateway=192.168.89.1
add address=192.168.90.0/24 dns-server=192.168.90.1 gateway=192.168.90.1
add address=192.168.91.0/24 dns-server=192.168.91.1 gateway=192.168.91.1

# 라우팅 테이블의 룰에서 OSI layer 3레벨 수준(IP)에서 격리포트의 네트워크로 통신 또는#

# 격리포트의 네트워크에서 타 포트로 통신하는 경우를 막았습니다.#

# Layer 2 수준(MAC통신)는 네트워크 대역이 다르므로 자동으로 막혀있습니다. #

/ip route rule
add action=drop disabled=no dst-address=192.168.91.0/24 !interface !routing-mark src-address=192.168.88.0/24
add action=drop disabled=no dst-address=192.168.91.0/24 !interface !routing-mark src-address=192.168.89.0/24
add action=drop disabled=no dst-address=192.168.91.0/24 !interface !routing-mark src-address=192.168.90.0/24
add action=drop disabled=no dst-address=192.168.88.0/24 !interface !routing-mark src-address=192.168.91.0/24
add action=drop disabled=no dst-address=192.168.89.0/24 !interface !routing-mark src-address=192.168.91.0/24
add action=drop disabled=no dst-address=192.168.90.0/24 !interface !routing-mark src-address=192.168.91.0/24

# 각 포트별 NAT 환경의 IP주소대역을 지정합니다 #

/ip address
add address=192.168.88.1/24 interface=eth1-LAN1 network=192.168.88.0
add address=192.168.89.1/24 interface=eth5-LAN2 network=192.168.89.0
add address=192.168.90.1/24 interface=eth7-LAN3 network=192.168.90.0
add address=192.168.91.1/24 interface=eth7-LANSB network=192.168.91.0
# 미크로틱에서 제공하는 라우터보드의 자체 DDNS입니다. 가정에서는 딱히 사용하는 도메인이 없다면 켜두시는 게 여러모로 편리합니다. #

/ip cloud
set ddns-enabled=yes
# DNS 참조주소를 구글 퍼블릭 DNS로 지정합니다. KT나 SKT, LG의 주소로 지정해도 상관없습니다. #

# 주의할 점은 allow-remote-requests를 활성화하면 외부로부터 DNS flood가 심각하게 들어오므로 방화벽에서 tcp/udp 53을 차단해야합니다. #

# 이 예제에서는 뒤에서 서술할 방화벽 설정에서 차단해 두었습니다. #

/ip dns
set allow-remote-requests=yes servers=8.8.8.8,8.8.4.4
# 방화벽을 걸기 전에 여러 대역을 통째로 걸기위한 리스트를 작성했습니다. #

/ip firewall address-list
add address=0.0.0.0/8 comment="Self-Identification [RFC 3330]" list=bogons
add address=127.0.0.0/8 comment="Loopback [RFC 3330]" list=bogons
add address=169.254.0.0/16 comment="Link Local [RFC 3330]" list=bogons
add address=192.168.88.0/24 comment=LAN list=LAN
add address=192.168.91.0/24 comment="Isolated Sandbox Ethernet" list=LAN4
add address=192.168.89.0/24 list=LAN
add address=192.168.90.0/24 list=LAN
add address=10.0.0.0/8 list=LAN
# 방화벽 설정입니다. fasttrack 설정과 여러 포트를 열어주고 그 외에는 막았습니다. #

# 참고로 fastpath는 방화벽 필터가 1개라도 있으면 아마 동작하지 않을 겁니다 #

# NAT 라우팅이 되기 이전에 막을 수 있는 것은 raw필터로 막아 CPU에 부담을 덜 주게 하였습니다. #

/ip firewall filter
add action=fasttrack-connection chain=forward connection-state=established,related
add action=accept chain=forward connection-state=established,related
add action=accept chain=input connection-state=established,related


/ip firewall raw
add action=drop chain=prerouting comment="tcp/udp 53 block" dst-port=53 in-interface=ether1 protocol=udp
add action=drop chain=prerouting dst-port=53 protocol=tcp
add action=drop chain=prerouting comment="North Korea block" src-address=175.45.176.0/22
add action=drop chain=prerouting src-address=210.52.109.0/24
add action=drop chain=prerouting comment="LANSB isolation" dst-address-list=LAN4 in-interface-list=LAN src-address-list=LAN
add action=drop chain=prerouting dst-address-list=LAN in-interface-list=LANSB src-address-list=LAN4
add action=drop chain=forward comment="Drop to bogon list" dst-address-list=bogons
add action=accept chain=prerouting comment="Full access to SUPPORT address list" src-address-list=support
add action=drop chain=ICMP comment="Drop to the other ICMPs" protocol=icmp

 

# ipv6용 방화벽입니다. 특별히 설정을 해두진 않았습니다. #
/ipv6 firewall filter
add action=accept chain=input protocol=255
add action=accept chain=input protocol=igmp
add action=accept chain=input connection-state=""
add action=accept chain=input connection-state=""
add action=passthrough chain=input
add action=accept chain=input comment=ICMPv6 protocol=icmpv6
add action=accept chain=input comment="DHCPv6 client" dst-port=546 in-interface=ether1 protocol=udp
add action=accept chain=forward comment="Accept forward" in-interface=ether1
add action=accept chain=output comment="Accept output"
add action=accept chain=input comment="Router - Allow IPv6 ICMP" protocol=icmpv6

# NAT 마스커레이딩 설정입니다. 각 포트별로 지정해둔 IP대역을 NAT주소변환 해주지 않으면 통신이 안됩니다. #

/ip firewall nat
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.88.0/24
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.89.0/24
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.90.0/24
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.91.0/24
# FTP나 irc 서버 등을 운영하지 않으면 꺼둡니다. pptp VPN과 인터넷전화기 (sip)만 열어두었습니다. #

/ip firewall service-port
set ftp disabled=yes
set tftp disabled=yes
set irc disabled=yes
set h323 disabled=yes
set udplite disabled=yes
set dccp disabled=yes
set sctp disabled=yes
# 라우터OS에서 사용하는 서비스 포트입니다. winbox 이외에는 다 막았습니다. #

/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh disabled=yes
set api disabled=yes
set api-ssl disabled=yes
# 라우터의 시간설정 및 시간동기화 설정을 합니다.#

/system clock
set time-zone-name=Asia/Seoul
/system ntp client
set enabled=yes primary-ntp=203.254.163.74
# 어찌보면 대단히 중요합니다. 라우터OS 관리용 접근제어인데, 위의 방화벽단에서 막는 것은 L3/L4 에서 막는 설정이기에 #

# 여전히 L2 (맥주소) 기반 접근은 가능한 상태이므로 반드시 외부로부터 오는 접근은 막아야합니다. #

# 맥 텔넷과 맥 winbox를 무선(eth6)/외부(ether1)로부터 접근을 막습니다. 만약 방화벽에서 ether1 인터페이스를 막으면 #

# 이 설정은 신경쓰지 않아도 괜찮을지도 모르겠습니다. #

/tool mac-server
set [ find default=yes ] disabled=yes
add interface=eth1-LAN1
add interface=eth5-LAN2
add interface=eth7-LAN4SB
add interface=sfp-sfpplus1
add interface=sfp1
/tool mac-server mac-winbox
set [ find default=yes ] disabled=yes
add interface=eth1-LAN1
add interface=eth5-LAN2
add interface=eth7-LAN4SB
add interface=sfp-sfpplus1
add interface=sfp1





CCR1009 하단 RBcAP2n 설정

# 브릿지를 생성하여 ether1과 wlan1을 묶어줍니다. 이 설정은 메인라우터 밑단에서 단순 투명한 AP로서 작동시키기 위해 브릿지로 유선과 무선을 묶습니다. #

# 브릿지이름은 자유롭게 지어도 상관없습니다. #

# 무선이 2.4g, 5g 듀얼 또는 그 이상 여러개일 경우 한 브릿지 포트에 계속 추가해주거나 다른 브릿지로 별도로 설정해도 됩니다. #

/interface bridge

add name=bridge1

/interface bridge port

add bridge=bridge1 interface=ether1

add bridge=bridge1 interface=wlan1

#2.4G wifi 통신의WPA2-AESPSK암호화 프로파일을 설정합니다.[SSID]에 원하는 wifi이름을 입력,[password]에 접속 패스워드를 입력합니다. #

#여기서는 설정하지 않지만 인증서기반 WPA2-EAP는 보다 더 강력한 보안을 제공합니다.

/interface wireless security-profiles

set [ find default=yes ]supplicant-identity=[SSID]

add authentication-types=wpa2-psk eap-methods=""\

   mode=dynamic-keys name=wpa2aespsk wpa2-pre-shared-key=[Password]

# 무선라디오의 자잘한 설정을 합니다. 주파수채널과 위에서 설정한 암호화 프로파일 선택 및 송출파워,SSID 비표시 등을 지정합니다. #

# 이 설정은 스펙상 2.4g만 지원하므로 2.4만 설정하며 최근기기들은 대부분 802.11n을 기본지원하므로 n만 쓰도록 했습니다.#

# 손님용 별도의 SSID를 생성할 경우, interface에서 virtual AP를 추가해주고 비슷하게 설정하면 됩니다. #

/interface wireless

set [ find default-name=wlan1 ]band=2ghz-onlyn bridge-mode=disabled \

   default-forwarding=no disabled=no frequency=[Channel] hide-ssid=yesmode=\

   ap-bridgesecurity-profile=wpa2aespsk ssid=[SSID] tx-power=[Power] \

   tx-power-mode=all-rates-fixedwireless-protocol=802.11 wps-mode=disabled

# 관리용 및 게이트웨이 지정을 위해 브릿지로 묶은 인터페이스의 ip를 지정해줍니다. #

/ip address

add address=192.168.90.2/24interface=bridge1 network=192.168.90.0

# DNS주소를메인라우터에서 192.168.90.0/24 서브넷의 게이트웨이 ip인 192.168.90.1로 지정해줍니다. #

# 구글 주소 8.8.8.8로 지정해도 됩니다. #

# 내부IP를 고정시키기 위해 DHCP-client를 활성화하지 않았기에 직접 지정해야 합니다. 

# 그 말은 즉, DHCP-client를 활성화하면 이 작업은 넘어가도 됩니다.

/ip dns

set servers=192.168.90.1

# 필요없는 서비스포트를 닫습니다. #

/ip firewall service-port

set h323 disabled=yes

set udplite disabled=yes

set dccp disabled=yes

set sctp disabled=yes

# 라우팅 경로를 지정하여 밖으로 통신이 가능하게 합니다. #

# AP에서 중앙 라우터로부터 IP를 받기 위한 DHCP client를 활성화시키지 않았기 때문에 (내부 고정IP로 지정) #

# 라우팅을 직접 설정해야 합니다. AP의 맥주소를 지정하여 고정적으로 IP를 받게하면 이 설정은 필요 없습니다. #

/ip route

Add dst-address=0.0.0.0/0 gateway=192.168.90.1

add dst-address=192.168.90.0/24 gateway=bridge1 pref-src=192.168.90.2

# 관리용텔넷/FTP/웹/ssh/api서비스를 필요에 따라 닫습니다. 저는 Winbox빼고 다 닫았습니다. #

/ip service

set telnet disabled=yes

set ftp disabled=yes

set www disabled=yes

set ssh disabled=yes

set api disabled=yes

set api-ssl disabled=yes

# AP의 시간대를 설정합니다. #

/system clock

set time-zone-name=Asia/Seoul

# SNTP클라이언트(인터넷 시간동기화)를 설정합니다. #

/system ntp client

set enabled=yes primary-ntp=203.254.163.74

# 관리용 맥주소기반의 텔넷과 winbox 허용여부 포트를 설정합니다.#

# 손님용 지정이 따로 없다면 메인라우터를 통해 들어오는 것이니 열어두셔도 괜찮습니다.#

# 손님용을 따로 만들겠다면 virtualAP를 하나 만들어 guest용 SSID를 생성하고 해당 virtualAP를 대상에서추가하지 않으면 됩니다.#

/tool mac-server

set [ find default=yes ] disabled=yes

add interface=ethr1

add interface=wlan1

add interface=bridge1

/tool mac-server mac-winbox

set [ find default=yes ] disabled=yes

add interface=ethr1

add interface=wlan1

add interface=bridge1

----------------------------------------------------------------------------------

728x90

구글(Google) 검색엔진을 이용한 해킹

 

구글을 이용한 해킹은 검색 명령어로 자료를 찾아 보는것입니다.

 

1. 구글검색에 아래와 같이 쳐보자

site:co.kr inurl: "index of /"   

(사이트가 co.kr이고 목록이 index of / 안에 있는파일 검색)

 

2. 구글검색 명령어

Site와 intext 를 이용하여 검색후 서버정보 수집 찾아라

 

검색 조건  

site:co.kr intext:"index of /"

 

검색조건

intitle:"index of"intext:"이력서"

 

검색조건 

intitle:"index of /home"site:co.kr

 

검색조건

 "access denied for user""using password" site:co.kr

 

검색조건

 Intext:set db uid

 

검색조건 

Intitle"아파치 설치를 위한 테스트 페이지"       <-(뒤에 한글이다. 아파치가 뜬다라는 것은 보안에 취약하다)

 

검색조건

Intitle:testpage "hey, it no""SSL/TLS-aeare"

 

검색조건

Intitle:"windows xp server internet"

         이것을 쓰는구나 알수 있다.

 

검색조건

"Supplied argument is not a valid MySQL result resource" site:co.kr

 

검색조건

"ORA-00921:unexpected end of SQL command"

 

검색조건

"mySQL error with query"

 

검색조건

"syntax error in query expression"-the

 

검색조건

"access denied for user""using password"

 

검색조건

intitle:Test.Page.for.Apache.it.worked!.web.site!

 

검색조건 

intext:set db uid

 

검색조건

Intitle:"index of" intext:(dump|back|백업|backup) 

Inurl:/admin filetype:php   또는 asp 

 

반드시 다 되는것은 아니다. 왜냐하면 날마다 웹들의 보안이 강화되기 때문이다. 나 또한 해보았으나 인내심이 필요했다. 

 

3. 구글의 검색 옵션 요약

 

검색 옵션 설명

allintitle       글 제목에 포함된 단어를 검색

allinanchor   링크 글 안에서 검색

allintext       본문 안에서 검색

allinurl         URL안에서 검색

cache          구글이 캐시하고 있는 페이지를 검색

daterange     페이지가 색인된 날짜 지정

define          단어 정의 검색

filetype         확장자를 기준으로 파일검색

info             페이지 정보 검색

intext           해당 문자열이 포함된 페이지 검색

intitle           제목에 문자열이 포함된 페이지 검색

inurl            URL에 검색 문자열이 포함된 페이지 검색

link             링크 페이지 검색

related         비슷한 문서 검색

site             특정 사이트를 대상으로 검색

 

※allintitle와 intitle의 차이점은 검색어 2개를 넣었을 때 allintitle은 둘중에 하나라도 있으면 검색결과에 나타내며, intitle은 검색어 2개가 전부 있는 검색결과를 나타낸다.

 

4. 목적별 구글 검색 활용

 

▶로그 파일 검색

db filetype:log

intitle:”index of” intext:(backup|백업|back|dump)

 

▶로그인

inurl:/admin filetype:php

inurl:/admin filetype:asp

"VNC Desktop" inurl:5800

intitle:"원격 데스크톱 웹 연결" inurl:tsweb

intitle:관리자 로그인

intitle:"인트라넷"

intitle:"intranet"

intitle:"직원용

intitle:"사내" intext:로그인"

 

▶패스워드 파일

intext:mysql_connect+pass

intext:mysql_connect filetype:bak

inurl:"/level/*/exec/" intext:password

intitle:index.of intext:sc_serv_gui.ini

filetype:ini wcx_ftp

intitle:index.of ws_ftp.ini

intitle:technote inurl:cgi-bin

 

▶해킹 파일 검색

intitle:"PHP Shell *" intext:Command filetype:php

inurl:/_vti_bin/shtml.exe

inurl:/cgi-bin/finger

inurl:cgi-bin/guestbook.pl

inurl:/_vti_pvt/admin.pwd

inurl:/phpBB/search.php

inurl:/zeroboard/login.php

inurl:/cgi-bin/14all.cgi

 

▶민감한 데이터

intitle:index.of .bash_history or index.of .sh_history

allintext:대외비

 

▶포트 스캔

"VNC Desktop" inurl:5800

inurl:":10000" intext:webmin

inurl:8080 -inurl:board -intext:8080 or inurl:8000 -inurl:board -intext:8000

intitle:"Network query tool" filetype:php or inurl:nqt.php

 

▶ SQL 데이터 수집

"access denied for user" "using password"

"access denied for user" "using password" site:co.kr

"# Dumping data for table"

"# Dumping data for table" username password

"# Dumping data for table(username|user|pass|password|passwd)"

"ORA-00933: SQL command not properly ended"

"Unclosed quotation mark before the character string"

intitle:"에러" "에러 발생" filetype:asp

intitle:"Error" "에러 발생" filetype:asp

Mysql error message: "supplied argument"

inurl:main.php3 Welcome to phpMyAdmin site:co.kr

filetype:sql+"IDENTIFIED BY" -cvs or filetype:dmp+"IDENTIFIED BY" -cvs

filetype:"(sql|dmp|dump|inc)" password

filetype:mdb inurl:users.mdb

"Warning:pg_connet(): Unalbe to connect to PostgreSQL server:FATAL"

filetype:ldb admin inurl:db intext:password filetype:sql

filetype:"(sql|dmp|dump|inc)" password

inurl:config.php dbuname dbpass

inurl:nuke filetype:sql -cvs

filetype:inc intext:mysql_connect

filetype:inc dbconn site:kr

 

▶인증서

BEGIN(CERTIFICATE|RSA|DEA) filetype:key, or filetype:cer or filetype:der

filetype:pem PRIVATE -cvs

 

▶취약점 스캔

"This file was generated by Nessus" -site:ihackstuff.com

"This file was generated by Network Security Scanner" site:co.kr

intext:"QualysGuard" -site:qualys.com

intitle"X-Scan Report" intext:"This file was generated by X-Scan"

"Network Vulnerability Assessment Report"

 

▶침임 탐지 데이터

ACID "by Roman Danyliw" filetype:php

 

▶SSH Key

filetype:reg reg HKEY_CURRENT_USER SSHHOSTKEYS

 

▶IRC

filetype:cgi "cgi:irc"

filetype:conf inurl:psybnc.conv "USER.PASS="

'IT > 해킹(Hacking)' 카테고리의 다른 글

워터링 홀(Watering Hole) 공격  (0) 2021.08.25
서비스거부(Dos) 공격 Teardrop, Land attack, Syn Flooding, Smurf attack  (1) 2021.08.03
Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
최고의 무료 보안 도구 20선  (0) 2021.07.07
728x90

Httpry

Httpry는 HTTP 트래픽을 표시하고 기록하는 용도에 특화된 패킷 스니퍼다. 이름에서도 알 수 있듯이 httpry는 HTTP 트래픽만 파싱할 수 있다. URLSnarf와는 달리 데이터의 수집, 파싱, 출력을 위한 다양한 옵션을 제공한다. Httpry는 모든 HTTP 헤더를 순서와 관계없이 수집하고 출력할 수 있다. 각자 환경에 맞는 PSTR(패킷 문자열; Packet String) 데이터를 생성할 수 있도록 여러 도구의 결과물을 원하는 대로 조정할 수 있는 기능이 매우 중요하다. Httpry의 다양한 설정과 여러 후처리 기능 덕분에 URLSnarf보다는 사용법을 익히는 데 노력이 필요할 것이다.

 

Httpry는 기본 Security Onion 설치본에 포함돼 있지 않지만 비교적 간단하게 소스를 빌드해서 설치할 수 있다. 다음 절차를 따라서 Httpry를 설치할 수 있다.

 

1. Httpry를 컴파일하는 데 필요한 libpcap 개발 라이브러리를 설치한다.

sudo apt-get install libpcap-dev

 

2. Jason Bittel의 Httpry 웹 사이트에서 tarball을 내려받는다.

wget http://dumpsterventures.com/jason/httpry/httpry-0.1.7.tar.gz

 

3. 압축을 푼다.

tar -zxvf httpry-0.1.7.tar.gz

 

4. Httpry 디렉터리에서 make와 install을 실행한다.

make && sudo make install

 

설치가 끝난 후에 별도의 옵션을 사용하지 않고 프로그램을 실행하면 가장 낮은 번호의 네트워크 인터페이스에서 80번 포트의 HTTP 트래픽을 수집할 것이다.

Httpry는 다양한 명령줄 옵션을 제공하며, 그 중 가장 많이 사용되는 옵션을 다음과 같다.

 

-r <파일>: 실시간 수집 대신 지정한 PCAP 파일을 읽는다.

-o <파일>: Httpry 로그 파일을 생성한다.(파싱용 스크립트를 만드는 데 필요하다.)

-l <인터페이스>: 데이터를 수집할 인터페이스를 선택한다.

-d: 데몬으로 실행한다.

-q: 정숙 모드(quiet-mode)로 실행해서 배너 정보나 통계 정보처럼 필수 정보가 아닌 정보는 표시하지 않는다.

 

Httpry의 기본 로그 형식이 모든 환경에서 파싱하기 적합한 형태가 아닐 수 있다. 다행히 약간의 명령줄 기술을 활용해 팀자와 분석 도구에서 쉽게 파싱할 수 있는 형태의 데이터로 변환할 수 있다.

Httpry는 데이터 결과물을 조정할 수 있는 여러 내장 스크립트도 제공한다. -o 옵션을 사용해 수집된 데이터를 지정한 플러그인으로 출력되도록 설정할 수 있다. 제공되는 플러그인 중에는 호스트 이름의 통계와 HTTP 로그 요약 정보를 출력하는 기능, 출력 데이터를 공통적으로 사용되는 로그 형식으로 변환하는 기능도 포함돼 있어서 URLSnarf와 비슷한 형식의 데이터도 생성할 수 있다. URLSnarf의 결과물과 비교했을 때 데이터 필드가 약간 다른 점을 확인할 수 있을 것이다. 공통 로그 형식이 약간씩 다르기 때문에 파서에서 조금씩 다르게 처리할 수 있다.

 

Httpry의 파싱 스크립트를 만들 수 있는 기능 덕분에 플로그인과 연동해서 끊임없이 자동으로 PSTR 데이터를 생성하는 솔루션을 만들 수 있다. 데이터 변환을 위해 parse_log.pl이라는 이름의 추가 스크립트가 필요하다. 이 스크립트는 httpry의 scripts/plugins 폴더에 있으며 같은 폴더에 저장돼 있는 다른 플러그인을 활용해서 작동한다. 다음 명령어는 한 개의 파싱 스크립트를 사용하는 예제다. 공통 로그 형식을 사용해 탐지나 분석 도구에서 사용하기 더 편리한 형식의 Httpry 데이터를 생성한다.

 

1. Httpry를 실행하고 결과를 파일에 저장한다.

httpry -o test.txt

 

2. 결과를 파싱한다.

perl scripts/parse_log.pl -p scripts/plugins/common_log.pm test.txt

 

이 명령어는 예상한 바와 조금 다른 방식으로 동작한다. 만약 Httpry로 생성한 결과를 파이프로 다른 도구에 전달해서 변환을 시도하면 필요한 컬럼 헤더 정보가 없어서 실패하게 된다. Httpry의 결과 데이터를 -o 옵션을 사용해 파일에 먼저 저장해야 한다. 그 다음에 parse_log.pl 스크립트로 파일의 데이터를 파싱할 수 있다.

 

일반적으로 Httpry를 사용해 PSTR 데이터를 생성하는 것이 URLSnarf를 사용한 것보다 훨씬 빠르다. 그리고 결과 데이터를 유연하게 변환할 수 있는 기능 덕분에 Httpry는 여러 NSM 환경에 적합한 솔루션이다.

728x90

URLSnarf

Dsniff 패키지는 네트워크 보안을 위해 유용한 도구의 모음이다. Dsniff 도구들은 두 가지 부류로 나뉜다. 첫번째 부류는 공격 목적의 도구이고 나머지는 네트워크 트래픽을 모니터링해서 파일이나 이메일, 웹 요청 등을 수집하는 snarf 도구이다. 우리가 특별히 관심이 있는 도구는 후자에 속한 URLSnarf라는 도구다.

 

URLSnarf는 HTTP 요청 데이터를 수집해서 공통 로그 포맷(CLF; common log format) 형태로 저장한다. Dsniff 패키지는 아주 오래 전부터 사용돼 왔고 도구의 설치와 사용법이 매우 간단하다는 점 때문에 개인적으로 특별한 애착을 가지고 있다. URLSnarf도 역시 마찬가지다. 대부분의 경우 선호하는 패키지 관리자 솔루션을 통해 손쉽게 Dsniff 패키지를 설치할 수 있다. Security Onion에는 Dsniff 패키지가 기본으로 설치돼 있지 않지만 apt를 사용해서 설치할 수 있다.

 

sudo apt-get install dsniff

 

Dsniff 패키지를 설치한 후 URLSnarf 명령어를 실행해 잘 설치됐는지 확인해 볼 수 있다. URLSnarf를 매개변수 없이 실행하면 기본 인터페이스를 모니터링해서 표준 출력으로 데이터를 출력하기 때문에 터미널 화면을 통해 데이터를 볼 수 있다. 기본적으로 eth0 인터페이스를 바라보며 TCP 80, 8080, 3128 포트를 모니터링하도록 하드코딩돼 있다.

 

URLSnarf는 4가지 옵션을 제공한다.

 

-p: 이미 수집한 PCAP 파일을 대상으로 URLSnarf를 실행한다.

-i: 네트워크 인터페이스를 선택한다.

-n: DNS 주소로 변환하지 않고 데이터를 파싱한다.

-v <표현식>: 표현식에 특정 URL을 설정해 해당하는 URL 정보만 보이게 한다. -v 옵션을 사용하면 설정한 URL을 제외한 나머지 결과를 보여준다.

 

결과물이 표준 출력 로그이기 때문에 -v 옵션을 사용하기보다는 파이프로 BASH 명령어 도구인 grep, cut, awk를 사용해서 파싱하는 것을 더 선호한다.

URLSnarf가 사용하기는 매우 쉽지만 그 단순함 덕분에 몇 가지 문제점도 있다. 결과 데이터를 더욱 간소화하고 싶다면 외부 도구를 사용해서 데이터를 줄일 수 밖에 없다. 그리고 만약 더 상세한 데이터를 원하더라도 뾰족한 방법이 없다. URLSnarf는 다른 도구들처럼 멀티라인 데이터 출력을 지원하지 않는다.

'IT > 해킹(Hacking)' 카테고리의 다른 글

구글(Google) 검색엔진을 이용한 해킹  (0) 2021.07.07
Httpry  (1) 2021.07.07
최고의 무료 보안 도구 20선  (0) 2021.07.07
Fiddler 설치 및 사용방법  (0) 2021.07.07
Burp Suite 설치 및 사용방법  (0) 2021.07.07
728x90

원문 출처 : https://www.itworld.co.kr/news/119375

 

세상에 공짜를 싫어할 사람이 있을까. 운이 좋게도, 정보보안 분야 종사자들은 다양한 작업에 무료로 사용할 수 있는 도구들이 많다. 이번 기사에서는 비밀번호 해독기(password crackers)부터 취약점 관리 시스템, 네트워크 분석기까지 20여 개의 도구에 대해 정리했다. 보안 분야에서 어떤 업무를 맡고 있든, 여기에서 유용한 도구를 찾을 수 있을 것이다.

 

오픈소스 인텔리전스 앱, 말테고(Maltego)

파테르바(Paterva)가 개발한 포렌직 및 오픈소스 인텔리전스 앱이다. 사용자 환경의 위협 상황을 전달할 수 있도록 만들어져 있다. 특정 단일 실패 지점의 복잡성과 중대성, 특정 인프라 범위에 존재하는 신뢰 관계에 대한 정보를 제공한다. 회사 네트워크 엣지에 위치한 라우터의 현재 구성 상태, 소속 기업 부사장의 현재 위치 등 인터넷에 게시된 정보를 수집한다. 상업용 라이선스의 경우 유료다. 그러나 커뮤니티 버전은 일부 제약이 있지만 무료로 사용할 수 있다.

 

침입 테스트 도구, OWASP ZAP(Zed Attack Proxy)

ZAP는 웹 앱에서 취약점을 찾아주는 사용자 친화적인 침입 테스트 도구다. 원한다면, 수동으로 취약점을 찾는 도구들과 자동화된 스캐너를 제공한다. 보안 관련 경험이 풍부한 실무자가 사용할 수 있도록 만들어졌으며, 침입 테스트를 처음 접하는 기능 테스터나 개발자에게 유용한 도구다. 젠킨스(Jenkins) 지속 통합 및 딜리버리 애플리케이션을 위한 공식 ZAP 플러그인도 있다.

 

침입 테스트 환경 가상머신, 사무라이 WTF(Samurai Web Testing Framework) 

사무라이 WTF는 이 기사에서 소개하는 다른 기술 가운데 일부, 웹 침입 테스트 환경 기능들이 포함된 가상 머신이다. 여러 무료, 오픈소스 도구가 들어있는 VM웨어 이미지가 포함된 ZIP 파일을 다운로드, 웹사이트 테스트 및 공격에 사용할 수 있다.

여기에는 피어스(Fierce) 도메인 스캐너와 말테고도 포함되어 있다. 매핑에는 웹스캐럽(WebScarab)와 랩프록시(Ratproxy)를 사용한다. 디스커버리(검색 또는 발견) 도구는 w3af와 burp이다. 최종 단계인 익스플로잇의 경우, AJAXShell, 브라우저 익스플로잇 프레임워크인 BeEF 등이 포함되어 있다. 상당히 편리한 도구이지만 단점도 존재한다. 몇 년 전에 개발자의 메일링 리스트 운영이 중지됐다. 가창 최신 사무라이WTF 릴리스 3.2는 2016년에 패키징된 것이다. 포함된 도구들 가운데 구 버전 도구들이 많다.

 

리눅스 기반 침입 테스트 도구, 백트랙(BackTrack)

칼리 리눅스(Kali Linux)는 과거 백트랙으로 불렸던 리눅스 기반 침입 테스트 툴박스다. 보안 분야 종사자들은 해킹을 위해 구현한 네이티브 환경에서 평가를 실시하는 데 이 도구를 사용한다. 포트 스캐너부터 비밀번호 해독기까지 다양한 도구들을 쉽게 이용할 수 있다. Kali ISO를 다운로드 받아 32비트나 64비트 x86, ARM 프로세서 시스템에 설치할 수 있다. VM웨어나 하이퍼-V용 VM 이미지도 있다.

칼리에 포함된 도구들을 유형 별로 분류할 수 있다. 정보 수집, 취약점 분석, 무선 공격, 웹 애플리케이션, 익스플로잇(공격) 도구, 스트레스 테스트, 포렌직, 스니핑 및 스푸핑, 패스워드 공격, 액세스 유지, 리버스 엔지니어링, 리포트, 하드웨어 해킹이 여기에 해당된다.

 

윈도우 비밀번호 복구 도구, 카인 엔 아벨(Cain & Abel)

비밀번호를 기억하는 사람이 없거나, 설정한 사람조차 모르는 구형 윈도우 시스템에 액세스할 필요가 있을 때 유용하게 사용할 수 있는 도구가 카인 엔 아벨이다. 윈도우 XP까지 마이크로소프트 운영체제용 비밀번호 복구 도구였으며, 2014년 이후 업데이트가 되지 않았다.

네트워크를 스니핑하고, 사전(Dictionary)과 무차별 대입(Brute-Force), 암호해독(Cryptanalysis) 공격을 사용해 암호화된 비밀번호를 깨고, VoIP 대화를 기록하고, 무질서한 비밀번호를 해독하고, 무선 네트워크 키를 복구하고, 비밀번호 상자를 드러내고, 캐시 저장된 비밀번호를 찾고, 라우팅 프로토콜을 분석, 다양한 비밀번호를 쉽게 복구할 수 있는 도구다. 프로토콜 표준, 인증 방법, 캐시 저장 메카니즘의 보안 요소, 취약점 가운데 일부도 다룬다. 이 도구의 주된 용도는 다양한 소스의 크리덴셜과 비밀번호를 쉽게 복구하는 것이다.

 

정찰도구, 피어스 도메인 스캔(Fierce Domain Scan)

또 다른 유용한 도구다. 개발자인 로버트 한센은 2007년 마지막으로 이 도구를 업데이트했다. 한센은 자신의 블로그인 ha.ckers 블로그에서 "웹 애플리케이션 보안 감사를 실시한 후, 개인적으로 좌절감이 느껴 개발한 도구"라고 설명한다.

피어스는 DNS 엔트리를 조사, 기업 네트워크 내부와 외부에서 잠재적인 표적을 정확히 찾는다. 기본적으로 정찰 도구다. 내장된 Perl 스크립트가 몇 분 이내에 다양한 전술을 사용해 도메인을 스캔한다. 한센이 자신의 블로그를 폐쇄하기는 했지만, 여기 링크된 깃허브(Github) 레포지토리에서 피어스를 찾을 수 있다. DNS의 기본 개념이 지난 10년 간 바뀌지 않았기 때문에, 피어스는 여전히 작동한다.

 

오픈소스 인텔리전스 도구, 하베스터(The Harvester)

하베스터는 구글과 링크드인 같은 오픈소스를 활용, 하위 도메인 이름, 이 도메인과 관련된 이메일 주소와 사용자 이름을 획득하는 오픈소스 인텔리전스 도구(OSINT)다. 침입 테스터 사이에 인기있는 도구로, 사용자는 패시브 정찰을 수행하고 사용자 이름과 이메일 주소 목록이 포함된 타겟(표적) 프로필을 만들 수 있다. 또는 자신이 소유한 도메인의 노출에 대해 조사할 수 있다.

 

맞춤형 TCP/IP 어셈블링 및 분석 도구, Hping

Hping은 맞춤형 TCP/IP 어셈블링 및 분석에 사용할 수 있는 명령줄 도구다. 방화벽 테스트, 포트 스캐닝, 여러 프로토콜을 이용한 네트워크 테스트, OS 핑거프린팅(지문 채취), 고급 트레이스라우트로 사용할 수 있다. 리눅스, FreeBSD, NetBSD, OpenBSD, 솔라리스, 맥OS X, 윈도우에서 실행된다. 몇 년 동안 업데이트되지 않았지만, TCP/IP도 마찬가지다.

 

비밀번호 해독기, 존 더 리퍼(John the Ripper) 

존 더 리퍼는 유닉스, 윈도우, DOS, BeOS, OpenVMS를 지원하는 비밀번호 해독기다. 그러나 무료 버전을 스스로 컴파일링 해야 한다. 취약한 유닉스 비밀번호를 찾는 데 주로 사용한다. 다양한 유닉스 시스템에서 가장 많이 사용되는 몇몇 crypt(3) 비밀번호 해시 종류에 더해, 윈도우 LM 해시, 커뮤니티 강화 버전의 암호화와 다른 많은 해시들을 기본 지원한다. 강화된 커뮤니티 버전은 검색 속도를 높일 수 있는 GPU 사용을 지원한다.

 

취약점 및 구성 평가 도구, 네서스(Nessus)

네서스는 전세계적으로 가장 인기있는 취약점 및 구성 평가 도구 가운데 하나다. 오픈소스 프로젝트로 시작되었지만, 개발사인 테네이블(Tenable)이 버전 3에서 사유 라이선스 기술로 바꿨다. 2018년 5월 기준, 버전 7.1까지 개발되어 있다. 그렇지만 홈 네트워크를 대상으로 한 개인 용도의 경우 여전히 무료로 사용할 수 있다. 무료 버전은 최대 16개까지 IP 주소를 스캔한다. 테네이블 웹사이트에 따르면, 네서스는 고속 디스커버리, 구성 감사, 자산 프로파일링, 민감한 데이터 디스커버리, 패치 관리 통합 및 취약점 분석 등의 기능을 제공한다.

 

네트워크 검사 및 보안 감사용 오픈소스 도구, 엔맵(NMap)

엔맵은 네트워크 검사 및 보안 감사용 오픈소스 도구다. 만들어진 지 20년이 지났지만, 개발자가 계속 업데이트를 하고 있다. 단 하나의 호스트에도 사용할 수 있지만, 대규모 네트워크를 빠르게 스캔할 수 있다. NMap 웹사이트에 따르면, 이 스캐너는 원본 IP 패킷을 이용해 네트워크에 가용한 호스트, 이 호스트들이 제공하는 서비스, 실행되고 있는 운영체제, 사용되고 있는 패킷 필터 및 방화벽 종류 등 많은 정보를 밝혀낸다. 보안 감사는 물론, 네트워크 인벤토리와 서비스 업그레이드 일정 관리에도 사용할 수 있다. 헐리우드 영화에 묘사된 것들을 그대로 믿는다면, 해킹 천재와 트래킹 슈퍼히어로들을 위한 도구일 수도 있다. 다양한 용도로 사용하는 도구라는 의미다.

 

오픈소스 SSL VPN 도구, 오픈VPN(OpenVPN)

오픈VPN은 원격 액세스, 사이트-투-사이트 VPN, 와이파이 보안, 엔터프라이즈급 원격 액세스 솔루션 등 다양한 구성에서 작동하는 오픈소스 SSL VPN 도구다. 로드 밸런싱, 페일오버, 정밀한 액세스 제어(관리) 기능을 제공한다. 윈도우 장치용 패키지형 설치 도구를 입수해 사용할 수 있다. 또 코드는 OpenBSD, FreeBSD, NetBSD, 맥OS X, 솔라리스에서도 실행된다.

 

윈도우 비밀번호 해독 도구, Ophcrack

Ophcrack는 레인보우 테이블을 사용하는 윈도우 비밀번호 해독용 무료 도구다. 여러 플랫폼을 지원한다. 또 실시간 그래프로 비밀번호를 분석하는 GUI를 갖고 있다. 사이트에서 입수할 수 있는 무료 레인보우 테이블과 LM(윈도우 XP), NTLM(비스타 및 7) 해시를 사용해 비밀번호를 크랙할 수 있다. 단순한 비밀번호에 사용할 수 있는 무차별 대입 모듈도 있다. 심지어 윈도우 파티션에서 복구한 SAM(Security Account Manager)에서 해시를 덤프 및 로드할 수 있는 기능도 지원한다.

 

파이썬 시큐리티(Python Security)

원래 OWASP 파이썬 시큐리티 프로젝트는 개발자들이 고위험 환경을 위한 애플리케이션을 구현할 수 있는 강화된 파이썬 버전 개발에 목표를 뒀다. 그런데 파이썬 프로그래밍 언어의 보안에 대한 거대한 정보 ‘컬렉션’이 만들어졌다. 관련 팀은 2가지 영역에 초점을 맞췄다. 파이썬 애플리케이션과 오픈소스 코드의 기능적, 구조적 분석, 파이썬 인터프리터의 블랙박스 분석이다. 프로젝트 웹사이트에는 파악한 보안 우려사항을 목록으로 정리한 위키가 있다.

 

네트워크 프로토콜 분석 도구, 와이어샤크(Wireshark)

와이어샤크는 사용자가 컴퓨터 네트워크의 트래픽을 캡처하고, 쌍방향으로 탐색할 수 있는 네트워크 프로토콜 분석 도구다. 20년이 넘는 역사를 갖고 있으며, 라이브 캡처 및 오프라인 분석, 수천 프로토콜에 대한 심층 검사 등 다양하고 많은 기능이 추가됐다. 이런 식으로 계속 기능들이 추가되고 있다. 윈도우, 리눅스, OS X, 솔라리스, FreeBSD, NetBSD 등 여러 플랫폼을 지원한다. 주요 기능 일부를 소개하면, VOIP 트래픽을 분석하고, SSL/TLS WEP과 WPA/WPA2 트래픽을 해독할 수 있고, USB와 블루투스, 심지어 구식 프레임 릴레이의 트래픽을 판독할 수 있다.

 

웹 앱 모니터링, 로깅, 액세스 제어 도구, 모드시큐리티(ModSecurity)

모드시큐리티는 트러스트웨이브(Trustwave) 산하 스파이더랩스 팀(SpiderLabs Team)이 개발한 웹 애플리케이션 모니터링, 로깅, 액세스 제어 툴킷이다. 전체 HTTP 트랜잭션 로깅, 전체 요청 및 응답 캡처 기능을 제공한다. 또 지속적인 보안 평가 기능, 웹 애플리케이션 강화 기능이 있다. 아파치 2.x에 집어넣거나, 리버스 프록시로 배포해 웹 서버를 보호할 수 있다.

 

취약점 관리 시스템, 스레드픽스(ThreadFix)

스레드픽스는 데님 그룹(Denim Group)이 개발한 소프트웨어 취약점 수집 및 취약점 관리 시스템이다. 동적, 정적, 쌍방향 애플리케이션 스캐너의 보고 결과를 대조해 병합한다. 개발자가 가장 중요한 문제에 초점을 맞출 수 있도록, 소프트웨어 결함 추적 시스템과 연동되도록 만들 수 있다. 커뮤니티 버전은 오픈소스다. 그렇지만 강화된 기능이 포함된 유로 스레드픽스 버전도 있다.

 

웹 앱 보안 테스트 플랫폼, 버프스위트(Burp Suite)

버프스위트는 웹 앱 보안 테스트 플랫폼이다. 전체 테스트 프로세스를 지원하는 다양한 도구가 포함되어 있다. 초기 매핑, 애플리케이션 공격 표면 분석, 보안 취약점 검색 및 익스플로잇 등을 예로 들 수 있다. 또 프록시 서버, 웹 스파이더, 인트루더 및 리피터(요청 자동화) 등이 포함되어 있다. 포트스위거(Portswigger)는 웹 취약점 스캐너, 일부 고급 수동 도구가 빠진 무료 버전을 제공하고 있다.

 

메타스플로잇(Metasploit)

HD 무어는 2003년, 보안 커뮤니티에 익스플로잇 개발 관련 공개 리소스를 제공하는 메타스플로잇 프로젝트를 만들었다. 이 프로젝트를 통해 보안 도구 및 익스플로잇 저작용 오픈소스 플랫폼인 메타스플로잇 프레임워크가 탄생했다. 2009년, 취약점 관리 솔루션 회사인 래피드7(Rapid7)이 메타스플로잇 프로젝트를 인수했다. 인수 전, 개발자들은 주로 주말과 밤 등 여유 시간에 프레임워크를 개발하고 있었다. 래피드7은 풀타임 개발 팀 운영에 필요한 예산을 투입하기로 결정을 내렸고, 소스코드를 3개 조항으로 구성된 BSD 라이선스로 유지하고 있다. 지금까지도 이것이 사용되고 있다.

 

에어크랙-ng(Aircrack-ng) 

에어크랙-ng는 와이어샤크가 이더넷에 제공하는 기능을 와이파이에 제공한다. 패킷 모니터링, 하드웨어 테스트, 비밀번호 해독기, 와이파이 네트워크에 대한 공격 등에 사용할 수 있는 완전한 도구 스위트다. 2018년 4월 릴리스된 버전 2.1은 속도와 보안이 크게 향상되었고, 에어크랙-ng가 지원하는 하드웨어의 범위가 확대되었다.

 

테일스(TAILS)

테일스(The Amnesiac Incognito Live System, TAILS)은 DVD나 USB 플래시 메모리 카드에서 실행시킬 수 있는 라이브 리눅스 운영체제다. Amnesiac(기억 상실)로 불리는 이유는 특정 세션에서 다음 세션으로 넘어갈 때 사용자의 활동을 계속 추적하지 않기 때문이고, Incognito(익명)로 불리는 이유는 모든 인터넷 통신에 토르(Tor)를 사용하기 때문이다. 물론 소셜 네트워킹 계정에 로그인을 한 상태 등 로그인 상태에서는 누군가 토르 연결을 모니터링할 때 사용자의 신원이 드러날 수 있다. 그러나 이런 어리석은 일을 하지 않는다면, 테일스는 온라인 활동을 비밀로 유지하도록 큰 도움을 준다.

 

쿠베스(Qubes) OS

쿠베스 OS는 스스로를 “제법 안전한 운영체제”라고 겸손하게 설명하고 있다. Xen 하이퍼바이저를 사용, 기능들을 '큐브(qube)'라 부르는 여러 가상 머신으로 분류한다. 여러 활동(작업)이 각기 다른 큐브로 분리되는 것이다. 분리하는 정도는 각자 결정할 문제다. 약간 걱정되는 경우, 인터넷 뱅킹을 하나의 큐브로 분류하고, 나머지 온라인 활동은 다른 큐브로 몰아 분류할 수 있다. 반대로 모든 이메일 첨부 파일을 각기 다른 큐브로 분류할 수 있다. 그러면 악성 첨부 파일 1개가 전체 시스템을 침해 및 탈취하는 문제를 막을 수 있다. 무료로 다운로드 받아 사용할 수 있다. 그렇지만 메모리(RAM) 4GB와 디스크 공간 32GB 이상의 64비트 인텔 및 AMD 장치만 지원한다.

 

시그널(Signal)

시그널은 ‘엔드 투 엔드’ 보안을 제공하는 메시징 및 비디오-비디오 통화 앱이다. 시그널 개발자조차 사용자의 대화를 가로채거나, 해독할 수 없다. 맥OS, 리눅스, 윈도우가 운영체제인 데스크톱 장치, 안드로이드, iOS에서 무료로 사용할 수 있다. 메시지가 사라지는 기능(수신자가 읽고 나면 발신자가 지정한 시간에 사라짐), 암호화된 그룹 채팅, 사진 메시징 기능 등을 제공한다. EFF(Electronic Frontier Foundation)는 SSD(Surveillance Self Defense) 지침에서 시그널 사용을 권장하고 있다.

'IT > 해킹(Hacking)' 카테고리의 다른 글

Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
Fiddler 설치 및 사용방법  (0) 2021.07.07
Burp Suite 설치 및 사용방법  (0) 2021.07.07
정보보안 용어정리  (1) 2021.07.07
728x90

원문 : https://grini25.tistory.com/13?category=858418

'IT > 해킹(Hacking)' 카테고리의 다른 글

Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
최고의 무료 보안 도구 20선  (0) 2021.07.07
Burp Suite 설치 및 사용방법  (0) 2021.07.07
정보보안 용어정리  (1) 2021.07.07
728x90

원문 : https://grini25.tistory.com/202

'IT > 해킹(Hacking)' 카테고리의 다른 글

Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
최고의 무료 보안 도구 20선  (0) 2021.07.07
Fiddler 설치 및 사용방법  (0) 2021.07.07
정보보안 용어정리  (1) 2021.07.07
728x90

중앙처리장치(CPU) : SW 명령의 실행이 이루어지는 칩. 정보를 입력 받고, 기억하고, 연산하고, 출력하는 역할. 컴퓨터 부품과 정보를 교환하며 컴퓨터 시스템 전체를 제어하는 장치

 

기억장치 : 컴퓨터에서 자료를 일시적/영구적으로 보존하는 장치

  * 기억장치의 분류 : 주기억장치와 보조기억장치로 나뉜다.

  * 주기억장치 = 메모리(memory) = 램 (RAM)

  * 보조기억장치 (e.g.하드디스크)

 

저장장치 :  대체로 비휘발성의 기억 장치를 의미

 

소프트웨어(software, sw) : 특정 목적의 프로그램(들)

- 프로그램 소프트웨어 : 컴퓨터hw에 직접 명령어를 주거나 다른 sw에 입력을 제공함으로써 그것이 수행하도록 구현된 기능을 수행

- 컴퓨터 소프트웨어 : 컴퓨터 시스템, 프로그램, 데이터에 의해 처리된 모든 정보 (≠컴퓨터 하드웨어)

- shareware : sw의 마케팅 방식 중 하나. 평가 소프트웨어. 무료로 제공한 후 시험 삼아 써보게 하여 대가를 지불 방식을 요구함. 사용 기간이나 기능에 제약을 둠.(=demoware)

- freeware : 무료로 쓰도록 제작한 소프트웨어

 

하드웨어(hardware, hw) : 소프트웨어가 실행되고 저장되는 물리 구조

 

프로그램 : 지시 사항들이 나열된 순서

 

컴퓨터 프로그램 : 컴퓨터에 의해 실행되는 지시 사항의 모음인 컴퓨터 소프트웨어의 한 예. 대부분의 프로그램들은 저장 매체에 바이너리 형식으로 저장되어 있다가 사용자가 실행시키면 메모리로 적재되어 실행됨.

 

네트워크 : 분산되어 있는 컴퓨터를 통신망으로 연결한 것

 

매크로(macro): 미리 저장된 일련의 명령어를 하나의 명령어로 만들어 실행

 

쿠키 : 방문했던 웹사이트를  빨리 이용하도록 해주는 기능

 

IP(internet protocol) : 송신호스트와 수신호스트 간 패킷 교환 네트워크에서 정보를 주고 받는데 사용하는 정보 위주의 규약(protocol), OSI네트워크 계층에서 호스트의 주소지정, 패킷의 이동을 담당

IP 주소(internet protocol address) : 컴퓨터 네트워크장치들이 서로 인식, 통신하기 위한 특수 번호, 주소

 

컴퓨터 클러스터(computer cluster) : 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합

 

에일리어스(alias) : 하나의 프로그램에서 동일한 기억 장소를 참조하는 변수에 둘 이상의 이름이 붙은 것. 

  * alias : 가명, 별명

 

쉘(shell) : OS에서 사용자가 입력하는 명령을 일고 해석하여 실행해 주는 프로그램. 로그인한 사용자가 없으면 쉘 또한 실행하지 않음

쉘 스크립트(shell script) : 쉘을 통해 프로그램을 만든 것

배치(batch)파일 : 대체로 DOS명령어로 이루어진 스크립트(배치파일을 쉘 스크립트로 변환하여 사용하기도 하나 봅니다)

 

IOS(international organization for standardization) : 국제표준을 개발하고 공표하는 기관(1947~)

 

OSI 참조 모델(open system interconnection) : 타 기종 시스템 간 상호연결 시 네트워크 구조에 상관없이 원활한 통신이 이뤄질 수 있도록 ISO가 제정된 국제 표준. 상호 호환성 부족을 해결하기 위한 표준.

 

OSI의 7계층 : application (7계층) > presentation > session > transport > network > data link > physical (1계층)

 

OSI의 각 계층별 데이터 단위 : message (7-5), segment, packet, frame, bit

 

SDU(service data unit) : 현 계층에서 생성된 특정 프로토콜을 이용하는 사용자 데이터

PDU(protocol data unit) : SDU가 데이터 캡슐화가 이루어지는 계층. 특정 프로토콜을 이용해 아래 계층으로 전송하기 위해 만들어지는 프로토콜 제어 명령과 사용자 데이터 집합.

 

데이터 캡슐화(data encapsulation) : SDU의 앞뒤에 header와 footer를 덧붙이는 과정

 

헤더(header), 풋터(footer) : 각 데이터의 앞 또는 뒤에 붙은 표제 정보. 프로토콜 규칙 및 제어 명령이 들어감.

 

프로토콜(protocol) : 통신 규약. 컴퓨터 등 원거리 통신 사이에서 메시지를 주고 받는 양식과 규칙의 체계.

 

프로토콜 제어 명령 : 출발지에서 목적지까지 데이터가 전송되도록 만들어주는 것

 

데이터 무결성(data integrity) : 데이터의 정확성과 일관성을 유지하고 보증하는 것

 

이더넷(ethernet) : LAN을 위해 개발된 컴퓨터 네트워크 기술

 

라우터(router) : 근거리 통신망(LAN)에서 데이터 packet의 최적경로를 선택하는 장치

 

LAN(local area network) : 근거리 통신망, 집, 학교, 회사 등 가까운 지역을 한데 묶는 컴퓨터 네트워크

 

WAN(wide area network) : 광역 통신망, 국가, 대륙 등 넓은 지역을 연결하는 네트워크

 

랜카드(LAN card) : 근거리 통신망(LAN)에 접속하기 위해 컴퓨터(서버)에 장착된 카드. 최근에는 메인보드에 통합 장착됨.

 

스위칭(switching) : 주로 2계층(data link layer)에서 프레임데이터를 지정된 LAN상의 목적지로 빠르게 전송하는 기능

 

라우터(router) : 2개 이상의 네트워크를 연결 시켜주는 장비. 패킷 안의 정보를 참조하여 최적의 경로로 라우팅하는 역할.

라우터(router) : 패킷을 출발지에서 목적지에 도달하기까지 경유 되는 시스템. 패킷을 중계하는 역할을 함. OSI 모델 중 3계층(network layer)에 속하며, 패킷 안의 목적지 네트워크를 참조하여 라우팅 프로토콜에 따라 최종 목적지까지 라우팅을 함.

라우팅(routing) : 주로 3계층(network layer)에서 패킷데이터를 WAN까지 확장하여 가장 효과적인 경로를 선택해 목적지로 전송하는 기능

라우팅 프로토콜(routing protocol) : 라우터와 라우터 사이 경로정보를 주고받을 때 이용되는 프로토콜

IP 라우팅(IP routing) : 주어진 ID패킷을 IP헤더에 있는 목적지 주소까지 패킷을 전달하는 것

정적 라우팅(static routing) : 관리자에 의해 라우팅 경로가 설정되는 방법

동적 라우팅(dynamic routing) : 라우터 라우팅 경로가 주변의 라우터와 라우팅 프로토콜에 의해 설정되는 형태

디폴트 라우팅(default fouting) : 라우팅 테이블에 없는 원격 네트워크 수신지로 하는 패킷을 다음 홉인 라우터로 전송하기 위한 방법

라우팅 테이블(routing table) : 라우터나 호스트에서 패킷을 포워딩하기 위해 참조하는 테이블

포워딩(forwarding) : 라우터의 입력포트에서 출력포트로 패킷을 이동시키는 것

  * forward: 앞으로, 겉으로, 앞의, 진보한, 전송하다. 촉진하다

홉(hop) : 각 패킷이 매 노드(라우터)를 건너가는 양상을 비유적으로 표현

  * 홉 수(hop count) : 거쳐간 라우터 수

 

리피터(repeater) : 전기적인 신호를 전송하는데 제한이 있어 신호를 증폭하는 역할 수행

 

허브(hub) : LAN에서 1대의 컴퓨터가 송신한 신호를 모든 컴퓨터에 전달하는 역할

 

스위치(switch) : 동시에 다수의 LAN과 컴퓨터들 사이에 프레임 교환 가능하게 하는(data link layer) 역할

L4 스위치(layer 4 switch) : TCP/UDP의 포트번호를 검사하여 로드발란싱 기능을 수행. 네트워크 전송 속도 향상 또는 여러대의 서버에 대한 트래픽 분산시켜 속도 향상시키는 장치.

 

토폴로지(topology) : 링크, 노드 등으로 이뤄진 네트워크를 구성하는 다양한 유형의 배열을 의미

  * 버스형(bus), 스타형(star), 링형(ring), 그물망형(mesh), 트리형(tree)

트렁크 링크(trunk link) : 스위치가 하나의 링크를 통해 여러 VLAN 트래픽을 운반하도록 해줌

VTP(VLAN trunking protocol) : 여러 개의 스위치 상에서 트렁크 링크를 통해 VLAN 설정 정보를 통합적으로 관리하기 위한 프로토콜

 

WAN(wireless LAN) : 선 연결없이 인터넷을 이용하게 해주는 무선인터넷이용환경, 유선LAN 대체. 무선랜.

무선 액세스포인트(wireless access point, WAP) : 와이파이, 블루투스 관련 표준을 이용하여 무선장치들을 유선장치에 연결할 수 있게 하는 장치

WPAN(wireless personal area network) : 개인 사용자 간 단거리 네트워크 구성에 사용되는 형태. 사용자 간 정보 공유, 주장비-주변장치와의 연결.

인프라스트럭처 모드 : 네트워크장치(AP, 무선공유기)를 통한 무선연결방식.

애드훅(ad-hoc)모드 : 무선네트워크장치(WAP) 없이 PC의 무선LAN카드 간의 무선연결방식

무선랜 보안 프로토콜 : SSID, MAC, WEP, WPA, WPA2

 

기밀성(Confidentiality)

 - 중요하거나 민감한 데이터가 ‘비인가된 사람, 프로세스, 시스템에 의해 노출 및 열람되지 않음.’을 보장하는 것

 - 오직 인가된 사람, 프로세스, 시스템만 need-to-know에 근거하여 시스템에 접근해야 한다는 원칙

 - 민감하거나 중요한 데이터가 허가되지 않은 사람에게 노출 및 열람되지 않아야 할 것을 요구

 - 위협 요소 : 도청, 사회공학 기법

 - 보안 대책 : 접근제어(통제), 암호화 → 대칭키, 비대칭키

 - 수동적 공격 : 도청(트래픽 분석), 도난, 스니핑 등

 

가용성(Availability)

 - 허가된 사용자가 정보나 서비스를 요구할 때 언제든지 즉시 사용 가능하도록 하는 서비스

 - 정보시스템의 보안이 시스템의 활용에 제한을 주지 않고 정상적인 운영이 가능하도록 하는 것

 - 허가된 사용자가 시스템의 자원을 요구했을 때 요구한 시스템 자원 및 서비스를 언제나 제공해야 한다.

 - DoS 공격으로 손상을 받을 수 있는 정보시스템의 특성

 - 데이터에 대한 백업, 형상관리, 변경통제, BCP 및 DRP 수립 필요

    예) BCP, DRP, Fault tolerent system 등

 - 보안서비스를 강화하면 가용성은 줄어든다.

 

무결성(Integrity)

 - 허가되지 않은 사람에 의한 불법적인 정보의 생성, 변경(위조), 삭제 등으로부터 보호하는 것

 - 정보시스템의 내용이나 상태를 ‘원시 그대로 보호할 수 있도록 하는 것’으로 허가되지 않은 사람에 의한  정보의 생성, 변경(위조), 삭제 등으로부터 보호하는 조치

 - 정보의 저장과 전달시 비인가된 방식으로 정보와 S/W가 변경 파괴되지 않도록 정확성과 완전성, 일관성을 확보하는 것

  - 데이터가 송신된 그대로 수신자에게 도착해야 한다는 것을 의미하고, 전송 중 데이터에 대한 고의적 또는 악의적인 변경이 없었다는 것을 보장

 - 확보 방안 : 접근제어, 메시지 인증, 침입탐지, 백업 등의 기술이 필요, Hash 이용, X.509 공개키 이용

 - 전송되는 메시지에 메시지 인증 코드(MAC : Message Authentication Code)를 생성하여 메시지와  함께 전송하는 방법, 예방보다 사후 발견에 비중을 둔다.

 - 메세지를 전송한 원천을 검증한다.

 - 위협 요소 : 논리폭탄, 백도어, 바이러스, 해커에 의한 메시지 수정, 생성, 변경, 삭제

 - 무결성 확보 방안 : 해시함수, MAC(메세지 인증코드), 전자서명

 

공개키 기반 구조(PKI: Public Key Infrastructure) : 인증, 전자서명에 주로 사용

 

공개키 : 공개키는 지정된 인증기관에 의해 제공되는 키 값으로서, 이 공개키로부터 생성된 개인키와 함께 결합되어, 메시지 및 전자서명의 암호화와 복원에 효과적으로 사용될 수 있다. 공개키와 개인키를 결합하는 방식은 비대칭 암호 작성법으로 알려져 있으며, 공개키를 사용하는 시스템을 공개키 하부구조(PKI)라고 부른다.

인터넷상의 거래 비밀을 보장하면서도 거래 당사자들의 신분을 확인시켜 주는 보안기술이다. 공개한 의미는 수신자만 열쇠를 갖고 있는 자물쇠를 여러 사람에게 나눠줬다는 것을 의미한다. 즉 자신에게 귀중품을 보낼때 금고에 먼저 그것을 담고, 금고열쇠는 다시 자신만이 열수 있는 자물쇠로 봉합해 보내라는 것이다. 데이터를 암호화하는 방법에는 공개키와 비밀키 방식이 있다. 비밀키 암호시스템이 송수신자 양측에서 똑같은 비밀키를 공유하는 데 반해 공개키는 암호화와 복호화키가 다르기 때문에 데이터를 암호화하고 이를 다시 풀 수 있는 열쇠가 달라 거의 완벽한 데이터 보완이 가능하고 정보유출의 가능성이 적은 시스템이다. 공개키 암호방식은 대칭키 암호기술이 제공하는 기밀성, 무결성 기능뿐 아니라 인증, 부인방지, 전자서명과 같은 다양한 정보보호 기능을 제공하고 키 분배 문제를 해결할 수 있는 가장 효과적인 대안으로 인식되고 있다.

 

피싱(Phishing) : 개인정보(Private data)와 낚시(Fishing)의 합성어로, ① 금융기관을 가장한 이메일 발송 →② 이메일에서 안내하는 인터넷주소 클릭 → ③ 가짜 은행사이트로 접속 유도 →④ 보안카드번호 전부 입력 요구 → ⑤ 금융정보 탈취 → ⑥ 범행계좌로 이체

ex) ‘9월 카드 거래내역’이라는 제목의 이메일에서 안내하는 인터넷주소를 클릭하자 가짜은행사이트로 접속되면서 보안카드번호 전부를 입력한 결과, 범행계좌로 무단 이체

 

파밍(Pharming) : 피싱에서 진화한 형태로, 유도가 아닌 직접적으로 가짜 사이트로 접속하도록 함

악성코드에 감염된 사용자PC를 조작하여 금융정보를 빼냄

① 사용자PC가 악성코드에 감염됨 → ② 정상 홈페이지에 접속하여도 피싱(가짜)사이트로 유도 → ③ 금융정보 탈취 → ④ 범행계좌로 이체

※ (피싱사이트) ‘http://*Kb*bank.com’ 등 정상 홈페이지로 가장하여 금융정보(보안카드번호      전부) 입력을 요구, 신종금융사기의 주요 범행수단

파밍은 아예 해당 사이트가 공식적으로 운영하고 있던 도메인 자체를 중간에서 탈취한다는 점에서 차이가 있다. 인터넷프로토콜(IP) 주소 자체를 변경해 ‘WWW’로 시작하는 주소를 정확히 입력해도 가짜 사이트가 뜨게 해, 사용자들은 늘 이용하는 사이트로 알고 의심하지 않고 개인 ID, 패스워드, 계좌정보 등을 노출하게 된다. 파밍은 이런 방법으로 개인정보를 빼가는 수법이다. 이러한 파밍에 대응하기 위해서는 서버 소프트웨어 강화 및 DNS(domain name server) 보호가 선행되어야 한다.

 

스미싱(Smishing) : 문자메시지(SMS)와 피싱(Phishing)의 합성어로, ① ‘무료쿠폰 제공’, ‘돌잔치 초대장’, ‘모바일청첩장’ 등을 내용으로 하는 문자메시지내 인터넷주소 클릭하면 → ② 악성코드가 스마트폰에설치되어 → ③ 피해자가 모르는 사이에 소액결제 피해 발생 또는 개인·금융정보 탈취

 

스니핑(Sniffing) : 킁킁거리다, 냄새를 맡다(sniff)에서 파생된 IP 용어로 네트워크 주변을 지나다니는 패킷을 엿보는 행위이다. 300바이트 정도만 가로챌 수 있어도 계정의 id, pwd를 훔칠 수 있기에 보안에 큰 타격을 줄 수 있다.

스니핑 공격은 공격 대상의 근거리 네트워크를 promiscuous mode를 통해 조작한 후 필터링을 해제하고 패킷을 훔치는 방식으로 수행한다. 주된 종류로는 스위치 재밍, 포트 미러링, ARP redirect, ICMP redirect 등이 있다.

스니핑을 방어하기 위해 SSL 등 데이터 암호화 기법이 쓰이고 있다. 데이터를 도둑맞아도 내용을 볼 수 없으므로 안전해진다.

2015년 12월 우크라이나 정전 사태에 악용되었다. 또 인터넷 도박을 할 때 사기도박을 하기 위해 악용되는 경우가 의심되고 있다.

 

스푸핑(spoofing) : 스푸핑은 눈속임(spoof)에서 파생된 IT 용어로, 직접적으로 시스템에 침입을 시도하지 않고 피해자가 공격자의 악의적인 시도에 의한 잘못된 정보, 혹은 연결을 신뢰하게끔 만드는 일련의 기법들을 의미한다. 이 부류에 속하는 기법들은 인간의 약점을 노리는 피싱과, 단지 중간에서 나가고 들어오는 정보만을 가로채는 스니핑과는 달리 더 적극적으로 피해자의 시스템이 잘못된 정보를 신뢰하고 받아들이게끔 유도하며, 그렇기 때문에 특별한 검증 행위 없이는 자신이 속고 있음을 알아채기 힘들다.

스푸핑에 피해를 입은 시스템은 공격자가 주입한 잘못된 정보를 믿게 되어 스스로 악성 사이트에 접근하거나 공격자에게 정보를 헌납하게 되는데 이 상태에서 피싱과 연계되거나 백도어를 뚫는 수단으로 활용 될 경우 더 큰 2차 피해가 발생하기 쉽다. 특히 피싱은 단순히 누군가가 속아서 접속하기를 기다리는 수준을 넘어서 아예 면전에다 피싱 수단을 들이밀 수 있게 되기에 더 악질적이다.

 

메모리 해킹 : 피해자 PC 메모리에 상주한 악성코드로 인하여 정상 은행사이트에서 보안카드번호 앞·뒤 2자리만 입력해도 부당 인출하는 수법

범죄 유형

<수법1> : 피해자 PC 악성코드 감염 → 정상적인 인터넷 뱅킹 절차(보안카드 앞·뒤 2자리) 이행 후 이체 클릭 → 오류 발생 반복(이체정보 미전송) → 일정시간 경과 후 범죄자가 동일한 보안카드 번호 입력, 범행계좌로 이체

<수법2> : 피해자 PC 악성코드 감염 → 정상적인 계좌이체 종료 후, 보안강화 팝업창이 뜨면서 보안카드번호 앞,뒤 2자리 입력 요구→일정시간 경과 후 범행계좌로 이체

 

랜섬웨어 : ransom(몸값)과 ware(제품)의 합성어로 컴퓨터 사용자의 문서를 ‘인질’로 잡고 돈을 요구한다고 해서 붙여진 명칭이다

인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 스프레트시트, 그림파일 등을 암호화해 열지 못하도록 만든 후 돈을 보내주면 해독용 열쇠 프로그램을 전송해 준다며 금품을 요구하는 악성 프로그램

고도화된 알고리즘의 진화로  최근 가장 주목해야할 보안 이슈 중 하나이다.

 

멀웨어[Malware] : 악성 소프트웨어(malicious software)의 줄임말

컴퓨터 사용자 시스템에 침투하기 위해 설계되어진 소프트웨어를 뜻하며 컴퓨터바이러스, 웜바이러스, 트로이목마, 애드웨어 등이 포함된다. 초기의 바이러스나 웜이 이메일에 첨부된 파일이나 플로피디스크를 통해 전파됐던 반면, 인터넷이 급속도로 보급되면서 멀웨어들은 특정 웹사이트를 접속하는 것만으로도 감염될 만큼 발전을 거듭하고 있다. 또한 시스템을 파괴하는 데 그치지 않고, 개인의 정보를 해킹해 상업적으로 악용하는 등 위험성도 점차 커지고 있다.

가끔 특정 사이트 접근 시 멀웨어 경고 창을 볼 수 있다.

 

데이터유출 방지 [DLP: Data Leakage/Loss Prevention] : 내부정보 유출 방지 솔루션. 사내 직원이 사용하는 USB, 외장하드, 이메일 등 물리적인 것과 네트워크 상의 모든 정보를 검색하고 사용자의 행위를 탐지/통제해 외부 유출을 사전에 막는다. 모니터링 및 로그관리 시스템으로 유출 경로또한 추적할 수 있다. 

 

버퍼 오버플로우[Buffer Overflow] : 버퍼 오버플로우라는 이름에서 알 수 있듯이, 버퍼 오버플로우는 말그대로 정해진 크기의 버퍼 이상을 입력해 프로그램의 비정상적 종료나 개발자가 의도하지 않았던 행위를 하는 것으로, 일반적으로 버퍼의 입력값에 제한을 두지 않는 strcpy함수나, gets함수에서 발생한다.

특히, 버퍼 오버플로우의 핵심은 “리턴 어드레스”라는 곳에 있다. 리턴 어드레스를 간단하게 요약하자면, main함수를 진행하던 도중 다른함수를 만나게 되면 다시 main함수로 돌아올때 필요한 이정표같은 거라고 볼 수 있다. 즉, 프로그램은 리턴 어드레스의 주소로 다시 돌아온다는 것이다. 그렇다면, 리턴 어드레스의 주소를 system() 함수의 주소나 우리가 원하는 쉘을 실행하는 코드가 들어있는 변수의 주소로 변조, 아니면, 입력받는 메모리공간에 쉘코드를 삽입시켜놓고 그 메모리공간의 주소로 변조를 시킨다면 쉘을 따낼 수 있을 것이다.

 

무차별 대입공격(Brute-Force Attack) : 성공할 때까지 가능한 모든 조합의 문자를 대입해 계정 정보 등을 탈취하는 해킹 방법

 

사회공학기법 (응용 보안) : 컴퓨터 보안에서 인간 상호작용의 깊은 신뢰를 바탕으로 사람들을 속여 정상 보안 절차를 깨뜨리고 정보를 얻기 위한 비기술적 침입 수단

 

APT 공격 (Advanced Persistent Threat) : '지능적 지속 위협' 이라는 뜻이다.  다시 말하면, 지능적인 방법을 사용해서 지속적으로 특정대상을 공격하는 것이죠

APT 공격은 과거의 불특정 다수를 노렸던 사이버 공격들과는 달리 하나의 대상을 정해서 성공할 때까지 공격을 멈추지 않는 것이 특징이다.

기업이나 기관의 중요 시스템에 대한 보안은 단단해서 처음부터 침투가 어렵기 때문에 회사 개인PC를 먼저 장악한 후, 합법적인 권한을 획득하여 내부로 들어가는 방법을 주로 사용합니다.

 

제로 데이 공격 / 제로 데이 위협(Zero-day Attack / Zero-day Threat) : 특정 소프트웨어의 아직까지 공표되지 않은, 혹은 공표되었지만 아직까지 패치되지 않은 보안 취약점을 이용한 해킹의 통칭이다.

"Zero-day"는 해당 취약점이 공표 혹은 발견된 날을 뜻하므로, 개발사는 공격이 행해진 시점에서 이 취약점을 해결할 시간을 채 하루도 가지지 못했음을 뜻한다.

제로 데이 공격은 그 정의에 따라 해당 취약점에 대한 대책이 아직까지 없기 때문에 공격을 막을 수가 없어서 어떤 컴퓨터든 무방비로 노출될 수밖에 없다.

Microsoft Windows의 예를 들면, 취약점의 발견/제보 그리고 공표 후 그 취약점에 대한 보안패치 개발까지 보통 6시간 이상 걸린다. 패치가 올라오더라도 받아서 설치할 때까지 시간이 걸리므로, 생각보다 공격이 행해질 수 있는 기간은 길다.

그리고 아예 발견이나 제보조차 되지 않은 취약점이라면 대책이 없다. 그 취약점을 이용하는 공격 매개체(바이러스, 웜 등의 악성코드)가 발견되지 않는 이상 컴퓨터는 해당 공격에 속수무책.

이런 특징으로 인해 제로 데이 취약점은, 특히 아직까지 공표되지 않은 취약점은 블랙햇 해커들에겐 그야말로 꿈의 병기이며, 찾는 데 혈안이다.

찾아도 대개는 함부로 쓰지도 않는다. 제로 데이 취약점은 그 악용 가능성이 무궁무진 하기에 블랙해커들 사이의 다크 웹 암시장(일명 블랙 마켓)에서 고가의 가격으로 팔리기도 한다.

제로 데이 공격의 위험을 최소화하기 위해 안티 익스플로잇이라는 프로그램이 있다. 이들은 취약점 기반 공격을 최대한 막는 역할을 한다.

 

'IT > 해킹(Hacking)' 카테고리의 다른 글

Httpry  (1) 2021.07.07
URLSnarf  (1) 2021.07.07
최고의 무료 보안 도구 20선  (0) 2021.07.07
Fiddler 설치 및 사용방법  (0) 2021.07.07
Burp Suite 설치 및 사용방법  (0) 2021.07.07
728x90

인텔 E5-26XX V3 분류표

728x90

인텔 E5-26XX V4 분류표

728x90

먼저 조정해줘야 할 것은 게시판 자체의 파일 업로드 크기 제한이다.

아래 이미지는 그누보드5의 업로드 파일 크기 제한 설정 화면이다.

 

기본적으로 1M Byte로 되어 있었는데 10M 바이트로 늘린 화면이다. 하나의 게시물에 여러개의 파일이 올라가도 각각 개별적인 파일의 크기만 제한한다. 즉 위처럼 설정되어 있다면 10M 파일을 여러개 업로드 할 수 있다. 이 설정은 게시판~마다 설정해줘야 한다.

 

하지만 이 설정만 변경해서는 용량이 큰 파일을 업로드할 수는 없다.

다음은 php.ini 파일에서 업로드 파일 관련 설정을 변경해주어야 한다. php.ini는 /etc 디렉토리에 있다.

 

먼저 file_uploads가 On으로 되어 있어야 하며 upload_max_filesize를 원하는 용량으로 변경해주면 된다. 위의 설정은 한번의 파일 업로드 즉 하나의 php 스크립트가 실행되면서 해당 세션에서 업로드할 수 있는 용량을 의미한다.

 

만약 아파치서버의 임시디렉토리가 포함된 파일시스템의 용량이 작다면(일반적으로 /tmp) upload_tmp_dir을 설정할 필요도 있다.

 

다음은 php.ini에서 post 메소드 실행 시 사용할 수 있는 메모리 제한값을 설정해 주어야 한다.

 

그누보드의 경우(대부분 그럴 것으로 보임) 파일을 업로드 하면 POST 메소드로 전송이 되는데 이때 업로드하는 파일의 크기만큼 POST로 전송되는 메시지가 커진다. 이 설정도 보안과 관련이 있지만 게시판의 기능인 자료실 용도이니 만큼 제한을 작게 할 수는 없다. 아펭서 파일의 업로드크기 제한을 100M로 했으므로 POST 시 사용할 수 있는 메시지의 크기도 100M보다 커야한다. 

 

위에서는 128M로 설정했다. 왜 100이 아니고 128이냐고 묻는다면 8의 배수 그리고 16의 배수, 32의 배수, 64의 배수로 설정해주는게 습관이 돼서라고 이야기 해주겠다.

 

그리고 메모리 관련 설정이 또 하나가 있다. (제약이 참 많기도 하다.) 앞에서 POST 메소드에서 사용할 수 있는 메모리를 설정해 주어도 PHP 스크립트 하나에서 사용할 수 있는 메모리 제약이 걸려있기 때문에 post_max_size 보다 아래의 memory_limit 가 작다면 의미가 없다.

 

아래 처럼 post_max_size인 128M 보다 크거나 같게 설정한다.

 

이제 업로드 파일의 용량과 업로드 시 사용되는 웹서버 측의 메모리 제약에 대한 설정은 모두 변경하였다.

 

하지만 이것만 설정해선 또 오류가 발생할 수 있다. 파일을 업로드 하는 것은 하나의 PHP 스크립트 파일이 아파치 대몬에 의해 실행되는 것이다. PHP에선 하나의 스크립트가 실행될 수 있는 최대 시간도 제한이 걸려 있다. 만약 100M의 업로드에 제약이 걸린 시간보다 오랜 시간이 소요된다면 timeout 오류가 발생할 수 있다. 이 문제를 예방하기 위해 하나의 php 스크립트가 실행될 수 있는 최대 실행시간 즉, max_execution_time 을 변경해준다.

 

60초 이내에 100M 바이트의 파일 업로드가 완료되어야 한다. 만약 시간이 부족하다면 더 늘려주면 된다. 단위는 초다.

 

이제 아파치 데몬을 재구동하고 파일 업로드를 해보라..

728x90

시놀로지의 제어판에서 발급 받을 수 있는 Let's Encrypt 인증서는 90일 짜리 SSL 인증서 입니다.

시놀로지에서 SSL 인증서는 버튼 몇 번이면 발급이 가능하고, 자동으로 갱신까지 해줘서 매우 편리하게 SSL을 사용할 수 있다는 장점이 있으나,

하위 도메인에 대해서 매번 정의해줘야만 적용이 되는 번거로움이 있습니다.

 

Wildcard(와일드카드)는 하위 도메인에 대한 문제점을 해결합니다.

예를 들어, yourdomain.com과 its.yourdomain.com이라는 도메인이 있다고 가정합니다.

its.yourdomain.com은 yourdomain.com의 하위 도메인 입니다.

 

SSL 인증서에서는 하위 도메인이 많으면 많을 수록 abc.yourdomain.com. its.yourdomain.com. test.yourdomain.com, ... 와 같이 정의한 후 인증서를 갱신해주어야 하위 도메인까지 SSL이 적용 되지만 와일드카드는 단 두개만 정의하면 하위도메인까지 완벽하게 SSL을 적용 시킬 수 있습니다.

 

yourdomain.com과 *.yourdomain.com 만 정의하면 됩니다. (*은 모든 단어가 들어갈 수 있음을 의미합니다.)

만약 it.is.yourdomain.com과 같이 하위 도메인이 여러 수준으로 나뉘어 있다면, *.*.yourdomain.com으로 정의하기만 하면 4차 도메인까지 모두 SSL이 적용됩니다.

거기다 와일드카드는 하위 도메인에 대해 개수 제한이 없습니다.

하위 도메인이 100개든 1000개든 1만개든 상관이 없다는 거지요.

 

장점 하나하나가 모두 크게 작용합니다.

다만 시놀로지에서는 기본적으로 발급을 지원해주지 않기 때문에 초기 설정이 약간 번거롭습니다.

(물론 한번 설정해두면 알아서 스크립트가 돌면서 갱신하기 때문에 사실 걱정은 없습니다.)

 

시놀로지에 와일드카드 인증서 발급 후 적용까지, 시작해 보겠습니다.

 

작업 환경

- Synology DS918+ (DSM 6.2.2-24922 Update 5)

 

시놀로지에서 SSH 기능 활성화

우선, 작업을 위해서는 ssh를 사용해야 합니다.

'제어판 -> 터미널 및 SNMP'에서 'SSH 서비스 활성화'에 체크한 후 [ 적용 ]을 누릅니다.

 

acme.sh 스크립트 설정

Let's Encrypt에 와일드카드 발급을 요청하기 위해서는 acme.sh 라는 스크립트를 사용해야 합니다.

무려 와일드카드 발급을 위해 간단해진 자동화 스크립트입니다.

 

각자 사용하실 ssh 프로그램을 열고, 시놀로지에 접속한 뒤 아래 명령어를 입력합니다.

$ wget https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh

 

그 후 스크립트 파일을 실행하기 위해, 실행 권한을 부여합니다.

$ sudo chmod a+x acme.sh

 

와일드카드 인증서 발급

인증서 발급 과정입니다.

아래 명령어를 자신에게 맞게 몇가지 수정 후 실행해야 합니다.

$ /var/services/homes/사용자 이름/acme.sh --issue --dns --force -d 내 도메인 -d *.내 도메인 --yes-I-know-dns-manual-mode-enough-go-ahead-please

 

사용자 이름

시놀로지의 homes 폴더 내의 내용물과 같은 위치입니다. 자신의 계정 이름을 적어주시면 됩니다.

 

내 도메인

와일드카드 인증서를 실제로 사용할 2차 도메인을 입력합니다. (예: yourdomain.com)

 

명령어를 치고 엔터를 누르면 뭔가 주르륵 뜨고 끝납니다.

당황하지 마시고, 딱 두 개만 보면 됩니다.

 

Domain: '_acme-challenge.내 도메인'

TXT value: "키 값"

 

여러개가 있으면 있는 것 모두 다 보셔야 합니다.

 

도메인 관리 사이트(가비아, DNSZi 등)를 통해 DNS 레코드를 관리하고 계신다면, 사이트에서 TXT 레코드를 추가한 뒤 저장합니다.

시놀로지에서 DNS 서버 패키지를 운영하고 계신다면, TXT 레코드를 추가해서 입력 후 적용하시면 됩니다.

TXT 레코드가 잘 적용이 되었는지 확인하기 위해, nslookup을 통해 테스트 해 봅니다.

nslookup > set type=txt > _acme-challenge.내 도메인

 

입력한 TXT 레코드의 내용이 잘 나타나면 DNS 서버 설정은 끝입니다.

 

인증서 갱신 명령어를 입력해서 최종적으로 인증서 발급을 완료합니다.

$ /var/services/homes/사용자 이름/acme.sh --renew --dns --force -d 내 도메인 -d *.내 도메인 --yes-I-know-dns-manual-mode-enough-go-ahead-please

 

인증서는 /var/services/homes/사용자 이름/.acme.sh/내 도메인 폴더에 저장됩니다.

다만 갱신이 지속적으로 되는 과정에서는 /root/.acme.sh/내 도메인에 저장이 되고 갱신이 되는 것을 반복하기 때문에, 사실상 저 폴더는 필요가 없습니다.

스크립트만 잘 보관해주시면 됩니다.

 

이제 인증서 최초 발급 절차는 끝났습니다.

 

작업 스케줄러 등록으로 인증서 자동 갱신하면 됩니다.

 

인증서는 3개월 동안 유효합니다.

제어판에서 설정한 Let's Encrypt SSL 인증서는 한번 설정해두면 시놀로지에서 알아서 갱신했지만, 수동으로 발급한 Let's Encrypt 와일드카드는 그렇지 않습니다.

그렇다고 매번 ssh 쉘을 열어서 저 명령어를 써 넣고 인증서를 빼내서 갱신할 수는 없겠지요..ㅎㅎ

작업 스케줄러를 이용하면 아주 편하게 자동 갱신이 가능합니다.

 

작업 스케줄러에 작업을 추가하기 전, 선행되어야 하는 작업이 두 가지 있습니다.

1. 발급한 와일드카드 인증서를 시놀로지에 추가

2. 추가한 인증서의 경로 확인

 

1. 발급한 와일드카드 인증서를 시놀로지에 추가

먼저, 조금전에 발급한 인증서를 PC로 받아와야 합니다.

파일 스테이션을 열고, home 폴더로 간 뒤, '.acme.sh' 폴더 안에 있는 본인 도메인 이름으로 된 폴더를 우클릭 하고

[ 다운로드 ]를 누릅니다.

압축 파일 하나가 다운로드 됩니다.

다운로드 하고 열어서 압축까지 풀어줍니다.

압축 푼 후  필요한 것은 3개 입니다.

- 내 도메인.key

- 내 도메인.cer

- ca.cer

파일은 준비되었으니, 이제 시놀로지에 인증서를 추가합니다.

 

'제어판 -> 보안 -> 인증서'에 들어간 뒤, [ 추가 ]를 누릅니다.

'새 인증서 추가'를 클릭하고 [ 다음 ]을 누릅니다.

'인증서 가져오기'를 선택하고 '기본 인증서로 설정'에 체크합니다.

조금 전에 받았던 파일들을 넣어줘야 합니다.

개인키 - 내 도메인.key

인증서 - 내 도메인.cer

중간 인증서 - ca.cer

 

넣고 [ 확인 ]을 눌러주면 인증서가 추가된 것을 확인할 수 있습니다.

[ 구성 ]을 눌러서 원하는 패키지의 인증서를 방금 추가한 인증서로 변경해줍니다.

 

이제 인증서의 경로를 알아내야 합니다.

 

2. 추가한 인증서의 경로 확인

아래 명령을 입력해서 root 권한을 취득합니다.

암호는 시놀로지 계정 암호 입니다.

$ sudo -i

 

'/usr/syno/etc/certificate/_archive' 경로의 DEFAULT 파일을 읽어서 기본 인증서의 폴더가 어느 것인지 알아냅니다.

# cat /usr/syno/etc/certificate/_archive/DEFAULT M5DH8Q

저는 M5DH8Q 라는 폴더에 있다고 가정해 보겠습니다.

 

제어판에서 추가한 인증서들은 '/usr/syno/etc/certificate/_archive'에 각각 랜덤한 이름을 가진 폴더별로 저장되고

이 인증서 중 기본 인증서가 '/usr/syno/etc/certificate/system/default'에 복사되는 구조입니다.

 

그러면 '/usr/syno/etc/certificate/system/default'로 인증서를 바로 복사하면 되는 것 아니냐 라고 하실 수 있는데

이렇게 하면 DSM 6.2.2-24922 Update 5 기준으로, 제어판의 인증서 탭에도 뜨지 않고 사이트에 반영도 되지 않을 뿐더러 시놀로지를 재시작 해도 그대로였습니다.

 

자, 이제 인증서의 경로까지 파악을 했습니다.

이 경로는 인증서를 제거하기 전까지는 유효합니다.

 

이제 인증서 갱신을 위해, 최종적으로 작업 생성을 해야 합니다.

'제어판 -> 작업 스케줄러'에 들어갑니다.

생성 -> 예약된 작업 -> 사용자 정의 스크립트 순으로 클릭합니다.

작업 이름은 보기 편한 이름으로 해주시면 되고

사용자는 반드시 'root' 여야 합니다.

 

작업 주기를 설정합니다.

저는 매주 금요일마다 돌게끔 설정했습니다.

 

'실행 명령'의 '사용자 정의 스크립트' 부분에 내용을 모두 지우고, 아래 명령줄을 추가합니다.

# 인증서 갱신

/var/services/homes/사용자 이름/acme.sh --renew --dns --force -d 내 도메인 -d *.내 도메인 --yes-I-know-dns-manual-mode-enough-go-ahead-please

 

# 갱신된 인증서를 시놀로지에 등록

/bin/cp /root/.acme.sh/내 도메인/내 도메인.cer /usr/syno/etc/certificate/_archive/폴더 이름/cert.pem 

/bin/cp /root/.acme.sh/내 도메인/ca.cer /usr/syno/etc/certificate/_archive/폴더 이름/chain.pem 

/bin/cp /root/.acme.sh/내 도메인/fullchain.cer /usr/syno/etc/certificate/_archive/폴더 이름/fullchain.pem 

/bin/cp /root/.acme.sh/내 도메인/내 도메인.key /usr/syno/etc/certificate/_archive/폴더 이름/privkey.pem

 

# nginx 서비스 재시작 

/usr/syno/sbin/synoservicectl --reload nginx

 

폴더 이름에는 조금전에 DEFAULT 파일을 읽어서 나온 폴더 이름을 넣어주시면 됩니다.

명령줄이 문제가 없는지 잘 확인하고 [ 확인 ]을 눌러 작업을 저장합니다.

결과를 메일이나 로그로 받아보시는 분들은 `date`나 echo 등을 이용해서 가독성을 향상시킬 수 있습니다.

 

이로써 시놀로지에 Let's Encrypt 와일드카드 인증서 등록을 완료했습니다.

자체 DNS 서버를 운영하고 있는 데다가, 레코드가 수시로 변동되다 보니까 매번 인증서 갱신하는게 일이었는데

와일드카드를 접하고 나서는 초기 발급만 해주면 레코드를 아무리 많이 추가하고 바꿔도 따로 갱신을 해주지 않아도 되서 너무 편하게 사용하고 있습니다.

'IT > 나스(NAS)' 카테고리의 다른 글

인텔 E5-26XX V3 분류표  (0) 2021.07.07
인텔 E5-26XX V4 분류표  (0) 2021.07.07
시놀로지(Synology) 도커(Docker) 이미지 업데이트하기  (0) 2021.07.07
인텔 11세대 ES CPU 정보  (0) 2021.07.06
인텔 10세대 ES CPU 정보  (0) 2021.07.06
728x90

시놀로지 나스 에서 도커(Docker)를 사용할 시 이미지 업데이트 방법입니다.

 

① Docker를 연다.

 

② 레지스트리 메뉴에서 업데이트할 도커 이미지를 찾는다.

 

③ 해당 이미지를 다운로드한다.

 

④ 컨테이너 메뉴에서 해당 이미지와 연결된 컨테이너를 중지시킨다.

 

⑤ 중지된 컨테이너에서 우클릭→작업→지우기를 한다. 대부분 볼륨 매핑으로 설정이 유지되겠지만 그렇지 않은 이미지도 있을 수 있으니 주의

 

⑥ 중지된 컨테이너를 다시 시작한다.

'IT > 나스(NAS)' 카테고리의 다른 글

인텔 E5-26XX V3 분류표  (0) 2021.07.07
인텔 E5-26XX V4 분류표  (0) 2021.07.07
시놀로지에 Let's Encrypt 와일드카드 인증서 적용하기  (2) 2021.07.07
인텔 11세대 ES CPU 정보  (0) 2021.07.06
인텔 10세대 ES CPU 정보  (0) 2021.07.06
728x90

QV1K : 8C 16T, 베이스 3.4GHz/부스트 4.8GHz, TDP 125W, 가격 2100 위안, i9 11900K ES

QVTE : 8C 16T, 베이스 1.8GHz/부스트 4.5GHz, TDP 65W, 가격 1600 위안, i9 11900 ES

QV1J : 8C 16T, 베이스 1.8GHz/부스트 4.4GHz, TDP 65W, 가격1300 위안, i9 11700 ES

728x90

QTB0 : 10c 20T 1.5GHz - 4.0GHz TDP 35W, i9 10900T ES

QTB1 : 10c 20T 2.5GHz - 4.6GHz TDP 65W, i9 10900 ES

QTB2 : 10C20T 3.3GHz -           TDP 125W (배수해제), i9 10900K ES

728x90

오라클 DB에서 학습하기 위해 연습 계정인 scott / tiger 을 만들어 주어야 합니다.

 

① 오라클 설치 후 시작 메뉴 오라클 파일에 sqlplus.exe 를 실행해 줍니다.

 

② 설치할 때 만든 아이디와 비밀번호를 입력합니다.

(아이디는 대부분 system이고 비밀번호는 설치시 입력한 값입니다.)

 

③ scott 계정 푸는 방법

ALTER USER scott

IDENTIFIED BY tiger

ACCOUNT UNLOCK;

 

- 연결한 계정 바꾸는 방법

CONN scott/tiger;

 

※ 만약 계정이 존재하지 않는다면 아래와 같이 scott/tiger을 생성해 줘야 합니다. 

 

① 위의 ②와 같이 접속하여 scott/tiger 계정을 생성해 줍니다.

CREATE USER scott IDENTIFIED BY tiger

DEFAULT TABLESPACE users

TEMPORARY TABLESPACE temp;

 

② 권한을 부여합니다.

GRANT connect, resource TO scott;

 

③ 생성된 계정으로 접속해 줍니다.

CONN scott/tiger;

 

첨부파일 : 다양한 예제로 쉽게 배우는 오라클 SQL과 PL/SQL 실습 예제 Query 

 

아래는 실습 명령어들 모음입니다.

 

SELECT * FROM TAB;

 

DESC emp;

 

DESC dept;

 

SELECT * FROM emp;

 

SELECT empno, ename

FROM emp;

 

SELECT * FROM professor;

 

SELECT name, '교수님~배고파요~' 

FROM professor;

 

SELECT studno "학번", name AS "이름", profno 지도교수번호

FROM student;

 

SELECT empno 사원번호, ename 사원명, job 직업

FROM emp;

 

SELECT deptno 부서#, dname 부서명, loc 위치

FROM dept;

 

SELECT name || '님은' || position || '입니다'

FROM professor;

 

SELECT * FROM student;

 

SELECT name || '의 키는' || height || 'cm, 몸무게는' || weight || 'kg 입니다'

FROM student;

 

SELECT * FROM professor;

 

SELECT name || '(' || position || '), ' || name || '''' || position || ''''

FROM professor;

 

SELECT ename, sal, sal+100

FROM emp;

 

SELECT sal, sal+100/2, (sal+100)/2

FROM emp;

 

SELECT ename, sal, deptno

FROM emp

WHERE deptno = 10;

 

SELECT ename, sal

FROM emp

WHERE sal > 4000;

 

SELECT ename, empno, sal

FROM emp

WHERE ename = 'SCOTT';

 

SELECT * FROM professor;

 

SELECT name, pay, hiredate

FROM professor

WHERE hiredate = '2001-05-23';

 

SELECT name, height

FROM student

WHERE height >= 180;

 

SELECT name, weight

FROM student

WHERE weight BETWEEN 60 AND 80;

 

SELECT name, weight

FROM student

WHERE weight >= 60

AND weight <= 80;

 

SELECT name, deptno1

FROM student

WHERE deptno1 IN (101, 201);

 

SELECT name

FROM student

WHERE name LIKE '김%';

 

SELECT name, bonus

FROM professor;

 

SELECT name, bonus

FROM professor

WHERE bonus IS NULL;

 

SELECT name bonus

FROM professor

WHERE bonus IS NOT NULL;

 

SELECT name, grade, height

FROM student

WHERE grade = 4

AND height > 170;

 

SELECT name, grade, height, weight

FROM student

WHERE grade = 1

OR weight > 80;

 

SELECT name, grade, height, weight

FROM student

WHERE grade = 2

AND height > 180

AND weight > 70;

 

SELECT name, grade, height, weight

FROM student

WHERE grade = 2

AND (height > 180 OR weight > 70);

 

SELECT name

FROM professor

WHERE name >= '자'

AND name < '차'

ORDER BY 1;

 

SELECT name, height

FROM student

WHERE grade = 1;

 

SELECT name, height

FROM student

WHERE grade = 1

ORDER BY height;

 

SELECT name, height, weight

FROM student

WHERE grade = 1

ORDER BY height ASC, weight DESC;

 

SELECT name, birthday, height, weight

FROM student

WHERE grade = 1

ORDER BY 2;

 

SELECT name "이름", height "키"

FROM student

WHERE grade = 1

ORDER BY 이름;

 

SELECT * FROM professor;

 

SELECT INITCAP(ID)

FROM student

WHERE deptno1 = 201;

 

SELECT INITCAP('Pretty girl')

FROM DUAL;

 

SELECT name 이름, id, LOWER(id) 소문자, UPPER(id) 대문자

FROM student

WHERE deptno1 = 201;

 

SELECT name 이름, id, LENGTH(id) 글자수

FROM student

WHERE LENGTH(id) > 9;

 

SELECT name 이름, LENGTH(name), LENGTHB(name)

FROM student

WHERE deptno1 = 201;

 

SELECT CONCAT(name, position)

FROM professor

WHERE deptno = 101;

 

SELECT SUBSTR('ABCDE', 2, 3)

FROM dual;

 

SELECT SUBSTR('ABCDE', -2, 3)

FROM dual;

 

SELECT name, SUBSTR(jumin, 1, 6) "생년월일"

FROM student

WHERE deptno1 = 101;

 

SELECT name, SUBSTR(jumin, 1, 6) "생년월일"

FROM student

WHERE SUBSTR(jumin, 3, 2) = '08';

 

SELECT SUBSTR(name, 1, 2)

FROM student

WHERE deptno1 = 101;

 

SELECT SUBSTRB(name, 1, 2)

FROM student

WHERE deptno1 = 101;

 

SELECT INSTR('A*B*C*', '*', 1, 2)

FROM dual;

 

SELECT name, tel, SUBSTR( tel, 1,INSTR(TEL, ')', 1, 1) - 1 ) AS 지역번호

FROM student

WHERE deptno1 = 101;

 

SELECT id, LPAD(id, 10, '$') "LPAD"

FROM student

WHERE deptno1 = 101;

 

SELECT LPAD(dname, 10, '1234') "LPAD 연습"

FROM dept2;

 

SELECT RPAD(dname, 10, SUBSTR('1234567890 ', LENGTHB(dname)+1, 10)) "LPAD 연습"

FROM dept2;

 

SELECT LTRIM(dname, '영')

FROM dept2;

 

SELECT REPLACE(name, substr(name, 1, 1), '#')

FROM student

WHERE deptno1 = 101;

 

SELECT REPLACE(name, substr(name, 2, 1), '#')

FROM student

WHERE deptno1 = 101;

 

SELECT REPLACE(jumin, substr(jumin, 7, 7), '*******')

FROM student

WHERE deptno1 = 101;

 

SELECT name, tel, REPLACE(tel, substr(tel, INSTR(TEL, ')', 1, 1)+1, 3), '###') AS REPLACE

FROM student

WHERE deptno1 = 102;

 

SELECT TRUNC(12.345) TRUNC1, TRUNC(12.345, 2) TRUNC2, TRUNC(12.345, -1) TRUNC3

FROM dual;

 

SELECT MOD(12, 10) "Mod", CEIL(12.345) "Ceil", FLOOR(12.345) "Flor"

FROM dual;

 

SELECT POWER(3, 2)

FROM dual;

 

SELECT SYSDATE

FROM dual;

 

SELECT MONTHS_BETWEEN('2012-03-01', '2012-01-01')

FROM dual;

 

SELECT name, SYSDATE, hiredate,

        ROUND(MONTHS_BETWEEN(SYSDATE, hiredate), 2) Date_1,

        ROUND(((SYSDATE - hiredate) / 31), 2) Date_2

FROM professor

WHERE deptno = 101;

 

SELECT SYSDATE, ADD_MONTHS(SYSDATE, 3)

FROM dual;

 

SELECT SYSDATE, NEXT_DAY(SYSDATE, '월요일')

FROM dual;

 

SELECT SYSDATE, ROUND(SYSDATE), TRUNC(SYSDATE)

FROM dual;

 

SELECT 1 + '1' FROM dual;

 

SELECT TO_CHAR(SYSDATE, 'YYYY') "YYYY",

        TO_CHAR(SYSDATE, 'RRRR') "RRRR",

        TO_CHAR(SYSDATE, 'YY') "YY",

        TO_CHAR(SYSDATE, 'YEAR') "YEAR"

FROM dual;

 

SELECT TO_CHAR(SYSDATE, 'MM') "MM",

        TO_CHAR(SYSDATE, 'MON') "MON",

        TO_CHAR(SYSDATE, 'MONTH') "MONTH"

FROM dual;

 

SELECT name, TO_CHAR((pay * 12) + bonus, '99,999') "연봉"

FROM professor

WHERE deptno = 101;

 

SELECT TO_NUMBER('1')

FROM dual;

 

SELECT name, TO_DATE(hiredate, 'YYYY-MM-DD') "입사일", TO_CHAR((pay * 12), '99,999') "연봉", To_CHAR((pay*12)*1.1, '99,999') "인상후"

FROM professor

WHERE TO_CHAR(hiredate, 'YYYY') < 1990;

 

SELECT name, pay, bonus, (pay * 12 + NVL(bonus, 0 )) "연봉"

FROM professor

WHERE deptno = 101;

 

SELECT name, deptno, DECODE(deptno, 101, '컴퓨터공학과') "학과명"

FROM professor;

 

SELECT name, deptno, DECODE(deptno, 101, '컴퓨터공학과', '기타학과') "학과명"

FROM professor;

 

SELECT name, deptno, DECODE(deptno, 101, '컴퓨터공학과',

                                    102, '멀티미디어공학과',

                                    103, '소프트웨어공학과',

                                         '기타학과') "학과명"

FROM professor;

 

SELECT name, jumin, DECODE(substr(jumin, 7, 1), 1, '남자', '여자')

FROM student

WHERE deptno1 = 101;

 

SELECT name, tel, CASE(substr(tel, 1, INSTR(tel, ')') -1)) WHEN '02' THEN '서울'

                                                           WHEN '031' THEN '경기'

                                                           WHEN '031' THEN '부산'

                                                           WHEN '031' THEN '울산'

                                                           WHEN '031' THEN '경남'

                                                           ELSE '기타'

                                                           END "지역명"

FROM student;       

 

SELECT deptno, position, AVG(NVL(pay, 0)) "평균급여"

FROM professor

GROUP BY deptno, position;

 

SELECT deptno, position, AVG(NVL(pay, 0)) "평균급여"

FROM professor

GROUP BY deptno, position

ORDER BY deptno;

 

SELECT deptno, AVG(NVL(pay, 0))

FROM professor

GROUP BY deptno

HAVING AVG(pay) > 450;

 

SELECT deptno, position, COUNT(*), SUM(pay)

FROM professor

GROUP BY ROLLUP(deptno, position);

 

SELECT *

FROM (SELECT week "주", day, num_day

      FROM cal)

PIVOT (MAX(num_day)

       FOR day IN('일' as "일",

                  '월' as "월",

                  '화' as "화",

                  '수' as "수",

                  '목' as "목",

                  '금' as "금",

                  '토' as "토")

      )

ORDER BY "주";

 

SELECT MAX(DECODE(day, '일', num_day)) AS SUN,

       MAX(DECODE(day, '월', num_day)) AS MON,

       MAX(DECODE(day, '화', num_day)) AS TUE,

       MAX(DECODE(day, '수', num_day)) AS WED,

       MAX(DECODE(day, '목', num_day)) AS THU,

       MAX(DECODE(day, '금', num_day)) AS FRI,

       MAX(DECODE(day, '토', num_day)) AS SAT

FROM cal

GROUP BY week

ORDER BY week;

 

SELECT *

FROM (SELECT deptno, job, empno, sal

      FROM emp)

PIVOT

( COUNT(empno)

  FOR job IN('CLERK' as "CLERK",

             'MANAGER' as "MANAGER",

             'PRESIDENT' as "PRESIDENT",

             'ANALYST' as "ANALYST",

             'SALESMAN' as "SALESMAN")

)

ORDER BY deptno;

 

SELECT *

FROM (SELECT deptno, job, empno, sal

      FROM emp)

PIVOT ( COUNT(empno) AS CNT,

        SUM(NVL(sal,0)) AS S_SAL FOR job IN('CLERK' as "C",

                                            'MANAGER' as "M",

                                            'PRESIDENT' as "P",

                                            'ANALYST' as "A",

                                            'SALESMAN' as "S")

      )

ORDER BY deptno;

 

CREATE TABLE t_unpivot AS

(SELECT * FROM (SELECT deptno, job, empno

                FROM emp)

PIVOT

(  COUNT (empno)

    FOR job IN('CLERK' as "CLERK",

             'MANAGER' as "MANAGER",

             'PRESIDENT' as "PRESIDENT",

             'ANALYST' as "ANALYST",

             'SALESMAN' as "SALESMAN")

)

);

 

SELECT * FROM t_unpivot;

 

SELECT * 

FROM t_unpivot

UNPIVOT(

empno FOR job IN(CLERK, MANAGER, PRESIDENT, ANALYST, SALESMAN)

);

 

SELECT MAX(pay + NVL(bonus, 0)) "MAX", MIN(pay + NVL(bonus, 0)) "MIN", AVG(pay + NVL(bonus, 0)) "AVG"

FROM professor;

 

SELECT * FROM student;

 

SELECT COUNT(*)"합계",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'01',0)) "1월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'02',0)) "2월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'03',0)) "3월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'04',0)) "4월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'05',0)) "5월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'06',0)) "6월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'07',0)) "7월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'08',0)) "8월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'09',0)) "9월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'10',0)) "10월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'11',0)) "11월",

       COUNT(DECODE(TO_CHAR(birthday, 'MM'),'12',0)) "12월"

FROM student;

 

SELECT substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) from student;

 

SELECT  COUNT(*)"합계",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'02',0)) "서울",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'031',0)) "경기",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'051',0)) "부산",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'052',0)) "울산",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'053',0)) "대구",

        COUNT(DECODE( substr(tel, 1, INSTR(TEL, ')', 1, 1)-1 ) ,'055',0)) "경남"

FROM student;

 

insert into emp (empno , deptno , ename , sal)

values (1000,10,'홍길동',3600) ;

 

insert into emp (empno , deptno , ename , sal)

values (2000,30,'일지매',3000);

 

commit;

 

SELECT * FROM (SELECT deptno, job, empno, sal

                FROM emp)

PIVOT

(

    COUNT(empno) as CNT,

    SUM(NVL(sal,0)) as S_SAL FOR job IN('CLERK' as "CLERK",

             'MANAGER' as "MANAGER",

             'PRESIDENT' as "PRESIDENT",

             'ANALYST' as "ANALYST",

             'SALESMAN' as "SALESMAN")

             )

ORDER BY deptno;      

 

SELECT deptno,

SUM(DECODE(job, 'CLERK', sal, 0)) "CLERK",

SUM(DECODE(job, 'MANAGER', sal, 0)) "MANAGER",

SUM(DECODE(job, 'PRESIDENT', sal, 0)) "PRESIDENT",

SUM(DECODE(job, 'ANALYST', sal, 0)) "ANALYST",

SUM(DECODE(job, 'SALESMAN', sal, 0)) "SALESMAN",

SUM(NVL2(job, sal, 0)) "합계"

FROM emp

GROUP BY ROLLUP(deptno);

 

SELECT profno, name, pay,

       RANK() OVER (ORDER BY pay) AS RANK,

       RANK() OVER (ORDER BY pay DESC) AS RANK_DESC

FROM professor;

 

SELECT profno, name, pay,

       RANK() OVER (ORDER BY pay) AS RANK,

       RANK() OVER (ORDER BY pay DESC) AS RANK_DESC

FROM professor;

 

SELECT s.name "학생이름", s.deptno1 "학과번호", d.dname "학과이름"

FROM student s, department d

WHERE s.deptno1 = d.deptno;

 

SELECT * from student;

 

SELECT s.name "학생이름", p.profno "교수번호", p.name "교수이름"

FROM student s, professor p

WHERE s.profno = p.profno;

 

SELECT s.name "학생이름", d.dname "학과이름", p.name "교수이름"

FROM student s, professor p, department d

WHERE s.deptno1 = d.deptno

AND s.profno = p.profno;

 

SELECT * FROM gift;

 

SELECT go.gname "고객명", go.point "POINT", gi.gname "상품명"

FROM gogak go, gift gi

WHERE go.point BETWEEN gi.g_start AND gi.g_end;

 

SELECT ename, sal

FROM emp

WHERE sal >(SELECT sal

            FROM emp

            WHERE ename = 'SCOTT');

 

SELECT s.name "학생이름", d.dname

FROM student s, department d

WHERE s.deptno1 = d.deptno

AND s.deptno1 = (SELECT deptno1

                FROM student

                WHERE name = '이윤나');

 

SELECT p.name "교수명", p.hiredate "입사일", d.dname "학과명"

FROM professor p, department d

WHERE p.deptno = d.deptno

AND p.hiredate > (SELECT hiredate

                  FROM professor

                  WHERE name = '송도권');

 

SELECT name "이름", position "직급", TO_CHAR(pay, '999,999,999')|| ' 원' "연봉"

FROM emp2

WHERE pay > ANY (SELECT pay

                 FROM emp2

                 WHERE position = '과장');

                 

                 

SELECT name "이름", position "직급", TO_CHAR(pay, '999,999,999')|| ' 원' "연봉"

FROM emp2

WHERE pay < ANY (SELECT pay

                 FROM emp2

                 WHERE position = '과장');

 

SELECT name "이름", grade "학년", weight "몸무게"

FROM student

WHERE weight < ALL(SELECT weight

                   FROM student

                   WHERE grade = '4');

 

SELECT grade "학년", name "이름", height "키"

FROM student

WHERE (grade, height) IN (SELECT grade, MAX(height)

                 FROM student

                 GROUP BY grade)

ORDER BY 1;

 

SELECT p.PROFNO "교수번호", p.name "교수명", p.hiredate "입사일", d.dname "학과명"

FROM professor p, department d

WHERE p.deptno = d.deptno

AND (p.deptno, p.hiredate) IN (SELECT deptno, MIN(hiredate)

                                FROM professor

                                GROUP BY deptno)

ORDER BY 4;

 

SELECT name "사원이름", position "직급", pay "급여"

FROM emp2 a

WHERE pay >= (SELECT AVG(pay)

              FROM emp2 b

              WHERE a.position = b.position);

              

INSERT INTO dept2(dcode, dname, pdept)

VALUES(9002, '특판3팀', '영업부');

 

INSERT INTO professor(profno, name, id, position, pay, hiredate)

VALUES (5001, '김설희', 'Love_me', '정교수', 510, '2011-11-14');

 

CREATE TABLE professor2

AS SELECT * FROM professor;

 

INSERT INTO professor2

SELECT * FROM professor;

 

INSERT ALL

INTO p_01(no, name)

VALUES(1, 'AAA')

INTO p_02(no, name)

VALUES(2, 'BBB')

SELECT * FROM dual;

 

INSERT ALL

WHEN profno BETWEEN 1000 AND 1999 THEN

INTO p_01 VALUES(profno, name)

WHEN profno BETWEEN 2000 AND 2999 THEN

INTO p_02 VALUES(profno, name)

SELECT profno, name

FROM professor;

 

SELECT COUNT(*) FROM p_01;

 

CREATE TABLE scott.test01(

no NUMBER, name VARCHAR2(20), addr VARCHAR2(20));

 

BEGIN

FOR i IN 1..500000 LOOP

INSERT INTO scott.test01

VALUES(i, DBMS_RANDOM.STRING('A', 19), 

          DBMS_RANDOM.STRING('Q', 19));

END LOOP;

COMMIT;

END;

/

 

SELECT COUNT(*) FROM SCOTT.TEST01;

 

ANALYZE TABLE scott.test01 COMPUTE STATISTICS;

 

Select * FROM pt_01;

 

Select * FROM pt_02;

 

Select * FROM P_total;

 

MERGE INTO p_total total

USING pt_01 p01

ON (total.판매번호 = p01.판매번호)

WHEN MATCHED THEN

UPDATE SET total.제품번호 = p01.제품번호

WHEN NOT MATCHED THEN

INSERT VALUES(p01.판매번호, p01.제품번호, p01.수량, p01.금액);

 

MERGE INTO p_total total

USING pt_02 p02

ON (total.판매번호 = p02.판매번호)

WHEN MATCHED THEN

UPDATE SET total.제품번호 = p02.제품번호

WHEN NOT MATCHED THEN

INSERT VALUES(p02.판매번호, p02.제품번호, p02.수량, p02.금액);

 

SELECT * FROM p_total;

 

CREATE TABLE dept5

AS  SELECT *

    FROM dept2

    WHERE 1 = 2;

 

SELECT * FROM dept5;

 

CREATE TABLE vt001

( no1 number,

  no2 number,

  no3 number GENERATED ALWAYS AS (no1 + no2) VIRTUAL);

 

SELECT * FROM vt001;

test.sql
0.04MB

+ Recent posts