칼리 리눅스를 이용해 ARP Spoofing과 Sniffing 공격을 해보겠다.
물론,
실제 서버, 실 사용자에게 공격을 하는 것은 불법이다.
즉, 실제로 사용한다면 본인이 그에 대한 책임을 져야한다.

공격할 환경을 구축해야한다.
VM을 이용해
칼리리눅스(서버) - IP 주소 100번
칼리리눅스(공격자) - IP 주소 120번
윈도우(피해자) - IP주소 4번

상황은 피해자가 서버에 접속을 하는 상황이다. (TELNET 접속)
공격자는 이 때 서버의 계정과 비밀번호를 얻더내는 것이 목표이다.

먼저
피해자가 서버와 통신을 할 것이고 이 때 TELNET에 계정과 비밀번호를 전송할 것이다.

TELNET은 통신이 암호화되어있지 않기 때문에
패킷의 내용을 가져올 수 있다면 즉 스니핑을 할 수 있다면
바로 게임 끝이다.!

이제 관건은 어떻게 스니핑을 할 것인지가 관건이다.
스니핑을 하기 위해
ARP 스푸핑을 이용할 것이다.
네트워크 해킹의 일종으로 ARP Poisoning이라고도 한다.

그래서 피해자와 서버 사이에서 중간자에 들어갈 것이고
이 상황에서 스니핑을 할것이다.
그 후 계정 탈취

계획을 정리하겠다.

1. ARP 스푸핑
2. 스니핑
3. 끝

칼리리눅스의 arpspoofing 툴을 이용해 먼저 스푸핑을 시작한다.




(arpspoofing 명령)





(arp reply 패킷이 전송되는 모습)




피해자의 입장에서 보면


(공격 받기 전 ARP 테이블)





(스푸핑 당한 상황)



이 상황에서는 피해자의 패킷들이 전부 나(공격자)에게 전송되므로
피해자는 현재 인터넷 통신이 되지 않는다.





(인터넷이 끊긴 상황)



이대로 놔두면 피해자는 이상하게 여길 것이고 공격받고 있다는 것을
눈치 챌것이다.

가로챈 패킷을 다시 정상상태로 포워딩을 시켜줘야
피해자가 인터넷 통신이 되고 공격받는 사실을 눈치 채지 못할 것이다.
또 다시 포워딩을 해주면서 나는 피해자와 서버 사이에 들어가게 되는 것이다.

피해자 < - > 나  < - > 서버





(포워딩 해주는 모습)



자 이제 중간까지 들어갔다.

패킷 스니핑을 하면 된다.

우리는 와이어샤크를 이용할 것이다.
와이어 샤크를 이용해 패킷을 확인해 볼 것이다.




(와이어샤크를 캡쳐 중인 모습)



자 이제 와이어 샤크로 감지하고 있고
피해자가 접속하길 기다리면된다.

피해자가 접속을 한다.




(텔넷 서버에 접속하는 모습(피해자 화면))





(접속한 상황(피해자 화면))



이 때 바로
패킷을 분석해보니
TELNET프로토콜을 확인할 수 있었다.
전체적인 내용을 확인하기 위해 Follow TCP Stream을 클릭해준다.




(Follow TCP Stream)





(에러 화면)



에러 화면이다...

이 문제로 실제
밤을 새웠다..
구글도 뒤져보고 실제로 이 문제로 최근 바로 16년 12월에 버그로 보고가 된 부분이었다.
그래서 와이어샤크는 2.2.2 버젼에 이 버그를 패치해서 올려놨는데

확인해보니 내 버젼은 2.2.0 ...
업그레이드 해주었다.
그 후 잘되는 모습이다.





(계정, 패스워드 탈취)



이렇게 TELNET 계정과 패스워드를 획득할 수 있었다.
공격 성공.

!!!



어제 해본 공격으로 ARP Cache Poisoning이 있다.

오늘은 이 공격을 확장해 보겠다.


(확장된 공격)



이 코드는
보내는 사람의 소스 IP주소까지 변조하는 코드이다.
for문을 사용해서 192.168.3.0 부터 192.168.3.49 까지 한번에 쓰레기 값을 입력하는 것이다.


(공격받은 모습)




(공격받은 모습)


ARP 패킷을 하나씩만 보냈기 때문에 이 증상은 조금후 조금씩 회복된다.
하지만 while 문으로 꾸준하게 보내주게 되면
이 컴퓨터는 통신을 할 수 없는 상태에 빠지게 된다.

