Application Security 之 Session hijacking
Session hijacking 会话劫持
在现实生活中,比如你去市场买菜,在交完钱后你要求先去干一些别的事情,稍候再来拿菜;如果这个时候某个陌生人要求把菜拿走,卖菜的人会把菜给陌生人吗?!当然,这只是一个比喻,但这恰恰就是会话劫持的喻意。所谓会话,就是两台主机之间的一次通讯,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当中进行简听,甚至可以是代替某一方主机接管会话。
注射式攻击:
它不会改变会话双方的通讯流,而是在双方正常的通讯流插入恶意数据。
对于UDP的IP欺骗:
如果是UDP协议,只需伪造IP地址,然后发送过去就可以了,因为UDP没有所谓的TCP三次握手。
对于IP欺骗,有两种情况需要用到:1)隐藏自己的IP地址;2)利用两台机器之间的信任关系实施入侵。
在Unix/Linux平台上,可以直接使用Socket构造IP包,在IP头中填上虚假的IP地址,但需要root权限;在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系统,首先打开一个Raw Socket(原始套接字),然后自己编写IP头及其他数据。
中间人攻击
攻击者首先需要使用ARP欺骗或DNS欺骗,将会话双方的通讯流暗中改变,而这种改变对于会话双方来说是完全透明的。不管是ARP欺骗,还是DNS欺骗,中间人攻击都改变正常的通讯流,它就相当于会话双方之间的一个透明代理,可以得到一切想知道的信息,甚至是利用一些有缺陷的加密协议来实现。
TCP会话劫持
对于基于TCP协议的注射式会话劫持,攻击者应先采用嗅探技术对目标进行简听,然后从简听到的信息中构造出正确的序列号。【TCP协议使用这两段序列号确保连接同步以及安全通讯,系统的TCP/IP协议栈依据时间或线性的产生这些值。如果攻击者在这个时候进行会话劫持,结果肯定是失败,因为会话双方“不认识”攻击者,攻击者不能提供合法的序列号;所以,会话劫持的关键是预测正确的序列号,攻击者可以采取嗅探技术获得这些信息。】
如果ACK和Seq的逻辑关系,就会产生ACK风暴。【当会话双方接收到一个不期望的数据包后,就会用自己期望的序列号返回ACK包;而在另一端,这个数据包也不是所期望的,就会再次以自己期望的序列号返回ACK包……于是,就这样来回往返,形成了恶性循环,最终导致ACK风暴】
比较好的解决办法是先进行ARP欺骗,使双方的数据包“正常”的发送到攻击者这里,然后设置包转发,最后就可以进行会话劫持了,而且不必担心会有ACK风暴出现。
例子:
TCP会话劫持过程 假设现在主机A和主机B进行一次TCP会话,C为攻击者(如图2),劫持过程如下: A向B发送一个数据包 SEQ (hex): X ACK (hex): Y FLAGS: -AP--- Window: ZZZZ,包大小为:60 B回应A一个数据包 SEQ (hex): Y ACK (hex): X+60 FLAGS: -AP--- Window: ZZZZ,包大小为:50 A向B回应一个数据包 SEQ (hex): X+60 ACK (hex): Y+50 FLAGS: -AP--- Window: ZZZZ,包大小为:40 B向A回应一个数据包 SEQ (hex): Y+50 ACK (hex): X+100 FLAGS: -AP--- Window: ZZZZ,包大小为:30 攻击者C冒充主机A给主机B发送一个数据包 SEQ (hex): X+100 ACK (hex): Y+80 FLAGS: -AP--- Window: ZZZZ,包大小为:20 B向A回应一个数据包 SEQ (hex): Y+80 ACK (hex): X+120 FLAGS: -AP--- Window: ZZZZ,包大小为:10 现在,主机B执行了攻击者C冒充主机A发送过来的命令,并且返回给主机A一个数据包;但是,主机A并不能识别主机B发送过来的数据包,所以主机A会以期望的序列号返回给主机B一个数据包,随即形成ACK风暴。如果成功的解决了ACK风暴(例如前边提到的ARP欺骗),就可以成功进行会话劫持了。
HTTP会话劫持
如果你能够截取已建立会话的某些部分数据,你就能利用这些数据来假冒通信中所涉及的任何参加者,从而获取会话信息。在上面的例子中,这就意味着,如果我们能够获取用于维持浏览器和登陆网站间会话状态的cookie,我们就能将cookie发给网络服务器并冒充会话连接。【Web应用程序是通过2种方式来判断和跟踪不同用户的:Cookie或者Session(也叫做会话型Cookie)。其中Cookie是存储在本地计算机上的,过期时间很长,所以针对Cookie的攻击手段一般是盗取用户Cookie然后伪造Cookie冒充该用户;而Session由于其存在于服务端,随着会话的注销而失效(很快过期),往往难于利用。所以一般来说Session认证较之Cookie认证安全。】
最核心的就是窃取Cookies。
例子:
这种形式的会话攻击所涉及的第一个步骤就是拦截受害者浏览Facebook时的通信,这种拦截实际上可以使用任何数据包嗅探应用程序(例如 TCPDump或者 Wireshark)来实现,但是为了拦截正确的数据包,你将需要部署像ARP缓存中毒(上篇文章所讨论的攻击形式)这样的技术。 拦截到访问Gmail帐户的用户的流量后,你需要将拦截文件存储在Hamster目录中,而在我们的示例中,我们将拦截文件放在名为 victim_gmail.pcap的文件夹中,然后我们将利用Ferret来处理文件。这个操作过程是这样实现的:浏览Hamster文件夹,并运行这个命令“ferret –r victim_gmail.pcap”,Ferret将会处理这个文件并创建一个hamster.txt文件,这将用于Hamster用来发起真正会话劫持攻击。 用了拦截的HTTP数据后,我们就可以使用Hamster来发起实际攻击。Hamster本身是作为代理服务器运行的,为浏览和使用盗窃的会话cookie提供一个界面。为了启动Hamster代理服务器,你只需要简单地执行没有命令行选项的Hamster即可。 述操作执行成功后,你需要打开你的浏览器,并将其代理设置配置为符合Hamster输出提供的设置。默认情况下,这意味着,你需要将你的代理设置配置为使用本地回环地址1234端口的127.0.0.1。要访问IE里面的这个设置,你可以通过选择工具、Internet选项、连接、局域网设置,并勾选“为局域网使用代理服务器”来实现。 现在代理设置已经配置好,你就可以在你的浏览器中输入http://hamster来访问Hamster控制台。Hamster将使用 Ferret创建的文件来生成IP地址(会话信息被拦截的IP地址)列表并在浏览器的右窗格显示这些IP地址,我们所创建的文件只包含一个受害者的IP地址,所以我们可以点击左窗格来查找更多可以劫持的会话。 上图所示,我们看到facebook.com也在列表中,如果你点击该链接,你会看到一个成功登陆到受害者的facebook帐户的新窗口。
防范
用交换式网络替代共享式网络。
最根本的解决办法是采用加密通讯,使用SSH代替Telnet、使用SSL代替HTTP,或者干脆使用IPSec/VPN,这样会话劫持就无用武之地了。
监视网络流量,如发现网络中出现大量的ACK包,则有可能已被进行了会话劫持攻击。
防范ARP欺骗。
http://net.anquan365.com/protocol/other/201112/166777.html
http://www.bitscn.com/network/hack/201002/180801.html
http://www.cnpaf.net/Class/arp/201010/25458.html
Replay attack
所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。
攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
重放攻击与cookie,我们监听http数据传输的截获的敏感数据大多数就是存放在cookie中的数据。其实在web安全中的通过其他方式(非网络监听)盗取cookie与提交cookie也是一种重放攻击。我们有时候可以轻松的复制别人的cookie直接获得相应的权限。
防御:
(1)时间戳
“时戳”──代表当前时刻的数
基本思想──A接收一个消息当且仅当其包含一个对A而言足够接近当前时刻的时戳
原理──重放的时戳将相对远离当前时刻
时钟要求──通信各方的计算机时钟保持同步
处理方式──设置大小适当的时间窗(间隔),越大越能包容网络传输延时,越小越能防重放攻击
适用性──用于非连接性的对话 (在连接情形下双方时钟若偶然出现不同步,则正确的信息可能会被误判为重放信息而丢弃,而错误的重放信息可能会当作最新信息而接收)
(2)序号
通信双方通过消息中的序列号来判断消息的新鲜性
要求通信双方必须事先协商一个初始序列号,并协商递增方法
(3)提问——应答
“现时”──与当前事件有关的一次性随机数N(互不重复即可)
基本做法──期望从B获得消息的A 事先发给B一个现时N,并要求B应答的消息中包含N或f(N),f是A、B预先约定的简单函数
原理──A通过B回复的N或f(N)与自己发出是否一致来判定本次消息是不是重放的
时钟要求──无
适用性──用于连接性的对话
http://blog.sina.com.cn/s/blog_62d82c2f0100i79r.html