이번에는 DoS 의 한 종류인 Arp Spoofing을 이해하고자 한다. 늘 강의를 다니면서 부가 설명 하는 것은 기본을 이해하면 "응용"부터 학습하는 것보다 쉽다. 라고.. 물론 100%는 아니겠지만.. 어느정도는 맞다고 생각된다.


ARP SPOOFING

ARP Spoofing을 이해하기 위해서 우선 "ARP"와 "Spoofing"을 각각 이해해야 한다.


ARP - Address Resolution Protocol

=> ARP를 이해하기 위해서는 IP와 MAC 통신에 대해서 이해를 요구 한다. 

-> IP는 물리적 거리 무시하고 다른 브로드캐스트 도메인 영역과의 통신 시에도 사용될 수 있는 "OSI Layer 3" 주소 정도라는 것은 기억해야 하고,

-> MAC은 "OSI Layer 2"계층 주소이며, 같은 브로드캐스트 도메인 영역에서 통신하고자 할 때 사용되는 "필수"주소라는 중요한 것을 잊으시면 안된다.

-> 그리고 IP보다 MAC 이 우선 통신 주소로 이용되며, "중요"하다. IP는 달라도 MAC이 맞다면 패킷이 전달되고(핵심), IP가 맞아도 MAC이 다르다면 NIC에서부터 패킷 처리를 할 수 없으니까.

ARP는 IP를 알지만 "실질적인 패킷 전달을 하기 위해서" "MAC"주소를 필요로 하는데,(MAC주소를 모르면 패킷 전달 못하고, 통신이 안됨.) IP는 알지만 MAC을 모를 때 MAC을 알기 위한 과정이다. (라우팅에 대한 개념은 별개.)


Spoof - 사전적 의미를 보자.

ARP와 Spoof를 이해하면 기본적으로 "아 대충 뭐 그런거구나."라는 건 이해가 갈 내용이다.




자 다음은 실제 따끈따끈한 테스트 환경이다.


1. 패킷을 수집당할, 피해자, VICTIM의 PC IP이다.

IP : 1.1.1.139

MAC : 00-50-56-23-B2-C4

IP range : 24bit


2. 패킷을 수집할 Attacker, 피고인의 PC IP이다.

IP : 1.1.1.140

MAC : 00-0C-29-B6-13-D2

IP range : 24bit



3. 같은 네트워그 대역임을 확인시켜주기 위한 정보들이다. 



4. 공격 당하기 전 정상 상태의 VICTIM의 ARP정보이다.

(ARP 라는 것은 ARP 명령어를 통해 추가 정보를 확인하거나, 설정이 가능하다.)

arp -a 의 경우 현재 해당 단말의 arp 목록 정보를 확인한다. 각 시스템들마다  arp 확인이 가능한 경우 제 각각의 명령어들이 존재한다.



5. 우선 갈취하는 정보는 ftp로 테스트를 진행하였다.

(FTP : File Transfer Protocol, 파일 송수신간 사용되는 어플리케이션)

아래는 FTP 서비스를 열어둔 서버의 로그(시간이 다르지만 양해바란다. 당연히 시스템 시간 문제 없을 줄 알았다...ㅠㅠ)


6. 실제 arp spoofing에 의해 공격당해 발생된 시스템의 arp 정보 내용

arp spoofing은 수집하고자 하는 대상의 arp정보를 강제로 갱신토록 하여 수집한다.

이는 (별도의 보안 시스템이 설정된 경우를 제외.) 일반적으로 정상적인 정보 갱신을 이용하거나 할 때, 시스템의 운영체제와는 별개의 문제로

정보가 유출될 수 있다. 

arp 정보의 침해를 받아 공격자의 MAC 주소와 1.1.1.139가 바라보는 Gateway의 MAC주소가 같아졌다.
그로 인해 실제 패킷이 GW가 아닌 1.1.1.140에게 전달되는 것이다.

위의 패킷 덤프 내용을 보면 공격자 1.1.1.140(00-0C-29-B6-13-D2)가 각 두 피해자 1.1.1.2(GW), 1.1.1.140(VICTIM)에게 자신이 중간에서 가로채기 위한 ARP Reply 패킷을 발송하고 있다.

이로 인해 각 두 피해자는 ARP Reply 값에 의해 ARP 정보가 갱신되는 것이다.



7. 실제 공격을 통해 유출된 FTP 로그인 패스워드 정보(일부러 틀린 값을 입력하였고, 해당 내용이 평문 그대로 갈취 되었다.)

해당 도구는 Cain & Abel이라는 도구를 이용하였으나, arp spoofing을 이용할 수 있는 도구는 여러 종류이다.




대응방안.

간단하다.

