어릴 적 무선 신호는 제가 정말 신기하게 생각했던 것들 중 하나였습니다.
서로 전선을 통해 연결되어 있지 않아도 전화할 수 있고, 초인종을 누를 수 있고, 블루투스로 사진을 주고 받을 수 있다는 것이 정말 신기했었습니다.
어렸을 때(지금도 충분히 어리지만) 한번은 닌텐도 Wii 리모컨을 두꺼운 이불 속에 말아 넣어 둔 상태에서 손만 넣고 버튼을 눌러 본 적이 있었는데, 지금 생각하면 당연한 것이지만 당시에는 적외선 리모컨과는 다르게 장애물이 서로를 가리고 있어도 잘 작동되는 것을 보고 신기해 했었던 기억이 납니다 ㅋㅋㅋ
물리를 조금이나마 알게 된 지금은 그때보다는 덜하지만, 지금도 때로는 변조된 전자기파를 매개로 통신을 할 수 있다는 사실이 새삼 신기하게 느껴지는 때가 있는 건 여전한 것 같습니다.
이러한 무선 통신은 아시다시피 생활에서 정말 많이 활용되고 있고, 그 분야와 통신 규격은 셀 수 없이 많습니다.
대표적인 표준 규격만 예를 들자면 FM, TV, 무전기, 교통카드, 출입 카드(ISO-14443A), Wi-Fi, Bluetooth, NFC 등이 있겠고 비표준 프로토콜이 포함된다면 더 많겠죠
이러한 무선 통신에서 발생하는 원시적인 문제점은 기본적으로 전송 경로를 파악할 수 있는 유선에 비해(선로 중간에서 발생하는 물리적 공격을 제외한다면) 데이터의 송신자를 신뢰하기 어렵다는 것입니다.
즉, 이 말은 누군가 중간에서 전파를 가로채(수신해) 그대로 재전송하기만 해도 수신측에서는 별다른 검증 절차가 없는 한 그대로 공격자에게 당할 수 밖에 없게 됩니다.
이 취약점을 가진 장비는 우리 주변에 꽤나 많으며 우리가 쉽게 접할 수 있는 무선 자동문 스위치, 무선 초인종, 자동차 키, 무인 주차장 리모컨, 식당 호출벨, 무선 마이크, CB/업무용 무전기 등이 대표적인 예시입니다.
그리고 이들 기기의 공통적인 특징은 통신 과정에서 데이터나 통신 방식에 별도의 보안 레이어 없이(예 - 데이터: OTP 방식 데이터 암호화, 통신 방식 - 롤링 코드, 주파수 호핑), 무선상으로 순수 데이터를 그대로 주고받는 경우가 대부분이라는 것입니다.
그런데도 해킹이 잘 일어나지 않는 이유를 물으신다면? 당연히 해킹 자체가 어려워서는 아닐겁니다.
일반적인 사람들은 생활 속에서 자신이 매일 접하고 사용하는 기기들이 무선으로 작동하는지 아닌지조차 생각해 본 적이 없을 뿐더러,
알고 있는 소수의 사람들 또한 굳이 돈과 시간을 들여 분석할 만한 가치가 없다고 생각하기 때문일 것입니다.
물론 이는 어디까지에 위에 예를 들어 보여드린 소규모 무선 기기들에 한한 것이고, 대중적으로 사용되는 광대역 무선 통신망인 LTE, WCDMA나 Wi-Fi 등 상용 무선 통신 기술들은 전 세계 어느 지역에서나 흔히 사용되므로 보안 취약점에 관한 연구도 활발히 진행되고 있고 해당 규격을 지속적으로 유지/보수하는 기관이 존재합니다.
예를 들어, 와이파이의 경우 Wi-Fi Alliance, LTE의 경우 3GPP(클릭 시 위키백과 문서로 이동)라는 기관이 바로 그러한 역할을 하는 기관입니다.
특히 와이파이는 요즘엔 냉장고나 청소기같은 가전제품부터 싸구려 장난감 드론에도 탑재되는 시대이니, 공격자/방어자 진영 모두 정말 활발히 관련 연구를 진행하고 있을겁니다.
따라서 이번 글에서는 우리 주변에서 접할 수 있는 비면허 무선기기들이 실제로도 보안에 취약한지, 또 실제로도 데이터가 보안 없이 그대로 노출하고 있는지를 확인해보기 위해 라즈베리파이를 이용하여 이러한 무선 기기를 대상으로 리플레이 어택을 실습해 보도록 하겠습니다.
또한, 이어질 본 글의 후편에서는 가상 시나리오를 통해 이러한 문제를 가볍게 여기면 안될 이유와 함께 본 글에서 설명드린 리플레이 어택의 방어 기법에 대해서도 다뤄보는 시간을 갖도록 하겠습니다.
우선 시작하기 앞서, 필요한 준비물은 다음과 같습니다.
1. 리눅스가 설치된 라즈베리파이 (최대 3B+ 까지, 4는 미지원)
2. RTL-SDR
3. 안테나용 암컷 점퍼 케이블 한 개 (단순 실험용이므로 대충 꼽아둘수만 있으면 됩니다)
※ 잠깐 가격대별 RTL-SDR 몇 개를 추천드리자면..
대충 적당히 쓸만한 정도(일반 크리스탈 오실레이터+플라스틱 하우징): https://a.aliexpress.com/_mPiHbkX
나름 괜찮은 정도(TCXO 채용+방열을 위한 금속 하우징): https://a.aliexpress.com/_mNhV7UX
고급(TCXO 채용+금속하우징+써멀패드+전원 노이즈 필터+양질의 부품+4.5V 바이어스 티 지원+HF 대역 지원 등): https://a.aliexpress.com/_m0j5B8B
참고로 요즘은 플라스틱 하우징의 하급 제품들도 R820T2 튜너가 탑재됐다는 점만을 내세워 가격을 꽤 올려둬서 차라리 준고급이나 고급형을 사시는게 가성비로 따지면 더 나을 수도 있습니다.
※ 본 글은 해킹 기법을 다루고 있습니다. ※
오작동 시 타인에게 피해를 줄 수 있는 본인 소유 외 시설물이나 장비를 대상으로 본 해킹 기법을 실습하고자 하시는 경우 해당 관계자에게 사전 동의를 구하시고 진행하시길 당부드립니다.
또한, 본 글에 게시된 해킹 기법을 악용하여 발생하는 모든 문제에 대해서는 본인의 책임이 없음을 미리 알려드립니다.
STEP1.
깃허브에서 rpitx와 rtl_sdr 다운로드 후 설치까지
rpitx(클릭시 github로 이동)는 라즈베리파이를 RF 송신기로 사용할 수 있게 하는 오픈소스 프로그램입니다.
이게 어떻게 가능한 건가.. 해서 간단하게나마 알아본 결과, 라즈베리파이에 내장된 PLL(위상동기회로)가 작동되는 과정에서 의도치 않은 전자기 노이즈가 발생한다는 점을 역으로 이용해 우리가 원하는 의미 있는 RF신호를 발생시키고 이를 GPIO 핀에 연결된 점프선으로 끄집어 내어 방출시킬 수 있다는 아이디어인 것 같습니다.
대충 무슨 의미인지는 알겠으나 구체적인 PLL 제어 매커니즘까지는 모르겠네요..ㅎㅎ
송신 가능한 주파수 범위는 무려 5kHz ~ 1.5GHz 라고 하며, HackRF 같은 전용 SDR에 견줄 바는 아니지만 이를 이용해서 아날로그 FM 방송이나 저속 디지털 데이터 전송도 가능하다고 합니다.
수신이 불가능한 단점은 수신만 되는 RTL-SDR 수신기와 같이 사용하면 나름 극복도 가능합니다. (실제로 깃허브에 이 조합을 이용한 HAM 무전기 프로젝트도 있더군요 ㄷㄷ)
가장 중요한 가격도 라즈베리파이 45,000원 + RTL-SDR 12,000원 = 57,000원으로 저렴한 가격입니다.
그리고 이건 좀 중요한 문제인데.. rpitx 깃허브 페이지에서도 안내하고 있듯, 허가되지 않은 주파수로 송신하는건 우리나라를 포함한 대부분의 국가에서 위법 사항으로, 정말정말 운이 없으면 이동식 전파 단속에 걸릴 수도 있기 때문에 ISM 밴드 외의 주파수로 너무 오래 송신하시는건 그다지 권장드리지는 않습니다. (출력은 10mW 정도라고 하니 ISM 밴드로 송신하신다면 출력 제한 기준은 다행히 크게 신경쓰지 않아도 될 듯 합니다)
그리고 rpitx는 PLL로 발생 가능한 최대 주파수 이상의 신호로 송신할 때는 하모닉을 이용하고 있으니 단순 실험용이 아니라 이를 제대로 활용하고자 하는 생각이 있으시다면 콩밥을 피하기 위해 원하는 대역의 밴드패스 필터를 다는 것을 강력!! 권장드립니다.
사실 이렇게까지 지저분한 방법을 사용하는 이유는 필자가 HackRF조차 구매할 여력이 없는 가난한 고딩이라서 그렇습니다 ㅠㅠ
1-1. rpitx 설치
git clone http://github.com/F5OEO/rpitx
cd rpitx
./install.sh
우선 라즈베리파이에서 적당한 경로에 git 명령어를 이용하여 rpitx 소스를 다운로드 받습니다.
다운로드 후 rpitx 디렉터리 안에 위치하는 install.sh의 설치 스크립트만 실행하시면 알아서 설치가 진행됩니다.
중간에 '/boot/config.txt' 파일을 수정하겠냐고 물어보면 'y'를 입력하시면 됩니다.
설치가 완료되셨다면 터미널에서 rpitx를 입력했을 때 실행되는지 확인해 줍니다.
위처럼 rpitx의 옵션 목록이 표시되면 완료된 것입니다.
1-2. rtl_sdr 설치
rtl_sdr를 이용하면 RTL-SDR에서 원하는 특정 범위 주파수의 신호를 수신받아 I/Q 신호(복소 신호) 형태로 저장해줍니다.
굉장히 생소한 개념이라 어려웠는데, 이 개념에 대해 잘 설명해주신 분이 있어 해당 글의 링크를 걸어드립니다. (클릭 시 새 창에서 열립니다)
I/Q 데이터는 처리되지 않은 원본 전자기파의 형태 정보를 기록한 데이터라는 점에서 SDRsharp, GQRX와는 약간 다릅니다. 비유를 하자면 카메라에서 무손실 RAW 포맷 정도의 느낌으로 생각하면 될 것 같네요.
그리고 '원하는 특정 범위 주파수'라고 말씀드렸는데, RTL-SDR의 심장인 RTL2832U ADC 스펙에 따르면 안정적인 최대 동시 수신범위는 2.4 MHz (2.4Msps), 일정 손실을 감수한 하드웨어상 최대 범위는 3.2 MHz (3.2 Msps) 라고 합니다.
이건 추후 rtl_sdr의 옵션에서 지정하실 수 있습니다.
git clone git://git.osmocom.org/rtl-sdr.git cd rtl-sdr mkdir build cd build cmake ../ -DINSTALL_UDEV_RULES=ON make sudo make install sudo ldconfig cd ~ sudo cp ./rtl-sdr/rtl-sdr.rules /etc/udev/rules.d/ sudo reboot
나중에 작동하지 않게 될 수도 있으니 원본 링크를 첨부합니다. (클릭 시 이동)
재부팅까지 하셨다면 rtl_sdr을 입력하셔서 설치되었나 확인해 보시면 됩니다.
STEP2.
타겟 장비의 통신 주파수 찾기
다음은 타겟이 될 장비가 통신하는 주파수를 알아내야 합니다.
보통 출력이 10 mW이하인 소출력 무선기기들의 주파수는 433MHz 전후 대역대를 많이 사용합니다. (다만 국내의 경우 433 MHz 대역이 이미 할당되어 있어 447 MHz 대역을 주로 사용합니다)
이 대역 주파수는 ISM 밴드라는 명칭으로도 불리며, Industry-Science-Medical 의 줄임말로써 해당 용도로 자유롭게 허가된 대역입니다.
사실 이름은 저렇지만 용도를 엄격히 규정해 둔 건 아니어서 무전기, Wi-Fi 공유기 등 대부분의 비면허 무선기기들이 이 ISM 밴드로 불리는 주파수 대역을 사용합니다. (다만 와이파이는 443MHz 대역이 아닌 2.4GHz 와 5GHz의 별도 할당 ISM 대역이 존재하며 출력 제한 기준도 약간 다릅니다)
저는 제가 거주중인 아파트의 1층 공동현관에 설치된 자동문 무선 스위치를 타겟으로 정했는데요,
저처럼 타겟 기기를 정하셨다면 이제 이 제품들을 본인의 검색실력을 동원하여 제품 사양을 찾아내시면 됩니다.
제품 정보를 찾으셨다면 유심히 관찰할 부분은 제품 모델명 or 사용 주파수입니다.
주파수가 기재되어 있다면 해당 부분을 메모해 두시면 되고 그렇지 않은 경우 모델명으로 구글에서 메뉴얼을 찾아 보시면 됩니다.
이제 이 주파수가 맞는지 SDR 수신 프로그램을 이용하여 확인해 보도록 하겠습니다.
만약 잘 모르시겠다면 자동차 키나 무선 마이크를 제외한 기기들은 447MHz 근처일 확률이 매우 높으므로 기기를 작동시키면서 ±1MHz 정도 범위를 기웃거리시다 보면 어렵지 않게 찾으실 수 있을겁니다.
STEP3.
SDR 수신 프로그램을 이용하여 수신 테스트
이제 주파수를 확인했으니 타겟 기기를 작동시켜 정말 사양에 나온 대로 전파가 발신되는지 확인을 해야 합니다.
대부분의 중국발 RTL-SDR은 발진 소자의 품질 문제로 수신상 오차를 나타내는 경우도 있어 유의해야 합니다.
제 경우에는 약 0.025 MHz 만큼 뒤로 밀려 표시되는 문제가 있었는데, 주파수가 조금이라도 틀려지면 레코딩 중 문제가 생기기 때문에 확실히 알아둘 필요가 있습니다.
SDR 수신 프로그램에는 다음 두 가지 프로그램을 추천드립니다.
Windows 사용자 분은 SDR Sharp, macOS, Linux 사용자 분은 GQRX 를 추천해 드립니다. (클릭 시 다운로드 페이지로 이동)
GQRX 기준 프로그램을 설치하시고 아까 메모해두신 주파수로 맞추신 다음, 타겟 기기를 작동시켰을 때 신호가 발생하는지 확인하시면 됩니다.
아까 제 RTL-SDR 에 약 0.025 MHz의 오차가 있다고 말씀드렸는데, 그래서 447.6 MHz에 딱 맞추진 못했네요.
물론 타겟 기기의 주파수가 틀린 것일 수도 있겠지만, 무선기기 허가를 받은 제품인 만큼 화면에서 표시되는 밀린 주파수가 447.6MHz일 것이라는 가정 하에 진행하였습니다. (이후 고급형 RTL-SDR을 구해 테스트해 본 결과 제 추측이 맞았습니다 ㅎㅎ)
신호에서 가장 높은 중심주파수에 최대한 정확히 커서를 맞추신 다음, 그 주파수를 메모하시면 되고 인터넷에서 찾은 주파수와 같다면 안 하셔도 됩니다.
참고로 신호가 솟아오르는 부분이 두 개인 형태라면 주파수 차를 이용해 0과 1을 구분하는 2-FSK로 변조된 신호이므로, 두 주파수의 중앙에 커서를 맞춘 후의 주파수를 메모하시면 되며, GQRX의 경우 마우스 휠을 돌리면 그래프의 확대/축소도 가능하므로 좀 더 피커를 섬세하게 이동시킬 수 있습니다.
STEP4.
라즈베리파이에 RTL-SDR 연결 후 신호 캡쳐
이제 타겟 기기에서 발신되는 신호를 캡쳐하여 파일로 저장해 보도록 하겠습니다.
4-1. 원활한 전파 발신을 위한 와이어 안테나 설치
노트북에 연결하셨던 RTL-SDR을 이제 라즈베리파이에 연결하시고, 라즈베리파이에도 송신 안테나 역할을 할 점퍼선을 달아주도록 하겠습니다.
점퍼선이 없다고 rpitx가 작동하지 않는 것은 아니나, 있는 것이 훨씬 작동 범위가 넓습니다. (없을 경우 반경 1~2미터 정도)
참고로 GPIO 4번은 두번째 줄에서 4번째의 핀입니다. 사진을 참고하세요.
사진 찍는다고 점퍼선을 예쁘게 펴 놨는데 사실 어떻게든 대충 연결만 해 두시면 근거리 (1~20m) 사용에서는 별 차이가 없습니다.
4-2. 무선 신호 캡쳐 및 저장
sudo rtl_sdr -s 250000 -g 50 -f ABC.DEFe6 OUTPUT_NAME.iq
ABC.DEF 부분에 본인이 STEP3 에서 확인하신 주파수를 넣고 (이때 e6는 그대로 둡니다) OUPUT_NAME 은 원하는 캡쳐 파일명을 지정해 주시면 됩니다.
실행하시면 "Reading samples in async mode..." 라고 출력되는데 이 상태가 I/Q 데이터 파일을 기록 중인 상태이므로 이 시점에서 기기를 작동시키면 신호가 캡쳐되는 것입니다.
그리고 I/Q 레코딩은 음성 녹음과 비슷한 개념이기 때문에 너무 미리 작동시키시면 나중에 재전송시에도 그만큼 공백 기간이 있게 되어 다소 불편하실 수 있다는 점도 참고하시기 바랍니다.
작동시키셨다면 Ctrl+C를 입력하셔서 빠져나오신 후, 파일이 지정한 이름으로 제대로 저장되었는지를 확인합니다.
STEP5.
캡쳐한 신호 재전송
sudo sendiq -s 250000 -f ABC.DEFe6 -t u8 -i OUTPUT_NAME.iq
이제 캡쳐한 신호를 재전송해 보겠습니다.
위 명령어를 참고하셔서 캡쳐한 파일을 주파수에 맞춰 입력하시고 엔터만 치시면 됩니다.
그런데 sendiq는 GQRX처럼 시각적인 부분이 없으니 주파수는 맞는지, 송신은 되고 있는지 볼 수 없어 답답할 수도 있습니다.
그럴 때에는 송신시에는 RTL-SDR은 더이상 필요가 없으므로 가지고 나오신 노트북 등이나 안드로이드 폰(아이폰은 USB 호스트 미지원으로 불가능)에 RTL-SDR을 꽂으시고 타겟 기기에서 출력된 주파수와 최대한 일치하게끔 sendiq의 설정값을 조금씩 가감하시다 보면 기기가 작동하는 최적의 값을 찾으실 수 있으실 것입니다.
![](https://blog.kakaocdn.net/dn/ckcVw5/btrcebW31eJ/LmfeKzd42TxOEZcRKUZJR0/img.gif)
이는 sendiq 프로그램과 rtl-sdr 모두 전문적인 장비가 아닌 마개조를 통해 나온 물건이기에(...) 주파수 정확도와 신호 송수신 품질이 전용 SDR에 비해서는 떨어질 수 있기 때문입니다.
캡쳐 데이터에 이상이 없으며 주파수도 잘 설정하셨다면 기기가 제대로 작동하는 모습을 보실 수 있을 것입니다.
이제 기기가 작동하는 모습을 보며 놀라워 하시면 됩니다 ㅎㅎ
이상입니다.
하다 잘 안되시는 부분, 이해가 가지 않는 부분은 댓글로 남겨주시면 아는데까지 답해드리겠습니다.