DEV/Hobby

GoodbyeDPI- Passive Deep Packet Inspection blocker and Active DPI circumvention utility 살짝 뜯어보기

MasterJ 2020. 7. 3. 15:01

지극히 개인적이고,  관심이 없는 사람이 많을 거 같은 

Deep Packet Inspection Blocker 우회 프로젝트   

한글로 깊숙한 패킷 검사 막기

 

goodbyedpi 프로젝트를 뜯어보기로 했다.  

(github master brance 기준 Date:   Sun Mar 8 14:38:40 2020 +0300)

 

 

시간이 남아돌아서도 아니고,  대충은 알지만  뜯어보기라니...

 

SNI의 개념부터 알고 넘어가 볼까? 

 

 

SNI(Server Name  Indication)은 TLS 프로토콜의 확장 표준

SNI Detection 이란 말 그대로 서버 이름 필드를 확인해서 필요하면 차단하는데 이용하겠다는 것.

 

TLS 표준을 보면 https 통신을 하더라도 handshack 해서 데이터 암호화 기준값(키값) 만들고 주고받고 

해서 https 통신 데이터는 암호화로 보호를 받는데 서버에 주고받는 데이터 값 중 SNI(Server Name Indication)에  서버 이름 이 평문으로 주고받는다 (이 부분은 암호화하지 않음) 

 

이렇게 노출되는 서버 이름 부분은 웹서버(서비스)마다 고유하며 어쩔 수 없이 ISP(인터넷 서비스 사업자-공급자) 부분에서 차단이 가능한 구조다.

 

야 그럼 ISP 안 통해서 그냥 바로 접속하면 안 됨?이라는 궁금증이 생기는데 아이피를 할당받고 인터넷 공인 망에 접속 한순간부터 어떤 사업자의(국내)  ISP 아래 존재하는 거니 일반적인 방법으로는 불가능하다

 

 

일반적이지 않은 방법에 대해(자유는 어디에?)

공인 망 네트워크를 사용하면서 일반적으로 웹서비스에 접근하는 게 아닌 다른 방법은

VPN, 이 가장 대표적이다. 이참에 얘기할껀아니고 

지금 뜯어보고 싶은 GoodbyDPI

 

 

Github 그리고 불곰국 

개발자들의 놀이터 중 한 곳인 Github 누구는 SNS니 별말을 다붙이지만 뭐 놀이터라는 생각이 더 강하다 적어도 나는

누구에게는 포트폴리오가 되고, 협업의 공간이며 저장소이고 등등 

 

프로필부터 남다른

github프로필 대표 이미지다..  국적은 러시아, 회사는 ProstoVPN이라는 곳을 근무 중  VPN회사구나..

 

GoodbyDPI

프로젝트 링크 github.com/ValdikSS/GoodbyeDPI.git

 

ValdikSS/GoodbyeDPI

GoodbyeDPI—Passive Deep Packet Inspection blocker and Active DPI circumvention utility (for Windows) - ValdikSS/GoodbyeDPI

github.com

 

프로젝트 README.MD를 보면 

kudos 부분을 보면 WinDivert 프로젝트에 대한 감사 명목으로 언급이 되어있는데 이 프로젝트는 

아래처럼    윈도에서 네트워크 필터 드라이버를 추가해 외부 프로그램에서 패킷을 조작 후 다시 내보내는 기능을 구현할 수 있도록 돕는다. 사실 이 부분이 기반 프로젝트이다.(텃밭 수준)  이 프로젝트는 깃허브에서 1만 이상의 스타를 받은 유명한 프로젝트다 나도 알고 있으니.

 

WinDivert 프로젝트 내용  이런 느낌을 정리된거보면 이상하게 좋아

다시 본 프로젝트로 돌아와서 

README..... How does it work 

How des it work 친절해

Passive DPI 

패시브 패시브 스킬 이다. !!!!

SNI Detect Block을 통해 DPI HTTP 302 Redirect 웹페이지 차단 패킷이 오면 패킷의 IP identification field 값이 0x0000 또는 0x0001 이 채워져 온다는 이야기 해당 패킷이 오는 경우는 GoodByeDPI에서 드롭시켜버린다 

실제로 SNI Detect Block 기능은   차단하고자 하는 사이트에 접속하면 해당 사이즈 웹페이지 데이터보다 ISP 단에서 Wanning 블라블라 사이트로 리다이렉트 시키는 패킷을 먼저 보낸다 당연히 사용자 입장에서는 무방비상태로 차단 안내 페이지로 강제 리다이렉트 되고 그다음 원하는 목적지 웹페이지를 볼 수 없다. 

 

 

Active DPI

README에서도 언급한 내용이지만 써본다 

   

  • TCP-level fragmentation for first data packet
  • TCP-level fragmentation for persistent (keep-alive) HTTP sessions
  • Replacing Host header with hoSt
  • Removing space between header name and value in Host header
  • Adding additional space between HTTP Method (GET, POST etc) and URI
  • Mixing case of Host header value
  • Sending fake HTTP/HTTPS packets with low Time-To-Live value or incorrect checksum to fool DPI and prevent delivering them to the destination

7가지의 기능을 사용

  TCP 레벨 데이터 패킷 조각화

   HTTP세션을 위한 지속적 TCP 레벨 조각화

   Host Header 데이터 hoSt로 수정

   Host Header 이름의 빈 공간을 삭제

   GET, POST와 URI에 공백 추가

   Host Header 값 대소문자 혼합

   TTL, CheckSUM 등을 조작하여  DPI를 속임

 