또 이것저것 바꿔보면서 실험해보았는데
이더넷 헤더의 맥주소는 바꿀 수 없었다.



(표시된 부분)


이더넷 헤더의 출발지 주소까지 변조하여 완전범죄를 꿈꾸었으나
이 헤더의 정보를 건드리면
컴퓨터에서 패킷이 전송되지 않는다.
우리는 ARP 데이터는 변조할 수 있다.

여기서 한가지 호기심이 더했다.

만약, 게이트웨이 ARP 테이블을 지금 위에서 한 확장된 ARP 캐쉬 Poisoning을 한다면
어떻게 될까??


(타겟의 IP주소를 게이트웨이 주소로 한 코드)


IP 주소 범우는 199까지 했다. 같은 네트워크에 200번 뒤도 있었지만
내 IP주소가 165번이었기 때문에 내 번호까지만 커버하는 IP 범위로 설정했다.



(공격 받은 후 상황)



게이트웨이로의 ping이 잘되다가 응답이 몇번 안된다.
하지만 이 현상은 오래 가지 않는다. (내가 while문으로 계속해서 돌리지 않았기 때문에)
내 컴퓨터는 게이트웨이의 주소를 ARP 과정을 거쳐 올바른 주소를 얻고
ping 메세지 아래 두개는 응답을 받은 것을 확인 할 수 있다.



(인터넷 멈춤 현상)



그리고 게이트웨이를 공격한 후에 인터넷 접속을 했더니 오래걸렸다.
이는 아까 위에서 본거 같이 ping메세지도 처음 두 메세지는 응답하지 못했지만
나중에 다시 ARP과정을 거쳐 메세지를 받았듯이
인터넷도 원래는 바로 켜졌는데, 시간이 조금 지난 후에 접속이 가능하였다.

여기서 만약 내가 while 문으로 계속 돌렸다면
네트워크는 동작하지 않았을 것이다.

또 위에서 확인해 보았듯이 이더넷 헤더는 변조가 안된다...
패킷을 덤프해서 확인해보니
내 맥주소가 나온다



(내 맥주소가 노출되는 상황)


만약 ARP 변조 공격을 당했다면, 혹은 탐지를 위해서는
패킷을 덤프해보면 확인 할 수 있다.
이더넷 헤더는 변조가 불가능하기 때문이다.


오늘은 지금까지 분석해왔던 패킷을 직접 만들어볼 것이다.

오늘은 L2 계층의 패킷을 만들어볼 것이다.

대표적인 ARP 패킷을 만들것이다.

ARP패킷에 들어가는 내용은
이더넷 헤더(14바이트), ARP 헤더(28바이트) -> 총 42바이트가 들어간다.

먼저
패킷을 만드는 코드를 짜야된다.


(패킷 생성 코드)



가운데 주석 표시해 둔 곳에
내용에 맞는 패킷을 작성하면 된다.


(패킷 내용을 작성한 코드)



(실행해서 덤프받은 화면)



위 화면은 ARP 패킷을 전송한 것을 덤프받아서 확인한 결과이다.

아래 바로 ARP 응답 패킷또한 확인 할 수 있다.
ARP 응답은 Operation이 2이다.


ARP 패킷을 만들어서 전송하면서 발견한 취약점.

* ARP 패킷을 받으면 그 받은 host는 그 내용을 무조건 신뢰하며
그 데이터에 따라 자기 캐쉬 테이블을 업데이트한다.

우리가 패킷 내용을 작성해서 보냈지만,
솔직하게 데이터를 쓰지 않을 수도 있는것 아닐까?
그렇게 되면 상대 host의 ARP 테이블은 어떻게 될까?



(나의 맥주소를 77:77:77:77:77:77 이라고 속인 코드)



이렇게 ARP 패킷을 스푸핑했다.
스푸핑 -> 속이다.

옆 사람이 내 컴퓨터로 ARP 패킷을 조작해서 보낸 결과는 다음과 같다.



(아래에 192.168.3.239 주소 맥주소)



192.168.3.239의 맥주소를 보면 이상하다.
aa-bb-cc-dd-ee-ff 라니?...

게다가 하면서 더 요상한걸 발견했다.

ARP 패킷을 보내는데
IP주소도 변조해서 보낸다면?...



(엉망이된 나의 ARP 테이블)