보안 솔루션(NAC 또는 ARP+IP를 고정할 수 있는 무언가)을 사용하거나 End user, 단말 단에서는 ARP -S 등의 명령어를 통해 Static 한 값으로 등록하여 사용한다.

대부분 Static 은 Dynamic보다 우선시 된다.

하지만 "오타"를 조심하자.




DDoS 의 공격 방식에는 여러 가지 방식이 존재한다.


그 중 Application Layer 의 공격 종류 중 Slow Read Attack 혹은 Slow HTTP Read DoS 등으로 불리우는 공격에 대해서 알아보자.


우선 이 공격을 이해하기에 앞서 TCP에 대해서 이해를 요구하게 된다.

모든걸 다 할 순 없으니, 필요한 부분들만 설명하겠다.

"RFC 1323" 이 있다.

해당 문서의 제목은 "TCP Extensions for High Performance"  


여기에서는 TCP의 Window Size 에 대해서 언급한다.

(OS Windows 말고...)


Window Size라는 걸 간략하게 설명하자면, TCP 통신에 있어 통신 속도에도 영향을 줄 수 있고, 데이터를 주고 받을 때 이 값에 의한 크기 만큼 데이터를 주고 받는다.

이 값은 여러분들이 인터넷 속도 체크를 할때 TCP를 통한 속도 체크를 사용하는 방식에서도 영향을 준다.


아울러 이 값은 "랜덤 상태 조절"이 Default 값이다.


시작 -> 실행 or 윈도우 키 + R을 눌러 "CMD" 명령어를 입력하거나 커맨드 창을 열어 다음과 같이 입력해 보자.


"netsh interface tcp show global"

거기엔 OS의 언어에 맞게 옵션 값이 출력되는데, 한글 기준 "수신 창 자동 조정 수준"으로 표기가 된다.


이것이 TCP Window Size에 대한 옵션 값이며, 기본 Normal 로 자동 조정된다.


자, 이 값이 왜 중요할까?


 - 우리가 연결된 통신 경로를 통해 데이터를 주고 받음에 있어, 주고 받는 데이터의 경우에 따라 "사용되는 Hareware Resource"가 제각각이다.


어떤 녀석은 데이터 처리하기 위해 하드웨어 CPU, 메모리 등의 자원을 많이 쓸수도 있고, 가벼운 녀석도 있을 것이고..


그러면 이 Window 값이 만약 고정이라면? 내가 1만큼 수신 처리가 가능한데 100만큼이 고정 값으로 되어 있다면?


반대로 100만큼 처리가 가능한데 1만큼씩만 처리하기 위해 수신된다면?


무조건 고정적으로 하는 값은 상황에 따라 옳지 못한 설정 값이 된다. 그래서 기본 자동으로 되어 있으며, 통신에 따라 자동으로 "Window Size"를 조정하여 데이터를 송수신하며, 처리에 병목이 생기지 않도록 조절한다.


그럼 해당 공격은 거의 이해가 끝났다고 볼 수 있다.




이건 내가 강의할 때 만든 자료 중 한 페이지이다.


여기서 진상고객은 "Client, HTTP 서비스 요청자 또는 공격자"가 되시겠다.

카페직원은 당연히 "Server, HTTP 서비스 제공자 또는 Victim"이 되시겠다.


