어제에 이어서  DNS서버 구축을 마무리 해보겠다.

도메인 설정

 설정 도메인 : 100.A.localdomain.com  (내가 해야할 DNS  서버 이름)

 

 

(vi 편집기를 이용해 복사한 zone 파일을 연다.)

 

 

복사된 샘플 zone 파일이다.

 

(복사된 샘플 zone 파일)

 

 

레코드(항목)
  - SOA ( Start Of Authority ) 도메인에대한 권한을 가지고 있는 것
  - NS ( Name Server ) : Name 서버에 대한 주소
  - A  (Address) : 주소.

 - IN   ( Internet 클래스 )
 TTL : 조회해간 IP주소를 얼마동안 참조할 것인가. 1D 는 하루동안 참조한다는 뜻이다.
 @ : 대체문자  나의 경우 100.A.localdomain.com 파일이름을 대신 적어주는 것이다.
      도메인 이름으로 주소를 적는다면 100.A.localdomain.com.  이렇게 마지막에 점을 찍어줘야한다.
      도메인 이름이 끝난다는 표시이다. 반드시 찍어줘야한다.
 
 serial : 도메인 네임에 대한 식별자. 보통은 날짜를 적어주는 것이 일반적이다. 
 refresh : TTL과 같다.
 expire : 파기시간
 minumum : 최소시간

 

 

 

(설정)

 

 

나는 이렇게 설정하였다.
DNS 서버 이름은 100.A.localdomain.com 이고
내가 가지고 있을 win 호스트의 주소를 적어주었다.

 

 

(파일 권한 보기)

 

 

DNS  서버를 실행시키기 전에 파일 권한을 확인해보았다.

읽기 권한이 없으면 zone파일에서 읽어서 주소를 알려줘야하는데
못알려주기 때문이다.
위 화면처럼 확인해보니 root 권한만 존재했다.

파일의 권한 설정을 해주었다.

 

 

(파일 권한 설정)

 

 

권한부여까지 끝났으면
DNS 서버를 실행시켜준다.

 

 

 

(DNS 서버 실행)

 

 

 

실행 화면을 확인해보겠다.

현재. 내 DNS 주소와 win 호스트 하나의 주소밖에 입력되지 않았다.

 

 

 

(nslookup 으로 확인해보는 화면)

 

 

 

확인해본결과 도메인 네임에 대한 주소를 잘 알려주고 있다.

 

 

(호스트 추가한 모습)

 

 

 

나 이외에 다른 호스트들도 추가한 모습이다.

 

 

 

(다른 도메인 네임의 영역까지 주소가 잘 전달되는 모습)

 

 

 

나는 A 도메인 안의 100이라는 DNS 서버를 만들었고
전체적으로 localdomain이라는 DNS 서버로 묶여져있었다.

마지막까지 잘 동작하는 것을 확인한 모습이다.

오늘은 DNS에 관해 알아볼 것이다.

* DNS ( Domain Name System )
 - 문자 주소 사용을 가능하게 해주는 서비스이다.
 Domain Name (문자주소)란?
 ex) www.naver.com 이런 형태의 주소이다.

이 주소로는 통신을 할 수 없다. 실제로 통신하는 것은 IP주소로 통신하기 때문이다.
우리가 편하게 쓰려면 우리가 알아보기 쉬운 문자주소를 IP주소로 바꾸어주는
서비스가 필요하다. 바로 이 서비스가 DNS 이다.


도메인이란 영역을 묵어주는 것이다.

국가 Domain ( .kr  ,  .jp   ,   .de   ,   .be  ...  )
국제 Domain  (  .com   ,   .net   ,   .org   ,  ... ) -> 나라와 상관없이
교육 Domain ( .edu ... )
미국 Domain  ( .gov  )

Root DNS  -> 최상위 DNS 서버 총 세계에 약 7~8대 정도 모든 도메인을 관리한다.

Domain 이름에 대한 정보를 가지고 있는 서버 DNS 서버

- 트리구조의 계층 구조다.

DNS 역할
-> 이름 주소를 주면 IP 주소를 알려준다.
ex) www.naver.com 주소를 물어볼때의 동작
1. Root DNS 에 먼저 물어본다.  ( .com ) 의 DNS서버 주소를 물어본다.
2. .com  DNS에 .naver 의 DNS 서버 주소를 물어본다.
3. .naver DNS에 www의 주소를 물어본다.
-> 역질의구조  (위에서부터 물어보면서 내려온다.)
(지금은 이렇게 동작하지 않는다.)
-> 이렇게 하면 시간이 너무 오래걸린다.


그렇기 때문에!
DNS 캐시 서버를 둔다.

* DNS cache Server
(우리는 이 캐시서버를 사용하고 있는 것이다.)
클라이언트는 제일 먼저 캐시서버에게 Domain Name 주소를 물어본다.
캐싱 : 적어둔다. 적어둔 내용을 일정 시간동안 보관한다.
다른사람이 같은 주소를 물어보면 보관된 내용을 돌려준다.
역질의는 캐시서버가 따로한다.
우리는 캐시서버와만 통신을 해서 주소를 받아온다.
ex) DNS 캐시서버
163.126.63.1
8.8.8.8


이제 우리가 직접 DNS 서버를 구축해볼 것이다.

리눅스에서 DNS 서버를 구축하기위해
bind를 설치해서 이용할 것이다.


(설치 완료모습)



bind를 설치하였다.

