分类目录归档:心得总结

身临其境 CISP-PTE

最近报名参加了公司集体组织的 CISP-PTE 学习考证。 CISP 是纯理论考试,CISP-PTE 和 CISP-PTS 则都是实操,后者的难度层次更高。这俩实操型考试的形式非常类似于 CTF 夺旗赛,侦测漏洞后利用工具渗透进测试靶机系统取得 key(对应 CTF 比赛中的 flag)为得分点。 PTE 有 20 道 1 分理论题,5 道一步拿 key 的 “小题”(10 分)和 1 道需由浅入深按步骤获取 3 个 key 的综合 “大题”(每个 key 10 分共计 30 分),70 分为及格线。今年(2023 年)考试时间由之前的 4 小时缩短为 3 小时,并且不允许去厕所,难道之前厕所 py 的现象太过于严重了?

理论问答题比较基础、简单,事先认真看一遍复习题大约能获得 85% 的正确率。但也有一些只能靠死记硬背或者因工作涉及而有着条件反射般的记忆,否则几乎无法现场推测答案——比如问你 Windows 登录密码错误会在产生何种编号的事件?……

考试时是用浑身长满眼睛的特制 “安全” 浏览器以 vnc 的形式登录到考试提供的攻击机环境——安装了扫描(如 nmap 、御剑目录爆破等)、抓包(经典 burpsuite)、注入(SQLmap)还有字典、转码等等很多工具的 Win7 操作系统,靶机和攻击机处于简单的同一 LAN 下,这就为 “反弹 shell” 、 “用 img src 储存型 xss 抓 cookie” 、 “远程文件包含” 等方法提供了网络环境支持。考试全程中攻击机和靶机都不通公网,且考生的操作机也不能以任何形式暂离考试专用浏览器。

第一道小题为 SQL 注入考察,以寻常的登录框起手,此处直接用 SQLmap 可以一步以时间延迟跑出结果,key 藏在文件系统(题目会告诉具体路径)而非数据库中,对于手工做题来说免去了从 information_schema 库中查询结构,上面提到的靶机和物理机间的网络环境简单且稳定,也为 SQLmap 以二分法+ sleep() 函数逐个去试字母提供了极大的有利条件。据其他考生说以 admin’ or ‘1’=’1 万能账密登入后在搜索框也有注入点,将会利用到课上讲过的 union select 联合查询注入的方法,以查询文章列表为例,假设注入点为 www.example.com/article.php?id=1

  • 先用 order by 试出注入点所查询的数据表列数:1' order by 5#(从 1 慢慢往上加,直到页面无任何显示即后台查询出错为止,出错前最后一个数字就是列数)
  • 再判断这些列中有哪些是展示在页面上的 -1' union select 1,2,3,4,5# 如果页面上显示 2 、 4 、 5 那么则只有这些对应的列在查询后被使用(显示出来),-1 则是故意传递的非法值以便查询不到数据 “腾空” 页面。
  • 确定了哪些列会被展示在页面上后,就可以使用 -1' union select 1,2,3,group_concat(select database()),5# 这样的语句来显示出数据库的信息,MySQL 的表和列信息都可以从元数据库 information_schemaselect 取得,就算是文件也可以用 select load_file() 读出。

第二道小题(可能非考试顺序)为命令注入,此题非常像 dvwa 练习场中的 Command Execution,给出目标主机 IP 地址填写框,执行后会调用系统 ping 命令来探测目标主机。那么加入 && || ; 等分隔符都有可能造成 ping 以外的命令被执行。做练习题时发现此类题狗的地方在于底层会屏蔽一些读取 key 文件的关键命令如 cat ls 甚至可能包括空格,要知道一些绕过的 trick 如 tac 、 ca''t 、 ${IFS}代替空格等。

第三小题是文件上传考察,利用 php 遇到合法扩展名文件中 <?php …… ?> 就会执行其中代码的特性,在本该上传图片的靶机上传点中传入内含 php 代码的 “假图片” 。考点在于绕过各种上传限制,可能的限制有:扩展名、 MIME 、文件头等等中的一个或多个,由于是考试所以一定至少有一种可用的方法。找到绕过方法后往 POST body 图片源码中写入早已要求熟记的一句话木马 <?php eval($_REQUEST['cmd']); ?> 后可以直接传入 php 的 system() 方法执行系统命令或使用 webshell 管理工具拿到靶机站点权限。这里如果遇到过滤(如精确匹配 eval),和上述命令执行题一样用一些方法去变形绕过,如 $a = 'ass'.'ert'; ,想来也是 webshell 免杀的一些套路吧。接着直接去找 key 就成了。

