본문 바로가기
Linux/SSL(보안서버)

Network-based Origin Confusion Attacks

by aegypius 2021. 5. 25.
728x90
반응형

가상호스트 혼동 공격?!

[ssl:error] [pid 4046] AH02032: Hostname xxx(domain) provided via SNI and hostname xxx(domain) provided via HTTP are different
[ssl:error] [pid 4046] AH02032: Hostname ip(address) provided via SNI and hostname ip(address) provided via HTTP are different

오류메시지는 대략 위와 같은 형태를 띈다. 

SNI로 제공되는 TLS handshake 이름과 HTTP protocol 이름의 불일치를 악용하는 사례라고 하는데..실제로 TLS를 적용하지 않았더라도 공격의 대상이 된다. DNS Spoofing (Cash poisoning)과는 결과가 비슷하다고 볼 수 있겠지만 살짝(?) 다르다.

 

<증상>

예를 들어 mydomain.com을 운영하고 있는데 나도 모르는 wcccc.cc라는 도메인에 접속해도 정상적으로 mydomain.com에 연결되는 것이다. 파밍사이트가 아닌 해당 도메인의 웹서버에 정상적으로(?) 연결이 되며, mydomain.com으로도 연결도 정상이다. 도메인이 탈취되었다기 보다는 기존의 도메인에 새로운 도메인이 얹어진 듯한.....-_-;

한 마디로 동일한 홈페이지에 2개 이상의 도메인이 설정된 것이다. 필요에 의해서 일부러 하나의 홈페이지에 두 개 이상의 도메인을 연결할 수 있지만, 내가 관리하는 도메인이 아닐 뿐만아니라 내가 의도한 것이 아니라는 것이다.

 

<뭐냐?>

낯선 도메인(여기서는 wcccc.cc)의 네임서버를 조회해보면...분명 외부에 있고...내게 권한이 없기 때문에 녀석(?)의 네임서버에 권한을 갖고 접근하기는 어렵다. (해킹해서 날려버릴 수 있다면 ㅎㅎ)

 

<해결방법>

dnssec 등을 설정해서 재미(??)로 테스트해 볼 수는 있겠지만(귀찮다) 어차피 이건 캐시중독, 도메인 탈취랑은 조금 다르다. dig나 nslookup을 때려(?)보면 그저 낯선(?) 도메인의 A 레코드에 나의 웹서버 IP주소가 등록되어 있는 것을 볼 수 있다. 때문에 DNSSEC 로는 해결되지 않을 것 같다.

낯선(?) 도메인의 A 레코드에 나의 웹서버 IP주소가 등록되어 있는 것이 전부(?)이므로.... 웹서버의 설정에서 가상호스트로 등록하지 않은 정보에 대해서 별도의 처리를 해주면 된다. 실제로 내가 설정하고 관리하려는 도메인이라도 네임서버의 설정에서 웹서버로 사용할 호스트에 A 레코드를 통해서 IP주소만 부여하고, 실제 웹서버에서는 아무런 설정을 하지 않았다면 웹서버의 가상호스트 설정 중에서 가장 상위의 첫 번째로 연결될 수 있다. 이때 유용하게 사용할 수 있는 가상호스트의 지시어로 _default_가 있다. 

사용예는 아래와 같다.

<VirtualHost _default_:80>
   DocumentRoot /var/www/html/default
   ErrorLog /var/log/httpd/default_error.log
   CustomLog /var/log/httpd/default_access.log combined env=!loopback
</VirtualHost>

<VirtualHost _default_:*>
   DocumentRoot /var/www/html/default
   ErrorLog /var/log/httpd/default_error.log
   CustomLog /var/log/httpd/default_access.log combined env=!loopback
</VirtualHost>

 

위의 첫 번째 블럭은 80포트로 요청된, 가상호스트 설정이 되어있지 않은 모든 값(도메인)을 DocumentRoot에서 지정한 디렉토리로 설정한다. 두 번째 블럭은 모든 포트에 대한 동일한 설정이다.

그리고 _default_ 대신에 와일드카드(*, asterisk)를 사용할 수 있다. _default_는 설정되지 않은(어디에도 속하지 않는 누락(?)된) 가상호스트에 대한 설정이라면, *(와일드카드)는 모든 가상호스트에 대한 설정이다. wildcard는 asterrisk의 alias입니다. - from apache documents (2024-02-02)

<참고자료>

http://antoine.delignat-lavaud.fr/doc/www15.pdf

 

https://hackerone.com/reports/501

 

The Internet disclosed on HackerOne: TLS Virtual Host Confusion

I am a security researcher at INRIA Paris in team PROSECCO (http://prosecco.inria.fr) We have been investigating a new class of attacks against the deployment of TLS on the Web. The main idea behind these attacks is that when two servers host different dom

hackerone.com

 


위의 두 번째 링크에서....유튜브 영상을 보고......내가 생각했던 것과 약간 방향이 다르다는 것을 인지했다. (나중에 한가할 때 봐야지...라고 생각했다가 열흘이 지나서야 대충 훑어보고 나서...뭔가 잘못되었다는 것을 깨닫게 되었다.) 첫 단추를 잘못끼운...그래서 방향이 많이 틀어져버린...포스팅이 되었고.....완벽한 해결책은 이미 발표되었지만...개인적으로 쓸모있는 구석(?)이 있다고 판단하여 글은 계속 보관할 생각이다.

728x90
반응형

댓글