将曾经做过的netforce的题目一并整理到这里来.
顺带一提,wechall的account link功能挺不错的
Training - Nice include system
从标题到url,无不透着一股提示的味道.
瞄一眼url,就能看出这个网页的后台语言是php.include无疑指的就是php的include函数.该函数的作用跟c的include差不多,就是把一个文件包含进当前文件当中.而总有那么些程序员,它们会把include的参数用get的方式提交.这就给了心怀不轨的人一个机会,一个自由访问任何能想的到的文件名的机会.
由于提示已经给的很明显了.我们只要把url中参数的值改成/etc/passwd就可以了.成功~于是就看到了这个文件的内容.很容易找到目标:netforce.我们知道,passwd当中的值都是加过密的,为了解密,只要把得到的hash扔进john the ripper 里就好了.它会自动识别并破解的.于是就得到了想要的结果.
Oops, a typo…
这道题嘛,已经把流程都设计好了,直接跟进就好.
点进第一个链接,发现它写着一堆东西,大概意思是只能用特定ip访问.一开始我的思路被误导到了,要修改自己的ip发http包这个方向上.
然后发现好像没那么复杂,上面那句”undefined”隐约暗示着,这个所谓的ip可能仅仅只是一个php的变量而已.于是,尝试着在url的后面加上ip=213.75.238.147这样的参数提交上去.
果然顺利搞定第一个障碍.
点进第二个链接,发现只显示了个Access Denied
瞄了一眼参数,还是很明显,把denied这参数去掉就好了.
小提醒一下,貌似这个网页有个自动跳转机制,因此建议以curl来访问,能看到跳转的全过程,不会忽略重要的细节.
然后就能看到一个叫做show=no的参数
那么很果断,把show改成yes吧.
终于,看到了最后的密码.
Source Cooking!
该网页提供了一个可以浏览源代码的链接,然而它做了一定限制,只允许访问html文件的源代码.
而我们要寻找的点,无疑是在challenge.php这个文件当中
于是问题的关键就在于,怎么查看challenge.php的源代码,又让php认为它是一个.html文件.
首先不断测试url的值,可以发现source.php的行为大致是,首先判断文件是否存在,再判断后缀名,再读入文件或显示错误.
为了达到上述的欺骗效果,需要了解php的一个bug:nullbyte.
php用c语言实现,因此很多地方,会受到c的字符串风格的影响,将\0视作字符串的结尾.经过测试,不是所有的地方都会有这个问题.echo,字符串比较等都不会有这个问题,然而涉及到用字符串作参数,操作文件的时候,往往会受此影响.
比如判断是否是文件的is_file函数.
于是构造url=challenge.php%00.html 就可以顺利获得challenge.php的内容.
了解到,只要将NetForce的MD5在cookie里提交上去就可以获得密码了.
P.S.在这里出了一些小问题,linux自带的MD5sum和python的hashlib的计算结果不同,结果证明python的计算结果是对的,我一下子也搞不清楚是怎么回事.
Hiding in a pipe…
点进链接之后,可以看到三个输入框.大概尝试了一下,就是分别执行了label标注的那几个命令.看到这种输入,我果断尝试了用分号和&&的方法,尝试注入另外一个命令,然而没有成功.由于题目里已经很明确提到了pipe,用管道再尝试.试了很多个命令都显示command not found.只有ls和cat成功了.
尝试cat /etc/passwd,没权限.尝试ls当前目录,找到了一个加密的需要密码访问的文件夹,和一个表明已经过了第一关的txt.然后再次陷入困顿.
然后好像哪里有点不对劲,我用finger的命令自带的那个user和空密码顺利访问了那个文件夹,然后在里面找到了密码.第一次尝试提交不成功,因为我没把后面的叹号一起复制进去
可问题是,为什么forum里面他们谈论起这道题给我一种很高深莫测的感觉,是题目改了还是我走了什么错误的捷径?
UNION makes FORCE
说起来,这道题其实挺坑的.由于提供了源码,一看就知道这道题肯定是sql注入.当我随手测试了一下这个注入点,却发现无论我怎么修改自己的查询语句,总是显示语法不正确.对照着以前的程序和mysql的书,百思不得其解,什么莫名其妙的状况.
后来在forum里面看了很多,虽然还是没思路,但总算知道了事情的真相是,这后面并没有一个真正的mysql服务器,只有一个模拟的程序,因此对于不是很接近答案的结果,它都会显示错误.
不再去考虑语法错误,可以正式开始思考这个问题了.
我们要做的事情是:使得password的md5hash与查询出来的第一条语句的结果相同.然后,再考虑题目里就有union,采用union查询已经无可非议了.
由于我们不知道数据库里任何一条内容,也不太可能知道,唯一的方法便是我们自己去生成这么一个MD5.与自己输入的password相匹配即可.
我组织了一条这样格式的语句: ‘ union select (….) from users where ‘’=’ , 括号里的内容是一个password的md5hash
还是语法错误,我有点困惑了.很快发现,右下角还有一条注释,要求语句最短.我想了想自己好像忘了在md5外面加上引号,于是修改成了:
‘ union select ‘…
最大限度精简了语句,也利用上了原本自带的单引号.顺利通过.
SeSSxploit
这道题其实说难不难,由于提供了全套的源代码,所以只要阅读并理清思路就好。
从代码中可以明显看出服务器的php打开了register_global的开关。这个东西在php5.3已经被废弃了,效果是将所有get,post什么的参数都注册为全局变量。这也就提供了一个hack内部变量的接口。
由于要求是将Data[‘level’]的值修改成八,hack无疑从Data入手。不明觉厉的是,我用get提交Data=8之后,竟然直接就过了。接下来实验了一下,不管提交Data=什么都会被注册到level那里,弄得我很困惑。如果有人弄明白了一定告诉我。
Step by step
这道题似乎挺丧心病狂的,我开始做的时候查看了一下数据,只有13个人通过了它,而且上一个通过的记录已经是在三年前了……
第一个登陆框,一开始我以为是sql注入,多番尝试无果。仔细想想,没有错误显示,如果要sql注入的话只能基于时间盲注,搜索量似乎有点大。毕竟对于任何信息一无所知。
然后在胡乱尝试的过程中,发现输入guest和admin作为账户的时候,提示是密码错误而非平时的账号密码错误。无疑证明这两个账户是存在的。
admin/admin尝试未果,guest/guest一遍成功。只能说永远不要忘了最简单的弱口令逻辑错误。
登陆进去以后,根据它是提示可以看到,用setup和admin登入可以创建新账号。
用setup登陆提示,setup账户被config.php禁用。访问config.php显示空白。
在登陆进去的界面把secure后缀去掉,发现可以看到LeetSS目录下的所有文件列表。在readme文件夹可以看到leetSS的一系列信息,不知道是否有用。
明显有用的一个文件是:basic_functions.inc,一个完整的php函数文档。
观察secure页面的源代码,找到如下一句被背景图片覆盖的“/home/www/net-force/challenge/level407/LeetSS/secured/userpages/193715251C371040.inc”
尝 试可以得知,该文件夹无法访问,只能访问该.inc文件。这个似乎就是访问secure出现的页面的源代码。 用basic_function.inc当中的SimpleEncode函数对admin加密,发现加密出来的结果为:1816112D1A163840。与193715251C371040的格式相当接近。 尝试加密guest,果然就是193715251C371040,于是可以猜想另一串数字就是admin的网页。
访问该网页,没什么有价值的内容,大致是admin的密码就是我们需要的最终答案。
尝试加密setup:1C3615341D170040。访问对应网页,找到一个setup/,和setup的密码setuppassword
考虑到denyAccessToSetup这个变量控制了setup是否可以登陆。可能能通过get方法注入该参数。很不幸,尝试在post参数中注入失败。仍旧无法登陆。
<b>Notice</b>: Use of undefined constant user - assumed 'user' in <b>/home/www/net-force/challenge/level407/LeetSS/secured/userpages/193715251C371040.inc</b> on line <b>3</b><br /><br />
将注意力放到secure页面上面这句话当中,显然在这句话中使用了一个未定义的常量,而php自动采用了xxxx.inc当中定义的那一个。
回忆在xxxx.inc当中看到的, $username = $_SESSION[$sessionDataName][user][“name”]; 这里的确有一个定义的常量,可以猜测它是在登陆时定义的。
由于这里产生了作用域的问题,可以考虑能否用一个更高优先级的user覆盖掉另一个user。寻找无果。
考虑phpsessionid注入的方法。几次登入登出查看PHPSESSIONID,恐怕其并非可以注入。
简单来说,其实我还没搞定啦。
Training - Can you see me?
net-force上的stegano入门题, 查看反白后知道有password.gif这样一张图片,下载后cat得到密码
Go Holland Go!
不要想复杂了, 其实是跟色弱测试差不多的东西
Another picture!
xxd拉到最后看见二进制串, 然后就没有然后了
Words, words, words…
The password that You Need for the challenge page is Again, 跳过三个单词读即可
Nice colors eh?
用stegsolve打开,查看其颜色通道组成的信息, 会发现一个单词: aapjes
Just a flag…
首先解析这个ico,发现里面藏着zip文件, foremost之. 随后发现zip有密码, 一开始以为是假密码…结果发现是真的,fcrackzip之, 很快就出来了
Learn See Become
题目这三个单词的首字母缩写,是LSB
How good are your eyes
最近一段时间做了不少netforce上steg(隐写)方向的题目,感觉在这方面的功力有一点长进.然而碰到题目还是磕磕绊绊,只能说学无止境.等我真的能在这个问题上才思敏捷的时候,再作文聊以总结吧.这次只说这一道题.
题目给了一张几乎空白的图.用力辨识的话能勉强看到上面有一些像素点不是白的.根据一贯的风格,毫无疑问题目就是从这里下手的了.
用PIL写了个程序读出了所有不是白色的像素点和它们的坐标.看了看却没什么头绪.不像是能拼凑出字符串的样子.再仔细观察发现,像素点的RGB值总是一个(250,70,*)的风格,几乎可以确定相同的前两位是无用的.于是关注第三个通道.发现可以把它们重组成一个10~50的等差数列.
虽然重组之后仍然看不出什么,但是无疑已经走在了正确的方向上.像素点的rgb值估计不太可能还隐藏了什么信息,于是开始考虑坐标中是否隐藏了什么信息.
接下来就是不断的尝试了.终于发现像素的x和y值相减得到的是可读字符的ascii值,根据刚才的顺序排列,恰好可以得到一个形如GoodEyes的字符串.
到这里已经几乎可以知道答案了,然而最后某一个字符是不可见字符,其ascii值是3.顿时让我陷入了困惑,不知道该怎么办.根据flag一贯的风格,常常用长得像的字符进行替换以混淆视听,然而几次改换提交仍是无果.终于想起来,3和e虽然方向不同,但勉强也可以说长得像,果然这就是最终的flag了.
Did you try it 100x?
010editor查看可以发现在bmp图片中携带了大量的额外信息, 再考虑标题,不难猜测到需要将其长宽放大.修改到0x64(100)的时候刚刚好
Ancient Voices
一张金字塔的图片,用pngcheck检查发现cHRM块似乎存在问题,查了一圈,这个块很没存在感,所以也没多少解释它的作用的文章.
但它在这张图片中的存在确实很突兀,尤其是那长得离谱的长度….
于是乎切出来,存成文件后file一下,发现是mpeg文件,可以直接播放:tutankhamen. 根据题目来看这应该就是答案了…然而问题来了,我究竟应该提交哪个版本哪种语言的图坦卡蒙….
我到现在还不知道…看了forum我知道了,第一个字母不能大写,英文…. tutankhamun