第四小题是 php 代码审计,一般不会太过于复杂,但对于 php 的常见函数方法等还是得有所了解。这里遇到了一句代码关键点是: eval("\$o=strtolower(\"$a\");"); ,那么传入参数 a 的时候把前后语句闭合掉,让中间的代码传到 eval 那里执行即可, 如 ");system('pwd');(" ,果然填空游戏啊。

第五题是访问控制题,考察一些 http 头的使用方法,如 X-Forwarded-For 绕过 IP 限制,cookie 中的布尔值绕过权限检查等,很简单,再难也不过涉及一些 base64 编码。但一定程度上有助于初学者理解服务器是怎么 “消化” 客户端所提交的东西的吧。

综合大题,从以往的一些考题来看基本上就和综合渗透比较相似了,但也不会过于挖坑。一般考试题会提供一个独立 IP 地址的仿真站点,用 nmap 可以扫出一些如 ftp 、 http 、 mysql 端口等,从哪里入手就要看扫描结果和个人经验了。考试中 web 服务的登录框比较无解,用目录扫描扫出 phpMyAdmin,使用默认密码直接进去了数据库管理端,在数据库角落获取了 key1;之后进入 user 表修改管理员密码(利用攻击机内工具计算 hash 值填入),再从 web 登入,此后既可以用上传图片马的方法,也可以用 MySQL 执行 into outfile () 方法向 Web 目录写入木马,因为担心后续步骤较多,这里使用攻击机提供的蚁剑连上 webshell,在 web 目录下发现 key2 。做到这一步时我应该是在写图片马时手抖写错,使 php 报错时爆出了 Windows 下 Web 服务的绝对路径(也是获得绝对路径的技巧之一),这才为 SQL 写马提供了可能(SQL 写马需配置支持和知道绝对路径)。使用攻击机工具集已有的 3389 强制打开工具(看了下,实质是写注册表),再用 net user 命令修改 Administrator 的密码,mstsc 登录后在回收站中发现 key3 。

综上所述题目难度都不算大,多刷一些过往考试题,多了解一些 bypass 方法都对通过考试很有裨益。但我觉得最大的收货还是在于明白了一些原理层面的东西,而这些东西,可能平时往往因为手头 “差生文具多” 般眼花缭乱的工具而最容易使人忽略的——漏洞和问题的本质。这些本质性的东西可不会管你是什么最好的语言还是冒着热气的语言的。懂得了原理,是脚本小子还是手搓 poc 其实又有什么关系呢。

眼见不为实,curl | bash 带来的安全问题

之前在 timeline 上看到一篇 2016 年的老文章 Detecting the use of “curl | bash” server side档案馆备份),指出从服务器端可以检测出客户端是在用 curl 拉脚本还是在用 curl | bash 边拉边执行。如果检测到后者,可以返回不同脚本的内容以达到 “加料” 的效果。整个 blog 都干货满满,就是很久没更新了,站点开了 HSTS,(2023 年 3 月 12 日后)还不更新证书,正好让我学到了 Chrome(v111)在证书错误且不能跳过的警告界面盲敲 “thisisunsafe” 就可以强制跳过…

HTTP 是被 TCP 一块儿一块儿驮着在服务器端和客户端之间传输的,服务器端和客户端各有一块缓冲区,这里服务器端得先把己方发送缓冲区固定住。脚本的第一行可以用一条比较耗(客户端的)时的命令如 pingfind 等,文章 demo 的 py 脚本中以 sleep 3 为例,在此之后立即输出一大堆 NUL 空字符给客户端(使用 NUL 的原因是不会把命令行或浏览器弄得乱糟糟,但是可以被抓包或 curl --output 看到),每个 chunk 都与当前 Linux 系统的发送缓冲区大小相当,此时:

  • 如果客户端是在用 curl 拉脚本,由于缓冲区大小被定住了,那么每个 chunk 的发送间隔应该差不多,因为不管脚本里面写了什么,curl 只是当文本拉下来;
  • 如果客户端在用 curl 边拉边交给 bash 执行,由于 bash 执行东西是一行一行的,上面的 sleep 3 被拉下来交给 bash 执行要停止传输 3 秒,服务器端就会检测到有那么一个 chunk 传输间隔时间明显超出其他 chunk 。

因为要排除网络波动的原因,demo 脚本中还使用了 numpy 库中的 std 求标准差的方法来进行统计运算,当找到那个偏离平均值很大的传输间隔时则认为客户端在用 curl | bash 。文中也指出客户端可以使用 curl | (sleep 3; cat) 来反制服务器端的上述行为。其实 curlwget 拉下来看清楚再在本地执行就可以应对以上问题。

又是一个连自己的眼睛都不能相信的案例。