태어 나서 이처럼 허탈하고 부끄럽게 안타까운 발표를 한 적은 없었던 것 같습니다. 이에 대해 얘기를 한번 해 보고자 합니다.


준비 과정


지인을 통해서 해킹 시연 의뢰가 들어 왔습니다. 높으신 분들도 참석하는 자리에서 사람들에게 재미있는 해킹을 보여 줄 수 있도록 하는 시연을 요구를 하더라구요. 뭐, 처음에는 예전에 해 왔었던 것들중의 하나를 보여 주면 어떨까하고 그냥 쉽게 생각을 했었죠. 그러다가 지금까지 많은 장소에서 사람들에게 VoIP 해킹에 대해서 보여 줬는데, 너무나 많이 발표를 해서 식상하기도 하고 해서, 이번에 공부도 할 겸해서 한차례 더 향상된 모습을 보여 주기로 마음을 먹고 공부를 하기 시작했습니다.


그동안 abstract 수준으로 알고만 있었던 VoIP 암호화(SIP over TLS, sRTP)에 대해서 공부를 하기 시작했습니다. 그런데 처음부터 막히더군요. 아직 VoIP의 암호화는 일반인들에게 널리 보급되지 않은 지라, 관련 테스트 환경을 구축하는 것만 해도 생각보다 시간이 오래 걸렸습니다. Asterisk(이것도 일반 설치를 하면 되지 않고 소스를 받아서 별도로 컴파일을 한 다음에 이런 저런 설정을 많이 바꾸어야 함), openSIPS, PhonerLite, Linphome, Terhai, Media5-fone, 그리고 일부 국내 VoIP 제품들... 많은 Software를 설치해 가며 테스트를 해 보았습니다. 그런데 sRTP 통신이 가능하도록 하는 환경을 구축하는 것이 그리 쉽지가 않더군요. 결국 Blink라는 Application을 다운받아서 테스트 환경 구축에 겨우 겨우 성공을 했었습니다. 이것까지만 하는 것에도 며칠이 걸렸죠. 종호군이랑 밤을 새어 가며 이런 저런 테스트를 하며 겨우 겨우 알아 내었습니다.


아무튼 결국 sRTP 통신을 성공하고 난 이후(패킷을 잡아도 잡음밖에 들리지 않는 것을 확인한 이후), 패킷을 면밀히 분석을 해 보았습니다. 예상대로 SIP over TLS상으로 sRTP 통신에 필요한 key(a:crypto:inline....)를 주고 받는다는 것을 알아 내었습니다. 그리고 그 값(inline)에 master key 및 salt key가 들어 가 있고, 이 키를 알아 내면 암호화된 음성 통신(sRTP)을 해석(도청)해 낼 수 있다는 결론까지 도달하였습니다.  점점 재미가 있어 졌습니다.


"어떻하면 암호화가 탑재된 환경에서 음성 통신을 녹음할 수 있을까?" 고민을 하였고, 그에 대한 대답을 몇가지를 찾았으며, 그중 가장 구현이 쉬운 방법을 채택했습니다. 그것은 바로 중간단(MITM Attack)에서 SIP message의 INVITE과정에서 "a:crypto"가 포함된 라인을 지워 버리는 겁니다. 간단한 기법이죠. 코딩을 하고 나서 테스트를 해 보니, 예상대로 원래 sRTP 통신을 하던 양 VoIP 단말기가 그제서야(우회 공격을 받고난 이후) 평문 RTP 통신을 하게 되었습니다.


그렇게 쾌재를 부른 시각이 발표가 있는 7월 7일 바로 전날 오후 10시쯤. 우회 공격을 막을 수 있는 방법에 대해서 최종 정리를 해서 문서 작업을 마무리하였고, 관련 모듈(시연 프로그램)을 최종 빌드를 하고, 혹시라도 시연이 제대로 되지 않을 경우를 감안하여 동영상까지 찍고, 일을 다 마치고 나니 밤 12시가 넘었습니다. 집에 가기에는 늦은 시각이고, 며칠동안 밤을 새어 왔기 때문에 집에 가면 다음날 발표장으로 올 때 늦을 수 있을 것 같다는 생각에 종호와 근처 찜질방에서 잠을 청했습니다.


