어플리케이션 프로토콜에 관해 알아볼 것인데
어플리케이션 프로토콜 중에는
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)



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

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


오늘은 DNS Spoofing 공격을 해볼 것이다.

DNS Spoofing이란 DNS 서버를 조작하거나, 호스트에게 잘못된 DNS 정보를
보내어 잘못된 DNS 정보를 전달해 원하는 IP 주소로 이동하게 하는 것이다.

( 이 공격은 불법이므로 실제로 사용해서는 안됩니다.
 반드시 가상환경을 구축하거나 개인적으로 실험하세요 )
( 본인이 책임져야 됩니다.)

DNS 스푸핑을 쉽게 말하면
피해자가 naver.com 으로 입력했는데 다른 공격자가 원하는 사이트로 이동하는 것이다.

공격 환경
공격자 : 칼리리눅스 (120번 IP)
피해자 : 윈도우 ( 4 번 IP)

공격자인 내가 피해자가 naver로 접속할 때 학교 사이트로 넘어가게 할 것이다.

DNS 서버를 건드리는 것은 불법이므로
피해자의 DNS 캐쉬 테이블을 조작해서 공격을 성공시키겠다.

DNS 스푸핑을 하기 위해 칼리리눅스의 ettercap 툴을 이용할 것이다.
Ettercap 툴은 유명한 MTM 공격 툴로 우리의 공격목적에 알맞다.

먼저
Ettercap을 이용해서 dns spoofing을 조작할 것이므로
DNS 테이블을 조작할 것이다.

공격 계획은 이러하다.
1. 조작된 DNS 테이블을 만든다.
2. 피해자와 게이트웨이 중간에 들어간다. (MTM)
   (ARP Spoofing을 이용해서)
3. DNS Spoofing을 한다.
4. 게임 끝!



(dns 파일로 접속)





(naver 의 주소를 학교 IP주소로 변경한다.)



"*" 표시는 무엇이 들어와도 괜찮다는 이야기이다.
그래서 표현을 *.naver.* 으로 해준 것이다.

자 이제 테이블도 준비됬고 이 정보를 뿌리면 된다.
Ettercap을 열어준다.



(열어서 Unified sniffing 을 클릭한다.)








(네트워크 인터페이스를 선택)





(호스트 스캔한다.)





(스캔된 리스트 화면)






(타겟 설정)



타겟으로 게이트웨이와 피해자 호스트로 설정한다.

이 둘 중간에 들어가서 ARP Spoofing을 먼저 할 것이다.





(ARP 스푸핑)



ARP 스푸핑을 한다.
sniffer remote connections 을 선택한다. 이것은 포워딩도 같이 해주겠다는 것이다.

자 그럼 여기 까지 MTM 까지 왔다.

이제 DNS Spoofing을 해주면 된다.




(DNS Spoofing을 선택해준다.)



이제 피해자는 인터넷 주소창에 naver.com 을 입력하면
DNS 캐쉬 테이블에 적혀있는 아이피 주소로 바로 이동할 것이다.




(DNS 스푸핑된 모습)



naver.com에 입력했지만
naver가 아닌 다른 사이트가 열린다.

이로써 DNS Spoofing 공격을 성공했다.





칼리 리눅스를 이용해 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 계정과 패스워드를 획득할 수 있었다.
공격 성공.

!!!



오늘은
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 테이블에도 영향이 간다는 것이다..

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

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




스니프( Sniff )
Packet sniffing
 - 남의 패킷을 가로채는 공격기법들
 - ARP Spoofing (ARP를 속여서 가로채는 것)
 = ARP Cache Poisoning 공격 기법

 - MITM ( Man In The Middle ) 중간자 공격

우리가 쓰고 있던 덤프 프로그램을 스니퍼 프로그램으로 만들어 보겠다.

우선 필요한건
1. 장치명을 매번 입력받는것
2. 원하는 패킷만을 보길 원한다.
  -> 소스코드를 수정하면서 확인했었다.
이다.

먼저, 실행인자를 이용해볼 것이다.
예를 들어



(ipconfig /all 옵션)



ipconfig 뒤에 붙는 옵션처럼
원하는 필터링의 옵션을 추가할 것이다.

스니핑 프로그램을 제대로 만들기 위해
먼저 패킷덤프 프로그램을 쓸모있게 만드는게 필요하다.

필요한 인자를 받아서 옵션을 만들것이다.
-> sys, optionparse  모듈이 파이썬에 이미 있다.
우리는 이것을 이용할 것이다.




(파이썬3의 optparse 모듈)



파이썬3의 optparse 모듈

인자를 받는 모듈을 이용해서
옵션을 5개 추가해 보았다.

옵션처리 방식(닉스계열 (유닉스, 리눅스))
#> python sniffer.py -t 192.168.3.88
       -p ARP    
       -s  (출발지 IP)
       -d (도착지 IP)

#> python sniffer.py --protocol ARP
       --target          (긴옵션)

* 필터링 룰을 넣어줄 것이다.
option
 -s : 출발지 ip 주소
 -d : 도착지 ip 주소
 -a : 출발지와 도착지 상관없이 필터링
 -p : 확인하고자 하는 프로토콜 타입
 -m : 동작모드(덤프/스니프)



(옵션 설정 코드)



(옵션이 입력된 것을 확인했다.)



-h 의 도움말 옵션까지 추가해 그럴싸한
프로그램으로 만들생각이다.



(usage를 추가하고 -h 인자를 추가한 코드)



(python test.py -h 를 입력하면 옵션이 나온다.)



우선
ARP 만 출력하는 모습을 보이겠다.

옵션 -p ARP 를 입력하면
ARP 만 나오게 하는 코드이다.



(옵션을 추가해서 조건을 걸은 코드)




(실행화면)



실행화면을 보면
ARP 패킷만 덤프되는  것을 확인 할 수 있었다.







어제 해본 공격으로 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 변조 공격을 당했다면, 혹은 탐지를 위해서는
패킷을 덤프해보면 확인 할 수 있다.
이더넷 헤더는 변조가 불가능하기 때문이다.


+ Recent posts