요즘 DDoS(Distributed DoS, DDoS)가 언론과 생활에 관심사가 되었다.
일단 피해가 경미한 수준(?)이기에 일단 개발자로써 차라리 잘된 일이라 본다.
이 일로 보다 많은 사람들이 보안과 네트워크, 그리고 우리는 이미 인터넷이라는 "공기"속에서 살고 있다는 사실을 실감하는 계기가 될것이기 때문이다.
아울러 인터넷과 보안, 즉 컴퓨터를 가지고 이리저리 한다는 것이, 조금만 비약해도 바로 생명과도 연관된 것이란 걸 느꼈으면 한다. 예컨데, 원자력 발전소의 메인 컴퓨터가 멋대로 폭주한다던가 공항의 컴퓨터가 미쳐버린다면 끔찍한 결과가 나올 것이다. 물론 그런 일은 없어야겠지만 다이하드4같은 일은 결코 영화 속 이야기가 아니다.
여기에 따라 개발자들과 SE들이 얼마나 중요한 사람들인지 좀 알아주길 바라며 솔직히 큰 사고가 없다면 이런 공격이 몇번 더 있기를 바랄 지경이다. 묵묵히 파업 한번 없이 일하는 개발자 하나하나가 국민들과 세계인들을 살려주고 있는 셈이다. 연봉은 몰라도 복지비와 유흥비 정도는 국가에서 지급하길 바란다.
자, 서론은 관두고 개발자로써 DDoS를 생각해보자. DDoS란 결국 예전에 유행했던 "방법"과 같은 성격의 프로그램이다. 여기에 좀비 PC를 만드는 법이 추가되었다.
어떻게 글을 써볼까...하다가 좀비 PC를 만드는 법은 아예 적지 않는게 좋겠다는 생각이 든다.
이는 기술적인 무언가보다 사회적인 해킹에 가깝기 때문이다. 윈도우의 백도어와 버퍼 오버플로어는 대부분 닫혔고 지금도 패치되고 있다. 만약 Rhea君이 새로운 것을 발견했다고 여기 적는 순간, 몇시간후에 긴급 패치가 뜰 것이다. 즉, 상상하듯이 조낸 천재적인 누군가가 멀쩡한 남의 집 PC를 감염시키는 그럴싸한 방법은 사실상 없다. MS의 개발자들이 미친 듯이 다 막았고 지금도 막고 있다.
좀비 PC란 이런 어찌어찌한 방법으로 TCP 서버/클라이언트가 사용자 몰래 돌아가는 상황을 말한다. 이를 성공시키려면 대부분 낚시성 ActiveX 컨트롤이나 데이터 파일을 가장한 실행파일, 혹은 스크립트를 배포하는 것이다. 그래서 기술이라기보단 사회적 해킹에 가까운 것이다.
다음으로는 Worm 만드는 기술이 필요한데 이것 역시도 악용의 사례가 될수 있으므로 생략한다.
(결론적으로 시스템 프로그래밍 책보면 누구나 구현할 수 있다.)
성공적으로 프로세스가 뜨게 되면 어딘가로 자신의 IP를 보고할 것이고 그때부터 해커(?)는 좀비 PC를 가지고 놀수 있다. 이번에는 실제 사람이 작업한 것이 아니라 또하나의 좀비 PC인 컨트롤 센터를 두고 이 넘이 정해진 코드대로 공격을 한 점이 독특한 점이다. ...결론적으로 시간 꽤나 걸리는 작업이다. 해커 측에서는 최소한 6개월 이상을 준비(낚시)한 것이라 여겨진다.
그럼 실제 공격은 어떻게 들어갈까? 아주 쉽다. HTTP 1.0(RFC 1945) 이나 HTTP 1.1(RFC 2616) 문서 정도면 완벽히 구현된다. 사실 1.1도 필요없다, DoS 공격이면 1.0 스펙이면 충분하다.
이 블로그의 주소는 http://www.rhea.pe.kr/ 이다. 웹브라우저에서 http://www.rhea.pe.kr/를 입력하면 어떤 일이 일어날까?
- 대부분의 웹브라우저는 HTTP와 FTP 정도는 지원한다(GOPHER는 망했고 TELNET은 외부 프로그램을 띄운다.)
프로토콜 접두어를 분석해 각각의 포트(HTTP는 디폴트 80번, FTP는 디폴트 21번)와 데이터 헤더를 준비한다.
이때 주소 끝에 :8080 식으로 포트가 명시되어 되어 있으면 포트를 ":" 다음 숫자로 설정한다.
2) 프로토콜과 명시된 포트 사이의 URL로 connect를 한다. 물론 포트는 위의 내용대로다.
즉, http://news.sbs.co.kr/section_news/news_read.jsp?news_id=N1000617285 라는 URL이 있으면
news.sbs.co.kr 로 접속을 한다. 포트는 80이 되겠다.
3) 다음은 첫번째 "/"부터 마지막까지를 HTTP 헤더로 설정한다.
원래 헤더에는 에이전트 이름부터 여러 데이터들이 있어야 하는데, HTTP 1.0 이라면 기본 요청 헤더만 있으면 충분하다.
GET /section_news/news_read.jsp?news_id=N1000617285 HTTP 1.0\r\n\r\n 이 되겠다.
만약 뒤에 하위 주소가 없다면 단순히 GET / HTTP 1.0 \r\n\r\n이 되는 셈이다.
4) 물론 이때 디폴트 페이지는 요청하지 않았다.
디폴트 페이지를 요청하지 않으면 웹서버는 설정된 디폴트 페이지를 보여준다.
아파치 계열은 index.htm(l)이고 IIS는 default.htm(l)이 된다.
이 과정만 거치면 웹서버는 줄줄이 해당 HTML을 내뱉는다.
이때에는 서버가 클라이언트에게 보내는 HTTP 헤더도 추가된다.
이 과정은 비단 DoS공격 뿐만 아니라 기본적인 HTTP 에이전트나 웹봇, 브라우저를 만드는 기본 (클라이언트)스킬이다.
이러한 네트워크 과정을 라이브러리화 시켜둔게 WinINet 라이브러리이며 WinINet은 쿠키까지 지원하므로 이것만 잘 활용해도 여러가지 멋진 프로그램들을 만들수 있다.
(그래도 한번 이상은 소켓으로 해보는 것이 좋은데 캐쉬와 쿠키, URL 파싱 등 도전해볼 것들이 많기 때문이다.)
위의 과정을 쓰레드로 돌려보면 어떨까?
거기에다가 한명 한명의 힘은 미약하나...100만대 정도 모이면 DDoS가 되는 것이다.
그래서 DoS공격이 가장 초보적인 공격이라는 것이다. 그와 동시에 막기는 힘들다.
이번 공격이 다행인 것은 목적 URL이 프로그램 내에 박혀있어서, 공격받은 쪽 서버는 특정 URL을 바꾸는 방식으로 회피했다고 알려졌다. 즉, mail.naver.com을 mail2.naver.com으로 수정하는 식으로 말이다. 당연히 connect()에서 FALSE 떨어졌겠지.
무엇이든 양날의 검이다. 이렇게 편리한 C/S 기술과 스펙으로 도움되는 유틸리티를 만들 수도 있고 DoS 공격으로도 사용할 수도 있는 것이다. 당연히 개발자들은 월급보다 높은 이상과 비전을 갖고 도움이 되는 일들을 해야 할 것...이라고 적을테니 정부는 개발자들을 선릉, 역삼 근처의 안마로 좀 데려가주시길 바란다. 요즘 장마철이라 다들 몸이 영 찌부둥하기 때문이다.
DoSTest.exe
