1. DNS 스푸핑 공격 2. HTTP Request 소개 2015. 4. 중부대학교 정보보호학과 이기원, 김혜영
스푸핑(Spoofing) 스푸핑은 ‘속이다’ 는 의미입니다. 정보를 얻어내는 것 외에도 시스템을 마비시킬 수 있습니다.
DNS(Domain Name System) 도메인에서 www.joongbu.ac.kr 도메인이름입니다. 도메인 네임 시스템(Domain Name System)은 도메 인 이름을 IP주소로 변경해주는 역할을 합니다.
DNS 스푸핑 (Domain Name System Spoofing) 해킹 공격기법 중 하나로 DNS에서 전달되는 IP주소 를 변조하는 것입니다. 사용자가 의도하지 않은 주소로 접속하게 만드는 공격입니다.
DNS 서비스의 정상적인 동작 1. 클라이언트가 DNS 서버에 접속하고자 하 는 도메인 이름 (www.joongbu.ac.kr)의 IP주소를 물어봅니다. 2. DNS 서버가 도메인 이름에 대한 IP 주소를 클라이언트로 보내줍 니다. 3. 클라이언트는 DNS 서버에서 받은 IP주소 로 웹 서버를 찾아갑니 다.
DNS 스푸핑 1단계 클라이언트가 DNS서버로 DNS 쿼리 패킷을 보낸것을 확인합니다.
DNS 스푸핑 2단계 공격자는 로컬에 존재하므로 DNS 서버보다 지리적으로 가까워서 DNS서버가 올바른 DNS Response 패킷을 보내주기 전에 공격자가 위조된 DNS Response 패킷을 보낼 수 있습니다.
DNS 스푸핑 3단계 클라이언트는 공격자가 보낸 DNS Response 패킷을 올바른 패킷으 로 인식하고 웹에 접속합니다. 지리적으로 떨어진 DNS 서버가 보낸 Dns Response 패킷은 버립니다.
DNS 스푸핑 실습(1) - 소개 공격자 IP주소 = 192.168.111.100 게이트웨이 = 192.168.111.2 서버(공격자): Fedora12 클라이언트(공격대상): Windows Vista 실습환경: VMware를 이용
DNS 스푸핑 실습(2) – 툴 설치 DNS 스푸핑을 하기위해 arpspoof와 dnsspoof를 설치합니다.
DNS 스푸핑 실습(3) – 툴 설치2 패킷 릴레이를 위한 fragrouter를 설치합니다. fragrouter-1.6.tar.gz를 다운로드 받아 터미널에서 아래와 같은 명령어 를 입력합니다. tar xvfz fragrouter-1.6.tar.gz cd fragrouter-1.6 ./configure; make; make install
DNS 스푸핑 실습(4) – httpd 시작 터미널에서 아파치 웹서버 데몬을 명령어 service httpd start 입력하여 httpd를 시작합니다.
DNS 스푸핑 실습(5) – 인터넷 접속 확인 클라이언트에서 샤나 홈페이지 접속(www.shana.pe.kr)이 되는지 확 인합니다.
DNS 스푸핑 실습(6) – 공격자 웹서버 확인 클라이언트에서 공격자 컴퓨터 아이피로 웹 페이지가 접속 되는지 확인합니다.
DNS 스푸핑 실습(7) – DNS 파일 설정 DNS 스푸핑 파일을 설정합니다. 터미널에서 vi /etc/dsniff/dnsspoof.hosts 를 입력하여 vi 에디터를 실 행합니다. 공격자 IP주소와 공격자 서버로 연결할 사이트 주소를 입력하고 저 장합니다. 192.168.111.100 *.shana.pe.kr 192.168.111.100 shana.pe.kr shana.pe.kr을 추가한 이유는 http://shana.pe.kr로 접속시 DNS 스푸 핑이 제대로 이루어지지 않아서 추가했습니다.
DNS 스푸핑 실습(8) – arpspoof 실행 터미널에서 arpspoof -t 공격대상IP주소 게이트웨이IP주소 형식으로 입력하면 됩니다.
DNS 스푸핑 실습(9) – fragrouter 실행 패킷릴레이는 터미널에서 fragrouter -B1 입력합니다. fragrouter는 공격자가 공격대상으로 부터 받은 패킷을 목적지로 다 시 보내주는 기능을 수행합니다.
DNS 스푸핑 실습(10) – DNS 스푸핑 공격 터미널에서 dnsspoof -i eth0 -f /etc/dsniff/dnsspoof.hosts 입력하여 실제 DNS 스푸핑 공격을 수행합니다. 공격대상이 shana.pe.kr을 방문할때 위와 같은 메시지가 출력됩니다.
HTTP 이해 1. 클라이언트가 서버에 연결 요청을 하면 서버는 서비스를 준비합니다. 2. 서버는 준비 상태가 되면 클라이언트는 읽고자 하는 문서를 요청합니다. 3. 서버는 클라이언트가 요청한 문서를 전송합니다. 4. 연결을 끊습니다.
HTTP Request 웹 서버에 데이터를 요청하거나 전송할 때 보내는 패킷입니다. GET 방식 POST 방식 웹 서버에 데이터를 요청하거나 전송할 때 보내는 패킷입니다. GET 방식 요청 데이터에 대한 인수를 URL(Uniform Resource Locator)을 통해 전송합니다. POST 방식 HTTP 헤더에 데이터를 전송합니다.
HTTP Response 클라이언트의 Request에 대한 응답 패킷입니다. 헤더 정보 뒤에는 실제 데이터가 전달됩니다.
프로그램을 통한 로그인 – POST 방식
프로그램을 통한 로그인 – POST 방식
프로그램을 통한 로그인 – POST 방식 private static bool login(string ID, string PW) { string str; WinHttps.Open("POST", "https://nid.naver.com/nidlogin.login"); WinHttps.SetRequestHeader("Referer", "https://nid.naver.com/nidlogin.login"); WinHttps.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded"); WinHttps.Send("enctp=1&id=" + ID + "&pw=" + PW); str = WinHttps.ResponseText; if (str.IndexOf("https://nid.naver.com/login/sso/finalize.nhn") > 0) MessageBox.Show("로그인 되었습니다."); return false; } else MessageBox.Show("실패"); return true;
프로그램을 통한 로그인 – POST 방식 WinHttps.Open("POST", "https://nid.naver.com/nidlogin.login"); https://nid.naver.com/nidlogin.login HTTP 연결을 POST로 방식으로 엽니다. WinHttps.SetRequestHeader("Referer","https://nid.naver.com/nidlogin.login"); 요청을 보내기 전 HTTP 헤더를 설정합니다. Referer는 웹 요청을 하기 직전 사용자가 웹브라우저에서 보고 있던 웹 페이지의 주소가 이 필드로 넘어옵니다. 그렇지만 주소 창에 새로 URL을 입력해서 웹 요청을 하는 경우는 리퍼러 설정이 안 되며 웹 페이지에서 다른 링크를 클릭해서 요청이 이루어진 경우에만 리퍼러 설정을 합니다. WinHttps.SetRequestHeader("Content-Type", "application/x-www-form- urlencoded"); Content-Type(미디어 타입) 을 application/x-www-form-urlencoded(표준 타입, key와 value 형태로 인코딩) 으로 설정합니다. Key와 value 형태란 id=아이디값&pw=패스워드값 이런 형태를 말합니다. 여기서 id와 pw가 key가 되는 것이고 아이디값과 패스워드값은 value가 되는 것입니다.
프로그램을 통한 로그인 – POST 방식 WinHttps.Send("enctp=1&id=" + ID + "&pw=" + PW); (POST 방식으로) HTTP 헤더의 데이터에 대한 요청을 전송합니다. 요청을 전송할 때 key-value 형태로 전송되며 아이디와 패스워드 값이 전송됩니다. enctp는 Naver 로그인할 때 필요한 기본 값으로 생략시 로그인이 안 됩니다. str = WinHttps.ResponseText; 요청에 대한 응답을 Text 로 받습니다.
프로그램을 통한 로그인 – POST 방식 잘못된 아이디와 패스워드를 입력했을 때 str(HTTP Response)값
프로그램을 통한 로그인 – POST 방식 올바른 아이디와 패스워드를 입력했을 때 str(HTTP Response)값 if (str.IndexOf("https://nid.naver.com/login/sso/finalize.nhn") > 0) { MessageBox.Show("로그인 되었습니다."); return false; } else MessageBox.Show("실패"); return true;
감사합니다