위 화면을 보면 요상한 맥주소들이 등록되어있다.
이 경우 아주 착하게도 맥주소가 잘못된것을 바로 알기 쉽지만
보통 일반적인쓰레기맥주소를 입력한다면 구별하기 힘들것이다.

또 이로 인해 네트워크 통신에 문제가 생길 수 있다.

바로 이렇게 ARP 테이블을 망쳐놓는다 해서
이 공격이름은 ARP Cache Poisoning 이라고 한다.





* NAT  환경
NAT 안쪽 : Interner
NAT 밖쪽 : Externer

게이트웨이 : 외부망과 내부망을 연결해주는 라우터이다.

게이트웨이에서 내부망으로 연결되는 사설 ip는
 보통 끝자리가 1 or 254이다.
(주로 그렇다는것이다. 꼭그런건 아니다.)

같은 네트워크에 있지 않으면 맥주소를 알 수 없다.
(같은 네트워크에 있다면  ARP를 통해 맥주소를 알 수 있다.)
이유는

ARP 패킷은 IP 패킷안에 패키징 되지 않기 때문에
라우터를 넘어가지 못한다.
그렇기 때문에 ARP는 같은 네트워크 안에서만 동작한다.

내부망에서는 MAC주소로 통신을 하고
외부망과의 통신은 IP주소만 가지고 통신을 한다.


내부망에서 어떻게 상대방의 맥주소를 알 수 있을까?
-ARP ( Address Resolution Protocol)
내부망에서 상대방의 맥주소를 알아야하는 이유는 게이트웨이까지 통신이 되야하기 때문이다.

1. ARP Request
        - Broadcast

2. ARP Reply



일단,
ARP 패킷을 한번 직접 받아서 분석해보겠다.

먼저 패킷을 덤프받는 코드를 조금 수정하였다.
어제까지 L2의 이더넷 헤더를 덤프받을 수 있었으므로
이더넷 헤더에서 ARP 패킷을 구분할 수 있다.

(마지막 부분에 ARP 표시한 코드)

 

 

 

(덤프받은 ARP 패킷 내용)

 

 

ARP 패킷 받은것
['0x0', '0x1',  '0x8', '0x0',  '0x6', '0x4',  '0x0', '0x1',
'0x90', '0x9f', '0x33', '0xeb','0x3b', '0x42',
'0xc0', '0xa8', '0x3', '0x60',
'0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
'0xc0', '0xa8', '0x3', '0x67',
 '0x0', '0x0', '0x0',
 '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
'0x0', '0x0', '0x0', '0x0', '0x0', '0x0']

1. Hardware type (2바이트) : '0x0', '0x1 = 이더넷인터페이스
2. Protocol type (2바이트) : '0x8', '0x0' = 0x0800 = IPv4
3. Hardware length (1바이트) : '0x6'
4. Protocol length (1바이트) : '0x4'
5. Operation (2바이트) : '0x0', '0x1 = 1 : Request
                                                              2 : Reply
6. sender Mac Address (6바이트) : '0x90', '0x9f', '0x33', '0xeb','0x3b', '0x42'
7. sender IP Address (4바이트) : '0xc0', '0xa8', '0x3', '0x60', = 192.168.3.96
8. Target Mac Address (6바이트) : '0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
     -> 모르니까 0으로 비워서 보내는 것이다.
9. Target IP Address (4바이트) : '0xc0', '0xa8', '0x3', '0x67'

그 뒤 0들은 프레임맞추기위해 집어넣은것이다.
-> 윈도우즈는 정기적으로 주기적으로 주변 host들에게 맥주소를 물어보는 작업을 한다. (3분? 정도마다)
  그리고 ARP 캐쉬테이블에 넣어둔다.
   커맨드 창에서 arp -a   로 확인할 수 있다.

 

 

 

(윈도우즈 ARP 캐쉬 테이블을 확인할수있다.)

 

 

다음주부터는 패킷을 직접 만들어볼것이다.

* 팁
 집에 갑자기 인터넷이 안될때 검사
1계층 - 잘 꼽혀있는지
2계층 - 나랑 게이트웨이가 통신이 잘되는지 확인
 - 게이트주소에 ping
게트웨이까지는 잘가는데 인터넷이 안되면
게이트웨이의 포워딩이 문제거나
통신사업자에서의 문제거나
3계층...
핑까지 서버에 잘 되는데 웹툰이 안보일때.
-> 이 때는 DNS 문제일 가능성도 있다.  nsloopup 이 안되는 경우가 있다.