먼저 DNS 캐시서버를 만들어보겠다.

이 과정은 간단하다.
설정만하고 실행시켜주면 되기 때문이다.

설정해야하는 파일은
/etc/named.conf 파일이다.
vi 편집기를 이용해 /etc/named.conf파일을 열어준다.




(/etc/named.conf 수정)




(/etc/named.conf 수정)



빨간색 표시 부분을 any로 고친다. 저 부분은 모든 호스트들에게 DNS를 해주겠다는 것이다.
접근 리스트이다.

그리고 DNS서버를 실행시켜준다.




(DNS 서버 실행)



netstat로 확인해보니
tcp, udp 모두 53번 포트가 열려있는 것을 확인 할 수 있다.

이유는
DNS는 53번 포트를 사용하기 때문이다.

그렇다면 이제 캐시서버 설정은 끝이다.
과연 잘 돌아갈지 직접 DNS 서버를 내가 만든 서버로 지정해보았다.



(DNS 서버 지정)





(인터넷 화면)



인터넷이 잘 되는 모습이다.
내가 만든 DNS 캐시 서버가 잘 동작하고 있음을 알 수 있다.

DNS가 잘 동작하는지 직접 인터넷으로 확인해보는 방법도 있지만
다른 도구도 있다.
nslookup 이다.

윈도우의 cmd 창에서 nslookup을 사용하여 보았다.



(nslookup 사용 화면)



nslookup은 리눅스에서도 마찬가지로 똑같이 사용할 수 있다.




(리눅스 nslookup)



캐시 서버가 잘 동작하는 것을 nslookup을 이용해서까지 확인했다.

이제 실제로 DNS 서버를 구축해보겠다.
실제 Domain Name을 사는 것은 돈이 드니
간단하게 사설망에서 임의로 만들어보겠다.

먼저 DNS 서버를 안정적으로 돌리기 위해 IP 주소를 정적으로 바꾸어주었다.



(IP 설정)



그 후 /etc/named.rfc1912.zones 파일을 수정해주어야한다.

만들어볼 DNS 서버는
최상위 DNS -> " localdomain.com "가 있고 그 아래로 A, B, C, D 가있다.
또 그 아래로 다른 DNS 서버들이 있는 형태이다.
A - 100
   -  88
   - 12

나는 A 도메인에 속해있는 100번의 DNS 서버를 구축해 볼것이다.
정리하면
100.A.localdomain.com 의 주소를 가지는 DNS 서버를 만들 것이다.

먼저 vi 편집기를 이용해 /etc/named.rfc1912.zones를 추가해줘야한다.




(/etc/named.rfc1912.zones 화면)




(/etc/named.rfc1912.zones 화면)



여기 아래에 우리가 설정한 DNS 이름을 추가할 것이다.




(/etc/named.rfc1912.zones 추가 모습)



내가 관리하려는 100 DNS 아래 win 의 주소는 여기에 적지 않고 다른 곳에 적어주어야한다.
여기는
내가 만드려는 DNS 서버의 이름을 적어주는 것이다.

자 설정이 잘 적용됬는지 확인해 본다.
명령어 named-checkconf 를 이용해서 파일이 오류가 없는지 체크해본다.




(체크 화면)



아무것도 뜨지 않으면 오류가 없는 것이다.

우리가 관리할 win의 주소를 설정해 보겠다.

아래의 화면처럼 이동해준다.



(이동)



위 화면을 보면 우리가 적어야할 설정 파일이 보인다.
우리는 저 파일의 형식으로 써야하므로
저 파일을 복사해서 사용하겠다.



(우리가 수정해야할 복사본 파일)



복사 까지 했다면
이제 우리가 관리할 DNS 서버의 정보들을 적어주면 된다.
내일 이어서 DNS 서버를 만들어 보겠다.
:)



DHCP 서버를 설치까지 했다.

이제 DHCP 서버를 이용해 서비스를 제공해보겠다. :)

우선 DHCP의 동작을 살펴보겠다.

DHCP는 어떻게 동작

1. 클라이언트는 과연 언제 임대 요청을 하게될까?
 1) 컴퓨터를 처음 켰을 때
 2) 임대시간이 만료가 되었을 때
 3) 최대 임대시간이 만료가 되었을 때

2. DHCP Message 종류
 1) DHCP Discover
 2) DHCP offer
 3) DHCP Request
 4) DHCP ACK

각 타입의 내용
1) DHCP Discover
 - 아이피를 할당받지 못했기 때문에 통신이 안되는 상황이고 서버가 누군지도 모르기 때문에
 -> Broadcast로 뿌린다.
 - MAC 주소로 통신을 한다.
 - Bootstrap Protocol 이라고 적혀있다. 이것은 지금 현재 DHCP이다.
2) Offer
 - 디스커버의 응답이다.
 - 서버가 호스트에게 디스커버의 응답으로 전달한다.
3) Requset
 -같은 네트워크 상에서 내가 이 아이피를 쓰겠다고 브로드 캐스트 하는 것이다.

상황
 1) 클라이언트가 서버로 아이피 배당해달라고한다. (디스커버)
 2) 서버는 응답한다. (Offer)
 3) 클라이언트는 이제 그 아이피를 쓴다고 주변에 브로드 캐스트한다.(Request)
 -> 이 과정이 없으면 아이피가 충돌난다. 다른 DHCP 서버는 모르기 때문에
 4) 마지막으로 서버가 클라이언트에게 ACK 패킷을 보내면서 아이피 배당이 끝난다.