주요 기술적인 부분은 생각보다 다양한 변수에 대응하지 못할 ISP의 DPI 기능의 취약점을 이용하고자 헤더를 변조하는 것이다.  크게 데이터 자체를 훼손하는 게 아니라 ISP DPI 기능은 정적인 필터를 거치도록 되어있기 때문에 다양한 패턴을 잡아 내기에는 다소 무리가 있다. (일반적 성능장애, CheckSum Error, static text 기반 필터) 그러한 취약점을 공략해 회피한다.

강제 리다이렉션 드롭만으로도 절반은 성공이라고 본다 (나는)

 

Source Code

GoodByeDPI 프로젝트 소스보기

심플한 구성 GoodByeDPI
Main을 보자

간단한 폼은 WinDrivert 서비스 동작 유무 판단 후 

 

나가는 놈 들어오는 놈 있는지 본다

뱅뱅도는 패킷 너만을 기다려

패킷의 타입별 파싱 

딱걸리기만해, 노력이 대단하다

 

리다이렉트 패킷을 확인해  should_reinject  값을 0으로 설정하면 재전송을 하지 않기 때문에 자동적으로 드롭된다.

Drop it!

is_passivedpi_redirect 함수는  HTTP 상태 코드 302 301 응답 패킷이면서 기존 연결에 대한 차단과 http주소 메시지가 있는지 확인한다.

is_passivedpi_redirect

 

이제 OUTBOUND에 대한 패킷 변조 작업이 진행되는 부분이다. 

잘못된 ttl 값을 전송하는 부분 컨디션 체크 부분 \x16\x03은 ttlhandshke 하는 부분을 구분하기 위해로 보인다.

    아웃바운드로 호스트 헤더 전송 중 여부를 확인 후 잘못된 ttl값을 전송한다 ttl을 변조해서 보내면 체크섬 규칙에 위배돼 DPI 차단시스템에서 혼란이 올 수 있다.

 

** (작업환경이 바뀌어서 소스 스크린숏 스타일이 좀 바뀌었다)

지속적인 http세션의 연결유지를 위해서 새로운 세션을 생성해 기존 조각낸 http 세션 패킷 데이터와, 오리지널 세션 사이즈로 나뉘어 

전반기 후반기로 나누어 보낸다 전반기만 보내도 상관없다고 주석으로 쓰여있는데 안정적인 http 세션 연결을 위해서라고 한다.

ttl값을 조정한 http 패킷 데이터를 보낸 직후라 안정적인 http 세션 유지를 위한 조치라고 생각된다.  ttl_of_fake_packet 같은 경우는 최근에 추가된 기능의 일부분이다. 

 

*호스트 대소문자 MIX 옵션에 의해 동작하는 호스트 주소변경 코드

대소문자를 변경한다

 

*헤더에 들어가는 "Host:"  텍스트를  "hoSt:"로 치환한다 

치환코드

간단한 코드이지만 상당이 의미 있는 기능이다.

 

*호스트 헤더 정보에 space 띄어쓰기가 존재한다면 해당 부분을 삭제한다.

수정후에 패킷이 유효할려면 체크섬을 다시 갱신해줘야한다. 모든 패킷이 체크섬유효성을 깨트리면 안된다. 섬세한 녀석

* 옵션으로 요구한 http TCP 패킷 데이터 조각화를 요구한 사이즈 기준으로 수정한다. 

패킷 WindowSize 수정으로 수신처/클라이언트 부분에서  전송 측에 수신 가능한 조각 단위를 알린다.

패킷을 수정하면 그에맞는 체크섬을 다시계산해준다

* UDP Redirection 패킷을 수신했을 경우 DNS 패킷은 일지 후에 src dst IP 주소를 현재 연결되어있는 DNS 주소로 대체한다(현행 유지)

OUTBOUND INBOUND 둘 다 해당된다.  당연하지만 체크섬 값을 다시 계산해준다.

INBOUND
OUTBOUND

* 재전송(reinject 재주입) 시 필요시 체크섬 재생성 코드 

GoodByeDPI의 거의 마무리 다

전송할것인지 그전에 체크섬을 갱신할것인지 컨디션에 따라 작업한다

 

* 내가 생각하는 그것

GoodByeDPI를 가끔.. 사용한다. 윈도에서는 이만한 오픈소스 프로그램이 없고 그 외는 VPN을 사용해야 한다고 보면 된다.

 

특정 DPI 만을 막기 위해  대비해서 만든 것이 아니라 여러 가지 기능을 지원하고 있지만.  정책에 맞춰 다시 업데이트되는 DPI 시스템에 맞춰 새로운 기능이 필요할 것이다.  예전에 fork 받아놓았던 기준 대비 많은 업데이트가 이루어져 있었다. 아직 활발하게 업데이트되고 있어 활용하는 데에 장애를 느낀 적은 없다.

 

재미 삼아서 소스를 간단히? 보았는데 나름 성취감이 조금이나 있는 거 같다.  다른 이들이 많이 봐줬으면 좋겠다...

 

'DEV > Hobby' 카테고리의 다른 글

레고 부품이 .. 없네 ?  (0) 2020.07.29
PICO 3D sondori pico 슬라이서 툴 팁  (0) 2020.07.24