또 오늘은 패킷을 보기 쉽게 한번
디자인해보았다.
코드를..

 

 

 

 (깔끔하게 구성된 화면)

Layer 1 - 물리적인 전송을 담당한다.
            - 전기 신호
 ex) 허브에 스타토폴로지로 host들이 연결되있다.
 한 host에서 전기신호를 보내고 그 전기신호를 수신하여서 데이터를 주고받는다.

Layer 2 - 데이터 링크 계층
 
 - 터널링관련 프로토콜 : PPP, L2TP, ...
 - 라우팅이 필요하지 않는 계층
 - 라우팅없이도 통신이 가능하다.
- 이더넷, 토큰링방식
 토큰링 방식 (토큰을 가진사람만 보낼 수 있고, 그 토큰은 네트워크를 돌아다닌다., 충돌을 예방하는 방법이다.)
  - 단점 : 토큰이 돌아서 내 차례가 될때까지가 오래걸린다.
 이더넷 : Collison Domain (충돌을 이용한다.)
 이더넷 헤더 (고정 : 14바이트)
 -우리는 보통 이더넷을 사용한다.

* 각 계층별 주소
L4 - Port Number
L3 - IP Address
L2 - MAC 주소. (Media Access Control) : 하드웨어 주소
 - 16진수 6자리  (유일한 주소)

 L2까지 합하면 패킷의 구성은
 
   - 이더넷 + IP + TCP/UDP + 데이터

지금까지 IP, TCP/UDP, 데이터까지 보았다.
 
기존에 만들었던건 윈도우즈 소켓을 이용해 패킷을 덤프했던 것이다.
이 윈도우즈소켓으로는 L3까지밖에 확인이 안된다.
그래서
L2까지 보기위해 다른 방법을 사용해보겠다.

새로 만든 모듈을 이용했다.



(모듈로 설정한 get_device)





(실행화면)



어떤 장치로 들어오고 나가는 내용을 화면에 출력할지를 정해야한다.
화면에서 Microsoft 라고 나온것이 무선어댑터 지금 사용하는 것이다.

 실행하면 인터페이스를 선택하라고 나온다.
이 때 여기서 나오는 인터페이스란

제어판에서 네트워크 정보에갔을 때 나오는 목록이다.
이 목록은 컴퓨터의 네트워크 장치이다.
이제 이 장치로부터 패킷을 가져와 열어보겠다는 것이다.





(두개의 어댑터)



이 화면은 집마다 다르다.

여기서 전에 소켓통신했던것과 유사하게
핸들러(장치를 다룰) 를 선언했다. 소켓과 비슷한 역할이다.

그 후 전에 덤프 프로그램과 비슷하게 작성해준다.



(패킷을 덤프받아 출력하는 코드)



이렇게 하면 전에 사용했던 프로그램과 비슷한 모양의 코드가 된다.



(실행 화면)



출력을 해보면 데이터가 출력된다.
캡쳐된 내용을 보면 앞에 14바이트 빼고는 지금까지 봤던 정보들이다.

앞에 14바이트는 이더넷프레임이다.


['0xff', '0xff', '0xff', '0xff', '0xff', '0xff', '0x90', '0x9f', '0x33', '0xeb', '0x34', '0xa1', '0x8', '0x0']

분석해보면
1. 도착지 맥주소(6바이트) :  0xff', '0xff', '0xff', '0xff', '0xff', '0xff
2. 출발지 맥주소(6바이트) : '0x90', '0x9f', '0x33', '0xeb', '0x34', '0xa1'
3. 프로토콜 타입(2바이트) : '0x8', '0x0'
                                          - 0x0800 -> IPv4  , IP 프로토콜
                                            0x8600 -> IPv6
                                            0x0806 -> ARP 프로토콜

통신을 하려면 MAC주소를 알아야한다. 하지만 우리는 IP주소만 알고있다.
그렇기 때문에
ARP 가 필요하다.
ARP : Address Resolution Protocol

이제 전에 작성했던 프로그램에서 L2까지 나오는프로그램으로 확장시켜본다.



(확장 코드)




(출력 화면)


출력 화면을 보면 이제 L2의 프레임 단위로 패킷을 확인할 수 있는것을 볼 수 있다.

이제 내일부터
이 내용을 가지고 네트워크를 살펴보겠다.




+ Recent posts