발표를 하면서


발표 당일, 역시나 예상했던 대로 시간은 너무나 부족했습니다(저희뿐만 아니라, 다른 모든 발표자분들의 시간도  대략 25분) 일정이 15~20분 늦어 져서, 저희들이 발표할 수 있는 시간은 더욱 부족해 졌습니다. 발표를 시작하고 10분도 안되어서 "빨리 진행 부탁(시연 중심)"이라는 메세지가 적힌 쪽지를 저에게 주더군요. 기분이 몹시 언짢았습니다. 고생고생해서 준비한 발표의 제대로 된 전달이 주 목적이 아니라, 어떻게 하면 빨리 끝내고 그 다음 진행을 늦지 않게 할 수 있느냐, 그게 관건이었다는 느낌을 지워 버릴 수가 없었습니다.


지금까지 발표를 많이 해 왔던 터라, 웬만하면 편안하게 발표할 수 있음에도 불구하고  이상하게도 많이 불안했습니다. 시간은 부족하지, 말은 빨라 지고 있지, 발표도 제대로 되지 않지, 제일 중요한 마지막 시연은 제대로 보여 주지 못했지, 어쩔 수 없이 전 날 찍었던 동영상을 플레이하기로 했었는데, 허걱... 엉뚱한 동영상의 재생(이건 전적으로 저의 실수)... 진행자는 빨리 끝내라고 하지, 기자는 사진 찍을 테니 포즈를 취하라고 하지, 시연은 제대로 안되지, 제대로 진행이 되지 않으니 머리 속은 그야 말로 백지장이 되어 있지... 그야말로 생애 최악의 발표였습니다.


지금까지 수많은 발표를 하면서 이렇게까지 발표 시간 지연에 대한 압박을 받아 본 적은 처음이었습니다. 또한, 해킹 시연을 하게 되면, 일반인들에게 "위험하구나, 보안이 허접하구나" 라는 분위기만 조성되어 질 수가 있기 때문에, 이러한 취약점에 대해서 어떻게 대처를 하는 것인가에 대해서 같이 논의를 해 보는 것도 중요한 과정 중의 하나입니다. 그런데, 이러한 얘기를 할 시간조차 허락되지 않더군요. "시연만 보여 줘라, 그게 너네들이 할 일이다" 완전 이런 분위기였습니다. 뭐랄까요, 저희들이 해킹 시연을 통하여 그들만의 잔치에 흥을 돋구는(쇼만 보여 주는) 꼭두각시가 되어 버린 듯한 느낌이랄까요? 


발표가 끝나고 나서 화가 무지 났습니다. 나 자신에게 화가 나고, 주위 사람에게 화가 나고, 턱없이 부족한 시간의 압박만 가하고 있는 행사 운영자들에게 화가 나고... 아직까지 그러한 울분이 삭혀 들지가 않네요. 결심했죠, 다시는 이런 해킹 시연 의뢰는 절대 받지 않겠노라고...



에필로그



그래도 하나 얻은 게 있다면, 이번 발표를 준비하면서 Secure VoIP에 대해 테스트 환경을 구축하고, 코드를 리뷰하면서 관련 분야에 더욱 흥미를 가지게 되었다는 점입니다. 종호랑 얘기를 했죠, 이대로 끝내기에는 지금까지 고생한게 너무 억울하다, 한번 끝까지 해 보자구요. 기술적으로 언급을 하자면 SIP over TLS를 SSL Proxy를 통해서 SIP message를 알아 내고, 그 안에 있는 key 내용을 알아 낸 다음에, 실제 sRTP 프로토콜 통신을 실시간으로 해독하는 것까지 구현해 보는것입니다(물론 이것도 client 및 server 양단에서 인증서 관리 및 검증 절차를  철저히 하면 무용지물이 되겠지만). 아마 올해 가을이나 겨울때까지는 관련된 모듈(프로그램 및 문서)을 제대로 정리를 해서 발표를 할 생각입니다.


준비 과정이 길고 어렵고 힘들었던 지라, 그만큼 애착이 가는 발표였음에도 불구하고 제대로 된 내용을 전달하지 못한점은 정말 안타깝습니다. 왠지 모르게 개발자의 자존심 때문에 하루 종일 우울하군요.