우리는 이제 Offer 패킷을 보낼 때의 내용을 채워줘야한다.
Offer 패킷을 보낼 때 배당할 아이피 범위, 라우터 정보, DNS 정보 등을 설정해주어야한다.

설치된 dhcp 폴더를 들어가보니
dhcp.conf 의 샘플 파일이 있었다.
이 샘플 파일을 먼저 복사한다.




(복사하는 장면)



복사된 conf 파일을 vi 편집기로 연다.




(vi 편집기)



샘플 파일이다.
우리는 이것을 수정해서 사용할 것이다.




(DHCP conf 설정 부분)



이 부분을 수정해 줄것이다.



(수정된 모습)



우리의 네트워크 환경에 맞추어 설정해주었다.




(DHCP 서버 실행)



이제 저장하고
DHCP 서버를 실행시켰다.

그 후 leases 폴더를 들어가 지금 임대하고 있는 아이피 목록을 볼 수 있었다.



(아이피 배당한 목록)



DHCP 서버가 잘 돌아가고 있음을 알 수 있다.

그러면 호스트에서 이번에 Wireshark로 DHCP 패킷을 분석해 보겠다.




(캡쳐 필터링)



패킷 캡쳐 시작 전에
필터링룰을 설정하여 패킷을 받아주었다.



(DHCP 패킷)



DHCP 동작의 4개 패킷이 캡쳐된 모습이다.




(Discover 패킷)



디스커버 패킷으로
아직 IP주소가 없으므로 0.0.0.0 으로 나오는 것을 확인 할 수 있고
요청 IP주소도 볼 수 있다.



(Offer 패킷)



Offer 패킷의 내용을 살펴보면
우리가 위에서 설정해준 내용이 그대로 들어가 있음을 확인 할 수 있다.

이러한 DHCP의 취약점이 어떤게 있을까?

-> 만약 악의적인 목적으로 DHCP 서버를 운영한다면???
DHCP서버는 같은 네트워크에 여러개가 동작할 수 있다.
즉, 누구나 원하면 DHCP 서버를 구축하여 동작시킬 수 있다는 것이다.

그렇게 되면 DHCP 설정에서 잘못된 게이트웨이 주소를 알려주거나
잘못된 DNS 주소(해커가 구축한 DNS, 해킹한 DNS등등) 을 알려주게되면
큰 위험에 빠질 수 있다.

반대의 입장이 되보면
공격자 입장에서는 DHCP 서버하나만 구축해놓고 손쉽게
스니핑, 스푸핑(DNS, DHCP..) 를 할 수 있게 되는 것이다.

아래는 공격받은 모습이다.



(공격 받은 모습)



IP 151번에게 IP주소를 배당 받았다. 동시에 게이트웨이 주소를 보면
192.168.3.151로 되어있다.
즉 나는 인터넷을 할 때 공격자에게 패킷을 보내게 되는 것이다.

만약 공격자가 포워딩을 안해준다면,



(인터넷 멈충)



인터넷이 동작하지 않는것을 확인 할 수 있다.(통신이 안된다.)

만약 공격자가 포워딩도 해주면
나는 인터넷도 되고 아무것도 모른채 패킷을 스니핑 당할 수 있다.

리눅스에서 포워딩 하는 방법은 간단하다.



(포워딩 설정)



sysctl net.ipv4.ip_forward 를
1로 바꾸어주면 자동으로 포워딩 까지 해주게 된다.



오늘은 와이어샤크에 대해서 알아보겠다.

아래는 와이어샤크 첫 화면이다.

여기서 인터페이스를 선택할 수 있다.
선택 후 그 인터페이스로 들어오는 패킷을 보여준다.




(와이어샤크 첫 화면)



와이어 샤크 파일을 저장해서
원하는 곳에서 열어서 분석을 할 수 있다. -> 수집된 위치에서만 분석할 수 있는 것이 아니다.



(저장화면)




(저장 파일)



이 파일을 열면 와이어샤크에서 받은 패킷들의 내용을 그대로 볼 수 있다.
pcapng 확장자로 설정되어있다.

레이아웃을 보기 편하게 바꾸어 볼 것이다.

편집에 들어가서




(편집 선택)



Preferences 에 들어가면 아래와 같은 화면이 나온다.

Layout 선택 하는 화면이다.



(Layout 설정)



난 2번째것으로 설정해주었다.

* 와이어 샤크가 제공하는 필터링 기능
1. 캡쳐 필터
 - 패킷을 캡쳐할 때 적용되는 룰
 - 복잡한 룰을 적용할 수 없다. (적용하지 않는게 좋다.)
 -> 캡쳐할 때 부하가 걸린다.
 - 캡쳐필터할 때는 단순한 룰을 적용시킨다.
 -> 수집 단계에서 필터링이 적용된다.
 - 캡쳐 필터는 신중하게 작성할 필요가 있다.
 - 아이에 수집이 안되기 때문에 최소한으로 적용시키는 것이 좋다.

2. 디스플레이 필터
 - 패킷을 캡쳐한 이후에 적용하는 룰
 - 성능과 관계없이 룰을 적용
 - 아주 복잡한 룰도 적용이 가능하다.

먼저 패킷 필터부터 살펴보겠다.
패킷필터는 캡쳐 위에 옵션에 들어가서 설정해줄 수 있다.




(패킷 필터 화면)



빨간색 부분에 필터링 룰을 입력하면 된다.