이 공격은 "TCP 통신의 정상 과정"을 "악용" 하는 공격이다.(차후 여러가지를 올리겠지만, 정상적인 통신과정을 조작하거나, 악용하는 공격들이 굉장히 많다.


과정은 이렇다. 기본적으로 Application Layer공격은 "세션이 수립된 상태" 즉 3 Way Handshaking이 끝나고, TCP Connection 상태 정보에 "Established" 상태에서 발생된다.(기본적으로 중요한 개념이다. 기억해두자.)


이후 HTTP 어떤 페이지의 정보를 요청하고자 할 때 공격자는 자신이 요구하는 페이지 정보와 자기가 얼마만큼 "처리가 가능한지"에 대해서 TCP Window Size를 지정하여 발송한다.

 TCP Window Size 예시 1

RFC 1323에 정의된 Window Size 크기에 대한 설명

 

 


공격자가 악의적으로 해당 WIndow Size에 대한 값을 "작게" 설정하여 또는 "0"으로 설정하여 요청을 보낸다면?


서버 입장에서는 정상적인 요청에 해당 Window Size에 의해 세션은 수립된 상태이나, 강제적으로 단절 시키거나 하지는 못하고, "세션 연결"을 유지하게 된다. 이때 Client 입장에서도 세션이 끊어지지 않도록 하기 위한 데이터를 간간히 보낸다.


실제 이 패킷들은 흔히 알고 있는 Flooding류 공격에 대비하여 패킷 사이즈가 크거나, 많은 대역폭을 잡아먹거나 하질 않는다.


그래서 정상적인 통신과의 구분 방법이 "모호"하다고 할 수 있다.


 

Kali 에 slowhttptest를 설치 해 봤다.

 


해당 공격 테스트를 위한 예시 명령어.(실제 회사 원격 지원 서버 페이지로 공격)

 

 예전엔 잘 죽었는데, 잘 버틴다.

초당 50건의 연결을 하고, 10000 건의 연결 공격에서 현재 4090 개 연결


 

 

해당 공격패킷을 실제 pcap으로 발췌한 내용.

[TCP ZeroWindow] 가 눈에 들어온다.


해당 공격은 그럼 방어하려면 어떻게 해야 할까?

여러가지 DDoS 공격 대응 솔루션들이 있지만, 기본적으로 해당 공격이 어떤 형태로 발생되는 지를 먼저 이해할 필요가 있다.

그리고 서버 자체에서 이 공격을 해결할 수 있으리라고 생각하는 것은 큰 오산.


난 늘 그렇다. 공격을 방어하려면. 그 공격을 이해해야 하고, 그 공격을 이해하기 위해 응용이 되기 이전 기본을 이해할 필요가 있다고...










define

=> 정의하다.

define의 ine를 뺀 def. IT를 오래 하다 보니 대충 예상은 된다. 뭔가 이걸로 지정한다는 건데,


무엇을 어떻게 하는 걸까.?

알아보자.

 

 이 코딩은 기본 구조를 나타낸다.

def 정의할이름(): 여기서는 hello 되시겠다. ":(콜론)"은 빠뜨리지 말자.

     hello라는 여기서 변수라는 의미로 받아들이면 이해가 쉽다.


hello()를 한다는 것은 print("Hello Python!") 을 실행한다는 것과 같다.

여기서 "인자" 라는 말이 나오기 시작한다. 

hello라는 것을 함수로 만들고 괄호의 범위안에 "인자"를 받아들이는데


여기서 인자는 print 블라블라 가 되시겠다.

 2,3번을 보면 print 를 하는데 위의 인자를 "name"이라는 변수를 만들고

- 아래의 hello2라는 호출에서 " "안의 내용을 name이라는 변수로 받아들이겠다는 거 되겠다.(옳게 이해한건가요?!ㅠㅠ)


- 그래서 hello! Justion이 되는 것이다.


아직 이 구조가 명확하게 이해가 되지는 않지만.. 용도는 어느정도 알겠다.



 

 

 

 자, 이제 조금씩 정말 이해가 어려워지기 시작했다.


- 위의 내용은 딱 봐도, 숫자를 입력받아 사각형 크기를 구하는 것


아래는 삼각형에 대한 넓이 값을 구하는 것.


밑변 곱하기 나누기 2(다 기억나시죠..?저 처럼. 기억나시는거 맞죠?)


여기서 새로이 "return"이라는 것이 등장. 계산의 결과 값을 C로 받아 C를 위의 결과값으로 반환.(반영)한다는 의미.

a와 a를 곱한값을 C로 넣고, 그 C를 결과값으로 반환.

a*h /2 결과 값을 C로 저장하여, 그 c를 결과값으로 반환.


사각형과 관련하여 넓이를 구하기 위해 한변이 4인값을 넣는다. 그리고 그 4가 담긴 "s1"을 제곱하는 형태를 만든다. 이것이 square(s1), 그 하단에 s1과 s2를 출력하라는 것은 

한 변의 길이와 사각형의 넓이를 구하는 값이 된다. s1 = 한변, s2 = s1 * s1(위의 c= a*a)


 

 sum_func(이름은 중요하지 않다. 그저 이해하기 쉽게 만들어주는 듯)

for(반복문) x 만큼 x는 range(범위) = 1부터 n(입력 인자값)+1까지 

그리고 그 값을 최초 0의 값을 가진 변수에 반복 +1 하며 더한 값을 저장.


최초 s = 0 의 값이 있고, 이 값에 1에서 임의로 입력하는 인자 값 만큼 반복하고, 반복되며 증가하는 값만큼 S로 입력한다. 그리고 그 s를 결과 값으로 반환하는 코딩


1에서 1,2,3,4,5,6,7,8,9,10 이 되면서 계속 값을 더 한 값을 s에, 1~100까지 증가하는 값을 더한 값을 s에 저장하여 각각 55과 5050을 반환하는 코딩

위의 응용 위는 0을 최초 값으로 "덧셈"을 줘서 반환 결과 값이 0이 나올일이 없었지만

아래는 곱셈을 연산하는 것이기 때문에 기본 값이 1이다.


1*2*3*4*5 = 120

10은 알아서 계산하자.^^

 









+ Recent posts