270 likes | 438 Views
浅谈网络攻击手段. CUIT 三叶草工作组 — 黑萝卜 [s.y.c]. 当前流行攻击手段. 针对 web application 的攻击 针对操作系统以及应用软件的攻击 针对网络边界 ( 网络设备 ) 的攻击 协议缺陷的利用 社会工程学 & 钓鱼. Web application 安全.
E N D
浅谈网络攻击手段 CUIT三叶草工作组 —黑萝卜[s.y.c]
当前流行攻击手段 • 针对web application的攻击 • 针对操作系统以及应用软件的攻击 • 针对网络边界(网络设备)的攻击 • 协议缺陷的利用 • 社会工程学&钓鱼
Web application安全 网络应用程序,一般指web服务器端的cgi程序,常用的有asp, php, jsp以及.net.因此针对web application的攻击也就演化为对脚本程序安全缺陷的利用和攻击.通常出现这些脆弱点的原因都是由于代码编写者,也就是脚本程序员的安全意识不高,或者编码疏忽造成的.没有设计好足够完整的黑列表,从而导致过滤不严,使得客户端所输入的恶意代码,危险数据得以在服务器端正常运行,进而操纵数据库,达到攻击者的目的.
系统&应用软件安全 纵观当前软件,无论是系统软件还是应用软件,存在安全缺陷的原因无非以下几种情况:编程语言本身缺陷;设计阶段部署失误;编码阶段人为原因,如故意留后门;测试阶段做的不够. 例如windows平台下很有名的FTP服务端软件server-u,总是爆出漏洞,为攻击者获得webshell后提权增加了可能性. 另外值得一提的是编程语言本身缺陷的问题,例如对C语言中strcpy,strcat不合理的利用,将导致缓冲区溢出.
网络边界安全 网络边界包括路由器,防火墙,入侵检测系统IDS,虚拟专用网VPN,DMZ和被屏蔽的子网等. 路由器作为划分网段的设备,起着不可替代的作用.可是上面安装的IOS与其他软件一样,也无法逃避存在安全缺陷的命运.攻击者则可利用其脆弱点得到路由器的控制权. 防火墙分为包过滤和应用代理2大类,但把以上两种技术结合的防火墙已经出现,且日趋成熟.可是由于防火墙自身局限性等特点,绕过防火墙对于富有经验的攻击者而言简直易如反掌. IDS在设计上本就不完美,它只能根据数据库中已存在的记录去判定什么是入侵行为,应该发出警报,而什么不需要.
协议缺陷的利用 针对互联网目前广泛使用的TCP/IP协议族,各个层次不同的协议均存在一定程度的缺陷.从而导致了诸如ARP欺骗,DNS欺骗,DHCP欺骗,以及拒绝服务攻击,中间人攻击等手段. 拒绝服务攻击根据利用方法不同又分为资源耗尽和带宽耗尽.通常是由于攻击者对于攻击目标无计可施时所实施的最卑劣的手段.往往会造成目标机器或网络崩溃,瘫痪. 去年11月, 安全焦点web服务器被D持续近一个星期,造成网站长时间不能访问就是典型的拒绝服务攻击. 中间人攻击(man in middle),攻击者通过嗅探,监听等手段冒充服务器信任机对服务器实施欺骗,实现攻击者的目的.
社会工程学以及钓鱼 社会工程学其实就是攻击者利用人性的弱点,使用诸如欺骗,伪造,冒充等手段获得想要的信息,从而进一步攻击的手段.如若使用恰当,往往能获得令人意想不到的结果.
脚本攻击技术 • SQL注入技术 • 跨站脚本攻击技术 • 利用cookie的攻击(cookie欺骗及注入) • 利用上传漏洞的攻击 • PHP的几个特性漏洞(文件包含、变量未初始化等) • Webshell提权技术
一个经典的SQL注入漏洞 • 首先看一段登录验证代码: • <% • on error resume next • if Request("name")<>"" and Request("psw")<>"" then • DataName="DB.db" • adm=Trim(Request(“name”)) /*获取用户名,没有经过过滤*/ • psw=Trim(Request("psw")) • set conn=server.CreateObject("adodb.connection") • connstr="Provider=Microsoft.jet.oledb.4.0;data source=" & server.MapPath(DataName) • conn.open connstr • set rs=conn.execute(“select * from [ADM] where adm=‘”&adm&“’ and psw=‘”&psw&“’”) /*把获取的用户名密码带入SQL语句中查询*/ • if not (rs.bof and rs.eof) then • Response.Write(“登录成功!") • Response.end • end if • end if • %>
初看没有什么问题,应该输入正确的用户名密码才能进入得到管理授权,但是实际上我们在用户名和密码那里都填入 ‘OR’‘=’ ,一样会成功登陆到管理页面。为什么呢?我们把填入的 ‘OR’‘=’ 带入查询语句来看才发现原来整个语句已经被构造成了: select * from admin where admin=''OR''='' and password=''OR''='‘ 意思是当admin为空或者空等于空,password为空或者空等于空的时候整个查询语句就为真。很显然空等于空,所以语句为真,我们也就满足了程序的限制条件获得了管理授权。
这个漏洞的成因很简单,利用也很容易,但是却道出了SQL注入技术的精髓所在。那应该如何来修补漏洞呢?其实只需要过滤掉其中的特殊字符就可以解决问题了,这里我们就过滤掉其中的“‘”,即是把程序接收参数的两行改为:这个漏洞的成因很简单,利用也很容易,但是却道出了SQL注入技术的精髓所在。那应该如何来修补漏洞呢?其实只需要过滤掉其中的特殊字符就可以解决问题了,这里我们就过滤掉其中的“‘”,即是把程序接收参数的两行改为: adm=replace(Trim(Request(“name”)) ,"'","" ) psw=replace(Trim(Request("psw")) ,"'","" )
普通的SQL注入攻击过程 先看一段很通用的文章读取的代码: • <% • dim idid • idid=request(“id”) /*获取文章ID,没有限制获取方式*/ • sql="select * from article where articleid="&idid • rs.open sql,conn,1,1 • if rs.eof and rs.bof then • response.write "没有找到相关文章。" • response.end • end if • %>
这里id变量没有经过任何处理就传递给了idid然后带入了查询语句,导致了漏洞的产生,所以就可以在id变量这里插入SQL查询语句来进行注入。这里id变量没有经过任何处理就传递给了idid然后带入了查询语句,导致了漏洞的产生,所以就可以在id变量这里插入SQL查询语句来进行注入。 下面是详细的注入攻击过程: 1、猜解存储管理员帐户和密码的表段,提交: and 0<>(select count(*) from admin) 2、猜解admin表段中的字段,提交: and 1=(select count(*) from admin where len(username)>0)
3、猜解字段里面的内容,提交: and (select mid(username,1,1) from admin)="a“ 通过以上方法继续猜解字段的内容就可以轻松得到管理员的帐户密码,从而登录到后台进行管理操作!当然这并不是攻击者的最终目的,攻击者还会通过上传等方法来获取一个webshell,以控制整个web的管理权限,甚至还会再通过其他方法来得到服务器的系统权限!这些会在后面进行一些说明。
SQL注入攻击的防御与突破 目前比较常用的方法有以下四种: • (1) 在服务端正式处理之前对提交数据的合法性进行检查; • (2) 封装客户端提交信息; • (3) 替换或删除敏感字符/字符串; • (4) 屏蔽出错信息 第一种应该是最根本的办法,在服务端处理数据之前就进行严格的检查,发现非法就不提交给服务器端处理,返回错误信息。 下面给出一个网络上比较通用的防注脚本。
一个通用SQL注入脚本 • Dim Tc_Post,Tc_Get,Tc_In,Tc_Inf,Tc_Xh • '定义需要过滤的字串 • Tc_In="'|;|and|(|)|exec|insert|select|delete|update|count|*|%|chr|mid|master||or|char|declare" • Tc_Inf = split(Tc_In,"|") • '处理post数据 • If Request.Form<>"" Then • For Each Tc_Post In Request.Form • For Tc_Xh=0 To Ubound(Tc_Inf) • If Instr(LCase(Request.Form(Tc_Post)),Tc_Inf(Tc_Xh))<>0 Then • Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');</Script>" • '处理get数据 • If Request.QueryString<>"" Then • For Each Tc_Get In Request.QueryString • For Tc_Xh=0 To Ubound(Tc_Inf) • If Instr(LCase(Request.QueryString(Tc_Get)),Tc_Inf(Tc_Xh))<>0 Then • Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');</Script>"
绕过防注脚本继续注入 这段代码把SQL注入中要用到的关键字基本都过滤了,但是作者忽略了一个重要的参数获取方式:cookie!程序只对get和post方式获取的参数进行了过滤,要是通过cookie提交注入语句一样可以达到目的!
Cookie注入漏洞的产生 因为防注代码的过滤,不能直接用get或者post方式进行注入。那如何进行突破呢?在说明之前,先了解下request获取变量的方式:request.form获取的是post数据,request.querystring获取的get数据,request.cookies获取的是cookie中的数据。但是如果是<%id=request("id")%>呢?这个时候程序是按以下顺序来搜索集合:querystring,form,cookie,servervariable。当发现第一个匹配的变量的时候就认为是要访问的成员。从上面的分析我们可以得到什么呢?这里既然程序就没有限制参数的来源,我们就不要去通过get的方式提交参数,而是在cookie里面加入参数id的值,就可以饶过防注入代码的检测了!
Cookie注入的攻击过程 1、判断注入 javascript:alert(document.cookie="id="+escape(“1 and 1=1")); 2、猜解表段、字段 javascript:alert(document.cookie="id="+escape(“1 and 1=(select count(*) from admin where len(username)>0)")); 剩下的事情就是重复上面的步骤来得到管理员帐户和密码了。
获得webshell以及利用 前面提到入侵者的目的并不是得到网站后台的管理权限,多数人是想获得一个基于web的控制平台,以至于进一步提权控制服务器! 下面就简单演示下如何利用webshell进行一些后续的渗透!
CUIT VS SCU • 首先介绍下比赛前所告知的环境: • 1 网络环境见网络拓扑图,如图28。 • 2 比赛给的入口 10.97.151.60(是一个国外的论坛,提供源程序)。
比赛过程: • 1 扫描10.97.151.*整个网段得到以下结果: • 10.97.151.60 开放如下端口: • 21(微软FTP服务器),80,3389 • 10.97.151.243 开放如下端口: • 21(SERV-U FTP服务器),80,3389 (后来发现80端口是一个BLOG程序) • 2 幸运的得到铜牌 • 兵分两路,我,jinsdb分析10.97.151.243 的BLOG程序 , 其他人分析10.97.151.60的论坛代码。BLOG程序是用的Z-BLOG,因为前不久才公布了一个此BLOG程序得到后台后拿WEBSHELL的漏洞,所以当务之急是拿到密码进入后台。由于没有其他已知漏洞,所以jinsdb和svi开始分析代码,我测试攻击。没有抱什么希望的去试了下默认数据库,居然还下到了,真是好运气!看见数据库有两个用户,拿了MD5密码选择数字跑下,不到一分钟就出来了一个,登陆后台看了下,很低的权限,没办法用前面说讲的漏洞得SHELL,思路停止了!就在这个时候,svi发现了一个很另人兴奋的消息:在此BLOG中还附加了一个统计程序,在程序的一个文件中有一句话木马,那还客气什么,直接就连了上去!就这样拿到了第一个WEBSHELL,同时用SHELL浏览硬盘率先找到了铜牌文件。这里顺便说下,后来才知道帮助我们拿到SHELL的统计程序并不是组委会设计的思路,他们本来的想法是想让我们跑出那个管理员用户的密码登陆后台拿SHELL。但是那个用户的密码是11位数字,这里就要我们发挥团体的协同作战的意识,每个人跑一个位数才能尽快把密码跑出来!呵呵,真是用心良苦啊。
3 艰难的得到银牌 得到SHELL后稍微轻松了点,看了SCU的朋友好象还没有什么眉目,再回过头来看我们队里面负责分析论坛代码的朋友们都是焦头烂额还没有任何发现,真是辛苦他们了!接着开始静下心来分析是否能从SHELL提权再做其他打算。 前面提到了10.97.151.243开放了21端口,而且还是SERV-U,看能否通过它了。首先看了下,服务器的各种配置:权限配置很严格,能浏览的地方很少,CMD不能用,自己上传了CMD一样不能调用。突然想到服务器是2003的,看来可以用.NET版的SERV-U提权工具试下。上传后浏览,果然是支持的,执行命令net user heiluobo 123456 /add,好象没成功。回头来看了下返回信息,创建FTP帐户是成功了的,为什么执行命令就没有成功呢?想了好久都没有想通,直到组委会宣布上午的时间结束了,很郁闷的去吃午饭了。在吃饭的时候想到会不会是禁用了CMD或者什么呢?下午比赛开始后,jinsdb先上去用工具执行了一个ipconfig –all命令,居然显示成功了。我猛然才意识到是管理员禁用了NET命令啊!结果用NET1.EXE成功添加管理员连上了3389。 得到一个系统权限之后马上就想到嗅探,因为10.97.151.60这台服务器上有论坛程序,所以我选择了嗅探80端口,也很快拿到密码,就在以为成功的时候,发现此论坛程序的上传模块已经被删除掉了!难道此路不通?回过头去才发现10.97.151.60还开放了21端口,这才转去嗅探21端口,也很快拿到了密码通过FTP上传了WEBSHELL。但此时我们已经浪费了大量的时间,被SCU的朋友赶了上来,两队几乎是同时拿到了银牌文件!
4 痛失金牌 在得到10.97.151.60上的SEHLL后,看到了此论坛的数据库连接文件,得知数据库服务器IP172.16.0.3,扫描了下发现此IP是访问不到的,而10.97.151.60还有一个IP是172.16.0.2。难道这两台服务器是处在一个内部局域网内?后来得知的情况果然如此:这两台服务器是处在硬件防火墙之后的,172.16.0.2通过防火墙映射出来21,80端口,172.16.0.3不对外开放任何端口。分析了下,得出以下想法:1 看能否对172.16.0.2提权再做打算;2 利用已经拿到了的数据库连接帐号(是DB-OWNER权限;3 社会工程学(利用此时已经得到的几个密码:破解出的BLOG程序密码,嗅探到的论坛程序密码,FTP密码。 做了分工后,我先用海洋的HTTP代理功能探测172.16.0.3所开的服务,发现只开放了1433和3389。接着在172.16.0.2的SHELL里面利用lcx把172.16.0.3的3389转发出来到自己机器上,然后用已经知道的几个密码去试,但是都失败了。提权组也没有任何进展,倒是有人想出利用自己构造注入点的方法看到了金牌文件,但是我们只有DB-OWNER权限,想通过select导出到文件也不能成功的!最后我又用几个密码去试着连接数据库服务器的SA帐户也失败了! 直到组委会宣布比赛结束,我们双方都没拿到金牌文件握手言和!