혹은 룰을 세팅해두어서 나중에 필요할 때 써도 된다.




(필터링 룰 설정)



아래는 캡쳐 필터를 직접 입력해주는 모습이다.



(필터링 룰 직접 입력)



디스플레이 필터는
캡쳐가 이미 된 후에 화면에서 필터링하는 것이다.

화면에서 아래에 표시된 부분에 디스플레이  필터링 룰을 입력하는 곳이다.



(IP 주소 필터)



IP 주소로 필터링을 하는 모습이다.

이 외에 다양한 필터링 룰이 있는데
화면 오른쪽에 Expression 버튼을 누르면
다양한 필터링 룰이 나온다.
아래는 필터링 룰 화면이다.


(필터링 룰 화면)




처음에는 여기서
찾아가면서 입력하면 된다.


이제 와이어샤크의 간단한 입문을 마무리하고 응용프로토콜을 살펴보겠다.

1. UDP 통신을 하는 응용 프로토콜
 - DHCP ( Dynamic Host Configuration Protocol )
 - DNS ( Domain Name System )
 - TFTP

2. TCP 통신을 하는 응용 프로토콜
 - FTP (File Transfer Protocol)
 - HTTP ( HyperText Transfer Protocol ) : WEB
 - SMTP ( Simple Mail Transfer Protocol ) : mail전송 프로토콜

응용프로토콜의 종류는 위와 같다.

제일 먼저 살펴볼 것은 DHCP 이다.

* DHCP ( Dynamic Host Configuration Protocol )
 - 동적으로 자동으로 IP 할당을 하게 해주는 것.
 - 네트워크를 알지 못해도 통신이 가능하다.
 
 - 가상머신(리눅스)을 통해서 DHCP 서버를 구축해볼 것이다.
 - 서버를 구축한다 -> 서비스를 제공하겠다.

* 리눅스 운영체제가 서비스를 제공하지 않는다.
-> 어떤 운영체제만으로 특정 서비스를 제공할 수 없다.
* 서버를 구축 -> 서비스를 제공한다. -> 서비스를 제공할 수 있는 응용프로그램(데몬)을 설치 후 실행한다.
( 운영체제가 서비스를 제공하는 것이 아니라 운영체제 위의 프로그램이 서비스를 제공하는 것이다.)

리눅스에서 DHCP 설치 하는 과정이다.



(search 해준다.)


먼저 설치할 파일을 찾아준다.
명령어 yum search dhcp



(리스트들이 나온다.)



우리는 여기서 dhcp.x86_64 를 설치해 줄것이다.




(설치 화면)



yum install dhcp.x86_64
를 입력해주어 설치를 한다.



(설치가 완료된 모습)



DHCP가 설치된 모습을 확인 할 수 있다.


어플리케이션 프로토콜에 관해 알아볼 것인데
어플리케이션 프로토콜 중에는
FTP, DHCP, DNS, HTTP ... 등이 있다.

이 프로토콜을 확인해보기 위해 직접 서버를 구축해야하는데
서버 구축까지는 힘드므로
있는 프로그램을 활용하기 위해 리눅스를 다룰것이다.
리눅스에서 서버 프로그램을 돌릴 것이다.

그러기 위해 VM 을 설치하고 VM 상에서 리눅스를 설치해야한다.

아래까지는 VM을 설치 마무리한 상황이고 설정 화면이다.

먼저 VM의 네트워크 인터페이스 타입에는 3가지가 있다.
1. NAT -> 호스트가 라우터 역할로 NAT을 구성하는 것이다. 
2. Host Only -> 호스트끼리만 통신이 되는 것이다.
3.Bridge (L2) -> 호스트 운영체제랑 네트워크 인터페이스를 같이 사용한다.

여기서 우리는 Bridge로 설정할 것이다.




(브릿지 타입으로 설정)



그 후 리눅스를 설치한다.

아래는 설치후 로그인 화면이다.




(로그인 화면)





(ifconifg 화면)



윈도우에서는 ipconifg였지만 리눅스에서는 ifconfig로 IP를 확인 할 수 있다.
확인해보니 루프백 인터페이스만 설정되어있고
다른 인터페이스는 없는 상태였다.

DHCP 서비스가 닫혀있었기 때문이었다.
다음은 DHCP 설정을 하는 과정이다.
/etc/sysconfig/network-scripts/ 로 들어가서 ifcfg-eth0 파일을 수정해주어야한다.




(/etc/sysconfig/network-scripts/ 폴더 내용)



vi 편집기를 이용해 eth0 파일을 연다.

그 후 ONBOOT 옆에 no라고 되있는 것을 yes로 바꾸어준다.




(yes로 바꾸어준 모습)



설정후 reboot 해준다.

다시 켜서 확인해보면
ifconfig에서 eth0 인터페이스가 설정되어있는 것을 확인할 수 있다.




(인터페이스가 설정된 모습)



설정이 된 모습을 확인했고
실제로 잘 통신이 되는지 체크했다.
1. 게이트웨이와의 통신 체크
2. 외부 IP주소와 통신 체크
3. DNS lookup 가능 체크



(통신이 잘 되는 모습)



통신이 잘 되는 것을 확인 할 수 있었다.

마지막으로 리눅스에서 네트워크 실습을 할 것이므로
방화벽을 꺼주어야한다. (우리는 해킹 실습을 할 것 이기 때문에.)

* 리눅스 보안설정 해지
 
 방화벽 : iptables
 SELinux : Security Enhanced Linux -> 현재 리눅스보안의 핵심

먼저 iptables를 삭제해 줄것이고 SELinux를 설정을 바꾸어 줄것이다.



(iptables)



/etc/sysconfig 폴더에 들어가서 iptables를 삭제해준다.




(삭제하는 모습)



명령어는
rm -rf iptables 이다.

또 vi 편집기를 이용해 selinux를 열어서 diabled로 바꾸어준다. (아래처럼)




(설정화면)



그러면 이제 설정은 끝이다. reboot하고 설정을 확인해본다.
getenforce를 입력했을 때 Disabled가 나오고
iptalbes -L 을 입력했을 때 아무것도 안나오면 설정이 완성 된 것이다.



(설정이 잘 된 모습)



리눅스 설정은 여기 까지 끝이다.

이제 어플리케이션 프로토콜을 분석하기위해
와이어샤크 프로그램을 사용할 것이다.

와이어샤크 프로그램 실행 첫 화면이다.



(와이어 샤크 첫 화면)



캡쳐를 누르면 여러 패킷이 담긴다.
지금까지 했던 Packetdump와 같다.



(패킷이 덤프된 모습)



오늘은 와이어샤크를 이용한 간단한 트러블슈팅 방법을 알아볼 것이다.

와이어샤크로 패킷을 덤프 받고 수상한 패킷을 찾아낸다.
그 패킷의 포트 번호를 확인한다. 그 후
cmd 명령창에서 netstat를 이용하는데
-o 를 이용하면 프로세스 ID를 표시할 수 있다.



(netstat 옵션)




(PID 출력 화면)



이 아이디로 찾는 것이다.
Crl + Alt + Del 을 누르면 작업관리자가 나오는데

보기 를 누르고 열선택에 들어가서 설정해줘야한다.



(작업관리자 화면)




(열선택 창화면)



여기서 PID 를 체크해주고 확인을 누른다.



(PID 표시 화면)



그렇게 되면 PID도 화면에 같이 볼 수 있다.

아래 화면에서 보듯 1184번이 궁금했는데 위에 작업관리자 PID 118번의 프로세스를 확인하니
vm웨어라고 적혀있다.
여기서 그 패킷은 vm 웨어의 것이구나 하고 알 수 있다.



(1184번 PID)



이런 방식으로
수상하거나 문제가 되는 패킷의 출처를 찾아낼 수 있고
이로 악성코드 실행 근원지를 찾을 수 있고
트러블슈팅을 할 수 있다.

앞으로 리눅스 서버와 와이어샤크를 이용해
어플리케이션 프로토콜을 확인해보고 취약점을 분석해 볼 것이다.


오늘은
TCP 헤더를 이용한 공격 기법을 확인해 볼것이다.
TCP 공격기법으로는
1) TCP Scanning
2) TCP를 이용한 DDos 공격이 있다.

오늘은 TCP Scanning 기법을 확인 해 볼 것이다.

1) TCP Scanning
 - Flag ( SYN, FIN, RST, ACK, ... )
 - 열려있는 포트와 닫혀있는 포트의 응답이 다르다.
 - 3-way handshake를 이용한다.

- FULL-Scan
 : 3-way handshake과정을 모두 거친다.
 : 세션을 맺어보는 것이다.
 : 맺어지면 열려있는 것이고 연결이 안되면 닫혀있는 것이다.
 : TCP 연결 흔적이 남는다. 연결되었다는 기록이 남는다.



(FULL Scan 코드)





(포트가 열려있을 때 모습)




위 처럼 포트가 열려있으면 아무 반응이 없다.

하지만 포트가 닫혀있으면 연결이 안되므로



(135번 포트 스캔)




(오류 메세지)




연결 할 수 없다고 뜬다.

이 처럼 한번 TCP 연결을 해보면서 포트가 열려있는지 확인하는 것을
TCP 스캔이라고 한다.




(Half Scan 코드)




(포트가 열려있을 경우)




포트가 열려있을 경우 위 처럼 ACK SYN 패킷이 돌아온다.

닫혀있는 경우 RST 패킷이 돌아온다.




(닫혀있는 경우)




포트가 닫혀있는 경우는 위와 같이 RST 패킷이 돌아온다.
즉, 연결이 안된다.

- HALF-Scan( Stealth Scan )
 : 3-way handshake를 이용하지만 완벽하게 연결하지 않는다.
 SYN Scan( 열려있는 포트에 대한 스캐닝 기법 )
 (1) 서버에 동기화 요청 (SYN)
 (2) 서버에서는 SYN-ACK로 응답(Listening이라면)
     서버에서는 RST 패킷을 보낸다. (닫혀있다면)
 (3) ACK로 응답을 하지 않는다.

SYN-ACK 패킷이 오면 우리는 그에 따른 응답을 안해주고 연결을 여기서 끊어준다.
그렇기 때문에 Half Scan이라고 한다.

서버에 로그 흔적이 남지 않는다. (연결이 이루어지지 않았기 때문에)


 (닫혀있는 포트에 대한 스캐닝 기법)
 - FIN SCAN, NULL SCAN, X-MAS SCAN,...
 -> 이녀석들은 반대다.
 -> 닫혀있으면 반응하고, 열려있으면 반응을 안한다.
 => 이것이 표준이지만, 표준과 다른 경우도 많다.
 - X-MAS 는 모든 플래그를 세팅해둔다.


 - SYN-ACK 스캔 ( 호스트 스캔 )  (유용한 스캔) (포트와는 상관없다.)
 : ping보다 성능이 더 좋다. (방화벽에서 막지 못한다.)
 : 포트가 열려있는지 닫혀있는지 관계없이 호스트가 살아있다면 응답이온다.
 : 죽어있다면 응답이 오지 않는다.
 : 방화벽을 다 뚫을 수 있고 살아있는 시스템을 다 체크할 수 있는 좋은 스캔이다.
 : 해당 서버에 기록이 남지 않는다.




(SYN-ACK 스캔 모습)





오늘은 전송계층인 L4의 취약점을 분석해 보겠다.

Layer 4에는 TCP와 UDP가 있다.
오늘은 L4 중에서 UDP의 취약점을 분석해볼 것이다.

* UDP헤더를 이용한 공격 기법
1) 스캐닝
2) UDP Flooding

1. 스캐닝
- 타겟의 정보를 수집하는 방법
- 어떠한 서비스가 열려있는지 ,포트가 열려있는지 확인하는 방법
- 내 컴퓨터에서 netstat 치면 나오는 정보를 알아내는 방법이다.
- 다른 host에서 netstat의 정보를 확인하려는 방법이다.
- 그 중 UDP 스캐닝 기법이 있다. (UDP 통신 방법을 이용해서)
- 해당 포트가 열려있을 때와 닫혀있을 때가 돌아오는 반응이 다르다.
 -> 이걸 이용해서 스캐닝을 하는 방법이다.



(확인하려는 정보)



위의 화면을 확인해보려는 것이다. cmd 창에서 netstat 명령어로 확인 할 수 있다.
하지만 상대 host의 정보는 쉽게 확인할 수 없으므로
스캐닝 이란 작업을 한다.



(UDP 스캔 코드)



위는 윈도우 소켓을 이용해서 UDP 패킷을 만들고 전송하는 코드이다.
여기서 원하는 포트번호 50000번을 지정해서 보냈다.
(옆 자리 사람이 서버를 열어둔 상태이다.)



(아무 응답이 없다.)



-> 이렇게 아무 응답이 없다면 포트가 열려있다는 것이다.
그렇다면 닫혀있다면 어떤 반응일까?



(포트가 닫혀있을 때)



포트가 닫혀있을 때는 위와 같이 ICMP 에러 패킷이 전송된다.
우리는 이로써 포트가 닫혀있는 걸 알 수 있다.

정리하면
포트가 열려있으면 -> 아무 응답 없다.
포트가 닫혀있으면 -> ICMP 에러 패킷이 온다.

- 프로토콜에 따라 다르겠지만, 데이터를 서비스에 맞게 설정한 경우 응답이 올 수 있다.
 -> 포트가 닫혀있는 경우 icmp error 메세지로 응답이 온다.
 - destination unreachable 로 응답이 온다.
 - 확인하고자 하는 host의 방화벽이 켜져있으면 icmp응답이 오지 않는다.
 - 그래서 방화벽을 끄고 실험했다. 여기서 알 수 있는 것은
   방화벽으로 UDP 스캐닝을 막을 수 있다는 것이다.
 - 우리는 패킷 수로 체크를 해서 트래픽 수가 많아지면 정확도가 떨어졌다.
 - 스캔 툴 : nmap (유명한 대표적인 스캐닝 도구)


* 주의. 스캐닝 아무대나 하면 안된다. (엄연한 불법이다.)

2. UDP헤더를 이용한 DDos 공격 기법

- UDP Flooding 기법 : 대량의 UDP 패킷을 발생시키는 공격기법
  -> 공격의 목적이 특정 타겟이 아니라 타겟 네트워크의 대역폭을 대상으로 하는 공격기법이다.
  -> 네트워크 전체를 마비시키는 목적이다.
  -> 포트가 닫혀있으면 에러메세지를 보낸다.
  -> 출발지 ip 주소를 스푸핑한다. (해당 네트워크 안에 있는 IP주소로)
  -> 해당 네트워크 내에서 에러메세지가 돌아다닌다.
  -> 이 양이 대량이면 그 해당 네트워크의 대역폭을 감소시킬 수 있다.
  -> 해결방법은 ICMP 패킷을 안쓰는 것이다. (그렇기 때문에 요즘 ICMP를 안쓴다.)
     ( 아까 확인했듯이 방화벽이 켜져있으면 ICMP 에러메세지를 만들지 안는다.)
  -> 윈도우 소켓으로는 IP 스푸핑이 안된다.
  -> L2까지 보내던 방법으로 보내서 확인 할 수 있다. (sleep()을 주어서 조금 지연시켜야한다.)
     그렇지 않으면 와이어샤크가 뻗어버린다.

확인해 보겠다.




(UDP Flooding 코드)



코드는 위와 같다.

내가 UDP Flooding 공격을 받은 상황은 다음과 같다.
위 코드의 화면은 아니다.





다른 사람이 나의 컴퓨터를 이용해 167번 컴퓨터를 공격하고 있는 모습이다.
공격자는 공격 대상 host의 ip주소로 출발 ip를 스푸핑 해서
나에게 UDP 패킷을 보낸다.
그리고 나는 닫혀있으므로 공격 대상(피해자)에게 대량의 ICMP 패킷을 보내는 것이다.

위 화면은 sleep 을 걸어두어서 확인 할 수 있는 정도의 양이 나왔다.
실제로 sleep을 안걸었을 때 와이어샤크가 동작을 멈추었다.




* 트래픽 분석 툴로 유명한게 WireShark이다.

이제 패킷덤프 코드 작성한것 말고 WireShark를 이용해서 패킷을 확인해보겠다.

(와이어샤크 홈페이지)



와이어샤크는 홈페이지에서 무료로 다운받을 수 있다.
자기 집 OS에 맞추어 설치하면 된다.



(첫 화면)



첫 화면에서 인터페이스를 설정 할 수 있다. 원하는 랜카드를 설정하고
캡쳐 시작을 누르면



(캡쳐 화면)



위와 같이 패킷들을 확인 할 수 있다.

우리가 패킷덤프 프로그램으로 보던 것과 비스하게 나온다.

우리가 저번에 만들었던 ICMP 패킷 만들어 전송하는 코드로
ICMP패킷을 하나 보내서 이 패킷을 확인해 보겠다.




(우리가 보낸 ICMP 패킷)



우리가 보낸 패킷에는 Checksum을 그냥 0으로 지정해서 보냈다.

그러니 응답이 없었다.
위에서 보는 것 처럼
만약 입력값이 잘못되면
패킷 내용에서 와이어샤크에서 노란색으로 표시된다.

IP 헤더는 체크섬을 0으로 하곤했다.
UDP 또한 checksum을 넣을 필요가 없다.
하지만
ICMP는 checksum을 계산해야한다.

* Checksum 구하는 법

(16진수 기준이다.)
1) 두 자리씩 더해준다.
ex) 08 00 + 00 00 + 11 11 + 00 01 + ....
    = 08 00 + 00 00 + 11 11 + 00 01 + ....
    = 19 12 + (41 41 *10)
    = 19 12 + 41 41 0
    = 4 2D 22 

2. 올림수가 발생하면 올림수를 더해준다. 위의 경우에서는
 = 2D 22 + 4
 = 2D 26

3. 그 결과에 1의보수를 해준다.(반전)
 -> 2진수로 바꾸어준다.
 - 2D 26  => 10110100100110
 -> 1의보수 => 01001011011001  => 12D9 가 나온다.16비트가 나와야하는데 14비트다
      앞에 00이 빠져있던것이다. 그렇기 때문에 00이 존재한다.
바로 이게 체크섬 값이다.
실제 체크섬 값 1110110100100110
앞에 11을 빼면 일치하다.  ( 자리수 16개에 맞추어 보수를 취해줘야한다. 그렇게 되면 11이 들어간다.)

수신측에서 체크하는 법
1. 같은방식으로 전부다 더해준다.
 = 08 00 + D2 D9 + 11 11 + 00 01 + (41 41 * 10)
 = EB EB + 41 41 0
 = 4 FF FB
 = (올림수 발생)
 = FF FB + 4
 = FF FF
FF FF 값이 나오면 올바른 값으로 인식한다.

이제 Checksum을 계산하는 법을 알았으니 프로그램 함수로 만들어 볼것이다.




(함수 코드)



위에서 비트연산을 사용했다.

* 만약 2개씩 안맞으면 뒤에 00 을 채워서 2개씩 맞춰서 더해준다.




(두번 pack해준 모습)



(정상적으로 ICMP 패킷이 전송되고 응답을 받은 모습)



IP 헤더를 이용한 공격기법
 - 테스트 가능한 공격기법이 현재는 거의 막혀있는 상태이다.
Dos( Denial Of Service )
 - 서비스 거부 공격
1) ICMP 헤더를 이용한 Dos
 - Ping of Death : 대량의 ICMP Echo Request 패킷을 발생시켜 타켓 시스템에 과부하를 일으키는 방법
 - 그래서 요즘에는 아이에 ICMP를 차단시킨다. (네이버도 그렇다.)
2) ICMP를 이용한 스니핑
 - ICMP redirect를 이용한다.
3) IP 헤더를 이용한 공격 기법
 - TearDrop : fragment offset필드의 값을 조작하는 방법(아주작은 값 혹은 큰값)
  -> 현재 패치가 다 되서 가능하진 않다.
 - Land Attack : 출발지 ip와 도착지 ip를 동일하게 조작하는 방법
  -> 이것 또한 패치가 다 되어있다.
 - Smurf Attack : 출발지 ip를 타켓으로 조작해서 브로드캐스팅한다.

Dos 는 많은 패킷을 보낼 수 있으면 더 효과적이다.
그래서 DDos가 나왔다.
Distribute (분산) Dos -> 엄청난 수의 컴퓨터가 공격하는 것이다.
        -> 공격자가 쉽게 노출될 수 있다.
DRDos -> SMURF Attack 공격과 비슷하다.
       -> DRDos는 잘 알려진 서버들이 공격에 이용된다.
      -> 공격자가 뒤로 숨을 수 있다. (공격자를 찾기 힘들다.)



어제까지 ARP Spoofing공격을 공부했다.

이 ARP Spoofing 공격이 가능한 이유는
인증과정에 대한 부재가 원인이다.

 인증과정을 거치면 속도가 느려진다. 그렇기 때문에 추가하지 못하고있다.
 (V3도 ARP Spoofing을 막아준다.)

막으려면
 arp -a 를 들어가서 ARP 테이블을 들어가보면 유형에 동적이라고 나와있다.
동적 -> 직접입력 안해도 되고 바로바로 인터넷을 쓸수 있다.
정적 -> 안전하다. 하지만 계속 업데이트를 직접 해줘야한다.
명령어
arp -s (옵션)
arp -s  (정적으로 바꿔줄 수 있다.)



(정적으로 바꾼 화면)



탐지 하는 법
1.서로다른 IP에 대해 중복되는 맥주소가 있을 때
2. 대량의 ARP 패킷이 탐지 될 때

Layer 3에 대한 이해
 - 어떻게 IP헤더만을 가지고 다른 네트워크와 통신이 가능한가?
 - 이더넷헤더 + IP 헤더
 
 - ICMP (Internet Control Message Protocol)
 - 네트워크상에 오류를 제어하기 위한 목적
 - 요즘엔 효율성은 별로 없는데 취약점들이 너무많아서
   ping정도만 사용된다.

ICMP - 오류상황 전달, 서버와의 시간 동기화 등
       많은 타입의 ICMP가 있다.


ICMP 공통헤더
 - type(1) : ICMP 패킷의 타입
 - code(1) : ICMP 패킷타입의 세부 정보
 - checksum(2)

ICMP 타입에 따른 헤더

- ping : Echo Request(8번) (ICMP의 한 종류다.)
서버입장에서 ping을 차단시키는 경우도 있다.
(공격으로 이용할 수 있기 때문이다.)

원래 용도는 상대와 통신이 잘되는지 테스트하는 용도다.

우리는 ping 패킷을 만들어볼 것이다.



(ICMP 패킷을 생성한 코드)




(출력해보면 헤더가 잘 만들어졌음을 확인 할 수 있다.)



type : 8번
 identifier(2)
 sequence number(2)    
 payload(?) - 정하기 나름이다. 여기 들어있는 데이터 그대로 응답이 온다.
      - 별 의미는 없다. ping의 크기를 조절하기 위한 것이다.



(ping 메세지 테스트를 위해 수정한 코드)





(ping을 보내고 응답을 받은 것을 확인할 수 있다.)




(cmd 창에서 ping 메세지를 사용해서 확인한 결과)



- 응답이 오는것을 확인 할 수 있다.

* IP Spoofing (L3에서 할 수 있는 공격)
 - IP값을 변조
 - 0ffset, IP 주소 등등

다음 주 부터는 IP에 관한 내용을 살펴보고
L4부터 취약점을 파악해보겠다.




어제 만들던 코드는 완성됬다.
(내가 만든건아니지만 결국)

어제 만들던 원리 그대로 이어 붙였다.



(패킷 필터 결과화면)




위 화면은 python sniffer.py -p arp -s 192.168.3.18 -d 192.168.167 로 실행시킨 것이다.

옵션에 맞게 정상적으로 출력되는 것을 확인 할 수 있다.

이제 스니퍼 프로그램을 만드는데 있어서
패킷덤프 프로그램도 우리가 보기 편하게 만들었고,
ARP spoofing 할 수 있는 프로그램도 만들었다.

상대방의 패킷을 보려면, 스니핑을 하려면 지금까지 만든거로는 조금 부족하다.
왜냐하면
상대가 스니핑 당하는 것을 알아차리기 때문이다.

우리가 포워딩을 안해주기 때문에 상대 호스트는 나에게 패킷을 전송하고 있다.
그리고 그 결과를 못받고 있는 상황이다.
그러기 때문에 통신이 끊기게 되고 피해자는 알아차리게 된다.
더군다나 통신이 안되기 때문에 스니핑 할 수 있는 자료도 RST 패킷 , SYN 패킷등 이런거 밖에 볼수 없다.



(SYN, RST 패킷밖에 안보인다.)



 위 결과 화면은 상대 호스트 ARP 테이블에서 게이트웨이를 스푸핑한 상태이다.
상대 호스트는 게이트웨이가 내 컴퓨터의 주소인 줄 알고 나에게 보내는 상황이다.

하지만 그에 대한 응답이 안오고 있다. ( 이유는 내가 지금 포워딩을 안해주고 있기 때문에 )


이렇듯, 포워딩을 해줘야 완벽한 스니핑을 할 수 있게 된다.

포워딩이란 상대 호스트의 패킷이 원래 가던 길로 내가 다시 보내줘야된다는 뜻이다.
정확한 뜻은 패킷이 목적지 까지 도착하도록 올바른 길로 보내는 것을 포워딩이라고 한다.

그렇기 때문에 들어온 패킷을 원래 보내려던 목적지 호스트의 맥주소를 참조해서 패킷을 새로 만들고 보내 줘야한다.
목적지 호스트의 맥주소를 알기 위해서 우리는 ARP 테이블을 사용할 것이다.
(우리의 ARP 테이블에 목적지가 있다고 가정했다.)

우리는 이 기능들을 subprocess 모듈을 이용해서 구현할 수 있다.



(subprocess)



subprocess에서 arp -a 명령어로 ARP 테이블을 확인 할 수 있는 화면이다.



(맥 주소를 구해내는 코드)



우리는 위의 방법으로 arp 테이블에서 목적지 호스트의 맥주소를 참조할 것이다.



(포워딩 부분 코드)



위의 코드로 생성을 했다.

하지만 여기서 문제가 있었다.
상대호스트에게 ARP 스푸핑을 하는데
내 컴퓨터의 ARP 테이블에도 영향이 간다는 것이다..

그래서 완벽하게 스니핑 프로그램을 완성하지 못했다.

지금 마주한 문제를 곰곰히 생각해봐야겠다.




+ Recent posts